hyper-html-api 0.3.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +60 -0
- package/dist/hyper-html-api.engine.min.js +1 -1
- package/dist/hyper-html-api.min.js +3 -3
- package/dist/hyper-html-api.upgrade.min.js +2 -0
- package/package.json +5 -3
- package/src/adapters/cheerio.js +6 -1
- package/src/adapters/dom.js +6 -1
- package/src/engine/diff.js +3 -1
- package/src/engine/errors.js +0 -7
- package/src/engine/rules-tag.js +1 -1
- package/src/hyper-html-api.js +2 -11
- package/src/upgrade/check.js +116 -0
- package/src/upgrade/errors.js +36 -0
- package/src/upgrade/extract-all.js +26 -0
- package/src/upgrade/index.js +13 -4
- package/src/upgrade/migrate.js +36 -0
- package/src/upgrade/rules-tags.js +37 -0
- package/src/upgrade/run.js +78 -0
- package/src/upgrade/shape-match.js +4 -1
- package/src/upgrade/transform.js +51 -0
- package/src/upgrade.js +14 -0
- package/src/upgrade/helper.js +0 -143
- package/src/upgrade/registry.js +0 -19
- package/src/upgrade/runner.js +0 -92
package/README.md
CHANGED
|
@@ -48,6 +48,66 @@ extracts data and `set(data)` writes it back. Token resolution is
|
|
|
48
48
|
document-scoped, so a tag mounted in `<head>` is found even when `bind` is given
|
|
49
49
|
a body or form element; `get()`/`set()` stay scoped to that element.
|
|
50
50
|
|
|
51
|
+
## Upgrade
|
|
52
|
+
|
|
53
|
+
A page that was copied from a template can pull in the template's newer
|
|
54
|
+
version while keeping its own data. Two meta tags opt a page in:
|
|
55
|
+
|
|
56
|
+
```html
|
|
57
|
+
<meta name="hyper-source" content="https://devlog.panphora.hyperclay.com">
|
|
58
|
+
<meta name="hyper-version" content="1.0.0">
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
`hyper-source` points at the canonical version (and doubles as identity);
|
|
62
|
+
`hyper-version` is a dotted version number. Forks inherit both because copying
|
|
63
|
+
the HTML copies the tags. Without them the upgrade subsystem is inert.
|
|
64
|
+
|
|
65
|
+
```js
|
|
66
|
+
HyperHtmlApi.upgrade.checkForUpdate({ force? })
|
|
67
|
+
// → { available, currentVersion, sourceVersion, sourceUrl } | null
|
|
68
|
+
// Fetches the source anonymously, reads its hyper-version, caches the result
|
|
69
|
+
// in localStorage for 24h. null = inert (missing tags, self-source, unreachable).
|
|
70
|
+
|
|
71
|
+
HyperHtmlApi.upgrade.extractAll(root?)
|
|
72
|
+
// → { dataByName, version } — keyed extraction of every rules tag on the page.
|
|
73
|
+
|
|
74
|
+
HyperHtmlApi.upgrade.run({ sourceUrl?, dataByName?, fromVersion? })
|
|
75
|
+
// → { html, fromVersion, toVersion, summary }
|
|
76
|
+
// The whole flow: extract keyed data from the live page, fetch the source's
|
|
77
|
+
// pristine HTML (DOMParser — its scripts never execute), evaluate its optional
|
|
78
|
+
// transform tag, join data into the parsed copy by exact rules-tag name, and
|
|
79
|
+
// serialize. Does NOT save; the caller decides how to persist `html`.
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
The join is name-match per rules tag: fields present in both carry over, fields
|
|
83
|
+
only in the old data are discarded (and counted in `summary`), fields only in
|
|
84
|
+
the new template keep its defaults, and list counts follow the old data. For
|
|
85
|
+
richer migrations (renames, splits, computed fields) the source declares a
|
|
86
|
+
transform as a non-executing script tag in its own HTML:
|
|
87
|
+
|
|
88
|
+
```html
|
|
89
|
+
<script type="text/hyper-upgrade">
|
|
90
|
+
export default function upgrade(dataByName, { fromVersion, toVersion }) {
|
|
91
|
+
return {
|
|
92
|
+
api: { heading: dataByName.api.title }, // rename a field
|
|
93
|
+
settings: dataByName.profile, // re-key a rules tag
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
</script>
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Browsers ignore the unknown script type, so the tag never runs on the source
|
|
100
|
+
page itself. The upgrading fork reads it out of the fetched copy and evaluates
|
|
101
|
+
it as a real ES module (Blob URL import), so it may be `async`; it must be
|
|
102
|
+
self-contained (relative imports won't resolve; absolute CDN imports work). At
|
|
103
|
+
most one per document. If it throws, the upgrade aborts and nothing is saved.
|
|
104
|
+
|
|
105
|
+
Security: the transform runs in the fork's context, but only after an explicit
|
|
106
|
+
upgrade action, and upgrading means adopting the source's HTML and scripts
|
|
107
|
+
wholesale anyway — evaluating its transform first adds no new trust. Sources
|
|
108
|
+
must be served with CORS open for anonymous reads (Hyperclay serves all site
|
|
109
|
+
HTML with `Access-Control-Allow-Origin: *`).
|
|
110
|
+
|
|
51
111
|
## Node API
|
|
52
112
|
|
|
53
113
|
```js
|
|
@@ -1 +1 @@
|
|
|
1
|
-
var hyperHtmlApiData=(()=>{var k=Object.defineProperty;var ce=Object.getOwnPropertyDescriptor;var fe=Object.getOwnPropertyNames;var ue=Object.prototype.hasOwnProperty;var Y=(e,t)=>{for(var n in t)k(e,n,{get:t[n],enumerable:!0})},ae=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of fe(t))!ue.call(e,r)&&r!==n&&k(e,r,{get:()=>t[r],enumerable:!(o=ce(t,r))||o.enumerable});return e};var he=e=>ae(k({},"__esModule",{value:!0}),e);var Me={};Y(Me,{applyData:()=>z,default:()=>we,engine:()=>P,extractData:()=>X});var C=["textContent","innerText","innerHTML","outerHTML","value","checked","selected","disabled","readOnly","type","tagName","nodeName","nodeType","nodeValue","childElementCount","id","className","classList","baseURI","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","dataset","currentSrc","duration","paused","title","documentURI","contentType"],B=new Set(C),Q=new Set(["textContent","innerText","innerHTML","value","checked","selected","disabled","readOnly","type","id","className","title"]),Z=new Set(["tagName","nodeName","nodeType","nodeValue","childElementCount","classList","baseURI","documentURI","contentType","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","currentSrc","duration","paused","dataset"]);var j={};Y(j,{EmptyListInsert:()=>I,MAX_RULE_DEPTH:()=>A,MaxRuleDepthExceeded:()=>E,RuleTargetReadOnly:()=>w,RulesParseError:()=>S,ShapeMismatch:()=>b,UnknownRulesVersion:()=>N,UpgradeAlreadyRegistered:()=>U});var S=class extends Error{constructor(t,n){super(t),this.name="RulesParseError",this.cause=n}},N=class extends Error{constructor(t){super(`unknown rules version: ${t}. Library supports "1".`),this.name="UnknownRulesVersion",this.version=t}},A=20,E=class extends Error{constructor(t){super(`rule depth exceeded ${A} at path: ${t.join(".")}`),this.name="MaxRuleDepthExceeded",this.path=t}},b=class extends Error{constructor(t){super(`shape mismatch: ${t.length} field(s) failed validation`),this.name="ShapeMismatch",this.mismatches=t}},I=class extends Error{constructor(t){super(`cannot add items to empty list at "${t.join(".")}" \u2014 no sibling to clone as template. Seed the list with a hidden item first.`),this.name="EmptyListInsert",this.path=t}},w=class extends Error{constructor(t){super(`cannot write to read-only DOM property "${t}"`),this.name="RuleTargetReadOnly",this.target=t}},U=class extends Error{constructor(){super("upgrade transform already registered; only one registration is allowed per page."),this.name="UpgradeAlreadyRegistered"}};function g(e,t,n,o={}){return q(e,t,n,{depth:0,path:[]},o)}function q(e,t,n,o,r){if(o.depth>A)throw new E(o.path);if(typeof n=="string")return de(e,t,n,r);if(Array.isArray(n)){let[i,c]=n;return e.find(t,i,r).map((l,a)=>q(e,l,c,{depth:o.depth+1,path:[...o.path,a]},r))}if(typeof n=="object"&&n!==null){let i={};for(let[c,s]of Object.entries(n))i[c]=q(e,t,s,{depth:o.depth+1,path:[...o.path,c]},r);return i}return null}function de(e,t,n,o){if(n.endsWith("[]")){let i=n.slice(0,-2);return e.find(t,i,o).map(c=>e.text(c))}if(n.startsWith("@"))return ee(e,t,n.slice(1));if(n.includes("@")){let i=n.lastIndexOf("@"),c=n.slice(0,i),s=n.slice(i+1),l=c?e.find(t,c,o):[t];return l.length===0?null:ee(e,l[0],s)}if(n===".")return e.text(t);let r=e.find(t,n,o);return r.length===0?null:e.text(r[0])}function ee(e,t,n){if(B.has(n)){let r=e.prop(t,n);return r==null?null:String(r)}let o=e.attr(t,n);return o||null}var pe=.5;function v(e,t,n,o,r,i,c,s={}){let l=e.find(t,n,s);if(r.length===0){l.forEach(h=>e.remove(h));return}let a=r.length>l.length,u=l[0]||null;if(a&&!u&&(u=Re(e,t,n,s),!u))throw new I(i.path);let d=l.map(h=>me(e,h,o,s)),f=null;if(u){f=e.clone(u),s.templateAttr&&e.removeAttr(f,s.templateAttr);let h=e.stripIds(f);h>0&&console.warn(`[hyper-html-api] stripped ${h} id attribute(s) from cloned template at "${i.path.join(".")||"(root)"}"`)}let H=ye(r,d,o),R=l[0]||u,L=e.parent(R),se=l.length>0?Ee(e,L,R):0,K=new Set,W=r.map((h,m)=>{let p=H[m];if(p>=0)return K.add(p),l[p];let O=e.clone(f);return e.stripIds(O),O});l.forEach((h,m)=>{K.has(m)||e.remove(h)}),W.forEach((h,m)=>{let p=se+m;e.children(L).findIndex(le=>e.sameNode(le,h))!==p&&e.insertAt(L,h,p)}),W.forEach((h,m)=>{if(o===null){let p=r[m],O=p==null?"":String(p);e.text(h)!==O&&e.text(h,O)}else{let p=c(e,h,o,r[m],{depth:i.depth+1,path:[...i.path,m]},s);p&&p!==h&&(W[m]=p)}})}function me(e,t,n,o){return n===null?e.text(t):g(e,t,n,o)}function ye(e,t,n){let o=new Array(e.length).fill(-1),r=new Set;return e.forEach((i,c)=>{let s=-1,l=-1;t.forEach((a,u)=>{if(r.has(u))return;let d=ge(i,a,n),f=d===l&&s>=0?Math.abs(u-c)<Math.abs(s-c):!1;(d>l||f)&&(l=d,s=u)}),l>=pe&&(o[c]=s,r.add(s))}),o}function ge(e,t,n){if(n===null)return e===t?1:0;let o=Object.keys(n||{});if(o.length===0)return 0;let r=0;for(let i of o)JSON.stringify(e?.[i])===JSON.stringify(t?.[i])&&r++;return r/o.length}function Ee(e,t,n){let o=e.children(t);for(let r=0;r<o.length;r++)if(e.sameNode(o[r],n))return r;return-1}function Re(e,t,n,o){if(!o.templateAttr)return null;let r=t;for(;r;){let i=e.find(r,n,{includeRulesTag:!1});for(let c of i)if(e.attr(c,o.templateAttr)!=null)return c;r=e.parent(r)}return null}var te=new Set(["checked","selected","disabled","readOnly","paused"]);function T(e,t,n,o,r={}){let i=[];if(J(n,o,[],i),i.length)throw new b(i);$(e,t,n,o,{depth:0,path:[]},r)}function $(e,t,n,o,r,i={}){if(r.depth>A)throw new E(r.path);if(o===void 0)return t;if(typeof n=="string")return Oe(e,t,n,o,r,i);if(Array.isArray(n)){let[c,s]=n;return v(e,t,c,s,o,r,$,i),t}if(typeof n=="object"&&n!==null){for(let[c,s]of Object.entries(n)){let l=$(e,t,s,o==null?o:o[c],{depth:r.depth+1,path:[...r.path,c]},i);l&&l!==t&&(t=l)}return t}return t}function Oe(e,t,n,o,r,i){if(n.endsWith("[]")){let s=n.slice(0,-2);return v(e,t,s,null,o,r,$,i),t}if(n.startsWith("@"))return ne(e,t,n.slice(1),o);if(n.includes("@")){let s=n.lastIndexOf("@"),l=n.slice(0,s),a=n.slice(s+1),u=l?e.find(t,l,i):[t];return u.length===0||ne(e,u[0],a,o),t}if(n===".")return e.text(t,o==null?"":String(o)),t;let c=e.find(t,n,i);return c.length===0||e.text(c[0],o==null?"":String(o)),t}function ne(e,t,n,o){if(Z.has(n))throw new w(n);if(n==="outerHTML"){let r=o==null?"":String(o);return e.replaceWith(t,r)}return Q.has(n)?(e.prop(t,n,Se(n,o)),t):(e.attr(t,n,o==null?"":String(o)),t)}function Se(e,t){return t==null?te.has(e)?!1:"":te.has(e)?!!t:t}function J(e,t,n,o){if(t!==void 0){if(typeof e=="string"){if(e.endsWith("[]")){Array.isArray(t)?t.forEach((r,i)=>{typeof r=="object"&&r!==null&&o.push({path:_([...n,i]),expected:"scalar",got:M(r)})}):o.push({path:_(n),expected:"array",got:M(t)});return}t!==null&&typeof t=="object"&&o.push({path:_(n),expected:"scalar",got:M(t)});return}if(Array.isArray(e)){if(!Array.isArray(t)){o.push({path:_(n),expected:"array",got:M(t)});return}let r=e[1];t.forEach((i,c)=>J(r,i,[...n,c],o));return}if(typeof e=="object"&&e!==null){if(t===null||Array.isArray(t)||typeof t!="object"){o.push({path:_(n),expected:"object",got:M(t)});return}for(let[r,i]of Object.entries(e))J(i,t[r],[...n,r],o)}}}function M(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function _(e){return e.join(".")}function V(e){try{return JSON.parse(e)}catch(t){throw new S(`Invalid strict JSON: ${t.message}`,t)}}function D(e){try{return JSON.parse(e)}catch{}let t={BRACE_OPEN:"{",BRACE_CLOSE:"}",BRACKET_OPEN:"[",BRACKET_CLOSE:"]",COLON:":",COMMA:",",STRING:"STRING",SELECTOR:"SELECTOR",IDENTIFIER:"IDENTIFIER",NUMBER:"NUMBER",BOOLEAN:"BOOLEAN"};function n(r){let i=[],c=0;for(;c<r.length;){let s=r[c];if(/\s/.test(s)){c++;continue}if("{}".includes(s)){i.push({type:s,value:s}),c++;continue}if(s==="["){let d=!1,f=c+1;for(;f<r.length&&/\s/.test(r[f]);)f++;if(f<r.length&&/[a-zA-Z_]/.test(r[f])&&(d=!0),!d){i.push({type:s,value:s}),c++;continue}}if(s==="]"){i.push({type:s,value:s}),c++;continue}if(s===":"){i.push({type:t.COLON,value:s}),c++;continue}if(s===","){i.push({type:t.COMMA,value:s}),c++;continue}if(s==='"'||s==="'"){let d=s,f=c+1;for(;f<r.length&&r[f]!==d;)r[f]==="\\"&&f++,f++;i.push({type:t.STRING,value:r.substring(c+1,f),quoted:!0,sourceQuote:d}),c=f+1;continue}let l=c,a;for(;l<r.length&&!/[{},]/.test(r[l]);)if(r[l]===":"){let d=[":first",":last",":nth-child",":nth-of-type",":first-child",":last-child",":first-of-type",":last-of-type",":only-child",":only-of-type",":hover",":focus",":active",":visited",":disabled",":enabled",":checked",":empty",":root",":target",":not",":before",":after",":nth-last-child",":nth-last-of-type"],f=!1;for(let H of d){let R=H.substring(1);if(r.substring(l+1,l+1+R.length)===R){f=!0,l+=R.length;break}}if(!f)break}else if(r[l]==="["){for(l++;l<r.length&&r[l]!=="]";){if(r[l]==='"'||r[l]==="'"){let d=r[l];for(l++;l<r.length&&r[l]!==d;)r[l]==="\\"&&l++,l++}l++}l<r.length&&r[l]==="]"&&l++}else l++;a=r.substring(c,l);let u=t.IDENTIFIER;/^-?\d+(\.\d+)?$/.test(a)?u=t.NUMBER:a==="true"||a==="false"||a==="null"?u=t.BOOLEAN:/^[.#@\[]|[.#@\[]| /.test(a)&&(u=t.SELECTOR),i.push({type:u,value:a,quoted:!1}),c=l}return i}function o(r){let i="";for(let c=0;c<r.length;c++){let s=r[c];if("{}".includes(s.type)||"[]".includes(s.type)){i+=s.value;continue}if(s.type===t.COLON){i+=s.value;continue}if(s.type===t.COMMA){let l=r[c+1];if(l&&(l.type==="}"||l.type==="]"))continue;i+=s.value;continue}if(s.type===t.STRING&&s.quoted){let l=s.value;s.sourceQuote==="'"&&(l=l.replace(/\\'/g,"'"),l=l.replace(/(\\*)"/g,(a,u)=>u.length%2===0?u+'\\"':a)),i+=`"${l}"`;continue}if(s.type===t.NUMBER||s.type===t.BOOLEAN){i+=s.value;continue}if(s.type===t.SELECTOR||s.type===t.IDENTIFIER){i+=`"${s.value}"`;continue}i+=`"${s.value}"`}return i}try{let r=n(e),i=o(r);return JSON.parse(i)}catch(r){throw new S("Invalid extraction rules syntax: "+r.message,r)}}var Ae="1",re=/^[a-zA-Z0-9_-]+$/;function x(e,t,n){let o;if(n===void 0)o="script[data-rules-name]";else{if(typeof n!="string"||!re.test(n))throw new Error(`hyper-html-api: invalid rules token ${JSON.stringify(n)} (must match ${re})`);o=`script[data-rules-name~="${n}"]`}let r=e.find(t,o,{includeRulesTag:!0});if(r.length===0)return null;n!==void 0&&r.length>1&&console.warn(`hyper-html-api: ${r.length} rules tags match data-rules-name~="${n}"; using the first.`);let i=r[0],c=e.attr(i,"data-rules-version");if(c!==Ae)throw new N(c);return{rules:D(e.text(i)),tagNode:i}}function F(e,t,n){if(n&&typeof n=="object")return{rules:n,tagNode:null};if(typeof n=="string"){let o=t&&t.ownerDocument?t.ownerDocument:t;return x(e,o,n)}return null}function oe(e,t,n,o){let r=F(e,t,n);if(!r){let s=typeof n=="string"?`data-rules-name~="${n}"`:"the provided rules object";throw new Error(`hyper-html-api: could not resolve rules for ${s}`)}let{rules:i,tagNode:c}=r;return{rules:i,tagNode:c,get:()=>g(e,t,i,o),set:s=>T(e,t,i,s,o)}}function xe(e){return e&&e.nodeType===1&&e.tagName==="SCRIPT"&&e.hasAttribute&&e.hasAttribute("data-rules-name")}function Ne(e){return e?(e.nodeType===9||e.nodeType===11,e):null}var be={find(e,t,n={}){let o=Ne(e);if(!o||!o.querySelectorAll)return[];let r=Array.from(o.querySelectorAll(t));n.includeRulesTag||(r=r.filter(c=>!xe(c)));let i=[];if(n.skip&&i.push(n.skip),n.templateAttr&&i.push("["+n.templateAttr+"]"),i.length){let c=i.join(", ");r=r.filter(s=>!s.closest||!s.closest(c))}return r},parent(e){return e?e.parentElement:null},children(e){return e?Array.from(e.children):[]},text(e,t){if(t===void 0)return(e.textContent||"").trim();e.textContent=t},attr(e,t,n){if(n===void 0)return e.hasAttribute&&e.hasAttribute(t)?e.getAttribute(t):null;e.setAttribute(t,n)},removeAttr(e,t){e&&e.removeAttribute&&e.removeAttribute(t)},prop(e,t,n){if(n===void 0){let o=e?e[t]:void 0;return o!==void 0?o:null}e[t]=n},clone(e){return e.cloneNode(!0)},insertAt(e,t,n){let o=e.children[n]||null;e.insertBefore(t,o)},remove(e){e&&e.parentNode&&e.parentNode.removeChild(e)},replaceWith(e,t){if(!e||!e.parentNode)throw new Error("dom.replaceWith: node has no parent");let o=e.ownerDocument.createElement("template");o.innerHTML=t;let r=o.content.firstElementChild;if(!r)throw new Error("dom.replaceWith: html did not parse to an element");return e.parentNode.replaceChild(r,e),r},stripIds(e){let t=0;return e.id&&(e.removeAttribute("id"),t++),(e.querySelectorAll?e.querySelectorAll("[id]"):[]).forEach(o=>{o.removeAttribute("id"),t++}),t},sameNode(e,t){return e===t}},y=be;var P={extract:(e,t,n)=>g(y,e,t,n),apply:(e,t,n,o)=>T(y,e,t,n,o),findRulesIn:(e,t)=>x(y,e,t),findRules:(e,t)=>F(y,e,t),bind:(e,t,n)=>oe(y,e,t,n),parseStrict:V,parseRelaxed:D,errors:j,DOM_PROPERTIES:C},G=e=>!!e&&typeof e.nodeType=="number";function ie(e){let t=e&&e.ownerDocument?e.ownerDocument:e,n=y.find(t,"script[data-rules-name]",{includeRulesTag:!0});if(n.length===0)throw new Error('hyper-html-api: no rules tag found. Add <script type="application/json" data-rules-name="\u2026" data-rules-version="1"> or pass rules.');if(n.length>1)throw new Error('hyper-html-api: multiple rules tags found; pass a name, e.g. extractData("api").');return x(y,t).rules}function X(e,t){let n=G(e)?e:document,o=G(e)?t:e;return o===void 0?g(y,n,ie(n)):P.bind(n,o).get()}function z(e,t,n){if(!G(e))throw new Error("hyper-html-api: applyData(root, data, source?) needs a DOM root as the first argument.");return n===void 0?T(y,e,ie(e),t):P.bind(e,n).set(t),e}var Ie={engine:P,extractData:X,applyData:z},we=Ie;return he(Me);})();
|
|
1
|
+
var hyperHtmlApiData=(()=>{var k=Object.defineProperty;var lt=Object.getOwnPropertyDescriptor;var ct=Object.getOwnPropertyNames;var ft=Object.prototype.hasOwnProperty;var K=(t,e)=>{for(var n in e)k(t,n,{get:e[n],enumerable:!0})},ut=(t,e,n,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of ct(e))!ft.call(t,r)&&r!==n&&k(t,r,{get:()=>e[r],enumerable:!(o=lt(e,r))||o.enumerable});return t};var at=t=>ut(k({},"__esModule",{value:!0}),t);var wt={};K(wt,{applyData:()=>X,default:()=>It,engine:()=>P,extractData:()=>G});var C=["textContent","innerText","innerHTML","outerHTML","value","checked","selected","disabled","readOnly","type","tagName","nodeName","nodeType","nodeValue","childElementCount","id","className","classList","baseURI","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","dataset","currentSrc","duration","paused","title","documentURI","contentType"],B=new Set(C),Y=new Set(["textContent","innerText","innerHTML","value","checked","selected","disabled","readOnly","type","id","className","title"]),Q=new Set(["tagName","nodeName","nodeType","nodeValue","childElementCount","classList","baseURI","documentURI","contentType","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","currentSrc","duration","paused","dataset"]);var j={};K(j,{EmptyListInsert:()=>I,MAX_RULE_DEPTH:()=>A,MaxRuleDepthExceeded:()=>E,RuleTargetReadOnly:()=>w,RulesParseError:()=>S,ShapeMismatch:()=>b,UnknownRulesVersion:()=>N});var S=class extends Error{constructor(e,n){super(e),this.name="RulesParseError",this.cause=n}},N=class extends Error{constructor(e){super(`unknown rules version: ${e}. Library supports "1".`),this.name="UnknownRulesVersion",this.version=e}},A=20,E=class extends Error{constructor(e){super(`rule depth exceeded ${A} at path: ${e.join(".")}`),this.name="MaxRuleDepthExceeded",this.path=e}},b=class extends Error{constructor(e){super(`shape mismatch: ${e.length} field(s) failed validation`),this.name="ShapeMismatch",this.mismatches=e}},I=class extends Error{constructor(e){super(`cannot add items to empty list at "${e.join(".")}" \u2014 no sibling to clone as template. Seed the list with a hidden item first.`),this.name="EmptyListInsert",this.path=e}},w=class extends Error{constructor(e){super(`cannot write to read-only DOM property "${e}"`),this.name="RuleTargetReadOnly",this.target=e}};function g(t,e,n,o={}){return U(t,e,n,{depth:0,path:[]},o)}function U(t,e,n,o,r){if(o.depth>A)throw new E(o.path);if(typeof n=="string")return ht(t,e,n,r);if(Array.isArray(n)){let[i,c]=n;return t.find(e,i,r).map((l,a)=>U(t,l,c,{depth:o.depth+1,path:[...o.path,a]},r))}if(typeof n=="object"&&n!==null){let i={};for(let[c,s]of Object.entries(n))i[c]=U(t,e,s,{depth:o.depth+1,path:[...o.path,c]},r);return i}return null}function ht(t,e,n,o){if(n.endsWith("[]")){let i=n.slice(0,-2);return t.find(e,i,o).map(c=>t.text(c))}if(n.startsWith("@"))return Z(t,e,n.slice(1));if(n.includes("@")){let i=n.lastIndexOf("@"),c=n.slice(0,i),s=n.slice(i+1),l=c?t.find(e,c,o):[e];return l.length===0?null:Z(t,l[0],s)}if(n===".")return t.text(e);let r=t.find(e,n,o);return r.length===0?null:t.text(r[0])}function Z(t,e,n){if(B.has(n)){let r=t.prop(e,n);return r==null?null:String(r)}let o=t.attr(e,n);return o||null}var dt=.5;function q(t,e,n,o,r,i,c,s={}){let l=t.find(e,n,s);if(r.length===0){l.forEach(h=>t.remove(h));return}let a=r.length>l.length,u=l[0]||null;if(a&&!u&&(u=Et(t,e,n,s),!u))throw new I(i.path);let d=l.map(h=>pt(t,h,o,s)),f=null;if(u){f=t.clone(u),s.templateAttr&&t.removeAttr(f,s.templateAttr);let h=t.stripIds(f);h>0&&console.warn(`[hyper-html-api] stripped ${h} id attribute(s) from cloned template at "${i.path.join(".")||"(root)"}"`)}let H=mt(r,d,o),R=l[0]||u,L=t.parent(R),it=l.length>0?gt(t,L,R):0,z=new Set,W=r.map((h,m)=>{let p=H[m];if(p>=0)return z.add(p),l[p];let O=t.clone(f);return t.stripIds(O),O});l.forEach((h,m)=>{z.has(m)||t.remove(h)}),W.forEach((h,m)=>{let p=it+m;t.children(L).findIndex(st=>t.sameNode(st,h))!==p&&t.insertAt(L,h,p)}),W.forEach((h,m)=>{if(o===null){let p=r[m],O=p==null?"":String(p);t.text(h)!==O&&t.text(h,O)}else{let p=c(t,h,o,r[m],{depth:i.depth+1,path:[...i.path,m]},s);p&&p!==h&&(W[m]=p)}})}function pt(t,e,n,o){return n===null?t.text(e):g(t,e,n,o)}function mt(t,e,n){let o=new Array(t.length).fill(-1),r=new Set;return t.forEach((i,c)=>{let s=-1,l=-1;e.forEach((a,u)=>{if(r.has(u))return;let d=yt(i,a,n),f=d===l&&s>=0?Math.abs(u-c)<Math.abs(s-c):!1;(d>l||f)&&(l=d,s=u)}),l>=dt&&(o[c]=s,r.add(s))}),o}function yt(t,e,n){if(n===null)return t===e?1:0;let o=Object.keys(n||{});if(o.length===0)return 0;let r=0;for(let i of o)JSON.stringify(t?.[i])===JSON.stringify(e?.[i])&&r++;return r/o.length}function gt(t,e,n){let o=t.children(e);for(let r=0;r<o.length;r++)if(t.sameNode(o[r],n))return r;return-1}function Et(t,e,n,o){if(!o.templateAttr)return null;let r=e;for(;r;){let i=t.find(r,n,{includeRulesTag:!1,templateAttr:null});for(let c of i)if(t.attr(c,o.templateAttr)!=null)return c;r=t.parent(r)}return null}var tt=new Set(["checked","selected","disabled","readOnly","paused"]);function T(t,e,n,o,r={}){let i=[];if(v(n,o,[],i),i.length)throw new b(i);$(t,e,n,o,{depth:0,path:[]},r)}function $(t,e,n,o,r,i={}){if(r.depth>A)throw new E(r.path);if(o===void 0)return e;if(typeof n=="string")return Rt(t,e,n,o,r,i);if(Array.isArray(n)){let[c,s]=n;return q(t,e,c,s,o,r,$,i),e}if(typeof n=="object"&&n!==null){for(let[c,s]of Object.entries(n)){let l=$(t,e,s,o==null?o:o[c],{depth:r.depth+1,path:[...r.path,c]},i);l&&l!==e&&(e=l)}return e}return e}function Rt(t,e,n,o,r,i){if(n.endsWith("[]")){let s=n.slice(0,-2);return q(t,e,s,null,o,r,$,i),e}if(n.startsWith("@"))return et(t,e,n.slice(1),o);if(n.includes("@")){let s=n.lastIndexOf("@"),l=n.slice(0,s),a=n.slice(s+1),u=l?t.find(e,l,i):[e];return u.length===0||et(t,u[0],a,o),e}if(n===".")return t.text(e,o==null?"":String(o)),e;let c=t.find(e,n,i);return c.length===0||t.text(c[0],o==null?"":String(o)),e}function et(t,e,n,o){if(Q.has(n))throw new w(n);if(n==="outerHTML"){let r=o==null?"":String(o);return t.replaceWith(e,r)}return Y.has(n)?(t.prop(e,n,Ot(n,o)),e):(t.attr(e,n,o==null?"":String(o)),e)}function Ot(t,e){return e==null?tt.has(t)?!1:"":tt.has(t)?!!e:e}function v(t,e,n,o){if(e!==void 0){if(typeof t=="string"){if(t.endsWith("[]")){Array.isArray(e)?e.forEach((r,i)=>{typeof r=="object"&&r!==null&&o.push({path:_([...n,i]),expected:"scalar",got:M(r)})}):o.push({path:_(n),expected:"array",got:M(e)});return}e!==null&&typeof e=="object"&&o.push({path:_(n),expected:"scalar",got:M(e)});return}if(Array.isArray(t)){if(!Array.isArray(e)){o.push({path:_(n),expected:"array",got:M(e)});return}let r=t[1];e.forEach((i,c)=>v(r,i,[...n,c],o));return}if(typeof t=="object"&&t!==null){if(e===null||Array.isArray(e)||typeof e!="object"){o.push({path:_(n),expected:"object",got:M(e)});return}for(let[r,i]of Object.entries(t))v(i,e[r],[...n,r],o)}}}function M(t){return t===null?"null":Array.isArray(t)?"array":typeof t}function _(t){return t.join(".")}function J(t){try{return JSON.parse(t)}catch(e){throw new S(`Invalid strict JSON: ${e.message}`,e)}}function D(t){try{return JSON.parse(t)}catch{}let e={BRACE_OPEN:"{",BRACE_CLOSE:"}",BRACKET_OPEN:"[",BRACKET_CLOSE:"]",COLON:":",COMMA:",",STRING:"STRING",SELECTOR:"SELECTOR",IDENTIFIER:"IDENTIFIER",NUMBER:"NUMBER",BOOLEAN:"BOOLEAN"};function n(r){let i=[],c=0;for(;c<r.length;){let s=r[c];if(/\s/.test(s)){c++;continue}if("{}".includes(s)){i.push({type:s,value:s}),c++;continue}if(s==="["){let d=!1,f=c+1;for(;f<r.length&&/\s/.test(r[f]);)f++;if(f<r.length&&/[a-zA-Z_]/.test(r[f])&&(d=!0),!d){i.push({type:s,value:s}),c++;continue}}if(s==="]"){i.push({type:s,value:s}),c++;continue}if(s===":"){i.push({type:e.COLON,value:s}),c++;continue}if(s===","){i.push({type:e.COMMA,value:s}),c++;continue}if(s==='"'||s==="'"){let d=s,f=c+1;for(;f<r.length&&r[f]!==d;)r[f]==="\\"&&f++,f++;i.push({type:e.STRING,value:r.substring(c+1,f),quoted:!0,sourceQuote:d}),c=f+1;continue}let l=c,a;for(;l<r.length&&!/[{},]/.test(r[l]);)if(r[l]===":"){let d=[":first",":last",":nth-child",":nth-of-type",":first-child",":last-child",":first-of-type",":last-of-type",":only-child",":only-of-type",":hover",":focus",":active",":visited",":disabled",":enabled",":checked",":empty",":root",":target",":not",":before",":after",":nth-last-child",":nth-last-of-type"],f=!1;for(let H of d){let R=H.substring(1);if(r.substring(l+1,l+1+R.length)===R){f=!0,l+=R.length;break}}if(!f)break}else if(r[l]==="["){for(l++;l<r.length&&r[l]!=="]";){if(r[l]==='"'||r[l]==="'"){let d=r[l];for(l++;l<r.length&&r[l]!==d;)r[l]==="\\"&&l++,l++}l++}l<r.length&&r[l]==="]"&&l++}else l++;a=r.substring(c,l);let u=e.IDENTIFIER;/^-?\d+(\.\d+)?$/.test(a)?u=e.NUMBER:a==="true"||a==="false"||a==="null"?u=e.BOOLEAN:/^[.#@\[]|[.#@\[]| /.test(a)&&(u=e.SELECTOR),i.push({type:u,value:a,quoted:!1}),c=l}return i}function o(r){let i="";for(let c=0;c<r.length;c++){let s=r[c];if("{}".includes(s.type)||"[]".includes(s.type)){i+=s.value;continue}if(s.type===e.COLON){i+=s.value;continue}if(s.type===e.COMMA){let l=r[c+1];if(l&&(l.type==="}"||l.type==="]"))continue;i+=s.value;continue}if(s.type===e.STRING&&s.quoted){let l=s.value;s.sourceQuote==="'"&&(l=l.replace(/\\'/g,"'"),l=l.replace(/(\\*)"/g,(a,u)=>u.length%2===0?u+'\\"':a)),i+=`"${l}"`;continue}if(s.type===e.NUMBER||s.type===e.BOOLEAN){i+=s.value;continue}if(s.type===e.SELECTOR||s.type===e.IDENTIFIER){i+=`"${s.value}"`;continue}i+=`"${s.value}"`}return i}try{let r=n(t),i=o(r);return JSON.parse(i)}catch(r){throw new S("Invalid extraction rules syntax: "+r.message,r)}}var St="1",nt=/^[a-zA-Z0-9_-]+$/;function x(t,e,n){let o;if(n===void 0)o="script[data-rules-name]";else{if(typeof n!="string"||!nt.test(n))throw new Error(`hyper-html-api: invalid rules token ${JSON.stringify(n)} (must match ${nt})`);o=`script[data-rules-name~="${n}"]`}let r=t.find(e,o,{includeRulesTag:!0});if(r.length===0)return null;n!==void 0&&r.length>1&&console.warn(`hyper-html-api: ${r.length} rules tags match data-rules-name~="${n}"; using the first.`);let i=r[0],c=t.attr(i,"data-rules-version");if(c!==St)throw new N(c);return{rules:D(t.text(i)),tagNode:i}}function V(t,e,n){if(n&&typeof n=="object")return{rules:n,tagNode:null};if(typeof n=="string"){let o=e&&e.ownerDocument?e.ownerDocument:e;return x(t,o,n)}return null}function rt(t,e,n,o){let r=V(t,e,n);if(!r){let s=typeof n=="string"?`data-rules-name~="${n}"`:"the provided rules object";throw new Error(`hyper-html-api: could not resolve rules for ${s}`)}let{rules:i,tagNode:c}=r;return{rules:i,tagNode:c,get:()=>g(t,e,i,o),set:s=>T(t,e,i,s,o)}}function Tt(t){return t&&t.nodeType===1&&t.tagName==="SCRIPT"&&t.hasAttribute&&t.hasAttribute("data-rules-name")}function xt(t){return t?(t.nodeType===9||t.nodeType===11,t):null}var Nt={find(t,e,n={}){let o=xt(t);if(!o||!o.querySelectorAll)return[];let r=Array.from(o.querySelectorAll(e));n.includeRulesTag||(r=r.filter(s=>!Tt(s)));let i=[];n.skip&&i.push(n.skip);let c=n.templateAttr===null?null:n.templateAttr||"cms-template";if(c&&i.push("["+c+"]"),i.length){let s=i.join(", ");r=r.filter(l=>!l.closest||!l.closest(s))}return r},parent(t){return t?t.parentElement:null},children(t){return t?Array.from(t.children):[]},text(t,e){if(e===void 0)return(t.textContent||"").trim();t.textContent=e},attr(t,e,n){if(n===void 0)return t.hasAttribute&&t.hasAttribute(e)?t.getAttribute(e):null;t.setAttribute(e,n)},removeAttr(t,e){t&&t.removeAttribute&&t.removeAttribute(e)},prop(t,e,n){if(n===void 0){let o=t?t[e]:void 0;return o!==void 0?o:null}t[e]=n},clone(t){return t.cloneNode(!0)},insertAt(t,e,n){let o=t.children[n]||null;t.insertBefore(e,o)},remove(t){t&&t.parentNode&&t.parentNode.removeChild(t)},replaceWith(t,e){if(!t||!t.parentNode)throw new Error("dom.replaceWith: node has no parent");let o=t.ownerDocument.createElement("template");o.innerHTML=e;let r=o.content.firstElementChild;if(!r)throw new Error("dom.replaceWith: html did not parse to an element");return t.parentNode.replaceChild(r,t),r},stripIds(t){let e=0;return t.id&&(t.removeAttribute("id"),e++),(t.querySelectorAll?t.querySelectorAll("[id]"):[]).forEach(o=>{o.removeAttribute("id"),e++}),e},sameNode(t,e){return t===e}},y=Nt;var P={extract:(t,e,n)=>g(y,t,e,n),apply:(t,e,n,o)=>T(y,t,e,n,o),findRulesIn:(t,e)=>x(y,t,e),findRules:(t,e)=>V(y,t,e),bind:(t,e,n)=>rt(y,t,e,n),parseStrict:J,parseRelaxed:D,errors:j,DOM_PROPERTIES:C},F=t=>!!t&&typeof t.nodeType=="number";function ot(t){let e=t&&t.ownerDocument?t.ownerDocument:t,n=y.find(e,"script[data-rules-name]",{includeRulesTag:!0});if(n.length===0)throw new Error('hyper-html-api: no rules tag found. Add <script type="application/json" data-rules-name="\u2026" data-rules-version="1"> or pass rules.');if(n.length>1)throw new Error('hyper-html-api: multiple rules tags found; pass a name, e.g. extractData("api").');return x(y,e).rules}function G(t,e){let n=F(t)?t:document,o=F(t)?e:t;return o===void 0?g(y,n,ot(n)):P.bind(n,o).get()}function X(t,e,n){if(!F(t))throw new Error("hyper-html-api: applyData(root, data, source?) needs a DOM root as the first argument.");return n===void 0?T(y,t,ot(t),e):P.bind(t,n).set(e),t}var bt={engine:P,extractData:G,applyData:X},It=bt;return at(wt);})();
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var HyperHtmlApi=(()=>{var
|
|
2
|
-
`)?{type:"textarea"}:{type:"text"}}function Ht(e,t){if(!t||e==="."||e===""||e.startsWith("@"))return null;let n=e.includes("@")?e.split("@")[0]:e;if(!n)return null;try{return t.querySelector(n)}catch{return null}}function Pt(e){if(e.type==="textarea")return document.createElement("textarea");if(e.type==="select")return document.createElement("select");let t=document.createElement("input");return t.type=e.type==="checkbox"?"checkbox":e.type==="number"?"number":"text",t}function de(e){return typeof e=="number"?`#${e+1}`:String(e).replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/^\w/,t=>t.toUpperCase())}function Dt(e){return` \xB7 ${e}`}var et={includeClasses:!0,includeAttributes:["href","src","name","type","role","aria-label","alt","title"],excludeAttributePrefixes:["data-morph-","data-hyper-","data-im-"],textHintLength:64,excludeIds:!0,maxPathDepth:4,landmarks:["HEADER","NAV","MAIN","ASIDE","FOOTER","SECTION","ARTICLE"],weights:{signature:100,pathSegment:10,textMatch:20,textMismatch:25,uniqueCandidate:50,positionPenalty:1,slotMatch:30},minConfidence:101};function _t(e){let t=5381;for(let n=0;n<e.length;n++)t=(t<<5)+t^e.charCodeAt(n);return Math.abs(t).toString(36)}function jt(e){if(e.classList&&e.classList.length>0)return Array.from(e.classList).sort().join(" ");let t=e.getAttribute?.("class");return t?t.split(/\s+/).filter(Boolean).sort().join(" "):""}function $t(e,t){let n=[];for(let r of e.attributes||[]){let o=r.name;o==="id"||o==="class"||t.excludeAttributePrefixes.some(i=>o.startsWith(i))||t.includeAttributes.includes(o)&&n.push(`${o}=${r.value}`)}return n.sort().join("|")}function Bt(e,t){return(e.textContent||"").replace(/\s+/g," ").trim().slice(0,t.textHintLength)}function Ft(e,t){let n=[e.tagName];return t.includeClasses&&n.push(jt(e)),n.push($t(e,t)),_t(n.join("|"))}function Ut(e){let t=e.tagName,n=1,r=e.previousElementSibling;for(;r;)r.tagName===t&&n++,r=r.previousElementSibling;return n}function Wt(e,t){return e.id||e.getAttribute?.("role")?!0:t.landmarks.includes(e.tagName)}function qt(e){if(e.id)return`#${e.id}`;let t=e.getAttribute?.("role");return t?`@${t}`:e.tagName}function Vt(e,t){let n=[],r=e;for(;r&&r.tagName&&n.length<t.maxPathDepth;){let o=`${r.tagName}:${Ut(r)}`;if(n.unshift(o),r!==e&&Wt(r,t)){n.unshift(qt(r));break}r=r.parentElement}return n}function Kt(e,t){let n=0,r=e.length-1,o=t.length-1;for(;r>=0&&o>=0&&e[r]===t[o];)n++,r--,o--;return n}function $(e,t,n){if(n.has(e))return n.get(e);let r={signature:Ft(e,t),path:Vt(e,t),textHint:Bt(e,t)};return n.set(e,r),r}function ot(e,t,n,r){if(r.has(e))return r.get(e);let o=new Map,i=e.querySelectorAll("*"),u=0;for(let s of i){let a=$(s,t,n);a.domIndex=u++,o.has(a.signature)||o.set(a.signature,[]),o.get(a.signature).push(s)}return r.set(e,o),o}function zt(e,t,n){n.delete(e),t.delete(e);let r=e.querySelectorAll("*");for(let o of r)t.delete(o)}function Ne(e,t,n,r,o){let i=$(e,n,r),u=$(t,n,r),s=n.weights,a={},M=0;if(i.signature!==u.signature)return{score:0,breakdown:{rejected:"signature mismatch"}};M+=s.signature,a.signature=s.signature;let b=Kt(i.path,u.path)*s.pathSegment;M+=b,a.path=b;let h=!0;if(i.textHint&&u.textHint?i.textHint===u.textHint?(M+=s.textMatch,a.text=s.textMatch):(M-=s.textMismatch,a.text=-s.textMismatch,h=!1):i.textHint!==u.textHint&&(M-=s.textMismatch,a.text=-s.textMismatch,h=!1),o.candidateCount===1&&h&&(M+=s.uniqueCandidate,a.unique=s.uniqueCandidate),typeof i.domIndex=="number"&&typeof u.domIndex=="number"){let R=Math.abs(i.domIndex-u.domIndex),N=Math.min(R*s.positionPenalty,20);M-=N,a.drift=-N}return{score:M,breakdown:a}}function tt(e,t,n,r,o){if(n.excludeIds&&e.id)return null;let i=ot(t,n,r,o),u=$(e,n,r);if(typeof u.domIndex!="number"){let h=0,R=e.previousElementSibling;for(;R;)h++,R=R.previousElementSibling;u.domIndex=h}let s=i.get(u.signature)||[],a=n.excludeIds?s.filter(h=>!h.id):s;if(a.length===0)return null;let M=null,w=0,b=null;for(let h of a){let{score:R,breakdown:N}=Ne(e,h,n,r,{candidateCount:a.length});R>w&&(w=R,M=h,b=N)}return w<n.minConfidence?null:{element:M,confidence:w,breakdown:b}}function Jt(e,t,n,r){let o=[],i=n.weights.signature+n.weights.slotMatch,u={slot:i};function s(b){if(b.children)return b.children;let h=b.childNodes;if(!h)return[];let R=[];for(let N=0;N<h.length;N++)h[N].nodeType===1&&R.push(h[N]);return R}function a(b,h){let R=s(b),N=s(h);if(R.length===N.length)for(let k=0;k<R.length;k++){let m=R[k],O=N[k];if(n.excludeIds&&(m.id||O.id)||m.tagName!==O.tagName)continue;let x=$(m,n,r).signature,S=$(O,n,r).signature;x!==S&&o.push({newEl:m,oldEl:O,score:i,breakdown:u}),a(m,O)}}function M(b,h){for(;;){if(b.tagName===h.tagName)return[b,h];let R=s(b);if(!b.tagName&&R.length===1){b=R[0];continue}let N=s(h);if(N.length===1&&N[0].tagName===b.tagName){h=N[0];continue}return null}}let w=M(e,t);return w&&a(w[0],w[1]),o}function nt(e,t,n,r,o){let i=t.querySelectorAll("*"),u=ot(e,n,r,o),s=0;for(let b of i){let h=$(b,n,r);h.domIndex=s++}let a=[];for(let b of i){if(n.excludeIds&&b.id)continue;let h=$(b,n,r),R=u.get(h.signature)||[],N=n.excludeIds?R.filter(k=>!k.id):R;for(let k of N){let{score:m,breakdown:O}=Ne(b,k,n,r,{candidateCount:N.length});m>=n.minConfidence&&a.push({newEl:b,oldEl:k,score:m,breakdown:O})}}if(n.weights.slotMatch>0){let b=Jt(t,e,n,r);for(let h of b)a.push(h)}a.sort((b,h)=>h.score-b.score);let M=new Map,w=new Set;for(let{newEl:b,oldEl:h}of a)M.has(b)||w.has(h)||(M.set(b,h),w.add(h));return M}function rt(e,t,n,r){let o=$(e,n,r),i=$(t,n,r),{score:u,breakdown:s}=Ne(e,t,n,r,{candidateCount:1});return{matches:u>=n.minConfidence,score:u,breakdown:s,newMeta:{signature:o.signature,path:o.path,textHint:o.textHint},oldMeta:{signature:i.signature,path:i.path,textHint:i.textHint}}}function it(e={}){let t={...et,...e,weights:{...et.weights,...e.weights}},n=new WeakMap,r=new WeakMap;return{findMatch:(o,i)=>tt(o,i,t,n,r),computeMatches:(o,i)=>nt(o,i,t,n,r),explain:(o,i)=>rt(o,i,t,n),invalidate:o=>zt(o,n,r),session:()=>{let o=new WeakMap,i=new WeakMap;return{findMatch:(u,s)=>tt(u,s,t,o,i),computeMatches:(u,s)=>nt(u,s,t,o,i),explain:(u,s)=>rt(u,s,t,o)}},getConfig:()=>({...t})}}var Yt=it(),Oe=function(){"use strict";let e=()=>{};function t(m){if(!(m instanceof Element))return!1;if(m.hasAttribute("save-ignore"))return!0;if(m.tagName==="LINK"||m.tagName==="SCRIPT"){let O=m.getAttribute("src")||m.getAttribute("href")||"";if(O.startsWith("chrome-extension://")||O.startsWith("moz-extension://")||O.startsWith("safari-web-extension://"))return!0}return!1}function n(m,O){if(O!=="smart")return m.outerHTML;let x=m.getAttribute("src"),S=m.getAttribute("type")||"text/javascript";if(x)try{let v=new URL(x,window.location.href);return`ext:${S}:${v.origin}${v.pathname}${v.search}`}catch{return`ext:${S}:${x}`}else{let v=m.textContent.trim(),E=5381;for(let d=0;d<v.length;d++)E=(E<<5)+E^v.charCodeAt(d);return`inline:${S}:${Math.abs(E).toString(36)}`}}let r={morphStyle:"outerHTML",callbacks:{beforeNodeAdded:e,afterNodeAdded:e,beforeNodeMorphed:e,afterNodeMorphed:e,beforeNodeRemoved:e,afterNodeRemoved:e,beforeAttributeUpdated:e},head:{style:"merge",shouldPreserve:m=>m.getAttribute("im-preserve")==="true",shouldReAppend:m=>m.getAttribute("im-re-append")==="true",shouldRemove:e,afterHeadMorphed:e},scripts:{handle:!1,matchMode:"outerHTML",shouldPreserve:m=>m.getAttribute("im-preserve")==="true",shouldReAppend:m=>m.getAttribute("im-re-append")==="true",shouldRemove:e,afterScriptsHandled:e},restoreFocus:!0},o={computeMatches(m,O){let{computeMatches:x}=Yt.session();return x(m,O)}};function i(m,O,x={}){m=N(m);let S=k(O),v=R(m,S,x),E=v.scripts.matchMode,d=new Set(Array.from(m.querySelectorAll("script")).map(l=>n(l,E))),y=s(v,()=>w(v,m,S,l=>l.morphStyle==="innerHTML"?(a(l,m,S),Array.from(m.childNodes)):u(l,m,S)));v.pantry.remove();let c=h(m,d,v);return c.length>0?y instanceof Promise?y.then(l=>Promise.all(c).then(()=>l)):Promise.all(c).then(()=>y):y}function u(m,O,x){let S=k(O);return a(m,S,x,O,O.nextSibling),Array.from(S.childNodes)}function s(m,O){if(!m.config.restoreFocus)return O();let x=document.activeElement;if(!(x instanceof HTMLInputElement||x instanceof HTMLTextAreaElement))return O();let{id:S,selectionStart:v,selectionEnd:E}=x,d=O();return S&&S!==document.activeElement?.getAttribute("id")&&(x=m.target.querySelector(`[id="${S}"]`),x?.focus()),x&&!x.selectionEnd&&E!=null&&x.setSelectionRange(v,E),d}let a=function(){function m(c,l,p,f=null,g=null){l instanceof HTMLTemplateElement&&p instanceof HTMLTemplateElement&&(l=l.content,p=p.content),f||=l.firstChild;for(let A of p.childNodes){if(t(A))continue;if(f&&f!=g){let I=x(c,A,f,g);if(I){I!==f&&v(c,f,I),M(I,A,c),f=I.nextSibling;continue}}if(A instanceof Element){let I=A.getAttribute("id");if(c.persistentIds.has(I)){let L=E(l,I,f,c);M(L,A,c),f=L.nextSibling;continue}if(!c.idMap.has(A)){let L=c.hyperMatches.get(A);if(L&&!c.idMap.has(L)){y(l,L,f),M(L,A,c),f=L.nextSibling;continue}}}let T=O(l,A,f,c);T&&(f=T.nextSibling)}for(;f&&f!=g;){let A=f;f=f.nextSibling,t(A)||S(c,A)}}function O(c,l,p,f){if(f.callbacks.beforeNodeAdded(l)===!1)return null;if(f.idMap.has(l)){let g=document.createElement(l.tagName);return c.insertBefore(g,p),M(g,l,f),f.callbacks.afterNodeAdded(g),g}else{let g=document.importNode(l,!0);return c.insertBefore(g,p),f.callbacks.afterNodeAdded(g),g}}let x=function(){function c(f,g,A,T){let I=g instanceof Element&&!f.idMap.has(g)?f.hyperMatches.get(g):null,L=null,j=g.nextSibling,G=0,C=A;for(;C&&C!=T;){if(p(C,g)){if(l(f,C,g)||C===I&&!f.idMap.has(C))return C;if(L===null){let V=C instanceof Element&&f.hyperMatchedOldElements.has(C);!f.idMap.has(C)&&!V&&(L=C)}}if(L===null&&j&&p(C,j)&&(G++,j=j.nextSibling,G>=2&&(L=void 0)),f.activeElementAndParents.includes(C))break;C=C.nextSibling}return L||null}function l(f,g,A){let T=f.idMap.get(g),I=f.idMap.get(A);if(!I||!T)return!1;for(let L of T)if(I.has(L))return!0;return!1}function p(f,g){let A=f,T=g;return A.nodeType===T.nodeType&&A.tagName===T.tagName&&(!A.getAttribute?.("id")||A.getAttribute?.("id")===T.getAttribute?.("id"))}return c}();function S(c,l){let p=l instanceof Element&&c.hyperMatchedOldElements.has(l)&&!c.idMap.has(l);if(c.idMap.has(l)||p)y(c.pantry,l,null);else{if(c.callbacks.beforeNodeRemoved(l)===!1)return;l.parentNode?.removeChild(l),c.callbacks.afterNodeRemoved(l)}}function v(c,l,p){let f=l;for(;f&&f!==p;){let g=f;f=f.nextSibling,t(g)||S(c,g)}return f}function E(c,l,p,f){let g=f.target.getAttribute?.("id")===l&&f.target||f.target.querySelector(`[id="${l}"]`)||f.pantry.querySelector(`[id="${l}"]`);return d(g,f),y(c,g,p),g}function d(c,l){let p=c.getAttribute("id");for(;c=c.parentNode;){let f=l.idMap.get(c);f&&(f.delete(p),f.size||l.idMap.delete(c))}}function y(c,l,p){if(c.moveBefore)try{c.moveBefore(l,p)}catch{c.insertBefore(l,p)}else c.insertBefore(l,p)}return m}(),M=function(){function m(d,y,c){return c.ignoreActive&&d===document.activeElement?null:(c.callbacks.beforeNodeMorphed(d,y)===!1||(d instanceof HTMLHeadElement&&c.head.ignore||(d instanceof HTMLHeadElement&&c.head.style!=="morph"?b(d,y,c):(O(d,y,c),E(d,c)||a(c,d,y))),c.callbacks.afterNodeMorphed(d,y)),d)}function O(d,y,c){let l=y.nodeType;if(l===1){let p=d,f=y,g=p.attributes,A=f.attributes;for(let T of A)v(T.name,p,"update",c)||p.getAttribute(T.name)!==T.value&&p.setAttribute(T.name,T.value);for(let T=g.length-1;0<=T;T--){let I=g[T];if(I&&!f.hasAttribute(I.name)){if(v(I.name,p,"remove",c))continue;p.removeAttribute(I.name)}}E(p,c)||x(p,f,c)}(l===8||l===3)&&d.nodeValue!==y.nodeValue&&(d.nodeValue=y.nodeValue)}function x(d,y,c){if(d instanceof HTMLInputElement&&y instanceof HTMLInputElement&&y.type!=="file"){let l=y.value,p=d.value;S(d,y,"checked",c),S(d,y,"disabled",c),c.formStateSync==="property"?p!==l&&(v("value",d,"update",c)||(d.value=l)):y.hasAttribute("value")?p!==l&&(v("value",d,"update",c)||(d.setAttribute("value",l),d.value=l)):v("value",d,"remove",c)||(d.value="",d.removeAttribute("value"))}else if(d instanceof HTMLOptionElement&&y instanceof HTMLOptionElement)S(d,y,"selected",c);else if(d instanceof HTMLTextAreaElement&&y instanceof HTMLTextAreaElement){let l=y.value,p=d.value;if(v("value",d,"update",c))return;l!==p&&(d.value=l),d.firstChild&&d.firstChild.nodeValue!==l&&(d.firstChild.nodeValue=l)}}function S(d,y,c,l){let p=y[c],f=d[c];if(p!==f){let g=v(c,d,"update",l);if(g||(d[c]=y[c]),l.formStateSync==="property")return;p?g||d.setAttribute(c,""):v(c,d,"remove",l)||d.removeAttribute(c)}}function v(d,y,c,l){return d==="value"&&l.ignoreActiveValue&&y===document.activeElement?!0:l.callbacks.beforeAttributeUpdated(d,y,c)===!1}function E(d,y){return!!y.ignoreActiveValue&&d===document.activeElement&&d!==document.body}return m}();function w(m,O,x,S){if(m.head.block){let v=O.querySelector("head"),E=x.querySelector("head");if(v&&E){let d=b(v,E,m);return Promise.all(d).then(()=>{let y=Object.assign(m,{head:{block:!1,ignore:!0}});return S(y)})}}return S(m)}function b(m,O,x){let S=[],v=[],E=[],d=[],y=x.scripts.matchMode,c=f=>{if(f.tagName==="SCRIPT")return n(f,y);if(f.tagName==="LINK"&&y==="smart"){let g=f.getAttribute("href");if(g)try{let A=new URL(g,window.location.href);return`link:${f.getAttribute("rel")||""}:${A.origin}${A.pathname}${A.search}`}catch{}}return f.outerHTML},l=new Map;for(let f of O.children)t(f)||l.set(c(f),f);for(let f of m.children){let g=c(f),A=l.has(g),T=x.head.shouldReAppend(f),I=x.head.shouldPreserve(f);A||I?T?v.push(f):(l.delete(g),E.push(f)):x.head.style==="append"?T&&(v.push(f),d.push(f)):x.head.shouldRemove(f)!==!1&&!t(f)&&v.push(f)}d.push(...l.values());let p=[];for(let f of d){let g=document.createRange().createContextualFragment(f.outerHTML).firstChild;if(x.callbacks.beforeNodeAdded(g)!==!1){if("href"in g&&g.href||"src"in g&&g.src){let A,T=new Promise(function(I){A=I});g.addEventListener("load",function(){A()}),p.push(T)}m.appendChild(g),x.callbacks.afterNodeAdded(g),S.push(g)}}for(let f of v)x.callbacks.beforeNodeRemoved(f)!==!1&&(m.removeChild(f),x.callbacks.afterNodeRemoved(f));return x.head.afterHeadMorphed(m,{added:S,kept:E,removed:v}),p}function h(m,O,x){if(!x.scripts.handle)return[];let S=[],v=[],E=[],d=[],y=x.scripts.matchMode,c=Array.from(m.querySelectorAll("script"));for(let p of c){let f=n(p,y),g=O.has(f),A=x.scripts.shouldPreserve(p),T=x.scripts.shouldReAppend(p);g||A?T?(v.push(p),d.push(p)):E.push(p):d.push(p)}for(let p of O){let f=c.some(g=>g.outerHTML===p)}let l=[];for(let p of d){if(x.callbacks.beforeNodeAdded(p)===!1)continue;let f=document.createRange().createContextualFragment(p.outerHTML).firstChild;if(f.src){let g,A=new Promise(function(T){g=T});f.addEventListener("load",function(){g()}),f.addEventListener("error",function(){g()}),l.push(A)}p.replaceWith(f),x.callbacks.afterNodeAdded(f),S.push(f)}return x.scripts.afterScriptsHandled(m,{added:S,kept:E,removed:v}),l}let R=function(){function m(c,l,p){let{persistentIds:f,idMap:g}=d(c,l),A=o.computeMatches(c,l);if(typeof p.key=="function"){let j=new Map,G=new Set,C=H=>{let P=p.key(H);P!=null&&(j.has(P)?G.add(P):j.set(P,H))};c instanceof Element&&C(c);for(let H of c.querySelectorAll("*"))C(H);for(let H of G)j.delete(H);let V=new Map;for(let[H,P]of A)V.set(P,H);let Ae=l.__hyperMorphRoot||l,ce=new Map,Je=new Set,Ye=H=>{let P=p.key(H);P!=null&&(ce.has(P)?Je.add(P):ce.set(P,H))};Ae instanceof Element&&Ye(Ae);for(let H of Ae.querySelectorAll("*"))Ye(H);for(let H of Je)ce.delete(H);for(let[H,P]of ce){let K=j.get(H);if(!K||K.tagName!==P.tagName)continue;let Me=V.get(K);Me&&Me!==P&&A.delete(Me);let Ee=A.get(P);Ee&&Ee!==K&&V.delete(Ee),A.set(P,K),V.set(K,P)}}let T=new Set;for(let j of A.values())T.add(j);let I=O(p),L=I.morphStyle||"outerHTML";if(!["innerHTML","outerHTML"].includes(L))throw`Do not understand how to morph style ${L}`;return{target:c,newContent:l,config:I,morphStyle:L,ignoreActive:I.ignoreActive,ignoreActiveValue:I.ignoreActiveValue,restoreFocus:I.restoreFocus,formStateSync:I.formStateSync||"attribute",idMap:g,persistentIds:f,hyperMatches:A,hyperMatchedOldElements:T,pantry:x(),activeElementAndParents:S(c),callbacks:I.callbacks,head:I.head,scripts:I.scripts}}function O(c){let l=Object.assign({},r);return Object.assign(l,c),l.callbacks=Object.assign({},r.callbacks,c.callbacks),l.head=Object.assign({},r.head,c.head),l.scripts=Object.assign({},r.scripts,c.scripts),l}function x(){let c=document.createElement("div");return c.hidden=!0,document.body.insertAdjacentElement("afterend",c),c}function S(c){let l=[],p=document.activeElement;if(p?.tagName!=="BODY"&&c.contains(p))for(;p&&(l.push(p),p!==c);)p=p.parentElement;return l}function v(c){let l=Array.from(c.querySelectorAll("[id]"));return c.getAttribute?.("id")&&l.push(c),l}function E(c,l,p,f){for(let g of f){let A=g.getAttribute("id");if(l.has(A)){let T=g;for(;T;){let I=c.get(T);if(I==null&&(I=new Set,c.set(T,I)),I.add(A),T===p)break;T=T.parentElement}}}}function d(c,l){let p=v(c),f=v(l),g=y(p,f),A=new Map;E(A,g,c,p);let T=l.__hyperMorphRoot||l;return E(A,g,T,f),{persistentIds:g,idMap:A}}function y(c,l){let p=new Set,f=new Map;for(let{id:A,tagName:T}of c)f.has(A)?p.add(A):f.set(A,T);let g=new Set;for(let{id:A,tagName:T}of l)g.has(A)?p.add(A):f.get(A)===T&&g.add(A);for(let A of p)g.delete(A);return g}return m}(),{normalizeElement:N,normalizeParent:k}=function(){let m=new WeakSet;function O(E){return E instanceof Document?E.documentElement:E}function x(E){if(E==null)return document.createElement("div");if(typeof E=="string")return x(v(E));if(m.has(E))return E;if(E instanceof Node){if(E.parentNode)return new S(E);{let d=document.createElement("div");return d.append(E),d}}else{let d=document.createElement("div");for(let y of[...E])d.append(y);return d}}class S{constructor(d){this.originalNode=d,this.realParentNode=d.parentNode,this.previousSibling=d.previousSibling,this.nextSibling=d.nextSibling}get childNodes(){let d=[],y=this.previousSibling?this.previousSibling.nextSibling:this.realParentNode.firstChild;for(;y&&y!=this.nextSibling;)d.push(y),y=y.nextSibling;return d}querySelectorAll(d){return this.childNodes.reduce((y,c)=>{if(c instanceof Element){c.matches(d)&&y.push(c);let l=c.querySelectorAll(d);for(let p=0;p<l.length;p++)y.push(l[p])}return y},[])}insertBefore(d,y){return this.realParentNode.insertBefore(d,y)}moveBefore(d,y){return this.realParentNode.moveBefore(d,y)}get __hyperMorphRoot(){return this.originalNode}}function v(E){let d=new DOMParser,y=E.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim,"");if(y.match(/<\/html>/)||y.match(/<\/head>/)||y.match(/<\/body>/)){let c=d.parseFromString(E,"text/html");if(y.match(/<\/html>/))return m.add(c),c;{let l=c.firstChild;return l&&m.add(l),l}}else{let l=d.parseFromString("<body><template>"+E+"</template></body>","text/html").body.querySelector("template").content;return m.add(l),l}}return{normalizeElement:O,normalizeParent:x}}();return{morph:i,defaults:r}}();var Ln=Oe.morph,Cn=Oe.defaults,st=Oe;function Ie(e,t,{onWidgetRemoved:n}={}){st.morph(e,t,{morphStyle:"innerHTML",ignoreActiveValue:!0,restoreFocus:!0,formStateSync:"property",callbacks:{beforeNodeRemoved(r){let o=fe.get(r);o?.destroy&&o.destroy(),n?.(r)}}})}var pe={};xe(pe,{EmptyListInsert:()=>ee,MAX_RULE_DEPTH:()=>Y,MaxRuleDepthExceeded:()=>q,RuleTargetReadOnly:()=>te,RulesParseError:()=>J,ShapeMismatch:()=>Z,UnknownRulesVersion:()=>X,UpgradeAlreadyRegistered:()=>ne});var J=class extends Error{constructor(t,n){super(t),this.name="RulesParseError",this.cause=n}},X=class extends Error{constructor(t){super(`unknown rules version: ${t}. Library supports "1".`),this.name="UnknownRulesVersion",this.version=t}},Y=20,q=class extends Error{constructor(t){super(`rule depth exceeded ${Y} at path: ${t.join(".")}`),this.name="MaxRuleDepthExceeded",this.path=t}},Z=class extends Error{constructor(t){super(`shape mismatch: ${t.length} field(s) failed validation`),this.name="ShapeMismatch",this.mismatches=t}},ee=class extends Error{constructor(t){super(`cannot add items to empty list at "${t.join(".")}" \u2014 no sibling to clone as template. Seed the list with a hidden item first.`),this.name="EmptyListInsert",this.path=t}},te=class extends Error{constructor(t){super(`cannot write to read-only DOM property "${t}"`),this.name="RuleTargetReadOnly",this.target=t}},ne=class extends Error{constructor(){super("upgrade transform already registered; only one registration is allowed per page."),this.name="UpgradeAlreadyRegistered"}};var ke=null;function Le(e){if(typeof e!="function")throw new TypeError("registerUpgrade expects a function (v1Data) => v2Data");if(ke)throw new ne;ke=e}function he(){return ke}function re(e,t){let n={carriedOver:0,discarded:0,listItems:0},r=Ce(t,e,n);return He(t,e,n),{data:r,summary:n}}function Ce(e,t,n){if(typeof e=="string")return e.endsWith("[]")?Array.isArray(t)?(n.listItems+=t.length,n.carriedOver+=t.length,t):void 0:t==null?void 0:(n.carriedOver++,t);if(Array.isArray(e)){let[,r]=e;return Array.isArray(t)?(n.listItems+=t.length,t.map(o=>Ce(r,o,n))):void 0}if(typeof e=="object"&&e!==null){let r={};for(let[o,i]of Object.entries(e)){let u=Ce(i,t?.[o],n);u!==void 0&&(r[o]=u)}return r}}function He(e,t,n){if(t!=null){if(typeof e=="object"&&e!==null&&!Array.isArray(e)){if(typeof t!="object"||Array.isArray(t))return;let r=new Set(Object.keys(e));for(let o of Object.keys(t))r.has(o)?He(e[o],t[o],n):n.discarded+=me(t[o]);return}if(Array.isArray(e)&&Array.isArray(t)){let r=e[1];t.forEach(o=>He(r,o,n));return}typeof e=="string"&&!e.endsWith("[]")&&typeof t=="object"&&t!==null&&(n.discarded+=me(t))}}function me(e){return e==null?0:Array.isArray(e)?e.reduce((t,n)=>t+me(n),0):typeof e=="object"?Object.values(e).reduce((t,n)=>t+me(n),0):1}async function Pe({sourceUrl:e,v1Data:t,v1Version:n=null,parent:r=typeof window<"u"?window:null,timeoutMs:o=15e3,hidden:i=!0}={}){if(!r)throw new Error("upgrade.run requires a window context");if(!e)throw new Error("upgrade.run requires sourceUrl");let u=Qt(e,r.location.origin),s=new URL(u,r.location.href).origin,a=r.document.createElement("iframe");i&&(a.style.cssText="position:absolute;left:-9999px;top:-9999px;width:1px;height:1px;border:0;"),a.setAttribute("aria-hidden","true"),a.src=u,r.document.body.appendChild(a);let M=()=>{};try{return await new Promise((w,b)=>{let h=setTimeout(()=>{b(new Error(`upgrade.run: helper iframe timed out after ${o}ms`))},o),R=N=>{if(N.source!==a.contentWindow||N.origin!==s)return;let k=N.data;if(!(!k||typeof k!="object")){if(k.type==="hha:upgrade-ready"){a.contentWindow.postMessage({type:"hha:upgrade-data",v1Data:t,v1Version:n},s);return}if(k.type==="hha:upgrade-result"){clearTimeout(h),w({html:k.html,summary:k.summary});return}if(k.type==="hha:upgrade-error"){clearTimeout(h);let m=new Error(k.message||"helper error");m.name=k.name||"UpgradeHelperError",b(m);return}}};r.addEventListener("message",R),M=()=>{r.removeEventListener("message",R),clearTimeout(h),a.parentNode&&a.parentNode.removeChild(a)}})}finally{M()}}function Qt(e,t){let n=new URL(e,typeof location<"u"?location.href:void 0);return n.searchParams.set("_hyperHtmlApi","upgrade-helper"),n.searchParams.set("parentOrigin",t),n.toString()}function De(e){try{return JSON.parse(e)}catch(t){throw new J(`Invalid strict JSON: ${t.message}`,t)}}function oe(e){try{return JSON.parse(e)}catch{}let t={BRACE_OPEN:"{",BRACE_CLOSE:"}",BRACKET_OPEN:"[",BRACKET_CLOSE:"]",COLON:":",COMMA:",",STRING:"STRING",SELECTOR:"SELECTOR",IDENTIFIER:"IDENTIFIER",NUMBER:"NUMBER",BOOLEAN:"BOOLEAN"};function n(o){let i=[],u=0;for(;u<o.length;){let s=o[u];if(/\s/.test(s)){u++;continue}if("{}".includes(s)){i.push({type:s,value:s}),u++;continue}if(s==="["){let b=!1,h=u+1;for(;h<o.length&&/\s/.test(o[h]);)h++;if(h<o.length&&/[a-zA-Z_]/.test(o[h])&&(b=!0),!b){i.push({type:s,value:s}),u++;continue}}if(s==="]"){i.push({type:s,value:s}),u++;continue}if(s===":"){i.push({type:t.COLON,value:s}),u++;continue}if(s===","){i.push({type:t.COMMA,value:s}),u++;continue}if(s==='"'||s==="'"){let b=s,h=u+1;for(;h<o.length&&o[h]!==b;)o[h]==="\\"&&h++,h++;i.push({type:t.STRING,value:o.substring(u+1,h),quoted:!0,sourceQuote:b}),u=h+1;continue}let a=u,M;for(;a<o.length&&!/[{},]/.test(o[a]);)if(o[a]===":"){let b=[":first",":last",":nth-child",":nth-of-type",":first-child",":last-child",":first-of-type",":last-of-type",":only-child",":only-of-type",":hover",":focus",":active",":visited",":disabled",":enabled",":checked",":empty",":root",":target",":not",":before",":after",":nth-last-child",":nth-last-of-type"],h=!1;for(let R of b){let N=R.substring(1);if(o.substring(a+1,a+1+N.length)===N){h=!0,a+=N.length;break}}if(!h)break}else if(o[a]==="["){for(a++;a<o.length&&o[a]!=="]";){if(o[a]==='"'||o[a]==="'"){let b=o[a];for(a++;a<o.length&&o[a]!==b;)o[a]==="\\"&&a++,a++}a++}a<o.length&&o[a]==="]"&&a++}else a++;M=o.substring(u,a);let w=t.IDENTIFIER;/^-?\d+(\.\d+)?$/.test(M)?w=t.NUMBER:M==="true"||M==="false"||M==="null"?w=t.BOOLEAN:/^[.#@\[]|[.#@\[]| /.test(M)&&(w=t.SELECTOR),i.push({type:w,value:M,quoted:!1}),u=a}return i}function r(o){let i="";for(let u=0;u<o.length;u++){let s=o[u];if("{}".includes(s.type)||"[]".includes(s.type)){i+=s.value;continue}if(s.type===t.COLON){i+=s.value;continue}if(s.type===t.COMMA){let a=o[u+1];if(a&&(a.type==="}"||a.type==="]"))continue;i+=s.value;continue}if(s.type===t.STRING&&s.quoted){let a=s.value;s.sourceQuote==="'"&&(a=a.replace(/\\'/g,"'"),a=a.replace(/(\\*)"/g,(M,w)=>w.length%2===0?w+'\\"':M)),i+=`"${a}"`;continue}if(s.type===t.NUMBER||s.type===t.BOOLEAN){i+=s.value;continue}if(s.type===t.SELECTOR||s.type===t.IDENTIFIER){i+=`"${s.value}"`;continue}i+=`"${s.value}"`}return i}try{let o=n(e),i=r(o);return JSON.parse(i)}catch(o){throw new J("Invalid extraction rules syntax: "+o.message,o)}}var Xt="1",at=/^[a-zA-Z0-9_-]+$/;function U(e,t,n){let r;if(n===void 0)r="script[data-rules-name]";else{if(typeof n!="string"||!at.test(n))throw new Error(`hyper-html-api: invalid rules token ${JSON.stringify(n)} (must match ${at})`);r=`script[data-rules-name~="${n}"]`}let o=e.find(t,r,{includeRulesTag:!0});if(o.length===0)return null;n!==void 0&&o.length>1&&console.warn(`hyper-html-api: ${o.length} rules tags match data-rules-name~="${n}"; using the first.`);let i=o[0],u=e.attr(i,"data-rules-version");if(u!==Xt)throw new X(u);return{rules:oe(e.text(i)),tagNode:i}}var ge=["textContent","innerText","innerHTML","outerHTML","value","checked","selected","disabled","readOnly","type","tagName","nodeName","nodeType","nodeValue","childElementCount","id","className","classList","baseURI","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","dataset","currentSrc","duration","paused","title","documentURI","contentType"],_e=new Set(ge),ct=new Set(["textContent","innerText","innerHTML","value","checked","selected","disabled","readOnly","type","id","className","title"]),ut=new Set(["tagName","nodeName","nodeType","nodeValue","childElementCount","classList","baseURI","documentURI","contentType","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","currentSrc","duration","paused","dataset"]);function B(e,t,n,r={}){return je(e,t,n,{depth:0,path:[]},r)}function je(e,t,n,r,o){if(r.depth>Y)throw new q(r.path);if(typeof n=="string")return Zt(e,t,n,o);if(Array.isArray(n)){let[i,u]=n;return e.find(t,i,o).map((a,M)=>je(e,a,u,{depth:r.depth+1,path:[...r.path,M]},o))}if(typeof n=="object"&&n!==null){let i={};for(let[u,s]of Object.entries(n))i[u]=je(e,t,s,{depth:r.depth+1,path:[...r.path,u]},o);return i}return null}function Zt(e,t,n,r){if(n.endsWith("[]")){let i=n.slice(0,-2);return e.find(t,i,r).map(u=>e.text(u))}if(n.startsWith("@"))return lt(e,t,n.slice(1));if(n.includes("@")){let i=n.lastIndexOf("@"),u=n.slice(0,i),s=n.slice(i+1),a=u?e.find(t,u,r):[t];return a.length===0?null:lt(e,a[0],s)}if(n===".")return e.text(t);let o=e.find(t,n,r);return o.length===0?null:e.text(o[0])}function lt(e,t,n){if(_e.has(n)){let o=e.prop(t,n);return o==null?null:String(o)}let r=e.attr(t,n);return r||null}var en=.5;function $e(e,t,n,r,o,i,u,s={}){let a=e.find(t,n,s);if(o.length===0){a.forEach(S=>e.remove(S));return}let M=o.length>a.length,w=a[0]||null;if(M&&!w&&(w=sn(e,t,n,s),!w))throw new ee(i.path);let b=a.map(S=>tn(e,S,r,s)),h=null;if(w){h=e.clone(w),s.templateAttr&&e.removeAttr(h,s.templateAttr);let S=e.stripIds(h);S>0&&console.warn(`[hyper-html-api] stripped ${S} id attribute(s) from cloned template at "${i.path.join(".")||"(root)"}"`)}let R=nn(o,b,r),N=a[0]||w,k=e.parent(N),m=a.length>0?on(e,k,N):0,O=new Set,x=o.map((S,v)=>{let E=R[v];if(E>=0)return O.add(E),a[E];let d=e.clone(h);return e.stripIds(d),d});a.forEach((S,v)=>{O.has(v)||e.remove(S)}),x.forEach((S,v)=>{let E=m+v;e.children(k).findIndex(c=>e.sameNode(c,S))!==E&&e.insertAt(k,S,E)}),x.forEach((S,v)=>{if(r===null){let E=o[v],d=E==null?"":String(E);e.text(S)!==d&&e.text(S,d)}else{let E=u(e,S,r,o[v],{depth:i.depth+1,path:[...i.path,v]},s);E&&E!==S&&(x[v]=E)}})}function tn(e,t,n,r){return n===null?e.text(t):B(e,t,n,r)}function nn(e,t,n){let r=new Array(e.length).fill(-1),o=new Set;return e.forEach((i,u)=>{let s=-1,a=-1;t.forEach((M,w)=>{if(o.has(w))return;let b=rn(i,M,n),h=b===a&&s>=0?Math.abs(w-u)<Math.abs(s-u):!1;(b>a||h)&&(a=b,s=w)}),a>=en&&(r[u]=s,o.add(s))}),r}function rn(e,t,n){if(n===null)return e===t?1:0;let r=Object.keys(n||{});if(r.length===0)return 0;let o=0;for(let i of r)JSON.stringify(e?.[i])===JSON.stringify(t?.[i])&&o++;return o/r.length}function on(e,t,n){let r=e.children(t);for(let o=0;o<r.length;o++)if(e.sameNode(r[o],n))return o;return-1}function sn(e,t,n,r){if(!r.templateAttr)return null;let o=t;for(;o;){let i=e.find(o,n,{includeRulesTag:!1});for(let u of i)if(e.attr(u,r.templateAttr)!=null)return u;o=e.parent(o)}return null}var ft=new Set(["checked","selected","disabled","readOnly","paused"]);function W(e,t,n,r,o={}){let i=[];if(Be(n,r,[],i),i.length)throw new Z(i);ye(e,t,n,r,{depth:0,path:[]},o)}function ye(e,t,n,r,o,i={}){if(o.depth>Y)throw new q(o.path);if(r===void 0)return t;if(typeof n=="string")return an(e,t,n,r,o,i);if(Array.isArray(n)){let[u,s]=n;return $e(e,t,u,s,r,o,ye,i),t}if(typeof n=="object"&&n!==null){for(let[u,s]of Object.entries(n)){let a=ye(e,t,s,r==null?r:r[u],{depth:o.depth+1,path:[...o.path,u]},i);a&&a!==t&&(t=a)}return t}return t}function an(e,t,n,r,o,i){if(n.endsWith("[]")){let s=n.slice(0,-2);return $e(e,t,s,null,r,o,ye,i),t}if(n.startsWith("@"))return dt(e,t,n.slice(1),r);if(n.includes("@")){let s=n.lastIndexOf("@"),a=n.slice(0,s),M=n.slice(s+1),w=a?e.find(t,a,i):[t];return w.length===0||dt(e,w[0],M,r),t}if(n===".")return e.text(t,r==null?"":String(r)),t;let u=e.find(t,n,i);return u.length===0||e.text(u[0],r==null?"":String(r)),t}function dt(e,t,n,r){if(ut.has(n))throw new te(n);if(n==="outerHTML"){let o=r==null?"":String(r);return e.replaceWith(t,o)}return ct.has(n)?(e.prop(t,n,cn(n,r)),t):(e.attr(t,n,r==null?"":String(r)),t)}function cn(e,t){return t==null?ft.has(e)?!1:"":ft.has(e)?!!t:t}function Be(e,t,n,r){if(t!==void 0){if(typeof e=="string"){if(e.endsWith("[]")){Array.isArray(t)?t.forEach((o,i)=>{typeof o=="object"&&o!==null&&r.push({path:se([...n,i]),expected:"scalar",got:ie(o)})}):r.push({path:se(n),expected:"array",got:ie(t)});return}t!==null&&typeof t=="object"&&r.push({path:se(n),expected:"scalar",got:ie(t)});return}if(Array.isArray(e)){if(!Array.isArray(t)){r.push({path:se(n),expected:"array",got:ie(t)});return}let o=e[1];t.forEach((i,u)=>Be(o,i,[...n,u],r));return}if(typeof e=="object"&&e!==null){if(t===null||Array.isArray(t)||typeof t!="object"){r.push({path:se(n),expected:"object",got:ie(t)});return}for(let[o,i]of Object.entries(e))Be(i,t[o],[...n,o],r)}}}function ie(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function se(e){return e.join(".")}function un(e){return e&&e.nodeType===1&&e.tagName==="SCRIPT"&&e.hasAttribute&&e.hasAttribute("data-rules-name")}function ln(e){return e?(e.nodeType===9||e.nodeType===11,e):null}var fn={find(e,t,n={}){let r=ln(e);if(!r||!r.querySelectorAll)return[];let o=Array.from(r.querySelectorAll(t));n.includeRulesTag||(o=o.filter(u=>!un(u)));let i=[];if(n.skip&&i.push(n.skip),n.templateAttr&&i.push("["+n.templateAttr+"]"),i.length){let u=i.join(", ");o=o.filter(s=>!s.closest||!s.closest(u))}return o},parent(e){return e?e.parentElement:null},children(e){return e?Array.from(e.children):[]},text(e,t){if(t===void 0)return(e.textContent||"").trim();e.textContent=t},attr(e,t,n){if(n===void 0)return e.hasAttribute&&e.hasAttribute(t)?e.getAttribute(t):null;e.setAttribute(t,n)},removeAttr(e,t){e&&e.removeAttribute&&e.removeAttribute(t)},prop(e,t,n){if(n===void 0){let r=e?e[t]:void 0;return r!==void 0?r:null}e[t]=n},clone(e){return e.cloneNode(!0)},insertAt(e,t,n){let r=e.children[n]||null;e.insertBefore(t,r)},remove(e){e&&e.parentNode&&e.parentNode.removeChild(e)},replaceWith(e,t){if(!e||!e.parentNode)throw new Error("dom.replaceWith: node has no parent");let r=e.ownerDocument.createElement("template");r.innerHTML=t;let o=r.content.firstElementChild;if(!o)throw new Error("dom.replaceWith: html did not parse to an element");return e.parentNode.replaceChild(o,e),o},stripIds(e){let t=0;return e.id&&(e.removeAttribute("id"),t++),(e.querySelectorAll?e.querySelectorAll("[id]"):[]).forEach(r=>{r.removeAttribute("id"),t++}),t},sameNode(e,t){return e===t}},D=fn;var dn="_hyperHtmlApi",pn="upgrade-helper",hn="parentOrigin";function be(e=typeof location<"u"?location:null){if(!e)return!1;try{return new URLSearchParams(e.search).get(dn)===pn}catch{return!1}}function pt(e=typeof location<"u"?location:null){return e?new URLSearchParams(e.search).get(hn):null}function We({win:e,doc:t,parentOrigin:n}={}){if(e=e||(typeof window<"u"?window:null),t=t||(typeof document<"u"?document:null),!e||!t||(n=n||pt(e.location),!n))return;let r=()=>mn({win:e,doc:t,parentOrigin:n});t.readyState==="loading"?t.addEventListener("DOMContentLoaded",r,{once:!0}):r()}function mn({win:e,doc:t,parentOrigin:n}){let r;try{r=U(D,t.body)}catch(a){return Fe(e,n,a)}if(!r)return Fe(e,n,new Error("helper-mode: no rules tag in v2 document"));let o=r.rules,i=yn(t,"hyper-version"),u=!!he(),s=a=>{if(a.source!==e.parent||a.origin!==n)return;let M=a.data;if(!(!M||M.type!=="hha:upgrade-data")){e.removeEventListener("message",s);try{let w=gn({doc:t,rules:o,v1Data:M.v1Data});e.parent.postMessage({type:"hha:upgrade-result",html:w.html,summary:w.summary},n)}catch(w){Fe(e,n,w)}}};e.addEventListener("message",s),e.parent.postMessage({type:"hha:upgrade-ready",rules:o,version:i,hasTransform:u},n)}function gn({doc:e,rules:t,v1Data:n}){let r=he(),o=n,i=!1;r&&(o=r(n),i=!0);let{data:u,summary:s}=re(o,t);W(D,e.body,t,u);let a=B(D,e.body,t);return{html:`<!DOCTYPE html>
|
|
3
|
-
`+e.documentElement.outerHTML
|
|
1
|
+
var HyperHtmlApi=(()=>{var Te=Object.defineProperty;var Tt=Object.getOwnPropertyDescriptor;var Rt=Object.getOwnPropertyNames;var Ot=Object.prototype.hasOwnProperty;var Re=(e,t)=>{for(var n in t)Te(e,n,{get:t[n],enumerable:!0})},Nt=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Rt(t))!Ot.call(e,r)&&r!==n&&Te(e,r,{get:()=>t[r],enumerable:!(o=Tt(t,r))||o.enumerable});return e};var It=e=>Nt(Te({},"__esModule",{value:!0}),e);var On={};Re(On,{applyData:()=>Qe,cms:()=>vt,default:()=>Rn,engine:()=>pe,extractData:()=>Ze,upgrade:()=>wt});var ge={};Re(ge,{fromString:()=>me,getRuleAtPath:()=>Oe,getValueAtPath:()=>re,parseConfigKey:()=>Ct,setAtPath:()=>B,toConfigKey:()=>kt,toString:()=>_});function _(e){return e.map(String).join(".")}function kt(e){return e.map(t=>typeof t=="number"?"*":String(t)).join(".")}function Ct(e){return e===""?[]:e.split(".")}function me(e){return e===""?[]:e.split(".").map(t=>/^\d+$/.test(t)?Number(t):t)}function Oe(e,t){let n=e;for(let o of t){if(n==null||typeof n=="string")return;if(Array.isArray(n)){if(typeof o!="number"&&o!=="*")return;n=n[1];continue}if(typeof n=="object"){if(typeof o=="number"||!(o in n))return;n=n[o];continue}return}return n}function re(e,t){let n=e;for(let o of t){if(n==null)return;n=n[o]}return n}function B(e,t,n){if(t.length===0)return n;let[o,...r]=t;if(typeof o=="number"){let s=Array.isArray(e)?[...e]:[];return s[o]=B(s[o],r,n),s}return{...e&&typeof e=="object"?e:{},[o]:B((e||{})[o],r,n)}}function X(e){if(typeof e=="string")return e.endsWith("[]")?[]:"";if(Array.isArray(e))return[];if(typeof e=="object"&&e!==null){let t={};for(let[n,o]of Object.entries(e))t[n]=X(o);return t}return""}var ye=new WeakMap;var Lt=new Set(["checked","selected","disabled","readOnly","paused"]);function Ne({rules:e,data:t,appRoot:n,cmsRoot:o}){let r=document.createDocumentFragment(),s={rules:e,appRoot:n,cmsRoot:o};return r.appendChild(ke({rule:e,value:t,path:[],ctx:s})),r}function Ie(e,{rules:t,getData:n,onChange:o}){e.setAttribute("data-hha-form-root",""),ot.set(e,{rules:t,getData:n,onChange:o}),Ht()}var ot=new WeakMap,nt=!1;function Ht(){nt||(document.addEventListener("input",rt,!0),document.addEventListener("change",rt,!0),document.addEventListener("click",Pt,!0),nt=!0)}function st(e){if(!(e instanceof Element))return null;let t=e.closest("[data-hha-form-root]");return t&&ot.get(t)||null}function Pt(e){if(!(e.target instanceof Element))return;let t=e.target.closest("[data-hha-action]");if(!t||e.defaultPrevented)return;let n=st(t);if(!n)return;let{rules:o,getData:r,onChange:s}=n,a=t.getAttribute("data-hha-action"),i=me(t.getAttribute("data-hha-path")||"");if(a==="scalar-array-add"){let c=re(r(),i)||[];s(B(r(),i,[...c,""]),{structural:!0});return}if(a==="object-array-add"){let c=Oe(o,i);if(!Array.isArray(c))return;let A=re(r(),i)||[];s(B(r(),i,[...A,X(c[1])]),{structural:!0});return}if(a==="array-remove"){if(i.length===0)return;let c=i.slice(0,-1),A=i[i.length-1],x=re(r(),c)||[];if(typeof A!="number")return;let y=x.filter((p,R)=>R!==A);s(B(r(),c,y),{structural:!0})}}function rt(e){let t=e.target;if(!t?.matches?.("input, textarea, select"))return;let n=st(t);if(!n)return;let{getData:o,onChange:r}=n,s=t.closest("[data-hha-path]");if(!s)return;let a=me(s.getAttribute("data-hha-path")||""),i=t.type==="checkbox"?t.checked:t.value;r(B(o(),a,i),{structural:!1})}function ke({rule:e,value:t,path:n,ctx:o}){if(typeof e=="string")return e.endsWith("[]")?$t({rule:e,value:t,path:n,ctx:o}):_t({rule:e,value:t,path:n,ctx:o});if(Array.isArray(e))return jt({rule:e,value:t,path:n,ctx:o});if(typeof e=="object"&&e!==null)return Dt({rule:e,value:t,path:n,ctx:o});let r=document.createElement("span");return r.textContent="(unsupported rule)",r}function Dt({rule:e,value:t,path:n,ctx:o}){let r=document.createElement("div");if(r.className="form-section",r.setAttribute("data-hha-path",_(n)),n.length>0){let s=document.createElement("div");s.className="form-section-label",s.textContent=be(n[n.length-1]),r.appendChild(s)}for(let[s,a]of Object.entries(e)){let i=[...n,s],c=t?.[s];r.appendChild(ke({rule:a,value:c,path:i,ctx:o}))}return r}function _t({rule:e,value:t,path:n,ctx:o}){let r=document.createElement("div");r.className="field-row",r.setAttribute("data-hha-path",_(n));let s=document.createElement("div");s.className="field-body";let a=document.createElement("label");a.className="field-label",a.textContent=be(n[n.length-1]||".")+Vt(e);let i=Ft(e,o.appRoot),c=Ut(i,{value:t,rule:e,path:n,appRoot:o.appRoot}),A=c.el;return A.classList.add(i.type==="textarea"?"field-textarea":"field-input"),s.appendChild(a),s.appendChild(A),r.appendChild(s),ye.set(r,c),r}function $t({rule:e,value:t,path:n,ctx:o}){let r=document.createElement("div");r.className="form-section",r.setAttribute("data-hha-path",_(n));let s=document.createElement("div");s.className="form-section-label",s.textContent=be(n[n.length-1]),r.appendChild(s);let a=Array.isArray(t)?t:[],i=document.createElement("div");r.appendChild(i),a.forEach((A,x)=>{let y=[...n,x],p=document.createElement("div");p.className="scalar-array-row",p.setAttribute("data-hha-path",_(y));let R=document.createElement("input");R.type="text",R.className="field-input",R.value=A==null?"":String(A);let N=document.createElement("button");N.type="button",N.className="array-remove",N.textContent="\xD7",N.title="remove",N.setAttribute("data-hha-action","array-remove"),N.setAttribute("data-hha-path",_(y)),p.appendChild(R),p.appendChild(N),i.appendChild(p)});let c=document.createElement("button");return c.type="button",c.className="array-add",c.textContent="+ add",c.setAttribute("data-hha-action","scalar-array-add"),c.setAttribute("data-hha-path",_(n)),r.appendChild(c),r}function jt({rule:e,value:t,path:n,ctx:o}){let[,r]=e,s=Array.isArray(t)?t:[],a=document.createElement("div");a.className="form-section",a.setAttribute("data-hha-path",_(n));let i=document.createElement("div");i.className="form-section-label",i.textContent=be(n[n.length-1]),a.appendChild(i),s.forEach((A,x)=>{let y=[...n,x],p=document.createElement("div");p.className="array-card",p.setAttribute("data-hha-path",_(y));let R=document.createElement("button");R.type="button",R.className="array-remove",R.textContent="\xD7",R.title="remove item",R.setAttribute("data-hha-action","array-remove"),R.setAttribute("data-hha-path",_(y)),p.appendChild(R);let N=ke({rule:r,value:A,path:y,ctx:o});N.querySelector(".form-section-label")?.remove(),p.appendChild(N),a.appendChild(p)});let c=document.createElement("button");return c.type="button",c.className="array-add",c.textContent="+ add",c.setAttribute("data-hha-action","object-array-add"),c.setAttribute("data-hha-path",_(n)),a.appendChild(c),a}function Ut(e,t){let n=Wt(e);if(e.type==="select"&&e.options)for(let o of e.options){let r=document.createElement("option");r.value=o.value,r.textContent=o.text,String(t.value)===o.value&&(r.selected=!0),n.appendChild(r)}else e.type==="checkbox"?n.checked=t.value===!0||t.value==="true"||t.value==="checked":(e.type,n.value=t.value==null?"":String(t.value));return{el:n,destroy(){},focus(){n.focus()},validate(){}}}function Ft(e,t){let n=null;if(e.startsWith("@")?n=e.slice(1):e.includes("@")&&(n=e.split("@")[1]||null),n&&Lt.has(n))return{type:"checkbox"};if(n==="innerHTML")return{type:"textarea"};let o=Bt(e,t);if(!o)return{type:"text"};let r=(o.tagName||"").toLowerCase();if(r==="textarea")return{type:"textarea"};if(r==="select")return{type:"select",options:Array.from(o.querySelectorAll("option")).map(i=>({value:i.getAttribute("value")||i.textContent,text:i.textContent.trim()||i.getAttribute("value")||""}))};if(r==="input"){let a=(o.getAttribute("type")||"text").toLowerCase();if(a==="checkbox"||a==="radio")return{type:"checkbox"};if(a==="number")return{type:"number"}}let s=(o.textContent||"").trim();return s.length>60||s.includes(`
|
|
2
|
+
`)?{type:"textarea"}:{type:"text"}}function Bt(e,t){if(!t||e==="."||e===""||e.startsWith("@"))return null;let n=e.includes("@")?e.split("@")[0]:e;if(!n)return null;try{return t.querySelector(n)}catch{return null}}function Wt(e){if(e.type==="textarea")return document.createElement("textarea");if(e.type==="select")return document.createElement("select");let t=document.createElement("input");return t.type=e.type==="checkbox"?"checkbox":e.type==="number"?"number":"text",t}function be(e){return typeof e=="number"?`#${e+1}`:String(e).replace(/([a-z])([A-Z])/g,"$1 $2").replace(/[_-]+/g," ").replace(/^\w/,t=>t.toUpperCase())}function Vt(e){return` \xB7 ${e}`}var it={includeClasses:!0,includeAttributes:["href","src","name","type","role","aria-label","alt","title"],excludeAttributePrefixes:["data-morph-","data-hyper-","data-im-"],textHintLength:64,excludeIds:!0,maxPathDepth:4,landmarks:["HEADER","NAV","MAIN","ASIDE","FOOTER","SECTION","ARTICLE"],weights:{signature:100,pathSegment:10,textMatch:20,textMismatch:25,uniqueCandidate:50,positionPenalty:1,slotMatch:30},minConfidence:101};function qt(e){let t=5381;for(let n=0;n<e.length;n++)t=(t<<5)+t^e.charCodeAt(n);return Math.abs(t).toString(36)}function Kt(e){if(e.classList&&e.classList.length>0)return Array.from(e.classList).sort().join(" ");let t=e.getAttribute?.("class");return t?t.split(/\s+/).filter(Boolean).sort().join(" "):""}function zt(e,t){let n=[];for(let o of e.attributes||[]){let r=o.name;r==="id"||r==="class"||t.excludeAttributePrefixes.some(s=>r.startsWith(s))||t.includeAttributes.includes(r)&&n.push(`${r}=${o.value}`)}return n.sort().join("|")}function Jt(e,t){return(e.textContent||"").replace(/\s+/g," ").trim().slice(0,t.textHintLength)}function Yt(e,t){let n=[e.tagName];return t.includeClasses&&n.push(Kt(e)),n.push(zt(e,t)),qt(n.join("|"))}function Gt(e){let t=e.tagName,n=1,o=e.previousElementSibling;for(;o;)o.tagName===t&&n++,o=o.previousElementSibling;return n}function Xt(e,t){return e.id||e.getAttribute?.("role")?!0:t.landmarks.includes(e.tagName)}function Zt(e){if(e.id)return`#${e.id}`;let t=e.getAttribute?.("role");return t?`@${t}`:e.tagName}function Qt(e,t){let n=[],o=e;for(;o&&o.tagName&&n.length<t.maxPathDepth;){let r=`${o.tagName}:${Gt(o)}`;if(n.unshift(r),o!==e&&Xt(o,t)){n.unshift(Zt(o));break}o=o.parentElement}return n}function en(e,t){let n=0,o=e.length-1,r=t.length-1;for(;o>=0&&r>=0&&e[o]===t[r];)n++,o--,r--;return n}function j(e,t,n){if(n.has(e))return n.get(e);let o={signature:Yt(e,t),path:Qt(e,t),textHint:Jt(e,t)};return n.set(e,o),o}function ut(e,t,n,o){if(o.has(e))return o.get(e);let r=new Map,s=e.querySelectorAll("*"),a=0;for(let i of s){let c=j(i,t,n);c.domIndex=a++,r.has(c.signature)||r.set(c.signature,[]),r.get(c.signature).push(i)}return o.set(e,r),r}function tn(e,t,n){n.delete(e),t.delete(e);let o=e.querySelectorAll("*");for(let r of o)t.delete(r)}function Ce(e,t,n,o,r){let s=j(e,n,o),a=j(t,n,o),i=n.weights,c={},A=0;if(s.signature!==a.signature)return{score:0,breakdown:{rejected:"signature mismatch"}};A+=i.signature,c.signature=i.signature;let y=en(s.path,a.path)*i.pathSegment;A+=y,c.path=y;let p=!0;if(s.textHint&&a.textHint?s.textHint===a.textHint?(A+=i.textMatch,c.text=i.textMatch):(A-=i.textMismatch,c.text=-i.textMismatch,p=!1):s.textHint!==a.textHint&&(A-=i.textMismatch,c.text=-i.textMismatch,p=!1),r.candidateCount===1&&p&&(A+=i.uniqueCandidate,c.unique=i.uniqueCandidate),typeof s.domIndex=="number"&&typeof a.domIndex=="number"){let R=Math.abs(s.domIndex-a.domIndex),N=Math.min(R*i.positionPenalty,20);A-=N,c.drift=-N}return{score:A,breakdown:c}}function at(e,t,n,o,r){if(n.excludeIds&&e.id)return null;let s=ut(t,n,o,r),a=j(e,n,o);if(typeof a.domIndex!="number"){let p=0,R=e.previousElementSibling;for(;R;)p++,R=R.previousElementSibling;a.domIndex=p}let i=s.get(a.signature)||[],c=n.excludeIds?i.filter(p=>!p.id):i;if(c.length===0)return null;let A=null,x=0,y=null;for(let p of c){let{score:R,breakdown:N}=Ce(e,p,n,o,{candidateCount:c.length});R>x&&(x=R,A=p,y=N)}return x<n.minConfidence?null:{element:A,confidence:x,breakdown:y}}function nn(e,t,n,o){let r=[],s=n.weights.signature+n.weights.slotMatch,a={slot:s};function i(y){if(y.children)return y.children;let p=y.childNodes;if(!p)return[];let R=[];for(let N=0;N<p.length;N++)p[N].nodeType===1&&R.push(p[N]);return R}function c(y,p){let R=i(y),N=i(p);if(R.length===N.length)for(let C=0;C<R.length;C++){let g=R[C],T=N[C];if(n.excludeIds&&(g.id||T.id)||g.tagName!==T.tagName)continue;let E=j(g,n,o).signature,v=j(T,n,o).signature;E!==v&&r.push({newEl:g,oldEl:T,score:s,breakdown:a}),c(g,T)}}function A(y,p){for(;;){if(y.tagName===p.tagName)return[y,p];let R=i(y);if(!y.tagName&&R.length===1){y=R[0];continue}let N=i(p);if(N.length===1&&N[0].tagName===y.tagName){p=N[0];continue}return null}}let x=A(e,t);return x&&c(x[0],x[1]),r}function ct(e,t,n,o,r){let s=t.querySelectorAll("*"),a=ut(e,n,o,r),i=0;for(let y of s){let p=j(y,n,o);p.domIndex=i++}let c=[];for(let y of s){if(n.excludeIds&&y.id)continue;let p=j(y,n,o),R=a.get(p.signature)||[],N=n.excludeIds?R.filter(C=>!C.id):R;for(let C of N){let{score:g,breakdown:T}=Ce(y,C,n,o,{candidateCount:N.length});g>=n.minConfidence&&c.push({newEl:y,oldEl:C,score:g,breakdown:T})}}if(n.weights.slotMatch>0){let y=nn(t,e,n,o);for(let p of y)c.push(p)}c.sort((y,p)=>p.score-y.score);let A=new Map,x=new Set;for(let{newEl:y,oldEl:p}of c)A.has(y)||x.has(p)||(A.set(y,p),x.add(p));return A}function lt(e,t,n,o){let r=j(e,n,o),s=j(t,n,o),{score:a,breakdown:i}=Ce(e,t,n,o,{candidateCount:1});return{matches:a>=n.minConfidence,score:a,breakdown:i,newMeta:{signature:r.signature,path:r.path,textHint:r.textHint},oldMeta:{signature:s.signature,path:s.path,textHint:s.textHint}}}function ft(e={}){let t={...it,...e,weights:{...it.weights,...e.weights}},n=new WeakMap,o=new WeakMap;return{findMatch:(r,s)=>at(r,s,t,n,o),computeMatches:(r,s)=>ct(r,s,t,n,o),explain:(r,s)=>lt(r,s,t,n),invalidate:r=>tn(r,n,o),session:()=>{let r=new WeakMap,s=new WeakMap;return{findMatch:(a,i)=>at(a,i,t,r,s),computeMatches:(a,i)=>ct(a,i,t,r,s),explain:(a,i)=>lt(a,i,t,r)}},getConfig:()=>({...t})}}var rn=ft(),Le=function(){"use strict";let e=()=>{};function t(g){if(!(g instanceof Element))return!1;if(g.hasAttribute("save-ignore"))return!0;if(g.tagName==="LINK"||g.tagName==="SCRIPT"){let T=g.getAttribute("src")||g.getAttribute("href")||"";if(T.startsWith("chrome-extension://")||T.startsWith("moz-extension://")||T.startsWith("safari-web-extension://"))return!0}return!1}function n(g,T){if(T!=="smart")return g.outerHTML;let E=g.getAttribute("src"),v=g.getAttribute("type")||"text/javascript";if(E)try{let w=new URL(E,window.location.href);return`ext:${v}:${w.origin}${w.pathname}${w.search}`}catch{return`ext:${v}:${E}`}else{let w=g.textContent.trim(),M=5381;for(let d=0;d<w.length;d++)M=(M<<5)+M^w.charCodeAt(d);return`inline:${v}:${Math.abs(M).toString(36)}`}}let o={morphStyle:"outerHTML",callbacks:{beforeNodeAdded:e,afterNodeAdded:e,beforeNodeMorphed:e,afterNodeMorphed:e,beforeNodeRemoved:e,afterNodeRemoved:e,beforeAttributeUpdated:e},head:{style:"merge",shouldPreserve:g=>g.getAttribute("im-preserve")==="true",shouldReAppend:g=>g.getAttribute("im-re-append")==="true",shouldRemove:e,afterHeadMorphed:e},scripts:{handle:!1,matchMode:"outerHTML",shouldPreserve:g=>g.getAttribute("im-preserve")==="true",shouldReAppend:g=>g.getAttribute("im-re-append")==="true",shouldRemove:e,afterScriptsHandled:e},restoreFocus:!0},r={computeMatches(g,T){let{computeMatches:E}=rn.session();return E(g,T)}};function s(g,T,E={}){g=N(g);let v=C(T),w=R(g,v,E),M=w.scripts.matchMode,d=new Set(Array.from(g.querySelectorAll("script")).map(u=>n(u,M))),b=i(w,()=>x(w,g,v,u=>u.morphStyle==="innerHTML"?(c(u,g,v),Array.from(g.childNodes)):a(u,g,v)));w.pantry.remove();let l=p(g,d,w);return l.length>0?b instanceof Promise?b.then(u=>Promise.all(l).then(()=>u)):Promise.all(l).then(()=>b):b}function a(g,T,E){let v=C(T);return c(g,v,E,T,T.nextSibling),Array.from(v.childNodes)}function i(g,T){if(!g.config.restoreFocus)return T();let E=document.activeElement;if(!(E instanceof HTMLInputElement||E instanceof HTMLTextAreaElement))return T();let{id:v,selectionStart:w,selectionEnd:M}=E,d=T();return v&&v!==document.activeElement?.getAttribute("id")&&(E=g.target.querySelector(`[id="${v}"]`),E?.focus()),E&&!E.selectionEnd&&M!=null&&E.setSelectionRange(w,M),d}let c=function(){function g(l,u,h,f=null,m=null){u instanceof HTMLTemplateElement&&h instanceof HTMLTemplateElement&&(u=u.content,h=h.content),f||=u.firstChild;for(let S of h.childNodes){if(t(S))continue;if(f&&f!=m){let I=E(l,S,f,m);if(I){I!==f&&w(l,f,I),A(I,S,l),f=I.nextSibling;continue}}if(S instanceof Element){let I=S.getAttribute("id");if(l.persistentIds.has(I)){let k=M(u,I,f,l);A(k,S,l),f=k.nextSibling;continue}if(!l.idMap.has(S)){let k=l.hyperMatches.get(S);if(k&&!l.idMap.has(k)){b(u,k,f),A(k,S,l),f=k.nextSibling;continue}}}let O=T(u,S,f,l);O&&(f=O.nextSibling)}for(;f&&f!=m;){let S=f;f=f.nextSibling,t(S)||v(l,S)}}function T(l,u,h,f){if(f.callbacks.beforeNodeAdded(u)===!1)return null;if(f.idMap.has(u)){let m=document.createElement(u.tagName);return l.insertBefore(m,h),A(m,u,f),f.callbacks.afterNodeAdded(m),m}else{let m=document.importNode(u,!0);return l.insertBefore(m,h),f.callbacks.afterNodeAdded(m),m}}let E=function(){function l(f,m,S,O){let I=m instanceof Element&&!f.idMap.has(m)?f.hyperMatches.get(m):null,k=null,$=m.nextSibling,ne=0,L=S;for(;L&&L!=O;){if(h(L,m)){if(u(f,L,m)||L===I&&!f.idMap.has(L))return L;if(k===null){let Y=L instanceof Element&&f.hyperMatchedOldElements.has(L);!f.idMap.has(L)&&!Y&&(k=L)}}if(k===null&&$&&h(L,$)&&(ne++,$=$.nextSibling,ne>=2&&(k=void 0)),f.activeElementAndParents.includes(L))break;L=L.nextSibling}return k||null}function u(f,m,S){let O=f.idMap.get(m),I=f.idMap.get(S);if(!I||!O)return!1;for(let k of O)if(I.has(k))return!0;return!1}function h(f,m){let S=f,O=m;return S.nodeType===O.nodeType&&S.tagName===O.tagName&&(!S.getAttribute?.("id")||S.getAttribute?.("id")===O.getAttribute?.("id"))}return l}();function v(l,u){let h=u instanceof Element&&l.hyperMatchedOldElements.has(u)&&!l.idMap.has(u);if(l.idMap.has(u)||h)b(l.pantry,u,null);else{if(l.callbacks.beforeNodeRemoved(u)===!1)return;u.parentNode?.removeChild(u),l.callbacks.afterNodeRemoved(u)}}function w(l,u,h){let f=u;for(;f&&f!==h;){let m=f;f=f.nextSibling,t(m)||v(l,m)}return f}function M(l,u,h,f){let m=f.target.getAttribute?.("id")===u&&f.target||f.target.querySelector(`[id="${u}"]`)||f.pantry.querySelector(`[id="${u}"]`);return d(m,f),b(l,m,h),m}function d(l,u){let h=l.getAttribute("id");for(;l=l.parentNode;){let f=u.idMap.get(l);f&&(f.delete(h),f.size||u.idMap.delete(l))}}function b(l,u,h){if(l.moveBefore)try{l.moveBefore(u,h)}catch{l.insertBefore(u,h)}else l.insertBefore(u,h)}return g}(),A=function(){function g(d,b,l){return l.ignoreActive&&d===document.activeElement?null:(l.callbacks.beforeNodeMorphed(d,b)===!1||(d instanceof HTMLHeadElement&&l.head.ignore||(d instanceof HTMLHeadElement&&l.head.style!=="morph"?y(d,b,l):(T(d,b,l),M(d,l)||c(l,d,b))),l.callbacks.afterNodeMorphed(d,b)),d)}function T(d,b,l){let u=b.nodeType;if(u===1){let h=d,f=b,m=h.attributes,S=f.attributes;for(let O of S)w(O.name,h,"update",l)||h.getAttribute(O.name)!==O.value&&h.setAttribute(O.name,O.value);for(let O=m.length-1;0<=O;O--){let I=m[O];if(I&&!f.hasAttribute(I.name)){if(w(I.name,h,"remove",l))continue;h.removeAttribute(I.name)}}M(h,l)||E(h,f,l)}(u===8||u===3)&&d.nodeValue!==b.nodeValue&&(d.nodeValue=b.nodeValue)}function E(d,b,l){if(d instanceof HTMLInputElement&&b instanceof HTMLInputElement&&b.type!=="file"){let u=b.value,h=d.value;v(d,b,"checked",l),v(d,b,"disabled",l),l.formStateSync==="property"?h!==u&&(w("value",d,"update",l)||(d.value=u)):b.hasAttribute("value")?h!==u&&(w("value",d,"update",l)||(d.setAttribute("value",u),d.value=u)):w("value",d,"remove",l)||(d.value="",d.removeAttribute("value"))}else if(d instanceof HTMLOptionElement&&b instanceof HTMLOptionElement)v(d,b,"selected",l);else if(d instanceof HTMLTextAreaElement&&b instanceof HTMLTextAreaElement){let u=b.value,h=d.value;if(w("value",d,"update",l))return;u!==h&&(d.value=u),d.firstChild&&d.firstChild.nodeValue!==u&&(d.firstChild.nodeValue=u)}}function v(d,b,l,u){let h=b[l],f=d[l];if(h!==f){let m=w(l,d,"update",u);if(m||(d[l]=b[l]),u.formStateSync==="property")return;h?m||d.setAttribute(l,""):w(l,d,"remove",u)||d.removeAttribute(l)}}function w(d,b,l,u){return d==="value"&&u.ignoreActiveValue&&b===document.activeElement?!0:u.callbacks.beforeAttributeUpdated(d,b,l)===!1}function M(d,b){return!!b.ignoreActiveValue&&d===document.activeElement&&d!==document.body}return g}();function x(g,T,E,v){if(g.head.block){let w=T.querySelector("head"),M=E.querySelector("head");if(w&&M){let d=y(w,M,g);return Promise.all(d).then(()=>{let b=Object.assign(g,{head:{block:!1,ignore:!0}});return v(b)})}}return v(g)}function y(g,T,E){let v=[],w=[],M=[],d=[],b=E.scripts.matchMode,l=f=>{if(f.tagName==="SCRIPT")return n(f,b);if(f.tagName==="LINK"&&b==="smart"){let m=f.getAttribute("href");if(m)try{let S=new URL(m,window.location.href);return`link:${f.getAttribute("rel")||""}:${S.origin}${S.pathname}${S.search}`}catch{}}return f.outerHTML},u=new Map;for(let f of T.children)t(f)||u.set(l(f),f);for(let f of g.children){let m=l(f),S=u.has(m),O=E.head.shouldReAppend(f),I=E.head.shouldPreserve(f);S||I?O?w.push(f):(u.delete(m),M.push(f)):E.head.style==="append"?O&&(w.push(f),d.push(f)):E.head.shouldRemove(f)!==!1&&!t(f)&&w.push(f)}d.push(...u.values());let h=[];for(let f of d){let m=document.createRange().createContextualFragment(f.outerHTML).firstChild;if(E.callbacks.beforeNodeAdded(m)!==!1){if("href"in m&&m.href||"src"in m&&m.src){let S,O=new Promise(function(I){S=I});m.addEventListener("load",function(){S()}),h.push(O)}g.appendChild(m),E.callbacks.afterNodeAdded(m),v.push(m)}}for(let f of w)E.callbacks.beforeNodeRemoved(f)!==!1&&(g.removeChild(f),E.callbacks.afterNodeRemoved(f));return E.head.afterHeadMorphed(g,{added:v,kept:M,removed:w}),h}function p(g,T,E){if(!E.scripts.handle)return[];let v=[],w=[],M=[],d=[],b=E.scripts.matchMode,l=Array.from(g.querySelectorAll("script"));for(let h of l){let f=n(h,b),m=T.has(f),S=E.scripts.shouldPreserve(h),O=E.scripts.shouldReAppend(h);m||S?O?(w.push(h),d.push(h)):M.push(h):d.push(h)}for(let h of T){let f=l.some(m=>m.outerHTML===h)}let u=[];for(let h of d){if(E.callbacks.beforeNodeAdded(h)===!1)continue;let f=document.createRange().createContextualFragment(h.outerHTML).firstChild;if(f.src){let m,S=new Promise(function(O){m=O});f.addEventListener("load",function(){m()}),f.addEventListener("error",function(){m()}),u.push(S)}h.replaceWith(f),E.callbacks.afterNodeAdded(f),v.push(f)}return E.scripts.afterScriptsHandled(g,{added:v,kept:M,removed:w}),u}let R=function(){function g(l,u,h){let{persistentIds:f,idMap:m}=d(l,u),S=r.computeMatches(l,u);if(typeof h.key=="function"){let $=new Map,ne=new Set,L=H=>{let P=h.key(H);P!=null&&($.has(P)?ne.add(P):$.set(P,H))};l instanceof Element&&L(l);for(let H of l.querySelectorAll("*"))L(H);for(let H of ne)$.delete(H);let Y=new Map;for(let[H,P]of S)Y.set(P,H);let xe=u.__hyperMorphRoot||u,he=new Map,et=new Set,tt=H=>{let P=h.key(H);P!=null&&(he.has(P)?et.add(P):he.set(P,H))};xe instanceof Element&&tt(xe);for(let H of xe.querySelectorAll("*"))tt(H);for(let H of et)he.delete(H);for(let[H,P]of he){let G=$.get(H);if(!G||G.tagName!==P.tagName)continue;let ve=Y.get(G);ve&&ve!==P&&S.delete(ve);let we=S.get(P);we&&we!==G&&Y.delete(we),S.set(P,G),Y.set(G,P)}}let O=new Set;for(let $ of S.values())O.add($);let I=T(h),k=I.morphStyle||"outerHTML";if(!["innerHTML","outerHTML"].includes(k))throw`Do not understand how to morph style ${k}`;return{target:l,newContent:u,config:I,morphStyle:k,ignoreActive:I.ignoreActive,ignoreActiveValue:I.ignoreActiveValue,restoreFocus:I.restoreFocus,formStateSync:I.formStateSync||"attribute",idMap:m,persistentIds:f,hyperMatches:S,hyperMatchedOldElements:O,pantry:E(),activeElementAndParents:v(l),callbacks:I.callbacks,head:I.head,scripts:I.scripts}}function T(l){let u=Object.assign({},o);return Object.assign(u,l),u.callbacks=Object.assign({},o.callbacks,l.callbacks),u.head=Object.assign({},o.head,l.head),u.scripts=Object.assign({},o.scripts,l.scripts),u}function E(){let l=document.createElement("div");return l.hidden=!0,document.body.insertAdjacentElement("afterend",l),l}function v(l){let u=[],h=document.activeElement;if(h?.tagName!=="BODY"&&l.contains(h))for(;h&&(u.push(h),h!==l);)h=h.parentElement;return u}function w(l){let u=Array.from(l.querySelectorAll("[id]"));return l.getAttribute?.("id")&&u.push(l),u}function M(l,u,h,f){for(let m of f){let S=m.getAttribute("id");if(u.has(S)){let O=m;for(;O;){let I=l.get(O);if(I==null&&(I=new Set,l.set(O,I)),I.add(S),O===h)break;O=O.parentElement}}}}function d(l,u){let h=w(l),f=w(u),m=b(h,f),S=new Map;M(S,m,l,h);let O=u.__hyperMorphRoot||u;return M(S,m,O,f),{persistentIds:m,idMap:S}}function b(l,u){let h=new Set,f=new Map;for(let{id:S,tagName:O}of l)f.has(S)?h.add(S):f.set(S,O);let m=new Set;for(let{id:S,tagName:O}of u)m.has(S)?h.add(S):f.get(S)===O&&m.add(S);for(let S of h)m.delete(S);return m}return g}(),{normalizeElement:N,normalizeParent:C}=function(){let g=new WeakSet;function T(M){return M instanceof Document?M.documentElement:M}function E(M){if(M==null)return document.createElement("div");if(typeof M=="string")return E(w(M));if(g.has(M))return M;if(M instanceof Node){if(M.parentNode)return new v(M);{let d=document.createElement("div");return d.append(M),d}}else{let d=document.createElement("div");for(let b of[...M])d.append(b);return d}}class v{constructor(d){this.originalNode=d,this.realParentNode=d.parentNode,this.previousSibling=d.previousSibling,this.nextSibling=d.nextSibling}get childNodes(){let d=[],b=this.previousSibling?this.previousSibling.nextSibling:this.realParentNode.firstChild;for(;b&&b!=this.nextSibling;)d.push(b),b=b.nextSibling;return d}querySelectorAll(d){return this.childNodes.reduce((b,l)=>{if(l instanceof Element){l.matches(d)&&b.push(l);let u=l.querySelectorAll(d);for(let h=0;h<u.length;h++)b.push(u[h])}return b},[])}insertBefore(d,b){return this.realParentNode.insertBefore(d,b)}moveBefore(d,b){return this.realParentNode.moveBefore(d,b)}get __hyperMorphRoot(){return this.originalNode}}function w(M){let d=new DOMParser,b=M.replace(/<svg(\s[^>]*>|>)([\s\S]*?)<\/svg>/gim,"");if(b.match(/<\/html>/)||b.match(/<\/head>/)||b.match(/<\/body>/)){let l=d.parseFromString(M,"text/html");if(b.match(/<\/html>/))return g.add(l),l;{let u=l.firstChild;return u&&g.add(u),u}}else{let u=d.parseFromString("<body><template>"+M+"</template></body>","text/html").body.querySelector("template").content;return g.add(u),u}}return{normalizeElement:T,normalizeParent:E}}();return{morph:s,defaults:o}}();var $n=Le.morph,jn=Le.defaults,dt=Le;function He(e,t,{onWidgetRemoved:n}={}){dt.morph(e,t,{morphStyle:"innerHTML",ignoreActiveValue:!0,restoreFocus:!0,formStateSync:"property",callbacks:{beforeNodeRemoved(o){let r=ye.get(o);r?.destroy&&r.destroy(),n?.(o)}}})}var sn="hha:upgrade-check:";function U(e,t){let n=e.querySelector(`meta[name="${t}"]`),o=n?n.getAttribute("content"):null;return o&&o.trim()?o.trim():null}function Pe(e){if(typeof e!="string")return null;let t=e.trim().replace(/^v/,"");return/^\d+(\.\d+)*$/.test(t)?t.split(".").map(Number):null}function pt(e,t){let n=Pe(e),o=Pe(t);if(!n||!o)return!1;let r=Math.max(n.length,o.length);for(let s=0;s<r;s++){let a=n[s]||0,i=o[s]||0;if(a!==i)return a>i}return!1}function an(e){try{let t=globalThis.localStorage.getItem(e);return t?JSON.parse(t):null}catch{return null}}function cn(e,t){try{globalThis.localStorage.setItem(e,JSON.stringify(t))}catch{}}async function De({force:e=!1,doc:t,loc:n,fetchFn:o,now:r,ttlMs:s=864e5}={}){if(t=t||(typeof document<"u"?document:null),n=n||(typeof location<"u"?location:null),o=o||(p=>fetch(p)),r=r??Date.now(),!t)return null;let a=U(t,"hyper-source");if(!a)return null;let i=U(t,"hyper-version"),c;try{c=new URL(a,n?n.href:void 0)}catch{return null}if(n&&c.origin===n.origin&&c.pathname===n.pathname)return null;let A=`${sn}${c.href}:${i||"none"}`,x,y=e?null:an(A);if(y&&typeof y.checkedAt=="number"&&r-y.checkedAt<s)x=y.sourceVersion;else{try{let p=await o(c.href);if(!p.ok)throw new Error(`HTTP ${p.status}`);let R=await p.text(),N=new DOMParser().parseFromString(R,"text/html");x=U(N,"hyper-version")}catch{x=null}cn(A,{checkedAt:r,sourceVersion:x})}return x?{available:pt(x,i||"0.0.0"),currentVersion:i,sourceVersion:x,sourceUrl:c.href}:null}var Ae=["textContent","innerText","innerHTML","outerHTML","value","checked","selected","disabled","readOnly","type","tagName","nodeName","nodeType","nodeValue","childElementCount","id","className","classList","baseURI","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","dataset","currentSrc","duration","paused","title","documentURI","contentType"],_e=new Set(Ae),ht=new Set(["textContent","innerText","innerHTML","value","checked","selected","disabled","readOnly","type","id","className","title"]),mt=new Set(["tagName","nodeName","nodeType","nodeValue","childElementCount","classList","baseURI","documentURI","contentType","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","currentSrc","duration","paused","dataset"]);var Se={};Re(Se,{EmptyListInsert:()=>se,MAX_RULE_DEPTH:()=>Q,MaxRuleDepthExceeded:()=>K,RuleTargetReadOnly:()=>ie,RulesParseError:()=>Z,ShapeMismatch:()=>oe,UnknownRulesVersion:()=>q});var Z=class extends Error{constructor(t,n){super(t),this.name="RulesParseError",this.cause=n}},q=class extends Error{constructor(t){super(`unknown rules version: ${t}. Library supports "1".`),this.name="UnknownRulesVersion",this.version=t}},Q=20,K=class extends Error{constructor(t){super(`rule depth exceeded ${Q} at path: ${t.join(".")}`),this.name="MaxRuleDepthExceeded",this.path=t}},oe=class extends Error{constructor(t){super(`shape mismatch: ${t.length} field(s) failed validation`),this.name="ShapeMismatch",this.mismatches=t}},se=class extends Error{constructor(t){super(`cannot add items to empty list at "${t.join(".")}" \u2014 no sibling to clone as template. Seed the list with a hidden item first.`),this.name="EmptyListInsert",this.path=t}},ie=class extends Error{constructor(t){super(`cannot write to read-only DOM property "${t}"`),this.name="RuleTargetReadOnly",this.target=t}};function F(e,t,n,o={}){return $e(e,t,n,{depth:0,path:[]},o)}function $e(e,t,n,o,r){if(o.depth>Q)throw new K(o.path);if(typeof n=="string")return ln(e,t,n,r);if(Array.isArray(n)){let[s,a]=n;return e.find(t,s,r).map((c,A)=>$e(e,c,a,{depth:o.depth+1,path:[...o.path,A]},r))}if(typeof n=="object"&&n!==null){let s={};for(let[a,i]of Object.entries(n))s[a]=$e(e,t,i,{depth:o.depth+1,path:[...o.path,a]},r);return s}return null}function ln(e,t,n,o){if(n.endsWith("[]")){let s=n.slice(0,-2);return e.find(t,s,o).map(a=>e.text(a))}if(n.startsWith("@"))return gt(e,t,n.slice(1));if(n.includes("@")){let s=n.lastIndexOf("@"),a=n.slice(0,s),i=n.slice(s+1),c=a?e.find(t,a,o):[t];return c.length===0?null:gt(e,c[0],i)}if(n===".")return e.text(t);let r=e.find(t,n,o);return r.length===0?null:e.text(r[0])}function gt(e,t,n){if(_e.has(n)){let r=e.prop(t,n);return r==null?null:String(r)}let o=e.attr(t,n);return o||null}function un(e){return e&&e.nodeType===1&&e.tagName==="SCRIPT"&&e.hasAttribute&&e.hasAttribute("data-rules-name")}function fn(e){return e?(e.nodeType===9||e.nodeType===11,e):null}var dn={find(e,t,n={}){let o=fn(e);if(!o||!o.querySelectorAll)return[];let r=Array.from(o.querySelectorAll(t));n.includeRulesTag||(r=r.filter(i=>!un(i)));let s=[];n.skip&&s.push(n.skip);let a=n.templateAttr===null?null:n.templateAttr||"cms-template";if(a&&s.push("["+a+"]"),s.length){let i=s.join(", ");r=r.filter(c=>!c.closest||!c.closest(i))}return r},parent(e){return e?e.parentElement:null},children(e){return e?Array.from(e.children):[]},text(e,t){if(t===void 0)return(e.textContent||"").trim();e.textContent=t},attr(e,t,n){if(n===void 0)return e.hasAttribute&&e.hasAttribute(t)?e.getAttribute(t):null;e.setAttribute(t,n)},removeAttr(e,t){e&&e.removeAttribute&&e.removeAttribute(t)},prop(e,t,n){if(n===void 0){let o=e?e[t]:void 0;return o!==void 0?o:null}e[t]=n},clone(e){return e.cloneNode(!0)},insertAt(e,t,n){let o=e.children[n]||null;e.insertBefore(t,o)},remove(e){e&&e.parentNode&&e.parentNode.removeChild(e)},replaceWith(e,t){if(!e||!e.parentNode)throw new Error("dom.replaceWith: node has no parent");let o=e.ownerDocument.createElement("template");o.innerHTML=t;let r=o.content.firstElementChild;if(!r)throw new Error("dom.replaceWith: html did not parse to an element");return e.parentNode.replaceChild(r,e),r},stripIds(e){let t=0;return e.id&&(e.removeAttribute("id"),t++),(e.querySelectorAll?e.querySelectorAll("[id]"):[]).forEach(o=>{o.removeAttribute("id"),t++}),t},sameNode(e,t){return e===t}},D=dn;function je(e){try{return JSON.parse(e)}catch(t){throw new Z(`Invalid strict JSON: ${t.message}`,t)}}function z(e){try{return JSON.parse(e)}catch{}let t={BRACE_OPEN:"{",BRACE_CLOSE:"}",BRACKET_OPEN:"[",BRACKET_CLOSE:"]",COLON:":",COMMA:",",STRING:"STRING",SELECTOR:"SELECTOR",IDENTIFIER:"IDENTIFIER",NUMBER:"NUMBER",BOOLEAN:"BOOLEAN"};function n(r){let s=[],a=0;for(;a<r.length;){let i=r[a];if(/\s/.test(i)){a++;continue}if("{}".includes(i)){s.push({type:i,value:i}),a++;continue}if(i==="["){let y=!1,p=a+1;for(;p<r.length&&/\s/.test(r[p]);)p++;if(p<r.length&&/[a-zA-Z_]/.test(r[p])&&(y=!0),!y){s.push({type:i,value:i}),a++;continue}}if(i==="]"){s.push({type:i,value:i}),a++;continue}if(i===":"){s.push({type:t.COLON,value:i}),a++;continue}if(i===","){s.push({type:t.COMMA,value:i}),a++;continue}if(i==='"'||i==="'"){let y=i,p=a+1;for(;p<r.length&&r[p]!==y;)r[p]==="\\"&&p++,p++;s.push({type:t.STRING,value:r.substring(a+1,p),quoted:!0,sourceQuote:y}),a=p+1;continue}let c=a,A;for(;c<r.length&&!/[{},]/.test(r[c]);)if(r[c]===":"){let y=[":first",":last",":nth-child",":nth-of-type",":first-child",":last-child",":first-of-type",":last-of-type",":only-child",":only-of-type",":hover",":focus",":active",":visited",":disabled",":enabled",":checked",":empty",":root",":target",":not",":before",":after",":nth-last-child",":nth-last-of-type"],p=!1;for(let R of y){let N=R.substring(1);if(r.substring(c+1,c+1+N.length)===N){p=!0,c+=N.length;break}}if(!p)break}else if(r[c]==="["){for(c++;c<r.length&&r[c]!=="]";){if(r[c]==='"'||r[c]==="'"){let y=r[c];for(c++;c<r.length&&r[c]!==y;)r[c]==="\\"&&c++,c++}c++}c<r.length&&r[c]==="]"&&c++}else c++;A=r.substring(a,c);let x=t.IDENTIFIER;/^-?\d+(\.\d+)?$/.test(A)?x=t.NUMBER:A==="true"||A==="false"||A==="null"?x=t.BOOLEAN:/^[.#@\[]|[.#@\[]| /.test(A)&&(x=t.SELECTOR),s.push({type:x,value:A,quoted:!1}),a=c}return s}function o(r){let s="";for(let a=0;a<r.length;a++){let i=r[a];if("{}".includes(i.type)||"[]".includes(i.type)){s+=i.value;continue}if(i.type===t.COLON){s+=i.value;continue}if(i.type===t.COMMA){let c=r[a+1];if(c&&(c.type==="}"||c.type==="]"))continue;s+=i.value;continue}if(i.type===t.STRING&&i.quoted){let c=i.value;i.sourceQuote==="'"&&(c=c.replace(/\\'/g,"'"),c=c.replace(/(\\*)"/g,(A,x)=>x.length%2===0?x+'\\"':A)),s+=`"${c}"`;continue}if(i.type===t.NUMBER||i.type===t.BOOLEAN){s+=i.value;continue}if(i.type===t.SELECTOR||i.type===t.IDENTIFIER){s+=`"${i.value}"`;continue}s+=`"${i.value}"`}return s}try{let r=n(e),s=o(r);return JSON.parse(s)}catch(r){throw new Z("Invalid extraction rules syntax: "+r.message,r)}}var Ue="1",yt=/^[a-zA-Z0-9_-]+$/;function ee(e,t,n){let o;if(n===void 0)o="script[data-rules-name]";else{if(typeof n!="string"||!yt.test(n))throw new Error(`hyper-html-api: invalid rules token ${JSON.stringify(n)} (must match ${yt})`);o=`script[data-rules-name~="${n}"]`}let r=e.find(t,o,{includeRulesTag:!0});if(r.length===0)return null;n!==void 0&&r.length>1&&console.warn(`hyper-html-api: ${r.length} rules tags match data-rules-name~="${n}"; using the first.`);let s=r[0],a=e.attr(s,"data-rules-version");if(a!==Ue)throw new q(a);return{rules:z(e.text(s)),tagNode:s}}var pn="script[data-rules-name]";function bt(e){return typeof e=="string"?e.trim().replace(/\s+/g," "):""}function ae(e,t){let n=e.find(t,pn,{includeRulesTag:!0}),o=new Set,r=[];for(let s of n){let a=bt(e.attr(s,"data-rules-name"));if(!a)continue;if(o.has(a)){console.warn(`hyper-html-api: duplicate rules tag name "${a}"; using the first.`);continue}let i=e.attr(s,"data-rules-version");if(i!==Ue)throw new q(i);o.add(a),r.push({name:a,rules:z(e.text(s))})}return r}function Me(e,t){let n={};for(let{name:o,rules:r}of ae(e,t))n[o]=F(e,t,r);return n}function Fe(e){let t=e||document,n=t.nodeType===9?t:t.ownerDocument||t;return{dataByName:Me(D,t),version:U(n,"hyper-version")}}var te=class extends Error{constructor(t,n){super(`could not fetch upgrade source: ${t}`),this.name="UpgradeSourceUnreachable",this.sourceUrl=t,this.cause=n}},ce=class extends Error{constructor(t){super(`upgrade source has no rules tags; refusing to drop all existing data: ${t}`),this.name="UpgradeSourceHasNoRules",this.sourceUrl=t}},W=class extends Error{constructor(t,n){super(t),this.name="UpgradeTransformInvalid",this.cause=n}},le=class extends Error{constructor(t){super(`found ${t} script[type="text/hyper-upgrade"] tags; only one is allowed per document.`),this.name="UpgradeMultipleTransforms",this.count=t}};var At="text/hyper-upgrade";function Be(e,t){let n=e.find(t,`script[type="${At}"]`);if(n.length===0)return null;if(n.length>1)throw new le(n.length);return e.text(n[0])||null}var hn=new Function("url","return import(url)");async function We(e){let t=new Blob([e],{type:"text/javascript"}),n=URL.createObjectURL(t),o;try{o=await hn(n)}catch(r){throw new W(`transform failed to load: ${r&&r.message?r.message:r}`,r)}finally{URL.revokeObjectURL(n)}if(typeof o.default!="function")throw new W("transform must `export default` a function");return o.default}var mn=.5;function Ve(e,t,n,o,r,s,a,i={}){let c=e.find(t,n,i);if(r.length===0){c.forEach(v=>e.remove(v));return}let A=r.length>c.length,x=c[0]||null;if(A&&!x&&(x=Sn(e,t,n,i),!x))throw new se(s.path);let y=c.map(v=>gn(e,v,o,i)),p=null;if(x){p=e.clone(x),i.templateAttr&&e.removeAttr(p,i.templateAttr);let v=e.stripIds(p);v>0&&console.warn(`[hyper-html-api] stripped ${v} id attribute(s) from cloned template at "${s.path.join(".")||"(root)"}"`)}let R=yn(r,y,o),N=c[0]||x,C=e.parent(N),g=c.length>0?An(e,C,N):0,T=new Set,E=r.map((v,w)=>{let M=R[w];if(M>=0)return T.add(M),c[M];let d=e.clone(p);return e.stripIds(d),d});c.forEach((v,w)=>{T.has(w)||e.remove(v)}),E.forEach((v,w)=>{let M=g+w;e.children(C).findIndex(l=>e.sameNode(l,v))!==M&&e.insertAt(C,v,M)}),E.forEach((v,w)=>{if(o===null){let M=r[w],d=M==null?"":String(M);e.text(v)!==d&&e.text(v,d)}else{let M=a(e,v,o,r[w],{depth:s.depth+1,path:[...s.path,w]},i);M&&M!==v&&(E[w]=M)}})}function gn(e,t,n,o){return n===null?e.text(t):F(e,t,n,o)}function yn(e,t,n){let o=new Array(e.length).fill(-1),r=new Set;return e.forEach((s,a)=>{let i=-1,c=-1;t.forEach((A,x)=>{if(r.has(x))return;let y=bn(s,A,n),p=y===c&&i>=0?Math.abs(x-a)<Math.abs(i-a):!1;(y>c||p)&&(c=y,i=x)}),c>=mn&&(o[a]=i,r.add(i))}),o}function bn(e,t,n){if(n===null)return e===t?1:0;let o=Object.keys(n||{});if(o.length===0)return 0;let r=0;for(let s of o)JSON.stringify(e?.[s])===JSON.stringify(t?.[s])&&r++;return r/o.length}function An(e,t,n){let o=e.children(t);for(let r=0;r<o.length;r++)if(e.sameNode(o[r],n))return r;return-1}function Sn(e,t,n,o){if(!o.templateAttr)return null;let r=t;for(;r;){let s=e.find(r,n,{includeRulesTag:!1,templateAttr:null});for(let a of s)if(e.attr(a,o.templateAttr)!=null)return a;r=e.parent(r)}return null}var St=new Set(["checked","selected","disabled","readOnly","paused"]);function V(e,t,n,o,r={}){let s=[];if(qe(n,o,[],s),s.length)throw new oe(s);Ee(e,t,n,o,{depth:0,path:[]},r)}function Ee(e,t,n,o,r,s={}){if(r.depth>Q)throw new K(r.path);if(o===void 0)return t;if(typeof n=="string")return Mn(e,t,n,o,r,s);if(Array.isArray(n)){let[a,i]=n;return Ve(e,t,a,i,o,r,Ee,s),t}if(typeof n=="object"&&n!==null){for(let[a,i]of Object.entries(n)){let c=Ee(e,t,i,o==null?o:o[a],{depth:r.depth+1,path:[...r.path,a]},s);c&&c!==t&&(t=c)}return t}return t}function Mn(e,t,n,o,r,s){if(n.endsWith("[]")){let i=n.slice(0,-2);return Ve(e,t,i,null,o,r,Ee,s),t}if(n.startsWith("@"))return Mt(e,t,n.slice(1),o);if(n.includes("@")){let i=n.lastIndexOf("@"),c=n.slice(0,i),A=n.slice(i+1),x=c?e.find(t,c,s):[t];return x.length===0||Mt(e,x[0],A,o),t}if(n===".")return e.text(t,o==null?"":String(o)),t;let a=e.find(t,n,s);return a.length===0||e.text(a[0],o==null?"":String(o)),t}function Mt(e,t,n,o){if(mt.has(n))throw new ie(n);if(n==="outerHTML"){let r=o==null?"":String(o);return e.replaceWith(t,r)}return ht.has(n)?(e.prop(t,n,En(n,o)),t):(e.attr(t,n,o==null?"":String(o)),t)}function En(e,t){return t==null?St.has(e)?!1:"":St.has(e)?!!t:t}function qe(e,t,n,o){if(t!==void 0){if(typeof e=="string"){if(e.endsWith("[]")){Array.isArray(t)?t.forEach((r,s)=>{typeof r=="object"&&r!==null&&o.push({path:fe([...n,s]),expected:"scalar",got:ue(r)})}):o.push({path:fe(n),expected:"array",got:ue(t)});return}t!==null&&typeof t=="object"&&o.push({path:fe(n),expected:"scalar",got:ue(t)});return}if(Array.isArray(e)){if(!Array.isArray(t)){o.push({path:fe(n),expected:"array",got:ue(t)});return}let r=e[1];t.forEach((s,a)=>qe(r,s,[...n,a],o));return}if(typeof e=="object"&&e!==null){if(t===null||Array.isArray(t)||typeof t!="object"){o.push({path:fe(n),expected:"object",got:ue(t)});return}for(let[r,s]of Object.entries(e))qe(s,t[r],[...n,r],o)}}}function ue(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function fe(e){return e.join(".")}function de(e,t){let n={carriedOver:0,discarded:0,listItems:0},o=Ke(t,e,n);return ze(t,e,n),{data:o,summary:n}}function Ke(e,t,n){if(typeof e=="string")return e.endsWith("[]")?Array.isArray(t)?(n.listItems+=t.length,n.carriedOver+=t.length,t):void 0:t==null||typeof t=="object"?void 0:(n.carriedOver++,t);if(Array.isArray(e)){let[,o]=e;return Array.isArray(t)?(n.listItems+=t.length,t.map(r=>Ke(o,r,n))):void 0}if(typeof e=="object"&&e!==null){let o={};for(let[r,s]of Object.entries(e)){let a=Ke(s,t?.[r],n);a!==void 0&&(o[r]=a)}return o}}function ze(e,t,n){if(t!=null){if(typeof e=="object"&&e!==null&&!Array.isArray(e)){if(typeof t!="object"||Array.isArray(t))return;let o=new Set(Object.keys(e));for(let r of Object.keys(t))o.has(r)?ze(e[r],t[r],n):n.discarded+=J(t[r]);return}if(Array.isArray(e)&&Array.isArray(t)){let o=e[1];t.forEach(r=>ze(o,r,n));return}typeof e=="string"&&!e.endsWith("[]")&&typeof t=="object"&&t!==null&&(n.discarded+=J(t))}}function J(e){return e==null?0:Array.isArray(e)?e.reduce((t,n)=>t+J(n),0):typeof e=="object"?Object.values(e).reduce((t,n)=>t+J(n),0):1}function Je(e,t,n){let o=ae(e,t),r={carriedOver:0,discarded:0,listItems:0},s={},a=new Set;for(let{name:i,rules:c}of o){if(a.add(i),!Object.prototype.hasOwnProperty.call(n,i)){s[i]={carriedOver:0,discarded:0,listItems:0};continue}let{data:A,summary:x}=de(n[i],c);V(e,t,c,A),s[i]=x,r.carriedOver+=x.carriedOver,r.discarded+=x.discarded,r.listItems+=x.listItems}for(let i of Object.keys(n))a.has(i)||(r.discarded+=J(n[i]));return{totals:r,byName:s,rulesTagCount:o.length}}async function Ye({sourceUrl:e,dataByName:t,fromVersion:n,doc:o,loc:r,fetchFn:s}={}){if(o=o||(typeof document<"u"?document:null),r=r||(typeof location<"u"?location:null),s=s||(T=>fetch(T)),!o)throw new Error("upgrade.run requires a document context");if(e=e||U(o,"hyper-source"),!e)throw new Error("upgrade.run: no sourceUrl given and no hyper-source meta tag found");let a=new URL(e,r?r.href:void 0);n=n!==void 0?n:U(o,"hyper-version"),t=t||Me(D,o);let i;try{i=await s(a.href)}catch(T){throw new te(a.href,T)}if(!i.ok)throw new te(a.href,new Error(`HTTP ${i.status}`));let c=await i.text(),A=new DOMParser().parseFromString(c,"text/html"),x=U(A,"hyper-version"),y=t,p=!1,R=Be(D,A);if(R){let E=await(await We(R))(y,{fromVersion:n,toVersion:x});if(!E||typeof E!="object"||Array.isArray(E))throw new W("transform must return a plain object map of { rulesName: data }");y=E,p=!0}let{totals:N,byName:C,rulesTagCount:g}=Je(D,A,y);if(g===0&&Object.keys(y).length>0)throw new ce(a.href);return{html:xn(A),fromVersion:n,toVersion:x,summary:{transformApplied:p,totals:N,byName:C}}}function xn(e){return`<!DOCTYPE ${e.doctype&&e.doctype.name?e.doctype.name:"html"}>
|
|
3
|
+
`+e.documentElement.outerHTML}function Ge(e,t,n){if(n&&typeof n=="object")return{rules:n,tagNode:null};if(typeof n=="string"){let o=t&&t.ownerDocument?t.ownerDocument:t;return ee(e,o,n)}return null}function Et(e,t,n,o){let r=Ge(e,t,n);if(!r){let i=typeof n=="string"?`data-rules-name~="${n}"`:"the provided rules object";throw new Error(`hyper-html-api: could not resolve rules for ${i}`)}let{rules:s,tagNode:a}=r;return{rules:s,tagNode:a,get:()=>F(e,t,s,o),set:i=>V(e,t,s,i,o)}}var pe={extract:(e,t,n)=>F(D,e,t,n),apply:(e,t,n,o)=>V(D,e,t,n,o),findRulesIn:(e,t)=>ee(D,e,t),findRules:(e,t)=>Ge(D,e,t),bind:(e,t,n)=>Et(D,e,t,n),parseStrict:je,parseRelaxed:z,errors:Se,DOM_PROPERTIES:Ae},Xe=e=>!!e&&typeof e.nodeType=="number";function xt(e){let t=e&&e.ownerDocument?e.ownerDocument:e,n=D.find(t,"script[data-rules-name]",{includeRulesTag:!0});if(n.length===0)throw new Error('hyper-html-api: no rules tag found. Add <script type="application/json" data-rules-name="\u2026" data-rules-version="1"> or pass rules.');if(n.length>1)throw new Error('hyper-html-api: multiple rules tags found; pass a name, e.g. extractData("api").');return ee(D,t).rules}function Ze(e,t){let n=Xe(e)?e:document,o=Xe(e)?t:e;return o===void 0?F(D,n,xt(n)):pe.bind(n,o).get()}function Qe(e,t,n){if(!Xe(e))throw new Error("hyper-html-api: applyData(root, data, source?) needs a DOM root as the first argument.");return n===void 0?V(D,e,xt(e),t):pe.bind(e,n).set(t),e}var vt={buildForm:Ne,bindFormEvents:Ie,scaffold:X,morphForm:He,path:ge},wt={checkForUpdate:De,run:Ye,extractAll:Fe,shapeMatch:de};var Tn={engine:pe,cms:vt,upgrade:wt,extractData:Ze,applyData:Qe},Rn=Tn;return It(On);})();
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
var hyperHtmlApiUpgrade=(()=>{var Y=Object.defineProperty;var Te=Object.getOwnPropertyDescriptor;var we=Object.getOwnPropertyNames;var Se=Object.prototype.hasOwnProperty;var ie=(e,t)=>{for(var r in t)Y(e,r,{get:t[r],enumerable:!0})},be=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of we(t))!Se.call(e,n)&&n!==r&&Y(e,n,{get:()=>t[n],enumerable:!(o=Te(t,n))||o.enumerable});return e};var Ie=e=>be(Y({},"__esModule",{value:!0}),e);var Qe={};ie(Qe,{default:()=>Xe,engine:()=>re,upgrade:()=>Oe});var W=["textContent","innerText","innerHTML","outerHTML","value","checked","selected","disabled","readOnly","type","tagName","nodeName","nodeType","nodeValue","childElementCount","id","className","classList","baseURI","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","dataset","currentSrc","duration","paused","title","documentURI","contentType"],z=new Set(W),ce=new Set(["textContent","innerText","innerHTML","value","checked","selected","disabled","readOnly","type","id","className","title"]),le=new Set(["tagName","nodeName","nodeType","nodeValue","childElementCount","classList","baseURI","documentURI","contentType","offsetWidth","offsetHeight","clientWidth","clientHeight","scrollWidth","scrollHeight","currentSrc","duration","paused","dataset"]);var B={};ie(B,{EmptyListInsert:()=>j,MAX_RULE_DEPTH:()=>P,MaxRuleDepthExceeded:()=>w,RuleTargetReadOnly:()=>C,RulesParseError:()=>_,ShapeMismatch:()=>L,UnknownRulesVersion:()=>T});var _=class extends Error{constructor(t,r){super(t),this.name="RulesParseError",this.cause=r}},T=class extends Error{constructor(t){super(`unknown rules version: ${t}. Library supports "1".`),this.name="UnknownRulesVersion",this.version=t}},P=20,w=class extends Error{constructor(t){super(`rule depth exceeded ${P} at path: ${t.join(".")}`),this.name="MaxRuleDepthExceeded",this.path=t}},L=class extends Error{constructor(t){super(`shape mismatch: ${t.length} field(s) failed validation`),this.name="ShapeMismatch",this.mismatches=t}},j=class extends Error{constructor(t){super(`cannot add items to empty list at "${t.join(".")}" \u2014 no sibling to clone as template. Seed the list with a hidden item first.`),this.name="EmptyListInsert",this.path=t}},C=class extends Error{constructor(t){super(`cannot write to read-only DOM property "${t}"`),this.name="RuleTargetReadOnly",this.target=t}};function E(e,t,r,o={}){return G(e,t,r,{depth:0,path:[]},o)}function G(e,t,r,o,n){if(o.depth>P)throw new w(o.path);if(typeof r=="string")return Ne(e,t,r,n);if(Array.isArray(r)){let[i,c]=r;return e.find(t,i,n).map((l,u)=>G(e,l,c,{depth:o.depth+1,path:[...o.path,u]},n))}if(typeof r=="object"&&r!==null){let i={};for(let[c,s]of Object.entries(r))i[c]=G(e,t,s,{depth:o.depth+1,path:[...o.path,c]},n);return i}return null}function Ne(e,t,r,o){if(r.endsWith("[]")){let i=r.slice(0,-2);return e.find(t,i,o).map(c=>e.text(c))}if(r.startsWith("@"))return fe(e,t,r.slice(1));if(r.includes("@")){let i=r.lastIndexOf("@"),c=r.slice(0,i),s=r.slice(i+1),l=c?e.find(t,c,o):[t];return l.length===0?null:fe(e,l[0],s)}if(r===".")return e.text(t);let n=e.find(t,r,o);return n.length===0?null:e.text(n[0])}function fe(e,t,r){if(z.has(r)){let n=e.prop(t,r);return n==null?null:String(n)}let o=e.attr(t,r);return o||null}var Me=.5;function X(e,t,r,o,n,i,c,s={}){let l=e.find(t,r,s);if(n.length===0){l.forEach(p=>e.remove(p));return}let u=n.length>l.length,f=l[0]||null;if(u&&!f&&(f=je(e,t,r,s),!f))throw new j(i.path);let d=l.map(p=>_e(e,p,o,s)),a=null;if(f){a=e.clone(f),s.templateAttr&&e.removeAttr(a,s.templateAttr);let p=e.stripIds(a);p>0&&console.warn(`[hyper-html-api] stripped ${p} id attribute(s) from cloned template at "${i.path.join(".")||"(root)"}"`)}let R=Pe(n,d,o),y=l[0]||f,N=e.parent(y),K=l.length>0?Le(e,N,y):0,A=new Set,O=n.map((p,g)=>{let h=R[g];if(h>=0)return A.add(h),l[h];let M=e.clone(a);return e.stripIds(M),M});l.forEach((p,g)=>{A.has(g)||e.remove(p)}),O.forEach((p,g)=>{let h=K+g;e.children(N).findIndex(Ae=>e.sameNode(Ae,p))!==h&&e.insertAt(N,p,h)}),O.forEach((p,g)=>{if(o===null){let h=n[g],M=h==null?"":String(h);e.text(p)!==M&&e.text(p,M)}else{let h=c(e,p,o,n[g],{depth:i.depth+1,path:[...i.path,g]},s);h&&h!==p&&(O[g]=h)}})}function _e(e,t,r,o){return r===null?e.text(t):E(e,t,r,o)}function Pe(e,t,r){let o=new Array(e.length).fill(-1),n=new Set;return e.forEach((i,c)=>{let s=-1,l=-1;t.forEach((u,f)=>{if(n.has(f))return;let d=De(i,u,r),a=d===l&&s>=0?Math.abs(f-c)<Math.abs(s-c):!1;(d>l||a)&&(l=d,s=f)}),l>=Me&&(o[c]=s,n.add(s))}),o}function De(e,t,r){if(r===null)return e===t?1:0;let o=Object.keys(r||{});if(o.length===0)return 0;let n=0;for(let i of o)JSON.stringify(e?.[i])===JSON.stringify(t?.[i])&&n++;return n/o.length}function Le(e,t,r){let o=e.children(t);for(let n=0;n<o.length;n++)if(e.sameNode(o[n],r))return n;return-1}function je(e,t,r,o){if(!o.templateAttr)return null;let n=t;for(;n;){let i=e.find(n,r,{includeRulesTag:!1,templateAttr:null});for(let c of i)if(e.attr(c,o.templateAttr)!=null)return c;n=e.parent(n)}return null}var ae=new Set(["checked","selected","disabled","readOnly","paused"]);function S(e,t,r,o,n={}){let i=[];if(Q(r,o,[],i),i.length)throw new L(i);q(e,t,r,o,{depth:0,path:[]},n)}function q(e,t,r,o,n,i={}){if(n.depth>P)throw new w(n.path);if(o===void 0)return t;if(typeof r=="string")return Ce(e,t,r,o,n,i);if(Array.isArray(r)){let[c,s]=r;return X(e,t,c,s,o,n,q,i),t}if(typeof r=="object"&&r!==null){for(let[c,s]of Object.entries(r)){let l=q(e,t,s,o==null?o:o[c],{depth:n.depth+1,path:[...n.path,c]},i);l&&l!==t&&(t=l)}return t}return t}function Ce(e,t,r,o,n,i){if(r.endsWith("[]")){let s=r.slice(0,-2);return X(e,t,s,null,o,n,q,i),t}if(r.startsWith("@"))return ue(e,t,r.slice(1),o);if(r.includes("@")){let s=r.lastIndexOf("@"),l=r.slice(0,s),u=r.slice(s+1),f=l?e.find(t,l,i):[t];return f.length===0||ue(e,f[0],u,o),t}if(r===".")return e.text(t,o==null?"":String(o)),t;let c=e.find(t,r,i);return c.length===0||e.text(c[0],o==null?"":String(o)),t}function ue(e,t,r,o){if(le.has(r))throw new C(r);if(r==="outerHTML"){let n=o==null?"":String(o);return e.replaceWith(t,n)}return ce.has(r)?(e.prop(t,r,ke(r,o)),t):(e.attr(t,r,o==null?"":String(o)),t)}function ke(e,t){return t==null?ae.has(e)?!1:"":ae.has(e)?!!t:t}function Q(e,t,r,o){if(t!==void 0){if(typeof e=="string"){if(e.endsWith("[]")){Array.isArray(t)?t.forEach((n,i)=>{typeof n=="object"&&n!==null&&o.push({path:$([...r,i]),expected:"scalar",got:k(n)})}):o.push({path:$(r),expected:"array",got:k(t)});return}t!==null&&typeof t=="object"&&o.push({path:$(r),expected:"scalar",got:k(t)});return}if(Array.isArray(e)){if(!Array.isArray(t)){o.push({path:$(r),expected:"array",got:k(t)});return}let n=e[1];t.forEach((i,c)=>Q(n,i,[...r,c],o));return}if(typeof e=="object"&&e!==null){if(t===null||Array.isArray(t)||typeof t!="object"){o.push({path:$(r),expected:"object",got:k(t)});return}for(let[n,i]of Object.entries(e))Q(i,t[n],[...r,n],o)}}}function k(e){return e===null?"null":Array.isArray(e)?"array":typeof e}function $(e){return e.join(".")}function Z(e){try{return JSON.parse(e)}catch(t){throw new _(`Invalid strict JSON: ${t.message}`,t)}}function b(e){try{return JSON.parse(e)}catch{}let t={BRACE_OPEN:"{",BRACE_CLOSE:"}",BRACKET_OPEN:"[",BRACKET_CLOSE:"]",COLON:":",COMMA:",",STRING:"STRING",SELECTOR:"SELECTOR",IDENTIFIER:"IDENTIFIER",NUMBER:"NUMBER",BOOLEAN:"BOOLEAN"};function r(n){let i=[],c=0;for(;c<n.length;){let s=n[c];if(/\s/.test(s)){c++;continue}if("{}".includes(s)){i.push({type:s,value:s}),c++;continue}if(s==="["){let d=!1,a=c+1;for(;a<n.length&&/\s/.test(n[a]);)a++;if(a<n.length&&/[a-zA-Z_]/.test(n[a])&&(d=!0),!d){i.push({type:s,value:s}),c++;continue}}if(s==="]"){i.push({type:s,value:s}),c++;continue}if(s===":"){i.push({type:t.COLON,value:s}),c++;continue}if(s===","){i.push({type:t.COMMA,value:s}),c++;continue}if(s==='"'||s==="'"){let d=s,a=c+1;for(;a<n.length&&n[a]!==d;)n[a]==="\\"&&a++,a++;i.push({type:t.STRING,value:n.substring(c+1,a),quoted:!0,sourceQuote:d}),c=a+1;continue}let l=c,u;for(;l<n.length&&!/[{},]/.test(n[l]);)if(n[l]===":"){let d=[":first",":last",":nth-child",":nth-of-type",":first-child",":last-child",":first-of-type",":last-of-type",":only-child",":only-of-type",":hover",":focus",":active",":visited",":disabled",":enabled",":checked",":empty",":root",":target",":not",":before",":after",":nth-last-child",":nth-last-of-type"],a=!1;for(let R of d){let y=R.substring(1);if(n.substring(l+1,l+1+y.length)===y){a=!0,l+=y.length;break}}if(!a)break}else if(n[l]==="["){for(l++;l<n.length&&n[l]!=="]";){if(n[l]==='"'||n[l]==="'"){let d=n[l];for(l++;l<n.length&&n[l]!==d;)n[l]==="\\"&&l++,l++}l++}l<n.length&&n[l]==="]"&&l++}else l++;u=n.substring(c,l);let f=t.IDENTIFIER;/^-?\d+(\.\d+)?$/.test(u)?f=t.NUMBER:u==="true"||u==="false"||u==="null"?f=t.BOOLEAN:/^[.#@\[]|[.#@\[]| /.test(u)&&(f=t.SELECTOR),i.push({type:f,value:u,quoted:!1}),c=l}return i}function o(n){let i="";for(let c=0;c<n.length;c++){let s=n[c];if("{}".includes(s.type)||"[]".includes(s.type)){i+=s.value;continue}if(s.type===t.COLON){i+=s.value;continue}if(s.type===t.COMMA){let l=n[c+1];if(l&&(l.type==="}"||l.type==="]"))continue;i+=s.value;continue}if(s.type===t.STRING&&s.quoted){let l=s.value;s.sourceQuote==="'"&&(l=l.replace(/\\'/g,"'"),l=l.replace(/(\\*)"/g,(u,f)=>f.length%2===0?f+'\\"':u)),i+=`"${l}"`;continue}if(s.type===t.NUMBER||s.type===t.BOOLEAN){i+=s.value;continue}if(s.type===t.SELECTOR||s.type===t.IDENTIFIER){i+=`"${s.value}"`;continue}i+=`"${s.value}"`}return i}try{let n=r(e),i=o(n);return JSON.parse(i)}catch(n){throw new _("Invalid extraction rules syntax: "+n.message,n)}}var ee="1",de=/^[a-zA-Z0-9_-]+$/;function U(e,t,r){let o;if(r===void 0)o="script[data-rules-name]";else{if(typeof r!="string"||!de.test(r))throw new Error(`hyper-html-api: invalid rules token ${JSON.stringify(r)} (must match ${de})`);o=`script[data-rules-name~="${r}"]`}let n=e.find(t,o,{includeRulesTag:!0});if(n.length===0)return null;r!==void 0&&n.length>1&&console.warn(`hyper-html-api: ${n.length} rules tags match data-rules-name~="${r}"; using the first.`);let i=n[0],c=e.attr(i,"data-rules-version");if(c!==ee)throw new T(c);return{rules:b(e.text(i)),tagNode:i}}function te(e,t,r){if(r&&typeof r=="object")return{rules:r,tagNode:null};if(typeof r=="string"){let o=t&&t.ownerDocument?t.ownerDocument:t;return U(e,o,r)}return null}function pe(e,t,r,o){let n=te(e,t,r);if(!n){let s=typeof r=="string"?`data-rules-name~="${r}"`:"the provided rules object";throw new Error(`hyper-html-api: could not resolve rules for ${s}`)}let{rules:i,tagNode:c}=n;return{rules:i,tagNode:c,get:()=>E(e,t,i,o),set:s=>S(e,t,i,s,o)}}function Ue(e){return e&&e.nodeType===1&&e.tagName==="SCRIPT"&&e.hasAttribute&&e.hasAttribute("data-rules-name")}function He(e){return e?(e.nodeType===9||e.nodeType===11,e):null}var We={find(e,t,r={}){let o=He(e);if(!o||!o.querySelectorAll)return[];let n=Array.from(o.querySelectorAll(t));r.includeRulesTag||(n=n.filter(s=>!Ue(s)));let i=[];r.skip&&i.push(r.skip);let c=r.templateAttr===null?null:r.templateAttr||"cms-template";if(c&&i.push("["+c+"]"),i.length){let s=i.join(", ");n=n.filter(l=>!l.closest||!l.closest(s))}return n},parent(e){return e?e.parentElement:null},children(e){return e?Array.from(e.children):[]},text(e,t){if(t===void 0)return(e.textContent||"").trim();e.textContent=t},attr(e,t,r){if(r===void 0)return e.hasAttribute&&e.hasAttribute(t)?e.getAttribute(t):null;e.setAttribute(t,r)},removeAttr(e,t){e&&e.removeAttribute&&e.removeAttribute(t)},prop(e,t,r){if(r===void 0){let o=e?e[t]:void 0;return o!==void 0?o:null}e[t]=r},clone(e){return e.cloneNode(!0)},insertAt(e,t,r){let o=e.children[r]||null;e.insertBefore(t,o)},remove(e){e&&e.parentNode&&e.parentNode.removeChild(e)},replaceWith(e,t){if(!e||!e.parentNode)throw new Error("dom.replaceWith: node has no parent");let o=e.ownerDocument.createElement("template");o.innerHTML=t;let n=o.content.firstElementChild;if(!n)throw new Error("dom.replaceWith: html did not parse to an element");return e.parentNode.replaceChild(n,e),n},stripIds(e){let t=0;return e.id&&(e.removeAttribute("id"),t++),(e.querySelectorAll?e.querySelectorAll("[id]"):[]).forEach(o=>{o.removeAttribute("id"),t++}),t},sameNode(e,t){return e===t}},m=We;var re={extract:(e,t,r)=>E(m,e,t,r),apply:(e,t,r,o)=>S(m,e,t,r,o),findRulesIn:(e,t)=>U(m,e,t),findRules:(e,t)=>te(m,e,t),bind:(e,t,r)=>pe(m,e,t,r),parseStrict:Z,parseRelaxed:b,errors:B,DOM_PROPERTIES:W};var Be="hha:upgrade-check:";function x(e,t){let r=e.querySelector(`meta[name="${t}"]`),o=r?r.getAttribute("content"):null;return o&&o.trim()?o.trim():null}function he(e){if(typeof e!="string")return null;let t=e.trim().replace(/^v/,"");return/^\d+(\.\d+)*$/.test(t)?t.split(".").map(Number):null}function qe(e,t){let r=he(e),o=he(t);if(!r||!o)return!1;let n=Math.max(r.length,o.length);for(let i=0;i<n;i++){let c=r[i]||0,s=o[i]||0;if(c!==s)return c>s}return!1}function Fe(e){try{let t=globalThis.localStorage.getItem(e);return t?JSON.parse(t):null}catch{return null}}function Je(e,t){try{globalThis.localStorage.setItem(e,JSON.stringify(t))}catch{}}async function me({force:e=!1,doc:t,loc:r,fetchFn:o,now:n,ttlMs:i=864e5}={}){if(t=t||(typeof document<"u"?document:null),r=r||(typeof location<"u"?location:null),o=o||(a=>fetch(a)),n=n??Date.now(),!t)return null;let c=x(t,"hyper-source");if(!c)return null;let s=x(t,"hyper-version"),l;try{l=new URL(c,r?r.href:void 0)}catch{return null}if(r&&l.origin===r.origin&&l.pathname===r.pathname)return null;let u=`${Be}${l.href}:${s||"none"}`,f,d=e?null:Fe(u);if(d&&typeof d.checkedAt=="number"&&n-d.checkedAt<i)f=d.sourceVersion;else{try{let a=await o(l.href);if(!a.ok)throw new Error(`HTTP ${a.status}`);let R=await a.text(),y=new DOMParser().parseFromString(R,"text/html");f=x(y,"hyper-version")}catch{f=null}Je(u,{checkedAt:n,sourceVersion:f})}return f?{available:qe(f,s||"0.0.0"),currentVersion:s,sourceVersion:f,sourceUrl:l.href}:null}var Ve="script[data-rules-name]";function ve(e){return typeof e=="string"?e.trim().replace(/\s+/g," "):""}function F(e,t){let r=e.find(t,Ve,{includeRulesTag:!0}),o=new Set,n=[];for(let i of r){let c=ve(e.attr(i,"data-rules-name"));if(!c)continue;if(o.has(c)){console.warn(`hyper-html-api: duplicate rules tag name "${c}"; using the first.`);continue}let s=e.attr(i,"data-rules-version");if(s!==ee)throw new T(s);o.add(c),n.push({name:c,rules:b(e.text(i))})}return n}function ne(e,t){let r={};for(let{name:o,rules:n}of F(e,t))r[o]=E(e,t,n);return r}function ye(e){let t=e||document,r=t.nodeType===9?t:t.ownerDocument||t;return{dataByName:ne(m,t),version:x(r,"hyper-version")}}var H=class extends Error{constructor(t,r){super(`could not fetch upgrade source: ${t}`),this.name="UpgradeSourceUnreachable",this.sourceUrl=t,this.cause=r}},J=class extends Error{constructor(t){super(`upgrade source has no rules tags; refusing to drop all existing data: ${t}`),this.name="UpgradeSourceHasNoRules",this.sourceUrl=t}},I=class extends Error{constructor(t,r){super(t),this.name="UpgradeTransformInvalid",this.cause=r}},V=class extends Error{constructor(t){super(`found ${t} script[type="text/hyper-upgrade"] tags; only one is allowed per document.`),this.name="UpgradeMultipleTransforms",this.count=t}};var Ke="text/hyper-upgrade";function ge(e,t){let r=e.find(t,`script[type="${Ke}"]`);if(r.length===0)return null;if(r.length>1)throw new V(r.length);return e.text(r[0])||null}var Ye=new Function("url","return import(url)");async function Ee(e){let t=new Blob([e],{type:"text/javascript"}),r=URL.createObjectURL(t),o;try{o=await Ye(r)}catch(n){throw new I(`transform failed to load: ${n&&n.message?n.message:n}`,n)}finally{URL.revokeObjectURL(r)}if(typeof o.default!="function")throw new I("transform must `export default` a function");return o.default}function v(e,t){let r={carriedOver:0,discarded:0,listItems:0},o=oe(t,e,r);return se(t,e,r),{data:o,summary:r}}function oe(e,t,r){if(typeof e=="string")return e.endsWith("[]")?Array.isArray(t)?(r.listItems+=t.length,r.carriedOver+=t.length,t):void 0:t==null||typeof t=="object"?void 0:(r.carriedOver++,t);if(Array.isArray(e)){let[,o]=e;return Array.isArray(t)?(r.listItems+=t.length,t.map(n=>oe(o,n,r))):void 0}if(typeof e=="object"&&e!==null){let o={};for(let[n,i]of Object.entries(e)){let c=oe(i,t?.[n],r);c!==void 0&&(o[n]=c)}return o}}function se(e,t,r){if(t!=null){if(typeof e=="object"&&e!==null&&!Array.isArray(e)){if(typeof t!="object"||Array.isArray(t))return;let o=new Set(Object.keys(e));for(let n of Object.keys(t))o.has(n)?se(e[n],t[n],r):r.discarded+=D(t[n]);return}if(Array.isArray(e)&&Array.isArray(t)){let o=e[1];t.forEach(n=>se(o,n,r));return}typeof e=="string"&&!e.endsWith("[]")&&typeof t=="object"&&t!==null&&(r.discarded+=D(t))}}function D(e){return e==null?0:Array.isArray(e)?e.reduce((t,r)=>t+D(r),0):typeof e=="object"?Object.values(e).reduce((t,r)=>t+D(r),0):1}function xe(e,t,r){let o=F(e,t),n={carriedOver:0,discarded:0,listItems:0},i={},c=new Set;for(let{name:s,rules:l}of o){if(c.add(s),!Object.prototype.hasOwnProperty.call(r,s)){i[s]={carriedOver:0,discarded:0,listItems:0};continue}let{data:u,summary:f}=v(r[s],l);S(e,t,l,u),i[s]=f,n.carriedOver+=f.carriedOver,n.discarded+=f.discarded,n.listItems+=f.listItems}for(let s of Object.keys(r))c.has(s)||(n.discarded+=D(r[s]));return{totals:n,byName:i,rulesTagCount:o.length}}async function Re({sourceUrl:e,dataByName:t,fromVersion:r,doc:o,loc:n,fetchFn:i}={}){if(o=o||(typeof document<"u"?document:null),n=n||(typeof location<"u"?location:null),i=i||(A=>fetch(A)),!o)throw new Error("upgrade.run requires a document context");if(e=e||x(o,"hyper-source"),!e)throw new Error("upgrade.run: no sourceUrl given and no hyper-source meta tag found");let c=new URL(e,n?n.href:void 0);r=r!==void 0?r:x(o,"hyper-version"),t=t||ne(m,o);let s;try{s=await i(c.href)}catch(A){throw new H(c.href,A)}if(!s.ok)throw new H(c.href,new Error(`HTTP ${s.status}`));let l=await s.text(),u=new DOMParser().parseFromString(l,"text/html"),f=x(u,"hyper-version"),d=t,a=!1,R=ge(m,u);if(R){let O=await(await Ee(R))(d,{fromVersion:r,toVersion:f});if(!O||typeof O!="object"||Array.isArray(O))throw new I("transform must return a plain object map of { rulesName: data }");d=O,a=!0}let{totals:y,byName:N,rulesTagCount:K}=xe(m,u,d);if(K===0&&Object.keys(d).length>0)throw new J(c.href);return{html:ze(u),fromVersion:r,toVersion:f,summary:{transformApplied:a,totals:y,byName:N}}}function ze(e){return`<!DOCTYPE ${e.doctype&&e.doctype.name?e.doctype.name:"html"}>
|
|
2
|
+
`+e.documentElement.outerHTML}var Oe={checkForUpdate:me,run:Re,extractAll:ye,shapeMatch:v};var Ge={engine:re,upgrade:Oe},Xe=Ge;return Ie(Qe);})();
|
package/package.json
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
"apply",
|
|
10
10
|
"CMS"
|
|
11
11
|
],
|
|
12
|
-
"version": "0.
|
|
12
|
+
"version": "0.5.0",
|
|
13
13
|
"homepage": "https://github.com/panphora/hyper-html-api",
|
|
14
14
|
"bugs": {
|
|
15
15
|
"url": "https://github.com/panphora/hyper-html-api/issues"
|
|
@@ -30,12 +30,14 @@
|
|
|
30
30
|
"./cms": "./src/cms/index.js",
|
|
31
31
|
"./cheerio": "./src/adapters/cheerio.js",
|
|
32
32
|
"./dom": "./src/adapters/dom.js",
|
|
33
|
-
"./data": "./src/data.js"
|
|
33
|
+
"./data": "./src/data.js",
|
|
34
|
+
"./upgrade": "./src/upgrade.js"
|
|
34
35
|
},
|
|
35
36
|
"scripts": {
|
|
36
37
|
"build": "npx esbuild src/hyper-html-api.js --bundle --minify --format=iife --global-name=HyperHtmlApi --outfile=dist/hyper-html-api.min.js",
|
|
37
38
|
"build:engine": "npx esbuild src/data.js --bundle --minify --format=iife --global-name=hyperHtmlApiData --outfile=dist/hyper-html-api.engine.min.js",
|
|
38
|
-
"
|
|
39
|
+
"build:upgrade": "npx esbuild src/upgrade.js --bundle --minify --format=iife --global-name=hyperHtmlApiUpgrade --outfile=dist/hyper-html-api.upgrade.min.js",
|
|
40
|
+
"copy-to-hyperclayjs": "npm run build:engine && npm run build:upgrade && node scripts/copy-to-hyperclayjs.js",
|
|
39
41
|
"prepublishOnly": "npm run build",
|
|
40
42
|
"demo": "http-server . -p 5693 -c-1 -o /demo/",
|
|
41
43
|
"test": "web-test-runner",
|
package/src/adapters/cheerio.js
CHANGED
|
@@ -18,7 +18,12 @@ const cheerioAdapter = {
|
|
|
18
18
|
if (!opts.includeRulesTag) matches = matches.filter((n) => !isRulesTag(n))
|
|
19
19
|
const skipParts = []
|
|
20
20
|
if (opts.skip) skipParts.push(opts.skip)
|
|
21
|
-
|
|
21
|
+
// The cms-template seed marker means "not data" for EVERY consumer, so skip
|
|
22
|
+
// it by DEFAULT (not just when a caller opts in). Pass templateAttr:null to
|
|
23
|
+
// include seed elements — used by the grow-from-zero fallback lookup, which
|
|
24
|
+
// must still see the seed to clone it.
|
|
25
|
+
const tplAttr = opts.templateAttr === null ? null : (opts.templateAttr || 'cms-template')
|
|
26
|
+
if (tplAttr) skipParts.push('[' + tplAttr + ']')
|
|
22
27
|
if (skipParts.length) {
|
|
23
28
|
const combined = skipParts.join(', ')
|
|
24
29
|
matches = matches.filter((n) => !n.closest || n.closest(combined).length === 0)
|
package/src/adapters/dom.js
CHANGED
|
@@ -18,7 +18,12 @@ const dom = {
|
|
|
18
18
|
if (!opts.includeRulesTag) all = all.filter((n) => !isRulesTag(n))
|
|
19
19
|
const skipParts = []
|
|
20
20
|
if (opts.skip) skipParts.push(opts.skip)
|
|
21
|
-
|
|
21
|
+
// The cms-template seed marker means "not data" for EVERY consumer, so skip
|
|
22
|
+
// it by DEFAULT (not just when a caller opts in). Pass templateAttr:null to
|
|
23
|
+
// include seed elements — used by the grow-from-zero fallback lookup, which
|
|
24
|
+
// must still see the seed to clone it.
|
|
25
|
+
const tplAttr = opts.templateAttr === null ? null : (opts.templateAttr || 'cms-template')
|
|
26
|
+
if (tplAttr) skipParts.push('[' + tplAttr + ']')
|
|
22
27
|
if (skipParts.length) {
|
|
23
28
|
const combined = skipParts.join(', ')
|
|
24
29
|
all = all.filter((n) => !n.closest || !n.closest(combined))
|
package/src/engine/diff.js
CHANGED
|
@@ -157,7 +157,9 @@ function findFallbackTemplate(adapter, parentCtx, selector, opts) {
|
|
|
157
157
|
if (!opts.templateAttr) return null
|
|
158
158
|
let scope = parentCtx
|
|
159
159
|
while (scope) {
|
|
160
|
-
|
|
160
|
+
// templateAttr:null opts out of the adapter's default cms-template skip — the
|
|
161
|
+
// fallback lookup MUST see the seed element to clone it for grow-from-zero.
|
|
162
|
+
const candidates = adapter.find(scope, selector, { includeRulesTag: false, templateAttr: null })
|
|
161
163
|
for (const n of candidates) {
|
|
162
164
|
if (adapter.attr(n, opts.templateAttr) != null) return n
|
|
163
165
|
}
|
package/src/engine/errors.js
CHANGED
|
@@ -49,10 +49,3 @@ export class RuleTargetReadOnly extends Error {
|
|
|
49
49
|
this.target = name
|
|
50
50
|
}
|
|
51
51
|
}
|
|
52
|
-
|
|
53
|
-
export class UpgradeAlreadyRegistered extends Error {
|
|
54
|
-
constructor() {
|
|
55
|
-
super('upgrade transform already registered; only one registration is allowed per page.')
|
|
56
|
-
this.name = 'UpgradeAlreadyRegistered'
|
|
57
|
-
}
|
|
58
|
-
}
|
package/src/engine/rules-tag.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { parseRelaxed } from './rules.js'
|
|
2
2
|
import { UnknownRulesVersion } from './errors.js'
|
|
3
3
|
|
|
4
|
-
const SUPPORTED_VERSION = '1'
|
|
4
|
+
export const SUPPORTED_VERSION = '1'
|
|
5
5
|
const TOKEN_RE = /^[a-zA-Z0-9_-]+$/
|
|
6
6
|
|
|
7
7
|
// findRulesIn(adapter, root) → first script[data-rules-name] (tooling/no-token)
|
package/src/hyper-html-api.js
CHANGED
|
@@ -11,19 +11,10 @@ const cms = {
|
|
|
11
11
|
}
|
|
12
12
|
|
|
13
13
|
const upgrade = {
|
|
14
|
-
|
|
14
|
+
checkForUpdate: upgradeMod.checkForUpdate,
|
|
15
15
|
run: upgradeMod.run,
|
|
16
|
+
extractAll: upgradeMod.extractAll,
|
|
16
17
|
shapeMatch: upgradeMod.shapeMatch,
|
|
17
|
-
isHelperMode: upgradeMod.isHelperMode,
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
// Helper-mode auto-boot: when the library loads inside an iframe whose URL
|
|
21
|
-
// carries `?_hyperHtmlApi=upgrade-helper`, we wire up the postMessage handshake
|
|
22
|
-
// immediately so authors don't have to add any boot code themselves. Their
|
|
23
|
-
// `registerUpgrade(...)` calls (which run inline as v2's scripts execute) are
|
|
24
|
-
// captured by the registry before the handshake message fires.
|
|
25
|
-
if (typeof window !== 'undefined' && upgradeMod.isHelperMode(window.location)) {
|
|
26
|
-
upgradeMod.bootHelper({ win: window, doc: document })
|
|
27
18
|
}
|
|
28
19
|
|
|
29
20
|
// Named exports ensure the IIFE namespace exposes engine/cms/upgrade and the
|