@vcp-dev/site-edit-bridge 0.6.0 → 0.6.2
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.d.ts +34 -6
- package/dist/client.js +1 -1
- package/dist/document-codec.d.ts +5 -1
- package/dist/document-codec.js +1 -1
- package/dist/index.js +3 -4
- package/dist/next-dev-server.d.ts +0 -11
- package/dist/next-dev-server.js +3 -4
- package/dist/protocol.d.ts +5 -4
- package/dist/server.d.ts +0 -4
- package/dist/server.js +2 -2
- package/dist/start-next-dev-server.js +0 -1
- package/dist/window-message.d.ts +10 -7
- package/package.json +3 -8
- package/dist/dev-demo-auth-fixture.d.ts +0 -36
- package/dist/dev-demo-auth-fixture.js +0 -1
package/dist/auto-bootstrap.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function Ee(e){if(!mt(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=i=>{let o=t.get(i);if(o)return o;let s=e.nodes[i];if(!s)throw new Error(`Missing compact document node ${i}`);let[u,c]=s,a=e.tokens[c];if(typeof a!="string")throw new Error(`Missing compact document token ${c}`);let h=`${u===null?"":r(u)}${a}`;return t.set(i,h),h};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map(i=>{let[o,s,u]=i,c=u===void 0?void 0:n[u];if(u!==void 0&&!c)throw new Error(`Missing page composition unit ${u}`);return{key:r(o),...c?{pageCompositionUnitKey:c}:{},operationSummary:ht(s)}})}}function ht(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function mt(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}var z=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!M(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?M(t.payload)&&typeof t.payload.id=="string":t.type==="event"?M(t.payload)&&M(t.payload.event):t.type==="auth"?M(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?M(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!M(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||Ie(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 gt(t.request)&&Ie(t.request.mutationContext)&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return Ie(t.mutationContext)}}};function M(e){return typeof e=="object"&&e!==null}function gt(e){return M(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"&&M(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&M(e.params)}function Ie(e){return yt(e)}function yt(e){return M(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 bt="vcp:designer:trace",St="designer_trace",Fe="__VCP_DESIGNER_TRACE__";var Et=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function It(e=globalThis){let t=e;try{if(t.localStorage?.getItem(bt)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(St)==="1"}catch{return!1}}function j(e,t={},n=globalThis){if(!It(n))return;let r={type:e,timestamp:Date.now(),payload:vt(t)},i=n,o=i[Fe]??[];o.push(r),o.length>200&&o.splice(0,o.length-200),i[Fe]=o;let s=n.console?.debug;typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function vt(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(Et.test(r)){n[r]="[redacted]";continue}n[r]=ve(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===Ce&&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 c=L(u,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",c.message),n(c);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,c)=>{this.cleanupSocket(r,u,c)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(z.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(u){s(L(u,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=u=>{if(this.socket!==r)return;let c=L(u,"WebSocket failed");s(c,"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 c=this.intentionalClose,a=new Error(_t(u,{intentional:c}));s(a,c?"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,mutationContext:n}})}undo(t){return this.request("undo",{mutationContext:t})}redo(t){return this.request("redo",{mutationContext:t})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}request(t,n){let r=this.socket;if(!r||r.readyState!==Ce||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=Dt(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:Be(n.request,"kind"),documentVersion:Be(n.request,"documentVersion")}),new Promise((s,u)=>{let c=this.resolveRequestTimeoutMs(t),a=c>0?setTimeout(()=>{let h=this.pending.get(i);h&&(this.pending.delete(i),j("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),h.reject(new Error(`Bridge request timed out after ${c}ms: ${t}`)))},c):null;a?.unref?.(),this.pending.set(i,{kind:t,timeout:a,resolve:h=>s(h),reject:u});try{r.send(z.stringifyMessage(o))}catch(h){let m=L(h,"WebSocket send failed");this.clearPendingRequest(i),u(m),this.cleanupSocket(r,m,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(z.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=L(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=z.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:Tt(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Ee(n.payload.result.data)}:r.kind==="initialize-session"?kt(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):Rt[t]??xt}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===Ct||t.readyState===Ce)&&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)}},Ct=0,Ce=1,xt=15e3,Rt={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function L(e,t){return e instanceof Error?e:new Error(t)}function _t(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 Be(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Tt(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 Oe(e){return new xe(e)}var xe=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=!Me(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=Me(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(c=>(this.objectGeneration===s&&this.editContextCache.set(r,c.data),c)).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(c=>(this.objectGeneration===s&&this.classNameSourceCache.set(r,c),c)).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,mutationContext:n},n)}async undo(t){return this.params.client.undo(t)}async redo(t){return this.params.client.redo(t)}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 Me(e){return e.version===0&&e.entries.length===0}function kt(e){let t=e;return{...t,data:{...t.data,document:Ee(t.data.document)}}}function Dt(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 qe="vcp-window-message";function Nt(e){return{source:qe,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function At(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.source===qe&&t.version===1&&typeof t.namespace=="string"&&typeof t.channel=="string"&&"body"in t}var Ke="site-edit",Ve="frame-runtime";function ee(e,t={}){return Nt({namespace:Ke,channel:Ve,sessionKey:t.sessionKey,body:e})}function Ue(e){return!At(e)||e.namespace!==Ke||e.channel!==Ve?!1:typeof e.body?.type=="string"}var Te="vcp-site-edit:route-ready",ke="vcp-site-edit:bridge-status",Pt=1e3,Ft="data-vcp-ui-component",Ye="data-vcp-theme-preview",We="::repeat-item#",ue="components/ui",Bt=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),Mt=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function Ot(e,t=""){let n=Le(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function qt(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 Kt(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 sr(e=window,t={}){let n=Kt(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=Vt({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(Ut(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,c=t.create_client??(p=>new se({url:p,authKey:t.bridge_session_key})),a=t.schedule_after_navigation??Qt,h=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},m=()=>Ot(e.location.pathname,t.basePath||""),R=!!e.parent&&e.parent!==e,E=p=>{Zt(e,p)},_=p=>{o.currentDocument=p,o.currentEntriesByKey=new Map((p?.entries??[]).map(g=>[g.key,g]))},C=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},N=(p,g)=>!o.disposed&&g===o.routeSequence&&p===m(),T=async(p,g)=>{let x=o.activeBridge;if(!x)return null;let d=await x.getDocument(p);return N(p,g)&&_(d.data),d.data},A=()=>{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()},ge=p=>p===s.routeId&&!!o.activeBridge&&(R||!!(o.currentDocument&&en(o.currentDocument,p)))&&Lt(o.activeClient),ye=p=>Math.min(Pt*2**Math.max(0,p),8e3),G=(p,g,x)=>{if(o.disposed)return;h();let d=ye(x);E({state:"reconnecting",routeId:p,attempt:x,retryInMs:d,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||g!==o.routeSequence)&&re(x+1).catch(f=>{let l=m();if(p===l){if(Y(f)){E({state:"reload-required",routeId:p,attempt:x,messageKey:"studio.errors.previewBridgeReloadRequired"});return}G(p,o.routeSequence,x+1)}})},d)},J=(p,g,x)=>{if(!N(p,g)||o.activeClient===null)return;if(Y(x.message)){A(),h(),E({state:"reload-required",routeId:p,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let d=o.activeClient;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(),G(p,g,0)},be=p=>{let g=m(),x=o.routeSequence;if(!(!N(g,x)||o.activeClient===null)){if(Y(p)){A(),h(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Ze(p)&&J(g,x,{state:"failed",message:Ne(p,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=zt(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:p=>o.currentEntriesByKey.get(p)??null,setCurrentDocument:_,onBridgeRequestError:p=>{be(p)}});let X=async()=>re(0),re=async p=>{if(o.disposed)return;let g=m();if(ge(g))return;let x=o.syncInFlight;if(x?.routeId===g)return x.promise;let d=o.routeSequence+1,f=Se(g,d,p);o.syncInFlight={routeId:g,sequence:d,promise:f};try{await f}finally{o.syncInFlight?.promise===f&&(o.syncInFlight=null)}},Se=async(p,g,x)=>{o.routeSequence=g,h(),A(),E({state:x>0?"reconnecting":"connecting",routeId:p,attempt:x,messageKey:x>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let d=c(n),f=!1;o.activeClient=d,o.unsubscribeConnectionStatus=d.subscribeConnectionStatus?.(l=>{f&&(l.state==="closed"||l.state==="failed")&&J(p,g,l)});try{if(await d.connect(),!N(p,g)){d.disconnect();return}let l=Oe({routeId:p,client:d,initialDocument:wt(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 v=(R?null:await l.initializeSession({routeId:p}))?.data.document??null;if(v&&_(v),!N(p,g)){d.disconnect();return}f=!0,E({state:"ready",routeId:p,attempt:x,messageKey:"studio.status.previewReady"}),qt(e,{documentVersion:v?.version??0,routeId:p,versions:t.runtime_versions}),v&&Qe(e,{routeId:p,version:v.version})}catch(l){if(C(),o.activeClient===d&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,d.disconnect(),_(null),!N(p,g))return;throw E({state:Y(l)?"reload-required":"failed",routeId:p,attempt:x,messageKey:Y(l)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),l}},U=p=>{if(o.disposed)return;let g=m();if(Y(p)){h(),E({state:"reload-required",routeId:g,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}G(g,o.routeSequence,0)},K=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,a(()=>{o.syncScheduled=!1,!o.disposed&&X().catch(p=>U(p))}))},oe=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,h(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),A(),u()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:X,cleanup:oe},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=jt(e,oe),o.unbindRouteChange=Xt(e,K,m),t.defer_initial_sync){K();return}await X()}function Vt(e){return{basePath:Le(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:Wt(e.options.bridge_session_key)}}function Ut(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function Wt(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 jt(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),$t(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function $t(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function wt(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function zt(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,u=null,c=null,a=null,h=null,m=new Map,R=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,E=()=>{n?.(),n=null,r=null},_=()=>{i?.(),i=null,o?.(),o=null},C=(d,f,l)=>{let D=s?.sessionKey!==d||s?.sourceWindow!==f||s?.targetOrigin!==l;s={sessionKey:d,sourceWindow:f,targetOrigin:l},D&&(a=null,h=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 m.values())d();m.clear()},A=d=>JSON.stringify([d.routeId,d.version]),ge=()=>!c||c.state==="ready",ye=d=>JSON.stringify([d.state,d.routeId??null,d.attempt??null,d.retryInMs??null,d.messageKey??null]),G=d=>{if(!ge())return;let f=A(d);a!==f&&(o?.(),o=null,U({kind:"route-ready",payload:{routeId:d.routeId,version:d.version}}),s&&(a=f))},J=d=>{let f=ye(d);h!==f&&(d.state!=="ready"&&(a=null,u=null),U({kind:"bridge-status",payload:d}),s&&(h=f))},be=d=>{u=d,G(d)},X=d=>{c=d,J(d)},re=()=>{u&&G(u)},Se=()=>{c&&J(c)},U=d=>{s&&s.sourceWindow.postMessage(ee({type:"event",...d},{sessionKey:s.sessionKey}),s.targetOrigin)},K=(d,f,l,D)=>{let v=pe(e.document,f.clientX,f.clientY,t.getCurrentDocument?.()??null),k=v?F(v,l==="full"?q(e.document,v,t.getCurrentDocument?.()??null):we(e.document,v,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()),U({kind:d,payload:{clientX:f.clientX,clientY:f.clientY,buttons:Number(f.buttons??0),hit:k}})},oe=(d,f,l)=>{_(),s={sessionKey:d,sourceWindow:f,targetOrigin:l};let D=zn(e.document),v=null,k=null,y=()=>{k=null;let b=v;v=null,b&&K("pointer-move",b,"summary")},B=b=>{v={clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},k===null&&(k=Je(e,y))},W=b=>{K("pointer-down",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},H=b=>{K("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},V=b=>{K("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},w=b=>{K("pointer-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Q=b=>{K("pointer-double-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Z=()=>{U({kind:"scroll",payload:{metrics:le(e)}})};e.document.addEventListener("pointerdown",W,!0),e.document.addEventListener("pointermove",B,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",H,!0),e.document.addEventListener("pointercancel",V,!0),e.document.addEventListener("click",w,!0),e.document.addEventListener("dblclick",Q,!0),e.addEventListener("scroll",Z,{passive:!0}),i=()=>{k!==null&&(Xe(e,k),k=null),v=null,D(),e.document.removeEventListener("pointerdown",W,!0),e.document.removeEventListener("pointermove",B,!0),e.document.removeEventListener("pointerup",H,!0),e.document.removeEventListener("pointercancel",V,!0),e.document.removeEventListener("click",w,!0),e.document.removeEventListener("dblclick",Q,!0),e.removeEventListener("scroll",Z)}},p=d=>{let f=d.detail;f?.routeId&&be(f)},g=d=>{let f=d.detail;f?.state&&X(f)},x=d=>{let f=d.data;if(!Ue(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"&&!je(f.body))return;let l=f.body,D=typeof f.sessionKey=="string"?f.sessionKey:null,v=d.source,k=d.origin;if(!D||!k||!v||typeof v.postMessage!="function"||!N(D,v))return;if(s){if(s.sourceWindow!==v||s.targetOrigin!==k)return;s.sessionKey!==D&&(E(),_(),T(),s=null)}C(D,v,k),Se(),re();let y=B=>{let W=typeof l.id=="string"?l.id:"unknown";v.postMessage(ee({id:W,...B},{sessionKey:D}),k)};try{if(je(l)){Ht({message:l,sendEvent:S=>{v.postMessage(ee({type:"event",...S},{sessionKey:D}),k)},sendResponse:y,subscriptions:m,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(l.kind==="apply-node-patch"){let S=$(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,P=I?An(I.sessionId,l.payload.ref):null;if(P&&I){let ie=te.get(P)??-1;if(I.revision<ie){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,stale:!0,latestRevision:ie}});return}if(I.revision===ie){y({type:"response",ok:!0,result:{applied:!1,appliedRevision:I.revision,duplicate:!0,latestRevision:ie}});return}}if(Dn(S,l.payload.patch),P&&I&&Pn(P,I.revision),I?.responseDetail==="none"){y({type:"response",ok:!0,result:{applied:!0,appliedRevision:I.revision}});return}y({type:"response",ok:!0,result:F(S,q(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,I?.responseDetail??"full")});return}if(l.kind==="get-hit-by-ref"){let S=$(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:F(S,q(e.document,S,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(l.kind==="get-path-by-ref"){let S=$(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=[],P=S;for(;P;)P.getAttribute("data-vcp-edit-key")&&I.push(F(P,q(e.document,P,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),P=P.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&&$e(r.ref,S)&&(r=null),y({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!$e(r.ref,S)){y({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let I=rn(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:le(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:le(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:{...le(e),scrolled:!0}});return}if(l.kind==="set-interaction-mode"){l.payload.enabled?oe(D,v,k):s?.sourceWindow===v&&s.targetOrigin===k&&s.sessionKey===D&&_(),y({type:"response",ok:!0,result:{interactionEnabled:l.payload.enabled}});return}if(l.kind==="set-theme-override"){Fn(e.document,l.payload),y({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(l.kind==="clear-theme-override"){Bn(e.document),y({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(l.kind==="get-theme-variables"){y({type:"response",ok:!0,result:Mn(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:Cn(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=$(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=Sn(e,I,S,t.getCurrentDocument,t.getDocumentEntry,P=>U({kind:"node-bounds-change",payload:{hit:P}})),y({type:"response",ok:!0,result:{observing:!0}}),U({kind:"node-bounds-change",payload:{hit:F(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 B=Number(l.payload?.x),W=Number(l.payload?.y);if(!Number.isFinite(B)||!Number.isFinite(W)){y({type:"response",ok:!1,error:"Invalid text edit point"});return}let H=l.kind==="hit-test-at-point"?pe(e.document,B,W,t.getCurrentDocument?.()??null):sn(e.document,B,W,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!H){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 V=l.kind==="start-text-edit-at-point"?H:null,w=l.kind==="hit-test-at-point"?H:V.element,Q=l.payload.detailLevel??"full",Z=Q==="full"?q(e.document,w,t.getCurrentDocument?.()??null):we(e.document,w,t.getCurrentDocument?.()??null),b=V&&typeof V.textSegmentIndex=="number"?{...Z,textSegmentIndex:V.textSegmentIndex}:Z,ft=F(w,b,t.getDocumentEntry,Q);if(l.kind==="hit-test-at-point"){y({type:"response",ok:!0,result:ft});return}E(),n=Vn(e,w,b,S=>{v.postMessage(ee({type:"event",...S},{sessionKey:D}),k)},{...V?.textNode?{textNode:V.textNode}:{},onCommitSnapshot:S=>{r=S}}),y({type:"response",ok:!0,result:{ref:b}})}catch(B){y({type:"response",ok:!1,error:B instanceof Error?B.message:"Failed to start text edit"})}};return e.addEventListener("message",x),e.addEventListener(Te,p),e.addEventListener(ke,g),()=>{E(),_(),s=null,T(),e.removeEventListener("message",x),e.removeEventListener(Te,p),e.removeEventListener(ke,g)}}function je(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 Gt(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 Ht({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,windowLike:u}){let c=u.__VCP_SITE_EDIT__;if(!c){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 a=await c.initializeSession({routeId:e.payload.routeId,...e.payload.mutationContext?{mutationContext:e.payload.mutationContext}:{}});o?.(a.data.document),Qe(u,{routeId:a.data.document.routeId,version:a.data.document.version}),n({type:"response",ok:!0,result:a});return}case"bridge-get-document":{let a=await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await c.getHistoryStatus()});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await c.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 a=c.ensureDocumentVersion?await c.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let a=c.acknowledgeDocumentVersion?await c.acknowledgeDocumentVersion(e.payload.routeId,Number(e.payload.version)):await c.getDocument(e.payload.routeId);o?.(a.data),n({type:"response",ok:!0,result:a});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await c.getObjectEditContext(e.payload.key,e.payload.routeId)});return;case"bridge-get-class-name-source":{let a=await c.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:Yt(a,e.payload.key,u.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await c.getSourceTree()});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await c.getSourceFile({path:e.payload.path})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await c.resolveSourceLocation({key:e.payload.key,routeId:e.payload.routeId})});return;case"bridge-execute":{let a=await c.execute(e.payload.request,e.payload.mutationContext),h=i?.()?.routeId;if(a.ok&&h&&c.acknowledgeDocumentVersion&&Gt(e.payload.request)){let m=await c.acknowledgeDocumentVersion(h,a.data.resultVersion);o?.(m.data)}n({type:"response",ok:!0,result:a});return}case"bridge-undo":n({type:"response",ok:!0,result:await c.undo(e.payload.mutationContext)});return;case"bridge-redo":n({type:"response",ok:!0,result:await c.redo(e.payload.mutationContext)});return;case"bridge-subscribe":{let a=e.payload.subscriptionId;r.get(a)?.();let h=c.subscribe(m=>{t({kind:"bridge-event",payload:{event:m,subscriptionId:a}})});r.set(a,h),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let a=e.payload.subscriptionId;r.get(a)?.(),r.delete(a),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(a){s?.(a,e),n({type:"response",ok:!1,error:tn(a)})}}function Yt(e,t,n,r){if(!e.ok)return e;let i=$(n,{key:t},r),o=i?Jt(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function Jt(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 Xt(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let a=n();a!==o&&(o=a,t())},u=()=>s(),c=()=>s();return e.history.pushState=function(...h){let m=r.apply(this,h);return s(),m},e.history.replaceState=function(...h){let m=i.apply(this,h);return s(),m},e.addEventListener("popstate",u),e.addEventListener("hashchange",c),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",u),e.removeEventListener("hashchange",c)}}function Qt(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function Je(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function Xe(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function Qe(e,t){e.dispatchEvent(new CustomEvent(Te,{detail:t}))}function Zt(e,t){e.dispatchEvent(new CustomEvent(ke,{detail:t}))}function Lt(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function en(e,t){return e.routeId===t}function Ne(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function Ze(e){let t=Ne(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function tn(e){let t=Ne(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":Ze(t)?"Site edit bridge disconnected":t}function Y(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 Le(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function Ae(e){return Bt.has(tt(e))}function nn(e){return Mt.has(tt(e))}function et(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:nn(e.tagName),canInsertChild:Ae(e.tagName),canMove:!1,canRemove:!1}}function tt(e){return e?.trim().toLowerCase()??""}function $e(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 rn(e,t,n){let r=$(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=on(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 on(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!de(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function sn(e,t,n,r,i){let o=pe(e,t,n,r),s=nt(o);if(!s)return null;let u=s.getAttribute("data-vcp-edit-key")??"",c=q(e,s,r),a=i?.(c.key)??i?.(u);if(!et({operationSummary:a?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let m=un(e,t,n,s);if(m){let R=an(s,m);if(R!==null)return{element:s,textNode:m,textSegmentIndex:R}}return me(s)?null:{element:s}}function un(e,t,n,r){let i=cn(e,t,n);return!i||i.parentElement!==r?null:i}function cn(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(de(o))return o;let u=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return de(u)?u:null}function an(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!de(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function de(e){return e?.nodeType===3}function pe(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=nt(o),u=s?.getAttribute("data-vcp-edit-key")??"";if(s&&hn(s,r,u))return s}return null}function nt(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(Pe(t))return n??t;!ln(r)&&!n&&(n=t)}t=t.parentElement}return n}function Pe(e){return e.getAttribute(Ft)!==null}function ln(e){return dn(e.split("::")[0]??"")}function dn(e){if(!e)return!1;let t=pn(e);return t===ue||t.startsWith(`${ue}/`)||t.includes(`/${ue}/`)||t.endsWith(`/${ue}`)}function pn(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 q(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=ot(st(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${pt(r)}"]`))),n,r);if(i.length<=1)return{key:ze(n,r,0)};let o=i.indexOf(t);return o>=0?{key:ze(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function we(e,t,n){return q(e,t,n)}function $(e,t,n){let r=fe(t.key)??t.key,i=ot(st(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${pt(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=(fe(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let u=fn(n,t.key);return u!==null&&u>=0&&u<i.length?i[u]??null:o!==null?i[o]??null:i[0]??null}function ze(e,t,n){return rt(e,t)[n]?.key??t}function fn(e,t){let n=fe(t);if(!n)return null;let i=rt(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function rt(e,t){return(e?.entries??[]).filter(n=>(fe(n.key)??n.key)===t)}function ot(e,t,n){let r=it(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function hn(e,t,n){let r=it(t,n);return!r||e.tagName.toLowerCase()===r}function it(e,t){return null}var mn=2,gn=4;function st(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&gn)!==0?-1:(r&mn)!==0?1:0})}function fe(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 yn(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=i=>{let o=Number.parseFloat(i??"");return Number.isFinite(o)&&o>0?o:0};return{marginTop:r(n?.marginTop),marginRight:r(n?.marginRight),marginBottom:r(n?.marginBottom),marginLeft:r(n?.marginLeft),paddingTop:r(n?.paddingTop),paddingRight:r(n?.paddingRight),paddingBottom:r(n?.paddingBottom),paddingLeft:r(n?.paddingLeft),borderTopWidth:r(n?.borderTopWidth),borderRightWidth:r(n?.borderRightWidth),borderBottomWidth:r(n?.borderBottomWidth),borderLeftWidth:r(n?.borderLeftWidth),columnGap:r(n?.columnGap),rowGap:r(n?.rowGap)}}function bn(e){return Array.from(e.children).filter(t=>typeof t.getBoundingClientRect=="function").map(t=>vn(t.getBoundingClientRect())).filter(t=>t.width>0&&t.height>0)}function F(e,t,n,r="full"){let i=e.getBoundingClientRect(),o=n?.(t.key)??null,s=e.tagName.toLowerCase(),u=he(e),c=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([E,_])=>[E,_??""])),attributes:Object.fromEntries(e.getAttributeNames().map(E=>[E,e.getAttribute(E)??""]))}:{},a=et({operationSummary:o?.operationSummary,tagName:s,fallbackMode:"preview"}),h=Pe(e),m=!0,R=ct(e)?.getAttribute("data-vcp-edit-key")??null;return{ref:t,key:t.key,detailLevel:r,tagName:s,...o?{sourceKind:"jsx"}:{},...R?{parentKey:R}:{},...o?.pageCompositionUnitKey?{pageCompositionUnitKey:o.pageCompositionUnitKey}:{},...c,runtimeFlags:{selectable:!0,movable:a.canMove,removable:a.canRemove,textEditable:a.canUpdateText,container:h?!1:!!me(e)||a.canInsertChild||m&&Ae(s)},layout:u,rect:{top:i.top,left:i.left,width:i.width,height:i.height},childRects:bn(e),spacing:yn(e)}}function Sn(e,t,n,r,i,o){let s=t,u=F(s,n,i,"summary"),c=null,a=()=>{c===null&&(c=Je(e,h))},h=()=>{c=null;let N=$(e.document,n,r?.()??null);if(!N)return;N!==s&&(R?.unobserve(s),s=N,R?.observe(s));let T=F(s,n,i,"summary");T.rect.width<=0||T.rect.height<=0||En(u,T)&&(u=T,o(T))},m=e.ResizeObserver,R=typeof m=="function"?new m(a):null;R?.observe(s);let E=e.MutationObserver,_=typeof E=="function"?new E(a):null;_?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",a,{passive:!0});let C=e.visualViewport;return C?.addEventListener?.("resize",a,{passive:!0}),e.document.addEventListener("load",a,!0),()=>{c!==null&&(Xe(e,c),c=null),R?.disconnect(),_?.disconnect(),e.removeEventListener("resize",a),C?.removeEventListener?.("resize",a),e.document.removeEventListener("load",a,!0)}}function En(e,t){return ut(e.rect,t.rect)||In(e.childRects,t.childRects)||Ge(e.spacing,t.spacing)||Ge(e.layout,t.layout)}function In(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>ut(i,r[o]??i))}function Ge(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 vn(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function ut(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 Cn(e,t,n,r,i,o,s){let u=e.document,c=pe(u,t,n,o);if(!c)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let a=i?$(u,i,o):null;if(a&&De(c,a))return ce(u,c,"self-or-descendant",o,s);if(r==="move"&&a){let C=Tn(u,c,a,o,s);if(C){let N=Re(C.child,C.targetParent,t,n,"nearest");if(N)return ae(u,C.child,C.targetParent,N,o,s)}}let h=null,m=!1,R=c,E=c.parentElement;for(;E;){if(E.getAttribute("data-vcp-edit-key")){if(a&&De(E,a))return ce(u,c,"self-or-descendant",o,s);let C=He(E,r,s);if(C==="accept"){h={child:R,targetParent:E};break}C==="blocked"&&(m=!0),R=E}E=E.parentElement}let _=He(c,r,s);if(_==="accept"){if(h){let C=Re(h.child,h.targetParent,t,n,"edge");if(C)return ae(u,h.child,h.targetParent,C,o,s)}return ae(u,c,c,xn(c,t,n),o,s)}if(h){let C=Re(h.child,h.targetParent,t,n,"nearest");return ae(u,h.child,h.targetParent,C??"after",o,s)}return _==="blocked"||m?ce(u,c,"operation-boundary-blocked",o,s):ce(u,c,"no-accepting-parent",o,s)}function ce(e,t,n,r,i){return{anchorHit:F(t,q(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function ae(e,t,n,r,i,o){let s=F(t,q(e,t,i),o,"summary"),u=F(n,q(e,n,i),o,"summary"),c=he(n).indicatorOrientation,a=r==="append"||r==="prepend"?Rn(n.getBoundingClientRect(),c,r):_n(t.getBoundingClientRect(),c,r);return{anchorHit:s,targetParentHit:u,relation:r,indicatorOrientation:c,indicatorBounds:a}}function He(e,t,n){if(Pe(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":me(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return Ae(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 xn(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 Rn(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 _n(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 De(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function Tn(e,t,n,r,i){let o=kn(e,t,n,r,i);if(o)return o;let s=ct(n);if(!s||t===s)return null;let u=t,c=t.getAttribute("data-vcp-edit-key")?t:null;for(;u&&u!==s;)u.getAttribute("data-vcp-edit-key")&&(c=u),u=u.parentElement;return u!==s||!c||c===s||c===n||De(c,n)?null:{child:c,targetParent:s}}function kn(e,t,n,r,i){return null}function ct(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function me(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=me(n);if(r)return r}return null}function le(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:O(e.scrollX),scrollY:O(e.scrollY),scrollWidth:Math.max(O(t?.scrollWidth),O(n?.scrollWidth),O(e.innerWidth)),scrollHeight:Math.max(O(t?.scrollHeight),O(n?.scrollHeight),O(e.innerHeight)),viewportWidth:O(e.innerWidth),viewportHeight:O(e.innerHeight)}}function Dn(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 Nn=500,te=new Map;function An(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function Pn(e,t){if(te.size>=Nn){let n=te.keys().next().value;n&&te.delete(n)}te.set(e,t)}var ne=new Set;function Fn(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 ne)r.has(i)||n?.removeProperty(i);ne.clear();for(let i of r)ne.add(i);Kn(e,t.stylesheets??[])}function Bn(e){let t=e.documentElement?.style;for(let n of ne)t?.removeProperty(n);ne.clear();for(let n of dt(e))n.remove()}function Mn(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=at(i,s);u&&(o[s]=u)}return o}function at(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return lt(e,r,n)}function lt(e,t,n){if(!t)return null;let r=On(t);if(!r)return t;let i=at(e,r.name,n);return i||(r.fallback?lt(e,r.fallback,n)??r.fallback:null)}function On(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=qn(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 qn(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 Kn(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of dt(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(Ye,"true"),s.setAttribute("href",o),i.appendChild(s)}}function dt(e){return Array.from(e.querySelectorAll(`link[${Ye}]`))}function Vn(e,t,n,r,i={}){let o=i.textNode?Un(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??"",c=o?void 0:t.innerHTML,a=Wn(s),h=!1,m=()=>{e.document.removeEventListener("pointerdown",E,!0),s.removeEventListener("keydown",_),s.removeEventListener("blur",C),s.removeEventListener("input",N),$n(s,a)},R=T=>{if(h)return;h=!0;let A=s.textContent??"";if(m(),T==="cancel"){o?.restore(u),o||(t.textContent=u),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(A),T==="commit"&&A!==u){i.onCommitSnapshot?.({ref:n,initialText:u,...c!==void 0?{initialHtml:c}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:A}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function E(T){let A=T.target;A&&s.contains(A)||R("commit")}function _(T){if(T.key==="Escape"){T.preventDefault(),R("cancel");return}T.key==="Enter"&&(T.metaKey||T.ctrlKey)&&(T.preventDefault(),R("commit"))}function C(){R("commit")}function N(){r({kind:"text-edit-input",payload:{ref:n,hit:F(t,n,void 0,"full")}})}return jn(s),e.document.addEventListener("pointerdown",E,!0),s.addEventListener("keydown",_),s.addEventListener("blur",C),s.addEventListener("input",N),Gn(s),Hn(s,e.document),m}function Un(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 jn(e){wn(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 $n(e,t){_e(e,"contenteditable",t.contentEditable),_e(e,"spellcheck",t.spellcheck),_e(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function wn(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 _e(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function zn(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 Gn(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function Hn(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function pt(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function O(e){let t=Number(e);return Number.isFinite(t)?t:0}export{ke as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,Te as VCP_SITE_EDIT_ROUTE_READY_EVENT,Ot as resolveSiteEditRouteId,Kt as resolveSiteEditWebSocketUrl,sr as startSiteEditAutoBootstrap,zt as startSiteEditFrameRuntime};
|
|
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};
|
package/dist/client.d.ts
CHANGED
|
@@ -39,9 +39,9 @@ export type SiteEditBridgeClient = {
|
|
|
39
39
|
path: string;
|
|
40
40
|
}): Promise<SiteEditCommandSuccess<SiteEditSourceFileResponse>>;
|
|
41
41
|
resolveSourceLocation(input: SiteEditResolveSourceLocationInput): Promise<SiteEditCommandSuccess<SiteEditSourceLocation>>;
|
|
42
|
-
execute(request: SiteEditOperationRequest, mutationContext
|
|
43
|
-
undo(mutationContext
|
|
44
|
-
redo(mutationContext
|
|
42
|
+
execute(request: SiteEditOperationRequest, mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
|
|
43
|
+
undo(mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
|
|
44
|
+
redo(mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
|
|
45
45
|
subscribe(listener: (event: SiteEditEvent) => void): () => void;
|
|
46
46
|
};
|
|
47
47
|
export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
|
|
@@ -80,6 +80,13 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
|
|
|
80
80
|
canRemove: boolean;
|
|
81
81
|
};
|
|
82
82
|
pageCompositionUnitKey?: string | undefined;
|
|
83
|
+
dynamicDataSummary?: {
|
|
84
|
+
hasDynamicData: boolean;
|
|
85
|
+
sourceKinds: ("vcp-cms-collection" | "vcp-cms-form" | "vcp-cms-settings" | "vcp-cms-navigation" | "site-api-route" | "external-api" | "unknown-api")[];
|
|
86
|
+
primaryEndpoint?: string | undefined;
|
|
87
|
+
primaryCollection?: string | undefined;
|
|
88
|
+
primaryFieldPath?: string | undefined;
|
|
89
|
+
} | undefined;
|
|
83
90
|
}[];
|
|
84
91
|
pageComposition: {
|
|
85
92
|
status: "supported";
|
|
@@ -184,6 +191,27 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
|
|
|
184
191
|
message: string;
|
|
185
192
|
}[];
|
|
186
193
|
} | undefined;
|
|
194
|
+
dynamicData?: {
|
|
195
|
+
hasDynamicData: boolean;
|
|
196
|
+
bindings: {
|
|
197
|
+
sourceKind: "vcp-cms-collection" | "vcp-cms-form" | "vcp-cms-settings" | "vcp-cms-navigation" | "site-api-route" | "external-api" | "unknown-api";
|
|
198
|
+
sourceType: "cms-field" | "api-field";
|
|
199
|
+
targetKind: "text" | "repeat-region" | "richtext" | "attribute" | "component-prop";
|
|
200
|
+
targetName: string;
|
|
201
|
+
confidence: "unknown" | "exact" | "safe-derived" | "partial";
|
|
202
|
+
readonly: true;
|
|
203
|
+
evidence: {
|
|
204
|
+
file: string;
|
|
205
|
+
reason: string;
|
|
206
|
+
symbol?: string | undefined;
|
|
207
|
+
}[];
|
|
208
|
+
endpointPattern?: string | undefined;
|
|
209
|
+
operation?: string | undefined;
|
|
210
|
+
collection?: string | undefined;
|
|
211
|
+
fieldPath?: string | undefined;
|
|
212
|
+
valuePath?: string | undefined;
|
|
213
|
+
}[];
|
|
214
|
+
} | undefined;
|
|
187
215
|
}>>;
|
|
188
216
|
getClassNameSource(key: string, routeId?: string): Promise<SiteEditGetClassNameSourceCommandResult>;
|
|
189
217
|
getSourceTree(): Promise<SiteEditCommandSuccess<{
|
|
@@ -232,9 +260,9 @@ export declare class SiteEditWebSocketClient implements SiteEditBridgeClient {
|
|
|
232
260
|
routeId?: string | undefined;
|
|
233
261
|
textPreview?: string | undefined;
|
|
234
262
|
}>>;
|
|
235
|
-
execute(request: SiteEditOperationRequest,
|
|
236
|
-
undo(
|
|
237
|
-
redo(
|
|
263
|
+
execute(request: SiteEditOperationRequest, _mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
|
|
264
|
+
undo(_mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
|
|
265
|
+
redo(_mutationContext?: SiteEditMutationContext): Promise<SiteEditOperationCommandResult>;
|
|
238
266
|
subscribe(listener: (event: SiteEditEvent) => void): () => void;
|
|
239
267
|
private request;
|
|
240
268
|
private handleAuthHandshakeMessage;
|
package/dist/client.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function f(n){if(!q(n))return n;let e=new Map,t=n.pageComposition.status==="supported"?n.pageComposition.placementUnitKeys:[],s=r=>{let i=e.get(r);if(i)return i;let a=n.nodes[r];if(!a)throw new Error(`Missing compact document node ${r}`);let[o,c]=a,l=n.tokens[c];if(typeof l!="string")throw new Error(`Missing compact document token ${c}`);let d=`${o===null?"":s(o)}${l}`;return e.set(r,d),d};return{siteId:n.siteId,snapshotId:n.snapshotId,routeId:n.routeId,version:n.version,pageComposition:n.pageComposition,entries:n.entries.map(r=>{let[i,a,o]=r,c=o===void 0?void 0:t[o];if(o!==void 0&&!c)throw new Error(`Missing page composition unit ${o}`);return{key:s(i),...c?{pageCompositionUnitKey:c}:{},operationSummary:E(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!u(e)||typeof e.type!="string"?!1:e.type==="request"?n.isRequestPayload(e.payload,t):e.type==="response"||e.type==="error"?u(e.payload)&&typeof e.payload.id=="string":e.type==="event"?u(e.payload)&&u(e.payload.event):e.type==="auth"?u(e.payload)&&typeof e.payload.key=="string":e.type==="auth-ok"?u(e.payload)&&e.payload.ok===!0:!1}static isRequestPayload(e,t={}){if(!u(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||m(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)&&m(e.request.mutationContext)&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return m(e.mutationContext)}}};function u(n){return typeof n=="object"&&n!==null}function D(n){return u(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"&&u(n.target)&&typeof n.documentVersion=="number"&&Number.isInteger(n.documentVersion)&&n.documentVersion>=0&&u(n.params)}function m(n){return R(n)}function R(n){return u(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 M="vcp:designer:trace",T="designer_trace",C="__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(M)==="1")return!0}catch{}try{let t=e.location?.search??"";return new URLSearchParams(t).get(T)==="1"}catch{return!1}}function h(n,e={},t=globalThis){if(!F(t))return;let s={type:n,timestamp:Date.now(),payload:K(e)},r=t,i=r[C]??[];i.push(s),i.length>200&&i.splice(0,i.length-200),r[C]=i;let a=t.console?.debug;typeof a=="function"&&a.call(t.console,"[designer-trace]",s)}function K(n){return y(n,0)}function y(n,e){if(e>4)return"[truncated]";if(Array.isArray(n))return n.map(s=>y(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]=y(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===I&&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(o){let c=g(o,"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 i=()=>{this.socket!==s||this.connectAttempt!==r||(r.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),e())},a=(o,c)=>{this.cleanupSocket(s,o,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(o){a(g(o,"WebSocket auth failed"),"failed")}return}i()}},s.onerror=o=>{if(this.socket!==s)return;let c=g(o,"WebSocket failed");a(c,"failed")},s.onmessage=o=>{if(this.socket===s){if(this.options.authKey&&this.connectAttempt===r&&!r.settled){this.handleAuthHandshakeMessage(o.data,s,r,()=>{i()});return}this.handleMessage(o.data)}},s.onclose=o=>{if(this.socket!==s)return;let c=this.intentionalClose,l=new Error(U(o,{intentional:c}));a(l,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,mutationContext:t}})}undo(e){return this.request("undo",{mutationContext:e})}redo(e){return this.request("redo",{mutationContext:e})}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}request(e,t){let s=this.socket;if(!s||s.readyState!==I||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}`,i=P(r,e,t);return h("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,o)=>{let c=this.resolveRequestTimeoutMs(e),l=c>0?setTimeout(()=>{let d=this.pending.get(r);d&&(this.pending.delete(r),h("bridge.response",{id:r,kind:e,ok:!1,timedOut:!0}),d.reject(new Error(`Bridge request timed out after ${c}ms: ${e}`)))},c):null;l?.unref?.(),this.pending.set(r,{kind:e,timeout:l,resolve:d=>a(d),reject:o});try{s.send(p.stringifyMessage(i))}catch(d){let b=g(d,"WebSocket send failed");this.clearPendingRequest(r),o(b),this.cleanupSocket(s,b,"failed")}})}handleAuthHandshakeMessage(e,t,s,r){try{if(p.parseMessage(e).type==="auth-ok"){r();return}throw new Error("Bridge authentication failed")}catch(i){let a=g(i,"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"){h("bridge.response",{id:t.payload.id,kind:s.kind,ok:!1}),s.reject(new Error(t.payload.message));return}h("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:f(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===I)&&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,I=1,A=15e3,O={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function g(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 S(n)}var S=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,i=this.params.client.getStyleContext(e).then(a=>(this.styleGeneration===r&&(this.styleContextCache={generation:r,value:a.data}),a)).finally(()=>{this.styleContextInFlight?.request===i&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:r,request:i},i}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 i=this.editContextInFlight.get(s);if(i)return i;let a=this.objectGeneration,o=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)===o&&this.editContextInFlight.delete(s)});return this.editContextInFlight.set(s,o),o}async getClassNameSource(e,t){let s=this.objectCacheKey(e,t),r=this.classNameSourceCache.get(s);if(r)return r;let i=this.classNameSourceInFlight.get(s);if(i)return i;let a=this.objectGeneration,o=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)===o&&this.classNameSourceInFlight.delete(s)});return this.classNameSourceInFlight.set(s,o),o}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,mutationContext:t},t)}async undo(e){return this.params.client.undo(e)}async redo(e){return this.params.client.redo(e)}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 h("bridge.document-refresh",{routeId:this.params.routeId,minVersion:e,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:t}),this.currentDocument;if(this.refreshInFlight){h("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}h("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:f(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 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};
|
package/dist/document-codec.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { SiteEditRenderDocument } from "@vcp-dev/contracts";
|
|
1
|
+
import type { SiteEditDynamicDataSummary, SiteEditRenderDocument } from "@vcp-dev/contracts";
|
|
2
2
|
export type CompactRenderDocument = {
|
|
3
3
|
encoding: "segment-trie-v1";
|
|
4
4
|
siteId: string;
|
|
@@ -9,6 +9,10 @@ export type CompactRenderDocument = {
|
|
|
9
9
|
tokens: string[];
|
|
10
10
|
nodes: CompactRenderDocumentNode[];
|
|
11
11
|
entries: CompactRenderDocumentEntry[];
|
|
12
|
+
dynamicDataSummaries?: Array<[
|
|
13
|
+
entryIndex: number,
|
|
14
|
+
summary: SiteEditDynamicDataSummary
|
|
15
|
+
]>;
|
|
12
16
|
};
|
|
13
17
|
/** [parentNodeId, tokenId] */
|
|
14
18
|
export type CompactRenderDocumentNode = [
|
package/dist/document-codec.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
function w(e){let s=new Map,t=[],o=new Map,u=[],a=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],c=new Map(a.map((n,i)=>[n,i])),g=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(n=>({placementKey:n.placementKey,placementUnitKey:n.placementUnitKey,relation:n.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},m=e.entries.flatMap((n,i)=>n.dynamicDataSummary?[[i,n.dynamicDataSummary]]:[]),r=n=>{let i=s.get(n);if(typeof i=="number")return i;let d=t.length;return t.push(n),s.set(n,d),d},p=n=>{let i=null;for(let d of U(n)){let l=`${i??"root"}\0${d}`,f=o.get(l);if(typeof f=="number"){i=f;continue}let y=u.length;u.push([i,r(d)]),o.set(l,y),i=y}if(i===null)throw new Error("Document key must not be empty");return i};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:g,tokens:t,nodes:u,entries:e.entries.map(n=>{let i=n.pageCompositionUnitKey?c.get(n.pageCompositionUnitKey)??-1:-1;if(n.pageCompositionUnitKey&&i<0)throw new Error(`Render entry ${n.key} references unknown page composition unit ${n.pageCompositionUnitKey}`);return[p(n.key),C(n.operationSummary),...i>=0?[i]:[]]}),...m.length>0?{dynamicDataSummaries:m}:{}}}function x(e){if(!K(e))return e;let s=new Map,t=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],o=new Map(e.dynamicDataSummaries??[]),u=a=>{let c=s.get(a);if(c)return c;let g=e.nodes[a];if(!g)throw new Error(`Missing compact document node ${a}`);let[m,r]=g,p=e.tokens[r];if(typeof p!="string")throw new Error(`Missing compact document token ${r}`);let n=`${m===null?"":u(m)}${p}`;return s.set(a,n),n};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map((a,c)=>{let[g,m,r]=a,p=r===void 0?void 0:t[r];if(r!==void 0&&!p)throw new Error(`Missing page composition unit ${r}`);return{key:u(g),...p?{pageCompositionUnitKey:p}:{},operationSummary:I(m),...o.get(c)?{dynamicDataSummary:o.get(c)}:{}}})}}function C(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function I(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function K(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}function U(e){if(!e)return[];let s=[],t=0,o=h(e,t);if(o<0)return s.push(e),s;for(s.push(e.slice(0,o)),t=o;t<e.length;){if(o=h(e,t+(e.startsWith("::",t)?2:1)),o<0){s.push(e.slice(t));break}s.push(e.slice(t,o)),t=o}return s}function h(e,s){let t=e.indexOf("/",s),o=e.indexOf("::",s);return t<0?o:o<0?t:Math.min(t,o)}export{x as decodeRenderDocument,w as encodeRenderDocument,K as isCompactRenderDocument};
|