From 2f0a5262450b801af626db07bfdc963dc4758394 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 17 Oct 2024 10:10:08 -0500 Subject: [PATCH 001/137] use non dev version of htmgo.js --- framework/assets/dist/htmgo.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index d886d35..73cfc07 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1,3 +1 @@ var ne=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),ee=G[0],j=G[1],D=t;if(M&&(D=ee,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let te=M?null:encodeParamsForBody(m,n,L);return m.send(te),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=ne;function re(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=ie(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=ae(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,le="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target),e==="htmx:load"&&t.target&&K(t.target);}});function K(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(K);}function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,Z=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Z.has(i)&&(de(o,i),Z.add(i));}}}});function de(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function he(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},101);}he((e,t)=>{ge(t);});function ge(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} -//# sourceMappingURL=htmgo.js.map -//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL2pzL25vZGVfbW9kdWxlcy9odG14Lm9yZy9kaXN0L2h0bXguZXNtLmpzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvcGF0aGRlcHMudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy90cmlnZ2VyLWNoaWxkcmVuLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvZGVidWcudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvbXV0YXRpb24tZXJyb3IudHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9saXZlcmVsb2FkLnRzIiwiLi4vanMvaHRteGV4dGVuc2lvbnMvaHRtZ28udHMiLCIuLi9qcy9odG14ZXh0ZW5zaW9ucy9zc2UudHMiLCIuLi9qcy9odG1nby50cyJdLCJuYW1lcyI6WyJodG14IiwiZWx0IiwidHlwZSIsInZlcmIiLCJ0YWciLCJnbG9iYWwiLCJzdHIiLCJpbnRlcnZhbCIsIm5hbWUiLCJxdWFsaWZpZWROYW1lIiwicGFyZW50IiwiY29uZGl0aW9uIiwiaW5pdGlhbEVsZW1lbnQiLCJhbmNlc3RvciIsImF0dHJpYnV0ZU5hbWUiLCJhdHRyaWJ1dGVWYWx1ZSIsImRpc2luaGVyaXQiLCJpbmhlcml0IiwiY2xvc2VzdEF0dHIiLCJlIiwic2VsZWN0b3IiLCJtYXRjaGVzRnVuY3Rpb24iLCJtYXRjaCIsInJlc3AiLCJmcmFnbWVudCIsInNjcmlwdCIsIm5ld1NjcmlwdCIsImF0dHIiLCJyZXNwb25zZSIsInJlc3BvbnNlV2l0aE5vSGVhZCIsInN0YXJ0VGFnIiwiZG9jIiwidGl0bGVFbGVtZW50IiwiZnVuYyIsIm8iLCJkYXRhUHJvcCIsImRhdGEiLCJhcnIiLCJyZXR1cm5BcnIiLCJpIiwiZWwiLCJyZWN0IiwiZWxlbVRvcCIsImVsZW1Cb3R0b20iLCJyb290Tm9kZSIsInRyaWdnZXIiLCJvYmoxIiwib2JqMiIsImtleSIsImpTdHJpbmciLCJlcnJvciIsInRlc3QiLCJwYXRoIiwidXJsIiwiY2FsbGJhY2siLCJldnQiLCJldmVudCIsImVsdE9yU2VsZWN0b3IiLCJkZWxheSIsInZhbHVlIiwiY2xhenoiLCJub2RlIiwiY2hpbGQiLCJwcmVmaXgiLCJzdWZmaXgiLCJ0cmltbWVkU2VsZWN0b3IiLCJzdGFydCIsInJlc3VsdHMiLCJjb250ZXh0IiwiYXJnMSIsImFyZzIiLCJhcmczIiwiZXZlbnRBcmdzIiwiYXR0ck5hbWUiLCJhdHRyVGFyZ2V0IiwicmVzdWx0IiwiYXR0cmlidXRlIiwidGFyZ2V0U3RyIiwiYXR0cmlidXRlc1RvU2V0dGxlIiwibWVyZ2VUbyIsIm1lcmdlRnJvbSIsInN3YXBTdHlsZSIsInRhcmdldCIsImV4dGVuc2lvbnMiLCJleHRlbnNpb24iLCJvb2JWYWx1ZSIsIm9vYkVsZW1lbnQiLCJzZXR0bGVJbmZvIiwidGFyZ2V0cyIsIm9vYkVsZW1lbnRDbG9uZSIsImJlZm9yZVN3YXBEZXRhaWxzIiwicHJlc2VydmVkRWx0IiwiaWQiLCJvbGRFbHQiLCJwYXJlbnROb2RlIiwibmV3Tm9kZSIsIm5vcm1hbGl6ZWRJZCIsIm5vcm1hbGl6ZWRUYWciLCJwYXJlbnRFbHQiLCJvbGROb2RlIiwibmV3QXR0cmlidXRlcyIsImF1dG9mb2N1cyIsImF1dG9Gb2N1c2VkRWx0IiwiaW5zZXJ0QmVmb3JlIiwic3RyaW5nIiwiaGFzaCIsImNoYXIiLCJpbnRlcm5hbERhdGEiLCJoYW5kbGVySW5mbyIsImVsZW1lbnQiLCJpbmZvIiwibmV3RWx0IiwiZWx0QmVmb3JlTmV3Q29udGVudCIsImZpcnN0Q2hpbGQiLCJleHQiLCJuZXdFbGVtZW50cyIsImoiLCJvb2JFbHRzIiwiY29udGVudCIsInN3YXBTcGVjIiwic3dhcE9wdGlvbnMiLCJhY3RpdmVFbHQiLCJzZWxlY3Rpb25JbmZvIiwib29iU2VsZWN0VmFsdWVzIiwib29iU2VsZWN0VmFsdWUiLCJ0ZW1wbGF0ZSIsIm5ld0ZyYWdtZW50IiwibmV3QWN0aXZlRWx0IiwiZm9jdXNPcHRpb25zIiwiZG9TZXR0bGUiLCJ0YXNrIiwiYW5jaG9yVGFyZ2V0IiwieGhyIiwiaGVhZGVyIiwidHJpZ2dlckJvZHkiLCJ0cmlnZ2VycyIsImV2ZW50TmFtZSIsImRldGFpbCIsImV2ZW50TmFtZXMiLCJ0b2tlbnMiLCJwb3NpdGlvbiIsInN0YXJ0UG9zaXRpb24iLCJzdGFydENoYXIiLCJzeW1ib2wiLCJ0b2tlbiIsImxhc3QiLCJwYXJhbU5hbWUiLCJicmFja2V0Q291bnQiLCJjb25kaXRpb25hbFNvdXJjZSIsImNvbmRpdGlvbkZ1bmN0aW9uIiwiZXhwbGljaXRUcmlnZ2VyIiwiY2FjaGUiLCJ0cmlnZ2VyU3BlY3MiLCJpbml0aWFsTGVuZ3RoIiwiZXZlcnkiLCJldmVudEZpbHRlciIsInRyaWdnZXJTcGVjIiwiZnJvbV9hcmciLCJoYW5kbGVyIiwic3BlYyIsIm5vZGVEYXRhIiwicmF3QXR0cmlidXRlIiwic291cmNlIiwiZXhwbGljaXRDYW5jZWwiLCJlbGVtZW50RGF0YSIsImVsdHNUb0xpc3Rlbk9uIiwiZWx0VG9MaXN0ZW5PbiIsImVsdFRvTGlzdGVuT25EYXRhIiwiZXZlbnRMaXN0ZW5lciIsImV2ZW50RGF0YSIsImxvYWQiLCJleHBsaWNpdEFjdGlvbiIsIm9ic2VydmVyT3B0aW9ucyIsImVudHJpZXMiLCJhdHRyaWJ1dGVzIiwiZWxlbWVudHMiLCJpdGVyIiwiYm9vc3RlZFNlbGVjdG9yIiwiZXh0ZW5zaW9uU2VsZWN0b3JzIiwic2VsZWN0b3JzIiwicyIsImZvcm0iLCJjb2RlIiwibGlzdGVuZXIiLCJhZnRlck9uUG9zaXRpb24iLCJuZXh0Q2hhciIsInRvRG8iLCJtc2ciLCJldmVudFJlc3VsdCIsImtlYmFiTmFtZSIsImtlYmFiZWRFdmVudCIsInJvb3RFbHQiLCJpbm5lckhUTUwiLCJ0aXRsZSIsInNjcm9sbCIsImhpc3RvcnlDYWNoZSIsIm5ld0hpc3RvcnlJdGVtIiwiY2xhc3NOYW1lIiwiY2xvbmUiLCJkaXNhYmxlSGlzdG9yeUNhY2hlIiwidGFza3MiLCJyZXF1ZXN0IiwiZGV0YWlscyIsImhpc3RvcnlFbGVtZW50IiwiY2FjaGVkIiwiaW5kaWNhdG9ycyIsImljIiwiZGlzYWJsZWRFbHRzIiwiZGlzYWJsZWRFbGVtZW50IiwiZGlzYWJsZWQiLCJwcm9jZXNzZWQiLCJmb3JtRGF0YSIsInYiLCJ2YWx1ZXMiLCJlcnJvcnMiLCJ2YWxpZGF0ZSIsImlucHV0IiwicmVjZWl2ZXIiLCJkb25vciIsInByaW9yaXR5Rm9ybURhdGEiLCJidXR0b24iLCJpbmNsdWRlcyIsImRlc2NlbmRhbnQiLCJyZXR1cm5TdHIiLCJyZWFsVmFsdWUiLCJwcm9tcHQiLCJoZWFkZXJzIiwiaW5wdXRWYWx1ZXMiLCJwYXJhbXNWYWx1ZSIsIm5ld1ZhbHVlcyIsInN3YXBJbmZvT3ZlcnJpZGUiLCJzd2FwSW5mbyIsInNwbGl0Iiwic3BsaXRTcGVjIiwic2Nyb2xsVmFsIiwic2VsZWN0b3JWYWwiLCJzaG93VmFsIiwiZm9jdXNTY3JvbGxWYWwiLCJmaWx0ZXJlZFBhcmFtZXRlcnMiLCJlbmNvZGVkUGFyYW1ldGVycyIsImZpcnN0IiwiZXZhbEFzRGVmYXVsdCIsImV2YWx1YXRlVmFsdWUiLCJ2YXJzVmFsdWVzIiwidG9FdmFsIiwiZGVmYXVsdFZhbCIsImV4cHJlc3Npb25WYXJzIiwiaGVhZGVyVmFsdWUiLCJyZWdleHAiLCJyZXF1ZXN0Q29uZmlnIiwic2FtZUhvc3QiLCJvYmoiLCJhcnJheSIsImluZGV4IiwicHJvcCIsImV0YyIsImNvbmZpcm1lZCIsInJlc29sdmUiLCJyZWplY3QiLCJwcm9taXNlIiwiX3Jlc29sdmUiLCJfcmVqZWN0IiwicmVzcG9uc2VIYW5kbGVyIiwic2VsZWN0IiwiZWx0RGF0YSIsInN1Ym1pdHRlciIsImJ1dHRvblBhdGgiLCJidXR0b25WZXJiIiwiY29uZmlybVF1ZXN0aW9uIiwic2tpcENvbmZpcm1hdGlvbiIsInN5bmNFbHQiLCJzeW5jU3RyYXRlZ3kiLCJxdWV1ZVN0cmF0ZWd5IiwiYWJvcnRhYmxlIiwic3luY1N0cmluZ3MiLCJlbmRSZXF1ZXN0TG9jayIsInByb21wdFF1ZXN0aW9uIiwicHJvbXB0UmVzcG9uc2UiLCJyYXdGb3JtRGF0YSIsImFsbEZvcm1EYXRhIiwiZmlsdGVyZWRGb3JtRGF0YSIsInJlcXVlc3RBdHRyVmFsdWVzIiwiZWx0SXNCb29zdGVkIiwidXNlVXJsUGFyYW1zIiwic3BsaXRQYXRoIiwicGF0aE5vQW5jaG9yIiwiYW5jaG9yIiwiZmluYWxQYXRoIiwicmVzcG9uc2VJbmZvIiwiaGllcmFyY2h5IiwiZGlzYWJsZUVsdHMiLCJzZWNvbmRhcnlUcmlnZ2VyRWx0IiwicGFyZW50RWx0SW5IaWVyYXJjaHkiLCJwYXJhbXMiLCJwYXRoRnJvbUhlYWRlcnMiLCJ0eXBlRnJvbUhlYWRlcnMiLCJyZXF1ZXN0UGF0aCIsInJlc3BvbnNlUGF0aCIsInB1c2hVcmwiLCJyZXBsYWNlVXJsIiwiZWxlbWVudElzQm9vc3RlZCIsInNhdmVUeXBlIiwicmVzcG9uc2VIYW5kbGluZ0NvbmZpZyIsInN0YXR1cyIsInJlZ0V4cCIsInJlc3BvbnNlSGFuZGxpbmdFbGVtZW50IiwidGl0bGVFbHQiLCJyZXNwb25zZUluZm9TZWxlY3QiLCJyZWRpcmVjdFBhdGgiLCJyZWRpcmVjdFN3YXBTcGVjIiwic2hvdWxkUmVmcmVzaCIsImhpc3RvcnlVcGRhdGUiLCJyZXNwb25zZUhhbmRsaW5nIiwic2hvdWxkU3dhcCIsImlzRXJyb3IiLCJpZ25vcmVUaXRsZSIsInNlbGVjdE92ZXJyaWRlIiwic3dhcE92ZXJyaWRlIiwic2VydmVyUmVzcG9uc2UiLCJzZXR0bGVSZXNvbHZlIiwic2V0dGxlUmVqZWN0Iiwic2VsZWN0T09CIiwiZG9Td2FwIiwiZmluYWxFbHQiLCJzaG91bGRUcmFuc2l0aW9uIiwic2V0dGxlUHJvbWlzZSIsImlubmVyRG9Td2FwIiwiYXBpIiwidGV4dCIsInBhcmFtZXRlcnMiLCJleHRlbnNpb25zVG9SZXR1cm4iLCJleHRlbnNpb25zVG9JZ25vcmUiLCJleHRlbnNpb25zRm9yRWxlbWVudCIsImV4dGVuc2lvbk5hbWUiLCJmbiIsIm5vbmNlQXR0cmlidXRlIiwibWV0YUNvbmZpZyIsImJvZHkiLCJyZXN0b3JlZEVsdHMiLCJvcmlnaW5hbFBvcHN0YXRlIiwiaHRteF9lc21fZGVmYXVsdCIsImRlcGVuZHNPbiIsInBhdGhTcGVjIiwiZGVwZW5kZW5jeVBhdGgiLCJ1cmxQYXRoIiwiZGVwZW5kZW5jeUVsZW1lbnQiLCJwYXRoRWxlbWVudCIsInJlZnJlc2hQYXRoIiwiZWx0c1dpdGhEZXBzIiwiY29uZmlnIiwia2ViYWJFdmVudE5hbWUiLCJpZ25vcmVkRXZlbnRzIiwibWFrZUV2ZW50IiwidHJpZ2dlckNoaWxkcmVuIiwidHJpZ2dlcmVkIiwibmV3RXZlbnQiLCJhdHRyUHJlZml4Iiwic3RhcnRzV2l0aCIsImdldFJlc3BDb2RlVGFyZ2V0IiwicmVzcENvZGVOdW1iZXIiLCJyZXNwQ29kZSIsImF0dHJQb3NzaWJpbGl0aWVzIiwiYXR0clZhbHVlIiwiaGFuZGxlRXJyb3JGbGFnIiwiYXBpUmVmIiwibGFzdFZlcnNpb24iLCJlbmFibGVkIiwiZXZlbnRTb3VyY2UiLCJtZXNzYWdlIiwicmVsb2FkIiwiZXZhbEZ1bmNSZWdleCIsInJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzIiwiaW52b2tlT25Mb2FkIiwibWF0Y2hlcyIsImVsZSIsImNvbm5lY3RFdmVudFNvdXJjZSIsImNoaWxkcmVuIiwid2F0Y2hVcmwiLCJsYXN0VXJsIiwiXyIsIm5ld1VybCIsIm9uVXJsQ2hhbmdlIiwiaGFzTWF0Y2giLCJkZWZhdWx0S2V5Il0sIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxFQUFBQSxDQUFRLFVBQVcsQ0FJckIsSUFBTSxJQUFPLENBQUEsQ0FJWCxPQUFRLElBRVIsQ0FBQSxPQUFBLENBQVMsS0FFVCxFQUFJLENBQUEsSUFBQSxDQUVKLElBQUssSUFFTCxDQUFBLE9BQUEsQ0FBUyxLQUVULElBQU0sQ0FBQSxJQUFBLENBR04sS0FBTSxJQUVOLENBQUEsT0FBQSxDQUFTLEtBRVQsT0FBUyxDQUFBLElBQUEsQ0FVVCxPQUFRLFNBQVNDLENBQUFBLENBQUtDLEVBQU0sQ0FFMUIsT0FEb0IsZUFBZUQsQ0FBS0MsQ0FBQUEsQ0FBQUEs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WCxDQUFBQSxDQUFBQSxDQUFXLEdBQ1gsS0FDRixDQUNGLENBRUYsR0FBSSxDQUFDQSxFQUFVLENBQ2IsSUFBSUMsRUFBYXZWLENBQUcsQ0FBQSxZQUFBLENBQWEscUJBQXFCLENBQ2xEdVYsQ0FBQUEsQ0FBQUEsRUFDRjNDLEVBQUssSUFDSDVTLENBQUFBLENBQUFBLENBQ0FBLEVBQUcsWUFBYSxDQUFBLHNCQUFBLENBQXlCdVYsQ0FBVSxDQUFLLEVBQUEsRUFBQSxDQUN4RCxDQUFFLFNBQVcsQ0FBQSxXQUFBLENBQWEsVUFBVyxDQUFHLENBQUEsV0FBQSxDQUFhLENBQUUsQ0FDekQsRUFFSixDQUNGLENBQUMsRUFDSCIsImZpbGUiOiJodG1nby5qcyIsInNvdXJjZXNDb250ZW50IjpbInZhciBodG14ID0gKGZ1bmN0aW9uKCkge1xuICAndXNlIHN0cmljdCdcblxuICAvLyBQdWJsaWMgQVBJXG4gIGNvbnN0IGh0bXggPSB7XG4gICAgLy8gVHNjIG1hZG5lc3MgaGVyZSwgYXNzaWduaW5nIHRoZSBmdW5jdGlvbnMgZGlyZWN0bHkgcmVzdWx0cyBpbiBhbiBpbnZhbGlkIFR5cGVTY3JpcHQgb3V0cHV0LCBidXQgcmVhc3NpZ25pbmcgaXMgZmluZVxuICAgIC8qIEV2ZW50IHByb2Nlc3NpbmcgKi9cbiAgICAvKiogQHR5cGUge3R5cGVvZiBvbkxvYWRIZWxwZXJ9ICovXG4gICAgb25Mb2FkOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHByb2Nlc3NOb2RlfSAqL1xuICAgIHByb2Nlc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb246IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRXZlbnRMaXN0ZW5lckltcGx9ICovXG4gICAgb2ZmOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHRyaWdnZXJFdmVudH0gKi9cbiAgICB0cmlnZ2VyOiBudWxsLFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGFqYXhIZWxwZXJ9ICovXG4gICAgYWpheDogbnVsbCxcbiAgICAvKiBET00gcXVlcnlpbmcgaGVscGVycyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGZpbmR9ICovXG4gICAgZmluZDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBmaW5kQWxsfSAqL1xuICAgIGZpbmRBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgY2xvc2VzdH0gKi9cbiAgICBjbG9zZXN0OiBudWxsLFxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIGlucHV0IHZhbHVlcyB0aGF0IHdvdWxkIHJlc29sdmUgZm9yIGEgZ2l2ZW4gZWxlbWVudCB2aWEgdGhlIGh0bXggdmFsdWUgcmVzb2x1dGlvbiBtZWNoYW5pc21cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI3ZhbHVlc1xuICAgICAqXG4gICAgICogQHBhcmFtIHtFbGVtZW50fSBlbHQgdGhlIGVsZW1lbnQgdG8gcmVzb2x2ZSB2YWx1ZXMgb25cbiAgICAgKiBAcGFyYW0ge0h0dHBWZXJifSB0eXBlIHRoZSByZXF1ZXN0IHR5cGUgKGUuZy4gKipnZXQqKiBvciAqKnBvc3QqKikgbm9uLUdFVCdzIHdpbGwgaW5jbHVkZSB0aGUgZW5jbG9zaW5nIGZvcm0gb2YgdGhlIGVsZW1lbnQuIERlZmF1bHRzIHRvICoqcG9zdCoqXG4gICAgICogQHJldHVybnMge09iamVjdH1cbiAgICAgKi9cbiAgICB2YWx1ZXM6IGZ1bmN0aW9uKGVsdCwgdHlwZSkge1xuICAgICAgY29uc3QgaW5wdXRWYWx1ZXMgPSBnZXRJbnB1dFZhbHVlcyhlbHQsIHR5cGUgfHwgJ3Bvc3QnKVxuICAgICAgcmV0dXJuIGlucHV0VmFsdWVzLnZhbHVlc1xuICAgIH0sXG4gICAgLyogRE9NIG1hbmlwdWxhdGlvbiBoZWxwZXJzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlRWxlbWVudH0gKi9cbiAgICByZW1vdmU6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgYWRkQ2xhc3NUb0VsZW1lbnR9ICovXG4gICAgYWRkQ2xhc3M6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudH0gKi9cbiAgICByZW1vdmVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0b2dnbGVDbGFzc09uRWxlbWVudH0gKi9cbiAgICB0b2dnbGVDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiB0YWtlQ2xhc3NGb3JFbGVtZW50fSAqL1xuICAgIHRha2VDbGFzczogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBzd2FwfSAqL1xuICAgIHN3YXA6IG51bGwsXG4gICAgLyogRXh0ZW5zaW9uIGVudHJ5cG9pbnRzICovXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgZGVmaW5lRXh0ZW5zaW9ufSAqL1xuICAgIGRlZmluZUV4dGVuc2lvbjogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiByZW1vdmVFeHRlbnNpb259ICovXG4gICAgcmVtb3ZlRXh0ZW5zaW9uOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKiBAdHlwZSB7dHlwZW9mIGxvZ0FsbH0gKi9cbiAgICBsb2dBbGw6IG51bGwsXG4gICAgLyoqIEB0eXBlIHt0eXBlb2YgbG9nTm9uZX0gKi9cbiAgICBsb2dOb25lOiBudWxsLFxuICAgIC8qIERlYnVnZ2luZyAqL1xuICAgIC8qKlxuICAgICAqIFRoZSBsb2dnZXIgaHRteCB1c2VzIHRvIGxvZyB3aXRoXG4gICAgICpcbiAgICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNsb2dnZXJcbiAgICAgKi9cbiAgICBsb2dnZXI6IG51bGwsXG4gICAgLyoqXG4gICAgICogQSBwcm9wZXJ0eSBob2xkaW5nIHRoZSBjb25maWd1cmF0aW9uIGh0bXggdXNlcyBhdCBydW50aW1lLlxuICAgICAqXG4gICAgICogTm90ZSB0aGF0IHVzaW5nIGEgW21ldGEgdGFnXShodHRwczovL2h0bXgub3JnL2RvY3MvI2NvbmZpZykgaXMgdGhlIHByZWZlcnJlZCBtZWNoYW5pc20gZm9yIHNldHRpbmcgdGhlc2UgcHJvcGVydGllcy5cbiAgICAgKlxuICAgICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2NvbmZpZ1xuICAgICAqL1xuICAgIGNvbmZpZzoge1xuICAgICAgLyoqXG4gICAgICAgKiBXaGV0aGVyIHRvIHVzZSBoaXN0b3J5LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBoaXN0b3J5RW5hYmxlZDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIG51bWJlciBvZiBwYWdlcyB0byBrZWVwIGluICoqbG9jYWxTdG9yYWdlKiogZm9yIGhpc3Rvcnkgc3VwcG9ydC5cbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMTBcbiAgICAgICAqL1xuICAgICAgaGlzdG9yeUNhY2hlU2l6ZTogMTAsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHJlZnJlc2hPbkhpc3RvcnlNaXNzOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgc3dhcCBzdHlsZSB0byB1c2UgaWYgKipbaHgtc3dhcF0oaHR0cHM6Ly9odG14Lm9yZy9hdHRyaWJ1dGVzL2h4LXN3YXApKiogaXMgb21pdHRlZC5cbiAgICAgICAqIEB0eXBlIEh0bXhTd2FwU3R5bGVcbiAgICAgICAqIEBkZWZhdWx0ICdpbm5lckhUTUwnXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTd2FwU3R5bGU6ICdpbm5lckhUTUwnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBkZWxheSBiZXR3ZWVuIHJlY2VpdmluZyBhIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlciBhbmQgZG9pbmcgdGhlIHN3YXAuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDBcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdFN3YXBEZWxheTogMCxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGRlZmF1bHQgZGVsYXkgYmV0d2VlbiBjb21wbGV0aW5nIHRoZSBjb250ZW50IHN3YXAgYW5kIHNldHRsaW5nIGF0dHJpYnV0ZXMuXG4gICAgICAgKiBAdHlwZSBudW1iZXJcbiAgICAgICAqIEBkZWZhdWx0IDIwXG4gICAgICAgKi9cbiAgICAgIGRlZmF1bHRTZXR0bGVEZWxheTogMjAsXG4gICAgICAvKipcbiAgICAgICAqIElmIHRydWUsIGh0bXggd2lsbCBpbmplY3QgYSBzbWFsbCBhbW91bnQgb2YgQ1NTIGludG8gdGhlIHBhZ2UgdG8gbWFrZSBpbmRpY2F0b3JzIGludmlzaWJsZSB1bmxlc3MgdGhlICoqaHRteC1pbmRpY2F0b3IqKiBjbGFzcyBpcyBwcmVzZW50LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgdHJ1ZVxuICAgICAgICovXG4gICAgICBpbmNsdWRlSW5kaWNhdG9yU3R5bGVzOiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gaW5kaWNhdG9ycyB3aGVuIGEgcmVxdWVzdCBpcyBpbiBmbGlnaHQuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LWluZGljYXRvcidcbiAgICAgICAqL1xuICAgICAgaW5kaWNhdG9yQ2xhc3M6ICdodG14LWluZGljYXRvcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSBjbGFzcyB0byBwbGFjZSBvbiB0cmlnZ2VyaW5nIGVsZW1lbnRzIHdoZW4gYSByZXF1ZXN0IGlzIGluIGZsaWdodC5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtcmVxdWVzdCdcbiAgICAgICAqL1xuICAgICAgcmVxdWVzdENsYXNzOiAnaHRteC1yZXF1ZXN0JyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHRlbXBvcmFyaWx5IHBsYWNlIG9uIGVsZW1lbnRzIHRoYXQgaHRteCBoYXMgYWRkZWQgdG8gdGhlIERPTS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ2h0bXgtYWRkZWQnXG4gICAgICAgKi9cbiAgICAgIGFkZGVkQ2xhc3M6ICdodG14LWFkZGVkJyxcbiAgICAgIC8qKlxuICAgICAgICogVGhlIGNsYXNzIHRvIHBsYWNlIG9uIHRhcmdldCBlbGVtZW50cyB3aGVuIGh0bXggaXMgaW4gdGhlIHNldHRsaW5nIHBoYXNlLlxuICAgICAgICogQHR5cGUgc3RyaW5nXG4gICAgICAgKiBAZGVmYXVsdCAnaHRteC1zZXR0bGluZydcbiAgICAgICAqL1xuICAgICAgc2V0dGxpbmdDbGFzczogJ2h0bXgtc2V0dGxpbmcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2xhc3MgdG8gcGxhY2Ugb24gdGFyZ2V0IGVsZW1lbnRzIHdoZW4gaHRteCBpcyBpbiB0aGUgc3dhcHBpbmcgcGhhc2UuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICdodG14LXN3YXBwaW5nJ1xuICAgICAgICovXG4gICAgICBzd2FwcGluZ0NsYXNzOiAnaHRteC1zd2FwcGluZycsXG4gICAgICAvKipcbiAgICAgICAqIEFsbG93cyB0aGUgdXNlIG9mIGV2YWwtbGlrZSBmdW5jdGlvbmFsaXR5IGluIGh0bXgsIHRvIGVuYWJsZSAqKmh4LXZhcnMqKiwgdHJpZ2dlciBjb25kaXRpb25zICYgc2NyaXB0IHRhZyBldmFsdWF0aW9uLiBDYW4gYmUgc2V0IHRvICoqZmFsc2UqKiBmb3IgQ1NQIGNvbXBhdGliaWxpdHkuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93RXZhbDogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIGZhbHNlLCBkaXNhYmxlcyB0aGUgaW50ZXJwcmV0YXRpb24gb2Ygc2NyaXB0IHRhZ3MuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93U2NyaXB0VGFnczogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0LCB0aGUgbm9uY2Ugd2lsbCBiZSBhZGRlZCB0byBpbmxpbmUgc2NyaXB0cy5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJydcbiAgICAgICAqL1xuICAgICAgaW5saW5lU2NyaXB0Tm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQsIHRoZSBub25jZSB3aWxsIGJlIGFkZGVkIHRvIGlubGluZSBzdHlsZXMuXG4gICAgICAgKiBAdHlwZSBzdHJpbmdcbiAgICAgICAqIEBkZWZhdWx0ICcnXG4gICAgICAgKi9cbiAgICAgIGlubGluZVN0eWxlTm9uY2U6ICcnLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgYXR0cmlidXRlcyB0byBzZXR0bGUgZHVyaW5nIHRoZSBzZXR0bGluZyBwaGFzZS5cbiAgICAgICAqIEB0eXBlIHN0cmluZ1tdXG4gICAgICAgKiBAZGVmYXVsdCBbJ2NsYXNzJywgJ3N0eWxlJywgJ3dpZHRoJywgJ2hlaWdodCddXG4gICAgICAgKi9cbiAgICAgIGF0dHJpYnV0ZXNUb1NldHRsZTogWydjbGFzcycsICdzdHlsZScsICd3aWR0aCcsICdoZWlnaHQnXSxcbiAgICAgIC8qKlxuICAgICAgICogQWxsb3cgY3Jvc3Mtc2l0ZSBBY2Nlc3MtQ29udHJvbCByZXF1ZXN0cyB1c2luZyBjcmVkZW50aWFscyBzdWNoIGFzIGNvb2tpZXMsIGF1dGhvcml6YXRpb24gaGVhZGVycyBvciBUTFMgY2xpZW50IGNlcnRpZmljYXRlcy5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IGZhbHNlXG4gICAgICAgKi9cbiAgICAgIHdpdGhDcmVkZW50aWFsczogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIG51bWJlclxuICAgICAgICogQGRlZmF1bHQgMFxuICAgICAgICovXG4gICAgICB0aW1lb3V0OiAwLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiAqKmdldFdlYlNvY2tldFJlY29ubmVjdERlbGF5KiogZm9yIHJlY29ubmVjdGluZyBhZnRlciB1bmV4cGVjdGVkIGNvbm5lY3Rpb24gbG9zcyBieSB0aGUgZXZlbnQgY29kZSAqKkFibm9ybWFsIENsb3N1cmUqKiwgKipTZXJ2aWNlIFJlc3RhcnQqKiBvciAqKlRyeSBBZ2FpbiBMYXRlcioqLlxuICAgICAgICogQHR5cGUgeydmdWxsLWppdHRlcicgfCAoKHJldHJ5Q291bnQ6bnVtYmVyKSA9PiBudW1iZXIpfVxuICAgICAgICogQGRlZmF1bHQgXCJmdWxsLWppdHRlclwiXG4gICAgICAgKi9cbiAgICAgIHdzUmVjb25uZWN0RGVsYXk6ICdmdWxsLWppdHRlcicsXG4gICAgICAvKipcbiAgICAgICAqIFRoZSB0eXBlIG9mIGJpbmFyeSBkYXRhIGJlaW5nIHJlY2VpdmVkIG92ZXIgdGhlIFdlYlNvY2tldCBjb25uZWN0aW9uXG4gICAgICAgKiBAdHlwZSBCaW5hcnlUeXBlXG4gICAgICAgKiBAZGVmYXVsdCAnYmxvYidcbiAgICAgICAqL1xuICAgICAgd3NCaW5hcnlUeXBlOiAnYmxvYicsXG4gICAgICAvKipcbiAgICAgICAqIEB0eXBlIHN0cmluZ1xuICAgICAgICogQGRlZmF1bHQgJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nXG4gICAgICAgKi9cbiAgICAgIGRpc2FibGVTZWxlY3RvcjogJ1toeC1kaXNhYmxlXSwgW2RhdGEtaHgtZGlzYWJsZV0nLFxuICAgICAgLyoqXG4gICAgICAgKiBAdHlwZSB7J2F1dG8nIHwgJ2luc3RhbnQnIHwgJ3Ntb290aCd9XG4gICAgICAgKiBAZGVmYXVsdCAnaW5zdGFudCdcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsQmVoYXZpb3I6ICdpbnN0YW50JyxcbiAgICAgIC8qKlxuICAgICAgICogSWYgdGhlIGZvY3VzZWQgZWxlbWVudCBzaG91bGQgYmUgc2Nyb2xsZWQgaW50byB2aWV3LlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZGVmYXVsdEZvY3VzU2Nyb2xsOiBmYWxzZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIGluY2x1ZGUgYSBjYWNoZS1idXN0aW5nIHBhcmFtZXRlciBpbiBHRVQgcmVxdWVzdHMgdG8gYXZvaWQgY2FjaGluZyBwYXJ0aWFsIHJlc3BvbnNlcyBieSB0aGUgYnJvd3NlclxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgZ2V0Q2FjaGVCdXN0ZXJQYXJhbTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIElmIHNldCB0byB0cnVlLCBodG14IHdpbGwgdXNlIHRoZSBWaWV3IFRyYW5zaXRpb24gQVBJIHdoZW4gc3dhcHBpbmcgaW4gbmV3IGNvbnRlbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBnbG9iYWxWaWV3VHJhbnNpdGlvbnM6IGZhbHNlLFxuICAgICAgLyoqXG4gICAgICAgKiBodG14IHdpbGwgZm9ybWF0IHJlcXVlc3RzIHdpdGggdGhlc2UgbWV0aG9kcyBieSBlbmNvZGluZyB0aGVpciBwYXJhbWV0ZXJzIGluIHRoZSBVUkwsIG5vdCB0aGUgcmVxdWVzdCBib2R5XG4gICAgICAgKiBAdHlwZSB7KEh0dHBWZXJiKVtdfVxuICAgICAgICogQGRlZmF1bHQgWydnZXQnLCAnZGVsZXRlJ11cbiAgICAgICAqL1xuICAgICAgbWV0aG9kc1RoYXRVc2VVcmxQYXJhbXM6IFsnZ2V0JywgJ2RlbGV0ZSddLFxuICAgICAgLyoqXG4gICAgICAgKiBJZiBzZXQgdG8gdHJ1ZSwgZGlzYWJsZXMgaHRteC1iYXNlZCByZXF1ZXN0cyB0byBub24tb3JpZ2luIGhvc3RzLlxuICAgICAgICogQHR5cGUgYm9vbGVhblxuICAgICAgICogQGRlZmF1bHQgZmFsc2VcbiAgICAgICAqL1xuICAgICAgc2VsZlJlcXVlc3RzT25seTogdHJ1ZSxcbiAgICAgIC8qKlxuICAgICAgICogSWYgc2V0IHRvIHRydWUgaHRteCB3aWxsIG5vdCB1cGRhdGUgdGhlIHRpdGxlIG9mIHRoZSBkb2N1bWVudCB3aGVuIGEgdGl0bGUgdGFnIGlzIGZvdW5kIGluIG5ldyBjb250ZW50XG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgICAgICovXG4gICAgICBpZ25vcmVUaXRsZTogZmFsc2UsXG4gICAgICAvKipcbiAgICAgICAqIFdoZXRoZXIgdGhlIHRhcmdldCBvZiBhIGJvb3N0ZWQgZWxlbWVudCBpcyBzY3JvbGxlZCBpbnRvIHRoZSB2aWV3cG9ydC5cbiAgICAgICAqIEB0eXBlIGJvb2xlYW5cbiAgICAgICAqIEBkZWZhdWx0IHRydWVcbiAgICAgICAqL1xuICAgICAgc2Nyb2xsSW50b1ZpZXdPbkJvb3N0OiB0cnVlLFxuICAgICAgLyoqXG4gICAgICAgKiBUaGUgY2FjaGUgdG8gc3RvcmUgZXZhbHVhdGVkIHRyaWdnZXIgc3BlY2lmaWNhdGlvbnMgaW50by5cbiAgICAgICAqIFlvdSBtYXkgZGVmaW5lIGEgc2ltcGxlIG9iamVjdCB0byB1c2UgYSBuZXZlci1jbGVhcmluZyBjYWNoZSwgb3IgaW1wbGVtZW50IHlvdXIgb3duIHN5c3RlbSB1c2luZyBhIFtwcm94eSBvYmplY3RdKGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL1Byb3h5KVxuICAgICAgICogQHR5cGUge09iamVjdHxudWxsfVxuICAgICAgICogQGRlZmF1bHQgbnVsbFxuICAgICAgICovXG4gICAgICB0cmlnZ2VyU3BlY3NDYWNoZTogbnVsbCxcbiAgICAgIC8qKiBAdHlwZSBib29sZWFuICovXG4gICAgICBkaXNhYmxlSW5oZXJpdGFuY2U6IGZhbHNlLFxuICAgICAgLyoqIEB0eXBlIEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnW10gKi9cbiAgICAgIHJlc3BvbnNlSGFuZGxpbmc6IFtcbiAgICAgICAgeyBjb2RlOiAnMjA0Jywgc3dhcDogZmFsc2UgfSxcbiAgICAgICAgeyBjb2RlOiAnWzIzXS4uJywgc3dhcDogdHJ1ZSB9LFxuICAgICAgICB7IGNvZGU6ICdbNDVdLi4nLCBzd2FwOiBmYWxzZSwgZXJyb3I6IHRydWUgfVxuICAgICAgXSxcbiAgICAgIC8qKlxuICAgICAgICogV2hldGhlciB0byBwcm9jZXNzIE9PQiBzd2FwcyBvbiBlbGVtZW50cyB0aGF0IGFyZSBuZXN0ZWQgd2l0aGluIHRoZSBtYWluIHJlc3BvbnNlIGVsZW1lbnQuXG4gICAgICAgKiBAdHlwZSBib29sZWFuXG4gICAgICAgKiBAZGVmYXVsdCB0cnVlXG4gICAgICAgKi9cbiAgICAgIGFsbG93TmVzdGVkT29iU3dhcHM6IHRydWVcbiAgICB9LFxuICAgIC8qKiBAdHlwZSB7dHlwZW9mIHBhcnNlSW50ZXJ2YWx9ICovXG4gICAgcGFyc2VJbnRlcnZhbDogbnVsbCxcbiAgICAvKiogQHR5cGUge3R5cGVvZiBpbnRlcm5hbEV2YWx9ICovXG4gICAgXzogbnVsbCxcbiAgICB2ZXJzaW9uOiAnMi4wLjInXG4gIH1cbiAgLy8gVHNjIG1hZG5lc3MgcGFydCAyXG4gIGh0bXgub25Mb2FkID0gb25Mb2FkSGVscGVyXG4gIGh0bXgucHJvY2VzcyA9IHByb2Nlc3NOb2RlXG4gIGh0bXgub24gPSBhZGRFdmVudExpc3RlbmVySW1wbFxuICBodG14Lm9mZiA9IHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsXG4gIGh0bXgudHJpZ2dlciA9IHRyaWdnZXJFdmVudFxuICBodG14LmFqYXggPSBhamF4SGVscGVyXG4gIGh0bXguZmluZCA9IGZpbmRcbiAgaHRteC5maW5kQWxsID0gZmluZEFsbFxuICBodG14LmNsb3Nlc3QgPSBjbG9zZXN0XG4gIGh0bXgucmVtb3ZlID0gcmVtb3ZlRWxlbWVudFxuICBodG14LmFkZENsYXNzID0gYWRkQ2xhc3NUb0VsZW1lbnRcbiAgaHRteC5yZW1vdmVDbGFzcyA9IHJlbW92ZUNsYXNzRnJvbUVsZW1lbnRcbiAgaHRteC50b2dnbGVDbGFzcyA9IHRvZ2dsZUNsYXNzT25FbGVtZW50XG4gIGh0bXgudGFrZUNsYXNzID0gdGFrZUNsYXNzRm9yRWxlbWVudFxuICBodG14LnN3YXAgPSBzd2FwXG4gIGh0bXguZGVmaW5lRXh0ZW5zaW9uID0gZGVmaW5lRXh0ZW5zaW9uXG4gIGh0bXgucmVtb3ZlRXh0ZW5zaW9uID0gcmVtb3ZlRXh0ZW5zaW9uXG4gIGh0bXgubG9nQWxsID0gbG9nQWxsXG4gIGh0bXgubG9nTm9uZSA9IGxvZ05vbmVcbiAgaHRteC5wYXJzZUludGVydmFsID0gcGFyc2VJbnRlcnZhbFxuICBodG14Ll8gPSBpbnRlcm5hbEV2YWxcblxuICBjb25zdCBpbnRlcm5hbEFQSSA9IHtcbiAgICBhZGRUcmlnZ2VySGFuZGxlcixcbiAgICBib2R5Q29udGFpbnMsXG4gICAgY2FuQWNjZXNzTG9jYWxTdG9yYWdlLFxuICAgIGZpbmRUaGlzRWxlbWVudCxcbiAgICBmaWx0ZXJWYWx1ZXMsXG4gICAgc3dhcCxcbiAgICBoYXNBdHRyaWJ1dGUsXG4gICAgZ2V0QXR0cmlidXRlVmFsdWUsXG4gICAgZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlLFxuICAgIGdldENsb3Nlc3RNYXRjaCxcbiAgICBnZXRFeHByZXNzaW9uVmFycyxcbiAgICBnZXRIZWFkZXJzLFxuICAgIGdldElucHV0VmFsdWVzLFxuICAgIGdldEludGVybmFsRGF0YSxcbiAgICBnZXRTd2FwU3BlY2lmaWNhdGlvbixcbiAgICBnZXRUcmlnZ2VyU3BlY3MsXG4gICAgZ2V0VGFyZ2V0LFxuICAgIG1ha2VGcmFnbWVudCxcbiAgICBtZXJnZU9iamVjdHMsXG4gICAgbWFrZVNldHRsZUluZm8sXG4gICAgb29iU3dhcCxcbiAgICBxdWVyeVNlbGVjdG9yRXh0LFxuICAgIHNldHRsZUltbWVkaWF0ZWx5LFxuICAgIHNob3VsZENhbmNlbCxcbiAgICB0cmlnZ2VyRXZlbnQsXG4gICAgdHJpZ2dlckVycm9yRXZlbnQsXG4gICAgd2l0aEV4dGVuc2lvbnNcbiAgfVxuXG4gIGNvbnN0IFZFUkJTID0gWydnZXQnLCAncG9zdCcsICdwdXQnLCAnZGVsZXRlJywgJ3BhdGNoJ11cbiAgY29uc3QgVkVSQl9TRUxFQ1RPUiA9IFZFUkJTLm1hcChmdW5jdGlvbih2ZXJiKSB7XG4gICAgcmV0dXJuICdbaHgtJyArIHZlcmIgKyAnXSwgW2RhdGEtaHgtJyArIHZlcmIgKyAnXSdcbiAgfSkuam9pbignLCAnKVxuXG4gIGNvbnN0IEhFQURfVEFHX1JFR0VYID0gbWFrZVRhZ1JlZ0V4KCdoZWFkJylcblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBVdGlsaXRpZXNcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRhZ1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7UmVnRXhwfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZVRhZ1JlZ0V4KHRhZywgZ2xvYmFsID0gZmFsc2UpIHtcbiAgICByZXR1cm4gbmV3IFJlZ0V4cChgPCR7dGFnfShcXFxcc1tePl0qPnw+KShbXFxcXHNcXFxcU10qPyk8XFxcXC8ke3RhZ30+YCxcbiAgICAgIGdsb2JhbCA/ICdnaW0nIDogJ2ltJylcbiAgfVxuXG4gIC8qKlxuICAgKiBQYXJzZXMgYW4gaW50ZXJ2YWwgc3RyaW5nIGNvbnNpc3RlbnQgd2l0aCB0aGUgd2F5IGh0bXggZG9lcy4gVXNlZnVsIGZvciBwbHVnaW5zIHRoYXQgaGF2ZSB0aW1pbmctcmVsYXRlZCBhdHRyaWJ1dGVzLlxuICAgKlxuICAgKiBDYXV0aW9uOiBBY2NlcHRzIGFuIGludCBmb2xsb3dlZCBieSBlaXRoZXIgKipzKiogb3IgKiptcyoqLiBBbGwgb3RoZXIgdmFsdWVzIHVzZSAqKnBhcnNlRmxvYXQqKlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwYXJzZUludGVydmFsXG4gICAqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgdGltaW5nIHN0cmluZ1xuICAgKiBAcmV0dXJucyB7bnVtYmVyfHVuZGVmaW5lZH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSW50ZXJ2YWwoc3RyKSB7XG4gICAgaWYgKHN0ciA9PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiB1bmRlZmluZWRcbiAgICB9XG5cbiAgICBsZXQgaW50ZXJ2YWwgPSBOYU5cbiAgICBpZiAoc3RyLnNsaWNlKC0yKSA9PSAnbXMnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0yKSlcbiAgICB9IGVsc2UgaWYgKHN0ci5zbGljZSgtMSkgPT0gJ3MnKSB7XG4gICAgICBpbnRlcnZhbCA9IHBhcnNlRmxvYXQoc3RyLnNsaWNlKDAsIC0xKSkgKiAxMDAwXG4gICAgfSBlbHNlIGlmIChzdHIuc2xpY2UoLTEpID09ICdtJykge1xuICAgICAgaW50ZXJ2YWwgPSBwYXJzZUZsb2F0KHN0ci5zbGljZSgwLCAtMSkpICogMTAwMCAqIDYwXG4gICAgfSBlbHNlIHtcbiAgICAgIGludGVydmFsID0gcGFyc2VGbG9hdChzdHIpXG4gICAgfVxuICAgIHJldHVybiBpc05hTihpbnRlcnZhbCkgPyB1bmRlZmluZWQgOiBpbnRlcnZhbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCBuYW1lKSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEVsZW1lbnQgJiYgZWx0LmdldEF0dHJpYnV0ZShuYW1lKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgLy8gcmVzb2x2ZSB3aXRoIGJvdGggaHggYW5kIGRhdGEtaHggcHJlZml4ZXNcbiAgZnVuY3Rpb24gaGFzQXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkge1xuICAgIHJldHVybiAhIWVsdC5oYXNBdHRyaWJ1dGUgJiYgKGVsdC5oYXNBdHRyaWJ1dGUocXVhbGlmaWVkTmFtZSkgfHxcbiAgICAgIGVsdC5oYXNBdHRyaWJ1dGUoJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpKVxuICB9XG5cbiAgLyoqXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBxdWFsaWZpZWROYW1lXG4gICAqIEByZXR1cm5zIHsoc3RyaW5nIHwgbnVsbCl9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsIHF1YWxpZmllZE5hbWUpIHtcbiAgICByZXR1cm4gZ2V0UmF3QXR0cmlidXRlKGVsdCwgcXVhbGlmaWVkTmFtZSkgfHwgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2RhdGEtJyArIHF1YWxpZmllZE5hbWUpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge05vZGUgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyZW50RWx0KGVsdCkge1xuICAgIGNvbnN0IHBhcmVudCA9IGVsdC5wYXJlbnRFbGVtZW50XG4gICAgaWYgKCFwYXJlbnQgJiYgZWx0LnBhcmVudE5vZGUgaW5zdGFuY2VvZiBTaGFkb3dSb290KSByZXR1cm4gZWx0LnBhcmVudE5vZGVcbiAgICByZXR1cm4gcGFyZW50XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RG9jdW1lbnQoKSB7XG4gICAgcmV0dXJuIGRvY3VtZW50XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge05vZGV8RG9jdW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSb290Tm9kZShlbHQsIGdsb2JhbCkge1xuICAgIHJldHVybiBlbHQuZ2V0Um9vdE5vZGUgPyBlbHQuZ2V0Um9vdE5vZGUoeyBjb21wb3NlZDogZ2xvYmFsIH0pIDogZ2V0RG9jdW1lbnQoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7KGU6Tm9kZSkgPT4gYm9vbGVhbn0gY29uZGl0aW9uXG4gICAqIEByZXR1cm5zIHtOb2RlIHwgbnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENsb3Nlc3RNYXRjaChlbHQsIGNvbmRpdGlvbikge1xuICAgIHdoaWxlIChlbHQgJiYgIWNvbmRpdGlvbihlbHQpKSB7XG4gICAgICBlbHQgPSBwYXJlbnRFbHQoZWx0KVxuICAgIH1cblxuICAgIHJldHVybiBlbHQgfHwgbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gaW5pdGlhbEVsZW1lbnRcbiAgICogQHBhcmFtIHtFbGVtZW50fSBhbmNlc3RvclxuICAgKiBAcGFyYW0ge3N0cmluZ30gYXR0cmlidXRlTmFtZVxuICAgKiBAcmV0dXJucyB7c3RyaW5nfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShpbml0aWFsRWxlbWVudCwgYW5jZXN0b3IsIGF0dHJpYnV0ZU5hbWUpIHtcbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGFuY2VzdG9yLCBhdHRyaWJ1dGVOYW1lKVxuICAgIGNvbnN0IGRpc2luaGVyaXQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShhbmNlc3RvciwgJ2h4LWRpc2luaGVyaXQnKVxuICAgIHZhciBpbmhlcml0ID0gZ2V0QXR0cmlidXRlVmFsdWUoYW5jZXN0b3IsICdoeC1pbmhlcml0JylcbiAgICBpZiAoaW5pdGlhbEVsZW1lbnQgIT09IGFuY2VzdG9yKSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuZGlzYWJsZUluaGVyaXRhbmNlKSB7XG4gICAgICAgIGlmIChpbmhlcml0ICYmIChpbmhlcml0ID09PSAnKicgfHwgaW5oZXJpdC5zcGxpdCgnICcpLmluZGV4T2YoYXR0cmlidXRlTmFtZSkgPj0gMCkpIHtcbiAgICAgICAgICByZXR1cm4gYXR0cmlidXRlVmFsdWVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoZGlzaW5oZXJpdCAmJiAoZGlzaW5oZXJpdCA9PT0gJyonIHx8IGRpc2luaGVyaXQuc3BsaXQoJyAnKS5pbmRleE9mKGF0dHJpYnV0ZU5hbWUpID49IDApKSB7XG4gICAgICAgIHJldHVybiAndW5zZXQnXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhdHRyaWJ1dGVWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyaWJ1dGVOYW1lXG4gICAqIEByZXR1cm5zIHtzdHJpbmcgfCBudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cmlidXRlTmFtZSkge1xuICAgIGxldCBjbG9zZXN0QXR0ciA9IG51bGxcbiAgICBnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlKSB7XG4gICAgICByZXR1cm4gISEoY2xvc2VzdEF0dHIgPSBnZXRBdHRyaWJ1dGVWYWx1ZVdpdGhEaXNpbmhlcml0YW5jZShlbHQsIGFzRWxlbWVudChlKSwgYXR0cmlidXRlTmFtZSkpXG4gICAgfSlcbiAgICBpZiAoY2xvc2VzdEF0dHIgIT09ICd1bnNldCcpIHtcbiAgICAgIHJldHVybiBjbG9zZXN0QXR0clxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBtYXRjaGVzKGVsdCwgc2VsZWN0b3IpIHtcbiAgICAvLyBAdHMtaWdub3JlOiBub24tc3RhbmRhcmQgcHJvcGVydGllcyBmb3IgYnJvd3NlciBjb21wYXRpYmlsaXR5XG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFZhcmlhYmxlXG4gICAgY29uc3QgbWF0Y2hlc0Z1bmN0aW9uID0gZWx0IGluc3RhbmNlb2YgRWxlbWVudCAmJiAoZWx0Lm1hdGNoZXMgfHwgZWx0Lm1hdGNoZXNTZWxlY3RvciB8fCBlbHQubXNNYXRjaGVzU2VsZWN0b3IgfHwgZWx0Lm1vek1hdGNoZXNTZWxlY3RvciB8fCBlbHQud2Via2l0TWF0Y2hlc1NlbGVjdG9yIHx8IGVsdC5vTWF0Y2hlc1NlbGVjdG9yKVxuICAgIHJldHVybiAhIW1hdGNoZXNGdW5jdGlvbiAmJiBtYXRjaGVzRnVuY3Rpb24uY2FsbChlbHQsIHNlbGVjdG9yKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdHJcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFN0YXJ0VGFnKHN0cikge1xuICAgIGNvbnN0IHRhZ01hdGNoZXIgPSAvPChbYS16XVteXFwvXFwwPlxceDIwXFx0XFxyXFxuXFxmXSopL2lcbiAgICBjb25zdCBtYXRjaCA9IHRhZ01hdGNoZXIuZXhlYyhzdHIpXG4gICAgaWYgKG1hdGNoKSB7XG4gICAgICByZXR1cm4gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gJydcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJlc3BcbiAgICogQHJldHVybnMge0RvY3VtZW50fVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VIVE1MKHJlc3ApIHtcbiAgICBjb25zdCBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKClcbiAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbVN0cmluZyhyZXNwLCAndGV4dC9odG1sJylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0RvY3VtZW50RnJhZ21lbnR9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGVsdCkge1xuICAgIHdoaWxlIChlbHQuY2hpbGROb2Rlcy5sZW5ndGggPiAwKSB7XG4gICAgICBmcmFnbWVudC5hcHBlbmQoZWx0LmNoaWxkTm9kZXNbMF0pXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdFxuICAgKiBAcmV0dXJucyB7SFRNTFNjcmlwdEVsZW1lbnR9XG4gICAqL1xuICBmdW5jdGlvbiBkdXBsaWNhdGVTY3JpcHQoc2NyaXB0KSB7XG4gICAgY29uc3QgbmV3U2NyaXB0ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVFbGVtZW50KCdzY3JpcHQnKVxuICAgIGZvckVhY2goc2NyaXB0LmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIG5ld1NjcmlwdC5zZXRBdHRyaWJ1dGUoYXR0ci5uYW1lLCBhdHRyLnZhbHVlKVxuICAgIH0pXG4gICAgbmV3U2NyaXB0LnRleHRDb250ZW50ID0gc2NyaXB0LnRleHRDb250ZW50XG4gICAgbmV3U2NyaXB0LmFzeW5jID0gZmFsc2VcbiAgICBpZiAoaHRteC5jb25maWcuaW5saW5lU2NyaXB0Tm9uY2UpIHtcbiAgICAgIG5ld1NjcmlwdC5ub25jZSA9IGh0bXguY29uZmlnLmlubGluZVNjcmlwdE5vbmNlXG4gICAgfVxuICAgIHJldHVybiBuZXdTY3JpcHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxTY3JpcHRFbGVtZW50fSBzY3JpcHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0phdmFTY3JpcHRTY3JpcHROb2RlKHNjcmlwdCkge1xuICAgIHJldHVybiBzY3JpcHQubWF0Y2hlcygnc2NyaXB0JykgJiYgKHNjcmlwdC50eXBlID09PSAndGV4dC9qYXZhc2NyaXB0JyB8fCBzY3JpcHQudHlwZSA9PT0gJ21vZHVsZScgfHwgc2NyaXB0LnR5cGUgPT09ICcnKVxuICB9XG5cbiAgLyoqXG4gICAqIHdlIGhhdmUgdG8gbWFrZSBuZXcgY29waWVzIG9mIHNjcmlwdCB0YWdzIHRoYXQgd2UgYXJlIGdvaW5nIHRvIGluc2VydCBiZWNhdXNlXG4gICAqIFNPTUUgYnJvd3NlcnMgKG5vdCBzYXlpbmcgd2hvLCBidXQgaXQgaW52b2x2ZXMgYW4gZWxlbWVudCBhbmQgYW4gYW5pbWFsKSBkb24ndFxuICAgKiBleGVjdXRlIHNjcmlwdHMgY3JlYXRlZCBpbiA8dGVtcGxhdGU+IHRhZ3Mgd2hlbiB0aGV5IGFyZSBpbnNlcnRlZCBpbnRvIHRoZSBET01cbiAgICogYW5kIGFsbCB0aGUgb3RoZXJzIGRvIGxtYW9cbiAgICogQHBhcmFtIHtEb2N1bWVudEZyYWdtZW50fSBmcmFnbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gbm9ybWFsaXplU2NyaXB0VGFncyhmcmFnbWVudCkge1xuICAgIEFycmF5LmZyb20oZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbCgnc2NyaXB0JykpLmZvckVhY2goLyoqIEBwYXJhbSB7SFRNTFNjcmlwdEVsZW1lbnR9IHNjcmlwdCAqLyAoc2NyaXB0KSA9PiB7XG4gICAgICBpZiAoaXNKYXZhU2NyaXB0U2NyaXB0Tm9kZShzY3JpcHQpKSB7XG4gICAgICAgIGNvbnN0IG5ld1NjcmlwdCA9IGR1cGxpY2F0ZVNjcmlwdChzY3JpcHQpXG4gICAgICAgIGNvbnN0IHBhcmVudCA9IHNjcmlwdC5wYXJlbnROb2RlXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcGFyZW50Lmluc2VydEJlZm9yZShuZXdTY3JpcHQsIHNjcmlwdClcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgIH0gZmluYWxseSB7XG4gICAgICAgICAgc2NyaXB0LnJlbW92ZSgpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtEb2N1bWVudEZyYWdtZW50ICYge3RpdGxlPzogc3RyaW5nfX0gRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZVxuICAgKiBAZGVzY3JpcHRpb24gIGEgZG9jdW1lbnQgZnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSByZXNwb25zZSBIVE1MLCBpbmNsdWRpbmdcbiAgICogYSBgdGl0bGVgIHByb3BlcnR5IGZvciBhbnkgdGl0bGUgaW5mb3JtYXRpb24gZm91bmRcbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSByZXNwb25zZSBIVE1MXG4gICAqIEByZXR1cm5zIHtEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlfVxuICAgKi9cbiAgZnVuY3Rpb24gbWFrZUZyYWdtZW50KHJlc3BvbnNlKSB7XG4gICAgLy8gc3RyaXAgaGVhZCB0YWcgdG8gZGV0ZXJtaW5lIHNoYXBlIG9mIHJlc3BvbnNlIHdlIGFyZSBkZWFsaW5nIHdpdGhcbiAgICBjb25zdCByZXNwb25zZVdpdGhOb0hlYWQgPSByZXNwb25zZS5yZXBsYWNlKEhFQURfVEFHX1JFR0VYLCAnJylcbiAgICBjb25zdCBzdGFydFRhZyA9IGdldFN0YXJ0VGFnKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqL1xuICAgIGxldCBmcmFnbWVudFxuICAgIGlmIChzdGFydFRhZyA9PT0gJ2h0bWwnKSB7XG4gICAgICAvLyBpZiBpdCBpcyBhIGZ1bGwgZG9jdW1lbnQsIHBhcnNlIGl0IGFuZCByZXR1cm4gdGhlIGJvZHlcbiAgICAgIGZyYWdtZW50ID0gLyoqIEB0eXBlIERvY3VtZW50RnJhZ21lbnRXaXRoVGl0bGUgKi8gKG5ldyBEb2N1bWVudEZyYWdtZW50KCkpXG4gICAgICBjb25zdCBkb2MgPSBwYXJzZUhUTUwocmVzcG9uc2UpXG4gICAgICB0YWtlQ2hpbGRyZW5Gb3IoZnJhZ21lbnQsIGRvYy5ib2R5KVxuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcbiAgICB9IGVsc2UgaWYgKHN0YXJ0VGFnID09PSAnYm9keScpIHtcbiAgICAgIC8vIHBhcnNlIGJvZHkgdy9vIHdyYXBwaW5nIGluIHRlbXBsYXRlXG4gICAgICBmcmFnbWVudCA9IC8qKiBAdHlwZSBEb2N1bWVudEZyYWdtZW50V2l0aFRpdGxlICovIChuZXcgRG9jdW1lbnRGcmFnbWVudCgpKVxuICAgICAgY29uc3QgZG9jID0gcGFyc2VIVE1MKHJlc3BvbnNlV2l0aE5vSGVhZClcbiAgICAgIHRha2VDaGlsZHJlbkZvcihmcmFnbWVudCwgZG9jLmJvZHkpXG4gICAgICBmcmFnbWVudC50aXRsZSA9IGRvYy50aXRsZVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBvdGhlcndpc2Ugd2UgaGF2ZSBub24tYm9keSBwYXJ0aWFsIEhUTUwgY29udGVudCwgc28gd3JhcCBpdCBpbiBhIHRlbXBsYXRlIHRvIG1heGltaXplIHBhcnNpbmcgZmxleGliaWxpdHlcbiAgICAgIGNvbnN0IGRvYyA9IHBhcnNlSFRNTCgnPGJvZHk+PHRlbXBsYXRlIGNsYXNzPVwiaW50ZXJuYWwtaHRteC13cmFwcGVyXCI+JyArIHJlc3BvbnNlV2l0aE5vSGVhZCArICc8L3RlbXBsYXRlPjwvYm9keT4nKVxuICAgICAgZnJhZ21lbnQgPSAvKiogQHR5cGUgRG9jdW1lbnRGcmFnbWVudFdpdGhUaXRsZSAqLyAoZG9jLnF1ZXJ5U2VsZWN0b3IoJ3RlbXBsYXRlJykuY29udGVudClcbiAgICAgIC8vIGV4dHJhY3QgdGl0bGUgaW50byBmcmFnbWVudCBmb3IgbGF0ZXIgcHJvY2Vzc2luZ1xuICAgICAgZnJhZ21lbnQudGl0bGUgPSBkb2MudGl0bGVcblxuICAgICAgLy8gZm9yIGxlZ2FjeSByZWFzb25zIHdlIHN1cHBvcnQgYSB0aXRsZSB0YWcgYXQgdGhlIHJvb3QgbGV2ZWwgb2Ygbm9uLWJvZHkgcmVzcG9uc2VzLCBzbyB3ZSBuZWVkIHRvIGhhbmRsZSBpdFxuICAgICAgdmFyIHRpdGxlRWxlbWVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ3RpdGxlJylcbiAgICAgIGlmICh0aXRsZUVsZW1lbnQgJiYgdGl0bGVFbGVtZW50LnBhcmVudE5vZGUgPT09IGZyYWdtZW50KSB7XG4gICAgICAgIHRpdGxlRWxlbWVudC5yZW1vdmUoKVxuICAgICAgICBmcmFnbWVudC50aXRsZSA9IHRpdGxlRWxlbWVudC5pbm5lclRleHRcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGZyYWdtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dTY3JpcHRUYWdzKSB7XG4gICAgICAgIG5vcm1hbGl6ZVNjcmlwdFRhZ3MoZnJhZ21lbnQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyByZW1vdmUgYWxsIHNjcmlwdCB0YWdzIGlmIHNjcmlwdHMgYXJlIGRpc2FibGVkXG4gICAgICAgIGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ3NjcmlwdCcpLmZvckVhY2goKHNjcmlwdCkgPT4gc2NyaXB0LnJlbW92ZSgpKVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZnJhZ21lbnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUNhbGwoZnVuYykge1xuICAgIGlmIChmdW5jKSB7XG4gICAgICBmdW5jKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHthbnl9IG9cbiAgICogQHBhcmFtIHtzdHJpbmd9IHR5cGVcbiAgICogQHJldHVybnNcbiAgICovXG4gIGZ1bmN0aW9uIGlzVHlwZShvLCB0eXBlKSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKSA9PT0gJ1tvYmplY3QgJyArIHR5cGUgKyAnXSdcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgRnVuY3Rpb259XG4gICAqL1xuICBmdW5jdGlvbiBpc0Z1bmN0aW9uKG8pIHtcbiAgICByZXR1cm4gdHlwZW9mIG8gPT09ICdmdW5jdGlvbidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0geyp9IG9cbiAgICogQHJldHVybnMge28gaXMgT2JqZWN0fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNSYXdPYmplY3Qobykge1xuICAgIHJldHVybiBpc1R5cGUobywgJ09iamVjdCcpXG4gIH1cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gT25IYW5kbGVyXG4gICAqIEBwcm9wZXJ0eSB7KGtleW9mIEhUTUxFbGVtZW50RXZlbnRNYXApfHN0cmluZ30gZXZlbnRcbiAgICogQHByb3BlcnR5IHtFdmVudExpc3RlbmVyfSBsaXN0ZW5lclxuICAgKi9cblxuICAvKipcbiAgICogQHR5cGVkZWYge09iamVjdH0gTGlzdGVuZXJJbmZvXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0cmlnZ2VyXG4gICAqIEBwcm9wZXJ0eSB7RXZlbnRMaXN0ZW5lcn0gbGlzdGVuZXJcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gb25cbiAgICovXG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhOb2RlSW50ZXJuYWxEYXRhXG4gICAqIEVsZW1lbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2luaXRIYXNoXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFtib29zdGVkXVxuICAgKiBAcHJvcGVydHkge09uSGFuZGxlcltdfSBbb25IYW5kbGVyc11cbiAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgKiBAcHJvcGVydHkge0xpc3RlbmVySW5mb1tdfSBbbGlzdGVuZXJJbmZvc11cbiAgICogQHByb3BlcnR5IHtib29sZWFufSBbY2FuY2VsbGVkXVxuICAgKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmlnZ2VyZWRPbmNlXVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gW2RlbGF5ZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfG51bGx9IFt0aHJvdHRsZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtsYXN0VmFsdWVdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2xvYWRlZF1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd9IFtwYXRoXVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gW3ZlcmJdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3BvbGxpbmddXG4gICAqIEBwcm9wZXJ0eSB7SFRNTEJ1dHRvbkVsZW1lbnR8SFRNTElucHV0RWxlbWVudHxudWxsfSBbbGFzdEJ1dHRvbkNsaWNrZWRdXG4gICAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbcmVxdWVzdENvdW50XVxuICAgKiBAcHJvcGVydHkge1hNTEh0dHBSZXF1ZXN0fSBbeGhyXVxuICAgKiBAcHJvcGVydHkgeygoKSA9PiB2b2lkKVtdfSBbcXVldWVkUmVxdWVzdHNdXG4gICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Fib3J0YWJsZV1cbiAgICpcbiAgICogRXZlbnQgZGF0YVxuICAgKiBAcHJvcGVydHkge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbn0gW3RyaWdnZXJTcGVjXVxuICAgKiBAcHJvcGVydHkge0V2ZW50VGFyZ2V0W119IFtoYW5kbGVkRm9yXVxuICAgKi9cblxuICAvKipcbiAgICogZ2V0SW50ZXJuYWxEYXRhIHJldHJpZXZlcyBcInByaXZhdGVcIiBkYXRhIHN0b3JlZCBieSBodG14IHdpdGhpbiBhbiBlbGVtZW50XG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8RXZlbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteE5vZGVJbnRlcm5hbERhdGF9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRJbnRlcm5hbERhdGEoZWx0KSB7XG4gICAgY29uc3QgZGF0YVByb3AgPSAnaHRteC1pbnRlcm5hbC1kYXRhJ1xuICAgIGxldCBkYXRhID0gZWx0W2RhdGFQcm9wXVxuICAgIGlmICghZGF0YSkge1xuICAgICAgZGF0YSA9IGVsdFtkYXRhUHJvcF0gPSB7fVxuICAgIH1cbiAgICByZXR1cm4gZGF0YVxuICB9XG5cbiAgLyoqXG4gICAqIHRvQXJyYXkgY29udmVydHMgYW4gQXJyYXlMaWtlIG9iamVjdCBpbnRvIGEgcmVhbCBhcnJheS5cbiAgICogQHRlbXBsYXRlIFRcbiAgICogQHBhcmFtIHtBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcmV0dXJucyB7VFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gdG9BcnJheShhcnIpIHtcbiAgICBjb25zdCByZXR1cm5BcnIgPSBbXVxuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJldHVybkFyci5wdXNoKGFycltpXSlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHJldHVybkFyclxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSBUXG4gICAqIEBwYXJhbSB7VFtdfE5hbWVkTm9kZU1hcHxIVE1MQ29sbGVjdGlvbnxIVE1MRm9ybUNvbnRyb2xzQ29sbGVjdGlvbnxBcnJheUxpa2U8VD59IGFyclxuICAgKiBAcGFyYW0geyhUKSA9PiB2b2lkfSBmdW5jXG4gICAqL1xuICBmdW5jdGlvbiBmb3JFYWNoKGFyciwgZnVuYykge1xuICAgIGlmIChhcnIpIHtcbiAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZ1bmMoYXJyW2ldKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaXNTY3JvbGxlZEludG9WaWV3KGVsKSB7XG4gICAgY29uc3QgcmVjdCA9IGVsLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpXG4gICAgY29uc3QgZWxlbVRvcCA9IHJlY3QudG9wXG4gICAgY29uc3QgZWxlbUJvdHRvbSA9IHJlY3QuYm90dG9tXG4gICAgcmV0dXJuIGVsZW1Ub3AgPCB3aW5kb3cuaW5uZXJIZWlnaHQgJiYgZWxlbUJvdHRvbSA+PSAwXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBib2R5Q29udGFpbnMoZWx0KSB7XG4gICAgLy8gSUUgRml4XG4gICAgY29uc3Qgcm9vdE5vZGUgPSBlbHQuZ2V0Um9vdE5vZGUgJiYgZWx0LmdldFJvb3ROb2RlKClcbiAgICBpZiAocm9vdE5vZGUgJiYgcm9vdE5vZGUgaW5zdGFuY2VvZiB3aW5kb3cuU2hhZG93Um9vdCkge1xuICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keS5jb250YWlucyhyb290Tm9kZS5ob3N0KVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZ2V0RG9jdW1lbnQoKS5ib2R5LmNvbnRhaW5zKGVsdClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRyaWdnZXJcbiAgICogQHJldHVybnMge3N0cmluZ1tdfVxuICAgKi9cbiAgZnVuY3Rpb24gc3BsaXRPbldoaXRlc3BhY2UodHJpZ2dlcikge1xuICAgIHJldHVybiB0cmlnZ2VyLnRyaW0oKS5zcGxpdCgvXFxzKy8pXG4gIH1cblxuICAvKipcbiAgICogbWVyZ2VPYmplY3RzIHRha2VzIGFsbCB0aGUga2V5cyBmcm9tXG4gICAqIG9iajIgYW5kIGR1cGxpY2F0ZXMgdGhlbSBpbnRvIG9iajFcbiAgICogQHRlbXBsYXRlIFQxXG4gICAqIEB0ZW1wbGF0ZSBUMlxuICAgKiBAcGFyYW0ge1QxfSBvYmoxXG4gICAqIEBwYXJhbSB7VDJ9IG9iajJcbiAgICogQHJldHVybnMge1QxICYgVDJ9XG4gICAqL1xuICBmdW5jdGlvbiBtZXJnZU9iamVjdHMob2JqMSwgb2JqMikge1xuICAgIGZvciAoY29uc3Qga2V5IGluIG9iajIpIHtcbiAgICAgIGlmIChvYmoyLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgLy8gQHRzLWlnbm9yZSB0c2MgZG9lc24ndCBzZWVtIHRvIHByb3Blcmx5IGhhbmRsZSB0eXBlcyBtZXJnaW5nXG4gICAgICAgIG9iajFba2V5XSA9IG9iajJba2V5XVxuICAgICAgfVxuICAgIH1cbiAgICAvLyBAdHMtaWdub3JlIHRzYyBkb2Vzbid0IHNlZW0gdG8gcHJvcGVybHkgaGFuZGxlIHR5cGVzIG1lcmdpbmdcbiAgICByZXR1cm4gb2JqMVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBqU3RyaW5nXG4gICAqIEByZXR1cm5zIHthbnl8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIHBhcnNlSlNPTihqU3RyaW5nKSB7XG4gICAgdHJ5IHtcbiAgICAgIHJldHVybiBKU09OLnBhcnNlKGpTdHJpbmcpXG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGxvZ0Vycm9yKGVycm9yKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSB7XG4gICAgY29uc3QgdGVzdCA9ICdodG14OmxvY2FsU3RvcmFnZVRlc3QnXG4gICAgdHJ5IHtcbiAgICAgIGxvY2FsU3RvcmFnZS5zZXRJdGVtKHRlc3QsIHRlc3QpXG4gICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0ZXN0KVxuICAgICAgcmV0dXJuIHRydWVcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIG5vcm1hbGl6ZVBhdGgocGF0aCkge1xuICAgIHRyeSB7XG4gICAgICBjb25zdCB1cmwgPSBuZXcgVVJMKHBhdGgpXG4gICAgICBpZiAodXJsKSB7XG4gICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9XG4gICAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2gsIHVubGVzcyBpbmRleCBwYWdlXG4gICAgICBpZiAoISgvXlxcLyQvLnRlc3QocGF0aCkpKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnJlcGxhY2UoL1xcLyskLywgJycpXG4gICAgICB9XG4gICAgICByZXR1cm4gcGF0aFxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIGJlIGtpbmQgdG8gSUUxMSwgd2hpY2ggZG9lc24ndCBzdXBwb3J0IFVSTCgpXG4gICAgICByZXR1cm4gcGF0aFxuICAgIH1cbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBwdWJsaWMgQVBJXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHthbnl9XG4gICAqL1xuICBmdW5jdGlvbiBpbnRlcm5hbEV2YWwoc3RyKSB7XG4gICAgcmV0dXJuIG1heWJlRXZhbChnZXREb2N1bWVudCgpLmJvZHksIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV2YWwoc3RyKVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogQWRkcyBhIGNhbGxiYWNrIGZvciB0aGUgKipodG14OmxvYWQqKiBldmVudC4gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm9jZXNzIG5ldyBjb250ZW50LCBmb3IgZXhhbXBsZSBpbml0aWFsaXppbmcgdGhlIGNvbnRlbnQgd2l0aCBhIGphdmFzY3JpcHQgbGlicmFyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvbkxvYWRcbiAgICpcbiAgICogQHBhcmFtIHsoZWx0OiBOb2RlKSA9PiB2b2lkfSBjYWxsYmFjayB0aGUgY2FsbGJhY2sgdG8gY2FsbCBvbiBuZXdseSBsb2FkZWQgY29udGVudFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIG9uTG9hZEhlbHBlcihjYWxsYmFjaykge1xuICAgIGNvbnN0IHZhbHVlID0gaHRteC5vbignaHRteDpsb2FkJywgLyoqIEBwYXJhbSB7Q3VzdG9tRXZlbnR9IGV2dCAqLyBmdW5jdGlvbihldnQpIHtcbiAgICAgIGNhbGxiYWNrKGV2dC5kZXRhaWwuZWx0KVxuICAgIH0pXG4gICAgcmV0dXJuIHZhbHVlXG4gIH1cblxuICAvKipcbiAgICogTG9nIGFsbCBodG14IGV2ZW50cywgdXNlZnVsIGZvciBkZWJ1Z2dpbmcuXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2xvZ0FsbFxuICAgKi9cbiAgZnVuY3Rpb24gbG9nQWxsKCkge1xuICAgIGh0bXgubG9nZ2VyID0gZnVuY3Rpb24oZWx0LCBldmVudCwgZGF0YSkge1xuICAgICAgaWYgKGNvbnNvbGUpIHtcbiAgICAgICAgY29uc29sZS5sb2coZXZlbnQsIGVsdCwgZGF0YSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBsb2dOb25lKCkge1xuICAgIGh0bXgubG9nZ2VyID0gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEZpbmRzIGFuIGVsZW1lbnQgbWF0Y2hpbmcgdGhlIHNlbGVjdG9yXG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2ZpbmRcbiAgICpcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfHN0cmluZ30gZWx0T3JTZWxlY3RvciAgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50IGluLCBpbmNsdXNpdmUgfCB0aGUgc2VsZWN0b3IgdG8gbWF0Y2hcbiAgICogQHBhcmFtIHtzdHJpbmd9IFtzZWxlY3Rvcl0gdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEByZXR1cm5zIHtFbGVtZW50fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kKGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKSB7XG4gICAgaWYgKHR5cGVvZiBlbHRPclNlbGVjdG9yICE9PSAnc3RyaW5nJykge1xuICAgICAgcmV0dXJuIGVsdE9yU2VsZWN0b3IucXVlcnlTZWxlY3RvcihzZWxlY3RvcilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGZpbmQoZ2V0RG9jdW1lbnQoKSwgZWx0T3JTZWxlY3RvcilcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogRmluZHMgYWxsIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBzZWxlY3RvclxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNmaW5kQWxsXG4gICAqXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZXxzdHJpbmd9IGVsdE9yU2VsZWN0b3IgdGhlIHJvb3QgZWxlbWVudCB0byBmaW5kIHRoZSBtYXRjaGluZyBlbGVtZW50cyBpbiwgaW5jbHVzaXZlIHwgdGhlIHNlbGVjdG9yIHRvIG1hdGNoXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbc2VsZWN0b3JdIHRoZSBzZWxlY3RvciB0byBtYXRjaFxuICAgKiBAcmV0dXJucyB7Tm9kZUxpc3RPZjxFbGVtZW50Pn1cbiAgICovXG4gIGZ1bmN0aW9uIGZpbmRBbGwoZWx0T3JTZWxlY3Rvciwgc2VsZWN0b3IpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgIT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZWx0T3JTZWxlY3Rvci5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gZmluZEFsbChnZXREb2N1bWVudCgpLCBlbHRPclNlbGVjdG9yKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyBXaW5kb3dcbiAgICovXG4gIGZ1bmN0aW9uIGdldFdpbmRvdygpIHtcbiAgICByZXR1cm4gd2luZG93XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlcyBhbiBlbGVtZW50IGZyb20gdGhlIERPTVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVcbiAgICpcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtudW1iZXJ9IFtkZWxheV1cbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUVsZW1lbnQoZWx0LCBkZWxheSkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChkZWxheSkge1xuICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgcmVtb3ZlRWxlbWVudChlbHQpXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBwYXJlbnRFbHQoZWx0KS5yZW1vdmVDaGlsZChlbHQpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNFbGVtZW50KGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSBlbHRcbiAgICogQHJldHVybiB7SFRNTEVsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzSHRtbEVsZW1lbnQoZWx0KSB7XG4gICAgcmV0dXJuIGVsdCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50ID8gZWx0IDogbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZVxuICAgKiBAcmV0dXJuIHtzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGFzU3RyaW5nKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycgPyB2YWx1ZSA6IG51bGxcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fSBlbHRcbiAgICogQHJldHVybiB7UGFyZW50Tm9kZXxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gYXNQYXJlbnROb2RlKGVsdCkge1xuICAgIHJldHVybiBlbHQgaW5zdGFuY2VvZiBFbGVtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50IHx8IGVsdCBpbnN0YW5jZW9mIERvY3VtZW50RnJhZ21lbnQgPyBlbHQgOiBudWxsXG4gIH1cblxuICAvKipcbiAgICogVGhpcyBtZXRob2QgYWRkcyBhIGNsYXNzIHRvIHRoZSBnaXZlbiBlbGVtZW50LlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhZGRDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gYWRkIHRoZSBjbGFzcyB0b1xuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIGFkZFxuICAgKiBAcGFyYW0ge251bWJlcn0gW2RlbGF5XSB0aGUgZGVsYXkgKGluIG1pbGxpc2Vjb25kcykgYmVmb3JlIGNsYXNzIGlzIGFkZGVkXG4gICAqL1xuICBmdW5jdGlvbiBhZGRDbGFzc1RvRWxlbWVudChlbHQsIGNsYXp6LCBkZWxheSkge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIGFkZENsYXNzVG9FbGVtZW50KGVsdCwgY2xhenopXG4gICAgICAgIGVsdCA9IG51bGxcbiAgICAgIH0sIGRlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBlbHQuY2xhc3NMaXN0ICYmIGVsdC5jbGFzc0xpc3QuYWRkKGNsYXp6KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBSZW1vdmVzIGEgY2xhc3MgZnJvbSB0aGUgZ2l2ZW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBub2RlIGVsZW1lbnQgdG8gcmVtb3ZlIHRoZSBjbGFzcyBmcm9tXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBjbGF6eiB0aGUgY2xhc3MgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBbZGVsYXldIHRoZSBkZWxheSAoaW4gbWlsbGlzZWNvbmRzIGJlZm9yZSBjbGFzcyBpcyByZW1vdmVkKVxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChub2RlLCBjbGF6eiwgZGVsYXkpIHtcbiAgICBsZXQgZWx0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQobm9kZSkpXG4gICAgaWYgKCFlbHQpIHtcbiAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAoZGVsYXkpIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgIHJlbW92ZUNsYXNzRnJvbUVsZW1lbnQoZWx0LCBjbGF6eilcbiAgICAgICAgZWx0ID0gbnVsbFxuICAgICAgfSwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgIGVsdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXp6KVxuICAgICAgICAvLyBpZiB0aGVyZSBhcmUgbm8gY2xhc3NlcyBsZWZ0LCByZW1vdmUgdGhlIGNsYXNzIGF0dHJpYnV0ZVxuICAgICAgICBpZiAoZWx0LmNsYXNzTGlzdC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICBlbHQucmVtb3ZlQXR0cmlidXRlKCdjbGFzcycpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogVG9nZ2xlcyB0aGUgZ2l2ZW4gY2xhc3Mgb24gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyN0b2dnbGVDbGFzc1xuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gdG9nZ2xlIHRoZSBjbGFzcyBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gY2xhenogdGhlIGNsYXNzIHRvIHRvZ2dsZVxuICAgKi9cbiAgZnVuY3Rpb24gdG9nZ2xlQ2xhc3NPbkVsZW1lbnQoZWx0LCBjbGF6eikge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGVsdC5jbGFzc0xpc3QudG9nZ2xlKGNsYXp6KVxuICB9XG5cbiAgLyoqXG4gICAqIFRha2VzIHRoZSBnaXZlbiBjbGFzcyBmcm9tIGl0cyBzaWJsaW5ncywgc28gdGhhdCBhbW9uZyBpdHMgc2libGluZ3MsIG9ubHkgdGhlIGdpdmVuIGVsZW1lbnQgd2lsbCBoYXZlIHRoZSBjbGFzcy5cbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdGFrZUNsYXNzXG4gICAqXG4gICAqIEBwYXJhbSB7Tm9kZXxzdHJpbmd9IGVsdCB0aGUgZWxlbWVudCB0aGF0IHdpbGwgdGFrZSB0aGUgY2xhc3NcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNsYXp6IHRoZSBjbGFzcyB0byB0YWtlXG4gICAqL1xuICBmdW5jdGlvbiB0YWtlQ2xhc3NGb3JFbGVtZW50KGVsdCwgY2xhenopIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBmb3JFYWNoKGVsdC5wYXJlbnRFbGVtZW50LmNoaWxkcmVuLCBmdW5jdGlvbihjaGlsZCkge1xuICAgICAgcmVtb3ZlQ2xhc3NGcm9tRWxlbWVudChjaGlsZCwgY2xhenopXG4gICAgfSlcbiAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoZWx0KSwgY2xhenopXG4gIH1cblxuICAvKipcbiAgICogRmluZHMgdGhlIGNsb3Nlc3QgbWF0Y2hpbmcgZWxlbWVudCBpbiB0aGUgZ2l2ZW4gZWxlbWVudHMgcGFyZW50YWdlLCBpbmNsdXNpdmUgb2YgdGhlIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jY2xvc2VzdFxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR8c3RyaW5nfSBlbHQgdGhlIGVsZW1lbnQgdG8gZmluZCB0aGUgc2VsZWN0b3IgZnJvbVxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3IgdGhlIHNlbGVjdG9yIHRvIGZpbmRcbiAgICogQHJldHVybnMge0VsZW1lbnR8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGNsb3Nlc3QoZWx0LCBzZWxlY3Rvcikge1xuICAgIGVsdCA9IGFzRWxlbWVudChyZXNvbHZlVGFyZ2V0KGVsdCkpXG4gICAgaWYgKGVsdCAmJiBlbHQuY2xvc2VzdCkge1xuICAgICAgcmV0dXJuIGVsdC5jbG9zZXN0KHNlbGVjdG9yKVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBUT0RPIHJlbW92ZSB3aGVuIElFIGdvZXMgYXdheVxuICAgICAgZG8ge1xuICAgICAgICBpZiAoZWx0ID09IG51bGwgfHwgbWF0Y2hlcyhlbHQsIHNlbGVjdG9yKSkge1xuICAgICAgICAgIHJldHVybiBlbHRcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKGVsdCA9IGVsdCAmJiBhc0VsZW1lbnQocGFyZW50RWx0KGVsdCkpKVxuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc3RhcnRzV2l0aChzdHIsIHByZWZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKDAsIHByZWZpeC5sZW5ndGgpID09PSBwcmVmaXhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBzdWZmaXhcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHN1ZmZpeCkge1xuICAgIHJldHVybiBzdHIuc3Vic3RyaW5nKHN0ci5sZW5ndGggLSBzdWZmaXgubGVuZ3RoKSA9PT0gc3VmZml4XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHNlbGVjdG9yXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvcikge1xuICAgIGNvbnN0IHRyaW1tZWRTZWxlY3RvciA9IHNlbGVjdG9yLnRyaW0oKVxuICAgIGlmIChzdGFydHNXaXRoKHRyaW1tZWRTZWxlY3RvciwgJzwnKSAmJiBlbmRzV2l0aCh0cmltbWVkU2VsZWN0b3IsICcvPicpKSB7XG4gICAgICByZXR1cm4gdHJpbW1lZFNlbGVjdG9yLnN1YnN0cmluZygxLCB0cmltbWVkU2VsZWN0b3IubGVuZ3RoIC0gMilcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHRyaW1tZWRTZWxlY3RvclxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8RWxlbWVudHxEb2N1bWVudHxzdHJpbmd9IGVsdFxuICAgKiBAcGFyYW0ge3N0cmluZ30gc2VsZWN0b3JcbiAgICogQHBhcmFtIHtib29sZWFuPX0gZ2xvYmFsXG4gICAqIEByZXR1cm5zIHsoTm9kZXxXaW5kb3cpW119XG4gICAqL1xuICBmdW5jdGlvbiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3IsIGdsb2JhbCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChzZWxlY3Rvci5pbmRleE9mKCdjbG9zZXN0ICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW2Nsb3Nlc3QoYXNFbGVtZW50KGVsdCksIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig4KSkpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignZmluZCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtmaW5kKGFzUGFyZW50Tm9kZShlbHQpLCBub3JtYWxpemVTZWxlY3RvcihzZWxlY3Rvci5zdWJzdHIoNSkpKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnbmV4dCcpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkubmV4dEVsZW1lbnRTaWJsaW5nXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IuaW5kZXhPZignbmV4dCAnKSA9PT0gMCkge1xuICAgICAgcmV0dXJuIFtzY2FuRm9yd2FyZFF1ZXJ5KGVsdCwgbm9ybWFsaXplU2VsZWN0b3Ioc2VsZWN0b3Iuc3Vic3RyKDUpKSwgISFnbG9iYWwpXVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICdwcmV2aW91cycpIHtcbiAgICAgIHJldHVybiBbYXNFbGVtZW50KGVsdCkucHJldmlvdXNFbGVtZW50U2libGluZ11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yLmluZGV4T2YoJ3ByZXZpb3VzICcpID09PSAwKSB7XG4gICAgICByZXR1cm4gW3NjYW5CYWNrd2FyZHNRdWVyeShlbHQsIG5vcm1hbGl6ZVNlbGVjdG9yKHNlbGVjdG9yLnN1YnN0cig5KSksICEhZ2xvYmFsKV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnZG9jdW1lbnQnKSB7XG4gICAgICByZXR1cm4gW2RvY3VtZW50XVxuICAgIH0gZWxzZSBpZiAoc2VsZWN0b3IgPT09ICd3aW5kb3cnKSB7XG4gICAgICByZXR1cm4gW3dpbmRvd11cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAnYm9keScpIHtcbiAgICAgIHJldHVybiBbZG9jdW1lbnQuYm9keV1cbiAgICB9IGVsc2UgaWYgKHNlbGVjdG9yID09PSAncm9vdCcpIHtcbiAgICAgIHJldHVybiBbZ2V0Um9vdE5vZGUoZWx0LCAhIWdsb2JhbCldXG4gICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCdnbG9iYWwgJykgPT09IDApIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdCwgc2VsZWN0b3Iuc2xpY2UoNyksIHRydWUpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiB0b0FycmF5KGFzUGFyZW50Tm9kZShnZXRSb290Tm9kZShlbHQsICEhZ2xvYmFsKSkucXVlcnlTZWxlY3RvckFsbChub3JtYWxpemVTZWxlY3RvcihzZWxlY3RvcikpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHN0YXJ0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBtYXRjaFxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IGdsb2JhbFxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIHZhciBzY2FuRm9yd2FyZFF1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcmVzdWx0cy5sZW5ndGg7IGkrKykge1xuICAgICAgY29uc3QgZWx0ID0gcmVzdWx0c1tpXVxuICAgICAgaWYgKGVsdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihzdGFydCkgPT09IE5vZGUuRE9DVU1FTlRfUE9TSVRJT05fUFJFQ0VESU5HKSB7XG4gICAgICAgIHJldHVybiBlbHRcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBzdGFydFxuICAgKiBAcGFyYW0ge3N0cmluZ30gbWF0Y2hcbiAgICogQHBhcmFtIHtib29sZWFufSBnbG9iYWxcbiAgICogQHJldHVybnMge0VsZW1lbnR9XG4gICAqL1xuICB2YXIgc2NhbkJhY2t3YXJkc1F1ZXJ5ID0gZnVuY3Rpb24oc3RhcnQsIG1hdGNoLCBnbG9iYWwpIHtcbiAgICBjb25zdCByZXN1bHRzID0gYXNQYXJlbnROb2RlKGdldFJvb3ROb2RlKHN0YXJ0LCBnbG9iYWwpKS5xdWVyeVNlbGVjdG9yQWxsKG1hdGNoKVxuICAgIGZvciAobGV0IGkgPSByZXN1bHRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICBjb25zdCBlbHQgPSByZXN1bHRzW2ldXG4gICAgICBpZiAoZWx0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHN0YXJ0KSA9PT0gTm9kZS5ET0NVTUVOVF9QT1NJVElPTl9GT0xMT1dJTkcpIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV8c3RyaW5nfSBlbHRPclNlbGVjdG9yXG4gICAqIEBwYXJhbSB7c3RyaW5nPX0gc2VsZWN0b3JcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fVxuICAgKi9cbiAgZnVuY3Rpb24gcXVlcnlTZWxlY3RvckV4dChlbHRPclNlbGVjdG9yLCBzZWxlY3Rvcikge1xuICAgIGlmICh0eXBlb2YgZWx0T3JTZWxlY3RvciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yQWxsRXh0KGVsdE9yU2VsZWN0b3IsIHNlbGVjdG9yKVswXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gcXVlcnlTZWxlY3RvckFsbEV4dChnZXREb2N1bWVudCgpLmJvZHksIGVsdE9yU2VsZWN0b3IpWzBdXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0ZW1wbGF0ZSB7RXZlbnRUYXJnZXR9IFRcbiAgICogQHBhcmFtIHtUfHN0cmluZ30gZWx0T3JTZWxlY3RvclxuICAgKiBAcGFyYW0ge1R9IFtjb250ZXh0XVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxUfG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiByZXNvbHZlVGFyZ2V0KGVsdE9yU2VsZWN0b3IsIGNvbnRleHQpIHtcbiAgICBpZiAodHlwZW9mIGVsdE9yU2VsZWN0b3IgPT09ICdzdHJpbmcnKSB7XG4gICAgICByZXR1cm4gZmluZChhc1BhcmVudE5vZGUoY29udGV4dCkgfHwgZG9jdW1lbnQsIGVsdE9yU2VsZWN0b3IpXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBlbHRPclNlbGVjdG9yXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtrZXlvZiBIVE1MRWxlbWVudEV2ZW50TWFwfHN0cmluZ30gQW55RXZlbnROYW1lXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBFdmVudEFyZ3NcbiAgICogQHByb3BlcnR5IHtFdmVudFRhcmdldH0gdGFyZ2V0XG4gICAqIEBwcm9wZXJ0eSB7QW55RXZlbnROYW1lfSBldmVudFxuICAgKiBAcHJvcGVydHkge0V2ZW50TGlzdGVuZXJ9IGxpc3RlbmVyXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fEFueUV2ZW50TmFtZX0gYXJnMVxuICAgKiBAcGFyYW0ge0FueUV2ZW50TmFtZXxFdmVudExpc3RlbmVyfSBhcmcyXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdXG4gICAqIEByZXR1cm5zIHtFdmVudEFyZ3N9XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICBpZiAoaXNGdW5jdGlvbihhcmcyKSkge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiBnZXREb2N1bWVudCgpLmJvZHksXG4gICAgICAgIGV2ZW50OiBhc1N0cmluZyhhcmcxKSxcbiAgICAgICAgbGlzdGVuZXI6IGFyZzJcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHtcbiAgICAgICAgdGFyZ2V0OiByZXNvbHZlVGFyZ2V0KGFyZzEpLFxuICAgICAgICBldmVudDogYXNTdHJpbmcoYXJnMiksXG4gICAgICAgIGxpc3RlbmVyOiBhcmczXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEFkZHMgYW4gZXZlbnQgbGlzdGVuZXIgdG8gYW4gZWxlbWVudFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNvblxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byBhZGQgdGhlIGxpc3RlbmVyIHRvIHwgdGhlIGV2ZW50IG5hbWUgdG8gYWRkIHRoZSBsaXN0ZW5lciBmb3JcbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byBhZGQgdGhlIGxpc3RlbmVyIGZvciB8IHRoZSBsaXN0ZW5lciB0byBhZGRcbiAgICogQHBhcmFtIHtFdmVudExpc3RlbmVyfSBbYXJnM10gdGhlIGxpc3RlbmVyIHRvIGFkZFxuICAgKiBAcmV0dXJucyB7RXZlbnRMaXN0ZW5lcn1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZEV2ZW50TGlzdGVuZXJJbXBsKGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgICByZWFkeShmdW5jdGlvbigpIHtcbiAgICAgIGNvbnN0IGV2ZW50QXJncyA9IHByb2Nlc3NFdmVudEFyZ3MoYXJnMSwgYXJnMiwgYXJnMylcbiAgICAgIGV2ZW50QXJncy50YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudEFyZ3MuZXZlbnQsIGV2ZW50QXJncy5saXN0ZW5lcilcbiAgICB9KVxuICAgIGNvbnN0IGIgPSBpc0Z1bmN0aW9uKGFyZzIpXG4gICAgcmV0dXJuIGIgPyBhcmcyIDogYXJnM1xuICB9XG5cbiAgLyoqXG4gICAqIFJlbW92ZXMgYW4gZXZlbnQgbGlzdGVuZXIgZnJvbSBhbiBlbGVtZW50XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI29mZlxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gYXJnMSB0aGUgZWxlbWVudCB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb21cbiAgICogQHBhcmFtIHtzdHJpbmd8RXZlbnRMaXN0ZW5lcn0gYXJnMiB0aGUgZXZlbnQgbmFtZSB0byByZW1vdmUgdGhlIGxpc3RlbmVyIGZyb20gfCB0aGUgbGlzdGVuZXIgdG8gcmVtb3ZlXG4gICAqIEBwYXJhbSB7RXZlbnRMaXN0ZW5lcn0gW2FyZzNdIHRoZSBsaXN0ZW5lciB0byByZW1vdmVcbiAgICogQHJldHVybnMge0V2ZW50TGlzdGVuZXJ9XG4gICAqL1xuICBmdW5jdGlvbiByZW1vdmVFdmVudExpc3RlbmVySW1wbChhcmcxLCBhcmcyLCBhcmczKSB7XG4gICAgcmVhZHkoZnVuY3Rpb24oKSB7XG4gICAgICBjb25zdCBldmVudEFyZ3MgPSBwcm9jZXNzRXZlbnRBcmdzKGFyZzEsIGFyZzIsIGFyZzMpXG4gICAgICBldmVudEFyZ3MudGFyZ2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoZXZlbnRBcmdzLmV2ZW50LCBldmVudEFyZ3MubGlzdGVuZXIpXG4gICAgfSlcbiAgICByZXR1cm4gaXNGdW5jdGlvbihhcmcyKSA/IGFyZzIgOiBhcmczXG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBOb2RlIHByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICBjb25zdCBEVU1NWV9FTFQgPSBnZXREb2N1bWVudCgpLmNyZWF0ZUVsZW1lbnQoJ291dHB1dCcpIC8vIGR1bW15IGVsZW1lbnQgZm9yIGJhZCBzZWxlY3RvcnNcbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBhdHRyTmFtZVxuICAgKiBAcmV0dXJucyB7KE5vZGV8V2luZG93KVtdfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCBhdHRyTmFtZSkge1xuICAgIGNvbnN0IGF0dHJUYXJnZXQgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCBhdHRyTmFtZSlcbiAgICBpZiAoYXR0clRhcmdldCkge1xuICAgICAgaWYgKGF0dHJUYXJnZXQgPT09ICd0aGlzJykge1xuICAgICAgICByZXR1cm4gW2ZpbmRUaGlzRWxlbWVudChlbHQsIGF0dHJOYW1lKV1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHF1ZXJ5U2VsZWN0b3JBbGxFeHQoZWx0LCBhdHRyVGFyZ2V0KVxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgIGxvZ0Vycm9yKCdUaGUgc2VsZWN0b3IgXCInICsgYXR0clRhcmdldCArICdcIiBvbiAnICsgYXR0ck5hbWUgKyAnIHJldHVybmVkIG5vIG1hdGNoZXMhJylcbiAgICAgICAgICByZXR1cm4gW0RVTU1ZX0VMVF1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGF0dHJpYnV0ZVxuICAgKiBAcmV0dXJucyB7RWxlbWVudHxudWxsfVxuICAgKi9cbiAgZnVuY3Rpb24gZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cmlidXRlKSB7XG4gICAgcmV0dXJuIGFzRWxlbWVudChnZXRDbG9zZXN0TWF0Y2goZWx0LCBmdW5jdGlvbihlbHQpIHtcbiAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVWYWx1ZShhc0VsZW1lbnQoZWx0KSwgYXR0cmlidXRlKSAhPSBudWxsXG4gICAgfSkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGV8V2luZG93fG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUYXJnZXQoZWx0KSB7XG4gICAgY29uc3QgdGFyZ2V0U3RyID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXRhcmdldCcpXG4gICAgaWYgKHRhcmdldFN0cikge1xuICAgICAgaWYgKHRhcmdldFN0ciA9PT0gJ3RoaXMnKSB7XG4gICAgICAgIHJldHVybiBmaW5kVGhpc0VsZW1lbnQoZWx0LCAnaHgtdGFyZ2V0JylcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBxdWVyeVNlbGVjdG9yRXh0KGVsdCwgdGFyZ2V0U3RyKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBjb25zdCBkYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChkYXRhLmJvb3N0ZWQpIHtcbiAgICAgICAgcmV0dXJuIGdldERvY3VtZW50KCkuYm9keVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGVsdFxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHNob3VsZFNldHRsZUF0dHJpYnV0ZShuYW1lKSB7XG4gICAgY29uc3QgYXR0cmlidXRlc1RvU2V0dGxlID0gaHRteC5jb25maWcuYXR0cmlidXRlc1RvU2V0dGxlXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyaWJ1dGVzVG9TZXR0bGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChuYW1lID09PSBhdHRyaWJ1dGVzVG9TZXR0bGVbaV0pIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBtZXJnZVRvXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gbWVyZ2VGcm9tXG4gICAqL1xuICBmdW5jdGlvbiBjbG9uZUF0dHJpYnV0ZXMobWVyZ2VUbywgbWVyZ2VGcm9tKSB7XG4gICAgZm9yRWFjaChtZXJnZVRvLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmICghbWVyZ2VGcm9tLmhhc0F0dHJpYnV0ZShhdHRyLm5hbWUpICYmIHNob3VsZFNldHRsZUF0dHJpYnV0ZShhdHRyLm5hbWUpKSB7XG4gICAgICAgIG1lcmdlVG8ucmVtb3ZlQXR0cmlidXRlKGF0dHIubmFtZSlcbiAgICAgIH1cbiAgICB9KVxuICAgIGZvckVhY2gobWVyZ2VGcm9tLmF0dHJpYnV0ZXMsIGZ1bmN0aW9uKGF0dHIpIHtcbiAgICAgIGlmIChzaG91bGRTZXR0bGVBdHRyaWJ1dGUoYXR0ci5uYW1lKSkge1xuICAgICAgICBtZXJnZVRvLnNldEF0dHJpYnV0ZShhdHRyLm5hbWUsIGF0dHIudmFsdWUpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzSW5saW5lU3dhcChzd2FwU3R5bGUsIHRhcmdldCkge1xuICAgIGNvbnN0IGV4dGVuc2lvbnMgPSBnZXRFeHRlbnNpb25zKHRhcmdldClcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbaV1cbiAgICAgIHRyeSB7XG4gICAgICAgIGlmIChleHRlbnNpb24uaXNJbmxpbmVTd2FwKHN3YXBTdHlsZSkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgICB9XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBzd2FwU3R5bGUgPT09ICdvdXRlckhUTUwnXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IG9vYlZhbHVlXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gb29iRWxlbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqIEByZXR1cm5zXG4gICAqL1xuICBmdW5jdGlvbiBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgbGV0IHNlbGVjdG9yID0gJyMnICsgZ2V0UmF3QXR0cmlidXRlKG9vYkVsZW1lbnQsICdpZCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3R5bGUgKi9cbiAgICBsZXQgc3dhcFN0eWxlID0gJ291dGVySFRNTCdcbiAgICBpZiAob29iVmFsdWUgPT09ICd0cnVlJykge1xuICAgICAgLy8gZG8gbm90aGluZ1xuICAgIH0gZWxzZSBpZiAob29iVmFsdWUuaW5kZXhPZignOicpID4gMCkge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWUuc3Vic3RyKDAsIG9vYlZhbHVlLmluZGV4T2YoJzonKSlcbiAgICAgIHNlbGVjdG9yID0gb29iVmFsdWUuc3Vic3RyKG9vYlZhbHVlLmluZGV4T2YoJzonKSArIDEsIG9vYlZhbHVlLmxlbmd0aClcbiAgICB9IGVsc2Uge1xuICAgICAgc3dhcFN0eWxlID0gb29iVmFsdWVcbiAgICB9XG5cbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0RG9jdW1lbnQoKS5xdWVyeVNlbGVjdG9yQWxsKHNlbGVjdG9yKVxuICAgIGlmICh0YXJnZXRzKSB7XG4gICAgICBmb3JFYWNoKFxuICAgICAgICB0YXJnZXRzLFxuICAgICAgICBmdW5jdGlvbih0YXJnZXQpIHtcbiAgICAgICAgICBsZXQgZnJhZ21lbnRcbiAgICAgICAgICBjb25zdCBvb2JFbGVtZW50Q2xvbmUgPSBvb2JFbGVtZW50LmNsb25lTm9kZSh0cnVlKVxuICAgICAgICAgIGZyYWdtZW50ID0gZ2V0RG9jdW1lbnQoKS5jcmVhdGVEb2N1bWVudEZyYWdtZW50KClcbiAgICAgICAgICBmcmFnbWVudC5hcHBlbmRDaGlsZChvb2JFbGVtZW50Q2xvbmUpXG4gICAgICAgICAgaWYgKCFpc0lubGluZVN3YXAoc3dhcFN0eWxlLCB0YXJnZXQpKSB7XG4gICAgICAgICAgICBmcmFnbWVudCA9IGFzUGFyZW50Tm9kZShvb2JFbGVtZW50Q2xvbmUpIC8vIGlmIHRoaXMgaXMgbm90IGFuIGlubGluZSBzd2FwLCB3ZSB1c2UgdGhlIGNvbnRlbnQgb2YgdGhlIG5vZGUsIG5vdCB0aGUgbm9kZSBpdHNlbGZcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBjb25zdCBiZWZvcmVTd2FwRGV0YWlscyA9IHsgc2hvdWxkU3dhcDogdHJ1ZSwgdGFyZ2V0LCBmcmFnbWVudCB9XG4gICAgICAgICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpvb2JCZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgICAgICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICAgICAgICBpZiAoYmVmb3JlU3dhcERldGFpbHMuc2hvdWxkU3dhcCkge1xuICAgICAgICAgICAgc3dhcFdpdGhTdHlsZShzd2FwU3R5bGUsIHRhcmdldCwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgICB9XG4gICAgICAgICAgZm9yRWFjaChzZXR0bGVJbmZvLmVsdHMsIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6b29iQWZ0ZXJTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgKVxuICAgICAgb29iRWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG9vYkVsZW1lbnQpXG4gICAgfSBlbHNlIHtcbiAgICAgIG9vYkVsZW1lbnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChvb2JFbGVtZW50KVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpvb2JFcnJvck5vVGFyZ2V0JywgeyBjb250ZW50OiBvb2JFbGVtZW50IH0pXG4gICAgfVxuICAgIHJldHVybiBvb2JWYWx1ZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZVByZXNlcnZlZEVsZW1lbnRzKGZyYWdtZW50KSB7XG4gICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAnW2h4LXByZXNlcnZlXSwgW2RhdGEtaHgtcHJlc2VydmVdJyksIGZ1bmN0aW9uKHByZXNlcnZlZEVsdCkge1xuICAgICAgY29uc3QgaWQgPSBnZXRBdHRyaWJ1dGVWYWx1ZShwcmVzZXJ2ZWRFbHQsICdpZCcpXG4gICAgICBjb25zdCBvbGRFbHQgPSBnZXREb2N1bWVudCgpLmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgaWYgKG9sZEVsdCAhPSBudWxsKSB7XG4gICAgICAgIHByZXNlcnZlZEVsdC5wYXJlbnROb2RlLnJlcGxhY2VDaGlsZChvbGRFbHQsIHByZXNlcnZlZEVsdClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gcGFyZW50Tm9kZVxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBmb3JFYWNoKGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoJ1tpZF0nKSwgZnVuY3Rpb24obmV3Tm9kZSkge1xuICAgICAgY29uc3QgaWQgPSBnZXRSYXdBdHRyaWJ1dGUobmV3Tm9kZSwgJ2lkJylcbiAgICAgIGlmIChpZCAmJiBpZC5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IG5vcm1hbGl6ZWRJZCA9IGlkLnJlcGxhY2UoXCInXCIsIFwiXFxcXCdcIilcbiAgICAgICAgY29uc3Qgbm9ybWFsaXplZFRhZyA9IG5ld05vZGUudGFnTmFtZS5yZXBsYWNlKCc6JywgJ1xcXFw6JylcbiAgICAgICAgY29uc3QgcGFyZW50RWx0ID0gYXNQYXJlbnROb2RlKHBhcmVudE5vZGUpXG4gICAgICAgIGNvbnN0IG9sZE5vZGUgPSBwYXJlbnRFbHQgJiYgcGFyZW50RWx0LnF1ZXJ5U2VsZWN0b3Iobm9ybWFsaXplZFRhZyArIFwiW2lkPSdcIiArIG5vcm1hbGl6ZWRJZCArIFwiJ11cIilcbiAgICAgICAgaWYgKG9sZE5vZGUgJiYgb2xkTm9kZSAhPT0gcGFyZW50RWx0KSB7XG4gICAgICAgICAgY29uc3QgbmV3QXR0cmlidXRlcyA9IG5ld05vZGUuY2xvbmVOb2RlKClcbiAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgb2xkTm9kZSlcbiAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBjbG9uZUF0dHJpYnV0ZXMobmV3Tm9kZSwgbmV3QXR0cmlidXRlcylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IGNoaWxkXG4gICAqIEByZXR1cm5zIHtIdG14U2V0dGxlVGFza31cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VBamF4TG9hZFRhc2soY2hpbGQpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcHJvY2Vzc05vZGUoYXNFbGVtZW50KGNoaWxkKSlcbiAgICAgIHByb2Nlc3NGb2N1cyhhc1BhcmVudE5vZGUoY2hpbGQpKVxuICAgICAgdHJpZ2dlckV2ZW50KGNoaWxkLCAnaHRteDpsb2FkJylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBjaGlsZFxuICAgKi9cbiAgZnVuY3Rpb24gcHJvY2Vzc0ZvY3VzKGNoaWxkKSB7XG4gICAgY29uc3QgYXV0b2ZvY3VzID0gJ1thdXRvZm9jdXNdJ1xuICAgIGNvbnN0IGF1dG9Gb2N1c2VkRWx0ID0gYXNIdG1sRWxlbWVudChtYXRjaGVzKGNoaWxkLCBhdXRvZm9jdXMpID8gY2hpbGQgOiBjaGlsZC5xdWVyeVNlbGVjdG9yKGF1dG9mb2N1cykpXG4gICAgaWYgKGF1dG9Gb2N1c2VkRWx0ICE9IG51bGwpIHtcbiAgICAgIGF1dG9Gb2N1c2VkRWx0LmZvY3VzKClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBwYXJlbnROb2RlXG4gICAqIEBwYXJhbSB7Tm9kZX0gaW5zZXJ0QmVmb3JlXG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50Tm9kZSwgaW5zZXJ0QmVmb3JlLCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGhhbmRsZUF0dHJpYnV0ZXMocGFyZW50Tm9kZSwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgd2hpbGUgKGZyYWdtZW50LmNoaWxkTm9kZXMubGVuZ3RoID4gMCkge1xuICAgICAgY29uc3QgY2hpbGQgPSBmcmFnbWVudC5maXJzdENoaWxkXG4gICAgICBhZGRDbGFzc1RvRWxlbWVudChhc0VsZW1lbnQoY2hpbGQpLCBodG14LmNvbmZpZy5hZGRlZENsYXNzKVxuICAgICAgcGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoY2hpbGQsIGluc2VydEJlZm9yZSlcbiAgICAgIGlmIChjaGlsZC5ub2RlVHlwZSAhPT0gTm9kZS5URVhUX05PREUgJiYgY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuQ09NTUVOVF9OT0RFKSB7XG4gICAgICAgIHNldHRsZUluZm8udGFza3MucHVzaChtYWtlQWpheExvYWRUYXNrKGNoaWxkKSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogYmFzZWQgb24gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vaHlhbWFtb3RvL2ZkNDM1NTA1ZDI5ZWJmYTNkOTcxNmZkMmJlOGQ0MmYwLFxuICAgKiBkZXJpdmVkIGZyb20gSmF2YSdzIHN0cmluZyBoYXNoY29kZSBpbXBsZW1lbnRhdGlvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nXG4gICAqIEBwYXJhbSB7bnVtYmVyfSBoYXNoXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBzdHJpbmdIYXNoKHN0cmluZywgaGFzaCkge1xuICAgIGxldCBjaGFyID0gMFxuICAgIHdoaWxlIChjaGFyIDwgc3RyaW5nLmxlbmd0aCkge1xuICAgICAgaGFzaCA9IChoYXNoIDw8IDUpIC0gaGFzaCArIHN0cmluZy5jaGFyQ29kZUF0KGNoYXIrKykgfCAwIC8vIGJpdHdpc2Ugb3IgZW5zdXJlcyB3ZSBoYXZlIGEgMzItYml0IGludFxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtudW1iZXJ9XG4gICAqL1xuICBmdW5jdGlvbiBhdHRyaWJ1dGVIYXNoKGVsdCkge1xuICAgIGxldCBoYXNoID0gMFxuICAgIC8vIElFIGZpeFxuICAgIGlmIChlbHQuYXR0cmlidXRlcykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHQuYXR0cmlidXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBhdHRyaWJ1dGUgPSBlbHQuYXR0cmlidXRlc1tpXVxuICAgICAgICBpZiAoYXR0cmlidXRlLnZhbHVlKSB7IC8vIG9ubHkgaW5jbHVkZSBhdHRyaWJ1dGVzIHcvIGFjdHVhbCB2YWx1ZXMgKGVtcHR5IGlzIHNhbWUgYXMgbm9uLWV4aXN0ZW50KVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS5uYW1lLCBoYXNoKVxuICAgICAgICAgIGhhc2ggPSBzdHJpbmdIYXNoKGF0dHJpYnV0ZS52YWx1ZSwgaGFzaClcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gaGFzaFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0T25IYW5kbGVycyhlbHQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChpbnRlcm5hbERhdGEub25IYW5kbGVycykge1xuICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnRlcm5hbERhdGEub25IYW5kbGVycy5sZW5ndGg7IGkrKykge1xuICAgICAgICBjb25zdCBoYW5kbGVySW5mbyA9IGludGVybmFsRGF0YS5vbkhhbmRsZXJzW2ldXG4gICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGVsdCwgaGFuZGxlckluZm8uZXZlbnQsIGhhbmRsZXJJbmZvLmxpc3RlbmVyKVxuICAgICAgfVxuICAgICAgZGVsZXRlIGludGVybmFsRGF0YS5vbkhhbmRsZXJzXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gZGVJbml0Tm9kZShlbGVtZW50KSB7XG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsZW1lbnQpXG4gICAgaWYgKGludGVybmFsRGF0YS50aW1lb3V0KSB7XG4gICAgICBjbGVhclRpbWVvdXQoaW50ZXJuYWxEYXRhLnRpbWVvdXQpXG4gICAgfVxuICAgIGlmIChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcykge1xuICAgICAgZm9yRWFjaChpbnRlcm5hbERhdGEubGlzdGVuZXJJbmZvcywgZnVuY3Rpb24oaW5mbykge1xuICAgICAgICBpZiAoaW5mby5vbikge1xuICAgICAgICAgIHJlbW92ZUV2ZW50TGlzdGVuZXJJbXBsKGluZm8ub24sIGluZm8udHJpZ2dlciwgaW5mby5saXN0ZW5lcilcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICB9XG4gICAgZGVJbml0T25IYW5kbGVycyhlbGVtZW50KVxuICAgIGZvckVhY2goT2JqZWN0LmtleXMoaW50ZXJuYWxEYXRhKSwgZnVuY3Rpb24oa2V5KSB7IGRlbGV0ZSBpbnRlcm5hbERhdGFba2V5XSB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWxlbWVudFxuICAgKi9cbiAgZnVuY3Rpb24gY2xlYW5VcEVsZW1lbnQoZWxlbWVudCkge1xuICAgIHRyaWdnZXJFdmVudChlbGVtZW50LCAnaHRteDpiZWZvcmVDbGVhbnVwRWxlbWVudCcpXG4gICAgZGVJbml0Tm9kZShlbGVtZW50KVxuICAgIC8vIEB0cy1pZ25vcmUgSUUxMSBjb2RlXG4gICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgIGlmIChlbGVtZW50LmNoaWxkcmVuKSB7IC8vIElFXG4gICAgICAvLyBAdHMtaWdub3JlXG4gICAgICBmb3JFYWNoKGVsZW1lbnQuY2hpbGRyZW4sIGZ1bmN0aW9uKGNoaWxkKSB7IGNsZWFuVXBFbGVtZW50KGNoaWxkKSB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50ICYmIHRhcmdldC50YWdOYW1lID09PSAnQk9EWScpIHsgLy8gc3BlY2lhbCBjYXNlIHRoZSBib2R5IHRvIGlubmVySFRNTCBiZWNhdXNlIERvY3VtZW50RnJhZ21lbnRzIGNhbid0IGNvbnRhaW4gYSBib2R5IGVsdCB1bmZvcnR1bmF0ZWx5XG4gICAgICByZXR1cm4gc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIH1cbiAgICAvKiogQHR5cGUge05vZGV9ICovXG4gICAgbGV0IG5ld0VsdFxuICAgIGNvbnN0IGVsdEJlZm9yZU5ld0NvbnRlbnQgPSB0YXJnZXQucHJldmlvdXNTaWJsaW5nXG4gICAgaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgaWYgKGVsdEJlZm9yZU5ld0NvbnRlbnQgPT0gbnVsbCkge1xuICAgICAgbmV3RWx0ID0gcGFyZW50RWx0KHRhcmdldCkuZmlyc3RDaGlsZFxuICAgIH0gZWxzZSB7XG4gICAgICBuZXdFbHQgPSBlbHRCZWZvcmVOZXdDb250ZW50Lm5leHRTaWJsaW5nXG4gICAgfVxuICAgIHNldHRsZUluZm8uZWx0cyA9IHNldHRsZUluZm8uZWx0cy5maWx0ZXIoZnVuY3Rpb24oZSkgeyByZXR1cm4gZSAhPT0gdGFyZ2V0IH0pXG4gICAgLy8gc2NhbiB0aHJvdWdoIGFsbCBuZXdseSBhZGRlZCBjb250ZW50IGFuZCBhZGQgYWxsIGVsZW1lbnRzIHRvIHRoZSBzZXR0bGUgaW5mbyBzbyB3ZSB0cmlnZ2VyXG4gICAgLy8gZXZlbnRzIHByb3Blcmx5IG9uIHRoZW1cbiAgICB3aGlsZSAobmV3RWx0ICYmIG5ld0VsdCAhPT0gdGFyZ2V0KSB7XG4gICAgICBpZiAobmV3RWx0IGluc3RhbmNlb2YgRWxlbWVudCkge1xuICAgICAgICBzZXR0bGVJbmZvLmVsdHMucHVzaChuZXdFbHQpXG4gICAgICB9XG4gICAgICBuZXdFbHQgPSBuZXdFbHQubmV4dFNpYmxpbmdcbiAgICB9XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIGlmICh0YXJnZXQgaW5zdGFuY2VvZiBFbGVtZW50KSB7XG4gICAgICB0YXJnZXQucmVtb3ZlKClcbiAgICB9IGVsc2Uge1xuICAgICAgdGFyZ2V0LnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQodGFyZ2V0KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBBZnRlckJlZ2luKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUodGFyZ2V0LCB0YXJnZXQuZmlyc3RDaGlsZCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwQmVmb3JlQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZShwYXJlbnRFbHQodGFyZ2V0KSwgdGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge05vZGV9IHRhcmdldFxuICAgKiBAcGFyYW0ge1BhcmVudE5vZGV9IGZyYWdtZW50XG4gICAqIEBwYXJhbSB7SHRteFNldHRsZUluZm99IHNldHRsZUluZm9cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHJldHVybiBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIG51bGwsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gdGFyZ2V0XG4gICAqIEBwYXJhbSB7UGFyZW50Tm9kZX0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gc3dhcEFmdGVyRW5kKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICByZXR1cm4gaW5zZXJ0Tm9kZXNCZWZvcmUocGFyZW50RWx0KHRhcmdldCksIHRhcmdldC5uZXh0U2libGluZywgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICovXG4gIGZ1bmN0aW9uIHN3YXBEZWxldGUodGFyZ2V0KSB7XG4gICAgY2xlYW5VcEVsZW1lbnQodGFyZ2V0KVxuICAgIHJldHVybiBwYXJlbnRFbHQodGFyZ2V0KS5yZW1vdmVDaGlsZCh0YXJnZXQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwSW5uZXJIVE1MKHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHtcbiAgICBjb25zdCBmaXJzdENoaWxkID0gdGFyZ2V0LmZpcnN0Q2hpbGRcbiAgICBpbnNlcnROb2Rlc0JlZm9yZSh0YXJnZXQsIGZpcnN0Q2hpbGQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgIGlmIChmaXJzdENoaWxkKSB7XG4gICAgICB3aGlsZSAoZmlyc3RDaGlsZC5uZXh0U2libGluZykge1xuICAgICAgICBjbGVhblVwRWxlbWVudChmaXJzdENoaWxkLm5leHRTaWJsaW5nKVxuICAgICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZC5uZXh0U2libGluZylcbiAgICAgIH1cbiAgICAgIGNsZWFuVXBFbGVtZW50KGZpcnN0Q2hpbGQpXG4gICAgICB0YXJnZXQucmVtb3ZlQ2hpbGQoZmlyc3RDaGlsZClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14U3dhcFN0eWxlfSBzd2FwU3R5bGVcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtOb2RlfSB0YXJnZXRcbiAgICogQHBhcmFtIHtQYXJlbnROb2RlfSBmcmFnbWVudFxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVJbmZvfSBzZXR0bGVJbmZvXG4gICAqL1xuICBmdW5jdGlvbiBzd2FwV2l0aFN0eWxlKHN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKSB7XG4gICAgc3dpdGNoIChzd2FwU3R5bGUpIHtcbiAgICAgIGNhc2UgJ25vbmUnOlxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ291dGVySFRNTCc6XG4gICAgICAgIHN3YXBPdXRlckhUTUwodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmJlZ2luJzpcbiAgICAgICAgc3dhcEFmdGVyQmVnaW4odGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdiZWZvcmViZWdpbic6XG4gICAgICAgIHN3YXBCZWZvcmVCZWdpbih0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2JlZm9yZWVuZCc6XG4gICAgICAgIHN3YXBCZWZvcmVFbmQodGFyZ2V0LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgcmV0dXJuXG4gICAgICBjYXNlICdhZnRlcmVuZCc6XG4gICAgICAgIHN3YXBBZnRlckVuZCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICByZXR1cm5cbiAgICAgIGNhc2UgJ2RlbGV0ZSc6XG4gICAgICAgIHN3YXBEZWxldGUodGFyZ2V0KVxuICAgICAgICByZXR1cm5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHZhciBleHRlbnNpb25zID0gZ2V0RXh0ZW5zaW9ucyhlbHQpXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IGV4dCA9IGV4dGVuc2lvbnNbaV1cbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgbmV3RWxlbWVudHMgPSBleHQuaGFuZGxlU3dhcChzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgICAgICAgICBpZiAobmV3RWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkobmV3RWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgLy8gaWYgaGFuZGxlU3dhcCByZXR1cm5zIGFuIGFycmF5IChsaWtlKSBvZiBlbGVtZW50cywgd2UgaGFuZGxlIHRoZW1cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IG5ld0VsZW1lbnRzLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBjaGlsZCA9IG5ld0VsZW1lbnRzW2pdXG4gICAgICAgICAgICAgICAgICBpZiAoY2hpbGQubm9kZVR5cGUgIT09IE5vZGUuVEVYVF9OT0RFICYmIGNoaWxkLm5vZGVUeXBlICE9PSBOb2RlLkNPTU1FTlRfTk9ERSkge1xuICAgICAgICAgICAgICAgICAgICBzZXR0bGVJbmZvLnRhc2tzLnB1c2gobWFrZUFqYXhMb2FkVGFzayhjaGlsZCkpXG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKGUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChzd2FwU3R5bGUgPT09ICdpbm5lckhUTUwnKSB7XG4gICAgICAgICAgc3dhcElubmVySFRNTCh0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN3YXBXaXRoU3R5bGUoaHRteC5jb25maWcuZGVmYXVsdFN3YXBTdHlsZSwgZWx0LCB0YXJnZXQsIGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RG9jdW1lbnRGcmFnbWVudH0gZnJhZ21lbnRcbiAgICogQHBhcmFtIHtIdG14U2V0dGxlSW5mb30gc2V0dGxlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gZmluZEFuZFN3YXBPb2JFbGVtZW50cyhmcmFnbWVudCwgc2V0dGxlSW5mbykge1xuICAgIHZhciBvb2JFbHRzID0gZmluZEFsbChmcmFnbWVudCwgJ1toeC1zd2FwLW9vYl0sIFtkYXRhLWh4LXN3YXAtb29iXScpXG4gICAgZm9yRWFjaChvb2JFbHRzLCBmdW5jdGlvbihvb2JFbGVtZW50KSB7XG4gICAgICBpZiAoaHRteC5jb25maWcuYWxsb3dOZXN0ZWRPb2JTd2FwcyB8fCBvb2JFbGVtZW50LnBhcmVudEVsZW1lbnQgPT09IG51bGwpIHtcbiAgICAgICAgY29uc3Qgb29iVmFsdWUgPSBnZXRBdHRyaWJ1dGVWYWx1ZShvb2JFbGVtZW50LCAnaHgtc3dhcC1vb2InKVxuICAgICAgICBpZiAob29iVmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgIG9vYlN3YXAob29iVmFsdWUsIG9vYkVsZW1lbnQsIHNldHRsZUluZm8pXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdoeC1zd2FwLW9vYicpXG4gICAgICAgIG9vYkVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkYXRhLWh4LXN3YXAtb29iJylcbiAgICAgIH1cbiAgICB9KVxuICAgIHJldHVybiBvb2JFbHRzLmxlbmd0aCA+IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBJbXBsZW1lbnRzIGNvbXBsZXRlIHN3YXBwaW5nIHBpcGVsaW5lLCBpbmNsdWRpbmc6IGZvY3VzIGFuZCBzZWxlY3Rpb24gcHJlc2VydmF0aW9uLFxuICAgKiB0aXRsZSB1cGRhdGVzLCBzY3JvbGwsIE9PQiBzd2FwcGluZywgbm9ybWFsIHN3YXBwaW5nIGFuZCBzZXR0bGluZ1xuICAgKiBAcGFyYW0ge3N0cmluZ3xFbGVtZW50fSB0YXJnZXRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGNvbnRlbnRcbiAgICogQHBhcmFtIHtIdG14U3dhcFNwZWNpZmljYXRpb259IHN3YXBTcGVjXG4gICAqIEBwYXJhbSB7U3dhcE9wdGlvbnN9IFtzd2FwT3B0aW9uc11cbiAgICovXG4gIGZ1bmN0aW9uIHN3YXAodGFyZ2V0LCBjb250ZW50LCBzd2FwU3BlYywgc3dhcE9wdGlvbnMpIHtcbiAgICBpZiAoIXN3YXBPcHRpb25zKSB7XG4gICAgICBzd2FwT3B0aW9ucyA9IHt9XG4gICAgfVxuXG4gICAgdGFyZ2V0ID0gcmVzb2x2ZVRhcmdldCh0YXJnZXQpXG5cbiAgICAvLyBwcmVzZXJ2ZSBmb2N1cyBhbmQgc2VsZWN0aW9uXG4gICAgY29uc3QgYWN0aXZlRWx0ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudFxuICAgIGxldCBzZWxlY3Rpb25JbmZvID0ge31cbiAgICB0cnkge1xuICAgICAgc2VsZWN0aW9uSW5mbyA9IHtcbiAgICAgICAgZWx0OiBhY3RpdmVFbHQsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgc3RhcnQ6IGFjdGl2ZUVsdCA/IGFjdGl2ZUVsdC5zZWxlY3Rpb25TdGFydCA6IG51bGwsXG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgZW5kOiBhY3RpdmVFbHQgPyBhY3RpdmVFbHQuc2VsZWN0aW9uRW5kIDogbnVsbFxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIHNhZmFyaSBpc3N1ZSAtIHNlZSBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L3BsYXl3cmlnaHQvaXNzdWVzLzU4OTRcbiAgICB9XG4gICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKHRhcmdldClcblxuICAgIC8vIEZvciB0ZXh0IGNvbnRlbnQgc3dhcHMsIGRvbid0IHBhcnNlIHRoZSByZXNwb25zZSBhcyBIVE1MLCBqdXN0IGluc2VydCBpdFxuICAgIGlmIChzd2FwU3BlYy5zd2FwU3R5bGUgPT09ICd0ZXh0Q29udGVudCcpIHtcbiAgICAgIHRhcmdldC50ZXh0Q29udGVudCA9IGNvbnRlbnRcbiAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGZyYWdtZW50IGFuZCBwcm9jZXNzIGl0XG4gICAgfSBlbHNlIHtcbiAgICAgIGxldCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjb250ZW50KVxuXG4gICAgICBzZXR0bGVJbmZvLnRpdGxlID0gZnJhZ21lbnQudGl0bGVcblxuICAgICAgLy8gc2VsZWN0LW9vYiBzd2Fwc1xuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdE9PQikge1xuICAgICAgICBjb25zdCBvb2JTZWxlY3RWYWx1ZXMgPSBzd2FwT3B0aW9ucy5zZWxlY3RPT0Iuc3BsaXQoJywnKVxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9vYlNlbGVjdFZhbHVlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IG9vYlNlbGVjdFZhbHVlID0gb29iU2VsZWN0VmFsdWVzW2ldLnNwbGl0KCc6JywgMilcbiAgICAgICAgICBsZXQgaWQgPSBvb2JTZWxlY3RWYWx1ZVswXS50cmltKClcbiAgICAgICAgICBpZiAoaWQuaW5kZXhPZignIycpID09PSAwKSB7XG4gICAgICAgICAgICBpZCA9IGlkLnN1YnN0cmluZygxKVxuICAgICAgICAgIH1cbiAgICAgICAgICBjb25zdCBvb2JWYWx1ZSA9IG9vYlNlbGVjdFZhbHVlWzFdIHx8ICd0cnVlJ1xuICAgICAgICAgIGNvbnN0IG9vYkVsZW1lbnQgPSBmcmFnbWVudC5xdWVyeVNlbGVjdG9yKCcjJyArIGlkKVxuICAgICAgICAgIGlmIChvb2JFbGVtZW50KSB7XG4gICAgICAgICAgICBvb2JTd2FwKG9vYlZhbHVlLCBvb2JFbGVtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgLy8gb29iIHN3YXBzXG4gICAgICBmaW5kQW5kU3dhcE9vYkVsZW1lbnRzKGZyYWdtZW50LCBzZXR0bGVJbmZvKVxuICAgICAgZm9yRWFjaChmaW5kQWxsKGZyYWdtZW50LCAndGVtcGxhdGUnKSwgLyoqIEBwYXJhbSB7SFRNTFRlbXBsYXRlRWxlbWVudH0gdGVtcGxhdGUgKi9mdW5jdGlvbih0ZW1wbGF0ZSkge1xuICAgICAgICBpZiAoZmluZEFuZFN3YXBPb2JFbGVtZW50cyh0ZW1wbGF0ZS5jb250ZW50LCBzZXR0bGVJbmZvKSkge1xuICAgICAgICAgIC8vIEF2b2lkIHBvbGx1dGluZyB0aGUgRE9NIHdpdGggZW1wdHkgdGVtcGxhdGVzIHRoYXQgd2VyZSBvbmx5IHVzZWQgdG8gZW5jYXBzdWxhdGUgb29iIHN3YXBcbiAgICAgICAgICB0ZW1wbGF0ZS5yZW1vdmUoKVxuICAgICAgICB9XG4gICAgICB9KVxuXG4gICAgICAvLyBub3JtYWwgc3dhcFxuICAgICAgaWYgKHN3YXBPcHRpb25zLnNlbGVjdCkge1xuICAgICAgICBjb25zdCBuZXdGcmFnbWVudCA9IGdldERvY3VtZW50KCkuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpXG4gICAgICAgIGZvckVhY2goZnJhZ21lbnQucXVlcnlTZWxlY3RvckFsbChzd2FwT3B0aW9ucy5zZWxlY3QpLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICAgICAgbmV3RnJhZ21lbnQuYXBwZW5kQ2hpbGQobm9kZSlcbiAgICAgICAgfSlcbiAgICAgICAgZnJhZ21lbnQgPSBuZXdGcmFnbWVudFxuICAgICAgfVxuICAgICAgaGFuZGxlUHJlc2VydmVkRWxlbWVudHMoZnJhZ21lbnQpXG4gICAgICBzd2FwV2l0aFN0eWxlKHN3YXBTcGVjLnN3YXBTdHlsZSwgc3dhcE9wdGlvbnMuY29udGV4dEVsZW1lbnQsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgc2F2ZWQgZm9jdXMgYW5kIHNlbGVjdGlvbiBpbmZvcm1hdGlvbiB0byBzd2FwcGVkIGNvbnRlbnRcbiAgICBpZiAoc2VsZWN0aW9uSW5mby5lbHQgJiZcbiAgICAgICFib2R5Q29udGFpbnMoc2VsZWN0aW9uSW5mby5lbHQpICYmXG4gICAgICBnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKSB7XG4gICAgICBjb25zdCBuZXdBY3RpdmVFbHQgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChnZXRSYXdBdHRyaWJ1dGUoc2VsZWN0aW9uSW5mby5lbHQsICdpZCcpKVxuICAgICAgY29uc3QgZm9jdXNPcHRpb25zID0geyBwcmV2ZW50U2Nyb2xsOiBzd2FwU3BlYy5mb2N1c1Njcm9sbCAhPT0gdW5kZWZpbmVkID8gIXN3YXBTcGVjLmZvY3VzU2Nyb2xsIDogIWh0bXguY29uZmlnLmRlZmF1bHRGb2N1c1Njcm9sbCB9XG4gICAgICBpZiAobmV3QWN0aXZlRWx0KSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgaWYgKHNlbGVjdGlvbkluZm8uc3RhcnQgJiYgbmV3QWN0aXZlRWx0LnNldFNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgICAgIG5ld0FjdGl2ZUVsdC5zZXRTZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25JbmZvLnN0YXJ0LCBzZWxlY3Rpb25JbmZvLmVuZClcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyB0aGUgc2V0U2VsZWN0aW9uUmFuZ2UgbWV0aG9kIGlzIHByZXNlbnQgb24gZmllbGRzIHRoYXQgZG9uJ3Qgc3VwcG9ydCBpdCwgc28ganVzdCBsZXQgdGhpcyBmYWlsXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG5ld0FjdGl2ZUVsdC5mb2N1cyhmb2N1c09wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuXG4gICAgdGFyZ2V0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc3dhcHBpbmdDbGFzcylcbiAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICBpZiAoZWx0LmNsYXNzTGlzdCkge1xuICAgICAgICBlbHQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zZXR0bGluZ0NsYXNzKVxuICAgICAgfVxuICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJTd2FwJywgc3dhcE9wdGlvbnMuZXZlbnRJbmZvKVxuICAgIH0pXG4gICAgaWYgKHN3YXBPcHRpb25zLmFmdGVyU3dhcENhbGxiYWNrKSB7XG4gICAgICBzd2FwT3B0aW9ucy5hZnRlclN3YXBDYWxsYmFjaygpXG4gICAgfVxuXG4gICAgLy8gbWVyZ2UgaW4gbmV3IHRpdGxlIGFmdGVyIHN3YXAgYnV0IGJlZm9yZSBzZXR0bGVcbiAgICBpZiAoIXN3YXBTcGVjLmlnbm9yZVRpdGxlKSB7XG4gICAgICBoYW5kbGVUaXRsZShzZXR0bGVJbmZvLnRpdGxlKVxuICAgIH1cblxuICAgIC8vIHNldHRsZVxuICAgIGNvbnN0IGRvU2V0dGxlID0gZnVuY3Rpb24oKSB7XG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8udGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgICAgdGFzay5jYWxsKClcbiAgICAgIH0pXG4gICAgICBmb3JFYWNoKHNldHRsZUluZm8uZWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgIGlmIChlbHQuY2xhc3NMaXN0KSB7XG4gICAgICAgICAgZWx0LmNsYXNzTGlzdC5yZW1vdmUoaHRteC5jb25maWcuc2V0dGxpbmdDbGFzcylcbiAgICAgICAgfVxuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDphZnRlclNldHRsZScsIHN3YXBPcHRpb25zLmV2ZW50SW5mbylcbiAgICAgIH0pXG5cbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hbmNob3IpIHtcbiAgICAgICAgY29uc3QgYW5jaG9yVGFyZ2V0ID0gYXNFbGVtZW50KHJlc29sdmVUYXJnZXQoJyMnICsgc3dhcE9wdGlvbnMuYW5jaG9yKSlcbiAgICAgICAgaWYgKGFuY2hvclRhcmdldCkge1xuICAgICAgICAgIGFuY2hvclRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogJ2F1dG8nIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgdXBkYXRlU2Nyb2xsU3RhdGUoc2V0dGxlSW5mby5lbHRzLCBzd2FwU3BlYylcbiAgICAgIGlmIChzd2FwT3B0aW9ucy5hZnRlclNldHRsZUNhbGxiYWNrKSB7XG4gICAgICAgIHN3YXBPcHRpb25zLmFmdGVyU2V0dGxlQ2FsbGJhY2soKVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzd2FwU3BlYy5zZXR0bGVEZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQoZG9TZXR0bGUsIHN3YXBTcGVjLnNldHRsZURlbGF5KVxuICAgIH0gZWxzZSB7XG4gICAgICBkb1NldHRsZSgpXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge3N0cmluZ30gaGVhZGVyXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsIGhlYWRlciwgZWx0KSB7XG4gICAgY29uc3QgdHJpZ2dlckJvZHkgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoaGVhZGVyKVxuICAgIGlmICh0cmlnZ2VyQm9keS5pbmRleE9mKCd7JykgPT09IDApIHtcbiAgICAgIGNvbnN0IHRyaWdnZXJzID0gcGFyc2VKU09OKHRyaWdnZXJCb2R5KVxuICAgICAgZm9yIChjb25zdCBldmVudE5hbWUgaW4gdHJpZ2dlcnMpIHtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmhhc093blByb3BlcnR5KGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBsZXQgZGV0YWlsID0gdHJpZ2dlcnNbZXZlbnROYW1lXVxuICAgICAgICAgIGlmIChpc1Jhd09iamVjdChkZXRhaWwpKSB7XG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBlbHQgPSBkZXRhaWwudGFyZ2V0ICE9PSB1bmRlZmluZWQgPyBkZXRhaWwudGFyZ2V0IDogZWx0XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbCA9IHsgdmFsdWU6IGRldGFpbCB9XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGNvbnN0IGV2ZW50TmFtZXMgPSB0cmlnZ2VyQm9keS5zcGxpdCgnLCcpXG4gICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGV2ZW50TmFtZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lc1tpXS50cmltKCksIFtdKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGNvbnN0IFdISVRFU1BBQ0UgPSAvXFxzL1xuICBjb25zdCBXSElURVNQQUNFX09SX0NPTU1BID0gL1tcXHMsXS9cbiAgY29uc3QgU1lNQk9MX1NUQVJUID0gL1tfJGEtekEtWl0vXG4gIGNvbnN0IFNZTUJPTF9DT05UID0gL1tfJGEtekEtWjAtOV0vXG4gIGNvbnN0IFNUUklOR0lTSF9TVEFSVCA9IFsnXCInLCBcIidcIiwgJy8nXVxuICBjb25zdCBOT1RfV0hJVEVTUEFDRSA9IC9bXlxcc10vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX1NUQVJUID0gL1t7KF0vXG4gIGNvbnN0IENPTUJJTkVEX1NFTEVDVE9SX0VORCA9IC9bfSldL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gc3RyXG4gICAqIEByZXR1cm5zIHtzdHJpbmdbXX1cbiAgICovXG4gIGZ1bmN0aW9uIHRva2VuaXplU3RyaW5nKHN0cikge1xuICAgIC8qKiBAdHlwZSBzdHJpbmdbXSAqL1xuICAgIGNvbnN0IHRva2VucyA9IFtdXG4gICAgbGV0IHBvc2l0aW9uID0gMFxuICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGgpIHtcbiAgICAgIGlmIChTWU1CT0xfU1RBUlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uKSkpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICB3aGlsZSAoU1lNQk9MX0NPTlQuZXhlYyhzdHIuY2hhckF0KHBvc2l0aW9uICsgMSkpKSB7XG4gICAgICAgICAgcG9zaXRpb24rK1xuICAgICAgICB9XG4gICAgICAgIHRva2Vucy5wdXNoKHN0ci5zdWJzdHIoc3RhcnRQb3NpdGlvbiwgcG9zaXRpb24gLSBzdGFydFBvc2l0aW9uICsgMSkpXG4gICAgICB9IGVsc2UgaWYgKFNUUklOR0lTSF9TVEFSVC5pbmRleE9mKHN0ci5jaGFyQXQocG9zaXRpb24pKSAhPT0gLTEpIHtcbiAgICAgICAgY29uc3Qgc3RhcnRDaGFyID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdmFyIHN0YXJ0UG9zaXRpb24gPSBwb3NpdGlvblxuICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgIHdoaWxlIChwb3NpdGlvbiA8IHN0ci5sZW5ndGggJiYgc3RyLmNoYXJBdChwb3NpdGlvbikgIT09IHN0YXJ0Q2hhcikge1xuICAgICAgICAgIGlmIChzdHIuY2hhckF0KHBvc2l0aW9uKSA9PT0gJ1xcXFwnKSB7XG4gICAgICAgICAgICBwb3NpdGlvbisrXG4gICAgICAgICAgfVxuICAgICAgICAgIHBvc2l0aW9uKytcbiAgICAgICAgfVxuICAgICAgICB0b2tlbnMucHVzaChzdHIuc3Vic3RyKHN0YXJ0UG9zaXRpb24sIHBvc2l0aW9uIC0gc3RhcnRQb3NpdGlvbiArIDEpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc3ltYm9sID0gc3RyLmNoYXJBdChwb3NpdGlvbilcbiAgICAgICAgdG9rZW5zLnB1c2goc3ltYm9sKVxuICAgICAgfVxuICAgICAgcG9zaXRpb24rK1xuICAgIH1cbiAgICByZXR1cm4gdG9rZW5zXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHRva2VuXG4gICAqIEBwYXJhbSB7c3RyaW5nfG51bGx9IGxhc3RcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhcmFtTmFtZVxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzUG9zc2libGVSZWxhdGl2ZVJlZmVyZW5jZSh0b2tlbiwgbGFzdCwgcGFyYW1OYW1lKSB7XG4gICAgcmV0dXJuIFNZTUJPTF9TVEFSVC5leGVjKHRva2VuLmNoYXJBdCgwKSkgJiZcbiAgICAgIHRva2VuICE9PSAndHJ1ZScgJiZcbiAgICAgIHRva2VuICE9PSAnZmFsc2UnICYmXG4gICAgICB0b2tlbiAhPT0gJ3RoaXMnICYmXG4gICAgICB0b2tlbiAhPT0gcGFyYW1OYW1lICYmXG4gICAgICBsYXN0ICE9PSAnLidcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nW119IHRva2Vuc1xuICAgKiBAcGFyYW0ge3N0cmluZ30gcGFyYW1OYW1lXG4gICAqIEByZXR1cm5zIHtDb25kaXRpb25hbEZ1bmN0aW9ufG51bGx9XG4gICAqL1xuICBmdW5jdGlvbiBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsIHBhcmFtTmFtZSkge1xuICAgIGlmICh0b2tlbnNbMF0gPT09ICdbJykge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIGxldCBicmFja2V0Q291bnQgPSAxXG4gICAgICBsZXQgY29uZGl0aW9uYWxTb3VyY2UgPSAnIHJldHVybiAoZnVuY3Rpb24oJyArIHBhcmFtTmFtZSArICcpeyByZXR1cm4gKCdcbiAgICAgIGxldCBsYXN0ID0gbnVsbFxuICAgICAgd2hpbGUgKHRva2Vucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIGNvbnN0IHRva2VuID0gdG9rZW5zWzBdXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHVuZGVyc3RhbmQgdGhlIHNoaWZ0IGNhbGwsIGFuZCB0aGlua3Mgd2UncmUgY29tcGFyaW5nIHRoZSBzYW1lIHZhbHVlIGhlcmUsIGkuZS4gJ1snIHZzICddJ1xuICAgICAgICBpZiAodG9rZW4gPT09ICddJykge1xuICAgICAgICAgIGJyYWNrZXRDb3VudC0tXG4gICAgICAgICAgaWYgKGJyYWNrZXRDb3VudCA9PT0gMCkge1xuICAgICAgICAgICAgaWYgKGxhc3QgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgPSBjb25kaXRpb25hbFNvdXJjZSArICd0cnVlJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgIGNvbmRpdGlvbmFsU291cmNlICs9ICcpfSknXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICBjb25zdCBjb25kaXRpb25GdW5jdGlvbiA9IG1heWJlRXZhbChlbHQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBGdW5jdGlvbihjb25kaXRpb25hbFNvdXJjZSkoKVxuICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRydWUgfSlcbiAgICAgICAgICAgICAgY29uZGl0aW9uRnVuY3Rpb24uc291cmNlID0gY29uZGl0aW9uYWxTb3VyY2VcbiAgICAgICAgICAgICAgcmV0dXJuIGNvbmRpdGlvbkZ1bmN0aW9uXG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6c3ludGF4OmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlOiBjb25kaXRpb25hbFNvdXJjZSB9KVxuICAgICAgICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ1snKSB7XG4gICAgICAgICAgYnJhY2tldENvdW50KytcbiAgICAgICAgfVxuICAgICAgICBpZiAoaXNQb3NzaWJsZVJlbGF0aXZlUmVmZXJlbmNlKHRva2VuLCBsYXN0LCBwYXJhbU5hbWUpKSB7XG4gICAgICAgICAgY29uZGl0aW9uYWxTb3VyY2UgKz0gJygoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgPyAoJyArIHBhcmFtTmFtZSArICcuJyArIHRva2VuICsgJykgOiAod2luZG93LicgKyB0b2tlbiArICcpKSdcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBjb25kaXRpb25hbFNvdXJjZSA9IGNvbmRpdGlvbmFsU291cmNlICsgdG9rZW5cbiAgICAgICAgfVxuICAgICAgICBsYXN0ID0gdG9rZW5zLnNoaWZ0KClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmdbXX0gdG9rZW5zXG4gICAqIEBwYXJhbSB7UmVnRXhwfSBtYXRjaFxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24gY29uc3VtZVVudGlsKHRva2VucywgbWF0Y2gpIHtcbiAgICBsZXQgcmVzdWx0ID0gJydcbiAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgIW1hdGNoLnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgcmVzdWx0ICs9IHRva2Vucy5zaGlmdCgpXG4gICAgfVxuICAgIHJldHVybiByZXN1bHRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ1tdfSB0b2tlbnNcbiAgICogQHJldHVybnMge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpIHtcbiAgICBsZXQgcmVzdWx0XG4gICAgaWYgKHRva2Vucy5sZW5ndGggPiAwICYmIENPTUJJTkVEX1NFTEVDVE9SX1NUQVJULnRlc3QodG9rZW5zWzBdKSkge1xuICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgIHJlc3VsdCA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIENPTUJJTkVEX1NFTEVDVE9SX0VORCkudHJpbSgpXG4gICAgICB0b2tlbnMuc2hpZnQoKVxuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0XG4gIH1cblxuICBjb25zdCBJTlBVVF9TRUxFQ1RPUiA9ICdpbnB1dCwgdGV4dGFyZWEsIHNlbGVjdCdcblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGxpY2l0VHJpZ2dlclxuICAgKiBAcGFyYW0ge09iamVjdH0gY2FjaGUgZm9yIHRyaWdnZXIgc3BlY3NcbiAgICogQHJldHVybnMge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gcGFyc2VBbmRDYWNoZVRyaWdnZXIoZWx0LCBleHBsaWNpdFRyaWdnZXIsIGNhY2hlKSB7XG4gICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdICovXG4gICAgY29uc3QgdHJpZ2dlclNwZWNzID0gW11cbiAgICBjb25zdCB0b2tlbnMgPSB0b2tlbml6ZVN0cmluZyhleHBsaWNpdFRyaWdnZXIpXG4gICAgZG8ge1xuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgICBjb25zdCBpbml0aWFsTGVuZ3RoID0gdG9rZW5zLmxlbmd0aFxuICAgICAgY29uc3QgdHJpZ2dlciA9IGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKVxuICAgICAgaWYgKHRyaWdnZXIgIT09ICcnKSB7XG4gICAgICAgIGlmICh0cmlnZ2VyID09PSAnZXZlcnknKSB7XG4gICAgICAgICAgLyoqIEB0eXBlIEh0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbiAqL1xuICAgICAgICAgIGNvbnN0IGV2ZXJ5ID0geyB0cmlnZ2VyOiAnZXZlcnknIH1cbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICBldmVyeS5wb2xsSW50ZXJ2YWwgPSBwYXJzZUludGVydmFsKGNvbnN1bWVVbnRpbCh0b2tlbnMsIC9bLFxcW1xcc10vKSlcbiAgICAgICAgICBjb25zdW1lVW50aWwodG9rZW5zLCBOT1RfV0hJVEVTUEFDRSlcbiAgICAgICAgICB2YXIgZXZlbnRGaWx0ZXIgPSBtYXliZUdlbmVyYXRlQ29uZGl0aW9uYWwoZWx0LCB0b2tlbnMsICdldmVudCcpXG4gICAgICAgICAgaWYgKGV2ZW50RmlsdGVyKSB7XG4gICAgICAgICAgICBldmVyeS5ldmVudEZpbHRlciA9IGV2ZW50RmlsdGVyXG4gICAgICAgICAgfVxuICAgICAgICAgIHRyaWdnZXJTcGVjcy5wdXNoKGV2ZXJ5KVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIC8qKiBAdHlwZSBIdG14VHJpZ2dlclNwZWNpZmljYXRpb24gKi9cbiAgICAgICAgICBjb25zdCB0cmlnZ2VyU3BlYyA9IHsgdHJpZ2dlciB9XG4gICAgICAgICAgdmFyIGV2ZW50RmlsdGVyID0gbWF5YmVHZW5lcmF0ZUNvbmRpdGlvbmFsKGVsdCwgdG9rZW5zLCAnZXZlbnQnKVxuICAgICAgICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgICAgICAgdHJpZ2dlclNwZWMuZXZlbnRGaWx0ZXIgPSBldmVudEZpbHRlclxuICAgICAgICAgIH1cbiAgICAgICAgICB3aGlsZSAodG9rZW5zLmxlbmd0aCA+IDAgJiYgdG9rZW5zWzBdICE9PSAnLCcpIHtcbiAgICAgICAgICAgIGNvbnN1bWVVbnRpbCh0b2tlbnMsIE5PVF9XSElURVNQQUNFKVxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgaWYgKHRva2VuID09PSAnY2hhbmdlZCcpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMuY2hhbmdlZCA9IHRydWVcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdvbmNlJykge1xuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5vbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ2NvbnN1bWUnKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmNvbnN1bWUgPSB0cnVlXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAnZGVsYXknICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLmRlbGF5ID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdmcm9tJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICBpZiAoQ09NQklORURfU0VMRUNUT1JfU1RBUlQudGVzdCh0b2tlbnNbMF0pKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZyb21fYXJnID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YXIgZnJvbV9hcmcgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgICAgIGlmIChmcm9tX2FyZyA9PT0gJ2Nsb3Nlc3QnIHx8IGZyb21fYXJnID09PSAnZmluZCcgfHwgZnJvbV9hcmcgPT09ICduZXh0JyB8fCBmcm9tX2FyZyA9PT0gJ3ByZXZpb3VzJykge1xuICAgICAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHNlbGVjdG9yID0gY29uc3VtZUNTU1NlbGVjdG9yKHRva2VucylcbiAgICAgICAgICAgICAgICAgIC8vIGBuZXh0YCBhbmQgYHByZXZpb3VzYCBhbGxvdyBhIHNlbGVjdG9yLWxlc3Mgc3ludGF4XG4gICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3IubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBmcm9tX2FyZyArPSAnICcgKyBzZWxlY3RvclxuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlYy5mcm9tID0gZnJvbV9hcmdcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICd0YXJnZXQnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRhcmdldCA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyb3R0bGUnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjLnRocm90dGxlID0gcGFyc2VJbnRlcnZhbChjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKSlcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodG9rZW4gPT09ICdxdWV1ZScgJiYgdG9rZW5zWzBdID09PSAnOicpIHtcbiAgICAgICAgICAgICAgdG9rZW5zLnNoaWZ0KClcbiAgICAgICAgICAgICAgdHJpZ2dlclNwZWMucXVldWUgPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIGlmICh0b2tlbiA9PT0gJ3Jvb3QnICYmIHRva2Vuc1swXSA9PT0gJzonKSB7XG4gICAgICAgICAgICAgIHRva2Vucy5zaGlmdCgpXG4gICAgICAgICAgICAgIHRyaWdnZXJTcGVjW3Rva2VuXSA9IGNvbnN1bWVDU1NTZWxlY3Rvcih0b2tlbnMpXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRva2VuID09PSAndGhyZXNob2xkJyAmJiB0b2tlbnNbMF0gPT09ICc6Jykge1xuICAgICAgICAgICAgICB0b2tlbnMuc2hpZnQoKVxuICAgICAgICAgICAgICB0cmlnZ2VyU3BlY1t0b2tlbl0gPSBjb25zdW1lVW50aWwodG9rZW5zLCBXSElURVNQQUNFX09SX0NPTU1BKVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICB0cmlnZ2VyU3BlY3MucHVzaCh0cmlnZ2VyU3BlYylcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRva2Vucy5sZW5ndGggPT09IGluaXRpYWxMZW5ndGgpIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzeW50YXg6ZXJyb3InLCB7IHRva2VuOiB0b2tlbnMuc2hpZnQoKSB9KVxuICAgICAgfVxuICAgICAgY29uc3VtZVVudGlsKHRva2VucywgTk9UX1dISVRFU1BBQ0UpXG4gICAgfSB3aGlsZSAodG9rZW5zWzBdID09PSAnLCcgJiYgdG9rZW5zLnNoaWZ0KCkpXG4gICAgaWYgKGNhY2hlKSB7XG4gICAgICBjYWNoZVtleHBsaWNpdFRyaWdnZXJdID0gdHJpZ2dlclNwZWNzXG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uW119XG4gICAqL1xuICBmdW5jdGlvbiBnZXRUcmlnZ2VyU3BlY3MoZWx0KSB7XG4gICAgY29uc3QgZXhwbGljaXRUcmlnZ2VyID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtdHJpZ2dlcicpXG4gICAgbGV0IHRyaWdnZXJTcGVjcyA9IFtdXG4gICAgaWYgKGV4cGxpY2l0VHJpZ2dlcikge1xuICAgICAgY29uc3QgY2FjaGUgPSBodG14LmNvbmZpZy50cmlnZ2VyU3BlY3NDYWNoZVxuICAgICAgdHJpZ2dlclNwZWNzID0gKGNhY2hlICYmIGNhY2hlW2V4cGxpY2l0VHJpZ2dlcl0pIHx8IHBhcnNlQW5kQ2FjaGVUcmlnZ2VyKGVsdCwgZXhwbGljaXRUcmlnZ2VyLCBjYWNoZSlcbiAgICB9XG5cbiAgICBpZiAodHJpZ2dlclNwZWNzLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiB0cmlnZ2VyU3BlY3NcbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnZm9ybScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ3N1Ym1pdCcgfV1cbiAgICB9IGVsc2UgaWYgKG1hdGNoZXMoZWx0LCAnaW5wdXRbdHlwZT1cImJ1dHRvblwiXSwgaW5wdXRbdHlwZT1cInN1Ym1pdFwiXScpKSB7XG4gICAgICByZXR1cm4gW3sgdHJpZ2dlcjogJ2NsaWNrJyB9XVxuICAgIH0gZWxzZSBpZiAobWF0Y2hlcyhlbHQsIElOUFVUX1NFTEVDVE9SKSkge1xuICAgICAgcmV0dXJuIFt7IHRyaWdnZXI6ICdjaGFuZ2UnIH1dXG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBbeyB0cmlnZ2VyOiAnY2xpY2snIH1dXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBjYW5jZWxQb2xsaW5nKGVsdCkge1xuICAgIGdldEludGVybmFsRGF0YShlbHQpLmNhbmNlbGxlZCA9IHRydWVcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSBzcGVjXG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzUG9sbGluZyhlbHQsIGhhbmRsZXIsIHNwZWMpIHtcbiAgICBjb25zdCBub2RlRGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgbm9kZURhdGEudGltZW91dCA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICBpZiAoYm9keUNvbnRhaW5zKGVsdCkgJiYgbm9kZURhdGEuY2FuY2VsbGVkICE9PSB0cnVlKSB7XG4gICAgICAgIGlmICghbWF5YmVGaWx0ZXJFdmVudChzcGVjLCBlbHQsIG1ha2VFdmVudCgnaHg6cG9sbDp0cmlnZ2VyJywge1xuICAgICAgICAgIHRyaWdnZXJTcGVjOiBzcGVjLFxuICAgICAgICAgIHRhcmdldDogZWx0XG4gICAgICAgIH0pKSkge1xuICAgICAgICAgIGhhbmRsZXIoZWx0KVxuICAgICAgICB9XG4gICAgICAgIHByb2Nlc3NQb2xsaW5nKGVsdCwgaGFuZGxlciwgc3BlYylcbiAgICAgIH1cbiAgICB9LCBzcGVjLnBvbGxJbnRlcnZhbClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0hUTUxBbmNob3JFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBpc0xvY2FsTGluayhlbHQpIHtcbiAgICByZXR1cm4gbG9jYXRpb24uaG9zdG5hbWUgPT09IGVsdC5ob3N0bmFtZSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKSAmJlxuICAgICAgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDBcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gZWx0SXNEaXNhYmxlZChlbHQpIHtcbiAgICByZXR1cm4gY2xvc2VzdChlbHQsIGh0bXguY29uZmlnLmRpc2FibGVTZWxlY3RvcilcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICovXG4gIGZ1bmN0aW9uIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpIHtcbiAgICBpZiAoKGVsdCBpbnN0YW5jZW9mIEhUTUxBbmNob3JFbGVtZW50ICYmIGlzTG9jYWxMaW5rKGVsdCkgJiYgKGVsdC50YXJnZXQgPT09ICcnIHx8IGVsdC50YXJnZXQgPT09ICdfc2VsZicpKSB8fCAoZWx0LnRhZ05hbWUgPT09ICdGT1JNJyAmJiBTdHJpbmcoZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ21ldGhvZCcpKS50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykpIHtcbiAgICAgIG5vZGVEYXRhLmJvb3N0ZWQgPSB0cnVlXG4gICAgICBsZXQgdmVyYiwgcGF0aFxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnQScpIHtcbiAgICAgICAgdmVyYiA9ICdnZXQnXG4gICAgICAgIHBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCByYXdBdHRyaWJ1dGUgPSBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnbWV0aG9kJylcbiAgICAgICAgdmVyYiA9IHJhd0F0dHJpYnV0ZSA/IHJhd0F0dHJpYnV0ZS50b0xvd2VyQ2FzZSgpIDogJ2dldCdcbiAgICAgICAgaWYgKHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICAgIH1cbiAgICAgICAgcGF0aCA9IGdldFJhd0F0dHJpYnV0ZShlbHQsICdhY3Rpb24nKVxuICAgICAgfVxuICAgICAgdHJpZ2dlclNwZWNzLmZvckVhY2goZnVuY3Rpb24odHJpZ2dlclNwZWMpIHtcbiAgICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGZ1bmN0aW9uKG5vZGUsIGV2dCkge1xuICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgIGlmIChlbHRJc0Rpc2FibGVkKGVsdCkpIHtcbiAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgIH1cbiAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICB9LCBub2RlRGF0YSwgdHJpZ2dlclNwZWMsIHRydWUpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkQ2FuY2VsKGV2dCwgbm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgaWYgKGV2dC50eXBlID09PSAnc3VibWl0JyB8fCBldnQudHlwZSA9PT0gJ2NsaWNrJykge1xuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICAgIGlmIChtYXRjaGVzKGVsdCwgJ2lucHV0W3R5cGU9XCJzdWJtaXRcIl0sIGJ1dHRvbicpICYmIGNsb3Nlc3QoZWx0LCAnZm9ybScpICE9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoZWx0IGluc3RhbmNlb2YgSFRNTEFuY2hvckVsZW1lbnQgJiYgZWx0LmhyZWYgJiZcbiAgICAgICAgKGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKSA9PT0gJyMnIHx8IGVsdC5nZXRBdHRyaWJ1dGUoJ2hyZWYnKS5pbmRleE9mKCcjJykgIT09IDApKSB7XG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR8TW91c2VFdmVudHxLZXlib2FyZEV2ZW50fFRvdWNoRXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpIHtcbiAgICByZXR1cm4gZ2V0SW50ZXJuYWxEYXRhKGVsdCkuYm9vc3RlZCAmJiBlbHQgaW5zdGFuY2VvZiBIVE1MQW5jaG9yRWxlbWVudCAmJiBldnQudHlwZSA9PT0gJ2NsaWNrJyAmJlxuICAgICAgLy8gQHRzLWlnbm9yZSB0aGlzIHdpbGwgcmVzb2x2ZSB0byB1bmRlZmluZWQgZm9yIGV2ZW50cyB0aGF0IGRvbid0IGRlZmluZSB0aG9zZSBwcm9wZXJ0aWVzLCB3aGljaCBpcyBmaW5lXG4gICAgICAoZXZ0LmN0cmxLZXkgfHwgZXZ0Lm1ldGFLZXkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7RXZlbnR9IGV2dFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgZXZ0KSB7XG4gICAgY29uc3QgZXZlbnRGaWx0ZXIgPSB0cmlnZ2VyU3BlYy5ldmVudEZpbHRlclxuICAgIGlmIChldmVudEZpbHRlcikge1xuICAgICAgdHJ5IHtcbiAgICAgICAgcmV0dXJuIGV2ZW50RmlsdGVyLmNhbGwoZWx0LCBldnQpICE9PSB0cnVlXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNvbnN0IHNvdXJjZSA9IGV2ZW50RmlsdGVyLnNvdXJjZVxuICAgICAgICB0cmlnZ2VyRXJyb3JFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmV2ZW50RmlsdGVyOmVycm9yJywgeyBlcnJvcjogZSwgc291cmNlIH0pXG4gICAgICAgIHJldHVybiB0cnVlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7VHJpZ2dlckhhbmRsZXJ9IGhhbmRsZXJcbiAgICogQHBhcmFtIHtIdG14Tm9kZUludGVybmFsRGF0YX0gbm9kZURhdGFcbiAgICogQHBhcmFtIHtIdG14VHJpZ2dlclNwZWNpZmljYXRpb259IHRyaWdnZXJTcGVjXG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gW2V4cGxpY2l0Q2FuY2VsXVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYywgZXhwbGljaXRDYW5jZWwpIHtcbiAgICBjb25zdCBlbGVtZW50RGF0YSA9IGdldEludGVybmFsRGF0YShlbHQpXG4gICAgLyoqIEB0eXBlIHsoTm9kZXxXaW5kb3cpW119ICovXG4gICAgbGV0IGVsdHNUb0xpc3Rlbk9uXG4gICAgaWYgKHRyaWdnZXJTcGVjLmZyb20pIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gcXVlcnlTZWxlY3RvckFsbEV4dChlbHQsIHRyaWdnZXJTcGVjLmZyb20pXG4gICAgfSBlbHNlIHtcbiAgICAgIGVsdHNUb0xpc3Rlbk9uID0gW2VsdF1cbiAgICB9XG4gICAgLy8gc3RvcmUgdGhlIGluaXRpYWwgdmFsdWVzIG9mIHRoZSBlbGVtZW50cywgc28gd2UgY2FuIHRlbGwgaWYgdGhleSBjaGFuZ2VcbiAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgZWx0c1RvTGlzdGVuT24uZm9yRWFjaChmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAgIGNvbnN0IGVsdFRvTGlzdGVuT25EYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdFRvTGlzdGVuT24pXG4gICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICBlbHRUb0xpc3Rlbk9uRGF0YS5sYXN0VmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICB9KVxuICAgIH1cbiAgICBmb3JFYWNoKGVsdHNUb0xpc3Rlbk9uLCBmdW5jdGlvbihlbHRUb0xpc3Rlbk9uKSB7XG4gICAgICAvKiogQHR5cGUgRXZlbnRMaXN0ZW5lciAqL1xuICAgICAgY29uc3QgZXZlbnRMaXN0ZW5lciA9IGZ1bmN0aW9uKGV2dCkge1xuICAgICAgICBpZiAoIWJvZHlDb250YWlucyhlbHQpKSB7XG4gICAgICAgICAgZWx0VG9MaXN0ZW5Pbi5yZW1vdmVFdmVudExpc3RlbmVyKHRyaWdnZXJTcGVjLnRyaWdnZXIsIGV2ZW50TGlzdGVuZXIpXG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGlnbm9yZUJvb3N0ZWRBbmNob3JDdHJsQ2xpY2soZWx0LCBldnQpKSB7XG4gICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGV4cGxpY2l0Q2FuY2VsIHx8IHNob3VsZENhbmNlbChldnQsIGVsdCkpIHtcbiAgICAgICAgICBldnQucHJldmVudERlZmF1bHQoKVxuICAgICAgICB9XG4gICAgICAgIGlmIChtYXliZUZpbHRlckV2ZW50KHRyaWdnZXJTcGVjLCBlbHQsIGV2dCkpIHtcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBldmVudERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZXZ0KVxuICAgICAgICBldmVudERhdGEudHJpZ2dlclNwZWMgPSB0cmlnZ2VyU3BlY1xuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IgPT0gbnVsbCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yID0gW11cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXZlbnREYXRhLmhhbmRsZWRGb3IuaW5kZXhPZihlbHQpIDwgMCkge1xuICAgICAgICAgIGV2ZW50RGF0YS5oYW5kbGVkRm9yLnB1c2goZWx0KVxuICAgICAgICAgIGlmICh0cmlnZ2VyU3BlYy5jb25zdW1lKSB7XG4gICAgICAgICAgICBldnQuc3RvcFByb3BhZ2F0aW9uKClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHRyaWdnZXJTcGVjLnRhcmdldCAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgICBpZiAoIW1hdGNoZXMoYXNFbGVtZW50KGV2dC50YXJnZXQpLCB0cmlnZ2VyU3BlYy50YXJnZXQpKSB7XG4gICAgICAgICAgICAgIHJldHVyblxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMub25jZSkge1xuICAgICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRyaWdnZXJlZE9uY2UpIHtcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50cmlnZ2VyZWRPbmNlID0gdHJ1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMuY2hhbmdlZCkge1xuICAgICAgICAgICAgY29uc3QgZWx0VG9MaXN0ZW5PbkRhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0VG9MaXN0ZW5PbilcbiAgICAgICAgICAgIC8vIEB0cy1pZ25vcmUgdmFsdWUgd2lsbCBiZSB1bmRlZmluZWQgZm9yIG5vbi1pbnB1dCBlbGVtZW50cywgd2hpY2ggaXMgZmluZVxuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBlbHRUb0xpc3Rlbk9uLnZhbHVlXG4gICAgICAgICAgICBpZiAoZWx0VG9MaXN0ZW5PbkRhdGEubGFzdFZhbHVlID09PSB2YWx1ZSkge1xuICAgICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsdFRvTGlzdGVuT25EYXRhLmxhc3RWYWx1ZSA9IHZhbHVlXG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChlbGVtZW50RGF0YS5kZWxheWVkKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudERhdGEuZGVsYXllZClcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAodHJpZ2dlclNwZWMudGhyb3R0bGUgPiAwKSB7XG4gICAgICAgICAgICBpZiAoIWVsZW1lbnREYXRhLnRocm90dGxlKSB7XG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OnRyaWdnZXInKVxuICAgICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgICAgICBlbGVtZW50RGF0YS50aHJvdHRsZSA9IGdldFdpbmRvdygpLnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudERhdGEudGhyb3R0bGUgPSBudWxsXG4gICAgICAgICAgICAgIH0sIHRyaWdnZXJTcGVjLnRocm90dGxlKVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMuZGVsYXkgPiAwKSB7XG4gICAgICAgICAgICBlbGVtZW50RGF0YS5kZWxheWVkID0gZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICAgIGhhbmRsZXIoZWx0LCBldnQpXG4gICAgICAgICAgICB9LCB0cmlnZ2VyU3BlYy5kZWxheSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6dHJpZ2dlcicpXG4gICAgICAgICAgICBoYW5kbGVyKGVsdCwgZXZ0KVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKG5vZGVEYXRhLmxpc3RlbmVySW5mb3MgPT0gbnVsbCkge1xuICAgICAgICBub2RlRGF0YS5saXN0ZW5lckluZm9zID0gW11cbiAgICAgIH1cbiAgICAgIG5vZGVEYXRhLmxpc3RlbmVySW5mb3MucHVzaCh7XG4gICAgICAgIHRyaWdnZXI6IHRyaWdnZXJTcGVjLnRyaWdnZXIsXG4gICAgICAgIGxpc3RlbmVyOiBldmVudExpc3RlbmVyLFxuICAgICAgICBvbjogZWx0VG9MaXN0ZW5PblxuICAgICAgfSlcbiAgICAgIGVsdFRvTGlzdGVuT24uYWRkRXZlbnRMaXN0ZW5lcih0cmlnZ2VyU3BlYy50cmlnZ2VyLCBldmVudExpc3RlbmVyKVxuICAgIH0pXG4gIH1cblxuICBsZXQgd2luZG93SXNTY3JvbGxpbmcgPSBmYWxzZSAvLyB1c2VkIGJ5IGluaXRTY3JvbGxIYW5kbGVyXG4gIGxldCBzY3JvbGxIYW5kbGVyID0gbnVsbFxuICBmdW5jdGlvbiBpbml0U2Nyb2xsSGFuZGxlcigpIHtcbiAgICBpZiAoIXNjcm9sbEhhbmRsZXIpIHtcbiAgICAgIHNjcm9sbEhhbmRsZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgd2luZG93SXNTY3JvbGxpbmcgPSB0cnVlXG4gICAgICB9XG4gICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcignc2Nyb2xsJywgc2Nyb2xsSGFuZGxlcilcbiAgICAgIHNldEludGVydmFsKGZ1bmN0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93SXNTY3JvbGxpbmcpIHtcbiAgICAgICAgICB3aW5kb3dJc1Njcm9sbGluZyA9IGZhbHNlXG4gICAgICAgICAgZm9yRWFjaChnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcio9J3JldmVhbGVkJ10sW2RhdGEtaHgtdHJpZ2dlcio9J3JldmVhbGVkJ11cIiksIGZ1bmN0aW9uKGVsdCkge1xuICAgICAgICAgICAgbWF5YmVSZXZlYWwoZWx0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH0sIDIwMClcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlUmV2ZWFsKGVsdCkge1xuICAgIGlmICghaGFzQXR0cmlidXRlKGVsdCwgJ2RhdGEtaHgtcmV2ZWFsZWQnKSAmJiBpc1Njcm9sbGVkSW50b1ZpZXcoZWx0KSkge1xuICAgICAgZWx0LnNldEF0dHJpYnV0ZSgnZGF0YS1oeC1yZXZlYWxlZCcsICd0cnVlJylcbiAgICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCkge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAncmV2ZWFsZWQnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gaWYgdGhlIG5vZGUgaXNuJ3QgaW5pdGlhbGl6ZWQsIHdhaXQgZm9yIGl0IGJlZm9yZSB0cmlnZ2VyaW5nIHRoZSByZXF1ZXN0XG4gICAgICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdodG14OmFmdGVyUHJvY2Vzc05vZGUnLCBmdW5jdGlvbigpIHsgdHJpZ2dlckV2ZW50KGVsdCwgJ3JldmVhbGVkJykgfSwgeyBvbmNlOiB0cnVlIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtUcmlnZ2VySGFuZGxlcn0gaGFuZGxlclxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge251bWJlcn0gZGVsYXlcbiAgICovXG4gIGZ1bmN0aW9uIGxvYWRJbW1lZGlhdGVseShlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCBkZWxheSkge1xuICAgIGNvbnN0IGxvYWQgPSBmdW5jdGlvbigpIHtcbiAgICAgIGlmICghbm9kZURhdGEubG9hZGVkKSB7XG4gICAgICAgIG5vZGVEYXRhLmxvYWRlZCA9IHRydWVcbiAgICAgICAgaGFuZGxlcihlbHQpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChkZWxheSA+IDApIHtcbiAgICAgIGdldFdpbmRvdygpLnNldFRpbWVvdXQobG9hZCwgZGVsYXkpXG4gICAgfSBlbHNlIHtcbiAgICAgIGxvYWQoKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge0h0bXhUcmlnZ2VyU3BlY2lmaWNhdGlvbltdfSB0cmlnZ2VyU3BlY3NcbiAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKSB7XG4gICAgbGV0IGV4cGxpY2l0QWN0aW9uID0gZmFsc2VcbiAgICBmb3JFYWNoKFZFUkJTLCBmdW5jdGlvbih2ZXJiKSB7XG4gICAgICBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LScgKyB2ZXJiKSkge1xuICAgICAgICBjb25zdCBwYXRoID0gZ2V0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtJyArIHZlcmIpXG4gICAgICAgIGV4cGxpY2l0QWN0aW9uID0gdHJ1ZVxuICAgICAgICBub2RlRGF0YS5wYXRoID0gcGF0aFxuICAgICAgICBub2RlRGF0YS52ZXJiID0gdmVyYlxuICAgICAgICB0cmlnZ2VyU3BlY3MuZm9yRWFjaChmdW5jdGlvbih0cmlnZ2VyU3BlYykge1xuICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbihub2RlLCBldnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgICAgICAgICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICAgICAgICAgIGNsZWFuVXBFbGVtZW50KGVsdClcbiAgICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZ0KVxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcbiAgICByZXR1cm4gZXhwbGljaXRBY3Rpb25cbiAgfVxuXG4gIC8qKlxuICAgKiBAY2FsbGJhY2sgVHJpZ2dlckhhbmRsZXJcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gW2V2dF1cbiAgICovXG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Tm9kZX0gZWx0XG4gICAqIEBwYXJhbSB7SHRteFRyaWdnZXJTcGVjaWZpY2F0aW9ufSB0cmlnZ2VyU3BlY1xuICAgKiBAcGFyYW0ge0h0bXhOb2RlSW50ZXJuYWxEYXRhfSBub2RlRGF0YVxuICAgKiBAcGFyYW0ge1RyaWdnZXJIYW5kbGVyfSBoYW5kbGVyXG4gICAqL1xuICBmdW5jdGlvbiBhZGRUcmlnZ2VySGFuZGxlcihlbHQsIHRyaWdnZXJTcGVjLCBub2RlRGF0YSwgaGFuZGxlcikge1xuICAgIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAncmV2ZWFsZWQnKSB7XG4gICAgICBpbml0U2Nyb2xsSGFuZGxlcigpXG4gICAgICBhZGRFdmVudExpc3RlbmVyKGVsdCwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgICAgbWF5YmVSZXZlYWwoYXNFbGVtZW50KGVsdCkpXG4gICAgfSBlbHNlIGlmICh0cmlnZ2VyU3BlYy50cmlnZ2VyID09PSAnaW50ZXJzZWN0Jykge1xuICAgICAgY29uc3Qgb2JzZXJ2ZXJPcHRpb25zID0ge31cbiAgICAgIGlmICh0cmlnZ2VyU3BlYy5yb290KSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy5yb290ID0gcXVlcnlTZWxlY3RvckV4dChlbHQsIHRyaWdnZXJTcGVjLnJvb3QpXG4gICAgICB9XG4gICAgICBpZiAodHJpZ2dlclNwZWMudGhyZXNob2xkKSB7XG4gICAgICAgIG9ic2VydmVyT3B0aW9ucy50aHJlc2hvbGQgPSBwYXJzZUZsb2F0KHRyaWdnZXJTcGVjLnRocmVzaG9sZClcbiAgICAgIH1cbiAgICAgIGNvbnN0IG9ic2VydmVyID0gbmV3IEludGVyc2VjdGlvbk9ic2VydmVyKGZ1bmN0aW9uKGVudHJpZXMpIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbnRyaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgY29uc3QgZW50cnkgPSBlbnRyaWVzW2ldXG4gICAgICAgICAgaWYgKGVudHJ5LmlzSW50ZXJzZWN0aW5nKSB7XG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaW50ZXJzZWN0JylcbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9LCBvYnNlcnZlck9wdGlvbnMpXG4gICAgICBvYnNlcnZlci5vYnNlcnZlKGFzRWxlbWVudChlbHQpKVxuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjKVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMudHJpZ2dlciA9PT0gJ2xvYWQnKSB7XG4gICAgICBpZiAoIW1heWJlRmlsdGVyRXZlbnQodHJpZ2dlclNwZWMsIGVsdCwgbWFrZUV2ZW50KCdsb2FkJywgeyBlbHQgfSkpKSB7XG4gICAgICAgIGxvYWRJbW1lZGlhdGVseShhc0VsZW1lbnQoZWx0KSwgaGFuZGxlciwgbm9kZURhdGEsIHRyaWdnZXJTcGVjLmRlbGF5KVxuICAgICAgfVxuICAgIH0gZWxzZSBpZiAodHJpZ2dlclNwZWMucG9sbEludGVydmFsID4gMCkge1xuICAgICAgbm9kZURhdGEucG9sbGluZyA9IHRydWVcbiAgICAgIHByb2Nlc3NQb2xsaW5nKGFzRWxlbWVudChlbHQpLCBoYW5kbGVyLCB0cmlnZ2VyU3BlYylcbiAgICB9IGVsc2Uge1xuICAgICAgYWRkRXZlbnRMaXN0ZW5lcihlbHQsIGhhbmRsZXIsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlYylcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBub2RlXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gc2hvdWxkUHJvY2Vzc0h4T24obm9kZSkge1xuICAgIGNvbnN0IGVsdCA9IGFzRWxlbWVudChub2RlKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gICAgY29uc3QgYXR0cmlidXRlcyA9IGVsdC5hdHRyaWJ1dGVzXG4gICAgZm9yIChsZXQgaiA9IDA7IGogPCBhdHRyaWJ1dGVzLmxlbmd0aDsgaisrKSB7XG4gICAgICBjb25zdCBhdHRyTmFtZSA9IGF0dHJpYnV0ZXNbal0ubmFtZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgoYXR0ck5hbWUsICdoeC1vbjonKSB8fCBzdGFydHNXaXRoKGF0dHJOYW1lLCAnZGF0YS1oeC1vbjonKSB8fFxuICAgICAgICBzdGFydHNXaXRoKGF0dHJOYW1lLCAnaHgtb24tJykgfHwgc3RhcnRzV2l0aChhdHRyTmFtZSwgJ2RhdGEtaHgtb24tJykpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtOb2RlfSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGNvbnN0IEhYX09OX1FVRVJZID0gbmV3IFhQYXRoRXZhbHVhdG9yKClcbiAgICAuY3JlYXRlRXhwcmVzc2lvbignLi8vKltAKlsgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uOlwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbjpcIikgb3InICtcbiAgICAgICcgc3RhcnRzLXdpdGgobmFtZSgpLCBcImh4LW9uLVwiKSBvciBzdGFydHMtd2l0aChuYW1lKCksIFwiZGF0YS1oeC1vbi1cIikgXV0nKVxuXG4gIGZ1bmN0aW9uIHByb2Nlc3NIWE9uUm9vdChlbHQsIGVsZW1lbnRzKSB7XG4gICAgaWYgKHNob3VsZFByb2Nlc3NIeE9uKGVsdCkpIHtcbiAgICAgIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KGVsdCkpXG4gICAgfVxuICAgIGNvbnN0IGl0ZXIgPSBIWF9PTl9RVUVSWS5ldmFsdWF0ZShlbHQpXG4gICAgbGV0IG5vZGUgPSBudWxsXG4gICAgd2hpbGUgKG5vZGUgPSBpdGVyLml0ZXJhdGVOZXh0KCkpIGVsZW1lbnRzLnB1c2goYXNFbGVtZW50KG5vZGUpKVxuICB9XG5cbiAgZnVuY3Rpb24gZmluZEh4T25XaWxkY2FyZEVsZW1lbnRzKGVsdCkge1xuICAgIC8qKiBAdHlwZSB7RWxlbWVudFtdfSAqL1xuICAgIGNvbnN0IGVsZW1lbnRzID0gW11cbiAgICBpZiAoZWx0IGluc3RhbmNlb2YgRG9jdW1lbnRGcmFnbWVudCkge1xuICAgICAgZm9yIChjb25zdCBjaGlsZCBvZiBlbHQuY2hpbGROb2Rlcykge1xuICAgICAgICBwcm9jZXNzSFhPblJvb3QoY2hpbGQsIGVsZW1lbnRzKVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwcm9jZXNzSFhPblJvb3QoZWx0LCBlbGVtZW50cylcbiAgICB9XG4gICAgcmV0dXJuIGVsZW1lbnRzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge05vZGVMaXN0T2Y8RWxlbWVudD58W119XG4gICAqL1xuICBmdW5jdGlvbiBmaW5kRWxlbWVudHNUb1Byb2Nlc3MoZWx0KSB7XG4gICAgaWYgKGVsdC5xdWVyeVNlbGVjdG9yQWxsKSB7XG4gICAgICBjb25zdCBib29zdGVkU2VsZWN0b3IgPSAnLCBbaHgtYm9vc3RdIGEsIFtkYXRhLWh4LWJvb3N0XSBhLCBhW2h4LWJvb3N0XSwgYVtkYXRhLWh4LWJvb3N0XSdcblxuICAgICAgY29uc3QgZXh0ZW5zaW9uU2VsZWN0b3JzID0gW11cbiAgICAgIGZvciAoY29uc3QgZSBpbiBleHRlbnNpb25zKSB7XG4gICAgICAgIGNvbnN0IGV4dGVuc2lvbiA9IGV4dGVuc2lvbnNbZV1cbiAgICAgICAgaWYgKGV4dGVuc2lvbi5nZXRTZWxlY3RvcnMpIHtcbiAgICAgICAgICB2YXIgc2VsZWN0b3JzID0gZXh0ZW5zaW9uLmdldFNlbGVjdG9ycygpXG4gICAgICAgICAgaWYgKHNlbGVjdG9ycykge1xuICAgICAgICAgICAgZXh0ZW5zaW9uU2VsZWN0b3JzLnB1c2goc2VsZWN0b3JzKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBjb25zdCByZXN1bHRzID0gZWx0LnF1ZXJ5U2VsZWN0b3JBbGwoVkVSQl9TRUxFQ1RPUiArIGJvb3N0ZWRTZWxlY3RvciArIFwiLCBmb3JtLCBbdHlwZT0nc3VibWl0J10sXCIgK1xuICAgICAgICAnIFtoeC1leHRdLCBbZGF0YS1oeC1leHRdLCBbaHgtdHJpZ2dlcl0sIFtkYXRhLWh4LXRyaWdnZXJdJyArIGV4dGVuc2lvblNlbGVjdG9ycy5mbGF0KCkubWFwKHMgPT4gJywgJyArIHMpLmpvaW4oJycpKVxuXG4gICAgICByZXR1cm4gcmVzdWx0c1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gW11cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogSGFuZGxlIHN1Ym1pdCBidXR0b25zL2lucHV0cyB0aGF0IGhhdmUgdGhlIGZvcm0gYXR0cmlidXRlIHNldFxuICAgKiBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlU2V0TGFzdEJ1dHRvbkNsaWNrZWQoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MQnV0dG9uRWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fSAqLyAoY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKSlcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IGVsdFxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50fSBldnRcbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlVW5zZXRMYXN0QnV0dG9uQ2xpY2tlZChldnQpIHtcbiAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KVxuICAgIGlmIChpbnRlcm5hbERhdGEpIHtcbiAgICAgIGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCA9IG51bGxcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFdmVudH0gZXZ0XG4gICAqIEByZXR1cm5zIHtIdG14Tm9kZUludGVybmFsRGF0YXx1bmRlZmluZWR9XG4gICAqL1xuICBmdW5jdGlvbiBnZXRSZWxhdGVkRm9ybURhdGEoZXZ0KSB7XG4gICAgY29uc3QgZWx0ID0gY2xvc2VzdChhc0VsZW1lbnQoZXZ0LnRhcmdldCksIFwiYnV0dG9uLCBpbnB1dFt0eXBlPSdzdWJtaXQnXVwiKVxuICAgIGlmICghZWx0KSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgZm9ybSA9IHJlc29sdmVUYXJnZXQoJyMnICsgZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2Zvcm0nKSwgZWx0LmdldFJvb3ROb2RlKCkpIHx8IGNsb3Nlc3QoZWx0LCAnZm9ybScpXG4gICAgaWYgKCFmb3JtKSB7XG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgcmV0dXJuIGdldEludGVybmFsRGF0YShmb3JtKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdEJ1dHRvblRyYWNraW5nKGVsdCkge1xuICAgIC8vIG5lZWQgdG8gaGFuZGxlIGJvdGggY2xpY2sgYW5kIGZvY3VzIGluOlxuICAgIC8vICAgZm9jdXNpbiAtIGluIGNhc2Ugc29tZW9uZSB0YWJzIGluIHRvIGEgYnV0dG9uIGFuZCBoaXRzIHRoZSBzcGFjZSBiYXJcbiAgICAvLyAgIGNsaWNrIC0gb24gT1NYIGJ1dHRvbnMgZG8gbm90IGZvY3VzIG9uIGNsaWNrIHNlZSBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MTM3MjRcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCBtYXliZVNldExhc3RCdXR0b25DbGlja2VkKVxuICAgIGVsdC5hZGRFdmVudExpc3RlbmVyKCdmb2N1c2luJywgbWF5YmVTZXRMYXN0QnV0dG9uQ2xpY2tlZClcbiAgICBlbHQuYWRkRXZlbnRMaXN0ZW5lcignZm9jdXNvdXQnLCBtYXliZVVuc2V0TGFzdEJ1dHRvbkNsaWNrZWQpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge3N0cmluZ30gY29kZVxuICAgKi9cbiAgZnVuY3Rpb24gYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgY29kZSkge1xuICAgIGNvbnN0IG5vZGVEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkobm9kZURhdGEub25IYW5kbGVycykpIHtcbiAgICAgIG5vZGVEYXRhLm9uSGFuZGxlcnMgPSBbXVxuICAgIH1cbiAgICBsZXQgZnVuY1xuICAgIC8qKiBAdHlwZSBFdmVudExpc3RlbmVyICovXG4gICAgY29uc3QgbGlzdGVuZXIgPSBmdW5jdGlvbihlKSB7XG4gICAgICBtYXliZUV2YWwoZWx0LCBmdW5jdGlvbigpIHtcbiAgICAgICAgaWYgKGVsdElzRGlzYWJsZWQoZWx0KSkge1xuICAgICAgICAgIHJldHVyblxuICAgICAgICB9XG4gICAgICAgIGlmICghZnVuYykge1xuICAgICAgICAgIGZ1bmMgPSBuZXcgRnVuY3Rpb24oJ2V2ZW50JywgY29kZSlcbiAgICAgICAgfVxuICAgICAgICBmdW5jLmNhbGwoZWx0LCBlKVxuICAgICAgfSlcbiAgICB9XG4gICAgZWx0LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnROYW1lLCBsaXN0ZW5lcilcbiAgICBub2RlRGF0YS5vbkhhbmRsZXJzLnB1c2goeyBldmVudDogZXZlbnROYW1lLCBsaXN0ZW5lciB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqL1xuICBmdW5jdGlvbiBwcm9jZXNzSHhPbldpbGRjYXJkKGVsdCkge1xuICAgIC8vIHdpcGUgYW55IHByZXZpb3VzIG9uIGhhbmRsZXJzIHNvIHRoYXQgdGhpcyBmdW5jdGlvbiB0YWtlcyBwcmVjZWRlbmNlXG4gICAgZGVJbml0T25IYW5kbGVycyhlbHQpXG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGVsdC5hdHRyaWJ1dGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBuYW1lID0gZWx0LmF0dHJpYnV0ZXNbaV0ubmFtZVxuICAgICAgY29uc3QgdmFsdWUgPSBlbHQuYXR0cmlidXRlc1tpXS52YWx1ZVxuICAgICAgaWYgKHN0YXJ0c1dpdGgobmFtZSwgJ2h4LW9uJykgfHwgc3RhcnRzV2l0aChuYW1lLCAnZGF0YS1oeC1vbicpKSB7XG4gICAgICAgIGNvbnN0IGFmdGVyT25Qb3NpdGlvbiA9IG5hbWUuaW5kZXhPZignLW9uJykgKyAzXG4gICAgICAgIGNvbnN0IG5leHRDaGFyID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24sIGFmdGVyT25Qb3NpdGlvbiArIDEpXG4gICAgICAgIGlmIChuZXh0Q2hhciA9PT0gJy0nIHx8IG5leHRDaGFyID09PSAnOicpIHtcbiAgICAgICAgICBsZXQgZXZlbnROYW1lID0gbmFtZS5zbGljZShhZnRlck9uUG9zaXRpb24gKyAxKVxuICAgICAgICAgIC8vIGlmIHRoZSBldmVudE5hbWUgc3RhcnRzIHdpdGggYSBjb2xvbiBvciBkYXNoLCBwcmVwZW5kIFwiaHRteFwiIGZvciBzaG9ydGhhbmQgc3VwcG9ydFxuICAgICAgICAgIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJzonKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXgnICsgZXZlbnROYW1lXG4gICAgICAgICAgfSBlbHNlIGlmIChzdGFydHNXaXRoKGV2ZW50TmFtZSwgJy0nKSkge1xuICAgICAgICAgICAgZXZlbnROYW1lID0gJ2h0bXg6JyArIGV2ZW50TmFtZS5zbGljZSgxKVxuICAgICAgICAgIH0gZWxzZSBpZiAoc3RhcnRzV2l0aChldmVudE5hbWUsICdodG14LScpKSB7XG4gICAgICAgICAgICBldmVudE5hbWUgPSAnaHRteDonICsgZXZlbnROYW1lLnNsaWNlKDUpXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgYWRkSHhPbkV2ZW50SGFuZGxlcihlbHQsIGV2ZW50TmFtZSwgdmFsdWUpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fEhUTUxJbnB1dEVsZW1lbnR9IGVsdFxuICAgKi9cbiAgZnVuY3Rpb24gaW5pdE5vZGUoZWx0KSB7XG4gICAgaWYgKGNsb3Nlc3QoZWx0LCBodG14LmNvbmZpZy5kaXNhYmxlU2VsZWN0b3IpKSB7XG4gICAgICBjbGVhblVwRWxlbWVudChlbHQpXG4gICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3Qgbm9kZURhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGlmIChub2RlRGF0YS5pbml0SGFzaCAhPT0gYXR0cmlidXRlSGFzaChlbHQpKSB7XG4gICAgICAvLyBjbGVhbiB1cCBhbnkgcHJldmlvdXNseSBwcm9jZXNzZWQgaW5mb1xuICAgICAgZGVJbml0Tm9kZShlbHQpXG5cbiAgICAgIG5vZGVEYXRhLmluaXRIYXNoID0gYXR0cmlidXRlSGFzaChlbHQpXG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJylcblxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBpZiAoZWx0LnZhbHVlKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmVcbiAgICAgICAgbm9kZURhdGEubGFzdFZhbHVlID0gZWx0LnZhbHVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHRyaWdnZXJTcGVjcyA9IGdldFRyaWdnZXJTcGVjcyhlbHQpXG4gICAgICBjb25zdCBoYXNFeHBsaWNpdEh0dHBBY3Rpb24gPSBwcm9jZXNzVmVyYnMoZWx0LCBub2RlRGF0YSwgdHJpZ2dlclNwZWNzKVxuXG4gICAgICBpZiAoIWhhc0V4cGxpY2l0SHR0cEFjdGlvbikge1xuICAgICAgICBpZiAoZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWJvb3N0JykgPT09ICd0cnVlJykge1xuICAgICAgICAgIGJvb3N0RWxlbWVudChlbHQsIG5vZGVEYXRhLCB0cmlnZ2VyU3BlY3MpXG4gICAgICAgIH0gZWxzZSBpZiAoaGFzQXR0cmlidXRlKGVsdCwgJ2h4LXRyaWdnZXInKSkge1xuICAgICAgICAgIHRyaWdnZXJTcGVjcy5mb3JFYWNoKGZ1bmN0aW9uKHRyaWdnZXJTcGVjKSB7XG4gICAgICAgICAgICAvLyBGb3IgXCJuYWtlZFwiIHRyaWdnZXJzLCBkb24ndCBkbyBhbnl0aGluZyBhdCBhbGxcbiAgICAgICAgICAgIGFkZFRyaWdnZXJIYW5kbGVyKGVsdCwgdHJpZ2dlclNwZWMsIG5vZGVEYXRhLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgfSlcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBIYW5kbGUgc3VibWl0IGJ1dHRvbnMvaW5wdXRzIHRoYXQgaGF2ZSB0aGUgZm9ybSBhdHRyaWJ1dGUgc2V0XG4gICAgICAvLyBzZWUgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSFRNTC9FbGVtZW50L2J1dHRvblxuICAgICAgaWYgKGVsdC50YWdOYW1lID09PSAnRk9STScgfHwgKGdldFJhd0F0dHJpYnV0ZShlbHQsICd0eXBlJykgPT09ICdzdWJtaXQnICYmIGhhc0F0dHJpYnV0ZShlbHQsICdmb3JtJykpKSB7XG4gICAgICAgIGluaXRCdXR0b25UcmFja2luZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUHJvY2Vzc05vZGUnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBQcm9jZXNzZXMgbmV3IGNvbnRlbnQsIGVuYWJsaW5nIGh0bXggYmVoYXZpb3IuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3UgaGF2ZSBjb250ZW50IHRoYXQgaXMgYWRkZWQgdG8gdGhlIERPTSBvdXRzaWRlIG9mIHRoZSBub3JtYWwgaHRteCByZXF1ZXN0IGN5Y2xlIGJ1dCBzdGlsbCB3YW50IGh0bXggYXR0cmlidXRlcyB0byB3b3JrLlxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNwcm9jZXNzXG4gICAqXG4gICAqIEBwYXJhbSB7RWxlbWVudHxzdHJpbmd9IGVsdCBlbGVtZW50IHRvIHByb2Nlc3NcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NOb2RlKGVsdCkge1xuICAgIGVsdCA9IHJlc29sdmVUYXJnZXQoZWx0KVxuICAgIGlmIChjbG9zZXN0KGVsdCwgaHRteC5jb25maWcuZGlzYWJsZVNlbGVjdG9yKSkge1xuICAgICAgY2xlYW5VcEVsZW1lbnQoZWx0KVxuICAgICAgcmV0dXJuXG4gICAgfVxuICAgIGluaXROb2RlKGVsdClcbiAgICBmb3JFYWNoKGZpbmRFbGVtZW50c1RvUHJvY2VzcyhlbHQpLCBmdW5jdGlvbihjaGlsZCkgeyBpbml0Tm9kZShjaGlsZCkgfSlcbiAgICBmb3JFYWNoKGZpbmRIeE9uV2lsZGNhcmRFbGVtZW50cyhlbHQpLCBwcm9jZXNzSHhPbldpbGRjYXJkKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gRXZlbnQvTG9nIFN1cHBvcnRcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHN0clxuICAgKiBAcmV0dXJucyB7c3RyaW5nfVxuICAgKi9cbiAgZnVuY3Rpb24ga2ViYWJFdmVudE5hbWUoc3RyKSB7XG4gICAgcmV0dXJuIHN0ci5yZXBsYWNlKC8oW2EtejAtOV0pKFtBLVpdKS9nLCAnJDEtJDInKS50b0xvd2VyQ2FzZSgpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IGV2ZW50TmFtZVxuICAgKiBAcGFyYW0ge2FueX0gZGV0YWlsXG4gICAqIEByZXR1cm5zIHtDdXN0b21FdmVudH1cbiAgICovXG4gIGZ1bmN0aW9uIG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbCkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgIC8vIFRPRE86IGBjb21wb3NlZDogdHJ1ZWAgaGVyZSBpcyBhIGhhY2sgdG8gbWFrZSBnbG9iYWwgZXZlbnQgaGFuZGxlcnMgd29yayB3aXRoIGV2ZW50cyBpbiBzaGFkb3cgRE9NXG4gICAgICAvLyBUaGlzIGJyZWFrcyBleHBlY3RlZCBlbmNhcHN1bGF0aW9uIGJ1dCBuZWVkcyB0byBiZSBoZXJlIHVudGlsIGRlY2lkZWQgb3RoZXJ3aXNlIGJ5IGNvcmUgZGV2c1xuICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiB0cnVlLCBjYW5jZWxhYmxlOiB0cnVlLCBjb21wb3NlZDogdHJ1ZSwgZGV0YWlsIH0pXG4gICAgfSBlbHNlIHtcbiAgICAgIGV2dCA9IGdldERvY3VtZW50KCkuY3JlYXRlRXZlbnQoJ0N1c3RvbUV2ZW50JylcbiAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWVcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWxcbiAgICovXG4gIGZ1bmN0aW9uIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICB0cmlnZ2VyRXZlbnQoZWx0LCBldmVudE5hbWUsIG1lcmdlT2JqZWN0cyh7IGVycm9yOiBldmVudE5hbWUgfSwgZGV0YWlsKSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gZXZlbnROYW1lXG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gaWdub3JlRXZlbnRGb3JMb2dnaW5nKGV2ZW50TmFtZSkge1xuICAgIHJldHVybiBldmVudE5hbWUgPT09ICdodG14OmFmdGVyUHJvY2Vzc05vZGUnXG4gIH1cblxuICAvKipcbiAgICogYHdpdGhFeHRlbnNpb25zYCBsb2NhdGVzIGFsbCBhY3RpdmUgZXh0ZW5zaW9ucyBmb3IgYSBwcm92aWRlZCBlbGVtZW50LCB0aGVuXG4gICAqIGV4ZWN1dGVzIHRoZSBwcm92aWRlZCBmdW5jdGlvbiB1c2luZyBlYWNoIG9mIHRoZSBhY3RpdmUgZXh0ZW5zaW9ucy4gIEl0IHNob3VsZFxuICAgKiBiZSBjYWxsZWQgaW50ZXJuYWxseSBhdCBldmVyeSBleHRlbmRhYmxlIGV4ZWN1dGlvbiBwb2ludCBpbiBodG14LlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0geyhleHRlbnNpb246SHRteEV4dGVuc2lvbikgPT4gdm9pZH0gdG9Eb1xuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBmdW5jdGlvbiB3aXRoRXh0ZW5zaW9ucyhlbHQsIHRvRG8pIHtcbiAgICBmb3JFYWNoKGdldEV4dGVuc2lvbnMoZWx0KSwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICB0cnkge1xuICAgICAgICB0b0RvKGV4dGVuc2lvbilcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgbG9nRXJyb3IoZSlcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgZnVuY3Rpb24gbG9nRXJyb3IobXNnKSB7XG4gICAgaWYgKGNvbnNvbGUuZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUuZXJyb3IobXNnKVxuICAgIH0gZWxzZSBpZiAoY29uc29sZS5sb2cpIHtcbiAgICAgIGNvbnNvbGUubG9nKCdFUlJPUjogJywgbXNnKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBUcmlnZ2VycyBhIGdpdmVuIGV2ZW50IG9uIGFuIGVsZW1lbnRcbiAgICpcbiAgICogQHNlZSBodHRwczovL2h0bXgub3JnL2FwaS8jdHJpZ2dlclxuICAgKlxuICAgKiBAcGFyYW0ge0V2ZW50VGFyZ2V0fHN0cmluZ30gZWx0IHRoZSBlbGVtZW50IHRvIHRyaWdnZXIgdGhlIGV2ZW50IG9uXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBldmVudE5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IHRvIHRyaWdnZXJcbiAgICogQHBhcmFtIHthbnk9fSBkZXRhaWwgZGV0YWlscyBmb3IgdGhlIGV2ZW50XG4gICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgKi9cbiAgZnVuY3Rpb24gdHJpZ2dlckV2ZW50KGVsdCwgZXZlbnROYW1lLCBkZXRhaWwpIHtcbiAgICBlbHQgPSByZXNvbHZlVGFyZ2V0KGVsdClcbiAgICBpZiAoZGV0YWlsID09IG51bGwpIHtcbiAgICAgIGRldGFpbCA9IHt9XG4gICAgfVxuICAgIGRldGFpbC5lbHQgPSBlbHRcbiAgICBjb25zdCBldmVudCA9IG1ha2VFdmVudChldmVudE5hbWUsIGRldGFpbClcbiAgICBpZiAoaHRteC5sb2dnZXIgJiYgIWlnbm9yZUV2ZW50Rm9yTG9nZ2luZyhldmVudE5hbWUpKSB7XG4gICAgICBodG14LmxvZ2dlcihlbHQsIGV2ZW50TmFtZSwgZGV0YWlsKVxuICAgIH1cbiAgICBpZiAoZGV0YWlsLmVycm9yKSB7XG4gICAgICBsb2dFcnJvcihkZXRhaWwuZXJyb3IpXG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDplcnJvcicsIHsgZXJyb3JJbmZvOiBkZXRhaWwgfSlcbiAgICB9XG4gICAgbGV0IGV2ZW50UmVzdWx0ID0gZWx0LmRpc3BhdGNoRXZlbnQoZXZlbnQpXG4gICAgY29uc3Qga2ViYWJOYW1lID0ga2ViYWJFdmVudE5hbWUoZXZlbnROYW1lKVxuICAgIGlmIChldmVudFJlc3VsdCAmJiBrZWJhYk5hbWUgIT09IGV2ZW50TmFtZSkge1xuICAgICAgY29uc3Qga2ViYWJlZEV2ZW50ID0gbWFrZUV2ZW50KGtlYmFiTmFtZSwgZXZlbnQuZGV0YWlsKVxuICAgICAgZXZlbnRSZXN1bHQgPSBldmVudFJlc3VsdCAmJiBlbHQuZGlzcGF0Y2hFdmVudChrZWJhYmVkRXZlbnQpXG4gICAgfVxuICAgIHdpdGhFeHRlbnNpb25zKGFzRWxlbWVudChlbHQpLCBmdW5jdGlvbihleHRlbnNpb24pIHtcbiAgICAgIGV2ZW50UmVzdWx0ID0gZXZlbnRSZXN1bHQgJiYgKGV4dGVuc2lvbi5vbkV2ZW50KGV2ZW50TmFtZSwgZXZlbnQpICE9PSBmYWxzZSAmJiAhZXZlbnQuZGVmYXVsdFByZXZlbnRlZClcbiAgICB9KVxuICAgIHJldHVybiBldmVudFJlc3VsdFxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSGlzdG9yeSBTdXBwb3J0XG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIGxldCBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gIC8qKlxuICAgKiBAcmV0dXJucyB7RWxlbWVudH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldEhpc3RvcnlFbGVtZW50KCkge1xuICAgIGNvbnN0IGhpc3RvcnlFbHQgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJylcbiAgICByZXR1cm4gaGlzdG9yeUVsdCB8fCBnZXREb2N1bWVudCgpLmJvZHlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gcm9vdEVsdFxuICAgKi9cbiAgZnVuY3Rpb24gc2F2ZVRvSGlzdG9yeUNhY2hlKHVybCwgcm9vdEVsdCkge1xuICAgIGlmICghY2FuQWNjZXNzTG9jYWxTdG9yYWdlKCkpIHtcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIC8vIGdldCBzdGF0ZSB0byBzYXZlXG4gICAgY29uc3QgaW5uZXJIVE1MID0gY2xlYW5Jbm5lckh0bWxGb3JIaXN0b3J5KHJvb3RFbHQpXG4gICAgY29uc3QgdGl0bGUgPSBnZXREb2N1bWVudCgpLnRpdGxlXG4gICAgY29uc3Qgc2Nyb2xsID0gd2luZG93LnNjcm9sbFlcblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5Q2FjaGVTaXplIDw9IDApIHtcbiAgICAgIC8vIG1ha2Ugc3VyZSB0aGF0IGFuIGV2ZW50dWFsbHkgYWxyZWFkeSBleGlzdGluZyBjYWNoZSBpcyBwdXJnZWRcbiAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKCdodG14LWhpc3RvcnktY2FjaGUnKVxuICAgICAgcmV0dXJuXG4gICAgfVxuXG4gICAgdXJsID0gbm9ybWFsaXplUGF0aCh1cmwpXG5cbiAgICBjb25zdCBoaXN0b3J5Q2FjaGUgPSBwYXJzZUpTT04obG9jYWxTdG9yYWdlLmdldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScpKSB8fCBbXVxuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaGlzdG9yeUNhY2hlLmxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAoaGlzdG9yeUNhY2hlW2ldLnVybCA9PT0gdXJsKSB7XG4gICAgICAgIGhpc3RvcnlDYWNoZS5zcGxpY2UoaSwgMSlcbiAgICAgICAgYnJlYWtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiogQHR5cGUgSHRteEhpc3RvcnlJdGVtICovXG4gICAgY29uc3QgbmV3SGlzdG9yeUl0ZW0gPSB7IHVybCwgY29udGVudDogaW5uZXJIVE1MLCB0aXRsZSwgc2Nyb2xsIH1cblxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlJdGVtQ3JlYXRlZCcsIHsgaXRlbTogbmV3SGlzdG9yeUl0ZW0sIGNhY2hlOiBoaXN0b3J5Q2FjaGUgfSlcblxuICAgIGhpc3RvcnlDYWNoZS5wdXNoKG5ld0hpc3RvcnlJdGVtKVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gaHRteC5jb25maWcuaGlzdG9yeUNhY2hlU2l6ZSkge1xuICAgICAgaGlzdG9yeUNhY2hlLnNoaWZ0KClcbiAgICB9XG5cbiAgICAvLyBrZWVwIHRyeWluZyB0byBzYXZlIHRoZSBjYWNoZSB1bnRpbCBpdCBzdWNjZWVkcyBvciBpcyBlbXB0eVxuICAgIHdoaWxlIChoaXN0b3J5Q2FjaGUubGVuZ3RoID4gMCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oJ2h0bXgtaGlzdG9yeS1jYWNoZScsIEpTT04uc3RyaW5naWZ5KGhpc3RvcnlDYWNoZSkpXG4gICAgICAgIGJyZWFrXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6aGlzdG9yeUNhY2hlRXJyb3InLCB7IGNhdXNlOiBlLCBjYWNoZTogaGlzdG9yeUNhY2hlIH0pXG4gICAgICAgIGhpc3RvcnlDYWNoZS5zaGlmdCgpIC8vIHNocmluayB0aGUgY2FjaGUgYW5kIHJldHJ5XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhIaXN0b3J5SXRlbVxuICAgKiBAcHJvcGVydHkge3N0cmluZ30gdXJsXG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBjb250ZW50XG4gICAqIEBwcm9wZXJ0eSB7c3RyaW5nfSB0aXRsZVxuICAgKiBAcHJvcGVydHkge251bWJlcn0gc2Nyb2xsXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gdXJsXG4gICAqIEByZXR1cm5zIHtIdG14SGlzdG9yeUl0ZW18bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGdldENhY2hlZEhpc3RvcnkodXJsKSB7XG4gICAgaWYgKCFjYW5BY2Nlc3NMb2NhbFN0b3JhZ2UoKSkge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG5cbiAgICB1cmwgPSBub3JtYWxpemVQYXRoKHVybClcblxuICAgIGNvbnN0IGhpc3RvcnlDYWNoZSA9IHBhcnNlSlNPTihsb2NhbFN0b3JhZ2UuZ2V0SXRlbSgnaHRteC1oaXN0b3J5LWNhY2hlJykpIHx8IFtdXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoaXN0b3J5Q2FjaGUubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChoaXN0b3J5Q2FjaGVbaV0udXJsID09PSB1cmwpIHtcbiAgICAgICAgcmV0dXJuIGhpc3RvcnlDYWNoZVtpXVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbFxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBjbGVhbklubmVySHRtbEZvckhpc3RvcnkoZWx0KSB7XG4gICAgY29uc3QgY2xhc3NOYW1lID0gaHRteC5jb25maWcucmVxdWVzdENsYXNzXG4gICAgY29uc3QgY2xvbmUgPSAvKiogQHR5cGUgRWxlbWVudCAqLyAoZWx0LmNsb25lTm9kZSh0cnVlKSlcbiAgICBmb3JFYWNoKGZpbmRBbGwoY2xvbmUsICcuJyArIGNsYXNzTmFtZSksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICByZW1vdmVDbGFzc0Zyb21FbGVtZW50KGNoaWxkLCBjbGFzc05hbWUpXG4gICAgfSlcbiAgICAvLyByZW1vdmUgdGhlIGRpc2FibGVkIGF0dHJpYnV0ZSBmb3IgYW55IGVsZW1lbnQgZGlzYWJsZWQgZHVlIHRvIGFuIGh0bXggcmVxdWVzdFxuICAgIGZvckVhY2goZmluZEFsbChjbG9uZSwgJ1tkYXRhLWRpc2FibGVkLWJ5LWh0bXhdJyksIGZ1bmN0aW9uKGNoaWxkKSB7XG4gICAgICBjaGlsZC5yZW1vdmVBdHRyaWJ1dGUoJ2Rpc2FibGVkJylcbiAgICB9KVxuICAgIHJldHVybiBjbG9uZS5pbm5lckhUTUxcbiAgfVxuXG4gIGZ1bmN0aW9uIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpIHtcbiAgICBjb25zdCBlbHQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgY29uc3QgcGF0aCA9IGN1cnJlbnRQYXRoRm9ySGlzdG9yeSB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuXG4gICAgLy8gQWxsb3cgaGlzdG9yeSBzbmFwc2hvdCBmZWF0dXJlIHRvIGJlIGRpc2FibGVkIHdoZXJlIGh4LWhpc3Rvcnk9XCJmYWxzZVwiXG4gICAgLy8gaXMgcHJlc2VudCAqYW55d2hlcmUqIGluIHRoZSBjdXJyZW50IGRvY3VtZW50IHdlJ3JlIGFib3V0IHRvIHNhdmUsXG4gICAgLy8gc28gd2UgY2FuIHByZXZlbnQgcHJpdmlsZWdlZCBkYXRhIGVudGVyaW5nIHRoZSBjYWNoZS5cbiAgICAvLyBUaGUgcGFnZSB3aWxsIHN0aWxsIGJlIHJlYWNoYWJsZSBhcyBhIGhpc3RvcnkgZW50cnksIGJ1dCBodG14IHdpbGwgZmV0Y2ggaXRcbiAgICAvLyBsaXZlIGZyb20gdGhlIHNlcnZlciBvbnBvcHN0YXRlIHJhdGhlciB0aGFuIGxvb2sgaW4gdGhlIGxvY2FsU3RvcmFnZSBjYWNoZVxuICAgIGxldCBkaXNhYmxlSGlzdG9yeUNhY2hlXG4gICAgdHJ5IHtcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIiBpXSxbZGF0YS1oeC1oaXN0b3J5PVwiZmFsc2VcIiBpXScpXG4gICAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElFMTE6IGluc2Vuc2l0aXZlIG1vZGlmaWVyIG5vdCBzdXBwb3J0ZWQgc28gZmFsbGJhY2sgdG8gY2FzZSBzZW5zaXRpdmUgc2VsZWN0b3JcbiAgICAgIGRpc2FibGVIaXN0b3J5Q2FjaGUgPSBnZXREb2N1bWVudCgpLnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5PVwiZmFsc2VcIl0sW2RhdGEtaHgtaGlzdG9yeT1cImZhbHNlXCJdJylcbiAgICB9XG4gICAgaWYgKCFkaXNhYmxlSGlzdG9yeUNhY2hlKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpiZWZvcmVIaXN0b3J5U2F2ZScsIHsgcGF0aCwgaGlzdG9yeUVsdDogZWx0IH0pXG4gICAgICBzYXZlVG9IaXN0b3J5Q2FjaGUocGF0aCwgZWx0KVxuICAgIH1cblxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sIGdldERvY3VtZW50KCkudGl0bGUsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqL1xuICBmdW5jdGlvbiBwdXNoVXJsSW50b0hpc3RvcnkocGF0aCkge1xuICAvLyByZW1vdmUgdGhlIGNhY2hlIGJ1c3RlciBwYXJhbWV0ZXIsIGlmIGFueVxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtKSB7XG4gICAgICBwYXRoID0gcGF0aC5yZXBsYWNlKC9vcmdcXC5odG14XFwuY2FjaGUtYnVzdGVyPVteJl0qJj8vLCAnJylcbiAgICAgIGlmIChlbmRzV2l0aChwYXRoLCAnJicpIHx8IGVuZHNXaXRoKHBhdGgsICc/JykpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc2xpY2UoMCwgLTEpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkge1xuICAgICAgaGlzdG9yeS5wdXNoU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIH1cbiAgICBjdXJyZW50UGF0aEZvckhpc3RvcnkgPSBwYXRoXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICovXG4gIGZ1bmN0aW9uIHJlcGxhY2VVcmxJbkhpc3RvcnkocGF0aCkge1xuICAgIGlmIChodG14LmNvbmZpZy5oaXN0b3J5RW5hYmxlZCkgaGlzdG9yeS5yZXBsYWNlU3RhdGUoeyBodG14OiB0cnVlIH0sICcnLCBwYXRoKVxuICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0h0bXhTZXR0bGVUYXNrW119IHRhc2tzXG4gICAqL1xuICBmdW5jdGlvbiBzZXR0bGVJbW1lZGlhdGVseSh0YXNrcykge1xuICAgIGZvckVhY2godGFza3MsIGZ1bmN0aW9uKHRhc2spIHtcbiAgICAgIHRhc2suY2FsbCh1bmRlZmluZWQpXG4gICAgfSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gcGF0aFxuICAgKi9cbiAgZnVuY3Rpb24gbG9hZEhpc3RvcnlGcm9tU2VydmVyKHBhdGgpIHtcbiAgICBjb25zdCByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KClcbiAgICBjb25zdCBkZXRhaWxzID0geyBwYXRoLCB4aHI6IHJlcXVlc3QgfVxuICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3MnLCBkZXRhaWxzKVxuICAgIHJlcXVlc3Qub3BlbignR0VUJywgcGF0aCwgdHJ1ZSlcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLVJlcXVlc3QnLCAndHJ1ZScpXG4gICAgcmVxdWVzdC5zZXRSZXF1ZXN0SGVhZGVyKCdIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdCcsICd0cnVlJylcbiAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0hYLUN1cnJlbnQtVVJMJywgZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmKVxuICAgIHJlcXVlc3Qub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5zdGF0dXMgPj0gMjAwICYmIHRoaXMuc3RhdHVzIDwgNDAwKSB7XG4gICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlDYWNoZU1pc3NMb2FkJywgZGV0YWlscylcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBtYWtlRnJhZ21lbnQodGhpcy5yZXNwb25zZSlcbiAgICAgICAgLyoqIEB0eXBlIFBhcmVudE5vZGUgKi9cbiAgICAgICAgY29uc3QgY29udGVudCA9IGZyYWdtZW50LnF1ZXJ5U2VsZWN0b3IoJ1toeC1oaXN0b3J5LWVsdF0sW2RhdGEtaHgtaGlzdG9yeS1lbHRdJykgfHwgZnJhZ21lbnRcbiAgICAgICAgY29uc3QgaGlzdG9yeUVsZW1lbnQgPSBnZXRIaXN0b3J5RWxlbWVudCgpXG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBtYWtlU2V0dGxlSW5mbyhoaXN0b3J5RWxlbWVudClcbiAgICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG5cbiAgICAgICAgc3dhcElubmVySFRNTChoaXN0b3J5RWxlbWVudCwgY29udGVudCwgc2V0dGxlSW5mbylcbiAgICAgICAgc2V0dGxlSW1tZWRpYXRlbHkoc2V0dGxlSW5mby50YXNrcylcbiAgICAgICAgY3VycmVudFBhdGhGb3JIaXN0b3J5ID0gcGF0aFxuICAgICAgICB0cmlnZ2VyRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5UmVzdG9yZScsIHsgcGF0aCwgY2FjaGVNaXNzOiB0cnVlLCBzZXJ2ZXJSZXNwb25zZTogdGhpcy5yZXNwb25zZSB9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZ2V0RG9jdW1lbnQoKS5ib2R5LCAnaHRteDpoaXN0b3J5Q2FjaGVNaXNzTG9hZEVycm9yJywgZGV0YWlscylcbiAgICAgIH1cbiAgICB9XG4gICAgcmVxdWVzdC5zZW5kKClcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gW3BhdGhdXG4gICAqL1xuICBmdW5jdGlvbiByZXN0b3JlSGlzdG9yeShwYXRoKSB7XG4gICAgc2F2ZUN1cnJlbnRQYWdlVG9IaXN0b3J5KClcbiAgICBwYXRoID0gcGF0aCB8fCBsb2NhdGlvbi5wYXRobmFtZSArIGxvY2F0aW9uLnNlYXJjaFxuICAgIGNvbnN0IGNhY2hlZCA9IGdldENhY2hlZEhpc3RvcnkocGF0aClcbiAgICBpZiAoY2FjaGVkKSB7XG4gICAgICBjb25zdCBmcmFnbWVudCA9IG1ha2VGcmFnbWVudChjYWNoZWQuY29udGVudClcbiAgICAgIGNvbnN0IGhpc3RvcnlFbGVtZW50ID0gZ2V0SGlzdG9yeUVsZW1lbnQoKVxuICAgICAgY29uc3Qgc2V0dGxlSW5mbyA9IG1ha2VTZXR0bGVJbmZvKGhpc3RvcnlFbGVtZW50KVxuICAgICAgaGFuZGxlVGl0bGUoZnJhZ21lbnQudGl0bGUpXG4gICAgICBzd2FwSW5uZXJIVE1MKGhpc3RvcnlFbGVtZW50LCBmcmFnbWVudCwgc2V0dGxlSW5mbylcbiAgICAgIHNldHRsZUltbWVkaWF0ZWx5KHNldHRsZUluZm8udGFza3MpXG4gICAgICBnZXRXaW5kb3coKS5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICB3aW5kb3cuc2Nyb2xsVG8oMCwgY2FjaGVkLnNjcm9sbClcbiAgICAgIH0sIDApIC8vIG5leHQgJ3RpY2snLCBzbyBicm93c2VyIGhhcyB0aW1lIHRvIHJlbmRlciBsYXlvdXRcbiAgICAgIGN1cnJlbnRQYXRoRm9ySGlzdG9yeSA9IHBhdGhcbiAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14Omhpc3RvcnlSZXN0b3JlJywgeyBwYXRoLCBpdGVtOiBjYWNoZWQgfSlcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGh0bXguY29uZmlnLnJlZnJlc2hPbkhpc3RvcnlNaXNzKSB7XG4gICAgICAgIC8vIEB0cy1pZ25vcmU6IG9wdGlvbmFsIHBhcmFtZXRlciBpbiByZWxvYWQoKSBmdW5jdGlvbiB0aHJvd3MgZXJyb3JcbiAgICAgICAgLy8gbm9pbnNwZWN0aW9uIEpTVW5yZXNvbHZlZFJlZmVyZW5jZVxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKHRydWUpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsb2FkSGlzdG9yeUZyb21TZXJ2ZXIocGF0aClcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGFkZFJlcXVlc3RJbmRpY2F0b3JDbGFzc2VzKGVsdCkge1xuICAgIGxldCBpbmRpY2F0b3JzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtaW5kaWNhdG9yJykpXG4gICAgaWYgKGluZGljYXRvcnMgPT0gbnVsbCkge1xuICAgICAgaW5kaWNhdG9ycyA9IFtlbHRdXG4gICAgfVxuICAgIGZvckVhY2goaW5kaWNhdG9ycywgZnVuY3Rpb24oaWMpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShpYylcbiAgICAgIGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgPSAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCB8fCAwKSArIDFcbiAgICAgIGljLmNsYXNzTGlzdC5hZGQuY2FsbChpYy5jbGFzc0xpc3QsIGh0bXguY29uZmlnLnJlcXVlc3RDbGFzcylcbiAgICB9KVxuICAgIHJldHVybiBpbmRpY2F0b3JzXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybnMge0VsZW1lbnRbXX1cbiAgICovXG4gIGZ1bmN0aW9uIGRpc2FibGVFbGVtZW50cyhlbHQpIHtcbiAgICBsZXQgZGlzYWJsZWRFbHRzID0gLyoqIEB0eXBlIEVsZW1lbnRbXSAqLyAoZmluZEF0dHJpYnV0ZVRhcmdldHMoZWx0LCAnaHgtZGlzYWJsZWQtZWx0JykpXG4gICAgaWYgKGRpc2FibGVkRWx0cyA9PSBudWxsKSB7XG4gICAgICBkaXNhYmxlZEVsdHMgPSBbXVxuICAgIH1cbiAgICBmb3JFYWNoKGRpc2FibGVkRWx0cywgZnVuY3Rpb24oZGlzYWJsZWRFbGVtZW50KSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZGlzYWJsZWRFbGVtZW50KVxuICAgICAgaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9IChpbnRlcm5hbERhdGEucmVxdWVzdENvdW50IHx8IDApICsgMVxuICAgICAgZGlzYWJsZWRFbGVtZW50LnNldEF0dHJpYnV0ZSgnZGlzYWJsZWQnLCAnJylcbiAgICAgIGRpc2FibGVkRWxlbWVudC5zZXRBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcsICcnKVxuICAgIH0pXG4gICAgcmV0dXJuIGRpc2FibGVkRWx0c1xuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBpbmRpY2F0b3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudFtdfSBkaXNhYmxlZFxuICAgKi9cbiAgZnVuY3Rpb24gcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZWQpIHtcbiAgICBmb3JFYWNoKGluZGljYXRvcnMsIGZ1bmN0aW9uKGljKSB7XG4gICAgICBjb25zdCBpbnRlcm5hbERhdGEgPSBnZXRJbnRlcm5hbERhdGEoaWMpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBpYy5jbGFzc0xpc3QucmVtb3ZlLmNhbGwoaWMuY2xhc3NMaXN0LCBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MpXG4gICAgICB9XG4gICAgfSlcbiAgICBmb3JFYWNoKGRpc2FibGVkLCBmdW5jdGlvbihkaXNhYmxlZEVsZW1lbnQpIHtcbiAgICAgIGNvbnN0IGludGVybmFsRGF0YSA9IGdldEludGVybmFsRGF0YShkaXNhYmxlZEVsZW1lbnQpXG4gICAgICBpbnRlcm5hbERhdGEucmVxdWVzdENvdW50ID0gKGludGVybmFsRGF0YS5yZXF1ZXN0Q291bnQgfHwgMCkgLSAxXG4gICAgICBpZiAoaW50ZXJuYWxEYXRhLnJlcXVlc3RDb3VudCA9PT0gMCkge1xuICAgICAgICBkaXNhYmxlZEVsZW1lbnQucmVtb3ZlQXR0cmlidXRlKCdkaXNhYmxlZCcpXG4gICAgICAgIGRpc2FibGVkRWxlbWVudC5yZW1vdmVBdHRyaWJ1dGUoJ2RhdGEtZGlzYWJsZWQtYnktaHRteCcpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIElucHV0IFZhbHVlIFByb2Nlc3NpbmdcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50W119IHByb2Nlc3NlZFxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGhhdmVTZWVuTm9kZShwcm9jZXNzZWQsIGVsdCkge1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcHJvY2Vzc2VkLmxlbmd0aDsgaSsrKSB7XG4gICAgICBjb25zdCBub2RlID0gcHJvY2Vzc2VkW2ldXG4gICAgICBpZiAobm9kZS5pc1NhbWVOb2RlKGVsdCkpIHtcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbGVtZW50XG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBzaG91bGRJbmNsdWRlKGVsZW1lbnQpIHtcbiAgICAvLyBDYXN0IHRvIHRyaWNrIHRzYywgdW5kZWZpbmVkIHZhbHVlcyB3aWxsIHdvcmsgZmluZSBoZXJlXG4gICAgY29uc3QgZWx0ID0gLyoqIEB0eXBlIHtIVE1MSW5wdXRFbGVtZW50fSAqLyAoZWxlbWVudClcbiAgICBpZiAoZWx0Lm5hbWUgPT09ICcnIHx8IGVsdC5uYW1lID09IG51bGwgfHwgZWx0LmRpc2FibGVkIHx8IGNsb3Nlc3QoZWx0LCAnZmllbGRzZXRbZGlzYWJsZWRdJykpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICAvLyBpZ25vcmUgXCJzdWJtaXR0ZXJcIiB0eXBlcyAoc2VlIGpRdWVyeSBzcmMvc2VyaWFsaXplLmpzKVxuICAgIGlmIChlbHQudHlwZSA9PT0gJ2J1dHRvbicgfHwgZWx0LnR5cGUgPT09ICdzdWJtaXQnIHx8IGVsdC50YWdOYW1lID09PSAnaW1hZ2UnIHx8IGVsdC50YWdOYW1lID09PSAncmVzZXQnIHx8IGVsdC50YWdOYW1lID09PSAnZmlsZScpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgICBpZiAoZWx0LnR5cGUgPT09ICdjaGVja2JveCcgfHwgZWx0LnR5cGUgPT09ICdyYWRpbycpIHtcbiAgICAgIHJldHVybiBlbHQuY2hlY2tlZFxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZVxuICB9XG5cbiAgLyoqIEBwYXJhbSB7c3RyaW5nfSBuYW1lXG4gICAqIEBwYXJhbSB7c3RyaW5nfEFycmF5fEZvcm1EYXRhRW50cnlWYWx1ZX0gdmFsdWVcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGEgKi9cbiAgZnVuY3Rpb24gYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlLmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGZvcm1EYXRhLmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKiogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtzdHJpbmd8QXJyYXl9IHZhbHVlXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhICovXG4gIGZ1bmN0aW9uIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSkge1xuICAgIGlmIChuYW1lICE9IG51bGwgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgbGV0IHZhbHVlcyA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2YWx1ZS5pbmRleE9mKHYpIDwgMClcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHZhbHVlcyA9IHZhbHVlcy5maWx0ZXIodiA9PiB2ICE9PSB2YWx1ZSlcbiAgICAgIH1cbiAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgZm9yRWFjaCh2YWx1ZXMsIHYgPT4gZm9ybURhdGEuYXBwZW5kKG5hbWUsIHYpKVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gcHJvY2Vzc2VkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEBwYXJhbSB7SHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXX0gZXJyb3JzXG4gICAqIEBwYXJhbSB7RWxlbWVudHxIVE1MSW5wdXRFbGVtZW50fEhUTUxTZWxlY3RFbGVtZW50fEhUTUxGb3JtRWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsaWRhdGVcbiAgICovXG4gIGZ1bmN0aW9uIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZWx0LCB2YWxpZGF0ZSkge1xuICAgIGlmIChlbHQgPT0gbnVsbCB8fCBoYXZlU2Vlbk5vZGUocHJvY2Vzc2VkLCBlbHQpKSB7XG4gICAgICByZXR1cm5cbiAgICB9IGVsc2Uge1xuICAgICAgcHJvY2Vzc2VkLnB1c2goZWx0KVxuICAgIH1cbiAgICBpZiAoc2hvdWxkSW5jbHVkZShlbHQpKSB7XG4gICAgICBjb25zdCBuYW1lID0gZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKVxuICAgICAgLy8gQHRzLWlnbm9yZSB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZCBmb3Igbm9uLWlucHV0IGVsZW1lbnRzLCB3aGljaCBpcyBmaW5lXG4gICAgICBsZXQgdmFsdWUgPSBlbHQudmFsdWVcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MU2VsZWN0RWxlbWVudCAmJiBlbHQubXVsdGlwbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0b0FycmF5KGVsdC5xdWVyeVNlbGVjdG9yQWxsKCdvcHRpb246Y2hlY2tlZCcpKS5tYXAoZnVuY3Rpb24oZSkgeyByZXR1cm4gKC8qKiBAdHlwZSBIVE1MT3B0aW9uRWxlbWVudCAqLyhlKSkudmFsdWUgfSlcbiAgICAgIH1cbiAgICAgIC8vIGluY2x1ZGUgZmlsZSBpbnB1dHNcbiAgICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MSW5wdXRFbGVtZW50ICYmIGVsdC5maWxlcykge1xuICAgICAgICB2YWx1ZSA9IHRvQXJyYXkoZWx0LmZpbGVzKVxuICAgICAgfVxuICAgICAgYWRkVmFsdWVUb0Zvcm1EYXRhKG5hbWUsIHZhbHVlLCBmb3JtRGF0YSlcbiAgICAgIGlmICh2YWxpZGF0ZSkge1xuICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoZWx0LCBlcnJvcnMpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQpIHtcbiAgICAgIGZvckVhY2goZWx0LmVsZW1lbnRzLCBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICBpZiAocHJvY2Vzc2VkLmluZGV4T2YoaW5wdXQpID49IDApIHtcbiAgICAgICAgICAvLyBUaGUgaW5wdXQgaGFzIGFscmVhZHkgYmVlbiBwcm9jZXNzZWQgYW5kIGFkZGVkIHRvIHRoZSB2YWx1ZXMsIGJ1dCB0aGUgRm9ybURhdGEgdGhhdCB3aWxsIGJlXG4gICAgICAgICAgLy8gIGNvbnN0cnVjdGVkIHJpZ2h0IGFmdGVyIG9uIHRoZSBmb3JtLCB3aWxsIGluY2x1ZGUgaXQgb25jZSBhZ2Fpbi4gU28gcmVtb3ZlIHRoYXQgaW5wdXQncyB2YWx1ZVxuICAgICAgICAgIC8vICBub3cgdG8gYXZvaWQgZHVwbGljYXRlc1xuICAgICAgICAgIHJlbW92ZVZhbHVlRnJvbUZvcm1EYXRhKGlucHV0Lm5hbWUsIGlucHV0LnZhbHVlLCBmb3JtRGF0YSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwcm9jZXNzZWQucHVzaChpbnB1dClcbiAgICAgICAgfVxuICAgICAgICBpZiAodmFsaWRhdGUpIHtcbiAgICAgICAgICB2YWxpZGF0ZUVsZW1lbnQoaW5wdXQsIGVycm9ycylcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICAgIG5ldyBGb3JtRGF0YShlbHQpLmZvckVhY2goZnVuY3Rpb24odmFsdWUsIG5hbWUpIHtcbiAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgRmlsZSAmJiB2YWx1ZS5uYW1lID09PSAnJykge1xuICAgICAgICAgIHJldHVybiAvLyBpZ25vcmUgbm8tbmFtZSBmaWxlc1xuICAgICAgICB9XG4gICAgICAgIGFkZFZhbHVlVG9Gb3JtRGF0YShuYW1lLCB2YWx1ZSwgZm9ybURhdGEpXG4gICAgICB9KVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW119IGVycm9yc1xuICAgKi9cbiAgZnVuY3Rpb24gdmFsaWRhdGVFbGVtZW50KGVsdCwgZXJyb3JzKSB7XG4gICAgY29uc3QgZWxlbWVudCA9IC8qKiBAdHlwZSB7SFRNTEVsZW1lbnQgJiBFbGVtZW50SW50ZXJuYWxzfSAqLyAoZWx0KVxuICAgIGlmIChlbGVtZW50LndpbGxWYWxpZGF0ZSkge1xuICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246dmFsaWRhdGUnKVxuICAgICAgaWYgKCFlbGVtZW50LmNoZWNrVmFsaWRpdHkoKSkge1xuICAgICAgICBlcnJvcnMucHVzaCh7IGVsdDogZWxlbWVudCwgbWVzc2FnZTogZWxlbWVudC52YWxpZGF0aW9uTWVzc2FnZSwgdmFsaWRpdHk6IGVsZW1lbnQudmFsaWRpdHkgfSlcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsZW1lbnQsICdodG14OnZhbGlkYXRpb246ZmFpbGVkJywgeyBtZXNzYWdlOiBlbGVtZW50LnZhbGlkYXRpb25NZXNzYWdlLCB2YWxpZGl0eTogZWxlbWVudC52YWxpZGl0eSB9KVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBPdmVycmlkZSB2YWx1ZXMgaW4gdGhlIG9uZSBGb3JtRGF0YSB3aXRoIHRob3NlIGZyb20gYW5vdGhlci5cbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gcmVjZWl2ZXIgdGhlIGZvcm1kYXRhIHRoYXQgd2lsbCBiZSBtdXRhdGVkXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGRvbm9yIHRoZSBmb3JtZGF0YSB0aGF0IHdpbGwgcHJvdmlkZSB0aGUgb3ZlcnJpZGluZyB2YWx1ZXNcbiAgICogQHJldHVybnMge0Zvcm1EYXRhfSB0aGUge0BsaW5rY29kZSByZWNlaXZlcn1cbiAgICovXG4gIGZ1bmN0aW9uIG92ZXJyaWRlRm9ybURhdGEocmVjZWl2ZXIsIGRvbm9yKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgZG9ub3Iua2V5cygpKSB7XG4gICAgICByZWNlaXZlci5kZWxldGUoa2V5KVxuICAgIH1cbiAgICBkb25vci5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJlY2VpdmVyLmFwcGVuZChrZXksIHZhbHVlKVxuICAgIH0pXG4gICAgcmV0dXJuIHJlY2VpdmVyXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudHxIVE1MRm9ybUVsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtIdHRwVmVyYn0gdmVyYlxuICogQHJldHVybnMge3tlcnJvcnM6IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yW10sIGZvcm1EYXRhOiBGb3JtRGF0YSwgdmFsdWVzOiBPYmplY3R9fVxuICovXG4gIGZ1bmN0aW9uIGdldElucHV0VmFsdWVzKGVsdCwgdmVyYikge1xuICAgIC8qKiBAdHlwZSBFbGVtZW50W10gKi9cbiAgICBjb25zdCBwcm9jZXNzZWQgPSBbXVxuICAgIGNvbnN0IGZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICBjb25zdCBwcmlvcml0eUZvcm1EYXRhID0gbmV3IEZvcm1EYXRhKClcbiAgICAvKiogQHR5cGUgSHRteEVsZW1lbnRWYWxpZGF0aW9uRXJyb3JbXSAqL1xuICAgIGNvbnN0IGVycm9ycyA9IFtdXG4gICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKGVsdClcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkICYmICFib2R5Q29udGFpbnMoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkKSkge1xuICAgICAgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkID0gbnVsbFxuICAgIH1cblxuICAgIC8vIG9ubHkgdmFsaWRhdGUgd2hlbiBmb3JtIGlzIGRpcmVjdGx5IHN1Ym1pdHRlZCBhbmQgbm92YWxpZGF0ZSBvciBmb3Jtbm92YWxpZGF0ZSBhcmUgbm90IHNldFxuICAgIC8vIG9yIGlmIHRoZSBlbGVtZW50IGhhcyBhbiBleHBsaWNpdCBoeC12YWxpZGF0ZT1cInRydWVcIiBvbiBpdFxuICAgIGxldCB2YWxpZGF0ZSA9IChlbHQgaW5zdGFuY2VvZiBIVE1MRm9ybUVsZW1lbnQgJiYgZWx0Lm5vVmFsaWRhdGUgIT09IHRydWUpIHx8IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXZhbGlkYXRlJykgPT09ICd0cnVlJ1xuICAgIGlmIChpbnRlcm5hbERhdGEubGFzdEJ1dHRvbkNsaWNrZWQpIHtcbiAgICAgIHZhbGlkYXRlID0gdmFsaWRhdGUgJiYgaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkLmZvcm1Ob1ZhbGlkYXRlICE9PSB0cnVlXG4gICAgfVxuXG4gICAgLy8gZm9yIGEgbm9uLUdFVCBpbmNsdWRlIHRoZSBjbG9zZXN0IGZvcm1cbiAgICBpZiAodmVyYiAhPT0gJ2dldCcpIHtcbiAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgcHJpb3JpdHlGb3JtRGF0YSwgZXJyb3JzLCBjbG9zZXN0KGVsdCwgJ2Zvcm0nKSwgdmFsaWRhdGUpXG4gICAgfVxuXG4gICAgLy8gaW5jbHVkZSB0aGUgZWxlbWVudCBpdHNlbGZcbiAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGVsdCwgdmFsaWRhdGUpXG5cbiAgICAvLyBpZiBhIGJ1dHRvbiBvciBzdWJtaXQgd2FzIGNsaWNrZWQgbGFzdCwgaW5jbHVkZSBpdHMgdmFsdWVcbiAgICBpZiAoaW50ZXJuYWxEYXRhLmxhc3RCdXR0b25DbGlja2VkIHx8IGVsdC50YWdOYW1lID09PSAnQlVUVE9OJyB8fFxuICAgIChlbHQudGFnTmFtZSA9PT0gJ0lOUFVUJyAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAndHlwZScpID09PSAnc3VibWl0JykpIHtcbiAgICAgIGNvbnN0IGJ1dHRvbiA9IGludGVybmFsRGF0YS5sYXN0QnV0dG9uQ2xpY2tlZCB8fCAoLyoqIEB0eXBlIEhUTUxJbnB1dEVsZW1lbnR8SFRNTEJ1dHRvbkVsZW1lbnQgKi8oZWx0KSlcbiAgICAgIGNvbnN0IG5hbWUgPSBnZXRSYXdBdHRyaWJ1dGUoYnV0dG9uLCAnbmFtZScpXG4gICAgICBhZGRWYWx1ZVRvRm9ybURhdGEobmFtZSwgYnV0dG9uLnZhbHVlLCBwcmlvcml0eUZvcm1EYXRhKVxuICAgIH1cblxuICAgIC8vIGluY2x1ZGUgYW55IGV4cGxpY2l0IGluY2x1ZGVzXG4gICAgY29uc3QgaW5jbHVkZXMgPSBmaW5kQXR0cmlidXRlVGFyZ2V0cyhlbHQsICdoeC1pbmNsdWRlJylcbiAgICBmb3JFYWNoKGluY2x1ZGVzLCBmdW5jdGlvbihub2RlKSB7XG4gICAgICBwcm9jZXNzSW5wdXRWYWx1ZShwcm9jZXNzZWQsIGZvcm1EYXRhLCBlcnJvcnMsIGFzRWxlbWVudChub2RlKSwgdmFsaWRhdGUpXG4gICAgICAvLyBpZiBhIG5vbi1mb3JtIGlzIGluY2x1ZGVkLCBpbmNsdWRlIGFueSBpbnB1dCB2YWx1ZXMgd2l0aGluIGl0XG4gICAgICBpZiAoIW1hdGNoZXMobm9kZSwgJ2Zvcm0nKSkge1xuICAgICAgICBmb3JFYWNoKGFzUGFyZW50Tm9kZShub2RlKS5xdWVyeVNlbGVjdG9yQWxsKElOUFVUX1NFTEVDVE9SKSwgZnVuY3Rpb24oZGVzY2VuZGFudCkge1xuICAgICAgICAgIHByb2Nlc3NJbnB1dFZhbHVlKHByb2Nlc3NlZCwgZm9ybURhdGEsIGVycm9ycywgZGVzY2VuZGFudCwgdmFsaWRhdGUpXG4gICAgICAgIH0pXG4gICAgICB9XG4gICAgfSlcblxuICAgIC8vIHZhbHVlcyBmcm9tIGEgPGZvcm0+IHRha2UgcHJlY2VkZW5jZSwgb3ZlcnJpZGluZyB0aGUgcmVndWxhciB2YWx1ZXNcbiAgICBvdmVycmlkZUZvcm1EYXRhKGZvcm1EYXRhLCBwcmlvcml0eUZvcm1EYXRhKVxuXG4gICAgcmV0dXJuIHsgZXJyb3JzLCBmb3JtRGF0YSwgdmFsdWVzOiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtzdHJpbmd9IHJldHVyblN0clxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZVxuICAgKiBAcGFyYW0ge2FueX0gcmVhbFZhbHVlXG4gICAqIEByZXR1cm5zIHtzdHJpbmd9XG4gICAqL1xuICBmdW5jdGlvbiBhcHBlbmRQYXJhbShyZXR1cm5TdHIsIG5hbWUsIHJlYWxWYWx1ZSkge1xuICAgIGlmIChyZXR1cm5TdHIgIT09ICcnKSB7XG4gICAgICByZXR1cm5TdHIgKz0gJyYnXG4gICAgfVxuICAgIGlmIChTdHJpbmcocmVhbFZhbHVlKSA9PT0gJ1tvYmplY3QgT2JqZWN0XScpIHtcbiAgICAgIHJlYWxWYWx1ZSA9IEpTT04uc3RyaW5naWZ5KHJlYWxWYWx1ZSlcbiAgICB9XG4gICAgY29uc3QgcyA9IGVuY29kZVVSSUNvbXBvbmVudChyZWFsVmFsdWUpXG4gICAgcmV0dXJuU3RyICs9IGVuY29kZVVSSUNvbXBvbmVudChuYW1lKSArICc9JyArIHNcbiAgICByZXR1cm4gcmV0dXJuU3RyXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YXxPYmplY3R9IHZhbHVlc1xuICAgKiBAcmV0dXJucyBzdHJpbmdcbiAgICovXG4gIGZ1bmN0aW9uIHVybEVuY29kZSh2YWx1ZXMpIHtcbiAgICB2YWx1ZXMgPSBmb3JtRGF0YUZyb21PYmplY3QodmFsdWVzKVxuICAgIGxldCByZXR1cm5TdHIgPSAnJ1xuICAgIHZhbHVlcy5mb3JFYWNoKGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgIHJldHVyblN0ciA9IGFwcGVuZFBhcmFtKHJldHVyblN0ciwga2V5LCB2YWx1ZSlcbiAgICB9KVxuICAgIHJldHVybiByZXR1cm5TdHJcbiAgfVxuXG4gIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gIC8vIEFqYXhcbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0ge0VsZW1lbnR9IHRhcmdldFxuICogQHBhcmFtIHtzdHJpbmd9IHByb21wdFxuICogQHJldHVybnMge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdCkge1xuICAgIC8qKiBAdHlwZSBIdG14SGVhZGVyU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IGhlYWRlcnMgPSB7XG4gICAgICAnSFgtUmVxdWVzdCc6ICd0cnVlJyxcbiAgICAgICdIWC1UcmlnZ2VyJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ2lkJyksXG4gICAgICAnSFgtVHJpZ2dlci1OYW1lJzogZ2V0UmF3QXR0cmlidXRlKGVsdCwgJ25hbWUnKSxcbiAgICAgICdIWC1UYXJnZXQnOiBnZXRBdHRyaWJ1dGVWYWx1ZSh0YXJnZXQsICdpZCcpLFxuICAgICAgJ0hYLUN1cnJlbnQtVVJMJzogZ2V0RG9jdW1lbnQoKS5sb2NhdGlvbi5ocmVmXG4gICAgfVxuICAgIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtaGVhZGVycycsIGZhbHNlLCBoZWFkZXJzKVxuICAgIGlmIChwcm9tcHQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgaGVhZGVyc1snSFgtUHJvbXB0J10gPSBwcm9tcHRcbiAgICB9XG4gICAgaWYgKGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQpIHtcbiAgICAgIGhlYWRlcnNbJ0hYLUJvb3N0ZWQnXSA9ICd0cnVlJ1xuICAgIH1cbiAgICByZXR1cm4gaGVhZGVyc1xuICB9XG5cbiAgLyoqXG4gKiBmaWx0ZXJWYWx1ZXMgdGFrZXMgYW4gb2JqZWN0IGNvbnRhaW5pbmcgZm9ybSBpbnB1dCB2YWx1ZXNcbiAqIGFuZCByZXR1cm5zIGEgbmV3IG9iamVjdCB0aGF0IG9ubHkgY29udGFpbnMga2V5cyB0aGF0IGFyZVxuICogc3BlY2lmaWVkIGJ5IHRoZSBjbG9zZXN0IFwiaHgtcGFyYW1zXCIgYXR0cmlidXRlXG4gKiBAcGFyYW0ge0Zvcm1EYXRhfSBpbnB1dFZhbHVlc1xuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEByZXR1cm5zIHtGb3JtRGF0YX1cbiAqL1xuICBmdW5jdGlvbiBmaWx0ZXJWYWx1ZXMoaW5wdXRWYWx1ZXMsIGVsdCkge1xuICAgIGNvbnN0IHBhcmFtc1ZhbHVlID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXBhcmFtcycpXG4gICAgaWYgKHBhcmFtc1ZhbHVlKSB7XG4gICAgICBpZiAocGFyYW1zVmFsdWUgPT09ICdub25lJykge1xuICAgICAgICByZXR1cm4gbmV3IEZvcm1EYXRhKClcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUgPT09ICcqJykge1xuICAgICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICAgIH0gZWxzZSBpZiAocGFyYW1zVmFsdWUuaW5kZXhPZignbm90ICcpID09PSAwKSB7XG4gICAgICAgIGZvckVhY2gocGFyYW1zVmFsdWUuc3Vic3RyKDQpLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpbnB1dFZhbHVlcy5kZWxldGUobmFtZSlcbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIGlucHV0VmFsdWVzXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCBuZXdWYWx1ZXMgPSBuZXcgRm9ybURhdGEoKVxuICAgICAgICBmb3JFYWNoKHBhcmFtc1ZhbHVlLnNwbGl0KCcsJyksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgICAgICBuYW1lID0gbmFtZS50cmltKClcbiAgICAgICAgICBpZiAoaW5wdXRWYWx1ZXMuaGFzKG5hbWUpKSB7XG4gICAgICAgICAgICBpbnB1dFZhbHVlcy5nZXRBbGwobmFtZSkuZm9yRWFjaChmdW5jdGlvbih2YWx1ZSkgeyBuZXdWYWx1ZXMuYXBwZW5kKG5hbWUsIHZhbHVlKSB9KVxuICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgcmV0dXJuIG5ld1ZhbHVlc1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gaW5wdXRWYWx1ZXNcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIGlzQW5jaG9yTGluayhlbHQpIHtcbiAgICByZXR1cm4gISFnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnaHJlZicpICYmIGdldFJhd0F0dHJpYnV0ZShlbHQsICdocmVmJykuaW5kZXhPZignIycpID49IDBcbiAgfVxuXG4gIC8qKlxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFN3YXBTdHlsZX0gW3N3YXBJbmZvT3ZlcnJpZGVdXG4gKiBAcmV0dXJucyB7SHRteFN3YXBTcGVjaWZpY2F0aW9ufVxuICovXG4gIGZ1bmN0aW9uIGdldFN3YXBTcGVjaWZpY2F0aW9uKGVsdCwgc3dhcEluZm9PdmVycmlkZSkge1xuICAgIGNvbnN0IHN3YXBJbmZvID0gc3dhcEluZm9PdmVycmlkZSB8fCBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtc3dhcCcpXG4gICAgLyoqIEB0eXBlIEh0bXhTd2FwU3BlY2lmaWNhdGlvbiAqL1xuICAgIGNvbnN0IHN3YXBTcGVjID0ge1xuICAgICAgc3dhcFN0eWxlOiBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkID8gJ2lubmVySFRNTCcgOiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcFN0eWxlLFxuICAgICAgc3dhcERlbGF5OiBodG14LmNvbmZpZy5kZWZhdWx0U3dhcERlbGF5LFxuICAgICAgc2V0dGxlRGVsYXk6IGh0bXguY29uZmlnLmRlZmF1bHRTZXR0bGVEZWxheVxuICAgIH1cbiAgICBpZiAoaHRteC5jb25maWcuc2Nyb2xsSW50b1ZpZXdPbkJvb3N0ICYmIGdldEludGVybmFsRGF0YShlbHQpLmJvb3N0ZWQgJiYgIWlzQW5jaG9yTGluayhlbHQpKSB7XG4gICAgICBzd2FwU3BlYy5zaG93ID0gJ3RvcCdcbiAgICB9XG4gICAgaWYgKHN3YXBJbmZvKSB7XG4gICAgICBjb25zdCBzcGxpdCA9IHNwbGl0T25XaGl0ZXNwYWNlKHN3YXBJbmZvKVxuICAgICAgaWYgKHNwbGl0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzcGxpdC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgIGNvbnN0IHZhbHVlID0gc3BsaXRbaV1cbiAgICAgICAgICBpZiAodmFsdWUuaW5kZXhPZignc3dhcDonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuc3dhcERlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNSkpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzZXR0bGU6JykgPT09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnNldHRsZURlbGF5ID0gcGFyc2VJbnRlcnZhbCh2YWx1ZS5zdWJzdHIoNykpXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCd0cmFuc2l0aW9uOicpID09PSAwKSB7XG4gICAgICAgICAgICBzd2FwU3BlYy50cmFuc2l0aW9uID0gdmFsdWUuc3Vic3RyKDExKSA9PT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdpZ25vcmVUaXRsZTonKSA9PT0gMCkge1xuICAgICAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSB2YWx1ZS5zdWJzdHIoMTIpID09PSAndHJ1ZSdcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ3Njcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsU3BlYyA9IHZhbHVlLnN1YnN0cig3KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNjcm9sbFNwZWMuc3BsaXQoJzonKVxuICAgICAgICAgICAgY29uc3Qgc2Nyb2xsVmFsID0gc3BsaXRTcGVjLnBvcCgpXG4gICAgICAgICAgICB2YXIgc2VsZWN0b3JWYWwgPSBzcGxpdFNwZWMubGVuZ3RoID4gMCA/IHNwbGl0U3BlYy5qb2luKCc6JykgOiBudWxsXG4gICAgICAgICAgICAvLyBAdHMtaWdub3JlXG4gICAgICAgICAgICBzd2FwU3BlYy5zY3JvbGwgPSBzY3JvbGxWYWxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNjcm9sbFRhcmdldCA9IHNlbGVjdG9yVmFsXG4gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCdzaG93OicpID09PSAwKSB7XG4gICAgICAgICAgICBjb25zdCBzaG93U3BlYyA9IHZhbHVlLnN1YnN0cig1KVxuICAgICAgICAgICAgdmFyIHNwbGl0U3BlYyA9IHNob3dTcGVjLnNwbGl0KCc6JylcbiAgICAgICAgICAgIGNvbnN0IHNob3dWYWwgPSBzcGxpdFNwZWMucG9wKClcbiAgICAgICAgICAgIHZhciBzZWxlY3RvclZhbCA9IHNwbGl0U3BlYy5sZW5ndGggPiAwID8gc3BsaXRTcGVjLmpvaW4oJzonKSA6IG51bGxcbiAgICAgICAgICAgIHN3YXBTcGVjLnNob3cgPSBzaG93VmFsXG4gICAgICAgICAgICBzd2FwU3BlYy5zaG93VGFyZ2V0ID0gc2VsZWN0b3JWYWxcbiAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLmluZGV4T2YoJ2ZvY3VzLXNjcm9sbDonKSA9PT0gMCkge1xuICAgICAgICAgICAgY29uc3QgZm9jdXNTY3JvbGxWYWwgPSB2YWx1ZS5zdWJzdHIoJ2ZvY3VzLXNjcm9sbDonLmxlbmd0aClcbiAgICAgICAgICAgIHN3YXBTcGVjLmZvY3VzU2Nyb2xsID0gZm9jdXNTY3JvbGxWYWwgPT0gJ3RydWUnXG4gICAgICAgICAgfSBlbHNlIGlmIChpID09IDApIHtcbiAgICAgICAgICAgIHN3YXBTcGVjLnN3YXBTdHlsZSA9IHZhbHVlXG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZ0Vycm9yKCdVbmtub3duIG1vZGlmaWVyIGluIGh4LXN3YXA6ICcgKyB2YWx1ZSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHN3YXBTcGVjXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHVzZXNGb3JtRGF0YShlbHQpIHtcbiAgICByZXR1cm4gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWVuY29kaW5nJykgPT09ICdtdWx0aXBhcnQvZm9ybS1kYXRhJyB8fFxuICAgIChtYXRjaGVzKGVsdCwgJ2Zvcm0nKSAmJiBnZXRSYXdBdHRyaWJ1dGUoZWx0LCAnZW5jdHlwZScpID09PSAnbXVsdGlwYXJ0L2Zvcm0tZGF0YScpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZpbHRlcmVkUGFyYW1ldGVyc1xuICAgKiBAcmV0dXJucyB7KnxzdHJpbmd8bnVsbH1cbiAgICovXG4gIGZ1bmN0aW9uIGVuY29kZVBhcmFtc0ZvckJvZHkoeGhyLCBlbHQsIGZpbHRlcmVkUGFyYW1ldGVycykge1xuICAgIGxldCBlbmNvZGVkUGFyYW1ldGVycyA9IG51bGxcbiAgICB3aXRoRXh0ZW5zaW9ucyhlbHQsIGZ1bmN0aW9uKGV4dGVuc2lvbikge1xuICAgICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzID09IG51bGwpIHtcbiAgICAgICAgZW5jb2RlZFBhcmFtZXRlcnMgPSBleHRlbnNpb24uZW5jb2RlUGFyYW1ldGVycyh4aHIsIGZpbHRlcmVkUGFyYW1ldGVycywgZWx0KVxuICAgICAgfVxuICAgIH0pXG4gICAgaWYgKGVuY29kZWRQYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgIHJldHVybiBlbmNvZGVkUGFyYW1ldGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBpZiAodXNlc0Zvcm1EYXRhKGVsdCkpIHtcbiAgICAgICAgLy8gRm9yY2UgY29udmVyc2lvbiB0byBhbiBhY3R1YWwgRm9ybURhdGEgb2JqZWN0IGluIGNhc2UgZmlsdGVyZWRQYXJhbWV0ZXJzIGlzIGEgZm9ybURhdGFQcm94eVxuICAgICAgICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ3NreXNvZnR3YXJlL2h0bXgvaXNzdWVzLzIzMTdcbiAgICAgICAgcmV0dXJuIG92ZXJyaWRlRm9ybURhdGEobmV3IEZvcm1EYXRhKCksIGZvcm1EYXRhRnJvbU9iamVjdChmaWx0ZXJlZFBhcmFtZXRlcnMpKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHVybEVuY29kZShmaWx0ZXJlZFBhcmFtZXRlcnMpXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKlxuICogQHBhcmFtIHtFbGVtZW50fSB0YXJnZXRcbiAqIEByZXR1cm5zIHtIdG14U2V0dGxlSW5mb31cbiAqL1xuICBmdW5jdGlvbiBtYWtlU2V0dGxlSW5mbyh0YXJnZXQpIHtcbiAgICByZXR1cm4geyB0YXNrczogW10sIGVsdHM6IFt0YXJnZXRdIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnRbXX0gY29udGVudFxuICAgKiBAcGFyYW0ge0h0bXhTd2FwU3BlY2lmaWNhdGlvbn0gc3dhcFNwZWNcbiAgICovXG4gIGZ1bmN0aW9uIHVwZGF0ZVNjcm9sbFN0YXRlKGNvbnRlbnQsIHN3YXBTcGVjKSB7XG4gICAgY29uc3QgZmlyc3QgPSBjb250ZW50WzBdXG4gICAgY29uc3QgbGFzdCA9IGNvbnRlbnRbY29udGVudC5sZW5ndGggLSAxXVxuICAgIGlmIChzd2FwU3BlYy5zY3JvbGwpIHtcbiAgICAgIHZhciB0YXJnZXQgPSBudWxsXG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsVGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGZpcnN0LCBzd2FwU3BlYy5zY3JvbGxUYXJnZXQpKVxuICAgICAgfVxuICAgICAgaWYgKHN3YXBTcGVjLnNjcm9sbCA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSAwXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2Nyb2xsID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIHRhcmdldC5zY3JvbGxUb3AgPSB0YXJnZXQuc2Nyb2xsSGVpZ2h0XG4gICAgICB9XG4gICAgfVxuICAgIGlmIChzd2FwU3BlYy5zaG93KSB7XG4gICAgICB2YXIgdGFyZ2V0ID0gbnVsbFxuICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQpIHtcbiAgICAgICAgbGV0IHRhcmdldFN0ciA9IHN3YXBTcGVjLnNob3dUYXJnZXRcbiAgICAgICAgaWYgKHN3YXBTcGVjLnNob3dUYXJnZXQgPT09ICd3aW5kb3cnKSB7XG4gICAgICAgICAgdGFyZ2V0U3RyID0gJ2JvZHknXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0ID0gYXNFbGVtZW50KHF1ZXJ5U2VsZWN0b3JFeHQoZmlyc3QsIHRhcmdldFN0cikpXG4gICAgICB9XG4gICAgICBpZiAoc3dhcFNwZWMuc2hvdyA9PT0gJ3RvcCcgJiYgKGZpcnN0IHx8IHRhcmdldCkpIHtcbiAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0IHx8IGZpcnN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnc3RhcnQnLCBiZWhhdmlvcjogaHRteC5jb25maWcuc2Nyb2xsQmVoYXZpb3IgfSlcbiAgICAgIH1cbiAgICAgIGlmIChzd2FwU3BlYy5zaG93ID09PSAnYm90dG9tJyAmJiAobGFzdCB8fCB0YXJnZXQpKSB7XG4gICAgICAgIHRhcmdldCA9IHRhcmdldCB8fCBsYXN0XG4gICAgICAgIC8vIEB0cy1pZ25vcmUgRm9yIHNvbWUgcmVhc29uIHRzYyBkb2Vzbid0IHJlY29nbml6ZSBcImluc3RhbnRcIiBhcyBhIHZhbGlkIG9wdGlvbiBmb3Igbm93XG4gICAgICAgIHRhcmdldC5zY3JvbGxJbnRvVmlldyh7IGJsb2NrOiAnZW5kJywgYmVoYXZpb3I6IGh0bXguY29uZmlnLnNjcm9sbEJlaGF2aW9yIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHBhcmFtIHtzdHJpbmd9IGF0dHJcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IGV2YWxBc0RlZmF1bHRcbiAqIEBwYXJhbSB7T2JqZWN0PX0gdmFsdWVzXG4gKiBAcmV0dXJucyB7T2JqZWN0fVxuICovXG4gIGZ1bmN0aW9uIGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCBhdHRyLCBldmFsQXNEZWZhdWx0LCB2YWx1ZXMpIHtcbiAgICBpZiAodmFsdWVzID09IG51bGwpIHtcbiAgICAgIHZhbHVlcyA9IHt9XG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuIHZhbHVlc1xuICAgIH1cbiAgICBjb25zdCBhdHRyaWJ1dGVWYWx1ZSA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgYXR0cilcbiAgICBpZiAoYXR0cmlidXRlVmFsdWUpIHtcbiAgICAgIGxldCBzdHIgPSBhdHRyaWJ1dGVWYWx1ZS50cmltKClcbiAgICAgIGxldCBldmFsdWF0ZVZhbHVlID0gZXZhbEFzRGVmYXVsdFxuICAgICAgaWYgKHN0ciA9PT0gJ3Vuc2V0Jykge1xuICAgICAgICByZXR1cm4gbnVsbFxuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdqYXZhc2NyaXB0OicpID09PSAwKSB7XG4gICAgICAgIHN0ciA9IHN0ci5zdWJzdHIoMTEpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9IGVsc2UgaWYgKHN0ci5pbmRleE9mKCdqczonKSA9PT0gMCkge1xuICAgICAgICBzdHIgPSBzdHIuc3Vic3RyKDMpXG4gICAgICAgIGV2YWx1YXRlVmFsdWUgPSB0cnVlXG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ3snKSAhPT0gMCkge1xuICAgICAgICBzdHIgPSAneycgKyBzdHIgKyAnfSdcbiAgICAgIH1cbiAgICAgIGxldCB2YXJzVmFsdWVzXG4gICAgICBpZiAoZXZhbHVhdGVWYWx1ZSkge1xuICAgICAgICB2YXJzVmFsdWVzID0gbWF5YmVFdmFsKGVsdCwgZnVuY3Rpb24oKSB7IHJldHVybiBGdW5jdGlvbigncmV0dXJuICgnICsgc3RyICsgJyknKSgpIH0sIHt9KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyc1ZhbHVlcyA9IHBhcnNlSlNPTihzdHIpXG4gICAgICB9XG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiB2YXJzVmFsdWVzKSB7XG4gICAgICAgIGlmICh2YXJzVmFsdWVzLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICBpZiAodmFsdWVzW2tleV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgdmFsdWVzW2tleV0gPSB2YXJzVmFsdWVzW2tleV1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGdldFZhbHVlc0ZvckVsZW1lbnQoYXNFbGVtZW50KHBhcmVudEVsdChlbHQpKSwgYXR0ciwgZXZhbEFzRGVmYXVsdCwgdmFsdWVzKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RXZlbnRUYXJnZXR8c3RyaW5nfSBlbHRcbiAgICogQHBhcmFtIHsoKSA9PiBhbnl9IHRvRXZhbFxuICAgKiBAcGFyYW0ge2FueT19IGRlZmF1bHRWYWxcbiAgICogQHJldHVybnMge2FueX1cbiAgICovXG4gIGZ1bmN0aW9uIG1heWJlRXZhbChlbHQsIHRvRXZhbCwgZGVmYXVsdFZhbCkge1xuICAgIGlmIChodG14LmNvbmZpZy5hbGxvd0V2YWwpIHtcbiAgICAgIHJldHVybiB0b0V2YWwoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmV2YWxEaXNhbGxvd2VkRXJyb3InKVxuICAgICAgcmV0dXJuIGRlZmF1bHRWYWxcbiAgICB9XG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhcnNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YXJzJywgdHJ1ZSwgZXhwcmVzc2lvblZhcnMpXG4gIH1cblxuICAvKipcbiAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gKiBAcGFyYW0geyo/fSBleHByZXNzaW9uVmFyc1xuICogQHJldHVybnNcbiAqL1xuICBmdW5jdGlvbiBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCwgZXhwcmVzc2lvblZhcnMpIHtcbiAgICByZXR1cm4gZ2V0VmFsdWVzRm9yRWxlbWVudChlbHQsICdoeC12YWxzJywgZmFsc2UsIGV4cHJlc3Npb25WYXJzKVxuICB9XG5cbiAgLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICogQHJldHVybnMge0Zvcm1EYXRhfVxuICovXG4gIGZ1bmN0aW9uIGdldEV4cHJlc3Npb25WYXJzKGVsdCkge1xuICAgIHJldHVybiBtZXJnZU9iamVjdHMoZ2V0SFhWYXJzRm9yRWxlbWVudChlbHQpLCBnZXRIWFZhbHNGb3JFbGVtZW50KGVsdCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBoZWFkZXJcbiAgICogQHBhcmFtIHtzdHJpbmd8bnVsbH0gaGVhZGVyVmFsdWVcbiAgICovXG4gIGZ1bmN0aW9uIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSkge1xuICAgIGlmIChoZWFkZXJWYWx1ZSAhPT0gbnVsbCkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIC8vIE9uIGFuIGV4Y2VwdGlvbiwgdHJ5IHRvIHNldCB0aGUgaGVhZGVyIFVSSSBlbmNvZGVkIGluc3RlYWRcbiAgICAgICAgeGhyLnNldFJlcXVlc3RIZWFkZXIoaGVhZGVyLCBlbmNvZGVVUklDb21wb25lbnQoaGVhZGVyVmFsdWUpKVxuICAgICAgICB4aHIuc2V0UmVxdWVzdEhlYWRlcihoZWFkZXIgKyAnLVVSSS1BdXRvRW5jb2RlZCcsICd0cnVlJylcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge3N0cmluZ31cbiAgICovXG4gIGZ1bmN0aW9uIGdldFBhdGhGcm9tUmVzcG9uc2UoeGhyKSB7XG4gIC8vIE5COiBJRTExIGRvZXMgbm90IHN1cHBvcnQgdGhpcyBzdHVmZlxuICAgIGlmICh4aHIucmVzcG9uc2VVUkwgJiYgdHlwZW9mIChVUkwpICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgdXJsID0gbmV3IFVSTCh4aHIucmVzcG9uc2VVUkwpXG4gICAgICAgIHJldHVybiB1cmwucGF0aG5hbWUgKyB1cmwuc2VhcmNoXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6YmFkUmVzcG9uc2VVcmwnLCB7IHVybDogeGhyLnJlc3BvbnNlVVJMIH0pXG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7WE1MSHR0cFJlcXVlc3R9IHhoclxuICAgKiBAcGFyYW0ge1JlZ0V4cH0gcmVnZXhwXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBoYXNIZWFkZXIoeGhyLCByZWdleHApIHtcbiAgICByZXR1cm4gcmVnZXhwLnRlc3QoeGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKVxuICB9XG5cbiAgLyoqXG4gICAqIElzc3VlcyBhbiBodG14LXN0eWxlIEFKQVggcmVxdWVzdFxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNhamF4XG4gICAqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGggdGhlIFVSTCBwYXRoIHRvIG1ha2UgdGhlIEFKQVhcbiAgICogQHBhcmFtIHtFbGVtZW50fHN0cmluZ3xIdG14QWpheEhlbHBlckNvbnRleHR9IGNvbnRleHQgdGhlIGVsZW1lbnQgdG8gdGFyZ2V0IChkZWZhdWx0cyB0byB0aGUgKipib2R5KiopIHwgYSBzZWxlY3RvciBmb3IgdGhlIHRhcmdldCB8IGEgY29udGV4dCBvYmplY3QgdGhhdCBjb250YWlucyBhbnkgb2YgdGhlIGZvbGxvd2luZ1xuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgaW1tZWRpYXRlbHkgaWYgbm8gcmVxdWVzdCBpcyBzZW50LCBvciB3aGVuIHRoZSByZXF1ZXN0IGlzIGNvbXBsZXRlXG4gICAqL1xuICBmdW5jdGlvbiBhamF4SGVscGVyKHZlcmIsIHBhdGgsIGNvbnRleHQpIHtcbiAgICB2ZXJiID0gKC8qKiBAdHlwZSBIdHRwVmVyYiAqLyh2ZXJiLnRvTG93ZXJDYXNlKCkpKVxuICAgIGlmIChjb250ZXh0KSB7XG4gICAgICBpZiAoY29udGV4dCBpbnN0YW5jZW9mIEVsZW1lbnQgfHwgdHlwZW9mIGNvbnRleHQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgICB0YXJnZXRPdmVycmlkZTogcmVzb2x2ZVRhcmdldChjb250ZXh0KSxcbiAgICAgICAgICByZXR1cm5Qcm9taXNlOiB0cnVlXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCByZXNvbHZlVGFyZ2V0KGNvbnRleHQuc291cmNlKSwgY29udGV4dC5ldmVudCxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBoYW5kbGVyOiBjb250ZXh0LmhhbmRsZXIsXG4gICAgICAgICAgICBoZWFkZXJzOiBjb250ZXh0LmhlYWRlcnMsXG4gICAgICAgICAgICB2YWx1ZXM6IGNvbnRleHQudmFsdWVzLFxuICAgICAgICAgICAgdGFyZ2V0T3ZlcnJpZGU6IHJlc29sdmVUYXJnZXQoY29udGV4dC50YXJnZXQpLFxuICAgICAgICAgICAgc3dhcE92ZXJyaWRlOiBjb250ZXh0LnN3YXAsXG4gICAgICAgICAgICBzZWxlY3Q6IGNvbnRleHQuc2VsZWN0LFxuICAgICAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgICAgIH0pXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIG51bGwsIG51bGwsIHtcbiAgICAgICAgcmV0dXJuUHJvbWlzZTogdHJ1ZVxuICAgICAgfSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHJldHVybiB7RWxlbWVudFtdfVxuICAgKi9cbiAgZnVuY3Rpb24gaGllcmFyY2h5Rm9yRWx0KGVsdCkge1xuICAgIGNvbnN0IGFyciA9IFtdXG4gICAgd2hpbGUgKGVsdCkge1xuICAgICAgYXJyLnB1c2goZWx0KVxuICAgICAgZWx0ID0gZWx0LnBhcmVudEVsZW1lbnRcbiAgICB9XG4gICAgcmV0dXJuIGFyclxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7RWxlbWVudH0gZWx0XG4gICAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoXG4gICAqIEBwYXJhbSB7SHRteFJlcXVlc3RDb25maWd9IHJlcXVlc3RDb25maWdcbiAgICogQHJldHVybiB7Ym9vbGVhbn1cbiAgICovXG4gIGZ1bmN0aW9uIHZlcmlmeVBhdGgoZWx0LCBwYXRoLCByZXF1ZXN0Q29uZmlnKSB7XG4gICAgbGV0IHNhbWVIb3N0XG4gICAgbGV0IHVybFxuICAgIGlmICh0eXBlb2YgVVJMID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB1cmwgPSBuZXcgVVJMKHBhdGgsIGRvY3VtZW50LmxvY2F0aW9uLmhyZWYpXG4gICAgICBjb25zdCBvcmlnaW4gPSBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW5cbiAgICAgIHNhbWVIb3N0ID0gb3JpZ2luID09PSB1cmwub3JpZ2luXG4gICAgfSBlbHNlIHtcbiAgICAvLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBVUkxcbiAgICAgIHVybCA9IHBhdGhcbiAgICAgIHNhbWVIb3N0ID0gc3RhcnRzV2l0aChwYXRoLCBkb2N1bWVudC5sb2NhdGlvbi5vcmlnaW4pXG4gICAgfVxuXG4gICAgaWYgKGh0bXguY29uZmlnLnNlbGZSZXF1ZXN0c09ubHkpIHtcbiAgICAgIGlmICghc2FtZUhvc3QpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0ZVVybCcsIG1lcmdlT2JqZWN0cyh7IHVybCwgc2FtZUhvc3QgfSwgcmVxdWVzdENvbmZpZykpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtPYmplY3R8Rm9ybURhdGF9IG9ialxuICAgKiBAcmV0dXJuIHtGb3JtRGF0YX1cbiAgICovXG4gIGZ1bmN0aW9uIGZvcm1EYXRhRnJvbU9iamVjdChvYmopIHtcbiAgICBpZiAob2JqIGluc3RhbmNlb2YgRm9ybURhdGEpIHJldHVybiBvYmpcbiAgICBjb25zdCBmb3JtRGF0YSA9IG5ldyBGb3JtRGF0YSgpXG4gICAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAob2JqLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpba2V5XS5mb3JFYWNoID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgb2JqW2tleV0uZm9yRWFjaChmdW5jdGlvbih2KSB7IGZvcm1EYXRhLmFwcGVuZChrZXksIHYpIH0pXG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIG9ialtrZXldID09PSAnb2JqZWN0JyAmJiAhKG9ialtrZXldIGluc3RhbmNlb2YgQmxvYikpIHtcbiAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQoa2V5LCBKU09OLnN0cmluZ2lmeShvYmpba2V5XSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9ybURhdGEuYXBwZW5kKGtleSwgb2JqW2tleV0pXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGZvcm1EYXRhXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtGb3JtRGF0YX0gZm9ybURhdGFcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICogQHBhcmFtIHtBcnJheX0gYXJyYXlcbiAgICogQHJldHVybnMge0FycmF5fVxuICAgKi9cbiAgZnVuY3Rpb24gZm9ybURhdGFBcnJheVByb3h5KGZvcm1EYXRhLCBuYW1lLCBhcnJheSkge1xuICAgIC8vIG11dGF0aW5nIHRoZSBhcnJheSBzaG91bGQgbXV0YXRlIHRoZSB1bmRlcmx5aW5nIGZvcm0gZGF0YVxuICAgIHJldHVybiBuZXcgUHJveHkoYXJyYXksIHtcbiAgICAgIGdldDogZnVuY3Rpb24odGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBrZXkgPT09ICdudW1iZXInKSByZXR1cm4gdGFyZ2V0W2tleV1cbiAgICAgICAgaWYgKGtleSA9PT0gJ2xlbmd0aCcpIHJldHVybiB0YXJnZXQubGVuZ3RoXG4gICAgICAgIGlmIChrZXkgPT09ICdwdXNoJykge1xuICAgICAgICAgIHJldHVybiBmdW5jdGlvbih2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0LnB1c2godmFsdWUpXG4gICAgICAgICAgICBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdmFsdWUpXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0eXBlb2YgdGFyZ2V0W2tleV0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0YXJnZXRba2V5XS5hcHBseSh0YXJnZXQsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIGZvcm1EYXRhLmRlbGV0ZShuYW1lKVxuICAgICAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGFyZ2V0W2tleV0gJiYgdGFyZ2V0W2tleV0ubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldWzBdXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIHRhcmdldFtrZXldXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICBzZXQ6IGZ1bmN0aW9uKHRhcmdldCwgaW5kZXgsIHZhbHVlKSB7XG4gICAgICAgIHRhcmdldFtpbmRleF0gPSB2YWx1ZVxuICAgICAgICBmb3JtRGF0YS5kZWxldGUobmFtZSlcbiAgICAgICAgdGFyZ2V0LmZvckVhY2goZnVuY3Rpb24odikgeyBmb3JtRGF0YS5hcHBlbmQobmFtZSwgdikgfSlcbiAgICAgICAgcmV0dXJuIHRydWVcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gICAqIEByZXR1cm5zIHtPYmplY3R9XG4gICAqL1xuICBmdW5jdGlvbiBmb3JtRGF0YVByb3h5KGZvcm1EYXRhKSB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmb3JtRGF0YSwge1xuICAgICAgZ2V0OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3ltYm9sJykge1xuICAgICAgICAgIC8vIEZvcndhcmQgc3ltYm9sIGNhbGxzIHRvIHRoZSBGb3JtRGF0YSBpdHNlbGYgZGlyZWN0bHlcbiAgICAgICAgICByZXR1cm4gUmVmbGVjdC5nZXQodGFyZ2V0LCBuYW1lKVxuICAgICAgICB9XG4gICAgICAgIGlmIChuYW1lID09PSAndG9KU09OJykge1xuICAgICAgICAgIC8vIFN1cHBvcnQgSlNPTi5zdHJpbmdpZnkgY2FsbCBvbiBwcm94eVxuICAgICAgICAgIHJldHVybiAoKSA9PiBPYmplY3QuZnJvbUVudHJpZXMoZm9ybURhdGEpXG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5hbWUgaW4gdGFyZ2V0KSB7XG4gICAgICAgICAgLy8gV3JhcCBpbiBmdW5jdGlvbiB3aXRoIGFwcGx5IHRvIGNvcnJlY3RseSBiaW5kIHRoZSBGb3JtRGF0YSBjb250ZXh0LCBhcyBhIGRpcmVjdCBjYWxsIHdvdWxkIHJlc3VsdCBpbiBhbiBpbGxlZ2FsIGludm9jYXRpb24gZXJyb3JcbiAgICAgICAgICBpZiAodHlwZW9mIHRhcmdldFtuYW1lXSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICByZXR1cm4gZm9ybURhdGFbbmFtZV0uYXBwbHkoZm9ybURhdGEsIGFyZ3VtZW50cylcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRhcmdldFtuYW1lXVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhcnJheSA9IGZvcm1EYXRhLmdldEFsbChuYW1lKVxuICAgICAgICAvLyBUaG9zZSAyIHVuZGVmaW5lZCAmIHNpbmdsZSB2YWx1ZSByZXR1cm5zIGFyZSBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSBhcyB3ZSB3ZXJlbid0IHVzaW5nIEZvcm1EYXRhIGJlZm9yZVxuICAgICAgICBpZiAoYXJyYXkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZFxuICAgICAgICB9IGVsc2UgaWYgKGFycmF5Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgIHJldHVybiBhcnJheVswXVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHJldHVybiBmb3JtRGF0YUFycmF5UHJveHkodGFyZ2V0LCBuYW1lLCBhcnJheSlcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIHNldDogZnVuY3Rpb24odGFyZ2V0LCBuYW1lLCB2YWx1ZSkge1xuICAgICAgICBpZiAodHlwZW9mIG5hbWUgIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgcmV0dXJuIGZhbHNlXG4gICAgICAgIH1cbiAgICAgICAgdGFyZ2V0LmRlbGV0ZShuYW1lKVxuICAgICAgICBpZiAodHlwZW9mIHZhbHVlLmZvckVhY2ggPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICB2YWx1ZS5mb3JFYWNoKGZ1bmN0aW9uKHYpIHsgdGFyZ2V0LmFwcGVuZChuYW1lLCB2KSB9KVxuICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCcgJiYgISh2YWx1ZSBpbnN0YW5jZW9mIEJsb2IpKSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCBKU09OLnN0cmluZ2lmeSh2YWx1ZSkpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGFyZ2V0LmFwcGVuZChuYW1lLCB2YWx1ZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIGRlbGV0ZVByb3BlcnR5OiBmdW5jdGlvbih0YXJnZXQsIG5hbWUpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBuYW1lID09PSAnc3RyaW5nJykge1xuICAgICAgICAgIHRhcmdldC5kZWxldGUobmFtZSlcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfSxcbiAgICAgIC8vIFN1cHBvcnQgT2JqZWN0LmFzc2lnbiBjYWxsIGZyb20gcHJveHlcbiAgICAgIG93bktleXM6IGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICByZXR1cm4gUmVmbGVjdC5vd25LZXlzKE9iamVjdC5mcm9tRW50cmllcyh0YXJnZXQpKVxuICAgICAgfSxcbiAgICAgIGdldE93blByb3BlcnR5RGVzY3JpcHRvcjogZnVuY3Rpb24odGFyZ2V0LCBwcm9wKSB7XG4gICAgICAgIHJldHVybiBSZWZsZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihPYmplY3QuZnJvbUVudHJpZXModGFyZ2V0KSwgcHJvcClcbiAgICAgIH1cbiAgICB9KVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7SHR0cFZlcmJ9IHZlcmJcbiAgICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtFdmVudH0gZXZlbnRcbiAgICogQHBhcmFtIHtIdG14QWpheEV0Y30gW2V0Y11cbiAgICogQHBhcmFtIHtib29sZWFufSBbY29uZmlybWVkXVxuICAgKiBAcmV0dXJuIHtQcm9taXNlPHZvaWQ+fVxuICAgKi9cbiAgZnVuY3Rpb24gaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMsIGNvbmZpcm1lZCkge1xuICAgIGxldCByZXNvbHZlID0gbnVsbFxuICAgIGxldCByZWplY3QgPSBudWxsXG4gICAgZXRjID0gZXRjICE9IG51bGwgPyBldGMgOiB7fVxuICAgIGlmIChldGMucmV0dXJuUHJvbWlzZSAmJiB0eXBlb2YgUHJvbWlzZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoZnVuY3Rpb24oX3Jlc29sdmUsIF9yZWplY3QpIHtcbiAgICAgICAgcmVzb2x2ZSA9IF9yZXNvbHZlXG4gICAgICAgIHJlamVjdCA9IF9yZWplY3RcbiAgICAgIH0pXG4gICAgfVxuICAgIGlmIChlbHQgPT0gbnVsbCkge1xuICAgICAgZWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgfVxuICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IGV0Yy5oYW5kbGVyIHx8IGhhbmRsZUFqYXhSZXNwb25zZVxuICAgIGNvbnN0IHNlbGVjdCA9IGV0Yy5zZWxlY3QgfHwgbnVsbFxuXG4gICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgIC8vIGRvIG5vdCBpc3N1ZSByZXF1ZXN0cyBmb3IgZWxlbWVudHMgcmVtb3ZlZCBmcm9tIHRoZSBET01cbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgY29uc3QgdGFyZ2V0ID0gZXRjLnRhcmdldE92ZXJyaWRlIHx8IGFzRWxlbWVudChnZXRUYXJnZXQoZWx0KSlcbiAgICBpZiAodGFyZ2V0ID09IG51bGwgfHwgdGFyZ2V0ID09IERVTU1ZX0VMVCkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDp0YXJnZXRFcnJvcicsIHsgdGFyZ2V0OiBnZXRBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC10YXJnZXQnKSB9KVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgbGV0IGVsdERhdGEgPSBnZXRJbnRlcm5hbERhdGEoZWx0KVxuICAgIGNvbnN0IHN1Ym1pdHRlciA9IGVsdERhdGEubGFzdEJ1dHRvbkNsaWNrZWRcblxuICAgIGlmIChzdWJtaXR0ZXIpIHtcbiAgICAgIGNvbnN0IGJ1dHRvblBhdGggPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybWFjdGlvbicpXG4gICAgICBpZiAoYnV0dG9uUGF0aCAhPSBudWxsKSB7XG4gICAgICAgIHBhdGggPSBidXR0b25QYXRoXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGJ1dHRvblZlcmIgPSBnZXRSYXdBdHRyaWJ1dGUoc3VibWl0dGVyLCAnZm9ybW1ldGhvZCcpXG4gICAgICBpZiAoYnV0dG9uVmVyYiAhPSBudWxsKSB7XG4gICAgICAvLyBpZ25vcmUgYnV0dG9ucyB3aXRoIGZvcm1tZXRob2Q9XCJkaWFsb2dcIlxuICAgICAgICBpZiAoYnV0dG9uVmVyYi50b0xvd2VyQ2FzZSgpICE9PSAnZGlhbG9nJykge1xuICAgICAgICAgIHZlcmIgPSAoLyoqIEB0eXBlIEh0dHBWZXJiICovKGJ1dHRvblZlcmIpKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY29uc3QgY29uZmlybVF1ZXN0aW9uID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWNvbmZpcm0nKVxuICAgIC8vIGFsbG93IGV2ZW50LWJhc2VkIGNvbmZpcm1hdGlvbiB3LyBhIGNhbGxiYWNrXG4gICAgaWYgKGNvbmZpcm1lZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICBjb25zdCBpc3N1ZVJlcXVlc3QgPSBmdW5jdGlvbihza2lwQ29uZmlybWF0aW9uKSB7XG4gICAgICAgIHJldHVybiBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YywgISFza2lwQ29uZmlybWF0aW9uKVxuICAgICAgfVxuICAgICAgY29uc3QgY29uZmlybURldGFpbHMgPSB7IHRhcmdldCwgZWx0LCBwYXRoLCB2ZXJiLCB0cmlnZ2VyaW5nRXZlbnQ6IGV2ZW50LCBldGMsIGlzc3VlUmVxdWVzdCwgcXVlc3Rpb246IGNvbmZpcm1RdWVzdGlvbiB9XG4gICAgICBpZiAodHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6Y29uZmlybScsIGNvbmZpcm1EZXRhaWxzKSA9PT0gZmFsc2UpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IHN5bmNFbHQgPSBlbHRcbiAgICBsZXQgc3luY1N0cmF0ZWd5ID0gZ2V0Q2xvc2VzdEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LXN5bmMnKVxuICAgIGxldCBxdWV1ZVN0cmF0ZWd5ID0gbnVsbFxuICAgIGxldCBhYm9ydGFibGUgPSBmYWxzZVxuICAgIGlmIChzeW5jU3RyYXRlZ3kpIHtcbiAgICAgIGNvbnN0IHN5bmNTdHJpbmdzID0gc3luY1N0cmF0ZWd5LnNwbGl0KCc6JylcbiAgICAgIGNvbnN0IHNlbGVjdG9yID0gc3luY1N0cmluZ3NbMF0udHJpbSgpXG4gICAgICBpZiAoc2VsZWN0b3IgPT09ICd0aGlzJykge1xuICAgICAgICBzeW5jRWx0ID0gZmluZFRoaXNFbGVtZW50KGVsdCwgJ2h4LXN5bmMnKVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3luY0VsdCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgc2VsZWN0b3IpKVxuICAgICAgfVxuICAgICAgLy8gZGVmYXVsdCB0byB0aGUgZHJvcCBzdHJhdGVneVxuICAgICAgc3luY1N0cmF0ZWd5ID0gKHN5bmNTdHJpbmdzWzFdIHx8ICdkcm9wJykudHJpbSgpXG4gICAgICBlbHREYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHN5bmNFbHQpXG4gICAgICBpZiAoc3luY1N0cmF0ZWd5ID09PSAnZHJvcCcgJiYgZWx0RGF0YS54aHIgJiYgZWx0RGF0YS5hYm9ydGFibGUgIT09IHRydWUpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIHJldHVybiBwcm9taXNlXG4gICAgICB9IGVsc2UgaWYgKHN5bmNTdHJhdGVneSA9PT0gJ2Fib3J0Jykge1xuICAgICAgICBpZiAoZWx0RGF0YS54aHIpIHtcbiAgICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGFib3J0YWJsZSA9IHRydWVcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kgPT09ICdyZXBsYWNlJykge1xuICAgICAgICB0cmlnZ2VyRXZlbnQoc3luY0VsdCwgJ2h0bXg6YWJvcnQnKSAvLyBhYm9ydCB0aGUgY3VycmVudCByZXF1ZXN0IGFuZCBjb250aW51ZVxuICAgICAgfSBlbHNlIGlmIChzeW5jU3RyYXRlZ3kuaW5kZXhPZigncXVldWUnKSA9PT0gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZVN0ckFycmF5ID0gc3luY1N0cmF0ZWd5LnNwbGl0KCcgJylcbiAgICAgICAgcXVldWVTdHJhdGVneSA9IChxdWV1ZVN0ckFycmF5WzFdIHx8ICdsYXN0JykudHJpbSgpXG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVsdERhdGEueGhyKSB7XG4gICAgICBpZiAoZWx0RGF0YS5hYm9ydGFibGUpIHtcbiAgICAgICAgdHJpZ2dlckV2ZW50KHN5bmNFbHQsICdodG14OmFib3J0JykgLy8gYWJvcnQgdGhlIGN1cnJlbnQgcmVxdWVzdCBhbmQgY29udGludWVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICBpZiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50RGF0YSA9IGdldEludGVybmFsRGF0YShldmVudClcbiAgICAgICAgICAgIGlmIChldmVudERhdGEgJiYgZXZlbnREYXRhLnRyaWdnZXJTcGVjICYmIGV2ZW50RGF0YS50cmlnZ2VyU3BlYy5xdWV1ZSkge1xuICAgICAgICAgICAgICBxdWV1ZVN0cmF0ZWd5ID0gZXZlbnREYXRhLnRyaWdnZXJTcGVjLnF1ZXVlXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09IG51bGwpIHtcbiAgICAgICAgICAgIHF1ZXVlU3RyYXRlZ3kgPSAnbGFzdCdcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVsdERhdGEucXVldWVkUmVxdWVzdHMgPT0gbnVsbCkge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMgPSBbXVxuICAgICAgICB9XG4gICAgICAgIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnZmlyc3QnICYmIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5wdXNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaXNzdWVBamF4UmVxdWVzdCh2ZXJiLCBwYXRoLCBlbHQsIGV2ZW50LCBldGMpXG4gICAgICAgICAgfSlcbiAgICAgICAgfSBlbHNlIGlmIChxdWV1ZVN0cmF0ZWd5ID09PSAnYWxsJykge1xuICAgICAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMucHVzaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGlzc3VlQWpheFJlcXVlc3QodmVyYiwgcGF0aCwgZWx0LCBldmVudCwgZXRjKVxuICAgICAgICAgIH0pXG4gICAgICAgIH0gZWxzZSBpZiAocXVldWVTdHJhdGVneSA9PT0gJ2xhc3QnKSB7XG4gICAgICAgICAgZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cyA9IFtdIC8vIGR1bXAgZXhpc3RpbmcgcXVldWVcbiAgICAgICAgICBlbHREYXRhLnF1ZXVlZFJlcXVlc3RzLnB1c2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpc3N1ZUFqYXhSZXF1ZXN0KHZlcmIsIHBhdGgsIGVsdCwgZXZlbnQsIGV0YylcbiAgICAgICAgICB9KVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHhociA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpXG4gICAgZWx0RGF0YS54aHIgPSB4aHJcbiAgICBlbHREYXRhLmFib3J0YWJsZSA9IGFib3J0YWJsZVxuICAgIGNvbnN0IGVuZFJlcXVlc3RMb2NrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbHREYXRhLnhociA9IG51bGxcbiAgICAgIGVsdERhdGEuYWJvcnRhYmxlID0gZmFsc2VcbiAgICAgIGlmIChlbHREYXRhLnF1ZXVlZFJlcXVlc3RzICE9IG51bGwgJiZcbiAgICAgIGVsdERhdGEucXVldWVkUmVxdWVzdHMubGVuZ3RoID4gMCkge1xuICAgICAgICBjb25zdCBxdWV1ZWRSZXF1ZXN0ID0gZWx0RGF0YS5xdWV1ZWRSZXF1ZXN0cy5zaGlmdCgpXG4gICAgICAgIHF1ZXVlZFJlcXVlc3QoKVxuICAgICAgfVxuICAgIH1cbiAgICBjb25zdCBwcm9tcHRRdWVzdGlvbiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1wcm9tcHQnKVxuICAgIGlmIChwcm9tcHRRdWVzdGlvbikge1xuICAgICAgdmFyIHByb21wdFJlc3BvbnNlID0gcHJvbXB0KHByb21wdFF1ZXN0aW9uKVxuICAgICAgLy8gcHJvbXB0IHJldHVybnMgbnVsbCBpZiBjYW5jZWxsZWQgYW5kIGVtcHR5IHN0cmluZyBpZiBhY2NlcHRlZCB3aXRoIG5vIGVudHJ5XG4gICAgICBpZiAocHJvbXB0UmVzcG9uc2UgPT09IG51bGwgfHxcbiAgICAgICF0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDpwcm9tcHQnLCB7IHByb21wdDogcHJvbXB0UmVzcG9uc2UsIHRhcmdldCB9KSkge1xuICAgICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgICByZXR1cm4gcHJvbWlzZVxuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChjb25maXJtUXVlc3Rpb24gJiYgIWNvbmZpcm1lZCkge1xuICAgICAgaWYgKCFjb25maXJtKGNvbmZpcm1RdWVzdGlvbikpIHtcbiAgICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgICAgcmV0dXJuIHByb21pc2VcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsZXQgaGVhZGVycyA9IGdldEhlYWRlcnMoZWx0LCB0YXJnZXQsIHByb21wdFJlc3BvbnNlKVxuXG4gICAgaWYgKHZlcmIgIT09ICdnZXQnICYmICF1c2VzRm9ybURhdGEoZWx0KSkge1xuICAgICAgaGVhZGVyc1snQ29udGVudC1UeXBlJ10gPSAnYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkJ1xuICAgIH1cblxuICAgIGlmIChldGMuaGVhZGVycykge1xuICAgICAgaGVhZGVycyA9IG1lcmdlT2JqZWN0cyhoZWFkZXJzLCBldGMuaGVhZGVycylcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0cyA9IGdldElucHV0VmFsdWVzKGVsdCwgdmVyYilcbiAgICBsZXQgZXJyb3JzID0gcmVzdWx0cy5lcnJvcnNcbiAgICBjb25zdCByYXdGb3JtRGF0YSA9IHJlc3VsdHMuZm9ybURhdGFcbiAgICBpZiAoZXRjLnZhbHVlcykge1xuICAgICAgb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZm9ybURhdGFGcm9tT2JqZWN0KGV0Yy52YWx1ZXMpKVxuICAgIH1cbiAgICBjb25zdCBleHByZXNzaW9uVmFycyA9IGZvcm1EYXRhRnJvbU9iamVjdChnZXRFeHByZXNzaW9uVmFycyhlbHQpKVxuICAgIGNvbnN0IGFsbEZvcm1EYXRhID0gb3ZlcnJpZGVGb3JtRGF0YShyYXdGb3JtRGF0YSwgZXhwcmVzc2lvblZhcnMpXG4gICAgbGV0IGZpbHRlcmVkRm9ybURhdGEgPSBmaWx0ZXJWYWx1ZXMoYWxsRm9ybURhdGEsIGVsdClcblxuICAgIGlmIChodG14LmNvbmZpZy5nZXRDYWNoZUJ1c3RlclBhcmFtICYmIHZlcmIgPT09ICdnZXQnKSB7XG4gICAgICBmaWx0ZXJlZEZvcm1EYXRhLnNldCgnb3JnLmh0bXguY2FjaGUtYnVzdGVyJywgZ2V0UmF3QXR0cmlidXRlKHRhcmdldCwgJ2lkJykgfHwgJ3RydWUnKVxuICAgIH1cblxuICAgIC8vIGJlaGF2aW9yIG9mIGFuY2hvcnMgdy8gZW1wdHkgaHJlZiBpcyB0byB1c2UgdGhlIGN1cnJlbnQgVVJMXG4gICAgaWYgKHBhdGggPT0gbnVsbCB8fCBwYXRoID09PSAnJykge1xuICAgICAgcGF0aCA9IGdldERvY3VtZW50KCkubG9jYXRpb24uaHJlZlxuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEB0eXBlIHtPYmplY3R9XG4gICAgICogQHByb3BlcnR5IHtib29sZWFufSBbY3JlZGVudGlhbHNdXG4gICAgICogQHByb3BlcnR5IHtudW1iZXJ9IFt0aW1lb3V0XVxuICAgICAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW25vSGVhZGVyc11cbiAgICAgKi9cbiAgICBjb25zdCByZXF1ZXN0QXR0clZhbHVlcyA9IGdldFZhbHVlc0ZvckVsZW1lbnQoZWx0LCAnaHgtcmVxdWVzdCcpXG5cbiAgICBjb25zdCBlbHRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgdXNlVXJsUGFyYW1zID0gaHRteC5jb25maWcubWV0aG9kc1RoYXRVc2VVcmxQYXJhbXMuaW5kZXhPZih2ZXJiKSA+PSAwXG5cbiAgICAvKiogQHR5cGUgSHRteFJlcXVlc3RDb25maWcgKi9cbiAgICBjb25zdCByZXF1ZXN0Q29uZmlnID0ge1xuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgdXNlVXJsUGFyYW1zLFxuICAgICAgZm9ybURhdGE6IGZpbHRlcmVkRm9ybURhdGEsXG4gICAgICBwYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGZpbHRlcmVkRm9ybURhdGEpLFxuICAgICAgdW5maWx0ZXJlZEZvcm1EYXRhOiBhbGxGb3JtRGF0YSxcbiAgICAgIHVuZmlsdGVyZWRQYXJhbWV0ZXJzOiBmb3JtRGF0YVByb3h5KGFsbEZvcm1EYXRhKSxcbiAgICAgIGhlYWRlcnMsXG4gICAgICB0YXJnZXQsXG4gICAgICB2ZXJiLFxuICAgICAgZXJyb3JzLFxuICAgICAgd2l0aENyZWRlbnRpYWxzOiBldGMuY3JlZGVudGlhbHMgfHwgcmVxdWVzdEF0dHJWYWx1ZXMuY3JlZGVudGlhbHMgfHwgaHRteC5jb25maWcud2l0aENyZWRlbnRpYWxzLFxuICAgICAgdGltZW91dDogZXRjLnRpbWVvdXQgfHwgcmVxdWVzdEF0dHJWYWx1ZXMudGltZW91dCB8fCBodG14LmNvbmZpZy50aW1lb3V0LFxuICAgICAgcGF0aCxcbiAgICAgIHRyaWdnZXJpbmdFdmVudDogZXZlbnRcbiAgICB9XG5cbiAgICBpZiAoIXRyaWdnZXJFdmVudChlbHQsICdodG14OmNvbmZpZ1JlcXVlc3QnLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgbWF5YmVDYWxsKHJlc29sdmUpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICByZXR1cm4gcHJvbWlzZVxuICAgIH1cblxuICAgIC8vIGNvcHkgb3V0IGluIGNhc2UgdGhlIG9iamVjdCB3YXMgb3ZlcndyaXR0ZW5cbiAgICBwYXRoID0gcmVxdWVzdENvbmZpZy5wYXRoXG4gICAgdmVyYiA9IHJlcXVlc3RDb25maWcudmVyYlxuICAgIGhlYWRlcnMgPSByZXF1ZXN0Q29uZmlnLmhlYWRlcnNcbiAgICBmaWx0ZXJlZEZvcm1EYXRhID0gZm9ybURhdGFGcm9tT2JqZWN0KHJlcXVlc3RDb25maWcucGFyYW1ldGVycylcbiAgICBlcnJvcnMgPSByZXF1ZXN0Q29uZmlnLmVycm9yc1xuICAgIHVzZVVybFBhcmFtcyA9IHJlcXVlc3RDb25maWcudXNlVXJsUGFyYW1zXG5cbiAgICBpZiAoZXJyb3JzICYmIGVycm9ycy5sZW5ndGggPiAwKSB7XG4gICAgICB0cmlnZ2VyRXZlbnQoZWx0LCAnaHRteDp2YWxpZGF0aW9uOmhhbHRlZCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVzb2x2ZSlcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICAgIHJldHVybiBwcm9taXNlXG4gICAgfVxuXG4gICAgY29uc3Qgc3BsaXRQYXRoID0gcGF0aC5zcGxpdCgnIycpXG4gICAgY29uc3QgcGF0aE5vQW5jaG9yID0gc3BsaXRQYXRoWzBdXG4gICAgY29uc3QgYW5jaG9yID0gc3BsaXRQYXRoWzFdXG5cbiAgICBsZXQgZmluYWxQYXRoID0gcGF0aFxuICAgIGlmICh1c2VVcmxQYXJhbXMpIHtcbiAgICAgIGZpbmFsUGF0aCA9IHBhdGhOb0FuY2hvclxuICAgICAgY29uc3QgaGFzVmFsdWVzID0gIWZpbHRlcmVkRm9ybURhdGEua2V5cygpLm5leHQoKS5kb25lXG4gICAgICBpZiAoaGFzVmFsdWVzKSB7XG4gICAgICAgIGlmIChmaW5hbFBhdGguaW5kZXhPZignPycpIDwgMCkge1xuICAgICAgICAgIGZpbmFsUGF0aCArPSAnPydcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBmaW5hbFBhdGggKz0gJyYnXG4gICAgICAgIH1cbiAgICAgICAgZmluYWxQYXRoICs9IHVybEVuY29kZShmaWx0ZXJlZEZvcm1EYXRhKVxuICAgICAgICBpZiAoYW5jaG9yKSB7XG4gICAgICAgICAgZmluYWxQYXRoICs9ICcjJyArIGFuY2hvclxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKCF2ZXJpZnlQYXRoKGVsdCwgZmluYWxQYXRoLCByZXF1ZXN0Q29uZmlnKSkge1xuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDppbnZhbGlkUGF0aCcsIHJlcXVlc3RDb25maWcpXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG5cbiAgICB4aHIub3Blbih2ZXJiLnRvVXBwZXJDYXNlKCksIGZpbmFsUGF0aCwgdHJ1ZSlcbiAgICB4aHIub3ZlcnJpZGVNaW1lVHlwZSgndGV4dC9odG1sJylcbiAgICB4aHIud2l0aENyZWRlbnRpYWxzID0gcmVxdWVzdENvbmZpZy53aXRoQ3JlZGVudGlhbHNcbiAgICB4aHIudGltZW91dCA9IHJlcXVlc3RDb25maWcudGltZW91dFxuXG4gICAgLy8gcmVxdWVzdCBoZWFkZXJzXG4gICAgaWYgKHJlcXVlc3RBdHRyVmFsdWVzLm5vSGVhZGVycykge1xuICAgIC8vIGlnbm9yZSBhbGwgaGVhZGVyc1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3IgKGNvbnN0IGhlYWRlciBpbiBoZWFkZXJzKSB7XG4gICAgICAgIGlmIChoZWFkZXJzLmhhc093blByb3BlcnR5KGhlYWRlcikpIHtcbiAgICAgICAgICBjb25zdCBoZWFkZXJWYWx1ZSA9IGhlYWRlcnNbaGVhZGVyXVxuICAgICAgICAgIHNhZmVseVNldEhlYWRlclZhbHVlKHhociwgaGVhZGVyLCBoZWFkZXJWYWx1ZSlcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8qKiBAdHlwZSB7SHRteFJlc3BvbnNlSW5mb30gKi9cbiAgICBjb25zdCByZXNwb25zZUluZm8gPSB7XG4gICAgICB4aHIsXG4gICAgICB0YXJnZXQsXG4gICAgICByZXF1ZXN0Q29uZmlnLFxuICAgICAgZXRjLFxuICAgICAgYm9vc3RlZDogZWx0SXNCb29zdGVkLFxuICAgICAgc2VsZWN0LFxuICAgICAgcGF0aEluZm86IHtcbiAgICAgICAgcmVxdWVzdFBhdGg6IHBhdGgsXG4gICAgICAgIGZpbmFsUmVxdWVzdFBhdGg6IGZpbmFsUGF0aCxcbiAgICAgICAgcmVzcG9uc2VQYXRoOiBudWxsLFxuICAgICAgICBhbmNob3JcbiAgICAgIH1cbiAgICB9XG5cbiAgICB4aHIub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBoaWVyYXJjaHkgPSBoaWVyYXJjaHlGb3JFbHQoZWx0KVxuICAgICAgICByZXNwb25zZUluZm8ucGF0aEluZm8ucmVzcG9uc2VQYXRoID0gZ2V0UGF0aEZyb21SZXNwb25zZSh4aHIpXG4gICAgICAgIHJlc3BvbnNlSGFuZGxlcihlbHQsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgaWYgKHJlc3BvbnNlSW5mby5rZWVwSW5kaWNhdG9ycyAhPT0gdHJ1ZSkge1xuICAgICAgICAgIHJlbW92ZVJlcXVlc3RJbmRpY2F0b3JzKGluZGljYXRvcnMsIGRpc2FibGVFbHRzKVxuICAgICAgICB9XG4gICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgIC8vIGlmIHRoZSBib2R5IG5vIGxvbmdlciBjb250YWlucyB0aGUgZWxlbWVudCwgdHJpZ2dlciB0aGUgZXZlbnQgb24gdGhlIGNsb3Nlc3QgcGFyZW50XG4gICAgICAgIC8vIHJlbWFpbmluZyBpbiB0aGUgRE9NXG4gICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICBsZXQgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9IG51bGxcbiAgICAgICAgICB3aGlsZSAoaGllcmFyY2h5Lmxlbmd0aCA+IDAgJiYgc2Vjb25kYXJ5VHJpZ2dlckVsdCA9PSBudWxsKSB7XG4gICAgICAgICAgICBjb25zdCBwYXJlbnRFbHRJbkhpZXJhcmNoeSA9IGhpZXJhcmNoeS5zaGlmdCgpXG4gICAgICAgICAgICBpZiAoYm9keUNvbnRhaW5zKHBhcmVudEVsdEluSGllcmFyY2h5KSkge1xuICAgICAgICAgICAgICBzZWNvbmRhcnlUcmlnZ2VyRWx0ID0gcGFyZW50RWx0SW5IaWVyYXJjaHlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHNlY29uZGFyeVRyaWdnZXJFbHQpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChzZWNvbmRhcnlUcmlnZ2VyRWx0LCAnaHRteDphZnRlclJlcXVlc3QnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgICB0cmlnZ2VyRXZlbnQoc2Vjb25kYXJ5VHJpZ2dlckVsdCwgJ2h0bXg6YWZ0ZXJPbkxvYWQnLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6b25Mb2FkRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogZSB9LCByZXNwb25zZUluZm8pKVxuICAgICAgICB0aHJvdyBlXG4gICAgICB9XG4gICAgfVxuICAgIHhoci5vbmVycm9yID0gZnVuY3Rpb24oKSB7XG4gICAgICByZW1vdmVSZXF1ZXN0SW5kaWNhdG9ycyhpbmRpY2F0b3JzLCBkaXNhYmxlRWx0cylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6YWZ0ZXJSZXF1ZXN0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzZW5kRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICBtYXliZUNhbGwocmVqZWN0KVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgIH1cbiAgICB4aHIub25hYm9ydCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6c2VuZEFib3J0JywgcmVzcG9uc2VJbmZvKVxuICAgICAgbWF5YmVDYWxsKHJlamVjdClcbiAgICAgIGVuZFJlcXVlc3RMb2NrKClcbiAgICB9XG4gICAgeGhyLm9udGltZW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICAgcmVtb3ZlUmVxdWVzdEluZGljYXRvcnMoaW5kaWNhdG9ycywgZGlzYWJsZUVsdHMpXG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OmFmdGVyUmVxdWVzdCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIHRyaWdnZXJFcnJvckV2ZW50KGVsdCwgJ2h0bXg6dGltZW91dCcsIHJlc3BvbnNlSW5mbylcbiAgICAgIG1heWJlQ2FsbChyZWplY3QpXG4gICAgICBlbmRSZXF1ZXN0TG9jaygpXG4gICAgfVxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlUmVxdWVzdCcsIHJlc3BvbnNlSW5mbykpIHtcbiAgICAgIG1heWJlQ2FsbChyZXNvbHZlKVxuICAgICAgZW5kUmVxdWVzdExvY2soKVxuICAgICAgcmV0dXJuIHByb21pc2VcbiAgICB9XG4gICAgdmFyIGluZGljYXRvcnMgPSBhZGRSZXF1ZXN0SW5kaWNhdG9yQ2xhc3NlcyhlbHQpXG4gICAgdmFyIGRpc2FibGVFbHRzID0gZGlzYWJsZUVsZW1lbnRzKGVsdClcblxuICAgIGZvckVhY2goWydsb2Fkc3RhcnQnLCAnbG9hZGVuZCcsICdwcm9ncmVzcycsICdhYm9ydCddLCBmdW5jdGlvbihldmVudE5hbWUpIHtcbiAgICAgIGZvckVhY2goW3hociwgeGhyLnVwbG9hZF0sIGZ1bmN0aW9uKHRhcmdldCkge1xuICAgICAgICB0YXJnZXQuYWRkRXZlbnRMaXN0ZW5lcihldmVudE5hbWUsIGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6eGhyOicgKyBldmVudE5hbWUsIHtcbiAgICAgICAgICAgIGxlbmd0aENvbXB1dGFibGU6IGV2ZW50Lmxlbmd0aENvbXB1dGFibGUsXG4gICAgICAgICAgICBsb2FkZWQ6IGV2ZW50LmxvYWRlZCxcbiAgICAgICAgICAgIHRvdGFsOiBldmVudC50b3RhbFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9KVxuICAgIH0pXG4gICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlU2VuZCcsIHJlc3BvbnNlSW5mbylcbiAgICBjb25zdCBwYXJhbXMgPSB1c2VVcmxQYXJhbXMgPyBudWxsIDogZW5jb2RlUGFyYW1zRm9yQm9keSh4aHIsIGVsdCwgZmlsdGVyZWRGb3JtRGF0YSlcbiAgICB4aHIuc2VuZChwYXJhbXMpXG4gICAgcmV0dXJuIHByb21pc2VcbiAgfVxuXG4gIC8qKlxuICAgKiBAdHlwZWRlZiB7T2JqZWN0fSBIdG14SGlzdG9yeVVwZGF0ZVxuICAgKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBbdHlwZV1cbiAgICogQHByb3BlcnR5IHtzdHJpbmd8bnVsbH0gW3BhdGhdXG4gICAqL1xuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKiBAcmV0dXJuIHtIdG14SGlzdG9yeVVwZGF0ZX1cbiAgICovXG4gIGZ1bmN0aW9uIGRldGVybWluZUhpc3RvcnlVcGRhdGVzKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuXG4gICAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAgIC8vIEZpcnN0IGNvbnN1bHQgcmVzcG9uc2UgaGVhZGVyc1xuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICBsZXQgcGF0aEZyb21IZWFkZXJzID0gbnVsbFxuICAgIGxldCB0eXBlRnJvbUhlYWRlcnMgPSBudWxsXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1QdXNoOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoJylcbiAgICAgIHR5cGVGcm9tSGVhZGVycyA9ICdwdXNoJ1xuICAgIH0gZWxzZSBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVB1c2gtVXJsOi9pKSkge1xuICAgICAgcGF0aEZyb21IZWFkZXJzID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1QdXNoLVVybCcpXG4gICAgICB0eXBlRnJvbUhlYWRlcnMgPSAncHVzaCdcbiAgICB9IGVsc2UgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXBsYWNlLVVybDovaSkpIHtcbiAgICAgIHBhdGhGcm9tSGVhZGVycyA9IHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVwbGFjZS1VcmwnKVxuICAgICAgdHlwZUZyb21IZWFkZXJzID0gJ3JlcGxhY2UnXG4gICAgfVxuXG4gICAgLy8gaWYgdGhlcmUgd2FzIGEgcmVzcG9uc2UgaGVhZGVyLCB0aGF0IGhhcyBwcmlvcml0eVxuICAgIGlmIChwYXRoRnJvbUhlYWRlcnMpIHtcbiAgICAgIGlmIChwYXRoRnJvbUhlYWRlcnMgPT09ICdmYWxzZScpIHtcbiAgICAgICAgcmV0dXJuIHt9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgIHR5cGU6IHR5cGVGcm9tSGVhZGVycyxcbiAgICAgICAgICBwYXRoOiBwYXRoRnJvbUhlYWRlcnNcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vPSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgICAvLyBOZXh0IHJlc29sdmUgdmlhIERPTSB2YWx1ZXNcbiAgICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gICAgY29uc3QgcmVxdWVzdFBhdGggPSByZXNwb25zZUluZm8ucGF0aEluZm8uZmluYWxSZXF1ZXN0UGF0aFxuICAgIGNvbnN0IHJlc3BvbnNlUGF0aCA9IHJlc3BvbnNlSW5mby5wYXRoSW5mby5yZXNwb25zZVBhdGhcblxuICAgIGNvbnN0IHB1c2hVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcHVzaC11cmwnKVxuICAgIGNvbnN0IHJlcGxhY2VVcmwgPSBnZXRDbG9zZXN0QXR0cmlidXRlVmFsdWUoZWx0LCAnaHgtcmVwbGFjZS11cmwnKVxuICAgIGNvbnN0IGVsZW1lbnRJc0Jvb3N0ZWQgPSBnZXRJbnRlcm5hbERhdGEoZWx0KS5ib29zdGVkXG5cbiAgICBsZXQgc2F2ZVR5cGUgPSBudWxsXG4gICAgbGV0IHBhdGggPSBudWxsXG5cbiAgICBpZiAocHVzaFVybCkge1xuICAgICAgc2F2ZVR5cGUgPSAncHVzaCdcbiAgICAgIHBhdGggPSBwdXNoVXJsXG4gICAgfSBlbHNlIGlmIChyZXBsYWNlVXJsKSB7XG4gICAgICBzYXZlVHlwZSA9ICdyZXBsYWNlJ1xuICAgICAgcGF0aCA9IHJlcGxhY2VVcmxcbiAgICB9IGVsc2UgaWYgKGVsZW1lbnRJc0Jvb3N0ZWQpIHtcbiAgICAgIHNhdmVUeXBlID0gJ3B1c2gnXG4gICAgICBwYXRoID0gcmVzcG9uc2VQYXRoIHx8IHJlcXVlc3RQYXRoIC8vIGlmIHRoZXJlIGlzIG5vIHJlc3BvbnNlIHBhdGgsIGdvIHdpdGggdGhlIG9yaWdpbmFsIHJlcXVlc3QgcGF0aFxuICAgIH1cblxuICAgIGlmIChwYXRoKSB7XG4gICAgLy8gZmFsc2UgaW5kaWNhdGVzIG5vIHB1c2gsIHJldHVybiBlbXB0eSBvYmplY3RcbiAgICAgIGlmIChwYXRoID09PSAnZmFsc2UnKSB7XG4gICAgICAgIHJldHVybiB7fVxuICAgICAgfVxuXG4gICAgICAvLyB0cnVlIGluZGljYXRlcyB3ZSB3YW50IHRvIGZvbGxvdyB3aGVyZXZlciB0aGUgc2VydmVyIGVuZGVkIHVwIHNlbmRpbmcgdXNcbiAgICAgIGlmIChwYXRoID09PSAndHJ1ZScpIHtcbiAgICAgICAgcGF0aCA9IHJlc3BvbnNlUGF0aCB8fCByZXF1ZXN0UGF0aCAvLyBpZiB0aGVyZSBpcyBubyByZXNwb25zZSBwYXRoLCBnbyB3aXRoIHRoZSBvcmlnaW5hbCByZXF1ZXN0IHBhdGhcbiAgICAgIH1cblxuICAgICAgLy8gcmVzdG9yZSBhbnkgYW5jaG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVxdWVzdFxuICAgICAgaWYgKHJlc3BvbnNlSW5mby5wYXRoSW5mby5hbmNob3IgJiYgcGF0aC5pbmRleE9mKCcjJykgPT09IC0xKSB7XG4gICAgICAgIHBhdGggPSBwYXRoICsgJyMnICsgcmVzcG9uc2VJbmZvLnBhdGhJbmZvLmFuY2hvclxuICAgICAgfVxuXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBzYXZlVHlwZSxcbiAgICAgICAgcGF0aFxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4ge31cbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtIdG14UmVzcG9uc2VIYW5kbGluZ0NvbmZpZ30gcmVzcG9uc2VIYW5kbGluZ0NvbmZpZ1xuICAgKiBAcGFyYW0ge251bWJlcn0gc3RhdHVzXG4gICAqIEByZXR1cm4ge2Jvb2xlYW59XG4gICAqL1xuICBmdW5jdGlvbiBjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nQ29uZmlnLCBzdGF0dXMpIHtcbiAgICB2YXIgcmVnRXhwID0gbmV3IFJlZ0V4cChyZXNwb25zZUhhbmRsaW5nQ29uZmlnLmNvZGUpXG4gICAgcmV0dXJuIHJlZ0V4cC50ZXN0KHN0YXR1cy50b1N0cmluZygxMCkpXG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gICAqIEByZXR1cm4ge0h0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnfVxuICAgKi9cbiAgZnVuY3Rpb24gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBodG14LmNvbmZpZy5yZXNwb25zZUhhbmRsaW5nLmxlbmd0aDsgaSsrKSB7XG4gICAgICAvKiogQHR5cGUgSHRteFJlc3BvbnNlSGFuZGxpbmdDb25maWcgKi9cbiAgICAgIHZhciByZXNwb25zZUhhbmRsaW5nRWxlbWVudCA9IGh0bXguY29uZmlnLnJlc3BvbnNlSGFuZGxpbmdbaV1cbiAgICAgIGlmIChjb2RlTWF0Y2hlcyhyZXNwb25zZUhhbmRsaW5nRWxlbWVudCwgeGhyLnN0YXR1cykpIHtcbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlSGFuZGxpbmdFbGVtZW50XG4gICAgICB9XG4gICAgfVxuICAgIC8vIG5vIG1hdGNoZXMsIHJldHVybiBubyBzd2FwXG4gICAgcmV0dXJuIHtcbiAgICAgIHN3YXA6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7c3RyaW5nfSB0aXRsZVxuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlVGl0bGUodGl0bGUpIHtcbiAgICBpZiAodGl0bGUpIHtcbiAgICAgIGNvbnN0IHRpdGxlRWx0ID0gZmluZCgndGl0bGUnKVxuICAgICAgaWYgKHRpdGxlRWx0KSB7XG4gICAgICAgIHRpdGxlRWx0LmlubmVySFRNTCA9IHRpdGxlXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB3aW5kb3cuZG9jdW1lbnQudGl0bGUgPSB0aXRsZVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge0VsZW1lbnR9IGVsdFxuICAgKiBAcGFyYW0ge0h0bXhSZXNwb25zZUluZm99IHJlc3BvbnNlSW5mb1xuICAgKi9cbiAgZnVuY3Rpb24gaGFuZGxlQWpheFJlc3BvbnNlKGVsdCwgcmVzcG9uc2VJbmZvKSB7XG4gICAgY29uc3QgeGhyID0gcmVzcG9uc2VJbmZvLnhoclxuICAgIGxldCB0YXJnZXQgPSByZXNwb25zZUluZm8udGFyZ2V0XG4gICAgY29uc3QgZXRjID0gcmVzcG9uc2VJbmZvLmV0Y1xuICAgIGNvbnN0IHJlc3BvbnNlSW5mb1NlbGVjdCA9IHJlc3BvbnNlSW5mby5zZWxlY3RcblxuICAgIGlmICghdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6YmVmb3JlT25Mb2FkJywgcmVzcG9uc2VJbmZvKSkgcmV0dXJuXG5cbiAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXI6L2kpKSB7XG4gICAgICBoYW5kbGVUcmlnZ2VySGVhZGVyKHhociwgJ0hYLVRyaWdnZXInLCBlbHQpXG4gICAgfVxuXG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1Mb2NhdGlvbjovaSkpIHtcbiAgICAgIHNhdmVDdXJyZW50UGFnZVRvSGlzdG9yeSgpXG4gICAgICBsZXQgcmVkaXJlY3RQYXRoID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1Mb2NhdGlvbicpXG4gICAgICAvKiogQHR5cGUge0h0bXhBamF4SGVscGVyQ29udGV4dCZ7cGF0aDpzdHJpbmd9fSAqL1xuICAgICAgdmFyIHJlZGlyZWN0U3dhcFNwZWNcbiAgICAgIGlmIChyZWRpcmVjdFBhdGguaW5kZXhPZigneycpID09PSAwKSB7XG4gICAgICAgIHJlZGlyZWN0U3dhcFNwZWMgPSBwYXJzZUpTT04ocmVkaXJlY3RQYXRoKVxuICAgICAgICAvLyB3aGF0J3MgdGhlIGJlc3Qgd2F5IHRvIHRocm93IGFuIGVycm9yIGlmIHRoZSB1c2VyIGRpZG4ndCBpbmNsdWRlIHRoaXNcbiAgICAgICAgcmVkaXJlY3RQYXRoID0gcmVkaXJlY3RTd2FwU3BlYy5wYXRoXG4gICAgICAgIGRlbGV0ZSByZWRpcmVjdFN3YXBTcGVjLnBhdGhcbiAgICAgIH1cbiAgICAgIGFqYXhIZWxwZXIoJ2dldCcsIHJlZGlyZWN0UGF0aCwgcmVkaXJlY3RTd2FwU3BlYykudGhlbihmdW5jdGlvbigpIHtcbiAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KHJlZGlyZWN0UGF0aClcbiAgICAgIH0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBjb25zdCBzaG91bGRSZWZyZXNoID0gaGFzSGVhZGVyKHhociwgL0hYLVJlZnJlc2g6L2kpICYmIHhoci5nZXRSZXNwb25zZUhlYWRlcignSFgtUmVmcmVzaCcpID09PSAndHJ1ZSdcblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVkaXJlY3Q6L2kpKSB7XG4gICAgICByZXNwb25zZUluZm8ua2VlcEluZGljYXRvcnMgPSB0cnVlXG4gICAgICBsb2NhdGlvbi5ocmVmID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZWRpcmVjdCcpXG4gICAgICBzaG91bGRSZWZyZXNoICYmIGxvY2F0aW9uLnJlbG9hZCgpXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoc2hvdWxkUmVmcmVzaCkge1xuICAgICAgcmVzcG9uc2VJbmZvLmtlZXBJbmRpY2F0b3JzID0gdHJ1ZVxuICAgICAgbG9jYXRpb24ucmVsb2FkKClcbiAgICAgIHJldHVyblxuICAgIH1cblxuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBoaXN0b3J5VXBkYXRlID0gZGV0ZXJtaW5lSGlzdG9yeVVwZGF0ZXMoZWx0LCByZXNwb25zZUluZm8pXG5cbiAgICBjb25zdCByZXNwb25zZUhhbmRsaW5nID0gcmVzb2x2ZVJlc3BvbnNlSGFuZGxpbmcoeGhyKVxuICAgIGNvbnN0IHNob3VsZFN3YXAgPSByZXNwb25zZUhhbmRsaW5nLnN3YXBcbiAgICBsZXQgaXNFcnJvciA9ICEhcmVzcG9uc2VIYW5kbGluZy5lcnJvclxuICAgIGxldCBpZ25vcmVUaXRsZSA9IGh0bXguY29uZmlnLmlnbm9yZVRpdGxlIHx8IHJlc3BvbnNlSGFuZGxpbmcuaWdub3JlVGl0bGVcbiAgICBsZXQgc2VsZWN0T3ZlcnJpZGUgPSByZXNwb25zZUhhbmRsaW5nLnNlbGVjdFxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLnRhcmdldCkge1xuICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgcmVzcG9uc2VIYW5kbGluZy50YXJnZXQpKVxuICAgIH1cbiAgICB2YXIgc3dhcE92ZXJyaWRlID0gZXRjLnN3YXBPdmVycmlkZVxuICAgIGlmIChzd2FwT3ZlcnJpZGUgPT0gbnVsbCAmJiByZXNwb25zZUhhbmRsaW5nLnN3YXBPdmVycmlkZSkge1xuICAgICAgc3dhcE92ZXJyaWRlID0gcmVzcG9uc2VIYW5kbGluZy5zd2FwT3ZlcnJpZGVcbiAgICB9XG5cbiAgICAvLyByZXNwb25zZSBoZWFkZXJzIG92ZXJyaWRlIHJlc3BvbnNlIGhhbmRsaW5nIGNvbmZpZ1xuICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmV0YXJnZXQ6L2kpKSB7XG4gICAgICBpZiAoeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpID09PSAndGhpcycpIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGVsdFxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IGFzRWxlbWVudChxdWVyeVNlbGVjdG9yRXh0KGVsdCwgeGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXRhcmdldCcpKSlcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1SZXN3YXA6L2kpKSB7XG4gICAgICBzd2FwT3ZlcnJpZGUgPSB4aHIuZ2V0UmVzcG9uc2VIZWFkZXIoJ0hYLVJlc3dhcCcpXG4gICAgfVxuXG4gICAgdmFyIHNlcnZlclJlc3BvbnNlID0geGhyLnJlc3BvbnNlXG4gICAgLyoqIEB0eXBlIEh0bXhCZWZvcmVTd2FwRGV0YWlscyAqL1xuICAgIHZhciBiZWZvcmVTd2FwRGV0YWlscyA9IG1lcmdlT2JqZWN0cyh7XG4gICAgICBzaG91bGRTd2FwLFxuICAgICAgc2VydmVyUmVzcG9uc2UsXG4gICAgICBpc0Vycm9yLFxuICAgICAgaWdub3JlVGl0bGUsXG4gICAgICBzZWxlY3RPdmVycmlkZVxuICAgIH0sIHJlc3BvbnNlSW5mbylcblxuICAgIGlmIChyZXNwb25zZUhhbmRsaW5nLmV2ZW50ICYmICF0cmlnZ2VyRXZlbnQodGFyZ2V0LCByZXNwb25zZUhhbmRsaW5nLmV2ZW50LCBiZWZvcmVTd2FwRGV0YWlscykpIHJldHVyblxuXG4gICAgaWYgKCF0cmlnZ2VyRXZlbnQodGFyZ2V0LCAnaHRteDpiZWZvcmVTd2FwJywgYmVmb3JlU3dhcERldGFpbHMpKSByZXR1cm5cblxuICAgIHRhcmdldCA9IGJlZm9yZVN3YXBEZXRhaWxzLnRhcmdldCAvLyBhbGxvdyByZS10YXJnZXRpbmdcbiAgICBzZXJ2ZXJSZXNwb25zZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlcnZlclJlc3BvbnNlIC8vIGFsbG93IHVwZGF0aW5nIGNvbnRlbnRcbiAgICBpc0Vycm9yID0gYmVmb3JlU3dhcERldGFpbHMuaXNFcnJvciAvLyBhbGxvdyB1cGRhdGluZyBlcnJvclxuICAgIGlnbm9yZVRpdGxlID0gYmVmb3JlU3dhcERldGFpbHMuaWdub3JlVGl0bGUgLy8gYWxsb3cgdXBkYXRpbmcgaWdub3JpbmcgdGl0bGVcbiAgICBzZWxlY3RPdmVycmlkZSA9IGJlZm9yZVN3YXBEZXRhaWxzLnNlbGVjdE92ZXJyaWRlIC8vIGFsbG93IHVwZGF0aW5nIHNlbGVjdCBvdmVycmlkZVxuXG4gICAgcmVzcG9uc2VJbmZvLnRhcmdldCA9IHRhcmdldCAvLyBNYWtlIHVwZGF0ZWQgdGFyZ2V0IGF2YWlsYWJsZSB0byByZXNwb25zZSBldmVudHNcbiAgICByZXNwb25zZUluZm8uZmFpbGVkID0gaXNFcnJvciAvLyBNYWtlIGZhaWxlZCBwcm9wZXJ0eSBhdmFpbGFibGUgdG8gcmVzcG9uc2UgZXZlbnRzXG4gICAgcmVzcG9uc2VJbmZvLnN1Y2Nlc3NmdWwgPSAhaXNFcnJvciAvLyBNYWtlIHN1Y2Nlc3NmdWwgcHJvcGVydHkgYXZhaWxhYmxlIHRvIHJlc3BvbnNlIGV2ZW50c1xuXG4gICAgaWYgKGJlZm9yZVN3YXBEZXRhaWxzLnNob3VsZFN3YXApIHtcbiAgICAgIGlmICh4aHIuc3RhdHVzID09PSAyODYpIHtcbiAgICAgICAgY2FuY2VsUG9sbGluZyhlbHQpXG4gICAgICB9XG5cbiAgICAgIHdpdGhFeHRlbnNpb25zKGVsdCwgZnVuY3Rpb24oZXh0ZW5zaW9uKSB7XG4gICAgICAgIHNlcnZlclJlc3BvbnNlID0gZXh0ZW5zaW9uLnRyYW5zZm9ybVJlc3BvbnNlKHNlcnZlclJlc3BvbnNlLCB4aHIsIGVsdClcbiAgICAgIH0pXG5cbiAgICAgIC8vIFNhdmUgY3VycmVudCBwYWdlIGlmIHRoZXJlIHdpbGwgYmUgYSBoaXN0b3J5IHVwZGF0ZVxuICAgICAgaWYgKGhpc3RvcnlVcGRhdGUudHlwZSkge1xuICAgICAgICBzYXZlQ3VycmVudFBhZ2VUb0hpc3RvcnkoKVxuICAgICAgfVxuXG4gICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVJlc3dhcDovaSkpIHtcbiAgICAgICAgc3dhcE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXN3YXAnKVxuICAgICAgfVxuICAgICAgdmFyIHN3YXBTcGVjID0gZ2V0U3dhcFNwZWNpZmljYXRpb24oZWx0LCBzd2FwT3ZlcnJpZGUpXG5cbiAgICAgIGlmICghc3dhcFNwZWMuaGFzT3duUHJvcGVydHkoJ2lnbm9yZVRpdGxlJykpIHtcbiAgICAgICAgc3dhcFNwZWMuaWdub3JlVGl0bGUgPSBpZ25vcmVUaXRsZVxuICAgICAgfVxuXG4gICAgICB0YXJnZXQuY2xhc3NMaXN0LmFkZChodG14LmNvbmZpZy5zd2FwcGluZ0NsYXNzKVxuXG4gICAgICAvLyBvcHRpb25hbCB0cmFuc2l0aW9uIEFQSSBwcm9taXNlIGNhbGxiYWNrc1xuICAgICAgbGV0IHNldHRsZVJlc29sdmUgPSBudWxsXG4gICAgICBsZXQgc2V0dGxlUmVqZWN0ID0gbnVsbFxuXG4gICAgICBpZiAocmVzcG9uc2VJbmZvU2VsZWN0KSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0gcmVzcG9uc2VJbmZvU2VsZWN0XG4gICAgICB9XG5cbiAgICAgIGlmIChoYXNIZWFkZXIoeGhyLCAvSFgtUmVzZWxlY3Q6L2kpKSB7XG4gICAgICAgIHNlbGVjdE92ZXJyaWRlID0geGhyLmdldFJlc3BvbnNlSGVhZGVyKCdIWC1SZXNlbGVjdCcpXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IHNlbGVjdE9PQiA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3Qtb29iJylcbiAgICAgIGNvbnN0IHNlbGVjdCA9IGdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsICdoeC1zZWxlY3QnKVxuXG4gICAgICBsZXQgZG9Td2FwID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgLy8gaWYgd2UgbmVlZCB0byBzYXZlIGhpc3RvcnksIGRvIHNvLCBiZWZvcmUgc3dhcHBpbmcgc28gdGhhdCByZWxhdGl2ZSByZXNvdXJjZXMgaGF2ZSB0aGUgY29ycmVjdCBiYXNlIFVSTFxuICAgICAgICAgIGlmIChoaXN0b3J5VXBkYXRlLnR5cGUpIHtcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OmJlZm9yZUhpc3RvcnlVcGRhdGUnLCBtZXJnZU9iamVjdHMoeyBoaXN0b3J5OiBoaXN0b3J5VXBkYXRlIH0sIHJlc3BvbnNlSW5mbykpXG4gICAgICAgICAgICBpZiAoaGlzdG9yeVVwZGF0ZS50eXBlID09PSAncHVzaCcpIHtcbiAgICAgICAgICAgICAgcHVzaFVybEludG9IaXN0b3J5KGhpc3RvcnlVcGRhdGUucGF0aClcbiAgICAgICAgICAgICAgdHJpZ2dlckV2ZW50KGdldERvY3VtZW50KCkuYm9keSwgJ2h0bXg6cHVzaGVkSW50b0hpc3RvcnknLCB7IHBhdGg6IGhpc3RvcnlVcGRhdGUucGF0aCB9KVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcmVwbGFjZVVybEluSGlzdG9yeShoaXN0b3J5VXBkYXRlLnBhdGgpXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChnZXREb2N1bWVudCgpLmJvZHksICdodG14OnJlcGxhY2VkSW5IaXN0b3J5JywgeyBwYXRoOiBoaXN0b3J5VXBkYXRlLnBhdGggfSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBzd2FwKHRhcmdldCwgc2VydmVyUmVzcG9uc2UsIHN3YXBTcGVjLCB7XG4gICAgICAgICAgICBzZWxlY3Q6IHNlbGVjdE92ZXJyaWRlIHx8IHNlbGVjdCxcbiAgICAgICAgICAgIHNlbGVjdE9PQixcbiAgICAgICAgICAgIGV2ZW50SW5mbzogcmVzcG9uc2VJbmZvLFxuICAgICAgICAgICAgYW5jaG9yOiByZXNwb25zZUluZm8ucGF0aEluZm8uYW5jaG9yLFxuICAgICAgICAgICAgY29udGV4dEVsZW1lbnQ6IGVsdCxcbiAgICAgICAgICAgIGFmdGVyU3dhcENhbGxiYWNrOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgaWYgKGhhc0hlYWRlcih4aHIsIC9IWC1UcmlnZ2VyLUFmdGVyLVN3YXA6L2kpKSB7XG4gICAgICAgICAgICAgICAgbGV0IGZpbmFsRWx0ID0gZWx0XG4gICAgICAgICAgICAgICAgaWYgKCFib2R5Q29udGFpbnMoZWx0KSkge1xuICAgICAgICAgICAgICAgICAgZmluYWxFbHQgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaGFuZGxlVHJpZ2dlckhlYWRlcih4aHIsICdIWC1UcmlnZ2VyLUFmdGVyLVN3YXAnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGFmdGVyU2V0dGxlQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICBpZiAoaGFzSGVhZGVyKHhociwgL0hYLVRyaWdnZXItQWZ0ZXItU2V0dGxlOi9pKSkge1xuICAgICAgICAgICAgICAgIGxldCBmaW5hbEVsdCA9IGVsdFxuICAgICAgICAgICAgICAgIGlmICghYm9keUNvbnRhaW5zKGVsdCkpIHtcbiAgICAgICAgICAgICAgICAgIGZpbmFsRWx0ID0gZ2V0RG9jdW1lbnQoKS5ib2R5XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGhhbmRsZVRyaWdnZXJIZWFkZXIoeGhyLCAnSFgtVHJpZ2dlci1BZnRlci1TZXR0bGUnLCBmaW5hbEVsdClcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBtYXliZUNhbGwoc2V0dGxlUmVzb2x2ZSlcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KVxuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgdHJpZ2dlckVycm9yRXZlbnQoZWx0LCAnaHRteDpzd2FwRXJyb3InLCByZXNwb25zZUluZm8pXG4gICAgICAgICAgbWF5YmVDYWxsKHNldHRsZVJlamVjdClcbiAgICAgICAgICB0aHJvdyBlXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbGV0IHNob3VsZFRyYW5zaXRpb24gPSBodG14LmNvbmZpZy5nbG9iYWxWaWV3VHJhbnNpdGlvbnNcbiAgICAgIGlmIChzd2FwU3BlYy5oYXNPd25Qcm9wZXJ0eSgndHJhbnNpdGlvbicpKSB7XG4gICAgICAgIHNob3VsZFRyYW5zaXRpb24gPSBzd2FwU3BlYy50cmFuc2l0aW9uXG4gICAgICB9XG5cbiAgICAgIGlmIChzaG91bGRUcmFuc2l0aW9uICYmXG4gICAgICAgICAgICAgIHRyaWdnZXJFdmVudChlbHQsICdodG14OmJlZm9yZVRyYW5zaXRpb24nLCByZXNwb25zZUluZm8pICYmXG4gICAgICAgICAgICAgIHR5cGVvZiBQcm9taXNlICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgICAgICBkb2N1bWVudC5zdGFydFZpZXdUcmFuc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHNldHRsZVByb21pc2UgPSBuZXcgUHJvbWlzZShmdW5jdGlvbihfcmVzb2x2ZSwgX3JlamVjdCkge1xuICAgICAgICAgIHNldHRsZVJlc29sdmUgPSBfcmVzb2x2ZVxuICAgICAgICAgIHNldHRsZVJlamVjdCA9IF9yZWplY3RcbiAgICAgICAgfSlcbiAgICAgICAgLy8gd3JhcCB0aGUgb3JpZ2luYWwgZG9Td2FwKCkgaW4gYSBjYWxsIHRvIHN0YXJ0Vmlld1RyYW5zaXRpb24oKVxuICAgICAgICBjb25zdCBpbm5lckRvU3dhcCA9IGRvU3dhcFxuICAgICAgICBkb1N3YXAgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAvLyBAdHMtaWdub3JlIGV4cGVyaW1lbnRhbCBmZWF0dXJlIGF0bVxuICAgICAgICAgIGRvY3VtZW50LnN0YXJ0Vmlld1RyYW5zaXRpb24oZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpbm5lckRvU3dhcCgpXG4gICAgICAgICAgICByZXR1cm4gc2V0dGxlUHJvbWlzZVxuICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaWYgKHN3YXBTcGVjLnN3YXBEZWxheSA+IDApIHtcbiAgICAgICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChkb1N3YXAsIHN3YXBTcGVjLnN3YXBEZWxheSlcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRvU3dhcCgpXG4gICAgICB9XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKSB7XG4gICAgICB0cmlnZ2VyRXJyb3JFdmVudChlbHQsICdodG14OnJlc3BvbnNlRXJyb3InLCBtZXJnZU9iamVjdHMoeyBlcnJvcjogJ1Jlc3BvbnNlIFN0YXR1cyBFcnJvciBDb2RlICcgKyB4aHIuc3RhdHVzICsgJyBmcm9tICcgKyByZXNwb25zZUluZm8ucGF0aEluZm8ucmVxdWVzdFBhdGggfSwgcmVzcG9uc2VJbmZvKSlcbiAgICB9XG4gIH1cblxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICAvLyBFeHRlbnNpb25zIEFQSVxuICAvLz0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuXG4gIC8qKiBAdHlwZSB7T2JqZWN0PHN0cmluZywgSHRteEV4dGVuc2lvbj59ICovXG4gIGNvbnN0IGV4dGVuc2lvbnMgPSB7fVxuXG4gIC8qKlxuICAgKiBleHRlbnNpb25CYXNlIGRlZmluZXMgdGhlIGRlZmF1bHQgZnVuY3Rpb25zIGZvciBhbGwgZXh0ZW5zaW9ucy5cbiAgICogQHJldHVybnMge0h0bXhFeHRlbnNpb259XG4gICAqL1xuICBmdW5jdGlvbiBleHRlbnNpb25CYXNlKCkge1xuICAgIHJldHVybiB7XG4gICAgICBpbml0OiBmdW5jdGlvbihhcGkpIHsgcmV0dXJuIG51bGwgfSxcbiAgICAgIGdldFNlbGVjdG9yczogZnVuY3Rpb24oKSB7IHJldHVybiBudWxsIH0sXG4gICAgICBvbkV2ZW50OiBmdW5jdGlvbihuYW1lLCBldnQpIHsgcmV0dXJuIHRydWUgfSxcbiAgICAgIHRyYW5zZm9ybVJlc3BvbnNlOiBmdW5jdGlvbih0ZXh0LCB4aHIsIGVsdCkgeyByZXR1cm4gdGV4dCB9LFxuICAgICAgaXNJbmxpbmVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUpIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBoYW5kbGVTd2FwOiBmdW5jdGlvbihzd2FwU3R5bGUsIHRhcmdldCwgZnJhZ21lbnQsIHNldHRsZUluZm8pIHsgcmV0dXJuIGZhbHNlIH0sXG4gICAgICBlbmNvZGVQYXJhbWV0ZXJzOiBmdW5jdGlvbih4aHIsIHBhcmFtZXRlcnMsIGVsdCkgeyByZXR1cm4gbnVsbCB9XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIGRlZmluZUV4dGVuc2lvbiBpbml0aWFsaXplcyB0aGUgZXh0ZW5zaW9uIGFuZCBhZGRzIGl0IHRvIHRoZSBodG14IHJlZ2lzdHJ5XG4gICAqXG4gICAqIEBzZWUgaHR0cHM6Ly9odG14Lm9yZy9hcGkvI2RlZmluZUV4dGVuc2lvblxuICAgKlxuICAgKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgZXh0ZW5zaW9uIG5hbWVcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9ufSBleHRlbnNpb24gdGhlIGV4dGVuc2lvbiBkZWZpbml0aW9uXG4gICAqL1xuICBmdW5jdGlvbiBkZWZpbmVFeHRlbnNpb24obmFtZSwgZXh0ZW5zaW9uKSB7XG4gICAgaWYgKGV4dGVuc2lvbi5pbml0KSB7XG4gICAgICBleHRlbnNpb24uaW5pdChpbnRlcm5hbEFQSSlcbiAgICB9XG4gICAgZXh0ZW5zaW9uc1tuYW1lXSA9IG1lcmdlT2JqZWN0cyhleHRlbnNpb25CYXNlKCksIGV4dGVuc2lvbilcbiAgfVxuXG4gIC8qKlxuICAgKiByZW1vdmVFeHRlbnNpb24gcmVtb3ZlcyBhbiBleHRlbnNpb24gZnJvbSB0aGUgaHRteCByZWdpc3RyeVxuICAgKlxuICAgKiBAc2VlIGh0dHBzOi8vaHRteC5vcmcvYXBpLyNyZW1vdmVFeHRlbnNpb25cbiAgICpcbiAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWVcbiAgICovXG4gIGZ1bmN0aW9uIHJlbW92ZUV4dGVuc2lvbihuYW1lKSB7XG4gICAgZGVsZXRlIGV4dGVuc2lvbnNbbmFtZV1cbiAgfVxuXG4gIC8qKlxuICAgKiBnZXRFeHRlbnNpb25zIHNlYXJjaGVzIHVwIHRoZSBET00gdHJlZSB0byByZXR1cm4gYWxsIGV4dGVuc2lvbnMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBhIGdpdmVuIGVsZW1lbnRcbiAgICpcbiAgICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAgICogQHBhcmFtIHtIdG14RXh0ZW5zaW9uW109fSBleHRlbnNpb25zVG9SZXR1cm5cbiAgICogQHBhcmFtIHtzdHJpbmdbXT19IGV4dGVuc2lvbnNUb0lnbm9yZVxuICAgKiBAcmV0dXJucyB7SHRteEV4dGVuc2lvbltdfVxuICAgKi9cbiAgZnVuY3Rpb24gZ2V0RXh0ZW5zaW9ucyhlbHQsIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKSB7XG4gICAgaWYgKGV4dGVuc2lvbnNUb1JldHVybiA9PSB1bmRlZmluZWQpIHtcbiAgICAgIGV4dGVuc2lvbnNUb1JldHVybiA9IFtdXG4gICAgfVxuICAgIGlmIChlbHQgPT0gdW5kZWZpbmVkKSB7XG4gICAgICByZXR1cm4gZXh0ZW5zaW9uc1RvUmV0dXJuXG4gICAgfVxuICAgIGlmIChleHRlbnNpb25zVG9JZ25vcmUgPT0gdW5kZWZpbmVkKSB7XG4gICAgICBleHRlbnNpb25zVG9JZ25vcmUgPSBbXVxuICAgIH1cbiAgICBjb25zdCBleHRlbnNpb25zRm9yRWxlbWVudCA9IGdldEF0dHJpYnV0ZVZhbHVlKGVsdCwgJ2h4LWV4dCcpXG4gICAgaWYgKGV4dGVuc2lvbnNGb3JFbGVtZW50KSB7XG4gICAgICBmb3JFYWNoKGV4dGVuc2lvbnNGb3JFbGVtZW50LnNwbGl0KCcsJyksIGZ1bmN0aW9uKGV4dGVuc2lvbk5hbWUpIHtcbiAgICAgICAgZXh0ZW5zaW9uTmFtZSA9IGV4dGVuc2lvbk5hbWUucmVwbGFjZSgvIC9nLCAnJylcbiAgICAgICAgaWYgKGV4dGVuc2lvbk5hbWUuc2xpY2UoMCwgNykgPT0gJ2lnbm9yZTonKSB7XG4gICAgICAgICAgZXh0ZW5zaW9uc1RvSWdub3JlLnB1c2goZXh0ZW5zaW9uTmFtZS5zbGljZSg3KSlcbiAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuICAgICAgICBpZiAoZXh0ZW5zaW9uc1RvSWdub3JlLmluZGV4T2YoZXh0ZW5zaW9uTmFtZSkgPCAwKSB7XG4gICAgICAgICAgY29uc3QgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc1tleHRlbnNpb25OYW1lXVxuICAgICAgICAgIGlmIChleHRlbnNpb24gJiYgZXh0ZW5zaW9uc1RvUmV0dXJuLmluZGV4T2YoZXh0ZW5zaW9uKSA8IDApIHtcbiAgICAgICAgICAgIGV4dGVuc2lvbnNUb1JldHVybi5wdXNoKGV4dGVuc2lvbilcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgfVxuICAgIHJldHVybiBnZXRFeHRlbnNpb25zKGFzRWxlbWVudChwYXJlbnRFbHQoZWx0KSksIGV4dGVuc2lvbnNUb1JldHVybiwgZXh0ZW5zaW9uc1RvSWdub3JlKVxuICB9XG5cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgLy8gSW5pdGlhbGl6YXRpb25cbiAgLy89ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAgdmFyIGlzUmVhZHkgPSBmYWxzZVxuICBnZXREb2N1bWVudCgpLmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpIHtcbiAgICBpc1JlYWR5ID0gdHJ1ZVxuICB9KVxuXG4gIC8qKlxuICAgKiBFeGVjdXRlIGEgZnVuY3Rpb24gbm93IGlmIERPTUNvbnRlbnRMb2FkZWQgaGFzIGZpcmVkLCBvdGhlcndpc2UgbGlzdGVuIGZvciBpdC5cbiAgICpcbiAgICogVGhpcyBmdW5jdGlvbiB1c2VzIGlzUmVhZHkgYmVjYXVzZSB0aGVyZSBpcyBubyByZWxpYWJsZSB3YXkgdG8gYXNrIHRoZSBicm93c2VyIHdoZXRoZXJcbiAgICogdGhlIERPTUNvbnRlbnRMb2FkZWQgZXZlbnQgaGFzIGFscmVhZHkgYmVlbiBmaXJlZDsgdGhlcmUncyBhIGdhcCBiZXR3ZWVuIERPTUNvbnRlbnRMb2FkZWRcbiAgICogZmlyaW5nIGFuZCByZWFkeXN0YXRlPWNvbXBsZXRlLlxuICAgKi9cbiAgZnVuY3Rpb24gcmVhZHkoZm4pIHtcbiAgICAvLyBDaGVja2luZyByZWFkeVN0YXRlIGhlcmUgaXMgYSBmYWlsc2FmZSBpbiBjYXNlIHRoZSBodG14IHNjcmlwdCB0YWcgZW50ZXJlZCB0aGUgRE9NIGJ5XG4gICAgLy8gc29tZSBtZWFucyBvdGhlciB0aGFuIHRoZSBpbml0aWFsIHBhZ2UgbG9hZC5cbiAgICBpZiAoaXNSZWFkeSB8fCBnZXREb2N1bWVudCgpLnJlYWR5U3RhdGUgPT09ICdjb21wbGV0ZScpIHtcbiAgICAgIGZuKClcbiAgICB9IGVsc2Uge1xuICAgICAgZ2V0RG9jdW1lbnQoKS5hZGRFdmVudExpc3RlbmVyKCdET01Db250ZW50TG9hZGVkJywgZm4pXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gaW5zZXJ0SW5kaWNhdG9yU3R5bGVzKCkge1xuICAgIGlmIChodG14LmNvbmZpZy5pbmNsdWRlSW5kaWNhdG9yU3R5bGVzICE9PSBmYWxzZSkge1xuICAgICAgY29uc3Qgbm9uY2VBdHRyaWJ1dGUgPSBodG14LmNvbmZpZy5pbmxpbmVTdHlsZU5vbmNlID8gYCBub25jZT1cIiR7aHRteC5jb25maWcuaW5saW5lU3R5bGVOb25jZX1cImAgOiAnJ1xuICAgICAgZ2V0RG9jdW1lbnQoKS5oZWFkLmluc2VydEFkamFjZW50SFRNTCgnYmVmb3JlZW5kJyxcbiAgICAgICAgJzxzdHlsZScgKyBub25jZUF0dHJpYnV0ZSArICc+XFxcbiAgICAgIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MH1cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnIC4nICsgaHRteC5jb25maWcuaW5kaWNhdG9yQ2xhc3MgKyAne29wYWNpdHk6MTsgdHJhbnNpdGlvbjogb3BhY2l0eSAyMDBtcyBlYXNlLWluO31cXFxuICAgICAgLicgKyBodG14LmNvbmZpZy5yZXF1ZXN0Q2xhc3MgKyAnLicgKyBodG14LmNvbmZpZy5pbmRpY2F0b3JDbGFzcyArICd7b3BhY2l0eToxOyB0cmFuc2l0aW9uOiBvcGFjaXR5IDIwMG1zIGVhc2UtaW47fVxcXG4gICAgICA8L3N0eWxlPicpXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gZ2V0TWV0YUNvbmZpZygpIHtcbiAgICAvKiogQHR5cGUgSFRNTE1ldGFFbGVtZW50ICovXG4gICAgY29uc3QgZWxlbWVudCA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvcignbWV0YVtuYW1lPVwiaHRteC1jb25maWdcIl0nKVxuICAgIGlmIChlbGVtZW50KSB7XG4gICAgICByZXR1cm4gcGFyc2VKU09OKGVsZW1lbnQuY29udGVudClcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG51bGxcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBtZXJnZU1ldGFDb25maWcoKSB7XG4gICAgY29uc3QgbWV0YUNvbmZpZyA9IGdldE1ldGFDb25maWcoKVxuICAgIGlmIChtZXRhQ29uZmlnKSB7XG4gICAgICBodG14LmNvbmZpZyA9IG1lcmdlT2JqZWN0cyhodG14LmNvbmZpZywgbWV0YUNvbmZpZylcbiAgICB9XG4gIH1cblxuICAvLyBpbml0aWFsaXplIHRoZSBkb2N1bWVudFxuICByZWFkeShmdW5jdGlvbigpIHtcbiAgICBtZXJnZU1ldGFDb25maWcoKVxuICAgIGluc2VydEluZGljYXRvclN0eWxlcygpXG4gICAgbGV0IGJvZHkgPSBnZXREb2N1bWVudCgpLmJvZHlcbiAgICBwcm9jZXNzTm9kZShib2R5KVxuICAgIGNvbnN0IHJlc3RvcmVkRWx0cyA9IGdldERvY3VtZW50KCkucXVlcnlTZWxlY3RvckFsbChcbiAgICAgIFwiW2h4LXRyaWdnZXI9J3Jlc3RvcmVkJ10sW2RhdGEtaHgtdHJpZ2dlcj0ncmVzdG9yZWQnXVwiXG4gICAgKVxuICAgIGJvZHkuYWRkRXZlbnRMaXN0ZW5lcignaHRteDphYm9ydCcsIGZ1bmN0aW9uKGV2dCkge1xuICAgICAgY29uc3QgdGFyZ2V0ID0gZXZ0LnRhcmdldFxuICAgICAgY29uc3QgaW50ZXJuYWxEYXRhID0gZ2V0SW50ZXJuYWxEYXRhKHRhcmdldClcbiAgICAgIGlmIChpbnRlcm5hbERhdGEgJiYgaW50ZXJuYWxEYXRhLnhocikge1xuICAgICAgICBpbnRlcm5hbERhdGEueGhyLmFib3J0KClcbiAgICAgIH1cbiAgICB9KVxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgY29uc3Qgb3JpZ2luYWxQb3BzdGF0ZSA9IHdpbmRvdy5vbnBvcHN0YXRlID8gd2luZG93Lm9ucG9wc3RhdGUuYmluZCh3aW5kb3cpIDogbnVsbFxuICAgIC8qKiBAdHlwZSB7KGV2OiBQb3BTdGF0ZUV2ZW50KSA9PiBhbnl9ICovXG4gICAgd2luZG93Lm9ucG9wc3RhdGUgPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgaWYgKGV2ZW50LnN0YXRlICYmIGV2ZW50LnN0YXRlLmh0bXgpIHtcbiAgICAgICAgcmVzdG9yZUhpc3RvcnkoKVxuICAgICAgICBmb3JFYWNoKHJlc3RvcmVkRWx0cywgZnVuY3Rpb24oZWx0KSB7XG4gICAgICAgICAgdHJpZ2dlckV2ZW50KGVsdCwgJ2h0bXg6cmVzdG9yZWQnLCB7XG4gICAgICAgICAgICBkb2N1bWVudDogZ2V0RG9jdW1lbnQoKSxcbiAgICAgICAgICAgIHRyaWdnZXJFdmVudFxuICAgICAgICAgIH0pXG4gICAgICAgIH0pXG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAob3JpZ2luYWxQb3BzdGF0ZSkge1xuICAgICAgICAgIG9yaWdpbmFsUG9wc3RhdGUoZXZlbnQpXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgZ2V0V2luZG93KCkuc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgIHRyaWdnZXJFdmVudChib2R5LCAnaHRteDpsb2FkJywge30pIC8vIGdpdmUgcmVhZHkgaGFuZGxlcnMgYSBjaGFuY2UgdG8gbG9hZCB1cCBiZWZvcmUgZmlyaW5nIHRoaXMgZXZlbnRcbiAgICAgIGJvZHkgPSBudWxsIC8vIGtpbGwgcmVmZXJlbmNlIGZvciBnY1xuICAgIH0sIDApXG4gIH0pXG5cbiAgcmV0dXJuIGh0bXhcbn0pKClcblxuLyoqIEB0eXBlZGVmIHsnZ2V0J3wnaGVhZCd8J3Bvc3QnfCdwdXQnfCdkZWxldGUnfCdjb25uZWN0J3wnb3B0aW9ucyd8J3RyYWNlJ3wncGF0Y2gnfSBIdHRwVmVyYiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IFN3YXBPcHRpb25zXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0T09CXVxuICogQHByb3BlcnR5IHsqfSBbZXZlbnRJbmZvXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFthbmNob3JdXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IFtjb250ZXh0RWxlbWVudF1cbiAqIEBwcm9wZXJ0eSB7c3dhcENhbGxiYWNrfSBbYWZ0ZXJTd2FwQ2FsbGJhY2tdXG4gKiBAcHJvcGVydHkge3N3YXBDYWxsYmFja30gW2FmdGVyU2V0dGxlQ2FsbGJhY2tdXG4gKi9cblxuLyoqXG4gKiBAY2FsbGJhY2sgc3dhcENhbGxiYWNrXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7J2lubmVySFRNTCcgfCAnb3V0ZXJIVE1MJyB8ICdiZWZvcmViZWdpbicgfCAnYWZ0ZXJiZWdpbicgfCAnYmVmb3JlZW5kJyB8ICdhZnRlcmVuZCcgfCAnZGVsZXRlJyB8ICdub25lJyB8IHN0cmluZ30gSHRteFN3YXBTdHlsZVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgSHRteFN3YXBTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge0h0bXhTd2FwU3R5bGV9IHN3YXBTdHlsZVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHN3YXBEZWxheVxuICogQHByb3BlcnR5IHtudW1iZXJ9IHNldHRsZURlbGF5XG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFt0cmFuc2l0aW9uXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2hlYWRdXG4gKiBAcHJvcGVydHkgeyd0b3AnIHwgJ2JvdHRvbSd9IFtzY3JvbGxdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3Njcm9sbFRhcmdldF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2hvd1RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2ZvY3VzU2Nyb2xsXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYgeygodGhpczpOb2RlLCBldnQ6RXZlbnQpID0+IGJvb2xlYW4pICYge3NvdXJjZTogc3RyaW5nfX0gQ29uZGl0aW9uYWxGdW5jdGlvblxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFRyaWdnZXJTcGVjaWZpY2F0aW9uXG4gKiBAcHJvcGVydHkge3N0cmluZ30gdHJpZ2dlclxuICogQHByb3BlcnR5IHtudW1iZXJ9IFtwb2xsSW50ZXJ2YWxdXG4gKiBAcHJvcGVydHkge0NvbmRpdGlvbmFsRnVuY3Rpb259IFtldmVudEZpbHRlcl1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2NoYW5nZWRdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtvbmNlXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbY29uc3VtZV1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbZGVsYXldXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2Zyb21dXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGhyb3R0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3F1ZXVlXVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtyb290XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFt0aHJlc2hvbGRdXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7e2VsdDogRWxlbWVudCwgbWVzc2FnZTogc3RyaW5nLCB2YWxpZGl0eTogVmFsaWRpdHlTdGF0ZX19IEh0bXhFbGVtZW50VmFsaWRhdGlvbkVycm9yXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7UmVjb3JkPHN0cmluZywgc3RyaW5nPn0gSHRteEhlYWRlclNwZWNpZmljYXRpb25cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBIWC1SZXF1ZXN0XG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyXG4gKiBAcHJvcGVydHkge3N0cmluZ3xudWxsfSBIWC1UcmlnZ2VyLU5hbWVcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfG51bGx9IEhYLVRhcmdldFxuICogQHByb3BlcnR5IHtzdHJpbmd9IEhYLUN1cnJlbnQtVVJMXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW0hYLVByb21wdF1cbiAqIEBwcm9wZXJ0eSB7J3RydWUnfSBbSFgtQm9vc3RlZF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbQ29udGVudC1UeXBlXVxuICogQHByb3BlcnR5IHsndHJ1ZSd9IFtIWC1IaXN0b3J5LVJlc3RvcmUtUmVxdWVzdF1cbiAqL1xuXG4vKiogQHR5cGVkZWYgSHRteEFqYXhIZWxwZXJDb250ZXh0XG4gKiBAcHJvcGVydHkge0VsZW1lbnR8c3RyaW5nfSBbc291cmNlXVxuICogQHByb3BlcnR5IHtFdmVudH0gW2V2ZW50XVxuICogQHByb3BlcnR5IHtIdG14QWpheEhhbmRsZXJ9IFtoYW5kbGVyXVxuICogQHByb3BlcnR5IHtFbGVtZW50fHN0cmluZ30gW3RhcmdldF1cbiAqIEBwcm9wZXJ0eSB7SHRteFN3YXBTdHlsZX0gW3N3YXBdXG4gKiBAcHJvcGVydHkge09iamVjdHxGb3JtRGF0YX0gW3ZhbHVlc11cbiAqIEBwcm9wZXJ0eSB7UmVjb3JkPHN0cmluZyxzdHJpbmc+fSBbaGVhZGVyc11cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbc2VsZWN0XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlcXVlc3RDb25maWdcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gYm9vc3RlZFxuICogQHByb3BlcnR5IHtib29sZWFufSB1c2VVcmxQYXJhbXNcbiAqIEBwcm9wZXJ0eSB7Rm9ybURhdGF9IGZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gcGFyYW1ldGVycyBmb3JtRGF0YSBwcm94eVxuICogQHByb3BlcnR5IHtGb3JtRGF0YX0gdW5maWx0ZXJlZEZvcm1EYXRhXG4gKiBAcHJvcGVydHkge09iamVjdH0gdW5maWx0ZXJlZFBhcmFtZXRlcnMgdW5maWx0ZXJlZEZvcm1EYXRhIHByb3h5XG4gKiBAcHJvcGVydHkge0h0bXhIZWFkZXJTcGVjaWZpY2F0aW9ufSBoZWFkZXJzXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdHRwVmVyYn0gdmVyYlxuICogQHByb3BlcnR5IHtIdG14RWxlbWVudFZhbGlkYXRpb25FcnJvcltdfSBlcnJvcnNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gd2l0aENyZWRlbnRpYWxzXG4gKiBAcHJvcGVydHkge251bWJlcn0gdGltZW91dFxuICogQHByb3BlcnR5IHtzdHJpbmd9IHBhdGhcbiAqIEBwcm9wZXJ0eSB7RXZlbnR9IHRyaWdnZXJpbmdFdmVudFxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFJlc3BvbnNlSW5mb1xuICogQHByb3BlcnR5IHtYTUxIdHRwUmVxdWVzdH0geGhyXG4gKiBAcHJvcGVydHkge0VsZW1lbnR9IHRhcmdldFxuICogQHByb3BlcnR5IHtIdG14UmVxdWVzdENvbmZpZ30gcmVxdWVzdENvbmZpZ1xuICogQHByb3BlcnR5IHtIdG14QWpheEV0Y30gZXRjXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IGJvb3N0ZWRcbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBzZWxlY3RcbiAqIEBwcm9wZXJ0eSB7e3JlcXVlc3RQYXRoOiBzdHJpbmcsIGZpbmFsUmVxdWVzdFBhdGg6IHN0cmluZywgcmVzcG9uc2VQYXRoOiBzdHJpbmd8bnVsbCwgYW5jaG9yOiBzdHJpbmd9fSBwYXRoSW5mb1xuICogQHByb3BlcnR5IHtib29sZWFufSBbZmFpbGVkXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbc3VjY2Vzc2Z1bF1cbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2tlZXBJbmRpY2F0b3JzXVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteEFqYXhFdGNcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW3JldHVyblByb21pc2VdXG4gKiBAcHJvcGVydHkge0h0bXhBamF4SGFuZGxlcn0gW2hhbmRsZXJdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7RWxlbWVudH0gW3RhcmdldE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtIdG14U3dhcFN0eWxlfSBbc3dhcE92ZXJyaWRlXVxuICogQHByb3BlcnR5IHtSZWNvcmQ8c3RyaW5nLHN0cmluZz59IFtoZWFkZXJzXVxuICogQHByb3BlcnR5IHtPYmplY3R8Rm9ybURhdGF9IFt2YWx1ZXNdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IFtjcmVkZW50aWFsc11cbiAqIEBwcm9wZXJ0eSB7bnVtYmVyfSBbdGltZW91dF1cbiAqL1xuXG4vKipcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhSZXNwb25zZUhhbmRsaW5nQ29uZmlnXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2NvZGVdXG4gKiBAcHJvcGVydHkge2Jvb2xlYW59IHN3YXBcbiAqIEBwcm9wZXJ0eSB7Ym9vbGVhbn0gW2Vycm9yXVxuICogQHByb3BlcnR5IHtib29sZWFufSBbaWdub3JlVGl0bGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3NlbGVjdF1cbiAqIEBwcm9wZXJ0eSB7c3RyaW5nfSBbdGFyZ2V0XVxuICogQHByb3BlcnR5IHtzdHJpbmd9IFtzd2FwT3ZlcnJpZGVdXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW2V2ZW50XVxuICovXG5cbi8qKlxuICogQHR5cGVkZWYge0h0bXhSZXNwb25zZUluZm8gJiB7c2hvdWxkU3dhcDogYm9vbGVhbiwgc2VydmVyUmVzcG9uc2U6IGFueSwgaXNFcnJvcjogYm9vbGVhbiwgaWdub3JlVGl0bGU6IGJvb2xlYW4sIHNlbGVjdE92ZXJyaWRlOnN0cmluZ319IEh0bXhCZWZvcmVTd2FwRGV0YWlsc1xuICovXG5cbi8qKlxuICogQGNhbGxiYWNrIEh0bXhBamF4SGFuZGxlclxuICogQHBhcmFtIHtFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSB7SHRteFJlc3BvbnNlSW5mb30gcmVzcG9uc2VJbmZvXG4gKi9cblxuLyoqXG4gKiBAdHlwZWRlZiB7KCgpID0+IHZvaWQpfSBIdG14U2V0dGxlVGFza1xuICovXG5cbi8qKlxuICogQHR5cGVkZWYge09iamVjdH0gSHRteFNldHRsZUluZm9cbiAqIEBwcm9wZXJ0eSB7SHRteFNldHRsZVRhc2tbXX0gdGFza3NcbiAqIEBwcm9wZXJ0eSB7RWxlbWVudFtdfSBlbHRzXG4gKiBAcHJvcGVydHkge3N0cmluZ30gW3RpdGxlXVxuICovXG5cbi8qKlxuICogQHNlZSBodHRwczovL2dpdGh1Yi5jb20vYmlnc2t5c29mdHdhcmUvaHRteC1leHRlbnNpb25zL2Jsb2IvbWFpbi9SRUFETUUubWRcbiAqIEB0eXBlZGVmIHtPYmplY3R9IEh0bXhFeHRlbnNpb25cbiAqIEBwcm9wZXJ0eSB7KGFwaTogYW55KSA9PiB2b2lkfSBpbml0XG4gKiBAcHJvcGVydHkgeyhuYW1lOiBzdHJpbmcsIGV2ZW50OiBFdmVudHxDdXN0b21FdmVudCkgPT4gYm9vbGVhbn0gb25FdmVudFxuICogQHByb3BlcnR5IHsodGV4dDogc3RyaW5nLCB4aHI6IFhNTEh0dHBSZXF1ZXN0LCBlbHQ6IEVsZW1lbnQpID0+IHN0cmluZ30gdHJhbnNmb3JtUmVzcG9uc2VcbiAqIEBwcm9wZXJ0eSB7KHN3YXBTdHlsZTogSHRteFN3YXBTdHlsZSkgPT4gYm9vbGVhbn0gaXNJbmxpbmVTd2FwXG4gKiBAcHJvcGVydHkgeyhzd2FwU3R5bGU6IEh0bXhTd2FwU3R5bGUsIHRhcmdldDogTm9kZSwgZnJhZ21lbnQ6IE5vZGUsIHNldHRsZUluZm86IEh0bXhTZXR0bGVJbmZvKSA9PiBib29sZWFufE5vZGVbXX0gaGFuZGxlU3dhcFxuICogQHByb3BlcnR5IHsoeGhyOiBYTUxIdHRwUmVxdWVzdCwgcGFyYW1ldGVyczogRm9ybURhdGEsIGVsdDogTm9kZSkgPT4gKnxzdHJpbmd8bnVsbH0gZW5jb2RlUGFyYW1ldGVyc1xuICogQHByb3BlcnR5IHsoKSA9PiBzdHJpbmdbXXxudWxsfSBnZXRTZWxlY3RvcnNcbiAqL1xuZXhwb3J0IGRlZmF1bHQgaHRteFxuIiwiaW1wb3J0IGh0bXggZnJvbSBcImh0bXgub3JnXCI7XG5cbmZ1bmN0aW9uIGRlcGVuZHNPbihwYXRoU3BlYzogYW55LCB1cmw6IHN0cmluZykge1xuICBpZiAocGF0aFNwZWMgPT09IFwiaWdub3JlXCIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgY29uc3QgZGVwZW5kZW5jeVBhdGggPSBwYXRoU3BlYy5zcGxpdChcIi9cIik7XG4gIGNvbnN0IHVybFBhdGggPSB1cmwuc3BsaXQoXCIvXCIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHVybFBhdGgubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBkZXBlbmRlbmN5RWxlbWVudCA9IGRlcGVuZGVuY3lQYXRoLnNoaWZ0KCk7XG4gICAgY29uc3QgcGF0aEVsZW1lbnQgPSB1cmxQYXRoW2ldO1xuICAgIGlmIChkZXBlbmRlbmN5RWxlbWVudCAhPT0gcGF0aEVsZW1lbnQgJiYgZGVwZW5kZW5jeUVsZW1lbnQgIT09IFwiKlwiKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChcbiAgICAgIGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMCB8fFxuICAgICAgKGRlcGVuZGVuY3lQYXRoLmxlbmd0aCA9PT0gMSAmJiBkZXBlbmRlbmN5UGF0aFswXSA9PT0gXCJcIilcbiAgICApIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG5cbmZ1bmN0aW9uIHJlZnJlc2hQYXRoKHBhdGg6IHN0cmluZykge1xuICBjb25zdCBlbHRzV2l0aERlcHMgPSBodG14LmZpbmRBbGwoXCJbcGF0aC1kZXBzXVwiKTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBlbHRzV2l0aERlcHMubGVuZ3RoOyBpKyspIHtcbiAgICBjb25zdCBlbHQgPSBlbHRzV2l0aERlcHNbaV07XG4gICAgaWYgKGRlcGVuZHNPbihlbHQuZ2V0QXR0cmlidXRlKFwicGF0aC1kZXBzXCIpLCBwYXRoKSkge1xuICAgICAgaHRteC50cmlnZ2VyKGVsdCwgXCJwYXRoLWRlcHNcIiwgbnVsbCk7XG4gICAgfVxuICB9XG59XG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwicGF0aC1kZXBzXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YmVmb3JlT25Mb2FkXCIpIHtcbiAgICAgIGNvbnN0IGNvbmZpZyA9IGV2dC5kZXRhaWwucmVxdWVzdENvbmZpZztcbiAgICAgIC8vIG11dGF0aW5nIGNhbGxcbiAgICAgIGlmIChcbiAgICAgICAgY29uZmlnICYmXG4gICAgICAgIGNvbmZpZy52ZXJiICE9PSBcImdldFwiICYmXG4gICAgICAgIGV2dC50YXJnZXQgIT0gbnVsbCAmJlxuICAgICAgICBldnQudGFyZ2V0IGluc3RhbmNlb2YgRWxlbWVudCAmJlxuICAgICAgICBldnQudGFyZ2V0LmdldEF0dHJpYnV0ZShcInBhdGgtZGVwc1wiKSAhPT0gXCJpZ25vcmVcIlxuICAgICAgKSB7XG4gICAgICAgIHJlZnJlc2hQYXRoKGNvbmZpZy5wYXRoKTtcbiAgICAgIH1cbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5mdW5jdGlvbiBrZWJhYkV2ZW50TmFtZShzdHI6IHN0cmluZykge1xuICAgIHJldHVybiBzdHIucmVwbGFjZSgvKFthLXowLTldKShbQS1aXSkvZywgJyQxLSQyJykudG9Mb3dlckNhc2UoKVxufVxuXG5jb25zdCBpZ25vcmVkRXZlbnRzID0gWydodG14OmJlZm9yZVByb2Nlc3NOb2RlJywgJ2h0bXg6YWZ0ZXJQcm9jZXNzTm9kZScsICdodG14OmNvbmZpZ1JlcXVlc3QnLCAnaHRteDpjb25maWdSZXNwb25zZScsICdodG14OnJlc3BvbnNlRXJyb3InXTtcblxuZnVuY3Rpb24gbWFrZUV2ZW50KGV2ZW50TmFtZTogc3RyaW5nLCBkZXRhaWw6IGFueSkge1xuICAgIGxldCBldnRcbiAgICBpZiAod2luZG93LkN1c3RvbUV2ZW50ICYmIHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gVE9ETzogYGNvbXBvc2VkOiB0cnVlYCBoZXJlIGlzIGEgaGFjayB0byBtYWtlIGdsb2JhbCBldmVudCBoYW5kbGVycyB3b3JrIHdpdGggZXZlbnRzIGluIHNoYWRvdyBET01cbiAgICAgICAgZXZ0ID0gbmV3IEN1c3RvbUV2ZW50KGV2ZW50TmFtZSwgeyBidWJibGVzOiBmYWxzZSwgY2FuY2VsYWJsZTogdHJ1ZSwgY29tcG9zZWQ6IHRydWUsIGRldGFpbCB9KVxuICAgIH0gZWxzZSB7XG4gICAgICAgIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdDdXN0b21FdmVudCcpXG4gICAgICAgIGV2dC5pbml0Q3VzdG9tRXZlbnQoZXZlbnROYW1lLCB0cnVlLCB0cnVlLCBkZXRhaWwpXG4gICAgfVxuICAgIHJldHVybiBldnRcbn1cblxuZnVuY3Rpb24gdHJpZ2dlckNoaWxkcmVuKHRhcmdldDogSFRNTEVsZW1lbnQsIG5hbWU6IHN0cmluZywgZXZlbnQ6IEN1c3RvbUV2ZW50LCB0cmlnZ2VyZWQ6IFNldDxIVE1MRWxlbWVudD4pIHtcbiAgICBpZihpZ25vcmVkRXZlbnRzLmluY2x1ZGVzKG5hbWUpKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBpZiAodGFyZ2V0ICYmIHRhcmdldC5jaGlsZHJlbikge1xuICAgICAgICBBcnJheS5mcm9tKHRhcmdldC5jaGlsZHJlbikuZm9yRWFjaCgoZSkgPT4ge1xuICAgICAgICAgICAgY29uc3Qga2VoYWIgPSBrZWJhYkV2ZW50TmFtZShuYW1lKTtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50TmFtZSA9IGtlaGFiLnJlcGxhY2UoXCJodG14OlwiLCBcImh4LW9uOjpcIilcbiAgICAgICAgICAgIGlmICghdHJpZ2dlcmVkLmhhcyhlIGFzIEhUTUxFbGVtZW50KSkge1xuICAgICAgICAgICAgICAgIGlmKGUuaGFzQXR0cmlidXRlKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuZXdFdmVudCA9IG1ha2VFdmVudChldmVudE5hbWUucmVwbGFjZShcImh4LW9uOjpcIiwgXCJodG14OlwiKSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLmV2ZW50LmRldGFpbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQ6IGUsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3RXZlbnQuZGV0YWlsLm1ldGEgPSAndHJpZ2dlci1jaGlsZHJlbidcbiAgICAgICAgICAgICAgICAgICAgICAgIGUuZGlzcGF0Y2hFdmVudChuZXdFdmVudClcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyaWdnZXJlZC5hZGQoZSBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgICAgICAgICAgICAgIH0sIDEpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChlLmNoaWxkcmVuKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyaWdnZXJDaGlsZHJlbihlIGFzIEhUTUxFbGVtZW50LCBuYW1lLCBldmVudCwgdHJpZ2dlcmVkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuXG4vLyBAdHMtaWdub3JlXG5odG14LmRlZmluZUV4dGVuc2lvbihcInRyaWdnZXItY2hpbGRyZW5cIiwge1xuICAgIG9uRXZlbnQ6IChuYW1lLCBldnQ6IEV2ZW50IHwgQ3VzdG9tRXZlbnQpID0+IHtcbiAgICAgICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYoZXZ0LmRldGFpbC5tZXRhID09PSAndHJpZ2dlci1jaGlsZHJlbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCB0cmlnZ2VyZWQgPSBuZXcgU2V0PEhUTUxFbGVtZW50PigpO1xuICAgICAgICBjb25zdCB0YXJnZXQgPSBldnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50IHx8IGV2dC5kZXRhaWwudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICB0cmlnZ2VyQ2hpbGRyZW4odGFyZ2V0LCBuYW1lLCBldnQsIHRyaWdnZXJlZCk7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcImRlYnVnXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgaWYgKGNvbnNvbGUuZGVidWcpIHtcbiAgICAgIGNvbnNvbGUuZGVidWcobmFtZSwgZXZ0KTtcbiAgICB9IGVsc2UgaWYgKGNvbnNvbGUpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwiREVCVUc6XCIsIG5hbWUsIGV2dCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIG5vb3BcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuY29uc3QgY29uZmlnOiBhbnkgPSBodG14LmNvbmZpZztcblxuLyoqIEB0eXBlIHtpbXBvcnQoXCIuLi9odG14XCIpLkh0bXhJbnRlcm5hbEFwaX0gKi9cbmxldCBhcGk6IGFueTtcblxuY29uc3QgYXR0clByZWZpeCA9IFwiaHgtdGFyZ2V0LVwiO1xuXG4vLyBJRTExIGRvZXNuJ3Qgc3VwcG9ydCBzdHJpbmcuc3RhcnRzV2l0aFxuZnVuY3Rpb24gc3RhcnRzV2l0aChzdHI6IHN0cmluZywgcHJlZml4OiBzdHJpbmcpIHtcbiAgcmV0dXJuIHN0ci5zdWJzdHJpbmcoMCwgcHJlZml4Lmxlbmd0aCkgPT09IHByZWZpeDtcbn1cblxuLyoqXG4gKiBAcGFyYW0ge0hUTUxFbGVtZW50fSBlbHRcbiAqIEBwYXJhbSByZXNwQ29kZU51bWJlclxuICogQHJldHVybnMge0hUTUxFbGVtZW50IHwgbnVsbH1cbiAqL1xuZnVuY3Rpb24gZ2V0UmVzcENvZGVUYXJnZXQoZWx0OiBFbGVtZW50LCByZXNwQ29kZU51bWJlcjogbnVtYmVyKSB7XG4gIGlmICghZWx0IHx8ICFyZXNwQ29kZU51bWJlcikgcmV0dXJuIG51bGw7XG5cbiAgY29uc3QgcmVzcENvZGUgPSByZXNwQ29kZU51bWJlci50b1N0cmluZygpO1xuXG4gIC8vICcqJyBpcyB0aGUgb3JpZ2luYWwgc3ludGF4LCBhcyB0aGUgb2J2aW91cyBjaGFyYWN0ZXIgZm9yIGEgd2lsZGNhcmQuXG4gIC8vIFRoZSAneCcgYWx0ZXJuYXRpdmUgd2FzIGFkZGVkIGZvciBtYXhpbXVtIGNvbXBhdGliaWxpdHkgd2l0aCBIVE1MXG4gIC8vIHRlbXBsYXRpbmcgZW5naW5lcywgZHVlIHRvIGFtYmlndWl0eSBhcm91bmQgd2hpY2ggY2hhcmFjdGVycyBhcmVcbiAgLy8gc3VwcG9ydGVkIGluIEhUTUwgYXR0cmlidXRlcy5cbiAgLy9cbiAgLy8gU3RhcnQgd2l0aCB0aGUgbW9zdCBzcGVjaWZpYyBwb3NzaWJsZSBhdHRyaWJ1dGUgYW5kIGdlbmVyYWxpemUgZnJvbVxuICAvLyB0aGVyZS5cbiAgY29uc3QgYXR0clBvc3NpYmlsaXRpZXMgPSBbXG4gICAgcmVzcENvZGUsXG5cbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcIipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMikgKyBcInhcIixcblxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKlwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwieFwiLFxuICAgIHJlc3BDb2RlLnN1YnN0cigwLCAxKSArIFwiKipcIixcbiAgICByZXNwQ29kZS5zdWJzdHIoMCwgMSkgKyBcInh4XCIsXG5cbiAgICBcIipcIixcbiAgICBcInhcIixcbiAgICBcIioqKlwiLFxuICAgIFwieHh4XCIsXG4gIF07XG4gIGlmIChzdGFydHNXaXRoKHJlc3BDb2RlLCBcIjRcIikgfHwgc3RhcnRzV2l0aChyZXNwQ29kZSwgXCI1XCIpKSB7XG4gICAgYXR0clBvc3NpYmlsaXRpZXMucHVzaChcImVycm9yXCIpO1xuICB9XG5cbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBhdHRyUG9zc2liaWxpdGllcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGF0dHIgPSBhdHRyUHJlZml4ICsgYXR0clBvc3NpYmlsaXRpZXNbaV07XG4gICAgY29uc3QgYXR0clZhbHVlID0gYXBpLmdldENsb3Nlc3RBdHRyaWJ1dGVWYWx1ZShlbHQsIGF0dHIpO1xuICAgIGlmIChhdHRyVmFsdWUpIHtcbiAgICAgIGlmIChhdHRyVmFsdWUgPT09IFwidGhpc1wiKSB7XG4gICAgICAgIHJldHVybiBhcGkuZmluZFRoaXNFbGVtZW50KGVsdCwgYXR0cik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gYXBpLnF1ZXJ5U2VsZWN0b3JFeHQoZWx0LCBhdHRyVmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG4vKiogQHBhcmFtIHtFdmVudH0gZXZ0ICovXG5mdW5jdGlvbiBoYW5kbGVFcnJvckZsYWcoZXZ0OiBDdXN0b21FdmVudCkge1xuICBpZiAoZXZ0LmRldGFpbC5pc0Vycm9yKSB7XG4gICAgaWYgKGNvbmZpZy5yZXNwb25zZVRhcmdldFVuc2V0c0Vycm9yKSB7XG4gICAgICBldnQuZGV0YWlsLmlzRXJyb3IgPSBmYWxzZTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yKSB7XG4gICAgZXZ0LmRldGFpbC5pc0Vycm9yID0gdHJ1ZTtcbiAgfVxufVxuXG5odG14LmRlZmluZUV4dGVuc2lvbihcInJlc3BvbnNlLXRhcmdldHNcIiwge1xuICAvLyBAdHMtaWdub3JlXG4gIGluaXQ6IChhcGlSZWYpID0+IHtcbiAgICBhcGkgPSBhcGlSZWY7XG5cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0VW5zZXRzRXJyb3IgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0U2V0c0Vycm9yID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFNldHNFcnJvciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNFeGlzdGluZyA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyID09PSB1bmRlZmluZWQpIHtcbiAgICAgIGNvbmZpZy5yZXNwb25zZVRhcmdldFByZWZlcnNSZXRhcmdldEhlYWRlciA9IHRydWU7XG4gICAgfVxuICB9LFxuXG4gIC8vIEB0cy1pZ25vcmVcbiAgb25FdmVudDogKG5hbWUsIGV2dCkgPT4ge1xuICAgIGlmICghKGV2dCBpbnN0YW5jZW9mIEN1c3RvbUV2ZW50KSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICBpZiAoXG4gICAgICBuYW1lID09PSBcImh0bXg6YmVmb3JlU3dhcFwiICYmXG4gICAgICBldnQuZGV0YWlsLnhociAmJlxuICAgICAgZXZ0LmRldGFpbC54aHIuc3RhdHVzICE9PSAyMDBcbiAgICApIHtcbiAgICAgIGlmIChldnQuZGV0YWlsLnRhcmdldCkge1xuICAgICAgICBpZiAoY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc0V4aXN0aW5nKSB7XG4gICAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgY29uZmlnLnJlc3BvbnNlVGFyZ2V0UHJlZmVyc1JldGFyZ2V0SGVhZGVyICYmXG4gICAgICAgICAgZXZ0LmRldGFpbC54aHIuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkubWF0Y2goL0hYLVJldGFyZ2V0Oi9pKVxuICAgICAgICApIHtcbiAgICAgICAgICBldnQuZGV0YWlsLnNob3VsZFN3YXAgPSB0cnVlO1xuICAgICAgICAgIGhhbmRsZUVycm9yRmxhZyhldnQpO1xuICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoIWV2dC5kZXRhaWwucmVxdWVzdENvbmZpZykge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHRhcmdldCA9IGdldFJlc3BDb2RlVGFyZ2V0KFxuICAgICAgICBldnQuZGV0YWlsLnJlcXVlc3RDb25maWcuZWx0LFxuICAgICAgICBldnQuZGV0YWlsLnhoci5zdGF0dXMsXG4gICAgICApO1xuICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICBoYW5kbGVFcnJvckZsYWcoZXZ0KTtcbiAgICAgICAgZXZ0LmRldGFpbC5zaG91bGRTd2FwID0gdHJ1ZTtcbiAgICAgICAgZXZ0LmRldGFpbC50YXJnZXQgPSB0YXJnZXQ7XG4gICAgICB9XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0sXG59KTtcbiIsImltcG9ydCBodG14IGZyb20gXCJodG14Lm9yZ1wiO1xuXG5odG14LmRlZmluZUV4dGVuc2lvbihcIm11dGF0aW9uLWVycm9yXCIsIHtcbiAgLy8gQHRzLWlnbm9yZVxuICBvbkV2ZW50OiAobmFtZSwgZXZ0KSA9PiB7XG4gICAgaWYgKCEoZXZ0IGluc3RhbmNlb2YgQ3VzdG9tRXZlbnQpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChuYW1lID09PSBcImh0bXg6YWZ0ZXJSZXF1ZXN0XCIpIHtcbiAgICAgIGlmICghZXZ0LmRldGFpbCB8fCAhZXZ0LmRldGFpbC54aHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgY29uc3Qgc3RhdHVzID0gZXZ0LmRldGFpbC54aHIuc3RhdHVzO1xuICAgICAgaWYgKHN0YXR1cyA+PSA0MDApIHtcbiAgICAgICAgaHRteC5maW5kQWxsKFwiW2h4LW9uXFxcXDpcXFxcOm11dGF0aW9uLWVycm9yXVwiKS5mb3JFYWNoKChlbGVtZW50KSA9PiB7XG4gICAgICAgICAgaHRteC50cmlnZ2VyKGVsZW1lbnQsIFwiaHRteDptdXRhdGlvbi1lcnJvclwiLCB7IHN0YXR1cyB9KTtcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgfVxuICB9LFxufSk7XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxubGV0IGxhc3RWZXJzaW9uID0gXCJcIjtcblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJsaXZlcmVsb2FkXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgbGV0IGVuYWJsZWQgPSBmYWxzZVxuICAgICAgICBmb3IgKGNvbnN0IGVsZW1lbnQgb2YgQXJyYXkuZnJvbShodG14LmZpbmRBbGwoXCJbaHgtZXh0XVwiKSkpIHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC1leHRcIik7XG4gICAgICAgICAgICBpZih2YWx1ZT8uc3BsaXQoXCIgXCIpLmluY2x1ZGVzKFwibGl2ZXJlbG9hZFwiKSkge1xuICAgICAgICAgICAgICAgIGVuYWJsZWQgPSB0cnVlXG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZighZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuXG4gICAgICAgIH1cblxuICAgICAgICBjb25zb2xlLmxvZygnbGl2ZXJlbG9hZCBleHRlbnNpb24gaW5pdGlhbGl6ZWQuJyk7XG4gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBFdmVudFNvdXJjZSBvYmplY3QgYW5kIHBvaW50IGl0IHRvIHlvdXIgU1NFIGVuZHBvaW50XG4gICAgICAgIGNvbnN0IGV2ZW50U291cmNlID0gbmV3IEV2ZW50U291cmNlKCcvZGV2L2xpdmVyZWxvYWQnKTtcbiAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgZXZlbnRTb3VyY2Uub25tZXNzYWdlID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBldmVudC5kYXRhXG4gICAgICAgICAgICAvLyBMb2cgdGhlIG1lc3NhZ2UgZGF0YSByZWNlaXZlZCBmcm9tIHRoZSBzZXJ2ZXJcbiAgICAgICAgICAgIGlmKGxhc3RWZXJzaW9uID09PSBcIlwiKSB7XG4gICAgICAgICAgICAgICAgbGFzdFZlcnNpb24gPSBtZXNzYWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYobGFzdFZlcnNpb24gIT09IG1lc3NhZ2UpIHtcbiAgICAgICAgICAgICAgICBsYXN0VmVyc2lvbiA9IG1lc3NhZ2U7XG4gICAgICAgICAgICAgICAgcmVsb2FkKClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICAgICAgLy8gSGFuZGxlIGVycm9ycyAoZS5nLiwgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQpXG4gICAgICAgIGV2ZW50U291cmNlLm9uZXJyb3IgPSBmdW5jdGlvbihlcnJvcikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRXZlbnRTb3VyY2UgZXJyb3I6JywgZXJyb3IpO1xuICAgICAgICB9O1xuXG4gICAgfSxcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgb25FdmVudDogZnVuY3Rpb24gKG5hbWUsIGV2dCkge1xuXG4gICAgfSxcbn0pO1xuXG5mdW5jdGlvbiByZWxvYWQoKSB7XG4gICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpXG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcblxuY29uc3QgZXZhbEZ1bmNSZWdleCA9L19fZXZhbF9bQS1aYS16MC05XStcXChbYS16XStcXCkvZ21cblxuaHRteC5kZWZpbmVFeHRlbnNpb24oXCJodG1nb1wiLCB7XG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIG9uRXZlbnQ6IGZ1bmN0aW9uIChuYW1lLCBldnQpIHtcbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6YmVmb3JlQ2xlYW51cEVsZW1lbnRcIiAmJiBldnQudGFyZ2V0KSB7XG4gICAgICAgICAgIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGV2dC50YXJnZXQgYXMgSFRNTEVsZW1lbnQpO1xuICAgICAgIH1cbiAgICAgICBpZihuYW1lID09PSBcImh0bXg6bG9hZFwiICYmIGV2dC50YXJnZXQpIHtcbiAgICAgICAgICBpbnZva2VPbkxvYWQoZXZ0LnRhcmdldCBhcyBIVE1MRWxlbWVudCk7XG4gICAgICAgfVxuICAgIH0sXG59KTtcblxuLyoqXG4gKiBCcm93c2VyIGRvZXNuJ3Qgc3VwcG9ydCBvbmxvYWQgZm9yIGFsbCBlbGVtZW50cywgc28gd2UgbmVlZCB0byBtYW51YWxseSB0cmlnZ2VyIGl0XG4gKiB0aGlzIGlzIHVzZWZ1bCBmb3IgbG9jYWxpdHkgb2YgYmVoYXZpb3JcbiAqL1xuZnVuY3Rpb24gaW52b2tlT25Mb2FkKGVsZW1lbnQgOiBFbGVtZW50KSB7XG4gICAgaWYoZWxlbWVudCA9PSBudWxsIHx8ICEoZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxFbGVtZW50KSkge1xuICAgICAgICByZXR1cm5cbiAgICB9XG4gICAgY29uc3QgaWdub3JlZCA9IFsnU0NSSVBUJywgJ0xJTksnLCAnU1RZTEUnLCAnTUVUQScsICdCQVNFJywgJ1RJVExFJywgJ0hFQUQnLCAnSFRNTCcsICdCT0RZJ107XG4gICAgaWYoIWlnbm9yZWQuaW5jbHVkZXMoZWxlbWVudC50YWdOYW1lKSkge1xuICAgICAgICBpZihlbGVtZW50Lmhhc0F0dHJpYnV0ZShcIm9ubG9hZFwiKSkge1xuICAgICAgICAgICAgZWxlbWVudC5vbmxvYWQhKG5ldyBFdmVudChcImxvYWRcIikpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIGNoZWNrIGl0cyBjaGlsZHJlblxuICAgIGVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCgnW29ubG9hZF0nKS5mb3JFYWNoKGludm9rZU9uTG9hZClcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHJlbW92ZUFzc29jaWF0ZWRTY3JpcHRzKGVsZW1lbnQ6IEhUTUxFbGVtZW50KSB7XG4gICBjb25zdCBhdHRyaWJ1dGVzID0gQXJyYXkuZnJvbShlbGVtZW50LmF0dHJpYnV0ZXMpXG4gICAgZm9yIChsZXQgYXR0cmlidXRlIG9mIGF0dHJpYnV0ZXMpIHtcbiAgICAgICBjb25zdCBtYXRjaGVzID0gYXR0cmlidXRlLnZhbHVlLm1hdGNoKGV2YWxGdW5jUmVnZXgpIHx8IFtdXG4gICAgICAgIGZvciAobGV0IG1hdGNoIG9mIG1hdGNoZXMpIHtcbiAgICAgICAgICAgIGNvbnN0IGlkID0gbWF0Y2gucmVwbGFjZShcIigpXCIsIFwiXCIpLnJlcGxhY2UoXCIodGhpcylcIiwgXCJcIikucmVwbGFjZShcIjtcIiwgXCJcIilcbiAgICAgICAgICAgIGNvbnN0IGVsZSA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlkKVxuICAgICAgICAgICAgaWYoZWxlICYmIGVsZS50YWdOYW1lID09PSBcIlNDUklQVFwiKSB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5kZWJ1ZyhcInJlbW92aW5nIGFzc29jaWF0ZWQgc2NyaXB0IHdpdGggaWRcIiwgaWQpXG4gICAgICAgICAgICAgICAgZWxlLnJlbW92ZSgpXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tICdodG14Lm9yZydcbmltcG9ydCB7cmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHN9IGZyb20gXCIuL2h0bWdvXCI7XG5cbmxldCBhcGkgOiBhbnkgPSBudWxsO1xubGV0IHByb2Nlc3NlZCA9IG5ldyBTZXQ8c3RyaW5nPigpXG5cbmh0bXguZGVmaW5lRXh0ZW5zaW9uKFwic3NlXCIsIHtcbiAgICBpbml0OiBmdW5jdGlvbiAoYXBpUmVmKSB7XG4gICAgICAgIGFwaSA9IGFwaVJlZjtcbiAgICB9LFxuICAgIC8vIEB0cy1pZ25vcmVcbiAgICBvbkV2ZW50OiBmdW5jdGlvbiAobmFtZSwgZXZ0KSB7XG4gICAgICAgIGNvbnN0IHRhcmdldCA9IGV2dC50YXJnZXQ7XG4gICAgICAgIGlmKCEodGFyZ2V0IGluc3RhbmNlb2YgSFRNTEVsZW1lbnQpKSB7XG4gICAgICAgICAgICByZXR1cm5cbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZUNsZWFudXBFbGVtZW50Jykge1xuICAgICAgICAgICAgcmVtb3ZlQXNzb2NpYXRlZFNjcmlwdHModGFyZ2V0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG5hbWUgPT09ICdodG14OmJlZm9yZVByb2Nlc3NOb2RlJykge1xuICAgICAgICAgICAgY29uc3QgZWxlbWVudHMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCdbc3NlLWNvbm5lY3RdJyk7XG4gICAgICAgICAgICBmb3IgKGxldCBlbGVtZW50IG9mIEFycmF5LmZyb20oZWxlbWVudHMpKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdXJsID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJzc2UtY29ubmVjdFwiKSE7XG4gICAgICAgICAgICAgICAgaWYodXJsICYmICFwcm9jZXNzZWQuaGFzKHVybCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdEV2ZW50U291cmNlKGVsZW1lbnQsIHVybClcbiAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc2VkLmFkZCh1cmwpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxufSlcblxuZnVuY3Rpb24gY29ubmVjdEV2ZW50U291cmNlKGVsZTogRWxlbWVudCwgdXJsOiBzdHJpbmcpIHtcbiAgICBpZighdXJsKSB7XG4gICAgICAgIHJldHVyblxuICAgIH1cbiAgICBjb25zb2xlLmluZm8oJ0Nvbm5lY3RpbmcgdG8gRXZlbnRTb3VyY2UnLCB1cmwpXG4gICAgY29uc3QgZXZlbnRTb3VyY2UgPSBuZXcgRXZlbnRTb3VyY2UodXJsKTtcblxuICAgIGV2ZW50U291cmNlLmFkZEV2ZW50TGlzdGVuZXIoXCJjbG9zZVwiLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQ2xvc2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgIH0pXG5cbiAgICBldmVudFNvdXJjZS5vbm9wZW4gPSBmdW5jdGlvbihldmVudCkge1xuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlT3BlblwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgfVxuXG4gICAgZXZlbnRTb3VyY2Uub25lcnJvciA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGh0bXgudHJpZ2dlcihlbGUsIFwiaHRteDpzc2VFcnJvclwiLCB7ZXZlbnQ6IGV2ZW50fSk7XG4gICAgICAgIGlmIChldmVudFNvdXJjZS5yZWFkeVN0YXRlID09IEV2ZW50U291cmNlLkNMT1NFRCkge1xuICAgICAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUNsb3NlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGV2ZW50U291cmNlLm9ubWVzc2FnZSA9IGZ1bmN0aW9uKGV2ZW50KSB7XG4gICAgICAgIGNvbnN0IHNldHRsZUluZm8gPSBhcGkubWFrZVNldHRsZUluZm8oZWxlKTtcbiAgICAgICAgaHRteC50cmlnZ2VyKGVsZSwgXCJodG14OnNzZUJlZm9yZU1lc3NhZ2VcIiwge2V2ZW50OiBldmVudH0pO1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IGV2ZW50LmRhdGFcbiAgICAgICAgY29uc3QgZnJhZ21lbnQgPSBhcGkubWFrZUZyYWdtZW50KHJlc3BvbnNlKSBhcyBEb2N1bWVudEZyYWdtZW50O1xuICAgICAgICBjb25zdCBjaGlsZHJlbiA9IEFycmF5LmZyb20oZnJhZ21lbnQuY2hpbGRyZW4pO1xuICAgICAgICBmb3IgKGxldCBjaGlsZCBvZiBjaGlsZHJlbikge1xuICAgICAgICAgICAgYXBpLm9vYlN3YXAoYXBpLmdldEF0dHJpYnV0ZVZhbHVlKGNoaWxkLCAnaHgtc3dhcC1vb2InKSB8fCAndHJ1ZScsIGNoaWxkLCBzZXR0bGVJbmZvKTtcbiAgICAgICAgICAgIC8vIHN1cHBvcnQgaHRtZ28gZXZhbF9fIHNjcmlwdHNcbiAgICAgICAgICAgIGlmKGNoaWxkLnRhZ05hbWUgPT09ICdTQ1JJUFQnICYmIGNoaWxkLmlkLnN0YXJ0c1dpdGgoXCJfX2V2YWxcIikpIHtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNoaWxkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBodG14LnRyaWdnZXIoZWxlLCBcImh0bXg6c3NlQWZ0ZXJNZXNzYWdlXCIsIHtldmVudDogZXZlbnR9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgaHRteCBmcm9tIFwiaHRteC5vcmdcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvcGF0aGRlcHNcIjtcbmltcG9ydCBcIi4vaHRteGV4dGVuc2lvbnMvdHJpZ2dlci1jaGlsZHJlblwiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9kZWJ1Z1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9yZXNwb25zZS10YXJnZXRzXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL211dGF0aW9uLWVycm9yXCI7XG5pbXBvcnQgXCIuL2h0bXhleHRlbnNpb25zL2xpdmVyZWxvYWRcIlxuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9odG1nb1wiO1xuaW1wb3J0IFwiLi9odG14ZXh0ZW5zaW9ucy9zc2VcIlxuXG4vLyBAdHMtaWdub3JlXG53aW5kb3cuaHRteCA9IGh0bXg7XG5cbmZ1bmN0aW9uIHdhdGNoVXJsKGNhbGxiYWNrOiAob2xkVXJsOiBzdHJpbmcsIG5ld1VybDogc3RyaW5nKSA9PiB2b2lkKSB7XG4gIGxldCBsYXN0VXJsID0gd2luZG93LmxvY2F0aW9uLmhyZWY7XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYgIT09IGxhc3RVcmwpIHtcbiAgICAgIGNhbGxiYWNrKGxhc3RVcmwsIHdpbmRvdy5sb2NhdGlvbi5ocmVmKTtcbiAgICAgIGxhc3RVcmwgPSB3aW5kb3cubG9jYXRpb24uaHJlZjtcbiAgICB9XG4gIH0sIDEwMSk7XG59XG5cbndhdGNoVXJsKChfLCBuZXdVcmwpID0+IHtcbiAgb25VcmxDaGFuZ2UobmV3VXJsKTtcbn0pO1xuXG5mdW5jdGlvbiBvblVybENoYW5nZShuZXdVcmw6IHN0cmluZykge1xuICBsZXQgdXJsID0gbmV3IFVSTChuZXdVcmwpO1xuXG4gIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoXCJbaHgtdHJpZ2dlcl1cIikuZm9yRWFjaChmdW5jdGlvbiAoZWxlbWVudCkge1xuICAgIGNvbnN0IHRyaWdnZXJzID0gZWxlbWVudC5nZXRBdHRyaWJ1dGUoXCJoeC10cmlnZ2VyXCIpO1xuICAgIGlmICghdHJpZ2dlcnMpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3Qgc3BsaXQgPSB0cmlnZ2Vycy5zcGxpdChcIiwgXCIpO1xuICAgIGlmIChzcGxpdC5maW5kKChzKSA9PiBzID09PSBcInVybFwiKSkge1xuICAgICAgaHRteC5zd2FwKGVsZW1lbnQsIFwidXJsXCIsIHtcbiAgICAgICAgc3dhcFN0eWxlOiBcIm91dGVySFRNTFwiLFxuICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgIHNldHRsZURlbGF5OiAwLFxuICAgICAgfSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAobGV0IFtrZXksIHZhbHVlc10gb2YgdXJsLnNlYXJjaFBhcmFtcykge1xuICAgICAgICBsZXQgZXZlbnROYW1lID0gXCJxczpcIiArIGtleTtcbiAgICAgICAgaWYgKHRyaWdnZXJzLmluY2x1ZGVzKGV2ZW50TmFtZSkpIHtcbiAgICAgICAgICBjb25zb2xlLmxvZyhcInRyaWdnZXJpbmdcIiwgZXZlbnROYW1lKTtcbiAgICAgICAgICBodG14LnRyaWdnZXIoZWxlbWVudCwgZXZlbnROYW1lLCBudWxsKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfSk7XG5cbiAgZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcIltoeC1tYXRjaC1xcF1cIikuZm9yRWFjaCgoZWwpID0+IHtcbiAgICBsZXQgaGFzTWF0Y2ggPSBmYWxzZTtcbiAgICBmb3IgKGxldCBuYW1lIG9mIGVsLmdldEF0dHJpYnV0ZU5hbWVzKCkpIHtcbiAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiKSkge1xuICAgICAgICBsZXQgbWF0Y2ggPSBuYW1lLnJlcGxhY2UoXCJoeC1tYXRjaC1xcC1tYXBwaW5nOlwiLCBcIlwiKTtcbiAgICAgICAgbGV0IHZhbHVlID0gdXJsLnNlYXJjaFBhcmFtcy5nZXQobWF0Y2gpO1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICBodG14LnN3YXAoZWwsIGVsLmdldEF0dHJpYnV0ZShuYW1lKSA/PyBcIlwiLCB7XG4gICAgICAgICAgICBzd2FwU3R5bGU6IFwiaW5uZXJIVE1MXCIsXG4gICAgICAgICAgICBzd2FwRGVsYXk6IDAsXG4gICAgICAgICAgICBzZXR0bGVEZWxheTogMCxcbiAgICAgICAgICB9KTtcbiAgICAgICAgICBoYXNNYXRjaCA9IHRydWU7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKCFoYXNNYXRjaCkge1xuICAgICAgbGV0IGRlZmF1bHRLZXkgPSBlbC5nZXRBdHRyaWJ1dGUoXCJoeC1tYXRjaC1xcC1kZWZhdWx0XCIpO1xuICAgICAgaWYgKGRlZmF1bHRLZXkpIHtcbiAgICAgICAgaHRteC5zd2FwKFxuICAgICAgICAgIGVsLFxuICAgICAgICAgIGVsLmdldEF0dHJpYnV0ZShcImh4LW1hdGNoLXFwLW1hcHBpbmc6XCIgKyBkZWZhdWx0S2V5KSA/PyBcIlwiLFxuICAgICAgICAgIHsgc3dhcFN0eWxlOiBcImlubmVySFRNTFwiLCBzd2FwRGVsYXk6IDAsIHNldHRsZURlbGF5OiAwIH0sXG4gICAgICAgICk7XG4gICAgICB9XG4gICAgfVxuICB9KTtcbn1cbiJdfQ== \ No newline at end of file From 0ccd236307905c8fee4886b732339cbe38d7171a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 17 Oct 2024 15:10:56 +0000 Subject: [PATCH 002/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 4add787..1228e5e 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d + github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index c07b1b7..f5de551 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 8b1ea31..70f061c 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d +require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 531d9d1..b5144c3 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index bde8528..98e4ac3 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d + github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 34c7ebc..3e24425 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index b84f8e1..00a62d4 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d +require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 531d9d1..b5144c3 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 45b0ca4..60dcf83 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d + github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index cb6ec6e..0c17c70 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 9c33612..debca27 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d +require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 531d9d1..b5144c3 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d h1:oysEaiKB7/WbvEklkyQ7SEE1xmDeGLrBUvF3BAsBUns= -github.com/maddalax/htmgo/framework v0.0.0-20241014151703-8503dffa4e7d/go.mod h1:HYKI49Pb6oyY2opSJdTt145B1vWgfWIDohvlolynv80= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= +github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From a7110576d234cea16596c4c2279caa7e11d6ab32 Mon Sep 17 00:00:00 2001 From: Kevin Lewin <97046295+lewinkedrs@users.noreply.github.com> Date: Fri, 18 Oct 2024 18:29:59 -0400 Subject: [PATCH 003/137] Update app.go (#24) Reformat server listening log message so user could click from terminal or ide --- framework/h/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/h/app.go b/framework/h/app.go index f32c560..42939f3 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -182,7 +182,7 @@ func (app *App) start() { } port := ":3000" - slog.Info(fmt.Sprintf("Server started on port %s", port)) + slog.Info(fmt.Sprintf("Server started at localhost:%s", port)) err := http.ListenAndServe(port, app.Router) if err != nil { From 1d7ac301abd709632f93892820dc1a740f95b3e1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 18 Oct 2024 22:30:40 +0000 Subject: [PATCH 004/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 12 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 1228e5e..b2cc51f 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b + github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index f5de551..20c322e 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 70f061c..bf92348 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b +require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index b5144c3..eca7617 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 98e4ac3..893ffb6 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b + github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 3e24425..33aeb0a 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 00a62d4..d0cf210 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b +require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index b5144c3..eca7617 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 60dcf83..2387993 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b + github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 0c17c70..dbf8bde 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index debca27..52613f2 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b +require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index b5144c3..eca7617 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b h1:UafN4AMdzRau3p/LnXooX29Mgj+wrduBIxHb+AFZxAY= -github.com/maddalax/htmgo/framework v0.0.0-20241017151008-2f0a5262450b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 13f650b28b523698078f8fc19d27519e8889500d Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:48:19 -0500 Subject: [PATCH 005/137] simple auth example --- framework/assets/dist/htmgo.js | 2 +- framework/assets/js/htmgo.ts | 14 +++++++++ .../js/htmxextensions/mutation-error.ts | 6 ++-- framework/h/app.go | 31 +++++++++++++++++++ framework/h/base.go | 4 +++ 5 files changed, 54 insertions(+), 3 deletions(-) diff --git a/framework/assets/dist/htmgo.js b/framework/assets/dist/htmgo.js index 73cfc07..df752a2 100644 --- a/framework/assets/dist/htmgo.js +++ b/framework/assets/dist/htmgo.js @@ -1 +1 @@ -var ne=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(d){triggerEvent(d,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let d=0;d0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let d=getInternalData(u);if(d.triggerSpec=r,d.handledFor==null&&(d.handledFor=[]),d.handledFor.indexOf(e)<0){if(d.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),h=l.value;if(c.lastValue===h)return;c.lastValue=h;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,d=getRawAttribute(u,"name");addValueToFormData(d,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(d){processInputValue(n,r,i,d,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=d,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,d=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let h=getInternalData(n),b=h.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),h=getInternalData(A),p==="drop"&&h.xhr&&h.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(h.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(h.xhr)if(h.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return h.queuedRequests==null&&(h.queuedRequests=[]),x==="first"&&h.queuedRequests.length===0?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(h.queuedRequests=[],h.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;h.xhr=m,h.abortable=T;let H=function(){h.xhr=null,h.abortable=!1,h.queuedRequests!=null&&h.queuedRequests.length>0&&h.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),ee=G[0],j=G[1],D=t;if(M&&(D=ee,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:d,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let te=M?null:encodeParamsForBody(m,n,L);return m.send(te),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,d=null,c=null;return l?(d="push",c=l):a?(d="replace",c=a):u&&(d="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:d,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),f=ne;function re(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=ie(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=ae(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}f.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});f.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=f.config,B,le="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});f.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&f.findAll("[hx-on\\:\\:mutation-error]").forEach(r=>{f.trigger(r,"htmx:mutation-error",{status:n});});}}});var U="";f.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(f.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;f.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target),e==="htmx:load"&&t.target&&K(t.target);}});function K(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(K);}function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,Z=new Set;f.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Z.has(i)&&(de(o,i),Z.add(i));}}}});function de(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){f.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){f.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){f.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&f.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);f.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);f.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=f;function he(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},101);}he((e,t)=>{ge(t);});function ge(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))f.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),f.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){f.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&f.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});} +var ne=function(){let htmx={onLoad:null,process:null,on:null,off:null,trigger:null,ajax:null,find:null,findAll:null,closest:null,values:function(e,t){return getInputValues(e,t||"post").values},remove:null,addClass:null,removeClass:null,toggleClass:null,takeClass:null,swap:null,defineExtension:null,removeExtension:null,logAll:null,logNone:null,logger:null,config:{historyEnabled:!0,historyCacheSize:10,refreshOnHistoryMiss:!1,defaultSwapStyle:"innerHTML",defaultSwapDelay:0,defaultSettleDelay:20,includeIndicatorStyles:!0,indicatorClass:"htmx-indicator",requestClass:"htmx-request",addedClass:"htmx-added",settlingClass:"htmx-settling",swappingClass:"htmx-swapping",allowEval:!0,allowScriptTags:!0,inlineScriptNonce:"",inlineStyleNonce:"",attributesToSettle:["class","style","width","height"],withCredentials:!1,timeout:0,wsReconnectDelay:"full-jitter",wsBinaryType:"blob",disableSelector:"[hx-disable], [data-hx-disable]",scrollBehavior:"instant",defaultFocusScroll:!1,getCacheBusterParam:!1,globalViewTransitions:!1,methodsThatUseUrlParams:["get","delete"],selfRequestsOnly:!0,ignoreTitle:!1,scrollIntoViewOnBoost:!0,triggerSpecsCache:null,disableInheritance:!1,responseHandling:[{code:"204",swap:!1},{code:"[23]..",swap:!0},{code:"[45]..",swap:!1,error:!0}],allowNestedOobSwaps:!0},parseInterval:null,_:null,version:"2.0.2"};htmx.onLoad=onLoadHelper,htmx.process=processNode,htmx.on=addEventListenerImpl,htmx.off=removeEventListenerImpl,htmx.trigger=triggerEvent,htmx.ajax=ajaxHelper,htmx.find=find,htmx.findAll=findAll,htmx.closest=closest,htmx.remove=removeElement,htmx.addClass=addClassToElement,htmx.removeClass=removeClassFromElement,htmx.toggleClass=toggleClassOnElement,htmx.takeClass=takeClassForElement,htmx.swap=swap,htmx.defineExtension=defineExtension,htmx.removeExtension=removeExtension,htmx.logAll=logAll,htmx.logNone=logNone,htmx.parseInterval=parseInterval,htmx._=internalEval;let internalAPI={addTriggerHandler,bodyContains,canAccessLocalStorage,findThisElement,filterValues,swap,hasAttribute,getAttributeValue,getClosestAttributeValue,getClosestMatch,getExpressionVars,getHeaders,getInputValues,getInternalData,getSwapSpecification,getTriggerSpecs,getTarget,makeFragment,mergeObjects,makeSettleInfo,oobSwap,querySelectorExt,settleImmediately,shouldCancel,triggerEvent,triggerErrorEvent,withExtensions},VERBS=["get","post","put","delete","patch"],VERB_SELECTOR=VERBS.map(function(e){return "[hx-"+e+"], [data-hx-"+e+"]"}).join(", "),HEAD_TAG_REGEX=makeTagRegEx("head");function makeTagRegEx(e,t=!1){return new RegExp(`<${e}(\\s[^>]*>|>)([\\s\\S]*?)<\\/${e}>`,t?"gim":"im")}function parseInterval(e){if(e==null)return;let t=NaN;return e.slice(-2)=="ms"?t=parseFloat(e.slice(0,-2)):e.slice(-1)=="s"?t=parseFloat(e.slice(0,-1))*1e3:e.slice(-1)=="m"?t=parseFloat(e.slice(0,-1))*1e3*60:t=parseFloat(e),isNaN(t)?void 0:t}function getRawAttribute(e,t){return e instanceof Element&&e.getAttribute(t)}function hasAttribute(e,t){return !!e.hasAttribute&&(e.hasAttribute(t)||e.hasAttribute("data-"+t))}function getAttributeValue(e,t){return getRawAttribute(e,t)||getRawAttribute(e,"data-"+t)}function parentElt(e){let t=e.parentElement;return !t&&e.parentNode instanceof ShadowRoot?e.parentNode:t}function getDocument(){return document}function getRootNode(e,t){return e.getRootNode?e.getRootNode({composed:t}):getDocument()}function getClosestMatch(e,t){for(;e&&!t(e);)e=parentElt(e);return e||null}function getAttributeValueWithDisinheritance(e,t,n){let r=getAttributeValue(t,n),o=getAttributeValue(t,"hx-disinherit");var i=getAttributeValue(t,"hx-inherit");if(e!==t){if(htmx.config.disableInheritance)return i&&(i==="*"||i.split(" ").indexOf(n)>=0)?r:null;if(o&&(o==="*"||o.split(" ").indexOf(n)>=0))return "unset"}return r}function getClosestAttributeValue(e,t){let n=null;if(getClosestMatch(e,function(r){return !!(n=getAttributeValueWithDisinheritance(e,asElement(r),t))}),n!=="unset")return n}function matches(e,t){let n=e instanceof Element&&(e.matches||e.matchesSelector||e.msMatchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.oMatchesSelector);return !!n&&n.call(e,t)}function getStartTag(e){let n=/<([a-z][^\/\0>\x20\t\r\n\f]*)/i.exec(e);return n?n[1].toLowerCase():""}function parseHTML(e){return new DOMParser().parseFromString(e,"text/html")}function takeChildrenFor(e,t){for(;t.childNodes.length>0;)e.append(t.childNodes[0]);}function duplicateScript(e){let t=getDocument().createElement("script");return forEach(e.attributes,function(n){t.setAttribute(n.name,n.value);}),t.textContent=e.textContent,t.async=!1,htmx.config.inlineScriptNonce&&(t.nonce=htmx.config.inlineScriptNonce),t}function isJavaScriptScriptNode(e){return e.matches("script")&&(e.type==="text/javascript"||e.type==="module"||e.type==="")}function normalizeScriptTags(e){Array.from(e.querySelectorAll("script")).forEach(t=>{if(isJavaScriptScriptNode(t)){let n=duplicateScript(t),r=t.parentNode;try{r.insertBefore(n,t);}catch(o){logError(o);}finally{t.remove();}}});}function makeFragment(e){let t=e.replace(HEAD_TAG_REGEX,""),n=getStartTag(t),r;if(n==="html"){r=new DocumentFragment;let i=parseHTML(e);takeChildrenFor(r,i.body),r.title=i.title;}else if(n==="body"){r=new DocumentFragment;let i=parseHTML(t);takeChildrenFor(r,i.body),r.title=i.title;}else {let i=parseHTML('");r=i.querySelector("template").content,r.title=i.title;var o=r.querySelector("title");o&&o.parentNode===r&&(o.remove(),r.title=o.innerText);}return r&&(htmx.config.allowScriptTags?normalizeScriptTags(r):r.querySelectorAll("script").forEach(i=>i.remove())),r}function maybeCall(e){e&&e();}function isType(e,t){return Object.prototype.toString.call(e)==="[object "+t+"]"}function isFunction(e){return typeof e=="function"}function isRawObject(e){return isType(e,"Object")}function getInternalData(e){let t="htmx-internal-data",n=e[t];return n||(n=e[t]={}),n}function toArray(e){let t=[];if(e)for(let n=0;n=0}function bodyContains(e){let t=e.getRootNode&&e.getRootNode();return t&&t instanceof window.ShadowRoot?getDocument().body.contains(t.host):getDocument().body.contains(e)}function splitOnWhitespace(e){return e.trim().split(/\s+/)}function mergeObjects(e,t){for(let n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e}function parseJSON(e){try{return JSON.parse(e)}catch(t){return logError(t),null}}function canAccessLocalStorage(){let e="htmx:localStorageTest";try{return localStorage.setItem(e,e),localStorage.removeItem(e),!0}catch{return !1}}function normalizePath(e){try{let t=new URL(e);return t&&(e=t.pathname+t.search),/^\/$/.test(e)||(e=e.replace(/\/+$/,"")),e}catch{return e}}function internalEval(str){return maybeEval(getDocument().body,function(){return eval(str)})}function onLoadHelper(e){return htmx.on("htmx:load",function(n){e(n.detail.elt);})}function logAll(){htmx.logger=function(e,t,n){console&&console.log(t,e,n);};}function logNone(){htmx.logger=null;}function find(e,t){return typeof e!="string"?e.querySelector(t):find(getDocument(),e)}function findAll(e,t){return typeof e!="string"?e.querySelectorAll(t):findAll(getDocument(),e)}function getWindow(){return window}function removeElement(e,t){e=resolveTarget(e),t?getWindow().setTimeout(function(){removeElement(e),e=null;},t):parentElt(e).removeChild(e);}function asElement(e){return e instanceof Element?e:null}function asHtmlElement(e){return e instanceof HTMLElement?e:null}function asString(e){return typeof e=="string"?e:null}function asParentNode(e){return e instanceof Element||e instanceof Document||e instanceof DocumentFragment?e:null}function addClassToElement(e,t,n){e=asElement(resolveTarget(e)),e&&(n?getWindow().setTimeout(function(){addClassToElement(e,t),e=null;},n):e.classList&&e.classList.add(t));}function removeClassFromElement(e,t,n){let r=asElement(resolveTarget(e));r&&(n?getWindow().setTimeout(function(){removeClassFromElement(r,t),r=null;},n):r.classList&&(r.classList.remove(t),r.classList.length===0&&r.removeAttribute("class")));}function toggleClassOnElement(e,t){e=resolveTarget(e),e.classList.toggle(t);}function takeClassForElement(e,t){e=resolveTarget(e),forEach(e.parentElement.children,function(n){removeClassFromElement(n,t);}),addClassToElement(asElement(e),t);}function closest(e,t){if(e=asElement(resolveTarget(e)),e&&e.closest)return e.closest(t);do if(e==null||matches(e,t))return e;while(e=e&&asElement(parentElt(e)));return null}function startsWith(e,t){return e.substring(0,t.length)===t}function endsWith(e,t){return e.substring(e.length-t.length)===t}function normalizeSelector(e){let t=e.trim();return startsWith(t,"<")&&endsWith(t,"/>")?t.substring(1,t.length-2):t}function querySelectorAllExt(e,t,n){return e=resolveTarget(e),t.indexOf("closest ")===0?[closest(asElement(e),normalizeSelector(t.substr(8)))]:t.indexOf("find ")===0?[find(asParentNode(e),normalizeSelector(t.substr(5)))]:t==="next"?[asElement(e).nextElementSibling]:t.indexOf("next ")===0?[scanForwardQuery(e,normalizeSelector(t.substr(5)),!!n)]:t==="previous"?[asElement(e).previousElementSibling]:t.indexOf("previous ")===0?[scanBackwardsQuery(e,normalizeSelector(t.substr(9)),!!n)]:t==="document"?[document]:t==="window"?[window]:t==="body"?[document.body]:t==="root"?[getRootNode(e,!!n)]:t.indexOf("global ")===0?querySelectorAllExt(e,t.slice(7),!0):toArray(asParentNode(getRootNode(e,!!n)).querySelectorAll(normalizeSelector(t)))}var scanForwardQuery=function(e,t,n){let r=asParentNode(getRootNode(e,n)).querySelectorAll(t);for(let o=0;o=0;o--){let i=r[o];if(i.compareDocumentPosition(e)===Node.DOCUMENT_POSITION_FOLLOWING)return i}};function querySelectorExt(e,t){return typeof e!="string"?querySelectorAllExt(e,t)[0]:querySelectorAllExt(getDocument().body,e)[0]}function resolveTarget(e,t){return typeof e=="string"?find(asParentNode(t)||document,e):e}function processEventArgs(e,t,n){return isFunction(t)?{target:getDocument().body,event:asString(e),listener:t}:{target:resolveTarget(e),event:asString(t),listener:n}}function addEventListenerImpl(e,t,n){return ready(function(){let o=processEventArgs(e,t,n);o.target.addEventListener(o.event,o.listener);}),isFunction(t)?t:n}function removeEventListenerImpl(e,t,n){return ready(function(){let r=processEventArgs(e,t,n);r.target.removeEventListener(r.event,r.listener);}),isFunction(t)?t:n}let DUMMY_ELT=getDocument().createElement("output");function findAttributeTargets(e,t){let n=getClosestAttributeValue(e,t);if(n){if(n==="this")return [findThisElement(e,t)];{let r=querySelectorAllExt(e,n);return r.length===0?(logError('The selector "'+n+'" on '+t+" returned no matches!"),[DUMMY_ELT]):r}}}function findThisElement(e,t){return asElement(getClosestMatch(e,function(n){return getAttributeValue(asElement(n),t)!=null}))}function getTarget(e){let t=getClosestAttributeValue(e,"hx-target");return t?t==="this"?findThisElement(e,"hx-target"):querySelectorExt(e,t):getInternalData(e).boosted?getDocument().body:e}function shouldSettleAttribute(e){let t=htmx.config.attributesToSettle;for(let n=0;n0?(o=e.substr(0,e.indexOf(":")),r=e.substr(e.indexOf(":")+1,e.length)):o=e);let i=getDocument().querySelectorAll(r);return i?(forEach(i,function(s){let l,a=t.cloneNode(!0);l=getDocument().createDocumentFragment(),l.appendChild(a),isInlineSwap(o,s)||(l=asParentNode(a));let u={shouldSwap:!0,target:s,fragment:l};triggerEvent(s,"htmx:oobBeforeSwap",u)&&(s=u.target,u.shouldSwap&&swapWithStyle(o,s,s,l,n),forEach(n.elts,function(f){triggerEvent(f,"htmx:oobAfterSwap",u);}));}),t.parentNode.removeChild(t)):(t.parentNode.removeChild(t),triggerErrorEvent(getDocument().body,"htmx:oobErrorNoTarget",{content:t})),e}function handlePreservedElements(e){forEach(findAll(e,"[hx-preserve], [data-hx-preserve]"),function(t){let n=getAttributeValue(t,"id"),r=getDocument().getElementById(n);r!=null&&t.parentNode.replaceChild(r,t);});}function handleAttributes(e,t,n){forEach(t.querySelectorAll("[id]"),function(r){let o=getRawAttribute(r,"id");if(o&&o.length>0){let i=o.replace("'","\\'"),s=r.tagName.replace(":","\\:"),l=asParentNode(e),a=l&&l.querySelector(s+"[id='"+i+"']");if(a&&a!==l){let u=r.cloneNode();cloneAttributes(r,a),n.tasks.push(function(){cloneAttributes(r,u);});}}});}function makeAjaxLoadTask(e){return function(){removeClassFromElement(e,htmx.config.addedClass),processNode(asElement(e)),processFocus(asParentNode(e)),triggerEvent(e,"htmx:load");}}function processFocus(e){let t="[autofocus]",n=asHtmlElement(matches(e,t)?e:e.querySelector(t));n?.focus();}function insertNodesBefore(e,t,n,r){for(handleAttributes(e,n,r);n.childNodes.length>0;){let o=n.firstChild;addClassToElement(asElement(o),htmx.config.addedClass),e.insertBefore(o,t),o.nodeType!==Node.TEXT_NODE&&o.nodeType!==Node.COMMENT_NODE&&r.tasks.push(makeAjaxLoadTask(o));}}function stringHash(e,t){let n=0;for(;n0}function swap(e,t,n,r){r||(r={}),e=resolveTarget(e);let o=document.activeElement,i={};try{i={elt:o,start:o?o.selectionStart:null,end:o?o.selectionEnd:null};}catch{}let s=makeSettleInfo(e);if(n.swapStyle==="textContent")e.textContent=t;else {let a=makeFragment(t);if(s.title=a.title,r.selectOOB){let u=r.selectOOB.split(",");for(let f=0;f0?getWindow().setTimeout(l,n.settleDelay):l();}function handleTriggerHeader(e,t,n){let r=e.getResponseHeader(t);if(r.indexOf("{")===0){let o=parseJSON(r);for(let i in o)if(o.hasOwnProperty(i)){let s=o[i];isRawObject(s)?n=s.target!==void 0?s.target:n:s={value:s},triggerEvent(n,i,s);}}else {let o=r.split(",");for(let i=0;i0;){let s=t[0];if(s==="]"){if(r--,r===0){i===null&&(o=o+"true"),t.shift(),o+=")})";try{let l=maybeEval(e,function(){return Function(o)()},function(){return !0});return l.source=o,l}catch(l){return triggerErrorEvent(getDocument().body,"htmx:syntax:error",{error:l,source:o}),null}}}else s==="["&&r++;isPossibleRelativeReference(s,i,n)?o+="(("+n+"."+s+") ? ("+n+"."+s+") : (window."+s+"))":o=o+s,i=t.shift();}}}function consumeUntil(e,t){let n="";for(;e.length>0&&!t.test(e[0]);)n+=e.shift();return n}function consumeCSSSelector(e){let t;return e.length>0&&COMBINED_SELECTOR_START.test(e[0])?(e.shift(),t=consumeUntil(e,COMBINED_SELECTOR_END).trim(),e.shift()):t=consumeUntil(e,WHITESPACE_OR_COMMA),t}let INPUT_SELECTOR="input, textarea, select";function parseAndCacheTrigger(e,t,n){let r=[],o=tokenizeString(t);do{consumeUntil(o,NOT_WHITESPACE);let l=o.length,a=consumeUntil(o,/[,\[\s]/);if(a!=="")if(a==="every"){let u={trigger:"every"};consumeUntil(o,NOT_WHITESPACE),u.pollInterval=parseInterval(consumeUntil(o,/[,\[\s]/)),consumeUntil(o,NOT_WHITESPACE);var i=maybeGenerateConditional(e,o,"event");i&&(u.eventFilter=i),r.push(u);}else {let u={trigger:a};var i=maybeGenerateConditional(e,o,"event");for(i&&(u.eventFilter=i);o.length>0&&o[0]!==",";){consumeUntil(o,NOT_WHITESPACE);let c=o.shift();if(c==="changed")u.changed=!0;else if(c==="once")u.once=!0;else if(c==="consume")u.consume=!0;else if(c==="delay"&&o[0]===":")o.shift(),u.delay=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA));else if(c==="from"&&o[0]===":"){if(o.shift(),COMBINED_SELECTOR_START.test(o[0]))var s=consumeCSSSelector(o);else {var s=consumeUntil(o,WHITESPACE_OR_COMMA);if(s==="closest"||s==="find"||s==="next"||s==="previous"){o.shift();let b=consumeCSSSelector(o);b.length>0&&(s+=" "+b);}}u.from=s;}else c==="target"&&o[0]===":"?(o.shift(),u.target=consumeCSSSelector(o)):c==="throttle"&&o[0]===":"?(o.shift(),u.throttle=parseInterval(consumeUntil(o,WHITESPACE_OR_COMMA))):c==="queue"&&o[0]===":"?(o.shift(),u.queue=consumeUntil(o,WHITESPACE_OR_COMMA)):c==="root"&&o[0]===":"?(o.shift(),u[c]=consumeCSSSelector(o)):c==="threshold"&&o[0]===":"?(o.shift(),u[c]=consumeUntil(o,WHITESPACE_OR_COMMA)):triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()});}r.push(u);}o.length===l&&triggerErrorEvent(e,"htmx:syntax:error",{token:o.shift()}),consumeUntil(o,NOT_WHITESPACE);}while(o[0]===","&&o.shift());return n&&(n[t]=r),r}function getTriggerSpecs(e){let t=getAttributeValue(e,"hx-trigger"),n=[];if(t){let r=htmx.config.triggerSpecsCache;n=r&&r[t]||parseAndCacheTrigger(e,t,r);}return n.length>0?n:matches(e,"form")?[{trigger:"submit"}]:matches(e,'input[type="button"], input[type="submit"]')?[{trigger:"click"}]:matches(e,INPUT_SELECTOR)?[{trigger:"change"}]:[{trigger:"click"}]}function cancelPolling(e){getInternalData(e).cancelled=!0;}function processPolling(e,t,n){let r=getInternalData(e);r.timeout=getWindow().setTimeout(function(){bodyContains(e)&&r.cancelled!==!0&&(maybeFilterEvent(n,e,makeEvent("hx:poll:trigger",{triggerSpec:n,target:e}))||t(e),processPolling(e,t,n));},n.pollInterval);}function isLocalLink(e){return location.hostname===e.hostname&&getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")!==0}function eltIsDisabled(e){return closest(e,htmx.config.disableSelector)}function boostElement(e,t,n){if(e instanceof HTMLAnchorElement&&isLocalLink(e)&&(e.target===""||e.target==="_self")||e.tagName==="FORM"&&String(getRawAttribute(e,"method")).toLowerCase()!=="dialog"){t.boosted=!0;let r,o;if(e.tagName==="A")r="get",o=getRawAttribute(e,"href");else {let i=getRawAttribute(e,"method");r=i?i.toLowerCase():"get",o=getRawAttribute(e,"action");}n.forEach(function(i){addEventListener(e,function(s,l){let a=asElement(s);if(eltIsDisabled(a)){cleanUpElement(a);return}issueAjaxRequest(r,o,a,l);},t,i,!0);});}}function shouldCancel(e,t){let n=asElement(t);return n?!!((e.type==="submit"||e.type==="click")&&(n.tagName==="FORM"||matches(n,'input[type="submit"], button')&&closest(n,"form")!==null||n instanceof HTMLAnchorElement&&n.href&&(n.getAttribute("href")==="#"||n.getAttribute("href").indexOf("#")!==0))):!1}function ignoreBoostedAnchorCtrlClick(e,t){return getInternalData(e).boosted&&e instanceof HTMLAnchorElement&&t.type==="click"&&(t.ctrlKey||t.metaKey)}function maybeFilterEvent(e,t,n){let r=e.eventFilter;if(r)try{return r.call(t,n)!==!0}catch(o){let i=r.source;return triggerErrorEvent(getDocument().body,"htmx:eventFilter:error",{error:o,source:i}),!0}return !1}function addEventListener(e,t,n,r,o){let i=getInternalData(e),s;r.from?s=querySelectorAllExt(e,r.from):s=[e],r.changed&&s.forEach(function(l){let a=getInternalData(l);a.lastValue=l.value;}),forEach(s,function(l){let a=function(u){if(!bodyContains(e)){l.removeEventListener(r.trigger,a);return}if(ignoreBoostedAnchorCtrlClick(e,u)||((o||shouldCancel(u,e))&&u.preventDefault(),maybeFilterEvent(r,e,u)))return;let f=getInternalData(u);if(f.triggerSpec=r,f.handledFor==null&&(f.handledFor=[]),f.handledFor.indexOf(e)<0){if(f.handledFor.push(e),r.consume&&u.stopPropagation(),r.target&&u.target&&!matches(asElement(u.target),r.target))return;if(r.once){if(i.triggeredOnce)return;i.triggeredOnce=!0;}if(r.changed){let c=getInternalData(l),d=l.value;if(c.lastValue===d)return;c.lastValue=d;}if(i.delayed&&clearTimeout(i.delayed),i.throttle)return;r.throttle>0?i.throttle||(triggerEvent(e,"htmx:trigger"),t(e,u),i.throttle=getWindow().setTimeout(function(){i.throttle=null;},r.throttle)):r.delay>0?i.delayed=getWindow().setTimeout(function(){triggerEvent(e,"htmx:trigger"),t(e,u);},r.delay):(triggerEvent(e,"htmx:trigger"),t(e,u));}};n.listenerInfos==null&&(n.listenerInfos=[]),n.listenerInfos.push({trigger:r.trigger,listener:a,on:l}),l.addEventListener(r.trigger,a);});}let windowIsScrolling=!1,scrollHandler=null;function initScrollHandler(){scrollHandler||(scrollHandler=function(){windowIsScrolling=!0;},window.addEventListener("scroll",scrollHandler),setInterval(function(){windowIsScrolling&&(windowIsScrolling=!1,forEach(getDocument().querySelectorAll("[hx-trigger*='revealed'],[data-hx-trigger*='revealed']"),function(e){maybeReveal(e);}));},200));}function maybeReveal(e){!hasAttribute(e,"data-hx-revealed")&&isScrolledIntoView(e)&&(e.setAttribute("data-hx-revealed","true"),getInternalData(e).initHash?triggerEvent(e,"revealed"):e.addEventListener("htmx:afterProcessNode",function(){triggerEvent(e,"revealed");},{once:!0}));}function loadImmediately(e,t,n,r){let o=function(){n.loaded||(n.loaded=!0,t(e));};r>0?getWindow().setTimeout(o,r):o();}function processVerbs(e,t,n){let r=!1;return forEach(VERBS,function(o){if(hasAttribute(e,"hx-"+o)){let i=getAttributeValue(e,"hx-"+o);r=!0,t.path=i,t.verb=o,n.forEach(function(s){addTriggerHandler(e,s,t,function(l,a){let u=asElement(l);if(closest(u,htmx.config.disableSelector)){cleanUpElement(u);return}issueAjaxRequest(o,i,u,a);});});}}),r}function addTriggerHandler(e,t,n,r){if(t.trigger==="revealed")initScrollHandler(),addEventListener(e,r,n,t),maybeReveal(asElement(e));else if(t.trigger==="intersect"){let o={};t.root&&(o.root=querySelectorExt(e,t.root)),t.threshold&&(o.threshold=parseFloat(t.threshold)),new IntersectionObserver(function(s){for(let l=0;l0?(n.polling=!0,processPolling(asElement(e),r,t)):addEventListener(e,r,n,t);}function shouldProcessHxOn(e){let t=asElement(e);if(!t)return !1;let n=t.attributes;for(let r=0;r", "+i).join(""))}else return []}function maybeSetLastButtonClicked(e){let t=closest(asElement(e.target),"button, input[type='submit']"),n=getRelatedFormData(e);n&&(n.lastButtonClicked=t);}function maybeUnsetLastButtonClicked(e){let t=getRelatedFormData(e);t&&(t.lastButtonClicked=null);}function getRelatedFormData(e){let t=closest(asElement(e.target),"button, input[type='submit']");if(!t)return;let n=resolveTarget("#"+getRawAttribute(t,"form"),t.getRootNode())||closest(t,"form");if(n)return getInternalData(n)}function initButtonTracking(e){e.addEventListener("click",maybeSetLastButtonClicked),e.addEventListener("focusin",maybeSetLastButtonClicked),e.addEventListener("focusout",maybeUnsetLastButtonClicked);}function addHxOnEventHandler(e,t,n){let r=getInternalData(e);Array.isArray(r.onHandlers)||(r.onHandlers=[]);let o,i=function(s){maybeEval(e,function(){eltIsDisabled(e)||(o||(o=new Function("event",n)),o.call(e,s));});};e.addEventListener(t,i),r.onHandlers.push({event:t,listener:i});}function processHxOnWildcard(e){deInitOnHandlers(e);for(let t=0;thtmx.config.historyCacheSize;)i.shift();for(;i.length>0;)try{localStorage.setItem("htmx-history-cache",JSON.stringify(i));break}catch(l){triggerErrorEvent(getDocument().body,"htmx:historyCacheError",{cause:l,cache:i}),i.shift();}}function getCachedHistory(e){if(!canAccessLocalStorage())return null;e=normalizePath(e);let t=parseJSON(localStorage.getItem("htmx-history-cache"))||[];for(let n=0;n=200&&this.status<400){triggerEvent(getDocument().body,"htmx:historyCacheMissLoad",n);let r=makeFragment(this.response),o=r.querySelector("[hx-history-elt],[data-hx-history-elt]")||r,i=getHistoryElement(),s=makeSettleInfo(i);handleTitle(r.title),swapInnerHTML(i,o,s),settleImmediately(s.tasks),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,cacheMiss:!0,serverResponse:this.response});}else triggerErrorEvent(getDocument().body,"htmx:historyCacheMissLoadError",n);},t.send();}function restoreHistory(e){saveCurrentPageToHistory(),e=e||location.pathname+location.search;let t=getCachedHistory(e);if(t){let n=makeFragment(t.content),r=getHistoryElement(),o=makeSettleInfo(r);handleTitle(n.title),swapInnerHTML(r,n,o),settleImmediately(o.tasks),getWindow().setTimeout(function(){window.scrollTo(0,t.scroll);},0),currentPathForHistory=e,triggerEvent(getDocument().body,"htmx:historyRestore",{path:e,item:t});}else htmx.config.refreshOnHistoryMiss?window.location.reload(!0):loadHistoryFromServer(e);}function addRequestIndicatorClasses(e){let t=findAttributeTargets(e,"hx-indicator");return t==null&&(t=[e]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.classList.add.call(n.classList,htmx.config.requestClass);}),t}function disableElements(e){let t=findAttributeTargets(e,"hx-disabled-elt");return t==null&&(t=[]),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)+1,n.setAttribute("disabled",""),n.setAttribute("data-disabled-by-htmx","");}),t}function removeRequestIndicators(e,t){forEach(e,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&n.classList.remove.call(n.classList,htmx.config.requestClass);}),forEach(t,function(n){let r=getInternalData(n);r.requestCount=(r.requestCount||0)-1,r.requestCount===0&&(n.removeAttribute("disabled"),n.removeAttribute("data-disabled-by-htmx"));});}function haveSeenNode(e,t){for(let n=0;nt.indexOf(o)<0):r=r.filter(o=>o!==t),n.delete(e),forEach(r,o=>n.append(e,o));}}function processInputValue(e,t,n,r,o){if(!(r==null||haveSeenNode(e,r))){if(e.push(r),shouldInclude(r)){let i=getRawAttribute(r,"name"),s=r.value;r instanceof HTMLSelectElement&&r.multiple&&(s=toArray(r.querySelectorAll("option:checked")).map(function(l){return l.value})),r instanceof HTMLInputElement&&r.files&&(s=toArray(r.files)),addValueToFormData(i,s,t),o&&validateElement(r,n);}r instanceof HTMLFormElement&&(forEach(r.elements,function(i){e.indexOf(i)>=0?removeValueFromFormData(i.name,i.value,t):e.push(i),o&&validateElement(i,n);}),new FormData(r).forEach(function(i,s){i instanceof File&&i.name===""||addValueToFormData(s,i,t);}));}}function validateElement(e,t){let n=e;n.willValidate&&(triggerEvent(n,"htmx:validation:validate"),n.checkValidity()||(t.push({elt:n,message:n.validationMessage,validity:n.validity}),triggerEvent(n,"htmx:validation:failed",{message:n.validationMessage,validity:n.validity})));}function overrideFormData(e,t){for(let n of t.keys())e.delete(n);return t.forEach(function(n,r){e.append(r,n);}),e}function getInputValues(e,t){let n=[],r=new FormData,o=new FormData,i=[],s=getInternalData(e);s.lastButtonClicked&&!bodyContains(s.lastButtonClicked)&&(s.lastButtonClicked=null);let l=e instanceof HTMLFormElement&&e.noValidate!==!0||getAttributeValue(e,"hx-validate")==="true";if(s.lastButtonClicked&&(l=l&&s.lastButtonClicked.formNoValidate!==!0),t!=="get"&&processInputValue(n,o,i,closest(e,"form"),l),processInputValue(n,r,i,e,l),s.lastButtonClicked||e.tagName==="BUTTON"||e.tagName==="INPUT"&&getRawAttribute(e,"type")==="submit"){let u=s.lastButtonClicked||e,f=getRawAttribute(u,"name");addValueToFormData(f,u.value,o);}let a=findAttributeTargets(e,"hx-include");return forEach(a,function(u){processInputValue(n,r,i,asElement(u),l),matches(u,"form")||forEach(asParentNode(u).querySelectorAll(INPUT_SELECTOR),function(f){processInputValue(n,r,i,f,l);});}),overrideFormData(r,o),{errors:i,formData:r,values:formDataProxy(r)}}function appendParam(e,t,n){e!==""&&(e+="&"),String(n)==="[object Object]"&&(n=JSON.stringify(n));let r=encodeURIComponent(n);return e+=encodeURIComponent(t)+"="+r,e}function urlEncode(e){e=formDataFromObject(e);let t="";return e.forEach(function(n,r){t=appendParam(t,r,n);}),t}function getHeaders(e,t,n){let r={"HX-Request":"true","HX-Trigger":getRawAttribute(e,"id"),"HX-Trigger-Name":getRawAttribute(e,"name"),"HX-Target":getAttributeValue(t,"id"),"HX-Current-URL":getDocument().location.href};return getValuesForElement(e,"hx-headers",!1,r),n!==void 0&&(r["HX-Prompt"]=n),getInternalData(e).boosted&&(r["HX-Boosted"]="true"),r}function filterValues(e,t){let n=getClosestAttributeValue(t,"hx-params");if(n){if(n==="none")return new FormData;if(n==="*")return e;if(n.indexOf("not ")===0)return forEach(n.substr(4).split(","),function(r){r=r.trim(),e.delete(r);}),e;{let r=new FormData;return forEach(n.split(","),function(o){o=o.trim(),e.has(o)&&e.getAll(o).forEach(function(i){r.append(o,i);});}),r}}else return e}function isAnchorLink(e){return !!getRawAttribute(e,"href")&&getRawAttribute(e,"href").indexOf("#")>=0}function getSwapSpecification(e,t){let n=t||getClosestAttributeValue(e,"hx-swap"),r={swapStyle:getInternalData(e).boosted?"innerHTML":htmx.config.defaultSwapStyle,swapDelay:htmx.config.defaultSwapDelay,settleDelay:htmx.config.defaultSettleDelay};if(htmx.config.scrollIntoViewOnBoost&&getInternalData(e).boosted&&!isAnchorLink(e)&&(r.show="top"),n){let s=splitOnWhitespace(n);if(s.length>0)for(let l=0;l0?o.join(":"):null;r.scroll=f,r.scrollTarget=i;}else if(a.indexOf("show:")===0){var o=a.substr(5).split(":");let c=o.pop();var i=o.length>0?o.join(":"):null;r.show=c,r.showTarget=i;}else if(a.indexOf("focus-scroll:")===0){let u=a.substr(13);r.focusScroll=u=="true";}else l==0?r.swapStyle=a:logError("Unknown modifier in hx-swap: "+a);}}return r}function usesFormData(e){return getClosestAttributeValue(e,"hx-encoding")==="multipart/form-data"||matches(e,"form")&&getRawAttribute(e,"enctype")==="multipart/form-data"}function encodeParamsForBody(e,t,n){let r=null;return withExtensions(t,function(o){r==null&&(r=o.encodeParameters(e,n,t));}),r??(usesFormData(t)?overrideFormData(new FormData,formDataFromObject(n)):urlEncode(n))}function makeSettleInfo(e){return {tasks:[],elts:[e]}}function updateScrollState(e,t){let n=e[0],r=e[e.length-1];if(t.scroll){var o=null;t.scrollTarget&&(o=asElement(querySelectorExt(n,t.scrollTarget))),t.scroll==="top"&&(n||o)&&(o=o||n,o.scrollTop=0),t.scroll==="bottom"&&(r||o)&&(o=o||r,o.scrollTop=o.scrollHeight);}if(t.show){var o=null;if(t.showTarget){let s=t.showTarget;t.showTarget==="window"&&(s="body"),o=asElement(querySelectorExt(n,s));}t.show==="top"&&(n||o)&&(o=o||n,o.scrollIntoView({block:"start",behavior:htmx.config.scrollBehavior})),t.show==="bottom"&&(r||o)&&(o=o||r,o.scrollIntoView({block:"end",behavior:htmx.config.scrollBehavior}));}}function getValuesForElement(e,t,n,r){if(r==null&&(r={}),e==null)return r;let o=getAttributeValue(e,t);if(o){let i=o.trim(),s=n;if(i==="unset")return null;i.indexOf("javascript:")===0?(i=i.substr(11),s=!0):i.indexOf("js:")===0&&(i=i.substr(3),s=!0),i.indexOf("{")!==0&&(i="{"+i+"}");let l;s?l=maybeEval(e,function(){return Function("return ("+i+")")()},{}):l=parseJSON(i);for(let a in l)l.hasOwnProperty(a)&&r[a]==null&&(r[a]=l[a]);}return getValuesForElement(asElement(parentElt(e)),t,n,r)}function maybeEval(e,t,n){return htmx.config.allowEval?t():(triggerErrorEvent(e,"htmx:evalDisallowedError"),n)}function getHXVarsForElement(e,t){return getValuesForElement(e,"hx-vars",!0,t)}function getHXValsForElement(e,t){return getValuesForElement(e,"hx-vals",!1,t)}function getExpressionVars(e){return mergeObjects(getHXVarsForElement(e),getHXValsForElement(e))}function safelySetHeaderValue(e,t,n){if(n!==null)try{e.setRequestHeader(t,n);}catch{e.setRequestHeader(t,encodeURIComponent(n)),e.setRequestHeader(t+"-URI-AutoEncoded","true");}}function getPathFromResponse(e){if(e.responseURL&&typeof URL<"u")try{let t=new URL(e.responseURL);return t.pathname+t.search}catch{triggerErrorEvent(getDocument().body,"htmx:badResponseUrl",{url:e.responseURL});}}function hasHeader(e,t){return t.test(e.getAllResponseHeaders())}function ajaxHelper(e,t,n){return e=e.toLowerCase(),n?n instanceof Element||typeof n=="string"?issueAjaxRequest(e,t,null,null,{targetOverride:resolveTarget(n),returnPromise:!0}):issueAjaxRequest(e,t,resolveTarget(n.source),n.event,{handler:n.handler,headers:n.headers,values:n.values,targetOverride:resolveTarget(n.target),swapOverride:n.swap,select:n.select,returnPromise:!0}):issueAjaxRequest(e,t,null,null,{returnPromise:!0})}function hierarchyForElt(e){let t=[];for(;e;)t.push(e),e=e.parentElement;return t}function verifyPath(e,t,n){let r,o;return typeof URL=="function"?(o=new URL(t,document.location.href),r=document.location.origin===o.origin):(o=t,r=startsWith(t,document.location.origin)),htmx.config.selfRequestsOnly&&!r?!1:triggerEvent(e,"htmx:validateUrl",mergeObjects({url:o,sameHost:r},n))}function formDataFromObject(e){if(e instanceof FormData)return e;let t=new FormData;for(let n in e)e.hasOwnProperty(n)&&(typeof e[n].forEach=="function"?e[n].forEach(function(r){t.append(n,r);}):typeof e[n]=="object"&&!(e[n]instanceof Blob)?t.append(n,JSON.stringify(e[n])):t.append(n,e[n]));return t}function formDataArrayProxy(e,t,n){return new Proxy(n,{get:function(r,o){return typeof o=="number"?r[o]:o==="length"?r.length:o==="push"?function(i){r.push(i),e.append(t,i);}:typeof r[o]=="function"?function(){r[o].apply(r,arguments),e.delete(t),r.forEach(function(i){e.append(t,i);});}:r[o]&&r[o].length===1?r[o][0]:r[o]},set:function(r,o,i){return r[o]=i,e.delete(t),r.forEach(function(s){e.append(t,s);}),!0}})}function formDataProxy(e){return new Proxy(e,{get:function(t,n){if(typeof n=="symbol")return Reflect.get(t,n);if(n==="toJSON")return ()=>Object.fromEntries(e);if(n in t)return typeof t[n]=="function"?function(){return e[n].apply(e,arguments)}:t[n];let r=e.getAll(n);if(r.length!==0)return r.length===1?r[0]:formDataArrayProxy(t,n,r)},set:function(t,n,r){return typeof n!="string"?!1:(t.delete(n),typeof r.forEach=="function"?r.forEach(function(o){t.append(n,o);}):typeof r=="object"&&!(r instanceof Blob)?t.append(n,JSON.stringify(r)):t.append(n,r),!0)},deleteProperty:function(t,n){return typeof n=="string"&&t.delete(n),!0},ownKeys:function(t){return Reflect.ownKeys(Object.fromEntries(t))},getOwnPropertyDescriptor:function(t,n){return Reflect.getOwnPropertyDescriptor(Object.fromEntries(t),n)}})}function issueAjaxRequest(e,t,n,r,o,i){let s=null,l=null;if(o=o??{},o.returnPromise&&typeof Promise<"u")var a=new Promise(function(g,E){s=g,l=E;});n==null&&(n=getDocument().body);let u=o.handler||handleAjaxResponse,f=o.select||null;if(!bodyContains(n))return maybeCall(s),a;let c=o.targetOverride||asElement(getTarget(n));if(c==null||c==DUMMY_ELT)return triggerErrorEvent(n,"htmx:targetError",{target:getAttributeValue(n,"hx-target")}),maybeCall(l),a;let d=getInternalData(n),b=d.lastButtonClicked;if(b){let g=getRawAttribute(b,"formaction");g!=null&&(t=g);let E=getRawAttribute(b,"formmethod");E!=null&&E.toLowerCase()!=="dialog"&&(e=E);}let S=getClosestAttributeValue(n,"hx-confirm");if(i===void 0&&triggerEvent(n,"htmx:confirm",{target:c,elt:n,path:t,verb:e,triggeringEvent:r,etc:o,issueRequest:function(O){return issueAjaxRequest(e,t,n,r,o,!!O)},question:S})===!1)return maybeCall(s),a;let A=n,p=getClosestAttributeValue(n,"hx-sync"),x=null,T=!1;if(p){let g=p.split(":"),E=g[0].trim();if(E==="this"?A=findThisElement(n,"hx-sync"):A=asElement(querySelectorExt(n,E)),p=(g[1]||"drop").trim(),d=getInternalData(A),p==="drop"&&d.xhr&&d.abortable!==!0)return maybeCall(s),a;if(p==="abort"){if(d.xhr)return maybeCall(s),a;T=!0;}else p==="replace"?triggerEvent(A,"htmx:abort"):p.indexOf("queue")===0&&(x=(p.split(" ")[1]||"last").trim());}if(d.xhr)if(d.abortable)triggerEvent(A,"htmx:abort");else {if(x==null){if(r){let g=getInternalData(r);g&&g.triggerSpec&&g.triggerSpec.queue&&(x=g.triggerSpec.queue);}x==null&&(x="last");}return d.queuedRequests==null&&(d.queuedRequests=[]),x==="first"&&d.queuedRequests.length===0?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="all"?d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);}):x==="last"&&(d.queuedRequests=[],d.queuedRequests.push(function(){issueAjaxRequest(e,t,n,r,o);})),maybeCall(s),a}let m=new XMLHttpRequest;d.xhr=m,d.abortable=T;let H=function(){d.xhr=null,d.abortable=!1,d.queuedRequests!=null&&d.queuedRequests.length>0&&d.queuedRequests.shift()();},N=getClosestAttributeValue(n,"hx-prompt");if(N){var I=prompt(N);if(I===null||!triggerEvent(n,"htmx:prompt",{prompt:I,target:c}))return maybeCall(s),H(),a}if(S&&!i&&!confirm(S))return maybeCall(s),H(),a;let R=getHeaders(n,c,I);e!=="get"&&!usesFormData(n)&&(R["Content-Type"]="application/x-www-form-urlencoded"),o.headers&&(R=mergeObjects(R,o.headers));let v=getInputValues(n,e),q=v.errors,F=v.formData;o.values&&overrideFormData(F,formDataFromObject(o.values));let _=formDataFromObject(getExpressionVars(n)),W=overrideFormData(F,_),L=filterValues(W,n);htmx.config.getCacheBusterParam&&e==="get"&&L.set("org.htmx.cache-buster",getRawAttribute(c,"id")||"true"),(t==null||t==="")&&(t=getDocument().location.href);let X=getValuesForElement(n,"hx-request"),Y=getInternalData(n).boosted,M=htmx.config.methodsThatUseUrlParams.indexOf(e)>=0,w={boosted:Y,useUrlParams:M,formData:L,parameters:formDataProxy(L),unfilteredFormData:W,unfilteredParameters:formDataProxy(W),headers:R,target:c,verb:e,errors:q,withCredentials:o.credentials||X.credentials||htmx.config.withCredentials,timeout:o.timeout||X.timeout||htmx.config.timeout,path:t,triggeringEvent:r};if(!triggerEvent(n,"htmx:configRequest",w))return maybeCall(s),H(),a;if(t=w.path,e=w.verb,R=w.headers,L=formDataFromObject(w.parameters),q=w.errors,M=w.useUrlParams,q&&q.length>0)return triggerEvent(n,"htmx:validation:halted",w),maybeCall(s),H(),a;let G=t.split("#"),ee=G[0],j=G[1],D=t;if(M&&(D=ee,!L.keys().next().done&&(D.indexOf("?")<0?D+="?":D+="&",D+=urlEncode(L),j&&(D+="#"+j))),!verifyPath(n,D,w))return triggerErrorEvent(n,"htmx:invalidPath",w),maybeCall(l),a;if(m.open(e.toUpperCase(),D,!0),m.overrideMimeType("text/html"),m.withCredentials=w.withCredentials,m.timeout=w.timeout,!X.noHeaders){for(let g in R)if(R.hasOwnProperty(g)){let E=R[g];safelySetHeaderValue(m,g,E);}}let y={xhr:m,target:c,requestConfig:w,etc:o,boosted:Y,select:f,pathInfo:{requestPath:t,finalRequestPath:D,responsePath:null,anchor:j}};if(m.onload=function(){try{let g=hierarchyForElt(n);if(y.pathInfo.responsePath=getPathFromResponse(m),u(n,y),y.keepIndicators!==!0&&removeRequestIndicators(V,k),triggerEvent(n,"htmx:afterRequest",y),triggerEvent(n,"htmx:afterOnLoad",y),!bodyContains(n)){let E=null;for(;g.length>0&&E==null;){let O=g.shift();bodyContains(O)&&(E=O);}E&&(triggerEvent(E,"htmx:afterRequest",y),triggerEvent(E,"htmx:afterOnLoad",y));}maybeCall(s),H();}catch(g){throw triggerErrorEvent(n,"htmx:onLoadError",mergeObjects({error:g},y)),g}},m.onerror=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendError",y),maybeCall(l),H();},m.onabort=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:sendAbort",y),maybeCall(l),H();},m.ontimeout=function(){removeRequestIndicators(V,k),triggerErrorEvent(n,"htmx:afterRequest",y),triggerErrorEvent(n,"htmx:timeout",y),maybeCall(l),H();},!triggerEvent(n,"htmx:beforeRequest",y))return maybeCall(s),H(),a;var V=addRequestIndicatorClasses(n),k=disableElements(n);forEach(["loadstart","loadend","progress","abort"],function(g){forEach([m,m.upload],function(E){E.addEventListener(g,function(O){triggerEvent(n,"htmx:xhr:"+g,{lengthComputable:O.lengthComputable,loaded:O.loaded,total:O.total});});});}),triggerEvent(n,"htmx:beforeSend",y);let te=M?null:encodeParamsForBody(m,n,L);return m.send(te),a}function determineHistoryUpdates(e,t){let n=t.xhr,r=null,o=null;if(hasHeader(n,/HX-Push:/i)?(r=n.getResponseHeader("HX-Push"),o="push"):hasHeader(n,/HX-Push-Url:/i)?(r=n.getResponseHeader("HX-Push-Url"),o="push"):hasHeader(n,/HX-Replace-Url:/i)&&(r=n.getResponseHeader("HX-Replace-Url"),o="replace"),r)return r==="false"?{}:{type:o,path:r};let i=t.pathInfo.finalRequestPath,s=t.pathInfo.responsePath,l=getClosestAttributeValue(e,"hx-push-url"),a=getClosestAttributeValue(e,"hx-replace-url"),u=getInternalData(e).boosted,f=null,c=null;return l?(f="push",c=l):a?(f="replace",c=a):u&&(f="push",c=s||i),c?c==="false"?{}:(c==="true"&&(c=s||i),t.pathInfo.anchor&&c.indexOf("#")===-1&&(c=c+"#"+t.pathInfo.anchor),{type:f,path:c}):{}}function codeMatches(e,t){var n=new RegExp(e.code);return n.test(t.toString(10))}function resolveResponseHandling(e){for(var t=0;t0?getWindow().setTimeout(I,x.swapDelay):I();}c&&triggerErrorEvent(e,"htmx:responseError",mergeObjects({error:"Response Status Error Code "+n.status+" from "+t.pathInfo.requestPath},t));}}let extensions={};function extensionBase(){return {init:function(e){return null},getSelectors:function(){return null},onEvent:function(e,t){return !0},transformResponse:function(e,t,n){return e},isInlineSwap:function(e){return !1},handleSwap:function(e,t,n,r){return !1},encodeParameters:function(e,t,n){return null}}}function defineExtension(e,t){t.init&&t.init(internalAPI),extensions[e]=mergeObjects(extensionBase(),t);}function removeExtension(e){delete extensions[e];}function getExtensions(e,t,n){if(t==null&&(t=[]),e==null)return t;n==null&&(n=[]);let r=getAttributeValue(e,"hx-ext");return r&&forEach(r.split(","),function(o){if(o=o.replace(/ /g,""),o.slice(0,7)=="ignore:"){n.push(o.slice(7));return}if(n.indexOf(o)<0){let i=extensions[o];i&&t.indexOf(i)<0&&t.push(i);}}),getExtensions(asElement(parentElt(e)),t,n)}var isReady=!1;getDocument().addEventListener("DOMContentLoaded",function(){isReady=!0;});function ready(e){isReady||getDocument().readyState==="complete"?e():getDocument().addEventListener("DOMContentLoaded",e);}function insertIndicatorStyles(){if(htmx.config.includeIndicatorStyles!==!1){let e=htmx.config.inlineStyleNonce?` nonce="${htmx.config.inlineStyleNonce}"`:"";getDocument().head.insertAdjacentHTML("beforeend"," ."+htmx.config.indicatorClass+"{opacity:0} ."+htmx.config.requestClass+" ."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ."+htmx.config.requestClass+"."+htmx.config.indicatorClass+"{opacity:1; transition: opacity 200ms ease-in;} ");}}function getMetaConfig(){let e=getDocument().querySelector('meta[name="htmx-config"]');return e?parseJSON(e.content):null}function mergeMetaConfig(){let e=getMetaConfig();e&&(htmx.config=mergeObjects(htmx.config,e));}return ready(function(){mergeMetaConfig(),insertIndicatorStyles();let e=getDocument().body;processNode(e);let t=getDocument().querySelectorAll("[hx-trigger='restored'],[data-hx-trigger='restored']");e.addEventListener("htmx:abort",function(r){let o=r.target,i=getInternalData(o);i&&i.xhr&&i.xhr.abort();});let n=window.onpopstate?window.onpopstate.bind(window):null;window.onpopstate=function(r){r.state&&r.state.htmx?(restoreHistory(),forEach(t,function(o){triggerEvent(o,"htmx:restored",{document:getDocument(),triggerEvent});})):n&&n(r);},getWindow().setTimeout(function(){triggerEvent(e,"htmx:load",{}),e=null;},0);}),htmx}(),h=ne;function re(e,t){if(e==="ignore")return !1;let n=e.split("/"),r=t.split("/");for(let o=0;o{let s=ie(t).replace("htmx:","hx-on::");r.has(o)||(o.hasAttribute(s)&&setTimeout(()=>{let l=ae(s.replace("hx-on::","htmx:"),{...n.detail,target:o});l.detail.meta="trigger-children",o.dispatchEvent(l),r.add(o);},1),o.children&&$(o,t,n,r));});}h.defineExtension("trigger-children",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent)||t.detail.meta==="trigger-children")return !1;let n=new Set,r=t.target||t.detail.target;return $(r,e,t,n),!0}});h.defineExtension("debug",{onEvent:function(e,t){console.debug?console.debug(e,t):console&&console.log("DEBUG:",e,t);}});var C=h.config,B,le="hx-target-";function Q(e,t){return e.substring(0,t.length)===t}function ue(e,t){if(!e||!t)return null;let n=t.toString(),r=[n,n.substr(0,2)+"*",n.substr(0,2)+"x",n.substr(0,1)+"*",n.substr(0,1)+"x",n.substr(0,1)+"**",n.substr(0,1)+"xx","*","x","***","xxx"];(Q(n,"4")||Q(n,"5"))&&r.push("error");for(let o=0;o{B=e,C.responseTargetUnsetsError===void 0&&(C.responseTargetUnsetsError=!0),C.responseTargetSetsError===void 0&&(C.responseTargetSetsError=!1),C.responseTargetPrefersExisting===void 0&&(C.responseTargetPrefersExisting=!1),C.responseTargetPrefersRetargetHeader===void 0&&(C.responseTargetPrefersRetargetHeader=!0);},onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:beforeSwap"&&t.detail.xhr&&t.detail.xhr.status!==200){if(t.detail.target&&(C.responseTargetPrefersExisting||C.responseTargetPrefersRetargetHeader&&t.detail.xhr.getAllResponseHeaders().match(/HX-Retarget:/i)))return t.detail.shouldSwap=!0,z(t),!0;if(!t.detail.requestConfig)return !0;let n=ue(t.detail.requestConfig.elt,t.detail.xhr.status);return n&&(z(t),t.detail.shouldSwap=!0,t.detail.target=n),!0}}});h.defineExtension("mutation-error",{onEvent:(e,t)=>{if(!(t instanceof CustomEvent))return !1;if(e==="htmx:afterRequest"){if(!t.detail||!t.detail.xhr)return;let n=t.detail.xhr.status;n>=400&&document.querySelectorAll("*").forEach(r=>{r.hasAttribute("hx-on::on-mutation-error")&&h.trigger(r,"htmx:on-mutation-error",{status:n});});}}});var U="";h.defineExtension("livereload",{init:function(){let e=!1;for(let n of Array.from(h.findAll("[hx-ext]")))if(n.getAttribute("hx-ext")?.split(" ").includes("livereload")){e=!0;break}if(!e)return;console.log("livereload extension initialized.");let t=new EventSource("/dev/livereload");t.onmessage=function(n){let r=n.data;U===""&&(U=r),U!==r&&(U=r,ce());},t.onerror=function(n){console.error("EventSource error:",n);};},onEvent:function(e,t){}});function ce(){window.location.reload();}var fe=/__eval_[A-Za-z0-9]+\([a-z]+\)/gm;h.defineExtension("htmgo",{onEvent:function(e,t){e==="htmx:beforeCleanupElement"&&t.target&&J(t.target),e==="htmx:load"&&t.target&&K(t.target);}});function K(e){if(e==null||!(e instanceof HTMLElement))return;["SCRIPT","LINK","STYLE","META","BASE","TITLE","HEAD","HTML","BODY"].includes(e.tagName)||e.hasAttribute("onload")&&e.onload(new Event("load")),e.querySelectorAll("[onload]").forEach(K);}function J(e){let t=Array.from(e.attributes);for(let n of t){let r=n.value.match(fe)||[];for(let o of r){let i=o.replace("()","").replace("(this)","").replace(";",""),s=document.getElementById(i);s&&s.tagName==="SCRIPT"&&(console.debug("removing associated script with id",i),s.remove());}}}var P=null,Z=new Set;h.defineExtension("sse",{init:function(e){P=e;},onEvent:function(e,t){let n=t.target;if(n instanceof HTMLElement&&(e==="htmx:beforeCleanupElement"&&J(n),e==="htmx:beforeProcessNode")){let r=document.querySelectorAll("[sse-connect]");for(let o of Array.from(r)){let i=o.getAttribute("sse-connect");i&&!Z.has(i)&&(de(o,i),Z.add(i));}}}});function de(e,t){if(!t)return;console.info("Connecting to EventSource",t);let n=new EventSource(t);n.addEventListener("close",function(r){h.trigger(e,"htmx:sseClose",{event:r});}),n.onopen=function(r){h.trigger(e,"htmx:sseOpen",{event:r});},n.onerror=function(r){h.trigger(e,"htmx:sseError",{event:r}),n.readyState==EventSource.CLOSED&&h.trigger(e,"htmx:sseClose",{event:r});},n.onmessage=function(r){let o=P.makeSettleInfo(e);h.trigger(e,"htmx:sseBeforeMessage",{event:r});let i=r.data,s=P.makeFragment(i),l=Array.from(s.children);for(let a of l)P.oobSwap(P.getAttributeValue(a,"hx-swap-oob")||"true",a,o),a.tagName==="SCRIPT"&&a.id.startsWith("__eval")&&document.body.appendChild(a);h.trigger(e,"htmx:sseAfterMessage",{event:r});};}window.htmx=h;function he(e){let t=window.location.href;setInterval(()=>{window.location.href!==t&&(e(t,window.location.href),t=window.location.href);},101);}he((e,t)=>{ge(t);});function ge(e){let t=new URL(e);document.querySelectorAll("[hx-trigger]").forEach(function(n){let r=n.getAttribute("hx-trigger");if(!r)return;if(r.split(", ").find(i=>i==="url"))h.swap(n,"url",{swapStyle:"outerHTML",swapDelay:0,settleDelay:0});else for(let[i,s]of t.searchParams){let l="qs:"+i;if(r.includes(l)){console.log("triggering",l),h.trigger(n,l,null);break}}}),document.querySelectorAll("[hx-match-qp]").forEach(n=>{let r=!1;for(let o of n.getAttributeNames())if(o.startsWith("hx-match-qp-mapping:")){let i=o.replace("hx-match-qp-mapping:","");if(t.searchParams.get(i)){h.swap(n,n.getAttribute(o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0}),r=!0;break}}if(!r){let o=n.getAttribute("hx-match-qp-default");o&&h.swap(n,n.getAttribute("hx-match-qp-mapping:"+o)??"",{swapStyle:"innerHTML",swapDelay:0,settleDelay:0});}});}document.addEventListener("htmx:beforeSwap",function(e){e instanceof CustomEvent&&(e.detail.xhr.status===422||e.detail.xhr.status===400)&&(e.detail.shouldSwap=!0,e.detail.isError=!1);}); diff --git a/framework/assets/js/htmgo.ts b/framework/assets/js/htmgo.ts index 322501e..7b33524 100644 --- a/framework/assets/js/htmgo.ts +++ b/framework/assets/js/htmgo.ts @@ -81,3 +81,17 @@ function onUrlChange(newUrl: string) { } }); } + +/* + 400s should allow swapping by default, as it's useful to show error messages + */ +document.addEventListener('htmx:beforeSwap', function(evt) { + if(evt instanceof CustomEvent) { + // Allow 422 and 400 responses to swap + // We treat these as form validation errors + if (evt.detail.xhr.status === 422 || evt.detail.xhr.status === 400) { + evt.detail.shouldSwap = true; + evt.detail.isError = false; + } + } +}); diff --git a/framework/assets/js/htmxextensions/mutation-error.ts b/framework/assets/js/htmxextensions/mutation-error.ts index caf9af1..99b16cc 100644 --- a/framework/assets/js/htmxextensions/mutation-error.ts +++ b/framework/assets/js/htmxextensions/mutation-error.ts @@ -12,8 +12,10 @@ htmx.defineExtension("mutation-error", { } const status = evt.detail.xhr.status; if (status >= 400) { - htmx.findAll("[hx-on\\:\\:mutation-error]").forEach((element) => { - htmx.trigger(element, "htmx:mutation-error", { status }); + document.querySelectorAll("*").forEach((element) => { + if (element.hasAttribute("hx-on::on-mutation-error")) { + htmx.trigger(element, "htmx:on-mutation-error", { status }); + } }); } } diff --git a/framework/h/app.go b/framework/h/app.go index 42939f3..39b480a 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -33,6 +33,22 @@ func GetRequestContext(r *http.Request) *RequestContext { return r.Context().Value(RequestContextKey).(*RequestContext) } +func (c *RequestContext) IsHttpPost() bool { + return c.Request.Method == http.MethodPost +} + +func (c *RequestContext) IsHttpGet() bool { + return c.Request.Method == http.MethodGet +} + +func (c *RequestContext) IsHttpPut() bool { + return c.Request.Method == http.MethodPut +} + +func (c *RequestContext) IsHttpDelete() bool { + return c.Request.Method == http.MethodDelete +} + func (c *RequestContext) FormValue(key string) string { return c.Request.FormValue(key) } @@ -210,16 +226,27 @@ func (app *App) start() { } func writeHtml(w http.ResponseWriter, element Ren) error { + if element == nil { + return nil + } w.Header().Set("Content-Type", "text/html") _, err := fmt.Fprint(w, Render(element)) return err } func HtmlView(w http.ResponseWriter, page *Page) error { + // if the page is nil, do nothing, this can happen if custom response is written, such as a 302 redirect + if page == nil { + return nil + } return writeHtml(w, page.Root) } func PartialViewWithHeaders(w http.ResponseWriter, headers *Headers, partial *Partial) error { + if partial == nil { + return nil + } + if partial.Headers != nil { for s, a := range *partial.Headers { w.Header().Set(s, a) @@ -236,6 +263,10 @@ func PartialViewWithHeaders(w http.ResponseWriter, headers *Headers, partial *Pa } func PartialView(w http.ResponseWriter, partial *Partial) error { + if partial == nil { + return nil + } + if partial.Headers != nil { for s, a := range *partial.Headers { w.Header().Set(s, a) diff --git a/framework/h/base.go b/framework/h/base.go index bbb8006..a26aa9e 100644 --- a/framework/h/base.go +++ b/framework/h/base.go @@ -23,6 +23,10 @@ func NewPage(root Ren) *Page { } } +func EmptyPage() *Page { + return NewPage(Fragment()) +} + func NewPageWithHttpMethod(httpMethod string, root *Element) *Page { return &Page{ HttpMethod: httpMethod, From 19638326dd9b95586815c3479e6b66d538f9dd00 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:48:58 -0500 Subject: [PATCH 006/137] simple auth example --- examples/simple-auth/.dockerignore | 11 ++ examples/simple-auth/.gitignore | 6 + examples/simple-auth/Dockerfile | 38 ++++++ examples/simple-auth/Taskfile.yml | 20 +++ examples/simple-auth/assets.go | 13 ++ examples/simple-auth/assets/css/input.css | 3 + .../assets/public/apple-touch-icon.png | Bin 0 -> 3429 bytes .../simple-auth/assets/public/favicon.ico | Bin 0 -> 5238 bytes .../assets/public/icon-192-maskable.png | Bin 0 -> 3732 bytes .../simple-auth/assets/public/icon-192.png | Bin 0 -> 7032 bytes .../assets/public/icon-512-maskable.png | Bin 0 -> 14025 bytes .../simple-auth/assets/public/icon-512.png | Bin 0 -> 23888 bytes examples/simple-auth/assets_prod.go | 16 +++ examples/simple-auth/go.mod | 11 ++ examples/simple-auth/go.sum | 18 +++ examples/simple-auth/htmgo-user-example.db | Bin 0 -> 36864 bytes examples/simple-auth/htmgo.yml | 10 ++ examples/simple-auth/internal/db/db.go | 31 +++++ examples/simple-auth/internal/db/models.go | 26 ++++ examples/simple-auth/internal/db/provider.go | 25 ++++ examples/simple-auth/internal/db/queries.sql | 31 +++++ .../simple-auth/internal/db/queries.sql.go | 123 ++++++++++++++++++ examples/simple-auth/internal/db/schema.sql | 28 ++++ examples/simple-auth/internal/embedded/os.go | 17 +++ examples/simple-auth/internal/user/handler.go | 118 +++++++++++++++++ examples/simple-auth/internal/user/http.go | 18 +++ .../simple-auth/internal/user/password.go | 18 +++ examples/simple-auth/internal/user/session.go | 83 ++++++++++++ examples/simple-auth/main.go | 35 +++++ examples/simple-auth/pages/index.go | 74 +++++++++++ examples/simple-auth/pages/login.go | 49 +++++++ examples/simple-auth/pages/logout.go | 23 ++++ examples/simple-auth/pages/register.go | 49 +++++++ examples/simple-auth/pages/root.go | 32 +++++ examples/simple-auth/partials/profile.go | 36 +++++ examples/simple-auth/partials/user.go | 62 +++++++++ examples/simple-auth/sqlc.yaml | 9 ++ examples/simple-auth/tailwind.config.js | 5 + examples/simple-auth/ui/button.go | 41 ++++++ examples/simple-auth/ui/error.go | 17 +++ examples/simple-auth/ui/input.go | 55 ++++++++ examples/simple-auth/ui/login.go | 34 +++++ 42 files changed, 1185 insertions(+) create mode 100644 examples/simple-auth/.dockerignore create mode 100644 examples/simple-auth/.gitignore create mode 100644 examples/simple-auth/Dockerfile create mode 100644 examples/simple-auth/Taskfile.yml create mode 100644 examples/simple-auth/assets.go create mode 100644 examples/simple-auth/assets/css/input.css create mode 100644 examples/simple-auth/assets/public/apple-touch-icon.png create mode 100644 examples/simple-auth/assets/public/favicon.ico create mode 100644 examples/simple-auth/assets/public/icon-192-maskable.png create mode 100644 examples/simple-auth/assets/public/icon-192.png create mode 100644 examples/simple-auth/assets/public/icon-512-maskable.png create mode 100644 examples/simple-auth/assets/public/icon-512.png create mode 100644 examples/simple-auth/assets_prod.go create mode 100644 examples/simple-auth/go.mod create mode 100644 examples/simple-auth/go.sum create mode 100644 examples/simple-auth/htmgo-user-example.db create mode 100644 examples/simple-auth/htmgo.yml create mode 100644 examples/simple-auth/internal/db/db.go create mode 100644 examples/simple-auth/internal/db/models.go create mode 100644 examples/simple-auth/internal/db/provider.go create mode 100644 examples/simple-auth/internal/db/queries.sql create mode 100644 examples/simple-auth/internal/db/queries.sql.go create mode 100644 examples/simple-auth/internal/db/schema.sql create mode 100644 examples/simple-auth/internal/embedded/os.go create mode 100644 examples/simple-auth/internal/user/handler.go create mode 100644 examples/simple-auth/internal/user/http.go create mode 100644 examples/simple-auth/internal/user/password.go create mode 100644 examples/simple-auth/internal/user/session.go create mode 100644 examples/simple-auth/main.go create mode 100644 examples/simple-auth/pages/index.go create mode 100644 examples/simple-auth/pages/login.go create mode 100644 examples/simple-auth/pages/logout.go create mode 100644 examples/simple-auth/pages/register.go create mode 100644 examples/simple-auth/pages/root.go create mode 100644 examples/simple-auth/partials/profile.go create mode 100644 examples/simple-auth/partials/user.go create mode 100644 examples/simple-auth/sqlc.yaml create mode 100644 examples/simple-auth/tailwind.config.js create mode 100644 examples/simple-auth/ui/button.go create mode 100644 examples/simple-auth/ui/error.go create mode 100644 examples/simple-auth/ui/input.go create mode 100644 examples/simple-auth/ui/login.go diff --git a/examples/simple-auth/.dockerignore b/examples/simple-auth/.dockerignore new file mode 100644 index 0000000..fb47686 --- /dev/null +++ b/examples/simple-auth/.dockerignore @@ -0,0 +1,11 @@ +# Project exclude paths +/tmp/ +node_modules/ +dist/ +js/dist +js/node_modules +go.work +go.work.sum +.idea +!framework/assets/dist +__htmgo \ No newline at end of file diff --git a/examples/simple-auth/.gitignore b/examples/simple-auth/.gitignore new file mode 100644 index 0000000..3d6a979 --- /dev/null +++ b/examples/simple-auth/.gitignore @@ -0,0 +1,6 @@ +/assets/dist +tmp +node_modules +.idea +__htmgo +dist \ No newline at end of file diff --git a/examples/simple-auth/Dockerfile b/examples/simple-auth/Dockerfile new file mode 100644 index 0000000..8f3a358 --- /dev/null +++ b/examples/simple-auth/Dockerfile @@ -0,0 +1,38 @@ +# Stage 1: Build the Go binary +FROM golang:1.23-alpine AS builder + +RUN apk update +RUN apk add git +RUN apk add curl + +# Set the working directory inside the container +WORKDIR /app + +# Copy go.mod and go.sum files +COPY go.mod go.sum ./ + +# Download and cache the Go modules +RUN go mod download + +# Copy the source code into the container +COPY . . + +# Build the Go binary for Linux +RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build + + +# Stage 2: Create the smallest possible image +FROM gcr.io/distroless/base-debian11 + +# Set the working directory inside the container +WORKDIR /app + +# Copy the Go binary from the builder stage +COPY --from=builder /app/dist . + +# Expose the necessary port (replace with your server port) +EXPOSE 3000 + + +# Command to run the binary +CMD ["./simple-auth"] diff --git a/examples/simple-auth/Taskfile.yml b/examples/simple-auth/Taskfile.yml new file mode 100644 index 0000000..28f1902 --- /dev/null +++ b/examples/simple-auth/Taskfile.yml @@ -0,0 +1,20 @@ +version: '3' + +tasks: + run: + cmds: + - htmgo run + silent: true + + build: + cmds: + - htmgo build + + docker: + cmds: + - docker build . + + watch: + cmds: + - htmgo watch + silent: true diff --git a/examples/simple-auth/assets.go b/examples/simple-auth/assets.go new file mode 100644 index 0000000..9a76f11 --- /dev/null +++ b/examples/simple-auth/assets.go @@ -0,0 +1,13 @@ +//go:build !prod +// +build !prod + +package main + +import ( + "io/fs" + "simpleauth/internal/embedded" +) + +func GetStaticAssets() fs.FS { + return embedded.NewOsFs() +} diff --git a/examples/simple-auth/assets/css/input.css b/examples/simple-auth/assets/css/input.css new file mode 100644 index 0000000..bd6213e --- /dev/null +++ b/examples/simple-auth/assets/css/input.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/examples/simple-auth/assets/public/apple-touch-icon.png b/examples/simple-auth/assets/public/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..d10e9fe56b9576167656a1270d4ab42bec72d659 GIT binary patch literal 3429 zcmeHK*H_cc7X5`#1VIp#UPMI!siJggL5e_t5ITt9M==NyK}w{GfE3|Fnv_VSNEhiK zB%*+H2)!E=A)$m8di~1uHi7E0F!3@00KlTJrwyZW z^&gy}r^Y+I^f##l@`mYZ0U!JL7paA|vz5M!kr5zH&CdX!s7CDY>ns9#*8O`|jMO~iuFIcM`+$DqYyYbERdYs=} zG@Cn2HOG@*am(sCU8YU4lC`n<5GSkiFgm4DCN(<0;*+7cW;6U2dl#+g)$>=`9yCDe z*SxKFdIVPOFVxtohIP8BWJYOV{o+!MCNMy1CZ{@Ue;$H_nO?k1t=WRfOd7$4& z#`VAe$hoRtbV&OP0A7m5vC5j-@BdEyX(8AxEm+*6uhX!=m@5JE9(-Wtf)W?GE@EnD z$6r%hWBQQdTwMAwAFCTbv>M)?rJNrg>6o1SRxkfb)IdijJL?yJqGdL20SuyT9-2+b@-uyScj;)b8vom%KhA>}tfmHQT^{z4g$k z2pn&Fp&(9x+>CYZ54OR2-7trb)RS|t$JaK(Gt}O{yr;vQ+xqe)<}fW@BBw#_+R(|v z0+K^!*CS$B%kV^ibJ|8*%i>R^Y}U`}$iQR5@*vQ z&^j@LY^&2C66f)(3j|1mHIHz6lO^nOP|&E)2FX&eY>%iSEEMIpl9_bZSSm|bb%n7Y z`3Fop{OsXCj!1XWY^2&x{;rOoAV!~5MLG48W`0*g-snQ3Y=0HBs)Htq z`-qlwr@c3Crk9t#;P#gdFmwC&WWGft>;-v^j)`TV!us?B~V9 zXUwLcQN)SU&E3hRH>bG!E_d(R9j+Eg<7kzWf%2Iq`+&L!s+1Q|OLwnjqqE1jS4CCa zDuhEVm_3cKebz9w=d#bHJz^x;%}0l$r?hQT$c}onn2TbhIJ|Qz;+(s0iPX#YkxqW4 zx50SRb7g(glmqe!KSLA;J0K8`5?(3sX5jC)z>ug`zP-gXrEEVfUTibjn(H8nqB_hS z?6+Fzpp_1?rTcaDHa&jwO+;OIA9qFp*<_1qL?~2*$IM5s(br~yM)u=SYaaj*n13K2 zy9F+u?`q^SFLP{X0!X6X`0>18`^f0Ic?(LBv5Gb`{zotCF^Tg(18 zX6nHn)!(yu3E~mN(rmVb5V}SI^LfSKN)TR9+tzhl_EQM1BeK}ft7F%;|3>C7&Hg4N zyT)@iu%K@tr<%bjiI0*@8QuVYcEC}peid!c_TMh9MP>+u?p$(;f@TdsTN+6f`?p;7 z@Rqq*+)dz$Y^bFmnRaeUF8pzdKzL z^7@`_FoIU&IX9VuDEi?bT>0r8|%N1B$=Y?cL?Qn%X3kE|=ul z(d+9`@j2cMT%Pmrvf0wel$qSnFkzQnV!PaZPS%A@;dHUBSRthC?eb1zi|d3>Vj$W~ z=n0H+)bw}>on=^7RtC-ZG{hxdgsVtg;>*a=CWpmH9Km>IWEV!8#TR$e2zHR#tA4FK zHoPut3hNNU_OI>sBPC1g{CPIlElWvMz#%+g>9v3q6LtVQWpQQuomO9V0VSp(X88vb zzRWukPDA2mywGwKi3??Pn`BKw zjz+`+UDUiQV6JIz>*(-;k)qbBK)1qb_vSHW0@XD>aI47Y!tGn~rd3vSzj;{ivlyPQ zOWZVA+xH!WZ&>;=Tkr09e#t&MNpYu)-c%V{0#!$yfBwWb9h{$emRbJGsSKnvWj$#& zQFJZ#u;NB>@fEMax61V2@q!WI1*6|*P*vBf#4g6}8YE!-E?v$jM`2kBicIAq$ziD$?)9^k02kLY4T}&>8nja#e}QpOd3` z*4(QfhVVZ+UeJu#Dr=|`wYLM7`fPlN%B+dTSy+uPsQG7=`=$Kjet@=LmhZUQwqkEeVZBB1ZepQx>oC%NWF zdmo=0@^$&na^HaJYV3|C9v`Sr*q-{Y?$I=W&1L4|UO1qU$)n&eX$oiEt|!5$e%Bc{#~f{N391h{sB|aM6Cb- literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/favicon.ico b/examples/simple-auth/assets/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..040cccf58ea179321b86f78b5f0a0817f1ec773a GIT binary patch literal 5238 zcmc&%TTc^F5MGTxz&GO?PsX3&laKxa5?VDrsPP_Skg8Epp+!_s6a+*B?}`GJic-7) zB8Vu0f{KVn1m!020|D?VOqU=FFKnXI9e|XbZK)i!~ZGZTTWi zTSj9-g8rZQtBALpc=W0fo8j(S%O?&OATMu&mKe zdP>qtnj0j7LmFfqw!yZd)Rh>62A?G_s?o4sOTFvGNAbC*3$0Is$VuPwznqMf;^%m` zBKz=0LHWmb;c{Ub?%pm!S4T6d$_kX69w!-R#Sd0pLiv>(lwHh1XL}Qx>Z;K4v6xbM9Jy;a*q_>sNeIh9UtF!AnVWu+_|1-rZ4yRAAQDaYk4Tv{GzEA4G+rkyzxG& z%g-x09iR2t2gPUnrpJEN_)C$Oxf8h=J5Y0{1eMovQJA$`$r=3T7$`o=T`lsd|He6! zcaf7Oe5d*%pJUaRwLtpO?`2~<^a>m*ML<#bnL!)#Fjqw{qI90=JUF4i7m%~ zaW5kKJ?njzwjGY{M41bEt~u13D?gK}8DHP`xybWq{SPrV*XV3>?qu2~_-~v=T}>I? zB}F*x+vdm@!`b3U-po(Fmk0WK0Zb7^o^UvX(zB_yHr2T{i!&y3|2hQy7g2RHAEkMz zXsEr7$%%3Ff9b)A)b(~g=x3^RPMxOpH9o4ulZO?`7T>#kf6Kn5_{@Is|IMqXs1M%4 zub*QW9_$zQv{}p)Z~8n}w$+>-lXKY~j0}Gh_T=3A&Q?rKg;8)K8SG#GmyZjI)T z=H75@bja!Y8J}ZdiyxYtL~r+Ne0bX?*30$9`7i4KE7w27T;Jyp8vCXM| z&C<46{l$i55@WqroXOr9-*#}0H`fO&eVj?(W=`~}HZt>pD{RUhIbQg(KPUXS^&i{= z#k2p4;Pdx}Nq){NZ@T}CcmK^Xi0AhQQkrtwK@C# F{tLVTip2l` literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/icon-192-maskable.png b/examples/simple-auth/assets/public/icon-192-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..d4d6efb61bf6c212e3c466edca6256d9a3000e86 GIT binary patch literal 3732 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 U`U+xTzkh@n(+eiG#@FKh0jyU=3;+NC literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/icon-192.png b/examples/simple-auth/assets/public/icon-192.png new file mode 100644 index 0000000000000000000000000000000000000000..f5334355c00b1ff31781f93b97b0efaa0e049d60 GIT binary patch literal 7032 zcmZXZXEYp6`0sbuE^DLgvU=OqOAsO~f<^QYy@cqZ1kr*ZED^m0(TUz$LRh^=ZxIoq zERkr@iRjnwfA6{X#eMP2Gc(_3$~iM<&dg^bwY5~pVT>>U06?y$`at)_cm8Kk;+s@= z-kIda0X=n96adv@%o{g_2X@A4Pc=0G{5N?h02uBF0RIMvnxkUdj|6ib{wB*oDqZPFW^7_8O?I)xONP~YpY|3Vx*U0QXiu+74UCi4xvMFLIPnQqM?|f7n#>^c8l%}M?Nz?p#PL+T zM_~O8gwO^MZl|Cg&)>y?Y@HA)S^=Vm?6=k-eqI@}V9Vn{d)PCnkXj7jo_7||@HXX`O4L!^StydI&P{3T1|QW)T;N#<7yE^lV})nZhY!R&BdSd<#VYyjXZe)*o2 z7>FmmUjMmYa}Tu3wISct9*ah8Ar6J%=Pw8$jVUkL=EKH~2Y#mvGC=S%E%>9D$8yAo z92D1l1Zjz%6jLS&cj^IUx_WNYUb&r{?CiTJT{p(9rjbErDuAt}s96MoxCu*kNOj$0 zea0&XIxyo0+wWkiZ_R}t=f+&1O#C?H-QR-D1+cU?O_B)V)F&SArmSEllR zpUo>3aelFeXGA-aK>^l(F1wWvq!-mo%EFFcxN+XG!! z$|bh{akW_l@tj#dw*34=`TTpyXwVtZd0V(IbYBc|w<&2UFzT(eURZp4p7&Pqv8gCT zNm(6dso1#MQQP48sF-SO`8PG_;0?^^@>RM6%Cs6V)jFOmpL=?b^ZI+h5PQnKDd@m4 zfj_NvM7rhkP}*$+9K)jh*$^&>Jbv|Yx)QS?J&eWe;IT0II52jhq4hu-QJ6ykh&r<_8Q_s|wHw*&u+ls0H zUkOE0az_67R(Af}hzWdH))YSV=>tcB&PHHWV>nZ*<5RG|L==vmX*EYD=)=wwBgw?s zsr*PZdE$HeU}rQ+c?An-%J4f42O23n+sKPix8qIZ1;^qH`k-#@R8^MzsVf3QPqG15-Ck>+YT8oG7e9p4lq z6ZaqB1?lSa@fPTnk-r0c-7Xwmvp=vGPUZr*7!9m8Y8HDa9B~jx-6hK6kuco3B*8pe zO_2~EgVRJnJ&d@kesN|Gh})QN9IszmIP64|a~m@>4XL+;<4q<2_(XzU|0oWjZKn6@!Hb<1}b4=cEb?MyXJ!JzH9Cxg_2b zgxec@mUf~z4IsRA&zN0221f)}?fw;NkgL6PErQG*U-iIV)j=mBY(NWCv80^0f$L(* z+;UT&<)O$o7#1E~1xTk05B`jrgr;M_4m`Kw1%f2tKhwL8*jY(#$6%jZ(u~+UyKsgECtsorzF4W2ds*Iut_I2&& z?JQKQSuU+%My$nK+yTX5v2jq3R;4t02rrA741A_-&s|yYU+t(4G$IkzZyFk<12A|q zl=8^g2Ama+eHPcxiv#fs;0_P6xS|wt@AcatvFcqgIE2~#-fuw)<+ z=6GJf=(URd6YH!4A`ZfRaC0cWT8&l*ha(Wz9v) z>(5_fvv|ZcdZ7>C5pFX10L+v6N2_;D>4791@X_N45CQ7e^xE#}Bz-V1_%Xg(FtT;3 zrBqKocarWGdr8$=_5#h=#+*qbnSVt`c=Ora=7qYRd6nE*gVmRP{y|ll5BS19A7FQe zk#7m*R&-sVI;ko-dL}sm8{@TGon884|5{$dQDX%di)RM8I17*Ce);s_{6b~a$V*Ki zIKsTFt@f63rzA8~vW5>(4f;*hDfx0ZaUF{qIn4#RQ6^9fe2+|mC!oi|%dwpXD4t(J z!--VDKUZHdH}TEC`L)#tz6bZfConaHuI@r`D|u9pM{1v1B=*rt`^S>Jh_Nev)r~Bc zJD@RzTpYdzNqe~LGd5(DqAU#ReWgT-JlKf$L)iGlDcp!){XrO^)Y;DJh#fm`6dFx~ z6}J2{W&(wud>~OxmejbN5{8(F#_{U8342w8Hu|C$Bw@gn_I&jnh=+dl$2-jk)Q*6H z6=WioUfK(J)4v1_5k_P{C&Yv+CZG3?GuEQCbq|DT)UaRIHUqn+g7C%2iz|Sb*u5^& zCBE}XJlNuTk%KX@+GEQTu5$JPa%Crs{n}-6kPLnQBjlrMlJ;idJ7E&;-8i zG*SF;I9W&;^=Ak5y`2)%;1uJh-Eb@6_T2asA>D_K0;deWFa6(B8d0)U3ZBe=e8uDZ zuMkGTCdZ&QH{Bx~#?TlOeV?c9{?Q*Qj9)%?dQ#T8^1KhnX%ii9@{6N>HrZO?izycg z#~^(U$;ZZoFo7`h(kEN87tD+E{}5tg;tZthWv04A3?0lQbjMrSU!Ua17jdx=&IE*l zw}hA|G>kfk-Uqa42y}%V)u^uC4_ZW@IBL2%Ua8JE6dw6puBlO5fei(|RKepq{5X$< z9Rbt2))$3$yByR=)V>m2n3 zl#+bAQE(~$eoIg*P2}W^DC}tK1?xrNXQVOy;>Dg#_IxEnbkNR^{y6o_i^+Wp?|oF| zIFZ+8+M0bH>ck!Ou=vC@QdwMOTR*5V@xqFp*zhPsBsFu%J?H8osXvyu+}y;abV0$O z;6nUMEDZ3iAk(IlaaM7l)IsmF#jS;*nD~2t*S|q_Iu5@jlRqigusRWe;%U&nf><(6 zS~+chYt9CN7)JJ>W*0<(`|nKumG%&Wu2x~7X!d^N#Rb2j&iql`Fu{yS`Ue9ni$w*F z+Mzx*0kS861xvJMdh!bTbBh}&GA;w%tT@s)hxG*|TQt&_BTM0$$N1T5@ALRlpf2cVl$(__<6m*HcSdA-|8L?0O8s34Ywthj-{6r_?}}Ny@?T1WTDXrg zl(TXhypE-ETM%`xc7eW>Yqx*3pmz>2fR8xFW@Yl&oxpaRM%U+l4lebL5#_R+R$M1YXpQmiM%>7Fwyoi#M*8Ei5B;^-dUS4~!eR3pa?-Pk2 zP@zPG&K4g_UU$fiv4~nYo`#v5o-~3E#N%xQH=>G$A|kM6k7jt6+ng7jwt9;9?_DW8iAU*G`aky z$`y3@c+sBO_4Zfs)2rtu2}*&CP#aD`tmpztT_cJd^47V2P8<93Pa6Iak<~nLEs)fq zI~&o%(WE?~{wD?hhzlTqwGQ}rmO`3sfd4cQajp+?qv1XO-rwi@`=QNzi>* z%_jBaz{rpZ9=>XA_@-@K9}UT@M@*>S9Qj4DHfO-BYKevlv%E2ug)fiNJrz4GpbbDy zqhJq_Xh(aD_y!s~zs9faNB{WukM-o=U3B`!v_7mP4>-C)DzM^~oxyArOzM4-c=2@2 zW++r2fWA46o-hmU1+^A`n*e3D%lLPioVM4QHsd)?%3!@yuqntF_Urn0O^CZbbGC{C z12Li5Jg!@Ab^gnhGBuueLTOY^?RMapfG<1!v>{d)TE z4>^Z5BLnb4vjgl*jAWTI$KvZh?jDDn-(jyG=iP>94{oD++-EPf=8X#Bl>qTUzB!kb z{`Xq+TB8?BT5pEr={Tz>CObtgPw7T7s+;aHM-s`vPZo3`Z1LqkczmvH`uL46_Fjd3 zBhlNmzw8mNXIYm0oMhQxW4dBYel>H)re(Q{k?t>F_^=Qwv~6rV=WTZJ_UoJv$?y|L z3nZHs%-V(;ynb7VUBusnHC(0MUD@<2pje?!i&TA?c;Ilub!UjDb zCYHiN7jhH*gPl`~?Dw2S=GKxlixCO;qR8AhFjIFjNw06+_deE~FHP0_eY2PXLT_kL zp72b{^s&_^hgY=!Rt1PMpEE>^srpm|TY3)hxm)Nw(VQoDnsP4KrrQwfrz~%8a3jel zP|Q4UJgy z780bySvxu2Q6cL?tfPm)CbOnQ_R-a77aNXZ0$+TvQux|D@-2>1J+ux3iM(S`GpZwsM(*+CT7g@PDGC--LGc_ zJd#Py5KqXCl|ketaaW0ojppM^wSCTa$Fm|rs&pjhEtquY)Hu=GovhD~a_Up4Km?(TfsJbOy5 zWLo=(L4xrtm8s(T`c=^HA9_#iM7M1sg`-?-BrpQYgbbdnSDqSt>} zJDy9KN!~o6Cl~z|rtj>OzYV+i60sk=8&7|bbSthWYsN2_F}JiCz&tZF{w6>*<1<5J z+-sqn?}~K`_{g2-&))-nx~p-pthY5esSGJzg^~Xu>1h3{zW%x>Lg$d3qFZM?af-}6 z$2Q9AieL;Fg&kuwC(Pd2uPPB)atnE=**VCeoeB-vWXq4ilP|k4{Sc`XFC6Pab7yXp z`2-DJUz&&){%^08QI&7cWz~EkMmm(&_V+nlmg77dPU_uJpehZip_RNl)oj~=Tsb#mqL!yT!%f}2t_2xa5_C`4nIi|pK&|)#{1zR9- zfe-^|#$1Zb0XG6u)GI1$R=R5+>pJeLbg_+8F1&iQ-;d%8txVLd1=Z_~aYp~0cx&^x z=P33>_KR{z*;buIHH5e4<)uiUZz9$~{qRI3zDJhxs>EXVOS!RHmh=I&`~AnY^bl?N zvThTP$)#D>yWoi4-N0sp7GB3}9iY&rX?5(um%#T$c#JZE+eE*lrb3RW-%V#kUO(s6 z^imI{oDR7}2f6!w#$b8~cD~#eb$0j1c3kJ+oE~;7V8c3z5xC-8U!f|&+gABQr=3Y< zaI=7=HXGqa0s1IAuumIljkKIDAN+SsXHg&Ul!=4D3GStnk82!2767_tJe~~OH;90= z6i_)o_F*^FDvMKexclY>rP{d-mT}O%@Vn}Ex|q1T@>Vbg8^?irl^LEQCtku_@lRwS zYo7}s)%niz`5L}8D?k}V9E>Wl8GJ-R#fuZaH<$71pLJpGb6ETg(+C)sb=W*-f*4pm6r*bv%jos_81ba{coA?Gc{`Ke1+OkaUL+3CQi8wt_VO^z8NE-;(^$I}7(o z3VEvwtiRGjr*M(KkrM@ZD*_~c7%l~Q>FV+0ej6Lm{gio1rQ?NizM%qPxZbuW5p{gA zLJ;Ey%N=tvN4uek??4VqO0Z!VCR6lYGZLq;PcrYh_jCu-mpo`m5`(jYehtHy3t$&u zd;L65uOra14@#4)$+zsd9z|DWfIH4AiL{|Ig zQD58Td*%6~$a{YzWW@q|pvGZ1eSHz9jh~+4Or(?Aq*&lHgsQO>Czbaw)Rq~zTBviN zmq8`~cHGX>aO~HjuH&(2g%6IjR!F zdaS@l94HIpzu)Ii&ldVy#0(%&6vf>JL2P4*#%z~yH}K*&B4O+GyoNBhMzd(i%lCZL zz-yIOS5(`G<U+qrmKHhUIB95tmWLxzJx26rt9|dO*ERAAtj^H?|nM#yg zQ70877nkB^ziVW+BcLX|kxtHGc@NYpxI*tfT3#!t2T+G|#YAztQX9XMVb;0@@{n;K zRzJ}Dp281+s47v5Yq=_L`3C3A-T`gg%on9)Vz3>l70(q*SO*kr`~KM^`qv7tsc$wd z=&|)TM`MYqJok*J?C)~DP^Q6A$@~wOY}rVie4N6E#+a$FYb$cJ3Ja#Sa3_5+F^4#1 z8&h?%@Y07)m8SlbFgKiKL^q_~h*Qw@Whu*(S{O z@Gl}47nnrfD7Oe;jcfheqBXXN?02Y8_WN1+clgJeIcB}Tc)zK)$;{EL_=s+ELFOtM z^F19g#VFIB-uMOfIfne_4`R#;;%>9y2HPx5E>KqF!o*%k;$qLh;XoB0!Yi>Z$fSxfKE0^{< zY3UaZGb#;oov^z|nR0Nv_MU?D6_s7E2OWqCQ%y`=G4+L!&+qWiJ zPoD3wR1x~4p_?iaqw8TifvwMW>+KopZ5S`;+1hG){yEip9WFbYzSr+6flmBM3u9z} x%cimilvfPSdV(Q_^}+tza4QzW{-_?Ogx> literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/icon-512-maskable.png b/examples/simple-auth/assets/public/icon-512-maskable.png new file mode 100644 index 0000000000000000000000000000000000000000..db61f3dbc056f541e9b215d4be7ec22a8f436e38 GIT binary patch literal 14025 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 KG(KIojr>11q;Vnu literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets/public/icon-512.png b/examples/simple-auth/assets/public/icon-512.png new file mode 100644 index 0000000000000000000000000000000000000000..ba0665d887cf19d3a45122767f0d6609ccb1afbb GIT binary patch literal 23888 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 B&S(Gt literal 0 HcmV?d00001 diff --git a/examples/simple-auth/assets_prod.go b/examples/simple-auth/assets_prod.go new file mode 100644 index 0000000..f0598e1 --- /dev/null +++ b/examples/simple-auth/assets_prod.go @@ -0,0 +1,16 @@ +//go:build prod +// +build prod + +package main + +import ( + "embed" + "io/fs" +) + +//go:embed assets/dist/* +var staticAssets embed.FS + +func GetStaticAssets() fs.FS { + return staticAssets +} diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod new file mode 100644 index 0000000..8e15c29 --- /dev/null +++ b/examples/simple-auth/go.mod @@ -0,0 +1,11 @@ +module simpleauth + +go 1.23.0 + +require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 + +require ( + github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/google/uuid v1.6.0 // indirect + golang.org/x/crypto v0.28.0 // indirect +) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum new file mode 100644 index 0000000..b173b66 --- /dev/null +++ b/examples/simple-auth/go.sum @@ -0,0 +1,18 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= +github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +golang.org/x/crypto v0.28.0 h1:GBDwsMXVQi34v5CCYUm2jkJvu4cbtru2U4TN2PSyQnw= +golang.org/x/crypto v0.28.0/go.mod h1:rmgy+3RHxRZMyY0jjAJShp2zgEdOqj2AO7U0pYmeQ7U= +golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= +golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/examples/simple-auth/htmgo-user-example.db b/examples/simple-auth/htmgo-user-example.db new file mode 100644 index 0000000000000000000000000000000000000000..f572cf5c2006e7992f372b29b42617548405ed2d GIT binary patch literal 36864 zcmeI(U2oe|7yw{9X+Bn#7$mA*6-?RGMq5+c$6pB&BW;{5U7GYG+1d)JI<}8XNAFo^1aZX=K;mXUfs0)t?Jt1DA3)r}&Bg^F#1+SO-L$0>h;p&A*HTjZ^!U8zJnu;) zpV;fGm8MI0r`u~|mq*O&49hYf@I1pX)AV(TzQQd=cgDg4`j1&t2xcojXfDHsd00ck)1V8`;KmY_l;G6=x$;9N1DRvlZc5HIc zv=6rN!2M{uPx}34x6|Jq^hs~KX@|#`7T1hI-QdgBqOrlhusUC>^5H4`>|q<3JBj#Y zW{Mpgg*vQqto`I)+8@<9+32V|Q;ySiCs^yKT|Xdc<7Ug-OZ=tH(f_?Ry(50sub%nz z=2&8KYKr{~yVz`za17z!*kM!k!a~J38sYftI8V2x?Y;Y3xmq`F8f*N@T6wv!w#nZ% zHu*xMUMp8=1ItFWe%(LA??-T2ct*8W=c|oMC8#hOWYBKi*rE55oWPIK?u4Qu=!>dfn(vt*(DO znqOi_8()dWC$C*&Hv{#N@;T``O!m zo1V7!ikvvxEBV(6^e4@+)SQ`@d$`}f-|cy`!_P}tDNt?`7t;h``roB>-!aJA%%e|c z{#9NF_q=@ngK03HnTf+0VAg z6$xJvg)7a2yT-zv(On`BN~Q8X+_v-%0jPsdtqV4sTT(856Q}o znte2FHhbRM(Y8P2X=zX3oAN_m|e2 zZuxGpI$zry%s*_Eg~EO(dpwAg7uCFg&M4X+8^uMZz1y!ZXO7& z-CCpH+n6s4J8p4DFRf-5oQ;Q#O<{hJ-KyVTesCf#9j}^K^y6_4i|9<9qv`R-`?u*C z-iTac-leI1+v7Ri%SwB3Nn6VnUAJ(1Yqhu2*jcD%2OC@WOVZY@_5J>ixr6GhTPvejnnataZefUd+r5)3;` zp&JoRl{A4M0ZT;07!%7zM9fL1j1&`Til&;jCCjE_sg|tEsxI5QqnWbeXp)R^P7H4@ z_Z|SCH{$DgdUE(ofLIr_plD7|@`Av<$?OMFiJ2p|BC9!MDVAg^vZk1-AP_|rHA|FD zEvH*ZQxTCRY#~8)Bu6r_Bj`4*gH-D%L>N^V-G(1V74#sgn+(UQiYn1;NtBhGX=-%b zmS}5&hGkPEnobXpY~@s9+mfs(B0>T^k{m~}C5?z`?o?EI>${>Ib;OVA7ac}Tgi&o9 z*}5&MmSS5HF&z`-97RW}DS5aO5;ctE9CmE%V8zBnMY@tBIbzC!jgd1Nm_JtUhWpW@ z4q;RQ9Y&3ZQHdbxj)@gPrulS`Oz{*^as=v2?M=;+HCwYV9g~8wZd)cHSd)>Jqhq&C zWt7Aqs+>os$LbXYQN8>BqgW)L|9>TC4h$LuKmY_l00ck)1V8`;KmY_@MgjQ!|Exy~ z{=?t@queuw`-A(1d&WKIp1+J!0Qv+1AOHd&00JNY0w4eaAOHd&00JQJHv+LJ%SK|{ QuS`7R? datetime('now'); + +-- name: GetUserByID :one +SELECT * +FROM user +WHERE id = ?; + + +-- name: GetUserByEmail :one +SELECT * +FROM user +WHERE email = ?; + +-- name: UpdateUserMetadata :exec +UPDATE user SET metadata = json_patch(COALESCE(metadata, '{}'), ?) WHERE id = ?; diff --git a/examples/simple-auth/internal/db/queries.sql.go b/examples/simple-auth/internal/db/queries.sql.go new file mode 100644 index 0000000..eee80ac --- /dev/null +++ b/examples/simple-auth/internal/db/queries.sql.go @@ -0,0 +1,123 @@ +// Code generated by sqlc. DO NOT EDIT. +// versions: +// sqlc v1.27.0 +// source: queries.sql + +package db + +import ( + "context" +) + +const createSession = `-- name: CreateSession :exec +INSERT INTO sessions (user_id, session_id, expires_at) +VALUES (?, ?, ?) +` + +type CreateSessionParams struct { + UserID int64 + SessionID string + ExpiresAt string +} + +func (q *Queries) CreateSession(ctx context.Context, arg CreateSessionParams) error { + _, err := q.db.ExecContext(ctx, createSession, arg.UserID, arg.SessionID, arg.ExpiresAt) + return err +} + +const createUser = `-- name: CreateUser :one + +INSERT INTO user (email, password, metadata) +VALUES (?, ?, ?) +RETURNING id +` + +type CreateUserParams struct { + Email string + Password string + Metadata interface{} +} + +// Queries for User Management +func (q *Queries) CreateUser(ctx context.Context, arg CreateUserParams) (int64, error) { + row := q.db.QueryRowContext(ctx, createUser, arg.Email, arg.Password, arg.Metadata) + var id int64 + err := row.Scan(&id) + return id, err +} + +const getUserByEmail = `-- name: GetUserByEmail :one +SELECT id, email, password, metadata, created_at, updated_at +FROM user +WHERE email = ? +` + +func (q *Queries) GetUserByEmail(ctx context.Context, email string) (User, error) { + row := q.db.QueryRowContext(ctx, getUserByEmail, email) + var i User + err := row.Scan( + &i.ID, + &i.Email, + &i.Password, + &i.Metadata, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getUserByID = `-- name: GetUserByID :one +SELECT id, email, password, metadata, created_at, updated_at +FROM user +WHERE id = ? +` + +func (q *Queries) GetUserByID(ctx context.Context, id int64) (User, error) { + row := q.db.QueryRowContext(ctx, getUserByID, id) + var i User + err := row.Scan( + &i.ID, + &i.Email, + &i.Password, + &i.Metadata, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const getUserByToken = `-- name: GetUserByToken :one +SELECT u.id, u.email, u.password, u.metadata, u.created_at, u.updated_at +FROM user u + JOIN sessions t ON u.id = t.user_id +WHERE t.session_id = ? + AND t.expires_at > datetime('now') +` + +func (q *Queries) GetUserByToken(ctx context.Context, sessionID string) (User, error) { + row := q.db.QueryRowContext(ctx, getUserByToken, sessionID) + var i User + err := row.Scan( + &i.ID, + &i.Email, + &i.Password, + &i.Metadata, + &i.CreatedAt, + &i.UpdatedAt, + ) + return i, err +} + +const updateUserMetadata = `-- name: UpdateUserMetadata :exec +UPDATE user SET metadata = json_patch(COALESCE(metadata, '{}'), ?) WHERE id = ? +` + +type UpdateUserMetadataParams struct { + JsonPatch interface{} + ID int64 +} + +func (q *Queries) UpdateUserMetadata(ctx context.Context, arg UpdateUserMetadataParams) error { + _, err := q.db.ExecContext(ctx, updateUserMetadata, arg.JsonPatch, arg.ID) + return err +} diff --git a/examples/simple-auth/internal/db/schema.sql b/examples/simple-auth/internal/db/schema.sql new file mode 100644 index 0000000..e7b53a9 --- /dev/null +++ b/examples/simple-auth/internal/db/schema.sql @@ -0,0 +1,28 @@ +-- SQLite schema for User Management + +-- User table +CREATE TABLE IF NOT EXISTS user +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + email TEXT NOT NULL UNIQUE, + password TEXT NOT NULL, + metadata JSON DEFAULT '{}', + created_at TEXT DEFAULT (datetime('now')), + updated_at TEXT DEFAULT (datetime('now')) +); + +-- Auth Token table +CREATE TABLE IF NOT EXISTS sessions +( + id INTEGER PRIMARY KEY AUTOINCREMENT, + user_id INTEGER NOT NULL, + session_id TEXT NOT NULL UNIQUE, + created_at TEXT DEFAULT (datetime('now')), + expires_at TEXT NOT NULL, + FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE +); + +-- Indexes to improve query performance +CREATE INDEX IF NOT EXISTS idx_user_email ON user (email); +CREATE INDEX IF NOT EXISTS idx_session_id ON sessions (session_id); +CREATE INDEX IF NOT EXISTS idx_auth_sessions_user_id ON sessions (user_id); diff --git a/examples/simple-auth/internal/embedded/os.go b/examples/simple-auth/internal/embedded/os.go new file mode 100644 index 0000000..ddfd55f --- /dev/null +++ b/examples/simple-auth/internal/embedded/os.go @@ -0,0 +1,17 @@ +package embedded + +import ( + "io/fs" + "os" +) + +type OsFs struct { +} + +func (receiver OsFs) Open(name string) (fs.File, error) { + return os.Open(name) +} + +func NewOsFs() OsFs { + return OsFs{} +} diff --git a/examples/simple-auth/internal/user/handler.go b/examples/simple-auth/internal/user/handler.go new file mode 100644 index 0000000..ad60648 --- /dev/null +++ b/examples/simple-auth/internal/user/handler.go @@ -0,0 +1,118 @@ +package user + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "simpleauth/internal/db" +) + +type CreateUserRequest struct { + Email string + Password string +} + +type LoginUserRequest struct { + Email string + Password string +} + +type CreatedUser struct { + Id string + Email string +} + +func Create(ctx *h.RequestContext, request CreateUserRequest) (int64, error) { + + fmt.Printf("%+v\n", request) + + if len(request.Password) < 6 { + return 0, errors.New("password must be at least 6 characters long") + } + + queries := service.Get[db.Queries](ctx.ServiceLocator()) + + hashedPassword, err := HashPassword(request.Password) + + if err != nil { + return 0, errors.New("something went wrong") + } + + id, err := queries.CreateUser(context.Background(), db.CreateUserParams{ + Email: request.Email, + Password: hashedPassword, + }) + + if err != nil { + + if err.Error() == "UNIQUE constraint failed: user.email" { + return 0, errors.New("email already exists") + } + + return 0, err + } + + return id, nil +} + +func Login(ctx *h.RequestContext, request LoginUserRequest) (int64, error) { + + queries := service.Get[db.Queries](ctx.ServiceLocator()) + + user, err := queries.GetUserByEmail(context.Background(), request.Email) + + if err != nil { + fmt.Printf("error: %s\n", err.Error()) + return 0, errors.New("email or password is incorrect") + } + + if !PasswordMatches(request.Password, user.Password) { + return 0, errors.New("email or password is incorrect") + } + + session, err := CreateSession(ctx, user.ID) + + if err != nil { + return 0, errors.New("something went wrong") + } + + WriteSessionCookie(ctx, session) + + return user.ID, nil +} + +func ParseMeta(meta any) map[string]interface{} { + if meta == nil { + return map[string]interface{}{} + } + if m, ok := meta.(string); ok { + var dest map[string]interface{} + json.Unmarshal([]byte(m), &dest) + return dest + } + return meta.(map[string]interface{}) +} + +func GetMetaKey(meta map[string]interface{}, key string) string { + if val, ok := meta[key]; ok { + return val.(string) + } + return "" +} + +func SetMeta(ctx *h.RequestContext, userId int64, meta map[string]interface{}) error { + queries := service.Get[db.Queries](ctx.ServiceLocator()) + serialized, _ := json.Marshal(meta) + fmt.Printf("serialized: %s\n", string(serialized)) + err := queries.UpdateUserMetadata(context.Background(), db.UpdateUserMetadataParams{ + JsonPatch: serialized, + ID: userId, + }) + if err != nil { + return err + } + return nil +} diff --git a/examples/simple-auth/internal/user/http.go b/examples/simple-auth/internal/user/http.go new file mode 100644 index 0000000..d6865d1 --- /dev/null +++ b/examples/simple-auth/internal/user/http.go @@ -0,0 +1,18 @@ +package user + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/internal/db" +) + +func GetUserOrRedirect(ctx *h.RequestContext) (db.User, bool) { + user, err := GetUserFromSession(ctx) + + if err != nil { + ctx.Response.Header().Set("Location", "/login") + ctx.Response.WriteHeader(302) + return db.User{}, false + } + + return user, true +} diff --git a/examples/simple-auth/internal/user/password.go b/examples/simple-auth/internal/user/password.go new file mode 100644 index 0000000..fd6a6a7 --- /dev/null +++ b/examples/simple-auth/internal/user/password.go @@ -0,0 +1,18 @@ +package user + +import ( + "golang.org/x/crypto/bcrypt" +) + +func HashPassword(password string) (string, error) { + hashedPassword, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost) + if err != nil { + return "", err + } + return string(hashedPassword), nil +} + +func PasswordMatches(password string, hashedPassword string) bool { + err := bcrypt.CompareHashAndPassword([]byte(hashedPassword), []byte(password)) + return err == nil +} diff --git a/examples/simple-auth/internal/user/session.go b/examples/simple-auth/internal/user/session.go new file mode 100644 index 0000000..f8d54f4 --- /dev/null +++ b/examples/simple-auth/internal/user/session.go @@ -0,0 +1,83 @@ +package user + +import ( + "context" + "crypto/rand" + "encoding/hex" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "net/http" + "simpleauth/internal/db" + "time" +) + +type CreatedSession struct { + Id string + Expiration time.Time + UserId int64 +} + +func CreateSession(ctx *h.RequestContext, userId int64) (CreatedSession, error) { + sessionId, err := GenerateSessionID() + + if err != nil { + return CreatedSession{}, err + } + + // create a session in the database + queries := service.Get[db.Queries](ctx.ServiceLocator()) + + created := CreatedSession{ + Id: sessionId, + Expiration: time.Now().Add(time.Hour * 24), + UserId: userId, + } + + err = queries.CreateSession(context.Background(), db.CreateSessionParams{ + UserID: created.UserId, + SessionID: created.Id, + ExpiresAt: created.Expiration.Format(time.RFC3339), + }) + + if err != nil { + return CreatedSession{}, err + } + + return created, nil +} + +func GetUserFromSession(ctx *h.RequestContext) (db.User, error) { + cookie, err := ctx.Request.Cookie("session_id") + if err != nil { + return db.User{}, err + } + queries := service.Get[db.Queries](ctx.ServiceLocator()) + user, err := queries.GetUserByToken(context.Background(), cookie.Value) + if err != nil { + return db.User{}, err + } + return user, nil +} + +func WriteSessionCookie(ctx *h.RequestContext, session CreatedSession) { + cookie := http.Cookie{ + Name: "session_id", + Value: session.Id, + HttpOnly: true, + SameSite: http.SameSiteStrictMode, + Expires: session.Expiration, + Path: "/", + } + ctx.Response.Header().Add("Set-Cookie", cookie.String()) +} + +func GenerateSessionID() (string, error) { + // Create a byte slice for storing the random bytes + bytes := make([]byte, 32) // 32 bytes = 256 bits, which is a secure length + // Read random bytes from crypto/rand + if _, err := rand.Read(bytes); err != nil { + return "", err + } + // Encode to hexadecimal to get a string representation + return hex.EncodeToString(bytes), nil +} diff --git a/examples/simple-auth/main.go b/examples/simple-auth/main.go new file mode 100644 index 0000000..ca237d4 --- /dev/null +++ b/examples/simple-auth/main.go @@ -0,0 +1,35 @@ +package main + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/service" + "io/fs" + "net/http" + "simpleauth/__htmgo" + "simpleauth/internal/db" +) + +func main() { + locator := service.NewLocator() + + service.Set(locator, service.Singleton, func() *db.Queries { + return db.Provide() + }) + + h.Start(h.AppOpts{ + ServiceLocator: locator, + LiveReload: true, + Register: func(app *h.App) { + sub, err := fs.Sub(GetStaticAssets(), "assets/dist") + + if err != nil { + panic(err) + } + + http.FileServerFS(sub) + + app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) + __htmgo.Register(app.Router) + }, + }) +} diff --git a/examples/simple-auth/pages/index.go b/examples/simple-auth/pages/index.go new file mode 100644 index 0000000..364f0f3 --- /dev/null +++ b/examples/simple-auth/pages/index.go @@ -0,0 +1,74 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/internal/db" + "simpleauth/internal/user" + "simpleauth/partials" + "simpleauth/ui" +) + +func IndexPage(ctx *h.RequestContext) *h.Page { + u, ok := user.GetUserOrRedirect(ctx) + if !ok { + return nil + } + return h.NewPage( + RootPage(UserProfilePage(u)), + ) +} + +func UserProfilePage(u db.User) *h.Element { + + meta := user.ParseMeta(u.Metadata) + + return h.Div( + h.Class("flex flex-col gap-6 items-center pt-10 min-h-screen bg-neutral-100"), + h.H3F("User Profile", h.Class("text-2xl font-bold")), + h.Pf("Welcome, %s!", u.Email), + h.Form( + h.Attribute("hx-swap", "none"), + h.PostPartial(partials.UpdateProfile), + h.TriggerChildren(), + h.Class("flex flex-col gap-4 w-full max-w-md p-6 bg-white rounded-md shadow-md"), + + ui.Input(ui.InputProps{ + Id: "email", + Name: "email", + Label: "Email Address", + Type: "email", + DefaultValue: u.Email, + Children: []h.Ren{ + h.Disabled(), + }, + }), + + ui.Input(ui.InputProps{ + Name: "birth-date", + Label: "Birth Date", + DefaultValue: user.GetMetaKey(meta, "birthDate"), + Type: "date", + }), + + ui.Input(ui.InputProps{ + Name: "favorite-color", + Label: "Favorite Color", + DefaultValue: user.GetMetaKey(meta, "favoriteColor"), + }), + + ui.Input(ui.InputProps{ + Name: "occupation", + Label: "Occupation", + DefaultValue: user.GetMetaKey(meta, "occupation"), + }), + + ui.FormError(""), + ui.SubmitButton("Save Changes"), + ), + h.A( + h.Text("Log out"), + h.Href("/logout"), + h.Class("text-blue-400"), + ), + ) +} diff --git a/examples/simple-auth/pages/login.go b/examples/simple-auth/pages/login.go new file mode 100644 index 0000000..a9b148d --- /dev/null +++ b/examples/simple-auth/pages/login.go @@ -0,0 +1,49 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/partials" + "simpleauth/ui" +) + +func Login(ctx *h.RequestContext) *h.Page { + return h.NewPage( + RootPage( + ui.CenteredForm(ui.CenteredFormProps{ + Title: "Sign In", + SubmitText: "Sign In", + PostUrl: h.GetPartialPath(partials.LoginUser), + Children: []h.Ren{ + ui.Input(ui.InputProps{ + Id: "username", + Name: "email", + Label: "Email Address", + Type: "email", + Required: true, + Children: []h.Ren{ + h.Attribute("autocomplete", "off"), + h.MaxLength(50), + }, + }), + + ui.Input(ui.InputProps{ + Id: "password", + Name: "password", + Label: "Password", + Type: "password", + Required: true, + Children: []h.Ren{ + h.MinLength(6), + }, + }), + + h.A( + h.Href("/register"), + h.Text("Don't have an account? Register here"), + h.Class("text-blue-500"), + ), + }, + }), + ), + ) +} diff --git a/examples/simple-auth/pages/logout.go b/examples/simple-auth/pages/logout.go new file mode 100644 index 0000000..3655a42 --- /dev/null +++ b/examples/simple-auth/pages/logout.go @@ -0,0 +1,23 @@ +package pages + +import "github.com/maddalax/htmgo/framework/h" + +func LogoutPage(ctx *h.RequestContext) *h.Page { + + // clear the session cookie + ctx.Response.Header().Set( + "Set-Cookie", + "session_id=; Path=/; Max-Age=0", + ) + + ctx.Response.Header().Set( + "Location", + "/login", + ) + + ctx.Response.WriteHeader( + 302, + ) + + return nil +} diff --git a/examples/simple-auth/pages/register.go b/examples/simple-auth/pages/register.go new file mode 100644 index 0000000..476c180 --- /dev/null +++ b/examples/simple-auth/pages/register.go @@ -0,0 +1,49 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/partials" + "simpleauth/ui" +) + +func Register(ctx *h.RequestContext) *h.Page { + return h.NewPage( + RootPage( + ui.CenteredForm(ui.CenteredFormProps{ + PostUrl: h.GetPartialPath(partials.RegisterUser), + Title: "Create an Account", + SubmitText: "Register", + Children: []h.Ren{ + ui.Input(ui.InputProps{ + Id: "username", + Name: "email", + Label: "Email Address", + Type: "email", + Required: true, + Children: []h.Ren{ + h.Attribute("autocomplete", "off"), + h.MaxLength(50), + }, + }), + + ui.Input(ui.InputProps{ + Id: "password", + Name: "password", + Label: "Password", + Type: "password", + Required: true, + Children: []h.Ren{ + h.MinLength(6), + }, + }), + + h.A( + h.Href("/login"), + h.Text("Already have an account? Login here"), + h.Class("text-blue-500"), + ), + }, + }), + ), + ) +} diff --git a/examples/simple-auth/pages/root.go b/examples/simple-auth/pages/root.go new file mode 100644 index 0000000..bacdd61 --- /dev/null +++ b/examples/simple-auth/pages/root.go @@ -0,0 +1,32 @@ +package pages + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func RootPage(children ...h.Ren) h.Ren { + return h.Html( + h.HxExtensions(h.BaseExtensions()), + h.Head( + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Link("/public/favicon.ico", "icon"), + h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Meta("title", "htmgo template"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), + h.Meta("description", "this is a template"), + h.Meta("og:title", "htmgo template"), + h.Meta("og:url", "https://htmgo.dev"), + h.Link("canonical", "https://htmgo.dev"), + h.Meta("og:description", "this is a template"), + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + ), + h.Body( + h.Div( + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Fragment(children...), + ), + ), + ) +} diff --git a/examples/simple-auth/partials/profile.go b/examples/simple-auth/partials/profile.go new file mode 100644 index 0000000..8f18d2f --- /dev/null +++ b/examples/simple-auth/partials/profile.go @@ -0,0 +1,36 @@ +package partials + +import ( + "github.com/maddalax/htmgo/framework/h" + "log/slog" + "simpleauth/internal/user" + "simpleauth/ui" +) + +func UpdateProfile(ctx *h.RequestContext) *h.Partial { + if !ctx.IsHttpPost() { + return nil + } + + patch := map[string]any{ + "birthDate": ctx.FormValue("birth-date"), + "favoriteColor": ctx.FormValue("favorite-color"), + "occupation": ctx.FormValue("occupation"), + } + + u, ok := user.GetUserOrRedirect(ctx) + + if !ok { + return nil + } + + err := user.SetMeta(ctx, u.ID, patch) + + if err != nil { + slog.Error("failed to update user profile", slog.String("error", err.Error())) + ctx.Response.WriteHeader(400) + return ui.SwapFormError(ctx, "something went wrong") + } + + return h.RedirectPartial("/") +} diff --git a/examples/simple-auth/partials/user.go b/examples/simple-auth/partials/user.go new file mode 100644 index 0000000..1023e6f --- /dev/null +++ b/examples/simple-auth/partials/user.go @@ -0,0 +1,62 @@ +package partials + +import ( + "github.com/maddalax/htmgo/framework/h" + "simpleauth/internal/user" + "simpleauth/ui" +) + +func RegisterUser(ctx *h.RequestContext) *h.Partial { + if !ctx.IsHttpPost() { + return nil + } + + payload := user.CreateUserRequest{ + Email: ctx.FormValue("email"), + Password: ctx.FormValue("password"), + } + + id, err := user.Create( + ctx, + payload, + ) + + if err != nil { + ctx.Response.WriteHeader(400) + return ui.SwapFormError(ctx, err.Error()) + } + + session, err := user.CreateSession(ctx, id) + + if err != nil { + ctx.Response.WriteHeader(500) + return ui.SwapFormError(ctx, "something went wrong") + } + + user.WriteSessionCookie(ctx, session) + + return h.RedirectPartial("/") +} + +func LoginUser(ctx *h.RequestContext) *h.Partial { + if !ctx.IsHttpPost() { + return nil + } + + payload := user.LoginUserRequest{ + Email: ctx.FormValue("email"), + Password: ctx.FormValue("password"), + } + + _, err := user.Login( + ctx, + payload, + ) + + if err != nil { + ctx.Response.WriteHeader(400) + return ui.SwapFormError(ctx, err.Error()) + } + + return h.RedirectPartial("/") +} diff --git a/examples/simple-auth/sqlc.yaml b/examples/simple-auth/sqlc.yaml new file mode 100644 index 0000000..30c0518 --- /dev/null +++ b/examples/simple-auth/sqlc.yaml @@ -0,0 +1,9 @@ +version: "2" +sql: + - schema: "internal/db/schema.sql" + queries: "internal/db/queries.sql" + engine: "sqlite" + gen: + go: + package: "db" + out: "internal/db" diff --git a/examples/simple-auth/tailwind.config.js b/examples/simple-auth/tailwind.config.js new file mode 100644 index 0000000..b18125c --- /dev/null +++ b/examples/simple-auth/tailwind.config.js @@ -0,0 +1,5 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["**/*.go"], + plugins: [], +}; diff --git a/examples/simple-auth/ui/button.go b/examples/simple-auth/ui/button.go new file mode 100644 index 0000000..015a5e0 --- /dev/null +++ b/examples/simple-auth/ui/button.go @@ -0,0 +1,41 @@ +package ui + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/js" +) + +func SubmitButton(submitText string) *h.Element { + buttonClasses := "rounded items-center px-3 py-2 bg-slate-800 text-white w-full text-center" + + return h.Div( + h.HxBeforeRequest( + js.RemoveClassOnChildren(".loading", "hidden"), + js.SetClassOnChildren(".submit", "hidden"), + ), + h.HxAfterRequest( + js.SetClassOnChildren(".loading", "hidden"), + js.RemoveClassOnChildren(".submit", "hidden"), + ), + h.Class("flex gap-2 justify-center"), + h.Button( + h.Class("loading hidden relative text-center", buttonClasses), + spinner(), + h.Disabled(), + h.Text("Submitting..."), + ), + h.Button( + h.Type("submit"), + h.Class("submit", buttonClasses), + h.Text(submitText), + ), + ) +} + +func spinner(children ...h.Ren) *h.Element { + return h.Div( + h.Children(children...), + h.Class("absolute left-1 spinner spinner-border animate-spin inline-block w-6 h-6 border-4 rounded-full border-slate-200 border-t-transparent"), + h.Attribute("role", "status"), + ) +} diff --git a/examples/simple-auth/ui/error.go b/examples/simple-auth/ui/error.go new file mode 100644 index 0000000..a410e13 --- /dev/null +++ b/examples/simple-auth/ui/error.go @@ -0,0 +1,17 @@ +package ui + +import "github.com/maddalax/htmgo/framework/h" + +func FormError(error string) *h.Element { + return h.Div( + h.Id("form-error"), + h.Text(error), + h.If(error != "", h.Class("p-4 bg-rose-400 text-white rounded")), + ) +} + +func SwapFormError(ctx *h.RequestContext, error string) *h.Partial { + return h.SwapPartial(ctx, + FormError(error), + ) +} diff --git a/examples/simple-auth/ui/input.go b/examples/simple-auth/ui/input.go new file mode 100644 index 0000000..f465766 --- /dev/null +++ b/examples/simple-auth/ui/input.go @@ -0,0 +1,55 @@ +package ui + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" +) + +type InputProps struct { + Id string + Label string + Name string + Type string + DefaultValue string + Placeholder string + Required bool + ValidationPath string + Error string + Children []h.Ren +} + +func Input(props InputProps) *h.Element { + validation := h.If(props.ValidationPath != "", h.Children( + h.Post(props.ValidationPath, hx.BlurEvent), + h.Attribute("hx-swap", "innerHTML transition:true"), + h.Attribute("hx-target", "next div"), + )) + + if props.Type == "" { + props.Type = "text" + } + + input := h.Input( + props.Type, + h.Class("border p-2 rounded focus:outline-none focus:ring focus:ring-slate-800"), + h.If(props.Name != "", h.Name(props.Name)), + h.If(props.Children != nil, h.Children(props.Children...)), + h.If(props.Required, h.Required()), + h.If(props.Placeholder != "", h.Placeholder(props.Placeholder)), + h.If(props.DefaultValue != "", h.Attribute("value", props.DefaultValue)), + validation, + ) + + wrapped := h.Div( + h.If(props.Id != "", h.Id(props.Id)), + h.Class("flex flex-col gap-1"), + h.If(props.Label != "", h.Label(h.Text(props.Label))), + input, + h.Div( + h.Id(props.Id+"-error"), + h.Class("text-red-500"), + ), + ) + + return wrapped +} diff --git a/examples/simple-auth/ui/login.go b/examples/simple-auth/ui/login.go new file mode 100644 index 0000000..1c18b7d --- /dev/null +++ b/examples/simple-auth/ui/login.go @@ -0,0 +1,34 @@ +package ui + +import ( + "chat/components" + "github.com/maddalax/htmgo/framework/h" +) + +type CenteredFormProps struct { + Title string + Children []h.Ren + SubmitText string + PostUrl string +} + +func CenteredForm(props CenteredFormProps) *h.Element { + return h.Div( + h.Class("flex flex-col items-center justify-center min-h-screen bg-neutral-100"), + h.Div( + h.Class("bg-white p-8 rounded-lg shadow-lg w-full max-w-md"), + h.H2F(props.Title, h.Class("text-3xl font-bold text-center mb-6")), + h.Form( + h.TriggerChildren(), + h.Post(props.PostUrl), + h.Attribute("hx-swap", "none"), + h.Class("flex flex-col gap-4"), + h.Children(props.Children...), + // Error message + components.FormError(""), + // Submit button at the bottom + SubmitButton(props.SubmitText), + ), + ), + ) +} From abfc3b0205c303652ad0a17caf0a79e1c4fe47c2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:49:24 -0500 Subject: [PATCH 007/137] remove db --- examples/simple-auth/htmgo-user-example.db | Bin 36864 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 examples/simple-auth/htmgo-user-example.db diff --git a/examples/simple-auth/htmgo-user-example.db b/examples/simple-auth/htmgo-user-example.db deleted file mode 100644 index f572cf5c2006e7992f372b29b42617548405ed2d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36864 zcmeI(U2oe|7yw{9X+Bn#7$mA*6-?RGMq5+c$6pB&BW;{5U7GYG+1d)JI<}8XNAFo^1aZX=K;mXUfs0)t?Jt1DA3)r}&Bg^F#1+SO-L$0>h;p&A*HTjZ^!U8zJnu;) zpV;fGm8MI0r`u~|mq*O&49hYf@I1pX)AV(TzQQd=cgDg4`j1&t2xcojXfDHsd00ck)1V8`;KmY_l;G6=x$;9N1DRvlZc5HIc zv=6rN!2M{uPx}34x6|Jq^hs~KX@|#`7T1hI-QdgBqOrlhusUC>^5H4`>|q<3JBj#Y zW{Mpgg*vQqto`I)+8@<9+32V|Q;ySiCs^yKT|Xdc<7Ug-OZ=tH(f_?Ry(50sub%nz z=2&8KYKr{~yVz`za17z!*kM!k!a~J38sYftI8V2x?Y;Y3xmq`F8f*N@T6wv!w#nZ% zHu*xMUMp8=1ItFWe%(LA??-T2ct*8W=c|oMC8#hOWYBKi*rE55oWPIK?u4Qu=!>dfn(vt*(DO znqOi_8()dWC$C*&Hv{#N@;T``O!m zo1V7!ikvvxEBV(6^e4@+)SQ`@d$`}f-|cy`!_P}tDNt?`7t;h``roB>-!aJA%%e|c z{#9NF_q=@ngK03HnTf+0VAg z6$xJvg)7a2yT-zv(On`BN~Q8X+_v-%0jPsdtqV4sTT(856Q}o znte2FHhbRM(Y8P2X=zX3oAN_m|e2 zZuxGpI$zry%s*_Eg~EO(dpwAg7uCFg&M4X+8^uMZz1y!ZXO7& z-CCpH+n6s4J8p4DFRf-5oQ;Q#O<{hJ-KyVTesCf#9j}^K^y6_4i|9<9qv`R-`?u*C z-iTac-leI1+v7Ri%SwB3Nn6VnUAJ(1Yqhu2*jcD%2OC@WOVZY@_5J>ixr6GhTPvejnnataZefUd+r5)3;` zp&JoRl{A4M0ZT;07!%7zM9fL1j1&`Til&;jCCjE_sg|tEsxI5QqnWbeXp)R^P7H4@ z_Z|SCH{$DgdUE(ofLIr_plD7|@`Av<$?OMFiJ2p|BC9!MDVAg^vZk1-AP_|rHA|FD zEvH*ZQxTCRY#~8)Bu6r_Bj`4*gH-D%L>N^V-G(1V74#sgn+(UQiYn1;NtBhGX=-%b zmS}5&hGkPEnobXpY~@s9+mfs(B0>T^k{m~}C5?z`?o?EI>${>Ib;OVA7ac}Tgi&o9 z*}5&MmSS5HF&z`-97RW}DS5aO5;ctE9CmE%V8zBnMY@tBIbzC!jgd1Nm_JtUhWpW@ z4q;RQ9Y&3ZQHdbxj)@gPrulS`Oz{*^as=v2?M=;+HCwYV9g~8wZd)cHSd)>Jqhq&C zWt7Aqs+>os$LbXYQN8>BqgW)L|9>TC4h$LuKmY_l00ck)1V8`;KmY_@MgjQ!|Exy~ z{=?t@queuw`-A(1d&WKIp1+J!0Qv+1AOHd&00JNY0w4eaAOHd&00JQJHv+LJ%SK|{ QuS`7R? Date: Sun, 20 Oct 2024 07:51:18 -0500 Subject: [PATCH 008/137] remove log --- examples/simple-auth/internal/user/handler.go | 3 --- 1 file changed, 3 deletions(-) diff --git a/examples/simple-auth/internal/user/handler.go b/examples/simple-auth/internal/user/handler.go index ad60648..0ff3a97 100644 --- a/examples/simple-auth/internal/user/handler.go +++ b/examples/simple-auth/internal/user/handler.go @@ -26,9 +26,6 @@ type CreatedUser struct { } func Create(ctx *h.RequestContext, request CreateUserRequest) (int64, error) { - - fmt.Printf("%+v\n", request) - if len(request.Password) < 6 { return 0, errors.New("password must be at least 6 characters long") } From 39744d6248ae17753081afb679e696d89744e137 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:52:13 -0500 Subject: [PATCH 009/137] add workflow --- .github/workflows/release-auth-example.yml | 52 ++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 .github/workflows/release-auth-example.yml diff --git a/.github/workflows/release-auth-example.yml b/.github/workflows/release-auth-example.yml new file mode 100644 index 0000000..ae84089 --- /dev/null +++ b/.github/workflows/release-auth-example.yml @@ -0,0 +1,52 @@ +name: Build and Deploy htmgo auth example + +on: + workflow_run: + workflows: [ "Update HTMGO Framework Dependency" ] # The name of the first workflow + types: + - completed + workflow_dispatch: # Trigger on manual workflow_dispatch + push: + branches: + - master # Trigger on pushes to master + paths: + - 'examples/simple-auth/**' # Trigger only if files in this directory change + - "framework-ui/**" + - "cli/**" + +jobs: + build-and-push: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v2 + + - name: Log in to GitHub Container Registry + uses: docker/login-action@v2 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Get short commit hash + id: vars + run: echo "::set-output name=short_sha::$(echo $GITHUB_SHA | cut -c1-7)" + + - name: Build Docker image + run: | + cd ./examples/simple-auth && docker build -t ghcr.io/${{ github.repository_owner }}/simple-auth:${{ steps.vars.outputs.short_sha }} . + + - name: Tag as latest Docker image + run: | + docker tag ghcr.io/${{ github.repository_owner }}/simple-auth:${{ steps.vars.outputs.short_sha }} ghcr.io/${{ github.repository_owner }}/simple-auth:latest + + - name: Log in to GitHub Container Registry + run: echo "${{ secrets.CR_PAT }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin + + - name: Push Docker image + run: | + docker push ghcr.io/${{ github.repository_owner }}/simple-auth:latest From c6c05193c6869789deb118113ed5aa736e8f7ef0 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:55:18 -0500 Subject: [PATCH 010/137] fix dockerfile --- examples/simple-auth/Dockerfile | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/examples/simple-auth/Dockerfile b/examples/simple-auth/Dockerfile index 8f3a358..531b708 100644 --- a/examples/simple-auth/Dockerfile +++ b/examples/simple-auth/Dockerfile @@ -1,9 +1,5 @@ # Stage 1: Build the Go binary -FROM golang:1.23-alpine AS builder - -RUN apk update -RUN apk add git -RUN apk add curl +FROM golang:1.23 AS builder # Set the working directory inside the container WORKDIR /app @@ -18,7 +14,9 @@ RUN go mod download COPY . . # Build the Go binary for Linux -RUN GOPRIVATE=github.com/maddalax GOPROXY=direct go run github.com/maddalax/htmgo/cli/htmgo@latest build +RUN CGO_ENABLED=0 GOPRIVATE=github.com/maddalax LOG_LEVEL=debug go run github.com/maddalax/htmgo/cli/htmgo@latest build + +RUN CGO_ENABLED=1 GOOS=linux go build -tags prod -o ./dist -a -ldflags '-linkmode external -extldflags "-static"' . # Stage 2: Create the smallest possible image From 19b700b676516c35146aba1a568bb3817c22d91d Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 07:56:26 -0500 Subject: [PATCH 011/137] small fix --- examples/simple-auth/ui/login.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/simple-auth/ui/login.go b/examples/simple-auth/ui/login.go index 1c18b7d..93a2d97 100644 --- a/examples/simple-auth/ui/login.go +++ b/examples/simple-auth/ui/login.go @@ -1,7 +1,6 @@ package ui import ( - "chat/components" "github.com/maddalax/htmgo/framework/h" ) @@ -25,7 +24,7 @@ func CenteredForm(props CenteredFormProps) *h.Element { h.Class("flex flex-col gap-4"), h.Children(props.Children...), // Error message - components.FormError(""), + FormError(""), // Submit button at the bottom SubmitButton(props.SubmitText), ), From 46b21f75b5412a644b16c2d9f7167b06295eccd7 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 08:01:24 -0500 Subject: [PATCH 012/137] fix build --- examples/simple-auth/go.mod | 3 ++- examples/simple-auth/go.sum | 4 ++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 8e15c29..9514ccd 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -2,10 +2,11 @@ module simpleauth go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 +require github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/mattn/go-sqlite3 v1.14.24 // indirect golang.org/x/crypto v0.28.0 // indirect ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index b173b66..62d2592 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -6,6 +6,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651 h1:Uj0Bg0Z+hu5yf8TIcKMnzjZ/GEOXUPssDVfs8s+eiRw= +github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= +github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From b8d23131b701986e0d1d04e422b0161e1793481e Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 08:03:30 -0500 Subject: [PATCH 013/137] fix entrypoint --- examples/simple-auth/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/simple-auth/Dockerfile b/examples/simple-auth/Dockerfile index 531b708..345375d 100644 --- a/examples/simple-auth/Dockerfile +++ b/examples/simple-auth/Dockerfile @@ -33,4 +33,4 @@ EXPOSE 3000 # Command to run the binary -CMD ["./simple-auth"] +CMD ["./simpleauth"] From c32fa1bccdfae35c546e198978fe83cc414f3aa6 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sun, 20 Oct 2024 08:09:40 -0500 Subject: [PATCH 014/137] add user auth to examples page --- htmgo-site/assets/public/auth-example.jpg | Bin 0 -> 81451 bytes htmgo-site/pages/examples.go | 7 +++++++ 2 files changed, 7 insertions(+) create mode 100644 htmgo-site/assets/public/auth-example.jpg diff --git a/htmgo-site/assets/public/auth-example.jpg b/htmgo-site/assets/public/auth-example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..9a6637386383eb8cf36824d9dcd041c790ce991b GIT binary patch literal 81451 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 Date: Sun, 20 Oct 2024 10:21:37 -0500 Subject: [PATCH 015/137] add some helper methods for redirect and setting cookie --- examples/simple-auth/internal/user/http.go | 3 +-- examples/simple-auth/internal/user/session.go | 2 +- framework/h/app.go | 15 +++++++++++++++ 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/examples/simple-auth/internal/user/http.go b/examples/simple-auth/internal/user/http.go index d6865d1..8e1f462 100644 --- a/examples/simple-auth/internal/user/http.go +++ b/examples/simple-auth/internal/user/http.go @@ -9,8 +9,7 @@ func GetUserOrRedirect(ctx *h.RequestContext) (db.User, bool) { user, err := GetUserFromSession(ctx) if err != nil { - ctx.Response.Header().Set("Location", "/login") - ctx.Response.WriteHeader(302) + ctx.Redirect("/login", 302) return db.User{}, false } diff --git a/examples/simple-auth/internal/user/session.go b/examples/simple-auth/internal/user/session.go index f8d54f4..19cd5f8 100644 --- a/examples/simple-auth/internal/user/session.go +++ b/examples/simple-auth/internal/user/session.go @@ -68,7 +68,7 @@ func WriteSessionCookie(ctx *h.RequestContext, session CreatedSession) { Expires: session.Expiration, Path: "/", } - ctx.Response.Header().Add("Set-Cookie", cookie.String()) + ctx.SetCookie(&cookie) } func GenerateSessionID() (string, error) { diff --git a/framework/h/app.go b/framework/h/app.go index 39b480a..bbf0e32 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -33,6 +33,21 @@ func GetRequestContext(r *http.Request) *RequestContext { return r.Context().Value(RequestContextKey).(*RequestContext) } +func (c *RequestContext) SetCookie(cookie *http.Cookie) { + http.SetCookie(c.Response, cookie) +} + +func (c *RequestContext) Redirect(path string, code int) { + if code == 0 { + code = http.StatusTemporaryRedirect + } + if code < 300 || code > 399 { + code = http.StatusTemporaryRedirect + } + c.Response.Header().Set("Location", path) + c.Response.WriteHeader(code) +} + func (c *RequestContext) IsHttpPost() bool { return c.Request.Method == http.MethodPost } From 7a038e6af17431074350e0615de2f02c76f2f18e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 20 Oct 2024 15:22:16 +0000 Subject: [PATCH 016/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 8 +++++--- examples/simple-auth/go.sum | 6 ++---- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index b2cc51f..7643028 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 + github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 20c322e..810b63c 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index bf92348..fe3359e 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 +require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index eca7617..d0a239f 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 9514ccd..c4dcdf8 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -2,11 +2,13 @@ module simpleauth go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651 +require ( + github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/mattn/go-sqlite3 v1.14.24 + golang.org/x/crypto v0.28.0 +) require ( github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect - github.com/mattn/go-sqlite3 v1.14.24 // indirect - golang.org/x/crypto v0.28.0 // indirect ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 62d2592..2f51736 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,10 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651 h1:Uj0Bg0Z+hu5yf8TIcKMnzjZ/GEOXUPssDVfs8s+eiRw= -github.com/maddalax/htmgo/framework v0.0.0-20241020125626-19b700b67651/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 893ffb6..9c08dc9 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 + github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 33aeb0a..9164e8c 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index d0cf210..7a2fbeb 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 +require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index eca7617..d0a239f 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 2387993..25e272e 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 + github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index dbf8bde..c33245d 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 52613f2..b40e7e0 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 +require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index eca7617..d0a239f 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234 h1:1WfY9h8EoZXwzM8hmfCXolZVKr4/p1dgLoW9rKQ5Lso= -github.com/maddalax/htmgo/framework v0.0.0-20241018222959-a7110576d234/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= +github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From cea6b1cff24f194566695e52663dbb94f51a8e99 Mon Sep 17 00:00:00 2001 From: Kevin Lewin <97046295+lewinkedrs@users.noreply.github.com> Date: Mon, 21 Oct 2024 10:17:18 -0400 Subject: [PATCH 017/137] Update slog output for server start (#27) Fixing f string error. --- framework/h/app.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/h/app.go b/framework/h/app.go index bbf0e32..61a935a 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -213,7 +213,7 @@ func (app *App) start() { } port := ":3000" - slog.Info(fmt.Sprintf("Server started at localhost:%s", port)) + slog.Info(fmt.Sprintf("Server started at localhost%s", port)) err := http.ListenAndServe(port, app.Router) if err != nil { From 245d63c7b2f363386464c8c2fa6d7459e3c0a227 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 21 Oct 2024 14:18:00 +0000 Subject: [PATCH 018/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 7643028..813dbd9 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 810b63c..c38d243 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index fe3359e..7c7e257 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 +require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index d0a239f..9466e31 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index c4dcdf8..26a4672 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 2f51736..99c85af 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 9c08dc9..41cebe5 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 9164e8c..646dd3f 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 7a2fbeb..e3c7f33 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 +require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index d0a239f..9466e31 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 25e272e..6d0f650 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 + github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index c33245d..a7cca11 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index b40e7e0..c9bb61c 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 +require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index d0a239f..9466e31 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78 h1:Z9JgL4GqRPfxCRKllB6qjtfYySdrp0xVSxWnepj9/18= -github.com/maddalax/htmgo/framework v0.0.0-20241020152137-b6d901fadf78/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= +github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 635b17dd7f9dd44785228ab6cb3af35d14780a36 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 21 Oct 2024 10:06:18 -0500 Subject: [PATCH 019/137] add support for ignoring specific files for automatic page/partial routing --- cli/htmgo/tasks/astgen/entry.go | 15 +++++++++++ framework/config/project.go | 34 +++++++++++++++++++---- framework/config/project_test.go | 32 ++++++++++++++++++++++ framework/h/lifecycle.go | 1 - templates/starter/htmgo.yml | 8 ++++++ templates/starter/pages/index.go | 14 +++++----- templates/starter/pages/root.go | 46 +++++++++++++++++--------------- 7 files changed, 114 insertions(+), 36 deletions(-) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index e11ef0b..8472c03 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -2,7 +2,9 @@ package astgen import ( "fmt" + "github.com/maddalax/htmgo/cli/htmgo/internal/dirutil" "github.com/maddalax/htmgo/cli/htmgo/tasks/process" + "github.com/maddalax/htmgo/framework/h" "go/ast" "go/parser" "go/token" @@ -24,6 +26,7 @@ type Partial struct { FuncName string Package string Import string + Path string } const GeneratedDirName = "__htmgo" @@ -103,6 +106,7 @@ func findPublicFuncsReturningHPartial(dir string, predicate func(partial Partial if selectorExpr.Sel.Name == "Partial" { p := Partial{ Package: node.Name.Name, + Path: sliceCommonPrefix(cwd, path), Import: sliceCommonPrefix(cwd, strings.ReplaceAll(filepath.Dir(path), `\`, `/`)), FuncName: funcDecl.Name.Name, } @@ -254,12 +258,18 @@ func buildGetPartialFromContext(builder *CodeBuilder, partials []Partial) { } func writePartialsFile() { + config := dirutil.GetConfig() + cwd := process.GetWorkingDir() partialPath := filepath.Join(cwd, "partials") partials, err := findPublicFuncsReturningHPartial(partialPath, func(partial Partial) bool { return partial.FuncName != "GetPartialFromContext" }) + partials = h.Filter(partials, func(partial Partial) bool { + return !dirutil.IsGlobExclude(partial.Path, config.AutomaticPartialRoutingIgnore) + }) + if err != nil { fmt.Println(err) return @@ -317,6 +327,7 @@ func formatRoute(path string) string { } func writePagesFile() { + config := dirutil.GetConfig() builder := NewCodeBuilder(nil) builder.AppendLine(GeneratedFileLine) @@ -326,6 +337,10 @@ func writePagesFile() { pages, _ := findPublicFuncsReturningHPage("pages") + pages = h.Filter(pages, func(page Page) bool { + return !dirutil.IsGlobExclude(page.Path, config.AutomaticPageRoutingIgnore) + }) + if len(pages) > 0 { builder.AddImport(ModuleName) } diff --git a/framework/config/project.go b/framework/config/project.go index 72e222d..33f6cfc 100644 --- a/framework/config/project.go +++ b/framework/config/project.go @@ -5,12 +5,15 @@ import ( "log/slog" "os" "path" + "strings" ) type ProjectConfig struct { - Tailwind bool `yaml:"tailwind"` - WatchIgnore []string `yaml:"watch_ignore"` - WatchFiles []string `yaml:"watch_files"` + Tailwind bool `yaml:"tailwind"` + WatchIgnore []string `yaml:"watch_ignore"` + WatchFiles []string `yaml:"watch_files"` + AutomaticPageRoutingIgnore []string `yaml:"automatic_page_routing_ignore"` + AutomaticPartialRoutingIgnore []string `yaml:"automatic_partial_routing_ignore"` } func DefaultProjectConfig() *ProjectConfig { @@ -25,7 +28,7 @@ func DefaultProjectConfig() *ProjectConfig { } } -func (cfg *ProjectConfig) EnhanceWithDefaults() *ProjectConfig { +func (cfg *ProjectConfig) Enhance() *ProjectConfig { defaultCfg := DefaultProjectConfig() if len(cfg.WatchFiles) == 0 { cfg.WatchFiles = defaultCfg.WatchFiles @@ -33,6 +36,27 @@ func (cfg *ProjectConfig) EnhanceWithDefaults() *ProjectConfig { if len(cfg.WatchIgnore) == 0 { cfg.WatchIgnore = defaultCfg.WatchIgnore } + + for i, s := range cfg.AutomaticPartialRoutingIgnore { + parts := strings.Split(s, string(os.PathSeparator)) + if len(parts) == 0 { + continue + } + if parts[0] != "partials" { + cfg.AutomaticPartialRoutingIgnore[i] = path.Join("partials", s) + } + } + + for i, s := range cfg.AutomaticPageRoutingIgnore { + parts := strings.Split(s, string(os.PathSeparator)) + if len(parts) == 0 { + continue + } + if parts[0] != "pages" { + cfg.AutomaticPageRoutingIgnore[i] = path.Join("pages", s) + } + } + return cfg } @@ -50,7 +74,7 @@ func FromConfigFile(workingDir string) *ProjectConfig { slog.Error("Error parsing config file", slog.String("file", filePath), slog.String("error", err.Error())) os.Exit(1) } - return cfg.EnhanceWithDefaults() + return cfg.Enhance() } } } diff --git a/framework/config/project_test.go b/framework/config/project_test.go index f015635..bb492a0 100644 --- a/framework/config/project_test.go +++ b/framework/config/project_test.go @@ -41,6 +41,38 @@ func TestShouldNotSetTailwindTrue(t *testing.T) { assert.Equal(t, 8, len(cfg.WatchFiles)) } +func TestShouldPrefixAutomaticPageRoutingIgnore(t *testing.T) { + t.Parallel() + cfg := DefaultProjectConfig() + cfg.AutomaticPageRoutingIgnore = []string{"somefile"} + cfg.Enhance() + assert.Equal(t, []string{"pages/somefile"}, cfg.AutomaticPageRoutingIgnore) +} + +func TestShouldPrefixAutomaticPageRoutingIgnore_1(t *testing.T) { + t.Parallel() + cfg := DefaultProjectConfig() + cfg.AutomaticPageRoutingIgnore = []string{"pages/somefile/*"} + cfg.Enhance() + assert.Equal(t, []string{"pages/somefile/*"}, cfg.AutomaticPageRoutingIgnore) +} + +func TestShouldPrefixAutomaticPartialRoutingIgnore(t *testing.T) { + t.Parallel() + cfg := DefaultProjectConfig() + cfg.AutomaticPartialRoutingIgnore = []string{"somefile/*"} + cfg.Enhance() + assert.Equal(t, []string{"partials/somefile/*"}, cfg.AutomaticPartialRoutingIgnore) +} + +func TestShouldPrefixAutomaticPartialRoutingIgnore_1(t *testing.T) { + t.Parallel() + cfg := DefaultProjectConfig() + cfg.AutomaticPartialRoutingIgnore = []string{"partials/somefile/*"} + cfg.Enhance() + assert.Equal(t, []string{"partials/somefile/*"}, cfg.AutomaticPartialRoutingIgnore) +} + func writeConfigFile(t *testing.T, content string) string { temp := os.TempDir() os.Mkdir(temp, 0755) diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index c9ceb7d..719df74 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -30,7 +30,6 @@ func validateCommands(cmds []Command) { panic(fmt.Sprintf("element is not allowed in lifecycle events. Got: %v", t)) default: panic(fmt.Sprintf("type is not allowed in lifecycle events. Got: %v", t)) - } } } diff --git a/templates/starter/htmgo.yml b/templates/starter/htmgo.yml index d60d2ff..7647094 100644 --- a/templates/starter/htmgo.yml +++ b/templates/starter/htmgo.yml @@ -8,3 +8,11 @@ watch_ignore: [".git", "node_modules", "dist/*"] # files to watch for changes, supports glob patterns through https://github.com/bmatcuk/doublestar watch_files: ["**/*.go", "**/*.css", "**/*.md"] + +# files or directories to ignore when automatically registering routes for pages +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_page_routing_ignore: ["root.go"] + +# files or directories to ignore when automatically registering routes for partials +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_partial_routing_ignore: [] diff --git a/templates/starter/pages/index.go b/templates/starter/pages/index.go index ac1c004..08c6f17 100644 --- a/templates/starter/pages/index.go +++ b/templates/starter/pages/index.go @@ -6,15 +6,13 @@ import ( ) func IndexPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - RootPage( + return RootPage( + h.Div( + h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), + h.H3(h.Id("intro-text"), h.Text("hello htmgo"), h.Class("text-5xl")), h.Div( - h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), - h.H3(h.Id("intro-text"), h.Text("hello htmgo"), h.Class("text-5xl")), - h.Div( - h.Class("mt-3"), - partials.CounterForm(0), - ), + h.Class("mt-3"), + partials.CounterForm(0), ), ), ) diff --git a/templates/starter/pages/root.go b/templates/starter/pages/root.go index bacdd61..d930c81 100644 --- a/templates/starter/pages/root.go +++ b/templates/starter/pages/root.go @@ -4,28 +4,30 @@ import ( "github.com/maddalax/htmgo/framework/h" ) -func RootPage(children ...h.Ren) h.Ren { - return h.Html( - h.HxExtensions(h.BaseExtensions()), - h.Head( - h.Meta("viewport", "width=device-width, initial-scale=1"), - h.Link("/public/favicon.ico", "icon"), - h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), - h.Meta("title", "htmgo template"), - h.Meta("charset", "utf-8"), - h.Meta("author", "htmgo"), - h.Meta("description", "this is a template"), - h.Meta("og:title", "htmgo template"), - h.Meta("og:url", "https://htmgo.dev"), - h.Link("canonical", "https://htmgo.dev"), - h.Meta("og:description", "this is a template"), - h.Link("/public/main.css", "stylesheet"), - h.Script("/public/htmgo.js"), - ), - h.Body( - h.Div( - h.Class("flex flex-col gap-2 bg-white h-full"), - h.Fragment(children...), +func RootPage(children ...h.Ren) *h.Page { + return h.NewPage( + h.Html( + h.HxExtensions(h.BaseExtensions()), + h.Head( + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Link("/public/favicon.ico", "icon"), + h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Meta("title", "htmgo template"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), + h.Meta("description", "this is a template"), + h.Meta("og:title", "htmgo template"), + h.Meta("og:url", "https://htmgo.dev"), + h.Link("canonical", "https://htmgo.dev"), + h.Meta("og:description", "this is a template"), + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + ), + h.Body( + h.Div( + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Fragment(children...), + ), ), ), ) From ed2063df174d33c902d74e9813ae214c822dfb4a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 21 Oct 2024 15:07:08 +0000 Subject: [PATCH 020/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 813dbd9..df7b8aa 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f + github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index c38d243..2212b7e 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 7c7e257..2c085bc 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f +require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 9466e31..aa9fe9c 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 26a4672..88d65ae 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f + github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 99c85af..6bd7561 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 41cebe5..d922eb1 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f + github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 646dd3f..9b68ca7 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index e3c7f33..ab6c752 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f +require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 9466e31..aa9fe9c 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 6d0f650..4c07d45 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f + github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index a7cca11..c36cd27 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index c9bb61c..cbe9de4 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f +require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 9466e31..aa9fe9c 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f h1:BoxM0Cpxz82clzZlFqEnVq3/C5SrYYtmfREdgDo5AFY= -github.com/maddalax/htmgo/framework v0.0.0-20241021141718-cea6b1cff24f/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= +github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 14911799b72c4d929a1f8b64d7d733dec00e1139 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 21 Oct 2024 10:21:52 -0500 Subject: [PATCH 021/137] add config docs --- .../md/docs/9_configuration/htmgo_config.md | 26 +++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 htmgo-site/md/docs/9_configuration/htmgo_config.md diff --git a/htmgo-site/md/docs/9_configuration/htmgo_config.md b/htmgo-site/md/docs/9_configuration/htmgo_config.md new file mode 100644 index 0000000..6ba4b79 --- /dev/null +++ b/htmgo-site/md/docs/9_configuration/htmgo_config.md @@ -0,0 +1,26 @@ +## Htmgo Configuration: + +Certain aspects of htmgo can be configured via a `htmgo.yml` file in the root of your project. + +Here is an example configuration file: + +```yaml +# htmgo configuration + +# if tailwindcss is enabled, htmgo will automatically compile your tailwind and output it to assets/dist +tailwind: true + +# which directories to ignore when watching for changes, supports glob patterns through https://github.com/bmatcuk/doublestar +watch_ignore: [".git", "node_modules", "dist/*"] + +# files to watch for changes, supports glob patterns through https://github.com/bmatcuk/doublestar +watch_files: ["**/*.go", "**/*.css", "**/*.md"] + +# files or directories to ignore when automatically registering routes for pages +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_page_routing_ignore: ["root.go"] + +# files or directories to ignore when automatically registering routes for partials +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_partial_routing_ignore: [] +``` From 86e293498fe413f3bbec34a6d1a984fd2c82ab6b Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 21 Oct 2024 10:35:42 -0500 Subject: [PATCH 022/137] update landing page --- README.md | 6 +----- htmgo-site/md/index.md | 22 ++++++++++++++++++++-- htmgo-site/partials/navbar.go | 14 +++++++------- 3 files changed, 28 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index c4be27b..d9b1bae 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,3 @@ -> [!WARNING] -> htmgo is in alpha release and active development. API's may have breaking changes between versions. Please report any issues on GitHub. - ## **htmgo** ### build simple and scalable systems with go + htmx @@ -34,8 +31,7 @@ func IndexPage(ctx *h.RequestContext) *h.Page { 2. live reload (rebuilds css, go, ent schema, and routes upon change) 3. automatic page and partial registration based on file path 4. built in tailwindcss support, no need to configure anything by default -5. plugin architecture to include optional plugins to streamline development, such as http://entgo.io -6. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/b610aefa36e648b98a13823a6f8d87566120cfcc/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks +5. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/b610aefa36e648b98a13823a6f8d87566120cfcc/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks **get started:** diff --git a/htmgo-site/md/index.md b/htmgo-site/md/index.md index 3e9ca0c..a538c8b 100644 --- a/htmgo-site/md/index.md +++ b/htmgo-site/md/index.md @@ -22,5 +22,23 @@ func IndexPage(ctx *h.RequestContext) *h.Page { 2. live reload (rebuilds css, go, ent schema, and routes upon change) 3. automatic page and partial registration based on file path 4. built in tailwindcss support, no need to configure anything by default -5. plugin architecture to include optional plugins to streamline development, such as http://entgo.io -6. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/master/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks +5. custom [htmx extensions](https://github.com/maddalax/htmgo/tree/master/framework/assets/js/htmxextensions) to reduce boilerplate with common tasks + +------ + +**what can be built with htmgo?** + +Most web applications can be built with htmgo, including but not limited to: + +- Traditional business CRUD applications +- blogs +- documentation sites +- consumer facing websites +- internal tools +- and more + +
+ +For a more detailed overview of when you should use hypermedia to build web applications, see [when-to-use-hypermedia](https://htmx.org/essays/when-to-use-hypermedia/) from htmx.org. + +Interested in some examples? Check out [examples](/examples). diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 913e09f..1b438cf 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -75,12 +75,12 @@ func Star(ctx *h.RequestContext) *h.Element { } func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { - prelease := h.If(props.ShowPreRelease, h.A( - h.Class("bg-yellow-200 text-yellow-800 text-center p-2 flex items-center justify-center"), - h.Href("https://github.com/maddalax/htmgo/issues"), - h.Attribute("target", "_blank"), - h.Text("htmgo is in alpha release. Please report any issues on GitHub."), - )) + //prelease := h.If(props.ShowPreRelease, h.A( + // h.Class("bg-blue-200 text-blue-700 text-center p-2 flex items-center justify-center"), + // h.Href("https://github.com/maddalax/htmgo/issues"), + // h.Attribute("target", "_blank"), + // h.Text("htmgo."), + //)) desktopNav := h.Nav( h.Class("hidden sm:block bg-neutral-100 border border-b-slate-300 p-4 md:p-3 max-h-[100vh - 9rem] overflow-y-auto"), @@ -118,7 +118,7 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { return h.Div( h.Id("navbar"), - prelease, + //prelease, MobileNav(ctx, props.Expanded), desktopNav, ) From b92213b3567c77fc1213ced2731da40616c5599c Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 21 Oct 2024 10:38:14 -0500 Subject: [PATCH 023/137] oops --- htmgo-site/md/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/md/index.md b/htmgo-site/md/index.md index a538c8b..5325c88 100644 --- a/htmgo-site/md/index.md +++ b/htmgo-site/md/index.md @@ -30,7 +30,7 @@ func IndexPage(ctx *h.RequestContext) *h.Page { Most web applications can be built with htmgo, including but not limited to: -- Traditional business CRUD applications +- traditional business CRUD applications - blogs - documentation sites - consumer facing websites From 70228912be410be25d92b8f23c08063d986cbd1a Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 22 Oct 2024 08:17:58 -0500 Subject: [PATCH 024/137] remove chat deploy on pr --- .github/workflows/release-chat-example.yml | 3 --- 1 file changed, 3 deletions(-) diff --git a/.github/workflows/release-chat-example.yml b/.github/workflows/release-chat-example.yml index 6f87767..6efb434 100644 --- a/.github/workflows/release-chat-example.yml +++ b/.github/workflows/release-chat-example.yml @@ -5,9 +5,6 @@ on: workflows: [ "Update HTMGO Framework Dependency" ] # The name of the first workflow types: - completed - pull_request: - branches: - - master workflow_dispatch: # Trigger on manual workflow_dispatch push: branches: From a0f5b5dfd5bd68928b5dc216939efd056a6022bd Mon Sep 17 00:00:00 2001 From: Mohammad javad <41829984+himynamej@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:32:17 -0400 Subject: [PATCH 025/137] feat:add claasf (#31) * feat:add claasf * refactor(tag.go) * refactor(cache.go) * refactor(attribute.go) * refactor(app.go) * refactor(attribute.go) --- framework/h/app.go | 20 +++++++++++--------- framework/h/attribute.go | 12 ++++++++---- framework/h/cache.go | 4 ++-- framework/h/tag.go | 4 +--- 4 files changed, 22 insertions(+), 18 deletions(-) diff --git a/framework/h/app.go b/framework/h/app.go index 61a935a..2362348 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -3,9 +3,6 @@ package h import ( "context" "fmt" - "github.com/go-chi/chi/v5" - "github.com/maddalax/htmgo/framework/hx" - "github.com/maddalax/htmgo/framework/service" "log/slog" "net/http" "os" @@ -13,6 +10,10 @@ import ( "runtime" "strings" "time" + + "github.com/go-chi/chi/v5" + "github.com/maddalax/htmgo/framework/hx" + "github.com/maddalax/htmgo/framework/service" ) type RequestContext struct { @@ -214,9 +215,8 @@ func (app *App) start() { port := ":3000" slog.Info(fmt.Sprintf("Server started at localhost%s", port)) - err := http.ListenAndServe(port, app.Router) - if err != nil { + if err := http.ListenAndServe(port, app.Router); err != nil { // If we are in watch mode, just try to kill any processes holding that port // and try again if IsDevelopment() && IsWatchMode() { @@ -228,14 +228,16 @@ func (app *App) start() { cmd := exec.Command("bash", "-c", fmt.Sprintf("kill -9 $(lsof -ti%s)", port)) cmd.Run() } + time.Sleep(time.Millisecond * 50) - err = http.ListenAndServe(":3000", app.Router) - if err != nil { + + // Try to start server again + if err := http.ListenAndServe(port, app.Router); err != nil { + slog.Error("Failed to restart server", "error", err) panic(err) } - } else { - panic(err) } + panic(err) } } diff --git a/framework/h/attribute.go b/framework/h/attribute.go index 7cf8fd0..a9a9e72 100644 --- a/framework/h/attribute.go +++ b/framework/h/attribute.go @@ -2,9 +2,10 @@ package h import ( "fmt" + "strings" + "github.com/maddalax/htmgo/framework/hx" "github.com/maddalax/htmgo/framework/internal/datastructure" - "strings" ) type AttributeMap = map[string]any @@ -89,9 +90,7 @@ func Checked() Ren { } func Id(value string) Ren { - if strings.HasPrefix(value, "#") { - value = value[1:] - } + value = strings.TrimPrefix(value, "#") return Attribute("id", value) } @@ -193,6 +192,11 @@ func Class(value ...string) *AttributeR { return Attribute("class", MergeClasses(value...)) } +func ClassF(format string, args ...interface{}) *AttributeR { + atr := fmt.Sprintf(format, args...) + return Attribute("class", atr) +} + func ClassX(value string, m ClassMap) Ren { builder := strings.Builder{} builder.WriteString(value) diff --git a/framework/h/cache.go b/framework/h/cache.go index 92338cb..ad9260c 100644 --- a/framework/h/cache.go +++ b/framework/h/cache.go @@ -277,7 +277,7 @@ func (c *CachedNode) ClearExpired() { c.mutex.Lock() defer c.mutex.Unlock() deletedCount := 0 - if c.isByKey == true { + if c.isByKey { if c.byKeyCache != nil && c.byKeyExpiration != nil { for key := range c.byKeyCache { expir, ok := c.byKeyExpiration[key] @@ -303,7 +303,7 @@ func (c *CachedNode) ClearExpired() { } func (c *CachedNode) Render(ctx *RenderContext) { - if c.isByKey == true { + if c.isByKey { panic("CachedPerKey should not be rendered directly") } else { c.mutex.Lock() diff --git a/framework/h/tag.go b/framework/h/tag.go index 611fc55..5682e87 100644 --- a/framework/h/tag.go +++ b/framework/h/tag.go @@ -268,9 +268,7 @@ func TagF(tag string, format string, args ...interface{}) *Element { case *AttributeMapOrdered: children = append(children, d) case *ChildList: - for _, child := range d.Children { - children = append(children, child) - } + children = append(children, d.Children...) case *AttributeR: children = append(children, d) default: From 4eabe21d68415320c26be74a6657752d6818e565 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 22 Oct 2024 13:32:58 +0000 Subject: [PATCH 026/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index df7b8aa..215b93c 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d + github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 2212b7e..d8b91c8 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 2c085bc..dd26141 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index aa9fe9c..3593758 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 88d65ae..3cd7de6 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d + github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 6bd7561..8043a5d 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index d922eb1..8ed2e4b 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d + github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 9b68ca7..591d08e 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index ab6c752..11301a9 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index aa9fe9c..3593758 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 4c07d45..689d16c 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d + github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index c36cd27..ceb9988 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index cbe9de4..00f3185 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index aa9fe9c..3593758 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d h1:++qKuof1JEd+r2sbckUx63CsBcwbFNY7iD/2An53JWc= -github.com/maddalax/htmgo/framework v0.0.0-20241021150618-635b17dd7f9d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 30ac29fd6cf2a27b1105be15c8dfcaa727513ff0 Mon Sep 17 00:00:00 2001 From: Mohammad javad <41829984+himynamej@users.noreply.github.com> Date: Tue, 22 Oct 2024 09:49:17 -0400 Subject: [PATCH 027/137] use path (#32) * feat:add claasf * refactor(tag.go) * refactor(cache.go) * refactor(attribute.go) * refactor(app.go) * refactor(attribute.go) * fix:use path in PostPartialWithQs * fix: PostPartial --- framework/h/xhr.go | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/framework/h/xhr.go b/framework/h/xhr.go index 1c707e1..30eab6e 100644 --- a/framework/h/xhr.go +++ b/framework/h/xhr.go @@ -2,7 +2,6 @@ package h import ( "github.com/maddalax/htmgo/framework/hx" - "strings" ) func Get(path string, trigger ...string) *AttributeMapOrdered { @@ -22,18 +21,10 @@ func GetWithQs(path string, qs *Qs, trigger string) *AttributeMapOrdered { } func PostPartial(partial PartialFunc, triggers ...string) *AttributeMapOrdered { - path := GetPartialPath(partial) - if !strings.HasPrefix(path, "/") { - path = "/" + path - } - return Post(path, triggers...) + return Post(GetPartialPath(partial), triggers...) } func PostPartialWithQs(partial PartialFunc, qs *Qs, trigger ...string) *AttributeMapOrdered { - path := GetPartialPathWithQs(partial, qs) - if !strings.HasPrefix(path, "/") { - path = "/" + path - } return Post(GetPartialPathWithQs(partial, qs), trigger...) } From 146034c78b353cab096d265c1e167df9e593eeec Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 22 Oct 2024 13:49:54 +0000 Subject: [PATCH 028/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 215b93c..8d08078 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd + github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index d8b91c8..b30b84b 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index dd26141..d207b61 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 3593758..299ccbf 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 3cd7de6..0989891 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd + github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 8043a5d..eadeef9 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 8ed2e4b..aa5cbd4 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd + github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 591d08e..62ee5a4 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 11301a9..102a9b7 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 3593758..299ccbf 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 689d16c..3eeea58 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd + github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index ceb9988..f7943d1 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 00f3185..bf7a120 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd +require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 3593758..299ccbf 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd h1:Led/fiB06+xf/hW0cwaCFwSZMONrf9Rb61rpKlFt8N0= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022133217-a0f5b5dfd5bd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= +github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From bb9fb0b327e4e7adeba03f3518e0029b0d7bdcc4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 23 Oct 2024 09:28:19 -0500 Subject: [PATCH 029/137] write doctype when rendering html --- framework/h/app.go | 2 +- framework/h/render.go | 24 +++++++++++++++++++++++- framework/h/render_test.go | 8 ++++++++ 3 files changed, 32 insertions(+), 2 deletions(-) diff --git a/framework/h/app.go b/framework/h/app.go index 2362348..0e02236 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -247,7 +247,7 @@ func writeHtml(w http.ResponseWriter, element Ren) error { return nil } w.Header().Set("Content-Type", "text/html") - _, err := fmt.Fprint(w, Render(element)) + _, err := fmt.Fprint(w, Render(element, WithDocType())) return err } diff --git a/framework/h/render.go b/framework/h/render.go index aa37dd5..bfce751 100644 --- a/framework/h/render.go +++ b/framework/h/render.go @@ -8,11 +8,33 @@ type Ren interface { Render(context *RenderContext) } -func Render(node Ren) string { +type RenderOptions struct { + doctype bool +} + +type RenderOpt func(context *RenderContext, opt *RenderOptions) + +func WithDocType() RenderOpt { + return func(context *RenderContext, opt *RenderOptions) { + opt.doctype = true + } +} + +func Render(node Ren, opts ...RenderOpt) string { builder := &strings.Builder{} context := &RenderContext{ builder: builder, } + options := &RenderOptions{} + + for _, opt := range opts { + opt(context, options) + } + + if options.doctype { + builder.WriteString("") + } + node.Render(context) return builder.String() } diff --git a/framework/h/render_test.go b/framework/h/render_test.go index dbbd1e1..83a4cf4 100644 --- a/framework/h/render_test.go +++ b/framework/h/render_test.go @@ -10,6 +10,14 @@ import ( "time" ) +func TestRendererShouldRenderDocType(t *testing.T) { + t.Parallel() + result := Render(Html( + Div(), + ), WithDocType()) + assert.Equal(t, `
`, result) +} + func TestSimpleRender(t *testing.T) { t.Parallel() result := Render( From 31cf8772c2434a35a4f61bc03a7b3974b3cb799f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 23 Oct 2024 14:29:05 +0000 Subject: [PATCH 030/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 8d08078..fb97529 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index b30b84b..85c8bf3 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index d207b61..8e2f5a2 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 299ccbf..17509d9 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 0989891..d4a631b 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index eadeef9..4ca08ee 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index aa5cbd4..c4094bb 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 62ee5a4..843f16c 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 102a9b7..8c5aaa4 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 299ccbf..17509d9 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 3eeea58..69f883e 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index f7943d1..8692ede 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index bf7a120..fce93ef 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 299ccbf..17509d9 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2 h1:7/w/1bWtNEjM5NnNn3hqoj/kqYv9AJkvIkeu4HDLcWk= -github.com/maddalax/htmgo/framework v1.0.1-0.20241022134917-30ac29fd6cf2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 07b0c2d3c550d952d085c867fe2667109d0d24b9 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 23 Oct 2024 10:34:59 -0500 Subject: [PATCH 031/137] fix css on html to go --- htmgo-site/pages/html-to-go.go | 2 +- htmgo-site/partials/html-to-go.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/htmgo-site/pages/html-to-go.go b/htmgo-site/pages/html-to-go.go index 644d836..0a2d6f2 100644 --- a/htmgo-site/pages/html-to-go.go +++ b/htmgo-site/pages/html-to-go.go @@ -10,7 +10,7 @@ func HtmlToGoPage(ctx *h.RequestContext) *h.Page { return h.NewPage( base.PageWithNav(ctx, h.Div( - h.Class("flex flex-col h-full items-center justify-center w-full pt-6"), + h.Class("flex flex-col h-screen items-center justify-center w-full pt-6"), h.H3( h.Text("Convert raw html to htmgo code"), h.Class("text-2xl font-bold"), diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 3669db8..28d0634 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -17,7 +17,7 @@ func ConvertHtmlToGo(ctx *h.RequestContext) *h.Partial { func HtmlInput() *h.Element { return h.Div( - h.Class("h-[90%] w-1/2 min-w-1/2"), + h.Class("h-full w-1/2 min-w-1/2"), h.TextArea( h.Name("html-input"), h.MaxLength(500*1000), @@ -31,7 +31,7 @@ func HtmlInput() *h.Element { func GoOutput(content string) *h.Element { return h.Div( - h.Class("h-[90%] w-1/2 min-w-1/2"), + h.Class("h-full w-1/2 min-w-1/2"), h.Id("go-output"), h.Div( h.Class("h-[90%] w-full rounded border border-slate-200"), From a72de0a62fac4c8a7fb22c416fa80fa87f204847 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 23 Oct 2024 10:50:22 -0500 Subject: [PATCH 032/137] add qs tests --- framework/h/qs.go | 8 ++++--- framework/h/qs_test.go | 49 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 3 deletions(-) create mode 100644 framework/h/qs_test.go diff --git a/framework/h/qs.go b/framework/h/qs.go index 75fad83..996cf8e 100644 --- a/framework/h/qs.go +++ b/framework/h/qs.go @@ -14,7 +14,7 @@ func NewQs(pairs ...string) *Qs { m: make(map[string]string), } if len(pairs)%2 != 0 { - return q + pairs = append(pairs, "") } for i := 0; i < len(pairs); i++ { q.m[pairs[i]] = pairs[i+1] @@ -38,8 +38,10 @@ func (q *Qs) ToString() string { index := 0 for k, v := range q.m { builder.WriteString(k) - builder.WriteString("=") - builder.WriteString(v) + if v != "" { + builder.WriteString("=") + builder.WriteString(v) + } if index < len(q.m)-1 { builder.WriteString("&") } diff --git a/framework/h/qs_test.go b/framework/h/qs_test.go new file mode 100644 index 0000000..31067fd --- /dev/null +++ b/framework/h/qs_test.go @@ -0,0 +1,49 @@ +package h + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func assertHas(t *testing.T, qs *Qs, key string, value string) { + str := qs.ToString() + if value == "" { + assert.Contains(t, str, key) + assert.NotContains(t, str, key+"=") + } else { + assert.Contains(t, str, key+"="+value) + } +} + +func TestQs(t *testing.T) { + t.Parallel() + qs := NewQs("a", "b", "c") + assertHas(t, qs, "a", "b") + assertHas(t, qs, "c", "") + + qs2 := NewQs("a", "b", "c", "d") + assertHas(t, qs2, "a", "b") + assertHas(t, qs2, "c", "d") + + qs2.Add("e", "f") + assertHas(t, qs2, "a", "b") + assertHas(t, qs2, "c", "d") + assertHas(t, qs2, "e", "f") + + qs2.Remove("e") + assert.NotContains(t, qs2.ToString(), "e") +} + +func TestSetQsOnUrl(t *testing.T) { + t.Parallel() + qs := NewQs("a", "b", "c", "d") + set := SetQueryParams("https://example.com/path", qs) + assert.Equal(t, "https://example.com/path?a=b&c=d", set) +} + +func TestSetQsOnUrlWithDelete(t *testing.T) { + t.Parallel() + qs := NewQs("a", "b2", "c", "") + set := SetQueryParams("https://example.com/path?a=b&c=d", qs) + assert.Equal(t, "https://example.com/path?a=b2", set) +} From fa8f8431546361fa4c2b83d58ae2b386b81d6b5b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 23 Oct 2024 15:51:03 +0000 Subject: [PATCH 033/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index fb97529..978fcce 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 85c8bf3..112bd66 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 8e2f5a2..7b26246 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 17509d9..8648fe6 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index d4a631b..37bcd02 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 4ca08ee..9898f62 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index c4094bb..fb9cf07 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 843f16c..db73f68 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 8c5aaa4..9f9fb82 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 17509d9..8648fe6 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 69f883e..23a470f 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 + github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 8692ede..fef2383 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index fce93ef..c7612b7 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 17509d9..8648fe6 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4 h1:L2cTOXgAAEpB8htBqOZd9lYLvWSH7KzuIj5N/+n4uwA= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023142819-bb9fb0b327e4/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 21ac153d5b291bdb0431e63ee2960c2b5722c3f4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 23 Oct 2024 11:10:48 -0500 Subject: [PATCH 034/137] add transient to service loader, clear cache when setting a new value for the service --- framework/service/locator.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/framework/service/locator.go b/framework/service/locator.go index 855cae0..3cc79d4 100644 --- a/framework/service/locator.go +++ b/framework/service/locator.go @@ -10,6 +10,7 @@ type Lifecycle = string var ( Singleton Lifecycle = "singleton" + Transient Lifecycle = "transient" ) type Provider struct { @@ -35,6 +36,10 @@ func (l *Locator) setCache(key string, value any) { l.cache[key] = value } +func (l *Locator) clearCache(key string) { + delete(l.cache, key) +} + func (l *Locator) getCache(key string) any { return l.cache[key] } @@ -68,10 +73,12 @@ func Get[T any](locator *Locator) *T { func Set[T any](locator *Locator, lifecycle Lifecycle, value func() *T) { t := reflect.TypeOf(value) rt := t.Out(0) - locator.services[rt.String()] = Provider{ + key := rt.String() + locator.services[key] = Provider{ cb: func() any { return value() }, lifecycle: lifecycle, } + locator.clearCache(key) } From 64c61dd1786c8dfeace338565ff9780683fe1cde Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 23 Oct 2024 16:11:29 +0000 Subject: [PATCH 035/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 978fcce..d23f994 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac + github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 112bd66..37ce3ff 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 7b26246..beda866 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 8648fe6..b915392 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 37bcd02..6cb21fb 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac + github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 9898f62..f2a67f0 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index fb9cf07..cd8352f 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac + github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index db73f68..0d08b42 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 9f9fb82..4a68ef8 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 8648fe6..b915392 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 23a470f..622bd58 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac + github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index fef2383..b51cf27 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index c7612b7..224d9ab 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac +require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 8648fe6..b915392 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac h1:73wW69Ra2P+Vihv/eNprvVoE6hTE/MceGKWf/WVcHP4= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023155022-a72de0a62fac/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 4dd501a2f81e21a92605c048f29ae6a8bac3796c Mon Sep 17 00:00:00 2001 From: jam <41418470+Sardonyx001@users.noreply.github.com> Date: Thu, 24 Oct 2024 22:37:01 +0900 Subject: [PATCH 036/137] fix: filter by filename instead of whole path (#42) --- cli/htmgo/tasks/util/file.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/htmgo/tasks/util/file.go b/cli/htmgo/tasks/util/file.go index 3cb9f70..5ddd06c 100644 --- a/cli/htmgo/tasks/util/file.go +++ b/cli/htmgo/tasks/util/file.go @@ -19,7 +19,7 @@ func ReplaceTextInFile(file string, text string, replacement string) error { func ReplaceTextInDirRecursive(dir string, text string, replacement string, filter func(file string) bool) error { return filepath.WalkDir(dir, func(path string, d fs.DirEntry, err error) error { - if filter(path) { + if filter(filepath.Base(path)) { _ = ReplaceTextInFile(path, text, replacement) } return nil From 90fc6e87263e3ce7739f2c203db3dc34a5ac50bb Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 24 Oct 2024 08:39:19 -0500 Subject: [PATCH 037/137] check in go.work --- .gitignore | 3 +-- go.work | 14 ++++++++++++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 go.work diff --git a/.gitignore b/.gitignore index 5f752a3..9a4cf05 100644 --- a/.gitignore +++ b/.gitignore @@ -4,8 +4,7 @@ node_modules/ dist/ js/dist js/node_modules -go.work go.work.sum .idea !framework/assets/dist -/**/__htmgo \ No newline at end of file +/**/__htmgo diff --git a/go.work b/go.work new file mode 100644 index 0000000..0d27f48 --- /dev/null +++ b/go.work @@ -0,0 +1,14 @@ +go 1.23.0 + +use ( + cli/htmgo + examples/todo-list + framework + framework-ui + htmgo-site + templates/starter + examples/chat + examples/hackernews + tools/html-to-htmgo + examples/simple-auth +) From 7af750b9e78ebafcde3ac3819a64d35b3a69987f Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 24 Oct 2024 08:41:36 -0500 Subject: [PATCH 038/137] Revert "check in go.work" This reverts commit 90fc6e87263e3ce7739f2c203db3dc34a5ac50bb. --- .gitignore | 3 ++- go.work | 14 -------------- 2 files changed, 2 insertions(+), 15 deletions(-) delete mode 100644 go.work diff --git a/.gitignore b/.gitignore index 9a4cf05..5f752a3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,7 +4,8 @@ node_modules/ dist/ js/dist js/node_modules +go.work go.work.sum .idea !framework/assets/dist -/**/__htmgo +/**/__htmgo \ No newline at end of file diff --git a/go.work b/go.work deleted file mode 100644 index 0d27f48..0000000 --- a/go.work +++ /dev/null @@ -1,14 +0,0 @@ -go 1.23.0 - -use ( - cli/htmgo - examples/todo-list - framework - framework-ui - htmgo-site - templates/starter - examples/chat - examples/hackernews - tools/html-to-htmgo - examples/simple-auth -) From df490ae04ba0ae54c040e3579d184ca8e472b0c2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 24 Oct 2024 08:51:06 -0500 Subject: [PATCH 039/137] copy assets on run if needed --- cli/htmgo/runner.go | 3 +-- cli/htmgo/tasks/run/build.go | 6 +++++- cli/htmgo/tasks/run/setup.go | 9 +-------- 3 files changed, 7 insertions(+), 11 deletions(-) diff --git a/cli/htmgo/runner.go b/cli/htmgo/runner.go index ab27c44..2352d39 100644 --- a/cli/htmgo/runner.go +++ b/cli/htmgo/runner.go @@ -106,8 +106,7 @@ func main() { } else if taskName == "ast" { _ = astgen.GenAst(process.ExitOnError) } else if taskName == "run" { - _ = astgen.GenAst(process.ExitOnError) - _ = css.GenerateCss(process.ExitOnError) + run.MakeBuildable() _ = run.Server(process.ExitOnError) } else if taskName == "template" { name := "" diff --git a/cli/htmgo/tasks/run/build.go b/cli/htmgo/tasks/run/build.go index e468072..724e885 100644 --- a/cli/htmgo/tasks/run/build.go +++ b/cli/htmgo/tasks/run/build.go @@ -9,10 +9,14 @@ import ( "os" ) -func Build() { +func MakeBuildable() { copyassets.CopyAssets() astgen.GenAst(process.ExitOnError) css.GenerateCss(process.ExitOnError) +} + +func Build() { + MakeBuildable() process.RunOrExit(process.NewRawCommand("", "mkdir -p ./dist")) diff --git a/cli/htmgo/tasks/run/setup.go b/cli/htmgo/tasks/run/setup.go index d48d42d..0dd27d6 100644 --- a/cli/htmgo/tasks/run/setup.go +++ b/cli/htmgo/tasks/run/setup.go @@ -1,19 +1,12 @@ package run import ( - "github.com/maddalax/htmgo/cli/htmgo/tasks/astgen" - "github.com/maddalax/htmgo/cli/htmgo/tasks/copyassets" - "github.com/maddalax/htmgo/cli/htmgo/tasks/css" "github.com/maddalax/htmgo/cli/htmgo/tasks/process" ) func Setup() { process.RunOrExit(process.NewRawCommand("", "go mod download")) process.RunOrExit(process.NewRawCommand("", "go mod tidy")) - - copyassets.CopyAssets() - astgen.GenAst(process.ExitOnError) - css.GenerateCss(process.ExitOnError) - + MakeBuildable() EntGenerate() } From 531ad3342b56cc6a250db2bfd326520f4d048fcb Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:05:12 -0500 Subject: [PATCH 040/137] much better formatting for the generated go code --- .../adapters/services/formatter/formatter.go | 4 +- .../adapters/services/formatter/indent.go | 58 +++++++++++++++++++ 2 files changed, 60 insertions(+), 2 deletions(-) create mode 100644 tools/html-to-htmgo/internal/adapters/services/formatter/indent.go diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go index 295a0af..a33d98a 100644 --- a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go @@ -16,11 +16,11 @@ import ( func MyComponent() *h.Element { return ` + node.String() + ` }`) - dist, err := format.Source(b) + indented := Indent(string(b)) + dist, err := format.Source([]byte(indented)) if err != nil { return string(b) } - return string(dist) } diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go new file mode 100644 index 0000000..f6e9b13 --- /dev/null +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go @@ -0,0 +1,58 @@ +package formatter + +import ( + "bytes" + "fmt" + "go/ast" + "go/parser" + "go/printer" + "go/token" + "golang.org/x/tools/go/ast/astutil" + "strings" +) + +func Indent(input string) string { + fset := token.NewFileSet() + // Parse the code string into an AST + f, err := parser.ParseFile(fset, "", input, 0) + + if err != nil { + return input + } + + component := f.Decls[1].(*ast.FuncDecl) + + astutil.Apply(component.Body, nil, func(cursor *astutil.Cursor) bool { + switch n := cursor.Node().(type) { + case *ast.CallExpr: + newChildren := make([]ast.Expr, 0) + for i, arg := range n.Args { + if i == 0 { + switch arg.(type) { + // If the first argument is another node, add an indent + case *ast.CallExpr: + newChildren = append(newChildren, ast.NewIdent("INDENT")) + } + } + newChildren = append(newChildren, arg) + newChildren = append(newChildren, ast.NewIdent("INDENT")) + } + n.Args = newChildren + return true + } + return true + }) + + // Convert the AST node to a string + var buf bytes.Buffer + if err := printer.Fprint(&buf, fset, component); err != nil { + fmt.Println("Error printing AST:", err) + return input + } + + // Output the formatted code + indented := strings.ReplaceAll(buf.String(), "INDENT,", "\n\t\t") + indented = strings.ReplaceAll(indented, ", INDENT", ", \n\t\t") + + return indented +} From 61758622ef5db6659552af4e9578d6f9c7f59fff Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:07:35 -0500 Subject: [PATCH 041/137] indent -> indentme add details & summary html tag --- framework/h/tag.go | 8 ++++++++ .../internal/adapters/services/formatter/indent.go | 8 ++++---- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/framework/h/tag.go b/framework/h/tag.go index 5682e87..86d2d2a 100644 --- a/framework/h/tag.go +++ b/framework/h/tag.go @@ -38,6 +38,14 @@ func TextF(format string, args ...interface{}) *TextContent { return Text(fmt.Sprintf(format, args...)) } +func Details(children ...Ren) *Element { + return Tag("details", children...) +} + +func Summary(children ...Ren) *Element { + return Tag("summary", children...) +} + func Text(text string) *TextContent { return NewTextContent(text) } diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go index f6e9b13..fdffc5f 100644 --- a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go @@ -31,11 +31,11 @@ func Indent(input string) string { switch arg.(type) { // If the first argument is another node, add an indent case *ast.CallExpr: - newChildren = append(newChildren, ast.NewIdent("INDENT")) + newChildren = append(newChildren, ast.NewIdent("INDENTME")) } } newChildren = append(newChildren, arg) - newChildren = append(newChildren, ast.NewIdent("INDENT")) + newChildren = append(newChildren, ast.NewIdent("INDENTME")) } n.Args = newChildren return true @@ -51,8 +51,8 @@ func Indent(input string) string { } // Output the formatted code - indented := strings.ReplaceAll(buf.String(), "INDENT,", "\n\t\t") - indented = strings.ReplaceAll(indented, ", INDENT", ", \n\t\t") + indented := strings.ReplaceAll(buf.String(), "INDENTME,", "\n\t\t") + indented = strings.ReplaceAll(indented, ", INDENTME", ", \n\t\t") return indented } From e496a41a39dc3a2fbf5e8809cf0c2f6153fdfb5b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 12:08:14 +0000 Subject: [PATCH 042/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 4 ++-- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 21 insertions(+), 21 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index d23f994..fde9368 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 + github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 37ce3ff..7642b22 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index beda866..4c656b4 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index b915392..5f37ed5 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 6cb21fb..027aafe 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 + github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index f2a67f0..d75100d 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index cd8352f..d76e37d 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 + github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 0d08b42..fe3c2f3 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 4a68ef8..6113c92 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index b915392..5f37ed5 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 622bd58..83353b0 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 + github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index b51cf27..53d2a04 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,8 +19,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 224d9ab..4c9273e 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 +require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index b915392..5f37ed5 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX9V0Rr28ofWbE9ryDCApNE1xp8UATCVwPiYofHqc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= +github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 5a2b0f4f4bbfaf9b7b5b185c9344f0af19a0a4d1 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:14:37 -0500 Subject: [PATCH 043/137] upgrade --- htmgo-site/go.mod | 2 +- htmgo-site/go.sum | 2 ++ 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 622bd58..32aca9b 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -6,7 +6,7 @@ require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index b51cf27..b6a5efe 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -23,6 +23,8 @@ github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81 h1:fTXX github.com/maddalax/htmgo/framework v1.0.1-0.20241023161052-5d4efc76de81/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d h1:Hw4oQTJJvulOMkan5VfsG87ACvGkzVLReq2w2pV9T9U= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= From d538f6f7a8ef2c915c1d5374f0e0d6d6214b00a1 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:15:11 -0500 Subject: [PATCH 044/137] upgrade --- htmgo-site/go.mod | 3 ++- htmgo-site/go.sum | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index d3689f7..11f623c 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,6 +4,7 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 + github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d @@ -13,7 +14,7 @@ require ( require ( github.com/dlclark/regexp2 v1.11.0 // indirect - github.com/go-chi/chi/v5 v5.1.0 // indirect golang.org/x/net v0.30.0 // indirect golang.org/x/text v0.19.0 // indirect + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index e4bf70e..0a10b79 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -21,8 +21,6 @@ github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUq github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490 h1:D7jkugRnEtKACr4kQH6eSNxB8cKXgrhLm+5yeLsvscg= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241011161932-8b9e536f1490/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d h1:Hw4oQTJJvulOMkan5VfsG87ACvGkzVLReq2w2pV9T9U= github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= @@ -40,6 +38,8 @@ golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= From 1924270e4e6c55e8c512f997d8d8c6fda4434217 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:48:41 -0500 Subject: [PATCH 045/137] update more deps --- tools/html-to-htmgo/internal/domain/node.go | 3 -- tools/update-htmgo-dep.go | 42 ++++++++++++++------- 2 files changed, 28 insertions(+), 17 deletions(-) diff --git a/tools/html-to-htmgo/internal/domain/node.go b/tools/html-to-htmgo/internal/domain/node.go index a90e52e..1c1c079 100644 --- a/tools/html-to-htmgo/internal/domain/node.go +++ b/tools/html-to-htmgo/internal/domain/node.go @@ -30,9 +30,6 @@ func (n *CustomNode) SetType(in string) { n.Type = "h.TBody" case "id": n.Type = "h.Id" - case "path": - n.Type = "path" - n.customType = true case "circle": n.Type = "circle" n.customType = true diff --git a/tools/update-htmgo-dep.go b/tools/update-htmgo-dep.go index bd96b80..2737f0d 100644 --- a/tools/update-htmgo-dep.go +++ b/tools/update-htmgo-dep.go @@ -13,6 +13,13 @@ import ( ) const frameworkRepo = "github.com/maddalax/htmgo/framework" +const htmlToHtmgoRepo = "github.com/maddalax/htmgo/tools/html-to-htmgo" + +var depsToUpdate = []string{ + frameworkRepo, + htmlToHtmgoRepo, +} + const githubAPIURL = "https://api.github.com/repos/maddalax/htmgo/commits" // Commit represents the structure of a commit object returned by the GitHub API. @@ -52,17 +59,14 @@ func main() { // Check if the directory contains a go.mod file. if info.IsDir() && fileExists(filepath.Join(path, "go.mod")) { - // Check if the go.mod contains 'github.com/maddalax/htmgo/framework'. - if containsFrameworkDependency(filepath.Join(path, "go.mod")) { - wg.Add(1) - go func() { - defer wg.Done() - // Run go get github.com/maddalax/htmgo/framework@. - fmt.Printf("Running 'go get' with latest commit hash in %s\n", path) - RunCommand(path, "go", "get", fmt.Sprintf("%s@%s", frameworkRepo, latestCommitHash)) - RunCommand(path, "go", "mod", "tidy") - }() - } + goModPath := filepath.Join(path, "go.mod") + wg.Add(1) + go func() { + defer wg.Done() + for _, s := range depsToUpdate { + updateDepToLatestVersion(s, goModPath, latestCommitHash) + } + }() } return nil @@ -82,8 +86,18 @@ func fileExists(path string) bool { return !os.IsNotExist(err) } -// containsFrameworkDependency checks if 'github.com/maddalax/htmgo/framework' is in the go.mod file. -func containsFrameworkDependency(goModPath string) bool { +func updateDepToLatestVersion(dep string, goModPath string, latestCommitHash string) { + if containsDep(dep, goModPath) { + dir := filepath.Dir(goModPath) + // Run go get github.com/maddalax/htmgo/framework@. + fmt.Printf("Running 'go get' with latest commit hash in %s\n", dep) + RunCommand(dir, "go", "get", fmt.Sprintf("%s@%s", dep, latestCommitHash)) + RunCommand(dir, "go", "mod", "tidy") + } +} + +// containsDep checks if 'github.com/maddalax/htmgo/framework' is in the go.mod file. +func containsDep(dep string, goModPath string) bool { file, err := os.Open(goModPath) if err != nil { fmt.Println("Error opening go.mod file:", err) @@ -93,7 +107,7 @@ func containsFrameworkDependency(goModPath string) bool { scanner := bufio.NewScanner(file) for scanner.Scan() { - if strings.Contains(scanner.Text(), frameworkRepo) { + if strings.Contains(scanner.Text(), dep) { return true } } From 9a871883188645c6c4200c8b3bc3a5d3f9288efa Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 07:51:11 -0500 Subject: [PATCH 046/137] run if tool changes --- .github/workflows/update-framework-dep.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/update-framework-dep.yml b/.github/workflows/update-framework-dep.yml index 1f93441..a59ff30 100644 --- a/.github/workflows/update-framework-dep.yml +++ b/.github/workflows/update-framework-dep.yml @@ -6,7 +6,8 @@ on: branches: - master # Trigger on pushes to master paths: - - 'framework/**' # Trigger only if files in this directory change + - 'framework/**' + - 'tools/html-to-htmgo/**' jobs: update-htmgo-dep: From caa9d10b1bd9f786fc5e55e664ce4f91f643e68a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 12:52:22 +0000 Subject: [PATCH 047/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 6 +++--- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- tools/html-to-htmgo/go.mod | 1 + tools/html-to-htmgo/go.sum | 6 ++---- 16 files changed, 28 insertions(+), 29 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index fde9368..59f6677 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d + github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 7642b22..ac68226 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 4c656b4..a8007c2 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 5f37ed5..6ffee29 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 027aafe..e45ccdd 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d + github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index d75100d..c252016 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index d76e37d..8ed8f7f 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d + github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index fe3c2f3..8acc994 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 6113c92..415624c 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 5f37ed5..6ffee29 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 11f623c..141b1e9 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,16 +4,16 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 - github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d + github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) require ( github.com/dlclark/regexp2 v1.11.0 // indirect + github.com/go-chi/chi/v5 v5.1.0 // indirect golang.org/x/net v0.30.0 // indirect golang.org/x/text v0.19.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 0a10b79..8a0bfa6 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d h1:Hw4oQTJJvulOMkan5VfsG87ACvGkzVLReq2w2pV9T9U= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025120735-61758622ef5d/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886 h1:iQ/HmCUl+XBJ0UZQ6V6h9jJdavRFLSoPA74GEHG82vQ= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 4c9273e..c359fde 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 5f37ed5..6ffee29 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d h1:DLYdhEcgATLoQToKnyyANN/kRFWSnosZNzmw3BGU5Pc= -github.com/maddalax/htmgo/framework v1.0.1-0.20241025120735-61758622ef5d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/tools/html-to-htmgo/go.mod b/tools/html-to-htmgo/go.mod index 6320b14..e12e759 100644 --- a/tools/html-to-htmgo/go.mod +++ b/tools/html-to-htmgo/go.mod @@ -5,4 +5,5 @@ go 1.23.0 require ( golang.org/x/net v0.30.0 golang.org/x/text v0.19.0 + golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d ) diff --git a/tools/html-to-htmgo/go.sum b/tools/html-to-htmgo/go.sum index 613920c..2d1e0d6 100644 --- a/tools/html-to-htmgo/go.sum +++ b/tools/html-to-htmgo/go.sum @@ -1,8 +1,6 @@ -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= -golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224= -golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= From 3f8ab7d905cab145513324f0ddc5e11f75e3b681 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 08:12:11 -0500 Subject: [PATCH 048/137] add copy button --- htmgo-site/partials/html-to-go.go | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 28d0634..358f868 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -2,6 +2,7 @@ package partials import ( "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/js" "github.com/maddalax/htmgo/tools/html-to-htmgo/htmltogo" "htmgo-site/ui" ) @@ -34,8 +35,30 @@ func GoOutput(content string) *h.Element { h.Class("h-full w-1/2 min-w-1/2"), h.Id("go-output"), h.Div( - h.Class("h-[90%] w-full rounded border border-slate-200"), - h.UnsafeRaw(content), + h.Class("h-[90%] w-full rounded border border-slate-200 relative"), + h.Div( + h.Class("h-full"), + h.Id("go-output-content"), + h.UnsafeRaw(content), + ), + h.If(content != "", h.Div( + + h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), + h.Text("Copy"), + // language=JavaScript + h.OnClick(js.EvalJs(` + if(!navigator.clipboard) { + alert("Clipboard API not supported"); + return; + } + let text = self.parentElement.querySelector("#go-output-content").innerText; + navigator.clipboard.writeText(text); + self.innerText = "Copied!"; + setTimeout(() => { + self.innerText = "Copy"; + }, 1000); + `)), + )), ), ) } From 8736c00fd562595d50deccce7e48bbe624d5a1e1 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 10:33:48 -0500 Subject: [PATCH 049/137] htmgo - custom formatter (#47) * format htmgo elements on save * formatter updates * ensure we maintain comments --- cli/htmgo/runner.go | 27 ++- cli/htmgo/tasks/formatter/formatter.go | 50 ++++++ cli/htmgo/tasks/process/process.go | 2 +- examples/chat/chat/component.go | 15 +- examples/chat/components/error.go | 5 +- examples/chat/components/input.go | 50 ++++-- examples/chat/pages/chat.$id.go | 33 ++-- examples/chat/pages/index.go | 25 +-- examples/hackernews/partials/comments.go | 34 ++-- examples/hackernews/partials/sidebar.go | 21 ++- examples/simple-auth/pages/index.go | 10 +- examples/simple-auth/ui/error.go | 5 +- examples/simple-auth/ui/input.go | 50 ++++-- examples/simple-auth/ui/login.go | 5 +- examples/todo-list/pages/index.go | 9 +- examples/todo-list/partials/task/task.go | 167 ++++++++++++++---- htmgo-site/pages/base/root.go | 7 +- htmgo-site/pages/docs.go | 3 +- htmgo-site/pages/examples.go | 73 ++++---- htmgo-site/pages/form.go | 16 +- htmgo-site/pages/html-to-go.go | 3 +- htmgo-site/pages/index.go | 50 +++--- htmgo-site/pages/markdown.go | 5 +- htmgo-site/pages/test.go | 59 +++++++ htmgo-site/partials/form.go | 4 +- htmgo-site/partials/html-to-go.go | 39 ++-- htmgo-site/partials/navbar.go | 82 +++++---- htmgo-site/partials/sidebar.go | 5 +- templates/starter/pages/index.go | 6 +- templates/starter/pages/root.go | 4 +- templates/starter/partials/index.go | 3 +- tools/html-to-htmgo/htmltogo/indent.go | 139 +++++++++++++++ tools/html-to-htmgo/htmltogo/main.go | 2 +- .../adapters/services/formatter/formatter.go | 3 +- .../adapters/services/formatter/indent.go | 58 ------ 35 files changed, 763 insertions(+), 306 deletions(-) create mode 100644 cli/htmgo/tasks/formatter/formatter.go create mode 100644 htmgo-site/pages/test.go create mode 100644 tools/html-to-htmgo/htmltogo/indent.go delete mode 100644 tools/html-to-htmgo/internal/adapters/services/formatter/indent.go diff --git a/cli/htmgo/runner.go b/cli/htmgo/runner.go index 2352d39..0cfd586 100644 --- a/cli/htmgo/runner.go +++ b/cli/htmgo/runner.go @@ -9,6 +9,7 @@ import ( "github.com/maddalax/htmgo/cli/htmgo/tasks/copyassets" "github.com/maddalax/htmgo/cli/htmgo/tasks/css" "github.com/maddalax/htmgo/cli/htmgo/tasks/downloadtemplate" + "github.com/maddalax/htmgo/cli/htmgo/tasks/formatter" "github.com/maddalax/htmgo/cli/htmgo/tasks/process" "github.com/maddalax/htmgo/cli/htmgo/tasks/reloader" "github.com/maddalax/htmgo/cli/htmgo/tasks/run" @@ -19,10 +20,10 @@ import ( ) func main() { - done := RegisterSignals() + needsSignals := true commandMap := make(map[string]*flag.FlagSet) - commands := []string{"template", "run", "watch", "build", "setup", "css", "schema", "generate"} + commands := []string{"template", "run", "watch", "build", "setup", "css", "schema", "generate", "format"} for _, command := range commands { commandMap[command] = flag.NewFlagSet(command, flag.ExitOnError) @@ -56,6 +57,15 @@ func main() { slog.Debug("Running task:", slog.String("task", taskName)) slog.Debug("working dir:", slog.String("dir", process.GetWorkingDir())) + if taskName == "format" { + needsSignals = false + } + + done := make(chan bool, 1) + if needsSignals { + done = RegisterSignals() + } + if taskName == "watch" { fmt.Printf("Running in watch mode\n") os.Setenv("ENV", "development") @@ -90,7 +100,18 @@ func main() { }() startWatcher(reloader.OnFileChange) } else { - if taskName == "schema" { + if taskName == "format" { + if len(os.Args) < 3 { + fmt.Println(fmt.Sprintf("Usage: htmgo format ")) + os.Exit(1) + } + file := os.Args[2] + if file == "." { + formatter.FormatDir(process.GetWorkingDir()) + } else { + formatter.FormatFile(os.Args[2]) + } + } else if taskName == "schema" { reader := bufio.NewReader(os.Stdin) fmt.Print("Enter entity name:") text, _ := reader.ReadString('\n') diff --git a/cli/htmgo/tasks/formatter/formatter.go b/cli/htmgo/tasks/formatter/formatter.go new file mode 100644 index 0000000..61a3205 --- /dev/null +++ b/cli/htmgo/tasks/formatter/formatter.go @@ -0,0 +1,50 @@ +package formatter + +import ( + "fmt" + "github.com/maddalax/htmgo/tools/html-to-htmgo/htmltogo" + "os" + "path/filepath" + "strings" +) + +func FormatDir(dir string) { + files, err := os.ReadDir(dir) + if err != nil { + fmt.Printf("error reading dir: %s\n", err.Error()) + return + } + for _, file := range files { + if file.IsDir() { + FormatDir(filepath.Join(dir, file.Name())) + } else { + FormatFile(filepath.Join(dir, file.Name())) + } + } +} + +func FormatFile(file string) { + if !strings.HasSuffix(file, ".go") { + return + } + + fmt.Printf("formatting file: %s\n", file) + + source, err := os.ReadFile(file) + if err != nil { + fmt.Printf("error reading file: %s\n", err.Error()) + return + } + + str := string(source) + + if !strings.Contains(str, "github.com/maddalax/htmgo/framework/h") { + return + } + + parsed := htmltogo.Indent(str) + + os.WriteFile(file, []byte(parsed), 0644) + + return +} diff --git a/cli/htmgo/tasks/process/process.go b/cli/htmgo/tasks/process/process.go index a31cd19..f3c1c41 100644 --- a/cli/htmgo/tasks/process/process.go +++ b/cli/htmgo/tasks/process/process.go @@ -115,7 +115,7 @@ func OnShutdown() { } } // give it a second - time.Sleep(time.Second * 2) + time.Sleep(time.Second * 1) // force kill KillAll() } diff --git a/examples/chat/chat/component.go b/examples/chat/chat/component.go index f81adbf..0840fe3 100644 --- a/examples/chat/chat/component.go +++ b/examples/chat/chat/component.go @@ -11,18 +11,25 @@ import ( func MessageRow(message *Message) *h.Element { return h.Div( h.Attribute("hx-swap-oob", "beforeend"), - h.Class("flex flex-col gap-4 w-full break-words whitespace-normal"), // Ensure container breaks long words + h.Class("flex flex-col gap-4 w-full break-words whitespace-normal"), + // Ensure container breaks long words h.Id("messages"), h.Div( h.Class("flex flex-col gap-1"), h.Div( h.Class("flex gap-2 items-center"), - h.Pf(message.UserName, h.Class("font-bold")), + h.Pf( + message.UserName, + h.Class("font-bold"), + ), h.Pf(message.CreatedAt.In(time.Local).Format("01/02 03:04 PM")), ), h.Article( - h.Class("break-words whitespace-normal"), // Ensure message text wraps correctly - h.P(h.Text(message.Message)), + h.Class("break-words whitespace-normal"), + // Ensure message text wraps correctly + h.P( + h.Text(message.Message), + ), ), ), ) diff --git a/examples/chat/components/error.go b/examples/chat/components/error.go index a20ba0d..4b147dd 100644 --- a/examples/chat/components/error.go +++ b/examples/chat/components/error.go @@ -6,6 +6,9 @@ func FormError(error string) *h.Element { return h.Div( h.Id("form-error"), h.Text(error), - h.If(error != "", h.Class("p-4 bg-rose-400 text-white rounded")), + h.If( + error != "", + h.Class("p-4 bg-rose-400 text-white rounded"), + ), ) } diff --git a/examples/chat/components/input.go b/examples/chat/components/input.go index fec1363..0013d4e 100644 --- a/examples/chat/components/input.go +++ b/examples/chat/components/input.go @@ -19,11 +19,14 @@ type InputProps struct { } func Input(props InputProps) *h.Element { - validation := h.If(props.ValidationPath != "", h.Children( - h.Post(props.ValidationPath, hx.BlurEvent), - h.Attribute("hx-swap", "innerHTML transition:true"), - h.Attribute("hx-target", "next div"), - )) + validation := h.If( + props.ValidationPath != "", + h.Children( + h.Post(props.ValidationPath, hx.BlurEvent), + h.Attribute("hx-swap", "innerHTML transition:true"), + h.Attribute("hx-target", "next div"), + ), + ) if props.Type == "" { props.Type = "text" @@ -32,18 +35,41 @@ func Input(props InputProps) *h.Element { input := h.Input( props.Type, h.Class("border p-2 rounded focus:outline-none focus:ring focus:ring-slate-800"), - h.If(props.Name != "", h.Name(props.Name)), - h.If(props.Children != nil, h.Children(props.Children...)), - h.If(props.Required, h.Required()), - h.If(props.Placeholder != "", h.Placeholder(props.Placeholder)), - h.If(props.DefaultValue != "", h.Attribute("value", props.DefaultValue)), + h.If( + props.Name != "", + h.Name(props.Name), + ), + h.If( + props.Children != nil, + h.Children(props.Children...), + ), + h.If( + props.Required, + h.Required(), + ), + h.If( + props.Placeholder != "", + h.Placeholder(props.Placeholder), + ), + h.If( + props.DefaultValue != "", + h.Attribute("value", props.DefaultValue), + ), validation, ) wrapped := h.Div( - h.If(props.Id != "", h.Id(props.Id)), + h.If( + props.Id != "", + h.Id(props.Id), + ), h.Class("flex flex-col gap-1"), - h.If(props.Label != "", h.Label(h.Text(props.Label))), + h.If( + props.Label != "", + h.Label( + h.Text(props.Label), + ), + ), input, h.Div( h.Id(props.Id+"-error"), diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index 493a873..a06367a 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -17,13 +17,10 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { RootPage( h.Div( h.TriggerChildren(), - h.Attribute("sse-connect", fmt.Sprintf("/sse/chat/%s", roomId)), - h.HxOnSseOpen( js.ConsoleLog("Connected to chat room"), ), - h.HxOnSseError( js.EvalJs(fmt.Sprintf(` const reason = e.detail.event.data @@ -38,35 +35,27 @@ func ChatRoom(ctx *h.RequestContext) *h.Page { } `, roomId, roomId)), ), - // Adjusted flex properties for responsive layout h.Class("flex flex-row h-screen bg-neutral-100 overflow-x-hidden"), - // Collapse Button for mobile CollapseButton(), - // Sidebar for connected users UserSidebar(), - h.Div( // Adjusted to fill height and width h.Class("flex flex-col h-full w-full bg-white p-4 overflow-hidden"), - // Room name at the top, fixed CachedRoomHeader(ctx), - h.HxAfterSseMessage( js.EvalJsOnSibling("#messages", `element.scrollTop = element.scrollHeight;`), ), - // Chat Messages h.Div( h.Id("messages"), // Adjusted flex properties and removed max-width h.Class("flex flex-col gap-4 mb-4 overflow-auto flex-grow w-full pt-[50px]"), ), - // Chat Input at the bottom Form(), ), @@ -91,7 +80,10 @@ func roomNameHeader(ctx *h.RequestContext) *h.Element { } return h.Div( h.Class("bg-neutral-700 text-white p-3 shadow-sm w-full fixed top-0 left-0 flex justify-center z-10"), - h.H2F(room.Name, h.Class("text-lg font-bold")), + h.H2F( + room.Name, + h.Class("text-lg font-bold"), + ), h.Div( h.Class("absolute right-5 top-3 cursor-pointer"), h.Text("Share"), @@ -108,7 +100,10 @@ func UserSidebar() *h.Element { return h.Div( h.Class("sidebar h-full pt-[67px] min-w-48 w-48 bg-neutral-200 p-4 flex-col justify-between gap-3 rounded-l-lg hidden md:flex"), h.Div( - h.H3F("Connected Users", h.Class("text-lg font-bold")), + h.H3F( + "Connected Users", + h.Class("text-lg font-bold"), + ), chat.ConnectedUsers(make([]db.User, 0), ""), ), h.A( @@ -121,9 +116,11 @@ func UserSidebar() *h.Element { func CollapseButton() *h.Element { return h.Div( - h.Class("fixed top-0 left-4 md:hidden z-50"), // Always visible on mobile + h.Class("fixed top-0 left-4 md:hidden z-50"), + // Always visible on mobile h.Button( - h.Class("p-2 text-2xl bg-neutral-700 text-white rounded-md"), // Styling the button + h.Class("p-2 text-2xl bg-neutral-700 text-white rounded-md"), + // Styling the button h.OnClick( js.EvalJs(` const sidebar = document.querySelector('.sidebar'); @@ -131,13 +128,15 @@ func CollapseButton() *h.Element { sidebar.classList.toggle('flex'); `), ), - h.UnsafeRaw("☰"), // The icon for collapsing the sidebar + h.UnsafeRaw("☰"), + // The icon for collapsing the sidebar ), ) } func MessageInput() *h.Element { - return h.Input("text", + return h.Input( + "text", h.Id("message-input"), h.Required(), h.Class("p-4 rounded-md border border-slate-200 w-full focus:outline-none focus:ring focus:ring-slate-200"), diff --git a/examples/chat/pages/index.go b/examples/chat/pages/index.go index 571d5b5..229c7d9 100644 --- a/examples/chat/pages/index.go +++ b/examples/chat/pages/index.go @@ -13,12 +13,14 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { h.Class("flex flex-col items-center justify-center min-h-screen bg-neutral-100"), h.Div( h.Class("bg-white p-8 rounded-lg shadow-lg w-full max-w-md"), - h.H2F("htmgo chat", h.Class("text-3xl font-bold text-center mb-6")), + h.H2F( + "htmgo chat", + h.Class("text-3xl font-bold text-center mb-6"), + ), h.Form( h.Attribute("hx-swap", "none"), h.PostPartial(partials.CreateOrJoinRoom), h.Class("flex flex-col gap-6"), - // Username input at the top components.Input(components.InputProps{ Id: "username", @@ -30,11 +32,9 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { h.MaxLength(15), }, }), - // Single box for Create or Join a Chat Room h.Div( h.Class("p-4 border border-gray-300 rounded-md flex flex-col gap-6"), - // Create New Chat Room input components.Input(components.InputProps{ Name: "new-chat-room", @@ -45,15 +45,20 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { h.MaxLength(20), }, }), - // OR divider h.Div( h.Class("flex items-center justify-center gap-4"), - h.Div(h.Class("border-t border-gray-300 flex-grow")), - h.P(h.Text("OR"), h.Class("text-gray-500")), - h.Div(h.Class("border-t border-gray-300 flex-grow")), + h.Div( + h.Class("border-t border-gray-300 flex-grow"), + ), + h.P( + h.Text("OR"), + h.Class("text-gray-500"), + ), + h.Div( + h.Class("border-t border-gray-300 flex-grow"), + ), ), - // Join Chat Room input components.Input(components.InputProps{ Id: "join-chat-room", @@ -67,10 +72,8 @@ func ChatAppFirstScreen(ctx *h.RequestContext) *h.Page { }, }), ), - // Error message components.FormError(""), - // Submit button at the bottom components.PrimaryButton(components.ButtonProps{ Type: "submit", diff --git a/examples/hackernews/partials/comments.go b/examples/hackernews/partials/comments.go index c0583fe..95ce923 100644 --- a/examples/hackernews/partials/comments.go +++ b/examples/hackernews/partials/comments.go @@ -13,7 +13,12 @@ import ( func StoryComments(ctx *h.RequestContext) *h.Partial { return h.NewPartial( h.Fragment( - h.OobSwap(ctx, h.Div(h.Id("comments-loader"))), + h.OobSwap( + ctx, + h.Div( + h.Id("comments-loader"), + ), + ), h.Div( h.Class("flex flex-col gap-3 prose max-w-none"), CachedStoryComments(news.MustItemId(ctx)), @@ -57,9 +62,15 @@ func Comment(item news.Comment, nesting int) *h.Element { "border-b border-gray-200": nesting == 0, "border-l border-gray-200": nesting > 0, }), - h.If(nesting > 0, h.Attribute("style", fmt.Sprintf("margin-left: %dpx", (nesting-1)*15))), + h.If( + nesting > 0, + h.Attribute("style", fmt.Sprintf("margin-left: %dpx", (nesting-1)*15)), + ), h.Div( - h.If(nesting > 0, h.Class("pl-4")), + h.If( + nesting > 0, + h.Class("pl-4"), + ), h.Div( h.Class("flex gap-1 items-center"), h.Div( @@ -77,12 +88,15 @@ func Comment(item news.Comment, nesting int) *h.Element { h.UnsafeRaw(strings.TrimSpace(item.Text)), ), ), - h.If(len(children) > 0, h.List( - children, func(child news.Comment, index int) *h.Element { - return h.Div( - Comment(child, nesting+1), - ) - }, - )), + h.If( + len(children) > 0, + h.List( + children, func(child news.Comment, index int) *h.Element { + return h.Div( + Comment(child, nesting+1), + ) + }, + ), + ), ) } diff --git a/examples/hackernews/partials/sidebar.go b/examples/hackernews/partials/sidebar.go index c850d09..d3bbef0 100644 --- a/examples/hackernews/partials/sidebar.go +++ b/examples/hackernews/partials/sidebar.go @@ -57,13 +57,18 @@ func StorySidebar(ctx *h.RequestContext) *h.Partial { page := parse.MustParseInt(pageRaw, 0) - fetchMorePath := h.GetPartialPathWithQs(StorySidebar, h.NewQs("mode", "infinite", "page", fmt.Sprintf("%d", page+1), "category", category)) + fetchMorePath := h.GetPartialPathWithQs( + StorySidebar, + h.NewQs("mode", "infinite", "page", fmt.Sprintf("%d", page+1), "category", category), + ) list := CachedStoryList(category, page, 50, fetchMorePath) body := h.Aside( h.Id("story-sidebar"), - h.JoinExtensions(h.TriggerChildren()), + h.JoinExtensions( + h.TriggerChildren(), + ), h.Class("sticky top-0 h-screen p-1 bg-gray-100 overflow-y-auto max-w-80 min-w-80"), h.Div( h.Class("flex flex-col gap-1"), @@ -99,7 +104,9 @@ func SidebarTitle(defaultCategory string) *h.Element { h.Text("Hacker News"), ), h.Div( - h.OnLoad(h.EvalJs(ScrollJs)), + h.OnLoad( + h.EvalJs(ScrollJs), + ), h.Class("scroll-container mt-2 flex gap-1 no-scrollbar overflow-y-hidden whitespace-nowrap overflow-x-auto"), h.List(news.Categories, func(item news.Category, index int) *h.Element { return CategoryBadge(defaultCategory, item) @@ -114,7 +121,13 @@ func CategoryBadge(defaultCategory string, category news.Category) *h.Element { category.Name, selected, h.Attribute("hx-swap", "none"), - h.If(!selected, h.PostPartialOnClickQs(StorySidebar, h.NewQs("category", category.Path))), + h.If( + !selected, + h.PostPartialOnClickQs( + StorySidebar, + h.NewQs("category", category.Path), + ), + ), ) } diff --git a/examples/simple-auth/pages/index.go b/examples/simple-auth/pages/index.go index 364f0f3..f159adc 100644 --- a/examples/simple-auth/pages/index.go +++ b/examples/simple-auth/pages/index.go @@ -24,14 +24,16 @@ func UserProfilePage(u db.User) *h.Element { return h.Div( h.Class("flex flex-col gap-6 items-center pt-10 min-h-screen bg-neutral-100"), - h.H3F("User Profile", h.Class("text-2xl font-bold")), + h.H3F( + "User Profile", + h.Class("text-2xl font-bold"), + ), h.Pf("Welcome, %s!", u.Email), h.Form( h.Attribute("hx-swap", "none"), h.PostPartial(partials.UpdateProfile), h.TriggerChildren(), h.Class("flex flex-col gap-4 w-full max-w-md p-6 bg-white rounded-md shadow-md"), - ui.Input(ui.InputProps{ Id: "email", Name: "email", @@ -42,26 +44,22 @@ func UserProfilePage(u db.User) *h.Element { h.Disabled(), }, }), - ui.Input(ui.InputProps{ Name: "birth-date", Label: "Birth Date", DefaultValue: user.GetMetaKey(meta, "birthDate"), Type: "date", }), - ui.Input(ui.InputProps{ Name: "favorite-color", Label: "Favorite Color", DefaultValue: user.GetMetaKey(meta, "favoriteColor"), }), - ui.Input(ui.InputProps{ Name: "occupation", Label: "Occupation", DefaultValue: user.GetMetaKey(meta, "occupation"), }), - ui.FormError(""), ui.SubmitButton("Save Changes"), ), diff --git a/examples/simple-auth/ui/error.go b/examples/simple-auth/ui/error.go index a410e13..47d1eac 100644 --- a/examples/simple-auth/ui/error.go +++ b/examples/simple-auth/ui/error.go @@ -6,7 +6,10 @@ func FormError(error string) *h.Element { return h.Div( h.Id("form-error"), h.Text(error), - h.If(error != "", h.Class("p-4 bg-rose-400 text-white rounded")), + h.If( + error != "", + h.Class("p-4 bg-rose-400 text-white rounded"), + ), ) } diff --git a/examples/simple-auth/ui/input.go b/examples/simple-auth/ui/input.go index f465766..6e302fb 100644 --- a/examples/simple-auth/ui/input.go +++ b/examples/simple-auth/ui/input.go @@ -19,11 +19,14 @@ type InputProps struct { } func Input(props InputProps) *h.Element { - validation := h.If(props.ValidationPath != "", h.Children( - h.Post(props.ValidationPath, hx.BlurEvent), - h.Attribute("hx-swap", "innerHTML transition:true"), - h.Attribute("hx-target", "next div"), - )) + validation := h.If( + props.ValidationPath != "", + h.Children( + h.Post(props.ValidationPath, hx.BlurEvent), + h.Attribute("hx-swap", "innerHTML transition:true"), + h.Attribute("hx-target", "next div"), + ), + ) if props.Type == "" { props.Type = "text" @@ -32,18 +35,41 @@ func Input(props InputProps) *h.Element { input := h.Input( props.Type, h.Class("border p-2 rounded focus:outline-none focus:ring focus:ring-slate-800"), - h.If(props.Name != "", h.Name(props.Name)), - h.If(props.Children != nil, h.Children(props.Children...)), - h.If(props.Required, h.Required()), - h.If(props.Placeholder != "", h.Placeholder(props.Placeholder)), - h.If(props.DefaultValue != "", h.Attribute("value", props.DefaultValue)), + h.If( + props.Name != "", + h.Name(props.Name), + ), + h.If( + props.Children != nil, + h.Children(props.Children...), + ), + h.If( + props.Required, + h.Required(), + ), + h.If( + props.Placeholder != "", + h.Placeholder(props.Placeholder), + ), + h.If( + props.DefaultValue != "", + h.Attribute("value", props.DefaultValue), + ), validation, ) wrapped := h.Div( - h.If(props.Id != "", h.Id(props.Id)), + h.If( + props.Id != "", + h.Id(props.Id), + ), h.Class("flex flex-col gap-1"), - h.If(props.Label != "", h.Label(h.Text(props.Label))), + h.If( + props.Label != "", + h.Label( + h.Text(props.Label), + ), + ), input, h.Div( h.Id(props.Id+"-error"), diff --git a/examples/simple-auth/ui/login.go b/examples/simple-auth/ui/login.go index 93a2d97..50cf046 100644 --- a/examples/simple-auth/ui/login.go +++ b/examples/simple-auth/ui/login.go @@ -16,7 +16,10 @@ func CenteredForm(props CenteredFormProps) *h.Element { h.Class("flex flex-col items-center justify-center min-h-screen bg-neutral-100"), h.Div( h.Class("bg-white p-8 rounded-lg shadow-lg w-full max-w-md"), - h.H2F(props.Title, h.Class("text-3xl font-bold text-center mb-6")), + h.H2F( + props.Title, + h.Class("text-3xl font-bold text-center mb-6"), + ), h.Form( h.TriggerChildren(), h.Post(props.PostUrl), diff --git a/examples/todo-list/pages/index.go b/examples/todo-list/pages/index.go index 65b5cac..2cc736d 100644 --- a/examples/todo-list/pages/index.go +++ b/examples/todo-list/pages/index.go @@ -10,7 +10,10 @@ import ( func TaskListPage(ctx *h.RequestContext) *h.Page { title := h.Div( - h.H1(h.Class("text-7xl font-extralight text-rose-500 tracking-wide"), h.Text("todos")), + h.H1( + h.Class("text-7xl font-extralight text-rose-500 tracking-wide"), + h.Text("todos"), + ), ) return h.NewPage(base.RootPage( @@ -21,7 +24,9 @@ func TaskListPage(ctx *h.RequestContext) *h.Page { title, task.Card(ctx), h.Children( - h.Div(h.Text("Double-click to edit a todo")), + h.Div( + h.Text("Double-click to edit a todo"), + ), ), ), ), diff --git a/examples/todo-list/partials/task/task.go b/examples/todo-list/partials/task/task.go index 29498ab..f307a57 100644 --- a/examples/todo-list/partials/task/task.go +++ b/examples/todo-list/partials/task/task.go @@ -58,7 +58,9 @@ func Input(list []*ent.Task) *h.Element { h.Name("name"), h.Class("pl-12 text-xl p-4 w-full outline-none focus:outline-2 focus:outline-rose-400"), h.Placeholder("What needs to be done?"), - h.Post(h.GetPartialPath(Create)), + h.Post( + h.GetPartialPath(Create), + ), h.HxTrigger(hx.OnEvent(hx.TriggerKeyUpEnter)), ), CompleteAllIcon(list), @@ -66,23 +68,34 @@ func Input(list []*ent.Task) *h.Element { } func CompleteAllIcon(list []*ent.Task) *h.Element { - notCompletedCount := len(h.Filter(list, func(item *ent.Task) bool { - return item.CompletedAt == nil - })) + notCompletedCount := len( + h.Filter(list, func(item *ent.Task) bool { + return item.CompletedAt == nil + }), + ) return h.Div( h.ClassX("absolute top-1 left-5 p-2 rotate-90 text-3xl cursor-pointer", map[string]bool{ "text-slate-400": notCompletedCount > 0, - }), h.UnsafeRaw("›"), - h.PostPartialWithQs(CompleteAll, h.NewQs("complete", h.Ternary(notCompletedCount > 0, "true", "false"))), + }), + h.UnsafeRaw("›"), + h.PostPartialWithQs( + CompleteAll, + h.NewQs( + "complete", + h.Ternary(notCompletedCount > 0, "true", "false"), + ), + ), ) } func Footer(list []*ent.Task, activeTab Tab) *h.Element { - notCompletedCount := len(h.Filter(list, func(item *ent.Task) bool { - return item.CompletedAt == nil - })) + notCompletedCount := len( + h.Filter(list, func(item *ent.Task) bool { + return item.CompletedAt == nil + }), + ) tabs := []Tab{TabAll, TabActive, TabComplete} @@ -96,7 +109,12 @@ func Footer(list []*ent.Task, activeTab Tab) *h.Element { h.Class("flex items-center gap-4"), h.List(tabs, func(tab Tab, index int) *h.Element { return h.P( - h.PostOnClick(h.GetPartialPathWithQs(ChangeTab, h.NewQs("tab", tab))), + h.PostOnClick( + h.GetPartialPathWithQs( + ChangeTab, + h.NewQs("tab", tab), + ), + ), h.ClassX("cursor-pointer px-2 py-1 rounded", map[string]bool{ "border border-rose-600": activeTab == tab, }), @@ -139,12 +157,14 @@ func Task(task *ent.Task, editing bool) *h.Element { "border border-b-slate-100": !editing, }), CompleteIcon(task), - h.IfElse(editing, + h.IfElse( + editing, h.Div( h.Class("flex-1 h-full"), h.Form( h.Class("h-full"), - h.Input("text", + h.Input( + "text", h.Name("task"), h.Value(task.ID.String()), h.Class("hidden"), @@ -168,30 +188,43 @@ func Task(task *ent.Task, editing bool) *h.Element { ), ), h.P( - h.GetPartialWithQs(EditNameForm, h.NewQs("id", task.ID.String()), hx.TriggerDblClick), + h.GetPartialWithQs( + EditNameForm, + h.NewQs("id", task.ID.String()), + hx.TriggerDblClick, + ), h.ClassX("text-xl break-all text-wrap truncate", map[string]bool{ "line-through text-slate-400": task.CompletedAt != nil, }), h.Text(task.Name), - )), + ), + ), ) } func CompleteIcon(task *ent.Task) *h.Element { return h.Div( h.HxTrigger(hx.OnClick()), - h.Post(h.GetPartialPathWithQs(ToggleCompleted, h.NewQs("id", task.ID.String()))), + h.Post( + h.GetPartialPathWithQs( + ToggleCompleted, + h.NewQs("id", task.ID.String()), + ), + ), h.Class("flex items-center justify-center cursor-pointer"), h.Div( h.ClassX("w-10 h-10 border rounded-full flex items-center justify-center", map[string]bool{ "border-green-500": task.CompletedAt != nil, "border-slate-400": task.CompletedAt == nil, }), - h.If(task.CompletedAt != nil, h.UnsafeRaw(` + h.If( + task.CompletedAt != nil, + h.UnsafeRaw(` - `)), + `), + ), ), ) } @@ -199,46 +232,75 @@ func CompleteIcon(task *ent.Task) *h.Element { func UpdateName(ctx *h.RequestContext) *h.Partial { id, err := uuid.Parse(ctx.FormValue("task")) if err != nil { - return h.NewPartial(h.Div(h.Text("invalid id"))) + return h.NewPartial( + h.Div( + h.Text("invalid id"), + ), + ) } name := ctx.FormValue("name") if name == "" { - return h.NewPartial(h.Div(h.Text("name is required"))) + return h.NewPartial( + h.Div( + h.Text("name is required"), + ), + ) } if len(name) > 150 { - return h.NewPartial(h.Div(h.Text("task must be less than 150 characters"))) + return h.NewPartial( + h.Div( + h.Text("task must be less than 150 characters"), + ), + ) } service := tasks.NewService(ctx) task, err := service.Get(id) if task == nil { - return h.NewPartial(h.Div(h.Text("task not found"))) + return h.NewPartial( + h.Div( + h.Text("task not found"), + ), + ) } task, err = service.SetName(task.ID, name) if err != nil { - return h.NewPartial(h.Div(h.Text("failed to update"))) + return h.NewPartial( + h.Div( + h.Text("failed to update"), + ), + ) } return h.NewPartial( - h.OobSwap(ctx, Task(task, false))) + h.OobSwap(ctx, Task(task, false)), + ) } func EditNameForm(ctx *h.RequestContext) *h.Partial { id, err := uuid.Parse(ctx.QueryParam("id")) if err != nil { - return h.NewPartial(h.Div(h.Text("invalid id"))) + return h.NewPartial( + h.Div( + h.Text("invalid id"), + ), + ) } service := tasks.NewService(ctx) task, err := service.Get(id) if task == nil { - return h.NewPartial(h.Div(h.Text("task not found"))) + return h.NewPartial( + h.Div( + h.Text("task not found"), + ), + ) } return h.NewPartial( @@ -249,21 +311,36 @@ func EditNameForm(ctx *h.RequestContext) *h.Partial { func ToggleCompleted(ctx *h.RequestContext) *h.Partial { id, err := uuid.Parse(ctx.QueryParam("id")) if err != nil { - return h.NewPartial(h.Div(h.Text("invalid id"))) + return h.NewPartial( + h.Div( + h.Text("invalid id"), + ), + ) } service := tasks.NewService(ctx) task, err := service.Get(id) if task == nil { - return h.NewPartial(h.Div(h.Text("task not found"))) + return h.NewPartial( + h.Div( + h.Text("task not found"), + ), + ) } - task, err = service.SetCompleted(task.ID, h. - Ternary(task.CompletedAt == nil, true, false)) + task, err = service.SetCompleted( + task.ID, + h. + Ternary(task.CompletedAt == nil, true, false), + ) if err != nil { - return h.NewPartial(h.Div(h.Text("failed to update"))) + return h.NewPartial( + h.Div( + h.Text("failed to update"), + ), + ) } list, _ := service.List() @@ -282,7 +359,9 @@ func CompleteAll(ctx *h.RequestContext) *h.Partial { list, _ := service.List() - return h.NewPartial(h.OobSwap(ctx, CardBody(list, getActiveTab(ctx)))) + return h.NewPartial( + h.OobSwap(ctx, CardBody(list, getActiveTab(ctx))), + ) } func ClearCompleted(ctx *h.RequestContext) *h.Partial { @@ -291,7 +370,9 @@ func ClearCompleted(ctx *h.RequestContext) *h.Partial { list, _ := service.List() - return h.NewPartial(h.OobSwap(ctx, CardBody(list, getActiveTab(ctx)))) + return h.NewPartial( + h.OobSwap(ctx, CardBody(list, getActiveTab(ctx))), + ) } func Create(ctx *h.RequestContext) *h.Partial { @@ -300,7 +381,9 @@ func Create(ctx *h.RequestContext) *h.Partial { if len(name) > 150 { return h.NewPartial( h.Div( - h.HxOnLoad(js.Alert("Task must be less than 150 characters")), + h.HxOnLoad( + js.Alert("Task must be less than 150 characters"), + ), ), ) } @@ -312,7 +395,9 @@ func Create(ctx *h.RequestContext) *h.Partial { if list != nil && len(list) >= 100 { return h.NewPartial( h.Div( - h.HxOnLoad(js.Alert("There are too many tasks, please complete and clear some.")), + h.HxOnLoad( + js.Alert("There are too many tasks, please complete and clear some."), + ), ), ) } @@ -322,7 +407,11 @@ func Create(ctx *h.RequestContext) *h.Partial { }) if err != nil { - return h.NewPartial(h.Div(h.Text("failed to create"))) + return h.NewPartial( + h.Div( + h.Text("failed to create"), + ), + ) } list, err = service.List() @@ -338,8 +427,12 @@ func ChangeTab(ctx *h.RequestContext) *h.Partial { tab := ctx.QueryParam("tab") - return h.SwapManyPartialWithHeaders(ctx, - h.PushQsHeader(ctx, h.NewQs("tab", tab)), + return h.SwapManyPartialWithHeaders( + ctx, + h.PushQsHeader( + ctx, + h.NewQs("tab", tab), + ), List(list, tab), Footer(list, tab), ) diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index 4b0e185..0fd37e4 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -13,7 +13,9 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { description := "build simple and scalable systems with go + htmx" return h.Html( - h.HxExtension(h.BaseExtensions()), + h.HxExtension( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Meta("title", title), @@ -54,7 +56,8 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { } func PageWithNav(ctx *h.RequestContext, children ...h.Ren) *h.Element { - return RootPage(ctx, + return RootPage( + ctx, h.Fragment( partials.NavBar(ctx, partials.NavBarProps{ Expanded: false, diff --git a/htmgo-site/pages/docs.go b/htmgo-site/pages/docs.go index f85e689..c8a3572 100644 --- a/htmgo-site/pages/docs.go +++ b/htmgo-site/pages/docs.go @@ -43,7 +43,8 @@ func DocsPage(ctx *h.RequestContext) *h.Page { MarkdownContent(ctx, page.FilePath, anchor), h.Div( h.Class("ml-4 pl-1 mt-2 bg-rose-200"), - h.If(anchor == "core-concepts-partials", + h.If( + anchor == "core-concepts-partials", h.GetPartial(partials.CurrentTimePartial, "load, every 1s"), ), ), diff --git a/htmgo-site/pages/examples.go b/htmgo-site/pages/examples.go index 719a87a..ceefac9 100644 --- a/htmgo-site/pages/examples.go +++ b/htmgo-site/pages/examples.go @@ -57,31 +57,34 @@ var examples = []Example{ func ExamplesPage(ctx *h.RequestContext) *h.Page { return h.NewPage( - base.PageWithNav(ctx, h.Div( - h.Class("flex items-center justify-center"), + base.PageWithNav( + ctx, h.Div( - h.Class("w-full px-4 flex flex-col prose max-w-[95vw] md:max-w-3xl mt-6"), + h.Class("flex items-center justify-center"), h.Div( - h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), + h.Class("w-full px-4 flex flex-col prose max-w-[95vw] md:max-w-3xl mt-6"), h.Div( - h.H1( - h.Class("text-center md:text-left"), - h.Text("htmgo examples"), + h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), + h.Div( + h.H1( + h.Class("text-center md:text-left"), + h.Text("htmgo examples"), + ), + h.H3( + h.Class("-mt-4"), + h.TextF("example projects built with htmgo"), + ), ), - h.H3( - h.Class("-mt-4"), - h.TextF("example projects built with htmgo"), + ), + h.Div( + h.Class("border-b border-b-slate-200 h-1"), + h.Div( + h.Class("mt-4"), + ExampleCards(), ), ), ), - h.Div( - h.Class("border-b border-b-slate-200 h-1"), - h.Div( - h.Class("mt-4"), - ExampleCards(), - ), - ), - )), + ), ), ) } @@ -91,26 +94,32 @@ func ExampleCards() *h.Element { h.Class("prose-h2:my-1 prose-img:my-1 grid grid-cols-1 gap-6 text-center pb-8"), h.List(examples, func(example Example, index int) *h.Element { return h.Div( - h.Class("border border-gray-200 shadow-sm rounded-md px-4 pb-4 bg-neutral-100"), // Removed specific width, handled by grid + h.Class("border border-gray-200 shadow-sm rounded-md px-4 pb-4 bg-neutral-100"), h.Div( h.Class("flex flex-col gap-1 mt-4"), h.H2( - h.Class("text-lg text-center mb-1"), // Reduced margin at the bottom of the title + h.Class("text-lg text-center mb-1"), h.Text(example.Title), ), - h.If(example.Image != "", h.Div( - h.A( - h.Href(example.Demo), - h.Class("not-prose"), - h.Img( - h.Src(example.Image), - h.Class("w-[75%] rounded-md mx-auto"), + h.If( + example.Image != "", + h.Div( + h.A( + h.Href(example.Demo), + h.Class("not-prose"), + h.Img( + h.Src(example.Image), + h.Class("w-[75%] rounded-md mx-auto"), + ), ), - ), // Ensures image is centered within the card - )), - h.If(example.Description != "", h.Div( - h.Pf(example.Description), - )), + ), + ), + h.If( + example.Description != "", + h.Div( + h.Pf(example.Description), + ), + ), h.Div( h.Div( h.Class("flex gap-2 justify-center mt-2"), diff --git a/htmgo-site/pages/form.go b/htmgo-site/pages/form.go index 9415075..fdd9d24 100644 --- a/htmgo-site/pages/form.go +++ b/htmgo-site/pages/form.go @@ -9,21 +9,29 @@ import ( ) func Form(ctx *h.RequestContext) *h.Page { - return h.NewPage(base.RootPage(ctx, + return h.NewPage(base.RootPage( + ctx, h.Div( h.Class("flex flex-col items-center justify-center p-4 gap-6"), - h.H2F("Form submission with loading state example", h.Class("text-2xl font-bold")), + h.H2F( + "Form submission with loading state example", + h.Class("text-2xl font-bold"), + ), h.Form( h.TriggerChildren(), h.PostPartial(partials.SubmitForm), h.Class("flex flex-col gap-2"), h.LabelFor("name", "Your Name"), - h.Input("text", + h.Input( + "text", h.Required(), h.Class("p-4 rounded-md border border-slate-200"), h.Name("name"), h.Placeholder("Name"), - h.OnEvent(hx.KeyDownEvent, js.SubmitFormOnEnter()), + h.OnEvent( + hx.KeyDownEvent, + js.SubmitFormOnEnter(), + ), ), SubmitButton(), ), diff --git a/htmgo-site/pages/html-to-go.go b/htmgo-site/pages/html-to-go.go index 0a2d6f2..face609 100644 --- a/htmgo-site/pages/html-to-go.go +++ b/htmgo-site/pages/html-to-go.go @@ -8,7 +8,8 @@ import ( func HtmlToGoPage(ctx *h.RequestContext) *h.Page { return h.NewPage( - base.PageWithNav(ctx, + base.PageWithNav( + ctx, h.Div( h.Class("flex flex-col h-screen items-center justify-center w-full pt-6"), h.H3( diff --git a/htmgo-site/pages/index.go b/htmgo-site/pages/index.go index 8470795..1b08002 100644 --- a/htmgo-site/pages/index.go +++ b/htmgo-site/pages/index.go @@ -7,37 +7,43 @@ import ( func IndexPage(ctx *h.RequestContext) *h.Page { return h.NewPage( - base.PageWithNav(ctx, h.Div( - h.Class("flex items-center justify-center"), + base.PageWithNav( + ctx, h.Div( - h.Class("w-full px-4 flex flex-col prose md:max-w-3xl mt-6 mx-auto"), + h.Class("flex items-center justify-center"), h.Div( - h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), + h.Class("w-full px-4 flex flex-col prose md:max-w-3xl mt-6 mx-auto"), h.Div( - h.H1F("htmgo", h.Class("text-center md:text-left")), - h.H3F( - "build simple and scalable systems with %s", - "go + htmx", - h.Class("-mt-4"), + h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), + h.Div( + h.H1F( + "htmgo", + h.Class("text-center md:text-left"), + ), + h.H3F( + "build simple and scalable systems with %s", + "go + htmx", + h.Class("-mt-4"), + ), + ), + h.Div( + h.Class("mt-2"), + h.A( + h.Href("/docs"), + h.Class("not-prose p-3 bg-slate-900 text-white rounded-md"), + h.Text("Get Started"), + ), ), ), h.Div( - h.Class("mt-2"), - h.A( - h.Href("/docs"), - h.Class("not-prose p-3 bg-slate-900 text-white rounded-md"), - h.Text("Get Started"), + h.Class("border-b border-b-slate-200 h-1"), + h.Div( + h.Class("mt-4"), + MarkdownPage(ctx, "md/index.md", ""), ), ), ), - h.Div( - h.Class("border-b border-b-slate-200 h-1"), - h.Div( - h.Class("mt-4"), - MarkdownPage(ctx, "md/index.md", ""), - ), - ), - )), + ), ), ) } diff --git a/htmgo-site/pages/markdown.go b/htmgo-site/pages/markdown.go index 6bdc933..eff2c6a 100644 --- a/htmgo-site/pages/markdown.go +++ b/htmgo-site/pages/markdown.go @@ -20,7 +20,10 @@ func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { embeddedMd := ctx.Get("embeddedMarkdown").(fs.FS) renderer := service.Get[markdown.Renderer](ctx.ServiceLocator()) return h.Div( - h.If(id != "", h.Id(id)), + h.If( + id != "", + h.Id(id), + ), h.Div( h.Class("w-full flex flex-col prose max-w-md md:max-w-xl lg:max-w-3xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), h.UnsafeRaw(renderer.RenderFile(path, embeddedMd)), diff --git a/htmgo-site/pages/test.go b/htmgo-site/pages/test.go new file mode 100644 index 0000000..e868461 --- /dev/null +++ b/htmgo-site/pages/test.go @@ -0,0 +1,59 @@ +package pages + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/pages/base" +) + +func TestFormatPage(ctx *h.RequestContext) *h.Page { + return h.NewPage( + base.RootPage( + ctx, + h.Div( + h.P( + h.Class("hello"), + h.Details( + h.Summary( + h.Text("Summary"), + ), + h.Text("Details"), + ), + h.Id("hi"), + ), + ), + ), + ) +} + +func notPage() int { + test := 1 + fmt.Printf("test: %d\n", test) + return test +} + +func TestOtherPage(ctx *h.RequestContext) *h.Page { + + return h.NewPage( + base.RootPage( + ctx, + h.Div( + h.Id("test"), + h.Details( + h.Summary( + h.Text("Summary"), + ), + h.Text("Details"), + ), + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Id("test"), + h.Details( + h.Summary( + h.Text("Summary"), + ), + h.Text("Details"), + ), + ), + ), + ) +} diff --git a/htmgo-site/partials/form.go b/htmgo-site/partials/form.go index 4934822..8ef0b75 100644 --- a/htmgo-site/partials/form.go +++ b/htmgo-site/partials/form.go @@ -8,6 +8,8 @@ import ( func SubmitForm(ctx *h.RequestContext) *h.Partial { time.Sleep(time.Second * 3) return h.NewPartial( - h.Div(h.Text("Form submitted")), + h.Div( + h.Text("Form submitted"), + ), ) } diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 358f868..00945e5 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -41,24 +41,27 @@ func GoOutput(content string) *h.Element { h.Id("go-output-content"), h.UnsafeRaw(content), ), - h.If(content != "", h.Div( - - h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), - h.Text("Copy"), - // language=JavaScript - h.OnClick(js.EvalJs(` - if(!navigator.clipboard) { - alert("Clipboard API not supported"); - return; - } - let text = self.parentElement.querySelector("#go-output-content").innerText; - navigator.clipboard.writeText(text); - self.innerText = "Copied!"; - setTimeout(() => { - self.innerText = "Copy"; - }, 1000); - `)), - )), + h.If( + content != "", + h.Div( + h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), + h.Text("Copy"), + h.OnClick( + js.EvalJs(` + if(!navigator.clipboard) { + alert("Clipboard API not supported"); + return; + } + let text = self.parentElement.querySelector("#go-output-content").innerText; + navigator.clipboard.writeText(text); + self.innerText = "Copied!"; + setTimeout(() => { + self.innerText = "Copy"; + }, 1000); + `), + ), + ), + ), ), ) } diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 1b438cf..75c6b48 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -58,29 +58,26 @@ func Star(ctx *h.RequestContext) *h.Element { h.Class("w-4 h-4 -mt-0.5 mr-0.5 stroke-current text-white"), h.Attribute("xmlns", "http://www.w3.org/2000/svg"), h.Attribute("viewBox", "0 0 24 24"), - h.Attribute("fill", "none"), // No fill - h.Attribute("stroke", "currentColor"), // Apply stroke - h.Attribute("stroke-width", "2"), // Stroke width + h.Attribute("fill", "none"), + h.Attribute("stroke", "currentColor"), + h.Attribute("stroke-width", "2"), h.Path( h.D("M12 17.27l5.18 3.05-1.64-5.68 4.46-3.87-5.88-.5L12 3.5l-2.12 6.77-5.88.5 4.46 3.87-1.64 5.68L12 17.27z"), ), ), h.Text("Star"), ), - h.If(count > 0, h.Div( - h.Class("flex items-center px-3 py-1 bg-black text-white text-sm font-semibold"), - h.Pf("%d", count), - )), + h.If( + count > 0, + h.Div( + h.Class("flex items-center px-3 py-1 bg-black text-white text-sm font-semibold"), + h.Pf("%d", count), + ), + ), ) } func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { - //prelease := h.If(props.ShowPreRelease, h.A( - // h.Class("bg-blue-200 text-blue-700 text-center p-2 flex items-center justify-center"), - // h.Href("https://github.com/maddalax/htmgo/issues"), - // h.Attribute("target", "_blank"), - // h.Text("htmgo."), - //)) desktopNav := h.Nav( h.Class("hidden sm:block bg-neutral-100 border border-b-slate-300 p-4 md:p-3 max-h-[100vh - 9rem] overflow-y-auto"), @@ -94,7 +91,8 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { h.Class("text-2xl"), h.Href("/"), h.Text("htmgo"), - )), + ), + ), h.Div( h.Id("search-container"), ), @@ -118,7 +116,6 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { return h.Div( h.Id("navbar"), - //prelease, MobileNav(ctx, props.Expanded), desktopNav, ) @@ -139,43 +136,54 @@ func MobileNav(ctx *h.RequestContext, expanded bool) *h.Element { h.Class("text-2xl"), h.Href("/"), h.Text("htmgo"), - )), + ), + ), h.Div( h.Class("flex items-center gap-3"), - h.Div(h.Class("mt-1"), CachedStar(ctx)), + h.Div( + h.Class("mt-1"), + CachedStar(ctx), + ), h.Button( h.Boost(), - h.GetPartialWithQs( ToggleNavbar, - h.NewQs("expanded", h.Ternary(expanded, "false", "true"), "test", "true"), + h.NewQs( + "expanded", + h.Ternary(expanded, "false", "true"), + "test", + "true", + ), "click", ), - h.AttributePairs( - "class", "text-2xl", - "aria-expanded", h.Ternary(expanded, "true", "false"), + "class", + "text-2xl", + "aria-expanded", + h.Ternary(expanded, "true", "false"), ), - h.Class("text-2xl"), h.UnsafeRaw("☰"), ), ), ), ), - h.If(expanded, h.Div( - h.Class("mt-2 ml-2 flex flex-col gap-2"), - h.List(navItems, func(item NavItem, index int) *h.Element { - return h.Div( - h.Class("flex items-center"), - h.A( - h.Boost(), - h.Class(""), - h.Href(item.Url), - h.Text(item.Name), - ), - ) - }), - )), + h.If( + expanded, + h.Div( + h.Class("mt-2 ml-2 flex flex-col gap-2"), + h.List(navItems, func(item NavItem, index int) *h.Element { + return h.Div( + h.Class("flex items-center"), + h.A( + h.Boost(), + h.Class(""), + h.Href(item.Url), + h.Text(item.Name), + ), + ) + }), + ), + ), ) } diff --git a/htmgo-site/partials/sidebar.go b/htmgo-site/partials/sidebar.go index 8387f48..a3447c6 100644 --- a/htmgo-site/partials/sidebar.go +++ b/htmgo-site/partials/sidebar.go @@ -71,7 +71,10 @@ func DocSidebar(pages []*dirwalk.Page) *h.Element { h.Class("flex flex-col gap-4"), h.List(grouped.Entries(), func(entry datastructures.Entry[string, []*dirwalk.Page], index int) *h.Element { return h.Div( - h.P(h.Text(formatPart(entry.Key)), h.Class("text-slate-800 font-bold")), + h.P( + h.Text(formatPart(entry.Key)), + h.Class("text-slate-800 font-bold"), + ), h.Div( h.Class("pl-4 flex flex-col"), h.List(entry.Value, func(page *dirwalk.Page, index int) *h.Element { diff --git a/templates/starter/pages/index.go b/templates/starter/pages/index.go index 08c6f17..7c81c8a 100644 --- a/templates/starter/pages/index.go +++ b/templates/starter/pages/index.go @@ -9,7 +9,11 @@ func IndexPage(ctx *h.RequestContext) *h.Page { return RootPage( h.Div( h.Class("flex flex-col gap-4 items-center pt-24 min-h-screen bg-neutral-100"), - h.H3(h.Id("intro-text"), h.Text("hello htmgo"), h.Class("text-5xl")), + h.H3( + h.Id("intro-text"), + h.Text("hello htmgo"), + h.Class("text-5xl"), + ), h.Div( h.Class("mt-3"), partials.CounterForm(0), diff --git a/templates/starter/pages/root.go b/templates/starter/pages/root.go index d930c81..323f436 100644 --- a/templates/starter/pages/root.go +++ b/templates/starter/pages/root.go @@ -7,7 +7,9 @@ import ( func RootPage(children ...h.Ren) *h.Page { return h.NewPage( h.Html( - h.HxExtensions(h.BaseExtensions()), + h.HxExtensions( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"), diff --git a/templates/starter/partials/index.go b/templates/starter/partials/index.go index f5b47e8..bdedba9 100644 --- a/templates/starter/partials/index.go +++ b/templates/starter/partials/index.go @@ -26,7 +26,8 @@ func CounterForm(count int) *h.Element { h.Class("flex flex-col gap-3 items-center"), h.Id("counter-form"), h.PostPartial(CounterPartial), - h.Input("text", + h.Input( + "text", h.Class("hidden"), h.Value(count), h.Name("count"), diff --git a/tools/html-to-htmgo/htmltogo/indent.go b/tools/html-to-htmgo/htmltogo/indent.go new file mode 100644 index 0000000..519fbe9 --- /dev/null +++ b/tools/html-to-htmgo/htmltogo/indent.go @@ -0,0 +1,139 @@ +package htmltogo + +import ( + "bytes" + "fmt" + "go/ast" + "go/format" + "go/parser" + "go/printer" + "go/token" + "golang.org/x/tools/go/ast/astutil" + "slices" + "strings" +) + +func Indent(input string) string { + fset := token.NewFileSet() + // Parse the code string into an AST + f, err := parser.ParseFile(fset, "", input, parser.ParseComments) + + if err != nil { + return input + } + + htmgoComponentTypes := []string{ + "h.Element", + "h.Page", + "h.Partial", + "h.Ren", + } + + for _, decl := range f.Decls { + switch c := decl.(type) { + case *ast.FuncDecl: + + if c.Type.Results == nil || len(c.Type.Results.List) == 0 { + continue + } + + returnType := c.Type.Results.List[0].Type + + isHtmgoComponent := false + if v, ok := returnType.(*ast.StarExpr); ok { + if x, ok := v.X.(*ast.SelectorExpr); ok { + name := x.X.(*ast.Ident).Name + str := name + "." + x.Sel.Name + isHtmgoComponent = slices.Contains(htmgoComponentTypes, str) + } + } + + if !isHtmgoComponent { + continue + } + + var isHTag = func(n ast.Expr) bool { + switch argc := n.(type) { + // If the first argument is another node, add an indent + case *ast.CallExpr: + if v, ok := argc.Fun.(*ast.SelectorExpr); ok { + if v2, ok := v.X.(*ast.Ident); ok { + if v2.Name == "h" || v2.Name == "js" { + return true + } + } + } + } + return false + } + + var indent = func(children []ast.Expr) []ast.Expr { + children = append(children, ast.NewIdent("INDENTME")) + return children + } + + astutil.Apply(c.Body, nil, func(cursor *astutil.Cursor) bool { + switch n := cursor.Node().(type) { + case *ast.CallExpr: + newChildren := make([]ast.Expr, 0) + + hasAnyHElements := false + + for _, arg := range n.Args { + if isHTag(arg) { + hasAnyHElements = true + break + } + } + + for i, arg := range n.Args { + + if len(n.Args) == 1 && isHTag(arg) { + newChildren = indent(newChildren) + newChildren = append(newChildren, arg) + newChildren = indent(newChildren) + continue + } + + if !hasAnyHElements { + newChildren = append(newChildren, arg) + continue + } + + if len(n.Args) > 1 { + if i == 0 { + newChildren = indent(newChildren) + } + } + newChildren = append(newChildren, arg) + if len(n.Args) > 1 { + newChildren = indent(newChildren) + } + } + n.Args = newChildren + return true + } + return true + }) + } + } + + // Convert the AST node to a string + var buf bytes.Buffer + if err := printer.Fprint(&buf, fset, f); err != nil { + fmt.Println("Error printing AST:", err) + return input + } + + // Output the formatted code + indented := strings.ReplaceAll(buf.String(), "INDENTME,", "\n\t\t") + indented = strings.ReplaceAll(indented, ", INDENTME", ", \n\t\t") + + formatted, err := format.Source([]byte(indented)) + + if err != nil { + return input + } + + return string(formatted) +} diff --git a/tools/html-to-htmgo/htmltogo/main.go b/tools/html-to-htmgo/htmltogo/main.go index ce382c1..d2806fd 100644 --- a/tools/html-to-htmgo/htmltogo/main.go +++ b/tools/html-to-htmgo/htmltogo/main.go @@ -18,5 +18,5 @@ func Parse(input []byte) []byte { return nil } - return []byte(formatter.Format(parsed)) + return []byte(Indent(formatter.Format(parsed))) } diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go index a33d98a..6bfb3bd 100644 --- a/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go +++ b/tools/html-to-htmgo/internal/adapters/services/formatter/formatter.go @@ -16,8 +16,7 @@ import ( func MyComponent() *h.Element { return ` + node.String() + ` }`) - indented := Indent(string(b)) - dist, err := format.Source([]byte(indented)) + dist, err := format.Source(b) if err != nil { return string(b) } diff --git a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go b/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go deleted file mode 100644 index fdffc5f..0000000 --- a/tools/html-to-htmgo/internal/adapters/services/formatter/indent.go +++ /dev/null @@ -1,58 +0,0 @@ -package formatter - -import ( - "bytes" - "fmt" - "go/ast" - "go/parser" - "go/printer" - "go/token" - "golang.org/x/tools/go/ast/astutil" - "strings" -) - -func Indent(input string) string { - fset := token.NewFileSet() - // Parse the code string into an AST - f, err := parser.ParseFile(fset, "", input, 0) - - if err != nil { - return input - } - - component := f.Decls[1].(*ast.FuncDecl) - - astutil.Apply(component.Body, nil, func(cursor *astutil.Cursor) bool { - switch n := cursor.Node().(type) { - case *ast.CallExpr: - newChildren := make([]ast.Expr, 0) - for i, arg := range n.Args { - if i == 0 { - switch arg.(type) { - // If the first argument is another node, add an indent - case *ast.CallExpr: - newChildren = append(newChildren, ast.NewIdent("INDENTME")) - } - } - newChildren = append(newChildren, arg) - newChildren = append(newChildren, ast.NewIdent("INDENTME")) - } - n.Args = newChildren - return true - } - return true - }) - - // Convert the AST node to a string - var buf bytes.Buffer - if err := printer.Fprint(&buf, fset, component); err != nil { - fmt.Println("Error printing AST:", err) - return input - } - - // Output the formatted code - indented := strings.ReplaceAll(buf.String(), "INDENTME,", "\n\t\t") - indented = strings.ReplaceAll(indented, ", INDENTME", ", \n\t\t") - - return indented -} From f4083b70141ff0db7cd95d8b7f78fd9ab509a538 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 15:34:32 +0000 Subject: [PATCH 050/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 59f6677..d70f0c1 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index ac68226..bf8a7b8 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index a8007c2..d1c2ce0 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 6ffee29..9bf1b0f 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index e45ccdd..433e75f 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index c252016..41639c1 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 8ed8f7f..dad36ae 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 8acc994..660baad 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 415624c..483f125 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 6ffee29..9bf1b0f 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 141b1e9..5407f27 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 8a0bfa6..9470743 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886 h1:iQ/HmCUl+XBJ0UZQ6V6h9jJdavRFLSoPA74GEHG82vQ= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025125111-9a8718831886/go.mod h1:hpDNkFnNT0FIgmQsVjMeQOzLuPxaqmkbNuws3zh4gWs= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562 h1:VDaKRsl3yIs957Romc2+EMLQyGiWjAUy9PA3k+NyLg4= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562/go.mod h1:hahYMeImbtIgIr5KQXarKZw8zDt2rqyCojUZV9fiAQ4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index c359fde..f1af435 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 6ffee29..9bf1b0f 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886 h1:zXPLn0zUz6pMEI/64pGH63QSTpm6YQbfZNH790Vohbk= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025125111-9a8718831886/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 504a64aa636092d854929ea2609e72e107a4027d Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 10:54:12 -0500 Subject: [PATCH 051/137] add instructions for running the formatter --- examples/chat/pages/chat.$id.go | 3 +- .../md/docs/8_miscellaneous/3_htmgo format.md | 60 +++++++++++++++++++ htmgo-site/partials/html-to-go.go | 1 + 3 files changed, 63 insertions(+), 1 deletion(-) create mode 100644 htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md diff --git a/examples/chat/pages/chat.$id.go b/examples/chat/pages/chat.$id.go index a06367a..deb676d 100644 --- a/examples/chat/pages/chat.$id.go +++ b/examples/chat/pages/chat.$id.go @@ -129,7 +129,8 @@ func CollapseButton() *h.Element { `), ), h.UnsafeRaw("☰"), - // The icon for collapsing the sidebar + + // The icon for collapsing the sidebar ), ) } diff --git a/htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md b/htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md new file mode 100644 index 0000000..18b124d --- /dev/null +++ b/htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md @@ -0,0 +1,60 @@ +## Htmgo Format + +htmgo has a built-in formatter that can be used to format htmgo element blocks. + +It is available through the 'htmgo' cli tool that is installed with htmgo. + +**Note:** if you have previously installed htmgo, you will need to run `GOPROXY=direct go install github.com/maddalax/htmgo/cli/htmgo@latest` to update the cli tool. + +
+To use it, run the following command: + +```bash +// format all .go files in the current directory recursively +htmgo format . + +// format the file specified +htmgo format ./my-file.go +``` + +This will format all htmgo element blocks in your project. + +**Example:** + +```go +h.Div( + h.Class("flex gap-2"), h.Text("hello"), h.Text("world"), +) +``` + +**Output:** + +```go +h.Div( + h.Class("flex gap-2"), + h.Text("hello"), + h.Text("world"), +) +``` + +## Running htmgo format on save + +### Jetbrains IDE's + +1. Go to Settings -> Tools -> File Watchers -> + custom + +2. Set the following values: + +```yaml +Name: htmgo format +File Type: Go +Scope: Current File +Program: htmgo +Arguments: format $FilePath$ +Output paths to refresh: $FilePath$ +Working directory: $ProjectFileDir$ +``` + +3. Save the file watcher and ensure it is enabled + +4. Go to `Settings -> Tools -> Actions On Save` and ensure the `htmgo format` action is enabled diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 00945e5..a43f70c 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -47,6 +47,7 @@ func GoOutput(content string) *h.Element { h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), h.Text("Copy"), h.OnClick( + // language=JavaScript js.EvalJs(` if(!navigator.clipboard) { alert("Clipboard API not supported"); From e2939cd8ba8e199d5936cf4eb3ca0c8a078d5d8b Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 11:11:22 -0500 Subject: [PATCH 052/137] support non pointer types on formatter --- examples/chat/components/button.go | 26 +++++++++++--- examples/hackernews/pages/root.go | 7 ++-- examples/simple-auth/pages/root.go | 4 ++- examples/todo-list/pages/base/root.go | 4 ++- tools/html-to-htmgo/htmltogo/indent.go | 9 +++++ tools/html-to-htmgo/htmltogo/indent_test.go | 38 +++++++++++++++++++++ 6 files changed, 79 insertions(+), 9 deletions(-) create mode 100644 tools/html-to-htmgo/htmltogo/indent_test.go diff --git a/examples/chat/components/button.go b/examples/chat/components/button.go index bc767c8..3f9c8c1 100644 --- a/examples/chat/components/button.go +++ b/examples/chat/components/button.go @@ -28,12 +28,28 @@ func Button(props ButtonProps) h.Ren { text := h.Text(props.Text) button := h.Button( - h.If(props.Id != "", h.Id(props.Id)), - h.If(props.Children != nil, h.Children(props.Children...)), + h.If( + props.Id != "", + h.Id(props.Id), + ), + h.If( + props.Children != nil, + h.Children(props.Children...), + ), h.Class("flex gap-1 items-center justify-center border p-4 rounded cursor-hover", props.Class), - h.If(props.Get != "", h.Get(props.Get)), - h.If(props.Target != "", h.HxTarget(props.Target)), - h.IfElse(props.Type != "", h.Type(props.Type), h.Type("button")), + h.If( + props.Get != "", + h.Get(props.Get), + ), + h.If( + props.Target != "", + h.HxTarget(props.Target), + ), + h.IfElse( + props.Type != "", + h.Type(props.Type), + h.Type("button"), + ), text, ) diff --git a/examples/hackernews/pages/root.go b/examples/hackernews/pages/root.go index 1df43ef..3358b22 100644 --- a/examples/hackernews/pages/root.go +++ b/examples/hackernews/pages/root.go @@ -5,14 +5,17 @@ import ( ) func RootPage(children ...h.Ren) h.Ren { - banner := h.A(h.Class("bg-neutral-200 text-neutral-600 text-center p-2 flex items-center justify-center"), + banner := h.A( + h.Class("bg-neutral-200 text-neutral-600 text-center p-2 flex items-center justify-center"), h.Href("https://github.com/maddalax/htmgo"), h.Attribute("target", "_blank"), h.Text("Built with htmgo.dev"), ) return h.Html( - h.HxExtensions(h.BaseExtensions()), + h.HxExtensions( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"), diff --git a/examples/simple-auth/pages/root.go b/examples/simple-auth/pages/root.go index bacdd61..510163e 100644 --- a/examples/simple-auth/pages/root.go +++ b/examples/simple-auth/pages/root.go @@ -6,7 +6,9 @@ import ( func RootPage(children ...h.Ren) h.Ren { return h.Html( - h.HxExtensions(h.BaseExtensions()), + h.HxExtensions( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"), diff --git a/examples/todo-list/pages/base/root.go b/examples/todo-list/pages/base/root.go index 7a9ca91..f612a62 100644 --- a/examples/todo-list/pages/base/root.go +++ b/examples/todo-list/pages/base/root.go @@ -6,7 +6,9 @@ import ( func RootPage(children ...h.Ren) h.Ren { return h.Html( - h.HxExtension(h.BaseExtensions()), + h.HxExtension( + h.BaseExtensions(), + ), h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Meta("title", "htmgo todo mvc"), diff --git a/tools/html-to-htmgo/htmltogo/indent.go b/tools/html-to-htmgo/htmltogo/indent.go index 519fbe9..da7146c 100644 --- a/tools/html-to-htmgo/htmltogo/indent.go +++ b/tools/html-to-htmgo/htmltogo/indent.go @@ -48,6 +48,15 @@ func Indent(input string) string { } } + // support non-pointer return types + if v, ok := returnType.(*ast.SelectorExpr); ok { + if x, ok := v.X.(*ast.Ident); ok { + name := x.Name + str := name + "." + v.Sel.Name + isHtmgoComponent = slices.Contains(htmgoComponentTypes, str) + } + } + if !isHtmgoComponent { continue } diff --git a/tools/html-to-htmgo/htmltogo/indent_test.go b/tools/html-to-htmgo/htmltogo/indent_test.go new file mode 100644 index 0000000..b29679f --- /dev/null +++ b/tools/html-to-htmgo/htmltogo/indent_test.go @@ -0,0 +1,38 @@ +package htmltogo + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestIdentHRen(t *testing.T) { + input := ` + package main + import ( + "github.com/maddalax/htmgo/framework/h" + ) + func Button(props ButtonProps) h.Ren { + return h.Div( + h.Div(h.Div(),h.P(),h.P(), + ), + ) + } + ` + indented := Indent(input) + assert.Equal(t, `package main + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func Button(props ButtonProps) h.Ren { + return h.Div( + h.Div( + h.Div(), + h.P(), + h.P(), + ), + ) +} +`, indented) +} From 2953a487d2bcf462b12029c12cdc5f17f04814d2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 16:12:08 +0000 Subject: [PATCH 053/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- tools/html-to-htmgo/go.mod | 7 +++++++ tools/html-to-htmgo/go.sum | 10 ++++++++++ 16 files changed, 41 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index d70f0c1..aa6bae9 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index bf8a7b8..0b6125c 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index d1c2ce0..8e9c874 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 9bf1b0f..b26b318 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 433e75f..e6d5e2f 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 41639c1..601ae49 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index dad36ae..82b035c 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 660baad..4a03512 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 483f125..0da1d4f 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 9bf1b0f..b26b318 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 5407f27..95c84c9 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562 + github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 9470743..397e6c2 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562 h1:VDaKRsl3yIs957Romc2+EMLQyGiWjAUy9PA3k+NyLg4= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025153348-8736c00fd562/go.mod h1:hahYMeImbtIgIr5KQXarKZw8zDt2rqyCojUZV9fiAQ4= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e h1:xKylmFT6lU58+RLE9NlCfINxXinI/Z85XHIV3gWufHo= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e/go.mod h1:hahYMeImbtIgIr5KQXarKZw8zDt2rqyCojUZV9fiAQ4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index f1af435..6146d98 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 9bf1b0f..b26b318 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562 h1:kNxJOolj4nmtVhGLozsgFAmdQ1dsilTUqlrgQeabMXw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025153348-8736c00fd562/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/tools/html-to-htmgo/go.mod b/tools/html-to-htmgo/go.mod index e12e759..e60bec4 100644 --- a/tools/html-to-htmgo/go.mod +++ b/tools/html-to-htmgo/go.mod @@ -3,7 +3,14 @@ module github.com/maddalax/htmgo/tools/html-to-htmgo go 1.23.0 require ( + github.com/stretchr/testify v1.9.0 golang.org/x/net v0.30.0 golang.org/x/text v0.19.0 golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d ) + +require ( + github.com/davecgh/go-spew v1.1.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/tools/html-to-htmgo/go.sum b/tools/html-to-htmgo/go.sum index 2d1e0d6..ef925bc 100644 --- a/tools/html-to-htmgo/go.sum +++ b/tools/html-to-htmgo/go.sum @@ -1,6 +1,16 @@ +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 97ad3cbee2b3a23c0a9210d1175a33aa509a0166 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 11:30:50 -0500 Subject: [PATCH 054/137] add top banner --- htmgo-site/partials/navbar.go | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 75c6b48..9cc7db0 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -78,7 +78,15 @@ func Star(ctx *h.RequestContext) *h.Element { } func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { - + banner := h.If( + true, + h.A( + h.Class("bg-blue-200 text-slate-700 text-center p-2 flex items-center justify-center"), + h.Href("https://github.com/maddalax/htmgo/releases/tag/framework%2Fv1.0.1"), + h.Attribute("target", "_blank"), + h.Text("htmgo v1.0.1 is released and it includes a new automatic formatter, view release notes"), + ), + ) desktopNav := h.Nav( h.Class("hidden sm:block bg-neutral-100 border border-b-slate-300 p-4 md:p-3 max-h-[100vh - 9rem] overflow-y-auto"), h.Div( @@ -116,6 +124,7 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { return h.Div( h.Id("navbar"), + banner, MobileNav(ctx, props.Expanded), desktopNav, ) From 5a69d9ba20b616ddb1e5ece737094492fe3c7d71 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 12:39:22 -0500 Subject: [PATCH 055/137] cleanup the intro example --- .../md/docs/1_quick-start/1_introduction.md | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/htmgo-site/md/docs/1_quick-start/1_introduction.md b/htmgo-site/md/docs/1_quick-start/1_introduction.md index 992cdd9..9300d43 100644 --- a/htmgo-site/md/docs/1_quick-start/1_introduction.md +++ b/htmgo-site/md/docs/1_quick-start/1_introduction.md @@ -5,26 +5,22 @@ We give you the utilities to build html using pure go code in a reusable way (go ```go func DocsPage(ctx *h.RequestContext) *h.Page { - assets := ctx.Get("embeddedMarkdown").(fs.FS) - pages := dirwalk.WalkPages("md/docs", assets) - - return h.NewPage(base.RootPage( + pages := dirwalk.WalkPages("md/docs") + return h.NewPage( h.Div( - h.Class("flex flex-col md:flex-row gap-4 justify-center mb-12"), - partials.DocSidebar(pages), + h.Class("flex flex-col md:flex-row gap-4"), + DocSidebar(pages), h.Div( h.Class("flex flex-col justify-center items-center mt-6"), h.List(pages, func(page *dirwalk.Page, index int) *h.Element { return h.Div( - h.Class("border-b border-b-slate-300 w-full pb-8 mb-8"), - MarkdownContent(ctx, - page.FilePath, - partials.CreateAnchor(page.Parts)), + h.Class("border-b border-b-slate-300"), + MarkdownContent(ctx, page), ) }), ), ), - )) + ) } ``` From df3edccd7fb09283665a42f40ce08b88f0c5ebf5 Mon Sep 17 00:00:00 2001 From: Mohammad javad <41829984+himynamej@users.noreply.github.com> Date: Fri, 25 Oct 2024 13:41:32 -0400 Subject: [PATCH 056/137] fix:parser_test remove impossible condition (#44) --- .../internal/adapters/services/parser/parser_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go b/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go index 5d2de8d..2554172 100644 --- a/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go +++ b/tools/html-to-htmgo/internal/adapters/services/parser/parser_test.go @@ -22,7 +22,7 @@ func FuzzFromBytes(f *testing.F) { if err != nil { return } - if err != nil && !isExpectedError(err) { + if !isExpectedError(err) { t.Errorf("Unexpected error: %v", err) } }) From abad4b4eb7a59b594986b2800e1a52b8d5085c2d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 25 Oct 2024 17:42:22 +0000 Subject: [PATCH 057/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index aa6bae9..10cece9 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 0b6125c..e84281e 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 8e9c874..741c20e 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index b26b318..f050d04 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index e6d5e2f..d41f1b9 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 601ae49..9814172 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 82b035c..9d1467e 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 4a03512..6ebdaf9 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 0da1d4f..8c49a12 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index b26b318..f050d04 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 95c84c9..5083b4a 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e + github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025174132-df3edccd7fb0 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 397e6c2..76197bb 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e h1:xKylmFT6lU58+RLE9NlCfINxXinI/Z85XHIV3gWufHo= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025161122-e2939cd8ba8e/go.mod h1:hahYMeImbtIgIr5KQXarKZw8zDt2rqyCojUZV9fiAQ4= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025174132-df3edccd7fb0 h1:U57+3oRD+uGrc9Aapi/Ol1ZzRuCY2s0diK0pxWtIZeU= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025174132-df3edccd7fb0/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 6146d98..437362f 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e +require github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index b26b318..f050d04 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e h1:Ow4vMWrCbYYskxfNMX36HPrCU0Iwjbgmtf83r8x+1tg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025161122-e2939cd8ba8e/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= +github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From e3edd49800036d882ae8d18d832276b3d6acce52 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 13:33:55 -0500 Subject: [PATCH 058/137] add logo --- htmgo-site/partials/navbar.go | 41 ++++++++++++++++++++++++++--------- 1 file changed, 31 insertions(+), 10 deletions(-) diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 9cc7db0..9c7daa7 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -34,6 +34,31 @@ var CachedStar = h.CachedT(time.Minute*15, func(t *h.RequestContext) *h.Element return Star(t) }) +func Logo() *h.Element { + return h.Svg( + h.Attribute("viewBox", "0 0 370 80.8775381264543"), + h.Class("h-full w-full"), + h.Tag( + "G", + h.Attribute("transform", "matrix(1.276616840702525,0,0,1.276616840702525,-4.447757222875277,-26.431067200135733)"), + h.Attribute("fill", "#111111"), + h.Path( + h.Attribute("xmlns", "http://www.w3.org/2000/svg"), + h.Attribute("fill", "#111111"), + h.Attribute("d", "M48.34863,25.46777c-0.23438,0.48438-0.47461,0.99414-0.72461,1.55859 c-3.42871,7.72266-11.42285,25.09375-13.74707,30.13672c-1.5293-1.76367-3.08398-3.55469-4.55859-5.24609L48.34863,25.46777z M5.83398,68.5127l10.04492-21.2168c0.31445-0.83008,1.5293-3.20117,2.93848-3.20117c0.02832,0,0.05957,0.01172,0.08887,0.01367 c-0.67969,0.76563-1.42188,2.04102-2.00195,4.17578c-1.03125,3.79492-4.48535,16.94922-5.34473,20.22852H5.83398z M13.62695,68.5127 c1.03516-3.94531,4.22461-16.08984,5.20703-19.70313c0.63086-2.32227,1.39551-3.26367,1.83691-3.63477 c0.00684,0.00781,0.01367,0.01172,0.02051,0.01953C23.94629,48.68066,36.72852,63.5127,41.0293,68.5127H13.62695z M43.66699,68.5127 c-1.00293-1.16602-4.45117-5.17773-8.35352-9.68945c1.65039-3.58008,10.4834-22.75195,14.13867-30.98633 c2.32031-5.22852,3.6582-6.17773,4.04297-6.34961c0.82715,0.41797,1.73926,1.29102,2.66992,2.61719 c3.94141,5.61719,23.45703,37.07422,28.00098,44.4082H43.66699z"), + ), + ), + h.Tag( + "G", + h.Attribute("transform", "matrix(4.097970099125154,0,0,4.097970099125154,114.03704346489575,-20.491491909735604)"), + h.Attribute("fill", "#111111"), + h.Path( + h.Attribute("d", "M7.5293 9.766 c2.2461 0 3.5938 1.25 3.5938 3.7598 l0 6.4746 l-2.8223 0 l0 -6.0156 c0 -1.4746 -0.82031 -1.9629 -1.8262 -1.9629 c-1.0449 0 -2.1875 0.51758 -2.207 2.4414 l0 5.5371 l-2.8125 0 l0 -15 l2.8125 0 l0 6.1621 c0.71289 -0.86914 1.8359 -1.3965 3.2617 -1.3965 z M17.568346875 20 c-1.9531 0 -3.0664 -1.1328 -3.0664 -3.1348 l0 -4.7461 l-1.9727 0 l0 -2.1582 l0.63477 0 c1.0645 0 1.6504 -0.41016 1.6504 -1.9141 l0 -1.3281 l2.5391 0 l0 3.2422 l2.0703 0 l0 2.1582 l-2.0703 0 l0 4.4434 c0 0.89844 0.43945 1.2988 1.1621 1.2988 l0.9082 0 l0 2.1387 l-1.8555 0 z M33.496484375 9.766 c2.1484 0 3.5352 1.0938 3.5352 3.1543 l0 7.0801 l-2.8125 0 l0 -6.2793 c0 -1.1816 -0.74219 -1.6992 -1.582 -1.6992 c-1.0059 0 -1.8945 0.57617 -1.8945 2.3145 l0 5.6641 l-2.8418 0 l0 -6.25 c0 -1.2012 -0.72266 -1.7285 -1.6113 -1.7285 c-0.97656 0 -1.8848 0.57617 -1.8848 2.4609 l0 5.5176 l-2.8027 0 l0 -10.039 l2.8027 0 l0 1.1816 c0.66406 -0.88867 1.6797 -1.377 2.9102 -1.377 c1.4551 0 2.5488 0.52734 3.0762 1.5039 c0.70313 -1.0059 1.7773 -1.5039 3.1055 -1.5039 z M46.679646875 9.961 l2.6758 0 l0 9.2871 c0 3.9063 -2.1191 5.4883 -5.3223 5.4883 c-2.8809 0 -4.4434 -1.2109 -5.1758 -3.1152 l2.334 -0.99609 c0.56641 1.2988 1.3867 1.9238 2.7344 1.9238 c1.7773 0 2.6074 -1.1133 2.6074 -3.0957 l0 -1.1719 c-0.58594 0.80078 -1.7383 1.3672 -3.0469 1.3672 c-2.4902 0 -4.5801 -1.9629 -4.5801 -4.9609 c0 -3.0078 2.0996 -4.9219 4.5996 -4.9219 c1.4063 0 2.5586 0.625 3.1055 1.5234 z M44.208946875 17.373 c1.4648 0 2.5977 -1.1914 2.5977 -2.6855 c0 -1.5039 -1.1133 -2.6953 -2.5977 -2.6953 c-1.4746 0 -2.5879 1.1426 -2.5879 2.6953 c0 1.5332 1.1328 2.6855 2.5879 2.6855 z M56.9531125 20.19531 c-3.1934 0 -5.498 -1.9434 -5.498 -5.2246 c0 -3.2617 2.2852 -5.2051 5.498 -5.2051 c3.2324 0 5.5078 1.9434 5.5078 5.2051 c0 3.2813 -2.2852 5.2246 -5.5078 5.2246 z M56.9238125 17.959 c1.6309 0 2.7441 -1.1914 2.7441 -2.9883 s-1.1133 -2.9883 -2.7441 -2.9883 c-1.5723 0 -2.6758 1.1914 -2.6758 2.9883 s1.1035 2.9883 2.6758 2.9883 z"), + ), + ), + ) +} + func Star(ctx *h.RequestContext) *h.Element { type Repo struct { @@ -93,13 +118,10 @@ func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { h.Class("max-w-[95%] md:max-w-3xl px-4 mx-auto"), h.Div( h.Class("flex justify-between items-center"), - h.Div( - h.Class("flex items-center"), - h.A( - h.Class("text-2xl"), - h.Href("/"), - h.Text("htmgo"), - ), + h.A( + h.Href("/"), + h.Class("mt-1 max-w-[125px]"), + Logo(), ), h.Div( h.Id("search-container"), @@ -141,10 +163,9 @@ func MobileNav(ctx *h.RequestContext, expanded bool) *h.Element { h.Div( h.Class("flex items-center"), h.A( - h.Boost(), - h.Class("text-2xl"), h.Href("/"), - h.Text("htmgo"), + h.Class("mt-1 max-w-[125px]"), + Logo(), ), ), h.Div( From 4398eb1fdbd91e1049700431671436f155b5bcab Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 14:11:48 -0500 Subject: [PATCH 059/137] style fixes --- htmgo-site/internal/markdown/render.go | 8 ++++++++ htmgo-site/pages/base/root.go | 2 +- htmgo-site/pages/docs.go | 6 +++--- htmgo-site/pages/markdown.go | 2 +- 4 files changed, 13 insertions(+), 5 deletions(-) diff --git a/htmgo-site/internal/markdown/render.go b/htmgo-site/internal/markdown/render.go index 8677ac9..0c8f216 100644 --- a/htmgo-site/internal/markdown/render.go +++ b/htmgo-site/internal/markdown/render.go @@ -2,6 +2,8 @@ package markdown import ( "bytes" + "github.com/alecthomas/chroma/v2" + chromahtml "github.com/alecthomas/chroma/v2/formatters/html" "github.com/yuin/goldmark" highlighting "github.com/yuin/goldmark-highlighting/v2" "github.com/yuin/goldmark/extension" @@ -52,6 +54,12 @@ func RenderMarkdown(reader io.Reader) bytes.Buffer { ), goldmark.WithExtensions( highlighting.NewHighlighting( + highlighting.WithFormatOptions( + chromahtml.WithLineNumbers(true), + chromahtml.WithCustomCSS(map[chroma.TokenType]string{ + chroma.PreWrapper: "padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important;", + }), + ), highlighting.WithStyle("github"), ), ), diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index 0fd37e4..54d7a3c 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -38,7 +38,7 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { `), ), h.Body( - h.Class("bg-stone-50 h-screen"), + h.Class("bg-white h-screen"), h.Fragment(children...), h.Script("https://cdn.jsdelivr.net/npm/@docsearch/js@3"), h.UnsafeRawScript(` diff --git a/htmgo-site/pages/docs.go b/htmgo-site/pages/docs.go index c8a3572..c08fa78 100644 --- a/htmgo-site/pages/docs.go +++ b/htmgo-site/pages/docs.go @@ -31,11 +31,11 @@ func DocsPage(ctx *h.RequestContext) *h.Page { h.Class("w-full md:hidden bg-neutral-50 overflow-y-auto"), partials.DocSidebar(pages), ), - h.Class("overflow-y-auto justify-center md:mx-auto overflow-x-hidden pb-6"), + h.Class("overflow-y-auto justify-center overflow-x-hidden pb-6 items-center w-full"), h.Div( - h.Class("flex flex-col"), + h.Class("flex flex-col mx-auto"), h.Div( - h.Class("flex flex-col justify-center items-center md:mt-6 "), + h.Class("flex flex-col justify-center items-center md:mt-6 mx-auto"), h.List(pages, func(page *dirwalk.Page, index int) *h.Element { anchor := partials.CreateAnchor(page.Parts) return h.Div( diff --git a/htmgo-site/pages/markdown.go b/htmgo-site/pages/markdown.go index eff2c6a..8f2fcbb 100644 --- a/htmgo-site/pages/markdown.go +++ b/htmgo-site/pages/markdown.go @@ -25,7 +25,7 @@ func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { h.Id(id), ), h.Div( - h.Class("w-full flex flex-col prose max-w-md md:max-w-xl lg:max-w-3xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), + h.Class("w-full flex flex-col prose max-w-md md:max-w-xl lg:max-w-4xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), h.UnsafeRaw(renderer.RenderFile(path, embeddedMd)), ), ) From cf76ca4f98b821a14df14337cdf0d4a243331c80 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 21:59:17 -0500 Subject: [PATCH 060/137] add some comments --- framework/h/app.go | 5 ++++ framework/h/array.go | 3 +++ framework/h/attribute.go | 13 ++++++++++ framework/h/cache.go | 27 +++++++++++++++++++++ framework/h/conditionals.go | 12 ++++++++++ framework/h/lifecycle.go | 47 +++++++++++++++++++++++++++++++++++++ framework/h/qs.go | 12 ++++++++++ framework/h/render.go | 1 + framework/h/serialize.go | 1 + framework/h/xhr.go | 10 ++++++++ 10 files changed, 131 insertions(+) diff --git a/framework/h/app.go b/framework/h/app.go index 51547cf..0839672 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -47,6 +47,10 @@ func (c *RequestContext) Get(key string) interface{} { return c.kv[key] } +// ServiceLocator returns the service locator to register and retrieve services +// Usage: +// service.Set[db.Queries](locator, service.Singleton, db.Provide) +// service.Get[db.Queries](locator) func (c *RequestContext) ServiceLocator() *service.Locator { return c.locator } @@ -62,6 +66,7 @@ type App struct { Router *chi.Mux } +// Start starts the htmgo server func Start(opts AppOpts) { router := chi.NewRouter() instance := App{ diff --git a/framework/h/array.go b/framework/h/array.go index 94287df..f6a6154 100644 --- a/framework/h/array.go +++ b/framework/h/array.go @@ -1,5 +1,6 @@ package h +// Unique returns a new slice with only unique items. func Unique[T any](slice []T, key func(item T) string) []T { var result []T seen := make(map[string]bool) @@ -13,6 +14,7 @@ func Unique[T any](slice []T, key func(item T) string) []T { return result } +// Filter returns a new slice with only items that match the predicate. func Filter[T any](slice []T, predicate func(item T) bool) []T { var result []T for _, v := range slice { @@ -23,6 +25,7 @@ func Filter[T any](slice []T, predicate func(item T) bool) []T { return result } +// Map returns a new slice with the results of the mapper function. func Map[T, U any](slice []T, mapper func(item T) U) []U { var result []U for _, v := range slice { diff --git a/framework/h/attribute.go b/framework/h/attribute.go index 7cf8fd0..d0da2da 100644 --- a/framework/h/attribute.go +++ b/framework/h/attribute.go @@ -120,27 +120,34 @@ func HxIndicator(tag string) *AttributeR { return Attribute(hx.IndicatorAttr, tag) } +// TriggerChildren Adds the hx-extension="trigger-children" to an element +// See https://htmgo.dev/docs#htmx-extensions-trigger-children func TriggerChildren() *AttributeR { return HxExtension("trigger-children") } +// HxTriggerString Adds a hx-trigger to an element based on a string of triggers func HxTriggerString(triggers ...string) *AttributeR { trigger := hx.NewStringTrigger(strings.Join(triggers, ", ")) return Attribute(hx.TriggerAttr, trigger.ToString()) } +// HxTrigger Adds a hx-trigger to an element func HxTrigger(opts ...hx.TriggerEvent) *AttributeR { return Attribute(hx.TriggerAttr, hx.NewTrigger(opts...).ToString()) } +// HxTriggerClick Adds a hx-trigger="click" to an element func HxTriggerClick(opts ...hx.Modifier) *AttributeR { return HxTrigger(hx.OnClick(opts...)) } +// HxExtension Adds a hx-ext to an element func HxExtension(value string) *AttributeR { return Attribute(hx.ExtAttr, value) } +// HxExtensions Adds multiple hx-ext to an element, separated by commas func HxExtensions(value ...string) Ren { return Attribute(hx.ExtAttr, strings.Join(value, ",")) } @@ -149,6 +156,8 @@ func JoinExtensions(attrs ...*AttributeR) Ren { return JoinAttributes(", ", attrs...) } +// JoinAttributes joins multiple attributes into a single attribute string based on a separator +// Example: JoinAttributes(", ", Attribute("hx-extension", "one"), Attribute("hx-extension", "two")) = hx-extension="one,two" func JoinAttributes(sep string, attrs ...*AttributeR) *AttributeR { values := make([]string, 0, len(attrs)) for _, a := range attrs { @@ -193,6 +202,9 @@ func Class(value ...string) *AttributeR { return Attribute("class", MergeClasses(value...)) } +// ClassX conditionally renders a class based on a map of class names and boolean values +// value is any non-conditional class name you'd like to add +// m is a map of class names and boolean values func ClassX(value string, m ClassMap) Ren { builder := strings.Builder{} builder.WriteString(value) @@ -206,6 +218,7 @@ func ClassX(value string, m ClassMap) Ren { return Class(builder.String()) } +// MergeClasses merges multiple classes into a single class string func MergeClasses(classes ...string) string { if len(classes) == 1 { return classes[0] diff --git a/framework/h/cache.go b/framework/h/cache.go index 92338cb..64ed5fe 100644 --- a/framework/h/cache.go +++ b/framework/h/cache.go @@ -49,6 +49,9 @@ func startExpiredCacheCleaner(node *CachedNode) { }() } +// Cached caches the given element for the given duration. The element is only rendered once, and then cached for the given duration. +// Please note this element is globally cached, and not per unique identifier / user. +// Use CachedPerKey to cache elements per unqiue identifier. func Cached(duration time.Duration, cb GetElementFunc) func() *Element { element := &Element{ tag: CachedNodeTag, @@ -64,6 +67,8 @@ func Cached(duration time.Duration, cb GetElementFunc) func() *Element { } } +// CachedPerKey caches the given element for the given duration. The element is only rendered once per key, and then cached for the given duration. +// The element is cached by the unique identifier that is returned by the callback function. func CachedPerKey[K comparable](duration time.Duration, cb GetElementFuncWithKey[K]) func() *Element { element := &Element{ tag: CachedNodeTag, @@ -94,6 +99,8 @@ type ByKeyEntry struct { parent *Element } +// CachedPerKeyT caches the given element for the given duration. The element is only rendered once per key, and then cached for the given duration. +// The element is cached by the unique identifier that is returned by the callback function. func CachedPerKeyT[K comparable, T any](duration time.Duration, cb GetElementFuncTWithKey[K, T]) func(T) *Element { element := &Element{ tag: CachedNodeTag, @@ -118,6 +125,8 @@ func CachedPerKeyT[K comparable, T any](duration time.Duration, cb GetElementFun } } +// CachedPerKeyT2 caches the given element for the given duration. The element is only rendered once per key, and then cached for the given duration. +// The element is cached by the unique identifier that is returned by the callback function. func CachedPerKeyT2[K comparable, T any, T2 any](duration time.Duration, cb GetElementFuncT2WithKey[K, T, T2]) func(T, T2) *Element { element := &Element{ tag: CachedNodeTag, @@ -142,6 +151,8 @@ func CachedPerKeyT2[K comparable, T any, T2 any](duration time.Duration, cb GetE } } +// CachedPerKeyT3 caches the given element for the given duration. The element is only rendered once per key, and then cached for the given duration. +// The element is cached by the unique identifier that is returned by the callback function. func CachedPerKeyT3[K comparable, T any, T2 any, T3 any](duration time.Duration, cb GetElementFuncT3WithKey[K, T, T2, T3]) func(T, T2, T3) *Element { element := &Element{ tag: CachedNodeTag, @@ -166,6 +177,8 @@ func CachedPerKeyT3[K comparable, T any, T2 any, T3 any](duration time.Duration, } } +// CachedPerKeyT4 caches the given element for the given duration. The element is only rendered once per key, and then cached for the given duration. +// The element is cached by the unique identifier that is returned by the callback function. func CachedPerKeyT4[K comparable, T any, T2 any, T3 any, T4 any](duration time.Duration, cb GetElementFuncT4WithKey[K, T, T2, T3, T4]) func(T, T2, T3, T4) *Element { element := &Element{ tag: CachedNodeTag, @@ -190,6 +203,9 @@ func CachedPerKeyT4[K comparable, T any, T2 any, T3 any, T4 any](duration time.D } } +// CachedT caches the given element for the given duration. The element is only rendered once, and then cached for the given duration. +// Please note this element is globally cached, and not per unique identifier / user. +// Use CachedPerKey to cache elements per unqiue identifier. func CachedT[T any](duration time.Duration, cb GetElementFuncT[T]) func(T) *Element { element := &Element{ tag: CachedNodeTag, @@ -208,6 +224,9 @@ func CachedT[T any](duration time.Duration, cb GetElementFuncT[T]) func(T) *Elem } } +// CachedT2 caches the given element for the given duration. The element is only rendered once, and then cached for the given duration. +// Please note this element is globally cached, and not per unique identifier / user. +// Use CachedPerKey to cache elements per unqiue identifier. func CachedT2[T any, T2 any](duration time.Duration, cb GetElementFuncT2[T, T2]) func(T, T2) *Element { element := &Element{ tag: CachedNodeTag, @@ -225,6 +244,9 @@ func CachedT2[T any, T2 any](duration time.Duration, cb GetElementFuncT2[T, T2]) } } +// CachedT3 caches the given element for the given duration. The element is only rendered once, and then cached for the given duration. +// Please note this element is globally cached, and not per unique identifier / user. +// Use CachedPerKey to cache elements per unqiue identifier. func CachedT3[T any, T2 any, T3 any](duration time.Duration, cb GetElementFuncT3[T, T2, T3]) func(T, T2, T3) *Element { element := &Element{ tag: CachedNodeTag, @@ -242,6 +264,9 @@ func CachedT3[T any, T2 any, T3 any](duration time.Duration, cb GetElementFuncT3 } } +// CachedT4 caches the given element for the given duration. The element is only rendered once, and then cached for the given duration. +// Please note this element is globally cached, and not per unique identifier / user. +// Use CachedPerKey to cache elements per unqiue identifier. func CachedT4[T any, T2 any, T3 any, T4 any](duration time.Duration, cb GetElementFuncT4[T, T2, T3, T4]) func(T, T2, T3, T4) *Element { element := &Element{ tag: CachedNodeTag, @@ -259,6 +284,7 @@ func CachedT4[T any, T2 any, T3 any, T4 any](duration time.Duration, cb GetEleme } } +// ClearCache clears the cached HTML of the element. This is called automatically by the framework. func (c *CachedNode) ClearCache() { c.html = "" if c.byKeyCache != nil { @@ -273,6 +299,7 @@ func (c *CachedNode) ClearCache() { } } +// ClearExpired clears all expired cached HTML of the element. This is called automatically by the framework. func (c *CachedNode) ClearExpired() { c.mutex.Lock() defer c.mutex.Unlock() diff --git a/framework/h/conditionals.go b/framework/h/conditionals.go index 7705b26..e0b4d0b 100644 --- a/framework/h/conditionals.go +++ b/framework/h/conditionals.go @@ -1,5 +1,6 @@ package h +// If returns the node if the condition is true, otherwise returns an empty element func If(condition bool, node Ren) Ren { if condition { return node @@ -8,10 +9,12 @@ func If(condition bool, node Ren) Ren { } } +// Ternary returns the first argument if the second argument is true, otherwise returns the third argument func Ternary[T any](value bool, a T, b T) T { return IfElse(value, a, b) } +// ElementIf returns the element if the condition is true, otherwise returns an empty element func ElementIf(condition bool, element *Element) *Element { if condition { return element @@ -20,6 +23,7 @@ func ElementIf(condition bool, element *Element) *Element { } } +// IfElseE returns element if condition is true, otherwise returns element2 func IfElseE(condition bool, element *Element, element2 *Element) *Element { if condition { return element @@ -28,6 +32,7 @@ func IfElseE(condition bool, element *Element, element2 *Element) *Element { } } +// IfElse returns node if condition is true, otherwise returns node2 func IfElse[T any](condition bool, node T, node2 T) T { if condition { return node @@ -36,6 +41,10 @@ func IfElse[T any](condition bool, node T, node2 T) T { } } +// IfElseLazy returns node if condition is true, otherwise returns the result of cb2 +// This is useful if you want to lazily evaluate a node based on a condition +// For example, If you are rendering a component that requires specific data, +// you can use this to only load the component if the data is available func IfElseLazy[T any](condition bool, cb1 func() T, cb2 func() T) T { if condition { return cb1() @@ -44,6 +53,7 @@ func IfElseLazy[T any](condition bool, cb1 func() T, cb2 func() T) T { } } +// IfHtmxRequest returns the node if the request is an htmx request, otherwise returns an empty element func IfHtmxRequest(ctx *RequestContext, node Ren) Ren { if ctx.isHxRequest { return node @@ -51,6 +61,7 @@ func IfHtmxRequest(ctx *RequestContext, node Ren) Ren { return Empty() } +// ClassIf returns the class attribute if the condition is true, otherwise returns an empty element func ClassIf(condition bool, value string) Ren { if condition { return Class(value) @@ -58,6 +69,7 @@ func ClassIf(condition bool, value string) Ren { return Empty() } +// AttributeIf returns the attribute if the condition is true, otherwise returns an empty element func AttributeIf(condition bool, name string, value string) Ren { if condition { return Attribute(name, value) diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index 295b50d..84d9dac 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -51,6 +51,7 @@ func (l *LifeCycle) OnEvent(event hx.Event, cmd ...Command) *LifeCycle { return l } +// OnLoad executes the given commands when the element is loaded into the DOM, it also executes when the element is replaced / swapped in. func OnLoad(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.LoadDomEvent, cmd...) } @@ -60,58 +61,73 @@ func (l *LifeCycle) HxBeforeRequest(cmd ...Command) *LifeCycle { return l } +// HxOnLoad executes the given commands when the element is loaded into the DOM. +// Deprecated: Use OnLoad instead. func HxOnLoad(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.LoadEvent, cmd...) } +// HxOnAfterSwap executes the given commands when the element is swapped in. func HxOnAfterSwap(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.AfterSwapEvent, cmd...) } +// OnClick executes the given commands when the element is clicked. func OnClick(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.ClickEvent, cmd...) } +// OnEvent executes the given commands when the given event is triggered. func OnEvent(event hx.Event, cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(event, cmd...) } +// HxBeforeSseMessage executes the given commands when a message is received from the server via SSE, but before it is processed. func HxBeforeSseMessage(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.SseBeforeMessageEvent, cmd...) } +// HxAfterSseMessage executes the given commands when a message is received from the server via SSE, and after it is processed. func HxAfterSseMessage(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.SseAfterMessageEvent, cmd...) } +// OnSubmit executes the given commands when the form is submitted. func OnSubmit(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.SubmitEvent, cmd...) } +// HxOnSseError executes the given commands when an error occurs while connecting to the server via SSE. func HxOnSseError(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.SseErrorEvent, cmd...) } +// HxOnSseClose executes the given commands when the connection to the server via SSE is closed. func HxOnSseClose(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.SseClosedEvent, cmd...) } +// HxOnSseConnecting executes the given commands when the connection to the server via SSE is being established. func HxOnSseConnecting(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.SseConnectingEvent, cmd...) } +// HxOnSseOpen executes the given commands when the connection to the server via SSE is established. func HxOnSseOpen(cmd ...Command) *LifeCycle { return NewLifeCycle().OnEvent(hx.SseConnectedEvent, cmd...) } +// HxBeforeRequest executes the given commands before the request is sent. func HxBeforeRequest(cmd ...Command) *LifeCycle { return NewLifeCycle().HxBeforeRequest(cmd...) } +// HxAfterRequest executes the given commands after the request is sent. func HxAfterRequest(cmd ...Command) *LifeCycle { return NewLifeCycle().HxAfterRequest(cmd...) } +// HxOnMutationError executes the given commands when a mutation error of a request occurs. func HxOnMutationError(cmd ...Command) *LifeCycle { return NewLifeCycle().HxOnMutationError(cmd...) } @@ -137,16 +153,19 @@ type ComplexJsCommand struct { TempFuncName string } +// NewComplexJsCommand creates a new complex JavaScript command. func NewComplexJsCommand(command string) ComplexJsCommand { name := fmt.Sprintf("__eval_%s", util.RandSeq(6)) return ComplexJsCommand{Command: command, TempFuncName: name} } +// SetText sets the inner text of the element. func SetText(text string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.innerText = '%s'", text)} } +// SetTextOnChildren sets the inner text of all the children of the element that match the selector. func SetTextOnChildren(selector, text string) ComplexJsCommand { // language=JavaScript return EvalJs(fmt.Sprintf(` @@ -157,26 +176,31 @@ func SetTextOnChildren(selector, text string) ComplexJsCommand { `, selector, text)) } +// Increment increments the inner text of the element by the given amount. func Increment(amount int) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.innerText = parseInt(this.innerText) + %d", amount)} } +// SetInnerHtml sets the inner HTML of the element. func SetInnerHtml(r Ren) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.innerHTML = `%s`", Render(r))} } +// SetOuterHtml sets the outer HTML of the element. func SetOuterHtml(r Ren) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.outerHTML = `%s`", Render(r))} } +// AddAttribute adds the given attribute to the element. func AddAttribute(name, value string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.setAttribute('%s', '%s')", name, value)} } +// SetDisabled sets the disabled attribute on the element. func SetDisabled(disabled bool) SimpleJsCommand { if disabled { return AddAttribute("disabled", "true") @@ -185,26 +209,31 @@ func SetDisabled(disabled bool) SimpleJsCommand { } } +// RemoveAttribute removes the given attribute from the element. func RemoveAttribute(name string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.removeAttribute('%s')", name)} } +// AddClass adds the given class to the element. func AddClass(class string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.classList.add('%s')", class)} } +// RemoveClass removes the given class from the element. func RemoveClass(class string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.classList.remove('%s')", class)} } +// ToggleClass toggles the given class on the element. func ToggleClass(class string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.classList.toggle('%s')", class)} } +// ToggleClassOnElement toggles the given class on the elements returned by the selector. func ToggleClassOnElement(selector, class string) ComplexJsCommand { // language=JavaScript return EvalJs(fmt.Sprintf(` @@ -214,6 +243,7 @@ func ToggleClassOnElement(selector, class string) ComplexJsCommand { )) } +// EvalJsOnParent evaluates the given JavaScript code on the parent of the element. Reference the element using 'element'. func EvalJsOnParent(js string) ComplexJsCommand { // language=JavaScript return EvalJs(fmt.Sprintf(` @@ -223,6 +253,7 @@ func EvalJsOnParent(js string) ComplexJsCommand { `, js)) } +// EvalJsOnChildren evaluates the given JavaScript code on the children of the element. Reference the element using 'element'. func EvalJsOnChildren(selector, js string) ComplexJsCommand { // language=JavaScript return EvalJs(fmt.Sprintf(` @@ -233,6 +264,7 @@ func EvalJsOnChildren(selector, js string) ComplexJsCommand { `, selector, js)) } +// EvalJsOnSibling evaluates the given JavaScript code on the siblings of the element. Reference the element using 'element'. func EvalJsOnSibling(selector, js string) ComplexJsCommand { // language=JavaScript return EvalJs(fmt.Sprintf(` @@ -244,66 +276,79 @@ func EvalJsOnSibling(selector, js string) ComplexJsCommand { `, selector, js)) } +// SetClassOnParent sets the given class on the parent of the element. Reference the element using 'element'. func SetClassOnParent(class string) ComplexJsCommand { // language=JavaScript return EvalJsOnParent(fmt.Sprintf("element.classList.add('%s')", class)) } +// RemoveClassOnParent removes the given class from the parent of the element. Reference the element using 'element'. func RemoveClassOnParent(class string) ComplexJsCommand { // language=JavaScript return EvalJsOnParent(fmt.Sprintf("element.classList.remove('%s')", class)) } +// SetClassOnChildren sets the given class on the children of the element. Reference the element using 'element'. func SetClassOnChildren(selector, class string) ComplexJsCommand { // language=JavaScript return EvalJsOnChildren(selector, fmt.Sprintf("element.classList.add('%s')", class)) } +// SetClassOnSibling sets the given class on the siblings of the element. Reference the element using 'element'. func SetClassOnSibling(selector, class string) ComplexJsCommand { // language=JavaScript return EvalJsOnSibling(selector, fmt.Sprintf("element.classList.add('%s')", class)) } +// RemoveClassOnSibling removes the given class from the siblings of the element. Reference the element using 'element'. func RemoveClassOnSibling(selector, class string) ComplexJsCommand { // language=JavaScript return EvalJsOnSibling(selector, fmt.Sprintf("element.classList.remove('%s')", class)) } +// RemoveClassOnChildren removes the given class from the children of the element. Reference the element using 'element'. func RemoveClassOnChildren(selector, class string) ComplexJsCommand { // language=JavaScript return EvalJsOnChildren(selector, fmt.Sprintf("element.classList.remove('%s')", class)) } +// Alert displays an alert dialog with the given text. func Alert(text string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("alert('%s')", text)} } +// Remove removes the element from the DOM. func Remove() SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: "this.remove()"} } +// EvalJs evaluates the given JavaScript code. func EvalJs(js string) ComplexJsCommand { return NewComplexJsCommand(js) } +// PreventDefault prevents the default action of the event. func PreventDefault() SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: "event.preventDefault()"} } +// ConsoleLog logs a message to the console. func ConsoleLog(text string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("console.log('%s')", text)} } +// SetValue sets the value of the element. func SetValue(value string) SimpleJsCommand { // language=JavaScript return SimpleJsCommand{Command: fmt.Sprintf("this.value = '%s'", value)} } +// SubmitFormOnEnter submits the form when the user presses the enter key. func SubmitFormOnEnter() ComplexJsCommand { // language=JavaScript return EvalJs(` @@ -316,6 +361,7 @@ func SubmitFormOnEnter() ComplexJsCommand { `) } +// InjectScript injects a script tag into the document. func InjectScript(src string) ComplexJsCommand { // language=JavaScript return NewComplexJsCommand(fmt.Sprintf(` @@ -326,6 +372,7 @@ func InjectScript(src string) ComplexJsCommand { `, src)) } +// InjectScriptIfNotExist injects a script tag into the document if it does not already exist. func InjectScriptIfNotExist(src string) ComplexJsCommand { // language=JavaScript return EvalJs(fmt.Sprintf(` diff --git a/framework/h/qs.go b/framework/h/qs.go index 75fad83..b99d7ea 100644 --- a/framework/h/qs.go +++ b/framework/h/qs.go @@ -48,6 +48,13 @@ func (q *Qs) ToString() string { return builder.String() } +// GetQueryParam returns the value of the given query parameter from the request URL. +// There are two layers of priority: +// 1. The query parameter in the URL +// 2. The current browser URL +// If the query parameter is not found in the URL from the *RequestContext, it will fall back to the current browser URL if set. +// The URL from the *RequestContext would normally be the url from an XHR request through htmx, +// which is not the current browser url a visitor may be on. func GetQueryParam(ctx *RequestContext, key string) string { value, ok := ctx.Request.URL.Query()[key] if value == nil || !ok { @@ -65,6 +72,11 @@ func GetQueryParam(ctx *RequestContext, key string) string { return value[0] } +// SetQueryParams sets the query parameters of the given URL. +// Given the *Qs passed in, it will set the query parameters of the URL to the given values. +// If the value does not exist in *QS, it will remain untouched. +// If the value is an empty string, it will be removed from the query parameters. +// If the value is not an empty string, it will be set to the given value. func SetQueryParams(href string, qs *Qs) string { u, err := url.Parse(href) if err != nil { diff --git a/framework/h/render.go b/framework/h/render.go index aa37dd5..4570708 100644 --- a/framework/h/render.go +++ b/framework/h/render.go @@ -8,6 +8,7 @@ type Ren interface { Render(context *RenderContext) } +// Render renders the given node recursively, and returns the resulting string. func Render(node Ren) string { builder := &strings.Builder{} context := &RenderContext{ diff --git a/framework/h/serialize.go b/framework/h/serialize.go index eb35418..0bc2c11 100644 --- a/framework/h/serialize.go +++ b/framework/h/serialize.go @@ -4,6 +4,7 @@ import ( "encoding/json" ) +// JsonSerializeOrEmpty serializes the given data as JSON, or returns an empty string if the serialization fails. func JsonSerializeOrEmpty(data any) string { serialized, err := json.Marshal(data) if err != nil { diff --git a/framework/h/xhr.go b/framework/h/xhr.go index 1c707e1..ed3e999 100644 --- a/framework/h/xhr.go +++ b/framework/h/xhr.go @@ -5,22 +5,27 @@ import ( "strings" ) +// Get adds two attributes to the element: hx-get and hx-trigger. func Get(path string, trigger ...string) *AttributeMapOrdered { return AttributeList(Attribute(hx.GetAttr, path), HxTriggerString(trigger...)) } +// GetPartial adds two attributes to the element: hx-get and hx-trigger, and uses the partial path for the hx-get attribute. func GetPartial(partial PartialFunc, trigger ...string) *AttributeMapOrdered { return Get(GetPartialPath(partial), trigger...) } +// GetPartialWithQs adds two attributes to the element: hx-get and hx-trigger, and uses the partial path for the hx-get attribute. It also sets the query string parameters. func GetPartialWithQs(partial PartialFunc, qs *Qs, trigger string) *AttributeMapOrdered { return Get(GetPartialPathWithQs(partial, qs), trigger) } +// GetWithQs adds two attributes to the element: hx-get and hx-trigger, and uses the path for the hx-get attribute. It also sets the query string parameters. func GetWithQs(path string, qs *Qs, trigger string) *AttributeMapOrdered { return Get(SetQueryParams(path, qs), trigger) } +// PostPartial adds two attributes to the element: hx-post and hx-trigger, and uses the partial path for the hx-post attribute. func PostPartial(partial PartialFunc, triggers ...string) *AttributeMapOrdered { path := GetPartialPath(partial) if !strings.HasPrefix(path, "/") { @@ -29,6 +34,7 @@ func PostPartial(partial PartialFunc, triggers ...string) *AttributeMapOrdered { return Post(path, triggers...) } +// PostPartialWithQs adds two attributes to the element: hx-post and hx-trigger, and uses the partial path for the hx-post attribute. It also sets the query string parameters. func PostPartialWithQs(partial PartialFunc, qs *Qs, trigger ...string) *AttributeMapOrdered { path := GetPartialPathWithQs(partial, qs) if !strings.HasPrefix(path, "/") { @@ -41,18 +47,22 @@ func Post(url string, trigger ...string) *AttributeMapOrdered { return AttributeList(Attribute(hx.PostAttr, url), HxTriggerString(trigger...)) } +// PostWithQs adds two attributes to the element: hx-post and hx-trigger, and uses the path for the hx-post attribute. It also sets the query string parameters. func PostWithQs(url string, qs *Qs, trigger string) *AttributeMapOrdered { return Post(SetQueryParams(url, qs), trigger) } +// PostOnClick adds two attributes to the element: hx-post and hx-trigger, and uses the path for the hx-post attribute. It also sets the hx-trigger to hx-click. func PostOnClick(url string) *AttributeMapOrdered { return Post(url, hx.ClickEvent) } +// PostPartialOnClick adds two attributes to the element: hx-post and hx-trigger, and uses the partial path for the hx-post attribute. It also sets the hx-trigger to hx-click. func PostPartialOnClick(partial PartialFunc) *AttributeMapOrdered { return PostOnClick(GetPartialPath(partial)) } +// PostPartialOnClickQs adds two attributes to the element: hx-post and hx-trigger, and uses the partial path for the hx-post attribute. It also sets the hx-trigger to hx-click. It also sets the query string parameters. func PostPartialOnClickQs(partial PartialFunc, qs *Qs) *AttributeMapOrdered { return PostOnClick(GetPartialPathWithQs(partial, qs)) } From 64b0435c86f0e1d82c0f5e0c3891ef46a335af69 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 26 Oct 2024 03:02:02 +0000 Subject: [PATCH 061/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 10cece9..c9833e7 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 + github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index e84281e..fdbe797 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 741c20e..58bade8 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index f050d04..981f470 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index d41f1b9..10956e6 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 + github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 9814172..f29f490 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 9d1467e..4d095a2 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 + github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 6ebdaf9..356a1c7 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 8c49a12..1550b1c 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index f050d04..981f470 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 5083b4a..9d8e270 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025174132-df3edccd7fb0 + github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030104-3468baaa8404 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 76197bb..53c98c6 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025174132-df3edccd7fb0 h1:U57+3oRD+uGrc9Aapi/Ol1ZzRuCY2s0diK0pxWtIZeU= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241025174132-df3edccd7fb0/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030104-3468baaa8404 h1:7JMy8CltHpdcDdTndJHWj0RKJU8nvDbawUqoKEeKDfU= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030104-3468baaa8404/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 437362f..1d49ee5 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index f050d04..981f470 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0 h1:K9Q5b7BmbpCPJFjrAHS8+wPdKDcZN9NMC3Fg51n5IaQ= -github.com/maddalax/htmgo/framework v1.0.2-0.20241025174132-df3edccd7fb0/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 2f35c08afd64ea91557078ae2ce87e1b06bcd438 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 25 Oct 2024 22:06:58 -0500 Subject: [PATCH 062/137] comments about the service locator --- framework/service/locator.go | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/framework/service/locator.go b/framework/service/locator.go index 3cc79d4..f38f70e 100644 --- a/framework/service/locator.go +++ b/framework/service/locator.go @@ -24,6 +24,13 @@ type Locator struct { mutex sync.RWMutex } +// NewLocator creates a new locator to register services +// Usage: +// +// locator := service.NewLocator() +// service.Set[db.Queries](locator, service.Singleton, db.Provide) +// +// service.Get[db.Queries](locator) func NewLocator() *Locator { return &Locator{ services: make(map[string]Provider), @@ -44,6 +51,9 @@ func (l *Locator) getCache(key string) any { return l.cache[key] } +// Get returns a service from the locator +// If the service is not found, log.Fatalf is called +// If the service is a singleton, it will be cached after first invocation func Get[T any](locator *Locator) *T { locator.mutex.RLock() i := new(T) @@ -70,6 +80,8 @@ func Get[T any](locator *Locator) *T { return cb } +// Set registers a service with the locator +// If the service is a singleton, it will be cached after first invocation of Get func Set[T any](locator *Locator, lifecycle Lifecycle, value func() *T) { t := reflect.TypeOf(value) rt := t.Out(0) From 816cb679c7fe77a39711fa6e8dce13f007686020 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 26 Oct 2024 03:07:52 +0000 Subject: [PATCH 063/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index c9833e7..6dfca37 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 + github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index fdbe797..5aafa25 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 58bade8..f8b710b 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,7 +2,7 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 981f470..9e59b50 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 10956e6..b397815 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 + github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index f29f490..cc3c308 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 4d095a2..02ff130 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 + github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 356a1c7..6a5a310 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 1550b1c..75752ae 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 981f470..9e59b50 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 9d8e270..87f471f 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030104-3468baaa8404 + github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030703-8e048cbddc36 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 53c98c6..e0004fc 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030104-3468baaa8404 h1:7JMy8CltHpdcDdTndJHWj0RKJU8nvDbawUqoKEeKDfU= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030104-3468baaa8404/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030703-8e048cbddc36 h1:+0JsDADIFV1acxC+kcDSpiSz5Z9nvLDqGhC17+Z2duU= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030703-8e048cbddc36/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 1d49ee5..546f5cc 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 981f470..9e59b50 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404 h1:NGFJzIasJ/JArKvTvmCYCx22l1H+Q4bSESgnKo24DOM= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030104-3468baaa8404/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= +github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 3d4f3a9a7718408152f20758e5060a0f9e2f9658 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 09:14:33 -0500 Subject: [PATCH 064/137] remove unsafe --- examples/hackernews/partials/comments.go | 4 ++-- examples/hackernews/partials/sidebar.go | 2 +- examples/hackernews/partials/story.go | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/hackernews/partials/comments.go b/examples/hackernews/partials/comments.go index 95ce923..270959a 100644 --- a/examples/hackernews/partials/comments.go +++ b/examples/hackernews/partials/comments.go @@ -75,7 +75,7 @@ func Comment(item news.Comment, nesting int) *h.Element { h.Class("flex gap-1 items-center"), h.Div( h.Class("font-bold text-rose-500"), - h.UnsafeRaw(item.By), + h.Text(item.By), ), h.Div( h.Class("text-sm text-gray-600"), @@ -85,7 +85,7 @@ func Comment(item news.Comment, nesting int) *h.Element { ), h.Div( h.Class("text-sm text-gray-600"), - h.UnsafeRaw(strings.TrimSpace(item.Text)), + h.Text(strings.TrimSpace(item.Text)), ), ), h.If( diff --git a/examples/hackernews/partials/sidebar.go b/examples/hackernews/partials/sidebar.go index d3bbef0..8dbba45 100644 --- a/examples/hackernews/partials/sidebar.go +++ b/examples/hackernews/partials/sidebar.go @@ -142,7 +142,7 @@ var CachedStoryList = h.CachedPerKeyT4(time.Minute*5, func(category string, page h.Class("block p-2 bg-white rounded-md shadow cursor-pointer"), h.Div( h.Class("font-bold"), - h.UnsafeRaw(item.Title), + h.Text(item.Title), ), h.Div( h.Class("text-sm text-gray-600"), diff --git a/examples/hackernews/partials/story.go b/examples/hackernews/partials/story.go index 8b72272..4bea202 100644 --- a/examples/hackernews/partials/story.go +++ b/examples/hackernews/partials/story.go @@ -57,7 +57,7 @@ func StoryBody(story *news.Story) *h.Element { h.Class("prose prose-2xl border-b border-gray-200 pb-3 max-w-none w-full"), h.H5( h.Class("flex gap-2 items-left font-bold"), - h.UnsafeRaw(story.Title), + h.Text(story.Title), ), h.A( h.Href(story.Url), @@ -66,7 +66,7 @@ func StoryBody(story *news.Story) *h.Element { ), h.Div( h.Class("text-sm text-gray-600"), - h.UnsafeRaw(story.Text), + h.Text(story.Text), ), h.Div( h.Class("text-sm text-gray-600 mt-2"), From 7b10b20b9e7c106a7a2ebc4745f720ff730f2feb Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 09:32:26 -0500 Subject: [PATCH 065/137] santize --- examples/hackernews/go.mod | 10 ++++++++-- examples/hackernews/go.sum | 6 ++++++ examples/hackernews/internal/sanitize/sanitize.go | 9 +++++++++ examples/hackernews/partials/comments.go | 5 +++-- examples/hackernews/partials/sidebar.go | 3 ++- examples/hackernews/partials/story.go | 5 +++-- 6 files changed, 31 insertions(+), 7 deletions(-) create mode 100644 examples/hackernews/internal/sanitize/sanitize.go diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index f8b710b..0c91ab8 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -2,9 +2,15 @@ module hackernews go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 +require ( + github.com/go-chi/chi/v5 v5.1.0 + github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 + github.com/microcosm-cc/bluemonday v1.0.27 +) require ( - github.com/go-chi/chi/v5 v5.1.0 // indirect + github.com/aymerick/douceur v0.2.0 // indirect github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/css v1.0.1 // indirect + golang.org/x/net v0.29.0 // indirect ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 9e59b50..80cb8b9 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -1,11 +1,17 @@ +github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= +github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= +github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= +github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/examples/hackernews/internal/sanitize/sanitize.go b/examples/hackernews/internal/sanitize/sanitize.go new file mode 100644 index 0000000..83aec98 --- /dev/null +++ b/examples/hackernews/internal/sanitize/sanitize.go @@ -0,0 +1,9 @@ +package sanitize + +import "github.com/microcosm-cc/bluemonday" + +var p = bluemonday.UGCPolicy() + +func Sanitize(text string) string { + return p.Sanitize(text) +} diff --git a/examples/hackernews/partials/comments.go b/examples/hackernews/partials/comments.go index 270959a..0a102ae 100644 --- a/examples/hackernews/partials/comments.go +++ b/examples/hackernews/partials/comments.go @@ -5,6 +5,7 @@ import ( "github.com/maddalax/htmgo/framework/h" "hackernews/internal/batch" "hackernews/internal/news" + "hackernews/internal/sanitize" "hackernews/internal/timeformat" "strings" "time" @@ -75,7 +76,7 @@ func Comment(item news.Comment, nesting int) *h.Element { h.Class("flex gap-1 items-center"), h.Div( h.Class("font-bold text-rose-500"), - h.Text(item.By), + h.UnsafeRaw(sanitize.Sanitize(item.By)), ), h.Div( h.Class("text-sm text-gray-600"), @@ -85,7 +86,7 @@ func Comment(item news.Comment, nesting int) *h.Element { ), h.Div( h.Class("text-sm text-gray-600"), - h.Text(strings.TrimSpace(item.Text)), + h.UnsafeRaw(sanitize.Sanitize(strings.TrimSpace(item.Text))), ), ), h.If( diff --git a/examples/hackernews/partials/sidebar.go b/examples/hackernews/partials/sidebar.go index 8dbba45..187a06c 100644 --- a/examples/hackernews/partials/sidebar.go +++ b/examples/hackernews/partials/sidebar.go @@ -6,6 +6,7 @@ import ( "hackernews/components" "hackernews/internal/news" "hackernews/internal/parse" + "hackernews/internal/sanitize" "hackernews/internal/timeformat" "time" ) @@ -142,7 +143,7 @@ var CachedStoryList = h.CachedPerKeyT4(time.Minute*5, func(category string, page h.Class("block p-2 bg-white rounded-md shadow cursor-pointer"), h.Div( h.Class("font-bold"), - h.Text(item.Title), + h.UnsafeRaw(sanitize.Sanitize(item.Title)), ), h.Div( h.Class("text-sm text-gray-600"), diff --git a/examples/hackernews/partials/story.go b/examples/hackernews/partials/story.go index 4bea202..a4b0f10 100644 --- a/examples/hackernews/partials/story.go +++ b/examples/hackernews/partials/story.go @@ -4,6 +4,7 @@ import ( "fmt" "github.com/maddalax/htmgo/framework/h" "hackernews/internal/news" + "hackernews/internal/sanitize" "hackernews/internal/timeformat" "time" ) @@ -57,7 +58,7 @@ func StoryBody(story *news.Story) *h.Element { h.Class("prose prose-2xl border-b border-gray-200 pb-3 max-w-none w-full"), h.H5( h.Class("flex gap-2 items-left font-bold"), - h.Text(story.Title), + h.UnsafeRaw(sanitize.Sanitize(story.Title)), ), h.A( h.Href(story.Url), @@ -66,7 +67,7 @@ func StoryBody(story *news.Story) *h.Element { ), h.Div( h.Class("text-sm text-gray-600"), - h.Text(story.Text), + h.UnsafeRaw(sanitize.Sanitize(story.Text)), ), h.Div( h.Class("text-sm text-gray-600 mt-2"), From db0888453a2471dbd6df785d7ed9d1e6b41a77b7 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 09:38:57 -0500 Subject: [PATCH 066/137] sanitize at the data layer too --- examples/hackernews/internal/news/news.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/hackernews/internal/news/news.go b/examples/hackernews/internal/news/news.go index 1b0c778..cd89762 100644 --- a/examples/hackernews/internal/news/news.go +++ b/examples/hackernews/internal/news/news.go @@ -5,6 +5,7 @@ import ( "github.com/maddalax/htmgo/framework/h" "hackernews/internal/batch" "hackernews/internal/httpjson" + "hackernews/internal/sanitize" "hackernews/internal/timeformat" "log/slog" "strconv" @@ -132,6 +133,8 @@ func GetComment(id int) (*Comment, error) { if err != nil { return nil, err } + c.Text = sanitize.Sanitize(c.Text) + c.By = sanitize.Sanitize(c.By) c.Time = timeformat.ParseUnix(c.TimeRaw) return c, nil } @@ -141,6 +144,9 @@ func GetStory(id int) (*Story, error) { if err != nil { return nil, err } + s.Title = sanitize.Sanitize(s.Title) + s.Text = sanitize.Sanitize(s.Text) + s.By = sanitize.Sanitize(s.By) s.Time = timeformat.ParseUnix(s.TimeRaw) return s, nil } From 8feb717d918a1a227735df4ff81fdf7bdc14deeb Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 14:56:51 -0500 Subject: [PATCH 067/137] quick mobile fix --- htmgo-site/pages/markdown.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/pages/markdown.go b/htmgo-site/pages/markdown.go index 8f2fcbb..9ade2ce 100644 --- a/htmgo-site/pages/markdown.go +++ b/htmgo-site/pages/markdown.go @@ -25,7 +25,7 @@ func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { h.Id(id), ), h.Div( - h.Class("w-full flex flex-col prose max-w-md md:max-w-xl lg:max-w-4xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), + h.Class("w-full flex flex-col prose max-w-sm md:max-w-xl lg:max-w-4xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), h.UnsafeRaw(renderer.RenderFile(path, embeddedMd)), ), ) From 5ee5d956f076668fe1b2d585c99297d080b3c026 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 15:15:31 -0500 Subject: [PATCH 068/137] fix max width --- htmgo-site/internal/markdown/render.go | 1 + htmgo-site/pages/markdown.go | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/htmgo-site/internal/markdown/render.go b/htmgo-site/internal/markdown/render.go index 0c8f216..edfa40e 100644 --- a/htmgo-site/internal/markdown/render.go +++ b/htmgo-site/internal/markdown/render.go @@ -51,6 +51,7 @@ func RenderMarkdown(reader io.Reader) bytes.Buffer { ), goldmark.WithRendererOptions( html.WithUnsafe(), + html.WithHardWraps(), ), goldmark.WithExtensions( highlighting.NewHighlighting( diff --git a/htmgo-site/pages/markdown.go b/htmgo-site/pages/markdown.go index 9ade2ce..7005c6d 100644 --- a/htmgo-site/pages/markdown.go +++ b/htmgo-site/pages/markdown.go @@ -25,7 +25,7 @@ func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { h.Id(id), ), h.Div( - h.Class("w-full flex flex-col prose max-w-sm md:max-w-xl lg:max-w-4xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), + h.Class("w-full flex flex-col prose max-w-[90vw] md:max-w-3xl lg:max-w-4xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), h.UnsafeRaw(renderer.RenderFile(path, embeddedMd)), ), ) From 62599c22eace9582b8c62b38c77e8bb951d315b2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 15:26:23 -0500 Subject: [PATCH 069/137] some more fixes --- htmgo-site/internal/markdown/render.go | 4 ++++ htmgo-site/pages/markdown.go | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/htmgo-site/internal/markdown/render.go b/htmgo-site/internal/markdown/render.go index edfa40e..97168af 100644 --- a/htmgo-site/internal/markdown/render.go +++ b/htmgo-site/internal/markdown/render.go @@ -11,10 +11,12 @@ import ( "github.com/yuin/goldmark/renderer/html" "io" "io/fs" + "sync" ) type Renderer struct { cache map[string]string + lock sync.Mutex } func NewRenderer() *Renderer { @@ -22,6 +24,8 @@ func NewRenderer() *Renderer { } func (r *Renderer) RenderFile(source string, system fs.FS) string { + r.lock.Lock() + defer r.lock.Unlock() if val, ok := r.cache[source]; ok { return val } diff --git a/htmgo-site/pages/markdown.go b/htmgo-site/pages/markdown.go index 7005c6d..26d4779 100644 --- a/htmgo-site/pages/markdown.go +++ b/htmgo-site/pages/markdown.go @@ -25,7 +25,7 @@ func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { h.Id(id), ), h.Div( - h.Class("w-full flex flex-col prose max-w-[90vw] md:max-w-3xl lg:max-w-4xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), + h.Class("w-full flex flex-col prose max-w-[90vw] md:max-w-xl md:px-4 lg:max-w-4xl xl:max-w-5xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), h.UnsafeRaw(renderer.RenderFile(path, embeddedMd)), ), ) From 0c6a8d7d150f68849440c92c4c6dfba34bfbcce0 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 16:45:47 -0500 Subject: [PATCH 070/137] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index d9b1bae..9396556 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,8 @@ ![Build](https://github.com/maddalax/htmgo/actions/workflows/run-framework-tests.yml/badge.svg) +looking for a python version? check out: https://fastht.ml + **introduction:** htmgo is a lightweight pure go way to build interactive websites / web applications using go & htmx. From 4693820820777b437df67f7c2723148d5a3c9728 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 16:55:15 -0500 Subject: [PATCH 071/137] more css fixes --- htmgo-site/pages/markdown.go | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/htmgo-site/pages/markdown.go b/htmgo-site/pages/markdown.go index 26d4779..4add435 100644 --- a/htmgo-site/pages/markdown.go +++ b/htmgo-site/pages/markdown.go @@ -16,7 +16,7 @@ func MarkdownPage(ctx *h.RequestContext, path string, id string) *h.Element { ) } -func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { +func MarkdownContent(ctx *h.RequestContext, path string, id string, additionalClasses ...string) *h.Element { embeddedMd := ctx.Get("embeddedMarkdown").(fs.FS) renderer := service.Get[markdown.Renderer](ctx.ServiceLocator()) return h.Div( @@ -25,7 +25,10 @@ func MarkdownContent(ctx *h.RequestContext, path string, id string) *h.Element { h.Id(id), ), h.Div( - h.Class("w-full flex flex-col prose max-w-[90vw] md:max-w-xl md:px-4 lg:max-w-4xl xl:max-w-5xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0"), + h.Class( + "w-full flex flex-col prose max-w-[90vw] md:max-w-[65vw] xl:max-w-4xl prose-code:text-black prose-p:my-1 prose:p-0 prose-li:m-0 prose-ul:m-0 prose-ol:m-0", + h.MergeClasses(additionalClasses...), + ), h.UnsafeRaw(renderer.RenderFile(path, embeddedMd)), ), ) From b218a75ea84498b8274bb328a3b4c10dd2708241 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 17:08:55 -0500 Subject: [PATCH 072/137] add related projects --- htmgo-site/md/docs/1_quick-start/3_related_projects.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 htmgo-site/md/docs/1_quick-start/3_related_projects.md diff --git a/htmgo-site/md/docs/1_quick-start/3_related_projects.md b/htmgo-site/md/docs/1_quick-start/3_related_projects.md new file mode 100644 index 0000000..43eabb1 --- /dev/null +++ b/htmgo-site/md/docs/1_quick-start/3_related_projects.md @@ -0,0 +1,6 @@ +## Other languages and related projects + +If you are not a Go user but are interested in the idea of what htmgo is, you might want to check out these other projects: + +#### Python +- [fastht.ml](https://fastht.ml/) - Modern web applications in pure Python, Built on solid web foundations, not the latest fads - with FastHTML you can get started on anything from simple dashboards to scalable web applications in minutes. From 2726c6060814ba56f17ae0291dee637578c1d730 Mon Sep 17 00:00:00 2001 From: maddalax Date: Sat, 26 Oct 2024 21:41:21 -0500 Subject: [PATCH 073/137] set charset on html content type --- framework/h/app.go | 2 +- htmgo-site/md/docs/1_quick-start/3_related_projects.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/framework/h/app.go b/framework/h/app.go index 40e62af..3c095a5 100644 --- a/framework/h/app.go +++ b/framework/h/app.go @@ -251,7 +251,7 @@ func writeHtml(w http.ResponseWriter, element Ren) error { if element == nil { return nil } - w.Header().Set("Content-Type", "text/html") + w.Header().Set("Content-Type", "text/html; charset=utf-8") _, err := fmt.Fprint(w, Render(element, WithDocType())) return err } diff --git a/htmgo-site/md/docs/1_quick-start/3_related_projects.md b/htmgo-site/md/docs/1_quick-start/3_related_projects.md index 43eabb1..d48f151 100644 --- a/htmgo-site/md/docs/1_quick-start/3_related_projects.md +++ b/htmgo-site/md/docs/1_quick-start/3_related_projects.md @@ -1,6 +1,6 @@ ## Other languages and related projects -If you are not a Go user but are interested in the idea of what htmgo is, you might want to check out these other projects: +If you're not a Go user but are interested in the idea of what htmgo is, you might want to check out these other projects: #### Python - [fastht.ml](https://fastht.ml/) - Modern web applications in pure Python, Built on solid web foundations, not the latest fads - with FastHTML you can get started on anything from simple dashboards to scalable web applications in minutes. From 864d2ed3ba728aab0e1f6fc18710df480476c024 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sun, 27 Oct 2024 02:42:14 +0000 Subject: [PATCH 074/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 4 ++-- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 25 insertions(+), 25 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 6dfca37..0a0c124 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 + github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 5aafa25..273646e 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 0c91ab8..ac49b03 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,13 +3,13 @@ module hackernews go 1.23.0 require ( - github.com/go-chi/chi/v5 v5.1.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 + github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 github.com/microcosm-cc/bluemonday v1.0.27 ) require ( github.com/aymerick/douceur v0.2.0 // indirect + github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/css v1.0.1 // indirect golang.org/x/net v0.29.0 // indirect diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 80cb8b9..fe80f38 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index b397815..10acc54 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 + github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index cc3c308..0472b06 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 02ff130..778b1de 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 + github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 6a5a310..c17984c 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 75752ae..ed83e04 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 9e59b50..48cb33a 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 87f471f..ec45e7d 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030703-8e048cbddc36 + github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241027024121-2726c6060814 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index e0004fc..7d69bf6 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030703-8e048cbddc36 h1:+0JsDADIFV1acxC+kcDSpiSz5Z9nvLDqGhC17+Z2duU= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241026030703-8e048cbddc36/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241027024121-2726c6060814 h1:cwbsxPgdjCR/cwksucYT6vLbN/YpstVnSzuINAUd4Eo= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241027024121-2726c6060814/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 546f5cc..667c807 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 9e59b50..48cb33a 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36 h1:cwXqeTQrGAxMhGhpMJ3/sUGRvdDm3HWPNO5ayYzoRcU= -github.com/maddalax/htmgo/framework v1.0.2-0.20241026030703-8e048cbddc36/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= +github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 42febeb65498d18fe1288bdbe5269b80dd81071a Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 10:32:50 -0500 Subject: [PATCH 075/137] snippets view testing / cleanup --- htmgo-site/htmgo.yml | 4 + htmgo-site/pages/base/root.go | 71 ----------- htmgo-site/pages/docs.go | 7 +- htmgo-site/pages/examples.go | 43 +++---- htmgo-site/pages/html-to-go.go | 25 ++-- htmgo-site/pages/index.go | 53 ++++---- htmgo-site/pages/root.go | 72 +++++++++++ htmgo-site/pages/snippets/code.go | 38 ++++++ htmgo-site/pages/snippets/data.go | 22 ++++ htmgo-site/pages/snippets/form.go | 10 ++ htmgo-site/pages/snippets/index.go | 120 ++++++++++++++++++ htmgo-site/pages/snippets/sidebar.go | 31 +++++ htmgo-site/pages/snippets/snippets.go | 17 +++ htmgo-site/pages/test.go | 56 ++++---- htmgo-site/pages/time.go | 14 +- .../partials/{sidebar.go => doc-sidebar.go} | 2 +- htmgo-site/partials/form.go | 15 --- .../{pages => partials/snippets}/form.go | 62 ++++----- htmgo-site/ui/snippet.go | 8 +- 19 files changed, 442 insertions(+), 228 deletions(-) delete mode 100644 htmgo-site/pages/base/root.go create mode 100644 htmgo-site/pages/root.go create mode 100644 htmgo-site/pages/snippets/code.go create mode 100644 htmgo-site/pages/snippets/data.go create mode 100644 htmgo-site/pages/snippets/form.go create mode 100644 htmgo-site/pages/snippets/index.go create mode 100644 htmgo-site/pages/snippets/sidebar.go create mode 100644 htmgo-site/pages/snippets/snippets.go rename htmgo-site/partials/{sidebar.go => doc-sidebar.go} (94%) delete mode 100644 htmgo-site/partials/form.go rename htmgo-site/{pages => partials/snippets}/form.go (52%) diff --git a/htmgo-site/htmgo.yml b/htmgo-site/htmgo.yml index d60d2ff..e9a1f41 100644 --- a/htmgo-site/htmgo.yml +++ b/htmgo-site/htmgo.yml @@ -8,3 +8,7 @@ watch_ignore: [".git", "node_modules", "dist/*"] # files to watch for changes, supports glob patterns through https://github.com/bmatcuk/doublestar watch_files: ["**/*.go", "**/*.css", "**/*.md"] + +# files or directories to ignore when automatically registering routes for pages +# supports glob patterns through https://github.com/bmatcuk/doublestar +automatic_page_routing_ignore: ["root.go"] diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go deleted file mode 100644 index 54d7a3c..0000000 --- a/htmgo-site/pages/base/root.go +++ /dev/null @@ -1,71 +0,0 @@ -package base - -import ( - "github.com/google/uuid" - "github.com/maddalax/htmgo/framework/h" - "htmgo-site/partials" -) - -var Version = uuid.NewString()[0:6] - -func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Element { - title := "htmgo" - description := "build simple and scalable systems with go + htmx" - - return h.Html( - h.HxExtension( - h.BaseExtensions(), - ), - h.Head( - h.Meta("viewport", "width=device-width, initial-scale=1"), - h.Meta("title", title), - h.Link("/public/favicon.ico", "icon"), - h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), - h.Meta("charset", "utf-8"), - h.Meta("author", "htmgo"), - h.Meta("description", description), - h.Meta("og:title", title), - h.Meta("og:url", "https://htmgo.dev"), - h.Link("canonical", "https://htmgo.dev"), - h.Link("https://cdn.jsdelivr.net/npm/@docsearch/css@3", "stylesheet"), - h.Meta("og:description", description), - h.LinkWithVersion("/public/main.css", "stylesheet", Version), - h.ScriptWithVersion("/public/htmgo.js", Version), - h.Style(` - html { - scroll-behavior: smooth; - } - `), - ), - h.Body( - h.Class("bg-white h-screen"), - h.Fragment(children...), - h.Script("https://cdn.jsdelivr.net/npm/@docsearch/js@3"), - h.UnsafeRawScript(` - docsearch({ - insights: true, - appId: "9IO2WZA8L1", - apiKey: "d8cd8b6f8f8a0c961ce971e09dbde90a", - indexName: "htmgo", - container: "#search-container", - debug: false - }); - `), - ), - ) -} - -func PageWithNav(ctx *h.RequestContext, children ...h.Ren) *h.Element { - return RootPage( - ctx, - h.Fragment( - partials.NavBar(ctx, partials.NavBarProps{ - Expanded: false, - ShowPreRelease: true, - }), - h.Div( - children..., - ), - ), - ) -} diff --git a/htmgo-site/pages/docs.go b/htmgo-site/pages/docs.go index c08fa78..06e0f99 100644 --- a/htmgo-site/pages/docs.go +++ b/htmgo-site/pages/docs.go @@ -3,7 +3,6 @@ package pages import ( "github.com/maddalax/htmgo/framework/h" "htmgo-site/internal/dirwalk" - "htmgo-site/pages/base" "htmgo-site/partials" "io/fs" ) @@ -12,7 +11,7 @@ func DocsPage(ctx *h.RequestContext) *h.Page { assets := ctx.Get("embeddedMarkdown").(fs.FS) pages := dirwalk.WalkPages("md/docs", assets) - return h.NewPage(base.RootPage( + return RootPage( ctx, h.Div( h.Class("flex h-full"), @@ -28,7 +27,7 @@ func DocsPage(ctx *h.RequestContext) *h.Page { }), h.Main( h.Div( - h.Class("w-full md:hidden bg-neutral-50 overflow-y-auto"), + h.Class("w-full md:hidden bg-neutral-50 overflow-y-auto mb-4 border-b border-b-slate-300"), partials.DocSidebar(pages), ), h.Class("overflow-y-auto justify-center overflow-x-hidden pb-6 items-center w-full"), @@ -63,5 +62,5 @@ func DocsPage(ctx *h.RequestContext) *h.Page { ), ), ), - )) + ) } diff --git a/htmgo-site/pages/examples.go b/htmgo-site/pages/examples.go index ceefac9..5165217 100644 --- a/htmgo-site/pages/examples.go +++ b/htmgo-site/pages/examples.go @@ -2,7 +2,6 @@ package pages import ( "github.com/maddalax/htmgo/framework/h" - "htmgo-site/pages/base" ) type Example struct { @@ -49,39 +48,37 @@ var examples = []Example{ }, { Title: "Form With Loading State", - Github: "https://github.com/maddalax/htmgo/blob/master/htmgo-site/pages/form.go", - Demo: "/form", + Github: "https://github.com/maddalax/htmgo/blob/master/htmgo-site/partials/snippets/form.go", + Demo: "/snippets/form", Description: "A simple form submission example with a loading state", }, } func ExamplesPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - base.PageWithNav( - ctx, + return PageWithNav( + ctx, + h.Div( + h.Class("flex items-center justify-center"), h.Div( - h.Class("flex items-center justify-center"), + h.Class("w-full px-4 flex flex-col prose max-w-[95vw] md:max-w-3xl mt-6"), h.Div( - h.Class("w-full px-4 flex flex-col prose max-w-[95vw] md:max-w-3xl mt-6"), + h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), h.Div( - h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), - h.Div( - h.H1( - h.Class("text-center md:text-left"), - h.Text("htmgo examples"), - ), - h.H3( - h.Class("-mt-4"), - h.TextF("example projects built with htmgo"), - ), + h.H1( + h.Class("text-center md:text-left"), + h.Text("htmgo examples"), + ), + h.H3( + h.Class("-mt-4"), + h.TextF("example projects built with htmgo"), ), ), + ), + h.Div( + h.Class("border-b border-b-slate-200 h-1"), h.Div( - h.Class("border-b border-b-slate-200 h-1"), - h.Div( - h.Class("mt-4"), - ExampleCards(), - ), + h.Class("mt-4"), + ExampleCards(), ), ), ), diff --git a/htmgo-site/pages/html-to-go.go b/htmgo-site/pages/html-to-go.go index face609..f03a1d2 100644 --- a/htmgo-site/pages/html-to-go.go +++ b/htmgo-site/pages/html-to-go.go @@ -2,25 +2,22 @@ package pages import ( "github.com/maddalax/htmgo/framework/h" - "htmgo-site/pages/base" "htmgo-site/partials" ) func HtmlToGoPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - base.PageWithNav( - ctx, + return PageWithNav( + ctx, + h.Div( + h.Class("flex flex-col h-screen items-center justify-center w-full pt-6"), + h.H3( + h.Text("Convert raw html to htmgo code"), + h.Class("text-2xl font-bold"), + ), h.Div( - h.Class("flex flex-col h-screen items-center justify-center w-full pt-6"), - h.H3( - h.Text("Convert raw html to htmgo code"), - h.Class("text-2xl font-bold"), - ), - h.Div( - h.Class("h-full w-full flex gap-4 p-8"), - partials.HtmlInput(), - partials.GoOutput(""), - ), + h.Class("h-full w-full flex gap-4 p-8"), + partials.HtmlInput(), + partials.GoOutput(""), ), ), ) diff --git a/htmgo-site/pages/index.go b/htmgo-site/pages/index.go index 1b08002..6a46536 100644 --- a/htmgo-site/pages/index.go +++ b/htmgo-site/pages/index.go @@ -2,47 +2,44 @@ package pages import ( "github.com/maddalax/htmgo/framework/h" - "htmgo-site/pages/base" ) func IndexPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - base.PageWithNav( - ctx, + return PageWithNav( + ctx, + h.Div( + h.Class("flex items-center justify-center"), h.Div( - h.Class("flex items-center justify-center"), + h.Class("w-full px-4 flex flex-col prose md:max-w-3xl mt-6 mx-auto"), h.Div( - h.Class("w-full px-4 flex flex-col prose md:max-w-3xl mt-6 mx-auto"), + h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), h.Div( - h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), - h.Div( - h.H1F( - "htmgo", - h.Class("text-center md:text-left"), - ), - h.H3F( - "build simple and scalable systems with %s", - "go + htmx", - h.Class("-mt-4"), - ), + h.H1F( + "htmgo", + h.Class("text-center md:text-left"), ), - h.Div( - h.Class("mt-2"), - h.A( - h.Href("/docs"), - h.Class("not-prose p-3 bg-slate-900 text-white rounded-md"), - h.Text("Get Started"), - ), + h.H3F( + "build simple and scalable systems with %s", + "go + htmx", + h.Class("-mt-4"), ), ), h.Div( - h.Class("border-b border-b-slate-200 h-1"), - h.Div( - h.Class("mt-4"), - MarkdownPage(ctx, "md/index.md", ""), + h.Class("mt-2"), + h.A( + h.Href("/docs"), + h.Class("not-prose p-3 bg-slate-900 text-white rounded-md"), + h.Text("Get Started"), ), ), ), + h.Div( + h.Class("border-b border-b-slate-200 h-1"), + h.Div( + h.Class("mt-4"), + MarkdownPage(ctx, "md/index.md", ""), + ), + ), ), ), ) diff --git a/htmgo-site/pages/root.go b/htmgo-site/pages/root.go new file mode 100644 index 0000000..1a1918e --- /dev/null +++ b/htmgo-site/pages/root.go @@ -0,0 +1,72 @@ +package pages + +import ( + "github.com/google/uuid" + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/partials" +) + +var Version = uuid.NewString()[0:6] + +func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Page { + title := "htmgo" + description := "build simple and scalable systems with go + htmx" + return h.NewPage( + h.Html( + h.HxExtension( + h.BaseExtensions(), + ), + h.Head( + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Meta("title", title), + h.Link("/public/favicon.ico", "icon"), + h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Meta("charset", "utf-8"), + h.Meta("author", "htmgo"), + h.Meta("description", description), + h.Meta("og:title", title), + h.Meta("og:url", "https://htmgo.dev"), + h.Link("canonical", "https://htmgo.dev"), + h.Link("https://cdn.jsdelivr.net/npm/@docsearch/css@3", "stylesheet"), + h.Meta("og:description", description), + h.LinkWithVersion("/public/main.css", "stylesheet", Version), + h.ScriptWithVersion("/public/htmgo.js", Version), + h.Style(` + html { + scroll-behavior: smooth; + } + `), + ), + h.Body( + h.Class("bg-white h-screen"), + h.Fragment(children...), + h.Script("https://cdn.jsdelivr.net/npm/@docsearch/js@3"), + h.UnsafeRawScript(` + docsearch({ + insights: true, + appId: "9IO2WZA8L1", + apiKey: "d8cd8b6f8f8a0c961ce971e09dbde90a", + indexName: "htmgo", + container: "#search-container", + debug: false + }); + `), + ), + ), + ) +} + +func PageWithNav(ctx *h.RequestContext, children ...h.Ren) *h.Page { + return RootPage( + ctx, + h.Fragment( + partials.NavBar(ctx, partials.NavBarProps{ + Expanded: false, + ShowPreRelease: true, + }), + h.Div( + children..., + ), + ), + ) +} diff --git a/htmgo-site/pages/snippets/code.go b/htmgo-site/pages/snippets/code.go new file mode 100644 index 0000000..38656ef --- /dev/null +++ b/htmgo-site/pages/snippets/code.go @@ -0,0 +1,38 @@ +package snippets + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/ui" + "os" + "reflect" + "runtime" +) + +func getFunctionFilePath(fn interface{}) string { + // Get the function pointer using reflection + ptr := reflect.ValueOf(fn).Pointer() + // Get the file path and line number using runtime + fnInfo := runtime.FuncForPC(ptr) + if fnInfo == nil { + return "" + } + file, _ := fnInfo.FileLine(ptr) + return file +} + +func GetGithubPath(path string) string { + return fmt.Sprintf("https://github.com/maddalax/htmgo/blob/master%s", path) +} + +func RenderCodeToString(partial h.PartialFunc) *h.Element { + path := getFunctionFilePath(partial) + if path == "" { + return h.Empty() + } + bytes, err := os.ReadFile(path) + if err != nil { + return h.Empty() + } + return ui.CodeSnippet(string(bytes), "border-radius: 0.5rem;") +} diff --git a/htmgo-site/pages/snippets/data.go b/htmgo-site/pages/snippets/data.go new file mode 100644 index 0000000..54c69c3 --- /dev/null +++ b/htmgo-site/pages/snippets/data.go @@ -0,0 +1,22 @@ +package snippets + +import "github.com/maddalax/htmgo/framework/h" + +type Snippet struct { + name string + description string + sidebarName string + path string + partial h.PartialFunc +} + +func SetSnippet(ctx *h.RequestContext, snippet *Snippet) { + ctx.Set("snippet", snippet) +} + +func GetSnippet(ctx *h.RequestContext) *Snippet { + if ctx.Get("snippet") == nil { + return nil + } + return ctx.Get("snippet").(*Snippet) +} diff --git a/htmgo-site/pages/snippets/form.go b/htmgo-site/pages/snippets/form.go new file mode 100644 index 0000000..b599ef6 --- /dev/null +++ b/htmgo-site/pages/snippets/form.go @@ -0,0 +1,10 @@ +package snippets + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func FormExample(ctx *h.RequestContext) *h.Page { + SetSnippet(ctx, &FormWithLoadingState) + return Index(ctx) +} diff --git a/htmgo-site/pages/snippets/index.go b/htmgo-site/pages/snippets/index.go new file mode 100644 index 0000000..00ce2bc --- /dev/null +++ b/htmgo-site/pages/snippets/index.go @@ -0,0 +1,120 @@ +package snippets + +import ( + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/pages" + "htmgo-site/partials" +) + +func Index(ctx *h.RequestContext) *h.Page { + snippet := GetSnippet(ctx) + return pages.RootPage( + ctx, + h.Div( + h.Class("flex h-full"), + h.Aside( + h.Class("hidden md:block md:min-w-60 text-white overflow-y-auto"), + SnippetSidebar(), + ), + h.Div( + h.Class("flex flex-col flex-1 overflow-hidden"), + partials.NavBar(ctx, partials.NavBarProps{ + Expanded: false, + ShowPreRelease: false, + }), + h.Main( + h.Div( + h.Class("w-full md:hidden bg-neutral-50 overflow-y-auto mb-4 border-b border-b-slate-300"), + SnippetSidebar(), + ), + h.Class("overflow-y-auto justify-center overflow-x-hidden pb-6 items-center w-full"), + h.Div( + h.Class("flex flex-col mx-auto"), + h.Div( + h.Class("flex flex-col justify-center items-center md:mt-6 mx-auto"), + ), + h.IfElseLazy( + snippet != nil, + func() *h.Element { + return snippetView(snippet) + }, + emptyState, + ), + ), + ), + ), + ), + ) +} + +func snippetView(snippet *Snippet) *h.Element { + return h.Div( + h.Class("flex flex-col mx-auto items-center gap-6 max-w-[90vw] md:max-w-[75vw] xl:max-w-4xl px-8"), + h.Div( + h.Class("flex flex-col gap-1 w-full"), + h.H2( + h.Text(snippet.name), + h.Class("text-2xl font-bold"), + ), + h.If( + snippet.description != "", + h.P( + h.Text(snippet.description), + h.Class("text-slate-900"), + ), + ), + ), + h.Div( + h.Class("border px-8 py-4 rounded-md shadow-sm border-slate-200 w-full"), + h.Div( + h.Get( + h.GetPartialPath(snippet.partial), + "load", + ), + ), + ), + h.Div( + h.Class("mt-8 flex flex-col gap-2 justify-center"), + h.Div( + h.Class("flex gap-2 items-center"), + h.A( + githubLogo(), + h.Href(GetGithubPath(snippet.path)), + h.Class("font-sm text-blue-500 hover:text-blue-400"), + ), + h.H3( + h.Text("Source Code"), + h.Class("text-lg font-bold"), + ), + ), + RenderCodeToString(snippet.partial), + ), + ) +} + +func emptyState() *h.Element { + return h.Div( + h.Class("flex flex-col gap-2 justify-center items-center mt-8"), + h.Div( + h.Class("flex gap-2 items-center"), + h.H3( + h.Text("Choose a snippet on the sidebar to view"), + h.Class("text-lg"), + ), + ), + ) +} + +func githubLogo() *h.Element { + return h.Body( + h.Svg( + h.Attribute("xmlns", "http://www.w3.org/2000/svg"), + h.Width(24), + h.Height(24), + h.Attribute("viewBox", "0 0 24 24"), + h.Path( + h.Attribute("d", "M12 0c-6.626 0-12 5.373-12 12 0 5.302 3.438 9.8 8.207 11.387.599.111.793-.261.793-.577v-2.234c-3.338.726-4.033-1.416-4.033-1.416-.546-1.387-1.333-1.756-1.333-1.756-1.089-.745.083-.729.083-.729 1.205.084 1.839 1.237 1.839 1.237 1.07 1.834 2.807 1.304 3.492.997.107-.775.418-1.305.762-1.604-2.665-.305-5.467-1.334-5.467-5.931 0-1.311.469-2.381 1.236-3.221-.124-.303-.535-1.524.117-3.176 0 0 1.008-.322 3.301 1.23.957-.266 1.983-.399 3.003-.404 1.02.005 2.047.138 3.006.404 2.291-1.552 3.297-1.23 3.297-1.23.653 1.653.242 2.874.118 3.176.77.84 1.235 1.911 1.235 3.221 0 4.609-2.807 5.624-5.479 5.921.43.372.823 1.102.823 2.222v3.293c0 .319.192.694.801.576 4.765-1.589 8.199-6.086 8.199-11.386 0-6.627-5.373-12-12-12z"), + ), + ), + ) +} diff --git a/htmgo-site/pages/snippets/sidebar.go b/htmgo-site/pages/snippets/sidebar.go new file mode 100644 index 0000000..fed5d9e --- /dev/null +++ b/htmgo-site/pages/snippets/sidebar.go @@ -0,0 +1,31 @@ +package snippets + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func SnippetSidebar() *h.Element { + return h.Div( + h.Class("px-3 py-2 pr-6 md:min-h-screen pb-4 mb:pb-0 bg-neutral-50 border-r border-r-slate-300 overflow-y-auto"), + h.Div( + h.Div( + h.Class("mb-3"), + h.A( + h.Href("#"), + h.Text("Snippets"), + h.Class("md:mt-4 text-xl text-slate-900 font-bold"), + ), + ), + h.Div( + h.Class("flex flex-col gap-4"), + h.List(Snippets, func(entry Snippet, index int) *h.Element { + return h.A( + h.Href(entry.path), + h.Text(entry.sidebarName), + h.Class("text-slate-900 hover:text-rose-400"), + ) + }), + ), + ), + ) +} diff --git a/htmgo-site/pages/snippets/snippets.go b/htmgo-site/pages/snippets/snippets.go new file mode 100644 index 0000000..31475e3 --- /dev/null +++ b/htmgo-site/pages/snippets/snippets.go @@ -0,0 +1,17 @@ +package snippets + +import ( + "htmgo-site/partials/snippets" +) + +var FormWithLoadingState = Snippet{ + name: "Form", + description: "A simple form submission example with a loading state", + sidebarName: "Form with loading state", + path: "/snippets/form", + partial: snippets.FormExample, +} + +var Snippets = []Snippet{ + FormWithLoadingState, +} diff --git a/htmgo-site/pages/test.go b/htmgo-site/pages/test.go index e868461..d8ffc91 100644 --- a/htmgo-site/pages/test.go +++ b/htmgo-site/pages/test.go @@ -3,24 +3,21 @@ package pages import ( "fmt" "github.com/maddalax/htmgo/framework/h" - "htmgo-site/pages/base" ) func TestFormatPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - base.RootPage( - ctx, - h.Div( - h.P( - h.Class("hello"), - h.Details( - h.Summary( - h.Text("Summary"), - ), - h.Text("Details"), + return RootPage( + ctx, + h.Div( + h.P( + h.Class("hello"), + h.Details( + h.Summary( + h.Text("Summary"), ), - h.Id("hi"), + h.Text("Details"), ), + h.Id("hi"), ), ), ) @@ -33,26 +30,23 @@ func notPage() int { } func TestOtherPage(ctx *h.RequestContext) *h.Page { - - return h.NewPage( - base.RootPage( - ctx, - h.Div( - h.Id("test"), - h.Details( - h.Summary( - h.Text("Summary"), - ), - h.Text("Details"), + return RootPage( + ctx, + h.Div( + h.Id("test"), + h.Details( + h.Summary( + h.Text("Summary"), ), - h.Class("flex flex-col gap-2 bg-white h-full"), - h.Id("test"), - h.Details( - h.Summary( - h.Text("Summary"), - ), - h.Text("Details"), + h.Text("Details"), + ), + h.Class("flex flex-col gap-2 bg-white h-full"), + h.Id("test"), + h.Details( + h.Summary( + h.Text("Summary"), ), + h.Text("Details"), ), ), ) diff --git a/htmgo-site/pages/time.go b/htmgo-site/pages/time.go index d6349dd..3299aba 100644 --- a/htmgo-site/pages/time.go +++ b/htmgo-site/pages/time.go @@ -2,16 +2,14 @@ package pages import ( "github.com/maddalax/htmgo/framework/h" - "htmgo-site/pages/base" "htmgo-site/partials" ) func CurrentTimePage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - base.RootPage( - ctx, - h.GetPartial( - partials.CurrentTimePartial, - "load, every 1s"), - )) + return RootPage( + ctx, + h.GetPartial( + partials.CurrentTimePartial, + "load, every 1s"), + ) } diff --git a/htmgo-site/partials/sidebar.go b/htmgo-site/partials/doc-sidebar.go similarity index 94% rename from htmgo-site/partials/sidebar.go rename to htmgo-site/partials/doc-sidebar.go index a3447c6..02d5320 100644 --- a/htmgo-site/partials/sidebar.go +++ b/htmgo-site/partials/doc-sidebar.go @@ -57,7 +57,7 @@ func DocSidebar(pages []*dirwalk.Page) *h.Element { grouped := groupByFirstPart(pages) return h.Div( - h.Class("px-3 py-2 pr-6 min-h-screen bg-neutral-50 border-r border-r-slate-300 overflow-y-auto"), + h.Class("px-3 py-2 pr-6 md:min-h-screen pb-4 mb:pb-0 bg-neutral-50 border-r border-r-slate-300 overflow-y-auto"), h.Div( h.Div( h.Class("mb-3"), diff --git a/htmgo-site/partials/form.go b/htmgo-site/partials/form.go deleted file mode 100644 index 8ef0b75..0000000 --- a/htmgo-site/partials/form.go +++ /dev/null @@ -1,15 +0,0 @@ -package partials - -import ( - "github.com/maddalax/htmgo/framework/h" - "time" -) - -func SubmitForm(ctx *h.RequestContext) *h.Partial { - time.Sleep(time.Second * 3) - return h.NewPartial( - h.Div( - h.Text("Form submitted"), - ), - ) -} diff --git a/htmgo-site/pages/form.go b/htmgo-site/partials/snippets/form.go similarity index 52% rename from htmgo-site/pages/form.go rename to htmgo-site/partials/snippets/form.go index fdd9d24..6c173ab 100644 --- a/htmgo-site/pages/form.go +++ b/htmgo-site/partials/snippets/form.go @@ -1,42 +1,33 @@ -package pages +package snippets import ( "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/hx" "github.com/maddalax/htmgo/framework/js" - "htmgo-site/pages/base" - "htmgo-site/partials" + "time" ) -func Form(ctx *h.RequestContext) *h.Page { - return h.NewPage(base.RootPage( - ctx, - h.Div( - h.Class("flex flex-col items-center justify-center p-4 gap-6"), - h.H2F( - "Form submission with loading state example", - h.Class("text-2xl font-bold"), - ), - h.Form( - h.TriggerChildren(), - h.PostPartial(partials.SubmitForm), - h.Class("flex flex-col gap-2"), - h.LabelFor("name", "Your Name"), - h.Input( - "text", - h.Required(), - h.Class("p-4 rounded-md border border-slate-200"), - h.Name("name"), - h.Placeholder("Name"), - h.OnEvent( - hx.KeyDownEvent, - js.SubmitFormOnEnter(), - ), +func FormExample(ctx *h.RequestContext) *h.Partial { + return h.NewPartial( + h.Form( + h.TriggerChildren(), + h.PostPartial(SubmitForm), + h.Class("flex flex-col gap-2 max-w-[300px] mx-auto"), + h.LabelFor("name", "Your Name"), + h.Input( + "text", + h.Required(), + h.Class("p-4 rounded-md border border-slate-200"), + h.Name("name"), + h.Placeholder("Name"), + h.OnEvent( + hx.KeyDownEvent, + js.SubmitFormOnEnter(), ), - SubmitButton(), ), + SubmitButton(), ), - )) + ) } func SubmitButton() *h.Element { @@ -68,7 +59,18 @@ func SubmitButton() *h.Element { func Spinner(children ...h.Ren) *h.Element { return h.Div( h.Children(children...), - h.Class("absolute left-1 spinner spinner-border animate-spin inline-block w-6 h-6 border-4 rounded-full border-slate-200 border-t-transparent"), + h.Class("absolute left-1 spinner spinner-border animate-spin "+ + "inline-block w-6 h-6 border-4 rounded-full border-slate-200 border-t-transparent"), h.Attribute("role", "status"), ) } + +func SubmitForm(ctx *h.RequestContext) *h.Partial { + name := ctx.FormValue("name") + time.Sleep(time.Second * 2) + return h.NewPartial( + h.Div( + h.TextF("Form submitted with name: %s", name), + ), + ) +} diff --git a/htmgo-site/ui/snippet.go b/htmgo-site/ui/snippet.go index 68c9c1c..ccdcbe2 100644 --- a/htmgo-site/ui/snippet.go +++ b/htmgo-site/ui/snippet.go @@ -16,8 +16,10 @@ func FormatCode(code string, customStyles ...string) string { lexer := lexers.Get("go") style := styles.Get("github") formatter := html.New( + html.WrapLongLines(true), + html.WithLineNumbers(true), html.WithCustomCSS(map[chroma.TokenType]string{ - chroma.PreWrapper: fmt.Sprintf("padding: 12px; overflow: auto; %s", strings.Join(customStyles, ";")), + chroma.PreWrapper: fmt.Sprintf("padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important; %s", strings.Join(customStyles, ";")), })) iterator, err := lexer.Tokenise(nil, code) if err != nil { @@ -27,8 +29,8 @@ func FormatCode(code string, customStyles ...string) string { return buf.String() } -func CodeSnippet(code string) *h.Element { +func CodeSnippet(code string, customStyles ...string) *h.Element { return h.Div( - h.UnsafeRaw(FormatCode(code)), + h.UnsafeRaw(FormatCode(code, customStyles...)), ) } From b65a913d4ea3ffd4ee09f2ed1fff18b7b86fba1c Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 10:56:03 -0500 Subject: [PATCH 076/137] test more examples --- framework/h/tag.go | 4 +-- htmgo-site/pages/snippets/chat.go | 10 ++++++ htmgo-site/pages/snippets/code.go | 2 +- htmgo-site/pages/snippets/data.go | 12 ++++--- htmgo-site/pages/snippets/form.go | 2 +- htmgo-site/pages/snippets/index.go | 48 ++++++++++++++++++-------- htmgo-site/pages/snippets/sidebar.go | 2 +- htmgo-site/pages/snippets/snippets.go | 26 ++++++++++++-- htmgo-site/pages/snippets/user-auth.go | 10 ++++++ 9 files changed, 89 insertions(+), 27 deletions(-) create mode 100644 htmgo-site/pages/snippets/chat.go create mode 100644 htmgo-site/pages/snippets/user-auth.go diff --git a/framework/h/tag.go b/framework/h/tag.go index 86d2d2a..2792dea 100644 --- a/framework/h/tag.go +++ b/framework/h/tag.go @@ -372,8 +372,8 @@ func Label(children ...Ren) *Element { return Tag("label", children...) } -func IFrame(src string) *Element { - return Tag("iframe", Src(src)) +func IFrame(src string, children ...Ren) *Element { + return Tag("iframe", children...).AppendChildren(Src(src)) } func Address(children ...Ren) *Element { diff --git a/htmgo-site/pages/snippets/chat.go b/htmgo-site/pages/snippets/chat.go new file mode 100644 index 0000000..2dc3e46 --- /dev/null +++ b/htmgo-site/pages/snippets/chat.go @@ -0,0 +1,10 @@ +package snippets + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func ChatExample(ctx *h.RequestContext) *h.Page { + SetSnippet(ctx, &ChatSnippet) + return Index(ctx) +} diff --git a/htmgo-site/pages/snippets/code.go b/htmgo-site/pages/snippets/code.go index 38656ef..6a686f5 100644 --- a/htmgo-site/pages/snippets/code.go +++ b/htmgo-site/pages/snippets/code.go @@ -22,7 +22,7 @@ func getFunctionFilePath(fn interface{}) string { } func GetGithubPath(path string) string { - return fmt.Sprintf("https://github.com/maddalax/htmgo/blob/master%s", path) + return fmt.Sprintf("https://github.com/maddalax/htmgo/tree/master/htmgo-site/partials%s.go", path) } func RenderCodeToString(partial h.PartialFunc) *h.Element { diff --git a/htmgo-site/pages/snippets/data.go b/htmgo-site/pages/snippets/data.go index 54c69c3..ea4891f 100644 --- a/htmgo-site/pages/snippets/data.go +++ b/htmgo-site/pages/snippets/data.go @@ -3,11 +3,13 @@ package snippets import "github.com/maddalax/htmgo/framework/h" type Snippet struct { - name string - description string - sidebarName string - path string - partial h.PartialFunc + name string + description string + sidebarName string + path string + partial h.PartialFunc + externalRoute string + sourceCodePath string } func SetSnippet(ctx *h.RequestContext, snippet *Snippet) { diff --git a/htmgo-site/pages/snippets/form.go b/htmgo-site/pages/snippets/form.go index b599ef6..0d8bfa3 100644 --- a/htmgo-site/pages/snippets/form.go +++ b/htmgo-site/pages/snippets/form.go @@ -5,6 +5,6 @@ import ( ) func FormExample(ctx *h.RequestContext) *h.Page { - SetSnippet(ctx, &FormWithLoadingState) + SetSnippet(ctx, &FormWithLoadingStateSnippet) return Index(ctx) } diff --git a/htmgo-site/pages/snippets/index.go b/htmgo-site/pages/snippets/index.go index 00ce2bc..4f94557 100644 --- a/htmgo-site/pages/snippets/index.go +++ b/htmgo-site/pages/snippets/index.go @@ -65,29 +65,49 @@ func snippetView(snippet *Snippet) *h.Element { ), ), h.Div( - h.Class("border px-8 py-4 rounded-md shadow-sm border-slate-200 w-full"), - h.Div( - h.Get( - h.GetPartialPath(snippet.partial), - "load", + h.ClassX("border px-8 py-4 rounded-md shadow-sm border-slate-200 w-full", map[string]bool{ + "mb-6": snippet.externalRoute == "", + }), + h.IfElse( + snippet.externalRoute != "", + h.IFrame( + snippet.externalRoute, + h.Class("h-full min-h-[800px] w-[50vw]"), + ), + h.Div( + h.Get( + h.GetPartialPath(snippet.partial), + "load", + ), ), ), ), h.Div( - h.Class("mt-8 flex flex-col gap-2 justify-center"), + h.Class("flex flex-col gap-2 justify-center"), h.Div( h.Class("flex gap-2 items-center"), h.A( - githubLogo(), - h.Href(GetGithubPath(snippet.path)), - h.Class("font-sm text-blue-500 hover:text-blue-400"), + h.Fragment( + githubLogo(), + h.If( + snippet.externalRoute != "", + h.Text("View source"), + ), + ), + h.Href( + h.Ternary(snippet.sourceCodePath == "", GetGithubPath(snippet.path), snippet.sourceCodePath), + ), + h.Class("flex gap-1 items-center font-sm text-blue-500 hover:text-blue-400"), ), - h.H3( - h.Text("Source Code"), - h.Class("text-lg font-bold"), + h.If( + snippet.externalRoute == "", + h.H3( + h.Text("Source Code"), + h.Class("text-lg font-bold"), + ), ), ), - RenderCodeToString(snippet.partial), + h.If(snippet.externalRoute == "", RenderCodeToString(snippet.partial)), ), ) } @@ -98,7 +118,7 @@ func emptyState() *h.Element { h.Div( h.Class("flex gap-2 items-center"), h.H3( - h.Text("Choose a snippet on the sidebar to view"), + h.Text("Choose an example on the sidebar to view"), h.Class("text-lg"), ), ), diff --git a/htmgo-site/pages/snippets/sidebar.go b/htmgo-site/pages/snippets/sidebar.go index fed5d9e..d303e09 100644 --- a/htmgo-site/pages/snippets/sidebar.go +++ b/htmgo-site/pages/snippets/sidebar.go @@ -12,7 +12,7 @@ func SnippetSidebar() *h.Element { h.Class("mb-3"), h.A( h.Href("#"), - h.Text("Snippets"), + h.Text("Examples"), h.Class("md:mt-4 text-xl text-slate-900 font-bold"), ), ), diff --git a/htmgo-site/pages/snippets/snippets.go b/htmgo-site/pages/snippets/snippets.go index 31475e3..bdda1ab 100644 --- a/htmgo-site/pages/snippets/snippets.go +++ b/htmgo-site/pages/snippets/snippets.go @@ -4,7 +4,7 @@ import ( "htmgo-site/partials/snippets" ) -var FormWithLoadingState = Snippet{ +var FormWithLoadingStateSnippet = Snippet{ name: "Form", description: "A simple form submission example with a loading state", sidebarName: "Form with loading state", @@ -12,6 +12,26 @@ var FormWithLoadingState = Snippet{ partial: snippets.FormExample, } -var Snippets = []Snippet{ - FormWithLoadingState, +var UserAuthSnippet = Snippet{ + name: "User Authentication", + description: "An example showing basic user registration and login with htmgo", + sidebarName: "User Authentication", + path: "/snippets/user-auth", + externalRoute: "https://auth-example.htmgo.dev", + sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/simple-auth", +} + +var ChatSnippet = Snippet{ + name: "Chat App", + description: "A simple chat application built with htmgo", + sidebarName: "Chat App", + path: "/snippets/chat", + externalRoute: "https://chat-example.htmgo.dev", + sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/chat", +} + +var Snippets = []Snippet{ + FormWithLoadingStateSnippet, + UserAuthSnippet, + ChatSnippet, } diff --git a/htmgo-site/pages/snippets/user-auth.go b/htmgo-site/pages/snippets/user-auth.go new file mode 100644 index 0000000..fe3504e --- /dev/null +++ b/htmgo-site/pages/snippets/user-auth.go @@ -0,0 +1,10 @@ +package snippets + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func UserAuthExample(ctx *h.RequestContext) *h.Page { + SetSnippet(ctx, &UserAuthSnippet) + return Index(ctx) +} From f1f173715ee6ed434ec8ad0cfb49725120411e4e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 28 Oct 2024 15:56:54 +0000 Subject: [PATCH 077/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 0a0c124..d287e62 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 + github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 273646e..33da829 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index ac49b03..88ae38d 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 + github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index fe80f38..15264de 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 10acc54..6eec951 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 + github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 0472b06..df7ac03 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 778b1de..bdad5c6 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 + github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index c17984c..f0cb84f 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index ed83e04..825fa32 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 48cb33a..11d4f2d 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index ec45e7d..2b3924a 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241027024121-2726c6060814 + github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028155603-b65a913d4ea3 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 7d69bf6..8524104 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241027024121-2726c6060814 h1:cwbsxPgdjCR/cwksucYT6vLbN/YpstVnSzuINAUd4Eo= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241027024121-2726c6060814/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028155603-b65a913d4ea3 h1:gbuxfNSoybAx0i1M5K4RkQy9ZHESnucXgIGQY8TIIQk= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028155603-b65a913d4ea3/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 667c807..c6950dd 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 +require github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 48cb33a..11d4f2d 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814 h1:3dpW3OnkrQpQ5Fm5cN7dw4DJWZlrXqBGmh6Ab+3zG+w= -github.com/maddalax/htmgo/framework v1.0.2-0.20241027024121-2726c6060814/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= +github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 1ca8bbf6e09b0bc9abbe07116fea0da542c30c78 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 11:27:25 -0500 Subject: [PATCH 078/137] render the code from github since we wont have it locally --- htmgo-site/pages/snippets/code.go | 49 ++++++++------ htmgo-site/pages/snippets/hackernews.go | 8 +++ htmgo-site/pages/snippets/index.go | 89 ++++++++++++++++--------- htmgo-site/pages/snippets/sidebar.go | 2 +- htmgo-site/pages/snippets/snippets.go | 10 +++ 5 files changed, 103 insertions(+), 55 deletions(-) create mode 100644 htmgo-site/pages/snippets/hackernews.go diff --git a/htmgo-site/pages/snippets/code.go b/htmgo-site/pages/snippets/code.go index 6a686f5..dae562a 100644 --- a/htmgo-site/pages/snippets/code.go +++ b/htmgo-site/pages/snippets/code.go @@ -1,38 +1,45 @@ package snippets import ( + "bytes" "fmt" "github.com/maddalax/htmgo/framework/h" "htmgo-site/ui" - "os" - "reflect" - "runtime" + "io" + "log/slog" + "net/http" + "time" ) -func getFunctionFilePath(fn interface{}) string { - // Get the function pointer using reflection - ptr := reflect.ValueOf(fn).Pointer() - // Get the file path and line number using runtime - fnInfo := runtime.FuncForPC(ptr) - if fnInfo == nil { - return "" - } - file, _ := fnInfo.FileLine(ptr) - return file -} - func GetGithubPath(path string) string { return fmt.Sprintf("https://github.com/maddalax/htmgo/tree/master/htmgo-site/partials%s.go", path) } -func RenderCodeToString(partial h.PartialFunc) *h.Element { - path := getFunctionFilePath(partial) - if path == "" { - return h.Empty() +func GetGithubRawPath(path string) string { + return fmt.Sprintf("https://raw.githubusercontent.com/maddalax/htmgo/master/htmgo-site/partials%s.go", path) +} + +var RenderCodeToStringCached = h.CachedPerKeyT(time.Minute*30, func(snippet *Snippet) (string, h.GetElementFunc) { + return snippet.path, func() *h.Element { + return renderCodeToString(snippet) } - bytes, err := os.ReadFile(path) +}) + +func renderCodeToString(snippet *Snippet) *h.Element { + url := GetGithubRawPath(snippet.path) + slog.Info("getting snippet source code", slog.String("url", url)) + resp, err := http.Get(url) if err != nil { return h.Empty() } - return ui.CodeSnippet(string(bytes), "border-radius: 0.5rem;") + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return h.Empty() + } + out := bytes.NewBuffer(nil) + _, err = io.Copy(out, resp.Body) + if err != nil { + return h.Empty() + } + return ui.CodeSnippet(out.String(), "border-radius: 0.5rem;") } diff --git a/htmgo-site/pages/snippets/hackernews.go b/htmgo-site/pages/snippets/hackernews.go new file mode 100644 index 0000000..d29e2fe --- /dev/null +++ b/htmgo-site/pages/snippets/hackernews.go @@ -0,0 +1,8 @@ +package snippets + +import "github.com/maddalax/htmgo/framework/h" + +func HackerNewsExample(ctx *h.RequestContext) *h.Page { + SetSnippet(ctx, &HackerNewsSnippet) + return Index(ctx) +} diff --git a/htmgo-site/pages/snippets/index.go b/htmgo-site/pages/snippets/index.go index 4f94557..a6a7830 100644 --- a/htmgo-site/pages/snippets/index.go +++ b/htmgo-site/pages/snippets/index.go @@ -36,7 +36,7 @@ func Index(ctx *h.RequestContext) *h.Page { h.IfElseLazy( snippet != nil, func() *h.Element { - return snippetView(snippet) + return snippetView(ctx, snippet) }, emptyState, ), @@ -47,7 +47,33 @@ func Index(ctx *h.RequestContext) *h.Page { ) } -func snippetView(snippet *Snippet) *h.Element { +func viewSourceButton(snippet *Snippet) *h.Element { + return h.Div( + h.Class("flex gap-2 items-center"), + h.A( + h.Fragment( + githubLogo(), + h.If( + snippet.externalRoute != "", + h.Text("View source"), + ), + ), + h.Href( + h.Ternary(snippet.sourceCodePath == "", GetGithubPath(snippet.path), snippet.sourceCodePath), + ), + h.Class("flex gap-2 items-center font-sm text-blue-500 hover:text-blue-400"), + ), + h.If( + snippet.externalRoute == "", + h.H3( + h.Text("Source Code"), + h.Class("text-lg font-bold"), + ), + ), + ) +} + +func snippetView(ctx *h.RequestContext, snippet *Snippet) *h.Element { return h.Div( h.Class("flex flex-col mx-auto items-center gap-6 max-w-[90vw] md:max-w-[75vw] xl:max-w-4xl px-8"), h.Div( @@ -63,6 +89,13 @@ func snippetView(snippet *Snippet) *h.Element { h.Class("text-slate-900"), ), ), + h.If( + snippet.externalRoute != "", + h.Div( + h.Class("mt-3"), + viewSourceButton(snippet), + ), + ), ), h.Div( h.ClassX("border px-8 py-4 rounded-md shadow-sm border-slate-200 w-full", map[string]bool{ @@ -70,44 +103,34 @@ func snippetView(snippet *Snippet) *h.Element { }), h.IfElse( snippet.externalRoute != "", - h.IFrame( - snippet.externalRoute, - h.Class("h-full min-h-[800px] w-[50vw]"), + h.Div( + h.Class("relative"), + h.IFrame( + snippet.externalRoute, + h.Class("h-full min-h-[800px] w-[50vw]"), + ), + h.A( + h.Class("absolute top-0 left-0 w-full h-full bg-transparent cursor-pointer"), + h.Href( + snippet.externalRoute, + ), + h.Target("_blank"), + ), ), h.Div( - h.Get( - h.GetPartialPath(snippet.partial), - "load", - ), + h.IfElseLazy(snippet.partial != nil, func() *h.Element { + return snippet.partial(ctx).Root + }, h.Empty), ), ), ), - h.Div( - h.Class("flex flex-col gap-2 justify-center"), + h.If( + snippet.externalRoute == "", h.Div( - h.Class("flex gap-2 items-center"), - h.A( - h.Fragment( - githubLogo(), - h.If( - snippet.externalRoute != "", - h.Text("View source"), - ), - ), - h.Href( - h.Ternary(snippet.sourceCodePath == "", GetGithubPath(snippet.path), snippet.sourceCodePath), - ), - h.Class("flex gap-1 items-center font-sm text-blue-500 hover:text-blue-400"), - ), - h.If( - snippet.externalRoute == "", - h.H3( - h.Text("Source Code"), - h.Class("text-lg font-bold"), - ), - ), + h.Class("flex flex-col gap-2 justify-center"), + viewSourceButton(snippet), + RenderCodeToStringCached(snippet), ), - h.If(snippet.externalRoute == "", RenderCodeToString(snippet.partial)), ), ) } diff --git a/htmgo-site/pages/snippets/sidebar.go b/htmgo-site/pages/snippets/sidebar.go index d303e09..0aa7cc5 100644 --- a/htmgo-site/pages/snippets/sidebar.go +++ b/htmgo-site/pages/snippets/sidebar.go @@ -17,7 +17,7 @@ func SnippetSidebar() *h.Element { ), ), h.Div( - h.Class("flex flex-col gap-4"), + h.Class("flex flex-col gap-2"), h.List(Snippets, func(entry Snippet, index int) *h.Element { return h.A( h.Href(entry.path), diff --git a/htmgo-site/pages/snippets/snippets.go b/htmgo-site/pages/snippets/snippets.go index bdda1ab..3883745 100644 --- a/htmgo-site/pages/snippets/snippets.go +++ b/htmgo-site/pages/snippets/snippets.go @@ -30,8 +30,18 @@ var ChatSnippet = Snippet{ sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/chat", } +var HackerNewsSnippet = Snippet{ + name: "Hacker News Clone", + description: "A hacker news reader clone built with htmgo", + sidebarName: "Hacker News Clone", + path: "/snippets/hackernews", + externalRoute: "https://hn.htmgo.dev", + sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/hackernews", +} + var Snippets = []Snippet{ FormWithLoadingStateSnippet, UserAuthSnippet, ChatSnippet, + HackerNewsSnippet, } From 930b3dd1d3aaab178add16933404bbf3835aaa7b Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 11:39:46 -0500 Subject: [PATCH 079/137] replace examples page with v2 --- htmgo-site/pages/examples.go | 139 ------------------ .../pages/{snippets => examples}/chat.go | 2 +- .../pages/{snippets => examples}/code.go | 5 +- .../pages/{snippets => examples}/data.go | 2 +- .../snippets.go => examples/examples.go} | 38 +++-- .../pages/{snippets => examples}/form.go | 2 +- .../{snippets => examples}/hackernews.go | 2 +- htmgo-site/pages/examples/htmgo-site.go | 10 ++ .../pages/{snippets => examples}/index.go | 2 +- .../pages/{snippets => examples}/sidebar.go | 4 +- htmgo-site/pages/examples/todolist.go | 10 ++ .../pages/{snippets => examples}/user-auth.go | 2 +- 12 files changed, 60 insertions(+), 158 deletions(-) delete mode 100644 htmgo-site/pages/examples.go rename htmgo-site/pages/{snippets => examples}/chat.go (90%) rename htmgo-site/pages/{snippets => examples}/code.go (86%) rename htmgo-site/pages/{snippets => examples}/data.go (96%) rename htmgo-site/pages/{snippets/snippets.go => examples/examples.go} (53%) rename htmgo-site/pages/{snippets => examples}/form.go (91%) rename htmgo-site/pages/{snippets => examples}/hackernews.go (90%) create mode 100644 htmgo-site/pages/examples/htmgo-site.go rename htmgo-site/pages/{snippets => examples}/index.go (99%) rename htmgo-site/pages/{snippets => examples}/sidebar.go (87%) create mode 100644 htmgo-site/pages/examples/todolist.go rename htmgo-site/pages/{snippets => examples}/user-auth.go (90%) diff --git a/htmgo-site/pages/examples.go b/htmgo-site/pages/examples.go deleted file mode 100644 index 5165217..0000000 --- a/htmgo-site/pages/examples.go +++ /dev/null @@ -1,139 +0,0 @@ -package pages - -import ( - "github.com/maddalax/htmgo/framework/h" -) - -type Example struct { - Title string - Github string - Demo string - Image string - Description string -} - -var examples = []Example{ - { - Title: "User Authentication Example", - Github: "https://github.com/maddalax/htmgo/tree/master/examples/simple-auth", - Description: "An example showing basic user registration and login with htmgo", - Demo: "https://auth-example.htmgo.dev", - Image: "public/auth-example.jpg", - }, - { - Title: "Hacker News Clone", - Github: "https://github.com/maddalax/htmgo/tree/master/examples/hackernews", - Description: "A hacker news reader clone built with htmgo", - Demo: "https://hn.htmgo.dev", - Image: "public/hn-example.jpg", - }, - { - Title: "Chat App Example", - Github: "https://github.com/maddalax/htmgo/tree/master/examples/chat", - Description: "A simple chat application built with htmgo using SSE for real-time updates", - Demo: "https://chat-example.htmgo.dev", - Image: "public/chat-example.jpg", - }, - { - Title: "Todo List MVC", - Github: "https://github.com/maddalax/htmgo/tree/master/examples/todo-list", - Demo: "https://todo-example.htmgo.dev", - Image: "public/todo-example.jpg", - }, - { - Title: "htmgo.dev", - Github: "https://github.com/maddalax/htmgo/tree/master/htmgo-site", - Demo: "https://htmgo.dev", - Image: "public/htmgo-site.jpg", - }, - { - Title: "Form With Loading State", - Github: "https://github.com/maddalax/htmgo/blob/master/htmgo-site/partials/snippets/form.go", - Demo: "/snippets/form", - Description: "A simple form submission example with a loading state", - }, -} - -func ExamplesPage(ctx *h.RequestContext) *h.Page { - return PageWithNav( - ctx, - h.Div( - h.Class("flex items-center justify-center"), - h.Div( - h.Class("w-full px-4 flex flex-col prose max-w-[95vw] md:max-w-3xl mt-6"), - h.Div( - h.Class("flex flex-col mb-6 md:mb-0 md:flex-row justify-between items-center"), - h.Div( - h.H1( - h.Class("text-center md:text-left"), - h.Text("htmgo examples"), - ), - h.H3( - h.Class("-mt-4"), - h.TextF("example projects built with htmgo"), - ), - ), - ), - h.Div( - h.Class("border-b border-b-slate-200 h-1"), - h.Div( - h.Class("mt-4"), - ExampleCards(), - ), - ), - ), - ), - ) -} - -func ExampleCards() *h.Element { - return h.Div( - h.Class("prose-h2:my-1 prose-img:my-1 grid grid-cols-1 gap-6 text-center pb-8"), - h.List(examples, func(example Example, index int) *h.Element { - return h.Div( - h.Class("border border-gray-200 shadow-sm rounded-md px-4 pb-4 bg-neutral-100"), - h.Div( - h.Class("flex flex-col gap-1 mt-4"), - h.H2( - h.Class("text-lg text-center mb-1"), - h.Text(example.Title), - ), - h.If( - example.Image != "", - h.Div( - h.A( - h.Href(example.Demo), - h.Class("not-prose"), - h.Img( - h.Src(example.Image), - h.Class("w-[75%] rounded-md mx-auto"), - ), - ), - ), - ), - h.If( - example.Description != "", - h.Div( - h.Pf(example.Description), - ), - ), - h.Div( - h.Div( - h.Class("flex gap-2 justify-center mt-2"), - h.A( - h.Href(example.Github), - h.Class("not-prose p-2 bg-slate-900 text-white rounded-md"), - h.Text("Github"), - ), - h.A( - h.Href(example.Demo), - h.Class("not-prose p-2 bg-slate-900 text-white rounded-md"), - h.Text("Demo"), - ), - ), - ), - ), - ) - }), - ) -} diff --git a/htmgo-site/pages/snippets/chat.go b/htmgo-site/pages/examples/chat.go similarity index 90% rename from htmgo-site/pages/snippets/chat.go rename to htmgo-site/pages/examples/chat.go index 2dc3e46..a7b02e6 100644 --- a/htmgo-site/pages/snippets/chat.go +++ b/htmgo-site/pages/examples/chat.go @@ -1,4 +1,4 @@ -package snippets +package examples import ( "github.com/maddalax/htmgo/framework/h" diff --git a/htmgo-site/pages/snippets/code.go b/htmgo-site/pages/examples/code.go similarity index 86% rename from htmgo-site/pages/snippets/code.go rename to htmgo-site/pages/examples/code.go index dae562a..b073913 100644 --- a/htmgo-site/pages/snippets/code.go +++ b/htmgo-site/pages/examples/code.go @@ -1,4 +1,4 @@ -package snippets +package examples import ( "bytes" @@ -8,14 +8,17 @@ import ( "io" "log/slog" "net/http" + "strings" "time" ) func GetGithubPath(path string) string { + path = strings.ReplaceAll(path, "/partials/examples/", "/partials/snippets/") return fmt.Sprintf("https://github.com/maddalax/htmgo/tree/master/htmgo-site/partials%s.go", path) } func GetGithubRawPath(path string) string { + path = strings.ReplaceAll(path, "/examples/", "/snippets/") return fmt.Sprintf("https://raw.githubusercontent.com/maddalax/htmgo/master/htmgo-site/partials%s.go", path) } diff --git a/htmgo-site/pages/snippets/data.go b/htmgo-site/pages/examples/data.go similarity index 96% rename from htmgo-site/pages/snippets/data.go rename to htmgo-site/pages/examples/data.go index ea4891f..f331353 100644 --- a/htmgo-site/pages/snippets/data.go +++ b/htmgo-site/pages/examples/data.go @@ -1,4 +1,4 @@ -package snippets +package examples import "github.com/maddalax/htmgo/framework/h" diff --git a/htmgo-site/pages/snippets/snippets.go b/htmgo-site/pages/examples/examples.go similarity index 53% rename from htmgo-site/pages/snippets/snippets.go rename to htmgo-site/pages/examples/examples.go index 3883745..2791ec9 100644 --- a/htmgo-site/pages/snippets/snippets.go +++ b/htmgo-site/pages/examples/examples.go @@ -1,14 +1,12 @@ -package snippets +package examples -import ( - "htmgo-site/partials/snippets" -) +import "htmgo-site/partials/snippets" var FormWithLoadingStateSnippet = Snippet{ name: "Form", description: "A simple form submission example with a loading state", sidebarName: "Form with loading state", - path: "/snippets/form", + path: "/examples/form", partial: snippets.FormExample, } @@ -16,16 +14,16 @@ var UserAuthSnippet = Snippet{ name: "User Authentication", description: "An example showing basic user registration and login with htmgo", sidebarName: "User Authentication", - path: "/snippets/user-auth", + path: "/examples/user-auth", externalRoute: "https://auth-example.htmgo.dev", sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/simple-auth", } var ChatSnippet = Snippet{ name: "Chat App", - description: "A simple chat application built with htmgo", + description: "A simple chat application built with htmgo using SSE for real-time updates", sidebarName: "Chat App", - path: "/snippets/chat", + path: "/examples/chat", externalRoute: "https://chat-example.htmgo.dev", sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/chat", } @@ -34,14 +32,34 @@ var HackerNewsSnippet = Snippet{ name: "Hacker News Clone", description: "A hacker news reader clone built with htmgo", sidebarName: "Hacker News Clone", - path: "/snippets/hackernews", + path: "/examples/hackernews", externalRoute: "https://hn.htmgo.dev", sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/hackernews", } -var Snippets = []Snippet{ +var HtmgoSiteSnippet = Snippet{ + name: "Htmgo Doc Site", + description: "The htmgo site built with htmgo, recursion am I right?", + sidebarName: "Htmgo Doc Site", + path: "/examples/htmgo-site", + externalRoute: "https://htmgo.dev", + sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/htmgo-site", +} + +var TodoListSnippet = Snippet{ + name: "Todo List", + description: "A todo list built with htmgo", + sidebarName: "Todo List", + path: "/examples/todolist", + externalRoute: "https://todo-example.htmgo.dev", + sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/todo-list", +} + +var examples = []Snippet{ FormWithLoadingStateSnippet, UserAuthSnippet, ChatSnippet, HackerNewsSnippet, + TodoListSnippet, + HtmgoSiteSnippet, } diff --git a/htmgo-site/pages/snippets/form.go b/htmgo-site/pages/examples/form.go similarity index 91% rename from htmgo-site/pages/snippets/form.go rename to htmgo-site/pages/examples/form.go index 0d8bfa3..9ead363 100644 --- a/htmgo-site/pages/snippets/form.go +++ b/htmgo-site/pages/examples/form.go @@ -1,4 +1,4 @@ -package snippets +package examples import ( "github.com/maddalax/htmgo/framework/h" diff --git a/htmgo-site/pages/snippets/hackernews.go b/htmgo-site/pages/examples/hackernews.go similarity index 90% rename from htmgo-site/pages/snippets/hackernews.go rename to htmgo-site/pages/examples/hackernews.go index d29e2fe..f89e822 100644 --- a/htmgo-site/pages/snippets/hackernews.go +++ b/htmgo-site/pages/examples/hackernews.go @@ -1,4 +1,4 @@ -package snippets +package examples import "github.com/maddalax/htmgo/framework/h" diff --git a/htmgo-site/pages/examples/htmgo-site.go b/htmgo-site/pages/examples/htmgo-site.go new file mode 100644 index 0000000..f11bf91 --- /dev/null +++ b/htmgo-site/pages/examples/htmgo-site.go @@ -0,0 +1,10 @@ +package examples + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func HtmgoSiteExample(ctx *h.RequestContext) *h.Page { + SetSnippet(ctx, &HtmgoSiteSnippet) + return Index(ctx) +} diff --git a/htmgo-site/pages/snippets/index.go b/htmgo-site/pages/examples/index.go similarity index 99% rename from htmgo-site/pages/snippets/index.go rename to htmgo-site/pages/examples/index.go index a6a7830..7c06985 100644 --- a/htmgo-site/pages/snippets/index.go +++ b/htmgo-site/pages/examples/index.go @@ -1,4 +1,4 @@ -package snippets +package examples import ( "github.com/maddalax/htmgo/framework/h" diff --git a/htmgo-site/pages/snippets/sidebar.go b/htmgo-site/pages/examples/sidebar.go similarity index 87% rename from htmgo-site/pages/snippets/sidebar.go rename to htmgo-site/pages/examples/sidebar.go index 0aa7cc5..86315e4 100644 --- a/htmgo-site/pages/snippets/sidebar.go +++ b/htmgo-site/pages/examples/sidebar.go @@ -1,4 +1,4 @@ -package snippets +package examples import ( "github.com/maddalax/htmgo/framework/h" @@ -18,7 +18,7 @@ func SnippetSidebar() *h.Element { ), h.Div( h.Class("flex flex-col gap-2"), - h.List(Snippets, func(entry Snippet, index int) *h.Element { + h.List(examples, func(entry Snippet, index int) *h.Element { return h.A( h.Href(entry.path), h.Text(entry.sidebarName), diff --git a/htmgo-site/pages/examples/todolist.go b/htmgo-site/pages/examples/todolist.go new file mode 100644 index 0000000..19eeb1d --- /dev/null +++ b/htmgo-site/pages/examples/todolist.go @@ -0,0 +1,10 @@ +package examples + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func TodoListExample(ctx *h.RequestContext) *h.Page { + SetSnippet(ctx, &TodoListSnippet) + return Index(ctx) +} diff --git a/htmgo-site/pages/snippets/user-auth.go b/htmgo-site/pages/examples/user-auth.go similarity index 90% rename from htmgo-site/pages/snippets/user-auth.go rename to htmgo-site/pages/examples/user-auth.go index fe3504e..017d814 100644 --- a/htmgo-site/pages/snippets/user-auth.go +++ b/htmgo-site/pages/examples/user-auth.go @@ -1,4 +1,4 @@ -package snippets +package examples import ( "github.com/maddalax/htmgo/framework/h" From 62a141ff6cce0c0eb29885fa855b83fa11a6577b Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 11:49:21 -0500 Subject: [PATCH 080/137] blur overlay on iframe --- htmgo-site/pages/examples/index.go | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/htmgo-site/pages/examples/index.go b/htmgo-site/pages/examples/index.go index 7c06985..fecac96 100644 --- a/htmgo-site/pages/examples/index.go +++ b/htmgo-site/pages/examples/index.go @@ -110,11 +110,15 @@ func snippetView(ctx *h.RequestContext, snippet *Snippet) *h.Element { h.Class("h-full min-h-[800px] w-[50vw]"), ), h.A( - h.Class("absolute top-0 left-0 w-full h-full bg-transparent cursor-pointer"), + h.Class("absolute top-0 left-0 w-full h-full bg-gray-800 bg-opacity-50 backdrop-blur-[2px] flex items-center justify-center cursor-pointer"), h.Href( snippet.externalRoute, ), h.Target("_blank"), + h.Span( + h.Text("Click to view"), + h.Class("text-white text-lg font-bold"), + ), ), ), h.Div( From 044cbbe6984e1a7acd2121a86ac96b1792254f5f Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 12:46:33 -0500 Subject: [PATCH 081/137] path matching on windows --- cli/htmgo/internal/dirutil/glob.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/htmgo/internal/dirutil/glob.go b/cli/htmgo/internal/dirutil/glob.go index 1315c66..628a3ef 100644 --- a/cli/htmgo/internal/dirutil/glob.go +++ b/cli/htmgo/internal/dirutil/glob.go @@ -3,11 +3,12 @@ package dirutil import ( "fmt" "github.com/bmatcuk/doublestar/v4" + "strings" ) func matchesAny(patterns []string, path string) bool { for _, pattern := range patterns { - matched, err := doublestar.Match(pattern, path) + matched, err := doublestar.Match(pattern, strings.ReplaceAll(path, `\`, "/")) if err != nil { fmt.Printf("Error matching pattern: %v\n", err) return false From 9dac3ef988f7367d913a281c8f2fc1d28b3e93c2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 12:52:21 -0500 Subject: [PATCH 082/137] ensure the pattern matches too --- cli/htmgo/internal/dirutil/glob.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/cli/htmgo/internal/dirutil/glob.go b/cli/htmgo/internal/dirutil/glob.go index 628a3ef..dd0f3b3 100644 --- a/cli/htmgo/internal/dirutil/glob.go +++ b/cli/htmgo/internal/dirutil/glob.go @@ -8,7 +8,8 @@ import ( func matchesAny(patterns []string, path string) bool { for _, pattern := range patterns { - matched, err := doublestar.Match(pattern, strings.ReplaceAll(path, `\`, "/")) + matched, err := + doublestar.Match(strings.ReplaceAll(pattern, `\`, "/"), strings.ReplaceAll(path, `\`, "/")) if err != nil { fmt.Printf("Error matching pattern: %v\n", err) return false From db3322c3d8c8581f26ab0327b88d726119255885 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 14:02:17 -0500 Subject: [PATCH 083/137] fix process kill on windows normalize paths --- cli/htmgo/tasks/astgen/entry.go | 16 ++++++++++------ cli/htmgo/tasks/process/pid_windows.go | 5 ++++- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index 8472c03..6c45551 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -37,6 +37,10 @@ const ModuleName = "github.com/maddalax/htmgo/framework/h" var PackageName = fmt.Sprintf("package %s", GeneratedDirName) var GeneratedFileLine = fmt.Sprintf("// Package %s THIS FILE IS GENERATED. DO NOT EDIT.", GeneratedDirName) +func normalizePath(path string) string { + return strings.ReplaceAll(path, `\`, "/") +} + func sliceCommonPrefix(dir1, dir2 string) string { // Use filepath.Clean to normalize the paths dir1 = filepath.Clean(dir1) @@ -62,9 +66,9 @@ func sliceCommonPrefix(dir1, dir2 string) string { // Return the longer one if len(slicedDir1) > len(slicedDir2) { - return slicedDir1 + return normalizePath(slicedDir1) } - return slicedDir2 + return normalizePath(slicedDir2) } func findPublicFuncsReturningHPartial(dir string, predicate func(partial Partial) bool) ([]Partial, error) { @@ -106,8 +110,8 @@ func findPublicFuncsReturningHPartial(dir string, predicate func(partial Partial if selectorExpr.Sel.Name == "Partial" { p := Partial{ Package: node.Name.Name, - Path: sliceCommonPrefix(cwd, path), - Import: sliceCommonPrefix(cwd, strings.ReplaceAll(filepath.Dir(path), `\`, `/`)), + Path: normalizePath(sliceCommonPrefix(cwd, path)), + Import: sliceCommonPrefix(cwd, normalizePath(filepath.Dir(path))), FuncName: funcDecl.Name.Name, } if predicate(p) { @@ -173,8 +177,8 @@ func findPublicFuncsReturningHPage(dir string) ([]Page, error) { if selectorExpr.Sel.Name == "Page" { pages = append(pages, Page{ Package: node.Name.Name, - Import: strings.ReplaceAll(filepath.Dir(path), `\`, `/`), - Path: path, + Import: normalizePath(filepath.Dir(path)), + Path: normalizePath(path), FuncName: funcDecl.Name.Name, }) break diff --git a/cli/htmgo/tasks/process/pid_windows.go b/cli/htmgo/tasks/process/pid_windows.go index 7036a92..44dd7fa 100644 --- a/cli/htmgo/tasks/process/pid_windows.go +++ b/cli/htmgo/tasks/process/pid_windows.go @@ -12,7 +12,10 @@ func KillProcess(process CmdWithFlags) error { if process.Cmd == nil || process.Cmd.Process == nil { return nil } - Run(NewRawCommand("killprocess", fmt.Sprintf("taskkill /F /T /PID %s", strconv.Itoa(process.Cmd.Process.Pid)))) + err := exec.Command("taskkill", "/F", "/T", "/PID", strconv.Itoa(process.Cmd.Process.Pid)).Run() + if err != nil { + fmt.Println(err) + } time.Sleep(time.Millisecond * 50) return nil } From 7666186f83007f855bc59e57d90c4485f1fbc658 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 18:47:00 -0500 Subject: [PATCH 084/137] add inline edit / fix copy button --- framework/h/array.go | 9 + htmgo-site/internal/markdown/render.go | 2 +- htmgo-site/pages/examples/click-to-edit.go | 10 + htmgo-site/pages/examples/code.go | 51 +++-- htmgo-site/pages/examples/examples.go | 17 +- htmgo-site/pages/html-to-go.go | 1 + htmgo-site/partials/html-to-go.go | 38 ++-- htmgo-site/partials/snippets/click-to-edit.go | 178 ++++++++++++++++++ htmgo-site/ui/copy.go | 28 +++ htmgo-site/ui/snippet.go | 15 +- 10 files changed, 304 insertions(+), 45 deletions(-) create mode 100644 htmgo-site/pages/examples/click-to-edit.go create mode 100644 htmgo-site/partials/snippets/click-to-edit.go create mode 100644 htmgo-site/ui/copy.go diff --git a/framework/h/array.go b/framework/h/array.go index f6a6154..d1f8c48 100644 --- a/framework/h/array.go +++ b/framework/h/array.go @@ -14,6 +14,15 @@ func Unique[T any](slice []T, key func(item T) string) []T { return result } +func Find[T any](slice []T, predicate func(item *T) bool) *T { + for _, v := range slice { + if predicate(&v) { + return &v + } + } + return nil +} + // Filter returns a new slice with only items that match the predicate. func Filter[T any](slice []T, predicate func(item T) bool) []T { var result []T diff --git a/htmgo-site/internal/markdown/render.go b/htmgo-site/internal/markdown/render.go index 97168af..51b286b 100644 --- a/htmgo-site/internal/markdown/render.go +++ b/htmgo-site/internal/markdown/render.go @@ -62,7 +62,7 @@ func RenderMarkdown(reader io.Reader) bytes.Buffer { highlighting.WithFormatOptions( chromahtml.WithLineNumbers(true), chromahtml.WithCustomCSS(map[chroma.TokenType]string{ - chroma.PreWrapper: "padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important;", + chroma.PreWrapper: "font-size: 14px; padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important;", }), ), highlighting.WithStyle("github"), diff --git a/htmgo-site/pages/examples/click-to-edit.go b/htmgo-site/pages/examples/click-to-edit.go new file mode 100644 index 0000000..0873c9b --- /dev/null +++ b/htmgo-site/pages/examples/click-to-edit.go @@ -0,0 +1,10 @@ +package examples + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func ClickToEditExample(ctx *h.RequestContext) *h.Page { + SetSnippet(ctx, &ClickToEditSnippet) + return Index(ctx) +} diff --git a/htmgo-site/pages/examples/code.go b/htmgo-site/pages/examples/code.go index b073913..c65a1a6 100644 --- a/htmgo-site/pages/examples/code.go +++ b/htmgo-site/pages/examples/code.go @@ -8,6 +8,9 @@ import ( "io" "log/slog" "net/http" + "os" + "reflect" + "runtime" "strings" "time" ) @@ -29,20 +32,38 @@ var RenderCodeToStringCached = h.CachedPerKeyT(time.Minute*30, func(snippet *Sni }) func renderCodeToString(snippet *Snippet) *h.Element { - url := GetGithubRawPath(snippet.path) - slog.Info("getting snippet source code", slog.String("url", url)) - resp, err := http.Get(url) - if err != nil { - return h.Empty() + source := "" + // in development, use the local file + if h.IsDevelopment() { + ptr := reflect.ValueOf(snippet.partial).Pointer() + fnInfo := runtime.FuncForPC(ptr) + if fnInfo == nil { + return h.Empty() + } + file, _ := fnInfo.FileLine(ptr) + b, err := os.ReadFile(file) + if err != nil { + return h.Empty() + } + source = string(b) + } else { + url := GetGithubRawPath(snippet.path) + slog.Info("getting snippet source code", slog.String("url", url)) + resp, err := http.Get(url) + if err != nil { + return h.Empty() + } + defer resp.Body.Close() + if resp.StatusCode != http.StatusOK { + return h.Empty() + } + out := bytes.NewBuffer(nil) + _, err = io.Copy(out, resp.Body) + if err != nil { + return h.Empty() + } + source = out.String() } - defer resp.Body.Close() - if resp.StatusCode != http.StatusOK { - return h.Empty() - } - out := bytes.NewBuffer(nil) - _, err = io.Copy(out, resp.Body) - if err != nil { - return h.Empty() - } - return ui.CodeSnippet(out.String(), "border-radius: 0.5rem;") + + return ui.CodeSnippet(source, "border-radius: 0.5rem;") } diff --git a/htmgo-site/pages/examples/examples.go b/htmgo-site/pages/examples/examples.go index 2791ec9..4bf1b24 100644 --- a/htmgo-site/pages/examples/examples.go +++ b/htmgo-site/pages/examples/examples.go @@ -5,7 +5,7 @@ import "htmgo-site/partials/snippets" var FormWithLoadingStateSnippet = Snippet{ name: "Form", description: "A simple form submission example with a loading state", - sidebarName: "Form with loading state", + sidebarName: "Form With Loading State", path: "/examples/form", partial: snippets.FormExample, } @@ -22,16 +22,16 @@ var UserAuthSnippet = Snippet{ var ChatSnippet = Snippet{ name: "Chat App", description: "A simple chat application built with htmgo using SSE for real-time updates", - sidebarName: "Chat App", + sidebarName: "Chat App Using SSE", path: "/examples/chat", externalRoute: "https://chat-example.htmgo.dev", sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/chat", } var HackerNewsSnippet = Snippet{ - name: "Hacker News Clone", + name: "HackerNews Clone", description: "A hacker news reader clone built with htmgo", - sidebarName: "Hacker News Clone", + sidebarName: "HackerNews Clone", path: "/examples/hackernews", externalRoute: "https://hn.htmgo.dev", sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/hackernews", @@ -55,8 +55,17 @@ var TodoListSnippet = Snippet{ sourceCodePath: "https://github.com/maddalax/htmgo/tree/master/examples/todo-list", } +var ClickToEditSnippet = Snippet{ + name: "Inline Click To Edit", + description: "List view of items with a click to edit button and persistence", + sidebarName: "Inline click to edit", + path: "/examples/click-to-edit", + partial: snippets.ClickToEdit, +} + var examples = []Snippet{ FormWithLoadingStateSnippet, + ClickToEditSnippet, UserAuthSnippet, ChatSnippet, HackerNewsSnippet, diff --git a/htmgo-site/pages/html-to-go.go b/htmgo-site/pages/html-to-go.go index f03a1d2..6cc8428 100644 --- a/htmgo-site/pages/html-to-go.go +++ b/htmgo-site/pages/html-to-go.go @@ -17,6 +17,7 @@ func HtmlToGoPage(ctx *h.RequestContext) *h.Page { h.Div( h.Class("h-full w-full flex gap-4 p-8"), partials.HtmlInput(), + partials.HiddenCopyOutput(""), partials.GoOutput(""), ), ), diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index a43f70c..8283f9c 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -2,18 +2,20 @@ package partials import ( "github.com/maddalax/htmgo/framework/h" - "github.com/maddalax/htmgo/framework/js" "github.com/maddalax/htmgo/tools/html-to-htmgo/htmltogo" "htmgo-site/ui" ) func ConvertHtmlToGo(ctx *h.RequestContext) *h.Partial { value := ctx.FormValue("html-input") - parsed := htmltogo.Parse([]byte(value)) + parsed := string(htmltogo.Parse([]byte(value))) - formatted := ui.FormatCode(string(parsed), "height: 100%;") + formatted := ui.FormatCode(parsed, "height: 100%;") - return h.SwapPartial(ctx, GoOutput(formatted)) + return h.SwapManyPartial(ctx, + GoOutput(formatted), + HiddenCopyOutput(parsed), + ) } func HtmlInput() *h.Element { @@ -30,6 +32,14 @@ func HtmlInput() *h.Element { ) } +func HiddenCopyOutput(content string) *h.Element { + return h.Div( + h.Class("hidden"), + h.Id("go-output-raw"), + h.UnsafeRaw(content), + ) +} + func GoOutput(content string) *h.Element { return h.Div( h.Class("h-full w-1/2 min-w-1/2"), @@ -43,25 +53,7 @@ func GoOutput(content string) *h.Element { ), h.If( content != "", - h.Div( - h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), - h.Text("Copy"), - h.OnClick( - // language=JavaScript - js.EvalJs(` - if(!navigator.clipboard) { - alert("Clipboard API not supported"); - return; - } - let text = self.parentElement.querySelector("#go-output-content").innerText; - navigator.clipboard.writeText(text); - self.innerText = "Copied!"; - setTimeout(() => { - self.innerText = "Copy"; - }, 1000); - `), - ), - ), + ui.CopyButton("#go-output-raw"), ), ), ) diff --git a/htmgo-site/partials/snippets/click-to-edit.go b/htmgo-site/partials/snippets/click-to-edit.go new file mode 100644 index 0000000..cad0135 --- /dev/null +++ b/htmgo-site/partials/snippets/click-to-edit.go @@ -0,0 +1,178 @@ +package snippets + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" +) + +// RowClasses defined here for simplicity of the example +var RowClasses = "whitespace-nowrap px-4 py-4 font-medium text-gray-900 text-left" +var ButtonClasses = "inline-block rounded bg-slate-900 px-4 py-2 text-xs font-medium text-white hover:bg-slate-800" +var InputClasses = "-ml-2 max-w-[125px] border p-2 rounded focus:outline-none focus:ring focus:ring-slate-800" + +type Record struct { + Id string + Name string + Birthday string + Role string + Salary string +} + +type TableProps struct { + EditingId string +} + +var records = []Record{ + { + Id: "1", + Name: "John Doe", + Birthday: "24/05/1995", + Role: "htmgo developer", + Salary: "$250,000", + }, + { + Id: "2", + Name: "Jake Smith", + Birthday: "24/05/1995", + Role: "htmx developer", + Salary: "$100,000", + }, +} + +func ClickToEdit(ctx *h.RequestContext) *h.Partial { + return h.NewPartial( + h.Div( + h.Class("flex gap-2 items-center w-full"), + Table(TableProps{ + // no record is being edited initially + EditingId: "", + }), + ), + ) +} + +// StartEditing is a partial that is called when the user clicks on the edit button, +// it will swap in the form for editing for the given record +func StartEditing(ctx *h.RequestContext) *h.Partial { + id := ctx.QueryParam("id") + + record := h.Find(records, func(record *Record) bool { + return record.Id == id + }) + + if record == nil { + return h.EmptyPartial() + } + + return h.SwapManyPartial( + ctx, + TableRow(record, true), + ) +} + +// SaveEditing is a partial that is called when the user clicks on the save button while editing, +// it will update the record with the new values and swap it back out +// note: in the example, we are just creating a new record in memory instead of updating the existing one, +// normally you would update a persistent record in a database +func SaveEditing(ctx *h.RequestContext) *h.Partial { + id := ctx.QueryParam("id") + + // just for the example, create a new record so it doesn't affect the global original + record := Record{ + Id: id, + Name: ctx.FormValue("name"), + Birthday: ctx.FormValue("birthday"), + Role: ctx.FormValue("role"), + Salary: ctx.FormValue("salary"), + } + + return h.SwapPartial(ctx, TableRow(&record, false)) +} + +func Table(props TableProps) *h.Element { + return h.Div( + h.Class("overflow-x-auto w-full"), + h.Table( + h.Class("divide-y divide-gray-200 bg-white table-fixed"), + h.THead( + h.Tr( + h.Th( + h.Class(RowClasses), + h.Text("Name"), + ), + h.Th( + h.Class(RowClasses), + h.Text("Date of Birth"), + ), + h.Th( + h.Class(RowClasses), + h.Text("Role"), + ), + h.Th( + h.Class(RowClasses), + h.Text("Salary"), + ), + h.Th( + h.Class("px-4 py-2"), + ), + ), + ), + h.TBody( + h.Class("divide-y divide-gray-200"), + h.List(records, func(record Record, index int) *h.Element { + editing := props.EditingId == record.Id + return TableRow(&record, editing) + }), + ), + ), + ) +} + +func TableRow(record *Record, editing bool) *h.Element { + recordId := fmt.Sprintf("record-%s", record.Id) + + var Cell = func(name string, value string) *h.Element { + return h.Td( + h.Class(RowClasses, "h-[75px]"), + h.IfElse( + !editing, + h.Pf( + value, + h.Class("w-[125px]"), + ), + h.Input( + "text", + h.Class(InputClasses), + h.Value(value), + h.Name(name), + ), + ), + ) + } + + return h.Tr( + h.If( + editing, + // this is important to make sure the inputs are included in the form submission + h.HxInclude("input"), + ), + h.Id(recordId), + Cell("name", record.Name), + Cell("birthday", record.Birthday), + Cell("role", record.Role), + Cell("salary", record.Salary), + // Edit button + h.Td( + h.Button( + h.Class(ButtonClasses), + h.PostPartialWithQs( + h.Ternary(!editing, StartEditing, SaveEditing), + h.NewQs("id", record.Id), + ), + h.Text( + h.Ternary(!editing, "Edit", "Save"), + ), + ), + ), + ) +} diff --git a/htmgo-site/ui/copy.go b/htmgo-site/ui/copy.go new file mode 100644 index 0000000..453e744 --- /dev/null +++ b/htmgo-site/ui/copy.go @@ -0,0 +1,28 @@ +package ui + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/js" +) + +func CopyButton(selector string) *h.Element { + return h.Div( + h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), + h.Text("Copy"), + h.OnClick( + // language=JavaScript + js.EvalJs(fmt.Sprintf(` + if(!navigator.clipboard) { + return; + } + let text = document.querySelector("%s").innerText; + navigator.clipboard.writeText(text); + self.innerText = "Copied!"; + setTimeout(() => { + self.innerText = "Copy"; + }, 1000); + `, selector)), + ), + ) +} diff --git a/htmgo-site/ui/snippet.go b/htmgo-site/ui/snippet.go index ccdcbe2..ba9f999 100644 --- a/htmgo-site/ui/snippet.go +++ b/htmgo-site/ui/snippet.go @@ -7,6 +7,7 @@ import ( "github.com/alecthomas/chroma/v2/formatters/html" "github.com/alecthomas/chroma/v2/lexers" "github.com/alecthomas/chroma/v2/styles" + "github.com/google/uuid" "github.com/maddalax/htmgo/framework/h" "strings" ) @@ -19,7 +20,7 @@ func FormatCode(code string, customStyles ...string) string { html.WrapLongLines(true), html.WithLineNumbers(true), html.WithCustomCSS(map[chroma.TokenType]string{ - chroma.PreWrapper: fmt.Sprintf("padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important; %s", strings.Join(customStyles, ";")), + chroma.PreWrapper: fmt.Sprintf("font-size: 14px; padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important; %s", strings.Join(customStyles, ";")), })) iterator, err := lexer.Tokenise(nil, code) if err != nil { @@ -30,7 +31,17 @@ func FormatCode(code string, customStyles ...string) string { } func CodeSnippet(code string, customStyles ...string) *h.Element { + id := fmt.Sprintf("code-snippet-%s", uuid.NewString()) return h.Div( - h.UnsafeRaw(FormatCode(code, customStyles...)), + h.Class("relative"), + h.Div( + h.UnsafeRaw(code), + h.Class("hidden"), + h.Id(id), + ), + CopyButton("#"+id), + h.UnsafeRaw( + FormatCode(code, customStyles...), + ), ) } From 59a75aac9d473a4ac9c04f3330c4e0e17672e519 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 28 Oct 2024 23:47:56 +0000 Subject: [PATCH 085/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index d287e62..d95c999 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 + github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 33da829..c850ddb 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 88ae38d..1bfdaa3 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 + github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 15264de..b18e765 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 6eec951..94f99f3 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 + github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index df7ac03..6a60366 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index bdad5c6..b2098b5 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 + github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index f0cb84f..2365508 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 825fa32..e66ffe2 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 11d4f2d..7b0a478 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 2b3924a..b1e52d2 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028155603-b65a913d4ea3 + github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028234700-7666186f8300 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 8524104..40a5957 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028155603-b65a913d4ea3 h1:gbuxfNSoybAx0i1M5K4RkQy9ZHESnucXgIGQY8TIIQk= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028155603-b65a913d4ea3/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028234700-7666186f8300 h1:Bo1VcrzM+kqjaKYpOVGBOrs+8Yv67GUpah8fPvD+IgE= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028234700-7666186f8300/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index c6950dd..725cc67 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 11d4f2d..7b0a478 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3 h1:Syc9EVHsnHR9Q1FSzSlJD0rLD8sE7Jem/9ptB4ZnN9g= -github.com/maddalax/htmgo/framework v1.0.2-0.20241028155603-b65a913d4ea3/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= +github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 2e110dcafdfed5f8dbc4e53af1d74a5a82c920c7 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 18:50:31 -0500 Subject: [PATCH 086/137] title case --- htmgo-site/pages/examples/examples.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/pages/examples/examples.go b/htmgo-site/pages/examples/examples.go index 4bf1b24..317dd66 100644 --- a/htmgo-site/pages/examples/examples.go +++ b/htmgo-site/pages/examples/examples.go @@ -58,7 +58,7 @@ var TodoListSnippet = Snippet{ var ClickToEditSnippet = Snippet{ name: "Inline Click To Edit", description: "List view of items with a click to edit button and persistence", - sidebarName: "Inline click to edit", + sidebarName: "Inline Click To Edit", path: "/examples/click-to-edit", partial: snippets.ClickToEdit, } From 60e1a161ca078527c589e6a24200c43887cc2e52 Mon Sep 17 00:00:00 2001 From: maddalax Date: Mon, 28 Oct 2024 18:55:42 -0500 Subject: [PATCH 087/137] simplify since we arent allowing editing on load --- htmgo-site/partials/snippets/click-to-edit.go | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/htmgo-site/partials/snippets/click-to-edit.go b/htmgo-site/partials/snippets/click-to-edit.go index cad0135..eb9ae44 100644 --- a/htmgo-site/partials/snippets/click-to-edit.go +++ b/htmgo-site/partials/snippets/click-to-edit.go @@ -18,10 +18,6 @@ type Record struct { Salary string } -type TableProps struct { - EditingId string -} - var records = []Record{ { Id: "1", @@ -43,10 +39,7 @@ func ClickToEdit(ctx *h.RequestContext) *h.Partial { return h.NewPartial( h.Div( h.Class("flex gap-2 items-center w-full"), - Table(TableProps{ - // no record is being edited initially - EditingId: "", - }), + Table(), ), ) } @@ -89,7 +82,7 @@ func SaveEditing(ctx *h.RequestContext) *h.Partial { return h.SwapPartial(ctx, TableRow(&record, false)) } -func Table(props TableProps) *h.Element { +func Table() *h.Element { return h.Div( h.Class("overflow-x-auto w-full"), h.Table( @@ -120,8 +113,7 @@ func Table(props TableProps) *h.Element { h.TBody( h.Class("divide-y divide-gray-200"), h.List(records, func(record Record, index int) *h.Element { - editing := props.EditingId == record.Id - return TableRow(&record, editing) + return TableRow(&record, false) }), ), ), From d44cd0b2ed7477da2a8f44af996a3bb88dec7b3f Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 29 Oct 2024 05:11:35 -0500 Subject: [PATCH 088/137] fix urls --- htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md | 2 +- htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md | 3 +-- htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md | 2 +- htmgo-site/pages/examples/code.go | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md b/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md index 37affdb..981e630 100644 --- a/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md +++ b/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md @@ -49,7 +49,7 @@ js.SetClassOnSibling(string, string) js.RemoveClassOnSibling(string, string) ``` -For more usages: see https://github.com/maddalax/htmgo/blob/master/htmgo-site/pages/form.go +For more usages: see https://htmgo.dev/examples/form **Example:** Evaluating arbitrary JS diff --git a/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md b/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md index 2a185ab..4cd76b4 100644 --- a/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md +++ b/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md @@ -3,8 +3,7 @@ htmgo supports server-sent events (SSE) out of the box. This allows you to push data from the server to the client in real-time. -Example of this can be found in the [chat-app](https://github.com/maddalax/htmgo/tree/master/examples/chat) example. -Demo: https://chat-example.htmgo.dev +Example of this can be found in the [chat-app](https://htmgo.dev/examples/chat) example. ## How it works ## 1. The client sends a request to the server to establish a connection. diff --git a/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md b/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md index 0caf026..70053db 100644 --- a/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md +++ b/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md @@ -7,7 +7,7 @@ This is useful for things such as:
-**Example:** https://github.com/maddalax/htmgo/blob/master/htmgo-site/pages/form.go#L17 +**Example:** https://htmgo.dev/examples/form In this example: The trigger-children extension will trigger **hx-before-request** and **hx-after-request** on all children of the form when the form is submitted, and the button reacts to that by showing a loading state. diff --git a/htmgo-site/pages/examples/code.go b/htmgo-site/pages/examples/code.go index c65a1a6..ad85d5b 100644 --- a/htmgo-site/pages/examples/code.go +++ b/htmgo-site/pages/examples/code.go @@ -16,7 +16,7 @@ import ( ) func GetGithubPath(path string) string { - path = strings.ReplaceAll(path, "/partials/examples/", "/partials/snippets/") + path = strings.ReplaceAll(path, "/examples/", "/snippets/") return fmt.Sprintf("https://github.com/maddalax/htmgo/tree/master/htmgo-site/partials%s.go", path) } From cb012a4d824ca0cfcab2bbb9f65b9eb394170d47 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 29 Oct 2024 05:48:13 -0500 Subject: [PATCH 089/137] cleanup usage of orderedmap add tests add groupby add groupbyordered --- cli/htmgo/tasks/astgen/map.go | 82 -------------- cli/htmgo/tasks/astgen/util.go | 13 --- .../datastructure/orderedmap/orderedmap.go | 42 ++++---- .../orderedmap/orderedmap_test.go | 33 ++++++ framework/h/array.go | 33 ++++++ framework/h/array_test.go | 102 ++++++++++++++++++ framework/h/attribute.go | 11 +- framework/internal/datastructure/map.go | 84 --------------- htmgo-site/pages/examples/data.go | 1 + htmgo-site/pages/examples/examples.go | 7 ++ htmgo-site/pages/examples/sidebar.go | 27 ++++- htmgo-site/partials/doc-sidebar.go | 8 +- 12 files changed, 231 insertions(+), 212 deletions(-) delete mode 100644 cli/htmgo/tasks/astgen/map.go rename htmgo-site/internal/datastructures/map.go => framework/datastructure/orderedmap/orderedmap.go (63%) create mode 100644 framework/datastructure/orderedmap/orderedmap_test.go create mode 100644 framework/h/array_test.go delete mode 100644 framework/internal/datastructure/map.go diff --git a/cli/htmgo/tasks/astgen/map.go b/cli/htmgo/tasks/astgen/map.go deleted file mode 100644 index 201ccea..0000000 --- a/cli/htmgo/tasks/astgen/map.go +++ /dev/null @@ -1,82 +0,0 @@ -package astgen - -// OrderedMap is a generic data structure that maintains the order of keys. -type OrderedMap[K comparable, V any] struct { - keys []K - values map[K]V -} - -// Entries returns the key-value pairs in the order they were added. -func (om *OrderedMap[K, V]) Entries() []struct { - Key K - Value V -} { - entries := make([]struct { - Key K - Value V - }, len(om.keys)) - for i, key := range om.keys { - entries[i] = struct { - Key K - Value V - }{ - Key: key, - Value: om.values[key], - } - } - return entries -} - -// NewOrderedMap creates a new OrderedMap. -func NewOrderedMap[K comparable, V any]() *OrderedMap[K, V] { - return &OrderedMap[K, V]{ - keys: []K{}, - values: make(map[K]V), - } -} - -// Set adds or updates a key-value pair in the OrderedMap. -func (om *OrderedMap[K, V]) Set(key K, value V) { - // Check if the key already exists - if _, exists := om.values[key]; !exists { - om.keys = append(om.keys, key) // Append key to the keys slice if it's a new key - } - om.values[key] = value -} - -// Get retrieves a value by key. -func (om *OrderedMap[K, V]) Get(key K) (V, bool) { - value, exists := om.values[key] - return value, exists -} - -// Keys returns the keys in the order they were added. -func (om *OrderedMap[K, V]) Keys() []K { - return om.keys -} - -// Values returns the values in the order of their keys. -func (om *OrderedMap[K, V]) Values() []V { - values := make([]V, len(om.keys)) - for i, key := range om.keys { - values[i] = om.values[key] - } - - return values -} - -// Delete removes a key-value pair from the OrderedMap. -func (om *OrderedMap[K, V]) Delete(key K) { - if _, exists := om.values[key]; exists { - // Remove the key from the map - delete(om.values, key) - - // Remove the key from the keys slice - for i, k := range om.keys { - if k == key { - om.keys = append(om.keys[:i], om.keys[i+1:]...) - break - } - } - } -} diff --git a/cli/htmgo/tasks/astgen/util.go b/cli/htmgo/tasks/astgen/util.go index e55c5a9..af084fc 100644 --- a/cli/htmgo/tasks/astgen/util.go +++ b/cli/htmgo/tasks/astgen/util.go @@ -7,16 +7,3 @@ import ( func PanicF(format string, args ...interface{}) { panic(fmt.Sprintf(format, args...)) } - -func Unique[T any](slice []T, key func(item T) string) []T { - var result []T - seen := make(map[string]bool) - for _, v := range slice { - k := key(v) - if _, ok := seen[k]; !ok { - seen[k] = true - result = append(result, v) - } - } - return result -} diff --git a/htmgo-site/internal/datastructures/map.go b/framework/datastructure/orderedmap/orderedmap.go similarity index 63% rename from htmgo-site/internal/datastructures/map.go rename to framework/datastructure/orderedmap/orderedmap.go index 533ca4f..c356b68 100644 --- a/htmgo-site/internal/datastructures/map.go +++ b/framework/datastructure/orderedmap/orderedmap.go @@ -1,18 +1,24 @@ -package datastructures - -// OrderedMap is a generic data structure that maintains the order of keys. -type OrderedMap[K comparable, V any] struct { - keys []K - values map[K]V -} +package orderedmap type Entry[K comparable, V any] struct { Key K Value V } +// Map is a generic data structure that maintains the order of keys. +type Map[K comparable, V any] struct { + keys []K + values map[K]V +} + +func (om *Map[K, V]) Each(cb func(key K, value V)) { + for _, key := range om.keys { + cb(key, om.values[key]) + } +} + // Entries returns the key-value pairs in the order they were added. -func (om *OrderedMap[K, V]) Entries() []Entry[K, V] { +func (om *Map[K, V]) Entries() []Entry[K, V] { entries := make([]Entry[K, V], len(om.keys)) for i, key := range om.keys { entries[i] = Entry[K, V]{ @@ -23,16 +29,16 @@ func (om *OrderedMap[K, V]) Entries() []Entry[K, V] { return entries } -// NewOrderedMap creates a new OrderedMap. -func NewOrderedMap[K comparable, V any]() *OrderedMap[K, V] { - return &OrderedMap[K, V]{ +// New creates a new Map. +func New[K comparable, V any]() *Map[K, V] { + return &Map[K, V]{ keys: []K{}, values: make(map[K]V), } } -// Set adds or updates a key-value pair in the OrderedMap. -func (om *OrderedMap[K, V]) Set(key K, value V) { +// Set adds or updates a key-value pair in the Map. +func (om *Map[K, V]) Set(key K, value V) { // Check if the key already exists if _, exists := om.values[key]; !exists { om.keys = append(om.keys, key) // Append key to the keys slice if it's a new key @@ -41,18 +47,18 @@ func (om *OrderedMap[K, V]) Set(key K, value V) { } // Get retrieves a value by key. -func (om *OrderedMap[K, V]) Get(key K) (V, bool) { +func (om *Map[K, V]) Get(key K) (V, bool) { value, exists := om.values[key] return value, exists } // Keys returns the keys in the order they were added. -func (om *OrderedMap[K, V]) Keys() []K { +func (om *Map[K, V]) Keys() []K { return om.keys } // Values returns the values in the order of their keys. -func (om *OrderedMap[K, V]) Values() []V { +func (om *Map[K, V]) Values() []V { values := make([]V, len(om.keys)) for i, key := range om.keys { values[i] = om.values[key] @@ -61,8 +67,8 @@ func (om *OrderedMap[K, V]) Values() []V { return values } -// Delete removes a key-value pair from the OrderedMap. -func (om *OrderedMap[K, V]) Delete(key K) { +// Delete removes a key-value pair from the Map. +func (om *Map[K, V]) Delete(key K) { if _, exists := om.values[key]; exists { // Remove the key from the map delete(om.values, key) diff --git a/framework/datastructure/orderedmap/orderedmap_test.go b/framework/datastructure/orderedmap/orderedmap_test.go new file mode 100644 index 0000000..e30bc9a --- /dev/null +++ b/framework/datastructure/orderedmap/orderedmap_test.go @@ -0,0 +1,33 @@ +package orderedmap + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestOrderedMap(t *testing.T) { + t.Parallel() + om := New[string, int]() + + alphabet := []string{"a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"} + for index, letter := range alphabet { + om.Set(letter, index) + } + + assert.Equal(t, alphabet, om.Keys()) + + c, ok := om.Get("c") + assert.True(t, ok) + assert.Equal(t, 2, c) + + for i, entry := range om.Entries() { + if i == 5 { + assert.Equal(t, "f", entry.Key) + } + } + + om.Delete("c") + value, ok := om.Get("c") + assert.False(t, ok) + assert.Equal(t, 0, value) +} diff --git a/framework/h/array.go b/framework/h/array.go index d1f8c48..7cf5529 100644 --- a/framework/h/array.go +++ b/framework/h/array.go @@ -1,5 +1,9 @@ package h +import ( + "github.com/maddalax/htmgo/framework/datastructure/orderedmap" +) + // Unique returns a new slice with only unique items. func Unique[T any](slice []T, key func(item T) string) []T { var result []T @@ -14,6 +18,7 @@ func Unique[T any](slice []T, key func(item T) string) []T { return result } +// Find returns the first item in the slice that matches the predicate. func Find[T any](slice []T, predicate func(item *T) bool) *T { for _, v := range slice { if predicate(&v) { @@ -23,6 +28,34 @@ func Find[T any](slice []T, predicate func(item *T) bool) *T { return nil } +// GroupBy groups the items in the slice by the key returned by the key function. +func GroupBy[T any, K comparable](slice []T, key func(item T) K) map[K][]T { + grouped := make(map[K][]T) + for _, item := range slice { + k := key(item) + items, ok := grouped[k] + if !ok { + items = []T{} + } + grouped[k] = append(items, item) + } + return grouped +} + +// GroupByOrdered groups the items in the slice by the key returned by the key function, and returns an Map. +func GroupByOrdered[T any, K comparable](slice []T, key func(item T) K) *orderedmap.Map[K, []T] { + grouped := orderedmap.New[K, []T]() + for _, item := range slice { + k := key(item) + items, ok := grouped.Get(k) + if !ok { + items = []T{} + } + grouped.Set(k, append(items, item)) + } + return grouped +} + // Filter returns a new slice with only items that match the predicate. func Filter[T any](slice []T, predicate func(item T) bool) []T { var result []T diff --git a/framework/h/array_test.go b/framework/h/array_test.go new file mode 100644 index 0000000..42d5132 --- /dev/null +++ b/framework/h/array_test.go @@ -0,0 +1,102 @@ +package h + +import ( + "github.com/stretchr/testify/assert" + "strings" + "testing" +) + +func TestUnique(t *testing.T) { + t.Parallel() + slice := []string{"a", "b", "b", "c", "d", "d", "x"} + unique := Unique(slice, func(item string) string { + return item + }) + assert.Equal(t, []string{"a", "b", "c", "d", "x"}, unique) +} + +func TestFilter(t *testing.T) { + t.Parallel() + slice := []string{"a", "b", "b", "c", "d", "d", "x"} + filtered := Filter(slice, func(item string) bool { + return item == "b" + }) + assert.Equal(t, []string{"b", "b"}, filtered) +} + +func TestMap(t *testing.T) { + t.Parallel() + slice := []string{"a", "b", "c"} + mapped := Map(slice, func(item string) string { + return strings.ToUpper(item) + }) + assert.Equal(t, []string{"A", "B", "C"}, mapped) +} + +func TestGroupBy(t *testing.T) { + t.Parallel() + + type Item struct { + Name string + Job string + } + + items := []Item{ + {Name: "Alice", Job: "Developer"}, + {Name: "Bob", Job: "Designer"}, + {Name: "Charlie", Job: "Developer"}, + {Name: "David", Job: "Designer"}, + {Name: "Eve", Job: "Developer"}, + {Name: "Frank", Job: "Product Manager"}, + } + + grouped := GroupBy(items, func(item Item) string { + return item.Job + }) + + assert.Equal(t, 3, len(grouped)) + assert.Equal(t, 3, len(grouped["Developer"])) + assert.Equal(t, 2, len(grouped["Designer"])) + assert.Equal(t, 1, len(grouped["Product Manager"])) +} + +func TestGroupByOrdered(t *testing.T) { + t.Parallel() + + type Item struct { + Name string + Job string + } + + items := []Item{ + {Name: "Alice", Job: "Developer"}, + {Name: "Bob", Job: "Designer"}, + {Name: "Charlie", Job: "Developer"}, + {Name: "David", Job: "Designer"}, + {Name: "Eve", Job: "Developer"}, + {Name: "Frank", Job: "Product Manager"}, + } + + grouped := GroupByOrdered(items, func(item Item) string { + return item.Job + }) + + keys := []string{"Developer", "Designer", "Product Manager"} + assert.Equal(t, keys, grouped.Keys()) + + devs, ok := grouped.Get("Developer") + assert.True(t, ok) + assert.Equal(t, 3, len(devs)) + assert.Equal(t, "Alice", devs[0].Name) + assert.Equal(t, "Charlie", devs[1].Name) + assert.Equal(t, "Eve", devs[2].Name) +} + +func TestFind(t *testing.T) { + t.Parallel() + slice := []string{"a", "b", "c"} + found := Find(slice, func(item *string) bool { + return *item == "b" + }) + assert.Equal(t, "b", *found) +} diff --git a/framework/h/attribute.go b/framework/h/attribute.go index 48efcb2..0a4fa89 100644 --- a/framework/h/attribute.go +++ b/framework/h/attribute.go @@ -2,16 +2,15 @@ package h import ( "fmt" - "strings" - + "github.com/maddalax/htmgo/framework/datastructure/orderedmap" "github.com/maddalax/htmgo/framework/hx" - "github.com/maddalax/htmgo/framework/internal/datastructure" + "strings" ) type AttributeMap = map[string]any type AttributeMapOrdered struct { - data *datastructure.OrderedMap[string, string] + data *orderedmap.Map[string, string] } func (m *AttributeMapOrdered) Set(key string, value any) { @@ -39,12 +38,12 @@ func (m *AttributeMapOrdered) Each(cb func(key string, value string)) { }) } -func (m *AttributeMapOrdered) Entries() []datastructure.MapEntry[string, string] { +func (m *AttributeMapOrdered) Entries() []orderedmap.Entry[string, string] { return m.data.Entries() } func NewAttributeMap(pairs ...string) *AttributeMapOrdered { - m := datastructure.NewOrderedMap[string, string]() + m := orderedmap.New[string, string]() if len(pairs)%2 == 0 { for i := 0; i < len(pairs); i++ { m.Set(pairs[i], pairs[i+1]) diff --git a/framework/internal/datastructure/map.go b/framework/internal/datastructure/map.go deleted file mode 100644 index e4741d2..0000000 --- a/framework/internal/datastructure/map.go +++ /dev/null @@ -1,84 +0,0 @@ -package datastructure - -type MapEntry[K comparable, V any] struct { - Key K - Value V -} - -// OrderedMap is a generic data structure that maintains the order of keys. -type OrderedMap[K comparable, V any] struct { - keys []K - values map[K]V -} - -func (om *OrderedMap[K, V]) Each(cb func(key K, value V)) { - for _, key := range om.keys { - cb(key, om.values[key]) - } -} - -// Entries returns the key-value pairs in the order they were added. -func (om *OrderedMap[K, V]) Entries() []MapEntry[K, V] { - entries := make([]MapEntry[K, V], len(om.keys)) - for i, key := range om.keys { - entries[i] = MapEntry[K, V]{ - Key: key, - Value: om.values[key], - } - } - return entries -} - -// NewOrderedMap creates a new OrderedMap. -func NewOrderedMap[K comparable, V any]() *OrderedMap[K, V] { - return &OrderedMap[K, V]{ - keys: []K{}, - values: make(map[K]V), - } -} - -// Set adds or updates a key-value pair in the OrderedMap. -func (om *OrderedMap[K, V]) Set(key K, value V) { - // Check if the key already exists - if _, exists := om.values[key]; !exists { - om.keys = append(om.keys, key) // Append key to the keys slice if it's a new key - } - om.values[key] = value -} - -// Get retrieves a value by key. -func (om *OrderedMap[K, V]) Get(key K) (V, bool) { - value, exists := om.values[key] - return value, exists -} - -// Keys returns the keys in the order they were added. -func (om *OrderedMap[K, V]) Keys() []K { - return om.keys -} - -// Values returns the values in the order of their keys. -func (om *OrderedMap[K, V]) Values() []V { - values := make([]V, len(om.keys)) - for i, key := range om.keys { - values[i] = om.values[key] - } - - return values -} - -// Delete removes a key-value pair from the OrderedMap. -func (om *OrderedMap[K, V]) Delete(key K) { - if _, exists := om.values[key]; exists { - // Remove the key from the map - delete(om.values, key) - - // Remove the key from the keys slice - for i, k := range om.keys { - if k == key { - om.keys = append(om.keys[:i], om.keys[i+1:]...) - break - } - } - } -} diff --git a/htmgo-site/pages/examples/data.go b/htmgo-site/pages/examples/data.go index f331353..d00c870 100644 --- a/htmgo-site/pages/examples/data.go +++ b/htmgo-site/pages/examples/data.go @@ -10,6 +10,7 @@ type Snippet struct { partial h.PartialFunc externalRoute string sourceCodePath string + category string } func SetSnippet(ctx *h.RequestContext, snippet *Snippet) { diff --git a/htmgo-site/pages/examples/examples.go b/htmgo-site/pages/examples/examples.go index 317dd66..8d0ba6c 100644 --- a/htmgo-site/pages/examples/examples.go +++ b/htmgo-site/pages/examples/examples.go @@ -3,6 +3,7 @@ package examples import "htmgo-site/partials/snippets" var FormWithLoadingStateSnippet = Snippet{ + category: "Forms", name: "Form", description: "A simple form submission example with a loading state", sidebarName: "Form With Loading State", @@ -11,6 +12,7 @@ var FormWithLoadingStateSnippet = Snippet{ } var UserAuthSnippet = Snippet{ + category: "Projects", name: "User Authentication", description: "An example showing basic user registration and login with htmgo", sidebarName: "User Authentication", @@ -20,6 +22,7 @@ var UserAuthSnippet = Snippet{ } var ChatSnippet = Snippet{ + category: "Projects", name: "Chat App", description: "A simple chat application built with htmgo using SSE for real-time updates", sidebarName: "Chat App Using SSE", @@ -29,6 +32,7 @@ var ChatSnippet = Snippet{ } var HackerNewsSnippet = Snippet{ + category: "Projects", name: "HackerNews Clone", description: "A hacker news reader clone built with htmgo", sidebarName: "HackerNews Clone", @@ -38,6 +42,7 @@ var HackerNewsSnippet = Snippet{ } var HtmgoSiteSnippet = Snippet{ + category: "Projects", name: "Htmgo Doc Site", description: "The htmgo site built with htmgo, recursion am I right?", sidebarName: "Htmgo Doc Site", @@ -47,6 +52,7 @@ var HtmgoSiteSnippet = Snippet{ } var TodoListSnippet = Snippet{ + category: "Projects", name: "Todo List", description: "A todo list built with htmgo", sidebarName: "Todo List", @@ -56,6 +62,7 @@ var TodoListSnippet = Snippet{ } var ClickToEditSnippet = Snippet{ + category: "Forms", name: "Inline Click To Edit", description: "List view of items with a click to edit button and persistence", sidebarName: "Inline Click To Edit", diff --git a/htmgo-site/pages/examples/sidebar.go b/htmgo-site/pages/examples/sidebar.go index 86315e4..57c6421 100644 --- a/htmgo-site/pages/examples/sidebar.go +++ b/htmgo-site/pages/examples/sidebar.go @@ -1,10 +1,16 @@ package examples import ( + "github.com/maddalax/htmgo/framework/datastructure/orderedmap" "github.com/maddalax/htmgo/framework/h" ) func SnippetSidebar() *h.Element { + + grouped := h.GroupByOrdered(examples, func(example Snippet) string { + return example.category + }) + return h.Div( h.Class("px-3 py-2 pr-6 md:min-h-screen pb-4 mb:pb-0 bg-neutral-50 border-r border-r-slate-300 overflow-y-auto"), h.Div( @@ -18,11 +24,22 @@ func SnippetSidebar() *h.Element { ), h.Div( h.Class("flex flex-col gap-2"), - h.List(examples, func(entry Snippet, index int) *h.Element { - return h.A( - h.Href(entry.path), - h.Text(entry.sidebarName), - h.Class("text-slate-900 hover:text-rose-400"), + h.List(grouped.Entries(), func(entry orderedmap.Entry[string, []Snippet], index int) *h.Element { + return h.Div( + h.P( + h.Text(entry.Key), + h.Class("text-slate-800 font-bold"), + ), + h.Div( + h.Class("pl-4 flex flex-col"), + h.List(entry.Value, func(entry Snippet, index int) *h.Element { + return h.A( + h.Href(entry.path), + h.Text(entry.sidebarName), + h.Class("text-slate-900 hover:text-rose-400"), + ) + }), + ), ) }), ), diff --git a/htmgo-site/partials/doc-sidebar.go b/htmgo-site/partials/doc-sidebar.go index 02d5320..a2d84bf 100644 --- a/htmgo-site/partials/doc-sidebar.go +++ b/htmgo-site/partials/doc-sidebar.go @@ -1,8 +1,8 @@ package partials import ( + "github.com/maddalax/htmgo/framework/datastructure/orderedmap" "github.com/maddalax/htmgo/framework/h" - "htmgo-site/internal/datastructures" "htmgo-site/internal/dirwalk" "strings" ) @@ -37,8 +37,8 @@ func partsToName(parts []string) string { return builder.String() } -func groupByFirstPart(pages []*dirwalk.Page) *datastructures.OrderedMap[string, []*dirwalk.Page] { - grouped := datastructures.NewOrderedMap[string, []*dirwalk.Page]() +func groupByFirstPart(pages []*dirwalk.Page) *orderedmap.Map[string, []*dirwalk.Page] { + grouped := orderedmap.New[string, []*dirwalk.Page]() for _, page := range pages { if len(page.Parts) > 0 { section := page.Parts[0] @@ -69,7 +69,7 @@ func DocSidebar(pages []*dirwalk.Page) *h.Element { ), h.Div( h.Class("flex flex-col gap-4"), - h.List(grouped.Entries(), func(entry datastructures.Entry[string, []*dirwalk.Page], index int) *h.Element { + h.List(grouped.Entries(), func(entry orderedmap.Entry[string, []*dirwalk.Page], index int) *h.Element { return h.Div( h.P( h.Text(formatPart(entry.Key)), From 0c22fc137b0449da7612956b18e503556d46006b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Tue, 29 Oct 2024 10:49:14 +0000 Subject: [PATCH 090/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index d95c999..7c14a45 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 + github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index c850ddb..473fad5 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 1bfdaa3..64f0245 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 + github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index b18e765..ad2ce9f 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 94f99f3..99134b2 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 + github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 6a60366..8895b8f 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index b2098b5..bee21a3 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 + github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 2365508..1f1181a 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index e66ffe2..c0a0ddc 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 7b0a478..07f74a0 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index b1e52d2..b5df875 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028234700-7666186f8300 + github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029104813-cb012a4d824c github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 40a5957..bf7b6ce 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028234700-7666186f8300 h1:Bo1VcrzM+kqjaKYpOVGBOrs+8Yv67GUpah8fPvD+IgE= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241028234700-7666186f8300/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029104813-cb012a4d824c h1:gSiLOhs6MtDGTrynidMUmRPTaWCFBbn9ogQWZadqZJU= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029104813-cb012a4d824c/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 725cc67..41f0e77 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 7b0a478..07f74a0 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300 h1:Q3Qor2zzEPCD+BFyunHrwT7Koz6nJfpsu+ICJcOV8Kc= -github.com/maddalax/htmgo/framework v1.0.3-0.20241028234700-7666186f8300/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 2ec9fd14c03ffb3b5949599b26102010d1da248f Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 29 Oct 2024 05:54:34 -0500 Subject: [PATCH 091/137] remove border for iframe examples --- htmgo-site/pages/examples/index.go | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/htmgo-site/pages/examples/index.go b/htmgo-site/pages/examples/index.go index fecac96..8b46e5b 100644 --- a/htmgo-site/pages/examples/index.go +++ b/htmgo-site/pages/examples/index.go @@ -98,8 +98,8 @@ func snippetView(ctx *h.RequestContext, snippet *Snippet) *h.Element { ), ), h.Div( - h.ClassX("border px-8 py-4 rounded-md shadow-sm border-slate-200 w-full", map[string]bool{ - "mb-6": snippet.externalRoute == "", + h.ClassX("", map[string]bool{ + "mb-6 border px-8 py-4 rounded-md shadow-sm border-slate-200 w-full": snippet.externalRoute == "", }), h.IfElse( snippet.externalRoute != "", @@ -107,10 +107,10 @@ func snippetView(ctx *h.RequestContext, snippet *Snippet) *h.Element { h.Class("relative"), h.IFrame( snippet.externalRoute, - h.Class("h-full min-h-[800px] w-[50vw]"), + h.Class("h-full min-h-[800px] w-[50vw] rounded"), ), h.A( - h.Class("absolute top-0 left-0 w-full h-full bg-gray-800 bg-opacity-50 backdrop-blur-[2px] flex items-center justify-center cursor-pointer"), + h.Class("w-[50vw] rounded absolute top-0 left-0 h-full bg-gray-800 bg-opacity-50 backdrop-blur-[2px] flex items-center justify-center cursor-pointer"), h.Href( snippet.externalRoute, ), From d85737bfb8e92d07a4467054b02bf67060cd7723 Mon Sep 17 00:00:00 2001 From: maddalax Date: Tue, 29 Oct 2024 08:44:52 -0500 Subject: [PATCH 092/137] JS Eval Enhancements (#62) * scripting enhancements * tests * cleanup / tests --- framework/h/command_test.go | 185 ++++++++++++++++-- framework/h/lifecycle.go | 121 ++++++++++-- framework/h/renderer.go | 36 +++- framework/js/commands.go | 11 ++ htmgo-site/pages/examples/examples.go | 22 +++ .../examples/js-hide-children-on-click.go | 10 + .../pages/examples/js-set-text-on-click.go | 10 + .../snippets/js-hide-children-on-click.go | 32 +++ .../partials/snippets/js-set-text-on-click.go | 18 ++ 9 files changed, 411 insertions(+), 34 deletions(-) create mode 100644 htmgo-site/pages/examples/js-hide-children-on-click.go create mode 100644 htmgo-site/pages/examples/js-set-text-on-click.go create mode 100644 htmgo-site/partials/snippets/js-hide-children-on-click.go create mode 100644 htmgo-site/partials/snippets/js-set-text-on-click.go diff --git a/framework/h/command_test.go b/framework/h/command_test.go index 0da8afb..11b42fa 100644 --- a/framework/h/command_test.go +++ b/framework/h/command_test.go @@ -55,10 +55,12 @@ var re = regexp.MustCompile(`\s+`) func compareIgnoreSpaces(t *testing.T, actual, expected string) { expected = strings.ReplaceAll(expected, "\n", "") expected = strings.ReplaceAll(expected, "\t", "") - expected = re.ReplaceAllString(expected, " ") actual = strings.ReplaceAll(actual, "\n", "") actual = strings.ReplaceAll(actual, "\t", "") actual = re.ReplaceAllString(actual, " ") + spaceRegex := regexp.MustCompile(`\s+`) + actual = strings.TrimSpace(spaceRegex.ReplaceAllString(actual, "")) + expected = strings.TrimSpace(spaceRegex.ReplaceAllString(expected, "")) assert.Equal(t, expected, actual) } @@ -75,11 +77,11 @@ func TestJsEval(t *testing.T) { } compareIgnoreSpaces(t, renderJs(t, EvalJsOnParent("element.style.display = 'none'")), ` - if(!self.parentElement) { return; } let element = self.parentElement; element.style.display = 'none' + if(self.parentElement) { let element = self.parentElement; element.style.display = 'none' } `) compareIgnoreSpaces(t, renderJs(t, EvalJsOnSibling("button", "element.style.display = 'none'")), ` - if(!self.parentElement) { return; }let siblings = self.parentElement.querySelectorAll('button');siblings.forEach(function(element) {element.style.display = 'none'}); + if(self.parentElement) { let siblings = self.parentElement.querySelectorAll('button');siblings.forEach(function(element) {element.style.display = 'none'}); } `) } @@ -145,13 +147,13 @@ func TestToggleClassOnElement(t *testing.T) { func TestSetClassOnParent(t *testing.T) { compareIgnoreSpaces(t, renderJs(t, SetClassOnParent("active")), ` - if(!self.parentElement) { return; } let element = self.parentElement; element.classList.add('active') + if(self.parentElement) { let element = self.parentElement; element.classList.add('active') } `) } func TestRemoveClassOnParent(t *testing.T) { compareIgnoreSpaces(t, renderJs(t, RemoveClassOnParent("active")), ` - if(!self.parentElement) { return; } let element = self.parentElement; element.classList.remove('active') + if(self.parentElement) { let element = self.parentElement; element.classList.remove('active') } `) } @@ -174,20 +176,28 @@ func TestRemoveClassOnChildren(t *testing.T) { } func TestSetClassOnSibling(t *testing.T) { - compareIgnoreSpaces(t, renderJs(t, SetClassOnSibling("button", "selected")), ` - if(!self.parentElement) { return; }let siblings = self.parentElement.querySelectorAll('button'); - siblings.forEach(function(element) { - element.classList.add('selected') - }); + compareIgnoreSpaces(t, renderJs(t, SetClassOnSibling("button", "selected")), + // language=JavaScript + ` + if(self.parentElement) { + let siblings = self.parentElement.querySelectorAll('button'); + siblings.forEach(function(element) { + element.classList.add('selected') + }); + } `) } func TestRemoveClassOnSibling(t *testing.T) { - compareIgnoreSpaces(t, renderJs(t, RemoveClassOnSibling("button", "selected")), ` - if(!self.parentElement) { return; }let siblings = self.parentElement.querySelectorAll('button'); - siblings.forEach(function(element) { - element.classList.remove('selected') - }); + compareIgnoreSpaces(t, renderJs(t, RemoveClassOnSibling("button", "selected")), + // language=JavaScript + ` + if(self.parentElement) { + let siblings = self.parentElement.querySelectorAll('button'); + siblings.forEach(function(element) { + element.classList.remove('selected') + }); + } `) } @@ -226,3 +236,148 @@ func TestInjectScriptIfNotExist(t *testing.T) { } `) } + +func TestEvalCommands(t *testing.T) { + t.Parallel() + div := Div(Id("test")) + result := Render(EvalCommands(div, + SetText("hello"), + EvalJs(` + alert('test') + `), + SetClassOnParent("myclass"), + SetClassOnSibling("div", "myclass"), + )) + + evalId := "" + for _, child := range div.children { + switch child.(type) { + case *AttributeR: + attr := child.(*AttributeR) + if attr.Name == "data-eval-commands-id" { + evalId = attr.Value + break + } + } + } + //language=JavaScript + compareIgnoreSpaces(t, result, fmt.Sprintf(` + let element = document.querySelector("[data-eval-commands-id='%s']"); + if(!element) {return;} + self = element; + self.innerText = 'hello' + alert('test') + if(self.parentElement) { + element = self.parentElement; + element.classList.add('myclass') + } + if(self.parentElement) { + let siblings = self.parentElement.querySelectorAll('div'); + siblings.forEach(function(element) { + element.classList.add('myclass') + }); + } + `, evalId)) +} + +func TestToggleText(t *testing.T) { + t.Parallel() + result := Render(ToggleText("hello", "world")) + //language=JavaScript + compareIgnoreSpaces(t, result, fmt.Sprintf(` + if(self.innerText === "hello") { + self.innerText = "world"; + } else { + self.innerText = "hello"; + } + `)) +} + +func TestToggleTextOnSibling(t *testing.T) { + t.Parallel() + result := Render(ToggleTextOnSibling("div", "hello", "world")) + //language=JavaScript + compareIgnoreSpaces(t, result, fmt.Sprintf(` + if(self.parentElement) { + let siblings = self.parentElement.querySelectorAll('div'); + siblings.forEach(function(element){ + if(element.innerText === "hello"){ + element.innerText= "world"; + } else { + element.innerText= "hello"; + } + }); + } + `)) +} + +func TestToggleTextOnChildren(t *testing.T) { + t.Parallel() + result := Render(ToggleTextOnChildren("div", "hello", "world")) + //language=JavaScript + compareIgnoreSpaces(t, result, fmt.Sprintf(` + let children = self.querySelectorAll('div'); + children.forEach(function(element) { + if(element.innerText === "hello") { + element.innerText = "world"; + } else { + element.innerText = "hello"; + } + }); + `)) +} + +func TestToggleTextOnParent(t *testing.T) { + t.Parallel() + result := Render(ToggleTextOnParent("hello", "world")) + //language=JavaScript + compareIgnoreSpaces(t, result, fmt.Sprintf(` + if(self.parentElement) { + let element = self.parentElement; + + if(element.innerText === "hello") { + element.innerText = "world"; + } else { + element.innerText = "hello"; + } + } + `)) +} + +func TestToggleClassOnChildren(t *testing.T) { + t.Parallel() + result := Render(ToggleClassOnChildren("div", "hidden")) + //language=JavaScript + compareIgnoreSpaces(t, result, fmt.Sprintf(` + let children = self.querySelectorAll('div'); + children.forEach(function(element) { + element.classList.toggle('hidden') + }); + `)) +} + +func TestToggleClassOnParent(t *testing.T) { + t.Parallel() + result := Render(ToggleClassOnParent("hidden")) + //language=JavaScript + compareIgnoreSpaces(t, result, fmt.Sprintf(` + if(self.parentElement) { + let element = self.parentElement; + element.classList.toggle('hidden') + } + `)) +} + +func TestToggleClassOnSibling(t *testing.T) { + t.Parallel() + result := Render(ToggleClassOnSibling("div", "hidden")) + //language=JavaScript + compareIgnoreSpaces(t, result, fmt.Sprintf(` + if(self.parentElement) { + let siblings = self.parentElement.querySelectorAll('div'); + siblings.forEach(function(element) { + element.classList.toggle('hidden') + }); + } + `)) +} diff --git a/framework/h/lifecycle.go b/framework/h/lifecycle.go index b1e4fee..1aed70b 100644 --- a/framework/h/lifecycle.go +++ b/framework/h/lifecycle.go @@ -2,6 +2,7 @@ package h import ( "fmt" + "github.com/google/uuid" "github.com/maddalax/htmgo/framework/hx" "github.com/maddalax/htmgo/framework/internal/util" "strings" @@ -233,6 +234,54 @@ func ToggleClass(class string) SimpleJsCommand { return SimpleJsCommand{Command: fmt.Sprintf("this.classList.toggle('%s')", class)} } +// ToggleText toggles the given text on the element. +func ToggleText(text string, textTwo string) Command { + // language=JavaScript + return EvalJs(fmt.Sprintf(` + if(self.innerText === "%s") { + self.innerText = "%s"; + } else { + self.innerText = "%s"; + } + `, text, textTwo, text)) +} + +// ToggleTextOnSibling toggles the given text on the siblings of the element. +func ToggleTextOnSibling(selector, text string, textTwo string) Command { + // language=JavaScript + return EvalJsOnSibling(selector, fmt.Sprintf(` + if(element.innerText === "%s") { + element.innerText = "%s"; + } else { + element.innerText = "%s"; + } + `, text, textTwo, text)) +} + +// ToggleTextOnChildren toggles the given text on the children of the element. +func ToggleTextOnChildren(selector, text string, textTwo string) Command { + // language=JavaScript + return EvalJsOnChildren(selector, fmt.Sprintf(` + if(element.innerText === "%s") { + element.innerText = "%s"; + } else { + element.innerText = "%s"; + } + `, text, textTwo, text)) +} + +// ToggleTextOnParent toggles the given text on the parent of the element. +func ToggleTextOnParent(text string, textTwo string) Command { + // language=JavaScript + return EvalJsOnParent(fmt.Sprintf(` + if(element.innerText === "%s") { + element.innerText = "%s"; + } else { + element.innerText = "%s"; + } + `, text, textTwo, text)) +} + // ToggleClassOnElement toggles the given class on the elements returned by the selector. func ToggleClassOnElement(selector, class string) ComplexJsCommand { // language=JavaScript @@ -247,9 +296,10 @@ func ToggleClassOnElement(selector, class string) ComplexJsCommand { func EvalJsOnParent(js string) ComplexJsCommand { // language=JavaScript return EvalJs(fmt.Sprintf(` - if(!self.parentElement) { return; } - let element = self.parentElement; - %s + if(self.parentElement) { + let element = self.parentElement; + %s + } `, js)) } @@ -268,32 +318,51 @@ func EvalJsOnChildren(selector, js string) ComplexJsCommand { func EvalJsOnSibling(selector, js string) ComplexJsCommand { // language=JavaScript return EvalJs(fmt.Sprintf(` - if(!self.parentElement) { return; } - let siblings = self.parentElement.querySelectorAll('%s'); - siblings.forEach(function(element) { - %s - }); + if(self.parentElement) { + let siblings = self.parentElement.querySelectorAll('%s'); + siblings.forEach(function(element) { + %s + }); + } `, selector, js)) } -// SetClassOnParent sets the given class on the parent of the element. Reference the element using 'element'. +// SetClassOnParent sets the given class on the parent of the element. func SetClassOnParent(class string) ComplexJsCommand { // language=JavaScript return EvalJsOnParent(fmt.Sprintf("element.classList.add('%s')", class)) } -// RemoveClassOnParent removes the given class from the parent of the element. Reference the element using 'element'. +// RemoveClassOnParent removes the given class from the parent of the element. func RemoveClassOnParent(class string) ComplexJsCommand { // language=JavaScript return EvalJsOnParent(fmt.Sprintf("element.classList.remove('%s')", class)) } -// SetClassOnChildren sets the given class on the children of the element. Reference the element using 'element'. +// SetClassOnChildren sets the given class on the children of the element. func SetClassOnChildren(selector, class string) ComplexJsCommand { // language=JavaScript return EvalJsOnChildren(selector, fmt.Sprintf("element.classList.add('%s')", class)) } +// ToggleClassOnChildren toggles the given class on the children of the element. +func ToggleClassOnChildren(selector, class string) ComplexJsCommand { + // language=JavaScript + return EvalJsOnChildren(selector, fmt.Sprintf("element.classList.toggle('%s')", class)) +} + +// ToggleClassOnParent toggles the given class on the parent of the element. +func ToggleClassOnParent(class string) ComplexJsCommand { + // language=JavaScript + return EvalJsOnParent(fmt.Sprintf("element.classList.toggle('%s')", class)) +} + +// ToggleClassOnSibling toggles the given class on the siblings of the element. +func ToggleClassOnSibling(selector, class string) ComplexJsCommand { + // language=JavaScript + return EvalJsOnSibling(selector, fmt.Sprintf("element.classList.toggle('%s')", class)) +} + // SetClassOnSibling sets the given class on the siblings of the element. Reference the element using 'element'. func SetClassOnSibling(selector, class string) ComplexJsCommand { // language=JavaScript @@ -330,6 +399,36 @@ func EvalJs(js string) ComplexJsCommand { return NewComplexJsCommand(js) } +func EvalCommandsOnSelector(selector string, cmds ...Command) ComplexJsCommand { + lines := make([]string, len(cmds)) + for i, cmd := range cmds { + lines[i] = Render(cmd) + lines[i] = strings.ReplaceAll(lines[i], "this.", "self.") + // some commands set the element we need to fix it so we arent redeclaring it + lines[i] = strings.ReplaceAll(lines[i], "let element =", "element =") + } + code := strings.Join(lines, "\n") + return EvalJs(fmt.Sprintf(` + let element = document.querySelector("%s"); + + if(!element) { + return; + } + + self = element; + %s + `, selector, code)) +} + +func EvalCommands(element *Element, cmds ...Command) ComplexJsCommand { + id := strings.ReplaceAll(uuid.NewString(), "-", "") + element.AppendChildren( + Attribute("data-eval-commands-id", id), + ) + return EvalCommandsOnSelector( + fmt.Sprintf(`[data-eval-commands-id='%s']`, id), cmds...) +} + // PreventDefault prevents the default action of the event. func PreventDefault() SimpleJsCommand { // language=JavaScript diff --git a/framework/h/renderer.go b/framework/h/renderer.go index 83efa4f..b0969a9 100644 --- a/framework/h/renderer.go +++ b/framework/h/renderer.go @@ -35,9 +35,15 @@ var voidTags = map[string]bool{ "wbr": true, } +type ScriptEntry struct { + Body string + ChildOf *Element +} + type RenderContext struct { - builder *strings.Builder - scripts []string + builder *strings.Builder + scripts []ScriptEntry + currentElement *Element } func (ctx *RenderContext) AddScript(funcName string, body string) { @@ -48,7 +54,11 @@ func (ctx *RenderContext) AddScript(funcName string, body string) { %s } `, funcName, funcName, body) - ctx.scripts = append(ctx.scripts, script) + + ctx.scripts = append(ctx.scripts, ScriptEntry{ + Body: script, + ChildOf: ctx.currentElement, + }) } func (node *Element) Render(context *RenderContext) { @@ -56,6 +66,8 @@ func (node *Element) Render(context *RenderContext) { return } + context.currentElement = node + if node.tag == CachedNodeTag { meta := node.meta.(*CachedNode) meta.Render(context) @@ -147,7 +159,7 @@ func (node *Element) Render(context *RenderContext) { } if node.tag != "" { - renderScripts(context) + renderScripts(context, node) if !voidTags[node.tag] { context.builder.WriteString(" Date: Tue, 29 Oct 2024 13:45:48 +0000 Subject: [PATCH 093/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 7c14a45..88d11b7 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c + github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 473fad5..7697653 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 64f0245..83b0403 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c + github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index ad2ce9f..cbf9d49 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 99134b2..3bf30ef 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c + github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 8895b8f..cf3a22a 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index bee21a3..a494abb 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c + github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 1f1181a..96260a9 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index c0a0ddc..372e040 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c +require github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 07f74a0..09bbf0a 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index b5df875..6204fe6 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029104813-cb012a4d824c + github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029134452-d85737bfb8e9 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index bf7b6ce..9cadce0 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029104813-cb012a4d824c h1:gSiLOhs6MtDGTrynidMUmRPTaWCFBbn9ogQWZadqZJU= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029104813-cb012a4d824c/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029134452-d85737bfb8e9 h1:Jwa5azYzjrzmrt9x7c54Uh50D+/bNY+FMrWStF1MuEg= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029134452-d85737bfb8e9/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 41f0e77..2ac0ad7 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c +require github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 07f74a0..09bbf0a 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c h1:eIXXG18EB07E5uLqa9dJV2CWytQr5Q/HKrvlHNHXovM= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029104813-cb012a4d824c/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 35877a1b2e3b63a6c457b8612f76bdb1e42c1ec9 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 30 Oct 2024 13:27:42 -0500 Subject: [PATCH 094/137] New Docs (#63) * scripting enhancements * tests * cleanup / tests * new docs wip * add more docs * more updates * add caching docs * add sse docs * more docs * sidebar, and fix navigation blocks * remove old docs * set proper meta * fixes --- framework/h/attribute.go | 4 + framework/h/tag.go | 4 + htmgo-site/assets/public/formatter.mp4 | Bin 0 -> 1154835 bytes .../assets/public/jetbrains-tailwind.json | 14 ++ htmgo-site/assets/public/vscode-tailwind.json | 11 ++ htmgo-site/htmgo.yml | 2 +- htmgo-site/internal/urlhelper/resolve.go | 28 +++ .../md/docs/1_quick-start/1_introduction.md | 64 ------- .../md/docs/1_quick-start/2_installation.md | 63 ------- .../docs/1_quick-start/3_related_projects.md | 6 - htmgo-site/md/docs/2_core-concepts/1_pages.md | 94 ---------- .../md/docs/2_core-concepts/2_partials.md | 58 ------ .../md/docs/2_core-concepts/3_components.md | 29 --- htmgo-site/md/docs/2_core-concepts/4_tags.md | 19 -- .../md/docs/2_core-concepts/5_attributes.md | 22 --- .../md/docs/2_core-concepts/6_raw_html.md | 22 --- htmgo-site/md/docs/3_control/1_If Else.md | 51 ------ htmgo-site/md/docs/3_control/2_loops.md | 38 ---- .../md/docs/4_interactivity/1_swapping.md | 85 --------- .../md/docs/4_interactivity/2_events.md | 45 ----- .../3_evaluating_javascript.md | 85 --------- .../docs/5_performance/1_caching_globally.md | 57 ------ .../docs/5_performance/1_caching_per_user.md | 80 --------- .../6_pushing_data/1_server_sent_events.md | 64 ------- .../md/docs/7_htmx_extensions/1_overview.md | 34 ---- .../7_htmx_extensions/2_trigger_children.md | 13 -- .../7_htmx_extensions/3_mutation_error.md | 24 --- .../1_tailwind_intellisense.md | 53 ------ .../2_converting_raw_html_to_go.md | 4 - .../md/docs/8_miscellaneous/3_htmgo format.md | 60 ------- .../docs/9_troubleshooting/1_common_issues.md | 4 - htmgo-site/pages/{ => base}/root.go | 42 ++++- htmgo-site/pages/docs.go | 66 ------- htmgo-site/pages/docs/base.go | 165 ++++++++++++++++++ .../docs/config/htmgo-config.go} | 36 +++- htmgo-site/pages/docs/control/if-else.go | 73 ++++++++ htmgo-site/pages/docs/control/loops.go | 55 ++++++ .../pages/docs/core-concepts/components.go | 41 +++++ htmgo-site/pages/docs/core-concepts/pages.go | 113 ++++++++++++ .../pages/docs/core-concepts/partials.go | 84 +++++++++ .../pages/docs/core-concepts/raw-html.go | 45 +++++ .../docs/core-concepts/tags-and-attributes.go | 84 +++++++++ .../docs/htmx-extensions/mutation-error.go | 42 +++++ .../pages/docs/htmx-extensions/overview.go | 80 +++++++++ .../docs/htmx-extensions/trigger-children.go | 37 ++++ htmgo-site/pages/docs/index.go | 8 + htmgo-site/pages/docs/installation.go | 48 +++++ htmgo-site/pages/docs/interactivity/events.go | 126 +++++++++++++ .../pages/docs/interactivity/swapping.go | 110 ++++++++++++ htmgo-site/pages/docs/introduction.go | 48 +++++ htmgo-site/pages/docs/misc/formatter.go | 63 +++++++ .../pages/docs/misc/tailwind-intellisense.go | 44 +++++ .../docs/performance/caching-globally.go | 83 +++++++++ .../pages/docs/performance/caching-per-key.go | 98 +++++++++++ htmgo-site/pages/docs/pushing-data/sse.go | 87 +++++++++ htmgo-site/pages/docs/related-projects.go | 35 ++++ htmgo-site/pages/docs/sidebar.go | 126 +++++++++++++ htmgo-site/pages/examples/code.go | 2 +- htmgo-site/pages/examples/index.go | 4 +- htmgo-site/pages/html-to-go.go | 3 +- htmgo-site/pages/index.go | 3 +- htmgo-site/pages/test.go | 5 +- htmgo-site/pages/time.go | 3 +- htmgo-site/partials/doc-sidebar.go | 94 ---------- htmgo-site/partials/html-to-go.go | 8 +- htmgo-site/partials/time.go | 7 +- htmgo-site/ui/copy.go | 9 +- htmgo-site/ui/snippet.go | 102 +++++++++-- 68 files changed, 1948 insertions(+), 1268 deletions(-) create mode 100644 htmgo-site/assets/public/formatter.mp4 create mode 100644 htmgo-site/assets/public/jetbrains-tailwind.json create mode 100644 htmgo-site/assets/public/vscode-tailwind.json create mode 100644 htmgo-site/internal/urlhelper/resolve.go delete mode 100644 htmgo-site/md/docs/1_quick-start/1_introduction.md delete mode 100644 htmgo-site/md/docs/1_quick-start/2_installation.md delete mode 100644 htmgo-site/md/docs/1_quick-start/3_related_projects.md delete mode 100644 htmgo-site/md/docs/2_core-concepts/1_pages.md delete mode 100644 htmgo-site/md/docs/2_core-concepts/2_partials.md delete mode 100644 htmgo-site/md/docs/2_core-concepts/3_components.md delete mode 100644 htmgo-site/md/docs/2_core-concepts/4_tags.md delete mode 100644 htmgo-site/md/docs/2_core-concepts/5_attributes.md delete mode 100644 htmgo-site/md/docs/2_core-concepts/6_raw_html.md delete mode 100644 htmgo-site/md/docs/3_control/1_If Else.md delete mode 100644 htmgo-site/md/docs/3_control/2_loops.md delete mode 100644 htmgo-site/md/docs/4_interactivity/1_swapping.md delete mode 100644 htmgo-site/md/docs/4_interactivity/2_events.md delete mode 100644 htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md delete mode 100644 htmgo-site/md/docs/5_performance/1_caching_globally.md delete mode 100644 htmgo-site/md/docs/5_performance/1_caching_per_user.md delete mode 100644 htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md delete mode 100644 htmgo-site/md/docs/7_htmx_extensions/1_overview.md delete mode 100644 htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md delete mode 100644 htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md delete mode 100644 htmgo-site/md/docs/8_miscellaneous/1_tailwind_intellisense.md delete mode 100644 htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md delete mode 100644 htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md delete mode 100644 htmgo-site/md/docs/9_troubleshooting/1_common_issues.md rename htmgo-site/pages/{ => base}/root.go (69%) delete mode 100644 htmgo-site/pages/docs.go create mode 100644 htmgo-site/pages/docs/base.go rename htmgo-site/{md/docs/9_configuration/htmgo_config.md => pages/docs/config/htmgo-config.go} (54%) create mode 100644 htmgo-site/pages/docs/control/if-else.go create mode 100644 htmgo-site/pages/docs/control/loops.go create mode 100644 htmgo-site/pages/docs/core-concepts/components.go create mode 100644 htmgo-site/pages/docs/core-concepts/pages.go create mode 100644 htmgo-site/pages/docs/core-concepts/partials.go create mode 100644 htmgo-site/pages/docs/core-concepts/raw-html.go create mode 100644 htmgo-site/pages/docs/core-concepts/tags-and-attributes.go create mode 100644 htmgo-site/pages/docs/htmx-extensions/mutation-error.go create mode 100644 htmgo-site/pages/docs/htmx-extensions/overview.go create mode 100644 htmgo-site/pages/docs/htmx-extensions/trigger-children.go create mode 100644 htmgo-site/pages/docs/index.go create mode 100644 htmgo-site/pages/docs/installation.go create mode 100644 htmgo-site/pages/docs/interactivity/events.go create mode 100644 htmgo-site/pages/docs/interactivity/swapping.go create mode 100644 htmgo-site/pages/docs/introduction.go create mode 100644 htmgo-site/pages/docs/misc/formatter.go create mode 100644 htmgo-site/pages/docs/misc/tailwind-intellisense.go create mode 100644 htmgo-site/pages/docs/performance/caching-globally.go create mode 100644 htmgo-site/pages/docs/performance/caching-per-key.go create mode 100644 htmgo-site/pages/docs/pushing-data/sse.go create mode 100644 htmgo-site/pages/docs/related-projects.go create mode 100644 htmgo-site/pages/docs/sidebar.go delete mode 100644 htmgo-site/partials/doc-sidebar.go diff --git a/framework/h/attribute.go b/framework/h/attribute.go index 0a4fa89..be20b92 100644 --- a/framework/h/attribute.go +++ b/framework/h/attribute.go @@ -196,6 +196,10 @@ func Hidden() Ren { return Attribute("style", "display:none") } +func Controls() Ren { + return Attribute("controls", "") +} + func Class(value ...string) *AttributeR { return Attribute("class", MergeClasses(value...)) } diff --git a/framework/h/tag.go b/framework/h/tag.go index 2792dea..c1f6079 100644 --- a/framework/h/tag.go +++ b/framework/h/tag.go @@ -342,6 +342,10 @@ func Img(children ...Ren) *Element { return Tag("img", children...) } +func Video(children ...Ren) *Element { + return Tag("video", children...) +} + func Src(src string) *AttributeR { return Attribute("src", src) } diff --git a/htmgo-site/assets/public/formatter.mp4 b/htmgo-site/assets/public/formatter.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..f44fb7dc851e93ce4a3668cd046e837beefcbfac GIT binary patch literal 1154835 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%0D(p|?!60BIn>eUl-J-06i5n-l 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%0DaCS1mC?yu~`;M}grdnj*<=P%Do7&j_WVq^-B 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 mhk$J&>QB|@X0;97F#7Zl#do@FG~ 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%0Dc{+dPcWQWOUku9Gc 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%0D=KtJ&^jdr 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�cHm#yo)^4L4TbxZnKXSVaPO^KJbs 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

  • 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

    h8To`$8q+{jj{! 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%0D^vV$2k(E%7lo1)zcH` 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 - -**Quick overview** - -1. Server side rendered html, deploy as a single binary - -2. Built in live reloading - -3. Built in support for various libraries such as tailwindcss, htmx - -4. Go functions are components, no special syntax necessary to learn - -5. Many composable utility functions to streamline development and reduce boilerplate - - ```go - func ChangeTab(ctx *h.RequestContext) *h.Partial { - service := tasks.NewService(ctx.ServiceLocator()) - list, _ := service.List() - - tab := ctx.QueryParam("tab") - - return h.SwapManyPartialWithHeaders(ctx, - h.PushQsHeader(ctx, h.NewQs("tab", tab)), - List(list, tab), - Footer(list, tab), - ) - } - ``` - - Example: **h.SwapManyPartialWithHeaders** to swap out multiple elements on the page with your response, as well as set a new query string parameter. - - - -
    - -See [#core-concepts](#core-concepts-pages) for more information. diff --git a/htmgo-site/md/docs/1_quick-start/2_installation.md b/htmgo-site/md/docs/1_quick-start/2_installation.md deleted file mode 100644 index 30b1a3e..0000000 --- a/htmgo-site/md/docs/1_quick-start/2_installation.md +++ /dev/null @@ -1,63 +0,0 @@ -## Getting Started - - -##### **Prerequisites:** -1. Go: https://go.dev/doc/install -2. Familiarity with https://htmx.org and html/hypermedia - 1. If you have not read the htmx docs, please do so before continuing, a lot of concepts below will be much more clear after. - - -
    - -##### 1. **Install htmgo** - -```bash -GOPROXY=direct go install github.com/maddalax/htmgo/cli/htmgo@latest -``` - - - -**2. Create new project** -Once htmgo cli tool is installed, run - -```bash -htmgo template -``` - -this will ask you for a new app name, and it will clone our starter template to a new directory it creates with your app name. - -
    - -**3. Running the dev server** -htmgo has built in live reload on the dev server, to use this, run this command in the root of your project - -```bash -htmgo watch -``` - -If you prefer to restart the dev server yourself (no live reload), use - -```bash -htmgo run -``` - - - -##### **4. Core concepts** - -View the [core concepts](/docs#core-concepts-pages) of how to use htmgo, such as adding pages, using partials, routing, etc. - -
    - -**5. Building for production** -htmgo cli can be used to build the application for production as a single binary - -```bash -htmgo build -``` - -it will be output to **./dist** - - - -
    diff --git a/htmgo-site/md/docs/1_quick-start/3_related_projects.md b/htmgo-site/md/docs/1_quick-start/3_related_projects.md deleted file mode 100644 index d48f151..0000000 --- a/htmgo-site/md/docs/1_quick-start/3_related_projects.md +++ /dev/null @@ -1,6 +0,0 @@ -## Other languages and related projects - -If you're not a Go user but are interested in the idea of what htmgo is, you might want to check out these other projects: - -#### Python -- [fastht.ml](https://fastht.ml/) - Modern web applications in pure Python, Built on solid web foundations, not the latest fads - with FastHTML you can get started on anything from simple dashboards to scalable web applications in minutes. diff --git a/htmgo-site/md/docs/2_core-concepts/1_pages.md b/htmgo-site/md/docs/2_core-concepts/1_pages.md deleted file mode 100644 index 20c0338..0000000 --- a/htmgo-site/md/docs/2_core-concepts/1_pages.md +++ /dev/null @@ -1,94 +0,0 @@ -## Pages - -Pages are the entry point of an htmgo application. - -A simple page may look like: - -```go -// route will be automatically registered based on the file name -func HelloHtmgoPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - h.Html( - h.HxExtension(h.BaseExtensions()), - h.Head( - h.Link("/public/main.css", "stylesheet"), - h.Script("/public/htmgo.js"), - ), - h.Body( - h.Pf("Hello, htmgo!"), - ), - ), - ) -} -``` - -htmgo uses [std http](https://pkg.go.dev/net/http) with chi router as its web server, ***h.RequestContext** is a thin wrapper around ***http.Request**. A page -must return *h.Page, and accept *h.RequestContext as a parameter - -
    - -**Auto Registration** - -htmgo uses file based routing. This means that we will automatically generate and register your routes with chi based on the files you have in the 'pages' directory. - -For example, if you have a directory structure such as: - -```bash -pages - index.go - users.go - users.$id //id parameter can be accessed in your page with ctx.Param("id") -``` - -it will get registered into chi router as follows: - -```bash -/ -/users -/users/:id -``` - -You may put any functions you like in your pages file, auto registration will **ONLY** register functions that return ***h.Page** - -
    - -**Tips:** - -Generally it is it recommended to abstract common parts of your page into its own component and re-use it, such as script tags, including styling, etc. - -Example: - -```go -func RootPage(children ...h.Ren) *h.Element { - return h.Html( - h.HxExtension(h.BaseExtensions()), - h.Head( - h.Meta("viewport", "width=device-width, initial-scale=1"), - h.Link("/public/main.css", "stylesheet"), - h.Script("/public/htmgo.js"), - h.Style(` - html { - scroll-behavior: smooth; - } - `), - ), - h.Body( - h.Class("bg-stone-50 min-h-screen overflow-x-hidden"), - partials.NavBar(false), - h.Fragment(children...), - ), - ) -} -``` - -```go -func UserPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - base.RootPage( - h.Div( - h.Pf("User ID: %s", ctx.Param("id")), - ), - )) -} -``` - diff --git a/htmgo-site/md/docs/2_core-concepts/2_partials.md b/htmgo-site/md/docs/2_core-concepts/2_partials.md deleted file mode 100644 index 9757880..0000000 --- a/htmgo-site/md/docs/2_core-concepts/2_partials.md +++ /dev/null @@ -1,58 +0,0 @@ -## Partials - -Partials are where things get interesting. Partials allow you to start adding interactivity to your website by swapping in content, setting headers, redirecting, etc. - -Partials have a similar structure to pages. A simple partial may look like: - -```go -func CurrentTimePartial(ctx *h.RequestContext) *h.Partial { - now := time.Now() - return h.NewPartial( - h.Div( - h.Pf("The current time is %s", now.Format(time.RFC3339)), - ), - ) -} -``` - -This will get automatically registered in the same way that pages are registered, based on the file path. This allows you to reference partials directly via the function itself when rendering them, instead of worrying about the route. - -**Example:** -I want to build a page that renders the current time, updating every second. Here is how that may look: - -
    - -**pages/time.go** - -```go -package pages - -func CurrentTimePage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - base.RootPage( - h.GetPartial( - partials.CurrentTimePartial, - "load, every 1s"), - )) -} -``` - -**partials/time.go** - -```go -package partials - -func CurrentTimePartial(ctx *h.RequestContext) *h.Partial { - now := time.Now() - return h.NewPartial( - h.Div( - h.Pf("The current time is %s", now.Format(time.RFC3339)), - ), - ) -} -``` - -When the page load, the partial will be loaded in via htmx, and then swapped in every 1 second. With this -little amount of code and zero written javascript, you have a page that shows the current time and updates -every second. - diff --git a/htmgo-site/md/docs/2_core-concepts/3_components.md b/htmgo-site/md/docs/2_core-concepts/3_components.md deleted file mode 100644 index 9cbf2d2..0000000 --- a/htmgo-site/md/docs/2_core-concepts/3_components.md +++ /dev/null @@ -1,29 +0,0 @@ -## Components - -Components are re-usable bits of logic to render HTML. Similar to how in React components are Javascript functions, in htmgo, components are pure go functions. - -A component can be pure, or it can have data fetching logic inside of it. Since htmgo uses htmx for interactivity, there is NO re-rendering of your UI automatically from the framework, which means you can safely put data fetching logic inside of components since you can be sure they will only be called by your own code. - -
    - -**Example:** - -```go -func Card(ctx *h.RequestContext) *h.Element { - service := tasks.NewService(ctx.ServiceLocator()) - list, _ := service.List() - - return h.Div( - h.Id("task-card"), - h.Class("bg-white w-full rounded shadow-md"), - CardBody(list, getActiveTab(ctx)), - ) -} -``` - -My card component here fetches all my tasks I have on my list, and renders each task. -If you are familiar with React, then you would likely place this fetch logic inside of a useEffect or (useQuery library) so it is not constantly refetched as the component re-renders. - -With **htmgo**, the only way to update content on the page is to use htmx to swap out the content from loading a partial. Therefore you control exactly when this Card component is called, not the framework behind the scenes. - -See [#interactivity-swapping](#interactivity-swapping) for more information diff --git a/htmgo-site/md/docs/2_core-concepts/4_tags.md b/htmgo-site/md/docs/2_core-concepts/4_tags.md deleted file mode 100644 index aaeb8ba..0000000 --- a/htmgo-site/md/docs/2_core-concepts/4_tags.md +++ /dev/null @@ -1,19 +0,0 @@ -## HTML Tags - -htmgo provides many methods to render html tags: - -```go -h.Html(children ...Ren) *Element -h.Head(children ...Ren) *Element -h.Div(children ...Ren) *Element -h.Button(children ...Ren) *Element -h.P(children ...Ren) *Element -h.H1(children ...Ren) *Element -h.H2(children ...Ren) *Element -h.Tag(tag string, children ...Ren) *Element -... etc -``` - -All methods can be found in the `h` package in htmgo/framework - -See [#conditionals](#control-if-else) for more information about conditionally rendering tags or attributes. diff --git a/htmgo-site/md/docs/2_core-concepts/5_attributes.md b/htmgo-site/md/docs/2_core-concepts/5_attributes.md deleted file mode 100644 index a0b4c73..0000000 --- a/htmgo-site/md/docs/2_core-concepts/5_attributes.md +++ /dev/null @@ -1,22 +0,0 @@ -## Attributes - -Attributes are one of the main ways we can add interactivity to the pages with [htmx](http://htmx.org). If you have not read over the htmx documentation, please do so before continuing. - -htmgo provides many methods to add attributes - -```go -h.Class(string) -h.ClassX(string, h.ClassMap) -h.Href(string) -h.Attribute(key, value) -h.AttributeIf(condition, key, value) -h.AttributePairs(values...string) // set multiple attributes, must be an even number of parameters -h.Attributes(h.AttributeMap) // set multiple attributes as key/value pairs -h.Id(string) -h.Trigger(hx.Trigger) //htmx trigger using additional functions to construct the trigger -h.TriggerString(string) // htmx trigger in pure htmx string form - -``` - - - diff --git a/htmgo-site/md/docs/2_core-concepts/6_raw_html.md b/htmgo-site/md/docs/2_core-concepts/6_raw_html.md deleted file mode 100644 index 055639c..0000000 --- a/htmgo-site/md/docs/2_core-concepts/6_raw_html.md +++ /dev/null @@ -1,22 +0,0 @@ -## Rendering Raw Html - -In some cases, you may want to render raw HTML instead of using htmgo's functions. -This can be done by using the following methods: -```go -h.UnsafeRaw(string) -h.UnsafeRawF(string, ...interface{}) -h.UnsafeRawScript(string) -``` - -Usage: -```go - -h.UnsafeRaw("

    Raw HTML
    ") -h.UnsafeRawF("
    %s
    ", "Raw HTML") -h.UnsafeRawScript("alert('Hello World')") -``` - -Important: Be careful when using these methods, these methods do not escape the HTML content -and should **never** be used with user input unless you have sanitized the input. - -Sanitizing input can be done using the `html.EscapeString` function or by using https://github.com/microcosm-cc/bluemonday. diff --git a/htmgo-site/md/docs/3_control/1_If Else.md b/htmgo-site/md/docs/3_control/1_If Else.md deleted file mode 100644 index 3477237..0000000 --- a/htmgo-site/md/docs/3_control/1_If Else.md +++ /dev/null @@ -1,51 +0,0 @@ -## Conditional Statements - -If / else statements are useful when you want to conditionally render attributes or elements / components. - -htmgo provides a couple of utilities to do so: - -```go -h.If(condition, node) -h.Ternary(condition, node, node2) -h.ElementIf(condition, element) // this is neccessary if a method requires you to pass in *h.element -h.IfElse(condition, node, node2) //essentially an alias to h.Ternary -h.IfElseLazy(condition, func()node, func()node2) // useful for if something should only be called based on the condition -h.AttributeIf(condition, key string, value string) // adds an attribute if condition is true -h.ClassIf(condition, class string) // adds a class if condition is true -h.ClassX(classes, m.ClassMap{}) // allows you to include classes, but also render specific classes conditionally - -``` - -**Examples:** - -- Render `border-green-500` or `border-slate-400` conditionally - -```go -h.ClassX("w-10 h-10 border rounded-full", map[string]bool { - "border-green-500": task.CompletedAt != nil, - "border-slate-400": task.CompletedAt == nil, -}) -``` - - - -- Render an icon if the task is complete - -```go -h.If(task.CompletedAt != nil, CompleteIcon()) -``` - -- Render different elements based on a condition - -```go -h.IfElse(editing, EditTaskForm(), ViewTask()) -``` - -Note: This will execute both **EditTaskForm** and **ViewTask**, no matter if the condition is true or false, since a function is being called here. - -If you do not want to call the function at all unless the condition is true, use **h.IfElseLazy** - -```go -h.IfElseLazy(editing, EditTaskForm, ViewTask) -``` - diff --git a/htmgo-site/md/docs/3_control/2_loops.md b/htmgo-site/md/docs/3_control/2_loops.md deleted file mode 100644 index c42e87c..0000000 --- a/htmgo-site/md/docs/3_control/2_loops.md +++ /dev/null @@ -1,38 +0,0 @@ -## Loops / Dealing With Lists - -Very commonly you will need to render a list or slice of items onto the page. Frameworks generally solve this in different ways, such as React uses regular JS .map function to solve it. - -We offer the same conveniences in htmgo. - -```go -h.List(items, func(item, index)) *h.Element -h.IterMap(map, mapper func(key, value) *Element) *Element -``` - -**Example:** - -- Render a list of tasks - -```go -h.List(list, func(item *ent.Task, index int) *h.Element { - if tab == TabComplete && item.CompletedAt == nil { - return h.Empty() - } - return Task(item, false) -}) -``` - -- Render a map - -```go - values := map[string]string{ - "key": "value", - } - - IterMap(values, func(key string, value string) *Element { - return Div( - Text(key), - Text(value), - ) - }) -``` diff --git a/htmgo-site/md/docs/4_interactivity/1_swapping.md b/htmgo-site/md/docs/4_interactivity/1_swapping.md deleted file mode 100644 index d8ba5eb..0000000 --- a/htmgo-site/md/docs/4_interactivity/1_swapping.md +++ /dev/null @@ -1,85 +0,0 @@ -## Interactivity / Swapping - -1. Adding interactivity to your website is done through [htmx](http://htmx.org) by utilizing various attributes/headers. This should cover most use cases. - htmgo offers utility methods to make this process a bit easier - -Here are a few methods we offer: - -Partial Response methods - -```go -SwapManyPartialWithHeaders(ctx *RequestContext, headers *Headers, swaps ...*Element) *Partial -SwapPartial(ctx *RequestContext, swap *Element) *Partial -SwapManyPartial(ctx *RequestContext, swaps ...*Element) *Partial -SwapManyXPartial(ctx *RequestContext, swaps ...SwapArg) *Partial -GetPartialPath(partial PartialFunc) string -GetPartialPathWithQs(partial PartialFunc, qs *Qs) string -``` - -Swapping can also be done by adding a child to an element - -```go -OobSwapWithSelector(ctx *RequestContext, selector string, content *Element, option ...SwapOption) *Element -OobSwap(ctx *RequestContext, content *Element, option ...SwapOption) *Element -SwapMany(ctx *RequestContext, elements ...*Element) -``` - - - -Usage: - -1. I have a Card component that renders a list of tasks. I want to add a new button that completes all the tasks and updates the Card component with the completed tasks. - - -**/components/task.go** - -```go -func Card(ctx *h.RequestContext) *h.Element { - service := tasks.NewService(ctx.ServiceLocator()) - list, _ := service.List() - - return h.Div( - h.Id("task-card"), - h.Class("bg-white w-full rounded shadow-md"), - CardBody(list, getActiveTab(ctx)), - CompleteAllButton(list) - ) -} -``` - -```go -func CompleteAllButton(list []*ent.Task) *h.Element { - notCompletedCount := len(h.Filter(list, func(item *ent.Task) bool { - return item.CompletedAt == nil - })) - - return h.Button( - h.TextF("Complete %s tasks", notCompletedCount), - h.PostPartialWithQs(CompleteAll, - h.NewQs("complete", - h.Ternary(notCompletedCount > 0, "true", "false"), - )), - ) -} -``` - -**/partials/task.go** - -```go -func CompleteAll(ctx *h.RequestContext) *h.Partial { - service := tasks.NewService(ctx.ServiceLocator()) - service.SetAllCompleted(ctx.QueryParam("complete") == "true") - return h.SwapPartial(ctx, - Card(ctx), - ) -} -``` - -When the **CompleteAll** button is clicked, a **POST** will be sent to the **CompleteAll** partial, which will complete all the tasks and then swap out the Card content with the updated list of tasks. Pretty cool right? - -**SwapManyPartial** can be used to swap out multiple items on the page instead of a single one. - -Note: These partial swap methods use https://htmx.org/attributes/hx-swap-oob/ behind the scenes, so it must match -the swap target by id. - -**If** you are only wanting to swap the element that made the xhr request for the partial in the first place, just use `h.NewPartial` instead, it will use the default htmx swapping, and not hx-swap-oob. diff --git a/htmgo-site/md/docs/4_interactivity/2_events.md b/htmgo-site/md/docs/4_interactivity/2_events.md deleted file mode 100644 index ed750d8..0000000 --- a/htmgo-site/md/docs/4_interactivity/2_events.md +++ /dev/null @@ -1,45 +0,0 @@ -## Events Handlers / Commands - -Sometimes you need to update elements client side without having to do a network call. For this you generally have to target an element with javascript and set an attribute, change the innerHTML, etc. - -To make this work while still keeping a pure go feel, we offer a few utility methods to execute various javascript on an element. - -**Example:** When the form is submitted, set the button text to submitting and disable it, and vice versa after submit is done. - -```go -func MyForm() *h.Element { - return h.Form( - h.Button( - h.Text("Submit"), - h.HxBeforeRequest( - js.SetDisabled(true), - js.SetText("Submitting..."), - ), - h.HxAfterRequest( - js.SetDisabled(false), - js.SetText("Submit"), - ), - ), - ) -} -``` - -The structure of this comes down to: - -1. Add an event handler to the element -2. Add commands (found in the **js** package) as children to that event handler - -
    - -**Event Handlers:** - -```go -HxBeforeRequest(cmd ...Command) *LifeCycle -HxAfterRequest(cmd ...Command) *LifeCycle -HxOnMutationError(cmd ...Command) *LifeCycle -OnEvent(event hx.Event, cmd ...Command) *LifeCycle -OnClick(cmd ...Command) *LifeCycle -HxOnAfterSwap(cmd ...Command) *LifeCycle -HxOnLoad(cmd ...Command) *LifeCycle -``` - diff --git a/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md b/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md deleted file mode 100644 index 981e630..0000000 --- a/htmgo-site/md/docs/4_interactivity/3_evaluating_javascript.md +++ /dev/null @@ -1,85 +0,0 @@ -## Evaluating Javascript In Event Handlers - -Event handlers are useful by attaching **commands** to elements to execute javascript on the client side. - -See [#interactivity-events](#interactivity-events) for more information on event handlers. - -
    - -**Note:** Each command you attach to the event handler will be passed 'self' and 'event' (if applicable) as arguments. -'self' is the current element, and 'event' is the event object. - -If you use the OnEvent directly, event names may be any [HTML DOM](https://www.w3schools.com/jsref/dom_obj_event.asp) events, or any [HTMX events](https://htmx.org/events/). - -Commands: - -```go -js.AddAttribute(string, value) -js.RemoveAttribute(string) -js.AddClass(string, value) -js.SetText(string) -js.Increment(count) -js.SetInnerHtml(Ren) -js.SetOuterHtml(Ren) -js.SetDisabled(bool) -js.RemoveClass(string) -js.Alert(string) -js.EvalJs(string) // eval arbitrary js, use 'self' to get the current element as a reference -js.InjectScript(string) -js.InjectScriptIfNotExist(string) -js.GetPartial(PartialFunc) -js.GetPartialWithQs(PartialFunc, Qs) -js.PostPartial(PartialFunc) -js.PostPartialWithQs(PartialFunc, Qs) -js.GetWithQs(string, Qs) -js.PostWithQs(string, Qs) -js.ToggleClass(string) -js.ToggleClassOnElement(string, string) - -// The following methods are used to evaluate JS on nearby elements. -// Use 'element' to get the element as a reference for the EvalJs methods. -js.EvalJsOnParent(string) -js.EvalJsOnSibling(string, string) -js.EvalJsOnChildren(string, string) -js.SetClassOnParent(string) -js.RemoveClassOnParent(string) -js.SetClassOnChildren(string, string) -js.RemoveClassOnChildren(string, string) -js.SetClassOnSibling(string, string) -js.RemoveClassOnSibling(string, string) - -``` -For more usages: see https://htmgo.dev/examples/form - - -**Example:** Evaluating arbitrary JS - -```go -func MyButton() *h.Element { - return h.Button( - h.Text("Submit"), - h.OnClick( - // make sure you use 'self' instead of 'this' - // for referencing the current element - h.EvalJs(` - if(Math.random() > 0.5) { - self.innerHTML = "Success!"; - } - `, - ), - ), - ) -} -``` - -tip: If you are using Jetbrains IDE's, you can write `// language=js` as a comment above the function call (h.EvalJS) and it will automatically give you syntax highlighting on the raw JS. - -```go -// language=js -h.EvalJs(` - if(Math.random() > 0.5) { - self.innerHTML = "Success!"; - } - `, -), -``` diff --git a/htmgo-site/md/docs/5_performance/1_caching_globally.md b/htmgo-site/md/docs/5_performance/1_caching_globally.md deleted file mode 100644 index d8c7e9c..0000000 --- a/htmgo-site/md/docs/5_performance/1_caching_globally.md +++ /dev/null @@ -1,57 +0,0 @@ -## Performance -### Caching Components Globally - -You may want to cache components to improve performance. This is especially useful for components that are expensive to render -or make external requests for data. - -To cache a component in htmgo, we offer: - -```go -// No arguments passed to the component -h.Cached(duration time.Duration, cb GetElementFunc) -// One argument passed to the component -h.CachedT(duration time.Duration, cb GetElementFunc) -// Two arguments passed to the component -h.CachedT2(duration time.Duration, cb GetElementFunc) -// Three arguments passed to the component -h.CachedT3(duration time.Duration, cb GetElementFunc) -// Four arguments passed to the component -h.CachedT4(duration time.Duration, cb GetElementFunc) -``` -For caching components per user, see [Caching Components Per User](#performance-caching-per-user). - -
    - -The `duration` parameter is the time the component should be cached for. The `cb` parameter is a function that returns the component. - -When a request is made for a cached component, the component is rendered and stored in memory. Subsequent requests for the same component within the cache duration will return the cached component instead of rendering it again. - -**Usage:** - -```go -func ExpensiveComponent(ctx *h.RequestContext) *h.Element { - // Some expensive call - data := http.Get("https://api.example.com/data") - return h.Div( - h.Text(data), - ) -} - -var CachedComponent = h.CachedT(5*time.Minute, func(ctx *h.RequestContext) *h.Element { - return ExpensiveComponent(ctx) -}) - -func IndexPage(ctx *h.RequestContext) *h.Page { - return h.NewPage( - CachedComponent(ctx), - ) -} -``` - -**Note:** We are using CachedT because the component takes one argument, the RequestContext. -If the component takes more arguments, use CachedT2, CachedT3, etc. - -**Important Note When Using CachedT and NOT CachedPerKeyT:** -1. When using h.CachedT(T2, T3, etc) and not **CachedPerKey**, The cached value is stored globally in memory, so it is shared across all requests. Do not store request-specific data in a cached component. Only cache components that you are OK with all users seeing the same data. -2. The arguments passed into cached component **DO NOT** affect the cache key. You will get the same cached component regardless of the arguments passed in. This is different from what you may be used to from something like React useMemo. -3. Ensure the declaration of the cached component is **outside the function** that uses it. This is to prevent the component from being redeclared on each request. diff --git a/htmgo-site/md/docs/5_performance/1_caching_per_user.md b/htmgo-site/md/docs/5_performance/1_caching_per_user.md deleted file mode 100644 index 6ba40b0..0000000 --- a/htmgo-site/md/docs/5_performance/1_caching_per_user.md +++ /dev/null @@ -1,80 +0,0 @@ -### Caching Components Per User - -If you need to cache a component per user, you can use the `CachedPerKey` functions. -These functions allow you to cache a component by a specific key. This key can be any string that uniquely identifies the user. - -Note: I'm using the term 'user' to simply mean a unique identifier. This could be a user ID, session ID, or any other unique identifier. - -To cache a component by unique identifier / key in htmgo, we offer: - -```go -// No arguments passed to the component, the component can be cached by a specific key -h.CachedPerKey(duration time.Duration, cb GetElementFuncWithKey) -// One argument passed to the component, the component can be cached by a specific key -h.CachedPerKeyT1(duration time.Duration, cb GetElementFuncWithKey) -// Two argument passed to the component, the component can be cached by a specific key -h.CachedPerKeyT2(duration time.Duration, cb GetElementFuncWithKey) -// Three arguments passed to the component, the component can be cached by a specific key -h.CachedPerKeyT3(duration time.Duration, cb GetElementFuncWithKey) -// Four arguments passed to the component, the component can be cached by a specific key -h.CachedPerKeyT4(duration time.Duration, cb GetElementFuncWithKey) - -``` - -The `duration` parameter is the time the component should be cached for. The `cb` parameter is a function that returns the component and the key. - -When a request is made for a cached component, the component is rendered and stored in memory. Subsequent requests for the same component with the same key within the cache duration will return the cached component instead of rendering it again. - -**Usage:** - -```go -var CachedUserDocuments = h.CachedPerKeyT(time.Minute*15, func(ctx *h.RequestContext) (string, h.GetElementFunc) { - userId := getUserIdFromSession(ctx) - return userId, func() *h.Element { - return UserDocuments(ctx) - } -}) - -func UserDocuments(ctx *h.RequestContext) *h.Element { - docService := NewDocumentService(ctx) - // Expensive call - docs := docService.getDocuments() - return h.Div( - h.Class("grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"), - h.List(docs, func(doc Document, index int) *h.Element { - return h.Div( - h.Class("p-4 bg-white border border-gray-200 rounded-md"), - h.H3(doc.Title), - h.P(doc.Description), - ) - }), - ) -} - -func MyPage(ctx *h.RequestContext) *h.Page { - - // Note this is not a real way to create a context, just an example - user1 := &h.RequestContext{ - Session: "user_1_session", - } - - user2 := &h.RequestContext{ - Session: "user_2_session", - } - - // Different users will get different cached components - return h.NewPage( - CachedUserDocuments(user1), - CachedUserDocuments(user2), - ) -} - -``` - -**Note:** We are using CachedPerKeyT because the component takes one argument, the RequestContext. -If the component takes more arguments, use CachedPerKeyT2, CachedPerKeyT3, etc. - -**Important** -1. The cached value is stored globally in memory by key, it is shared across all requests. Ensure if you are storing request-specific data in a cached component, you are using a unique key for each user. -2. The arguments passed into cached component **DO NOT** affect the cache key. The only thing that affects the cache key is the key returned by the `GetElementFuncWithKey` function. -3. Ensure the declaration of the cached component is **outside the function** that uses it. This is to prevent the component from being redeclared on each request. diff --git a/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md b/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md deleted file mode 100644 index 4cd76b4..0000000 --- a/htmgo-site/md/docs/6_pushing_data/1_server_sent_events.md +++ /dev/null @@ -1,64 +0,0 @@ -## Server Sent Events (SSE) - -htmgo supports server-sent events (SSE) out of the box. -This allows you to push data from the server to the client in real-time. - -Example of this can be found in the [chat-app](https://htmgo.dev/examples/chat) example. - -## How it works ## -1. The client sends a request to the server to establish a connection. -2. The server holds the connection open and sends data (in our case, most likely elements) to the client whenever there is new data to send. -3. The htmgo SSE extension uses https://htmx.org/attributes/hx-swap-oob/ to swap out the elements that the server sends. - - -**Note**: SSE is **unidirectional** (the server can only send data to the client). -For the client to send data to the server, normal xhr behavior should be used (form submission, triggers, etc). - -## Usage -1. Add the SSE connection attribute and the path to the handler that will handle the connection. - -```go -h.Attribute("sse-connect", fmt.Sprintf("/chat/%s", roomId)) -``` - -The following **Event Handlers** can be used to react to SSE connections. -```go -h.HxOnSseOpen -h.HxBeforeSseMessage -h.HxAfterSseMessage -h.HxOnSseError -h.HxOnSseClose -h.HxOnSseConnecting -``` - -**Example:** Adding an event listener handle SSE errors. - -```go -h.HxOnSseError( - js.EvalJs(fmt.Sprintf(` - const reason = e.detail.event.data - if(['invalid room', 'no session', 'invalid user'].includes(reason)) { - window.location.href = '/?roomId=%s'; - } else if(e.detail.event.code === 1011) { - window.location.reload() - } else if (e.detail.event.code === 1008 || e.detail.event.code === 1006) { - window.location.href = '/?roomId=%s'; - } else { - console.error('Connection closed:', e.detail.event) - } - `, roomId, roomId)), -), -``` - -**Example:** Clearing the input field after sending a message. -```go -func MessageInput() *h.Element { - return h.Input("text", - h.Id("message-input"), - h.Required(), - h.HxAfterSseMessage( - js.SetValue(""), - ), - ) -} -``` diff --git a/htmgo-site/md/docs/7_htmx_extensions/1_overview.md b/htmgo-site/md/docs/7_htmx_extensions/1_overview.md deleted file mode 100644 index b47de67..0000000 --- a/htmgo-site/md/docs/7_htmx_extensions/1_overview.md +++ /dev/null @@ -1,34 +0,0 @@ -## HTMX Extensions - -htmgo provides a few extra htmx extensions to make common tasks easier. -Some of these extensions are optional, and some of these are required for htmgo to work correctly. - -The following extensions are provided by htmgo: -- [Trigger Children](#htmx-extensions-trigger-children) -- [Mutation Error](#htmx-extensions-mutation-error) -- [SSE](#pushing-data-server-sent-events) -- [Path Deps](https://github.com/bigskysoftware/htmx-extensions/blob/main/src/path-deps/README.md) - -Default extensions should be included in your project by adding the following attribute to your html tag. -```go -h.Html( - h.HxExtension(h.BaseExtensions()) -) -``` - -If you need to combine multiple extensions, you can use: - -```go -h.HxExtensions(h.BaseExtensions(), "my-extension"), -``` -or -```go -h.JoinExtensions( - h.HxExtension("sse"), - h.HxExtension("my-extension"), -), -``` - - -**Important**: h.BaseExtensions will add the the 'htmgo' extension, which is a required extension for inline scripts to work properly, please always include it in your project. - diff --git a/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md b/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md deleted file mode 100644 index 70053db..0000000 --- a/htmgo-site/md/docs/7_htmx_extensions/2_trigger_children.md +++ /dev/null @@ -1,13 +0,0 @@ -## HTMX Extensions - Trigger Children - -The `trigger-children` extension allows you to trigger an event on all children and siblings of an element. - -This is useful for things such as: -1. Letting a child element (such as a button) inside a form know the form was submitted - -
    - -**Example:** https://htmgo.dev/examples/form - -In this example: The trigger-children extension will trigger **hx-before-request** and **hx-after-request** -on all children of the form when the form is submitted, and the button reacts to that by showing a loading state. diff --git a/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md b/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md deleted file mode 100644 index 467206a..0000000 --- a/htmgo-site/md/docs/7_htmx_extensions/3_mutation_error.md +++ /dev/null @@ -1,24 +0,0 @@ -## HTMX Extensions - Mutation Error - -The `mutation-error` extension allows you to trigger an event when a request returns a >= 400 status code. - -This is useful for things such as: -1. Letting a child element (such as a button) inside a form know there was an error. - -
    - -**Example:** -```go -h.Form( - h.HxTriggerChildren(), - h.HxMutationError( - js.Alert("An error occurred"), - ), - h.Button( - h.Type("submit"), - h.Text("Submit"), - ), -) -``` - -It can also be used on children elements that do not make an xhr request, if you combine it with the `hx-trigger-children` extension. diff --git a/htmgo-site/md/docs/8_miscellaneous/1_tailwind_intellisense.md b/htmgo-site/md/docs/8_miscellaneous/1_tailwind_intellisense.md deleted file mode 100644 index 8c958dc..0000000 --- a/htmgo-site/md/docs/8_miscellaneous/1_tailwind_intellisense.md +++ /dev/null @@ -1,53 +0,0 @@ -## Tailwind intellisense - -Tailwind's language server allows you to specify custom configuration on what it should match to start giving you tailwind intellisense. - - -![](/public/tailwind-intellisense.png) - -To make this work, you will need to update the tailwind lsp config with the config below: - -Main thing to note here is -1. "go" is added to the includeLanguages list -2. classRegex is updated to match the tailwind classes in the go code. - -### Jetbrains IDE's (GoLand) -```json -{ - "includeLanguages": { - "go": "html" - }, - "experimental": { - "configFile": null, - "classRegex": [ - ["Class\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], - ["ClassX\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], - ["ClassIf\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], - ["Classes\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"] - ] - } -} -``` -To find this configuration in GoLand you can go to `Settings -> Languages & Frameworks -> Style Sheets -> Tailwind CSS` and update the configuration there. -These changes are additive, add these options to your existing tailwind lsp config, instead of replacing the entire file. - -See more: https://github.com/tailwindlabs/tailwindcss/issues/7553#issuecomment-735915659 - -
    - -### Visual Studio Code -For VSCode, you should be able to update your settings.json with the following values: - -```json -{ - "tailwindCSS.includeLanguages": { - "go": "html" - }, - "tailwindCSS.experimental.classRegex": [ - ["Class\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], - ["ClassX\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], - ["ClassIf\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`]"], - ["Classes\\(([^)]*)\\)", "[\"`]([^\"`]*)[\"`"] - ] -} -``` diff --git a/htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md b/htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md deleted file mode 100644 index 54fb86c..0000000 --- a/htmgo-site/md/docs/8_miscellaneous/2_converting_raw_html_to_go.md +++ /dev/null @@ -1,4 +0,0 @@ -## Converting Raw HTML to Go - -In some cases, you may want to convert raw HTML to Go code. -A tool to do this automatically is available here: https://htmgo.dev/html-to-go diff --git a/htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md b/htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md deleted file mode 100644 index 18b124d..0000000 --- a/htmgo-site/md/docs/8_miscellaneous/3_htmgo format.md +++ /dev/null @@ -1,60 +0,0 @@ -## Htmgo Format - -htmgo has a built-in formatter that can be used to format htmgo element blocks. - -It is available through the 'htmgo' cli tool that is installed with htmgo. - -**Note:** if you have previously installed htmgo, you will need to run `GOPROXY=direct go install github.com/maddalax/htmgo/cli/htmgo@latest` to update the cli tool. - -
    -To use it, run the following command: - -```bash -// format all .go files in the current directory recursively -htmgo format . - -// format the file specified -htmgo format ./my-file.go -``` - -This will format all htmgo element blocks in your project. - -**Example:** - -```go -h.Div( - h.Class("flex gap-2"), h.Text("hello"), h.Text("world"), -) -``` - -**Output:** - -```go -h.Div( - h.Class("flex gap-2"), - h.Text("hello"), - h.Text("world"), -) -``` - -## Running htmgo format on save - -### Jetbrains IDE's - -1. Go to Settings -> Tools -> File Watchers -> + custom - -2. Set the following values: - -```yaml -Name: htmgo format -File Type: Go -Scope: Current File -Program: htmgo -Arguments: format $FilePath$ -Output paths to refresh: $FilePath$ -Working directory: $ProjectFileDir$ -``` - -3. Save the file watcher and ensure it is enabled - -4. Go to `Settings -> Tools -> Actions On Save` and ensure the `htmgo format` action is enabled diff --git a/htmgo-site/md/docs/9_troubleshooting/1_common_issues.md b/htmgo-site/md/docs/9_troubleshooting/1_common_issues.md deleted file mode 100644 index e9d9792..0000000 --- a/htmgo-site/md/docs/9_troubleshooting/1_common_issues.md +++ /dev/null @@ -1,4 +0,0 @@ -## Troubleshooting: - -**command not found: htmgo** -ensure you installed htmgo above and ensure GOPATH is set in your shell diff --git a/htmgo-site/pages/root.go b/htmgo-site/pages/base/root.go similarity index 69% rename from htmgo-site/pages/root.go rename to htmgo-site/pages/base/root.go index 1a1918e..c3f7edf 100644 --- a/htmgo-site/pages/root.go +++ b/htmgo-site/pages/base/root.go @@ -1,4 +1,4 @@ -package pages +package base import ( "github.com/google/uuid" @@ -8,9 +8,30 @@ import ( var Version = uuid.NewString()[0:6] -func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Page { +type RootPageProps struct { + Title string + Description string + Canonical string + Children h.Ren +} + +func ConfigurableRootPage(ctx *h.RequestContext, props RootPageProps) *h.Page { title := "htmgo" description := "build simple and scalable systems with go + htmx" + canonical := ctx.Request.URL.String() + + if props.Canonical != "" { + canonical = props.Canonical + } + + if props.Title != "" { + title = props.Title + } + + if props.Description != "" { + description = props.Description + } + return h.NewPage( h.Html( h.HxExtension( @@ -25,8 +46,8 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Page { h.Meta("author", "htmgo"), h.Meta("description", description), h.Meta("og:title", title), - h.Meta("og:url", "https://htmgo.dev"), - h.Link("canonical", "https://htmgo.dev"), + h.Meta("og:url", ctx.Request.URL.String()), + h.Link("canonical", canonical), h.Link("https://cdn.jsdelivr.net/npm/@docsearch/css@3", "stylesheet"), h.Meta("og:description", description), h.LinkWithVersion("/public/main.css", "stylesheet", Version), @@ -39,7 +60,7 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Page { ), h.Body( h.Class("bg-white h-screen"), - h.Fragment(children...), + props.Children, h.Script("https://cdn.jsdelivr.net/npm/@docsearch/js@3"), h.UnsafeRawScript(` docsearch({ @@ -56,6 +77,17 @@ func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Page { ) } +func RootPage(ctx *h.RequestContext, children ...h.Ren) *h.Page { + return ConfigurableRootPage( + ctx, + RootPageProps{ + Title: "htmgo", + Description: "build simple and scalable systems with go + htmx", + Children: h.Fragment(children...), + }, + ) +} + func PageWithNav(ctx *h.RequestContext, children ...h.Ren) *h.Page { return RootPage( ctx, diff --git a/htmgo-site/pages/docs.go b/htmgo-site/pages/docs.go deleted file mode 100644 index 06e0f99..0000000 --- a/htmgo-site/pages/docs.go +++ /dev/null @@ -1,66 +0,0 @@ -package pages - -import ( - "github.com/maddalax/htmgo/framework/h" - "htmgo-site/internal/dirwalk" - "htmgo-site/partials" - "io/fs" -) - -func DocsPage(ctx *h.RequestContext) *h.Page { - assets := ctx.Get("embeddedMarkdown").(fs.FS) - pages := dirwalk.WalkPages("md/docs", assets) - - return RootPage( - ctx, - h.Div( - h.Class("flex h-full"), - h.Aside( - h.Class("hidden md:block md:min-w-60 text-white overflow-y-auto"), - partials.DocSidebar(pages), - ), - h.Div( - h.Class("flex flex-col flex-1 overflow-hidden"), - partials.NavBar(ctx, partials.NavBarProps{ - Expanded: false, - ShowPreRelease: false, - }), - h.Main( - h.Div( - h.Class("w-full md:hidden bg-neutral-50 overflow-y-auto mb-4 border-b border-b-slate-300"), - partials.DocSidebar(pages), - ), - h.Class("overflow-y-auto justify-center overflow-x-hidden pb-6 items-center w-full"), - h.Div( - h.Class("flex flex-col mx-auto"), - h.Div( - h.Class("flex flex-col justify-center items-center md:mt-6 mx-auto"), - h.List(pages, func(page *dirwalk.Page, index int) *h.Element { - anchor := partials.CreateAnchor(page.Parts) - return h.Div( - h.Class("border-b border-b-slate-300 w-full pb-8 p-4 md:px-0 -mb-2"), - MarkdownContent(ctx, page.FilePath, anchor), - h.Div( - h.Class("ml-4 pl-1 mt-2 bg-rose-200"), - h.If( - anchor == "core-concepts-partials", - h.GetPartial(partials.CurrentTimePartial, "load, every 1s"), - ), - ), - ) - }), - ), - h.Div( - h.Class("flex justify-center items-center mt-6"), - h.A( - h.Text("Back to Top"), - h.Class("py-2 px-3 bg-slate-800 rounded text-white"), - h.Href("#quick-start-introduction"), - ), - ), - ), - ), - ), - ), - ) -} diff --git a/htmgo-site/pages/docs/base.go b/htmgo-site/pages/docs/base.go new file mode 100644 index 0000000..7eaa5af --- /dev/null +++ b/htmgo-site/pages/docs/base.go @@ -0,0 +1,165 @@ +package docs + +import ( + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/pages/base" + "htmgo-site/partials" + "strings" +) + +func Title(title string) *h.Element { + return h.H1( + h.Text(title), + h.Class("text-2xl font-bold"), + ) +} + +func SubTitle(title string) *h.Element { + return h.H2( + h.Text(title), + h.Class("text-xl font-bold"), + ) +} + +func StepTitle(title string) *h.Element { + return h.H2( + h.Text(title), + h.Class("text-lg font-bold"), + ) +} + +func NextStep(classes string, prev *h.Element, next *h.Element) *h.Element { + return h.Div( + h.Class("flex gap-2 justify-between", classes), + prev, + next, + ) +} + +func NextBlock(text string, url string) *h.Element { + return h.A( + h.Href(url), + h.Class("w-[50%] border border-slate-300 p-4 rounded text-right hover:border-blue-400 cursor-pointer"), + h.P( + h.Text("Next"), + h.Class("text-slate-600 text-sm"), + ), + h.P( + h.Text(text), + h.Class("text-blue-500 hover:text-blue-400"), + ), + ) +} + +func PrevBlock(text string, url string) *h.Element { + return h.A( + h.Href(url), + h.Class("w-[50%] border border-slate-300 p-4 rounded text-left hover:border-blue-400 cursor-pointer"), + h.P( + h.Text("Previous"), + h.Class("text-slate-600 text-sm"), + ), + h.P( + h.Text(text), + h.Class("text-blue-500 hover:text-blue-400"), + ), + ) +} + +func Image(src string) *h.Element { + return h.Img( + h.Src(src), + h.Class("rounded w-full"), + ) +} + +func Text(text string) *h.Element { + split := strings.Split(text, "\n") + return h.Div( + h.Class("flex flex-col gap-2 leading-relaxed text-slate-900 break-words"), + h.List(split, func(item string, index int) *h.Element { + return h.P( + h.UnsafeRaw(item), + ) + }), + ) +} + +func Inline(elements ...h.Ren) *h.Element { + return h.Div( + h.Class("flex gap-1 items-center"), + h.Children(elements...), + ) +} + +func HelpText(text string) *h.Element { + return h.Div( + h.Class("text-slate-600 text-sm"), + h.UnsafeRaw(text), + ) +} + +func Link(text string, href string, additionalClasses ...string) *h.Element { + additionalClasses = append(additionalClasses, "text-blue-500 hover:text-blue-400") + return h.A( + h.Href(href), + h.Text(text), + h.Class( + additionalClasses..., + ), + ) +} + +func DocPage(ctx *h.RequestContext, children ...h.Ren) *h.Page { + + title := "htmgo" + for _, section := range sections { + for _, page := range section.Pages { + if page.Path == ctx.Request.URL.Path { + title = page.Title + break + } + } + } + + return base.ConfigurableRootPage( + ctx, + base.RootPageProps{ + Title: title, + Description: "build simple and scalable systems with go + htmx", + Children: h.Div( + h.Class("flex h-full"), + h.Aside( + h.Class("hidden md:block md:min-w-60 text-white overflow-y-auto"), + DocSidebar(), + ), + h.Div( + h.Class("flex flex-col flex-1 overflow-hidden"), + partials.NavBar(ctx, partials.NavBarProps{ + Expanded: false, + ShowPreRelease: false, + }), + h.Main( + h.Div( + h.Class("w-full md:hidden bg-neutral-50 overflow-y-auto mb-4 border-b border-b-slate-300"), + DocSidebar(), + ), + h.Class("overflow-y-auto overflow-x-hidden pb-6 items-center w-full"), + h.Div( + h.Class("flex flex-col mx-auto"), + h.Div( + h.Class("flex flex-col justify-center items-center md:mt-6 mx-auto"), + h.Div( + h.Class( + "w-full flex flex-col max-w-[90vw] md:max-w-[65vw] xl:max-w-4xl", + ), + h.Children(children...), + ), + ), + ), + ), + ), + ), + }, + ) +} diff --git a/htmgo-site/md/docs/9_configuration/htmgo_config.md b/htmgo-site/pages/docs/config/htmgo-config.go similarity index 54% rename from htmgo-site/md/docs/9_configuration/htmgo_config.md rename to htmgo-site/pages/docs/config/htmgo-config.go index 6ba4b79..ad3e139 100644 --- a/htmgo-site/md/docs/9_configuration/htmgo_config.md +++ b/htmgo-site/pages/docs/config/htmgo-config.go @@ -1,10 +1,36 @@ -## Htmgo Configuration: +package config -Certain aspects of htmgo can be configured via a `htmgo.yml` file in the root of your project. +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) -Here is an example configuration file: +func HtmgoConfig(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Htmgo Config"), + Text(` + Certain aspects of htmgo can be configured via a htmgo.yml file in the root of your project. + Here is an example configuration file: + `), + ui.CodeSnippet(ui.CodeSnippetProps{ + Code: htmgoConfig, + Lang: "yaml", + HideLineNumbers: true, + }), + NextStep( + "mt-4", + PrevBlock("Formatter", DocPath("/misc/formatter")), + NextBlock("Examples", "/examples"), + ), + ), + ) +} -```yaml +const htmgoConfig = ` # htmgo configuration # if tailwindcss is enabled, htmgo will automatically compile your tailwind and output it to assets/dist @@ -23,4 +49,4 @@ automatic_page_routing_ignore: ["root.go"] # files or directories to ignore when automatically registering routes for partials # supports glob patterns through https://github.com/bmatcuk/doublestar automatic_partial_routing_ignore: [] -``` +` diff --git a/htmgo-site/pages/docs/control/if-else.go b/htmgo-site/pages/docs/control/if-else.go new file mode 100644 index 0000000..00f961e --- /dev/null +++ b/htmgo-site/pages/docs/control/if-else.go @@ -0,0 +1,73 @@ +package control + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +func IfElse(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("If / Else Statements"), + Text(` + If / else statements are useful when you want to conditionally render attributes or elements / components. + htmgo provides a couple of utilities to do so: + `), + Text("Example: Rendering an icon if the task is complete"), + ui.GoCodeSnippet(IfElseExample), + Text("Example: Using ternary operator to call different partials based on a condition"), + ui.GoCodeSnippet(TenaryExample), + Text(`Example: Rendering multiple classes based on a condition`), + ui.GoCodeSnippet(ConditionalClassExample), + Text("Example: Rendering a single class based on a condition"), + ui.GoCodeSnippet(ClassIfElseExample), + Text("Example: Rendering different elements based on a condition"), + ui.GoCodeSnippetSingleLine(IfElseExample2), + Text(` + Note: This will execute both EditTaskForm and ViewTask, no matter if the condition is true or false, since a function is being called here. + If you do not want to call the function at all unless the condition is true, use h.IfElseLazy + `), + ui.GoCodeSnippetSingleLine(IfElseExample3), + NextStep( + "mt-4", + PrevBlock("Raw HTML", DocPath("/core-concepts/raw-html")), + NextBlock("Rendering Lists", DocPath("/control/loops")), + ), + ), + ) +} + +const IfElseExample = ` +h.Div( + h.If( + task.CompletedAt != nil, + CompleteIcon() + ) +) +` + +const TenaryExample = `h.Div( + h.PostPartialWithQs( + h.Ternary(!editing, StartEditing, SaveEditing), + h.NewQs("id", record.Id), + ), +) +` + +const ConditionalClassExample = `h.ClassX("w-10 h-10 border rounded-full", map[string]bool { + "border-green-500": task.CompletedAt != nil, + "border-slate-400": task.CompletedAt == nil, +})` + +const IfElseExample2 = `h.IfElse(editing, EditTaskForm(), ViewTask())` + +const IfElseExample3 = `h.IfElseLazy(editing, EditTaskForm, ViewTask)` + +const ClassIfElseExample = ` +h.Div( + h.ClassIf(task.CompletedAt != nil, "border-green-500"), +) +` diff --git a/htmgo-site/pages/docs/control/loops.go b/htmgo-site/pages/docs/control/loops.go new file mode 100644 index 0000000..4f824f0 --- /dev/null +++ b/htmgo-site/pages/docs/control/loops.go @@ -0,0 +1,55 @@ +package control + +import . "htmgo-site/pages/docs" +import "htmgo-site/ui" +import "github.com/maddalax/htmgo/framework/h" + +func Loops(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Loops / Dealing With Lists"), + Text(` + Very commonly you will need to render a list or slice of items onto the page. + Frameworks generally solve this in different ways, such as React uses regular JS .map function to solve it. + htmgo provides a couple of utilities to do so: + `), + Text("Example: Rendering a list of tasks"), + ui.GoCodeSnippet(ListExample), + Text("Example: Rendering a map"), + ui.GoCodeSnippet(MapExample), + NextStep( + "mt-4", + PrevBlock("Conditionals", DocPath("/control/if-else")), + NextBlock("Adding Interactivity", DocPath("/interactivity/swapping")), + ), + ), + ) +} + +const ListExample = ` +var items = []string{"item1", "item2", "item3"} +h.List(items, func(item string, index int) *h.Element { + if tab == TabComplete && item.CompletedAt == nil { + return h.Empty() + } + return h.Div( + h.Text(item), + ) +}) +` + +const MapExample = ` +var values = map[string]string{ + "key1": "value1", + "key2": "value2", + "key3": "value3", +} +h.IterMap(values, func(key string, value string) *h.Element { + return h.Div( + h.Text(key), + h.Text(value), + ) +}) +` diff --git a/htmgo-site/pages/docs/core-concepts/components.go b/htmgo-site/pages/docs/core-concepts/components.go new file mode 100644 index 0000000..cb8f536 --- /dev/null +++ b/htmgo-site/pages/docs/core-concepts/components.go @@ -0,0 +1,41 @@ +package core_concepts + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +func Components(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Components"), + Text(` + Components are re-usable bits of logic to render HTML. Similar to how in React components are Javascript functions, in htmgo, components are pure go functions. + A component can be pure, or it can have data fetching logic inside of it. Since htmgo uses htmx for interactivity, there is NO re-rendering of your UI automatically from the framework, which means you can safely put data fetching logic inside of components since you can be sure they will only be called by your own code. + `), + ComponentExample(), + NextStep( + "mt-4", + PrevBlock("Partials", DocPath("/core-concepts/partials")), + NextBlock("Tags and Attributes", DocPath("/core-concepts/tags-and-attributes")), + ), + ), + ) +} + +func ComponentExample() *h.Element { + return h.Div( + Text("Example:"), + ui.GoCodeSnippet(PagesSnippet), + Text(` + My card component here fetches all my tasks I have on my list, and renders each task. + If you are familiar with React, then you would likely place this fetch logic inside of a useEffect or (useQuery library) so it is not constantly re-fetched as the component re-renders. + With htmgo, the only way to update content on the page is to use htmx to swap out the content from loading a partial. Therefore you control exactly when this card component is called, not the framework behind the scenes. + + You'll learn more about swapping in the next few pages. + `), + ) +} diff --git a/htmgo-site/pages/docs/core-concepts/pages.go b/htmgo-site/pages/docs/core-concepts/pages.go new file mode 100644 index 0000000..bf79d57 --- /dev/null +++ b/htmgo-site/pages/docs/core-concepts/pages.go @@ -0,0 +1,113 @@ +package core_concepts + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +var ExcludeRootSnippet = `automatic_page_routing_ignore: ["pages/root.go"]` + +var AbstractedRootPageUsageSnippet = `func UserPage(ctx *h.RequestContext) *h.Page { + return base.RootPage( + h.Div( + h.Pf("User ID: %s", ctx.Param("id")), + ), +}` + +var RootPageSnippet = `func RootPage(children ...h.Ren) *h.Page { + return h.NewPage( + h.Html( + h.HxExtension(h.BaseExtensions()), + h.Head( + h.Meta("viewport", "width=device-width, initial-scale=1"), + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + ), + h.Body( + h.Class("bg-stone-50 min-h-screen overflow-x-hidden"), + ui.NavBar(), + h.Fragment(children...), + ), + ) + ) +} +` + +var PagesSnippet = `// route will be automatically registered based on the file name +func HelloHtmgoPage(ctx *h.RequestContext) *h.Page { + return h.NewPage( + h.Html( + h.HxExtension(h.BaseExtensions()), + h.Head( + h.Link("/public/main.css", "stylesheet"), + h.Script("/public/htmgo.js"), + ), + h.Body( + h.Pf("Hello, htmgo!"), + ), + ), + ) +}` + +func Pages(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Pages"), + Text(` + Pages are the entry point of an htmgo application. + A simple page may look like: + `), + ui.GoCodeSnippet(PagesSnippet), + h.Text(` + htmgo uses std http with chi router as its web server, *h.RequestContext is a thin wrapper around *http.Request. + A page must return *h.Page, and accept *h.RequestContext as a parameter + `), + autoRegistration(), + tips(), + NextStep( + "mt-4", + PrevBlock("Getting Started", DocPath("/installation")), + NextBlock("Partials", DocPath("/core-concepts/partials")), + ), + ), + ) +} + +func autoRegistration() *h.Element { + return h.Div( + h.Class("flex flex-col gap-2"), + SubTitle("Auto Registration"), + Text(` + htmgo uses file based routing. This means that we will automatically generate and register your routes with chi based on the files you have in the 'pages' directory. + For example, if you have a directory structure like so below, it will get registered into chi router as follows: + + index.go -> /index + users.go -> /users + users.$id.go -> /users/:id + `), + HelpText(`Note: id parameter can be accessed in your page with ctx.Param("id")`), + Text(` + You may put any functions you like in your pages file, auto registration will ONLY register functions that return *h.Page + `), + ) +} + +func tips() *h.Element { + return h.Div( + h.Class("flex flex-col gap-2"), + SubTitle("Tips:"), + Text(` + Generally it is it recommended to abstract common parts of your page into its own component and re-use it, such as script tags, including styling, etc. + Example: + `), + ui.GoCodeSnippet(RootPageSnippet), + Text("Usage:"), + ui.GoCodeSnippet(AbstractedRootPageUsageSnippet), + Text("You need to then update htmgo.yml to exclude that file from auto registration"), + ui.SingleLineBashCodeSnippet(ExcludeRootSnippet), + HelpText("In this example, my root page is in a file called root.go in the pages dir, so I need to exclude it from auto registration, otherwise htmgo wil try to generate a route for it."), + ) +} diff --git a/htmgo-site/pages/docs/core-concepts/partials.go b/htmgo-site/pages/docs/core-concepts/partials.go new file mode 100644 index 0000000..3e24697 --- /dev/null +++ b/htmgo-site/pages/docs/core-concepts/partials.go @@ -0,0 +1,84 @@ +package core_concepts + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/partials" + "htmgo-site/ui" +) + +var PartialsSnippet = `func CurrentTimePartial(ctx *h.RequestContext) *h.Partial { + now := time.Now() + return h.NewPartial( + h.Div( + h.Pf("The current time is %s", now.Format(time.RFC3339)), + ), + ) +}` + +var examplePageSnippet = `func CurrentTimePage(ctx *h.RequestContext) *h.Page { + return RootPage( + h.GetPartial(partials.CurrentTimePartial, "load, every 1s") + ) +}` + +var examplePartialSnippet = `func CurrentTimePartial(ctx *h.RequestContext) *h.Partial { + now := time.Now() + return h.NewPartial( + h.Div( + h.Pf("The current time is %s", now.Format(time.RFC3339)), + ), + ) +}` + +func Partials(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Partials"), + Text(` + Partials are where things get interesting. + Partials allow you to start adding interactivity to your website by swapping in content, setting headers, redirecting, etc. + Partials have a similar structure to pages. A simple partial may look like: + `), + ui.GoCodeSnippet(PartialsSnippet), + h.Text(` + This will get automatically registered in the same way that pages are registered, based on the file path. + This allows you to reference partials directly via the function itself when rendering them, instead of worrying about the route. + `), + example(), + NextStep( + "mt-4", + PrevBlock("Pages", DocPath("/core-concepts/pages")), + NextBlock("Components", DocPath("/core-concepts/components")), + ), + ), + ) +} + +func example() *h.Element { + return h.Div( + h.Class("flex flex-col gap-2"), + SubTitle("Simple Example"), + Text(` + I want to build a page that renders the current time, updating every second. Here is how that may look: + `), + h.Pf( + "pages/time.go", + h.Class("font-semibold"), + ), + ui.GoCodeSnippet(examplePageSnippet), + h.Pf( + "partials/time.go", + h.Class("font-semibold"), + ), + ui.GoCodeSnippet(examplePartialSnippet), + Text( + `When the page load, the partial will be loaded in via htmx, and then swapped in every 1 second. + With this little amount of code and zero written javascript, you have a page that shows the current time and updates every second.`), + h.Div( + h.GetPartial(partials.CurrentTimePartial, "load, every 1s"), + ), + ) +} diff --git a/htmgo-site/pages/docs/core-concepts/raw-html.go b/htmgo-site/pages/docs/core-concepts/raw-html.go new file mode 100644 index 0000000..8ec3895 --- /dev/null +++ b/htmgo-site/pages/docs/core-concepts/raw-html.go @@ -0,0 +1,45 @@ +package core_concepts + +import "htmgo-site/ui" +import "github.com/maddalax/htmgo/framework/h" +import . "htmgo-site/pages/docs" + +func RawHtml(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Raw HTML"), + Text(` + In some cases, you may want to render raw html instead of using htmgo's functions. + This can be done by using the following methods: + `), + Text("Rendering raw html:"), + ui.GoCodeSnippetSingleLine(RawHtmlExample), + Text("Rendering with formatting:"), + ui.GoCodeSnippetSingleLine(RawHtmlExample2), + Text("Rendering a script:"), + ui.GoCodeSnippetSingleLine(RawHtmlExample3), + Text(` + Important: Be careful when using these methods, these methods do not escape the HTML content + and should never be used with user input unless you have sanitized the input. + `), + h.P( + h.Text("Sanitizing input can be done using "), + Link("https://pkg.go.dev/html#EscapeString", "html.EscapeString"), + h.Text(" or by using "), + Link("bluemonday", "https://github.com/microcosm-cc/bluemonday."), + h.Text(" for more control over sanitization."), + ), + NextStep( + "mt-4", + PrevBlock("Tags and Attributes", DocPath("/core-concepts/tags-and-attributes")), + NextBlock("Conditionals", DocPath("/control/if-else")), + ), + ), + ) +} + +const RawHtmlExample = `h.UnsafeRaw("
    Raw HTML
    ")` +const RawHtmlExample2 = `h.UnsafeRawF("
    %s
    ", "Raw HTML")` +const RawHtmlExample3 = `h.UnsafeRawScript("alert('Hello World')")` diff --git a/htmgo-site/pages/docs/core-concepts/tags-and-attributes.go b/htmgo-site/pages/docs/core-concepts/tags-and-attributes.go new file mode 100644 index 0000000..8b6634f --- /dev/null +++ b/htmgo-site/pages/docs/core-concepts/tags-and-attributes.go @@ -0,0 +1,84 @@ +package core_concepts + +import "htmgo-site/ui" +import "github.com/maddalax/htmgo/framework/h" +import . "htmgo-site/pages/docs" + +func TagsAndAttributes(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Tags and Attributes"), + Text(` + In htmgo, html is built using a set of functions that return *h.Element. + These functions are all defined in the 'h' package in htmgo/framework + htmgo provides methods to render most if not all html tags and attributes. + `), + Text(`Example:`), + ui.GoCodeSnippet(TagExample), + Text(` + All methods can be found in the 'h' package in htmgo/framework + `), + Text("h.Tag and h.Attribute are available to use when you need to render a tag or attribute that htmgo does not provide a method for."), + ui.GoCodeSnippet(TagExampleUsingTagFunc), + Text(` + Attributes are one of the main ways we can add interactivity to the pages with htmx. + htmgo provides various methods to add attributes to elements, as well as adding attributes based on a condition. + `), + ui.GoCodeSnippet(AttributeExample), + HelpText("In this example we are conditionally adding an attribute based on if there is an error on not, you'll learn more about conditionals in the next few pages."), + Text("Example using htmx attributes:"), + ui.GoCodeSnippet(HxAttributeExample), + NextStep( + "mt-4", + PrevBlock("Components", DocPath("/core-concepts/components")), + NextBlock("Raw HTML", DocPath("/core-concepts/raw-html")), + ), + ), + ) +} + +const TagExample = `h.Div( + h.Class("flex gap-2"), + h.Button( + h.Text("Submit"), + ), +) +` + +const TagExampleUsingTagFunc = `h.Tag("my-custom-tag", + h.Class("flex gap-2"), + h.Button( + h.Attribute("x-custom-attr", "my-value"), + h.Text("Submit"), + ), +) +` + +const AttributeExample = `h.Div( + h.Class("flex gap-2"), + h.Id("my-div"), + h.If( + error != "", + h.Class("p-4 bg-rose-400 text-white rounded"), + ) +) +` + +const HxAttributeExample = `h.Tr( + h.Class("flex gap-2"), + h.HxInclude("input") + h.Td( + h.Input("text", + h.Class("p-4 rounded"), + h.Placeholder("Type something"), + h.Name("my-input"), + ) + ), + h.Td( + h.Button( + h.Text("Submit"), + ) + ), +)` diff --git a/htmgo-site/pages/docs/htmx-extensions/mutation-error.go b/htmgo-site/pages/docs/htmx-extensions/mutation-error.go new file mode 100644 index 0000000..d4ee6fa --- /dev/null +++ b/htmgo-site/pages/docs/htmx-extensions/mutation-error.go @@ -0,0 +1,42 @@ +package htmx_extensions + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +func MutationError(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Mutation Error"), + Text(` + The 'mutation-error' extension allows you to trigger an event when a request returns a >= 400 status code. + This is useful for things such as letting a child element (such as a button) inside a form know there was an error. + `), + Text(`Example:`), + ui.GoCodeSnippet(MutationErrorExample), + Text(`It can also be used on children elements that do not make an xhr request, if you combine it with the TriggerChildren extension.`), + NextStep( + "mt-4", + PrevBlock("Trigger Children", DocPath("/htmx-extensions/trigger-children")), + NextBlock("Tailwind Intellisense", DocPath("/misc/tailwind-intellisense")), + ), + ), + ) +} + +const MutationErrorExample = ` +h.Form( + h.HxTriggerChildren(), + h.HxMutationError( + js.Alert("An error occurred"), + ), + h.Button( + h.Type("submit"), + h.Text("Submit"), + ), +) +` diff --git a/htmgo-site/pages/docs/htmx-extensions/overview.go b/htmgo-site/pages/docs/htmx-extensions/overview.go new file mode 100644 index 0000000..56c59d2 --- /dev/null +++ b/htmgo-site/pages/docs/htmx-extensions/overview.go @@ -0,0 +1,80 @@ +package htmx_extensions + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +func Overview(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("HTMX Extensions"), + Text(` + htmgo provides a few extra htmx extensions to make common tasks easier. + Some of these extensions are optional, and some of these are required for htmgo to work correctly. + `), + Text(` + The following extensions are provided by htmgo: + `), + Link("Trigger Children", "/docs/htmx-extensions/trigger-children"), + Link("Mutation Error", "/docs/htmx-extensions/mutation-error"), + Link("Path Deps", "https://github.com/bigskysoftware/htmx-extensions/blob/main/src/path-deps/README.md"), + h.P( + h.Class("mt-3"), + h.Text("Default extensions should be included in your project by adding the following attribute to your html tag."), + ui.GoCodeSnippet(DefaultExtensions), + h.Text("If you need to combine multiple extensions, you can use:"), + ui.GoCodeSnippet(CombineMultipleExtensions), + h.Text("or"), + ui.GoCodeSnippet(CombineMultipleExtensions2), + ), + Text(` + Important: h.BaseExtensions will add the 'htmgo' extension, which is a required extension for inline scripts to work properly, please always include it in your project. + `), + NextStep( + "mt-4", + PrevBlock("Pushing Data", DocPath("/pushing-data/sse")), + NextBlock("Trigger Children", DocPath("/htmx-extensions/trigger-children")), + ), + ), + ) +} + +const DefaultExtensions = ` +h.Html( + h.HxExtension(h.BaseExtensions()) +) +` + +const CombineMultipleExtensions = ` +h.HxExtensions( + h.BaseExtensions(), "my-extension" +) +` + +const CombineMultipleExtensions2 = ` +h.JoinExtensions( + h.HxExtension("sse"), + h.HxExtension("my-extension"), +) +` + +const htmxExtensions = ` +h.HxOnLoad +h.HxOnAfterSwap +h.OnClick +h.OnSubmit +h.HxBeforeSseMessage +h.HxAfterSseMessage +h.OnClick +h.OnSubmit +h.HxOnSseError +h.HxOnSseClose +h.HxOnSseConnecting +h.HxOnSseOpen +h.HxAfterRequest +h.HxOnMutationError +` diff --git a/htmgo-site/pages/docs/htmx-extensions/trigger-children.go b/htmgo-site/pages/docs/htmx-extensions/trigger-children.go new file mode 100644 index 0000000..de9a48e --- /dev/null +++ b/htmgo-site/pages/docs/htmx-extensions/trigger-children.go @@ -0,0 +1,37 @@ +package htmx_extensions + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" +) + +func TriggerChildren(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Trigger Children"), + Text(` + The 'trigger-children' extension allows you to trigger an event on all children and siblings of an element. + This is useful for things such as letting a child element (such as a button) inside a form know the form was submitted + `), + Link("View Example", "https://htmgo.dev/examples/form"), + HelpText(`In this example: The trigger-children extension will trigger hx-before-request and hx-after-request on all children of the form when the form is submitted, and the button reacts to that by showing a loading state.`), + NextStep( + "mt-4", + PrevBlock("HTMX Extensions", DocPath("/htmx-extensions/overview")), + NextBlock("Mutation Error", DocPath("/htmx-extensions/mutation-error")), + ), + ), + ) +} + +const TriggerChildrenExample = ` +func MyForm() *h.Element { + return h.Form( + h.Button( + h.Text("Submit"), + ), + ) +} +` diff --git a/htmgo-site/pages/docs/index.go b/htmgo-site/pages/docs/index.go new file mode 100644 index 0000000..eaa56a3 --- /dev/null +++ b/htmgo-site/pages/docs/index.go @@ -0,0 +1,8 @@ +package docs + +import "github.com/maddalax/htmgo/framework/h" + +func Index(ctx *h.RequestContext) *h.Page { + ctx.Redirect("/docs/introduction", 302) + return h.EmptyPage() +} diff --git a/htmgo-site/pages/docs/installation.go b/htmgo-site/pages/docs/installation.go new file mode 100644 index 0000000..6ef92b4 --- /dev/null +++ b/htmgo-site/pages/docs/installation.go @@ -0,0 +1,48 @@ +package docs + +import ( + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/ui" +) + +func Installation(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Getting Started"), + h.Ul( + h.Text("Prerequisites:"), + h.Class("list-disc list-outside"), + h.Li( + Inline( + Link("Go 1.23 or above", "https://go.dev/doc/install"), + ), + ), + Inline( + Text("Familiarity with "), + Link("https://htmx.org", "https://htmx.org"), + Text(" and html/hypermedia"), + ), + ), + HelpText("If you have not read the htmx docs, please do so before continuing, a lot of concepts below will be much more clear after."), + StepTitle("1. Install htmgo"), + ui.SingleLineBashCodeSnippet(`GOPROXY=direct go install github.com/maddalax/htmgo/cli/htmgo@latest`), + StepTitle("2. Create new project"), + ui.SingleLineBashCodeSnippet(`htmgo template myapp`), + HelpText("this will ask you for a new app name, and it will clone our starter template to a new directory it creates with your app name."), + StepTitle("3. Running the dev server"), + ui.SingleLineBashCodeSnippet(`htmgo watch`), + HelpText("htmgo has built in live reload on the dev server, to use this, run this command in the root of your project"), + HelpText("If you prefer to run the dev server yourself (no live reload), use `htmgo run`"), + StepTitle("4. Building for production"), + ui.SingleLineBashCodeSnippet(`htmgo build`), + HelpText("it will be output to `./dist`"), + NextStep( + "mt-4", + PrevBlock("Introduction", DocPath("/introduction")), + NextBlock("Core Concepts", DocPath("/core-concepts/pages")), + ), + ), + ) +} diff --git a/htmgo-site/pages/docs/interactivity/events.go b/htmgo-site/pages/docs/interactivity/events.go new file mode 100644 index 0000000..c014a9c --- /dev/null +++ b/htmgo-site/pages/docs/interactivity/events.go @@ -0,0 +1,126 @@ +package interactivity + +import ( + "fmt" + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/ui" +) + +import . "htmgo-site/pages/docs" + +func EventsAndCommands(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Events Handler / Commands"), + Text(` + In some cases, you need to update elements client side without having to do a network call. + For this you generally have to target an element with javascript and set an attribute, change the innerHTML, etc. + To make this work while still keeping a pure go feel, htmgo offers a few utility methods to execute various javascript on an element. + `), + Text("Example: When the form is submitted, set the button text to submitting and disable it, and vice versa after submit is done."), + ui.GoCodeSnippet(EventsExample1), + Text(` + The structure of this comes down to: + 1. Add an event handler to the element + 2. Add commands (found in the 'js' package) as children to that event handler + `), + Text(`The current list of event handlers we have utility methods for so far are:`), + ui.CodeSnippet(ui.CodeSnippetProps{ + Code: CurrentHandlersSnippet, + Lang: "bash", + HideLineNumbers: true, + }), + h.P( + h.Text("If there is not an existing method for the event you need, you can use the h.OnEvent method to add a handler for any "), + Link("DOM event", "https://www.w3schools.com/jsref/dom_obj_event.asp"), + h.Text(" or "), + Link("htmx event.", "https://htmx.org/events/"), + ), + Text("If there is not an existing method for the event you need, you can use the h.OnEvent method to add an event handler for any DOM or htmx event."), + ui.GoCodeSnippet(OnEventBlurSnippet), + h.P( + h.Text(`For more details on how they work, see the source for `), + Link("lifecycle.", "https://github.com/maddalax/htmgo/blob/master/framework/h/lifecycle.go"), + h.Text(" Any method that returns *Lifecycle can be used as an event handler, and any method that returns *Command can be used as a command."), + ), + h.P( + h.Text(`The current list of commands supported can be found `), + Link("here.", "https://github.com/maddalax/htmgo/blob/master/framework/js/commands.go"), + ), + HelpText("Note: Each command you attach to the event handler will be passed 'self' and 'event' (if applicable) as arguments. self is the current element, and event is the event object."), + Text("Example: Evaluating arbitrary Javascript"), + ui.GoCodeSnippet(EvalArbitraryJavascriptSnippet), + HelpText("Tips: If you are using Jetbrains IDE's, you can write '// language=js' as a comment above the function call (h.EvalJS) and it will automatically give you syntax highlighting on the raw JS."), + h.P( + h.Text("More examples and usage can be found on the "), + Link("examples page, ", "/examples/js-set-text-on-click"), + h.Text("in the 'Interactivity' section."), + ), + NextStep( + "mt-4", + PrevBlock("Swapping", DocPath("/interactivity/swapping")), + NextBlock("Caching Components", DocPath("/performance/caching-globally")), + ), + ), + ) +} + +const EventsExample1 = ` +func MyForm() *h.Element { + return h.Form( + h.Button( + h.Text("Submit"), + h.HxBeforeRequest( + js.SetDisabled(true), + js.SetText("Submitting..."), + ), + h.HxAfterRequest( + js.SetDisabled(false), + js.SetText("Submit"), + ), + ), + ) +} +` + +var OnEventBlurSnippet = ` +h.Input( + h.OnEvent( + hx.BlurEvent, + js.SetValue("Input was blurred"), + ) +)` + +var EvalArbitraryJavascriptSnippet = fmt.Sprintf(`func MyButton() *h.Element { + return h.Button( + h.Text("Submit"), + h.OnClick( + // make sure you use 'self' instead of 'this' for referencing the current element + h.EvalJs(%s + if(Math.random() > 0.5) { + self.innerHTML = "Success!"; + }%s + ), + ), + ) +}`, "`", "`") + +const CurrentHandlersSnippet = ` +h.OnEvent +h.OnLoad +h.HxBeforeRequest +h.HxOnLoad +h.HxOnAfterSwap +h.OnClick +h.OnSubmit +h.HxBeforeSseMessage +h.HxAfterSseMessage +h.HxOnSseError +h.HxOnSseClose +h.HxOnSseConnecting +h.HxOnSseOpen +h.HxAfterRequest +h.HxOnMutationError +` diff --git a/htmgo-site/pages/docs/interactivity/swapping.go b/htmgo-site/pages/docs/interactivity/swapping.go new file mode 100644 index 0000000..9fd9274 --- /dev/null +++ b/htmgo-site/pages/docs/interactivity/swapping.go @@ -0,0 +1,110 @@ +package interactivity + +import . "htmgo-site/pages/docs" +import "htmgo-site/ui" +import "github.com/maddalax/htmgo/framework/h" + +func Swapping(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Swapping"), + Text(` + Swapping is the process of swapping out the content of an element with another element. + This is the primary way htmgo allows you to add interactivity to your website through htmx. + `), + h.P( + h.Text("The swapping examples below utilize "), + Link("hx-swap-oob", "https://htmx.org/attributes/hx-swap-oob/"), + h.Text(" behind the scenes to swap out the content of an element."), + ), + Text("Example: A simple counter"), + ui.GoCodeSnippet(SwapExample), + Text(` + In this example, when the form is submitted, an HTTP POST will be sent to the server and call CounterPartial. + CounterPartial will then update the count and return it back to the client via h.SwapManyPartial. + The h.SwapManyPartial function is a helper function that allows you to swap out multiple elements on the page. + `), + Text(` + All the routing is handled behind the scenes by htmgo, so you can reference partials directly by their function reference, + instead of having to wire up routes for each partial. + `), + Text(` + Sometimes you may need to pass additional information when calling the partial, such as an id of the current entity you are working with. + This can be done by like so: + `), + Text("Example: Getting the http path to the partial with extra qs parameters"), + ui.GoCodeSnippet(SwapGetPartialPathWithQsExample), + Text("Example: Posting to the partial path on blur"), + ui.GoCodeSnippet(SwapGetPartialPathExampleOnBlur), + h.P( + h.Text("Note: if your swapping is not working as expected, make sure the element you are swapping has an id and it matches. "), + h.Text("For further details on how oob works behind the scenes, see the "), + Link("hx-swap-oob", "https://htmx.org/attributes/hx-swap-oob/"), + h.Text(" docs."), + ), + NextStep( + "mt-4", + PrevBlock("Loops / Dealing With Lists", DocPath("/control/loops")), + NextBlock("Events / Commands", DocPath("/interactivity/events")), + ), + ), + ) +} + +const SwapExample = ` +func CounterPartial(ctx *h.RequestContext) *h.Partial { + count, _ := strconv.ParseInt(ctx.FormValue("count"), 10, 64) + + count++ + + return h.SwapManyPartial( + ctx, + CounterForm(int(count)), + h.ElementIf(count > 10, SubmitButton("New record!")), + ) +} + +func CounterForm(count int) *h.Element { + return h.Form( + h.Id("counter-form"), + h.PostPartial(CounterPartial), + h.Input( + "text", + h.Class("hidden"), + h.Value(count), + h.Name("count"), + ), + h.P( + h.Id("counter"), + h.Name("count"), + h.TextF("Count: %d", count), + ), + h.Button( + h.Type("submit"), + h.Text("Increment"), + ), + ) +} +` + +const SwapGetPartialPathWithQsExample = ` +func MyComponent() *h.Element { + return h.Div( + h.GetPartialPathWithQs( + CounterPartial, + h.NewQs("count", count), + ), + ) +} +` + +const SwapGetPartialPathExampleOnBlur = ` +func MyComponent() *h.Element { + path := h.GetPartialPath(CounterPartial) + return h.Input( + h.Post(path, hx.BlurEvent), + ) +} +` diff --git a/htmgo-site/pages/docs/introduction.go b/htmgo-site/pages/docs/introduction.go new file mode 100644 index 0000000..c666bb2 --- /dev/null +++ b/htmgo-site/pages/docs/introduction.go @@ -0,0 +1,48 @@ +package docs + +import ( + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/ui" +) + +const IntroSnippet = `func DocsPage(ctx *h.RequestContext) *h.Page { + pages := dirwalk.WalkPages("md/docs") + return h.NewPage( + h.Div( + h.Class("flex flex-col md:flex-row gap-4"), + DocSidebar(pages), + h.Div( + h.Class("flex flex-col justify-center items-center mt-6"), + h.List(pages, func(page *dirwalk.Page, index int) *h.Element { + return h.Div( + h.Class("border-b border-b-slate-300"), + MarkdownContent(ctx, page), + ) + }), + ), + ), +}` + +func Introduction(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-2"), + Title("Introduction"), + Text(` + htmgo is a lightweight pure go way to build interactive websites / web applications using go & htmx. + We give you the utilities to build html using pure go code in a reusable way (go functions are components) while also providing htmx functions to add interactivity to your app. + `), + ui.GoCodeSnippet(IntroSnippet), + Inline( + Link("The site you are reading now", "https://github.com/maddalax/htmgo/tree/master/htmgo-site"), + Text(" was written with htmgo!"), + ), + NextStep( + "mt-4", + h.Div(), + NextBlock("Getting Started", DocPath("/installation")), + ), + ), + ) +} diff --git a/htmgo-site/pages/docs/misc/formatter.go b/htmgo-site/pages/docs/misc/formatter.go new file mode 100644 index 0000000..19242f6 --- /dev/null +++ b/htmgo-site/pages/docs/misc/formatter.go @@ -0,0 +1,63 @@ +package misc + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +func Formatter(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Formatter"), + Text(` + htmgo has a built-in formatter that can be used to format htmgo element blocks. + It is available through the 'htmgo' cli tool that is installed with htmgo. + `), + HelpText(`Note: if you have previously installed htmgo, you will need to run GOPROXY=direct go install github.com/maddalax/htmgo/cli/htmgo@latest to update the cli tool.`), + Text("Usage:"), + ui.SingleLineBashCodeSnippet(`htmgo format .`), + HelpText(`This will format all htmgo element blocks in your project recursively.`), + ui.SingleLineBashCodeSnippet(`htmgo format ./my-file.go`), + HelpText(`This will format the file specified.`), + Text("Before:"), + ui.GoCodeSnippet(formatBefore), + Text("After:"), + ui.GoCodeSnippet(formatAfter), + h.Div( + h.Class("hidden md:block w-[800px] h-[800px] rounded"), + Video(), + ), + NextStep( + "mt-4", + PrevBlock("Tailwind Intellisense", DocPath("/misc/tailwind-intellisense")), + NextBlock("Configuration", DocPath("/config/htmgo-config")), + ), + ), + ) +} + +const formatBefore = `h.Div( + h.Class("flex gap-2"), h.Text("hello"), h.Text("world"), +)` + +const formatAfter = `h.Div( + h.Class("flex gap-2"), + h.Text("hello"), + h.Text("world"), +) +` + +func Video() *h.Element { + return h.Video( + h.Tag( + "source", + h.Src("/public/formatter.mp4"), + h.Type("video/mp4"), + ), + h.Controls(), + h.Class("h-full w-full rounded"), + ) +} diff --git a/htmgo-site/pages/docs/misc/tailwind-intellisense.go b/htmgo-site/pages/docs/misc/tailwind-intellisense.go new file mode 100644 index 0000000..e2ffec3 --- /dev/null +++ b/htmgo-site/pages/docs/misc/tailwind-intellisense.go @@ -0,0 +1,44 @@ +package misc + +import ( + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/internal/urlhelper" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +func TailwindIntellisense(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Tailwind Intellisense"), + Text(` + Tailwind's language server allows you to specify custom configuration on what it should match to start giving you tailwind intellisense. + `), + Text(`To make this work, you will need to update the tailwind lsp config with the config below:`), + Image("/public/tailwind-intellisense.png"), + Text(`To make this work, you will need to update your Tailwind LSP configuration with what is below:`), + SubTitle("Jetbrains IDE's"), + ui.CodeSnippetFromUrl(urlhelper.ToAbsoluteUrl(ctx, "/public/jetbrains-tailwind.json"), ui.CodeSnippetProps{ + Lang: "json", + HideLineNumbers: true, + }), + Text(` + To find this configuration in GoLand you can go to Settings -> Languages & Frameworks -> Style Sheets -> Tailwind CSS and update the configuration there. + These changes are additive, add these options to your existing Tailwind LSP configuration, instead of replacing the entire file. + `), + SubTitle("Visual Studio Code"), + Text(`For VSCode, you should be able to update your settings.json with the following values:`), + ui.CodeSnippetFromUrl(urlhelper.ToAbsoluteUrl(ctx, "/public/vscode-tailwind.json"), ui.CodeSnippetProps{ + Lang: "json", + HideLineNumbers: true, + }), + NextStep( + "mt-4", + PrevBlock("Mutation Error Extension", DocPath("/htmx-extensions/mutation-error")), + NextBlock("Formatting blocks", DocPath("/misc/formatter")), + ), + ), + ) +} diff --git a/htmgo-site/pages/docs/performance/caching-globally.go b/htmgo-site/pages/docs/performance/caching-globally.go new file mode 100644 index 0000000..6c3aa35 --- /dev/null +++ b/htmgo-site/pages/docs/performance/caching-globally.go @@ -0,0 +1,83 @@ +package performance + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +func CachingGlobally(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Caching Components Globally"), + Text(` + You may want to cache components to improve performance. This is especially useful for components that are expensive to render or make external requests for data. + + When a request is made for a cached component, the component is rendered and stored in memory. Subsequent requests for the same component within the cache duration will return the cached component instead of rendering it again. + + To cache a component in htmgo, we offer two ways, caching globally or caching per key, this section will focus on caching globally, you will learn more about caching per key in the next section: + `), + Text("Methods for caching globally:"), + ui.GoCodeSnippet(CachingMethods), + h.P( + h.Text("For caching components per unique identifier, see "), + Link("Caching Components Per Key", "/docs/performance/caching-per-key"), + h.Text("."), + ), + Text(`Usage:`), + ui.GoCodeSnippet(CachedGloballyExample), + Text(` + We are using CachedT because the component takes one argument, the RequestContext. + If the component takes more arguments, use CachedT2, CachedT3, etc. + `), + Text( + `Important Note: When using h.CachedT and not CachedPerKey, the cached value is stored globally in memory, so it is shared across all requests. + Do not store request-specific data in a cached component. Only cache components that you are OK with all users seeing the same data. + + The arguments passed into cached component DO NOT affect the cache key. You will get the same cached component regardless of the arguments passed in. This is different from what you may be used to from something like React useMemo. + + Ensure the declaration of the cached component is outside the function that uses it. This is to prevent the component from being redeclared on each request. + `), + NextStep( + "mt-4", + PrevBlock("Events", DocPath("/interactivity/events")), + NextBlock("Caching Per Key", DocPath("/performance/caching-per-key")), + ), + ), + ) +} + +const CachingMethods = ` +// No arguments passed to the component +h.Cached(duration time.Duration, cb GetElementFunc) +// One argument passed to the component +h.CachedT(duration time.Duration, cb GetElementFunc) +// Two arguments passed to the component +h.CachedT2(duration time.Duration, cb GetElementFunc) +// Three arguments passed to the component +h.CachedT3(duration time.Duration, cb GetElementFunc) +// Four arguments passed to the component +h.CachedT4(duration time.Duration, cb GetElementFunc) +` + +const CachedGloballyExample = ` +func ExpensiveComponent(ctx *h.RequestContext) *h.Element { + // Some expensive call + data := http.Get("https://api.example.com/data") + return h.Div( + h.Text(data), + ) +} + +var CachedComponent = h.CachedT(time.Minute*15, func(ctx *h.RequestContext) *h.Element { + return ExpensiveComponent(ctx) +}) + +func IndexPage(ctx *h.RequestContext) *h.Page { + return h.NewPage( + CachedComponent(ctx), + ) +} +` diff --git a/htmgo-site/pages/docs/performance/caching-per-key.go b/htmgo-site/pages/docs/performance/caching-per-key.go new file mode 100644 index 0000000..da8eb92 --- /dev/null +++ b/htmgo-site/pages/docs/performance/caching-per-key.go @@ -0,0 +1,98 @@ +package performance + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +func CachingPerKey(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Caching Components Per Key"), + Text(` + If you need to cache a component per unique identifier, you can use the CachedPerKey functions. + These functions allow you to cache a component by a specific key. This key can be any string that uniquely identifies the user. + Note: I'm using the term 'user' to simply mean a unique identifier. This could be a user ID, session ID, or any other unique identifier. + `), + Text("Methods for caching per key:"), + ui.GoCodeSnippet(CachingMethodsPerKey), + Text(`Usage:`), + ui.GoCodeSnippet(CachedPerKeyExample), + Text(` + We are using CachedPerKeyT because the component takes one argument, the RequestContext. + If the component takes more arguments, use CachedPerKeyT2, CachedPerKeyT3, etc. + `), + Text( + ` + Important Note: + The cached value is stored globally in memory by key, it is shared across all requests. Ensure if you are storing request-specific data in a cached component, you are using a unique key for each user. + The arguments passed into cached component DO NOT affect the cache key. The only thing that affects the cache key is the key returned by the GetElementFuncWithKey function. + Ensure the declaration of the cached component is outside the function that uses it. This is to prevent the component from being redeclared on each request. + `), + NextStep( + "mt-4", + PrevBlock("Caching Globally", DocPath("/performance/caching-globally")), + NextBlock("Pushing Data", DocPath("/pushing-data/sse")), + ), + ), + ) +} + +const CachingMethodsPerKey = ` +// No arguments passed to the component, the component can be cached by a specific key +h.CachedPerKey(duration time.Duration, cb GetElementFuncWithKey) +// One argument passed to the component, the component can be cached by a specific key +h.CachedPerKeyT1(duration time.Duration, cb GetElementFuncWithKey) +// Two argument passed to the component, the component can be cached by a specific key +h.CachedPerKeyT2(duration time.Duration, cb GetElementFuncWithKey) +// Three arguments passed to the component, the component can be cached by a specific key +h.CachedPerKeyT3(duration time.Duration, cb GetElementFuncWithKey) +// Four arguments passed to the component, the component can be cached by a specific key +h.CachedPerKeyT4(duration time.Duration, cb GetElementFuncWithKey) +` + +const CachedPerKeyExample = ` +var CachedUserDocuments = h.CachedPerKeyT(time.Minute*15, func(ctx *h.RequestContext) (string, h.GetElementFunc) { + userId := getUserIdFromSession(ctx) + return userId, func() *h.Element { + return UserDocuments(ctx) + } +}) + +func UserDocuments(ctx *h.RequestContext) *h.Element { + docService := NewDocumentService(ctx) + // Expensive call + docs := docService.getDocuments() + return h.Div( + h.Class("grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4"), + h.List(docs, func(doc Document, index int) *h.Element { + return h.Div( + h.Class("p-4 bg-white border border-gray-200 rounded-md"), + h.H3(doc.Title), + h.P(doc.Description), + ) + }), + ) +} + +func MyPage(ctx *h.RequestContext) *h.Page { + + // Note this is not a real way to create a context, just an example + user1 := &h.RequestContext{ + Session: "user_1_session", + } + + user2 := &h.RequestContext{ + Session: "user_2_session", + } + + // Different users will get different cached components + return h.NewPage( + CachedUserDocuments(user1), + CachedUserDocuments(user2), + ) +} +` diff --git a/htmgo-site/pages/docs/pushing-data/sse.go b/htmgo-site/pages/docs/pushing-data/sse.go new file mode 100644 index 0000000..7b3150a --- /dev/null +++ b/htmgo-site/pages/docs/pushing-data/sse.go @@ -0,0 +1,87 @@ +package pushing_data + +import ( + "github.com/maddalax/htmgo/framework/h" + . "htmgo-site/pages/docs" + "htmgo-site/ui" +) + +func ServerSentEvents(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Server Sent Events (SSE)"), + Text(` + htmgo supports server-sent events (SSE) out of the box. + This allows you to push data from the server to the client in real-time. + `), + h.P( + h.Text("Example of this can be found in the "), + Link("examples/chat", "examples/chat"), + h.Text(" project."), + ), + SubTitle("How it works"), + Text(`1. The client sends a request to the server to establish a connection. + 2. The server holds the connection open and sends data (in our case, most likely elements) to the client whenever there is new data to send. + 3. The htmgo SSE extension uses hx-swap-oob to swap out the elements that the server sends. + `), + HelpText("Note: SSE is unidirectional (the server can only send data to the client). For the client to send data to the server, normal xhr behavior should be used (form submission, triggers, etc)."), + Text(`Usage:`), + Text("Add the SSE connection attribute and the path to the handler that will handle the connection."), + ui.GoCodeSnippet(SseConnectAttribute), + Text("The following Event Handlers can be used to react to SSE connections."), + ui.GoCodeSnippet(SseEventHandlers), + Text("Example: Adding an event listener handle SSE errors."), + ui.GoCodeSnippet(SseErrorHandlingExample), + Text("Example: Clearing the input field after sending a message."), + ui.GoCodeSnippet(SseClearInputExample), + NextStep( + "mt-4", + PrevBlock("Caching Per Key", DocPath("/performance/caching-per-key")), + NextBlock("HTMX extensions", DocPath("/htmx-extensions/overview")), + ), + ), + ) +} + +const SseConnectAttribute = ` +h.Attribute("sse-connect", fmt.Sprintf("/chat/%s", roomId)) +` + +const SseEventHandlers = ` +h.HxOnSseOpen +h.HxBeforeSseMessage +h.HxAfterSseMessage +h.HxOnSseError +h.HxOnSseClose +h.HxOnSseConnecting +` + +const SseErrorHandlingExample = ` +h.HxOnSseError( + js.EvalJs(fmt.Sprintf(" + const reason = e.detail.event.data + if(['invalid room', 'no session', 'invalid user'].includes(reason)) { + window.location.href = '/?roomId=%s'; + } else if(e.detail.event.code === 1011) { + window.location.reload() + } else if (e.detail.event.code === 1008 || e.detail.event.code === 1006) { + window.location.href = '/?roomId=%s'; + } else { + console.error('Connection closed:', e.detail.event) + } +", roomId, roomId)), +), +` + +const SseClearInputExample = ` +func MessageInput() *h.Element { + return h.Input("text", + h.Id("message-input"), + h.Required(), + h.HxAfterSseMessage( + js.SetValue(""), + ), + ) +}` diff --git a/htmgo-site/pages/docs/related-projects.go b/htmgo-site/pages/docs/related-projects.go new file mode 100644 index 0000000..359039b --- /dev/null +++ b/htmgo-site/pages/docs/related-projects.go @@ -0,0 +1,35 @@ +package docs + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func RelatedProjects(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Other languages and related projects"), + Text(` + If you're not a Go user but are interested in the idea of what htmgo is, you might want to check out these other projects: + `), + h.Ul( + h.Class("font-bold"), + h.Text("Python:"), + h.Class("list-disc list-inside"), + h.Li( + h.P( + h.Class("font-normal"), + Link("fastht.ml", "https://fastht.ml"), + h.Text(" - Modern web applications in pure Python, Built on solid web foundations, not the latest fads - with FastHTML you can get started on anything from simple dashboards to scalable web applications in minutes."), + ), + ), + ), + NextStep( + "mt-4", + PrevBlock("Tailwind Intellisense", "/docs/misc/tailwind-intellisense"), + NextBlock("Adding Interactivity", "/docs/interactivity/swapping"), + ), + ), + ) +} diff --git a/htmgo-site/pages/docs/sidebar.go b/htmgo-site/pages/docs/sidebar.go new file mode 100644 index 0000000..c9cde3f --- /dev/null +++ b/htmgo-site/pages/docs/sidebar.go @@ -0,0 +1,126 @@ +package docs + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +type Section struct { + Title string + Pages []*Page +} + +type Page struct { + Title string + Path string +} + +func DocPath(path string) string { + return "/docs" + path +} + +var sections = []Section{ + { + Title: "Getting Started", + Pages: []*Page{ + {Title: "Introduction", Path: DocPath("/introduction")}, + {Title: "Quick Start", Path: DocPath("/installation")}, + {Title: "Related Projects", Path: DocPath("/related-projects")}, + }, + }, + { + Title: "Core Concepts", + Pages: []*Page{ + {Title: "Pages", Path: DocPath("/core-concepts/pages")}, + {Title: "Partials", Path: DocPath("/core-concepts/partials")}, + {Title: "Components", Path: DocPath("/core-concepts/components")}, + {Title: "Tags and Attributes", Path: DocPath("/core-concepts/tags-and-attributes")}, + {Title: "Raw HTML", Path: DocPath("/core-concepts/raw-html")}, + }, + }, + { + Title: "Control", + Pages: []*Page{ + {Title: "Conditionals", Path: DocPath("/control/if-else")}, + {Title: "Rendering Lists", Path: DocPath("/control/loops")}, + }, + }, + { + Title: "Interactivity", + Pages: []*Page{ + {Title: "Swapping", Path: DocPath("/interactivity/swapping")}, + {Title: "Events", Path: DocPath("/interactivity/events")}, + {Title: "Evaluating Javascript", Path: DocPath("/interactivity/events")}, + }, + }, + { + Title: "Performance", + Pages: []*Page{ + {Title: "Caching Globally", Path: DocPath("/performance/caching-globally")}, + {Title: "Caching Per Key", Path: DocPath("/performance/caching-per-key")}, + }, + }, + { + Title: "Pushing Data", + Pages: []*Page{ + {Title: "Server Sent Events", Path: DocPath("/pushing-data/sse")}, + }, + }, + { + Title: "HTMX Extensions", + Pages: []*Page{ + {Title: "Overview", Path: DocPath("/htmx-extensions/overview")}, + {Title: "Trigger Children", Path: DocPath("/htmx-extensions/trigger-children")}, + {Title: "Mutation Error", Path: DocPath("/htmx-extensions/mutation-error")}, + }, + }, + { + Title: "Miscellaneous", + Pages: []*Page{ + {Title: "Tailwind Intellisense", Path: DocPath("/misc/tailwind-intellisense")}, + {Title: "Formatter", Path: DocPath("/misc/formatter")}, + }, + }, + { + Title: "Configuration", + Pages: []*Page{ + {Title: "Htmgo Config", Path: DocPath("/config/htmgo-config")}, + }, + }, +} + +func DocSidebar() *h.Element { + return h.Div( + h.Class("px-3 py-2 pr-6 md:min-h-screen pb-4 mb:pb-0 bg-neutral-50 border-r border-r-slate-300 overflow-y-auto"), + h.Div( + h.Div( + h.Class("mb-3"), + h.A( + h.Href("#quick-start-introduction"), + h.Text("Documentation"), + h.Class("md:mt-4 text-xl text-slate-900 font-bold"), + ), + ), + h.Div( + h.Class("flex flex-col gap-4"), + h.List(sections, func(entry Section, index int) *h.Element { + return h.Div( + h.P( + h.Text(entry.Title), + h.Class("text-slate-800 font-bold"), + ), + h.Div( + h.Class("pl-4 flex flex-col"), + h.List(entry.Pages, func(page *Page, index int) *h.Element { + return h.A( + h.Href(page.Path), + h.Text(page.Title), + h.Class("text-slate-900 hover:text-rose-400"), + ) + }), + ), + ) + }), + ), + ), + ) +} diff --git a/htmgo-site/pages/examples/code.go b/htmgo-site/pages/examples/code.go index ad85d5b..88a9364 100644 --- a/htmgo-site/pages/examples/code.go +++ b/htmgo-site/pages/examples/code.go @@ -65,5 +65,5 @@ func renderCodeToString(snippet *Snippet) *h.Element { source = out.String() } - return ui.CodeSnippet(source, "border-radius: 0.5rem;") + return ui.GoCodeSnippet(source, "border-radius: 0.5rem;") } diff --git a/htmgo-site/pages/examples/index.go b/htmgo-site/pages/examples/index.go index 8b46e5b..98f5575 100644 --- a/htmgo-site/pages/examples/index.go +++ b/htmgo-site/pages/examples/index.go @@ -2,13 +2,13 @@ package examples import ( "github.com/maddalax/htmgo/framework/h" - "htmgo-site/pages" + "htmgo-site/pages/base" "htmgo-site/partials" ) func Index(ctx *h.RequestContext) *h.Page { snippet := GetSnippet(ctx) - return pages.RootPage( + return base.RootPage( ctx, h.Div( h.Class("flex h-full"), diff --git a/htmgo-site/pages/html-to-go.go b/htmgo-site/pages/html-to-go.go index 6cc8428..4bc91a5 100644 --- a/htmgo-site/pages/html-to-go.go +++ b/htmgo-site/pages/html-to-go.go @@ -2,11 +2,12 @@ package pages import ( "github.com/maddalax/htmgo/framework/h" + "htmgo-site/pages/base" "htmgo-site/partials" ) func HtmlToGoPage(ctx *h.RequestContext) *h.Page { - return PageWithNav( + return base.PageWithNav( ctx, h.Div( h.Class("flex flex-col h-screen items-center justify-center w-full pt-6"), diff --git a/htmgo-site/pages/index.go b/htmgo-site/pages/index.go index 6a46536..1a45d65 100644 --- a/htmgo-site/pages/index.go +++ b/htmgo-site/pages/index.go @@ -2,10 +2,11 @@ package pages import ( "github.com/maddalax/htmgo/framework/h" + "htmgo-site/pages/base" ) func IndexPage(ctx *h.RequestContext) *h.Page { - return PageWithNav( + return base.PageWithNav( ctx, h.Div( h.Class("flex items-center justify-center"), diff --git a/htmgo-site/pages/test.go b/htmgo-site/pages/test.go index d8ffc91..446cc32 100644 --- a/htmgo-site/pages/test.go +++ b/htmgo-site/pages/test.go @@ -3,10 +3,11 @@ package pages import ( "fmt" "github.com/maddalax/htmgo/framework/h" + "htmgo-site/pages/base" ) func TestFormatPage(ctx *h.RequestContext) *h.Page { - return RootPage( + return base.RootPage( ctx, h.Div( h.P( @@ -30,7 +31,7 @@ func notPage() int { } func TestOtherPage(ctx *h.RequestContext) *h.Page { - return RootPage( + return base.RootPage( ctx, h.Div( h.Id("test"), diff --git a/htmgo-site/pages/time.go b/htmgo-site/pages/time.go index 3299aba..b78bd80 100644 --- a/htmgo-site/pages/time.go +++ b/htmgo-site/pages/time.go @@ -2,11 +2,12 @@ package pages import ( "github.com/maddalax/htmgo/framework/h" + "htmgo-site/pages/base" "htmgo-site/partials" ) func CurrentTimePage(ctx *h.RequestContext) *h.Page { - return RootPage( + return base.RootPage( ctx, h.GetPartial( partials.CurrentTimePartial, diff --git a/htmgo-site/partials/doc-sidebar.go b/htmgo-site/partials/doc-sidebar.go deleted file mode 100644 index a2d84bf..0000000 --- a/htmgo-site/partials/doc-sidebar.go +++ /dev/null @@ -1,94 +0,0 @@ -package partials - -import ( - "github.com/maddalax/htmgo/framework/datastructure/orderedmap" - "github.com/maddalax/htmgo/framework/h" - "htmgo-site/internal/dirwalk" - "strings" -) - -func formatPart(part string) string { - if part[1] == '_' { - part = part[2:] - } - part = strings.ReplaceAll(part, "-", " ") - part = strings.ReplaceAll(part, "_", " ") - part = strings.Title(part) - return part -} - -func CreateAnchor(parts []string) string { - return strings.Join(h.Map(parts, func(part string) string { - return strings.ReplaceAll(strings.ToLower(formatPart(part)), " ", "-") - }), "-") -} - -func partsToName(parts []string) string { - builder := strings.Builder{} - for i, part := range parts { - if i == 0 { - continue - } - part = formatPart(part) - builder.WriteString(part) - builder.WriteString(" ") - } - - return builder.String() -} - -func groupByFirstPart(pages []*dirwalk.Page) *orderedmap.Map[string, []*dirwalk.Page] { - grouped := orderedmap.New[string, []*dirwalk.Page]() - for _, page := range pages { - if len(page.Parts) > 0 { - section := page.Parts[0] - existing, has := grouped.Get(section) - if !has { - existing = []*dirwalk.Page{} - grouped.Set(section, existing) - } - grouped.Set(section, append(existing, page)) - } - } - return grouped -} - -func DocSidebar(pages []*dirwalk.Page) *h.Element { - grouped := groupByFirstPart(pages) - - return h.Div( - h.Class("px-3 py-2 pr-6 md:min-h-screen pb-4 mb:pb-0 bg-neutral-50 border-r border-r-slate-300 overflow-y-auto"), - h.Div( - h.Div( - h.Class("mb-3"), - h.A( - h.Href("#quick-start-introduction"), - h.Text("Documentation"), - h.Class("md:mt-4 text-xl text-slate-900 font-bold"), - ), - ), - h.Div( - h.Class("flex flex-col gap-4"), - h.List(grouped.Entries(), func(entry orderedmap.Entry[string, []*dirwalk.Page], index int) *h.Element { - return h.Div( - h.P( - h.Text(formatPart(entry.Key)), - h.Class("text-slate-800 font-bold"), - ), - h.Div( - h.Class("pl-4 flex flex-col"), - h.List(entry.Value, func(page *dirwalk.Page, index int) *h.Element { - anchor := CreateAnchor(page.Parts) - return h.A( - h.Href("#"+anchor), - h.Text(partsToName(page.Parts)), - h.Class("text-slate-900 hover:text-rose-400"), - ) - }), - ), - ) - }), - ), - ), - ) -} diff --git a/htmgo-site/partials/html-to-go.go b/htmgo-site/partials/html-to-go.go index 8283f9c..d6e0e7f 100644 --- a/htmgo-site/partials/html-to-go.go +++ b/htmgo-site/partials/html-to-go.go @@ -10,7 +10,11 @@ func ConvertHtmlToGo(ctx *h.RequestContext) *h.Partial { value := ctx.FormValue("html-input") parsed := string(htmltogo.Parse([]byte(value))) - formatted := ui.FormatCode(parsed, "height: 100%;") + formatted := ui.FormatCode(ui.CodeSnippetProps{ + Code: parsed, + Lang: "go", + CustomStyles: []string{"height: 100%;"}, + }) return h.SwapManyPartial(ctx, GoOutput(formatted), @@ -53,7 +57,7 @@ func GoOutput(content string) *h.Element { ), h.If( content != "", - ui.CopyButton("#go-output-raw"), + ui.AbsoluteCopyButton("#go-output-raw"), ), ), ) diff --git a/htmgo-site/partials/time.go b/htmgo-site/partials/time.go index decda3a..610161d 100644 --- a/htmgo-site/partials/time.go +++ b/htmgo-site/partials/time.go @@ -9,7 +9,12 @@ func CurrentTimePartial(ctx *h.RequestContext) *h.Partial { now := time.Now() return h.NewPartial( h.Div( - h.Pf("The current time is %s", now.Format(time.RFC3339)), + h.Class("flex gap-1 items-center"), + h.Pf("The current time is "), + h.Span( + h.Text(now.Format(time.RFC3339)), + h.Class("font-bold"), + ), ), ) } diff --git a/htmgo-site/ui/copy.go b/htmgo-site/ui/copy.go index 453e744..455a76e 100644 --- a/htmgo-site/ui/copy.go +++ b/htmgo-site/ui/copy.go @@ -6,9 +6,10 @@ import ( "github.com/maddalax/htmgo/framework/js" ) -func CopyButton(selector string) *h.Element { +func CopyButton(selector string, classes ...string) *h.Element { + classes = append(classes, "flex p-2 bg-slate-800 text-white cursor-pointer items-center") return h.Div( - h.Class("absolute top-0 right-0 p-2 bg-slate-800 text-white rounded-bl-md cursor-pointer"), + h.Class(classes...), h.Text("Copy"), h.OnClick( // language=JavaScript @@ -26,3 +27,7 @@ func CopyButton(selector string) *h.Element { ), ) } + +func AbsoluteCopyButton(selector string) *h.Element { + return CopyButton(selector, "absolute top-0 right-0 rounded-bl-md") +} diff --git a/htmgo-site/ui/snippet.go b/htmgo-site/ui/snippet.go index ba9f999..d42302e 100644 --- a/htmgo-site/ui/snippet.go +++ b/htmgo-site/ui/snippet.go @@ -9,20 +9,26 @@ import ( "github.com/alecthomas/chroma/v2/styles" "github.com/google/uuid" "github.com/maddalax/htmgo/framework/h" + "io" + "net/http" "strings" ) -func FormatCode(code string, customStyles ...string) string { +func FormatCode(props CodeSnippetProps) string { + + if props.SingleLine { + props.CustomStyles = append(props.CustomStyles, "height: 50px; width: 100%;") + } + var buf bytes.Buffer - lexer := lexers.Get("go") + lexer := lexers.Get(props.Lang) style := styles.Get("github") formatter := html.New( - html.WrapLongLines(true), - html.WithLineNumbers(true), + html.WithLineNumbers(!props.SingleLine && !props.HideLineNumbers), html.WithCustomCSS(map[chroma.TokenType]string{ - chroma.PreWrapper: fmt.Sprintf("font-size: 14px; padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important; %s", strings.Join(customStyles, ";")), + chroma.PreWrapper: fmt.Sprintf("border-radius: 0.2rem; line-height: 24px; font-size: 14px; padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important; %s", strings.Join(props.CustomStyles, ";")), })) - iterator, err := lexer.Tokenise(nil, code) + iterator, err := lexer.Tokenise(nil, props.Code) if err != nil { return "" } @@ -30,18 +36,94 @@ func FormatCode(code string, customStyles ...string) string { return buf.String() } -func CodeSnippet(code string, customStyles ...string) *h.Element { +type CodeSnippetProps struct { + Code string + Lang string + CustomStyles []string + HideLineNumbers bool + SingleLine bool +} + +func CodeSnippet(props CodeSnippetProps) *h.Element { id := fmt.Sprintf("code-snippet-%s", uuid.NewString()) + + props.Code = strings.TrimPrefix(props.Code, "\n") + props.Code = strings.TrimSuffix(props.Code, "\n") + + if props.SingleLine { + return h.Div( + h.Class("flex items-center w-full"), + h.Div( + h.UnsafeRaw(props.Code), + h.Class("hidden"), + h.Id(id), + ), + h.UnsafeRaw( + FormatCode(props), + ), + CopyButton("#"+id, "h-[50px] rounded-sm"), + ) + } + return h.Div( h.Class("relative"), h.Div( - h.UnsafeRaw(code), + h.UnsafeRaw(props.Code), h.Class("hidden"), h.Id(id), ), - CopyButton("#"+id), + AbsoluteCopyButton("#"+id), h.UnsafeRaw( - FormatCode(code, customStyles...), + FormatCode(props), ), ) } + +func BashCodeSnippet(code string, customStyles ...string) *h.Element { + return CodeSnippet(CodeSnippetProps{ + Code: code, + Lang: "bash", + CustomStyles: customStyles, + }) +} + +func SingleLineBashCodeSnippet(code string, customStyles ...string) *h.Element { + return CodeSnippet(CodeSnippetProps{ + Code: code, + Lang: "bash", + CustomStyles: customStyles, + SingleLine: true, + }) +} + +func GoCodeSnippet(code string, customStyles ...string) *h.Element { + return CodeSnippet(CodeSnippetProps{ + Code: code, + Lang: "go", + CustomStyles: customStyles, + }) +} + +func GoCodeSnippetSingleLine(code string, customStyles ...string) *h.Element { + return CodeSnippet(CodeSnippetProps{ + Code: code, + Lang: "go", + CustomStyles: customStyles, + SingleLine: true, + }) +} + +func CodeSnippetFromUrl(url string, props CodeSnippetProps) *h.Element { + data, err := http.Get(url) + if err != nil { + fmt.Printf("error: %s\n", err.Error()) + return h.Empty() + } + defer data.Body.Close() + b, err := io.ReadAll(data.Body) + if err != nil { + return h.Empty() + } + props.Code = string(b) + return CodeSnippet(props) +} From 101bb022c91138000e95ce5892ee9e5aef06780f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 30 Oct 2024 18:28:28 +0000 Subject: [PATCH 095/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 88d11b7..8e6e58c 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 + github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 7697653..aafba12 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 83b0403..d80ff54 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 + github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index cbf9d49..749d9fb 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 3bf30ef..ace57ec 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 + github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index cf3a22a..505f62f 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index a494abb..e7e4508 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 + github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 96260a9..e30b192 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 372e040..48c0235 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 09bbf0a..2732442 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 6204fe6..749bde9 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029134452-d85737bfb8e9 + github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241030182742-35877a1b2e3b github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 9cadce0..4a6d1ad 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029134452-d85737bfb8e9 h1:Jwa5azYzjrzmrt9x7c54Uh50D+/bNY+FMrWStF1MuEg= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241029134452-d85737bfb8e9/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241030182742-35877a1b2e3b h1:4SyvEpWX3ODD2OhjPG2EtjAr3R0bNVZqsX63JLcrNE8= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241030182742-35877a1b2e3b/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 2ac0ad7..2c576a8 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 09bbf0a..2732442 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9 h1:cFu94Hmru44eMe+p2VHo9d2yWBRXDIjKbuItJX9+z5I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241029134452-d85737bfb8e9/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= +github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 61b215436b5c8c842cf7bc1dd26cede4bbf7dd78 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 30 Oct 2024 13:29:20 -0500 Subject: [PATCH 096/137] cleanup --- htmgo-site/htmgo.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/htmgo.yml b/htmgo-site/htmgo.yml index 2aa7802..926ab7d 100644 --- a/htmgo-site/htmgo.yml +++ b/htmgo-site/htmgo.yml @@ -11,4 +11,4 @@ watch_files: ["**/*.go", "**/*.css", "**/*.md"] # files or directories to ignore when automatically registering routes for pages # supports glob patterns through https://github.com/bmatcuk/doublestar -automatic_page_routing_ignore: ["base/root.go", "docs2/base.go"] +automatic_page_routing_ignore: ["base/root.go", "docs/base.go"] From 1ce5f37fc4a5f00cab967369b281f37d626c432a Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 30 Oct 2024 13:39:07 -0500 Subject: [PATCH 097/137] set title --- htmgo-site/pages/base/root.go | 3 +++ htmgo-site/pages/docs/base.go | 3 ++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index c3f7edf..a522438 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -40,6 +40,9 @@ func ConfigurableRootPage(ctx *h.RequestContext, props RootPageProps) *h.Page { h.Head( h.Meta("viewport", "width=device-width, initial-scale=1"), h.Meta("title", title), + h.Title( + h.Text(title), + ), h.Link("/public/favicon.ico", "icon"), h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), h.Meta("charset", "utf-8"), diff --git a/htmgo-site/pages/docs/base.go b/htmgo-site/pages/docs/base.go index 7eaa5af..683a6db 100644 --- a/htmgo-site/pages/docs/base.go +++ b/htmgo-site/pages/docs/base.go @@ -1,6 +1,7 @@ package docs import ( + "fmt" "github.com/maddalax/htmgo/framework/h" "htmgo-site/pages/base" "htmgo-site/partials" @@ -116,7 +117,7 @@ func DocPage(ctx *h.RequestContext, children ...h.Ren) *h.Page { for _, section := range sections { for _, page := range section.Pages { if page.Path == ctx.Request.URL.Path { - title = page.Title + title = fmt.Sprintf("Docs - %s", page.Title) break } } From 965a8487b9d073f47dcd2273ab4be79ae3a1bd57 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 30 Oct 2024 13:40:49 -0500 Subject: [PATCH 098/137] add title tag to starter template --- templates/starter/pages/root.go | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/templates/starter/pages/root.go b/templates/starter/pages/root.go index 323f436..c228349 100644 --- a/templates/starter/pages/root.go +++ b/templates/starter/pages/root.go @@ -5,23 +5,31 @@ import ( ) func RootPage(children ...h.Ren) *h.Page { + title := "htmgo template" + description := "an example of the htmgo template" + author := "htmgo" + url := "https://htmgo.dev" + return h.NewPage( h.Html( h.HxExtensions( h.BaseExtensions(), ), h.Head( + h.Title( + h.Text(title), + ), h.Meta("viewport", "width=device-width, initial-scale=1"), h.Link("/public/favicon.ico", "icon"), h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), - h.Meta("title", "htmgo template"), + h.Meta("title", title), h.Meta("charset", "utf-8"), - h.Meta("author", "htmgo"), - h.Meta("description", "this is a template"), - h.Meta("og:title", "htmgo template"), - h.Meta("og:url", "https://htmgo.dev"), - h.Link("canonical", "https://htmgo.dev"), - h.Meta("og:description", "this is a template"), + h.Meta("author", author), + h.Meta("description", description), + h.Meta("og:title", title), + h.Meta("og:url", url), + h.Link("canonical", url), + h.Meta("og:description", description), h.Link("/public/main.css", "stylesheet"), h.Script("/public/htmgo.js"), ), From 129c230c724c5f1d7461ab12c945b46e61301d2c Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 30 Oct 2024 13:50:52 -0500 Subject: [PATCH 099/137] fix link --- htmgo-site/pages/docs/core-concepts/raw-html.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/pages/docs/core-concepts/raw-html.go b/htmgo-site/pages/docs/core-concepts/raw-html.go index 8ec3895..337da90 100644 --- a/htmgo-site/pages/docs/core-concepts/raw-html.go +++ b/htmgo-site/pages/docs/core-concepts/raw-html.go @@ -26,7 +26,7 @@ func RawHtml(ctx *h.RequestContext) *h.Page { `), h.P( h.Text("Sanitizing input can be done using "), - Link("https://pkg.go.dev/html#EscapeString", "html.EscapeString"), + Link("html.EscapeString", "https://pkg.go.dev/html#EscapeString"), h.Text(" or by using "), Link("bluemonday", "https://github.com/microcosm-cc/bluemonday."), h.Text(" for more control over sanitization."), From cb6fcdd676beeaa705c2268c6ec4a201ce7e5d90 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 30 Oct 2024 14:07:38 -0500 Subject: [PATCH 100/137] new favicon --- htmgo-site/assets/public/apple-touch-icon.png | Bin 3429 -> 6282 bytes htmgo-site/assets/public/favicon-96x96.png | Bin 0 -> 3042 bytes htmgo-site/assets/public/favicon.ico | Bin 5238 -> 15086 bytes htmgo-site/assets/public/favicon.svg | 3 +++ .../assets/public/icon-192-maskable.png | Bin 3732 -> 0 bytes htmgo-site/assets/public/icon-192.png | Bin 7032 -> 0 bytes .../assets/public/icon-512-maskable.png | Bin 14025 -> 0 bytes htmgo-site/assets/public/icon-512.png | Bin 23888 -> 0 bytes htmgo-site/assets/public/site.webmanifest | 21 ++++++++++++++++++ .../public/web-app-manifest-192x192.png | Bin 0 -> 6902 bytes .../public/web-app-manifest-512x512.png | Bin 0 -> 24817 bytes htmgo-site/pages/base/root.go | 11 +++++++++ htmgo-site/pages/examples/index.go | 3 ++- 13 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 htmgo-site/assets/public/favicon-96x96.png create mode 100644 htmgo-site/assets/public/favicon.svg delete mode 100644 htmgo-site/assets/public/icon-192-maskable.png delete mode 100644 htmgo-site/assets/public/icon-192.png delete mode 100644 htmgo-site/assets/public/icon-512-maskable.png delete mode 100644 htmgo-site/assets/public/icon-512.png create mode 100644 htmgo-site/assets/public/site.webmanifest create mode 100644 htmgo-site/assets/public/web-app-manifest-192x192.png create mode 100644 htmgo-site/assets/public/web-app-manifest-512x512.png diff --git a/htmgo-site/assets/public/apple-touch-icon.png b/htmgo-site/assets/public/apple-touch-icon.png index d10e9fe56b9576167656a1270d4ab42bec72d659..9430f213f355627bf4164c046d0dcd01299c0c09 100644 GIT binary patch literal 6282 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 literal 3429 zcmeHK*H_cc7X5`#1VIp#UPMI!siJggL5e_t5ITt9M==NyK}w{GfE3|Fnv_VSNEhiK zB%*+H2)!E=A)$m8di~1uHi7E0F!3@00KlTJrwyZW z^&gy}r^Y+I^f##l@`mYZ0U!JL7paA|vz5M!kr5zH&CdX!s7CDY>ns9#*8O`|jMO~iuFIcM`+$DqYyYbERdYs=} zG@Cn2HOG@*am(sCU8YU4lC`n<5GSkiFgm4DCN(<0;*+7cW;6U2dl#+g)$>=`9yCDe z*SxKFdIVPOFVxtohIP8BWJYOV{o+!MCNMy1CZ{@Ue;$H_nO?k1t=WRfOd7$4& z#`VAe$hoRtbV&OP0A7m5vC5j-@BdEyX(8AxEm+*6uhX!=m@5JE9(-Wtf)W?GE@EnD z$6r%hWBQQdTwMAwAFCTbv>M)?rJNrg>6o1SRxkfb)IdijJL?yJqGdL20SuyT9-2+b@-uyScj;)b8vom%KhA>}tfmHQT^{z4g$k z2pn&Fp&(9x+>CYZ54OR2-7trb)RS|t$JaK(Gt}O{yr;vQ+xqe)<}fW@BBw#_+R(|v z0+K^!*CS$B%kV^ibJ|8*%i>R^Y}U`}$iQR5@*vQ z&^j@LY^&2C66f)(3j|1mHIHz6lO^nOP|&E)2FX&eY>%iSEEMIpl9_bZSSm|bb%n7Y z`3Fop{OsXCj!1XWY^2&x{;rOoAV!~5MLG48W`0*g-snQ3Y=0HBs)Htq z`-qlwr@c3Crk9t#;P#gdFmwC&WWGft>;-v^j)`TV!us?B~V9 zXUwLcQN)SU&E3hRH>bG!E_d(R9j+Eg<7kzWf%2Iq`+&L!s+1Q|OLwnjqqE1jS4CCa zDuhEVm_3cKebz9w=d#bHJz^x;%}0l$r?hQT$c}onn2TbhIJ|Qz;+(s0iPX#YkxqW4 zx50SRb7g(glmqe!KSLA;J0K8`5?(3sX5jC)z>ug`zP-gXrEEVfUTibjn(H8nqB_hS z?6+Fzpp_1?rTcaDHa&jwO+;OIA9qFp*<_1qL?~2*$IM5s(br~yM)u=SYaaj*n13K2 zy9F+u?`q^SFLP{X0!X6X`0>18`^f0Ic?(LBv5Gb`{zotCF^Tg(18 zX6nHn)!(yu3E~mN(rmVb5V}SI^LfSKN)TR9+tzhl_EQM1BeK}ft7F%;|3>C7&Hg4N zyT)@iu%K@tr<%bjiI0*@8QuVYcEC}peid!c_TMh9MP>+u?p$(;f@TdsTN+6f`?p;7 z@Rqq*+)dz$Y^bFmnRaeUF8pzdKzL z^7@`_FoIU&IX9VuDEi?bT>0r8|%N1B$=Y?cL?Qn%X3kE|=ul z(d+9`@j2cMT%Pmrvf0wel$qSnFkzQnV!PaZPS%A@;dHUBSRthC?eb1zi|d3>Vj$W~ z=n0H+)bw}>on=^7RtC-ZG{hxdgsVtg;>*a=CWpmH9Km>IWEV!8#TR$e2zHR#tA4FK zHoPut3hNNU_OI>sBPC1g{CPIlElWvMz#%+g>9v3q6LtVQWpQQuomO9V0VSp(X88vb zzRWukPDA2mywGwKi3??Pn`BKw zjz+`+UDUiQV6JIz>*(-;k)qbBK)1qb_vSHW0@XD>aI47Y!tGn~rd3vSzj;{ivlyPQ zOWZVA+xH!WZ&>;=Tkr09e#t&MNpYu)-c%V{0#!$yfBwWb9h{$emRbJGsSKnvWj$#& zQFJZ#u;NB>@fEMax61V2@q!WI1*6|*P*vBf#4g6}8YE!-E?v$jM`2kBicIAq$ziD$?)9^k02kLY4T}&>8nja#e}QpOd3` z*4(QfhVVZ+UeJu#Dr=|`wYLM7`fPlN%B+dTSy+uPsQG7=`=$Kjet@=LmhZUQwqkEeVZBB1ZepQx>oC%NWF zdmo=0@^$&na^HaJYV3|C9v`Sr*q-{Y?$I=W&1L4|UO1qU$)n&eX$oiEt|!5$e%Bc{#~f{N391h{sB|aM6Cb- diff --git a/htmgo-site/assets/public/favicon-96x96.png b/htmgo-site/assets/public/favicon-96x96.png new file mode 100644 index 0000000000000000000000000000000000000000..df16ca9e8b158c8dcc64fb056eee3d8bc9304818 GIT binary patch literal 3042 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 Xq5;e!+O6#W3T^EFCLh;c>Tdi8seJMY literal 5238 zcmc&%TTc^F5MGTxz&GO?PsX3&laKxa5?VDrsPP_Skg8Epp+!_s6a+*B?}`GJic-7) zB8Vu0f{KVn1m!020|D?VOqU=FFKnXI9e|XbZK)i!~ZGZTTWi zTSj9-g8rZQtBALpc=W0fo8j(S%O?&OATMu&mKe zdP>qtnj0j7LmFfqw!yZd)Rh>62A?G_s?o4sOTFvGNAbC*3$0Is$VuPwznqMf;^%m` zBKz=0LHWmb;c{Ub?%pm!S4T6d$_kX69w!-R#Sd0pLiv>(lwHh1XL}Qx>Z;K4v6xbM9Jy;a*q_>sNeIh9UtF!AnVWu+_|1-rZ4yRAAQDaYk4Tv{GzEA4G+rkyzxG& z%g-x09iR2t2gPUnrpJEN_)C$Oxf8h=J5Y0{1eMovQJA$`$r=3T7$`o=T`lsd|He6! zcaf7Oe5d*%pJUaRwLtpO?`2~<^a>m*ML<#bnL!)#Fjqw{qI90=JUF4i7m%~ zaW5kKJ?njzwjGY{M41bEt~u13D?gK}8DHP`xybWq{SPrV*XV3>?qu2~_-~v=T}>I? zB}F*x+vdm@!`b3U-po(Fmk0WK0Zb7^o^UvX(zB_yHr2T{i!&y3|2hQy7g2RHAEkMz zXsEr7$%%3Ff9b)A)b(~g=x3^RPMxOpH9o4ulZO?`7T>#kf6Kn5_{@Is|IMqXs1M%4 zub*QW9_$zQv{}p)Z~8n}w$+>-lXKY~j0}Gh_T=3A&Q?rKg;8)K8SG#GmyZjI)T z=H75@bja!Y8J}ZdiyxYtL~r+Ne0bX?*30$9`7i4KE7w27T;Jyp8vCXM| z&C<46{l$i55@WqroXOr9-*#}0H`fO&eVj?(W=`~}HZt>pD{RUhIbQg(KPUXS^&i{= z#k2p4;Pdx}Nq){NZ@T}CcmK^Xi0AhQQkrtwK@C# F{tLVTip2l` diff --git a/htmgo-site/assets/public/favicon.svg b/htmgo-site/assets/public/favicon.svg new file mode 100644 index 0000000..024a9b4 --- /dev/null +++ b/htmgo-site/assets/public/favicon.svg @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/htmgo-site/assets/public/icon-192-maskable.png b/htmgo-site/assets/public/icon-192-maskable.png deleted file mode 100644 index d4d6efb61bf6c212e3c466edca6256d9a3000e86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3732 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 U`U+xTzkh@n(+eiG#@FKh0jyU=3;+NC diff --git a/htmgo-site/assets/public/icon-192.png b/htmgo-site/assets/public/icon-192.png deleted file mode 100644 index f5334355c00b1ff31781f93b97b0efaa0e049d60..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7032 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 x%cimilvfPSdV(Q_^}+tza4QzW{-_?Ogx> diff --git a/htmgo-site/assets/public/icon-512-maskable.png b/htmgo-site/assets/public/icon-512-maskable.png deleted file mode 100644 index db61f3dbc056f541e9b215d4be7ec22a8f436e38..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 14025 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 KG(KIojr>11q;Vnu diff --git a/htmgo-site/assets/public/icon-512.png b/htmgo-site/assets/public/icon-512.png deleted file mode 100644 index ba0665d887cf19d3a45122767f0d6609ccb1afbb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23888 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 B&S(Gt diff --git a/htmgo-site/assets/public/site.webmanifest b/htmgo-site/assets/public/site.webmanifest new file mode 100644 index 0000000..7eaf1ee --- /dev/null +++ b/htmgo-site/assets/public/site.webmanifest @@ -0,0 +1,21 @@ +{ + "name": "htmgo", + "short_name": "htmgo", + "icons": [ + { + "src": "/public/web-app-manifest-192x192.png", + "sizes": "192x192", + "type": "image/png", + "purpose": "maskable" + }, + { + "src": "/public/web-app-manifest-512x512.png", + "sizes": "512x512", + "type": "image/png", + "purpose": "maskable" + } + ], + "theme_color": "#ffffff", + "background_color": "#ffffff", + "display": "standalone" +} diff --git a/htmgo-site/assets/public/web-app-manifest-192x192.png b/htmgo-site/assets/public/web-app-manifest-192x192.png new file mode 100644 index 0000000000000000000000000000000000000000..dd5087d1fa5261eae213570a0449c37b842d9b23 GIT binary patch literal 6902 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 literal 0 HcmV?d00001 diff --git a/htmgo-site/assets/public/web-app-manifest-512x512.png b/htmgo-site/assets/public/web-app-manifest-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..2b0a1c460b6f59537772b9db663352d82a70633b GIT binary patch literal 24817 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 Date: Wed, 30 Oct 2024 14:14:12 -0500 Subject: [PATCH 101/137] fix --- htmgo-site/pages/docs/installation.go | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/htmgo-site/pages/docs/installation.go b/htmgo-site/pages/docs/installation.go index 6ef92b4..a773300 100644 --- a/htmgo-site/pages/docs/installation.go +++ b/htmgo-site/pages/docs/installation.go @@ -13,19 +13,21 @@ func Installation(ctx *h.RequestContext) *h.Page { Title("Getting Started"), h.Ul( h.Text("Prerequisites:"), - h.Class("list-disc list-outside"), + h.Class("list-disc list-inside"), h.Li( Inline( Link("Go 1.23 or above", "https://go.dev/doc/install"), ), ), - Inline( - Text("Familiarity with "), - Link("https://htmx.org", "https://htmx.org"), - Text(" and html/hypermedia"), + h.Li( + Inline( + Text("Familiarity with "), + Link("https://htmx.org", "https://htmx.org"), + Text(" and html/hypermedia"), + ), ), ), - HelpText("If you have not read the htmx docs, please do so before continuing, a lot of concepts below will be much more clear after."), + HelpText("If you have not read the htmx docs, please do so before continuing, many of the concepts htmgo uses will become clearer."), StepTitle("1. Install htmgo"), ui.SingleLineBashCodeSnippet(`GOPROXY=direct go install github.com/maddalax/htmgo/cli/htmgo@latest`), StepTitle("2. Create new project"), From 60a37b65d6dd750a698610b3c70dc912619b8abc Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 30 Oct 2024 14:17:35 -0500 Subject: [PATCH 102/137] change version --- htmgo-site/pages/docs/installation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/pages/docs/installation.go b/htmgo-site/pages/docs/installation.go index a773300..06a2e4f 100644 --- a/htmgo-site/pages/docs/installation.go +++ b/htmgo-site/pages/docs/installation.go @@ -16,7 +16,7 @@ func Installation(ctx *h.RequestContext) *h.Page { h.Class("list-disc list-inside"), h.Li( Inline( - Link("Go 1.23 or above", "https://go.dev/doc/install"), + Link("Go 1.2X or above", "https://go.dev/doc/install"), ), ), h.Li( From e6223a36b7e276157974cc76da51739fd2e1d8f2 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 30 Oct 2024 14:32:27 -0500 Subject: [PATCH 103/137] remove myapp --- htmgo-site/pages/docs/installation.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/htmgo-site/pages/docs/installation.go b/htmgo-site/pages/docs/installation.go index 06a2e4f..ecc410f 100644 --- a/htmgo-site/pages/docs/installation.go +++ b/htmgo-site/pages/docs/installation.go @@ -31,7 +31,7 @@ func Installation(ctx *h.RequestContext) *h.Page { StepTitle("1. Install htmgo"), ui.SingleLineBashCodeSnippet(`GOPROXY=direct go install github.com/maddalax/htmgo/cli/htmgo@latest`), StepTitle("2. Create new project"), - ui.SingleLineBashCodeSnippet(`htmgo template myapp`), + ui.SingleLineBashCodeSnippet(`htmgo template`), HelpText("this will ask you for a new app name, and it will clone our starter template to a new directory it creates with your app name."), StepTitle("3. Running the dev server"), ui.SingleLineBashCodeSnippet(`htmgo watch`), From 3cd7577b0603b90a00ef1f32fbfd6d0b8a25f287 Mon Sep 17 00:00:00 2001 From: maddalax Date: Wed, 30 Oct 2024 14:44:02 -0500 Subject: [PATCH 104/137] css fixes --- htmgo-site/pages/docs/base.go | 7 ------- htmgo-site/pages/docs/installation.go | 11 +++-------- htmgo-site/pages/docs/introduction.go | 4 ++-- 3 files changed, 5 insertions(+), 17 deletions(-) diff --git a/htmgo-site/pages/docs/base.go b/htmgo-site/pages/docs/base.go index 683a6db..2116a9a 100644 --- a/htmgo-site/pages/docs/base.go +++ b/htmgo-site/pages/docs/base.go @@ -86,13 +86,6 @@ func Text(text string) *h.Element { ) } -func Inline(elements ...h.Ren) *h.Element { - return h.Div( - h.Class("flex gap-1 items-center"), - h.Children(elements...), - ) -} - func HelpText(text string) *h.Element { return h.Div( h.Class("text-slate-600 text-sm"), diff --git a/htmgo-site/pages/docs/installation.go b/htmgo-site/pages/docs/installation.go index ecc410f..731aa54 100644 --- a/htmgo-site/pages/docs/installation.go +++ b/htmgo-site/pages/docs/installation.go @@ -15,16 +15,11 @@ func Installation(ctx *h.RequestContext) *h.Page { h.Text("Prerequisites:"), h.Class("list-disc list-inside"), h.Li( - Inline( - Link("Go 1.2X or above", "https://go.dev/doc/install"), - ), + Link("Go 1.2X or above", "https://go.dev/doc/install"), ), h.Li( - Inline( - Text("Familiarity with "), - Link("https://htmx.org", "https://htmx.org"), - Text(" and html/hypermedia"), - ), + h.Text("Familiarity with "), + Link("https://htmx.org", "https://htmx.org"), ), ), HelpText("If you have not read the htmx docs, please do so before continuing, many of the concepts htmgo uses will become clearer."), diff --git a/htmgo-site/pages/docs/introduction.go b/htmgo-site/pages/docs/introduction.go index c666bb2..37fd47d 100644 --- a/htmgo-site/pages/docs/introduction.go +++ b/htmgo-site/pages/docs/introduction.go @@ -34,9 +34,9 @@ func Introduction(ctx *h.RequestContext) *h.Page { We give you the utilities to build html using pure go code in a reusable way (go functions are components) while also providing htmx functions to add interactivity to your app. `), ui.GoCodeSnippet(IntroSnippet), - Inline( + h.P( Link("The site you are reading now", "https://github.com/maddalax/htmgo/tree/master/htmgo-site"), - Text(" was written with htmgo!"), + h.Text(" was written with htmgo!"), ), NextStep( "mt-4", From f6556b579ffd54c22328b4851fbb78dd0f2b6ade Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 09:44:16 -0500 Subject: [PATCH 105/137] css form on blur validation --- framework/h/base.go | 6 +- htmgo-site/pages/examples/examples.go | 10 +++ .../examples/form-with-blur-validation.go | 10 +++ htmgo-site/pages/examples/form.go | 2 +- .../snippets/form-with-blur-validation.go | 90 +++++++++++++++++++ 5 files changed, 116 insertions(+), 2 deletions(-) create mode 100644 htmgo-site/pages/examples/form-with-blur-validation.go create mode 100644 htmgo-site/partials/snippets/form-with-blur-validation.go diff --git a/framework/h/base.go b/framework/h/base.go index a26aa9e..f711dd9 100644 --- a/framework/h/base.go +++ b/framework/h/base.go @@ -71,8 +71,12 @@ func SwapPartial(ctx *RequestContext, swap *Element) *Partial { SwapMany(ctx, swap)) } +func IsEmptyPartial(partial *Partial) bool { + return partial.Root.tag == "" && len(partial.Root.children) == 0 +} + func EmptyPartial() *Partial { - return NewPartial(Fragment()) + return NewPartial(Empty()) } func SwapManyPartial(ctx *RequestContext, swaps ...*Element) *Partial { diff --git a/htmgo-site/pages/examples/examples.go b/htmgo-site/pages/examples/examples.go index 1f14d24..2e7aabc 100644 --- a/htmgo-site/pages/examples/examples.go +++ b/htmgo-site/pages/examples/examples.go @@ -11,6 +11,15 @@ var FormWithLoadingStateSnippet = Snippet{ partial: snippets.FormExample, } +var FormWithBlurValidationSnippet = Snippet{ + category: "Forms", + name: "Form", + description: "A simple form submission example with validation on blur", + sidebarName: "Form With Blur Validation", + path: "/examples/form-with-blur-validation", + partial: snippets.FormWithBlurValidation, +} + var UserAuthSnippet = Snippet{ category: "Projects", name: "User Authentication", @@ -90,6 +99,7 @@ var JsHideChildrenOnClick = Snippet{ var examples = []Snippet{ FormWithLoadingStateSnippet, + FormWithBlurValidationSnippet, ClickToEditSnippet, JsSetTextOnClick, diff --git a/htmgo-site/pages/examples/form-with-blur-validation.go b/htmgo-site/pages/examples/form-with-blur-validation.go new file mode 100644 index 0000000..8e1f579 --- /dev/null +++ b/htmgo-site/pages/examples/form-with-blur-validation.go @@ -0,0 +1,10 @@ +package examples + +import ( + "github.com/maddalax/htmgo/framework/h" +) + +func FormWithBlurValidation(ctx *h.RequestContext) *h.Page { + SetSnippet(ctx, &FormWithBlurValidationSnippet) + return Index(ctx) +} diff --git a/htmgo-site/pages/examples/form.go b/htmgo-site/pages/examples/form.go index 9ead363..63dcc1f 100644 --- a/htmgo-site/pages/examples/form.go +++ b/htmgo-site/pages/examples/form.go @@ -4,7 +4,7 @@ import ( "github.com/maddalax/htmgo/framework/h" ) -func FormExample(ctx *h.RequestContext) *h.Page { +func FormWithLoadingState(ctx *h.RequestContext) *h.Page { SetSnippet(ctx, &FormWithLoadingStateSnippet) return Index(ctx) } diff --git a/htmgo-site/partials/snippets/form-with-blur-validation.go b/htmgo-site/partials/snippets/form-with-blur-validation.go new file mode 100644 index 0000000..7779ce4 --- /dev/null +++ b/htmgo-site/partials/snippets/form-with-blur-validation.go @@ -0,0 +1,90 @@ +package snippets + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" +) + +func FormWithBlurValidation(ctx *h.RequestContext) *h.Partial { + buttonClasses := "rounded items-center px-3 py-2 bg-slate-800 text-white w-full text-center" + validationPath := h.GetPartialPath( + Validate, + ) + return h.NewPartial( + h.Form( + h.TriggerChildren(), + h.Id("my-form"), + // hx-swap: none is required so the traditional swap doesn't happen, only oob swap + h.NoSwap(), + h.PostPartial(SubmitFormExample), + h.Class("flex flex-col gap-2 max-w-[300px] mx-auto"), + h.LabelFor("name", "Your Name"), + h.Input( + "text", + h.Required(), + h.Class("p-4 rounded-md border border-slate-200"), + h.Name("name"), + h.Placeholder("Name"), + h.Post(validationPath, hx.BlurEvent), + ), + h.Div( + h.Id("name-error"), + h.Class("text-red-500"), + ), + h.LabelFor("occupation", "Occupation"), + h.Input( + "text", + h.Required(), + h.Class("p-4 rounded-md border border-slate-200"), + h.Name("occupation"), + h.Placeholder("Software Developer"), + ), + h.Button( + h.Type("submit"), + h.Class(buttonClasses), + h.Text("Submit"), + ), + ), + ) +} + +func Validate(ctx *h.RequestContext) *h.Partial { + name := ctx.FormValue("name") + + if name == "htmgo" { + ctx.Response.WriteHeader(400) + return h.SwapPartial( + ctx, + h.Div( + h.Id("name-error"), + h.Text("Name is already taken"), + h.Class("p-4 bg-rose-400 text-white rounded-md"), + ), + ) + } + + return h.EmptyPartial() +} + +func SubmitFormExample(ctx *h.RequestContext) *h.Partial { + + if !ctx.IsHttpPost() { + return h.EmptyPartial() + } + + validate := Validate(ctx) + + // if there is a validation error, swap it in + if !h.IsEmptyPartial(validate) { + return validate + } + + // submit the form + return h.SwapPartial( + ctx, + h.Div( + h.Id("my-form"), + h.Text("Form submitted with name: "+ctx.FormValue("name")), + ), + ) +} From 7f5274b34d9e17dc9d786ea6e0866ed635ae3e22 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 31 Oct 2024 14:45:06 +0000 Subject: [PATCH 106/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 8e6e58c..4399f79 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b + github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index aafba12..a9021fc 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index d80ff54..cf4daac 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b + github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 749d9fb..838dc2a 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index ace57ec..e3f0efe 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b + github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 505f62f..65a798d 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index e7e4508..61ce61c 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b + github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index e30b192..2b0def1 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 48c0235..0cbfca7 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 2732442..3bbe205 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 749bde9..dcdf8c1 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241030182742-35877a1b2e3b + github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031144416-f6556b579ffd github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 4a6d1ad..1e51b08 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241030182742-35877a1b2e3b h1:4SyvEpWX3ODD2OhjPG2EtjAr3R0bNVZqsX63JLcrNE8= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241030182742-35877a1b2e3b/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031144416-f6556b579ffd h1:H+AUsueKVs7zne+CA+vrsSLdC6oCNY7zy9CiGWtG/6M= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031144416-f6556b579ffd/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 2c576a8..725d363 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 2732442..3bbe205 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b h1:+iSqn5fXsKadLzNJdfXzXoPr1Iw17rFzgXBBu6CHxgE= -github.com/maddalax/htmgo/framework v1.0.3-0.20241030182742-35877a1b2e3b/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 833708e38ac08e2df248cb021c19d32633a0603e Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 09:56:37 -0500 Subject: [PATCH 107/137] wrap lines on examples --- htmgo-site/pages/examples/code.go | 7 ++++++- htmgo-site/ui/snippet.go | 2 ++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/htmgo-site/pages/examples/code.go b/htmgo-site/pages/examples/code.go index 88a9364..b06f854 100644 --- a/htmgo-site/pages/examples/code.go +++ b/htmgo-site/pages/examples/code.go @@ -65,5 +65,10 @@ func renderCodeToString(snippet *Snippet) *h.Element { source = out.String() } - return ui.GoCodeSnippet(source, "border-radius: 0.5rem;") + return ui.CodeSnippet(ui.CodeSnippetProps{ + Code: source, + Lang: "go", + CustomStyles: []string{"border-radius: 0.5rem;"}, + WrapLines: true, + }) } diff --git a/htmgo-site/ui/snippet.go b/htmgo-site/ui/snippet.go index d42302e..c5e07f2 100644 --- a/htmgo-site/ui/snippet.go +++ b/htmgo-site/ui/snippet.go @@ -24,6 +24,7 @@ func FormatCode(props CodeSnippetProps) string { lexer := lexers.Get(props.Lang) style := styles.Get("github") formatter := html.New( + html.WrapLongLines(props.WrapLines), html.WithLineNumbers(!props.SingleLine && !props.HideLineNumbers), html.WithCustomCSS(map[chroma.TokenType]string{ chroma.PreWrapper: fmt.Sprintf("border-radius: 0.2rem; line-height: 24px; font-size: 14px; padding: 12px; overflow: auto; background-color: rgb(245, 245, 245) !important; %s", strings.Join(props.CustomStyles, ";")), @@ -42,6 +43,7 @@ type CodeSnippetProps struct { CustomStyles []string HideLineNumbers bool SingleLine bool + WrapLines bool } func CodeSnippet(props CodeSnippetProps) *h.Element { From 44461b1ec7dd6b79d17e417366de8a894dcae201 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 09:58:16 -0500 Subject: [PATCH 108/137] add helper --- htmgo-site/partials/snippets/form-with-blur-validation.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htmgo-site/partials/snippets/form-with-blur-validation.go b/htmgo-site/partials/snippets/form-with-blur-validation.go index 7779ce4..794683a 100644 --- a/htmgo-site/partials/snippets/form-with-blur-validation.go +++ b/htmgo-site/partials/snippets/form-with-blur-validation.go @@ -27,6 +27,10 @@ func FormWithBlurValidation(ctx *h.RequestContext) *h.Partial { h.Placeholder("Name"), h.Post(validationPath, hx.BlurEvent), ), + h.Pf( + "type 'htmgo' to see validation errors", + h.Class("text-slate-600 text-sm"), + ), h.Div( h.Id("name-error"), h.Class("text-red-500"), From de0e06155bbed8b8bf0d44e903ed9e41808a2e55 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 10:16:03 -0500 Subject: [PATCH 109/137] text input example --- htmgo-site/pages/examples/examples.go | 11 ++ htmgo-site/pages/examples/input-component.go | 8 ++ .../partials/snippets/input-component.go | 128 ++++++++++++++++++ 3 files changed, 147 insertions(+) create mode 100644 htmgo-site/pages/examples/input-component.go create mode 100644 htmgo-site/partials/snippets/input-component.go diff --git a/htmgo-site/pages/examples/examples.go b/htmgo-site/pages/examples/examples.go index 2e7aabc..f979578 100644 --- a/htmgo-site/pages/examples/examples.go +++ b/htmgo-site/pages/examples/examples.go @@ -97,6 +97,15 @@ var JsHideChildrenOnClick = Snippet{ partial: snippets.JsHideChildrenOnClick, } +var InputComponentSnippet = Snippet{ + category: "Components", + name: "Input", + description: "An example of how you could build a re-usable input component", + sidebarName: "Text Input", + path: "/examples/input-component", + partial: snippets.InputComponent, +} + var examples = []Snippet{ FormWithLoadingStateSnippet, FormWithBlurValidationSnippet, @@ -110,4 +119,6 @@ var examples = []Snippet{ HackerNewsSnippet, TodoListSnippet, HtmgoSiteSnippet, + + InputComponentSnippet, } diff --git a/htmgo-site/pages/examples/input-component.go b/htmgo-site/pages/examples/input-component.go new file mode 100644 index 0000000..0fc879b --- /dev/null +++ b/htmgo-site/pages/examples/input-component.go @@ -0,0 +1,8 @@ +package examples + +import "github.com/maddalax/htmgo/framework/h" + +func InputComponentExample(ctx *h.RequestContext) *h.Page { + SetSnippet(ctx, &InputComponentSnippet) + return Index(ctx) +} diff --git a/htmgo-site/partials/snippets/input-component.go b/htmgo-site/partials/snippets/input-component.go new file mode 100644 index 0000000..1bd780e --- /dev/null +++ b/htmgo-site/partials/snippets/input-component.go @@ -0,0 +1,128 @@ +package snippets + +import ( + "github.com/maddalax/htmgo/framework/h" + "github.com/maddalax/htmgo/framework/hx" +) + +// InputComponent wrapper to make the code snippet work, main code is the Input function +func InputComponent(ctx *h.RequestContext) *h.Partial { + + return h.NewPartial( + h.Div( + h.Class("max-w-sm mx-auto flex flex-col gap-4"), + Input( + InputProps{ + Id: "my-input", + Name: "my-input", + Label: "Input with label", + Type: "text", + Placeholder: "Type something", + Required: true, + }, + h.Attribute("autocomplete", "off"), + h.MaxLength(50), + ), + Input( + InputProps{ + Id: "my-input", + Name: "my-input", + Label: "Input with default value", + Type: "text", + DefaultValue: "Default value", + }, + ), + Input( + InputProps{ + Id: "my-input", + Name: "my-input", + Label: "Input with helper text", + Type: "text", + Placeholder: "Full name", + HelperText: "This should be your full legal name", + }, + ), + ), + ) +} + +type InputProps struct { + Id string + Label string + Name string + Type string + DefaultValue string + Placeholder string + Required bool + ValidationPath string + HelperText string +} + +func Input(props InputProps, children ...h.Ren) *h.Element { + validation := h.If( + props.ValidationPath != "", + h.Children( + h.Post(props.ValidationPath, hx.BlurEvent), + h.Attribute("hx-swap", "innerHTML transition:true"), + h.Attribute("hx-target", "next div"), + ), + ) + + if props.Type == "" { + props.Type = "text" + } + + input := h.Input( + props.Type, + h.Class("border p-2 rounded"), + h.If( + props.Id != "", + h.Id(props.Id), + ), + h.If( + props.Name != "", + h.Name(props.Name), + ), + h.If( + children != nil, + h.Children(children...), + ), + h.If( + props.Required, + h.Required(), + ), + h.If( + props.Placeholder != "", + h.Placeholder(props.Placeholder), + ), + h.If( + props.DefaultValue != "", + h.Attribute("value", props.DefaultValue), + ), + validation, + ) + + wrapped := h.Div( + h.Class("flex flex-col gap-1"), + h.If( + props.Label != "", + h.Label( + h.Text(props.Label), + ), + ), + input, + h.If( + props.HelperText != "", + h.Div( + h.Class("text-slate-600 text-sm"), + h.Text(props.HelperText), + ), + ), + h.Div( + h.Id(props.Id+"-error"), + h.Class("text-red-500"), + ), + ) + + return wrapped +} From 7da172cfad53a85c22a9f272084de018a3a38704 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 10:53:32 -0500 Subject: [PATCH 110/137] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9396556..fa87abe 100644 --- a/README.md +++ b/README.md @@ -5,6 +5,7 @@ ------- [![Go Report Card](https://goreportcard.com/badge/github.com/maddalax/htmgo)](https://goreportcard.com/report/github.com/maddalax/htmgo) ![Build](https://github.com/maddalax/htmgo/actions/workflows/run-framework-tests.yml/badge.svg) +[![Go Reference](https://pkg.go.dev/badge/github.com/maddalax/htmgo/framework@v1.0.2/h.svg)](https://pkg.go.dev/github.com/maddalax/htmgo/framework@v1.0.2/h) looking for a python version? check out: https://fastht.ml From ca946f2cba09a064be4d6f0496d2d49aef59972b Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 10:55:17 -0500 Subject: [PATCH 111/137] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fa87abe..ee395b8 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ ------- [![Go Report Card](https://goreportcard.com/badge/github.com/maddalax/htmgo)](https://goreportcard.com/report/github.com/maddalax/htmgo) ![Build](https://github.com/maddalax/htmgo/actions/workflows/run-framework-tests.yml/badge.svg) -[![Go Reference](https://pkg.go.dev/badge/github.com/maddalax/htmgo/framework@v1.0.2/h.svg)](https://pkg.go.dev/github.com/maddalax/htmgo/framework@v1.0.2/h) +[![Go Reference](https://pkg.go.dev/badge/github.com/maddalax/htmgo/framework@v1.0.2/h.svg)](https://htmgo.dev/docs) looking for a python version? check out: https://fastht.ml From 6db280907af9c5ec6dc49ba71cbd7db6d71fa401 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 11:01:40 -0500 Subject: [PATCH 112/137] upload to codecov --- .github/workflows/run-framework-tests.yml | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/run-framework-tests.yml b/.github/workflows/run-framework-tests.yml index 1f82cdd..87cce04 100644 --- a/.github/workflows/run-framework-tests.yml +++ b/.github/workflows/run-framework-tests.yml @@ -25,4 +25,9 @@ jobs: run: cd ./framework && go mod download - name: Run Go tests - run: cd ./framework && go test ./... + run: cd ./framework && go test ./... -coverprofile=coverage.txt + + - name: Upload results to Codecov + uses: codecov/codecov-action@v4 + with: + token: ${{ secrets.CODECOV_TOKEN }} From 8a008282323d08a7da2fddd709853995bbc352bb Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 11:11:09 -0500 Subject: [PATCH 113/137] conditional tests --- framework/h/conditionals_test.go | 92 ++++++++++++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 framework/h/conditionals_test.go diff --git a/framework/h/conditionals_test.go b/framework/h/conditionals_test.go new file mode 100644 index 0000000..6b618fb --- /dev/null +++ b/framework/h/conditionals_test.go @@ -0,0 +1,92 @@ +package h + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestIf(t *testing.T) { + t.Parallel() + result := If(true, Pf("hello")) + assert.Equal(t, "

    hello

    ", Render(result)) + + result2 := If(false, Pf("hello")) + assert.Equal(t, "", Render(result2)) // Expect an empty element +} + +func TestIfElse(t *testing.T) { + t.Parallel() + result := IfElse(true, Pf("hello"), Pf("world")) + assert.Equal(t, "

    hello

    ", Render(result)) + + result2 := IfElse(false, Pf("hello"), Pf("world")) + assert.Equal(t, "

    world

    ", Render(result2)) +} + +func TestTernary(t *testing.T) { + t.Parallel() + result := Ternary(true, Pf("hello"), Pf("world")) + assert.Equal(t, "

    hello

    ", Render(result)) + + result2 := Ternary(false, Pf("hello"), Pf("world")) + assert.Equal(t, "

    world

    ", Render(result2)) +} + +func TestIfElseLazy(t *testing.T) { + t.Parallel() + result := IfElseLazy(true, func() *Element { return Pf("hello") }, func() *Element { return Pf("world") }) + assert.Equal(t, "

    hello

    ", Render(result)) + + result2 := IfElseLazy(false, func() *Element { return Pf("hello") }, func() *Element { return Pf("world") }) + assert.Equal(t, "

    world

    ", Render(result2)) +} + +func TestElementIf(t *testing.T) { + t.Parallel() + element := Pf("hello") + result := ElementIf(true, element) + assert.Equal(t, "

    hello

    ", Render(result)) + + result2 := ElementIf(false, element) + assert.Equal(t, "", Render(result2)) // Expect an empty element +} + +func TestIfElseE(t *testing.T) { + t.Parallel() + element1 := Pf("hello") + element2 := Pf("world") + result := IfElseE(true, element1, element2) + assert.Equal(t, "

    hello

    ", Render(result)) + + result2 := IfElseE(false, element1, element2) + assert.Equal(t, "

    world

    ", Render(result2)) +} + +func TestIfHtmxRequest(t *testing.T) { + t.Parallel() + ctx := &RequestContext{isHxRequest: true} + result := IfHtmxRequest(ctx, Pf("hello")) + assert.Equal(t, "

    hello

    ", Render(result)) + + ctx2 := &RequestContext{isHxRequest: false} + result2 := IfHtmxRequest(ctx2, Pf("hello")) + assert.Equal(t, "", Render(result2)) // Expect an empty element +} + +func TestClassIf(t *testing.T) { + t.Parallel() + result := ClassIf(true, "my-class") + assert.Equal(t, ` class="my-class"`, Render(result)) + + result2 := ClassIf(false, "my-class") + assert.Equal(t, "", Render(result2)) // Expect an empty element +} + +func TestAttributeIf(t *testing.T) { + t.Parallel() + result := AttributeIf(true, "data-test", "value") + assert.Equal(t, ` data-test="value"`, Render(result)) + + result2 := AttributeIf(false, "data-test", "value") + assert.Equal(t, "", Render(result2)) // Expect an empty element +} From 9ed353ebe3bd637cca807e18433185b033b55a7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 31 Oct 2024 16:12:09 +0000 Subject: [PATCH 114/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 4399f79..66f8762 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd + github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index a9021fc..12c197c 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index cf4daac..7bcb23a 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd + github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 838dc2a..863a1d7 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index e3f0efe..34a65bc 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd + github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 65a798d..3e57416 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 61ce61c..01fcc6e 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd + github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 2b0def1..4acf467 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 0cbfca7..06cdb91 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 3bbe205..1d4f5d6 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index dcdf8c1..f29d3e8 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031144416-f6556b579ffd + github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031161109-8a008282323d github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 1e51b08..e4a884e 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031144416-f6556b579ffd h1:H+AUsueKVs7zne+CA+vrsSLdC6oCNY7zy9CiGWtG/6M= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031144416-f6556b579ffd/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031161109-8a008282323d h1:Ul81zsDVkaTIjVAE3vQqb2+F7+J+m2V7rgwJQn1REYk= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031161109-8a008282323d/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 725d363..9a6a589 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 3bbe205..1d4f5d6 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd h1:nM0GuUc+kdZtw0De968+nKHD5Y3gznlV/eogyTBGRjo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031144416-f6556b579ffd/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From f42351e94fc13bc8fc191ac4883f9a3e6478e371 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 11:36:57 -0500 Subject: [PATCH 115/137] more tests --- framework/h/attribute_test.go | 160 ++++++++++++++++++++++++++++++++ framework/h/command_test.go | 15 +++ framework/h/header_test.go | 57 ++++++++++++ framework/h/qs_test.go | 27 ++++++ framework/h/serialize.go | 3 + framework/h/serialize_test.go | 28 ++++++ framework/h/swap_test.go | 88 ++++++++++++++++++ framework/h/tag_test.go | 168 ++++++++++++++++++++++++++++++++++ 8 files changed, 546 insertions(+) create mode 100644 framework/h/attribute_test.go create mode 100644 framework/h/header_test.go create mode 100644 framework/h/serialize_test.go create mode 100644 framework/h/swap_test.go create mode 100644 framework/h/tag_test.go diff --git a/framework/h/attribute_test.go b/framework/h/attribute_test.go new file mode 100644 index 0000000..c2a56f1 --- /dev/null +++ b/framework/h/attribute_test.go @@ -0,0 +1,160 @@ +package h + +import ( + "github.com/maddalax/htmgo/framework/hx" + "github.com/stretchr/testify/assert" + "testing" +) + +func TestAttributes(t *testing.T) { + tests := []struct { + name string + attribute *AttributeR + expectedKey string + expectedValue string + }{ + {"NoSwap", NoSwap(), "hx-swap", "none"}, + {"Checked", Checked().(*AttributeR), "checked", ""}, + {"Id", Id("myID").(*AttributeR), "id", "myID"}, + {"Disabled", Disabled(), "disabled", ""}, + {"HxTarget", HxTarget("#myTarget").(*AttributeR), "hx-target", "#myTarget"}, + {"Name", Name("myName").(*AttributeR), "name", "myName"}, + {"HxConfirm", HxConfirm("Are you sure?").(*AttributeR), "hx-confirm", "Are you sure?"}, + {"Class", Class("class1", "class2"), "class", "class1 class2 "}, + {"ReadOnly", ReadOnly(), "readonly", ""}, + {"Required", Required(), "required", ""}, + {"Multiple", Multiple(), "multiple", ""}, + {"Selected", Selected(), "selected", ""}, + {"MaxLength", MaxLength(10), "maxlength", "10"}, + {"MinLength", MinLength(5), "minlength", "5"}, + {"Size", Size(3), "size", "3"}, + {"Width", Width(100), "width", "100"}, + {"Height", Height(200), "height", "200"}, + {"Download", Download(true), "download", "true"}, + {"Rel", Rel("noopener"), "rel", "noopener"}, + {"Pattern", Pattern("[A-Za-z]+"), "pattern", "[A-Za-z]+"}, + {"Action", Action("/submit"), "action", "/submit"}, + {"Method", Method("POST"), "method", "POST"}, + {"Enctype", Enctype("multipart/form-data"), "enctype", "multipart/form-data"}, + {"AutoComplete", AutoComplete("on"), "autocomplete", "on"}, + {"AutoFocus", AutoFocus(), "autofocus", ""}, + {"NoValidate", NoValidate(), "novalidate", ""}, + {"Step", Step("0.1"), "step", "0.1"}, + {"Max", Max("100"), "max", "100"}, + {"Min", Min("0"), "min", "0"}, + {"Cols", Cols(30), "cols", "30"}, + {"Rows", Rows(10), "rows", "10"}, + {"Wrap", Wrap("soft"), "wrap", "soft"}, + {"Role", Role("button"), "role", "button"}, + {"AriaLabel", AriaLabel("Close Dialog"), "aria-label", "Close Dialog"}, + {"AriaHidden", AriaHidden(true), "aria-hidden", "true"}, + {"TabIndex", TabIndex(1), "tabindex", "1"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equal(t, tt.expectedKey, tt.attribute.Name) + assert.Equal(t, tt.expectedValue, tt.attribute.Value) + }) + } +} + +func TestClassF(t *testing.T) { + attribute := ClassF("class-%d", 123) + assert.Equal(t, "class", attribute.Name) + assert.Equal(t, "class-123", attribute.Value) +} + +func TestClassX(t *testing.T) { + classMap := ClassMap{"visible": true, "hidden": false} + attribute := ClassX("base", classMap).(*AttributeR) + assert.Equal(t, "class", attribute.Name) + assert.Equal(t, "base visible ", attribute.Value) +} + +func TestJoinAttributes(t *testing.T) { + attr1 := Attribute("data-attr", "one") + attr2 := Attribute("data-attr", "two") + joined := JoinAttributes(", ", attr1, attr2) + assert.Equal(t, "data-attr", joined.Name) + assert.Equal(t, "one, two", joined.Value) +} + +func TestTarget(t *testing.T) { + attr := Target("_blank") + assert.Equal(t, "target", attr.(*AttributeR).Name) + assert.Equal(t, "_blank", attr.(*AttributeR).Value) +} + +func TestD(t *testing.T) { + attr := D("M10 10 H 90 V 90 H 10 Z") + assert.Equal(t, "d", attr.(*AttributeR).Name) + assert.Equal(t, "M10 10 H 90 V 90 H 10 Z", attr.(*AttributeR).Value) +} + +func TestHxExtension(t *testing.T) { + attr := HxExtension("trigger-children") + assert.Equal(t, "hx-ext", attr.Name) + assert.Equal(t, "trigger-children", attr.Value) +} + +func TestHxExtensions(t *testing.T) { + attr := HxExtensions("foo", "bar") + assert.Equal(t, "hx-ext", attr.(*AttributeR).Name) + assert.Equal(t, "foo,bar", attr.(*AttributeR).Value) +} + +func TestHxTrigger(t *testing.T) { + trigger := hx.NewTrigger(hx.OnClick()) // This assumes hx.NewTrigger is a correct call + attr := HxTrigger(hx.OnClick()) + assert.Equal(t, "hx-trigger", attr.Name) + assert.Equal(t, trigger.ToString(), attr.Value) +} + +func TestHxTriggerClick(t *testing.T) { + attr := HxTriggerClick() // Assuming no options for simplicity + assert.Equal(t, "hx-trigger", attr.Name) + assert.Equal(t, "click", attr.Value) +} + +func TestTriggerChildren(t *testing.T) { + attr := TriggerChildren() + assert.Equal(t, "hx-ext", attr.Name) + assert.Equal(t, "trigger-children", attr.Value) +} + +func TestHxInclude(t *testing.T) { + attr := HxInclude(".include-selector") + assert.Equal(t, "hx-include", attr.(*AttributeR).Name) + assert.Equal(t, ".include-selector", attr.(*AttributeR).Value) +} + +func TestHxIndicator(t *testing.T) { + attr := HxIndicator("#my-indicator") + assert.Equal(t, "hx-indicator", attr.Name) + assert.Equal(t, "#my-indicator", attr.Value) +} + +func TestHidden(t *testing.T) { + attr := Hidden() + assert.Equal(t, "style", attr.(*AttributeR).Name) + assert.Equal(t, "display:none", attr.(*AttributeR).Value) +} + +func TestControls(t *testing.T) { + attr := Controls() + assert.Equal(t, "controls", attr.(*AttributeR).Name) + assert.Equal(t, "", attr.(*AttributeR).Value) +} + +func TestPlaceholder(t *testing.T) { + attr := Placeholder("Enter text") + assert.Equal(t, "placeholder", attr.(*AttributeR).Name) + assert.Equal(t, "Enter text", attr.(*AttributeR).Value) +} + +func TestBoost(t *testing.T) { + attr := Boost() + assert.Equal(t, "hx-boost", attr.(*AttributeR).Name) + assert.Equal(t, "true", attr.(*AttributeR).Value) +} diff --git a/framework/h/command_test.go b/framework/h/command_test.go index 11b42fa..2442506 100644 --- a/framework/h/command_test.go +++ b/framework/h/command_test.go @@ -381,3 +381,18 @@ func TestToggleClassOnSibling(t *testing.T) { } `)) } + +func TestPreventDefault(t *testing.T) { + t.Parallel() + compareIgnoreSpaces(t, renderJs(t, PreventDefault()), "event.preventDefault();") +} + +func TestConsoleLog(t *testing.T) { + t.Parallel() + compareIgnoreSpaces(t, renderJs(t, ConsoleLog("Log Message")), "console.log('Log Message');") +} + +func TestSetValue(t *testing.T) { + t.Parallel() + compareIgnoreSpaces(t, renderJs(t, SetValue("New Value")), "this.value = 'New Value';") +} diff --git a/framework/h/header_test.go b/framework/h/header_test.go new file mode 100644 index 0000000..5715a2e --- /dev/null +++ b/framework/h/header_test.go @@ -0,0 +1,57 @@ +package h + +import ( + "github.com/maddalax/htmgo/framework/hx" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +func TestReplaceUrlHeader(t *testing.T) { + headers := ReplaceUrlHeader("/new-url") + assert.Contains(t, *headers, hx.ReplaceUrlHeader) + assert.Equal(t, "/new-url", (*headers)[hx.ReplaceUrlHeader]) +} + +func TestPushUrlHeader(t *testing.T) { + headers := PushUrlHeader("/push-url") + assert.Contains(t, *headers, hx.PushUrlHeader) + assert.Equal(t, "/push-url", (*headers)[hx.PushUrlHeader]) +} + +func TestPushQsHeader(t *testing.T) { + ctx := &RequestContext{currentBrowserUrl: "https://example.com/path"} + qs := NewQs("a", "b", "c", "d") + headers := PushQsHeader(ctx, qs) + expectedURL := "/path?a=b&c=d" + assert.Contains(t, *headers, hx.ReplaceUrlHeader) + assert.Equal(t, expectedURL, (*headers)[hx.ReplaceUrlHeader]) +} + +func TestCombineHeaders(t *testing.T) { + h1 := NewHeaders("Content-Type", "application/json") + h2 := NewHeaders("Authorization", "Bearer token") + combined := CombineHeaders(h1, h2) + assert.Equal(t, "application/json", (*combined)["Content-Type"]) + assert.Equal(t, "Bearer token", (*combined)["Authorization"]) +} + +func TestCurrentPath(t *testing.T) { + req, _ := http.NewRequest("GET", "https://example.com", nil) + req.Header.Set(hx.CurrentUrlHeader, "https://example.com/current-path") + ctx := &RequestContext{Request: req} + path := CurrentPath(ctx) + assert.Equal(t, "/current-path", path) +} + +func TestNewHeaders(t *testing.T) { + headers := NewHeaders("X-Custom", "value", "X-Another", "another-value") + require.NotNil(t, headers) + assert.Equal(t, "value", (*headers)["X-Custom"]) + assert.Equal(t, "another-value", (*headers)["X-Another"]) + + invalidHeaders := NewHeaders("X-Custom") + assert.Empty(t, *invalidHeaders) // Check incorrect pair length handling +} diff --git a/framework/h/qs_test.go b/framework/h/qs_test.go index 31067fd..22e80b1 100644 --- a/framework/h/qs_test.go +++ b/framework/h/qs_test.go @@ -2,6 +2,8 @@ package h import ( "github.com/stretchr/testify/assert" + "net/http" + "net/url" "testing" ) @@ -47,3 +49,28 @@ func TestSetQsOnUrlWithDelete(t *testing.T) { set := SetQueryParams("https://example.com/path?a=b&c=d", qs) assert.Equal(t, "https://example.com/path?a=b2", set) } + +func TestGetQueryParam(t *testing.T) { + t.Parallel() + req, _ := http.NewRequest("GET", "http://localhost/?foo=bar&baz=qux", nil) + ctx := &RequestContext{Request: req} + + result := GetQueryParam(ctx, "foo") + assert.Equal(t, "bar", result) + + result = GetQueryParam(ctx, "baz") + assert.Equal(t, "qux", result) + + result = GetQueryParam(ctx, "missing") + assert.Equal(t, "", result) + + ctx.currentBrowserUrl = "http://localhost/?current=value" + + result = GetQueryParam(ctx, "current") + assert.Equal(t, "value", result) + + // url params should override browser url + req.URL, _ = url.Parse("http://localhost/?foo=override") + result = GetQueryParam(ctx, "foo") + assert.Equal(t, "override", result) +} diff --git a/framework/h/serialize.go b/framework/h/serialize.go index 0bc2c11..b880d41 100644 --- a/framework/h/serialize.go +++ b/framework/h/serialize.go @@ -6,6 +6,9 @@ import ( // JsonSerializeOrEmpty serializes the given data as JSON, or returns an empty string if the serialization fails. func JsonSerializeOrEmpty(data any) string { + if data == nil { + return "" + } serialized, err := json.Marshal(data) if err != nil { return "" diff --git a/framework/h/serialize_test.go b/framework/h/serialize_test.go new file mode 100644 index 0000000..a18a62f --- /dev/null +++ b/framework/h/serialize_test.go @@ -0,0 +1,28 @@ +package h + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestSerialize(t *testing.T) { + t.Parallel() + data := map[string]any{ + "hello": "world", + "foo": "bar", + } + serialized := JsonSerializeOrEmpty(data) + assert.Equal(t, `{"foo":"bar","hello":"world"}`, serialized) +} + +func TestSerializeNil(t *testing.T) { + t.Parallel() + serialized := JsonSerializeOrEmpty(nil) + assert.Equal(t, "", serialized) +} + +func TestSerializeInvalid(t *testing.T) { + t.Parallel() + serialized := JsonSerializeOrEmpty(func() {}) + assert.Equal(t, "", serialized) +} diff --git a/framework/h/swap_test.go b/framework/h/swap_test.go new file mode 100644 index 0000000..849a2c5 --- /dev/null +++ b/framework/h/swap_test.go @@ -0,0 +1,88 @@ +package h + +import ( + "github.com/maddalax/htmgo/framework/hx" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewSwap(t *testing.T) { + content := Div() + option := SwapOption{Selector: "#myDiv", SwapType: hx.SwapTypeInnerHtml, Modifier: "test-mod"} + swapArg := NewSwap(content, option) + + assert.Equal(t, content, swapArg.Content) + assert.Equal(t, option, swapArg.Option) +} + +func TestOobSwap(t *testing.T) { + ctx := &RequestContext{isHxRequest: true} + content := Div() + + result := OobSwap(ctx, content) + assert.NotNil(t, result) + assert.Equal(t, 1, len(result.children)) + assert.Equal(t, Attribute(hx.SwapOobAttr, hx.SwapTypeTrue), result.children[0]) + + // Test with a nil context + result = OobSwap(nil, content) + assert.Equal(t, Empty(), result) + + // Test with non-HX request + ctx.isHxRequest = false + result = OobSwap(ctx, content) + assert.Equal(t, Empty(), result) +} + +func TestOobSwapWithSelector(t *testing.T) { + ctx := &RequestContext{isHxRequest: true} + content := Div() + + result := OobSwapWithSelector(ctx, "#selector", content) + assert.NotNil(t, result) + assert.Equal(t, 1, len(result.children)) + assert.Equal(t, Attribute(hx.SwapOobAttr, "#selector"), result.children[0]) +} + +func TestSwapMany(t *testing.T) { + ctx := &RequestContext{isHxRequest: true} + element1 := Div() + element2 := Span() + + result := SwapMany(ctx, element1, element2) + assert.NotNil(t, result) + assert.Equal(t, 2, len(result.children)) + assert.Equal(t, element1, result.children[0]) + assert.Equal(t, element2, result.children[1]) + assert.Equal(t, Attribute(hx.SwapOobAttr, hx.SwapTypeTrue), element1.children[0]) + assert.Equal(t, Attribute(hx.SwapOobAttr, hx.SwapTypeTrue), element2.children[0]) + + // Test with non-HX request + ctx.isHxRequest = false + result = SwapMany(ctx, element1, element2) + assert.Equal(t, Empty(), result) +} + +func TestSwapManyX(t *testing.T) { + ctx := &RequestContext{isHxRequest: true} + content1 := Div() + content2 := Span() + option := SwapOption{SwapType: hx.SwapTypeBeforeEnd} + + arg1 := NewSwap(content1) + arg2 := NewSwap(content2, option) + + result := SwapManyX(ctx, arg1, arg2) + assert.NotNil(t, result) + assert.Equal(t, 2, len(result.children)) + assert.Equal(t, content1, result.children[0]) + assert.Equal(t, content2, result.children[1]) + assert.Equal(t, Attribute(hx.SwapOobAttr, hx.SwapTypeTrue), content1.children[0]) + assert.Equal(t, Attribute(hx.SwapOobAttr, hx.SwapTypeBeforeEnd), content2.children[0]) + + // Test with non-HX request + ctx.isHxRequest = false + result = SwapManyX(ctx, arg1, arg2) + assert.Equal(t, Empty(), result) +} diff --git a/framework/h/tag_test.go b/framework/h/tag_test.go new file mode 100644 index 0000000..765c4d5 --- /dev/null +++ b/framework/h/tag_test.go @@ -0,0 +1,168 @@ +package h + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestTagFunctions(t *testing.T) { + tests := []struct { + name string + element *Element + expected string + }{ + {"Div", Div(), "div"}, + {"Span", Span(), "span"}, + {"Button", Button(), "button"}, + {"P", P(), "p"}, + {"H1", H1(), "h1"}, + {"H2", H2(), "h2"}, + {"H3", H3(), "h3"}, + {"H4", H4(), "h4"}, + {"H5", H5(), "h5"}, + {"H6", H6(), "h6"}, + {"Img", Img(), "img"}, + {"Video", Video(), "video"}, + {"Form", Form(), "form"}, + {"A", A(), "a"}, + {"Nav", Nav(), "nav"}, + {"Section", Section(), "section"}, + {"Aside", Aside(), "aside"}, + {"Header", Header(), "header"}, + {"Footer", Footer(), "footer"}, + {"Main", Main(), "main"}, + {"Ul", Ul(), "ul"}, + {"Li", Li(), "li"}, + {"Br", Br(), "br"}, + {"Hr", Hr(), "hr"}, + {"Ol", Ol(), "ol"}, + {"Table", Table(), "table"}, + {"Tr", Tr(), "tr"}, + {"Td", Td(), "td"}, + {"Th", Th(), "th"}, + {"THead", THead(), "thead"}, + {"TBody", TBody(), "tbody"}, + {"TFoot", TFoot(), "tfoot"}, + {"Abbr", Abbr(), "abbr"}, + {"Strong", Strong(), "strong"}, + {"Code", Code(), "code"}, + {"Title", Title(), "title"}, + {"Dialog", Dialog(), "dialog"}, + {"FieldSet", FieldSet(), "fieldset"}, + {"Option", Option(), "option"}, + {"Select", Select(), "select"}, + {"Template", Template(), "template"}, + {"Label", Label(), "label"}, + {"Address", Address(), "address"}, + {"Pre", Pre(), "pre"}, + {"Article", Article(), "article"}, + {"Summary", Summary(), "summary"}, + {"Details", Details(), "details"}, + {"Svg", Svg(), "svg"}, + {"Path", Path(), "path"}, + {"Html", Html(), "html"}, + {"Head", Head(), "head"}, + {"Body", Body(), "body"}, + {"Meta", Meta("description", "test"), "meta"}, + {"Link", Link("style.css", "stylesheet"), "link"}, + {"LinkWithVersion", LinkWithVersion("style.css", "stylesheet", "1.0"), "link"}, + {"Script", Script("script.js"), "script"}, + {"ScriptWithVersion", ScriptWithVersion("script.js", "1.0"), "script"}, + {"Style", Style("body {background: #000;}"), "style"}, + {"Pre", Pre(), "pre"}, + {"Article", Article(), "article"}, + {"Checkbox", Checkbox(), "input"}, + {"TextArea", TextArea(), "textarea"}, + {"TextInput", TextInput(), "input"}, + {"NumberInput", NumberInput(), "input"}, + {"FileInput", FileInput(), "input"}, + {"Radio", Radio(), "input"}, + {"Fragment", Fragment(), ""}, + {"Template", Template(), "template"}, + {"IFrame", IFrame("example.com"), "iframe"}, + {"LabelFor", LabelFor("input-id", "Input Label"), "label"}, + {"I", I(), "i"}, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + assert.Equal(t, tt.expected, tt.element.tag) + }) + } +} + +func TestList(t *testing.T) { + t.Parallel() + items := []string{"hello", "world"} + list := Ul(List(items, func(item string, index int) *Element { + return Li(Text(item)) + })) + assert.Equal(t, `
    • hello
    • world
    `, Render(list)) +} + +func TestIterMap(t *testing.T) { + t.Parallel() + items := map[string]string{ + "hello": "world", + } + list := Ul(IterMap(items, func(key string, value string) *Element { + return Li(Text(key), Text(value)) + })) + assert.Equal(t, `
    • helloworld
    `, Render(list)) +} + +func TestUnsafeRaw(t *testing.T) { + t.Parallel() + element := UnsafeRaw("
    Hello World
    ") + assert.Equal(t, "
    Hello World
    ", Render(element)) +} + +func TestUnsafeRawScript(t *testing.T) { + t.Parallel() + element := UnsafeRawScript("alert('Hello World')") + assert.Equal(t, "", Render(element)) +} + +func TestUnsafeRawF(t *testing.T) { + t.Parallel() + element := UnsafeRawF("Hello %s", "World") + assert.Equal(t, "Hello World", Render(element)) +} + +func TestMultiLineQuotes(t *testing.T) { + t.Parallel() + element := MultiLineQuotes("Hello World") + assert.Equal(t, "`Hello World`", element) +} + +func TestValue(t *testing.T) { + t.Parallel() + assert.Equal(t, ` value="Hello World"`, Render(Value("Hello World"))) + assert.Equal(t, ` value="1"`, Render(Value(1))) + assert.Equal(t, ` value="true"`, Render(Value(true))) +} + +func TestAppendChildren(t *testing.T) { + t.Parallel() + element := Div() + element.AppendChildren(Div(), Div()) + assert.Equal(t, "
    ", Render(element)) +} + +func TestTagF(t *testing.T) { + t.Parallel() + element := TagF("div", "Hello %s", "World") + assert.Equal(t, "
    Hello World
    ", Render(element)) + + element2 := TagF("div", "Hello World", Class("my-class")) + assert.Equal(t, "
    Hello World
    ", Render(element2)) + + element3 := TagF("div", "Value", P(Text("Hello World"))) + assert.Equal(t, "
    Value

    Hello World

    ", Render(element3)) +} + +func TestTag(t *testing.T) { + t.Parallel() + element := Tag("div") + assert.Equal(t, "
    ", Render(element)) +} From 92f33c8cfff76a885b78f64f20a37a5d1e233e96 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 31 Oct 2024 16:37:49 +0000 Subject: [PATCH 116/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 66f8762..8f3c046 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d + github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 12c197c..9e64a1d 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 7bcb23a..10026ee 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d + github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 863a1d7..59cc9c9 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index 34a65bc..e4215d0 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d + github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 3e57416..f6196d3 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 01fcc6e..8ff4d45 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d + github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 4acf467..a3b88e3 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 06cdb91..002f264 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 1d4f5d6..2b7f329 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index f29d3e8..bd25878 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031161109-8a008282323d + github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031163701-e268a581cedf github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index e4a884e..ffab331 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031161109-8a008282323d h1:Ul81zsDVkaTIjVAE3vQqb2+F7+J+m2V7rgwJQn1REYk= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031161109-8a008282323d/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031163701-e268a581cedf h1:HZ8a144LGdR1ESCtVoyDtr7QRgg0GSca2KFbwVjHPVw= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031163701-e268a581cedf/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 9a6a589..1ac9fad 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 1d4f5d6..2b7f329 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d h1:rCKufjNm6C1m1h91/zd/75lh6tQx2/UUgO7pcd1DBWs= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031161109-8a008282323d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 51995681e35983d59fe38be04fcb246751eaf517 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 11:39:21 -0500 Subject: [PATCH 117/137] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index ee395b8..4a29de4 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,7 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/maddalax/htmgo)](https://goreportcard.com/report/github.com/maddalax/htmgo) ![Build](https://github.com/maddalax/htmgo/actions/workflows/run-framework-tests.yml/badge.svg) [![Go Reference](https://pkg.go.dev/badge/github.com/maddalax/htmgo/framework@v1.0.2/h.svg)](https://htmgo.dev/docs) +[![codecov](https://codecov.io/github/maddalax/htmgo/graph/badge.svg?token=ANPD11LSGN)](https://codecov.io/github/maddalax/htmgo) looking for a python version? check out: https://fastht.ml From 248e485ff079b935d3bd4b6b348a539bb5b5c912 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 11:43:24 -0500 Subject: [PATCH 118/137] ordered map tests, extensions test --- .../orderedmap/orderedmap_test.go | 30 +++++++++++++++++++ framework/h/extensions_test.go | 22 ++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 framework/h/extensions_test.go diff --git a/framework/datastructure/orderedmap/orderedmap_test.go b/framework/datastructure/orderedmap/orderedmap_test.go index e30bc9a..c4dca24 100644 --- a/framework/datastructure/orderedmap/orderedmap_test.go +++ b/framework/datastructure/orderedmap/orderedmap_test.go @@ -31,3 +31,33 @@ func TestOrderedMap(t *testing.T) { assert.False(t, ok) assert.Equal(t, 0, value) } + +func TestOrderedMapEach(t *testing.T) { + t.Parallel() + om := New[string, int]() + om.Set("one", 1) + om.Set("two", 2) + om.Set("three", 3) + + expected := map[string]int{"one": 1, "two": 2, "three": 3} + actual := make(map[string]int) + + om.Each(func(key string, value int) { + actual[key] = value + }) + + assert.Equal(t, expected, actual) +} + +func TestOrderedMapValues(t *testing.T) { + t.Parallel() + om := New[string, int]() + om.Set("first", 10) + om.Set("second", 20) + om.Set("third", 30) + + values := om.Values() + expectedValues := []int{10, 20, 30} + + assert.Equal(t, expectedValues, values) +} diff --git a/framework/h/extensions_test.go b/framework/h/extensions_test.go new file mode 100644 index 0000000..0458c66 --- /dev/null +++ b/framework/h/extensions_test.go @@ -0,0 +1,22 @@ +package h + +import ( + "os" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestBaseExtensions(t *testing.T) { + // Test when not in development + os.Unsetenv("ENV") + result := BaseExtensions() + expected := "path-deps, response-targets, mutation-error, htmgo, sse" + assert.Equal(t, expected, result) + + // Test when in development + os.Setenv("ENV", "development") + result = BaseExtensions() + expected = "path-deps, response-targets, mutation-error, htmgo, sse, livereload" + assert.Equal(t, expected, result) +} From 479df08d6334ab090333466a84c3524af4bcd7ce Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 31 Oct 2024 16:44:28 +0000 Subject: [PATCH 119/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index 8f3c046..d280f1b 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf + github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 9e64a1d..c1f74b9 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 10026ee..aa2917c 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf + github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 59cc9c9..6f0360b 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index e4215d0..f568af8 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf + github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index f6196d3..ed76fa9 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index 8ff4d45..ca86f69 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf + github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index a3b88e3..bfdc30a 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 002f264..004dfa9 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 2b7f329..83ab9a1 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index bd25878..7f220be 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031163701-e268a581cedf + github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031164328-0a4bcfa7a3f6 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index ffab331..9b69f83 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031163701-e268a581cedf h1:HZ8a144LGdR1ESCtVoyDtr7QRgg0GSca2KFbwVjHPVw= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031163701-e268a581cedf/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031164328-0a4bcfa7a3f6 h1:KlRCLVbH/oijvAC+gSx9ApgV/n5X2Uyki7d1Eyyprn8= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031164328-0a4bcfa7a3f6/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index 1ac9fad..d2b2b2f 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 2b7f329..83ab9a1 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf h1:aF4P6xzQCJdox1Mm3DiX7lPuvVr5t1FR1W6zNIJ6Z7U= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031163701-e268a581cedf/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From 2d6ab078be87edd30e871215a567c98dabb9b290 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 11:59:19 -0500 Subject: [PATCH 120/137] swap tests --- framework/h/base_test.go | 141 +++++++++++++++++++++++++++++++++++++++ framework/h/xhr_test.go | 92 +++++++++++++++++++++++++ 2 files changed, 233 insertions(+) create mode 100644 framework/h/base_test.go create mode 100644 framework/h/xhr_test.go diff --git a/framework/h/base_test.go b/framework/h/base_test.go new file mode 100644 index 0000000..48540a3 --- /dev/null +++ b/framework/h/base_test.go @@ -0,0 +1,141 @@ +package h + +import ( + "github.com/maddalax/htmgo/framework/hx" + "net/http" + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestNewPage(t *testing.T) { + root := Div() + page := NewPage(root) + + assert.Equal(t, http.MethodGet, page.HttpMethod) + assert.Equal(t, root, page.Root) +} + +func TestEmptyPage(t *testing.T) { + page := EmptyPage() + + assert.Equal(t, http.MethodGet, page.HttpMethod) + assert.Equal(t, Empty(), page.Root) +} + +func TestNewPageWithHttpMethod(t *testing.T) { + root := Div() + page := NewPageWithHttpMethod(http.MethodPost, root) + + assert.Equal(t, http.MethodPost, page.HttpMethod) + assert.Equal(t, root, page.Root) +} + +func TestNewPartial(t *testing.T) { + root := Div() + partial := NewPartial(root) + + assert.Nil(t, partial.Headers) + assert.Equal(t, root, partial.Root) +} + +func TestNewPartialWithHeaders(t *testing.T) { + root := Div() + headers := NewHeaders("Content-Type", "application/json") + partial := NewPartialWithHeaders(headers, root) + + assert.Equal(t, headers, partial.Headers) + assert.Equal(t, root, partial.Root) +} + +func TestSwapManyPartialWithHeaders(t *testing.T) { + ctx := &RequestContext{isHxRequest: true} + headers := NewHeaders("HX-Trigger", "reload") + elements := []*Element{Div(), Span()} + + partial := SwapManyPartialWithHeaders(ctx, headers, elements...) + + assert.Equal(t, headers, partial.Headers) + assert.Equal(t, SwapMany(ctx, elements...), partial.Root) +} + +func TestRedirectPartial(t *testing.T) { + partial := RedirectPartial("/new-path") + headers := NewHeaders("HX-Redirect", "/new-path") + + assert.Equal(t, headers, partial.Headers) + assert.Equal(t, Empty(), partial.Root) +} + +func TestRedirectPartialWithHeaders(t *testing.T) { + extraHeaders := NewHeaders("X-Custom", "value") + partial := RedirectPartialWithHeaders("/redirect-path", extraHeaders) + + expectedHeaders := NewHeaders("HX-Redirect", "/redirect-path", "X-Custom", "value") + assert.Equal(t, expectedHeaders, partial.Headers) + assert.Equal(t, Empty(), partial.Root) +} + +func TestIsEmptyPartial(t *testing.T) { + emptyPartial := EmptyPartial() + nonEmptyPartial := NewPartial(Div()) + + assert.True(t, IsEmptyPartial(emptyPartial)) + assert.False(t, IsEmptyPartial(nonEmptyPartial)) +} + +func TestGetPartialPath(t *testing.T) { + partial := func(ctx *RequestContext) *Partial { + return &Partial{} + } + path := GetPartialPath(partial) + + expectedSegment := "github.com/maddalax/htmgo/framework/h.TestGetPartialPath.func1" + assert.Contains(t, path, expectedSegment) +} + +func TestGetPartialPathWithQs(t *testing.T) { + partial := func(ctx *RequestContext) *Partial { + return &Partial{} + } + qs := NewQs("param1", "value1", "param2", "value2") + pathWithQs := GetPartialPathWithQs(partial, qs) + + assert.Contains(t, pathWithQs, "param1=value1¶m2=value2") +} + +func TestSwapManyPartial(t *testing.T) { + ctx := &RequestContext{isHxRequest: true} + element1 := Div() + element2 := Span() + + partial := SwapManyPartial(ctx, element1, element2) + + // Ensuring the elements have been marked for swap + assert.Equal(t, 1, len(element1.children)) + assert.Equal(t, 1, len(element2.children)) + + assert.Equal(t, Attribute(hx.SwapOobAttr, hx.SwapTypeTrue), element1.children[0]) + assert.Equal(t, Attribute(hx.SwapOobAttr, hx.SwapTypeTrue), element2.children[0]) + + // Test with non-HX request context + ctx.isHxRequest = false + partial = SwapManyPartial(ctx, element1, element2) + assert.True(t, IsEmptyPartial(partial)) +} + +func TestSwapPartial(t *testing.T) { + ctx := &RequestContext{isHxRequest: true} + element := Div() + + partial := SwapPartial(ctx, element) + + // Ensuring the element has been marked for swap + assert.Equal(t, 1, len(element.children)) + assert.Equal(t, Attribute(hx.SwapOobAttr, hx.SwapTypeTrue), element.children[0]) + + // Test with non-HX request context + ctx.isHxRequest = false + partial = SwapPartial(ctx, element) + assert.True(t, IsEmptyPartial(partial)) +} diff --git a/framework/h/xhr_test.go b/framework/h/xhr_test.go new file mode 100644 index 0000000..2153a07 --- /dev/null +++ b/framework/h/xhr_test.go @@ -0,0 +1,92 @@ +package h + +import ( + "github.com/stretchr/testify/assert" + "testing" +) + +func TestGet(t *testing.T) { + attr := Div(Get("/path", "load")) + assert.Equal(t, `
    `, Render(attr)) +} + +func TestGetPartial(t *testing.T) { + partial := func(ctx *RequestContext) *Partial { + return &Partial{} + } + attr := Div(GetPartial(partial, "load")) + expected := Render(Div(Get(GetPartialPath(partial), "load"))) + assert.Equal(t, expected, Render(attr)) +} + +func TestGetPartialWithQs(t *testing.T) { + partial := func(ctx *RequestContext) *Partial { + return &Partial{} + } + qs := NewQs("param", "value") + attr := Div(GetPartialWithQs(partial, qs, "load")) + expectedPath := Render(Div(Get(GetPartialPathWithQs(partial, qs), "load"))) + assert.Equal(t, expectedPath, Render(attr)) +} + +func TestPost(t *testing.T) { + attr := Div(Post("/path", "submit")) + assert.Equal(t, `
    `, Render(attr)) +} + +func TestPostOnClick(t *testing.T) { + attr := Div(PostOnClick("/path")) + assert.Equal(t, `
    `, Render(attr)) +} + +func TestPostPartialOnClick(t *testing.T) { + partial := func(ctx *RequestContext) *Partial { + return &Partial{} + } + attr := Div(PostPartialOnClick(partial)) + expected := Render(Div(PostOnClick(GetPartialPath(partial)))) + assert.Equal(t, expected, Render(attr)) +} + +func TestPostPartialWithQs(t *testing.T) { + partial := func(ctx *RequestContext) *Partial { + return &Partial{} + } + qs := NewQs("key", "value") + attr := Div(PostPartialWithQs(partial, qs, "click")) + expected := Render(Div(Post(GetPartialPathWithQs(partial, qs), "click"))) + assert.Equal(t, expected, Render(attr)) +} + +func TestPostPartialOnClickQs(t *testing.T) { + partial := func(ctx *RequestContext) *Partial { + return &Partial{} + } + qs := NewQs("key", "value") + attr := Div(PostPartialOnClickQs(partial, qs)) + expected := Render(Div(PostOnClick(GetPartialPathWithQs(partial, qs)))) + assert.Equal(t, expected, Render(attr)) +} + +func TestGetWithQs(t *testing.T) { + qs := NewQs("param1", "value1", "param2", "value2") + attr := Div(GetWithQs("/path", qs, "load")) + expected := `
    ` + assert.Equal(t, expected, Render(attr)) +} + +func TestPostWithQs(t *testing.T) { + qs := NewQs("param1", "value1", "param2", "value2") + attr := Div(PostWithQs("/path", qs, "submit")) + expected := `
    ` + assert.Equal(t, expected, Render(attr)) +} + +func TestPostPartial(t *testing.T) { + partial := func(ctx *RequestContext) *Partial { + return &Partial{} + } + attr := Div(PostPartial(partial, "submit")) + expected := Render(Div(Post(GetPartialPath(partial), "submit"))) + assert.Equal(t, expected, Render(attr)) +} From 64f201f4a3e192feac4cc6d0f0c3130e0733f2fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 31 Oct 2024 17:00:12 +0000 Subject: [PATCH 121/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 4 ++-- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 2 +- templates/starter/go.sum | 4 ++-- 14 files changed, 24 insertions(+), 24 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index d280f1b..cffdd76 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 + github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index c1f74b9..868a26b 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index aa2917c..54a63a0 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 + github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 6f0360b..67982ab 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index f568af8..a0864fe 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 + github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index ed76fa9..0355780 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index ca86f69..b148bef 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 + github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index bfdc30a..24f7b4a 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 004dfa9..730a967 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 83ab9a1..21a2060 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index 7f220be..d3b41a8 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -5,8 +5,8 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031164328-0a4bcfa7a3f6 + github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031165923-032159149c63 github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index 9b69f83..f332a08 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031164328-0a4bcfa7a3f6 h1:KlRCLVbH/oijvAC+gSx9ApgV/n5X2Uyki7d1Eyyprn8= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031164328-0a4bcfa7a3f6/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031165923-032159149c63 h1:4VFSfty3NpK2DgOy8k9LoXrBpLA9D55d35q7iMD9nwE= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031165923-032159149c63/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index d2b2b2f..a77effb 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,7 +2,7 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 83ab9a1..21a2060 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6 h1:pUrP3pAcaZgeHcRnR/eKoDFJjrxPO3rd8nzHndsbp9I= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031164328-0a4bcfa7a3f6/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= +github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= From f25c6bd8f5eb45497bdb82abf94d565e87b3e4bf Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 13:36:09 -0500 Subject: [PATCH 122/137] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 4a29de4..02ca4aa 100644 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ ![Build](https://github.com/maddalax/htmgo/actions/workflows/run-framework-tests.yml/badge.svg) [![Go Reference](https://pkg.go.dev/badge/github.com/maddalax/htmgo/framework@v1.0.2/h.svg)](https://htmgo.dev/docs) [![codecov](https://codecov.io/github/maddalax/htmgo/graph/badge.svg?token=ANPD11LSGN)](https://codecov.io/github/maddalax/htmgo) +[![Join Discord](https://img.shields.io/badge/Join%20Discord-gray?style=flat&logo=discord&logoColor=white&link=https://discord.gg/nwQY4h6DtJ)](https://discord.gg/nwQY4h6DtJ) looking for a python version? check out: https://fastht.ml From e27cda57796bf9beeefe1f6cf38227d8f83f247d Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 13:40:43 -0500 Subject: [PATCH 123/137] add discord route --- htmgo-site/pages/discord.go | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 htmgo-site/pages/discord.go diff --git a/htmgo-site/pages/discord.go b/htmgo-site/pages/discord.go new file mode 100644 index 0000000..0fc1985 --- /dev/null +++ b/htmgo-site/pages/discord.go @@ -0,0 +1,8 @@ +package pages + +import "github.com/maddalax/htmgo/framework/h" + +func DiscordPage(ctx *h.RequestContext) *h.Page { + ctx.Redirect("https://discord.com/invite/nwQY4h6DtJ", 302) + return h.EmptyPage() +} From f952d6ed3e26f134fc7af8359425dd5393c3c672 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 13:41:13 -0500 Subject: [PATCH 124/137] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 02ca4aa..14f224f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,7 @@ ![Build](https://github.com/maddalax/htmgo/actions/workflows/run-framework-tests.yml/badge.svg) [![Go Reference](https://pkg.go.dev/badge/github.com/maddalax/htmgo/framework@v1.0.2/h.svg)](https://htmgo.dev/docs) [![codecov](https://codecov.io/github/maddalax/htmgo/graph/badge.svg?token=ANPD11LSGN)](https://codecov.io/github/maddalax/htmgo) -[![Join Discord](https://img.shields.io/badge/Join%20Discord-gray?style=flat&logo=discord&logoColor=white&link=https://discord.gg/nwQY4h6DtJ)](https://discord.gg/nwQY4h6DtJ) +[![Join Discord](https://img.shields.io/badge/Join%20Discord-gray?style=flat&logo=discord&logoColor=white&link=https://htmgo.dev/discord)](https://htmgo.dev/discord) looking for a python version? check out: https://fastht.ml From 06792019f838f1a330707852badee2f2dd598da7 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 13:55:27 -0500 Subject: [PATCH 125/137] add discord link --- htmgo-site/partials/navbar.go | 49 ++++++++++++++++++++++++++++++++--- 1 file changed, 46 insertions(+), 3 deletions(-) diff --git a/htmgo-site/partials/navbar.go b/htmgo-site/partials/navbar.go index 9c7daa7..2e29625 100644 --- a/htmgo-site/partials/navbar.go +++ b/htmgo-site/partials/navbar.go @@ -102,14 +102,57 @@ func Star(ctx *h.RequestContext) *h.Element { ) } +func DiscordSvg() *h.Element { + return h.Svg( + h.Attribute("viewBox", "0 -28.5 256 256"), + h.Attribute("xmlns", "http://www.w3.org/2000/svg"), + h.Attribute("preserveaspectratio", "xMidYMid"), + h.Attribute("fill", "#000000"), + h.Tag( + "g", + h.Id("SVGRepo_bgCarrier"), + h.Attribute("stroke-width", "0"), + ), + h.Tag( + "g", + h.Id("SVGRepo_tracerCarrier"), + h.Attribute("stroke-linecap", "round"), + h.Attribute("stroke-linejoin", "round"), + ), + h.Tag( + "g", + h.Id("SVGRepo_iconCarrier"), + h.Tag( + "g", + h.Path( + h.Attribute("d", "M216.856339,16.5966031 C200.285002,8.84328665 182.566144,3.2084988 164.041564,0 C161.766523,4.11318106 159.108624,9.64549908 157.276099,14.0464379 C137.583995,11.0849896 118.072967,11.0849896 98.7430163,14.0464379 C96.9108417,9.64549908 94.1925838,4.11318106 91.8971895,0 C73.3526068,3.2084988 55.6133949,8.86399117 39.0420583,16.6376612 C5.61752293,67.146514 -3.4433191,116.400813 1.08711069,164.955721 C23.2560196,181.510915 44.7403634,191.567697 65.8621325,198.148576 C71.0772151,190.971126 75.7283628,183.341335 79.7352139,175.300261 C72.104019,172.400575 64.7949724,168.822202 57.8887866,164.667963 C59.7209612,163.310589 61.5131304,161.891452 63.2445898,160.431257 C105.36741,180.133187 151.134928,180.133187 192.754523,160.431257 C194.506336,161.891452 196.298154,163.310589 198.110326,164.667963 C191.183787,168.842556 183.854737,172.420929 176.223542,175.320965 C180.230393,183.341335 184.861538,190.991831 190.096624,198.16893 C211.238746,191.588051 232.743023,181.531619 254.911949,164.955721 C260.227747,108.668201 245.831087,59.8662432 216.856339,16.5966031 Z M85.4738752,135.09489 C72.8290281,135.09489 62.4592217,123.290155 62.4592217,108.914901 C62.4592217,94.5396472 72.607595,82.7145587 85.4738752,82.7145587 C98.3405064,82.7145587 108.709962,94.5189427 108.488529,108.914901 C108.508531,123.290155 98.3405064,135.09489 85.4738752,135.09489 Z M170.525237,135.09489 C157.88039,135.09489 147.510584,123.290155 147.510584,108.914901 C147.510584,94.5396472 157.658606,82.7145587 170.525237,82.7145587 C183.391518,82.7145587 193.761324,94.5189427 193.539891,108.914901 C193.539891,123.290155 183.391518,135.09489 170.525237,135.09489 Z"), + h.Attribute("fill", "#000000"), + h.Attribute("fill-rule", "nonzero"), + ), + ), + ), + ) +} + func NavBar(ctx *h.RequestContext, props NavBarProps) *h.Element { banner := h.If( true, h.A( - h.Class("bg-blue-200 text-slate-700 text-center p-2 flex items-center justify-center"), - h.Href("https://github.com/maddalax/htmgo/releases/tag/framework%2Fv1.0.1"), + h.Href("/discord"), h.Attribute("target", "_blank"), - h.Text("htmgo v1.0.1 is released and it includes a new automatic formatter, view release notes"), + h.Class("bg-blue-200 text-slate-700 text-center p-2 flex items-center justify-center gap-2"), + h.Div( + h.Class("w-[30px] h-[30px]"), + DiscordSvg(), + ), + h.P( + h.Text("Join the "), + h.Span( + h.Text("discord server"), + h.Class("underline"), + ), + h.Text(" for support and the latest news."), + ), ), ) desktopNav := h.Nav( From e067a17f530f7edfb2ffcbb6358659e5cafa9c6e Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 18:10:11 -0500 Subject: [PATCH 126/137] add more urls to sitemap --- htmgo-site/internal/sitemap/generate.go | 25 +++++++++++++++++++++++-- htmgo-site/main.go | 2 +- 2 files changed, 24 insertions(+), 3 deletions(-) diff --git a/htmgo-site/internal/sitemap/generate.go b/htmgo-site/internal/sitemap/generate.go index 8a52fd6..a3281e3 100644 --- a/htmgo-site/internal/sitemap/generate.go +++ b/htmgo-site/internal/sitemap/generate.go @@ -4,6 +4,8 @@ import ( "bytes" "encoding/xml" "fmt" + "github.com/go-chi/chi/v5" + "strings" ) type URL struct { @@ -35,8 +37,8 @@ func serialize(sitemap *URLSet) ([]byte, error) { return buffer.Bytes(), nil } -func Generate() ([]byte, error) { - +func Generate(router *chi.Mux) ([]byte, error) { + routes := router.Routes() urls := []URL{ { Loc: "/", @@ -59,6 +61,25 @@ func Generate() ([]byte, error) { ChangeFreq: "weekly", }, } + + for _, route := range routes { + if strings.HasPrefix(route.Pattern, "/docs/") { + urls = append(urls, URL{ + Loc: route.Pattern, + Priority: 1.0, + ChangeFreq: "weekly", + }) + } + + if strings.HasPrefix(route.Pattern, "/examples/") { + urls = append(urls, URL{ + Loc: route.Pattern, + Priority: 0.7, + ChangeFreq: "weekly", + }) + } + } + sitemap := NewSitemap(urls) return serialize(sitemap) } diff --git a/htmgo-site/main.go b/htmgo-site/main.go index 2ee2dc7..4bafd98 100644 --- a/htmgo-site/main.go +++ b/htmgo-site/main.go @@ -37,7 +37,7 @@ func main() { http.FileServerFS(sub) app.Router.Handle("/sitemap.xml", http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - s, err := sitemap.Generate() + s, err := sitemap.Generate(app.Router) if err != nil { http.Error(w, "failed to generate sitemap", http.StatusInternalServerError) return From b75dadf00e0a9e25c1c2f31f94fa3b4aa00addc0 Mon Sep 17 00:00:00 2001 From: maddalax Date: Thu, 31 Oct 2024 18:19:32 -0500 Subject: [PATCH 127/137] add prefix --- htmgo-site/internal/sitemap/generate.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/htmgo-site/internal/sitemap/generate.go b/htmgo-site/internal/sitemap/generate.go index a3281e3..802c4d8 100644 --- a/htmgo-site/internal/sitemap/generate.go +++ b/htmgo-site/internal/sitemap/generate.go @@ -80,6 +80,10 @@ func Generate(router *chi.Mux) ([]byte, error) { } } + for i, url := range urls { + urls[i].Loc = fmt.Sprintf("%s%s", "https://htmgo.dev", url.Loc) + } + sitemap := NewSitemap(urls) return serialize(sitemap) } From 4c6187e18d535d6c7cb6b002d31a47d8935bd537 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 1 Nov 2024 05:08:36 -0500 Subject: [PATCH 128/137] add docs for eval commands --- .../pages/docs/interactivity/eval-commands.go | 83 +++++++++++++++++++ htmgo-site/pages/docs/interactivity/events.go | 2 +- .../docs/performance/caching-globally.go | 2 +- htmgo-site/pages/docs/sidebar.go | 1 + 4 files changed, 86 insertions(+), 2 deletions(-) create mode 100644 htmgo-site/pages/docs/interactivity/eval-commands.go diff --git a/htmgo-site/pages/docs/interactivity/eval-commands.go b/htmgo-site/pages/docs/interactivity/eval-commands.go new file mode 100644 index 0000000..12fecd2 --- /dev/null +++ b/htmgo-site/pages/docs/interactivity/eval-commands.go @@ -0,0 +1,83 @@ +package interactivity + +import ( + "github.com/maddalax/htmgo/framework/h" + "htmgo-site/ui" +) + +import . "htmgo-site/pages/docs" + +func EvalCommands(ctx *h.RequestContext) *h.Page { + return DocPage( + ctx, + h.Div( + h.Class("flex flex-col gap-3"), + Title("Eval Commands"), + Text(` + Now that we've learned how about events/commands, I want to highlight a few useful commands. + One in particular is EvalCommands, which allows you to evaluate any command against any element just by referencing it in Go. + `), + SubTitle("Referencing an element directly"), + Text("Example: Setting the text of an element on click of another element"), + ui.GoCodeSnippet(EvalCommandsSnippet), + Text( + `We are calling js.EvalCommands with the text variable and the command to toggle the text of the element. + This always you to run any commands against any element, without having to query for it via a selector. + `, + ), + h.P( + h.A( + h.Class("underline text-blue-500"), + h.Href("/examples/js-hide-children-on-click"), + h.Text("View the demo"), + ), + h.Text(" for more details on what this could be used for."), + ), + h.Div( + h.Class("mt-4"), + ), + SubTitle("Using a selector"), + Text("If needed, you can query by selector"), + ui.GoCodeSnippet(EvalCommandsSnippetWithSelector), + NextStep( + "mt-4", + PrevBlock("Events / Commands", DocPath("/interactivity/events")), + NextBlock("Caching Components", DocPath("/performance/caching-globally")), + ), + ), + ) +} + +const EvalCommandsSnippetWithSelector = ` +func MyComponent(ctx *h.RequestContext) *h.Element { + text := h.Pf("Text Before", h.Id("my-element")) + return h.Div( + h.Button( + h.Text("Toggle Text"), + h.OnClick( + js.EvalCommandsOnSelector( + "#my-element", + js.ToggleText("Text Before", "Text After"), + ), + ), + ), + text, + ) +} +` + +var EvalCommandsSnippet = `func MyComponent(ctx *h.RequestContext) *h.Element { + text := h.Pf("Text Before") + return h.Div( + h.Button( + h.Text("Toggle Text"), + h.OnClick( + js.EvalCommands( + text, + js.ToggleText("Text Before", "Text After"), + ), + ), + ), + text, + ) +}` diff --git a/htmgo-site/pages/docs/interactivity/events.go b/htmgo-site/pages/docs/interactivity/events.go index c014a9c..2fc5906 100644 --- a/htmgo-site/pages/docs/interactivity/events.go +++ b/htmgo-site/pages/docs/interactivity/events.go @@ -61,7 +61,7 @@ func EventsAndCommands(ctx *h.RequestContext) *h.Page { NextStep( "mt-4", PrevBlock("Swapping", DocPath("/interactivity/swapping")), - NextBlock("Caching Components", DocPath("/performance/caching-globally")), + NextBlock("Eval Commands", DocPath("/interactivity/eval-commands")), ), ), ) diff --git a/htmgo-site/pages/docs/performance/caching-globally.go b/htmgo-site/pages/docs/performance/caching-globally.go index 6c3aa35..c136d2f 100644 --- a/htmgo-site/pages/docs/performance/caching-globally.go +++ b/htmgo-site/pages/docs/performance/caching-globally.go @@ -42,7 +42,7 @@ func CachingGlobally(ctx *h.RequestContext) *h.Page { `), NextStep( "mt-4", - PrevBlock("Events", DocPath("/interactivity/events")), + PrevBlock("Eval Commands", DocPath("/interactivity/eval-commands")), NextBlock("Caching Per Key", DocPath("/performance/caching-per-key")), ), ), diff --git a/htmgo-site/pages/docs/sidebar.go b/htmgo-site/pages/docs/sidebar.go index c9cde3f..8a524ab 100644 --- a/htmgo-site/pages/docs/sidebar.go +++ b/htmgo-site/pages/docs/sidebar.go @@ -50,6 +50,7 @@ var sections = []Section{ {Title: "Swapping", Path: DocPath("/interactivity/swapping")}, {Title: "Events", Path: DocPath("/interactivity/events")}, {Title: "Evaluating Javascript", Path: DocPath("/interactivity/events")}, + {Title: "Eval Commands", Path: DocPath("/interactivity/eval-commands")}, }, }, { From 2c4ac8b2866d53828ddb8b8a2f22e47271b1a7f4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 1 Nov 2024 06:10:35 -0500 Subject: [PATCH 129/137] gen code for assets (#68) * gen code for assets * fix * test --- cli/htmgo/tasks/astgen/entry.go | 86 +++++++++++++++++++ framework/config/project.go | 15 ++++ framework/config/project_test.go | 15 ++++ htmgo-site/pages/base/root.go | 9 +- .../pages/docs/htmx-extensions/overview.go | 17 ---- templates/starter/htmgo.yml | 3 + templates/starter/main.go | 8 +- templates/starter/pages/root.go | 9 +- 8 files changed, 136 insertions(+), 26 deletions(-) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index 6c45551..bc385a3 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -9,10 +9,12 @@ import ( "go/parser" "go/token" "golang.org/x/mod/modfile" + "io/fs" "os" "path/filepath" "slices" "strings" + "unicode" ) type Page struct { @@ -37,6 +39,32 @@ const ModuleName = "github.com/maddalax/htmgo/framework/h" var PackageName = fmt.Sprintf("package %s", GeneratedDirName) var GeneratedFileLine = fmt.Sprintf("// Package %s THIS FILE IS GENERATED. DO NOT EDIT.", GeneratedDirName) +func toPascaleCase(input string) string { + words := strings.Split(input, "_") + for i := range words { + words[i] = strings.Title(strings.ToLower(words[i])) + } + return strings.Join(words, "") +} + +func isValidGoVariableName(name string) bool { + // Variable name must not be empty + if name == "" { + return false + } + // First character must be a letter or underscore + if !unicode.IsLetter(rune(name[0])) && name[0] != '_' { + return false + } + // Remaining characters must be letters, digits, or underscores + for _, char := range name[1:] { + if !unicode.IsLetter(char) && !unicode.IsDigit(char) && char != '_' { + return false + } + } + return true +} + func normalizePath(path string) string { return strings.ReplaceAll(path, `\`, "/") } @@ -390,6 +418,63 @@ func writePagesFile() { }) } +func writeAssetsFile() { + cwd := process.GetWorkingDir() + config := dirutil.GetConfig() + distAssets := filepath.Join(cwd, "assets", "dist") + hasAssets := false + + builder := strings.Builder{} + + builder.WriteString(`package assets`) + builder.WriteString("\n") + + filepath.WalkDir(distAssets, func(path string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + + if d.IsDir() { + return nil + } + + if strings.HasPrefix(d.Name(), ".") { + return nil + } + + path = strings.ReplaceAll(path, distAssets, "") + httpUrl := fmt.Sprintf("%s%s", config.PublicAssetPath, path) + + path = normalizePath(path) + path = strings.ReplaceAll(path, "/", "_") + path = strings.ReplaceAll(path, "//", "_") + + name := strings.ReplaceAll(path, ".", "_") + name = strings.ReplaceAll(name, "-", "_") + + name = toPascaleCase(name) + + if isValidGoVariableName(name) { + builder.WriteString(fmt.Sprintf(`const %s = "%s"`, name, httpUrl)) + builder.WriteString("\n") + hasAssets = true + } + + return nil + }) + + builder.WriteString("\n") + + str := builder.String() + + if hasAssets { + WriteFile(filepath.Join(GeneratedDirName, "assets", "assets-generated.go"), func(content *ast.File) string { + return str + }) + } + +} + func GetModuleName() string { wd := process.GetWorkingDir() modPath := filepath.Join(wd, "go.mod") @@ -411,6 +496,7 @@ func GenAst(flags ...process.RunFlag) error { } writePartialsFile() writePagesFile() + writeAssetsFile() WriteFile("__htmgo/setup-generated.go", func(content *ast.File) string { diff --git a/framework/config/project.go b/framework/config/project.go index 33f6cfc..659d364 100644 --- a/framework/config/project.go +++ b/framework/config/project.go @@ -14,6 +14,7 @@ type ProjectConfig struct { WatchFiles []string `yaml:"watch_files"` AutomaticPageRoutingIgnore []string `yaml:"automatic_page_routing_ignore"` AutomaticPartialRoutingIgnore []string `yaml:"automatic_partial_routing_ignore"` + PublicAssetPath string `yaml:"public_asset_path"` } func DefaultProjectConfig() *ProjectConfig { @@ -25,6 +26,7 @@ func DefaultProjectConfig() *ProjectConfig { WatchFiles: []string{ "**/*.go", "**/*.html", "**/*.css", "**/*.js", "**/*.json", "**/*.yaml", "**/*.yml", "**/*.md", }, + PublicAssetPath: "/public", } } @@ -57,9 +59,22 @@ func (cfg *ProjectConfig) Enhance() *ProjectConfig { } } + if cfg.PublicAssetPath == "" { + cfg.PublicAssetPath = "/public" + } + return cfg } +func Get() *ProjectConfig { + cwd, err := os.Getwd() + if err != nil { + return DefaultProjectConfig() + } + config := FromConfigFile(cwd) + return config +} + func FromConfigFile(workingDir string) *ProjectConfig { defaultCfg := DefaultProjectConfig() names := []string{"htmgo.yaml", "htmgo.yml", "_htmgo.yaml", "_htmgo.yml"} diff --git a/framework/config/project_test.go b/framework/config/project_test.go index bb492a0..89288ae 100644 --- a/framework/config/project_test.go +++ b/framework/config/project_test.go @@ -73,6 +73,21 @@ func TestShouldPrefixAutomaticPartialRoutingIgnore_1(t *testing.T) { assert.Equal(t, []string{"partials/somefile/*"}, cfg.AutomaticPartialRoutingIgnore) } +func TestPublicAssetPath(t *testing.T) { + t.Parallel() + cfg := DefaultProjectConfig() + assert.Equal(t, "/public", cfg.PublicAssetPath) + + cfg.PublicAssetPath = "/assets" + assert.Equal(t, "/assets", cfg.PublicAssetPath) +} + +func TestConfigGet(t *testing.T) { + t.Parallel() + cfg := Get() + assert.Equal(t, "/public", cfg.PublicAssetPath) +} + func writeConfigFile(t *testing.T, content string) string { temp := os.TempDir() os.Mkdir(temp, 0755) diff --git a/htmgo-site/pages/base/root.go b/htmgo-site/pages/base/root.go index 84e2c93..03e546f 100644 --- a/htmgo-site/pages/base/root.go +++ b/htmgo-site/pages/base/root.go @@ -3,6 +3,7 @@ package base import ( "github.com/google/uuid" "github.com/maddalax/htmgo/framework/h" + "htmgo-site/__htmgo/assets" "htmgo-site/partials" ) @@ -43,8 +44,8 @@ func ConfigurableRootPage(ctx *h.RequestContext, props RootPageProps) *h.Page { h.Title( h.Text(title), ), - h.Link("/public/favicon.ico", "icon"), - h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Link(assets.FaviconIco, "icon"), + h.Link(assets.AppleTouchIconPng, "apple-touch-icon"), h.Meta("charset", "utf-8"), h.Meta("author", "htmgo"), h.Meta("description", description), @@ -53,8 +54,8 @@ func ConfigurableRootPage(ctx *h.RequestContext, props RootPageProps) *h.Page { h.Link("canonical", canonical), h.Link("https://cdn.jsdelivr.net/npm/@docsearch/css@3", "stylesheet"), h.Meta("og:description", description), - h.LinkWithVersion("/public/main.css", "stylesheet", Version), - h.ScriptWithVersion("/public/htmgo.js", Version), + h.LinkWithVersion(assets.MainCss, "stylesheet", Version), + h.ScriptWithVersion(assets.HtmgoJs, Version), h.Style(` html { scroll-behavior: smooth; diff --git a/htmgo-site/pages/docs/htmx-extensions/overview.go b/htmgo-site/pages/docs/htmx-extensions/overview.go index 56c59d2..46c83b7 100644 --- a/htmgo-site/pages/docs/htmx-extensions/overview.go +++ b/htmgo-site/pages/docs/htmx-extensions/overview.go @@ -61,20 +61,3 @@ h.JoinExtensions( h.HxExtension("my-extension"), ) ` - -const htmxExtensions = ` -h.HxOnLoad -h.HxOnAfterSwap -h.OnClick -h.OnSubmit -h.HxBeforeSseMessage -h.HxAfterSseMessage -h.OnClick -h.OnSubmit -h.HxOnSseError -h.HxOnSseClose -h.HxOnSseConnecting -h.HxOnSseOpen -h.HxAfterRequest -h.HxOnMutationError -` diff --git a/templates/starter/htmgo.yml b/templates/starter/htmgo.yml index 7647094..3074bbe 100644 --- a/templates/starter/htmgo.yml +++ b/templates/starter/htmgo.yml @@ -16,3 +16,6 @@ automatic_page_routing_ignore: ["root.go"] # files or directories to ignore when automatically registering routes for partials # supports glob patterns through https://github.com/bmatcuk/doublestar automatic_partial_routing_ignore: [] + +# url path of where the public assets are located +public_asset_path: "/public" diff --git a/templates/starter/main.go b/templates/starter/main.go index bab347c..a33919b 100644 --- a/templates/starter/main.go +++ b/templates/starter/main.go @@ -1,6 +1,8 @@ package main import ( + "fmt" + "github.com/maddalax/htmgo/framework/config" "github.com/maddalax/htmgo/framework/h" "github.com/maddalax/htmgo/framework/service" "io/fs" @@ -10,6 +12,7 @@ import ( func main() { locator := service.NewLocator() + cfg := config.Get() h.Start(h.AppOpts{ ServiceLocator: locator, @@ -23,7 +26,10 @@ func main() { http.FileServerFS(sub) - app.Router.Handle("/public/*", http.StripPrefix("/public", http.FileServerFS(sub))) + // change this in htmgo.yml (public_asset_path) + app.Router.Handle(fmt.Sprintf("%s/*", cfg.PublicAssetPath), + http.StripPrefix(cfg.PublicAssetPath, http.FileServerFS(sub))) + __htmgo.Register(app.Router) }, }) diff --git a/templates/starter/pages/root.go b/templates/starter/pages/root.go index c228349..e6e5a0f 100644 --- a/templates/starter/pages/root.go +++ b/templates/starter/pages/root.go @@ -2,6 +2,7 @@ package pages import ( "github.com/maddalax/htmgo/framework/h" + "starter-template/__htmgo/assets" ) func RootPage(children ...h.Ren) *h.Page { @@ -20,8 +21,8 @@ func RootPage(children ...h.Ren) *h.Page { h.Text(title), ), h.Meta("viewport", "width=device-width, initial-scale=1"), - h.Link("/public/favicon.ico", "icon"), - h.Link("/public/apple-touch-icon.png", "apple-touch-icon"), + h.Link(assets.FaviconIco, "icon"), + h.Link(assets.AppleTouchIconPng, "apple-touch-icon"), h.Meta("title", title), h.Meta("charset", "utf-8"), h.Meta("author", author), @@ -30,8 +31,8 @@ func RootPage(children ...h.Ren) *h.Page { h.Meta("og:url", url), h.Link("canonical", url), h.Meta("og:description", description), - h.Link("/public/main.css", "stylesheet"), - h.Script("/public/htmgo.js"), + h.Link(assets.MainCss, "stylesheet"), + h.Script(assets.HtmgoJs), ), h.Body( h.Div( From af0091c370ed401d99fe0b05630f3c672de7de7d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 1 Nov 2024 11:11:25 +0000 Subject: [PATCH 130/137] Auto-update HTMGO framework version --- examples/chat/go.mod | 2 +- examples/chat/go.sum | 4 ++-- examples/hackernews/go.mod | 2 +- examples/hackernews/go.sum | 4 ++-- examples/simple-auth/go.mod | 2 +- examples/simple-auth/go.sum | 4 ++-- examples/todo-list/go.mod | 2 +- examples/todo-list/go.sum | 4 ++-- framework-ui/go.mod | 2 +- framework-ui/go.sum | 4 ++-- htmgo-site/go.mod | 6 +++--- htmgo-site/go.sum | 8 ++++---- templates/starter/go.mod | 3 ++- templates/starter/go.sum | 6 ++++-- 14 files changed, 28 insertions(+), 25 deletions(-) diff --git a/examples/chat/go.mod b/examples/chat/go.mod index cffdd76..bd3dc37 100644 --- a/examples/chat/go.mod +++ b/examples/chat/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 + github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d github.com/mattn/go-sqlite3 v1.14.23 github.com/puzpuzpuz/xsync/v3 v3.4.0 ) diff --git a/examples/chat/go.sum b/examples/chat/go.sum index 868a26b..25eba4a 100644 --- a/examples/chat/go.sum +++ b/examples/chat/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d h1:xr5dOwDzFZgZlgL3MmggSS9p+VeC0JawNS6tWBI3XUM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/hackernews/go.mod b/examples/hackernews/go.mod index 54a63a0..8df09b7 100644 --- a/examples/hackernews/go.mod +++ b/examples/hackernews/go.mod @@ -3,7 +3,7 @@ module hackernews go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 + github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d github.com/microcosm-cc/bluemonday v1.0.27 ) diff --git a/examples/hackernews/go.sum b/examples/hackernews/go.sum index 67982ab..215e6ef 100644 --- a/examples/hackernews/go.sum +++ b/examples/hackernews/go.sum @@ -8,8 +8,8 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/gorilla/css v1.0.1 h1:ntNaBIghp6JmvWnxbZKANoLyuXTPZ4cAMlo6RyhlbO8= github.com/gorilla/css v1.0.1/go.mod h1:BvnYkspnSzMmwRK+b8/xgNPLiIuNZr6vbZBTPQ2A3b0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d h1:xr5dOwDzFZgZlgL3MmggSS9p+VeC0JawNS6tWBI3XUM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/microcosm-cc/bluemonday v1.0.27 h1:MpEUotklkwCSLeH+Qdx1VJgNqLlpY2KXwXFM08ygZfk= github.com/microcosm-cc/bluemonday v1.0.27/go.mod h1:jFi9vgW+H7c3V0lb6nR74Ib/DIB5OBs92Dimizgw2cA= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/simple-auth/go.mod b/examples/simple-auth/go.mod index a0864fe..b4e7c54 100644 --- a/examples/simple-auth/go.mod +++ b/examples/simple-auth/go.mod @@ -3,7 +3,7 @@ module simpleauth go 1.23.0 require ( - github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 + github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d github.com/mattn/go-sqlite3 v1.14.24 golang.org/x/crypto v0.28.0 ) diff --git a/examples/simple-auth/go.sum b/examples/simple-auth/go.sum index 0355780..1617650 100644 --- a/examples/simple-auth/go.sum +++ b/examples/simple-auth/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d h1:xr5dOwDzFZgZlgL3MmggSS9p+VeC0JawNS6tWBI3XUM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.24 h1:tpSp2G2KyMnnQu99ngJ47EIkWVmliIizyZBfPrBWDRM= github.com/mattn/go-sqlite3 v1.14.24/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= diff --git a/examples/todo-list/go.mod b/examples/todo-list/go.mod index b148bef..d6f2727 100644 --- a/examples/todo-list/go.mod +++ b/examples/todo-list/go.mod @@ -5,7 +5,7 @@ go 1.23.0 require ( entgo.io/ent v0.14.1 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 + github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d github.com/mattn/go-sqlite3 v1.14.23 ) diff --git a/examples/todo-list/go.sum b/examples/todo-list/go.sum index 24f7b4a..3bec236 100644 --- a/examples/todo-list/go.sum +++ b/examples/todo-list/go.sum @@ -33,8 +33,8 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d h1:xr5dOwDzFZgZlgL3MmggSS9p+VeC0JawNS6tWBI3XUM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/mattn/go-sqlite3 v1.14.23 h1:gbShiuAP1W5j9UOksQ06aiiqPMxYecovVGwmTxWtuw0= github.com/mattn/go-sqlite3 v1.14.23/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y= github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7 h1:DpOJ2HYzCv8LZP15IdmG+YdwD2luVPHITV96TkirNBM= diff --git a/framework-ui/go.mod b/framework-ui/go.mod index 730a967..2645bbc 100644 --- a/framework-ui/go.mod +++ b/framework-ui/go.mod @@ -2,7 +2,7 @@ module github.com/maddalax/htmgo/framework-ui go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect diff --git a/framework-ui/go.sum b/framework-ui/go.sum index 21a2060..210b60a 100644 --- a/framework-ui/go.sum +++ b/framework-ui/go.sum @@ -4,8 +4,8 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d h1:xr5dOwDzFZgZlgL3MmggSS9p+VeC0JawNS6tWBI3XUM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= diff --git a/htmgo-site/go.mod b/htmgo-site/go.mod index d3b41a8..ff89be3 100644 --- a/htmgo-site/go.mod +++ b/htmgo-site/go.mod @@ -4,16 +4,16 @@ go 1.23.0 require ( github.com/alecthomas/chroma/v2 v2.14.0 + github.com/go-chi/chi/v5 v5.1.0 github.com/google/uuid v1.6.0 - github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 - github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031165923-032159149c63 + github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241101111035-2c4ac8b2866d github.com/yuin/goldmark v1.7.4 github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc ) require ( github.com/dlclark/regexp2 v1.11.0 // indirect - github.com/go-chi/chi/v5 v5.1.0 // indirect golang.org/x/net v0.30.0 // indirect golang.org/x/text v0.19.0 // indirect golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d // indirect diff --git a/htmgo-site/go.sum b/htmgo-site/go.sum index f332a08..6568432 100644 --- a/htmgo-site/go.sum +++ b/htmgo-site/go.sum @@ -19,10 +19,10 @@ github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031165923-032159149c63 h1:4VFSfty3NpK2DgOy8k9LoXrBpLA9D55d35q7iMD9nwE= -github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241031165923-032159149c63/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d h1:xr5dOwDzFZgZlgL3MmggSS9p+VeC0JawNS6tWBI3XUM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241101111035-2c4ac8b2866d h1:uc4h6gRfVQ/OjYXWg46xwT1cRAQlDJjo9RjoP4f2CLs= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241101111035-2c4ac8b2866d/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= diff --git a/templates/starter/go.mod b/templates/starter/go.mod index a77effb..a54c796 100644 --- a/templates/starter/go.mod +++ b/templates/starter/go.mod @@ -2,9 +2,10 @@ module starter-template go 1.23.0 -require github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 +require github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d require ( github.com/go-chi/chi/v5 v5.1.0 // indirect github.com/google/uuid v1.6.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect ) diff --git a/templates/starter/go.sum b/templates/starter/go.sum index 21a2060..d23ad5d 100644 --- a/templates/starter/go.sum +++ b/templates/starter/go.sum @@ -4,13 +4,15 @@ github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63 h1:HV+1TUsoFnZoWXbvh9NvYyTt86tETKoGokXjMhA6IC0= -github.com/maddalax/htmgo/framework v1.0.3-0.20241031165923-032159149c63/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d h1:xr5dOwDzFZgZlgL3MmggSS9p+VeC0JawNS6tWBI3XUM= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111035-2c4ac8b2866d/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 25c216e2b6230bf7eda0342e419336566fb0ae84 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 1 Nov 2024 06:16:29 -0500 Subject: [PATCH 131/137] mod tidy --- cli/htmgo/go.mod | 14 ++++++++++---- cli/htmgo/go.sum | 30 ++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 10 deletions(-) diff --git a/cli/htmgo/go.mod b/cli/htmgo/go.mod index ba191b9..c7e9d76 100644 --- a/cli/htmgo/go.mod +++ b/cli/htmgo/go.mod @@ -3,13 +3,19 @@ module github.com/maddalax/htmgo/cli/htmgo go 1.23.0 require ( - github.com/dave/jennifer v1.7.1 github.com/fsnotify/fsnotify v1.7.0 github.com/google/uuid v1.6.0 + github.com/maddalax/htmgo/framework v1.0.3-0.20241101111125-af0091c370ed + github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241101111125-af0091c370ed golang.org/x/mod v0.21.0 - golang.org/x/net v0.29.0 - golang.org/x/sys v0.25.0 + golang.org/x/sys v0.26.0 golang.org/x/tools v0.25.0 ) -require github.com/bmatcuk/doublestar/v4 v4.7.1 // indirect +require ( + github.com/bmatcuk/doublestar/v4 v4.7.1 + github.com/go-chi/chi/v5 v5.1.0 // indirect + golang.org/x/net v0.30.0 // indirect + golang.org/x/text v0.19.0 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/cli/htmgo/go.sum b/cli/htmgo/go.sum index 87e7902..447a06c 100644 --- a/cli/htmgo/go.sum +++ b/cli/htmgo/go.sum @@ -1,16 +1,34 @@ github.com/bmatcuk/doublestar/v4 v4.7.1 h1:fdDeAqgT47acgwd9bd9HxJRDmc9UAmPpc+2m0CXv75Q= github.com/bmatcuk/doublestar/v4 v4.7.1/go.mod h1:xBQ8jztBU6kakFMg+8WGxn0c6z1fTSPVIjEY1Wr7jzc= -github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo= -github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc= +github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA= github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM= +github.com/go-chi/chi/v5 v5.1.0 h1:acVI1TYaD+hhedDJ3r54HyA6sExp3HfXq7QWEEY/xMw= +github.com/go-chi/chi/v5 v5.1.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/maddalax/htmgo/framework v1.0.2 h1:yr31UEva2D7AggIhqkxgy6Ee7CspcbesILpvPE27pMw= +github.com/maddalax/htmgo/framework v1.0.2/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111125-af0091c370ed h1:ShprbCL4MXmlfA8u6H6dnrNwIA2liBOvaD+n2fWQ4ts= +github.com/maddalax/htmgo/framework v1.0.3-0.20241101111125-af0091c370ed/go.mod h1:NGGzWVXWksrQJ9kV9SGa/A1F1Bjsgc08cN7ZVb98RqY= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241101111125-af0091c370ed h1:lHCpp6eOCvpAKMoXx30KOucWKIM9zV5Gl8IgvFWmJlw= +github.com/maddalax/htmgo/tools/html-to-htmgo v0.0.0-20241101111125-af0091c370ed/go.mod h1:FraJsj3NRuLBQDk83ZVa+psbNRNLe+rajVtVhYMEme4= +github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= +github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= -golang.org/x/net v0.29.0 h1:5ORfpBpCs4HzDYoodCDBbwHzdR5UrLBZ3sOnUJmFoHo= -golang.org/x/net v0.29.0/go.mod h1:gLkgy8jTGERgjzMic6DS9+SP0ajcu6Xu3Orq/SpETg0= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/net v0.30.0 h1:AcW1SDZMkb8IpzCdQUaIq2sP4sZ4zw+55h6ynffypl4= +golang.org/x/net v0.30.0/go.mod h1:2wGyMJ5iFasEhkwi13ChkO/t1ECNC4X4eBKkVFyYFlU= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/tools v0.25.0 h1:oFU9pkj/iJgs+0DT+VMHrx+oBKs/LJMV+Uvg78sl+fE= golang.org/x/tools v0.25.0/go.mod h1:/vtpO8WL1N9cQC3FN5zPqb//fRXskFHbLKk4OW1Q7rg= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= From 2346708ab1dbabd81885e06047a76f6f526d511f Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 1 Nov 2024 07:09:58 -0500 Subject: [PATCH 132/137] windows fix --- cli/htmgo/tasks/astgen/entry.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index bc385a3..b115101 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -443,7 +443,7 @@ func writeAssetsFile() { } path = strings.ReplaceAll(path, distAssets, "") - httpUrl := fmt.Sprintf("%s%s", config.PublicAssetPath, path) + httpUrl := normalizePath(fmt.Sprintf("%s%s", config.PublicAssetPath, path)) path = normalizePath(path) path = strings.ReplaceAll(path, "/", "_") From bf9cf2bf960b30c5bfb75d3d7b5e6b2fa4e644e4 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 1 Nov 2024 07:23:18 -0500 Subject: [PATCH 133/137] add version --- cli/htmgo/runner.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cli/htmgo/runner.go b/cli/htmgo/runner.go index 0cfd586..d3c7921 100644 --- a/cli/htmgo/runner.go +++ b/cli/htmgo/runner.go @@ -19,11 +19,13 @@ import ( "sync" ) +const version = "1.0.3" + func main() { needsSignals := true commandMap := make(map[string]*flag.FlagSet) - commands := []string{"template", "run", "watch", "build", "setup", "css", "schema", "generate", "format"} + commands := []string{"template", "run", "watch", "build", "setup", "css", "schema", "generate", "format", "version"} for _, command := range commands { commandMap[command] = flag.NewFlagSet(command, flag.ExitOnError) @@ -100,6 +102,10 @@ func main() { }() startWatcher(reloader.OnFileChange) } else { + if taskName == "version" { + fmt.Printf("htmgo cli version %s\n", version) + os.Exit(0) + } if taskName == "format" { if len(os.Args) < 3 { fmt.Println(fmt.Sprintf("Usage: htmgo format ")) From 7d04d8861f4446704fa9ee327f8560612819fa24 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 1 Nov 2024 07:29:15 -0500 Subject: [PATCH 134/137] add windows instructions --- htmgo-site/pages/docs/installation.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/htmgo-site/pages/docs/installation.go b/htmgo-site/pages/docs/installation.go index 731aa54..93ef2ab 100644 --- a/htmgo-site/pages/docs/installation.go +++ b/htmgo-site/pages/docs/installation.go @@ -25,6 +25,9 @@ func Installation(ctx *h.RequestContext) *h.Page { HelpText("If you have not read the htmx docs, please do so before continuing, many of the concepts htmgo uses will become clearer."), StepTitle("1. Install htmgo"), ui.SingleLineBashCodeSnippet(`GOPROXY=direct go install github.com/maddalax/htmgo/cli/htmgo@latest`), + Text("If you are using Windows, you will need to use the following command instead:"), + ui.SingleLineBashCodeSnippet(`set GOPROXY=direct && go install github.com/maddalax/htmgo/cli/htmgo@latest`), + HelpText("Make sure GOPROXY=direct is set, otherwise you may have issues."), StepTitle("2. Create new project"), ui.SingleLineBashCodeSnippet(`htmgo template`), HelpText("this will ask you for a new app name, and it will clone our starter template to a new directory it creates with your app name."), From ea997b41de91ed6ee4b0aff3e336ef2d315af42d Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 1 Nov 2024 07:44:17 -0500 Subject: [PATCH 135/137] debug --- cli/htmgo/tasks/astgen/entry.go | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/cli/htmgo/tasks/astgen/entry.go b/cli/htmgo/tasks/astgen/entry.go index b115101..d53dc85 100644 --- a/cli/htmgo/tasks/astgen/entry.go +++ b/cli/htmgo/tasks/astgen/entry.go @@ -10,6 +10,7 @@ import ( "go/token" "golang.org/x/mod/modfile" "io/fs" + "log/slog" "os" "path/filepath" "slices" @@ -421,6 +422,9 @@ func writePagesFile() { func writeAssetsFile() { cwd := process.GetWorkingDir() config := dirutil.GetConfig() + + slog.Debug("writing assets file", slog.String("cwd", cwd), slog.String("config", config.PublicAssetPath)) + distAssets := filepath.Join(cwd, "assets", "dist") hasAssets := false From aeb3a7be64dac673c6ee08aab7ecaa85d529e5a6 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 1 Nov 2024 07:53:48 -0500 Subject: [PATCH 136/137] fixes --- cli/htmgo/runner.go | 20 ++++---------------- cli/htmgo/tasks/run/build.go | 2 +- 2 files changed, 5 insertions(+), 17 deletions(-) diff --git a/cli/htmgo/runner.go b/cli/htmgo/runner.go index d3c7921..bf6eaee 100644 --- a/cli/htmgo/runner.go +++ b/cli/htmgo/runner.go @@ -16,7 +16,6 @@ import ( "log/slog" "os" "strings" - "sync" ) const version = "1.0.3" @@ -79,21 +78,9 @@ func main() { fmt.Printf("Generating CSS...\n") css.GenerateCss(process.ExitOnError) - wg := sync.WaitGroup{} - - wg.Add(1) - go func() { - defer wg.Done() - astgen.GenAst(process.ExitOnError) - }() - - wg.Add(1) - go func() { - defer wg.Done() - run.EntGenerate() - }() - - wg.Wait() + // generate ast needs to be run after css generation + astgen.GenAst(process.ExitOnError) + run.EntGenerate() fmt.Printf("Starting server...\n") process.KillAll() @@ -131,6 +118,7 @@ func main() { } else if taskName == "css" { _ = css.GenerateCss(process.ExitOnError) } else if taskName == "ast" { + css.GenerateCss(process.ExitOnError) _ = astgen.GenAst(process.ExitOnError) } else if taskName == "run" { run.MakeBuildable() diff --git a/cli/htmgo/tasks/run/build.go b/cli/htmgo/tasks/run/build.go index 724e885..2f2f10b 100644 --- a/cli/htmgo/tasks/run/build.go +++ b/cli/htmgo/tasks/run/build.go @@ -11,8 +11,8 @@ import ( func MakeBuildable() { copyassets.CopyAssets() - astgen.GenAst(process.ExitOnError) css.GenerateCss(process.ExitOnError) + astgen.GenAst(process.ExitOnError) } func Build() { From 6acfc74a65b8964c902a968a29af66b3db35c3d8 Mon Sep 17 00:00:00 2001 From: maddalax Date: Fri, 1 Nov 2024 07:57:30 -0500 Subject: [PATCH 137/137] version --- cli/htmgo/runner.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cli/htmgo/runner.go b/cli/htmgo/runner.go index bf6eaee..3f799a8 100644 --- a/cli/htmgo/runner.go +++ b/cli/htmgo/runner.go @@ -18,7 +18,7 @@ import ( "strings" ) -const version = "1.0.3" +const version = "1.0.4" func main() { needsSignals := true