@vcp-dev/site-edit-bridge 0.6.2 → 0.6.3
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/dist/auto-bootstrap.js +1 -1
- package/dist/client.js +1 -1
- package/dist/document-codec.d.ts +1 -1
- package/dist/document-codec.js +1 -1
- package/dist/index.js +3 -3
- package/dist/next-dev-server.d.ts +27 -3
- package/dist/next-dev-server.js +3 -3
- package/dist/server.js +2 -2
- package/dist/start-next-dev-server.js +53 -30
- package/dist/window-message.js +1 -1
- package/package.json +3 -3
package/dist/auto-bootstrap.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function Ie(e){if(!yt(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=new Map(e.dynamicDataSummaries??[]),i=o=>{let s=t.get(o);if(s)return s;let u=e.nodes[o];if(!u)throw new Error(`Missing compact document node ${o}`);let[a,c]=u,m=e.tokens[c];if(typeof m!="string")throw new Error(`Missing compact document token ${c}`);let h=`${a===null?"":i(a)}${m}`;return t.set(o,h),h};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map((o,s)=>{let[u,a,c]=o,m=c===void 0?void 0:n[c];if(c!==void 0&&!m)throw new Error(`Missing page composition unit ${c}`);return{key:i(u),...m?{pageCompositionUnitKey:m}:{},operationSummary:gt(a),...r.get(s)?{dynamicDataSummary:r.get(s)}:{}}})}}function gt(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function yt(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}var G=class e{constructor(){}static parseMessage(t,n={}){let r=JSON.parse(t);if(!e.isMessage(r,n))throw new Error("Invalid site edit bridge message");return r}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(typeof t=="object"&&t!==null&&"payload"in t&&typeof t.payload=="object"&&t.payload!==null){let n=t.payload,r=typeof n.id=="string"?n.id:"unknown",i=e.isRequestKind(n.kind)?n.kind:"get-document";return{id:r,kind:i}}return{id:"unknown",kind:"get-document"}}static isRequestKind(t){return t==="initialize-session"||t==="get-document"||t==="get-history-status"||t==="get-style-context"||t==="get-object-edit-context"||t==="get-class-name-source"||t==="get-source-tree"||t==="get-source-file"||t==="resolve-source-location"||t==="execute"||t==="undo"||t==="redo"}static isMessage(t,n={}){return!O(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?O(t.payload)&&typeof t.payload.id=="string":t.type==="event"?O(t.payload)&&O(t.payload.event):t.type==="auth"?O(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?O(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!O(t)||typeof t.id!="string"||!e.isRequestKind(t.kind))return!1;switch(t.kind){case"initialize-session":return typeof t.routeId=="string"&&(t.mutationContext===void 0||Ce(t.mutationContext));case"get-document":case"get-style-context":return typeof t.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof t.key=="string"&&(t.routeId===void 0||typeof t.routeId=="string");case"get-history-status":return t.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof t.path=="string";case"execute":return bt(t.request)&&(t.request.mutationContext===void 0||Ce(t.request.mutationContext))&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return t.mutationContext===void 0||Ce(t.mutationContext)}}};function O(e){return typeof e=="object"&&e!==null}function bt(e){return O(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&(e.routeId===void 0||typeof e.routeId=="string")&&typeof e.kind=="string"&&O(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&O(e.params)}function Ce(e){return St(e)}function St(e){return O(e)?typeof e.editingSessionId=="string"&&e.editingSessionId.length>0&&typeof e.lockId=="string"&&e.lockId.length>0&&typeof e.ownerId=="string"&&e.ownerId.length>0&&typeof e.leaseAssertion=="string"&&e.leaseAssertion.length>0:!1}var Et="vcp:designer:trace",It="designer_trace",Oe="__VCP_DESIGNER_TRACE__";var Ct=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function vt(e=globalThis){let t=e;try{if(t.localStorage?.getItem(Et)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(It)==="1"}catch{return!1}}function $(e,t={},n=globalThis){if(!vt(n))return;let r={type:e,timestamp:Date.now(),payload:xt(t)},i=n,o=i[Oe]??[];o.push(r),o.length>200&&o.splice(0,o.length-200),i[Oe]=o;let s=n.console?.debug;typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function xt(e){return ve(e,0)}function ve(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>ve(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,i]of Object.entries(e)){if(Ct.test(r)){n[r]="[redacted]";continue}n[r]=ve(i,t+1)}return n}var ue=class{constructor(t){this.options=t,this.socket=null,this.connectPromise=null,this.connectAttempt=null,this.connectionState="idle",this.intentionalClose=!1,this.sequence=0,this.pending=new Map,this.listeners=new Set,this.connectionStatusListeners=new Set}connect(){return this.socket?.readyState===xe&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((t,n)=>{let r;try{r=this.createSocket(this.options.url)}catch(u){let a=ee(u,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",a.message),n(a);return}let i={socket:r,settled:!1,reject:n};this.connectAttempt=i,this.socket=r;let o=()=>{this.socket!==r||this.connectAttempt!==i||(i.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),t())},s=(u,a)=>{this.cleanupSocket(r,u,a)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(G.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(u){s(ee(u,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=u=>{if(this.socket!==r)return;let a=ee(u,"WebSocket failed");s(a,"failed")},r.onmessage=u=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===i&&!i.settled){this.handleAuthHandshakeMessage(u.data,r,i,()=>{o()});return}this.handleMessage(u.data)}},r.onclose=u=>{if(this.socket!==r)return;let a=this.intentionalClose,c=new Error(kt(u,{intentional:a}));s(c,a?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let t=this.socket;if(!t){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(t,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(t){return this.connectionStatusListeners.add(t),t({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(t)}}getDocument(t){return this.request("get-document",{routeId:t})}initializeSession(t){return this.request("initialize-session",t)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(t){return this.request("get-style-context",{routeId:t})}getObjectEditContext(t,n){return this.request("get-object-edit-context",{key:t,routeId:n})}getClassNameSource(t,n){return this.request("get-class-name-source",{key:t,routeId:n})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(t){return this.request("get-source-file",t)}resolveSourceLocation(t){return this.request("resolve-source-location",t)}execute(t,n){return this.request("execute",{request:t})}undo(t){return this.request("undo",{})}redo(t){return this.request("redo",{})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}request(t,n){let r=this.socket;if(!r||r.readyState!==xe||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${r?.readyState??"none"})`));let i=`${t}-${this.sequence+=1}`,o=At(i,t,n);return $("bridge.request",{id:i,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:qe(n.request,"kind"),documentVersion:qe(n.request,"documentVersion")}),new Promise((s,u)=>{let a=this.resolveRequestTimeoutMs(t),c=a>0?setTimeout(()=>{let m=this.pending.get(i);m&&(this.pending.delete(i),$("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),m.reject(new Error(`Bridge request timed out after ${a}ms: ${t}`)))},a):null;c?.unref?.(),this.pending.set(i,{kind:t,timeout:c,resolve:m=>s(m),reject:u});try{r.send(G.stringifyMessage(o))}catch(m){let h=ee(m,"WebSocket send failed");this.clearPendingRequest(i),u(h),this.cleanupSocket(r,h,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(G.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=ee(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=G.parseMessage(t);if(n.type==="event"){for(let i of this.listeners)i(n.payload.event);return}if(n.type!=="response"&&n.type!=="error")return;let r=this.pending.get(n.payload.id);if(r){if(this.clearPendingRequest(n.payload.id),n.type==="error"){$("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1}),r.reject(new Error(n.payload.message));return}$("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:Dt(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Ie(n.payload.result.data)}:r.kind==="initialize-session"?Nt(n.payload.result):n.payload.result)}}rejectAll(t){for(let[n,r]of[...this.pending])this.clearPendingRequest(n),r.reject(t)}clearPendingRequest(t){let n=this.pending.get(t);n&&(n.timeout&&clearTimeout(n.timeout),this.pending.delete(t))}resolveRequestTimeoutMs(t){let n=this.options.requestTimeoutMsByKind?.[t];return typeof n=="number"?Math.max(0,n):typeof this.options.requestTimeoutMs=="number"?Math.max(0,this.options.requestTimeoutMs):Tt[t]??Rt}cleanupSocket(t,n,r){if(this.socket===t&&(this.socket=null),this.connectAttempt?.socket===t){let i=this.connectAttempt;this.connectAttempt=null,i.settled||(i.settled=!0,i.reject(n))}this.connectPromise=null,this.rejectAll(n),this.setConnectionState(r,n.message),t.onopen=null,t.onmessage=null,t.onerror=null,t.onclose=null;try{(t.readyState===_t||t.readyState===xe)&&t.close()}catch{}}setConnectionState(t,n){if(this.connectionState===t&&!n)return;this.connectionState=t;let r={state:t,...n?{message:n}:{}};this.options.onConnectionStatus?.(r);for(let i of this.connectionStatusListeners)i(r)}createSocket(t){if(this.options.createSocket)return this.options.createSocket(t);if(typeof WebSocket>"u")throw new Error("Site edit preview bridge requires WebSocket");return new WebSocket(t)}},_t=0,xe=1,Rt=15e3,Tt={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function ee(e,t){return e instanceof Error?e:new Error(t)}function kt(e,t){return t.intentional?"WebSocket disconnected":e?.code===1008?e.reason?`Bridge session authentication failed: ${e.reason}`:"Bridge session authentication failed":e?.reason?`WebSocket closed: ${e.reason}`:typeof e?.code=="number"&&e.code!==1005?`WebSocket closed with code ${e.code}`:"WebSocket closed"}function qe(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Dt(e){if(!e||typeof e!="object")return null;let t=e,n=t.data?.resultVersion??t.data?.version??null;return typeof n=="number"?n:null}function Ve(e){return new _e(e)}var _e=class{constructor(t){this.params=t,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=t.initialDocument,this.observedDocumentVersion=t.initialDocument.version,this.sessionInitialized=!Ke(t.initialDocument)}async getDocument(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=Ke(this.currentDocument);return(n||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(n?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(t){if(t.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let n=await this.params.client.initializeSession(t);return this.currentDocument=n.data.document,this.observedDocumentVersion=n.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),n}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=this.styleContextCache;if(n?.generation===this.styleGeneration)return{ok:!0,data:n.value};let r=this.styleContextInFlight;if(r?.generation===this.styleGeneration)return r.request;let i=this.styleGeneration,o=this.params.client.getStyleContext(t).then(s=>(this.styleGeneration===i&&(this.styleContextCache={generation:i,value:s.data}),s)).finally(()=>{this.styleContextInFlight?.request===o&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:i,request:o},o}async ensureDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let r=await this.refreshSnapshot(n,"ensure-version");if(r.version<n)throw new Error(`Document refresh returned version ${r.version}, expected at least ${n}`);return{ok:!0,data:r}}async acknowledgeDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);return n>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:n},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n),{ok:!0,data:this.currentDocument}}async getObjectEditContext(t,n){let r=this.objectCacheKey(t,n),i=this.editContextCache.get(r);if(i)return{ok:!0,data:i};let o=this.editContextInFlight.get(r);if(o)return o;let s=this.objectGeneration,u=this.params.client.getObjectEditContext(t,n??this.params.routeId).then(a=>(this.objectGeneration===s&&this.editContextCache.set(r,a.data),a)).finally(()=>{this.editContextInFlight.get(r)===u&&this.editContextInFlight.delete(r)});return this.editContextInFlight.set(r,u),u}async getClassNameSource(t,n){let r=this.objectCacheKey(t,n),i=this.classNameSourceCache.get(r);if(i)return i;let o=this.classNameSourceInFlight.get(r);if(o)return o;let s=this.objectGeneration,u=this.params.client.getClassNameSource(t,n??this.params.routeId).then(a=>(this.objectGeneration===s&&this.classNameSourceCache.set(r,a),a)).finally(()=>{this.classNameSourceInFlight.get(r)===u&&this.classNameSourceInFlight.delete(r)});return this.classNameSourceInFlight.set(r,u),u}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(t){return this.params.client.getSourceFile(t)}async resolveSourceLocation(t){return this.params.client.resolveSourceLocation({...t,routeId:t.routeId??this.params.routeId})}async execute(t,n){let r=t.target.kind==="node"&&!t.routeId?{...t,routeId:this.params.routeId}:t;return this.params.client.execute(r)}async undo(t){return this.params.client.undo()}async redo(t){return this.params.client.redo()}subscribe(t){return this.params.client.subscribe(n=>{if(n.type==="site-edit.document.changed"&&n.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n.version),n.version>this.currentDocument.version&&this.clearObjectCaches(),t(n);return}t(n)})}async refreshSnapshot(t,n="ensure-version"){if(typeof t=="number"&&this.currentDocument.version>=t)return $("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;if(this.refreshInFlight){$("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let i=await this.refreshInFlight;if(typeof t!="number"||i.version>=t||this.currentDocument.version>=t)return this.currentDocument}$("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!1,source:n});let r=this.params.client.getDocument(this.params.routeId).then(i=>(this.currentDocument=i.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,i.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=r;try{return await r}finally{this.refreshInFlight===r&&(this.refreshInFlight=null)}}clearObjectCaches(t){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!t?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(t,n){return`${n??this.params.routeId}\0${t}`}};function Ke(e){return e.version===0&&e.entries.length===0}function Nt(e){let t=e;return{...t,data:{...t.data,document:Ie(t.data.document)}}}function At(e,t,n){switch(t){case"initialize-session":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId),...n.mutationContext?{mutationContext:n.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-history-status":return{type:"request",payload:{id:e,kind:t}};case"get-style-context":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:e,kind:t}};case"get-source-file":return{type:"request",payload:{id:e,kind:t,path:String(n.path)}};case"resolve-source-location":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"execute":return{type:"request",payload:{id:e,kind:t,request:n.request}};case"undo":case"redo":return{type:"request",payload:{id:e,kind:t,mutationContext:n.mutationContext}}}}var Ue="vcp-window-message";function Pt(e){return{source:Ue,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function Ft(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.source===Ue&&t.version===1&&typeof t.namespace=="string"&&typeof t.channel=="string"&&"body"in t}var We="site-edit",je="frame-runtime";function te(e,t={}){return Pt({namespace:We,channel:je,sessionKey:t.sessionKey,body:e})}function $e(e){return!Ft(e)||e.namespace!==We||e.channel!==je?!1:typeof e.body?.type=="string"}var ke="vcp-site-edit:route-ready",De="vcp-site-edit:bridge-status",Bt=1e3,Mt="data-vcp-ui-component",Xe="data-vcp-theme-preview",we="::repeat-item#",ae="components/ui",Ot=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),qt=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function Kt(e,t=""){let n=tt(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function Vt(e,t){if(e.__VCP_SITE_EDIT_VERSION_LOGGED__)return;let n=e.console?.info;typeof n=="function"&&(e.__VCP_SITE_EDIT_VERSION_LOGGED__=!0,n.call(e.console,"[VCP Site Edit] runtime loaded",{bridge:t.versions?.bridge??"unknown",contracts:t.versions?.contracts??"unknown",documentVersion:t.documentVersion,engine:t.versions?.engine??"unknown",routeId:t.routeId}))}function Ut(e,t={}){if(t.explicit_ws_url)return t.explicit_ws_url.startsWith("/")?`${e.location.protocol==="https:"?"wss:":"ws:"}//${e.location.host}${t.explicit_ws_url}`:t.explicit_ws_url;let n=e.location.protocol==="https:"?"wss:":"ws:",r=t.port?`${e.location.hostname}:${t.port}`:e.location.host;return`${n}//${r}${t.path??"/__vcp/site-edit/bridge"}`}async function cr(e=window,t={}){let n=Ut(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=Wt({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(jt(i.signature,r)){await i.syncRoute?.();return}i.cleanup?.()}let o={activeClient:null,activeBridge:null,cleanupFrameRuntime:(()=>{}),retryTimer:void 0,routeSequence:0,syncInFlight:null,syncScheduled:!1,disposed:!1,currentDocument:null,currentEntriesByKey:new Map,unsubscribeDocument:void 0,unsubscribeConnectionStatus:void 0,unbindBootstrapLifecycle:void 0,unbindRouteChange:void 0},s,u=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===s,a=t.create_client??(p=>new ue({url:p,authKey:t.bridge_session_key})),c=t.schedule_after_navigation??Lt,m=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},h=()=>Kt(e.location.pathname,t.basePath||""),R=!!e.parent&&e.parent!==e,E=p=>{en(e,p)},C=p=>{o.currentDocument=p,o.currentEntriesByKey=new Map((p?.entries??[]).map(g=>[g.key,g]))},v=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},N=(p,g)=>!o.disposed&&g===o.routeSequence&&p===h(),T=async(p,g)=>{let _=o.activeBridge;if(!_)return null;let d=await _.getDocument(p);return N(p,g)&&C(d.data),d.data},P=()=>{v(),C(null);let p=o.activeBridge;o.activeBridge=null,p&&e.__VCP_SITE_EDIT__===p&&delete e.__VCP_SITE_EDIT__;let g=o.activeClient;o.activeClient=null,g?.disconnect()},ye=p=>p===s.routeId&&!!o.activeBridge&&(R||!!(o.currentDocument&&nn(o.currentDocument,p)))&&tn(o.activeClient),be=p=>Math.min(Bt*2**Math.max(0,p),8e3),H=(p,g,_)=>{if(o.disposed)return;m();let d=be(_);E({state:"reconnecting",routeId:p,attempt:_,retryInMs:d,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||g!==o.routeSequence)&&oe(_+1).catch(f=>{let l=h();if(p===l){if(J(f)){E({state:"reload-required",routeId:p,attempt:_,messageKey:"studio.errors.previewBridgeReloadRequired"});return}H(p,o.routeSequence,_+1)}})},d)},X=(p,g,_)=>{if(!N(p,g)||o.activeClient===null)return;if(J(_.message)){P(),m(),E({state:"reload-required",routeId:p,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let d=o.activeClient;v(),C(null);let f=o.activeBridge;o.activeBridge=null,f&&e.__VCP_SITE_EDIT__===f&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,d?.disconnect(),H(p,g,0)},Se=p=>{let g=h(),_=o.routeSequence;if(!(!N(g,_)||o.activeClient===null)){if(J(p)){P(),m(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}et(p)&&X(g,_,{state:"failed",message:Pe(p,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=Ht(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:p=>o.currentEntriesByKey.get(p)??null,setCurrentDocument:C,onBridgeRequestError:p=>{Se(p)}});let Q=async()=>oe(0),oe=async p=>{if(o.disposed)return;let g=h();if(ye(g))return;let _=o.syncInFlight;if(_?.routeId===g)return _.promise;let d=o.routeSequence+1,f=Ee(g,d,p);o.syncInFlight={routeId:g,sequence:d,promise:f};try{await f}finally{o.syncInFlight?.promise===f&&(o.syncInFlight=null)}},Ee=async(p,g,_)=>{o.routeSequence=g,m(),P(),E({state:_>0?"reconnecting":"connecting",routeId:p,attempt:_,messageKey:_>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let d=a(n),f=!1;o.activeClient=d,o.unsubscribeConnectionStatus=d.subscribeConnectionStatus?.(l=>{f&&(l.state==="closed"||l.state==="failed")&&X(p,g,l)});try{if(await d.connect(),!N(p,g)){d.disconnect();return}let l=Ve({routeId:p,client:d,initialDocument:Gt(p)});o.activeBridge=l,u()&&(e.__VCP_SITE_EDIT__=l),o.activeClient=d,o.unsubscribeDocument=l.subscribe(k=>{k.type==="site-edit.document.changed"&&k.routeId===p&&o.currentDocument&&k.version>o.currentDocument.version&&T(p,g).catch(()=>{})}),u()&&(s.routeId=p);let x=(R?null:await l.initializeSession({routeId:p}))?.data.document??null;if(x&&C(x),!N(p,g)){d.disconnect();return}f=!0,E({state:"ready",routeId:p,attempt:_,messageKey:"studio.status.previewReady"}),Vt(e,{documentVersion:x?.version??0,routeId:p,versions:t.runtime_versions}),x&&Le(e,{routeId:p,version:x.version})}catch(l){if(v(),o.activeClient===d&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,d.disconnect(),C(null),!N(p,g))return;throw E({state:J(l)?"reload-required":"failed",routeId:p,attempt:_,messageKey:J(l)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),l}},W=p=>{if(o.disposed)return;let g=h();if(J(p)){m(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}H(g,o.routeSequence,0)},V=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,c(()=>{o.syncScheduled=!1,!o.disposed&&Q().catch(p=>W(p))}))},ie=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,m(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),P(),u()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:Q,cleanup:ie},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=wt(e,ie),o.unbindRouteChange=Zt(e,V,h),t.defer_initial_sync){V();return}await Q()}function Wt(e){return{basePath:tt(e.options.basePath??""),bridgeUrl:e.bridgeUrl,runtimeVersions:{bridge:e.options.runtime_versions?.bridge??null,contracts:e.options.runtime_versions?.contracts??null,engine:e.options.runtime_versions?.engine??null},sessionKeyFingerprint:$t(e.options.bridge_session_key)}}function jt(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function $t(e){if(!e)return null;let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return`${e.length}:${t.toString(36)}`}function wt(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),zt(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function zt(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function Gt(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function Ht(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,u=null,a=null,c=null,m=null,h=new Map,R=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,E=()=>{n?.(),n=null,r=null},C=()=>{i?.(),i=null,o?.(),o=null},v=(d,f,l)=>{let D=s?.sessionKey!==d||s?.sourceWindow!==f||s?.targetOrigin!==l;s={sessionKey:d,sourceWindow:f,targetOrigin:l},D&&(c=null,m=null)},N=(d,f)=>{let l=e.parent&&e.parent!==e?e.parent:null;return!l||f!==l?!1:!R||d===R},T=()=>{for(let d of h.values())d();h.clear()},P=d=>JSON.stringify([d.routeId,d.version]),ye=()=>!a||a.state==="ready",be=d=>JSON.stringify([d.state,d.routeId??null,d.attempt??null,d.retryInMs??null,d.messageKey??null]),H=d=>{if(!ye())return;let f=P(d);c!==f&&(o?.(),o=null,W({kind:"route-ready",payload:{routeId:d.routeId,version:d.version}}),s&&(c=f))},X=d=>{let f=be(d);m!==f&&(d.state!=="ready"&&(c=null,u=null),W({kind:"bridge-status",payload:d}),s&&(m=f))},Se=d=>{u=d,H(d)},Q=d=>{a=d,X(d)},oe=()=>{u&&H(u)},Ee=()=>{a&&X(a)},W=d=>{s&&s.sourceWindow.postMessage(te({type:"event",...d},{sessionKey:s.sessionKey}),s.targetOrigin)},V=(d,f,l,D)=>{let x=fe(e.document,f.clientX,f.clientY,t.getCurrentDocument?.()??null),k=x?B(x,l==="full"?K(e.document,x,t.getCurrentDocument?.()??null):He(e.document,x,t.getCurrentDocument?.()??null),t.getDocumentEntry,l):null;D&&k&&(d==="pointer-click"||d==="pointer-double-click")&&(D.preventDefault(),D.stopPropagation(),typeof D.stopImmediatePropagation=="function"&&D.stopImmediatePropagation()),W({kind:d,payload:{clientX:f.clientX,clientY:f.clientY,buttons:Number(f.buttons??0),hit:k}})},ie=(d,f,l)=>{C(),s={sessionKey:d,sourceWindow:f,targetOrigin:l};let D=Yn(e.document),x=null,k=null,y=()=>{k=null;let b=x;x=null,b&&V("pointer-move",b,"summary")},M=b=>{x={clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},k===null&&(k=Qe(e,y))},j=b=>{V("pointer-down",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Y=b=>{V("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},U=b=>{V("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},z=b=>{V("pointer-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Z=b=>{V("pointer-double-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},L=()=>{W({kind:"scroll",payload:{metrics:de(e)}})};e.document.addEventListener("pointerdown",j,!0),e.document.addEventListener("pointermove",M,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",Y,!0),e.document.addEventListener("pointercancel",U,!0),e.document.addEventListener("click",z,!0),e.document.addEventListener("dblclick",Z,!0),e.addEventListener("scroll",L,{passive:!0}),i=()=>{k!==null&&(Ze(e,k),k=null),x=null,D(),e.document.removeEventListener("pointerdown",j,!0),e.document.removeEventListener("pointermove",M,!0),e.document.removeEventListener("pointerup",Y,!0),e.document.removeEventListener("pointercancel",U,!0),e.document.removeEventListener("click",z,!0),e.document.removeEventListener("dblclick",Z,!0),e.removeEventListener("scroll",L)}},p=d=>{let f=d.detail;f?.routeId&&Se(f)},g=d=>{let f=d.detail;f?.state&&Q(f)},_=d=>{let f=d.data;if(!$e(f)||f.body.type!=="request"||f.body.kind!=="apply-node-patch"&&f.body.kind!=="get-hit-by-ref"&&f.body.kind!=="get-path-by-ref"&&f.body.kind!=="get-scroll-metrics"&&f.body.kind!=="scroll-to"&&f.body.kind!=="scroll-by"&&f.body.kind!=="set-interaction-mode"&&f.body.kind!=="set-theme-override"&&f.body.kind!=="clear-theme-override"&&f.body.kind!=="get-theme-variables"&&f.body.kind!=="compute-drop-target-at-point"&&f.body.kind!=="observe-node-bounds"&&f.body.kind!=="clear-node-bounds-observer"&&f.body.kind!=="restore-text-edit"&&f.body.kind!=="clear-text-edit-rollback"&&f.body.kind!=="start-text-edit-at-point"&&f.body.kind!=="hit-test-at-point"&&!ze(f.body))return;let l=f.body,D=typeof f.sessionKey=="string"?f.sessionKey:null,x=d.source,k=d.origin;if(!D||!k||!x||typeof x.postMessage!="function"||!N(D,x))return;if(s){if(s.sourceWindow!==x||s.targetOrigin!==k)return;s.sessionKey!==D&&(E(),C(),T(),s=null)}v(D,x,k),Ee(),oe();let y=M=>{let j=typeof l.id=="string"?l.id:"unknown";x.postMessage(te({id:j,...M},{sessionKey:D}),k)};try{if(ze(l)){Jt({message:l,sendEvent:S=>{x.postMessage(te({type:"event",...S},{sessionKey:D}),k)},sendResponse:y,subscriptions:h,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(l.kind==="apply-node-patch"){let S=w(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for patch target"});return}let I=l.payload.preview,F=I?Bn(I.sessionId,l.payload.ref):null;if(F&&I){let se=ne.get(F)??-1;if(I.revision<se){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,stale:!0,latestRevision:se}});return}if(I.revision===se){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,duplicate:!0,latestRevision:se}});return}}if(Pn(S,l.payload.patch),F&&I&&Mn(F,I.revision),I?.responseDetail==="none"){y({type:"response",ok:!0,result:{applied:!0,appliedRevision:I.revision}});return}y({type:"response",ok:!0,result:B(S,K(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,I?.responseDetail??"full")});return}if(l.kind==="get-hit-by-ref"){let S=w(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for hit target"});return}y({type:"response",ok:!0,result:B(S,K(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(l.kind==="get-path-by-ref"){let S=w(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!S){y({type:"response",ok:!1,error:"No editable element found for path target"});return}let I=[],F=S;for(;F;)F.getAttribute("data-vcp-edit-key")&&I.push(B(F,K(e.document,F,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),F=F.parentElement;y({type:"response",ok:!0,result:I.reverse()});return}if(l.kind==="restore-text-edit"||l.kind==="clear-text-edit-rollback"){let S=l.payload.ref;if(l.kind==="clear-text-edit-rollback"){r&&Ge(r.ref,S)&&(r=null),y({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!Ge(r.ref,S)){y({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let I=sn(e.document,r,t.getCurrentDocument?.()??null);r=null,y(I?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(l.kind==="get-scroll-metrics"){y({type:"response",ok:!0,result:de(e)});return}if(l.kind==="scroll-to"){let S=Number(l.payload.x),I=Number(l.payload.y);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:S,top:I}),y({type:"response",ok:!0,result:de(e)});return}if(l.kind==="scroll-by"){let S=Number(l.payload.deltaX),I=Number(l.payload.deltaY);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:S,top:I}),y({type:"response",ok:!0,result:{...de(e),scrolled:!0}});return}if(l.kind==="set-interaction-mode"){l.payload.enabled?ie(D,x,k):s?.sourceWindow===x&&s.targetOrigin===k&&s.sessionKey===D&&C(),y({type:"response",ok:!0,result:{interactionEnabled:l.payload.enabled}});return}if(l.kind==="set-theme-override"){On(e.document,l.payload),y({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(l.kind==="clear-theme-override"){qn(e.document),y({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(l.kind==="get-theme-variables"){y({type:"response",ok:!0,result:Kn(e.document,l.payload.names)});return}if(l.kind==="compute-drop-target-at-point"){let S=Number(l.payload?.x),I=Number(l.payload?.y);if(!Number.isFinite(S)||!Number.isFinite(I)){y({type:"response",ok:!1,error:"Invalid drop target point"});return}y({type:"response",ok:!0,result:Rn(e,S,I,l.payload.dragKind,l.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(l.kind==="observe-node-bounds"){let S=l.payload.ref;if(!S){y({type:"response",ok:!1,error:"Missing bounds observer target"});return}let I=w(e.document,S,t.getCurrentDocument?.()??null);if(!I){y({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=In(e,I,S,t.getCurrentDocument,t.getDocumentEntry,F=>W({kind:"node-bounds-change",payload:{hit:F}})),y({type:"response",ok:!0,result:{observing:!0}}),W({kind:"node-bounds-change",payload:{hit:B(I,S,t.getDocumentEntry,"summary")}});return}if(l.kind==="clear-node-bounds-observer"){o?.(),o=null,y({type:"response",ok:!0,result:{cleared:!0}});return}if(l.kind!=="hit-test-at-point"&&l.kind!=="start-text-edit-at-point")return;let M=Number(l.payload?.x),j=Number(l.payload?.y);if(!Number.isFinite(M)||!Number.isFinite(j)){y({type:"response",ok:!1,error:"Invalid text edit point"});return}let Y=l.kind==="hit-test-at-point"?fe(e.document,M,j,t.getCurrentDocument?.()??null):an(e.document,M,j,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!Y){y({type:"response",ok:!1,error:l.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let U=l.kind==="start-text-edit-at-point"?Y:null,z=l.kind==="hit-test-at-point"?Y:U.element,Z=l.payload.detailLevel??"full",L=Z==="full"?K(e.document,z,t.getCurrentDocument?.()??null):He(e.document,z,t.getCurrentDocument?.()??null),b=U&&typeof U.textSegmentIndex=="number"?{...L,textSegmentIndex:U.textSegmentIndex}:L,ht=B(z,b,t.getDocumentEntry,Z);if(l.kind==="hit-test-at-point"){y({type:"response",ok:!0,result:ht});return}E(),n=jn(e,z,b,S=>{x.postMessage(te({type:"event",...S},{sessionKey:D}),k)},{...U?.textNode?{textNode:U.textNode}:{},onCommitSnapshot:S=>{r=S}}),y({type:"response",ok:!0,result:{ref:b}})}catch(M){y({type:"response",ok:!1,error:M instanceof Error?M.message:"Failed to start text edit"})}};return e.addEventListener("message",_),e.addEventListener(ke,p),e.addEventListener(De,g),()=>{E(),C(),s=null,T(),e.removeEventListener("message",_),e.removeEventListener(ke,p),e.removeEventListener(De,g)}}function ze(e){let t=e.kind;return t==="bridge-initialize-session"||t==="bridge-get-document"||t==="bridge-get-history-status"||t==="bridge-get-style-context"||t==="bridge-ensure-document-version"||t==="bridge-acknowledge-document-version"||t==="bridge-get-object-edit-context"||t==="bridge-get-class-name-source"||t==="bridge-get-source-tree"||t==="bridge-get-source-file"||t==="bridge-resolve-source-location"||t==="bridge-execute"||t==="bridge-undo"||t==="bridge-redo"||t==="bridge-subscribe"||t==="bridge-unsubscribe"}function Yt(e){return e.kind==="update-text"||e.kind==="update-array-item"||e.kind==="set-class-name-source"||e.kind==="set-props"||e.kind==="apply-style-draft"}async function Jt({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,windowLike:u}){let a=u.__VCP_SITE_EDIT__;if(!a){n({type:"response",ok:!1,error:"Site edit bridge is not ready in preview frame"});return}try{switch(e.kind){case"bridge-initialize-session":{let c=await a.initializeSession({routeId:e.payload.routeId});o?.(c.data.document),Le(u,{routeId:c.data.document.routeId,version:c.data.document.version}),n({type:"response",ok:!0,result:c});return}case"bridge-get-document":{let c=await a.getDocument(e.payload.routeId);o?.(c.data),n({type:"response",ok:!0,result:c});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await a.getHistoryStatus()});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await a.getStyleContext(e.payload.routeId)});return;case"bridge-ensure-document-version":{if(!Number.isFinite(Number(e.payload.minVersion))){n({type:"response",ok:!1,error:"Invalid document version"});return}let c=a.ensureDocumentVersion?await a.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await a.getDocument(e.payload.routeId);o?.(c.data),n({type:"response",ok:!0,result:c});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let c=a.acknowledgeDocumentVersion?await a.acknowledgeDocumentVersion(e.payload.routeId,Number(e.payload.version)):await a.getDocument(e.payload.routeId);o?.(c.data),n({type:"response",ok:!0,result:c});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await a.getObjectEditContext(e.payload.key,e.payload.routeId)});return;case"bridge-get-class-name-source":{let c=await a.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:Xt(c,e.payload.key,u.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await a.getSourceTree()});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await a.getSourceFile({path:e.payload.path})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await a.resolveSourceLocation({key:e.payload.key,routeId:e.payload.routeId})});return;case"bridge-execute":{let c=await a.execute(e.payload.request),m=i?.()?.routeId;if(c.ok&&m&&a.acknowledgeDocumentVersion&&Yt(e.payload.request)){let h=await a.acknowledgeDocumentVersion(m,c.data.resultVersion);o?.(h.data)}n({type:"response",ok:!0,result:c});return}case"bridge-undo":n({type:"response",ok:!0,result:await a.undo()});return;case"bridge-redo":n({type:"response",ok:!0,result:await a.redo()});return;case"bridge-subscribe":{let c=e.payload.subscriptionId;r.get(c)?.();let m=a.subscribe(h=>{t({kind:"bridge-event",payload:{event:h,subscriptionId:c}})});r.set(c,m),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let c=e.payload.subscriptionId;r.get(c)?.(),r.delete(c),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(c){s?.(c,e),n({type:"response",ok:!1,error:rn(c)})}}function Xt(e,t,n,r){if(!e.ok)return e;let i=w(n,{key:t},r),o=i?Qt(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function Qt(e){let t=e.ownerDocument.defaultView;if(!t)return null;let n=t.getComputedStyle(e);return{color:n.color,backgroundColor:n.backgroundColor,borderColor:n.borderColor}}function Zt(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let c=n();c!==o&&(o=c,t())},u=()=>s(),a=()=>s();return e.history.pushState=function(...m){let h=r.apply(this,m);return s(),h},e.history.replaceState=function(...m){let h=i.apply(this,m);return s(),h},e.addEventListener("popstate",u),e.addEventListener("hashchange",a),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",u),e.removeEventListener("hashchange",a)}}function Lt(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function Qe(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function Ze(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function Le(e,t){e.dispatchEvent(new CustomEvent(ke,{detail:t}))}function en(e,t){e.dispatchEvent(new CustomEvent(De,{detail:t}))}function tn(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function nn(e,t){return e.routeId===t}function Pe(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function et(e){let t=Pe(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function rn(e){let t=Pe(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":et(t)?"Site edit bridge disconnected":t}function J(e){let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/authentication|auth failed|auth rejected|bridge key|session|unauthorized|forbidden|expired/i.test(t)}function tt(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function Fe(e){return Ot.has(rt(e))}function on(e){return qt.has(rt(e))}function nt(e){return e.operationSummary?{canUpdateText:e.operationSummary.canUpdateText,canInsertChild:e.operationSummary.canInsertChild,canMove:e.operationSummary.canMove,canRemove:e.operationSummary.canRemove}:e.fallbackMode!=="preview"?{canUpdateText:!1,canInsertChild:!1,canMove:!1,canRemove:!1}:{canUpdateText:on(e.tagName),canInsertChild:Fe(e.tagName),canMove:!1,canRemove:!1}}function rt(e){return e?.trim().toLowerCase()??""}function Ge(e,t){return e.key!==t.key||e.instanceIndex!==t.instanceIndex||e.instanceCount!==t.instanceCount?!1:typeof e.textSegmentIndex=="number"&&typeof t.textSegmentIndex=="number"?e.textSegmentIndex===t.textSegmentIndex:!0}function sn(e,t,n){let r=w(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=un(r,t.ref.textSegmentIndex);return i?(i.nodeValue=t.initialText,!0):!1}return typeof t.initialHtml=="string"?(r.innerHTML=t.initialHtml,!0):(r.textContent=t.initialText,!0)}function un(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!pe(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function an(e,t,n,r,i){let o=fe(e,t,n,r),s=ot(o);if(!s)return null;let u=s.getAttribute("data-vcp-edit-key")??"",a=K(e,s,r),c=i?.(a.key)??i?.(u);if(!nt({operationSummary:c?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let h=cn(e,t,n,s);if(h){let R=dn(s,h);if(R!==null)return{element:s,textNode:h,textSegmentIndex:R}}return ge(s)?null:{element:s}}function cn(e,t,n,r){let i=ln(e,t,n);return!i||i.parentElement!==r?null:i}function ln(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(pe(o))return o;let u=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return pe(u)?u:null}function dn(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!pe(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function pe(e){return e?.nodeType===3}function fe(e,t,n,r=null){let i=typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean);for(let o of i){let s=ot(o),u=s?.getAttribute("data-vcp-edit-key")??"";if(s&&gn(s,r,u))return s}return null}function ot(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(Be(t))return n??t;!pn(r)&&!n&&(n=t)}t=t.parentElement}return n}function Be(e){return e.getAttribute(Mt)!==null}function pn(e){return fn(e.split("::")[0]??"")}function fn(e){if(!e)return!1;let t=mn(e);return t===ae||t.startsWith(`${ae}/`)||t.includes(`/${ae}/`)||t.endsWith(`/${ae}`)}function mn(e){let n=(e.split("?")[0]??e).replace(/\\/g,"/").replace(/^\.\//,""),r=[];for(let i of n.split("/"))if(!(!i||i===".")){if(i===".."){r.pop();continue}r.push(i)}return r.join("/")}function K(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=st(at(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${mt(r)}"]`))),n,r);if(i.length<=1)return{key:Ye(n,r,0)};let o=i.indexOf(t);return o>=0?{key:Ye(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function He(e,t,n){return K(e,t,n)}function w(e,t,n){let r=me(t.key)??t.key,i=st(at(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${mt(r)}"]`))),n,t.key);if(i.length===0)return null;let o=typeof t.instanceIndex=="number"&&t.instanceIndex>=0&&t.instanceIndex<i.length?t.instanceIndex:null,s=(me(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let u=hn(n,t.key);return u!==null&&u>=0&&u<i.length?i[u]??null:o!==null?i[o]??null:i[0]??null}function Ye(e,t,n){return it(e,t)[n]?.key??t}function hn(e,t){let n=me(t);if(!n)return null;let i=it(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function it(e,t){return(e?.entries??[]).filter(n=>(me(n.key)??n.key)===t)}function st(e,t,n){let r=ut(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function gn(e,t,n){let r=ut(t,n);return!r||e.tagName.toLowerCase()===r}function ut(e,t){return null}var yn=2,bn=4;function at(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&bn)!==0?-1:(r&yn)!==0?1:0})}function me(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(we);if(n<0)break;let r=Number(t.slice(n+we.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function Sn(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e);return{...ct(n),paddingTop:A(n?.paddingTop),paddingRight:A(n?.paddingRight),paddingBottom:A(n?.paddingBottom),paddingLeft:A(n?.paddingLeft),borderTopWidth:A(n?.borderTopWidth),borderRightWidth:A(n?.borderRightWidth),borderBottomWidth:A(n?.borderBottomWidth),borderLeftWidth:A(n?.borderLeftWidth),columnGap:A(n?.columnGap),rowGap:A(n?.rowGap)}}function ct(e){return{marginTop:A(e?.marginTop,!0),marginRight:A(e?.marginRight,!0),marginBottom:A(e?.marginBottom,!0),marginLeft:A(e?.marginLeft,!0)}}function A(e,t=!1){let n=Number.parseFloat(e??"");return Number.isFinite(n)?t?n:Math.max(0,n):0}function En(e){let t=e.ownerDocument?.defaultView;return Array.from(e.children).filter(n=>typeof n.getBoundingClientRect=="function").map(n=>({rect:_n(n.getBoundingClientRect()),margin:ct(t?.getComputedStyle(n))})).filter(({rect:n})=>n.width>0&&n.height>0)}function B(e,t,n,r="full"){let i=e.getBoundingClientRect(),o=n?.(t.key)??null,s=e.tagName.toLowerCase(),u=he(e),a=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([C,v])=>[C,v??""])),attributes:Object.fromEntries(e.getAttributeNames().map(C=>[C,e.getAttribute(C)??""]))}:{},c=nt({operationSummary:o?.operationSummary,tagName:s,fallbackMode:"preview"}),m=Be(e),h=!0,R=lt(e)?.getAttribute("data-vcp-edit-key")??null,E=En(e);return{ref:t,key:t.key,detailLevel:r,tagName:s,...o?{sourceKind:"jsx"}:{},...R?{parentKey:R}:{},...o?.pageCompositionUnitKey?{pageCompositionUnitKey:o.pageCompositionUnitKey}:{},...a,runtimeFlags:{selectable:!0,movable:c.canMove,removable:c.canRemove,textEditable:c.canUpdateText,container:m?!1:!!ge(e)||c.canInsertChild||h&&Fe(s)},layout:u,rect:{top:i.top,left:i.left,width:i.width,height:i.height},childBoxes:E,childRects:E.map(({rect:C})=>C),spacing:Sn(e)}}function In(e,t,n,r,i,o){let s=t,u=B(s,n,i,"summary"),a=null,c=()=>{a===null&&(a=Qe(e,m))},m=()=>{a=null;let N=w(e.document,n,r?.()??null);if(!N)return;N!==s&&(R?.unobserve(s),s=N,R?.observe(s));let T=B(s,n,i,"summary");T.rect.width<=0||T.rect.height<=0||Cn(u,T)&&(u=T,o(T))},h=e.ResizeObserver,R=typeof h=="function"?new h(c):null;R?.observe(s);let E=e.MutationObserver,C=typeof E=="function"?new E(c):null;C?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",c,{passive:!0});let v=e.visualViewport;return v?.addEventListener?.("resize",c,{passive:!0}),e.document.addEventListener("load",c,!0),()=>{a!==null&&(Ze(e,a),a=null),R?.disconnect(),C?.disconnect(),e.removeEventListener("resize",c),v?.removeEventListener?.("resize",c),e.document.removeEventListener("load",c,!0)}}function Cn(e,t){return Me(e.rect,t.rect)||vn(e.childBoxes,t.childBoxes)||xn(e.childRects,t.childRects)||Ne(e.spacing,t.spacing)||Ne(e.layout,t.layout)}function vn(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>{let s=r[o];return!s||Me(i.rect,s.rect)||Ne(i.margin,s.margin)})}function xn(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>Me(i,r[o]??i))}function Ne(e,t){let n=e??{},r=t??{},i=new Set([...Object.keys(n),...Object.keys(r)]);return Array.from(i).some(o=>n[o]!==r[o])}function _n(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function Me(e,t){return Math.abs(e.top-t.top)>.5||Math.abs(e.left-t.left)>.5||Math.abs(e.width-t.width)>.5||Math.abs(e.height-t.height)>.5}function Rn(e,t,n,r,i,o,s){let u=e.document,a=fe(u,t,n,o);if(!a)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let c=i?w(u,i,o):null;if(c&&Ae(a,c))return ce(u,a,"self-or-descendant",o,s);if(r==="move"&&c){let v=Nn(u,a,c,o,s);if(v){let N=Re(v.child,v.targetParent,t,n,"nearest");if(N)return le(u,v.child,v.targetParent,N,o,s)}}let m=null,h=!1,R=a,E=a.parentElement;for(;E;){if(E.getAttribute("data-vcp-edit-key")){if(c&&Ae(E,c))return ce(u,a,"self-or-descendant",o,s);let v=Je(E,r,s);if(v==="accept"){m={child:R,targetParent:E};break}v==="blocked"&&(h=!0),R=E}E=E.parentElement}let C=Je(a,r,s);if(C==="accept"){if(m){let v=Re(m.child,m.targetParent,t,n,"edge");if(v)return le(u,m.child,m.targetParent,v,o,s)}return le(u,a,a,Tn(a,t,n),o,s)}if(m){let v=Re(m.child,m.targetParent,t,n,"nearest");return le(u,m.child,m.targetParent,v??"after",o,s)}return C==="blocked"||h?ce(u,a,"operation-boundary-blocked",o,s):ce(u,a,"no-accepting-parent",o,s)}function ce(e,t,n,r,i){return{anchorHit:B(t,K(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function le(e,t,n,r,i,o){let s=B(t,K(e,t,i),o,"summary"),u=B(n,K(e,n,i),o,"summary"),a=he(n).indicatorOrientation,c=r==="append"||r==="prepend"?kn(n.getBoundingClientRect(),a,r):Dn(t.getBoundingClientRect(),a,r);return{anchorHit:s,targetParentHit:u,relation:r,indicatorOrientation:a,indicatorBounds:c}}function Je(e,t,n){if(Be(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":ge(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return Fe(o)?"accept":"not-container"}function Re(e,t,n,r,i){let o=he(t).indicatorOrientation,s=e.getBoundingClientRect(),u=o==="vertical"?s.width>0?(n-s.left)/s.width:.5:s.height>0?(r-s.top)/s.height:.5;return i==="edge"&&u>=.25&&u<=.75?null:u<.5?"before":"after"}function Tn(e,t,n){let r=he(e).indicatorOrientation,i=e.getBoundingClientRect();return(r==="vertical"?i.width>0?(t-i.left)/i.width:.5:i.height>0?(n-i.top)/i.height:.5)<.5?"prepend":"append"}function he(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=n?.display??"",i=n?.flexDirection,o=n?.gridAutoFlow,s="horizontal";return r==="flex"||r==="inline-flex"?s=(i??"row").startsWith("row")?"vertical":"horizontal":(r==="grid"||r==="inline-grid")&&(s=(o??"row").includes("column")?"vertical":"horizontal"),{display:r,...i?{flexDirection:i}:{},...o?{gridAutoFlow:o}:{},indicatorOrientation:s}}function kn(e,t,n){if(t==="vertical")return{left:n==="prepend"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="prepend"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function Dn(e,t,n){if(t==="vertical")return{left:n==="before"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="before"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function Ae(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function Nn(e,t,n,r,i){let o=An(e,t,n,r,i);if(o)return o;let s=lt(n);if(!s||t===s)return null;let u=t,a=t.getAttribute("data-vcp-edit-key")?t:null;for(;u&&u!==s;)u.getAttribute("data-vcp-edit-key")&&(a=u),u=u.parentElement;return u!==s||!a||a===s||a===n||Ae(a,n)?null:{child:a,targetParent:s}}function An(e,t,n,r,i){return null}function lt(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function ge(e){for(let t of Array.from(e.childNodes)){if(typeof t.getAttribute!="function")continue;let n=t;if(n.getAttribute("data-vcp-edit-key"))return n;let r=ge(n);if(r)return r}return null}function de(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:q(e.scrollX),scrollY:q(e.scrollY),scrollWidth:Math.max(q(t?.scrollWidth),q(n?.scrollWidth),q(e.innerWidth)),scrollHeight:Math.max(q(t?.scrollHeight),q(n?.scrollHeight),q(e.innerHeight)),viewportWidth:q(e.innerWidth),viewportHeight:q(e.innerHeight)}}function Pn(e,t){Object.entries(t.attributes??{}).forEach(([r,i])=>{if(i===null){e.removeAttribute(r);return}e.setAttribute(r,i)}),typeof t.className=="string"&&(e.className=t.className);let n=new Set(t.styleDeclarations?.map(r=>r.property)??[]);Object.entries(t.style??{}).forEach(([r,i])=>{if(n.has(r))return;let o=e.style,s=r.replace(/[A-Z]/g,u=>`-${u.toLowerCase()}`);if(i==null||i===""){o.removeProperty(s);return}o.setProperty(s,String(i))}),t.styleDeclarations?.forEach(r=>{let i=e.style,o=r.property.replace(/[A-Z]/g,u=>`-${u.toLowerCase()}`),s=r.value;if(s==null||s===""){i.removeProperty(o);return}i.setProperty(o,String(s),r.priority)})}var Fn=500,ne=new Map;function Bn(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function Mn(e,t){if(ne.size>=Fn){let n=ne.keys().next().value;n&&ne.delete(n)}ne.set(e,t)}var re=new Set;function On(e,t){let n=e.documentElement?.style,r=new Set;for(let[i,o]of Object.entries(t.variables??{}))i.startsWith("--")&&(r.add(i),n?.setProperty(i,o));for(let i of re)r.has(i)||n?.removeProperty(i);re.clear();for(let i of r)re.add(i);Wn(e,t.stylesheets??[])}function qn(e){let t=e.documentElement?.style;for(let n of re)t?.removeProperty(n);re.clear();for(let n of ft(e))n.remove()}function Kn(e,t){let n=Array.from(new Set(t.filter(s=>typeof s=="string"&&s.startsWith("--"))));if(n.length===0)return{};let r=e.documentElement,i=r?e.defaultView?.getComputedStyle(r):null,o={};for(let s of n){let u=dt(i,s);u&&(o[s]=u)}return o}function dt(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return pt(e,r,n)}function pt(e,t,n){if(!t)return null;let r=Vn(t);if(!r)return t;let i=dt(e,r.name,n);return i||(r.fallback?pt(e,r.fallback,n)??r.fallback:null)}function Vn(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=Un(n),i=r>=0?n.slice(0,r).trim():n;if(!i.startsWith("--"))return null;let o=r>=0?n.slice(r+1).trim():null;return{name:i,fallback:o||null}}function Un(e){let t=0;for(let n=0;n<e.length;n+=1){let r=e[n];if(r==="("){t+=1;continue}if(r===")"){t=Math.max(0,t-1);continue}if(r===","&&t===0)return n}return-1}function Wn(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of ft(e)){let s=o.getAttribute("href")??"";if(!n.has(s)||r.has(s)){o.remove();continue}r.set(s,o)}let i=e.head;if(i)for(let o of n){if(r.has(o))continue;let s=e.createElement("link");s.setAttribute("rel","stylesheet"),s.setAttribute(Xe,"true"),s.setAttribute("href",o),i.appendChild(s)}}function ft(e){return Array.from(e.querySelectorAll(`link[${Xe}]`))}function jn(e,t,n,r,i={}){let o=i.textNode?$n(e.document,i.textNode):null;if(i.textNode&&!o)throw new Error("Failed to prepare text segment editor");let s=o?.element??t,u=s.textContent??"",a=o?void 0:t.innerHTML,c=wn(s),m=!1,h=()=>{e.document.removeEventListener("pointerdown",E,!0),s.removeEventListener("keydown",C),s.removeEventListener("blur",v),s.removeEventListener("input",N),Gn(s,c)},R=T=>{if(m)return;m=!0;let P=s.textContent??"";if(h(),T==="cancel"){o?.restore(u),o||(t.textContent=u),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(P),T==="commit"&&P!==u){i.onCommitSnapshot?.({ref:n,initialText:u,...a!==void 0?{initialHtml:a}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:P}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function E(T){let P=T.target;P&&s.contains(P)||R("commit")}function C(T){if(T.key==="Escape"){T.preventDefault(),R("cancel");return}T.key==="Enter"&&(T.metaKey||T.ctrlKey)&&(T.preventDefault(),R("commit"))}function v(){R("commit")}function N(){r({kind:"text-edit-input",payload:{ref:n,hit:B(t,n,void 0,"full")}})}return zn(s),e.document.addEventListener("pointerdown",E,!0),s.addEventListener("keydown",C),s.addEventListener("blur",v),s.addEventListener("input",N),Jn(s),Xn(s,e.document),h}function $n(e,t){let n=t.parentNode;if(!n)return null;let r=e.createElement("span");return r.setAttribute("data-vcp-text-segment-editor","true"),r.textContent=t.textContent??"",n.replaceChild(r,t),{element:r,restore(i){t.nodeValue=i,r.parentNode&&r.parentNode.replaceChild(t,r)}}}function wn(e){return{contentEditable:e.getAttribute("contenteditable"),spellcheck:e.getAttribute("spellcheck"),marker:e.getAttribute("data-vcp-edit-text-editing"),cursor:e.style.cursor,userSelect:e.style.userSelect}}function zn(e){Hn(e.ownerDocument),e.setAttribute("contenteditable","plaintext-only"),e.setAttribute("spellcheck","false"),e.setAttribute("data-vcp-edit-text-editing","true"),e.style.cursor="text",e.style.userSelect="text"}function Gn(e,t){Te(e,"contenteditable",t.contentEditable),Te(e,"spellcheck",t.spellcheck),Te(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function Hn(e){if(e.getElementById("vcp-text-edit-base-style"))return;let t=e.createElement("style");t.id="vcp-text-edit-base-style",t.textContent='[data-vcp-edit-text-editing="true"]{outline:0!important;outline-offset:0!important;}',e.head.appendChild(t)}function Te(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function Yn(e){let t=[e.documentElement,e.body].filter(r=>!!r?.style),n=t.map(r=>({element:r,userSelect:r.style.userSelect}));for(let r of t)r.style.userSelect="none";return()=>{for(let r of n)r.element.style.userSelect=r.userSelect}}function Jn(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function Xn(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function mt(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function q(e){let t=Number(e);return Number.isFinite(t)?t:0}export{De as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,ke as VCP_SITE_EDIT_ROUTE_READY_EVENT,Kt as resolveSiteEditRouteId,Ut as resolveSiteEditWebSocketUrl,cr as startSiteEditAutoBootstrap,Ht as startSiteEditFrameRuntime};
|
|
1
|
+
function Fe(e){if(!Ft(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=new Map(e.dynamicDataSummaries??[]),i=o=>{let s=t.get(o);if(s)return s;let c=e.nodes[o];if(!c)throw new Error(`Missing compact document node ${o}`);let[a,u]=c,m=e.tokens[u];if(typeof m!="string")throw new Error(`Missing compact document token ${u}`);let g=`${a===null?"":i(a)}${m}`;return t.set(o,g),g};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map((o,s)=>{let[c,a,u]=o,m=u===void 0?void 0:n[u];if(u!==void 0&&!m)throw new Error(`Missing page composition unit ${u}`);return{key:i(c),...m?{pageCompositionUnitKey:m}:{},operationSummary:Ot(a),...r.get(s)?{dynamicDataSummary:r.get(s)}:{}}})}}function Ot(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function Ft(e){if(typeof e!="object"||e===null)return!1;let t=e;if(t.encoding!=="segment-trie-v1"||typeof t.siteId!="string"||typeof t.snapshotId!="string"||typeof t.routeId!="string"||!Number.isInteger(t.version)||t.version<0||!Xe(t.pageComposition)||!Array.isArray(t.tokens)||!t.tokens.every(i=>typeof i=="string")||!Array.isArray(t.nodes)||!Array.isArray(t.entries))return!1;let n=t.nodes;if(!n.every((i,o)=>Array.isArray(i)&&i.length===2&&(i[0]===null||re(i[0])&&i[0]<o)&&re(i[1])&&i[1]<t.tokens.length)||!t.entries.every(i=>Array.isArray(i)&&(i.length===2||i.length===3)&&re(i[0])&&i[0]<n.length&&re(i[1])&&i[1]<=15&&(i.length===2||re(i[2]))))return!1;let r=t.dynamicDataSummaries;return r===void 0||Array.isArray(r)&&r.every(i=>Array.isArray(i)&&i.length===2&&re(i[0])&&i[0]<t.entries.length&&Xe(i[1]))}function Xe(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function re(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0}var L=class e{constructor(){}static parseMessage(t,n={}){let r=JSON.parse(t);if(!e.isMessage(r,n))throw new Error("Invalid site edit bridge message");return r}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(typeof t=="object"&&t!==null&&"payload"in t&&typeof t.payload=="object"&&t.payload!==null){let n=t.payload,r=typeof n.id=="string"?n.id:"unknown",i=e.isRequestKind(n.kind)?n.kind:"get-document";return{id:r,kind:i}}return{id:"unknown",kind:"get-document"}}static isRequestKind(t){return t==="initialize-session"||t==="get-document"||t==="get-history-status"||t==="get-style-context"||t==="get-object-edit-context"||t==="get-class-name-source"||t==="get-source-tree"||t==="get-source-file"||t==="resolve-source-location"||t==="execute"||t==="undo"||t==="redo"}static isMessage(t,n={}){return!U(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?U(t.payload)&&typeof t.payload.id=="string":t.type==="event"?U(t.payload)&&U(t.payload.event):t.type==="auth"?U(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?U(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!U(t)||typeof t.id!="string"||!e.isRequestKind(t.kind))return!1;switch(t.kind){case"initialize-session":return typeof t.routeId=="string"&&(t.mutationContext===void 0||Be(t.mutationContext));case"get-document":case"get-style-context":return typeof t.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof t.key=="string"&&(t.routeId===void 0||typeof t.routeId=="string");case"get-history-status":return t.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof t.path=="string";case"execute":return Bt(t.request)&&(t.request.mutationContext===void 0||Be(t.request.mutationContext))&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return t.mutationContext===void 0||Be(t.mutationContext)}}};function U(e){return typeof e=="object"&&e!==null}function Bt(e){return U(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&(e.routeId===void 0||typeof e.routeId=="string")&&typeof e.kind=="string"&&U(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&U(e.params)}function Be(e){return Mt(e)}function Mt(e){return U(e)?typeof e.editingSessionId=="string"&&e.editingSessionId.length>0&&typeof e.lockId=="string"&&e.lockId.length>0&&typeof e.ownerId=="string"&&e.ownerId.length>0&&typeof e.leaseAssertion=="string"&&e.leaseAssertion.length>0:!1}var qt="vcp:designer:trace",Kt="designer_trace",Je="__VCP_DESIGNER_TRACE__";var Vt=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function Ut(e=globalThis){let t=e;try{if(t.localStorage?.getItem(qt)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(Kt)==="1"}catch{return!1}}function J(e,t={},n=globalThis){if(!Ut(n))return;let r={type:e,timestamp:Date.now(),payload:wt(t)},i=n,o=i[Je]??[];o.push(r),o.length>200&&o.splice(0,o.length-200),i[Je]=o;let s=n.console?.debug;typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function wt(e){return Me(e,0)}function Me(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>Me(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,i]of Object.entries(e)){if(Vt.test(r)){n[r]="[redacted]";continue}n[r]=Me(i,t+1)}return n}var Se=class{constructor(t){this.options=t,this.socket=null,this.connectPromise=null,this.connectAttempt=null,this.connectionState="idle",this.intentionalClose=!1,this.sequence=0,this.pending=new Map,this.listeners=new Set,this.connectionStatusListeners=new Set}connect(){return this.socket?.readyState===qe&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((t,n)=>{let r;try{r=this.createSocket(this.options.url)}catch(c){let a=le(c,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",a.message),n(a);return}let i={socket:r,settled:!1,reject:n};this.connectAttempt=i,this.socket=r;let o=()=>{this.socket!==r||this.connectAttempt!==i||(i.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),t())},s=(c,a)=>{this.cleanupSocket(r,c,a)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(L.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(c){s(le(c,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=c=>{if(this.socket!==r)return;let a=le(c,"WebSocket failed");s(a,"failed")},r.onmessage=c=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===i&&!i.settled){this.handleAuthHandshakeMessage(c.data,r,i,()=>{o()});return}this.handleMessage(c.data)}},r.onclose=c=>{if(this.socket!==r)return;let a=this.intentionalClose,u=new Error(zt(c,{intentional:a}));s(u,a?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let t=this.socket;if(!t){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(t,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(t){return this.connectionStatusListeners.add(t),t({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(t)}}getDocument(t){return this.request("get-document",{routeId:t})}initializeSession(t){return this.request("initialize-session",t)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(t){return this.request("get-style-context",{routeId:t})}getObjectEditContext(t,n){return this.request("get-object-edit-context",{key:t,routeId:n})}getClassNameSource(t,n){return this.request("get-class-name-source",{key:t,routeId:n})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(t){return this.request("get-source-file",t)}resolveSourceLocation(t){return this.request("resolve-source-location",t)}execute(t,n){return this.request("execute",{request:t})}undo(t){return this.request("undo",{})}redo(t){return this.request("redo",{})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}request(t,n){let r=this.socket;if(!r||r.readyState!==qe||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${r?.readyState??"none"})`));let i=`${t}-${this.sequence+=1}`,o=Yt(i,t,n);return J("bridge.request",{id:i,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:Qe(n.request,"kind"),documentVersion:Qe(n.request,"documentVersion")}),new Promise((s,c)=>{let a=this.resolveRequestTimeoutMs(t),u=a>0?setTimeout(()=>{let m=this.pending.get(i);m&&(this.pending.delete(i),J("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),m.reject(new Error(`Bridge request timed out after ${a}ms: ${t}`)))},a):null;u?.unref?.(),this.pending.set(i,{kind:t,timeout:u,resolve:m=>s(m),reject:c});try{r.send(L.stringifyMessage(o))}catch(m){let g=le(m,"WebSocket send failed");this.clearPendingRequest(i),c(g),this.cleanupSocket(r,g,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(L.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=le(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=L.parseMessage(t);if(n.type==="event"){for(let i of this.listeners)i(n.payload.event);return}if(n.type!=="response"&&n.type!=="error")return;let r=this.pending.get(n.payload.id);if(r){if(this.clearPendingRequest(n.payload.id),n.type==="error"){J("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1}),r.reject(new Error(n.payload.message));return}J("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:Ht(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Fe(n.payload.result.data)}:r.kind==="initialize-session"?Gt(n.payload.result):n.payload.result)}}rejectAll(t){for(let[n,r]of[...this.pending])this.clearPendingRequest(n),r.reject(t)}clearPendingRequest(t){let n=this.pending.get(t);n&&(n.timeout&&clearTimeout(n.timeout),this.pending.delete(t))}resolveRequestTimeoutMs(t){let n=this.options.requestTimeoutMsByKind?.[t];return typeof n=="number"?Math.max(0,n):typeof this.options.requestTimeoutMs=="number"?Math.max(0,this.options.requestTimeoutMs):$t[t]??jt}cleanupSocket(t,n,r){if(this.socket===t&&(this.socket=null),this.connectAttempt?.socket===t){let i=this.connectAttempt;this.connectAttempt=null,i.settled||(i.settled=!0,i.reject(n))}this.connectPromise=null,this.rejectAll(n),this.setConnectionState(r,n.message),t.onopen=null,t.onmessage=null,t.onerror=null,t.onclose=null;try{(t.readyState===Wt||t.readyState===qe)&&t.close()}catch{}}setConnectionState(t,n){if(this.connectionState===t&&!n)return;this.connectionState=t;let r={state:t,...n?{message:n}:{}};this.options.onConnectionStatus?.(r);for(let i of this.connectionStatusListeners)i(r)}createSocket(t){if(this.options.createSocket)return this.options.createSocket(t);if(typeof WebSocket>"u")throw new Error("Site edit preview bridge requires WebSocket");return new WebSocket(t)}},Wt=0,qe=1,jt=15e3,$t={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function le(e,t){return e instanceof Error?e:new Error(t)}function zt(e,t){return t.intentional?"WebSocket disconnected":e?.code===1008?e.reason?`Bridge session authentication failed: ${e.reason}`:"Bridge session authentication failed":e?.reason?`WebSocket closed: ${e.reason}`:typeof e?.code=="number"&&e.code!==1005?`WebSocket closed with code ${e.code}`:"WebSocket closed"}function Qe(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Ht(e){if(!e||typeof e!="object")return null;let t=e,n=t.data?.resultVersion??t.data?.version??null;return typeof n=="number"?n:null}function Le(e){return new Ke(e)}var Ke=class{constructor(t){this.params=t,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=t.initialDocument,this.observedDocumentVersion=t.initialDocument.version,this.sessionInitialized=!Ze(t.initialDocument)}async getDocument(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=Ze(this.currentDocument);return(n||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(n?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(t){if(t.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let n=await this.params.client.initializeSession(t);return this.currentDocument=n.data.document,this.observedDocumentVersion=n.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),n}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=this.styleContextCache;if(n?.generation===this.styleGeneration)return{ok:!0,data:n.value};let r=this.styleContextInFlight;if(r?.generation===this.styleGeneration)return r.request;let i=this.styleGeneration,o=this.params.client.getStyleContext(t).then(s=>(this.styleGeneration===i&&(this.styleContextCache={generation:i,value:s.data}),s)).finally(()=>{this.styleContextInFlight?.request===o&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:i,request:o},o}async ensureDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let r=await this.refreshSnapshot(n,"ensure-version");if(r.version<n)throw new Error(`Document refresh returned version ${r.version}, expected at least ${n}`);return{ok:!0,data:r}}async acknowledgeDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);return n>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:n},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n),{ok:!0,data:this.currentDocument}}async getObjectEditContext(t,n){let r=this.objectCacheKey(t,n),i=this.editContextCache.get(r);if(i)return{ok:!0,data:i};let o=this.editContextInFlight.get(r);if(o)return o;let s=this.objectGeneration,c=this.params.client.getObjectEditContext(t,n??this.params.routeId).then(a=>(this.objectGeneration===s&&this.editContextCache.set(r,a.data),a)).finally(()=>{this.editContextInFlight.get(r)===c&&this.editContextInFlight.delete(r)});return this.editContextInFlight.set(r,c),c}async getClassNameSource(t,n){let r=this.objectCacheKey(t,n),i=this.classNameSourceCache.get(r);if(i)return i;let o=this.classNameSourceInFlight.get(r);if(o)return o;let s=this.objectGeneration,c=this.params.client.getClassNameSource(t,n??this.params.routeId).then(a=>(this.objectGeneration===s&&this.classNameSourceCache.set(r,a),a)).finally(()=>{this.classNameSourceInFlight.get(r)===c&&this.classNameSourceInFlight.delete(r)});return this.classNameSourceInFlight.set(r,c),c}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(t){return this.params.client.getSourceFile(t)}async resolveSourceLocation(t){return this.params.client.resolveSourceLocation({...t,routeId:t.routeId??this.params.routeId})}async execute(t,n){let r=t.target.kind==="node"&&!t.routeId?{...t,routeId:this.params.routeId}:t;return this.params.client.execute(r)}async undo(t){return this.params.client.undo()}async redo(t){return this.params.client.redo()}subscribe(t){return this.params.client.subscribe(n=>{if(n.type==="site-edit.document.changed"&&n.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n.version),n.version>this.currentDocument.version&&this.clearObjectCaches(),t(n);return}t(n)})}async refreshSnapshot(t,n="ensure-version"){if(typeof t=="number"&&this.currentDocument.version>=t)return J("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;if(this.refreshInFlight){J("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let i=await this.refreshInFlight;if(typeof t!="number"||i.version>=t||this.currentDocument.version>=t)return this.currentDocument}J("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!1,source:n});let r=this.params.client.getDocument(this.params.routeId).then(i=>(this.currentDocument=i.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,i.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=r;try{return await r}finally{this.refreshInFlight===r&&(this.refreshInFlight=null)}}clearObjectCaches(t){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!t?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(t,n){return`${n??this.params.routeId}\0${t}`}};function Ze(e){return e.version===0&&e.entries.length===0}function Gt(e){let t=e;return{...t,data:{...t.data,document:Fe(t.data.document)}}}function Yt(e,t,n){switch(t){case"initialize-session":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId),...n.mutationContext?{mutationContext:n.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-history-status":return{type:"request",payload:{id:e,kind:t}};case"get-style-context":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:e,kind:t}};case"get-source-file":return{type:"request",payload:{id:e,kind:t,path:String(n.path)}};case"resolve-source-location":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"execute":return{type:"request",payload:{id:e,kind:t,request:n.request}};case"undo":case"redo":return{type:"request",payload:{id:e,kind:t,mutationContext:n.mutationContext}}}}var et="vcp-window-message";function Xt(e){return{source:et,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function Jt(e){try{return I(e)?G(e,"source",et)&&G(e,"version",1)&&P(e,"namespace")&&P(e,"channel")&&W(e,"body")&&(!ee(e,"sessionKey")||P(e,"sessionKey")):!1}catch{return!1}}var tt="site-edit",nt="frame-runtime";function fe(e,t={}){return Xt({namespace:tt,channel:nt,sessionKey:t.sessionKey,body:e})}function rt(e){try{return!Jt(e)||e.namespace!==tt||e.channel!==nt?!1:ln(e.body)}catch{return!1}}var ee=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function W(e,t){let n=Object.getOwnPropertyDescriptor(e,t);return n!==void 0&&"value"in n}function h(e,t){return Object.getOwnPropertyDescriptor(e,t)?.value}function G(e,t,n){return W(e,t)&&h(e,t)===n}function P(e,t){return W(e,t)&&typeof h(e,t)=="string"}function it(e,t){return W(e,t)&&typeof h(e,t)=="boolean"}function q(e,t){let n=h(e,t);return W(e,t)&&typeof n=="number"&&Number.isFinite(n)}function de(e,t){return!ee(e,t)||h(e,t)===void 0||P(e,t)}function ie(e,t){return!ee(e,t)||h(e,t)===void 0||q(e,t)}function Ee(e,t){let n=h(e,t);return!ee(e,t)||n===void 0||W(e,t)&&typeof n=="number"&&Number.isInteger(n)&&n>=0}function w(e,t){return!ee(e,t)||h(e,t)===void 0}function I(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Qt(e){return I(e)&&Reflect.ownKeys(e).length===0}function ot(e){if(!Array.isArray(e))return!1;for(let t=0;t<e.length;t+=1){let n=Object.getOwnPropertyDescriptor(e,String(t));if(n===void 0||!("value"in n)||typeof n.value!="string")return!1}return!0}function pe(e){return I(e)&&P(e,"key")&&Ee(e,"instanceIndex")&&Ee(e,"instanceCount")&&Ee(e,"textSegmentIndex")}function Zt(e){return I(e)&&Reflect.ownKeys(e).every(t=>typeof t=="string"&&W(e,t)&&(typeof h(e,t)=="string"||h(e,t)===null))}function st(e){return e==null||typeof e=="string"||typeof e=="number"&&Number.isFinite(e)}function Lt(e){return I(e)&&Reflect.ownKeys(e).every(t=>typeof t=="string"&&W(e,t)&&st(h(e,t)))}function en(e){if(!I(e))return!1;let t=h(e,"priority");return P(e,"property")&&W(e,"value")&&st(h(e,"value"))&&(!ee(e,"priority")||t===void 0||t==="important")}function tn(e){return I(e)?(w(e,"attributes")||Zt(h(e,"attributes")))&&de(e,"className")&&(w(e,"style")||Lt(h(e,"style")))&&(w(e,"styleDeclarations")||Array.isArray(h(e,"styleDeclarations"))&&h(e,"styleDeclarations").every(en)):!1}function nn(e){return I(e)&&q(e,"x")&&q(e,"y")&&(w(e,"detailLevel")||G(e,"detailLevel","summary")||G(e,"detailLevel","full"))}function rn(e){return I(e)&&pe(h(e,"ref"))}function on(e){if(!I(e)||!I(h(e,"variables")))return!1;let t=h(e,"variables");return Reflect.ownKeys(t).every(n=>typeof n=="string"&&P(t,n))?w(e,"stylesheets")||ot(h(e,"stylesheets")):!1}function sn(e){if(!G(e,"type","request")||!P(e,"id")||!P(e,"kind")||!W(e,"payload"))return!1;let t=h(e,"kind"),n=h(e,"payload");switch(t){case"hit-test-at-point":case"start-text-edit-at-point":return nn(n);case"bridge-get-source-tree":case"get-scroll-metrics":case"clear-theme-override":case"bridge-get-history-status":case"bridge-undo":case"bridge-redo":return Qt(n);case"bridge-get-source-file":return I(n)&&P(n,"path");case"bridge-resolve-source-location":case"bridge-get-object-edit-context":case"bridge-get-class-name-source":return I(n)&&P(n,"key")&&de(n,"routeId");case"scroll-to":return I(n)&&q(n,"x")&&q(n,"y");case"scroll-by":return I(n)&&q(n,"deltaX")&&q(n,"deltaY");case"set-interaction-mode":return I(n)&&it(n,"enabled");case"set-theme-override":return on(n);case"get-theme-variables":return I(n)&&ot(h(n,"names"));case"compute-drop-target-at-point":return I(n)&&q(n,"x")&&q(n,"y")&&(G(n,"dragKind","insert")||G(n,"dragKind","move"))&&(w(n,"movingRef")||pe(h(n,"movingRef")));case"observe-node-bounds":case"clear-node-bounds-observer":return I(n)&&(w(n,"ref")||pe(h(n,"ref")));case"apply-node-patch":return I(n)&&pe(h(n,"ref"))&&tn(h(n,"patch"))&&(w(n,"preview")||I(h(n,"preview"))&&P(h(n,"preview"),"sessionId")&&Ee(h(n,"preview"),"revision")&&ee(h(n,"preview"),"revision"));case"get-hit-by-ref":case"get-path-by-ref":case"restore-text-edit":case"clear-text-edit-rollback":return rn(n);case"bridge-initialize-session":case"bridge-get-style-context":return I(n)&&P(n,"routeId");case"bridge-get-document":case"bridge-ensure-document-version":case"bridge-acknowledge-document-version":return I(n)&&P(n,"routeId")&&ie(n,"minVersion")&&ie(n,"version");case"bridge-execute":return I(n)&&I(h(n,"request"));case"bridge-subscribe":case"bridge-unsubscribe":return I(n)&&P(n,"subscriptionId");default:return!1}}function cn(e){return G(e,"type","response")&&P(e,"id")&&it(e,"ok")&&(w(e,"error")||P(e,"error"))}var an=new Set(["pointer-down","pointer-move","pointer-up","pointer-cancel","pointer-click","pointer-double-click"]);function un(e){if(!G(e,"type","event")||!P(e,"kind")||!I(h(e,"payload")))return!1;let t=h(e,"kind"),n=h(e,"payload");switch(t){case"text-edit-commit":case"text-edit-cancel":case"text-edit-exit":case"text-edit-input":return pe(h(n,"ref"))&&de(n,"value")&&(w(n,"hit")||I(h(n,"hit")));case"node-bounds-change":return I(h(n,"hit"));case"bridge-event":return P(n,"subscriptionId")&&I(h(n,"event"));case"route-ready":return P(n,"routeId")&&ie(n,"version");case"bridge-status":{let r=h(n,"state");return(r==="connecting"||r==="ready"||r==="reconnecting"||r==="failed"||r==="reload-required")&&de(n,"routeId")&&ie(n,"attempt")&&ie(n,"retryInMs")&&de(n,"messageKey")}case"scroll":{let r=h(n,"metrics");return I(r)&&["scrollX","scrollY","scrollWidth","scrollHeight","viewportWidth","viewportHeight"].every(i=>q(r,i))}default:return an.has(t)&&q(n,"clientX")&&q(n,"clientY")&&ie(n,"buttons")&&(h(n,"hit")===null||I(h(n,"hit")))}}function ln(e){if(!I(e))return!1;switch(h(e,"type")){case"request":return sn(e);case"response":return cn(e);case"event":return un(e);default:return!1}}var we="vcp-site-edit:route-ready",We="vcp-site-edit:bridge-status",dn=1e3,pn="data-vcp-ui-component",ft="data-vcp-theme-preview",ct="::repeat-item#",Ie="components/ui",fn=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),mn=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function hn(e,t=""){let n=bt(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function gn(e,t){if(e.__VCP_SITE_EDIT_VERSION_LOGGED__)return;let n=e.console?.info;typeof n=="function"&&(e.__VCP_SITE_EDIT_VERSION_LOGGED__=!0,n.call(e.console,"[VCP Site Edit] runtime loaded",{bridge:t.versions?.bridge??"unknown",contracts:t.versions?.contracts??"unknown",documentVersion:t.documentVersion,engine:t.versions?.engine??"unknown",routeId:t.routeId}))}function yn(e,t={}){if(t.explicit_ws_url)return t.explicit_ws_url.startsWith("/")?`${e.location.protocol==="https:"?"wss:":"ws:"}//${e.location.host}${t.explicit_ws_url}`:t.explicit_ws_url;let n=e.location.protocol==="https:"?"wss:":"ws:",r=t.port?`${e.location.hostname}:${t.port}`:e.location.host;return`${n}//${r}${t.path??"/__vcp/site-edit/bridge"}`}async function Vr(e=window,t={}){let n=yn(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=bn({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(Sn(i.signature,r)){await i.syncRoute?.();return}i.cleanup?.()}let o={activeClient:null,activeBridge:null,cleanupFrameRuntime:(()=>{}),retryTimer:void 0,routeSequence:0,syncInFlight:null,syncScheduled:!1,disposed:!1,currentDocument:null,currentEntriesByKey:new Map,unsubscribeDocument:void 0,unsubscribeConnectionStatus:void 0,unbindBootstrapLifecycle:void 0,unbindRouteChange:void 0},s,c=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===s,a=t.create_client??(p=>new Se({url:p,authKey:t.bridge_session_key})),u=t.schedule_after_navigation??Nn,m=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},g=()=>hn(e.location.pathname,t.basePath||""),D=!!e.parent&&e.parent!==e,C=p=>{An(e,p)},v=p=>{o.currentDocument=p,o.currentEntriesByKey=new Map((p?.entries??[]).map(y=>[y.key,y]))},R=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},O=(p,y)=>!o.disposed&&y===o.routeSequence&&p===g(),k=async(p,y)=>{let T=o.activeBridge;if(!T)return null;let d=await T.getDocument(p);return O(p,y)&&v(d.data),d.data},B=()=>{R(),v(null);let p=o.activeBridge;o.activeBridge=null,p&&e.__VCP_SITE_EDIT__===p&&delete e.__VCP_SITE_EDIT__;let y=o.activeClient;o.activeClient=null,y?.disconnect()},Ne=p=>p===s.routeId&&!!o.activeBridge&&(D||!!(o.currentDocument&&On(o.currentDocument,p)))&&Pn(o.activeClient),Ae=p=>Math.min(dn*2**Math.max(0,p),8e3),te=(p,y,T)=>{if(o.disposed)return;m();let d=Ae(T);C({state:"reconnecting",routeId:p,attempt:T,retryInMs:d,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||y!==o.routeSequence)&&ge(T+1).catch(f=>{let l=g();if(p===l){if(oe(f)){C({state:"reload-required",routeId:p,attempt:T,messageKey:"studio.errors.previewBridgeReloadRequired"});return}te(p,o.routeSequence,T+1)}})},d)},se=(p,y,T)=>{if(!O(p,y)||o.activeClient===null)return;if(oe(T.message)){B(),m(),C({state:"reload-required",routeId:p,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let d=o.activeClient;R(),v(null);let f=o.activeBridge;o.activeBridge=null,f&&e.__VCP_SITE_EDIT__===f&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,d?.disconnect(),te(p,y,0)},Pe=p=>{let y=g(),T=o.routeSequence;if(!(!O(y,T)||o.activeClient===null)){if(oe(p)){B(),m(),C({state:"reload-required",routeId:y,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}yt(p)&&se(y,T,{state:"failed",message:ze(p,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=vn(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:p=>o.currentEntriesByKey.get(p)??null,setCurrentDocument:v,onBridgeRequestError:p=>{Pe(p)}});let ce=async()=>ge(0),ge=async p=>{if(o.disposed)return;let y=g();if(Ne(y))return;let T=o.syncInFlight;if(T?.routeId===y)return T.promise;let d=o.routeSequence+1,f=Oe(y,d,p);o.syncInFlight={routeId:y,sequence:d,promise:f};try{await f}finally{o.syncInFlight?.promise===f&&(o.syncInFlight=null)}},Oe=async(p,y,T)=>{o.routeSequence=y,m(),B(),C({state:T>0?"reconnecting":"connecting",routeId:p,attempt:T,messageKey:T>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let d=a(n),f=!1;o.activeClient=d,o.unsubscribeConnectionStatus=d.subscribeConnectionStatus?.(l=>{f&&(l.state==="closed"||l.state==="failed")&&se(p,y,l)});try{if(await d.connect(),!O(p,y)){d.disconnect();return}let l=Le({routeId:p,client:d,initialDocument:xn(p)});o.activeBridge=l,c()&&(e.__VCP_SITE_EDIT__=l),o.activeClient=d,o.unsubscribeDocument=l.subscribe(N=>{N.type==="site-edit.document.changed"&&N.routeId===p&&o.currentDocument&&N.version>o.currentDocument.version&&k(p,y).catch(()=>{})}),c()&&(s.routeId=p);let _=(D?null:await l.initializeSession({routeId:p}))?.data.document??null;if(_&&v(_),!O(p,y)){d.disconnect();return}f=!0,C({state:"ready",routeId:p,attempt:T,messageKey:"studio.status.previewReady"}),gn(e,{documentVersion:_?.version??0,routeId:p,versions:t.runtime_versions}),_&>(e,{routeId:p,version:_.version})}catch(l){if(R(),o.activeClient===d&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,d.disconnect(),v(null),!O(p,y))return;throw C({state:oe(l)?"reload-required":"failed",routeId:p,attempt:T,messageKey:oe(l)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),l}},Y=p=>{if(o.disposed)return;let y=g();if(oe(p)){m(),C({state:"reload-required",routeId:y,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}te(y,o.routeSequence,0)},z=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,u(()=>{o.syncScheduled=!1,!o.disposed&&ce().catch(p=>Y(p))}))},ye=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,m(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),B(),c()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:ce,cleanup:ye},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=In(e,ye),o.unbindRouteChange=kn(e,z,g),t.defer_initial_sync){z();return}await ce()}function bn(e){return{basePath:bt(e.options.basePath??""),bridgeUrl:e.bridgeUrl,runtimeVersions:{bridge:e.options.runtime_versions?.bridge??null,contracts:e.options.runtime_versions?.contracts??null,engine:e.options.runtime_versions?.engine??null},sessionKeyFingerprint:En(e.options.bridge_session_key)}}function Sn(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function En(e){if(!e)return null;let t=2166136261;for(let n=0;n<e.length;n+=1)t^=e.charCodeAt(n),t=Math.imul(t,16777619)>>>0;return`${e.length}:${t.toString(36)}`}function In(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),Cn(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function Cn(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function xn(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function vn(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,c=null,a=null,u=null,m=null,g=new Map,D=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,C=()=>{n?.(),n=null,r=null},v=()=>{i?.(),i=null,o?.(),o=null},R=(d,f,l)=>{let A=s?.sessionKey!==d||s?.sourceWindow!==f||s?.targetOrigin!==l;s={sessionKey:d,sourceWindow:f,targetOrigin:l},A&&(u=null,m=null)},O=(d,f)=>{let l=e.parent&&e.parent!==e?e.parent:null;return!l||f!==l?!1:!D||d===D},k=()=>{for(let d of g.values())d();g.clear()},B=d=>JSON.stringify([d.routeId,d.version]),Ne=()=>!a||a.state==="ready",Ae=d=>JSON.stringify([d.state,d.routeId??null,d.attempt??null,d.retryInMs??null,d.messageKey??null]),te=d=>{if(!Ne())return;let f=B(d);u!==f&&(o?.(),o=null,Y({kind:"route-ready",payload:{routeId:d.routeId,version:d.version}}),s&&(u=f))},se=d=>{let f=Ae(d);m!==f&&(d.state!=="ready"&&(u=null,c=null),Y({kind:"bridge-status",payload:d}),s&&(m=f))},Pe=d=>{c=d,te(d)},ce=d=>{a=d,se(d)},ge=()=>{c&&te(c)},Oe=()=>{a&&se(a)},Y=d=>{s&&s.sourceWindow.postMessage(fe({type:"event",...d},{sessionKey:s.sessionKey}),s.targetOrigin)},z=(d,f,l,A)=>{let _=_e(e.document,f.clientX,f.clientY,t.getCurrentDocument?.()??null),N=_?K(_,l==="full"?$(e.document,_,t.getCurrentDocument?.()??null):lt(e.document,_,t.getCurrentDocument?.()??null),t.getDocumentEntry,l):null;A&&N&&(d==="pointer-click"||d==="pointer-double-click")&&(A.preventDefault(),A.stopPropagation(),typeof A.stopImmediatePropagation=="function"&&A.stopImmediatePropagation()),Y({kind:d,payload:{clientX:f.clientX,clientY:f.clientY,buttons:Number(f.buttons??0),hit:N}})},ye=(d,f,l)=>{v(),s={sessionKey:d,sourceWindow:f,targetOrigin:l};let A=vr(e.document),_=null,N=null,b=()=>{N=null;let S=_;_=null,S&&z("pointer-move",S,"summary")},V=S=>{_={clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},N===null&&(N=mt(e,b))},X=S=>{z("pointer-down",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"full",S)},ne=S=>{z("pointer-up",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"summary",S)},H=S=>{z("pointer-cancel",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"summary",S)},Z=S=>{z("pointer-click",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"full",S)},ae=S=>{z("pointer-double-click",{clientX:Number(S.clientX),clientY:Number(S.clientY),buttons:Number(S.buttons)},"full",S)},ue=()=>{Y({kind:"scroll",payload:{metrics:ve(e)}})};e.document.addEventListener("pointerdown",X,!0),e.document.addEventListener("pointermove",V,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",ne,!0),e.document.addEventListener("pointercancel",H,!0),e.document.addEventListener("click",Z,!0),e.document.addEventListener("dblclick",ae,!0),e.addEventListener("scroll",ue,{passive:!0}),i=()=>{N!==null&&(ht(e,N),N=null),_=null,A(),e.document.removeEventListener("pointerdown",X,!0),e.document.removeEventListener("pointermove",V,!0),e.document.removeEventListener("pointerup",ne,!0),e.document.removeEventListener("pointercancel",H,!0),e.document.removeEventListener("click",Z,!0),e.document.removeEventListener("dblclick",ae,!0),e.removeEventListener("scroll",ue)}},p=d=>{let f=d.detail;f?.routeId&&Pe(f)},y=d=>{let f=d.detail;f?.state&&ce(f)},T=d=>{let f=d.data;if(!rt(f)||f.body.type!=="request"||f.body.kind!=="apply-node-patch"&&f.body.kind!=="get-hit-by-ref"&&f.body.kind!=="get-path-by-ref"&&f.body.kind!=="get-scroll-metrics"&&f.body.kind!=="scroll-to"&&f.body.kind!=="scroll-by"&&f.body.kind!=="set-interaction-mode"&&f.body.kind!=="set-theme-override"&&f.body.kind!=="clear-theme-override"&&f.body.kind!=="get-theme-variables"&&f.body.kind!=="compute-drop-target-at-point"&&f.body.kind!=="observe-node-bounds"&&f.body.kind!=="clear-node-bounds-observer"&&f.body.kind!=="restore-text-edit"&&f.body.kind!=="clear-text-edit-rollback"&&f.body.kind!=="start-text-edit-at-point"&&f.body.kind!=="hit-test-at-point"&&!at(f.body))return;let l=f.body,A=typeof f.sessionKey=="string"?f.sessionKey:null,_=d.source,N=d.origin;if(!A||!N||!_||typeof _.postMessage!="function"||!O(A,_))return;if(s){if(s.sourceWindow!==_||s.targetOrigin!==N)return;s.sessionKey!==A&&(C(),v(),k(),s=null)}R(A,_,N),Oe(),ge();let b=V=>{let X=typeof l.id=="string"?l.id:"unknown";_.postMessage(fe({id:X,...V},{sessionKey:A}),N)};try{if(at(l)){_n({message:l,sendEvent:E=>{_.postMessage(fe({type:"event",...E},{sessionKey:A}),N)},sendResponse:b,subscriptions:g,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(l.kind==="apply-node-patch"){let E=Q(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!E){b({type:"response",ok:!1,error:"No editable element found for patch target"});return}let x=l.payload.preview,M=x?lr(x.sessionId,l.payload.ref):null;if(M&&x){let be=me.get(M)??-1;if(x.revision<be){b({type:"response",ok:!0,result:{applied:!1,appliedRevision:x.revision,stale:!0,latestRevision:be}});return}if(x.revision===be){b({type:"response",ok:!0,result:{applied:!1,appliedRevision:x.revision,duplicate:!0,latestRevision:be}});return}}if(ar(E,l.payload.patch),M&&x&&dr(M,x.revision),x?.responseDetail==="none"){b({type:"response",ok:!0,result:{applied:!0,appliedRevision:x.revision}});return}b({type:"response",ok:!0,result:K(E,$(e.document,E,t.getCurrentDocument?.()??null),t.getDocumentEntry,x?.responseDetail??"full")});return}if(l.kind==="get-hit-by-ref"){let E=Q(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!E){b({type:"response",ok:!1,error:"No editable element found for hit target"});return}b({type:"response",ok:!0,result:K(E,$(e.document,E,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(l.kind==="get-path-by-ref"){let E=Q(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!E){b({type:"response",ok:!1,error:"No editable element found for path target"});return}let x=[],M=E;for(;M;)M.getAttribute("data-vcp-edit-key")&&x.push(K(M,$(e.document,M,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),M=M.parentElement;b({type:"response",ok:!0,result:x.reverse()});return}if(l.kind==="restore-text-edit"||l.kind==="clear-text-edit-rollback"){let E=l.payload.ref;if(l.kind==="clear-text-edit-rollback"){r&&ut(r.ref,E)&&(r=null),b({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!ut(r.ref,E)){b({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let x=Mn(e.document,r,t.getCurrentDocument?.()??null);r=null,b(x?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(l.kind==="get-scroll-metrics"){b({type:"response",ok:!0,result:ve(e)});return}if(l.kind==="scroll-to"){let E=Number(l.payload.x),x=Number(l.payload.y);if(!Number.isFinite(E)||!Number.isFinite(x)){b({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:E,top:x}),b({type:"response",ok:!0,result:ve(e)});return}if(l.kind==="scroll-by"){let E=Number(l.payload.deltaX),x=Number(l.payload.deltaY);if(!Number.isFinite(E)||!Number.isFinite(x)){b({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:E,top:x}),b({type:"response",ok:!0,result:{...ve(e),scrolled:!0}});return}if(l.kind==="set-interaction-mode"){l.payload.enabled?ye(A,_,N):s?.sourceWindow===_&&s.targetOrigin===N&&s.sessionKey===A&&v(),b({type:"response",ok:!0,result:{interactionEnabled:l.payload.enabled}});return}if(l.kind==="set-theme-override"){pr(e.document,l.payload),b({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(l.kind==="clear-theme-override"){fr(e.document),b({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(l.kind==="get-theme-variables"){b({type:"response",ok:!0,result:mr(e.document,l.payload.names)});return}if(l.kind==="compute-drop-target-at-point"){let E=Number(l.payload?.x),x=Number(l.payload?.y);if(!Number.isFinite(E)||!Number.isFinite(x)){b({type:"response",ok:!1,error:"Invalid drop target point"});return}b({type:"response",ok:!0,result:nr(e,E,x,l.payload.dragKind,l.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(l.kind==="observe-node-bounds"){let E=l.payload.ref;if(!E){b({type:"response",ok:!1,error:"Missing bounds observer target"});return}let x=Q(e.document,E,t.getCurrentDocument?.()??null);if(!x){b({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=Qn(e,x,E,t.getCurrentDocument,t.getDocumentEntry,M=>Y({kind:"node-bounds-change",payload:{hit:M}})),b({type:"response",ok:!0,result:{observing:!0}}),Y({kind:"node-bounds-change",payload:{hit:K(x,E,t.getDocumentEntry,"summary")}});return}if(l.kind==="clear-node-bounds-observer"){o?.(),o=null,b({type:"response",ok:!0,result:{cleared:!0}});return}if(l.kind!=="hit-test-at-point"&&l.kind!=="start-text-edit-at-point")return;let V=Number(l.payload?.x),X=Number(l.payload?.y);if(!Number.isFinite(V)||!Number.isFinite(X)){b({type:"response",ok:!1,error:"Invalid text edit point"});return}let ne=l.kind==="hit-test-at-point"?_e(e.document,V,X,t.getCurrentDocument?.()??null):Kn(e.document,V,X,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!ne){b({type:"response",ok:!1,error:l.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let H=l.kind==="start-text-edit-at-point"?ne:null,Z=l.kind==="hit-test-at-point"?ne:H.element,ae=l.payload.detailLevel??"full",ue=ae==="full"?$(e.document,Z,t.getCurrentDocument?.()??null):lt(e.document,Z,t.getCurrentDocument?.()??null),S=H&&typeof H.textSegmentIndex=="number"?{...ue,textSegmentIndex:H.textSegmentIndex}:ue,Pt=K(Z,S,t.getDocumentEntry,ae);if(l.kind==="hit-test-at-point"){b({type:"response",ok:!0,result:Pt});return}C(),n=br(e,Z,S,E=>{_.postMessage(fe({type:"event",...E},{sessionKey:A}),N)},{...H?.textNode?{textNode:H.textNode}:{},onCommitSnapshot:E=>{r=E}}),b({type:"response",ok:!0,result:{ref:S}})}catch(V){b({type:"response",ok:!1,error:V instanceof Error?V.message:"Failed to start text edit"})}};return e.addEventListener("message",T),e.addEventListener(we,p),e.addEventListener(We,y),()=>{C(),v(),s=null,k(),e.removeEventListener("message",T),e.removeEventListener(we,p),e.removeEventListener(We,y)}}function at(e){let t=e.kind;return t==="bridge-initialize-session"||t==="bridge-get-document"||t==="bridge-get-history-status"||t==="bridge-get-style-context"||t==="bridge-ensure-document-version"||t==="bridge-acknowledge-document-version"||t==="bridge-get-object-edit-context"||t==="bridge-get-class-name-source"||t==="bridge-get-source-tree"||t==="bridge-get-source-file"||t==="bridge-resolve-source-location"||t==="bridge-execute"||t==="bridge-undo"||t==="bridge-redo"||t==="bridge-subscribe"||t==="bridge-unsubscribe"}function Rn(e){return e.kind==="update-text"||e.kind==="update-array-item"||e.kind==="set-class-name-source"||e.kind==="set-props"||e.kind==="apply-style-draft"}async function _n({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,windowLike:c}){let a=c.__VCP_SITE_EDIT__;if(!a){n({type:"response",ok:!1,error:"Site edit bridge is not ready in preview frame"});return}try{switch(e.kind){case"bridge-initialize-session":{let u=await a.initializeSession({routeId:e.payload.routeId});o?.(u.data.document),gt(c,{routeId:u.data.document.routeId,version:u.data.document.version}),n({type:"response",ok:!0,result:u});return}case"bridge-get-document":{let u=await a.getDocument(e.payload.routeId);o?.(u.data),n({type:"response",ok:!0,result:u});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await a.getHistoryStatus()});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await a.getStyleContext(e.payload.routeId)});return;case"bridge-ensure-document-version":{if(!Number.isFinite(Number(e.payload.minVersion))){n({type:"response",ok:!1,error:"Invalid document version"});return}let u=a.ensureDocumentVersion?await a.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await a.getDocument(e.payload.routeId);o?.(u.data),n({type:"response",ok:!0,result:u});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let u=a.acknowledgeDocumentVersion?await a.acknowledgeDocumentVersion(e.payload.routeId,Number(e.payload.version)):await a.getDocument(e.payload.routeId);o?.(u.data),n({type:"response",ok:!0,result:u});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await a.getObjectEditContext(e.payload.key,e.payload.routeId)});return;case"bridge-get-class-name-source":{let u=await a.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:Tn(u,e.payload.key,c.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await a.getSourceTree()});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await a.getSourceFile({path:e.payload.path})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await a.resolveSourceLocation({key:e.payload.key,routeId:e.payload.routeId})});return;case"bridge-execute":{let u=await a.execute(e.payload.request),m=i?.()?.routeId;if(u.ok&&m&&a.acknowledgeDocumentVersion&&Rn(e.payload.request)){let g=await a.acknowledgeDocumentVersion(m,u.data.resultVersion);o?.(g.data)}n({type:"response",ok:!0,result:u});return}case"bridge-undo":n({type:"response",ok:!0,result:await a.undo()});return;case"bridge-redo":n({type:"response",ok:!0,result:await a.redo()});return;case"bridge-subscribe":{let u=e.payload.subscriptionId;r.get(u)?.();let m=a.subscribe(g=>{t({kind:"bridge-event",payload:{event:g,subscriptionId:u}})});r.set(u,m),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let u=e.payload.subscriptionId;r.get(u)?.(),r.delete(u),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(u){s?.(u,e),n({type:"response",ok:!1,error:Fn(u)})}}function Tn(e,t,n,r){if(!e.ok)return e;let i=Q(n,{key:t},r),o=i?Dn(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function Dn(e){let t=e.ownerDocument.defaultView;if(!t)return null;let n=t.getComputedStyle(e);return{color:n.color,backgroundColor:n.backgroundColor,borderColor:n.borderColor}}function kn(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let u=n();u!==o&&(o=u,t())},c=()=>s(),a=()=>s();return e.history.pushState=function(...m){let g=r.apply(this,m);return s(),g},e.history.replaceState=function(...m){let g=i.apply(this,m);return s(),g},e.addEventListener("popstate",c),e.addEventListener("hashchange",a),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",c),e.removeEventListener("hashchange",a)}}function Nn(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function mt(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function ht(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function gt(e,t){e.dispatchEvent(new CustomEvent(we,{detail:t}))}function An(e,t){e.dispatchEvent(new CustomEvent(We,{detail:t}))}function Pn(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function On(e,t){return e.routeId===t}function ze(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function yt(e){let t=ze(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function Fn(e){let t=ze(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":yt(t)?"Site edit bridge disconnected":t}function oe(e){let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/authentication|auth failed|auth rejected|bridge key|session|unauthorized|forbidden|expired/i.test(t)}function bt(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function He(e){return fn.has(Et(e))}function Bn(e){return mn.has(Et(e))}function St(e){return e.operationSummary?{canUpdateText:e.operationSummary.canUpdateText,canInsertChild:e.operationSummary.canInsertChild,canMove:e.operationSummary.canMove,canRemove:e.operationSummary.canRemove}:e.fallbackMode!=="preview"?{canUpdateText:!1,canInsertChild:!1,canMove:!1,canRemove:!1}:{canUpdateText:Bn(e.tagName),canInsertChild:He(e.tagName),canMove:!1,canRemove:!1}}function Et(e){return e?.trim().toLowerCase()??""}function ut(e,t){return e.key!==t.key||e.instanceIndex!==t.instanceIndex||e.instanceCount!==t.instanceCount?!1:typeof e.textSegmentIndex=="number"&&typeof t.textSegmentIndex=="number"?e.textSegmentIndex===t.textSegmentIndex:!0}function Mn(e,t,n){let r=Q(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=qn(r,t.ref.textSegmentIndex);return i?(i.nodeValue=t.initialText,!0):!1}return typeof t.initialHtml=="string"?(r.innerHTML=t.initialHtml,!0):(r.textContent=t.initialText,!0)}function qn(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Re(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function Kn(e,t,n,r,i){let o=_e(e,t,n,r),s=It(o);if(!s)return null;let c=s.getAttribute("data-vcp-edit-key")??"",a=$(e,s,r),u=i?.(a.key)??i?.(c);if(!St({operationSummary:u?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let g=Vn(e,t,n,s);if(g){let D=wn(s,g);if(D!==null)return{element:s,textNode:g,textSegmentIndex:D}}return ke(s)?null:{element:s}}function Vn(e,t,n,r){let i=Un(e,t,n);return!i||i.parentElement!==r?null:i}function Un(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(Re(o))return o;let c=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return Re(c)?c:null}function wn(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Re(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function Re(e){return e?.nodeType===3}function _e(e,t,n,r=null){let i=typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean);for(let o of i){let s=It(o),c=s?.getAttribute("data-vcp-edit-key")??"";if(s&&Hn(s,r,c))return s}return null}function It(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(Ge(t))return n??t;!Wn(r)&&!n&&(n=t)}t=t.parentElement}return n}function Ge(e){return e.getAttribute(pn)!==null}function Wn(e){return jn(e.split("::")[0]??"")}function jn(e){if(!e)return!1;let t=$n(e);return t===Ie||t.startsWith(`${Ie}/`)||t.includes(`/${Ie}/`)||t.endsWith(`/${Ie}`)}function $n(e){let n=(e.split("?")[0]??e).replace(/\\/g,"/").replace(/^\.\//,""),r=[];for(let i of n.split("/"))if(!(!i||i===".")){if(i===".."){r.pop();continue}r.push(i)}return r.join("/")}function $(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=xt(Rt(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${At(r)}"]`))),n,r);if(i.length<=1)return{key:dt(n,r,0)};let o=i.indexOf(t);return o>=0?{key:dt(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function lt(e,t,n){return $(e,t,n)}function Q(e,t,n){let r=Te(t.key)??t.key,i=xt(Rt(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${At(r)}"]`))),n,t.key);if(i.length===0)return null;let o=typeof t.instanceIndex=="number"&&t.instanceIndex>=0&&t.instanceIndex<i.length?t.instanceIndex:null,s=(Te(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let c=zn(n,t.key);return c!==null&&c>=0&&c<i.length?i[c]??null:o!==null?i[o]??null:i[0]??null}function dt(e,t,n){return Ct(e,t)[n]?.key??t}function zn(e,t){let n=Te(t);if(!n)return null;let i=Ct(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function Ct(e,t){return(e?.entries??[]).filter(n=>(Te(n.key)??n.key)===t)}function xt(e,t,n){let r=vt(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function Hn(e,t,n){let r=vt(t,n);return!r||e.tagName.toLowerCase()===r}function vt(e,t){return null}var Gn=2,Yn=4;function Rt(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&Yn)!==0?-1:(r&Gn)!==0?1:0})}function Te(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(ct);if(n<0)break;let r=Number(t.slice(n+ct.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function Xn(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e);return{..._t(n),paddingTop:F(n?.paddingTop),paddingRight:F(n?.paddingRight),paddingBottom:F(n?.paddingBottom),paddingLeft:F(n?.paddingLeft),borderTopWidth:F(n?.borderTopWidth),borderRightWidth:F(n?.borderRightWidth),borderBottomWidth:F(n?.borderBottomWidth),borderLeftWidth:F(n?.borderLeftWidth),columnGap:F(n?.columnGap),rowGap:F(n?.rowGap)}}function _t(e){return{marginTop:F(e?.marginTop,!0),marginRight:F(e?.marginRight,!0),marginBottom:F(e?.marginBottom,!0),marginLeft:F(e?.marginLeft,!0)}}function F(e,t=!1){let n=Number.parseFloat(e??"");return Number.isFinite(n)?t?n:Math.max(0,n):0}function Jn(e){let t=e.ownerDocument?.defaultView;return Array.from(e.children).filter(n=>typeof n.getBoundingClientRect=="function").map(n=>({rect:tr(n.getBoundingClientRect()),margin:_t(t?.getComputedStyle(n))})).filter(({rect:n})=>n.width>0&&n.height>0)}function K(e,t,n,r="full"){let i=e.getBoundingClientRect(),o=n?.(t.key)??null,s=e.tagName.toLowerCase(),c=De(e),a=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([v,R])=>[v,R??""])),attributes:Object.fromEntries(e.getAttributeNames().map(v=>[v,e.getAttribute(v)??""]))}:{},u=St({operationSummary:o?.operationSummary,tagName:s,fallbackMode:"preview"}),m=Ge(e),g=!0,D=Tt(e)?.getAttribute("data-vcp-edit-key")??null,C=Jn(e);return{ref:t,key:t.key,detailLevel:r,tagName:s,...o?{sourceKind:"jsx"}:{},...D?{parentKey:D}:{},...o?.pageCompositionUnitKey?{pageCompositionUnitKey:o.pageCompositionUnitKey}:{},...a,runtimeFlags:{selectable:!0,movable:u.canMove,removable:u.canRemove,textEditable:u.canUpdateText,container:m?!1:!!ke(e)||u.canInsertChild||g&&He(s)},layout:c,rect:{top:i.top,left:i.left,width:i.width,height:i.height},childBoxes:C,childRects:C.map(({rect:v})=>v),spacing:Xn(e)}}function Qn(e,t,n,r,i,o){let s=t,c=K(s,n,i,"summary"),a=null,u=()=>{a===null&&(a=mt(e,m))},m=()=>{a=null;let O=Q(e.document,n,r?.()??null);if(!O)return;O!==s&&(D?.unobserve(s),s=O,D?.observe(s));let k=K(s,n,i,"summary");k.rect.width<=0||k.rect.height<=0||Zn(c,k)&&(c=k,o(k))},g=e.ResizeObserver,D=typeof g=="function"?new g(u):null;D?.observe(s);let C=e.MutationObserver,v=typeof C=="function"?new C(u):null;v?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",u,{passive:!0});let R=e.visualViewport;return R?.addEventListener?.("resize",u,{passive:!0}),e.document.addEventListener("load",u,!0),()=>{a!==null&&(ht(e,a),a=null),D?.disconnect(),v?.disconnect(),e.removeEventListener("resize",u),R?.removeEventListener?.("resize",u),e.document.removeEventListener("load",u,!0)}}function Zn(e,t){return Ye(e.rect,t.rect)||Ln(e.childBoxes,t.childBoxes)||er(e.childRects,t.childRects)||je(e.spacing,t.spacing)||je(e.layout,t.layout)}function Ln(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>{let s=r[o];return!s||Ye(i.rect,s.rect)||je(i.margin,s.margin)})}function er(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>Ye(i,r[o]??i))}function je(e,t){let n=e??{},r=t??{},i=new Set([...Object.keys(n),...Object.keys(r)]);return Array.from(i).some(o=>n[o]!==r[o])}function tr(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function Ye(e,t){return Math.abs(e.top-t.top)>.5||Math.abs(e.left-t.left)>.5||Math.abs(e.width-t.width)>.5||Math.abs(e.height-t.height)>.5}function nr(e,t,n,r,i,o,s){let c=e.document,a=_e(c,t,n,o);if(!a)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let u=i?Q(c,i,o):null;if(u&&$e(a,u))return Ce(c,a,"self-or-descendant",o,s);if(r==="move"&&u){let R=sr(c,a,u,o,s);if(R){let O=Ve(R.child,R.targetParent,t,n,"nearest");if(O)return xe(c,R.child,R.targetParent,O,o,s)}}let m=null,g=!1,D=a,C=a.parentElement;for(;C;){if(C.getAttribute("data-vcp-edit-key")){if(u&&$e(C,u))return Ce(c,a,"self-or-descendant",o,s);let R=pt(C,r,s);if(R==="accept"){m={child:D,targetParent:C};break}R==="blocked"&&(g=!0),D=C}C=C.parentElement}let v=pt(a,r,s);if(v==="accept"){if(m){let R=Ve(m.child,m.targetParent,t,n,"edge");if(R)return xe(c,m.child,m.targetParent,R,o,s)}return xe(c,a,a,rr(a,t,n),o,s)}if(m){let R=Ve(m.child,m.targetParent,t,n,"nearest");return xe(c,m.child,m.targetParent,R??"after",o,s)}return v==="blocked"||g?Ce(c,a,"operation-boundary-blocked",o,s):Ce(c,a,"no-accepting-parent",o,s)}function Ce(e,t,n,r,i){return{anchorHit:K(t,$(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function xe(e,t,n,r,i,o){let s=K(t,$(e,t,i),o,"summary"),c=K(n,$(e,n,i),o,"summary"),a=De(n).indicatorOrientation,u=r==="append"||r==="prepend"?ir(n.getBoundingClientRect(),a,r):or(t.getBoundingClientRect(),a,r);return{anchorHit:s,targetParentHit:c,relation:r,indicatorOrientation:a,indicatorBounds:u}}function pt(e,t,n){if(Ge(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":ke(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return He(o)?"accept":"not-container"}function Ve(e,t,n,r,i){let o=De(t).indicatorOrientation,s=e.getBoundingClientRect(),c=o==="vertical"?s.width>0?(n-s.left)/s.width:.5:s.height>0?(r-s.top)/s.height:.5;return i==="edge"&&c>=.25&&c<=.75?null:c<.5?"before":"after"}function rr(e,t,n){let r=De(e).indicatorOrientation,i=e.getBoundingClientRect();return(r==="vertical"?i.width>0?(t-i.left)/i.width:.5:i.height>0?(n-i.top)/i.height:.5)<.5?"prepend":"append"}function De(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=n?.display??"",i=n?.flexDirection,o=n?.gridAutoFlow,s="horizontal";return r==="flex"||r==="inline-flex"?s=(i??"row").startsWith("row")?"vertical":"horizontal":(r==="grid"||r==="inline-grid")&&(s=(o??"row").includes("column")?"vertical":"horizontal"),{display:r,...i?{flexDirection:i}:{},...o?{gridAutoFlow:o}:{},indicatorOrientation:s}}function ir(e,t,n){if(t==="vertical")return{left:n==="prepend"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="prepend"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function or(e,t,n){if(t==="vertical")return{left:n==="before"?e.left:e.left+e.width-3,top:e.top,width:3,height:e.height};let r=n==="before"?e.top:e.top+e.height-3;return{left:e.left,top:r,width:e.width,height:3}}function $e(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function sr(e,t,n,r,i){let o=cr(e,t,n,r,i);if(o)return o;let s=Tt(n);if(!s||t===s)return null;let c=t,a=t.getAttribute("data-vcp-edit-key")?t:null;for(;c&&c!==s;)c.getAttribute("data-vcp-edit-key")&&(a=c),c=c.parentElement;return c!==s||!a||a===s||a===n||$e(a,n)?null:{child:a,targetParent:s}}function cr(e,t,n,r,i){return null}function Tt(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function ke(e){for(let t of Array.from(e.childNodes)){if(typeof t.getAttribute!="function")continue;let n=t;if(n.getAttribute("data-vcp-edit-key"))return n;let r=ke(n);if(r)return r}return null}function ve(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:j(e.scrollX),scrollY:j(e.scrollY),scrollWidth:Math.max(j(t?.scrollWidth),j(n?.scrollWidth),j(e.innerWidth)),scrollHeight:Math.max(j(t?.scrollHeight),j(n?.scrollHeight),j(e.innerHeight)),viewportWidth:j(e.innerWidth),viewportHeight:j(e.innerHeight)}}function ar(e,t){Object.entries(t.attributes??{}).forEach(([r,i])=>{if(i===null){e.removeAttribute(r);return}e.setAttribute(r,i)}),typeof t.className=="string"&&(e.className=t.className);let n=new Set(t.styleDeclarations?.map(r=>r.property)??[]);Object.entries(t.style??{}).forEach(([r,i])=>{if(n.has(r))return;let o=e.style,s=r.replace(/[A-Z]/g,c=>`-${c.toLowerCase()}`);if(i==null||i===""){o.removeProperty(s);return}o.setProperty(s,String(i))}),t.styleDeclarations?.forEach(r=>{let i=e.style,o=r.property.replace(/[A-Z]/g,c=>`-${c.toLowerCase()}`),s=r.value;if(s==null||s===""){i.removeProperty(o);return}i.setProperty(o,String(s),r.priority)})}var ur=500,me=new Map;function lr(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function dr(e,t){if(me.size>=ur){let n=me.keys().next().value;n&&me.delete(n)}me.set(e,t)}var he=new Set;function pr(e,t){let n=e.documentElement?.style,r=new Set;for(let[i,o]of Object.entries(t.variables??{}))i.startsWith("--")&&(r.add(i),n?.setProperty(i,o));for(let i of he)r.has(i)||n?.removeProperty(i);he.clear();for(let i of r)he.add(i);yr(e,t.stylesheets??[])}function fr(e){let t=e.documentElement?.style;for(let n of he)t?.removeProperty(n);he.clear();for(let n of Nt(e))n.remove()}function mr(e,t){let n=Array.from(new Set(t.filter(s=>typeof s=="string"&&s.startsWith("--"))));if(n.length===0)return{};let r=e.documentElement,i=r?e.defaultView?.getComputedStyle(r):null,o={};for(let s of n){let c=Dt(i,s);c&&(o[s]=c)}return o}function Dt(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return kt(e,r,n)}function kt(e,t,n){if(!t)return null;let r=hr(t);if(!r)return t;let i=Dt(e,r.name,n);return i||(r.fallback?kt(e,r.fallback,n)??r.fallback:null)}function hr(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=gr(n),i=r>=0?n.slice(0,r).trim():n;if(!i.startsWith("--"))return null;let o=r>=0?n.slice(r+1).trim():null;return{name:i,fallback:o||null}}function gr(e){let t=0;for(let n=0;n<e.length;n+=1){let r=e[n];if(r==="("){t+=1;continue}if(r===")"){t=Math.max(0,t-1);continue}if(r===","&&t===0)return n}return-1}function yr(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of Nt(e)){let s=o.getAttribute("href")??"";if(!n.has(s)||r.has(s)){o.remove();continue}r.set(s,o)}let i=e.head;if(i)for(let o of n){if(r.has(o))continue;let s=e.createElement("link");s.setAttribute("rel","stylesheet"),s.setAttribute(ft,"true"),s.setAttribute("href",o),i.appendChild(s)}}function Nt(e){return Array.from(e.querySelectorAll(`link[${ft}]`))}function br(e,t,n,r,i={}){let o=i.textNode?Sr(e.document,i.textNode):null;if(i.textNode&&!o)throw new Error("Failed to prepare text segment editor");let s=o?.element??t,c=s.textContent??"",a=o?void 0:t.innerHTML,u=Er(s),m=!1,g=()=>{e.document.removeEventListener("pointerdown",C,!0),s.removeEventListener("keydown",v),s.removeEventListener("blur",R),s.removeEventListener("input",O),Cr(s,u)},D=k=>{if(m)return;m=!0;let B=s.textContent??"";if(g(),k==="cancel"){o?.restore(c),o||(t.textContent=c),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(B),k==="commit"&&B!==c){i.onCommitSnapshot?.({ref:n,initialText:c,...a!==void 0?{initialHtml:a}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:B}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function C(k){let B=k.target;B&&s.contains(B)||D("commit")}function v(k){if(k.key==="Escape"){k.preventDefault(),D("cancel");return}k.key==="Enter"&&(k.metaKey||k.ctrlKey)&&(k.preventDefault(),D("commit"))}function R(){D("commit")}function O(){r({kind:"text-edit-input",payload:{ref:n,hit:K(t,n,void 0,"full")}})}return Ir(s),e.document.addEventListener("pointerdown",C,!0),s.addEventListener("keydown",v),s.addEventListener("blur",R),s.addEventListener("input",O),Rr(s),_r(s,e.document),g}function Sr(e,t){let n=t.parentNode;if(!n)return null;let r=e.createElement("span");return r.setAttribute("data-vcp-text-segment-editor","true"),r.textContent=t.textContent??"",n.replaceChild(r,t),{element:r,restore(i){t.nodeValue=i,r.parentNode&&r.parentNode.replaceChild(t,r)}}}function Er(e){return{contentEditable:e.getAttribute("contenteditable"),spellcheck:e.getAttribute("spellcheck"),marker:e.getAttribute("data-vcp-edit-text-editing"),cursor:e.style.cursor,userSelect:e.style.userSelect}}function Ir(e){xr(e.ownerDocument),e.setAttribute("contenteditable","plaintext-only"),e.setAttribute("spellcheck","false"),e.setAttribute("data-vcp-edit-text-editing","true"),e.style.cursor="text",e.style.userSelect="text"}function Cr(e,t){Ue(e,"contenteditable",t.contentEditable),Ue(e,"spellcheck",t.spellcheck),Ue(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function xr(e){if(e.getElementById("vcp-text-edit-base-style"))return;let t=e.createElement("style");t.id="vcp-text-edit-base-style",t.textContent='[data-vcp-edit-text-editing="true"]{outline:0!important;outline-offset:0!important;}',e.head.appendChild(t)}function Ue(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function vr(e){let t=[e.documentElement,e.body].filter(r=>!!r?.style),n=t.map(r=>({element:r,userSelect:r.style.userSelect}));for(let r of t)r.style.userSelect="none";return()=>{for(let r of n)r.element.style.userSelect=r.userSelect}}function Rr(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function _r(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function At(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function j(e){let t=Number(e);return Number.isFinite(t)?t:0}export{We as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,we as VCP_SITE_EDIT_ROUTE_READY_EVENT,hn as resolveSiteEditRouteId,yn as resolveSiteEditWebSocketUrl,Vr as startSiteEditAutoBootstrap,vn as startSiteEditFrameRuntime};
|
package/dist/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function m(n){if(!q(n))return n;let e=new Map,t=n.pageComposition.status==="supported"?n.pageComposition.placementUnitKeys:[],s=new Map(n.dynamicDataSummaries??[]),r=o=>{let a=e.get(o);if(a)return a;let i=n.nodes[o];if(!i)throw new Error(`Missing compact document node ${o}`);let[c,d]=i,u=n.tokens[d];if(typeof u!="string")throw new Error(`Missing compact document token ${d}`);let g=`${c===null?"":r(c)}${u}`;return e.set(o,g),g};return{siteId:n.siteId,snapshotId:n.snapshotId,routeId:n.routeId,version:n.version,pageComposition:n.pageComposition,entries:n.entries.map((o,a)=>{let[i,c,d]=o,u=d===void 0?void 0:t[d];if(d!==void 0&&!u)throw new Error(`Missing page composition unit ${d}`);return{key:r(i),...u?{pageCompositionUnitKey:u}:{},operationSummary:E(c),...s.get(a)?{dynamicDataSummary:s.get(a)}:{}}})}}function E(n){return{canUpdateText:(n&1)!==0,canInsertChild:(n&2)!==0,canMove:(n&4)!==0,canRemove:(n&8)!==0}}function q(n){return typeof n=="object"&&n!==null&&"encoding"in n&&n.encoding==="segment-trie-v1"}var p=class n{constructor(){}static parseMessage(e,t={}){let s=JSON.parse(e);if(!n.isMessage(s,t))throw new Error("Invalid site edit bridge message");return s}static stringifyMessage(e){return JSON.stringify(e)}static extractRequestInfo(e){if(typeof e=="object"&&e!==null&&"payload"in e&&typeof e.payload=="object"&&e.payload!==null){let t=e.payload,s=typeof t.id=="string"?t.id:"unknown",r=n.isRequestKind(t.kind)?t.kind:"get-document";return{id:s,kind:r}}return{id:"unknown",kind:"get-document"}}static isRequestKind(e){return e==="initialize-session"||e==="get-document"||e==="get-history-status"||e==="get-style-context"||e==="get-object-edit-context"||e==="get-class-name-source"||e==="get-source-tree"||e==="get-source-file"||e==="resolve-source-location"||e==="execute"||e==="undo"||e==="redo"}static isMessage(e,t={}){return!h(e)||typeof e.type!="string"?!1:e.type==="request"?n.isRequestPayload(e.payload,t):e.type==="response"||e.type==="error"?h(e.payload)&&typeof e.payload.id=="string":e.type==="event"?h(e.payload)&&h(e.payload.event):e.type==="auth"?h(e.payload)&&typeof e.payload.key=="string":e.type==="auth-ok"?h(e.payload)&&e.payload.ok===!0:!1}static isRequestPayload(e,t={}){if(!h(e)||typeof e.id!="string"||!n.isRequestKind(e.kind))return!1;switch(e.kind){case"initialize-session":return typeof e.routeId=="string"&&(e.mutationContext===void 0||y(e.mutationContext));case"get-document":case"get-style-context":return typeof e.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof e.key=="string"&&(e.routeId===void 0||typeof e.routeId=="string");case"get-history-status":return e.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof e.path=="string";case"execute":return D(e.request)&&(e.request.mutationContext===void 0||y(e.request.mutationContext))&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return e.mutationContext===void 0||y(e.mutationContext)}}};function h(n){return typeof n=="object"&&n!==null}function D(n){return h(n)&&typeof n.id=="string"&&typeof n.siteId=="string"&&typeof n.baseSnapshotId=="string"&&(n.routeId===void 0||typeof n.routeId=="string")&&typeof n.kind=="string"&&h(n.target)&&typeof n.documentVersion=="number"&&Number.isInteger(n.documentVersion)&&n.documentVersion>=0&&h(n.params)}function y(n){return M(n)}function M(n){return h(n)?typeof n.editingSessionId=="string"&&n.editingSessionId.length>0&&typeof n.lockId=="string"&&n.lockId.length>0&&typeof n.ownerId=="string"&&n.ownerId.length>0&&typeof n.leaseAssertion=="string"&&n.leaseAssertion.length>0:!1}var R="vcp:designer:trace",T="designer_trace",b="__VCP_DESIGNER_TRACE__";var _=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function F(n=globalThis){let e=n;try{if(e.localStorage?.getItem(R)==="1")return!0}catch{}try{let t=e.location?.search??"";return new URLSearchParams(t).get(T)==="1"}catch{return!1}}function l(n,e={},t=globalThis){if(!F(t))return;let s={type:n,timestamp:Date.now(),payload:K(e)},r=t,o=r[b]??[];o.push(s),o.length>200&&o.splice(0,o.length-200),r[b]=o;let a=t.console?.debug;typeof a=="function"&&a.call(t.console,"[designer-trace]",s)}function K(n){return I(n,0)}function I(n,e){if(e>4)return"[truncated]";if(Array.isArray(n))return n.map(s=>I(s,e+1));if(!n||typeof n!="object")return n;let t={};for(let[s,r]of Object.entries(n)){if(_.test(s)){t[s]="[redacted]";continue}t[s]=I(r,e+1)}return t}var x=class{constructor(e){this.options=e,this.socket=null,this.connectPromise=null,this.connectAttempt=null,this.connectionState="idle",this.intentionalClose=!1,this.sequence=0,this.pending=new Map,this.listeners=new Set,this.connectionStatusListeners=new Set}connect(){return this.socket?.readyState===S&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((e,t)=>{let s;try{s=this.createSocket(this.options.url)}catch(i){let c=f(i,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",c.message),t(c);return}let r={socket:s,settled:!1,reject:t};this.connectAttempt=r,this.socket=s;let o=()=>{this.socket!==s||this.connectAttempt!==r||(r.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),e())},a=(i,c)=>{this.cleanupSocket(s,i,c)};s.onopen=()=>{if(!(this.socket!==s||this.connectAttempt!==r)){if(this.options.authKey){try{s.send(p.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(i){a(f(i,"WebSocket auth failed"),"failed")}return}o()}},s.onerror=i=>{if(this.socket!==s)return;let c=f(i,"WebSocket failed");a(c,"failed")},s.onmessage=i=>{if(this.socket===s){if(this.options.authKey&&this.connectAttempt===r&&!r.settled){this.handleAuthHandshakeMessage(i.data,s,r,()=>{o()});return}this.handleMessage(i.data)}},s.onclose=i=>{if(this.socket!==s)return;let c=this.intentionalClose,d=new Error(U(i,{intentional:c}));a(d,c?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let e=this.socket;if(!e){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(e,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(e){return this.connectionStatusListeners.add(e),e({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(e)}}getDocument(e){return this.request("get-document",{routeId:e})}initializeSession(e){return this.request("initialize-session",e)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(e){return this.request("get-style-context",{routeId:e})}getObjectEditContext(e,t){return this.request("get-object-edit-context",{key:e,routeId:t})}getClassNameSource(e,t){return this.request("get-class-name-source",{key:e,routeId:t})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(e){return this.request("get-source-file",e)}resolveSourceLocation(e){return this.request("resolve-source-location",e)}execute(e,t){return this.request("execute",{request:e})}undo(e){return this.request("undo",{})}redo(e){return this.request("redo",{})}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}request(e,t){let s=this.socket;if(!s||s.readyState!==S||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${s?.readyState??"none"})`));let r=`${e}-${this.sequence+=1}`,o=P(r,e,t);return l("bridge.request",{id:r,kind:e,routeId:typeof t.routeId=="string"?t.routeId:null,key:typeof t.key=="string"?t.key:null,operationKind:k(t.request,"kind"),documentVersion:k(t.request,"documentVersion")}),new Promise((a,i)=>{let c=this.resolveRequestTimeoutMs(e),d=c>0?setTimeout(()=>{let u=this.pending.get(r);u&&(this.pending.delete(r),l("bridge.response",{id:r,kind:e,ok:!1,timedOut:!0}),u.reject(new Error(`Bridge request timed out after ${c}ms: ${e}`)))},c):null;d?.unref?.(),this.pending.set(r,{kind:e,timeout:d,resolve:u=>a(u),reject:i});try{s.send(p.stringifyMessage(o))}catch(u){let g=f(u,"WebSocket send failed");this.clearPendingRequest(r),i(g),this.cleanupSocket(s,g,"failed")}})}handleAuthHandshakeMessage(e,t,s,r){try{if(p.parseMessage(e).type==="auth-ok"){r();return}throw new Error("Bridge authentication failed")}catch(o){let a=f(o,"Bridge authentication failed");this.connectAttempt===s&&this.cleanupSocket(t,a,"failed")}}handleMessage(e){let t=p.parseMessage(e);if(t.type==="event"){for(let r of this.listeners)r(t.payload.event);return}if(t.type!=="response"&&t.type!=="error")return;let s=this.pending.get(t.payload.id);if(s){if(this.clearPendingRequest(t.payload.id),t.type==="error"){l("bridge.response",{id:t.payload.id,kind:s.kind,ok:!1}),s.reject(new Error(t.payload.message));return}l("bridge.response",{id:t.payload.id,kind:s.kind,ok:!0,resultVersion:$(t.payload.result)}),s.resolve(s.kind==="get-document"?{...t.payload.result,data:m(t.payload.result.data)}:s.kind==="initialize-session"?N(t.payload.result):t.payload.result)}}rejectAll(e){for(let[t,s]of[...this.pending])this.clearPendingRequest(t),s.reject(e)}clearPendingRequest(e){let t=this.pending.get(e);t&&(t.timeout&&clearTimeout(t.timeout),this.pending.delete(e))}resolveRequestTimeoutMs(e){let t=this.options.requestTimeoutMsByKind?.[e];return typeof t=="number"?Math.max(0,t):typeof this.options.requestTimeoutMs=="number"?Math.max(0,this.options.requestTimeoutMs):O[e]??A}cleanupSocket(e,t,s){if(this.socket===e&&(this.socket=null),this.connectAttempt?.socket===e){let r=this.connectAttempt;this.connectAttempt=null,r.settled||(r.settled=!0,r.reject(t))}this.connectPromise=null,this.rejectAll(t),this.setConnectionState(s,t.message),e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null;try{(e.readyState===j||e.readyState===S)&&e.close()}catch{}}setConnectionState(e,t){if(this.connectionState===e&&!t)return;this.connectionState=e;let s={state:e,...t?{message:t}:{}};this.options.onConnectionStatus?.(s);for(let r of this.connectionStatusListeners)r(s)}createSocket(e){if(this.options.createSocket)return this.options.createSocket(e);if(typeof WebSocket>"u")throw new Error("Site edit preview bridge requires WebSocket");return new WebSocket(e)}},j=0,S=1,A=15e3,O={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function f(n,e){return n instanceof Error?n:new Error(e)}function U(n,e){return e.intentional?"WebSocket disconnected":n?.code===1008?n.reason?`Bridge session authentication failed: ${n.reason}`:"Bridge session authentication failed":n?.reason?`WebSocket closed: ${n.reason}`:typeof n?.code=="number"&&n.code!==1005?`WebSocket closed with code ${n.code}`:"WebSocket closed"}function k(n,e){if(!n||typeof n!="object")return null;let s=n[e];return typeof s=="string"||typeof s=="number"?s:null}function $(n){if(!n||typeof n!="object")return null;let e=n,t=e.data?.resultVersion??e.data?.version??null;return typeof t=="number"?t:null}function H(n){return new C(n)}var C=class{constructor(e){this.params=e,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=e.initialDocument,this.observedDocumentVersion=e.initialDocument.version,this.sessionInitialized=!w(e.initialDocument)}async getDocument(e){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let t=w(this.currentDocument);return(t||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(t?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(e){if(e.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let t=await this.params.client.initializeSession(e);return this.currentDocument=t.data.document,this.observedDocumentVersion=t.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),t}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(e){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let t=this.styleContextCache;if(t?.generation===this.styleGeneration)return{ok:!0,data:t.value};let s=this.styleContextInFlight;if(s?.generation===this.styleGeneration)return s.request;let r=this.styleGeneration,o=this.params.client.getStyleContext(e).then(a=>(this.styleGeneration===r&&(this.styleContextCache={generation:r,value:a.data}),a)).finally(()=>{this.styleContextInFlight?.request===o&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:r,request:o},o}async ensureDocumentVersion(e,t){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let s=await this.refreshSnapshot(t,"ensure-version");if(s.version<t)throw new Error(`Document refresh returned version ${s.version}, expected at least ${t}`);return{ok:!0,data:s}}async acknowledgeDocumentVersion(e,t){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);return t>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:t},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,t),{ok:!0,data:this.currentDocument}}async getObjectEditContext(e,t){let s=this.objectCacheKey(e,t),r=this.editContextCache.get(s);if(r)return{ok:!0,data:r};let o=this.editContextInFlight.get(s);if(o)return o;let a=this.objectGeneration,i=this.params.client.getObjectEditContext(e,t??this.params.routeId).then(c=>(this.objectGeneration===a&&this.editContextCache.set(s,c.data),c)).finally(()=>{this.editContextInFlight.get(s)===i&&this.editContextInFlight.delete(s)});return this.editContextInFlight.set(s,i),i}async getClassNameSource(e,t){let s=this.objectCacheKey(e,t),r=this.classNameSourceCache.get(s);if(r)return r;let o=this.classNameSourceInFlight.get(s);if(o)return o;let a=this.objectGeneration,i=this.params.client.getClassNameSource(e,t??this.params.routeId).then(c=>(this.objectGeneration===a&&this.classNameSourceCache.set(s,c),c)).finally(()=>{this.classNameSourceInFlight.get(s)===i&&this.classNameSourceInFlight.delete(s)});return this.classNameSourceInFlight.set(s,i),i}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(e){return this.params.client.getSourceFile(e)}async resolveSourceLocation(e){return this.params.client.resolveSourceLocation({...e,routeId:e.routeId??this.params.routeId})}async execute(e,t){let s=e.target.kind==="node"&&!e.routeId?{...e,routeId:this.params.routeId}:e;return this.params.client.execute(s)}async undo(e){return this.params.client.undo()}async redo(e){return this.params.client.redo()}subscribe(e){return this.params.client.subscribe(t=>{if(t.type==="site-edit.document.changed"&&t.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,t.version),t.version>this.currentDocument.version&&this.clearObjectCaches(),e(t);return}e(t)})}async refreshSnapshot(e,t="ensure-version"){if(typeof e=="number"&&this.currentDocument.version>=e)return l("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:t}),this.currentDocument;if(this.refreshInFlight){l("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,source:t});let r=await this.refreshInFlight;if(typeof e!="number"||r.version>=e||this.currentDocument.version>=e)return this.currentDocument}l("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!1,source:t});let s=this.params.client.getDocument(this.params.routeId).then(r=>(this.currentDocument=r.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,r.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=s;try{return await s}finally{this.refreshInFlight===s&&(this.refreshInFlight=null)}}clearObjectCaches(e){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!e?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(e,t){return`${t??this.params.routeId}\0${e}`}};function w(n){return n.version===0&&n.entries.length===0}function N(n){let e=n;return{...e,data:{...e.data,document:m(e.data.document)}}}function P(n,e,t){switch(e){case"initialize-session":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId),...t.mutationContext?{mutationContext:t.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId)}};case"get-history-status":return{type:"request",payload:{id:n,kind:e}};case"get-style-context":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:n,kind:e}};case"get-source-file":return{type:"request",payload:{id:n,kind:e,path:String(t.path)}};case"resolve-source-location":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"execute":return{type:"request",payload:{id:n,kind:e,request:t.request}};case"undo":case"redo":return{type:"request",payload:{id:n,kind:e,mutationContext:t.mutationContext}}}}export{x as SiteEditWebSocketClient,H as createSiteEditBridge};
|
|
1
|
+
function y(n){if(!M(n))return n;let e=new Map,t=n.pageComposition.status==="supported"?n.pageComposition.placementUnitKeys:[],s=new Map(n.dynamicDataSummaries??[]),r=o=>{let a=e.get(o);if(a)return a;let i=n.nodes[o];if(!i)throw new Error(`Missing compact document node ${o}`);let[c,d]=i,u=n.tokens[d];if(typeof u!="string")throw new Error(`Missing compact document token ${d}`);let f=`${c===null?"":r(c)}${u}`;return e.set(o,f),f};return{siteId:n.siteId,snapshotId:n.snapshotId,routeId:n.routeId,version:n.version,pageComposition:n.pageComposition,entries:n.entries.map((o,a)=>{let[i,c,d]=o,u=d===void 0?void 0:t[d];if(d!==void 0&&!u)throw new Error(`Missing page composition unit ${d}`);return{key:r(i),...u?{pageCompositionUnitKey:u}:{},operationSummary:D(c),...s.get(a)?{dynamicDataSummary:s.get(a)}:{}}})}}function D(n){return{canUpdateText:(n&1)!==0,canInsertChild:(n&2)!==0,canMove:(n&4)!==0,canRemove:(n&8)!==0}}function M(n){if(typeof n!="object"||n===null)return!1;let e=n;if(e.encoding!=="segment-trie-v1"||typeof e.siteId!="string"||typeof e.snapshotId!="string"||typeof e.routeId!="string"||!Number.isInteger(e.version)||e.version<0||!x(e.pageComposition)||!Array.isArray(e.tokens)||!e.tokens.every(r=>typeof r=="string")||!Array.isArray(e.nodes)||!Array.isArray(e.entries))return!1;let t=e.nodes;if(!t.every((r,o)=>Array.isArray(r)&&r.length===2&&(r[0]===null||g(r[0])&&r[0]<o)&&g(r[1])&&r[1]<e.tokens.length)||!e.entries.every(r=>Array.isArray(r)&&(r.length===2||r.length===3)&&g(r[0])&&r[0]<t.length&&g(r[1])&&r[1]<=15&&(r.length===2||g(r[2]))))return!1;let s=e.dynamicDataSummaries;return s===void 0||Array.isArray(s)&&s.every(r=>Array.isArray(r)&&r.length===2&&g(r[0])&&r[0]<e.entries.length&&x(r[1]))}function x(n){return typeof n=="object"&&n!==null&&!Array.isArray(n)}function g(n){return typeof n=="number"&&Number.isInteger(n)&&n>=0}var p=class n{constructor(){}static parseMessage(e,t={}){let s=JSON.parse(e);if(!n.isMessage(s,t))throw new Error("Invalid site edit bridge message");return s}static stringifyMessage(e){return JSON.stringify(e)}static extractRequestInfo(e){if(typeof e=="object"&&e!==null&&"payload"in e&&typeof e.payload=="object"&&e.payload!==null){let t=e.payload,s=typeof t.id=="string"?t.id:"unknown",r=n.isRequestKind(t.kind)?t.kind:"get-document";return{id:s,kind:r}}return{id:"unknown",kind:"get-document"}}static isRequestKind(e){return e==="initialize-session"||e==="get-document"||e==="get-history-status"||e==="get-style-context"||e==="get-object-edit-context"||e==="get-class-name-source"||e==="get-source-tree"||e==="get-source-file"||e==="resolve-source-location"||e==="execute"||e==="undo"||e==="redo"}static isMessage(e,t={}){return!h(e)||typeof e.type!="string"?!1:e.type==="request"?n.isRequestPayload(e.payload,t):e.type==="response"||e.type==="error"?h(e.payload)&&typeof e.payload.id=="string":e.type==="event"?h(e.payload)&&h(e.payload.event):e.type==="auth"?h(e.payload)&&typeof e.payload.key=="string":e.type==="auth-ok"?h(e.payload)&&e.payload.ok===!0:!1}static isRequestPayload(e,t={}){if(!h(e)||typeof e.id!="string"||!n.isRequestKind(e.kind))return!1;switch(e.kind){case"initialize-session":return typeof e.routeId=="string"&&(e.mutationContext===void 0||I(e.mutationContext));case"get-document":case"get-style-context":return typeof e.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof e.key=="string"&&(e.routeId===void 0||typeof e.routeId=="string");case"get-history-status":return e.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof e.path=="string";case"execute":return R(e.request)&&(e.request.mutationContext===void 0||I(e.request.mutationContext))&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return e.mutationContext===void 0||I(e.mutationContext)}}};function h(n){return typeof n=="object"&&n!==null}function R(n){return h(n)&&typeof n.id=="string"&&typeof n.siteId=="string"&&typeof n.baseSnapshotId=="string"&&(n.routeId===void 0||typeof n.routeId=="string")&&typeof n.kind=="string"&&h(n.target)&&typeof n.documentVersion=="number"&&Number.isInteger(n.documentVersion)&&n.documentVersion>=0&&h(n.params)}function I(n){return T(n)}function T(n){return h(n)?typeof n.editingSessionId=="string"&&n.editingSessionId.length>0&&typeof n.lockId=="string"&&n.lockId.length>0&&typeof n.ownerId=="string"&&n.ownerId.length>0&&typeof n.leaseAssertion=="string"&&n.leaseAssertion.length>0:!1}var A="vcp:designer:trace",_="designer_trace",k="__VCP_DESIGNER_TRACE__";var F=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function K(n=globalThis){let e=n;try{if(e.localStorage?.getItem(A)==="1")return!0}catch{}try{let t=e.location?.search??"";return new URLSearchParams(t).get(_)==="1"}catch{return!1}}function l(n,e={},t=globalThis){if(!K(t))return;let s={type:n,timestamp:Date.now(),payload:j(e)},r=t,o=r[k]??[];o.push(s),o.length>200&&o.splice(0,o.length-200),r[k]=o;let a=t.console?.debug;typeof a=="function"&&a.call(t.console,"[designer-trace]",s)}function j(n){return S(n,0)}function S(n,e){if(e>4)return"[truncated]";if(Array.isArray(n))return n.map(s=>S(s,e+1));if(!n||typeof n!="object")return n;let t={};for(let[s,r]of Object.entries(n)){if(F.test(s)){t[s]="[redacted]";continue}t[s]=S(r,e+1)}return t}var w=class{constructor(e){this.options=e,this.socket=null,this.connectPromise=null,this.connectAttempt=null,this.connectionState="idle",this.intentionalClose=!1,this.sequence=0,this.pending=new Map,this.listeners=new Set,this.connectionStatusListeners=new Set}connect(){return this.socket?.readyState===C&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((e,t)=>{let s;try{s=this.createSocket(this.options.url)}catch(i){let c=m(i,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",c.message),t(c);return}let r={socket:s,settled:!1,reject:t};this.connectAttempt=r,this.socket=s;let o=()=>{this.socket!==s||this.connectAttempt!==r||(r.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),e())},a=(i,c)=>{this.cleanupSocket(s,i,c)};s.onopen=()=>{if(!(this.socket!==s||this.connectAttempt!==r)){if(this.options.authKey){try{s.send(p.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(i){a(m(i,"WebSocket auth failed"),"failed")}return}o()}},s.onerror=i=>{if(this.socket!==s)return;let c=m(i,"WebSocket failed");a(c,"failed")},s.onmessage=i=>{if(this.socket===s){if(this.options.authKey&&this.connectAttempt===r&&!r.settled){this.handleAuthHandshakeMessage(i.data,s,r,()=>{o()});return}this.handleMessage(i.data)}},s.onclose=i=>{if(this.socket!==s)return;let c=this.intentionalClose,d=new Error($(i,{intentional:c}));a(d,c?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let e=this.socket;if(!e){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(e,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(e){return this.connectionStatusListeners.add(e),e({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(e)}}getDocument(e){return this.request("get-document",{routeId:e})}initializeSession(e){return this.request("initialize-session",e)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(e){return this.request("get-style-context",{routeId:e})}getObjectEditContext(e,t){return this.request("get-object-edit-context",{key:e,routeId:t})}getClassNameSource(e,t){return this.request("get-class-name-source",{key:e,routeId:t})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(e){return this.request("get-source-file",e)}resolveSourceLocation(e){return this.request("resolve-source-location",e)}execute(e,t){return this.request("execute",{request:e})}undo(e){return this.request("undo",{})}redo(e){return this.request("redo",{})}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}request(e,t){let s=this.socket;if(!s||s.readyState!==C||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${s?.readyState??"none"})`));let r=`${e}-${this.sequence+=1}`,o=v(r,e,t);return l("bridge.request",{id:r,kind:e,routeId:typeof t.routeId=="string"?t.routeId:null,key:typeof t.key=="string"?t.key:null,operationKind:E(t.request,"kind"),documentVersion:E(t.request,"documentVersion")}),new Promise((a,i)=>{let c=this.resolveRequestTimeoutMs(e),d=c>0?setTimeout(()=>{let u=this.pending.get(r);u&&(this.pending.delete(r),l("bridge.response",{id:r,kind:e,ok:!1,timedOut:!0}),u.reject(new Error(`Bridge request timed out after ${c}ms: ${e}`)))},c):null;d?.unref?.(),this.pending.set(r,{kind:e,timeout:d,resolve:u=>a(u),reject:i});try{s.send(p.stringifyMessage(o))}catch(u){let f=m(u,"WebSocket send failed");this.clearPendingRequest(r),i(f),this.cleanupSocket(s,f,"failed")}})}handleAuthHandshakeMessage(e,t,s,r){try{if(p.parseMessage(e).type==="auth-ok"){r();return}throw new Error("Bridge authentication failed")}catch(o){let a=m(o,"Bridge authentication failed");this.connectAttempt===s&&this.cleanupSocket(t,a,"failed")}}handleMessage(e){let t=p.parseMessage(e);if(t.type==="event"){for(let r of this.listeners)r(t.payload.event);return}if(t.type!=="response"&&t.type!=="error")return;let s=this.pending.get(t.payload.id);if(s){if(this.clearPendingRequest(t.payload.id),t.type==="error"){l("bridge.response",{id:t.payload.id,kind:s.kind,ok:!1}),s.reject(new Error(t.payload.message));return}l("bridge.response",{id:t.payload.id,kind:s.kind,ok:!0,resultVersion:P(t.payload.result)}),s.resolve(s.kind==="get-document"?{...t.payload.result,data:y(t.payload.result.data)}:s.kind==="initialize-session"?B(t.payload.result):t.payload.result)}}rejectAll(e){for(let[t,s]of[...this.pending])this.clearPendingRequest(t),s.reject(e)}clearPendingRequest(e){let t=this.pending.get(e);t&&(t.timeout&&clearTimeout(t.timeout),this.pending.delete(e))}resolveRequestTimeoutMs(e){let t=this.options.requestTimeoutMsByKind?.[e];return typeof t=="number"?Math.max(0,t):typeof this.options.requestTimeoutMs=="number"?Math.max(0,this.options.requestTimeoutMs):U[e]??N}cleanupSocket(e,t,s){if(this.socket===e&&(this.socket=null),this.connectAttempt?.socket===e){let r=this.connectAttempt;this.connectAttempt=null,r.settled||(r.settled=!0,r.reject(t))}this.connectPromise=null,this.rejectAll(t),this.setConnectionState(s,t.message),e.onopen=null,e.onmessage=null,e.onerror=null,e.onclose=null;try{(e.readyState===O||e.readyState===C)&&e.close()}catch{}}setConnectionState(e,t){if(this.connectionState===e&&!t)return;this.connectionState=e;let s={state:e,...t?{message:t}:{}};this.options.onConnectionStatus?.(s);for(let r of this.connectionStatusListeners)r(s)}createSocket(e){if(this.options.createSocket)return this.options.createSocket(e);if(typeof WebSocket>"u")throw new Error("Site edit preview bridge requires WebSocket");return new WebSocket(e)}},O=0,C=1,N=15e3,U={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function m(n,e){return n instanceof Error?n:new Error(e)}function $(n,e){return e.intentional?"WebSocket disconnected":n?.code===1008?n.reason?`Bridge session authentication failed: ${n.reason}`:"Bridge session authentication failed":n?.reason?`WebSocket closed: ${n.reason}`:typeof n?.code=="number"&&n.code!==1005?`WebSocket closed with code ${n.code}`:"WebSocket closed"}function E(n,e){if(!n||typeof n!="object")return null;let s=n[e];return typeof s=="string"||typeof s=="number"?s:null}function P(n){if(!n||typeof n!="object")return null;let e=n,t=e.data?.resultVersion??e.data?.version??null;return typeof t=="number"?t:null}function Y(n){return new b(n)}var b=class{constructor(e){this.params=e,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=e.initialDocument,this.observedDocumentVersion=e.initialDocument.version,this.sessionInitialized=!q(e.initialDocument)}async getDocument(e){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let t=q(this.currentDocument);return(t||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(t?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(e){if(e.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let t=await this.params.client.initializeSession(e);return this.currentDocument=t.data.document,this.observedDocumentVersion=t.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),t}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(e){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let t=this.styleContextCache;if(t?.generation===this.styleGeneration)return{ok:!0,data:t.value};let s=this.styleContextInFlight;if(s?.generation===this.styleGeneration)return s.request;let r=this.styleGeneration,o=this.params.client.getStyleContext(e).then(a=>(this.styleGeneration===r&&(this.styleContextCache={generation:r,value:a.data}),a)).finally(()=>{this.styleContextInFlight?.request===o&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:r,request:o},o}async ensureDocumentVersion(e,t){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);let s=await this.refreshSnapshot(t,"ensure-version");if(s.version<t)throw new Error(`Document refresh returned version ${s.version}, expected at least ${t}`);return{ok:!0,data:s}}async acknowledgeDocumentVersion(e,t){if(e!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${e}`);return t>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:t},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,t),{ok:!0,data:this.currentDocument}}async getObjectEditContext(e,t){let s=this.objectCacheKey(e,t),r=this.editContextCache.get(s);if(r)return{ok:!0,data:r};let o=this.editContextInFlight.get(s);if(o)return o;let a=this.objectGeneration,i=this.params.client.getObjectEditContext(e,t??this.params.routeId).then(c=>(this.objectGeneration===a&&this.editContextCache.set(s,c.data),c)).finally(()=>{this.editContextInFlight.get(s)===i&&this.editContextInFlight.delete(s)});return this.editContextInFlight.set(s,i),i}async getClassNameSource(e,t){let s=this.objectCacheKey(e,t),r=this.classNameSourceCache.get(s);if(r)return r;let o=this.classNameSourceInFlight.get(s);if(o)return o;let a=this.objectGeneration,i=this.params.client.getClassNameSource(e,t??this.params.routeId).then(c=>(this.objectGeneration===a&&this.classNameSourceCache.set(s,c),c)).finally(()=>{this.classNameSourceInFlight.get(s)===i&&this.classNameSourceInFlight.delete(s)});return this.classNameSourceInFlight.set(s,i),i}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(e){return this.params.client.getSourceFile(e)}async resolveSourceLocation(e){return this.params.client.resolveSourceLocation({...e,routeId:e.routeId??this.params.routeId})}async execute(e,t){let s=e.target.kind==="node"&&!e.routeId?{...e,routeId:this.params.routeId}:e;return this.params.client.execute(s)}async undo(e){return this.params.client.undo()}async redo(e){return this.params.client.redo()}subscribe(e){return this.params.client.subscribe(t=>{if(t.type==="site-edit.document.changed"&&t.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,t.version),t.version>this.currentDocument.version&&this.clearObjectCaches(),e(t);return}e(t)})}async refreshSnapshot(e,t="ensure-version"){if(typeof e=="number"&&this.currentDocument.version>=e)return l("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:t}),this.currentDocument;if(this.refreshInFlight){l("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,source:t});let r=await this.refreshInFlight;if(typeof e!="number"||r.version>=e||this.currentDocument.version>=e)return this.currentDocument}l("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!1,source:t});let s=this.params.client.getDocument(this.params.routeId).then(r=>(this.currentDocument=r.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,r.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=s;try{return await s}finally{this.refreshInFlight===s&&(this.refreshInFlight=null)}}clearObjectCaches(e){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!e?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(e,t){return`${t??this.params.routeId}\0${e}`}};function q(n){return n.version===0&&n.entries.length===0}function B(n){let e=n;return{...e,data:{...e.data,document:y(e.data.document)}}}function v(n,e,t){switch(e){case"initialize-session":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId),...t.mutationContext?{mutationContext:t.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId)}};case"get-history-status":return{type:"request",payload:{id:n,kind:e}};case"get-style-context":return{type:"request",payload:{id:n,kind:e,routeId:String(t.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:n,kind:e}};case"get-source-file":return{type:"request",payload:{id:n,kind:e,path:String(t.path)}};case"resolve-source-location":return{type:"request",payload:{id:n,kind:e,key:String(t.key),routeId:typeof t.routeId=="string"?t.routeId:void 0}};case"execute":return{type:"request",payload:{id:n,kind:e,request:t.request}};case"undo":case"redo":return{type:"request",payload:{id:n,kind:e,mutationContext:t.mutationContext}}}}export{w as SiteEditWebSocketClient,Y as createSiteEditBridge};
|
package/dist/document-codec.d.ts
CHANGED
|
@@ -27,4 +27,4 @@ export type CompactRenderDocumentEntry = [
|
|
|
27
27
|
];
|
|
28
28
|
export declare function encodeRenderDocument(document: SiteEditRenderDocument): CompactRenderDocument;
|
|
29
29
|
export declare function decodeRenderDocument(document: CompactRenderDocument | SiteEditRenderDocument): SiteEditRenderDocument;
|
|
30
|
-
export declare function isCompactRenderDocument(value:
|
|
30
|
+
export declare function isCompactRenderDocument(value: unknown): value is CompactRenderDocument;
|
package/dist/document-codec.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function A(e){let n=new Map,o=[],i=new Map,t=[],a=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],u=new Map(a.map((s,r)=>[s,r])),g=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(s=>({placementKey:s.placementKey,placementUnitKey:s.placementUnitKey,relation:s.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},m=e.entries.flatMap((s,r)=>s.dynamicDataSummary?[[r,s.dynamicDataSummary]]:[]),p=s=>{let r=n.get(s);if(typeof r=="number")return r;let d=o.length;return o.push(s),n.set(s,d),d},c=s=>{let r=null;for(let d of x(s)){let l=`${r??"root"}\0${d}`,y=i.get(l);if(typeof y=="number"){r=y;continue}let h=t.length;t.push([r,p(d)]),i.set(l,h),r=h}if(r===null)throw new Error("Document key must not be empty");return r};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:g,tokens:o,nodes:t,entries:e.entries.map(s=>{let r=s.pageCompositionUnitKey?u.get(s.pageCompositionUnitKey)??-1:-1;if(s.pageCompositionUnitKey&&r<0)throw new Error(`Render entry ${s.key} references unknown page composition unit ${s.pageCompositionUnitKey}`);return[c(s.key),K(s.operationSummary),...r>=0?[r]:[]]}),...m.length>0?{dynamicDataSummaries:m}:{}}}function M(e){if(!w(e))return e;let n=new Map,o=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],i=new Map(e.dynamicDataSummaries??[]),t=a=>{let u=n.get(a);if(u)return u;let g=e.nodes[a];if(!g)throw new Error(`Missing compact document node ${a}`);let[m,p]=g,c=e.tokens[p];if(typeof c!="string")throw new Error(`Missing compact document token ${p}`);let s=`${m===null?"":t(m)}${c}`;return n.set(a,s),s};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map((a,u)=>{let[g,m,p]=a,c=p===void 0?void 0:o[p];if(p!==void 0&&!c)throw new Error(`Missing page composition unit ${p}`);return{key:t(g),...c?{pageCompositionUnitKey:c}:{},operationSummary:U(m),...i.get(u)?{dynamicDataSummary:i.get(u)}:{}}})}}function K(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function U(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function w(e){if(typeof e!="object"||e===null)return!1;let n=e;if(n.encoding!=="segment-trie-v1"||typeof n.siteId!="string"||typeof n.snapshotId!="string"||typeof n.routeId!="string"||!Number.isInteger(n.version)||n.version<0||!I(n.pageComposition)||!Array.isArray(n.tokens)||!n.tokens.every(t=>typeof t=="string")||!Array.isArray(n.nodes)||!Array.isArray(n.entries))return!1;let o=n.nodes;if(!o.every((t,a)=>Array.isArray(t)&&t.length===2&&(t[0]===null||f(t[0])&&t[0]<a)&&f(t[1])&&t[1]<n.tokens.length)||!n.entries.every(t=>Array.isArray(t)&&(t.length===2||t.length===3)&&f(t[0])&&t[0]<o.length&&f(t[1])&&t[1]<=15&&(t.length===2||f(t[2]))))return!1;let i=n.dynamicDataSummaries;return i===void 0||Array.isArray(i)&&i.every(t=>Array.isArray(t)&&t.length===2&&f(t[0])&&t[0]<n.entries.length&&I(t[1]))}function I(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function f(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0}function x(e){if(!e)return[];let n=[],o=0,i=C(e,o);if(i<0)return n.push(e),n;for(n.push(e.slice(0,i)),o=i;o<e.length;){if(i=C(e,o+(e.startsWith("::",o)?2:1)),i<0){n.push(e.slice(o));break}n.push(e.slice(o,i)),o=i}return n}function C(e,n){let o=e.indexOf("/",n),i=e.indexOf("::",n);return o<0?i:i<0?o:Math.min(o,i)}export{M as decodeRenderDocument,A as encodeRenderDocument,w as isCompactRenderDocument};
|