@vcp-dev/site-edit-bridge 0.7.1 → 0.7.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +13 -13
- package/dist/next-dev-server.js +3 -3
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
function kn(e){let t=new Map,n=[],r=new Map,i=[],o=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],s=new Map(o.map((d,h)=>[d,h])),c=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(d=>({placementKey:d.placementKey,placementUnitKey:d.placementUnitKey,relation:d.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},a=e.entries.flatMap((d,h)=>d.dynamicDataSummary?[[h,d.dynamicDataSummary]]:[]),u=d=>{let h=t.get(d);if(typeof h=="number")return h;let E=n.length;return n.push(d),t.set(d,E),E},l=d=>{let h=null;for(let E of uo(d)){let N=`${h??"root"}\0${E}`,C=r.get(N);if(typeof C=="number"){h=C;continue}let _=i.length;i.push([h,u(E)]),r.set(N,_),h=_}if(h===null)throw new Error("Document key must not be empty");return h};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,composition:{...e.composition},routeId:e.composition.routeId,version:e.version,pageComposition:c,tokens:n,nodes:i,entries:e.entries.map(d=>{let h=d.pageCompositionUnitKey?s.get(d.pageCompositionUnitKey)??-1:-1;if(d.pageCompositionUnitKey&&h<0)throw new Error(`Render entry ${d.key} references unknown page composition unit ${d.pageCompositionUnitKey}`);return[l(d.key),io(d.operationSummary),...h>=0?[h]:[]]}),...a.length>0?{dynamicDataSummaries:a}:{}}}function Nn(e){if(!co(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=new Map(e.dynamicDataSummaries??[]),i=o=>{let s=t.get(o);if(s)return s;let c=e.nodes[o];if(!c)throw new Error(`Missing compact document node ${o}`);let[a,u]=c,l=e.tokens[u];if(typeof l!="string")throw new Error(`Missing compact document token ${u}`);let d=`${a===null?"":i(a)}${l}`;return t.set(o,d),d};return{siteId:e.siteId,snapshotId:e.snapshotId,composition:{...e.composition},routeId:e.composition.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map((o,s)=>{let[c,a,u]=o,l=u===void 0?void 0:n[u];if(u!==void 0&&!l)throw new Error(`Missing page composition unit ${u}`);return{key:i(c),...l?{pageCompositionUnitKey:l}:{},operationSummary:so(a),...r.get(s)?{dynamicDataSummary:r.get(s)}:{}}})}}function io(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function so(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function co(e){if(typeof e!="object"||e===null)return!1;let t=e;if(t.encoding!=="segment-trie-v1"||typeof t.siteId!="string"||typeof t.snapshotId!="string"||!ao(t.composition)||typeof t.routeId!="string"||t.routeId!==t.composition.routeId||!Number.isInteger(t.version)||t.version<0||!Ot(t.pageComposition)||!Array.isArray(t.tokens)||!t.tokens.every(i=>typeof i=="string")||!Array.isArray(t.nodes)||!Array.isArray(t.entries))return!1;let n=t.nodes;if(!n.every((i,o)=>Array.isArray(i)&&i.length===2&&(i[0]===null||we(i[0])&&i[0]<o)&&we(i[1])&&i[1]<t.tokens.length)||!t.entries.every(i=>Array.isArray(i)&&(i.length===2||i.length===3)&&we(i[0])&&i[0]<n.length&&we(i[1])&&i[1]<=15&&(i.length===2||we(i[2]))))return!1;let r=t.dynamicDataSummaries;return r===void 0||Array.isArray(r)&&r.every(i=>Array.isArray(i)&&i.length===2&&we(i[0])&&i[0]<t.entries.length&&Ot(i[1]))}function Ot(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function ao(e){return!Ot(e)||typeof e.routeId!="string"?!1:e.effectiveTemplateId===void 0||typeof e.effectiveTemplateId=="string"}function we(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0}function uo(e){if(!e)return[];let t=[],n=0,r=Pn(e,n);if(r<0)return t.push(e),t;for(t.push(e.slice(0,r)),n=r;n<e.length;){if(r=Pn(e,n+(e.startsWith("::",n)?2:1)),r<0){t.push(e.slice(n));break}t.push(e.slice(n,r)),n=r}return t}function Pn(e,t){let n=e.indexOf("/",t),r=e.indexOf("::",t);return n<0?r:r<0?n:Math.min(n,r)}var Dn="SITE_EDIT_COMPOSITION_SESSION_MISMATCH",zt="SITE_EDIT_COMPOSITION_SESSION_REQUIRED",ga="SITE_EDIT_COMPOSITION_REINITIALIZE_REQUIRED",se=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(G(t)&&G(t.payload)){let n=typeof t.payload.id=="string"?t.payload.id:"unknown",r=this.isRequestKind(t.payload.kind)?t.payload.kind:"get-document";return{id:n,kind:r}}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!G(t)||typeof t.type!="string"?!1:t.type==="request"?lo(t.payload,n):t.type==="response"||t.type==="error"?G(t.payload)&&typeof t.payload.id=="string":t.type==="event"?G(t.payload)&&G(t.payload.event):t.type==="auth"?G(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"&&G(t.payload)&&t.payload.ok===!0}},st=class{constructor(t){this.options=t,this.session={subscribedCompositionKeys:new Set},this.messageQueue=new Wt,this.eventDispatcher=new Kt(n=>{this.sendJson(n)}),this.unsubscribe=t.engine.subscribe(n=>{this.handleEngineEvent(n)}),t.socket.onmessage=n=>{try{this.messageQueue.enqueue(()=>this.handleRawMessage(n.data))}catch(r){this.sendJson({type:"error",payload:{id:"unknown",kind:"get-document",message:r instanceof Error?r.message:"Bridge queue overflow"}}),t.socket.close(1013,"bridge busy")}},t.socket.onclose=()=>{this.unsubscribe(),this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.clear()}}async handleMessage(t){try{let n=t;if(n.type!=="request")return;let r=n.payload,{id:i}=r;switch(r.kind){case"initialize-session":{let o=Mt(r),s=await this.resolve(o),c=await this.options.engine.initializeSession({composition:s.context,...r.mutationContext?{mutationContext:r.mutationContext}:{}});this.activateSession(s.context),this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:Ie({...c,data:{...c.data,document:wn(c.data.document)}},s.context)}});return}case"get-document":{let o=await this.resolveWireContext(r),s=await this.options.engine.getDocument(o);this.sendResult(i,r.kind,go(s,o));return}case"get-history-status":{let o=await this.resolveWireContext(r),s=await this.options.engine.getHistoryStatus(o);this.sendResult(i,r.kind,Ie(s,o));return}case"get-style-context":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getStyleContext(o),o));return}case"get-object-edit-context":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getObjectEditContext(r.key,o),o));return}case"get-class-name-source":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getClassNameSource(r.key,o),o));return}case"get-source-tree":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getSourceTree(o),o));return}case"get-source-file":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getSourceFile({path:r.path,composition:o}),o));return}case"resolve-source-location":{let o=await this.resolveWireContext(r),s=Ie(await this.options.engine.resolveSourceLocation({key:r.key,composition:o}),o);this.sendResult(i,r.kind,s);return}case"execute":{let o=await this.resolveOperationWireContext(r.request),s=await this.resolveWireContext(r);if(_e(o)!==_e(s))throw new Ae(Dn,"The execute request composition does not match its operation composition.");let c=await this.normalizeOperationRequest(r.request,o);await this.handleBufferedOperation(i,r.kind,()=>this.options.engine.execute(c));return}case"undo":case"redo":{let o=await this.resolveWireContext(r);await this.handleBufferedOperation(i,r.kind,()=>r.kind==="undo"?this.options.engine.undo(o):this.options.engine.redo(o));return}}}catch(n){let r=se.extractRequestInfo(t);this.sendJson({type:"error",payload:{...r,message:qt(n),code:Vt(n)}})}}async resolve(t){return this.options.engine.resolveComposition(t)}async resolveAndAssert(t){let n=await this.resolve(t),r=this.session.activeComposition;if(!r)throw new Ae(zt,"Initialize a composition session before issuing this request.");if(_e(r)!==_e(n.context))throw new Ae(Dn,"The request composition does not match the active socket session.");return n.context}async resolveWireContext(t){let n=Mt(t);return this.resolveAndAssert(n)}async resolveOperationWireContext(t){let n=fo(t);return this.resolveAndAssert(n)}activateSession(t){this.session.activeComposition=t,this.session.subscribedCompositionKeys.clear(),this.session.subscribedCompositionKeys.add(_e(t))}async normalizeOperationRequest(t,n){let r={...t,composition:Bn(n)};if(r.target.kind==="route"){let i=r.target,o=Mt(i),s=await this.resolveAndAssert(o);r.target={...i,composition:Bn(s)}}return r}handleEngineEvent(t){let n=t?.composition;if(!ho(n))return;let r=_e(n);this.session.subscribedCompositionKeys.has(r)&&(this.eventDispatcher.push(t),t.type==="site-edit.graph.invalidated"&&r===mo(this.session)&&(this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.delete(r)))}sendResult(t,n,r){this.sendJson({type:"response",payload:{id:t,kind:n,result:r}})}async handleRawMessage(t){try{await this.handleMessage(se.parseMessage(t,{validateOperationRequest:this.options.validateOperationRequest}))}catch(n){let r=yo(t);this.sendJson({type:"error",payload:{...r,message:qt(n),code:Vt(n)}})}}sendJson(t){this.options.socket.send(se.stringifyMessage(t))}async handleBufferedOperation(t,n,r){this.eventDispatcher.beginBuffering();try{let i=await r();this.sendResult(t,n,i)}catch(i){this.sendJson({type:"error",payload:{id:t,kind:n,message:qt(i),code:Vt(i)}})}finally{this.eventDispatcher.flush()}}},Ae=class extends Error{constructor(t,n){super(n),this.code=t,this.name="BridgeProtocolError"}},Kt=class{constructor(t){this.send=t,this.bufferedEvents=null}push(t){let n={type:"event",payload:{event:t}};if(this.bufferedEvents){this.bufferedEvents.push(n);return}this.send(n)}beginBuffering(){this.bufferedEvents=[]}flush(){let t=this.bufferedEvents??[];this.bufferedEvents=null,t.forEach(n=>this.send(n))}},Wt=class{constructor(t=64){this.maxQueued=t,this.queue=Promise.resolve(),this.queued=0}enqueue(t){if(this.queued>=this.maxQueued)throw new Error("Bridge request queue is full");this.queued+=1;let n=async()=>{this.queued-=1,await t()},r=this.queue.then(n,n);return this.queue=r.then(()=>{},()=>{}),r}};function lo(e,t){if(!G(e)||typeof e.id!="string"||!se.isRequestKind(e.kind))return!1;let n=We(e.composition);switch(e.kind){case"initialize-session":return n&&(e.mutationContext===void 0||Ft(e.mutationContext));case"get-document":case"get-style-context":return n;case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof e.key=="string"&&n;case"get-history-status":return n;case"get-source-tree":return n;case"get-source-file":return typeof e.path=="string"&&n;case"execute":return n&&po(e.request)&&(e.request.mutationContext===void 0||Ft(e.request.mutationContext))&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return n&&e.mutationContext===void 0||n&&Ft(e.mutationContext)}}function po(e){return G(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&We(e.composition)&&typeof e.kind=="string"&&G(e.target)&&(e.target.kind!=="route"||We(e.target.composition))&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&G(e.params)}function We(e){return G(e)&&typeof e.routeId=="string"&&e.routeId.length>0&&(e.templateId===void 0||typeof e.templateId=="string"&&e.templateId.length>0)&&Object.keys(e).every(t=>t==="routeId"||t==="templateId")}function ho(e){return G(e)&&typeof e.routeId=="string"&&(e.effectiveTemplateId===void 0||typeof e.effectiveTemplateId=="string")}function Mt(e){if(We(e.composition))return e.composition;throw new Ae(zt,"A composition selector is required for this request.")}function fo(e){if(G(e)&&We(e.composition))return e.composition;throw new Ae(zt,"A composition selector is required for execute.")}function Bn(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function mo(e){return e.activeComposition?_e(e.activeComposition):null}function _e(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}function Ie(e,t){return G(e)&&e.ok===!0?{...e,composition:t}:e}function go(e,t){return!G(e)||e.ok!==!0?e:{...e,...t?{composition:t}:{},data:wn(e.data)}}function wn(e){let t=e;return kn(t.routeId?t:{...t,routeId:t.composition.routeId})}function G(e){return typeof e=="object"&&e!==null}function Ft(e){return G(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}function Vt(e){if(!(!G(e)||typeof e.code!="string"||e.code.length===0))return e.code}function qt(e){return e instanceof Error||G(e)&&typeof e.message=="string"&&e.message.length>0?e.message:"Unknown websocket operation failure"}function yo(e){try{return se.extractRequestInfo(JSON.parse(e))}catch{return{id:"unknown",kind:"get-document"}}}var bo="vcp:designer:trace",So="designer_trace",On="__VCP_DESIGNER_TRACE__";var Eo=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function Io(e=globalThis){let t=e;try{if(t.localStorage?.getItem(bo)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(So)==="1"}catch{return!1}}function Ce(e,t={},n=globalThis){if(!Io(n))return;let r={type:e,timestamp:Date.now(),payload:Co(t)},i=n,o=i[On]??[];o.push(r),o.length>1e3&&o.splice(0,o.length-1e3),i[On]=o;let s=n.console?.debug;r.payload.diagnosticOnly!==!0&&typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function Co(e){return $t(e,0)}function $t(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>$t(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,i]of Object.entries(e)){if(Eo.test(r)){n[r]="[redacted]";continue}n[r]=$t(i,t+1)}return n}var ct=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===Ht&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((t,n)=>{let r;try{r=this.createSocket(this.options.url)}catch(c){let a=ze(c,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",a.message),n(a);return}let i={socket:r,settled:!1,reject:n};this.connectAttempt=i,this.socket=r;let o=()=>{this.socket!==r||this.connectAttempt!==i||(i.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),t())},s=(c,a)=>{this.cleanupSocket(r,c,a)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(se.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(c){s(ze(c,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=c=>{if(this.socket!==r)return;let a=ze(c,"WebSocket failed");s(a,"failed")},r.onmessage=c=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===i&&!i.settled){this.handleAuthHandshakeMessage(c.data,r,i,()=>{o()});return}this.handleMessage(c.data)}},r.onclose=c=>{if(this.socket!==r)return;let a=this.intentionalClose,u=new Error(To(c,{intentional:a}));s(u,a?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let t=this.socket;if(!t){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(t,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(t){return this.connectionStatusListeners.add(t),t({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(t)}}getDocument(t){let n=this.selector(t);return this.request("get-document",{composition:n})}async initializeSession(t){let n=this.selector(t.composition);return await this.request("initialize-session",{composition:n,...t.mutationContext?{mutationContext:t.mutationContext}:{}})}getHistoryStatus(t){return this.request("get-history-status",{composition:this.selector(t)})}getStyleContext(t){let n=this.selector(t);return this.request("get-style-context",{composition:n})}getObjectEditContext(t,n){let r=this.selector(n);return this.request("get-object-edit-context",{key:t,composition:r})}getClassNameSource(t,n){let r=this.selector(n);return this.request("get-class-name-source",{key:t,composition:r})}getSourceTree(t){return this.request("get-source-tree",{composition:this.selector(t)})}getSourceFile(t){return this.request("get-source-file",{path:t.path,composition:this.selector(t.composition)})}resolveSourceLocation(t){return this.request("resolve-source-location",{key:t.key,composition:this.selector(t.composition)})}execute(t,n){let r=at(t),i={...t,composition:ve(r)};return this.request("execute",{request:i})}undo(t,n){return this.request("undo",{composition:this.selector(t)})}redo(t,n){return this.request("redo",{composition:this.selector(t)})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}selector(t){return ve(t)}request(t,n){let r=this.socket;if(!r||r.readyState!==Ht||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=ko(i,t,n);return Ce("bridge.request",{id:i,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:Mn(n.request,"kind"),documentVersion:Mn(n.request,"documentVersion")}),new Promise((s,c)=>{let a=this.resolveRequestTimeoutMs(t),u=a>0?setTimeout(()=>{let l=this.pending.get(i);l&&(this.pending.delete(i),Ce("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),l.reject(new Error(`Bridge request timed out after ${a}ms: ${t}`)))},a):null;u?.unref?.(),this.pending.set(i,{kind:t,timeout:u,resolve:l=>s(l),reject:c});try{r.send(se.stringifyMessage(o))}catch(l){let d=ze(l,"WebSocket send failed");this.clearPendingRequest(i),c(d),this.cleanupSocket(r,d,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(se.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=ze(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=se.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"){Ce("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1});let i=new Error(n.payload.message);n.payload.code&&(i.code=n.payload.code),r.reject(i);return}Ce("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:_o(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Kn(n.payload.result.data,n.payload.result.composition)}:r.kind==="initialize-session"?Ao(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):xo[t]??Ro}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===vo||t.readyState===Ht)&&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)}},vo=0,Ht=1,Ro=15e3,xo={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function ze(e,t){return e instanceof Error?e:new Error(t)}function To(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 Mn(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function _o(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 qn(e){let t="composition"in e?ve(e.composition):ve({routeId:e.routeId});return new Ut({composition:t,initialDocument:e.initialDocument,client:e.client})}var Ut=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=new Map,this.styleContextInFlight=new Map,this.composition=ve(t.composition);let n=t.initialDocument.composition.effectiveTemplateId;if(n!==void 0&&(this.composition.templateId===void 0||this.composition.templateId!==n))throw new Error(`Site edit bridge requires a matching templateId for initial document composition ${JSON.stringify(t.initialDocument.composition)}`);this.currentDocument=t.initialDocument,this.observedDocumentVersion=t.initialDocument.version,this.sessionInitialized=!Fn(t.initialDocument),this.activeCompositionContext=this.sessionInitialized?{...t.initialDocument.composition}:null}async getDocument(t){this.requireBoundComposition(t);let n=Fn(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){let n=this.requireBoundComposition(t.composition);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let r=await this.params.client.initializeSession({...t,composition:n});return this.currentDocument=r.data.document,this.observedDocumentVersion=r.data.document.version,this.activeCompositionContext={...r.composition},this.sessionInitialized=!0,this.clearObjectCaches(),r}async getHistoryStatus(t){return this.params.client.getHistoryStatus(this.requireBoundComposition(t))}async getStyleContext(t){let n=this.requireBoundComposition(t),r=$e(n),i=this.styleContextCache.get(r);if(i?.generation===this.styleGeneration)return{ok:!0,data:i.value};let o=this.styleContextInFlight.get(r);if(o?.generation===this.styleGeneration)return o.request;let s=this.styleGeneration,c=this.params.client.getStyleContext(n).then(a=>(this.styleGeneration===s&&this.styleContextCache.set(r,{generation:s,value:a.data}),a)).finally(()=>{this.styleContextInFlight.get(r)?.request===c&&this.styleContextInFlight.delete(r)});return this.styleContextInFlight.set(r,{generation:s,request:c}),c}async ensureDocumentVersion(t,n){this.requireBoundComposition(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(this.requireBoundComposition(t),n>this.currentDocument.version){if(this.currentDocument.pageComposition.status==="supported"){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}}this.currentDocument={...this.currentDocument,version:n},this.clearObjectCaches({preserveStyleContext:!0})}return this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n),{ok:!0,data:this.currentDocument}}async getObjectEditContext(t,n){let r=this.requireBoundComposition(n),i=this.objectCacheKey(t,r),o=this.editContextCache.get(i);if(o)return{ok:!0,data:o};let s=this.editContextInFlight.get(i);if(s)return s;let c=this.objectGeneration,a=this.params.client.getObjectEditContext(t,r).then(u=>(this.objectGeneration===c&&this.editContextCache.set(i,u.data),u)).finally(()=>{this.editContextInFlight.get(i)===a&&this.editContextInFlight.delete(i)});return this.editContextInFlight.set(i,a),a}async getClassNameSource(t,n){let r=this.requireBoundComposition(n),i=this.objectCacheKey(t,r),o=this.classNameSourceCache.get(i);if(o)return o;let s=this.classNameSourceInFlight.get(i);if(s)return s;let c=this.objectGeneration,a=this.params.client.getClassNameSource(t,r).then(u=>(this.objectGeneration===c&&this.classNameSourceCache.set(i,u),u)).finally(()=>{this.classNameSourceInFlight.get(i)===a&&this.classNameSourceInFlight.delete(i)});return this.classNameSourceInFlight.set(i,a),a}async getSourceTree(t){return this.params.client.getSourceTree(this.requireBoundComposition(t))}async getSourceFile(t){return this.params.client.getSourceFile({path:t.path,composition:this.requireBoundComposition(t.composition)})}async resolveSourceLocation(t){return this.params.client.resolveSourceLocation({key:t.key,composition:this.requireBoundComposition(t.composition)})}async execute(t,n){let r=at(t);r&&this.composition.templateId!==void 0&&this.requireBoundComposition(r);let i={...t,composition:r??this.composition};return this.params.client.execute(i)}async undo(t,n){return this.params.client.undo(this.requireBoundComposition(t))}async redo(t,n){return this.params.client.redo(this.requireBoundComposition(t))}subscribe(t){return this.params.client.subscribe(n=>{if(n.type==="site-edit.document.changed"&&this.sessionInitialized&&this.isActiveComposition(n.composition)){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 Ce("bridge.document-refresh",{composition:this.composition,routeId:this.composition.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;let r=$e(this.composition),i=this.refreshInFlight;if(i?.compositionKey===r){Ce("bridge.document-refresh",{composition:this.composition,routeId:this.composition.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let s=await i.request;if(typeof t!="number"||s.version>=t||this.currentDocument.version>=t)return this.currentDocument}Ce("bridge.document-refresh",{composition:this.composition,routeId:this.composition.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!1,source:n});let o=this.params.client.getDocument(this.composition).then(s=>(this.currentDocument=s.data,this.activeCompositionContext={...s.data.composition},this.observedDocumentVersion=Math.max(this.observedDocumentVersion,s.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight={compositionKey:r,request:o};try{return await o}finally{this.refreshInFlight?.request===o&&(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.clear(),this.styleContextInFlight.clear())}objectCacheKey(t,n){return`${$e(n)}\0${t}`}requireBoundComposition(t){let n=t===void 0?this.composition:ve(t);if($e(n)!==$e(this.composition))throw new Error(`Site edit bridge is bound to composition ${JSON.stringify(this.composition)}, received ${JSON.stringify(n)}`);return ve(n)}isActiveComposition(t){let n=this.activeCompositionContext??Po(this.composition);return Vn(t)===Vn(n)}};function Fn(e){return e.version===0&&e.entries.length===0}function Ao(e){let t=e;return{...t,data:{...t.data,document:Kn(t.data.document,t.composition)}}}function Kn(e,t){let n=e,r=Nn(n.routeId?n:{...n,routeId:t?.routeId??n.composition?.routeId});return t?{...r,composition:t}:r}function ve(e){if(e&&typeof e=="object"&&typeof e.routeId=="string"){let t="effectiveTemplateId"in e?e.effectiveTemplateId:"templateId"in e?e.templateId:void 0;return{routeId:e.routeId,...typeof t=="string"?{templateId:t}:{}}}throw new Error("SITE_EDIT_COMPOSITION_SESSION_REQUIRED: a composition selector is required")}function $e(e){return JSON.stringify([e.routeId,e.templateId??null])}function Vn(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}function Po(e){return{routeId:e.routeId,...e.templateId?{effectiveTemplateId:e.templateId}:{}}}function at(e){if(e&&typeof e=="object"){let t=e;if(t.composition&&typeof t.composition=="object"){let n=t.composition;if(typeof n.routeId=="string")return{routeId:n.routeId,...typeof n.templateId=="string"?{templateId:n.templateId}:{}}}}}function ko(e,t,n){let r=ve(t==="execute"?at(n.request):n.composition),i={id:e,kind:t,composition:r};switch(t){case"initialize-session":case"get-document":case"get-history-status":case"get-style-context":case"get-source-tree":case"undo":case"redo":return{type:"request",payload:{...i,...n.mutationContext?{mutationContext:n.mutationContext}:{}}};case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return{type:"request",payload:{...i,key:String(n.key)}};case"get-source-file":return{type:"request",payload:{...i,path:String(n.path)}};case"execute":return{type:"request",payload:{...i,request:{...n.request,composition:at(n.request)??r}}}}}function oe(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}var Wn="vcp-window-message",zn=1;function No(e){return{source:Wn,version:zn,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function Do(e){try{return I(e)?J(e,"source",Wn)&&J(e,"version",zn)&&k(e,"namespace")&&k(e,"channel")&&le(e,"body")&&(!ke(e,"sessionKey")||k(e,"sessionKey")):!1}catch{return!1}}var $n="site-edit",Hn="frame-runtime",Gt=1,He=1,Ue=1,Un=24;function Ge(e,t={}){return No({namespace:$n,channel:Hn,sessionKey:t.sessionKey,body:e})}function jn(e){try{return!Do(e)||e.namespace!==$n||e.channel!==Hn?!1:ri(e.body)}catch{return!1}}function Se(e){return I(e)&&k(e,"routeId")&&Pe(e,"templateId")&&fe(e,["routeId","templateId"])}function ut(e){return I(e)&&k(e,"routeId")&&Pe(e,"effectiveTemplateId")&&fe(e,["routeId","effectiveTemplateId"])}function fe(e,t){let n=new Set(t);return Reflect.ownKeys(e).every(r=>typeof r=="string"&&n.has(r))}var ke=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function le(e,t){let n=Object.getOwnPropertyDescriptor(e,t);return n!==void 0&&"value"in n}function p(e,t){return Object.getOwnPropertyDescriptor(e,t)?.value}function J(e,t,n){return le(e,t)&&p(e,t)===n}function k(e,t){return le(e,t)&&typeof p(e,t)=="string"}function pt(e,t){return le(e,t)&&typeof p(e,t)=="boolean"}function M(e,t){let n=p(e,t);return le(e,t)&&typeof n=="number"&&Number.isFinite(n)}function Bo(e,t){let n=p(e,t);return le(e,t)&&typeof n=="number"&&Number.isInteger(n)&&n>0}function Pe(e,t){return!ke(e,t)||p(e,t)===void 0||k(e,t)}function Oe(e,t){return!ke(e,t)||p(e,t)===void 0||M(e,t)}function lt(e,t){let n=p(e,t);return!ke(e,t)||n===void 0||le(e,t)&&typeof n=="number"&&Number.isInteger(n)&&n>=0}function Y(e,t){return!ke(e,t)||p(e,t)===void 0}function I(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function wo(e){return I(e)&&Reflect.ownKeys(e).length===0}function dt(e){if(!Array.isArray(e))return!1;for(let t=0;t<e.length;t+=1){let n=Object.getOwnPropertyDescriptor(e,String(t));if(n===void 0||!("value"in n)||typeof n.value!="string")return!1}return!0}function he(e){return I(e)&&k(e,"key")&<(e,"instanceIndex")&<(e,"instanceCount")&<(e,"textSegmentIndex")}function Oo(e){return I(e)&&k(e,"blockId")&&he(p(e,"ref"))&&je(p(e,"rect"))&&pt(e,"targetIsSectionRoot")}function Mo(e){if(!I(e))return!1;let t=p(e,"placement"),n=p(e,"boundary");return k(e,"anchorBlockId")&&he(p(e,"anchorRef"))&&(t==="before"||t==="after")&&I(n)&&M(n,"top")&&M(n,"left")&&M(n,"width")}function je(e){return I(e)&&["top","left","width","height"].every(t=>M(e,t))}function Gn(e){if(!I(e))return!1;let t=p(e,"rect"),n=p(e,"layout"),r=I(n)?p(n,"containingBlock"):null,i=p(e,"scrollContext"),o=I(r)&&(J(r,"kind","viewport")&&Reflect.ownKeys(r).length===1||J(r,"kind","document")&&Reflect.ownKeys(r).length===1||J(r,"kind","element")&&k(r,"runtimeNodeId"));return J(e,"version",Gt)&&k(e,"runtimeNodeId")&&I(t)&&je(p(t,"viewport"))&&je(p(t,"document"))&&I(n)&&k(n,"position")&&k(n,"transform")&&o&&I(i)&&["scrollX","scrollY","viewportWidth","viewportHeight"].every(s=>M(i,s))&&le(i,"scrollContainers")&&Fo(p(i,"scrollContainers"))}function Fo(e){return Array.isArray(e)&&e.every(t=>I(t)&&k(t,"runtimeNodeId")&&M(t,"scrollLeft")&&M(t,"scrollTop"))}function jt(e){return I(e)&&(Y(e,"layoutSnapshot")||Gn(p(e,"layoutSnapshot")))}function Vo(e){return I(e)&&he(p(e,"ref"))&&le(e,"layoutSnapshot")&&Gn(p(e,"layoutSnapshot"))&&(Y(e,"childBoxes")||Wo(p(e,"childBoxes")))&&(Y(e,"childRects")||Ko(p(e,"childRects")))&&(Y(e,"layout")||qo(p(e,"layout")))&&(Y(e,"spacing")||zo(p(e,"spacing")))}function qo(e){if(!I(e))return!1;let t=p(e,"indicatorOrientation");return k(e,"display")&&(t==="horizontal"||t==="vertical")&&Pe(e,"flexDirection")&&Pe(e,"gridAutoFlow")}function Ko(e){return Array.isArray(e)&&e.every(t=>je(t))}function Wo(e){return Array.isArray(e)&&e.every(t=>I(t)&&je(p(t,"rect"))&&Yn(p(t,"margin")))}function Yn(e){return I(e)&&["marginTop","marginRight","marginBottom","marginLeft"].every(t=>M(e,t))}function zo(e){return Yn(e)&&["paddingTop","paddingRight","paddingBottom","paddingLeft","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","columnGap","rowGap"].every(t=>M(e,t))}function $o(e){if(!Array.isArray(e))return!1;for(let t=0;t<e.length;t+=1){let n=Object.getOwnPropertyDescriptor(e,String(t));if(n===void 0||!("value"in n)||!Vo(n.value))return!1}return!0}function Ho(e){return I(e)&&Reflect.ownKeys(e).every(t=>typeof t=="string"&&le(e,t)&&(typeof p(e,t)=="string"||p(e,t)===null))}function Xn(e){return e==null||typeof e=="string"||typeof e=="number"&&Number.isFinite(e)}function Uo(e){return I(e)&&Reflect.ownKeys(e).every(t=>typeof t=="string"&&le(e,t)&&Xn(p(e,t)))}function jo(e){if(!I(e))return!1;let t=p(e,"priority");return k(e,"property")&&le(e,"value")&&Xn(p(e,"value"))&&(!ke(e,"priority")||t===void 0||t==="important")}function Go(e){return I(e)?(Y(e,"attributes")||Ho(p(e,"attributes")))&&Pe(e,"className")&&(Y(e,"style")||Uo(p(e,"style")))&&(Y(e,"styleDeclarations")||Array.isArray(p(e,"styleDeclarations"))&&p(e,"styleDeclarations").every(jo)):!1}function Yo(e){return I(e)&&M(e,"x")&&M(e,"y")&&(Y(e,"detailLevel")||J(e,"detailLevel","summary")||J(e,"detailLevel","full"))}function Xo(e){return I(e)&&he(p(e,"ref"))}function Lo(e){if(!I(e)||!I(p(e,"variables")))return!1;let t=p(e,"variables");return Reflect.ownKeys(t).every(n=>typeof n=="string"&&k(t,n))?Y(e,"stylesheets")||dt(p(e,"stylesheets")):!1}function Jo(e){if(!J(e,"type","request")||!k(e,"id")||!k(e,"kind")||!le(e,"payload"))return!1;let t=p(e,"kind"),n=p(e,"payload");switch(t){case"hit-test-at-point":case"start-text-edit-at-point":return Yo(n);case"bridge-get-source-tree":return I(n)&&Se(p(n,"composition"))&&fe(n,["composition"]);case"get-scroll-metrics":case"clear-theme-override":return wo(n);case"bridge-get-history-status":case"bridge-undo":case"bridge-redo":return I(n)&&Se(p(n,"composition"))&&fe(n,["composition"]);case"bridge-get-source-file":return I(n)&&k(n,"path")&&Se(p(n,"composition"))&&fe(n,["path","composition"]);case"bridge-resolve-source-location":case"bridge-get-object-edit-context":case"bridge-get-class-name-source":return I(n)&&k(n,"key")&&Se(p(n,"composition"))&&fe(n,["key","composition"]);case"scroll-to":return I(n)&&M(n,"x")&&M(n,"y");case"scroll-by":return I(n)&&M(n,"deltaX")&&M(n,"deltaY");case"set-interaction-mode":return I(n)&&pt(n,"enabled");case"set-selection-visual":return I(n)&&J(n,"version",He)&&he(p(n,"ref"))&&J(n,"visible",!0);case"clear-selection-visual":return I(n)&&J(n,"version",He);case"set-resize-visual":return I(n)&&J(n,"version",Ue)&&he(p(n,"ref"))&&J(n,"visible",!0);case"clear-resize-visual":return I(n)&&J(n,"version",Ue);case"set-theme-override":return Lo(n);case"get-theme-variables":return I(n)&&dt(p(n,"names"));case"compute-drop-target-at-point":return I(n)&&M(n,"x")&&M(n,"y")&&(J(n,"dragKind","insert")||J(n,"dragKind","move"))&&(Y(n,"movingRef")||he(p(n,"movingRef")));case"observe-node-bounds":case"clear-node-bounds-observer":return I(n)&&(Y(n,"ref")||he(p(n,"ref")));case"apply-node-patch":return I(n)&&he(p(n,"ref"))&&Go(p(n,"patch"))&&(Y(n,"preview")||I(p(n,"preview"))&&k(p(n,"preview"),"sessionId")&<(p(n,"preview"),"revision")&&ke(p(n,"preview"),"revision"));case"get-hit-by-ref":case"get-path-by-ref":case"restore-text-edit":case"clear-text-edit-rollback":return Xo(n);case"bridge-initialize-session":case"bridge-get-style-context":return I(n)&&Se(p(n,"composition"))&&fe(n,["composition"]);case"bridge-get-document":case"bridge-ensure-document-version":case"bridge-acknowledge-document-version":return I(n)&&Se(p(n,"composition"))&&Oe(n,"minVersion")&&Oe(n,"version")&&fe(n,["composition","minVersion","version"]);case"bridge-execute":{if(!I(n))return!1;let r=p(n,"request"),i=p(n,"composition"),o=I(r)?p(r,"composition"):null;return!Se(i)||!I(r)||!Se(o)?!1:oe({routeId:i.routeId,...i.templateId?{effectiveTemplateId:i.templateId}:{}})===oe({routeId:o.routeId,...o.templateId?{effectiveTemplateId:o.templateId}:{}})&&fe(n,["composition","request"])}case"bridge-subscribe":case"bridge-unsubscribe":return I(n)&&k(n,"subscriptionId")&&Se(p(n,"composition"))&&fe(n,["subscriptionId","composition"]);default:return!1}}function Qo(e){return J(e,"type","response")&&k(e,"id")&&pt(e,"ok")&&(Y(e,"error")||k(e,"error"))}function Zo(e){if(!I(e))return!1;let t=p(e,"type");if(typeof t!="string"||!ut(p(e,"composition"))||!k(e,"siteId")||!k(e,"at"))return!1;switch(t){case"site-edit.document.changed":return k(e,"snapshotId")&&M(e,"version");case"site-edit.operation.planned":return k(e,"operationId")&&k(e,"baseSnapshotId")&&dt(p(e,"changedFiles"));case"site-edit.operation.completed":return I(p(e,"result"));case"site-edit.operation.failed":return k(e,"requestId")&&I(p(e,"error"));case"site-edit.capability.changed":return dt(p(e,"keys"));case"site-edit.graph.invalidated":return!0;case"site-edit.graph.ready":return M(e,"version");case"site-edit.graph.error":return k(e,"message");default:return!1}}var ei=new Set(["pointer-down","pointer-move","pointer-leave","pointer-up","pointer-cancel","pointer-click","pointer-double-click"]),Ln=new Set(["e","s","se"]);function ti(e,t){if(Y(e,"resizeSession"))return!0;let n=p(e,"resizeSession");if(!I(n))return!1;let r=p(e,"pointerId"),i=p(n,"pointerId"),o=p(n,"phase"),s=p(n,"edge"),c=t==="pointer-down"?"start":t==="pointer-up"?"commit":t==="pointer-cancel"?"cancel":null;return p(n,"version")===1&&o===c&&k(n,"sessionId")&&String(p(n,"sessionId")).length>0&&typeof r=="number"&&Number.isInteger(r)&&typeof i=="number"&&Number.isInteger(i)&&r===i&&typeof s=="string"&&Ln.has(s)&&p(e,"resizeEdge")===s&&he(p(n,"ref"))&&["startWidth","startHeight","width","height"].every(a=>M(n,a))}function ni(e){if(!J(e,"type","event")||!k(e,"kind")||!I(p(e,"payload")))return!1;let t=p(e,"kind"),n=p(e,"payload");switch(t){case"text-edit-commit":case"text-edit-cancel":case"text-edit-exit":case"text-edit-input":return he(p(n,"ref"))&&Pe(n,"value")&&(Y(n,"hit")||jt(p(n,"hit")));case"node-bounds-change":return jt(p(n,"hit"));case"geometry-batch":{let r=p(n,"reason");return Bo(n,"sequence")&&M(n,"sourceEventAt")&&M(n,"captureStartedAt")&&M(n,"capturedAt")&&(r==="scroll"||r==="resize"||r==="mutation")&&$o(p(n,"snapshots"))}case"bridge-event":{let r=p(n,"event"),i=p(n,"composition");return!Zo(r)||!ut(i)?!1:k(n,"subscriptionId")&&oe(i)===oe(r.composition)}case"route-ready":return ut(p(n,"composition"))&&k(n,"editEngineVersion")&&M(n,"sequence")&&M(n,"version");case"bridge-status":{let r=p(n,"state");return(r==="connecting"||r==="ready"||r==="reconnecting"||r==="failed"||r==="reload-required")&&ut(p(n,"composition"))&&M(n,"sequence")&&Oe(n,"attempt")&&Oe(n,"retryInMs")&&Pe(n,"messageKey")}case"scroll":{let r=p(n,"metrics");return I(r)&&["scrollX","scrollY","scrollWidth","scrollHeight","viewportWidth","viewportHeight"].every(i=>M(r,i))}default:return ei.has(t)&&M(n,"clientX")&&M(n,"clientY")&&Oe(n,"buttons")&&Oe(n,"pointerId")&&(Y(n,"hoverVisualOwned")||pt(n,"hoverVisualOwned"))&&(Y(n,"resizeEdge")||k(n,"resizeEdge")&&Ln.has(p(n,"resizeEdge")))&&ti(n,t)&&(p(n,"hit")===null||jt(p(n,"hit")))&&(Y(n,"section")||p(n,"section")===null||Oo(p(n,"section")))&&(Y(n,"sectionGap")||p(n,"sectionGap")===null||Mo(p(n,"sectionGap")))}}function ri(e){if(!I(e))return!1;switch(p(e,"type")){case"request":return Jo(e);case"response":return Qo(e);case"event":return ni(e);default:return!1}}var Zt="vcp-site-edit:route-ready",en="vcp-site-edit:bridge-status",Tt="data-vcp-page-template-context",rn="1",on="data-vcp-route-id",sn="data-vcp-effective-template-id",fr=`[${Tt}="${rn}"]`,Xe="SITE_EDIT_COMPOSITION_MARKER_INVALID",mr="SITE_EDIT_COMPOSITION_RENDER_MISMATCH",oi=80,ii=120,si=1e3,ci="data-vcp-ui-component",gr="data-vcp-theme-preview",Jn="::repeat-item#",ht="components/ui",Yt="data-site-block-id",Xt="data-vcp-runtime-site-block-id",ai=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),ui=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function li(e,t){let n=Array.from(e.querySelectorAll("[data-vcp-edit-key]"));for(let c of n)c.getAttribute(Xt)==="true"&&(c.removeAttribute(Yt),c.removeAttribute(Xt));if(!t)return;let r=n.filter(c=>c.tagName.toLowerCase()==="section"),i=r.length>0?r:n.filter(c=>c.tagName.toLowerCase()==="main"),o=new Set(i),s=new Map;for(let c of i){let a=c.parentElement,u=!1;for(;a;){if(o.has(a)){u=!0;break}a=a.parentElement}if(u||c.getAttribute(Yt)?.trim())continue;let l=c.getAttribute("data-vcp-edit-key")?.trim();if(!l)continue;let d=s.get(l)??0;s.set(l,d+1);let h=`vcp-runtime:${encodeURIComponent(l)}:${d}`;c.setAttribute(Yt,h),c.setAttribute(Xt,"true")}}function bt(e,t=""){let n=Er(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function di(e){let t=Array.from(e.querySelectorAll(fr)).filter(s=>s.getAttribute(Tt)===rn);if(t.length===0)return null;if(t.length!==1)throw new Error(`${Xe}: expected exactly one marker`);let n=t[0],r=n.getAttribute(on),i=n.getAttribute(sn);if(!r?.trim()||!i?.trim())throw new Error(`${Xe}: marker fields are required`);let o=hi(r);if(!o)throw new Error(`${Xe}: marker route is invalid`);return{routeId:o,effectiveTemplateId:i}}function pi(e){let t=bt(e.pathname,e.basePath??""),n=di(e.document);if(!n)return{routeId:t};if(n.routeId!==t)throw new Error(`${Xe}: marker route ${n.routeId} does not match pathname ${t}`);return n}function hi(e){return!e.startsWith("/")||e.includes("?")||e.includes("#")?null:bt(e)}function Qn(e,t){return oe(e)===oe(t)}function Lt(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function fi(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 mi(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 Pa(e=window,t={}){let n=mi(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=gi({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(yi(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,unbindCompositionMarker:void 0},s,c=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===s,a=t.create_client??(f=>new ct({url:f,authKey:t.bridge_session_key})),u=t.schedule_after_navigation??zi,l=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},d=()=>pi({pathname:e.location.pathname,document:e.document,basePath:t.basePath}),h=()=>oe(d()),E=()=>bt(e.location.pathname,t.basePath||""),N=!!e.parent&&e.parent!==e,C=f=>{$i(e,{...f,sequence:f.sequence??o.routeSequence})},_=f=>{o.currentDocument=f,o.currentEntriesByKey=new Map((f?.entries??[]).map(v=>[v.key,v])),li(e.document,!!f)},B=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},D=(f,v)=>{if(o.disposed||v!==o.routeSequence)return!1;try{return f===h()}catch{return!1}},Z=async(f,v,O)=>{let F=o.activeBridge;if(!F)return null;let V=await F.getDocument(f);return D(v,O)&&_(V.data),V.data},g=()=>{B(),_(null);let f=o.activeBridge;o.activeBridge=null,f&&e.__VCP_SITE_EDIT__===f&&delete e.__VCP_SITE_EDIT__;let v=o.activeClient;o.activeClient=null,v?.disconnect()},te=f=>f===s.compositionKey&&!!o.activeBridge&&(N||!!(o.currentDocument&&Ui(o.currentDocument,f)))&&Hi(o.activeClient),L=f=>Math.min(si*2**Math.max(0,f),8e3),W=(f,v,O,F)=>{if(o.disposed)return;l();let V=L(F);C({state:"reconnecting",composition:f,attempt:F,retryInMs:V,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||O!==o.routeSequence||!D(v,O))&&x(F+1).catch(ce=>{let y;try{y=h()}catch{return}if(v===y){if(Me(ce)){C({state:"reload-required",composition:f,attempt:F,messageKey:"studio.errors.previewBridgeReloadRequired"});return}W(f,v,o.routeSequence,F+1)}})},V)},ee=(f,v,O,F)=>{if(!D(v,O)||o.activeClient===null)return;if(Me(F.message)){g(),l(),C({state:"reload-required",composition:f,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let V=o.activeClient;B(),_(null);let ce=o.activeBridge;o.activeBridge=null,ce&&e.__VCP_SITE_EDIT__===ce&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,V?.disconnect(),W(f,v,O,0)},$=f=>{let v;try{v=d()}catch{return}let O=oe(v),F=o.routeSequence;if(!(!D(O,F)||o.activeClient===null)){if(Me(f)){g(),l(),C({state:"reload-required",composition:v,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Sr(f)&&ee(v,O,F,{state:"failed",message:Ze(f,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=Ci(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:f=>o.currentEntriesByKey.get(f)??null,setCurrentDocument:_,onBridgeRequestError:f=>{$(f)}});let H=async()=>x(0),x=async f=>{if(o.disposed)return;let v=d(),O=oe(v);if(te(O))return;let F=o.syncInFlight;if(F?.compositionKey===O)return F.promise;let V=o.routeSequence+1,ce=A(v,O,V,f);o.syncInFlight={compositionKey:O,sequence:V,promise:ce};try{await ce}finally{o.syncInFlight?.promise===ce&&(o.syncInFlight=null)}},A=async(f,v,O,F)=>{o.routeSequence=O,l(),g(),C({state:F>0?"reconnecting":"connecting",composition:f,attempt:F,messageKey:F>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let V=a(n),ce=!1;o.activeClient=V,o.unsubscribeConnectionStatus=V.subscribeConnectionStatus?.(y=>{ce&&(y.state==="closed"||y.state==="failed")&&ee(f,v,O,y)});try{if(await V.connect(),!D(v,O)){V.disconnect();return}let y=qn({composition:Lt(f),client:V,initialDocument:Ii(f)});o.activeBridge=y,c()&&(e.__VCP_SITE_EDIT__=y),o.activeClient=V,o.unsubscribeDocument=y.subscribe(q=>{oe(q.composition)===v&&(q.type==="site-edit.document.changed"&&o.currentDocument&&q.version>o.currentDocument.version?Z(Lt(f),v,O).catch(()=>{}):q.type==="site-edit.graph.invalidated"&&z())}),c()&&(s.routeId=f.routeId,s.composition=f,s.compositionKey=v);let S=N?null:await y.initializeSession({composition:Lt(f)}),m=S?.data.document??null;if(S&&(!Qn(S.composition,f)||!Qn(S.data.document.composition,f)))throw new Error(`${mr}: initialize response does not match marker`);if(m&&_(m),!D(v,O)){V.disconnect();return}ce=!0,C({state:"ready",composition:f,attempt:F,messageKey:"studio.status.previewReady"}),fi(e,{documentVersion:m?.version??0,routeId:f.routeId,versions:t.runtime_versions}),m&&br(e,{composition:f,editEngineVersion:t.runtime_versions?.engine??"unknown",sequence:O,version:m.version})}catch(y){if(B(),o.activeClient===V&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,V.disconnect(),_(null),!D(v,O))return;throw C({state:Me(y)?"reload-required":"failed",composition:f,attempt:F,messageKey:Me(y)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),y}},T=f=>{if(o.disposed)return;let v;try{v=d()}catch{C({state:"failed",composition:{routeId:bt(e.location.pathname,t.basePath||"")},attempt:0,messageKey:"studio.errors.previewBridgeDisconnected"});return}let O=oe(v);if(Me(f)){l(),C({state:"reload-required",composition:v,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}if(Gi(f)||ji(f)){C({state:"failed",composition:v,attempt:0,messageKey:"studio.errors.previewBridgeDisconnected"});return}W(v,O,o.routeSequence,0)},z=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,u(()=>{o.syncScheduled=!1,!o.disposed&&H().catch(f=>T(f))}))},U=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,l(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindCompositionMarker?.(),o.unbindCompositionMarker=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),g(),c()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:H,cleanup:U},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=Si(e,U),o.unbindRouteChange=Ki(e,z,E),o.unbindCompositionMarker=Wi(e,z),t.defer_initial_sync){z();return}await H()}function gi(e){return{basePath:Er(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:bi(e.options.bridge_session_key)}}function yi(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function bi(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 Si(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),Ei(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function Ei(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function Ii(e){return{siteId:"preview",snapshotId:"preview",composition:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function Ci(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,c=null,a=0,u=null,l=null,d=null,h=null,E=null,N=0,C=new Map,_=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,B=()=>{n?.(),n=null,r=null},D=()=>{i?.(),i=null,o?.(),o=null,s?.(),s=null,c?.cleanup(),c=null},Z=(y,S,m)=>{let q=u?.sessionKey!==y||u?.sourceWindow!==S||u?.targetOrigin!==m;u={sessionKey:y,sourceWindow:S,targetOrigin:m},q&&(a=0,h=null,E=null)},g=(y,S)=>{let m=e.parent&&e.parent!==e?e.parent:null;return!m||S!==m?!1:!_||y===_},te=()=>{for(let y of C.values())y();C.clear()},L=y=>JSON.stringify([oe(y.composition),y.editEngineVersion,y.sequence,y.version]),W=()=>!d||d.state==="ready",ee=y=>JSON.stringify([y.state,oe(y.composition),y.sequence,y.attempt??null,y.retryInMs??null,y.messageKey??null]),$=y=>{if(!W())return;let S=L(y);h!==S&&(o?.(),o=null,s?.(),s=null,c?.cleanup(),c=null,U({kind:"route-ready",payload:{composition:y.composition,editEngineVersion:y.editEngineVersion,sequence:y.sequence,version:y.version}}),u&&(h=S))},H=y=>{let S=ee(y);E!==S&&(y.state!=="ready"&&(h=null,l=null),U({kind:"bridge-status",payload:y}),u&&(E=S))},x=y=>{l=y,$(y)},A=y=>{d=y,H(y)},T=()=>{l&&$(l)},z=()=>{d&&H(d)},U=y=>{u&&u.sourceWindow.postMessage(Ge({type:"event",...y},{sessionKey:u.sessionKey}),u.targetOrigin)},f=(y,S,m,q)=>{let j=t.getCurrentDocument?.()??null,ie=ns(e.document,S.clientX,S.clientY),R=S.resizeSession?null:Qe(e.document,S.clientX,S.clientY,j),Q=R?me(R,m==="full"?ge(e.document,R,j):vt(e.document,R,j),t.getDocumentEntry,m):null,ae=rs(e.document,ie,j),de=is(e.document,S,j);q&&Q&&(y==="pointer-click"||y==="pointer-double-click")&&(q.preventDefault(),q.stopPropagation(),typeof q.stopImmediatePropagation=="function"&&q.stopImmediatePropagation()),U({kind:y,payload:{clientX:S.clientX,clientY:S.clientY,buttons:Number(S.buttons??0),pointerId:S.pointerId,hoverVisualOwned:S.hoverVisualOwned,resizeEdge:S.resizeEdge,resizeSession:S.resizeSession,hit:Q,section:ae,sectionGap:de}})},v=y=>{U({kind:"pointer-leave",payload:{clientX:y?.clientX??0,clientY:y?.clientY??0,buttons:Number(y?.buttons??0),hit:null,section:null,sectionGap:null}})},O=(y,S,m)=>{D(),u={sessionKey:y,sourceWindow:S,targetOrigin:m};let q=Hs(e.document),j=vi(e,t.getCurrentDocument),ie=null,R=null,Q=null,ae=null,de=null,pe=()=>{de!==null&&(e.clearTimeout(de),de=null)},xe=()=>{Q!==null&&(It(e,Q),Q=null),ie=null},ot=()=>{Q=null;let b=ie;ie=null,b&&f("pointer-move",b,"summary")},Ke=b=>{pe(),R=b,ie=b,Q===null&&(Q=Et(e,ot))},ne=()=>{R&&Ke({...R,hoverVisualOwned:j?.updateAtPoint(R.clientX,R.clientY)??!1})},Te=e.document.documentElement,P=typeof Te.addEventListener=="function"?Te:e.document,w=b=>{if(c?.update(b)){b.preventDefault();return}Ke({clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),hoverVisualOwned:j?.update(b.target)??!1})},re=b=>{let K=wi(b.target),An=K?c?.begin(b,K):null;An&&(b.target?.setPointerCapture?.(b.pointerId),b.preventDefault(),b.stopPropagation()),f("pointer-down",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:Number(b.pointerId),resizeEdge:K,resizeSession:An??void 0},"full",b)},be=b=>{let K=c?.finish(b,"commit")??null;if(K){f("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:Number(b.pointerId),resizeEdge:K.edge,resizeSession:K},"summary",b);return}f("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},Be=b=>{let K=c?.finish(b,"cancel")??null;f("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:K?.pointerId,resizeEdge:K?.edge,resizeSession:K??void 0},"summary",b)},Sn=b=>{let K=c?.finish(b,"cancel")??null;K&&f("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:K.pointerId,resizeEdge:K.edge,resizeSession:K},"summary",b)},En=b=>{f("pointer-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},In=b=>{f("pointer-double-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},wt=b=>{if(b&&b.target!==P&&b.target!==Te)return;let K=b?{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)}:R;if(b&&K&&K.clientX>0&&K.clientX<e.innerWidth&&K.clientY>0&&K.clientY<e.innerHeight){ne();return}if(xe(),b){pe(),de=e.setTimeout(()=>{de=null,R=null,v(K??void 0)},ii);return}pe(),R=null,j?.clear(),v(K??void 0)},Cn=()=>wt(),oo=()=>{ae=null,U({kind:"scroll",payload:{metrics:yt(e)}}),ne()},vn=()=>{ae===null&&(ae=Et(e,oo))};e.document.addEventListener("pointerdown",re,!0),e.document.addEventListener("pointermove",w,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",be,!0),e.document.addEventListener("pointercancel",Be,!0),e.document.addEventListener("lostpointercapture",Sn,!0),e.document.addEventListener("click",En,!0),e.document.addEventListener("dblclick",In,!0),e.addEventListener("scroll",vn,{passive:!0}),e.addEventListener("resize",ne,{passive:!0}),e.addEventListener("blur",Cn),e.document.addEventListener("load",ne,!0),P.addEventListener("pointerleave",wt,!0);let it=e.visualViewport;it?.addEventListener?.("resize",ne,{passive:!0}),it?.addEventListener?.("scroll",ne,{passive:!0});let Rn=e.ResizeObserver,xn=typeof Rn=="function"?new Rn(ne):null;xn?.observe(Te);let Tn=e.MutationObserver,_n=typeof Tn=="function"?new Tn(ne):null;_n?.observe(Te,{attributes:!0,childList:!0,subtree:!0}),i=()=>{xe(),pe(),R=null,j?.cleanup(),xn?.disconnect(),_n?.disconnect(),ae!==null&&(It(e,ae),ae=null),q(),e.document.removeEventListener("pointerdown",re,!0),e.document.removeEventListener("pointermove",w,!0),e.document.removeEventListener("pointerup",be,!0),e.document.removeEventListener("pointercancel",Be,!0),e.document.removeEventListener("lostpointercapture",Sn,!0),e.document.removeEventListener("click",En,!0),e.document.removeEventListener("dblclick",In,!0),e.removeEventListener("scroll",vn),e.removeEventListener("resize",ne),e.removeEventListener("blur",Cn),e.document.removeEventListener("load",ne,!0),P.removeEventListener("pointerleave",wt,!0),it?.removeEventListener?.("resize",ne),it?.removeEventListener?.("scroll",ne)}},F=y=>{let S=y.detail;S?.composition?.routeId&&x(S)},V=y=>{let S=y.detail;S?.state&&A(S)},ce=y=>{let S=y.data;if(!jn(S)||S.body.type!=="request"||S.body.kind!=="apply-node-patch"&&S.body.kind!=="get-hit-by-ref"&&S.body.kind!=="get-path-by-ref"&&S.body.kind!=="get-scroll-metrics"&&S.body.kind!=="scroll-to"&&S.body.kind!=="scroll-by"&&S.body.kind!=="set-interaction-mode"&&S.body.kind!=="set-selection-visual"&&S.body.kind!=="clear-selection-visual"&&S.body.kind!=="set-resize-visual"&&S.body.kind!=="clear-resize-visual"&&S.body.kind!=="set-theme-override"&&S.body.kind!=="clear-theme-override"&&S.body.kind!=="get-theme-variables"&&S.body.kind!=="compute-drop-target-at-point"&&S.body.kind!=="observe-node-bounds"&&S.body.kind!=="clear-node-bounds-observer"&&S.body.kind!=="restore-text-edit"&&S.body.kind!=="clear-text-edit-rollback"&&S.body.kind!=="start-text-edit-at-point"&&S.body.kind!=="hit-test-at-point"&&!rr(S.body))return;let m=S.body,q=typeof S.sessionKey=="string"?S.sessionKey:null,j=y.source,ie=y.origin;if(!q||!ie||!j||typeof j.postMessage!="function"||!g(q,j))return;if(u){if(u.sourceWindow!==j||u.targetOrigin!==ie)return;u.sessionKey!==q&&(B(),D(),te(),u=null)}Z(q,j,ie),z(),T();let R=Q=>{let ae=typeof m.id=="string"?m.id:"unknown";j.postMessage(Ge({id:ae,...Q},{sessionKey:q}),ie)};try{if(rr(m)){Fi({message:m,sendEvent:P=>{j.postMessage(Ge({type:"event",...P},{sessionKey:q}),ie)},sendResponse:R,subscriptions:C,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,nextRouteReadySequence:()=>N+=1,windowLike:e});return}if(m.kind==="apply-node-patch"){let P=ye(e.document,m.payload.ref,t.getCurrentDocument?.()??null);if(!P){R({type:"response",ok:!1,error:"No editable element found for patch target"});return}let w=m.payload.preview,re=w?ks(w.sessionId,m.payload.ref):null;if(re&&w){let be=Ye.get(re)??-1;if(w.revision<be){R({type:"response",ok:!0,result:{applied:!1,appliedRevision:w.revision,stale:!0,latestRevision:be}});return}if(w.revision===be){R({type:"response",ok:!0,result:{applied:!1,appliedRevision:w.revision,duplicate:!0,latestRevision:be}});return}}if(As(P,m.payload.patch),re&&w&&Ns(re,w.revision),w?.responseDetail==="none"){R({type:"response",ok:!0,result:{applied:!0,appliedRevision:w.revision}});return}R({type:"response",ok:!0,result:me(P,ge(e.document,P,t.getCurrentDocument?.()??null),t.getDocumentEntry,w?.responseDetail??"full")});return}if(m.kind==="get-hit-by-ref"){let P=ye(e.document,m.payload.ref,t.getCurrentDocument?.()??null);if(!P){R({type:"response",ok:!1,error:"No editable element found for hit target"});return}R({type:"response",ok:!0,result:me(P,ge(e.document,P,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(m.kind==="get-path-by-ref"){let P=ye(e.document,m.payload.ref,t.getCurrentDocument?.()??null);if(!P){R({type:"response",ok:!1,error:"No editable element found for path target"});return}let w=[],re=P;for(;re;)re.getAttribute("data-vcp-edit-key")&&w.push(me(re,ge(e.document,re,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),re=re.parentElement;R({type:"response",ok:!0,result:w.reverse()});return}if(m.kind==="restore-text-edit"||m.kind==="clear-text-edit-rollback"){let P=m.payload.ref;if(m.kind==="clear-text-edit-rollback"){r&&ir(r.ref,P)&&(r=null),R({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!ir(r.ref,P)){R({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let w=Li(e.document,r,t.getCurrentDocument?.()??null);r=null,R(w?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(m.kind==="get-scroll-metrics"){R({type:"response",ok:!0,result:yt(e)});return}if(m.kind==="scroll-to"){let P=Number(m.payload.x),w=Number(m.payload.y);if(!Number.isFinite(P)||!Number.isFinite(w)){R({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:P,top:w}),R({type:"response",ok:!0,result:yt(e)});return}if(m.kind==="scroll-by"){let P=Number(m.payload.deltaX),w=Number(m.payload.deltaY);if(!Number.isFinite(P)||!Number.isFinite(w)){R({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:P,top:w}),R({type:"response",ok:!0,result:{...yt(e),scrolled:!0}});return}if(m.kind==="set-interaction-mode"){m.payload.enabled?O(q,j,ie):u?.sourceWindow===j&&u.targetOrigin===ie&&u.sessionKey===q&&D(),R({type:"response",ok:!0,result:{interactionEnabled:m.payload.enabled}});return}if(m.kind==="set-selection-visual"){s?.(),s=null,i&&(s=xi(e,m.payload.ref,t.getCurrentDocument)),R({type:"response",ok:!0,result:{version:He,active:!!s}});return}if(m.kind==="clear-selection-visual"){s?.(),s=null,R({type:"response",ok:!0,result:{version:He,active:!1}});return}if(m.kind==="set-resize-visual"){c?.cleanup(),c=null,i&&(c=Oi(e,m.payload.ref,t.getCurrentDocument)),R({type:"response",ok:!0,result:{version:Ue,active:!!c}});return}if(m.kind==="clear-resize-visual"){c?.cleanup(),c=null,R({type:"response",ok:!0,result:{version:Ue,active:!1}});return}if(m.kind==="set-theme-override"){Ds(e.document,m.payload),R({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(m.kind==="clear-theme-override"){Bs(e.document),R({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(m.kind==="get-theme-variables"){R({type:"response",ok:!0,result:ws(e.document,m.payload.names)});return}if(m.kind==="compute-drop-target-at-point"){let P=Number(m.payload?.x),w=Number(m.payload?.y);if(!Number.isFinite(P)||!Number.isFinite(w)){R({type:"response",ok:!1,error:"Invalid drop target point"});return}R({type:"response",ok:!0,result:Cs(e,P,w,m.payload.dragKind,m.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(m.kind==="observe-node-bounds"){let P=m.payload.ref;if(!P){R({type:"response",ok:!1,error:"Missing bounds observer target"});return}let w=ye(e.document,P,t.getCurrentDocument?.()??null);if(!w){R({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=gs(e,w,P,t.getCurrentDocument,(re,be,Be)=>{a+=1,U({kind:"geometry-batch",payload:{sequence:a,sourceEventAt:Be.sourceEventAt,captureStartedAt:Be.captureStartedAt,capturedAt:Be.capturedAt,reason:re,snapshots:[be]}})}),R({type:"response",ok:!0,result:{observing:!0}}),U({kind:"node-bounds-change",payload:{hit:me(w,P,t.getDocumentEntry,"summary",e)}});return}if(m.kind==="clear-node-bounds-observer"){o?.(),o=null,R({type:"response",ok:!0,result:{cleared:!0}});return}if(m.kind!=="hit-test-at-point"&&m.kind!=="start-text-edit-at-point")return;let Q=Number(m.payload?.x),ae=Number(m.payload?.y);if(!Number.isFinite(Q)||!Number.isFinite(ae)){R({type:"response",ok:!1,error:"Invalid text edit point"});return}let de=m.kind==="hit-test-at-point"?Qe(e.document,Q,ae,t.getCurrentDocument?.()??null):Qi(e.document,Q,ae,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!de){R({type:"response",ok:!1,error:m.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let pe=m.kind==="start-text-edit-at-point"?de:null,xe=m.kind==="hit-test-at-point"?de:pe.element,ot=m.payload.detailLevel??"full",Ke=ot==="full"?ge(e.document,xe,t.getCurrentDocument?.()??null):vt(e.document,xe,t.getCurrentDocument?.()??null),ne=pe&&typeof pe.textSegmentIndex=="number"?{...Ke,textSegmentIndex:pe.textSegmentIndex}:Ke,Te=me(xe,ne,t.getDocumentEntry,ot);if(m.kind==="hit-test-at-point"){R({type:"response",ok:!0,result:Te});return}B(),n=Vs(e,xe,ne,P=>{j.postMessage(Ge({type:"event",...P},{sessionKey:q}),ie)},{...pe?.textNode?{textNode:pe.textNode}:{},onCommitSnapshot:P=>{r=P}}),R({type:"response",ok:!0,result:{ref:ne}})}catch(Q){R({type:"response",ok:!1,error:Q instanceof Error?Q.message:"Failed to start text edit"})}};return e.addEventListener("message",ce),e.addEventListener(Zt,F),e.addEventListener(en,V),()=>{B(),D(),u=null,te(),e.removeEventListener("message",ce),e.removeEventListener(Zt,F),e.removeEventListener(en,V)}}function vi(e,t){let n=e.document,r=n.head??n.documentElement;if(typeof r?.appendChild!="function")return null;let i="data-vcp-designer-hover-visual",o="data-vcp-designer-selection-visual",s=n.createElement("style");s.setAttribute("data-vcp-designer-hover-visual-style","true"),s.textContent=`
|
|
1
|
+
function Bn(e){let t=new Map,n=[],r=new Map,i=[],o=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],s=new Map(o.map((d,f)=>[d,f])),c=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(d=>({placementKey:d.placementKey,placementUnitKey:d.placementUnitKey,relation:d.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},a=e.entries.flatMap((d,f)=>d.dynamicDataSummary?[[f,d.dynamicDataSummary]]:[]),u=d=>{let f=t.get(d);if(typeof f=="number")return f;let E=n.length;return n.push(d),t.set(d,E),E},l=d=>{let f=null;for(let E of lo(d)){let A=`${f??"root"}\0${E}`,I=r.get(A);if(typeof I=="number"){f=I;continue}let _=i.length;i.push([f,u(E)]),r.set(A,_),f=_}if(f===null)throw new Error("Document key must not be empty");return f};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,composition:{...e.composition},routeId:e.composition.routeId,version:e.version,pageComposition:c,tokens:n,nodes:i,entries:e.entries.map(d=>{let f=d.pageCompositionUnitKey?s.get(d.pageCompositionUnitKey)??-1:-1;if(d.pageCompositionUnitKey&&f<0)throw new Error(`Render entry ${d.key} references unknown page composition unit ${d.pageCompositionUnitKey}`);return[l(d.key),so(d.operationSummary),...f>=0?[f]:[]]}),...a.length>0?{dynamicDataSummaries:a}:{}}}function wn(e){if(!ao(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=new Map(e.dynamicDataSummaries??[]),i=o=>{let s=t.get(o);if(s)return s;let c=e.nodes[o];if(!c)throw new Error(`Missing compact document node ${o}`);let[a,u]=c,l=e.tokens[u];if(typeof l!="string")throw new Error(`Missing compact document token ${u}`);let d=`${a===null?"":i(a)}${l}`;return t.set(o,d),d};return{siteId:e.siteId,snapshotId:e.snapshotId,composition:{...e.composition},routeId:e.composition.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map((o,s)=>{let[c,a,u]=o,l=u===void 0?void 0:n[u];if(u!==void 0&&!l)throw new Error(`Missing page composition unit ${u}`);return{key:i(c),...l?{pageCompositionUnitKey:l}:{},operationSummary:co(a),...r.get(s)?{dynamicDataSummary:r.get(s)}:{}}})}}function so(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function co(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function ao(e){if(typeof e!="object"||e===null)return!1;let t=e;if(t.encoding!=="segment-trie-v1"||typeof t.siteId!="string"||typeof t.snapshotId!="string"||!uo(t.composition)||typeof t.routeId!="string"||t.routeId!==t.composition.routeId||!Number.isInteger(t.version)||t.version<0||!Mt(t.pageComposition)||!Array.isArray(t.tokens)||!t.tokens.every(i=>typeof i=="string")||!Array.isArray(t.nodes)||!Array.isArray(t.entries))return!1;let n=t.nodes;if(!n.every((i,o)=>Array.isArray(i)&&i.length===2&&(i[0]===null||we(i[0])&&i[0]<o)&&we(i[1])&&i[1]<t.tokens.length)||!t.entries.every(i=>Array.isArray(i)&&(i.length===2||i.length===3)&&we(i[0])&&i[0]<n.length&&we(i[1])&&i[1]<=15&&(i.length===2||we(i[2]))))return!1;let r=t.dynamicDataSummaries;return r===void 0||Array.isArray(r)&&r.every(i=>Array.isArray(i)&&i.length===2&&we(i[0])&&i[0]<t.entries.length&&Mt(i[1]))}function Mt(e){return typeof e=="object"&&e!==null&&!Array.isArray(e)}function uo(e){return!Mt(e)||typeof e.routeId!="string"?!1:e.effectiveTemplateId===void 0||typeof e.effectiveTemplateId=="string"}function we(e){return typeof e=="number"&&Number.isInteger(e)&&e>=0}function lo(e){if(!e)return[];let t=[],n=0,r=Dn(e,n);if(r<0)return t.push(e),t;for(t.push(e.slice(0,r)),n=r;n<e.length;){if(r=Dn(e,n+(e.startsWith("::",n)?2:1)),r<0){t.push(e.slice(n));break}t.push(e.slice(n,r)),n=r}return t}function Dn(e,t){let n=e.indexOf("/",t),r=e.indexOf("::",t);return n<0?r:r<0?n:Math.min(n,r)}var On="SITE_EDIT_COMPOSITION_SESSION_MISMATCH",Ht="SITE_EDIT_COMPOSITION_SESSION_REQUIRED",ga="SITE_EDIT_COMPOSITION_REINITIALIZE_REQUIRED",se=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(G(t)&&G(t.payload)){let n=typeof t.payload.id=="string"?t.payload.id:"unknown",r=this.isRequestKind(t.payload.kind)?t.payload.kind:"get-document";return{id:n,kind:r}}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!G(t)||typeof t.type!="string"?!1:t.type==="request"?po(t.payload,n):t.type==="response"||t.type==="error"?G(t.payload)&&typeof t.payload.id=="string":t.type==="event"?G(t.payload)&&G(t.payload.event):t.type==="auth"?G(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"&&G(t.payload)&&t.payload.ok===!0}},st=class{constructor(t){this.options=t,this.session={subscribedCompositionKeys:new Set},this.messageQueue=new zt,this.eventDispatcher=new Wt(n=>{this.sendJson(n)}),this.unsubscribe=t.engine.subscribe(n=>{this.handleEngineEvent(n)}),t.socket.onmessage=n=>{try{this.messageQueue.enqueue(()=>this.handleRawMessage(n.data))}catch(r){this.sendJson({type:"error",payload:{id:"unknown",kind:"get-document",message:r instanceof Error?r.message:"Bridge queue overflow"}}),t.socket.close(1013,"bridge busy")}},t.socket.onclose=()=>{this.unsubscribe(),this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.clear()}}async handleMessage(t){try{let n=t;if(n.type!=="request")return;let r=n.payload,{id:i}=r;switch(r.kind){case"initialize-session":{let o=Ft(r),s=await this.resolve(o),c=await this.options.engine.initializeSession({composition:s.context,...r.mutationContext?{mutationContext:r.mutationContext}:{}});this.activateSession(s.context),this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:Ie({...c,data:{...c.data,document:Fn(c.data.document)}},s.context)}});return}case"get-document":{let o=await this.resolveWireContext(r),s=await this.options.engine.getDocument(o);this.sendResult(i,r.kind,yo(s,o));return}case"get-history-status":{let o=await this.resolveWireContext(r),s=await this.options.engine.getHistoryStatus(o);this.sendResult(i,r.kind,Ie(s,o));return}case"get-style-context":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getStyleContext(o),o));return}case"get-object-edit-context":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getObjectEditContext(r.key,o),o));return}case"get-class-name-source":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getClassNameSource(r.key,o),o));return}case"get-source-tree":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getSourceTree(o),o));return}case"get-source-file":{let o=await this.resolveWireContext(r);this.sendResult(i,r.kind,Ie(await this.options.engine.getSourceFile({path:r.path,composition:o}),o));return}case"resolve-source-location":{let o=await this.resolveWireContext(r),s=Ie(await this.options.engine.resolveSourceLocation({key:r.key,composition:o}),o);this.sendResult(i,r.kind,s);return}case"execute":{let o=await this.resolveOperationWireContext(r.request),s=await this.resolveWireContext(r);if(_e(o)!==_e(s))throw new Ae(On,"The execute request composition does not match its operation composition.");let c=await this.normalizeOperationRequest(r.request,o);await this.handleBufferedOperation(i,r.kind,()=>this.options.engine.execute(c));return}case"undo":case"redo":{let o=await this.resolveWireContext(r);await this.handleBufferedOperation(i,r.kind,()=>r.kind==="undo"?this.options.engine.undo(o):this.options.engine.redo(o));return}}}catch(n){let r=se.extractRequestInfo(t);this.sendJson({type:"error",payload:{...r,message:Kt(n),code:qt(n)}})}}async resolve(t){return this.options.engine.resolveComposition(t)}async resolveAndAssert(t){let n=await this.resolve(t),r=this.session.activeComposition;if(!r)throw new Ae(Ht,"Initialize a composition session before issuing this request.");if(_e(r)!==_e(n.context))throw new Ae(On,"The request composition does not match the active socket session.");return n.context}async resolveWireContext(t){let n=Ft(t);return this.resolveAndAssert(n)}async resolveOperationWireContext(t){let n=mo(t);return this.resolveAndAssert(n)}activateSession(t){this.session.activeComposition=t,this.session.subscribedCompositionKeys.clear(),this.session.subscribedCompositionKeys.add(_e(t))}async normalizeOperationRequest(t,n){let r={...t,composition:Mn(n)};if(r.target.kind==="route"){let i=r.target,o=Ft(i),s=await this.resolveAndAssert(o);r.target={...i,composition:Mn(s)}}return r}handleEngineEvent(t){let n=t?.composition;if(!ho(n))return;let r=_e(n);this.session.subscribedCompositionKeys.has(r)&&(this.eventDispatcher.push(t),t.type==="site-edit.graph.invalidated"&&r===go(this.session)&&(this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.delete(r)))}sendResult(t,n,r){this.sendJson({type:"response",payload:{id:t,kind:n,result:r}})}async handleRawMessage(t){try{await this.handleMessage(se.parseMessage(t,{validateOperationRequest:this.options.validateOperationRequest}))}catch(n){let r=bo(t);this.sendJson({type:"error",payload:{...r,message:Kt(n),code:qt(n)}})}}sendJson(t){this.options.socket.send(se.stringifyMessage(t))}async handleBufferedOperation(t,n,r){this.eventDispatcher.beginBuffering();try{let i=await r();this.sendResult(t,n,i)}catch(i){this.sendJson({type:"error",payload:{id:t,kind:n,message:Kt(i),code:qt(i)}})}finally{this.eventDispatcher.flush()}}},Ae=class extends Error{constructor(t,n){super(n),this.code=t,this.name="BridgeProtocolError"}},Wt=class{constructor(t){this.send=t,this.bufferedEvents=null}push(t){let n={type:"event",payload:{event:t}};if(this.bufferedEvents){this.bufferedEvents.push(n);return}this.send(n)}beginBuffering(){this.bufferedEvents=[]}flush(){let t=this.bufferedEvents??[];this.bufferedEvents=null,t.forEach(n=>this.send(n))}},zt=class{constructor(t=64){this.maxQueued=t,this.queue=Promise.resolve(),this.queued=0}enqueue(t){if(this.queued>=this.maxQueued)throw new Error("Bridge request queue is full");this.queued+=1;let n=async()=>{this.queued-=1,await t()},r=this.queue.then(n,n);return this.queue=r.then(()=>{},()=>{}),r}};function po(e,t){if(!G(e)||typeof e.id!="string"||!se.isRequestKind(e.kind))return!1;let n=We(e.composition);switch(e.kind){case"initialize-session":return n&&(e.mutationContext===void 0||Vt(e.mutationContext));case"get-document":case"get-style-context":return n;case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof e.key=="string"&&n;case"get-history-status":return n;case"get-source-tree":return n;case"get-source-file":return typeof e.path=="string"&&n;case"execute":return n&&fo(e.request)&&(e.request.mutationContext===void 0||Vt(e.request.mutationContext))&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return n&&e.mutationContext===void 0||n&&Vt(e.mutationContext)}}function fo(e){return G(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&We(e.composition)&&typeof e.kind=="string"&&G(e.target)&&(e.target.kind!=="route"||We(e.target.composition))&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&G(e.params)}function We(e){return G(e)&&typeof e.routeId=="string"&&e.routeId.length>0&&(e.templateId===void 0||typeof e.templateId=="string"&&e.templateId.length>0)&&Object.keys(e).every(t=>t==="routeId"||t==="templateId")}function ho(e){return G(e)&&typeof e.routeId=="string"&&(e.effectiveTemplateId===void 0||typeof e.effectiveTemplateId=="string")}function Ft(e){if(We(e.composition))return e.composition;throw new Ae(Ht,"A composition selector is required for this request.")}function mo(e){if(G(e)&&We(e.composition))return e.composition;throw new Ae(Ht,"A composition selector is required for execute.")}function Mn(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function go(e){return e.activeComposition?_e(e.activeComposition):null}function _e(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}function Ie(e,t){return G(e)&&e.ok===!0?{...e,composition:t}:e}function yo(e,t){return!G(e)||e.ok!==!0?e:{...e,...t?{composition:t}:{},data:Fn(e.data)}}function Fn(e){let t=e;return Bn(t.routeId?t:{...t,routeId:t.composition.routeId})}function G(e){return typeof e=="object"&&e!==null}function Vt(e){return G(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}function qt(e){if(!(!G(e)||typeof e.code!="string"||e.code.length===0))return e.code}function Kt(e){return e instanceof Error||G(e)&&typeof e.message=="string"&&e.message.length>0?e.message:"Unknown websocket operation failure"}function bo(e){try{return se.extractRequestInfo(JSON.parse(e))}catch{return{id:"unknown",kind:"get-document"}}}var So="vcp:designer:trace",Eo="designer_trace",Vn="__VCP_DESIGNER_TRACE__";var Io=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function Co(e=globalThis){let t=e;try{if(t.localStorage?.getItem(So)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(Eo)==="1"}catch{return!1}}function Ce(e,t={},n=globalThis){if(!Co(n))return;let r={type:e,timestamp:Date.now(),payload:vo(t)},i=n,o=i[Vn]??[];o.push(r),o.length>1e3&&o.splice(0,o.length-1e3),i[Vn]=o;let s=n.console?.debug;r.payload.diagnosticOnly!==!0&&typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function vo(e){return $t(e,0)}function $t(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>$t(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,i]of Object.entries(e)){if(Io.test(r)){n[r]="[redacted]";continue}n[r]=$t(i,t+1)}return n}var ct=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===Ut&&this.connectionState==="open"?(this.setConnectionState("open"),Promise.resolve()):this.connectPromise?this.connectPromise:(this.intentionalClose=!1,this.setConnectionState("connecting"),this.connectPromise=new Promise((t,n)=>{let r;try{r=this.createSocket(this.options.url)}catch(c){let a=ze(c,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",a.message),n(a);return}let i={socket:r,settled:!1,reject:n};this.connectAttempt=i,this.socket=r;let o=()=>{this.socket!==r||this.connectAttempt!==i||(i.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),t())},s=(c,a)=>{this.cleanupSocket(r,c,a)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(se.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(c){s(ze(c,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=c=>{if(this.socket!==r)return;let a=ze(c,"WebSocket failed");s(a,"failed")},r.onmessage=c=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===i&&!i.settled){this.handleAuthHandshakeMessage(c.data,r,i,()=>{o()});return}this.handleMessage(c.data)}},r.onclose=c=>{if(this.socket!==r)return;let a=this.intentionalClose,u=new Error(_o(c,{intentional:a}));s(u,a?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let t=this.socket;if(!t){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(t,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(t){return this.connectionStatusListeners.add(t),t({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(t)}}getDocument(t){let n=this.selector(t);return this.request("get-document",{composition:n})}async initializeSession(t){let n=this.selector(t.composition);return await this.request("initialize-session",{composition:n,...t.mutationContext?{mutationContext:t.mutationContext}:{}})}getHistoryStatus(t){return this.request("get-history-status",{composition:this.selector(t)})}getStyleContext(t){let n=this.selector(t);return this.request("get-style-context",{composition:n})}getObjectEditContext(t,n){let r=this.selector(n);return this.request("get-object-edit-context",{key:t,composition:r})}getClassNameSource(t,n){let r=this.selector(n);return this.request("get-class-name-source",{key:t,composition:r})}getSourceTree(t){return this.request("get-source-tree",{composition:this.selector(t)})}getSourceFile(t){return this.request("get-source-file",{path:t.path,composition:this.selector(t.composition)})}resolveSourceLocation(t){return this.request("resolve-source-location",{key:t.key,composition:this.selector(t.composition)})}execute(t,n){let r=at(t),i={...t,composition:ve(r)};return this.request("execute",{request:i})}undo(t,n){return this.request("undo",{composition:this.selector(t)})}redo(t,n){return this.request("redo",{composition:this.selector(t)})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}selector(t){return ve(t)}request(t,n){let r=this.socket;if(!r||r.readyState!==Ut||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=ko(i,t,n);return Ce("bridge.request",{id:i,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:qn(n.request,"kind"),documentVersion:qn(n.request,"documentVersion")}),new Promise((s,c)=>{let a=this.resolveRequestTimeoutMs(t),u=a>0?setTimeout(()=>{let l=this.pending.get(i);l&&(this.pending.delete(i),Ce("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),l.reject(new Error(`Bridge request timed out after ${a}ms: ${t}`)))},a):null;u?.unref?.(),this.pending.set(i,{kind:t,timeout:u,resolve:l=>s(l),reject:c});try{r.send(se.stringifyMessage(o))}catch(l){let d=ze(l,"WebSocket send failed");this.clearPendingRequest(i),c(d),this.cleanupSocket(r,d,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(se.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=ze(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=se.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"){Ce("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1});let i=new Error(n.payload.message);n.payload.code&&(i.code=n.payload.code),r.reject(i);return}Ce("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:Ao(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Hn(n.payload.result.data,n.payload.result.composition)}:r.kind==="initialize-session"?Po(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):To[t]??xo}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===Ro||t.readyState===Ut)&&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)}},Ro=0,Ut=1,xo=15e3,To={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function ze(e,t){return e instanceof Error?e:new Error(t)}function _o(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 qn(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Ao(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 zn(e){let t="composition"in e?ve(e.composition):ve({routeId:e.routeId});return new jt({composition:t,initialDocument:e.initialDocument,client:e.client})}var jt=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=new Map,this.styleContextInFlight=new Map,this.composition=ve(t.composition);let n=t.initialDocument.composition.effectiveTemplateId;if(n!==void 0&&(this.composition.templateId===void 0||this.composition.templateId!==n))throw new Error(`Site edit bridge requires a matching templateId for initial document composition ${JSON.stringify(t.initialDocument.composition)}`);this.currentDocument=t.initialDocument,this.observedDocumentVersion=t.initialDocument.version,this.sessionInitialized=!Kn(t.initialDocument),this.activeCompositionContext=this.sessionInitialized?{...t.initialDocument.composition}:null}async getDocument(t){this.requireBoundComposition(t);let n=Kn(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){let n=this.requireBoundComposition(t.composition);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let r=await this.params.client.initializeSession({...t,composition:n});return this.currentDocument=r.data.document,this.observedDocumentVersion=r.data.document.version,this.activeCompositionContext={...r.composition},this.sessionInitialized=!0,this.clearObjectCaches(),r}async getHistoryStatus(t){return this.params.client.getHistoryStatus(this.requireBoundComposition(t))}async getStyleContext(t){let n=this.requireBoundComposition(t),r=He(n),i=this.styleContextCache.get(r);if(i?.generation===this.styleGeneration)return{ok:!0,data:i.value};let o=this.styleContextInFlight.get(r);if(o?.generation===this.styleGeneration)return o.request;let s=this.styleGeneration,c=this.params.client.getStyleContext(n).then(a=>(this.styleGeneration===s&&this.styleContextCache.set(r,{generation:s,value:a.data}),a)).finally(()=>{this.styleContextInFlight.get(r)?.request===c&&this.styleContextInFlight.delete(r)});return this.styleContextInFlight.set(r,{generation:s,request:c}),c}async ensureDocumentVersion(t,n){this.requireBoundComposition(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(this.requireBoundComposition(t),n>this.currentDocument.version){if(this.currentDocument.pageComposition.status==="supported"){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}}this.currentDocument={...this.currentDocument,version:n},this.clearObjectCaches({preserveStyleContext:!0})}return this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n),{ok:!0,data:this.currentDocument}}async getObjectEditContext(t,n){let r=this.requireBoundComposition(n),i=this.objectCacheKey(t,r),o=this.editContextCache.get(i);if(o)return{ok:!0,data:o};let s=this.editContextInFlight.get(i);if(s)return s;let c=this.objectGeneration,a=this.params.client.getObjectEditContext(t,r).then(u=>(this.objectGeneration===c&&this.editContextCache.set(i,u.data),u)).finally(()=>{this.editContextInFlight.get(i)===a&&this.editContextInFlight.delete(i)});return this.editContextInFlight.set(i,a),a}async getClassNameSource(t,n){let r=this.requireBoundComposition(n),i=this.objectCacheKey(t,r),o=this.classNameSourceCache.get(i);if(o)return o;let s=this.classNameSourceInFlight.get(i);if(s)return s;let c=this.objectGeneration,a=this.params.client.getClassNameSource(t,r).then(u=>(this.objectGeneration===c&&this.classNameSourceCache.set(i,u),u)).finally(()=>{this.classNameSourceInFlight.get(i)===a&&this.classNameSourceInFlight.delete(i)});return this.classNameSourceInFlight.set(i,a),a}async getSourceTree(t){return this.params.client.getSourceTree(this.requireBoundComposition(t))}async getSourceFile(t){return this.params.client.getSourceFile({path:t.path,composition:this.requireBoundComposition(t.composition)})}async resolveSourceLocation(t){return this.params.client.resolveSourceLocation({key:t.key,composition:this.requireBoundComposition(t.composition)})}async execute(t,n){let r=at(t);r&&this.composition.templateId!==void 0&&this.requireBoundComposition(r);let i={...t,composition:r??this.composition};return this.params.client.execute(i)}async undo(t,n){return this.params.client.undo(this.requireBoundComposition(t))}async redo(t,n){return this.params.client.redo(this.requireBoundComposition(t))}subscribe(t){return this.params.client.subscribe(n=>{if(n.type==="site-edit.document.changed"&&this.sessionInitialized&&this.isActiveComposition(n.composition)){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 Ce("bridge.document-refresh",{composition:this.composition,routeId:this.composition.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;let r=He(this.composition),i=this.refreshInFlight;if(i?.compositionKey===r){Ce("bridge.document-refresh",{composition:this.composition,routeId:this.composition.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let s=await i.request;if(typeof t!="number"||s.version>=t||this.currentDocument.version>=t)return this.currentDocument}Ce("bridge.document-refresh",{composition:this.composition,routeId:this.composition.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!1,source:n});let o=this.params.client.getDocument(this.composition).then(s=>(this.currentDocument=s.data,this.activeCompositionContext={...s.data.composition},this.observedDocumentVersion=Math.max(this.observedDocumentVersion,s.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight={compositionKey:r,request:o};try{return await o}finally{this.refreshInFlight?.request===o&&(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.clear(),this.styleContextInFlight.clear())}objectCacheKey(t,n){return`${He(n)}\0${t}`}requireBoundComposition(t){let n=t===void 0?this.composition:ve(t);if(He(n)!==He(this.composition))throw new Error(`Site edit bridge is bound to composition ${JSON.stringify(this.composition)}, received ${JSON.stringify(n)}`);return ve(n)}isActiveComposition(t){let n=this.activeCompositionContext??No(this.composition);return Wn(t)===Wn(n)}};function Kn(e){return e.version===0&&e.entries.length===0}function Po(e){let t=e;return{...t,data:{...t.data,document:Hn(t.data.document,t.composition)}}}function Hn(e,t){let n=e,r=wn(n.routeId?n:{...n,routeId:t?.routeId??n.composition?.routeId});return t?{...r,composition:t}:r}function ve(e){if(e&&typeof e=="object"&&typeof e.routeId=="string"){let t="effectiveTemplateId"in e?e.effectiveTemplateId:"templateId"in e?e.templateId:void 0;return{routeId:e.routeId,...typeof t=="string"?{templateId:t}:{}}}throw new Error("SITE_EDIT_COMPOSITION_SESSION_REQUIRED: a composition selector is required")}function He(e){return JSON.stringify([e.routeId,e.templateId??null])}function Wn(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}function No(e){return{routeId:e.routeId,...e.templateId?{effectiveTemplateId:e.templateId}:{}}}function at(e){if(e&&typeof e=="object"){let t=e;if(t.composition&&typeof t.composition=="object"){let n=t.composition;if(typeof n.routeId=="string")return{routeId:n.routeId,...typeof n.templateId=="string"?{templateId:n.templateId}:{}}}}}function ko(e,t,n){let r=ve(t==="execute"?at(n.request):n.composition),i={id:e,kind:t,composition:r};switch(t){case"initialize-session":case"get-document":case"get-history-status":case"get-style-context":case"get-source-tree":case"undo":case"redo":return{type:"request",payload:{...i,...n.mutationContext?{mutationContext:n.mutationContext}:{}}};case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return{type:"request",payload:{...i,key:String(n.key)}};case"get-source-file":return{type:"request",payload:{...i,path:String(n.path)}};case"execute":return{type:"request",payload:{...i,request:{...n.request,composition:at(n.request)??r}}}}}function oe(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}var $n="vcp-window-message",Un=1;function Do(e){return{source:$n,version:Un,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function Bo(e){try{return C(e)?J(e,"source",$n)&&J(e,"version",Un)&&k(e,"namespace")&&k(e,"channel")&&le(e,"body")&&(!Ne(e,"sessionKey")||k(e,"sessionKey")):!1}catch{return!1}}var jn="site-edit",Gn="frame-runtime",Yt=1,$e=1,Ue=1,Yn=24;function Ge(e,t={}){return Do({namespace:jn,channel:Gn,sessionKey:t.sessionKey,body:e})}function Xn(e){try{return!Bo(e)||e.namespace!==jn||e.channel!==Gn?!1:oi(e.body)}catch{return!1}}function Se(e){return C(e)&&k(e,"routeId")&&Pe(e,"templateId")&&he(e,["routeId","templateId"])}function ut(e){return C(e)&&k(e,"routeId")&&Pe(e,"effectiveTemplateId")&&he(e,["routeId","effectiveTemplateId"])}function he(e,t){let n=new Set(t);return Reflect.ownKeys(e).every(r=>typeof r=="string"&&n.has(r))}var Ne=(e,t)=>Object.prototype.hasOwnProperty.call(e,t);function le(e,t){let n=Object.getOwnPropertyDescriptor(e,t);return n!==void 0&&"value"in n}function p(e,t){return Object.getOwnPropertyDescriptor(e,t)?.value}function J(e,t,n){return le(e,t)&&p(e,t)===n}function k(e,t){return le(e,t)&&typeof p(e,t)=="string"}function pt(e,t){return le(e,t)&&typeof p(e,t)=="boolean"}function M(e,t){let n=p(e,t);return le(e,t)&&typeof n=="number"&&Number.isFinite(n)}function wo(e,t){let n=p(e,t);return le(e,t)&&typeof n=="number"&&Number.isInteger(n)&&n>0}function Pe(e,t){return!Ne(e,t)||p(e,t)===void 0||k(e,t)}function Oe(e,t){return!Ne(e,t)||p(e,t)===void 0||M(e,t)}function lt(e,t){let n=p(e,t);return!Ne(e,t)||n===void 0||le(e,t)&&typeof n=="number"&&Number.isInteger(n)&&n>=0}function Y(e,t){return!Ne(e,t)||p(e,t)===void 0}function C(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let t=Object.getPrototypeOf(e);return t===Object.prototype||t===null}function Oo(e){return C(e)&&Reflect.ownKeys(e).length===0}function dt(e){if(!Array.isArray(e))return!1;for(let t=0;t<e.length;t+=1){let n=Object.getOwnPropertyDescriptor(e,String(t));if(n===void 0||!("value"in n)||typeof n.value!="string")return!1}return!0}function fe(e){return C(e)&&k(e,"key")&<(e,"instanceIndex")&<(e,"instanceCount")&<(e,"textSegmentIndex")}function Mo(e){return C(e)&&k(e,"blockId")&&fe(p(e,"ref"))&&je(p(e,"rect"))&&pt(e,"targetIsSectionRoot")}function Fo(e){if(!C(e))return!1;let t=p(e,"placement"),n=p(e,"boundary");return k(e,"anchorBlockId")&&fe(p(e,"anchorRef"))&&(t==="before"||t==="after")&&C(n)&&M(n,"top")&&M(n,"left")&&M(n,"width")}function je(e){return C(e)&&["top","left","width","height"].every(t=>M(e,t))}function Ln(e){if(!C(e))return!1;let t=p(e,"rect"),n=p(e,"layout"),r=C(n)?p(n,"containingBlock"):null,i=p(e,"scrollContext"),o=C(r)&&(J(r,"kind","viewport")&&Reflect.ownKeys(r).length===1||J(r,"kind","document")&&Reflect.ownKeys(r).length===1||J(r,"kind","element")&&k(r,"runtimeNodeId"));return J(e,"version",Yt)&&k(e,"runtimeNodeId")&&C(t)&&je(p(t,"viewport"))&&je(p(t,"document"))&&C(n)&&k(n,"position")&&k(n,"transform")&&o&&C(i)&&["scrollX","scrollY","viewportWidth","viewportHeight"].every(s=>M(i,s))&&le(i,"scrollContainers")&&Vo(p(i,"scrollContainers"))}function Vo(e){return Array.isArray(e)&&e.every(t=>C(t)&&k(t,"runtimeNodeId")&&M(t,"scrollLeft")&&M(t,"scrollTop"))}function Gt(e){return C(e)&&(Y(e,"layoutSnapshot")||Ln(p(e,"layoutSnapshot")))}function qo(e){return C(e)&&fe(p(e,"ref"))&&le(e,"layoutSnapshot")&&Ln(p(e,"layoutSnapshot"))&&(Y(e,"childBoxes")||zo(p(e,"childBoxes")))&&(Y(e,"childRects")||Wo(p(e,"childRects")))&&(Y(e,"layout")||Ko(p(e,"layout")))&&(Y(e,"spacing")||Ho(p(e,"spacing")))}function Ko(e){if(!C(e))return!1;let t=p(e,"indicatorOrientation");return k(e,"display")&&(t==="horizontal"||t==="vertical")&&Pe(e,"flexDirection")&&Pe(e,"gridAutoFlow")}function Wo(e){return Array.isArray(e)&&e.every(t=>je(t))}function zo(e){return Array.isArray(e)&&e.every(t=>C(t)&&je(p(t,"rect"))&&Jn(p(t,"margin")))}function Jn(e){return C(e)&&["marginTop","marginRight","marginBottom","marginLeft"].every(t=>M(e,t))}function Ho(e){return Jn(e)&&["paddingTop","paddingRight","paddingBottom","paddingLeft","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","columnGap","rowGap"].every(t=>M(e,t))}function $o(e){if(!Array.isArray(e))return!1;for(let t=0;t<e.length;t+=1){let n=Object.getOwnPropertyDescriptor(e,String(t));if(n===void 0||!("value"in n)||!qo(n.value))return!1}return!0}function Uo(e){return C(e)&&Reflect.ownKeys(e).every(t=>typeof t=="string"&&le(e,t)&&(typeof p(e,t)=="string"||p(e,t)===null))}function Qn(e){return e==null||typeof e=="string"||typeof e=="number"&&Number.isFinite(e)}function jo(e){return C(e)&&Reflect.ownKeys(e).every(t=>typeof t=="string"&&le(e,t)&&Qn(p(e,t)))}function Go(e){if(!C(e))return!1;let t=p(e,"priority");return k(e,"property")&&le(e,"value")&&Qn(p(e,"value"))&&(!Ne(e,"priority")||t===void 0||t==="important")}function Yo(e){return C(e)?(Y(e,"attributes")||Uo(p(e,"attributes")))&&Pe(e,"className")&&(Y(e,"style")||jo(p(e,"style")))&&(Y(e,"styleDeclarations")||Array.isArray(p(e,"styleDeclarations"))&&p(e,"styleDeclarations").every(Go)):!1}function Xo(e){return C(e)&&M(e,"x")&&M(e,"y")&&(Y(e,"detailLevel")||J(e,"detailLevel","summary")||J(e,"detailLevel","full"))}function Lo(e){return C(e)&&fe(p(e,"ref"))}function Jo(e){if(!C(e)||!C(p(e,"variables")))return!1;let t=p(e,"variables");return Reflect.ownKeys(t).every(n=>typeof n=="string"&&k(t,n))?Y(e,"stylesheets")||dt(p(e,"stylesheets")):!1}function Qo(e){if(!J(e,"type","request")||!k(e,"id")||!k(e,"kind")||!le(e,"payload"))return!1;let t=p(e,"kind"),n=p(e,"payload");switch(t){case"hit-test-at-point":case"start-text-edit-at-point":return Xo(n);case"bridge-get-source-tree":return C(n)&&Se(p(n,"composition"))&&he(n,["composition"]);case"get-scroll-metrics":case"clear-theme-override":return Oo(n);case"bridge-get-history-status":case"bridge-undo":case"bridge-redo":return C(n)&&Se(p(n,"composition"))&&he(n,["composition"]);case"bridge-get-source-file":return C(n)&&k(n,"path")&&Se(p(n,"composition"))&&he(n,["path","composition"]);case"bridge-resolve-source-location":case"bridge-get-object-edit-context":case"bridge-get-class-name-source":return C(n)&&k(n,"key")&&Se(p(n,"composition"))&&he(n,["key","composition"]);case"scroll-to":return C(n)&&M(n,"x")&&M(n,"y");case"scroll-by":return C(n)&&M(n,"deltaX")&&M(n,"deltaY");case"set-interaction-mode":return C(n)&&pt(n,"enabled");case"set-selection-visual":return C(n)&&J(n,"version",$e)&&fe(p(n,"ref"))&&J(n,"visible",!0);case"clear-selection-visual":return C(n)&&J(n,"version",$e);case"set-resize-visual":return C(n)&&J(n,"version",Ue)&&fe(p(n,"ref"))&&J(n,"visible",!0);case"clear-resize-visual":return C(n)&&J(n,"version",Ue);case"set-theme-override":return Jo(n);case"get-theme-variables":return C(n)&&dt(p(n,"names"));case"compute-drop-target-at-point":return C(n)&&M(n,"x")&&M(n,"y")&&(J(n,"dragKind","insert")||J(n,"dragKind","move"))&&(Y(n,"movingRef")||fe(p(n,"movingRef")));case"observe-node-bounds":case"clear-node-bounds-observer":return C(n)&&(Y(n,"ref")||fe(p(n,"ref")));case"apply-node-patch":return C(n)&&fe(p(n,"ref"))&&Yo(p(n,"patch"))&&(Y(n,"preview")||C(p(n,"preview"))&&k(p(n,"preview"),"sessionId")&<(p(n,"preview"),"revision")&&Ne(p(n,"preview"),"revision"));case"get-hit-by-ref":case"get-path-by-ref":case"restore-text-edit":case"clear-text-edit-rollback":return Lo(n);case"bridge-initialize-session":case"bridge-get-style-context":return C(n)&&Se(p(n,"composition"))&&he(n,["composition"]);case"bridge-get-document":case"bridge-ensure-document-version":case"bridge-acknowledge-document-version":return C(n)&&Se(p(n,"composition"))&&Oe(n,"minVersion")&&Oe(n,"version")&&he(n,["composition","minVersion","version"]);case"bridge-execute":{if(!C(n))return!1;let r=p(n,"request"),i=p(n,"composition"),o=C(r)?p(r,"composition"):null;return!Se(i)||!C(r)||!Se(o)?!1:oe({routeId:i.routeId,...i.templateId?{effectiveTemplateId:i.templateId}:{}})===oe({routeId:o.routeId,...o.templateId?{effectiveTemplateId:o.templateId}:{}})&&he(n,["composition","request"])}case"bridge-subscribe":case"bridge-unsubscribe":return C(n)&&k(n,"subscriptionId")&&Se(p(n,"composition"))&&he(n,["subscriptionId","composition"]);default:return!1}}function Zo(e){return J(e,"type","response")&&k(e,"id")&&pt(e,"ok")&&(Y(e,"error")||k(e,"error"))}function ei(e){if(!C(e))return!1;let t=p(e,"type");if(typeof t!="string"||!ut(p(e,"composition"))||!k(e,"siteId")||!k(e,"at"))return!1;switch(t){case"site-edit.document.changed":return k(e,"snapshotId")&&M(e,"version");case"site-edit.operation.planned":return k(e,"operationId")&&k(e,"baseSnapshotId")&&dt(p(e,"changedFiles"));case"site-edit.operation.completed":return C(p(e,"result"));case"site-edit.operation.failed":return k(e,"requestId")&&C(p(e,"error"));case"site-edit.capability.changed":return dt(p(e,"keys"));case"site-edit.graph.invalidated":return!0;case"site-edit.graph.ready":return M(e,"version");case"site-edit.graph.error":return k(e,"message");default:return!1}}var ti=new Set(["pointer-down","pointer-move","pointer-leave","pointer-up","pointer-cancel","pointer-click","pointer-double-click"]),Zn=new Set(["e","s","se"]);function ni(e,t){if(Y(e,"resizeSession"))return!0;let n=p(e,"resizeSession");if(!C(n))return!1;let r=p(e,"pointerId"),i=p(n,"pointerId"),o=p(n,"phase"),s=p(n,"edge"),c=t==="pointer-down"?"start":t==="pointer-up"?"commit":t==="pointer-cancel"?"cancel":null;return p(n,"version")===1&&o===c&&k(n,"sessionId")&&String(p(n,"sessionId")).length>0&&typeof r=="number"&&Number.isInteger(r)&&typeof i=="number"&&Number.isInteger(i)&&r===i&&typeof s=="string"&&Zn.has(s)&&p(e,"resizeEdge")===s&&fe(p(n,"ref"))&&["startWidth","startHeight","width","height"].every(a=>M(n,a))}function ri(e){if(!J(e,"type","event")||!k(e,"kind")||!C(p(e,"payload")))return!1;let t=p(e,"kind"),n=p(e,"payload");switch(t){case"text-edit-commit":case"text-edit-cancel":case"text-edit-exit":case"text-edit-input":return fe(p(n,"ref"))&&Pe(n,"value")&&(Y(n,"hit")||Gt(p(n,"hit")));case"node-bounds-change":return Gt(p(n,"hit"));case"geometry-batch":{let r=p(n,"reason");return wo(n,"sequence")&&M(n,"sourceEventAt")&&M(n,"captureStartedAt")&&M(n,"capturedAt")&&(r==="scroll"||r==="resize"||r==="mutation")&&$o(p(n,"snapshots"))}case"bridge-event":{let r=p(n,"event"),i=p(n,"composition");return!ei(r)||!ut(i)?!1:k(n,"subscriptionId")&&oe(i)===oe(r.composition)}case"route-ready":return ut(p(n,"composition"))&&k(n,"editEngineVersion")&&M(n,"sequence")&&M(n,"version");case"bridge-status":{let r=p(n,"state");return(r==="connecting"||r==="ready"||r==="reconnecting"||r==="failed"||r==="reload-required")&&ut(p(n,"composition"))&&M(n,"sequence")&&Oe(n,"attempt")&&Oe(n,"retryInMs")&&Pe(n,"messageKey")}case"scroll":{let r=p(n,"metrics");return C(r)&&["scrollX","scrollY","scrollWidth","scrollHeight","viewportWidth","viewportHeight"].every(i=>M(r,i))}default:return ti.has(t)&&M(n,"clientX")&&M(n,"clientY")&&Oe(n,"buttons")&&Oe(n,"pointerId")&&(Y(n,"hoverVisualOwned")||pt(n,"hoverVisualOwned"))&&(Y(n,"resizeEdge")||k(n,"resizeEdge")&&Zn.has(p(n,"resizeEdge")))&&ni(n,t)&&(p(n,"hit")===null||Gt(p(n,"hit")))&&(Y(n,"section")||p(n,"section")===null||Mo(p(n,"section")))&&(Y(n,"sectionGap")||p(n,"sectionGap")===null||Fo(p(n,"sectionGap")))}}function oi(e){if(!C(e))return!1;switch(p(e,"type")){case"request":return Qo(e);case"response":return Zo(e);case"event":return ri(e);default:return!1}}var en="vcp-site-edit:route-ready",tn="vcp-site-edit:bridge-status",Tt="data-vcp-page-template-context",on="1",sn="data-vcp-route-id",cn="data-vcp-effective-template-id",yr=`[${Tt}="${on}"]`,Xe="SITE_EDIT_COMPOSITION_MARKER_INVALID",br="SITE_EDIT_COMPOSITION_RENDER_MISMATCH",ii=80,si=120,ci=1e3,ai="data-vcp-ui-component",Sr="data-vcp-theme-preview",er="::repeat-item#",ft="components/ui",Xt="data-site-block-id",Lt="data-vcp-runtime-site-block-id",ui=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),li=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function di(e,t){let n=Array.from(e.querySelectorAll("[data-vcp-edit-key]"));for(let c of n)c.getAttribute(Lt)==="true"&&(c.removeAttribute(Xt),c.removeAttribute(Lt));if(!t)return;let r=n.filter(c=>c.tagName.toLowerCase()==="section"),i=r.length>0?r:n.filter(c=>c.tagName.toLowerCase()==="main"),o=new Set(i),s=new Map;for(let c of i){let a=c.parentElement,u=!1;for(;a;){if(o.has(a)){u=!0;break}a=a.parentElement}if(u||c.getAttribute(Xt)?.trim())continue;let l=c.getAttribute("data-vcp-edit-key")?.trim();if(!l)continue;let d=s.get(l)??0;s.set(l,d+1);let f=`vcp-runtime:${encodeURIComponent(l)}:${d}`;c.setAttribute(Xt,f),c.setAttribute(Lt,"true")}}function bt(e,t=""){let n=vr(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function pi(e){let t=Array.from(e.querySelectorAll(yr)).filter(s=>s.getAttribute(Tt)===on);if(t.length===0)return null;if(t.length!==1)throw new Error(`${Xe}: expected exactly one marker`);let n=t[0],r=n.getAttribute(sn),i=n.getAttribute(cn);if(!r?.trim()||!i?.trim())throw new Error(`${Xe}: marker fields are required`);let o=hi(r);if(!o)throw new Error(`${Xe}: marker route is invalid`);return{routeId:o,effectiveTemplateId:i}}function fi(e){let t=bt(e.pathname,e.basePath??""),n=pi(e.document);if(!n)return{routeId:t};if(n.routeId!==t)throw new Error(`${Xe}: marker route ${n.routeId} does not match pathname ${t}`);return n}function hi(e){return!e.startsWith("/")||e.includes("?")||e.includes("#")?null:bt(e)}function tr(e,t){return oe(e)===oe(t)}function Jt(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function mi(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 gi(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 Pa(e=window,t={}){let n=gi(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=yi({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(bi(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,unbindCompositionMarker:void 0},s,c=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===s,a=t.create_client??(h=>new ct({url:h,authKey:t.bridge_session_key})),u=t.schedule_after_navigation??Hi,l=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},d=()=>fi({pathname:e.location.pathname,document:e.document,basePath:t.basePath}),f=()=>oe(d()),E=()=>bt(e.location.pathname,t.basePath||""),A=!!e.parent&&e.parent!==e,I=h=>{$i(e,{...h,sequence:h.sequence??o.routeSequence})},_=h=>{o.currentDocument=h,o.currentEntriesByKey=new Map((h?.entries??[]).map(v=>[v.key,v])),di(e.document,!!h)},B=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},D=(h,v)=>{if(o.disposed||v!==o.routeSequence)return!1;try{return h===f()}catch{return!1}},Z=async(h,v,O)=>{let F=o.activeBridge;if(!F)return null;let V=await F.getDocument(h);return D(v,O)&&_(V.data),V.data},g=()=>{B(),_(null);let h=o.activeBridge;o.activeBridge=null,h&&e.__VCP_SITE_EDIT__===h&&delete e.__VCP_SITE_EDIT__;let v=o.activeClient;o.activeClient=null,v?.disconnect()},te=h=>h===s.compositionKey&&!!o.activeBridge&&(A||!!(o.currentDocument&&ji(o.currentDocument,h)))&&Ui(o.activeClient),L=h=>Math.min(ci*2**Math.max(0,h),8e3),W=(h,v,O,F)=>{if(o.disposed)return;l();let V=L(F);I({state:"reconnecting",composition:h,attempt:F,retryInMs:V,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||O!==o.routeSequence||!D(v,O))&&x(F+1).catch(ce=>{let y;try{y=f()}catch{return}if(v===y){if(Me(ce)){I({state:"reload-required",composition:h,attempt:F,messageKey:"studio.errors.previewBridgeReloadRequired"});return}W(h,v,o.routeSequence,F+1)}})},V)},ee=(h,v,O,F)=>{if(!D(v,O)||o.activeClient===null)return;if(Me(F.message)){g(),l(),I({state:"reload-required",composition:h,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let V=o.activeClient;B(),_(null);let ce=o.activeBridge;o.activeBridge=null,ce&&e.__VCP_SITE_EDIT__===ce&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,V?.disconnect(),W(h,v,O,0)},H=h=>{let v;try{v=d()}catch{return}let O=oe(v),F=o.routeSequence;if(!(!D(O,F)||o.activeClient===null)){if(Me(h)){g(),l(),I({state:"reload-required",composition:v,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Cr(h)&&ee(v,O,F,{state:"failed",message:Ze(h,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=vi(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:h=>o.currentEntriesByKey.get(h)??null,setCurrentDocument:_,onBridgeRequestError:h=>{H(h)}});let $=async()=>x(0),x=async h=>{if(o.disposed)return;let v=d(),O=oe(v);if(te(O))return;let F=o.syncInFlight;if(F?.compositionKey===O)return F.promise;let V=o.routeSequence+1,ce=P(v,O,V,h);o.syncInFlight={compositionKey:O,sequence:V,promise:ce};try{await ce}finally{o.syncInFlight?.promise===ce&&(o.syncInFlight=null)}},P=async(h,v,O,F)=>{o.routeSequence=O,l(),g(),I({state:F>0?"reconnecting":"connecting",composition:h,attempt:F,messageKey:F>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let V=a(n),ce=!1;o.activeClient=V,o.unsubscribeConnectionStatus=V.subscribeConnectionStatus?.(y=>{ce&&(y.state==="closed"||y.state==="failed")&&ee(h,v,O,y)});try{if(await V.connect(),!D(v,O)){V.disconnect();return}let y=zn({composition:Jt(h),client:V,initialDocument:Ci(h)});o.activeBridge=y,c()&&(e.__VCP_SITE_EDIT__=y),o.activeClient=V,o.unsubscribeDocument=y.subscribe(q=>{oe(q.composition)===v&&(q.type==="site-edit.document.changed"&&o.currentDocument&&q.version>o.currentDocument.version?Z(Jt(h),v,O).catch(()=>{}):q.type==="site-edit.graph.invalidated"&&z())}),c()&&(s.routeId=h.routeId,s.composition=h,s.compositionKey=v);let S=A?null:await y.initializeSession({composition:Jt(h)}),m=S?.data.document??null;if(S&&(!tr(S.composition,h)||!tr(S.data.document.composition,h)))throw new Error(`${br}: initialize response does not match marker`);if(m&&_(m),!D(v,O)){V.disconnect();return}ce=!0,I({state:"ready",composition:h,attempt:F,messageKey:"studio.status.previewReady"}),mi(e,{documentVersion:m?.version??0,routeId:h.routeId,versions:t.runtime_versions}),m&&Ir(e,{composition:h,editEngineVersion:t.runtime_versions?.engine??"unknown",sequence:O,version:m.version})}catch(y){if(B(),o.activeClient===V&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,V.disconnect(),_(null),!D(v,O))return;throw I({state:Me(y)?"reload-required":"failed",composition:h,attempt:F,messageKey:Me(y)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),y}},T=h=>{if(o.disposed)return;let v;try{v=d()}catch{I({state:"failed",composition:{routeId:bt(e.location.pathname,t.basePath||"")},attempt:0,messageKey:"studio.errors.previewBridgeDisconnected"});return}let O=oe(v);if(Me(h)){l(),I({state:"reload-required",composition:v,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}if(Yi(h)||Gi(h)){I({state:"failed",composition:v,attempt:0,messageKey:"studio.errors.previewBridgeDisconnected"});return}W(v,O,o.routeSequence,0)},z=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,u(()=>{o.syncScheduled=!1,!o.disposed&&$().catch(h=>T(h))}))},U=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,l(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindCompositionMarker?.(),o.unbindCompositionMarker=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),g(),c()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:$,cleanup:U},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=Ei(e,U),o.unbindRouteChange=Wi(e,z,E),o.unbindCompositionMarker=zi(e,z),t.defer_initial_sync){z();return}await $()}function yi(e){return{basePath:vr(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:Si(e.options.bridge_session_key)}}function bi(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function Si(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 Ei(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),Ii(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function Ii(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function Ci(e){return{siteId:"preview",snapshotId:"preview",composition:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function vi(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,c=null,a=0,u=null,l=null,d=null,f=null,E=null,A=0,I=new Map,_=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,B=()=>{n?.(),n=null,r=null},D=()=>{i?.(),i=null,o?.(),o=null,s?.(),s=null,c?.cleanup(),c=null},Z=(y,S,m)=>{let q=u?.sessionKey!==y||u?.sourceWindow!==S||u?.targetOrigin!==m;u={sessionKey:y,sourceWindow:S,targetOrigin:m},q&&(a=0,f=null,E=null)},g=(y,S)=>{let m=e.parent&&e.parent!==e?e.parent:null;return!m||S!==m?!1:!_||y===_},te=()=>{for(let y of I.values())y();I.clear()},L=y=>JSON.stringify([oe(y.composition),y.editEngineVersion,y.sequence,y.version]),W=()=>!d||d.state==="ready",ee=y=>JSON.stringify([y.state,oe(y.composition),y.sequence,y.attempt??null,y.retryInMs??null,y.messageKey??null]),H=y=>{if(!W())return;let S=L(y);f!==S&&(o?.(),o=null,s?.(),s=null,c?.cleanup(),c=null,U({kind:"route-ready",payload:{composition:y.composition,editEngineVersion:y.editEngineVersion,sequence:y.sequence,version:y.version}}),u&&(f=S))},$=y=>{let S=ee(y);E!==S&&(y.state!=="ready"&&(f=null,l=null),U({kind:"bridge-status",payload:y}),u&&(E=S))},x=y=>{l=y,H(y)},P=y=>{d=y,$(y)},T=()=>{l&&H(l)},z=()=>{d&&$(d)},U=y=>{u&&u.sourceWindow.postMessage(Ge({type:"event",...y},{sessionKey:u.sessionKey}),u.targetOrigin)},h=(y,S,m,q)=>{let j=t.getCurrentDocument?.()??null,ie=rs(e.document,S.clientX,S.clientY),R=S.resizeSession?null:Qe(e.document,S.clientX,S.clientY,j),Q=R?me(R,m==="full"?ge(e.document,R,j):vt(e.document,R,j),t.getDocumentEntry,m):null,ae=os(e.document,ie,j),de=ss(e.document,S,j);q&&Q&&(y==="pointer-click"||y==="pointer-double-click")&&(q.preventDefault(),q.stopPropagation(),typeof q.stopImmediatePropagation=="function"&&q.stopImmediatePropagation()),U({kind:y,payload:{clientX:S.clientX,clientY:S.clientY,buttons:Number(S.buttons??0),pointerId:S.pointerId,hoverVisualOwned:S.hoverVisualOwned,resizeEdge:S.resizeEdge,resizeSession:S.resizeSession,hit:Q,section:ae,sectionGap:de}})},v=y=>{U({kind:"pointer-leave",payload:{clientX:y?.clientX??0,clientY:y?.clientY??0,buttons:Number(y?.buttons??0),hit:null,section:null,sectionGap:null}})},O=(y,S,m)=>{D(),u={sessionKey:y,sourceWindow:S,targetOrigin:m};let q=Us(e.document),j=Ri(e,t.getCurrentDocument),ie=null,R=null,Q=null,ae=null,de=null,pe=()=>{de!==null&&(e.clearTimeout(de),de=null)},xe=()=>{Q!==null&&(It(e,Q),Q=null),ie=null},ot=()=>{Q=null;let b=ie;ie=null,b&&h("pointer-move",b,"summary")},Ke=b=>{pe(),R=b,ie=b,Q===null&&(Q=Et(e,ot))},ne=()=>{R&&Ke({...R,hoverVisualOwned:j?.updateAtPoint(R.clientX,R.clientY)??!1})},Te=e.document.documentElement,N=typeof Te.addEventListener=="function"?Te:e.document,w=b=>{if(c?.update(b)){b.preventDefault();return}Ke({clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),hoverVisualOwned:j?.update(b.target)??!1})},re=b=>{let K=Oi(b.target),kn=K?c?.begin(b,K):null;kn&&(b.target?.setPointerCapture?.(b.pointerId),b.preventDefault(),b.stopPropagation()),h("pointer-down",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:Number(b.pointerId),resizeEdge:K,resizeSession:kn??void 0},"full",b)},be=b=>{let K=c?.finish(b,"commit")??null;if(K){h("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:Number(b.pointerId),resizeEdge:K.edge,resizeSession:K},"summary",b);return}h("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},Be=b=>{let K=c?.finish(b,"cancel")??null;h("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:K?.pointerId,resizeEdge:K?.edge,resizeSession:K??void 0},"summary",b)},Cn=b=>{let K=c?.finish(b,"cancel")??null;K&&h("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:K.pointerId,resizeEdge:K.edge,resizeSession:K},"summary",b)},vn=b=>{h("pointer-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Rn=b=>{h("pointer-double-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Ot=b=>{if(b&&b.target!==N&&b.target!==Te)return;let K=b?{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)}:R;if(b&&K&&K.clientX>0&&K.clientX<e.innerWidth&&K.clientY>0&&K.clientY<e.innerHeight){ne();return}if(xe(),b){pe(),de=e.setTimeout(()=>{de=null,R=null,v(K??void 0)},si);return}pe(),R=null,j?.clear(),v(K??void 0)},xn=()=>Ot(),io=()=>{ae=null,U({kind:"scroll",payload:{metrics:yt(e)}}),ne()},Tn=()=>{ae===null&&(ae=Et(e,io))};e.document.addEventListener("pointerdown",re,!0),e.document.addEventListener("pointermove",w,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",be,!0),e.document.addEventListener("pointercancel",Be,!0),e.document.addEventListener("lostpointercapture",Cn,!0),e.document.addEventListener("click",vn,!0),e.document.addEventListener("dblclick",Rn,!0),e.addEventListener("scroll",Tn,{passive:!0}),e.addEventListener("resize",ne,{passive:!0}),e.addEventListener("blur",xn),e.document.addEventListener("load",ne,!0),N.addEventListener("pointerleave",Ot,!0);let it=e.visualViewport;it?.addEventListener?.("resize",ne,{passive:!0}),it?.addEventListener?.("scroll",ne,{passive:!0});let _n=e.ResizeObserver,An=typeof _n=="function"?new _n(ne):null;An?.observe(Te);let Pn=e.MutationObserver,Nn=typeof Pn=="function"?new Pn(ne):null;Nn?.observe(Te,{attributes:!0,childList:!0,subtree:!0}),i=()=>{xe(),pe(),R=null,j?.cleanup(),An?.disconnect(),Nn?.disconnect(),ae!==null&&(It(e,ae),ae=null),q(),e.document.removeEventListener("pointerdown",re,!0),e.document.removeEventListener("pointermove",w,!0),e.document.removeEventListener("pointerup",be,!0),e.document.removeEventListener("pointercancel",Be,!0),e.document.removeEventListener("lostpointercapture",Cn,!0),e.document.removeEventListener("click",vn,!0),e.document.removeEventListener("dblclick",Rn,!0),e.removeEventListener("scroll",Tn),e.removeEventListener("resize",ne),e.removeEventListener("blur",xn),e.document.removeEventListener("load",ne,!0),N.removeEventListener("pointerleave",Ot,!0),it?.removeEventListener?.("resize",ne),it?.removeEventListener?.("scroll",ne)}},F=y=>{let S=y.detail;S?.composition?.routeId&&x(S)},V=y=>{let S=y.detail;S?.state&&P(S)},ce=y=>{let S=y.data;if(!Xn(S)||S.body.type!=="request"||S.body.kind!=="apply-node-patch"&&S.body.kind!=="get-hit-by-ref"&&S.body.kind!=="get-path-by-ref"&&S.body.kind!=="get-scroll-metrics"&&S.body.kind!=="scroll-to"&&S.body.kind!=="scroll-by"&&S.body.kind!=="set-interaction-mode"&&S.body.kind!=="set-selection-visual"&&S.body.kind!=="clear-selection-visual"&&S.body.kind!=="set-resize-visual"&&S.body.kind!=="clear-resize-visual"&&S.body.kind!=="set-theme-override"&&S.body.kind!=="clear-theme-override"&&S.body.kind!=="get-theme-variables"&&S.body.kind!=="compute-drop-target-at-point"&&S.body.kind!=="observe-node-bounds"&&S.body.kind!=="clear-node-bounds-observer"&&S.body.kind!=="restore-text-edit"&&S.body.kind!=="clear-text-edit-rollback"&&S.body.kind!=="start-text-edit-at-point"&&S.body.kind!=="hit-test-at-point"&&!sr(S.body))return;let m=S.body,q=typeof S.sessionKey=="string"?S.sessionKey:null,j=y.source,ie=y.origin;if(!q||!ie||!j||typeof j.postMessage!="function"||!g(q,j))return;if(u){if(u.sourceWindow!==j||u.targetOrigin!==ie)return;u.sessionKey!==q&&(B(),D(),te(),u=null)}Z(q,j,ie),z(),T();let R=Q=>{let ae=typeof m.id=="string"?m.id:"unknown";j.postMessage(Ge({id:ae,...Q},{sessionKey:q}),ie)};try{if(sr(m)){Vi({message:m,sendEvent:N=>{j.postMessage(Ge({type:"event",...N},{sessionKey:q}),ie)},sendResponse:R,subscriptions:I,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,nextRouteReadySequence:()=>A+=1,windowLike:e});return}if(m.kind==="apply-node-patch"){let N=ye(e.document,m.payload.ref,t.getCurrentDocument?.()??null);if(!N){R({type:"response",ok:!1,error:"No editable element found for patch target"});return}let w=m.payload.preview,re=w?ks(w.sessionId,m.payload.ref):null;if(re&&w){let be=Ye.get(re)??-1;if(w.revision<be){R({type:"response",ok:!0,result:{applied:!1,appliedRevision:w.revision,stale:!0,latestRevision:be}});return}if(w.revision===be){R({type:"response",ok:!0,result:{applied:!1,appliedRevision:w.revision,duplicate:!0,latestRevision:be}});return}}if(Ps(N,m.payload.patch),re&&w&&Ds(re,w.revision),w?.responseDetail==="none"){R({type:"response",ok:!0,result:{applied:!0,appliedRevision:w.revision}});return}R({type:"response",ok:!0,result:me(N,ge(e.document,N,t.getCurrentDocument?.()??null),t.getDocumentEntry,w?.responseDetail??"full")});return}if(m.kind==="get-hit-by-ref"){let N=ye(e.document,m.payload.ref,t.getCurrentDocument?.()??null);if(!N){R({type:"response",ok:!1,error:"No editable element found for hit target"});return}R({type:"response",ok:!0,result:me(N,ge(e.document,N,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(m.kind==="get-path-by-ref"){let N=ye(e.document,m.payload.ref,t.getCurrentDocument?.()??null);if(!N){R({type:"response",ok:!1,error:"No editable element found for path target"});return}let w=[],re=N;for(;re;)re.getAttribute("data-vcp-edit-key")&&w.push(me(re,ge(e.document,re,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),re=re.parentElement;R({type:"response",ok:!0,result:w.reverse()});return}if(m.kind==="restore-text-edit"||m.kind==="clear-text-edit-rollback"){let N=m.payload.ref;if(m.kind==="clear-text-edit-rollback"){r&&ar(r.ref,N)&&(r=null),R({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!ar(r.ref,N)){R({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let w=Ji(e.document,r,t.getCurrentDocument?.()??null);r=null,R(w?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(m.kind==="get-scroll-metrics"){R({type:"response",ok:!0,result:yt(e)});return}if(m.kind==="scroll-to"){let N=Number(m.payload.x),w=Number(m.payload.y);if(!Number.isFinite(N)||!Number.isFinite(w)){R({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:N,top:w}),R({type:"response",ok:!0,result:yt(e)});return}if(m.kind==="scroll-by"){let N=Number(m.payload.deltaX),w=Number(m.payload.deltaY);if(!Number.isFinite(N)||!Number.isFinite(w)){R({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:N,top:w}),R({type:"response",ok:!0,result:{...yt(e),scrolled:!0}});return}if(m.kind==="set-interaction-mode"){m.payload.enabled?O(q,j,ie):u?.sourceWindow===j&&u.targetOrigin===ie&&u.sessionKey===q&&D(),R({type:"response",ok:!0,result:{interactionEnabled:m.payload.enabled}});return}if(m.kind==="set-selection-visual"){s?.(),s=null,i&&(s=Ti(e,m.payload.ref,t.getCurrentDocument)),R({type:"response",ok:!0,result:{version:$e,active:!!s}});return}if(m.kind==="clear-selection-visual"){s?.(),s=null,R({type:"response",ok:!0,result:{version:$e,active:!1}});return}if(m.kind==="set-resize-visual"){c?.cleanup(),c=null,i&&(c=Mi(e,m.payload.ref,t.getCurrentDocument)),R({type:"response",ok:!0,result:{version:Ue,active:!!c}});return}if(m.kind==="clear-resize-visual"){c?.cleanup(),c=null,R({type:"response",ok:!0,result:{version:Ue,active:!1}});return}if(m.kind==="set-theme-override"){Bs(e.document,m.payload),R({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(m.kind==="clear-theme-override"){ws(e.document),R({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(m.kind==="get-theme-variables"){R({type:"response",ok:!0,result:Os(e.document,m.payload.names)});return}if(m.kind==="compute-drop-target-at-point"){let N=Number(m.payload?.x),w=Number(m.payload?.y);if(!Number.isFinite(N)||!Number.isFinite(w)){R({type:"response",ok:!1,error:"Invalid drop target point"});return}R({type:"response",ok:!0,result:vs(e,N,w,m.payload.dragKind,m.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(m.kind==="observe-node-bounds"){let N=m.payload.ref;if(!N){R({type:"response",ok:!1,error:"Missing bounds observer target"});return}let w=ye(e.document,N,t.getCurrentDocument?.()??null);if(!w){R({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=ys(e,w,N,t.getCurrentDocument,(re,be,Be)=>{a+=1,U({kind:"geometry-batch",payload:{sequence:a,sourceEventAt:Be.sourceEventAt,captureStartedAt:Be.captureStartedAt,capturedAt:Be.capturedAt,reason:re,snapshots:[be]}})}),R({type:"response",ok:!0,result:{observing:!0}}),U({kind:"node-bounds-change",payload:{hit:me(w,N,t.getDocumentEntry,"summary",e)}});return}if(m.kind==="clear-node-bounds-observer"){o?.(),o=null,R({type:"response",ok:!0,result:{cleared:!0}});return}if(m.kind!=="hit-test-at-point"&&m.kind!=="start-text-edit-at-point")return;let Q=Number(m.payload?.x),ae=Number(m.payload?.y);if(!Number.isFinite(Q)||!Number.isFinite(ae)){R({type:"response",ok:!1,error:"Invalid text edit point"});return}let de=m.kind==="hit-test-at-point"?Qe(e.document,Q,ae,t.getCurrentDocument?.()??null):Zi(e.document,Q,ae,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!de){R({type:"response",ok:!1,error:m.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let pe=m.kind==="start-text-edit-at-point"?de:null,xe=m.kind==="hit-test-at-point"?de:pe.element,ot=m.payload.detailLevel??"full",Ke=ot==="full"?ge(e.document,xe,t.getCurrentDocument?.()??null):vt(e.document,xe,t.getCurrentDocument?.()??null),ne=pe&&typeof pe.textSegmentIndex=="number"?{...Ke,textSegmentIndex:pe.textSegmentIndex}:Ke,Te=me(xe,ne,t.getDocumentEntry,ot);if(m.kind==="hit-test-at-point"){R({type:"response",ok:!0,result:Te});return}B(),n=qs(e,xe,ne,N=>{j.postMessage(Ge({type:"event",...N},{sessionKey:q}),ie)},{...pe?.textNode?{textNode:pe.textNode}:{},onCommitSnapshot:N=>{r=N}}),R({type:"response",ok:!0,result:{ref:ne}})}catch(Q){R({type:"response",ok:!1,error:Q instanceof Error?Q.message:"Failed to start text edit"})}};return e.addEventListener("message",ce),e.addEventListener(en,F),e.addEventListener(tn,V),()=>{B(),D(),u=null,te(),e.removeEventListener("message",ce),e.removeEventListener(en,F),e.removeEventListener(tn,V)}}function Ri(e,t){let n=e.document,r=n.head??n.documentElement;if(typeof r?.appendChild!="function")return null;let i="data-vcp-designer-hover-visual",o="data-vcp-designer-selection-visual",s=n.createElement("style");s.setAttribute("data-vcp-designer-hover-visual-style","true"),s.textContent=`
|
|
2
2
|
[${i}="true"]:not([${o}="true"]) {
|
|
3
3
|
outline: 1px dashed #4f6bff !important;
|
|
4
4
|
outline-offset: -1px !important;
|
|
5
|
-
}`,r.appendChild(s);let c=null,a=()=>{c?.removeAttribute(i),c=null},u=
|
|
5
|
+
}`,r.appendChild(s);let c=null,a=()=>{c?.removeAttribute(i),c=null},u=f=>{let E=un(f),A=E?.getAttribute("data-vcp-edit-key")??"",I=E&&Ar(E,t?.()??null,A)?E:null;return I===c||(a(),c=I,c?.setAttribute(i,"true")),!0};return{clear:a,cleanup:()=>{a(),s.remove()},update:u,updateAtPoint:(f,E)=>u(Qe(n,f,E,t?.()??null))}}var xi=0;function Ti(e,t,n){let r=e.document,i=r.head??r.documentElement,o=++xi,s=`--vcp-designer-spacing-target-${o}`,c=`--vcp-designer-spacing-gap-${o}`,a=typeof e.CSS?.supports=="function"&&e.CSS.supports(`anchor-name: ${s}`)&&e.CSS.supports(`position-anchor: ${s}`)&&e.CSS.supports("left: anchor(left)")&&e.CSS.supports("width: anchor-size(width)"),u=()=>ye(r,t,n?.()??null),l=u();if(!l||!l.isConnected||typeof i?.appendChild!="function")return null;let d="data-vcp-designer-selection-visual",f=r.createElement("style");f.setAttribute("data-vcp-designer-selection-visual-style","true"),f.textContent=`
|
|
6
6
|
[${d}="true"] {
|
|
7
7
|
outline: 2px solid #4f6bff !important;
|
|
8
8
|
outline-offset: -2px !important;
|
|
9
|
-
}`,i.appendChild(h);let E=r.createElement("div");E.setAttribute("data-vcp-designer-spacing-visual-layer","true"),E.setAttribute("aria-hidden","true"),E.style.setProperty("position","fixed","important"),E.style.setProperty("inset","0","important"),E.style.setProperty("overflow","hidden","important"),E.style.setProperty("pointer-events","none","important"),E.style.setProperty("z-index","2147483645","important"),r.documentElement.appendChild(E),l.setAttribute(d,"true");let N=a?St(l,s):null,C=!1,_=null,B=[],D=[],Z=()=>{_=null,D.forEach(T=>T()),D=Ti(E,B,l,a?s:null,c)},g=()=>{C||_!==null||(_=Et(e,Z))};Z();let te=()=>{if(C)return;let T=u();T===l&&T?.isConnected||(l?.removeAttribute(d),N?.(),N=null,l=T,l?.isConnected&&(l.setAttribute(d,"true"),N=a?St(l,s):null),$(),g())},L=e.ResizeObserver,W=typeof L=="function"?new L(g):null,ee=[];function $(){ee.forEach(T=>W?.unobserve(T)),ee=l?.isConnected?[l,...Array.from(l.children)].filter(T=>typeof T.getBoundingClientRect=="function"):[],ee.forEach(T=>W?.observe(T))}$();let H=e.MutationObserver,x=typeof H=="function"?new H(T=>{let z=l;te();let U=z!==l,f=T.some(v=>v.type!=="attributes"||v.attributeName!=="class"&&v.attributeName!=="style"?!1:v.target===l?!0:l?.contains?.(v.target)===!0&&v.target!==E);!U&&!f||($(),g())}):null;return x?.observe(r.documentElement,{attributeFilter:["data-vcp-edit-key","class","style"],attributes:!0,childList:!0,subtree:!0}),a||(e.addEventListener("scroll",g,!0),r.addEventListener("scroll",g,!0)),e.addEventListener("resize",g),()=>{C||(C=!0,_!==null&&(It(e,_),_=null),e.removeEventListener("scroll",g,!0),r.removeEventListener("scroll",g,!0),e.removeEventListener("resize",g),x?.disconnect(),W?.disconnect(),l?.removeAttribute(d),D.forEach(T=>T()),D=[],N?.(),N=null,l=null,E.remove(),h.remove())}}function Ti(e,t,n,r,i){if(n?.isConnected===!0&&r)return _i(e,t,n,r,i);let o=n?.isConnected===!0?Ai(n):[];return o.forEach((s,c)=>{let a=t[c]??e.ownerDocument.createElement("div");t[c]||(a.style.setProperty("position","fixed","important"),a.style.setProperty("pointer-events","none","important"),e.appendChild(a),t[c]=a),a.setAttribute("data-vcp-designer-spacing-kind",s.kind),a.style.setProperty("background",s.kind==="margin"?"rgba(245, 158, 11, 0.24)":s.kind==="padding"?"rgba(56, 189, 248, 0.22)":"rgba(34, 197, 94, 0.22)","important"),a.style.setProperty("display","block","important"),a.style.setProperty("left",`${s.left}px`,"important"),a.style.setProperty("top",`${s.top}px`,"important"),a.style.setProperty("width",`${s.width}px`,"important"),a.style.setProperty("height",`${s.height}px`,"important")}),t.slice(o.length).forEach(s=>{s.style.setProperty("display","none","important")}),[]}function _i(e,t,n,r,i){let o=_t(n),s=[{kind:"margin",left:"anchor(left)",top:`calc(anchor(top) - ${o.marginTop}px)`,width:"anchor-size(width)",height:`${o.marginTop}px`},{kind:"margin",left:"anchor(right)",top:"anchor(top)",width:`${o.marginRight}px`,height:"anchor-size(height)"},{kind:"margin",left:"anchor(left)",top:"anchor(bottom)",width:"anchor-size(width)",height:`${o.marginBottom}px`},{kind:"margin",left:`calc(anchor(left) - ${o.marginLeft}px)`,top:"anchor(top)",width:`${o.marginLeft}px`,height:"anchor-size(height)"},{kind:"padding",left:`calc(anchor(left) + ${o.borderLeftWidth}px)`,top:`calc(anchor(top) + ${o.borderTopWidth}px)`,width:`calc(anchor-size(width) - ${o.borderLeftWidth+o.borderRightWidth}px)`,height:`${o.paddingTop}px`},{kind:"padding",left:`calc(anchor(right) - ${o.borderRightWidth+o.paddingRight}px)`,top:`calc(anchor(top) + ${o.borderTopWidth+o.paddingTop}px)`,width:`${o.paddingRight}px`,height:`calc(anchor-size(height) - ${o.borderTopWidth+o.borderBottomWidth+o.paddingTop+o.paddingBottom}px)`},{kind:"padding",left:`calc(anchor(left) + ${o.borderLeftWidth}px)`,top:`calc(anchor(bottom) - ${o.borderBottomWidth+o.paddingBottom}px)`,width:`calc(anchor-size(width) - ${o.borderLeftWidth+o.borderRightWidth}px)`,height:`${o.paddingBottom}px`},{kind:"padding",left:`calc(anchor(left) + ${o.borderLeftWidth}px)`,top:`calc(anchor(top) + ${o.borderTopWidth+o.paddingTop}px)`,width:`${o.paddingLeft}px`,height:`calc(anchor-size(height) - ${o.borderTopWidth+o.borderBottomWidth+o.paddingTop+o.paddingBottom}px)`}];s.forEach((u,l)=>{let d=Zn(e,t,l);d.setAttribute("data-vcp-designer-spacing-kind",u.kind),d.style.setProperty("position-anchor",r,"important"),d.style.setProperty("left",u.left,"important"),d.style.setProperty("top",u.top,"important"),d.style.setProperty("width",u.width,"important"),d.style.setProperty("height",u.height,"important"),d.style.setProperty("background",u.kind==="margin"?"rgba(245, 158, 11, 0.24)":"rgba(56, 189, 248, 0.22)","important");let h=u.kind==="margin"?[o.marginTop,o.marginRight,o.marginBottom,o.marginLeft][l]:[o.paddingTop,o.paddingRight,o.paddingBottom,o.paddingLeft][l-4];d.style.setProperty("display",(h??0)>.5?"block":"none","important")});let c=ki(n,o),a=c.map((u,l)=>{let d=Zn(e,t,s.length+l),h=`${i}-${l}`,E=St(u.anchorElement,h);return d.setAttribute("data-vcp-designer-spacing-kind","gap"),d.style.setProperty("position-anchor",h,"important"),d.style.setProperty("background","rgba(34, 197, 94, 0.22)","important"),d.style.setProperty("display","block","important"),d.style.setProperty("left",`calc(anchor(left) + ${u.leftOffset}px)`,"important"),d.style.setProperty("top",`calc(anchor(top) + ${u.topOffset}px)`,"important"),d.style.setProperty("width",`${u.width}px`,"important"),d.style.setProperty("height",`${u.height}px`,"important"),E});return t.slice(s.length+c.length).forEach(u=>{u.style.setProperty("display","none","important")}),a}function Zn(e,t,n){let r=t[n];if(r)return r;let i=e.ownerDocument.createElement("div");return i.style.setProperty("position","fixed","important"),i.style.setProperty("pointer-events","none","important"),e.appendChild(i),t[n]=i,i}function Ai(e){let t=Ne(e.getBoundingClientRect()),n=_t(e),r=t.left+n.borderLeftWidth,i=t.top+n.borderTopWidth,o=t.width-n.borderLeftWidth-n.borderRightWidth,s=t.height-n.borderTopWidth-n.borderBottomWidth,c=i+n.paddingTop,a=s-n.paddingTop-n.paddingBottom,u=[{kind:"margin",left:t.left,top:t.top-n.marginTop,width:t.width,height:n.marginTop},{kind:"margin",left:t.left+t.width,top:t.top,width:n.marginRight,height:t.height},{kind:"margin",left:t.left,top:t.top+t.height,width:t.width,height:n.marginBottom},{kind:"margin",left:t.left-n.marginLeft,top:t.top,width:n.marginLeft,height:t.height}];return o>0&&s>0&&u.push({kind:"padding",left:r,top:i,width:o,height:n.paddingTop},{kind:"padding",left:r+o-n.paddingRight,top:c,width:n.paddingRight,height:a},{kind:"padding",left:r,top:i+s-n.paddingBottom,width:o,height:n.paddingBottom},{kind:"padding",left:r,top:c,width:n.paddingLeft,height:a}),u.push(...Pi(e,n)),u.filter(l=>l.width>.5&&l.height>.5)}function Pi(e,t){let n=e.ownerDocument?.defaultView?.getComputedStyle(e).display??"";if(!["flex","inline-flex","grid","inline-grid"].includes(n)||t.columnGap<=0&&t.rowGap<=0)return[];let r=dn(e);return[...tr(r,"horizontal",t.columnGap),...tr(r,"vertical",t.rowGap)]}function ki(e,t){let n=e.ownerDocument?.defaultView?.getComputedStyle(e).display??"";if(!["flex","inline-flex","grid","inline-grid"].includes(n)||t.columnGap<=0&&t.rowGap<=0)return[];let r=e.ownerDocument?.defaultView,i=Array.from(e.children).filter(o=>typeof o.getBoundingClientRect=="function").map(o=>({element:o,rect:Ne(o.getBoundingClientRect()),margin:ln(r?.getComputedStyle(o))})).filter(({rect:o})=>o.width>0&&o.height>0);return[...er(i,"horizontal",t.columnGap),...er(i,"vertical",t.rowGap)].filter(o=>o.width>.5&&o.height>.5)}function er(e,t,n){if(n<=0||e.length<2)return[];let r=yr(e,t==="horizontal"?"y":"x"),i=[];return r.forEach(o=>{let s=[...o].sort((c,a)=>t==="horizontal"?c.rect.left-a.rect.left:c.rect.top-a.rect.top);for(let c=0;c<s.length-1;c+=1){let a=s[c],u=s[c+1];if(t==="horizontal"){let l=a.rect.left+a.rect.width+a.margin.marginRight,d=u.rect.left-u.margin.marginLeft-l,h=Math.min(n,d);i.push({anchorElement:a.element,leftOffset:l+Math.max(0,(d-h)/2)-a.rect.left,topOffset:Math.max(a.rect.top,u.rect.top)-a.rect.top,width:h,height:Math.min(a.rect.top+a.rect.height,u.rect.top+u.rect.height)-Math.max(a.rect.top,u.rect.top)})}else{let l=a.rect.top+a.rect.height+a.margin.marginBottom,d=u.rect.top-u.margin.marginTop-l,h=Math.min(n,d);i.push({anchorElement:a.element,leftOffset:Math.max(a.rect.left,u.rect.left)-a.rect.left,topOffset:l+Math.max(0,(d-h)/2)-a.rect.top,width:Math.min(a.rect.left+a.rect.width,u.rect.left+u.rect.width)-Math.max(a.rect.left,u.rect.left),height:h})}}}),i}function tr(e,t,n){if(n<=0||e.length<2)return[];let r=yr(e,t==="horizontal"?"y":"x"),i=[];return r.forEach(o=>{let s=[...o].sort((c,a)=>t==="horizontal"?c.rect.left-a.rect.left:c.rect.top-a.rect.top);for(let c=0;c<s.length-1;c+=1){let a=s[c],u=s[c+1];if(t==="horizontal"){let l=a.rect.left+a.rect.width+a.margin.marginRight,d=u.rect.left-u.margin.marginLeft-l,h=Math.min(n,d);i.push({kind:"gap",left:l+Math.max(0,(d-h)/2),top:Math.max(a.rect.top,u.rect.top),width:h,height:Math.min(a.rect.top+a.rect.height,u.rect.top+u.rect.height)-Math.max(a.rect.top,u.rect.top)})}else{let l=a.rect.top+a.rect.height+a.margin.marginBottom,d=u.rect.top-u.margin.marginTop-l,h=Math.min(n,d);i.push({kind:"gap",left:Math.max(a.rect.left,u.rect.left),top:l+Math.max(0,(d-h)/2),width:Math.min(a.rect.left+a.rect.width,u.rect.left+u.rect.width)-Math.max(a.rect.left,u.rect.left),height:h})}}}),i}function yr(e,t){let n=[...e].sort((i,o)=>t==="x"?i.rect.left-o.rect.left||i.rect.top-o.rect.top:i.rect.top-o.rect.top||i.rect.left-o.rect.left),r=[];return n.forEach(i=>{let o=r.find(s=>s.some(c=>Ni(c.rect,i.rect,t)>.5));o?o.push(i):r.push([i])}),r}function Ni(e,t,n){return n==="x"?Math.min(e.left+e.width,t.left+t.width)-Math.max(e.left,t.left):Math.min(e.top+e.height,t.top+t.height)-Math.max(e.top,t.top)}var ft=new WeakMap;function St(e,t){let n=ft.get(e);if(!n){let i=e.style.getPropertyValue("anchor-name"),o=e.ownerDocument?.defaultView?.getComputedStyle(e).getPropertyValue?.("anchor-name").trim()??"";n={names:new Set,originalValue:i,originalPriority:e.style.getPropertyPriority("anchor-name"),computedValue:o==="none"?"":o},ft.set(e,n)}n.names.add(t),nr(e,n);let r=!1;return()=>{if(r)return;r=!0;let i=ft.get(e);if(i){if(i.names.delete(t),i.names.size>0){nr(e,i);return}i.originalValue?e.style.setProperty("anchor-name",i.originalValue,i.originalPriority):e.style.removeProperty("anchor-name"),ft.delete(e)}}}function nr(e,t){let n=t.originalValue.trim()||t.computedValue;e.style.setProperty("anchor-name",[...n?[n]:[],...t.names].join(", "),"important")}var Di=["e","se","s"],Bi=0;function wi(e){let t=e,i=(t?.getAttribute?.("data-vcp-designer-resize-handle")?t:t?.closest?.("[data-vcp-designer-resize-handle]"))?.getAttribute?.("data-vcp-designer-resize-handle");return i==="e"||i==="s"||i==="se"?i:void 0}function Oi(e,t,n){let r=++Bi,i=`--vcp-designer-resize-target-${r}`,o=e.CSS;if(typeof o?.supports!="function"||!o.supports(`anchor-name: ${i}`)||!o.supports(`position-anchor: ${i}`)||!o.supports("left: anchor(left)")||!o.supports("top: anchor(top)"))return null;let s=e.document,c=s.head??s.documentElement,a=s.body??s.documentElement,u=()=>ye(s,t,n?.()??null),l=u();if(!l||!l.isConnected||typeof c?.appendChild!="function"||typeof a?.appendChild!="function")return null;let d="data-vcp-designer-resize-visual",h="data-vcp-designer-resize-handle",E=s.createElement("style");E.setAttribute("data-vcp-designer-resize-visual-style","true"),E.textContent=`
|
|
10
|
-
[${
|
|
9
|
+
}`,i.appendChild(f);let E=r.createElement("div");E.setAttribute("data-vcp-designer-spacing-visual-layer","true"),E.setAttribute("aria-hidden","true"),E.style.setProperty("position","fixed","important"),E.style.setProperty("inset","0","important"),E.style.setProperty("overflow","hidden","important"),E.style.setProperty("pointer-events","none","important"),E.style.setProperty("z-index","2147483645","important"),r.documentElement.appendChild(E),l.setAttribute(d,"true");let A=a?St(l,s):null,I=!1,_=null,B=[],D=[],Z=()=>{_=null,D.forEach(T=>T()),D=_i(E,B,l,a?s:null,c)},g=()=>{I||_!==null||(_=Et(e,Z))};Z();let te=()=>{if(I)return;let T=u();T===l&&T?.isConnected||(l?.removeAttribute(d),A?.(),A=null,l=T,l?.isConnected&&(l.setAttribute(d,"true"),A=a?St(l,s):null),H(),g())},L=e.ResizeObserver,W=typeof L=="function"?new L(g):null,ee=[];function H(){ee.forEach(T=>W?.unobserve(T)),ee=l?.isConnected?[l,...Array.from(l.children)].filter(T=>typeof T.getBoundingClientRect=="function"):[],ee.forEach(T=>W?.observe(T))}H();let $=e.MutationObserver,x=typeof $=="function"?new $(T=>{let z=l;te();let U=z!==l,h=T.some(v=>v.type!=="attributes"||v.attributeName!=="class"&&v.attributeName!=="style"?!1:v.target===l?!0:l?.contains?.(v.target)===!0&&v.target!==E);!U&&!h||(H(),g())}):null;return x?.observe(r.documentElement,{attributeFilter:["data-vcp-edit-key","class","style"],attributes:!0,childList:!0,subtree:!0}),a||(e.addEventListener("scroll",g,!0),r.addEventListener("scroll",g,!0)),e.addEventListener("resize",g),()=>{I||(I=!0,_!==null&&(It(e,_),_=null),e.removeEventListener("scroll",g,!0),r.removeEventListener("scroll",g,!0),e.removeEventListener("resize",g),x?.disconnect(),W?.disconnect(),l?.removeAttribute(d),D.forEach(T=>T()),D=[],A?.(),A=null,l=null,E.remove(),f.remove())}}function _i(e,t,n,r,i){if(n?.isConnected===!0&&r)return Ai(e,t,n,r,i);let o=n?.isConnected===!0?Pi(n):[];return o.forEach((s,c)=>{let a=t[c]??e.ownerDocument.createElement("div");t[c]||(a.style.setProperty("position","fixed","important"),a.style.setProperty("pointer-events","none","important"),e.appendChild(a),t[c]=a),a.setAttribute("data-vcp-designer-spacing-kind",s.kind),a.style.setProperty("background",s.kind==="margin"?"rgba(245, 158, 11, 0.24)":s.kind==="padding"?"rgba(56, 189, 248, 0.22)":"rgba(34, 197, 94, 0.22)","important"),a.style.setProperty("display","block","important"),a.style.setProperty("left",`${s.left}px`,"important"),a.style.setProperty("top",`${s.top}px`,"important"),a.style.setProperty("width",`${s.width}px`,"important"),a.style.setProperty("height",`${s.height}px`,"important")}),t.slice(o.length).forEach(s=>{s.style.setProperty("display","none","important")}),[]}function Ai(e,t,n,r,i){let o=_t(n),s=[{kind:"margin",left:"anchor(left)",top:`calc(anchor(top) - ${o.marginTop}px)`,width:"anchor-size(width)",height:`${o.marginTop}px`},{kind:"margin",left:"anchor(right)",top:"anchor(top)",width:`${o.marginRight}px`,height:"anchor-size(height)"},{kind:"margin",left:"anchor(left)",top:"anchor(bottom)",width:"anchor-size(width)",height:`${o.marginBottom}px`},{kind:"margin",left:`calc(anchor(left) - ${o.marginLeft}px)`,top:"anchor(top)",width:`${o.marginLeft}px`,height:"anchor-size(height)"},{kind:"padding",left:`calc(anchor(left) + ${o.borderLeftWidth}px)`,top:`calc(anchor(top) + ${o.borderTopWidth}px)`,width:`calc(anchor-size(width) - ${o.borderLeftWidth+o.borderRightWidth}px)`,height:`${o.paddingTop}px`},{kind:"padding",left:`calc(anchor(right) - ${o.borderRightWidth+o.paddingRight}px)`,top:`calc(anchor(top) + ${o.borderTopWidth+o.paddingTop}px)`,width:`${o.paddingRight}px`,height:`calc(anchor-size(height) - ${o.borderTopWidth+o.borderBottomWidth+o.paddingTop+o.paddingBottom}px)`},{kind:"padding",left:`calc(anchor(left) + ${o.borderLeftWidth}px)`,top:`calc(anchor(bottom) - ${o.borderBottomWidth+o.paddingBottom}px)`,width:`calc(anchor-size(width) - ${o.borderLeftWidth+o.borderRightWidth}px)`,height:`${o.paddingBottom}px`},{kind:"padding",left:`calc(anchor(left) + ${o.borderLeftWidth}px)`,top:`calc(anchor(top) + ${o.borderTopWidth+o.paddingTop}px)`,width:`${o.paddingLeft}px`,height:`calc(anchor-size(height) - ${o.borderTopWidth+o.borderBottomWidth+o.paddingTop+o.paddingBottom}px)`}];s.forEach((u,l)=>{let d=nr(e,t,l);d.setAttribute("data-vcp-designer-spacing-kind",u.kind),d.style.setProperty("position-anchor",r,"important"),d.style.setProperty("left",u.left,"important"),d.style.setProperty("top",u.top,"important"),d.style.setProperty("width",u.width,"important"),d.style.setProperty("height",u.height,"important"),d.style.setProperty("background",u.kind==="margin"?"rgba(245, 158, 11, 0.24)":"rgba(56, 189, 248, 0.22)","important");let f=u.kind==="margin"?[o.marginTop,o.marginRight,o.marginBottom,o.marginLeft][l]:[o.paddingTop,o.paddingRight,o.paddingBottom,o.paddingLeft][l-4];d.style.setProperty("display",(f??0)>.5?"block":"none","important")});let c=ki(n,o),a=c.map((u,l)=>{let d=nr(e,t,s.length+l),f=`${i}-${l}`,E=St(u.anchorElement,f);return d.setAttribute("data-vcp-designer-spacing-kind","gap"),d.style.setProperty("position-anchor",f,"important"),d.style.setProperty("background","rgba(34, 197, 94, 0.22)","important"),d.style.setProperty("display","block","important"),d.style.setProperty("left",`calc(anchor(left) + ${u.leftOffset}px)`,"important"),d.style.setProperty("top",`calc(anchor(top) + ${u.topOffset}px)`,"important"),d.style.setProperty("width",`${u.width}px`,"important"),d.style.setProperty("height",`${u.height}px`,"important"),E});return t.slice(s.length+c.length).forEach(u=>{u.style.setProperty("display","none","important")}),a}function nr(e,t,n){let r=t[n];if(r)return r;let i=e.ownerDocument.createElement("div");return i.style.setProperty("position","fixed","important"),i.style.setProperty("pointer-events","none","important"),e.appendChild(i),t[n]=i,i}function Pi(e){let t=ke(e.getBoundingClientRect()),n=_t(e),r=t.left+n.borderLeftWidth,i=t.top+n.borderTopWidth,o=t.width-n.borderLeftWidth-n.borderRightWidth,s=t.height-n.borderTopWidth-n.borderBottomWidth,c=i+n.paddingTop,a=s-n.paddingTop-n.paddingBottom,u=[{kind:"margin",left:t.left,top:t.top-n.marginTop,width:t.width,height:n.marginTop},{kind:"margin",left:t.left+t.width,top:t.top,width:n.marginRight,height:t.height},{kind:"margin",left:t.left,top:t.top+t.height,width:t.width,height:n.marginBottom},{kind:"margin",left:t.left-n.marginLeft,top:t.top,width:n.marginLeft,height:t.height}];return o>0&&s>0&&u.push({kind:"padding",left:r,top:i,width:o,height:n.paddingTop},{kind:"padding",left:r+o-n.paddingRight,top:c,width:n.paddingRight,height:a},{kind:"padding",left:r,top:i+s-n.paddingBottom,width:o,height:n.paddingBottom},{kind:"padding",left:r,top:c,width:n.paddingLeft,height:a}),u.push(...Ni(e,n)),u.filter(l=>l.width>.5&&l.height>.5)}function Ni(e,t){let n=e.ownerDocument?.defaultView?.getComputedStyle(e).display??"";if(!["flex","inline-flex","grid","inline-grid"].includes(n)||t.columnGap<=0&&t.rowGap<=0)return[];let r=pn(e);return[...or(r,"horizontal",t.columnGap),...or(r,"vertical",t.rowGap)]}function ki(e,t){let n=e.ownerDocument?.defaultView?.getComputedStyle(e).display??"";if(!["flex","inline-flex","grid","inline-grid"].includes(n)||t.columnGap<=0&&t.rowGap<=0)return[];let r=e.ownerDocument?.defaultView,i=Array.from(e.children).filter(o=>typeof o.getBoundingClientRect=="function").map(o=>({element:o,rect:ke(o.getBoundingClientRect()),margin:dn(r?.getComputedStyle(o))})).filter(({rect:o})=>o.width>0&&o.height>0);return[...rr(i,"horizontal",t.columnGap),...rr(i,"vertical",t.rowGap)].filter(o=>o.width>.5&&o.height>.5)}function rr(e,t,n){if(n<=0||e.length<2)return[];let r=Er(e,t==="horizontal"?"y":"x"),i=[];return r.forEach(o=>{let s=[...o].sort((c,a)=>t==="horizontal"?c.rect.left-a.rect.left:c.rect.top-a.rect.top);for(let c=0;c<s.length-1;c+=1){let a=s[c],u=s[c+1];if(t==="horizontal"){let l=a.rect.left+a.rect.width+a.margin.marginRight,d=u.rect.left-u.margin.marginLeft-l,f=Math.min(n,d);i.push({anchorElement:a.element,leftOffset:l+Math.max(0,(d-f)/2)-a.rect.left,topOffset:Math.max(a.rect.top,u.rect.top)-a.rect.top,width:f,height:Math.min(a.rect.top+a.rect.height,u.rect.top+u.rect.height)-Math.max(a.rect.top,u.rect.top)})}else{let l=a.rect.top+a.rect.height+a.margin.marginBottom,d=u.rect.top-u.margin.marginTop-l,f=Math.min(n,d);i.push({anchorElement:a.element,leftOffset:Math.max(a.rect.left,u.rect.left)-a.rect.left,topOffset:l+Math.max(0,(d-f)/2)-a.rect.top,width:Math.min(a.rect.left+a.rect.width,u.rect.left+u.rect.width)-Math.max(a.rect.left,u.rect.left),height:f})}}}),i}function or(e,t,n){if(n<=0||e.length<2)return[];let r=Er(e,t==="horizontal"?"y":"x"),i=[];return r.forEach(o=>{let s=[...o].sort((c,a)=>t==="horizontal"?c.rect.left-a.rect.left:c.rect.top-a.rect.top);for(let c=0;c<s.length-1;c+=1){let a=s[c],u=s[c+1];if(t==="horizontal"){let l=a.rect.left+a.rect.width+a.margin.marginRight,d=u.rect.left-u.margin.marginLeft-l,f=Math.min(n,d);i.push({kind:"gap",left:l+Math.max(0,(d-f)/2),top:Math.max(a.rect.top,u.rect.top),width:f,height:Math.min(a.rect.top+a.rect.height,u.rect.top+u.rect.height)-Math.max(a.rect.top,u.rect.top)})}else{let l=a.rect.top+a.rect.height+a.margin.marginBottom,d=u.rect.top-u.margin.marginTop-l,f=Math.min(n,d);i.push({kind:"gap",left:Math.max(a.rect.left,u.rect.left),top:l+Math.max(0,(d-f)/2),width:Math.min(a.rect.left+a.rect.width,u.rect.left+u.rect.width)-Math.max(a.rect.left,u.rect.left),height:f})}}}),i}function Er(e,t){let n=[...e].sort((i,o)=>t==="x"?i.rect.left-o.rect.left||i.rect.top-o.rect.top:i.rect.top-o.rect.top||i.rect.left-o.rect.left),r=[];return n.forEach(i=>{let o=r.find(s=>s.some(c=>Di(c.rect,i.rect,t)>.5));o?o.push(i):r.push([i])}),r}function Di(e,t,n){return n==="x"?Math.min(e.left+e.width,t.left+t.width)-Math.max(e.left,t.left):Math.min(e.top+e.height,t.top+t.height)-Math.max(e.top,t.top)}var ht=new WeakMap;function St(e,t){let n=ht.get(e);if(!n){let i=e.style.getPropertyValue("anchor-name"),o=e.ownerDocument?.defaultView?.getComputedStyle(e).getPropertyValue?.("anchor-name").trim()??"";n={names:new Set,originalValue:i,originalPriority:e.style.getPropertyPriority("anchor-name"),computedValue:o==="none"?"":o},ht.set(e,n)}n.names.add(t),ir(e,n);let r=!1;return()=>{if(r)return;r=!0;let i=ht.get(e);if(i){if(i.names.delete(t),i.names.size>0){ir(e,i);return}i.originalValue?e.style.setProperty("anchor-name",i.originalValue,i.originalPriority):e.style.removeProperty("anchor-name"),ht.delete(e)}}}function ir(e,t){let n=t.originalValue.trim()||t.computedValue;e.style.setProperty("anchor-name",[...n?[n]:[],...t.names].join(", "),"important")}var Bi=["e","se","s"],wi=0;function Oi(e){let t=e,i=(t?.getAttribute?.("data-vcp-designer-resize-handle")?t:t?.closest?.("[data-vcp-designer-resize-handle]"))?.getAttribute?.("data-vcp-designer-resize-handle");return i==="e"||i==="s"||i==="se"?i:void 0}function Mi(e,t,n){let r=++wi,i=`--vcp-designer-resize-target-${r}`,o=e.CSS;if(typeof o?.supports!="function"||!o.supports(`anchor-name: ${i}`)||!o.supports(`position-anchor: ${i}`)||!o.supports("left: anchor(left)")||!o.supports("top: anchor(top)"))return null;let s=e.document,c=s.head??s.documentElement,a=s.body??s.documentElement,u=()=>ye(s,t,n?.()??null),l=u();if(!l||!l.isConnected||typeof c?.appendChild!="function"||typeof a?.appendChild!="function")return null;let d="data-vcp-designer-resize-visual",f="data-vcp-designer-resize-handle",E=s.createElement("style");E.setAttribute("data-vcp-designer-resize-visual-style","true"),E.textContent=`
|
|
10
|
+
[${f}] {
|
|
11
11
|
position: fixed !important;
|
|
12
12
|
position-anchor: ${i};
|
|
13
13
|
z-index: 2147483646 !important;
|
|
@@ -22,15 +22,15 @@ function kn(e){let t=new Map,n=[],r=new Map,i=[],o=e.pageComposition.status==="s
|
|
|
22
22
|
pointer-events: auto !important;
|
|
23
23
|
translate: -50% -50%;
|
|
24
24
|
}
|
|
25
|
-
[${
|
|
26
|
-
[${
|
|
27
|
-
[${
|
|
28
|
-
[${
|
|
29
|
-
[${
|
|
30
|
-
[${
|
|
31
|
-
`,c.appendChild(E);let N=Di.map(x=>{let A=s.createElement("div");return A.setAttribute(h,x),A.setAttribute("aria-hidden","true"),a.appendChild(A),A}),C=null,_=null,B=()=>{C?.removeAttribute(d),_?.(),_=null,C=null},D=x=>{B(),C=x,_=St(x,i),x.setAttribute(d,"true"),N.forEach(A=>A.style.removeProperty("display"))};D(l);let Z=!1,g=null,te=()=>{if(!g||!l)return;let x=(A,T,z)=>{T?l.style.setProperty(A,T,z):l.style.removeProperty(A)};x("width",g.widthValue,g.widthPriority),x("height",g.heightValue,g.heightPriority)},L=(x,A,T)=>g?{version:1,phase:x,sessionId:g.sessionId,pointerId:g.pointerId,edge:g.edge,ref:t,startWidth:g.startWidth,startHeight:g.startHeight,width:A,height:T,baselineStyleDeclarations:[{property:"width",value:g.widthValue||null,...g.widthPriority==="important"?{priority:"important"}:{}},{property:"height",value:g.heightValue||null,...g.heightPriority==="important"?{priority:"important"}:{}}]}:null,W=x=>{if(!g||!l?.isConnected||x.pointerId!==g.pointerId)return!1;let A=Number(x.clientX)-g.startX,T=Number(x.clientY)-g.startY,z=Math.max(1,Math.round(g.startWidth+A)),U=Math.max(1,Math.round(g.startHeight+T));return(g.edge==="e"||g.edge==="se")&&l.style.setProperty("width",`${z}px`,"important"),(g.edge==="s"||g.edge==="se")&&l.style.setProperty("height",`${U}px`,"important"),!0},ee=()=>{if(Z)return;let x=u();if(x===l&&x?.isConnected)return;te();let A=g?.captureTarget,T=g?.pointerId;g=null,T!==void 0&&A?.releasePointerCapture?.(T),B(),l=x,l?.isConnected?D(l):N.forEach(z=>z.style.setProperty("display","none","important"))},$=e.MutationObserver,H=typeof $=="function"?new $(ee):null;return H?.observe(s.documentElement,{attributeFilter:["data-vcp-edit-key"],attributes:!0,childList:!0,subtree:!0}),{begin(x,A){if(Z||g||!l?.isConnected)return null;let T=l.getBoundingClientRect();return g={sessionId:`resize-${r}-${x.pointerId}`,pointerId:x.pointerId,edge:A,startX:Number(x.clientX),startY:Number(x.clientY),startWidth:T.width,startHeight:T.height,widthValue:l.style.getPropertyValue("width"),widthPriority:l.style.getPropertyPriority("width"),heightValue:l.style.getPropertyValue("height"),heightPriority:l.style.getPropertyPriority("height"),captureTarget:x.target},L("start",T.width,T.height)},update:W,finish(x,A){if(!g||x.pointerId!==g.pointerId)return null;A==="commit"&&W(x);let T=Math.max(1,Math.round(g.startWidth+Number(x.clientX)-g.startX)),z=Math.max(1,Math.round(g.startHeight+Number(x.clientY)-g.startY)),U=L(A,A==="commit"?T:g.startWidth,A==="commit"?z:g.startHeight),f=g.captureTarget,v=g.pointerId;return A==="cancel"&&te(),g=null,f?.releasePointerCapture?.(v),U},cleanup(){if(Z)return;Z=!0,H?.disconnect(),te();let x=g?.captureTarget,A=g?.pointerId;g=null,A!==void 0&&x?.releasePointerCapture?.(A),B(),l=null,N.forEach(T=>T.remove()),E.remove()}}}function rr(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 Mi(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 Fi({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,nextRouteReadySequence:c,windowLike:a}){let u=a.__VCP_SITE_EDIT__;if(!u){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 l=await u.initializeSession({composition:e.payload.composition});o?.(l.data.document),br(a,{composition:l.data.document.composition,editEngineVersion:"unknown",sequence:c(),version:l.data.document.version}),n({type:"response",ok:!0,result:l});return}case"bridge-get-document":{let l=await u.getDocument(e.payload.composition);o?.(l.data),n({type:"response",ok:!0,result:l});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await u.getHistoryStatus(e.payload.composition)});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await u.getStyleContext(e.payload.composition)});return;case"bridge-ensure-document-version":{if(!Number.isFinite(Number(e.payload.minVersion))){n({type:"response",ok:!1,error:"Invalid document version"});return}let l=u.ensureDocumentVersion?await u.ensureDocumentVersion(e.payload.composition,Number(e.payload.minVersion)):await u.getDocument(e.payload.composition);o?.(l.data),n({type:"response",ok:!0,result:l});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let l=u.acknowledgeDocumentVersion?await u.acknowledgeDocumentVersion(e.payload.composition,Number(e.payload.version)):await u.getDocument(e.payload.composition);o?.(l.data),n({type:"response",ok:!0,result:l});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await u.getObjectEditContext(e.payload.key,e.payload.composition)});return;case"bridge-get-class-name-source":{let l=await u.getClassNameSource(e.payload.key,e.payload.composition);n({type:"response",ok:!0,result:Vi(l,e.payload.key,a.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await u.getSourceTree(e.payload.composition)});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await u.getSourceFile({path:e.payload.path,composition:e.payload.composition})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await u.resolveSourceLocation({key:e.payload.key,composition:e.payload.composition})});return;case"bridge-execute":{let l=await u.execute(e.payload.request);if(l.ok&&u.acknowledgeDocumentVersion&&Mi(e.payload.request)){let d=await u.acknowledgeDocumentVersion(e.payload.composition,l.data.resultVersion);o?.(d.data)}n({type:"response",ok:!0,result:l});return}case"bridge-undo":n({type:"response",ok:!0,result:await u.undo(e.payload.composition)});return;case"bridge-redo":n({type:"response",ok:!0,result:await u.redo(e.payload.composition)});return;case"bridge-subscribe":{let l=e.payload.subscriptionId;r.get(l)?.();let d=u.subscribe(h=>{t({kind:"bridge-event",payload:{composition:h.composition,event:h,subscriptionId:l}})});r.set(l,d),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let l=e.payload.subscriptionId;r.get(l)?.(),r.delete(l),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(l){s?.(l,e),n({type:"response",ok:!1,error:Yi(l)})}}function Vi(e,t,n,r){if(!e.ok)return e;let i=ye(n,{key:t},r),o=i?qi(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function qi(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 Ki(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let u=n();u!==o&&(o=u,t())},c=()=>s(),a=()=>s();return e.history.pushState=function(...l){let d=r.apply(this,l);return s(),d},e.history.replaceState=function(...l){let d=i.apply(this,l);return s(),d},e.addEventListener("popstate",c),e.addEventListener("hashchange",a),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",c),e.removeEventListener("hashchange",a)}}function Wi(e,t){let n=e.MutationObserver;if(typeof n!="function")return()=>{};let r=or(e.document),i=new n(()=>{let o=or(e.document);o!==r&&(r=o,t())});return i.observe(e.document.documentElement,{attributes:!0,attributeFilter:[Tt,on,sn],childList:!0,subtree:!0}),()=>i.disconnect()}function or(e){let t=Array.from(e.querySelectorAll(fr)).filter(n=>n.getAttribute(Tt)===rn);return JSON.stringify(t.map(n=>[n.getAttribute(on),n.getAttribute(sn)]))}function zi(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function Et(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function It(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function br(e,t){e.dispatchEvent(new CustomEvent(Zt,{detail:t}))}function $i(e,t){e.dispatchEvent(new CustomEvent(en,{detail:t}))}function Hi(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function Ui(e,t){return oe(e.composition)===t}function ji(e){return Ze(e,"").includes(Xe)}function Gi(e){return Ze(e,"").includes(mr)}function Ze(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function Sr(e){let t=Ze(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function Yi(e){let t=Ze(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":Sr(t)?"Site edit bridge disconnected":t}function Me(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 Er(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function cn(e){return ai.has(Cr(e))}function Xi(e){return ui.has(Cr(e))}function Ir(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:Xi(e.tagName),canInsertChild:cn(e.tagName),canMove:!1,canRemove:!1}}function Cr(e){return e?.trim().toLowerCase()??""}function ir(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 Li(e,t,n){let r=ye(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=Ji(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 Ji(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Ct(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function Qi(e,t,n,r,i){let o=Qe(e,t,n,r),s=an(o);if(!s)return null;let c=s.getAttribute("data-vcp-edit-key")??"",a=ge(e,s,r),u=i?.(a.key)??i?.(c);if(!Ir({operationSummary:u?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let d=Zi(e,t,n,s);if(d){let h=ts(s,d);if(h!==null)return{element:s,textNode:d,textSegmentIndex:h}}return At(s)?null:{element:s}}function Zi(e,t,n,r){let i=es(e,t,n);return!i||i.parentElement!==r?null:i}function es(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(Ct(o))return o;let c=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return Ct(c)?c:null}function ts(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Ct(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function Ct(e){return e?.nodeType===3}function ns(e,t,n){return(typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean))[0]??null}function rs(e,t,n){let r=t;for(;r&&!r.getAttribute("data-site-block-id");)r=r.parentElement;if(!r)return null;let i=r.getAttribute("data-site-block-id")??"",o=r.getAttribute("data-vcp-edit-key")??"";return!i||!o?null:{blockId:i,ref:vt(e,r,n),rect:Ne(r.getBoundingClientRect()),targetIsSectionRoot:t===r}}function os(e,t){return Array.from(e.querySelectorAll("[data-site-block-id]")).filter(n=>{let r=n.parentElement;for(;r;){if(r.getAttribute("data-site-block-id"))return!1;r=r.parentElement}return!!(n.getAttribute("data-site-block-id")&&n.getAttribute("data-vcp-edit-key"))}).map(n=>({element:n,blockId:n.getAttribute("data-site-block-id")??"",ref:vt(e,n,t),rect:Ne(n.getBoundingClientRect())})).filter(({rect:n})=>n.width>0&&n.height>0).sort((n,r)=>n.rect.top-r.rect.top||n.rect.left-r.rect.left)}function is(e,t,n){let r=os(e,n),i=r[0],o=r.at(-1);return!i||!o?null:[{anchorBlockId:i.blockId,anchorRef:i.ref,placement:"before",boundary:{top:i.rect.top,left:i.rect.left,width:i.rect.width}},...r.slice(1).map(c=>({anchorBlockId:c.blockId,anchorRef:c.ref,placement:"before",boundary:{top:c.rect.top,left:c.rect.left,width:c.rect.width}})),{anchorBlockId:o.blockId,anchorRef:o.ref,placement:"after",boundary:{top:o.rect.top+o.rect.height,left:o.rect.left,width:o.rect.width}}].find(({boundary:c})=>t.clientX>=c.left&&t.clientX<=c.left+c.width&&Math.abs(t.clientY-c.top)<=Un)??null}function Qe(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=an(o),c=s?.getAttribute("data-vcp-edit-key")??"";if(s&&xr(s,r,c))return s}return null}function an(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(un(t))return n??t;!ss(r)&&!n&&(n=t)}t=t.parentElement}return n}function un(e){return e.getAttribute(ci)!==null}function ss(e){return cs(e.split("::")[0]??"")}function cs(e){if(!e)return!1;let t=as(e);return t===ht||t.startsWith(`${ht}/`)||t.includes(`/${ht}/`)||t.endsWith(`/${ht}`)}function as(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 ge(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=Rr(_r(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${Br(r)}"]`))),n,r);if(i.length<=1)return{key:sr(n,r,0)};let o=i.indexOf(t);return o>=0?{key:sr(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function vt(e,t,n){return ge(e,t,n)}function ye(e,t,n){let r=Rt(t.key)??t.key,i=Rr(_r(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${Br(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=(Rt(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let c=us(n,t.key);return c!==null&&c>=0&&c<i.length?i[c]??null:o!==null?i[o]??null:i[0]??null}function sr(e,t,n){return vr(e,t)[n]?.key??t}function us(e,t){let n=Rt(t);if(!n)return null;let i=vr(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function vr(e,t){return(e?.entries??[]).filter(n=>(Rt(n.key)??n.key)===t)}function Rr(e,t,n){let r=Tr(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function xr(e,t,n){let r=Tr(t,n);return!r||e.tagName.toLowerCase()===r}function Tr(e,t){return null}var ls=2,ds=4;function _r(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&ds)!==0?-1:(r&ls)!==0?1:0})}function Rt(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(Jn);if(n<0)break;let r=Number(t.slice(n+Jn.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function _t(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e);return{...ln(n),paddingTop:ue(n?.paddingTop),paddingRight:ue(n?.paddingRight),paddingBottom:ue(n?.paddingBottom),paddingLeft:ue(n?.paddingLeft),borderTopWidth:ue(n?.borderTopWidth),borderRightWidth:ue(n?.borderRightWidth),borderBottomWidth:ue(n?.borderBottomWidth),borderLeftWidth:ue(n?.borderLeftWidth),columnGap:ue(n?.columnGap),rowGap:ue(n?.rowGap)}}function ln(e){return{marginTop:ue(e?.marginTop,!0),marginRight:ue(e?.marginRight,!0),marginBottom:ue(e?.marginBottom,!0),marginLeft:ue(e?.marginLeft,!0)}}function ue(e,t=!1){let n=Number.parseFloat(e??"");return Number.isFinite(n)?t?n:Math.max(0,n):0}function dn(e){let t=e.ownerDocument?.defaultView;return Array.from(e.children).filter(n=>typeof n.getBoundingClientRect=="function").map(n=>({rect:Ne(n.getBoundingClientRect()),margin:ln(t?.getComputedStyle(n))})).filter(({rect:n})=>n.width>0&&n.height>0)}function ps(e){return Array.from(e.children).filter(t=>typeof t.getBoundingClientRect=="function").map(t=>Ne(t.getBoundingClientRect())).filter(t=>t.width>0&&t.height>0)}var cr=new WeakMap,ar=0;function Le(e){let t=cr.get(e);if(t)return t;ar+=1;let n=`runtime-node-${ar}`;return cr.set(e,n),n}function Ar(e,t,n){let r=n??e.ownerDocument?.defaultView,i=e.ownerDocument?.defaultView?.getComputedStyle(e),o=Ne(t),s=X(r?.scrollX),c=X(r?.scrollY),a=i?.position||"static";return{version:Gt,runtimeNodeId:Le(e),rect:{viewport:o,document:{top:o.top+c,left:o.left+s,width:o.width,height:o.height}},layout:{position:a,transform:i?.transform||"none",containingBlock:fs(e,a)},scrollContext:{scrollX:s,scrollY:c,viewportWidth:X(r?.innerWidth),viewportHeight:X(r?.innerHeight),scrollContainers:hs(e)}}}function hs(e){let t=e.ownerDocument,n=t?.defaultView,r=[],i=e.parentElement;for(;i;){if(i!==t?.body&&i!==t?.documentElement){let o=n?.getComputedStyle(i),s=o?.overflowX||o?.overflow||"visible",c=o?.overflowY||o?.overflow||"visible",a=X(i.scrollLeft),u=X(i.scrollTop),l=a!==0||ur(s)&&X(i.scrollWidth)>X(i.clientWidth),d=u!==0||ur(c)&&X(i.scrollHeight)>X(i.clientHeight);(l||d)&&r.push({runtimeNodeId:Le(i),scrollLeft:a,scrollTop:u})}i=i.parentElement}return r}function ur(e){return["auto","scroll","overlay","hidden"].includes(e)}function fs(e,t){if(t==="fixed"){let r=lr(e.parentElement,!0);return r?{kind:"element",runtimeNodeId:Le(r)}:{kind:"viewport"}}if(t==="absolute"){let r=e.offsetParent,i=ms(r)??lr(e.parentElement,!1);return i?{kind:"element",runtimeNodeId:Le(i)}:{kind:"document"}}let n=e.parentElement;return n?{kind:"element",runtimeNodeId:Le(n)}:{kind:"document"}}function lr(e,t){let n=e;for(;n;){let r=n.ownerDocument?.defaultView?.getComputedStyle(n);if(!!(r?.transform&&r.transform!=="none")||!!(r?.perspective&&r.perspective!=="none")||!!(r?.filter&&r.filter!=="none")||(r?.willChange??"").split(",").some(o=>["transform","perspective","filter"].includes(o.trim()))||!t&&(r?.position||"static")!=="static")return n;n=n.parentElement}return null}function ms(e){return e&&typeof e.getBoundingClientRect=="function"?e:null}function me(e,t,n,r="full",i){let o=e.getBoundingClientRect(),s=n?.(t.key)??null,c=e.tagName.toLowerCase(),a=et(e),u=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([_,B])=>[_,B??""])),attributes:Object.fromEntries(e.getAttributeNames().map(_=>[_,e.getAttribute(_)??""]))}:{},l=Ir({operationSummary:s?.operationSummary,tagName:c,fallbackMode:"preview"}),d=un(e),h=!0,E=Pr(e)?.getAttribute("data-vcp-edit-key")??null,N=dn(e),C=Ar(e,o,i);return{ref:t,key:t.key,detailLevel:r,tagName:c,...s?{sourceKind:"jsx"}:{},...E?{parentKey:E}:{},...s?.pageCompositionUnitKey?{pageCompositionUnitKey:s.pageCompositionUnitKey}:{},...u,runtimeFlags:{selectable:!0,movable:l.canMove,removable:l.canRemove,textEditable:l.canUpdateText,container:d?!1:!!At(e)||l.canInsertChild||h&&cn(c)},layoutSnapshot:C,layout:a,rect:{top:o.top,left:o.left,width:o.width,height:o.height},childBoxes:N,childRects:N.map(({rect:_})=>_),spacing:_t(e)}}function dr(e,t,n,r){let i=e.getBoundingClientRect(),o=Ar(e,i,n);if(r==="light")return{ref:t,layoutSnapshot:o};if(r==="child-rects")return{ref:t,layoutSnapshot:o,childRects:ps(e)};let s=dn(e);return{ref:t,layoutSnapshot:o,childBoxes:s,childRects:s.map(({rect:c})=>c),layout:et(e),spacing:_t(e)}}function pr(e){let t=e.layout?.display??"",n=e.spacing;return["flex","inline-flex","grid","inline-grid"].includes(t)&&!!(n&&(n.columnGap>0||n.rowGap>0)&&(e.childRects?.length??0)>=2)}function gs(e,t,n,r,i){let o=t,s=dr(o,n,e,"detailed"),c=pr(s),a=null,u=null,l="mutation",d=Fe(e),h=d,E=!1,N=!1,C=({reason:H,sourceEventAt:x,forceEmit:A=!1,includeDetailedGeometry:T=!1})=>{(a===null||(H==="scroll"?0:1)>=(l==="scroll"?0:1))&&(l=H,d=x),E=E||A,N=N||T,a===null&&(a=Et(e,_))},_=()=>{let H=Fe(e);a=null;let x=l,A=d,T=E,z=N;E=!1,N=!1;let U=ye(e.document,n,r?.()??null);if(!U)return;U!==o&&(L?.unobserve(o),o=U,L?.observe(o),z=!0);let f=z?"detailed":c?"child-rects":"light",v=dr(o,n,e,f),O=v.layoutSnapshot.rect.viewport;O.width<=0||O.height<=0||!T&&!ys(s,v)||(s=v,f==="detailed"&&(c=pr(v)),i(x,v,{sourceEventAt:A,captureStartedAt:H,capturedAt:Fe(e)}))},B=()=>{u!==null&&(e.clearTimeout(u),u=null)},D=()=>{B(),C({reason:"resize",sourceEventAt:Fe(e),includeDetailedGeometry:!0})},Z=()=>{B(),C({reason:"mutation",sourceEventAt:Fe(e),includeDetailedGeometry:!0})},g=()=>{h=Fe(e),C({reason:"scroll",sourceEventAt:h}),B(),u=e.setTimeout(()=>{u=null,C({reason:"scroll",sourceEventAt:h,forceEmit:!0,includeDetailedGeometry:!0})},oi)},te=e.ResizeObserver,L=typeof te=="function"?new te(D):null;L?.observe(o);let W=e.MutationObserver,ee=typeof W=="function"?new W(Z):null;ee?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",D,{passive:!0}),e.addEventListener("scroll",g,{passive:!0});let $=e.visualViewport;return $?.addEventListener?.("resize",D,{passive:!0}),$?.addEventListener?.("scroll",g,{passive:!0}),e.document.addEventListener("scroll",g,{capture:!0,passive:!0}),e.document.addEventListener("load",Z,!0),()=>{a!==null&&(It(e,a),a=null),B(),L?.disconnect(),ee?.disconnect(),e.removeEventListener("resize",D),e.removeEventListener("scroll",g),$?.removeEventListener?.("resize",D),$?.removeEventListener?.("scroll",g),e.document.removeEventListener("scroll",g,!0),e.document.removeEventListener("load",Z,!0)}}function Fe(e){let t=e.performance;return t&&Number.isFinite(t.timeOrigin)&&typeof t.now=="function"?t.timeOrigin+t.now():Date.now()}function ys(e,t){return bs(e.layoutSnapshot,t.layoutSnapshot)||t.childBoxes!==void 0&&Es(e.childBoxes,t.childBoxes)||t.childRects!==void 0&&Is(e.childRects,t.childRects)||t.layout!==void 0&&tn(e.layout,t.layout)||t.spacing!==void 0&&tn(e.spacing,t.spacing)}function bs(e,t){return!e||!t?e!==t:e.version!==t.version||e.runtimeNodeId!==t.runtimeNodeId||xt(e.rect.viewport,t.rect.viewport)||xt(e.rect.document,t.rect.document)||e.layout.position!==t.layout.position||e.layout.transform!==t.layout.transform||e.layout.containingBlock.kind!==t.layout.containingBlock.kind||e.layout.containingBlock.kind==="element"&&t.layout.containingBlock.kind==="element"&&e.layout.containingBlock.runtimeNodeId!==t.layout.containingBlock.runtimeNodeId||e.scrollContext.scrollX!==t.scrollContext.scrollX||e.scrollContext.scrollY!==t.scrollContext.scrollY||e.scrollContext.viewportWidth!==t.scrollContext.viewportWidth||e.scrollContext.viewportHeight!==t.scrollContext.viewportHeight||Ss(e.scrollContext.scrollContainers,t.scrollContext.scrollContainers)}function Ss(e,t){return e.length!==t.length||e.some((n,r)=>{let i=t[r];return!i||n.runtimeNodeId!==i.runtimeNodeId||n.scrollLeft!==i.scrollLeft||n.scrollTop!==i.scrollTop})}function Es(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>{let s=r[o];return!s||xt(i.rect,s.rect)||tn(i.margin,s.margin)})}function Is(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>xt(i,r[o]??i))}function tn(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 Ne(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function xt(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 Cs(e,t,n,r,i,o,s){let c=e.document,a=Qe(c,t,n,o);if(!a)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let u=i?ye(c,i,o):null;if(u&&nn(a,u))return mt(c,a,"self-or-descendant",o,s);if(r==="move"&&u){let C=Ts(c,a,u,o,s);if(C){let _=Jt(C.child,C.targetParent,t,n,"nearest");if(_)return gt(c,C.child,C.targetParent,_,o,s)}}let l=null,d=!1,h=a,E=a.parentElement;for(;E;){if(E.getAttribute("data-vcp-edit-key")){if(u&&nn(E,u))return mt(c,a,"self-or-descendant",o,s);let C=hr(E,r,s);if(C==="accept"){l={child:h,targetParent:E};break}C==="blocked"&&(d=!0),h=E}E=E.parentElement}let N=hr(a,r,s);if(N==="accept"){if(l){let C=Jt(l.child,l.targetParent,t,n,"edge");if(C)return gt(c,l.child,l.targetParent,C,o,s)}return gt(c,a,a,vs(a,t,n),o,s)}if(l){let C=Jt(l.child,l.targetParent,t,n,"nearest");return gt(c,l.child,l.targetParent,C??"after",o,s)}return N==="blocked"||d?mt(c,a,"operation-boundary-blocked",o,s):mt(c,a,"no-accepting-parent",o,s)}function mt(e,t,n,r,i){return{anchorHit:me(t,ge(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function gt(e,t,n,r,i,o){let s=me(t,ge(e,t,i),o,"summary"),c=me(n,ge(e,n,i),o,"summary"),a=et(n).indicatorOrientation,u=r==="append"||r==="prepend"?Rs(n.getBoundingClientRect(),a,r):xs(t.getBoundingClientRect(),a,r);return{anchorHit:s,targetParentHit:c,relation:r,indicatorOrientation:a,indicatorBounds:u}}function hr(e,t,n){if(un(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":At(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return cn(o)?"accept":"not-container"}function Jt(e,t,n,r,i){let o=et(t).indicatorOrientation,s=e.getBoundingClientRect(),c=o==="vertical"?s.width>0?(n-s.left)/s.width:.5:s.height>0?(r-s.top)/s.height:.5;return i==="edge"&&c>=.25&&c<=.75?null:c<.5?"before":"after"}function vs(e,t,n){let r=et(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 et(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 Rs(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 xs(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 nn(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function Ts(e,t,n,r,i){let o=_s(e,t,n,r,i);if(o)return o;let s=Pr(n);if(!s||t===s)return null;let c=t,a=t.getAttribute("data-vcp-edit-key")?t:null;for(;c&&c!==s;)c.getAttribute("data-vcp-edit-key")&&(a=c),c=c.parentElement;return c!==s||!a||a===s||a===n||nn(a,n)?null:{child:a,targetParent:s}}function _s(e,t,n,r,i){return null}function Pr(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function At(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=At(n);if(r)return r}return null}function yt(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:X(e.scrollX),scrollY:X(e.scrollY),scrollWidth:Math.max(X(t?.scrollWidth),X(n?.scrollWidth),X(e.innerWidth)),scrollHeight:Math.max(X(t?.scrollHeight),X(n?.scrollHeight),X(e.innerHeight)),viewportWidth:X(e.innerWidth),viewportHeight:X(e.innerHeight)}}function As(e,t){Object.entries(t.attributes??{}).forEach(([r,i])=>{if(i===null){e.removeAttribute(r);return}e.setAttribute(r,i)}),typeof t.className=="string"&&(e.className=t.className);let n=new Set(t.styleDeclarations?.map(r=>r.property)??[]);Object.entries(t.style??{}).forEach(([r,i])=>{if(n.has(r))return;let o=e.style,s=r.replace(/[A-Z]/g,c=>`-${c.toLowerCase()}`);if(i==null||i===""){o.removeProperty(s);return}o.setProperty(s,String(i))}),t.styleDeclarations?.forEach(r=>{let i=e.style,o=r.property.replace(/[A-Z]/g,c=>`-${c.toLowerCase()}`),s=r.value;if(s==null||s===""){i.removeProperty(o);return}i.setProperty(o,String(s),r.priority)})}var Ps=500,Ye=new Map;function ks(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function Ns(e,t){if(Ye.size>=Ps){let n=Ye.keys().next().value;n&&Ye.delete(n)}Ye.set(e,t)}var Je=new Set;function Ds(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 Je)r.has(i)||n?.removeProperty(i);Je.clear();for(let i of r)Je.add(i);Fs(e,t.stylesheets??[])}function Bs(e){let t=e.documentElement?.style;for(let n of Je)t?.removeProperty(n);Je.clear();for(let n of Dr(e))n.remove()}function ws(e,t){let n=Array.from(new Set(t.filter(s=>typeof s=="string"&&s.startsWith("--"))));if(n.length===0)return{};let r=e.documentElement,i=r?e.defaultView?.getComputedStyle(r):null,o={};for(let s of n){let c=kr(i,s);c&&(o[s]=c)}return o}function kr(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return Nr(e,r,n)}function Nr(e,t,n){if(!t)return null;let r=Os(t);if(!r)return t;let i=kr(e,r.name,n);return i||(r.fallback?Nr(e,r.fallback,n)??r.fallback:null)}function Os(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=Ms(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 Ms(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 Fs(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of Dr(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(gr,"true"),s.setAttribute("href",o),i.appendChild(s)}}function Dr(e){return Array.from(e.querySelectorAll(`link[${gr}]`))}function Vs(e,t,n,r,i={}){let o=i.textNode?qs(e.document,i.textNode):null;if(i.textNode&&!o)throw new Error("Failed to prepare text segment editor");let s=o?.element??t,c=s.textContent??"",a=o?void 0:t.innerHTML,u=Ks(s),l=!1,d=()=>{e.document.removeEventListener("pointerdown",E,!0),s.removeEventListener("keydown",N),s.removeEventListener("blur",C),s.removeEventListener("input",_),zs(s,u)},h=B=>{if(l)return;l=!0;let D=s.textContent??"";if(d(),B==="cancel"){o?.restore(c),o||(t.textContent=c),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(D),B==="commit"&&D!==c){i.onCommitSnapshot?.({ref:n,initialText:c,...a!==void 0?{initialHtml:a}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:D}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function E(B){let D=B.target;D&&s.contains(D)||h("commit")}function N(B){if(B.key==="Escape"){B.preventDefault(),h("cancel");return}B.key==="Enter"&&(B.metaKey||B.ctrlKey)&&(B.preventDefault(),h("commit"))}function C(){h("commit")}function _(){r({kind:"text-edit-input",payload:{ref:n,hit:me(t,n,void 0,"full")}})}return Ws(s),e.document.addEventListener("pointerdown",E,!0),s.addEventListener("keydown",N),s.addEventListener("blur",C),s.addEventListener("input",_),Us(s),js(s,e.document),d}function qs(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 Ks(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 Ws(e){$s(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 zs(e,t){Qt(e,"contenteditable",t.contentEditable),Qt(e,"spellcheck",t.spellcheck),Qt(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function $s(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 Qt(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function Hs(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 Us(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function js(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function Br(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function X(e){let t=Number(e);return Number.isFinite(t)?t:0}import Gs from"node:http";import pn from"node:fs";import{createHash as qr,randomBytes as Ys,timingSafeEqual as Xs}from"node:crypto";import Re from"node:path";import{WebSocket as Kr,WebSocketServer as Ls}from"ws";import{createPreviewSiteEditEngineRuntime as Js,openFileHistoryStore as Qs,resolveManagedPageTemplateComposition as Zs,scanSiteEditCompositionsFromFiles as ec}from"@vcp-dev/site-edit-engine";import{resolveNextAppRouteId as tc,scanNextAppRouterRoutesFromFiles as nc}from"@vcp-dev/site-edit-engine/next-app-router";import{SiteEditSourceWatcher as rc}from"@vcp-dev/site-edit-engine/source-watcher";var Pt=class{constructor(){this.tail=Promise.resolve()}run(t){let n=this.tail.then(t,t);return this.tail=n.then(()=>{},()=>{}),n}};import{SiteEditOperationRequestSchema as oc,computeSiteEditCompositionKey as De}from"@vcp-dev/contracts";var ic="127.0.0.1",sc=30218,cc="/__vcp/site-edit/bridge",Wr=6*1024*1024,ac=Wr*2,uc=3e3,wr=50,Or="__VCP_SITE_EDIT_BRIDGE_SERVERS__";function $a(e){let t=$r(e),n=Ur(t),r=Hr(),i=r.get(n);if(i)return i;let o=new kt(t);r.set(n,o);try{o.start()}catch(s){throw r.delete(n),o.stop(),s}return o}function zr(e,t,n={}){let r=new kt($r(t),e,!1,n);return r.start({listen:!1}),r}var kt=class{constructor(t,n=Gs.createServer((o,s)=>{s.writeHead(404),s.end("VCP site edit bridge server")}),r=!0,i={}){this.options=t,this.server=n,this.closeHttpServerOnStop=r,this.dependencies=i,this.runtime=null,this.activeHistorySessionId=null,this.historySessionTransition=Promise.resolve(),this.mutationQueue=new Pt,this.eventListeners=new Set,this.routes=[],this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.stopWatching=null,this.stopWebSocketServer=null,this.pendingChangedFiles=new Set,this.fileChangeTimer=null,this.isStarted=!1,this.runtimeVersionFloors=new Map,this.activeHistoryStore=null,this.versionPersistence=Promise.resolve()}start(t={}){if(this.isStarted)return;this.refreshCompositions(!0),this.isStarted=!0,this.createRuntime();let n=fc({server:this.server,path:this.options.path,sessionKey:this.options.sessionKey,host:this.options.host,allowedOrigins:this.options.allowedOrigins,engine:this.createBridgeEngine()});this.stopWebSocketServer=n.stop,this.stopWatching=new rc({projectRoot:this.options.projectRoot,watch_dirs:lc(this.options.runtime.watch_dirs),interval_ms:this.options.runtime.watch_interval_ms,debounce_ms:this.options.runtime.watch_debounce_ms??wr,max_dirs:this.options.runtime.watch_max_dirs,max_files:this.options.runtime.watch_max_files,max_depth:this.options.runtime.watch_max_depth,max_startup_ms:this.options.runtime.watch_max_startup_ms,on_change:r=>this.handleFileChanged(r),on_batch_change:r=>this.handleFilesChanged(r)}).start(),t.listen!==!1&&this.server.listen(this.options.port,this.options.host)}getHealth(){let t=!!this.runtime&&!this.compositionResolutionError;return{ok:this.isStarted&&t,bridgePath:this.options.path,runtimeReady:t,routesIndexed:this.routes.length,sessionRequired:!!this.options.sessionKey}}stop(){this.stopWatching?.(),this.stopWatching=null,this.flushChangedFiles(),this.fileChangeTimer&&(clearTimeout(this.fileChangeTimer),this.fileChangeTimer=null),this.stopWebSocketServer?.(),this.stopWebSocketServer=null,this.runtime?.dispose(),this.runtime=null,this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.closeHttpServerOnStop&&this.server.close();let t=Hr(),n=Ur(this.options);t.get(n)===this&&t.delete(n),this.isStarted=!1}createRuntime(t,n=null){let r=this.runtime;this.activeHistoryStore=t??null;let i=(this.dependencies.createRuntime??Js)({...this.options.tenantId?{tenantId:this.options.tenantId}:{},siteId:this.options.siteId,snapshotId:this.options.snapshotId,projectRoot:this.options.projectRoot,compositions:this.compositions,onEvent:o=>{"version"in o&&typeof o.version=="number"&&this.recordRuntimeVersion(o.version,"composition"in o?o.composition:void 0);for(let s of this.eventListeners)s(o)},...t?{historyStore:t}:{},...this.getInitialDocumentVersions().length>0?{initialDocumentVersions:this.getInitialDocumentVersions()}:{}});this.runtime=i,this.activeHistorySessionId=n,r?.dispose()}createBridgeEngine(){return{resolveComposition:t=>this.resolveComposition(t),initializeSession:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)throw new Error(`${n.code}: ${n.message}`);let r=pc(t.composition),i=this.getRuntime(),o=Ee(r);await i.initializeComposition(o);let c=i.getDocument(o).data;await this.recordRuntimeVersion(c.version,r);let a=(await i.getHistoryStatus()).data;return{ok:!0,composition:r,data:{document:c,historyStatus:a}}}),getDocument:async t=>{let n=this.getRuntime(),r=Ee(t);await n.initializeComposition(r);let i=n.getDocument(r);return await this.recordRuntimeVersion(i.data.version,t),{...i,composition:t}},getHistoryStatus:async t=>({...await this.getRuntime().getHistoryStatus(),composition:t}),getStyleContext:async t=>this.getRuntime().getStyleContext(Ee(t)),getObjectEditContext:async(t,n)=>this.getRuntime().getObjectEditContext(t,Ee(n)),getClassNameSource:async(t,n)=>this.getRuntime().getClassNameSource(t,Ee(n)),getSourceTree:async t=>this.getRuntime().getSourceTree(Ee(t)),getSourceFile:async t=>this.getRuntime().getSourceFile({path:t.path,composition:Ee(t.composition)}),resolveSourceLocation:async t=>this.getRuntime().resolveSourceLocation({key:t.key,composition:Ee(t.composition)}),execute:(t,n)=>this.mutationQueue.run(async()=>{let r=await this.bindHistorySession(this.options.snapshotId);if(!r.ok)return hn(r,t);let i=await this.getRuntime().executeOperation(t);return i.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(i.data.resultVersion,i.composition),i}),undo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return hn(n,void 0,t);let r=await this.getRuntime().undo();return r.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(r.data.resultVersion,r.composition??t),r.composition?r:{...r,composition:t}}),redo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return hn(n,void 0,t);let r=await this.getRuntime().redo();return r.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(r.data.resultVersion,r.composition??t),r.composition?r:{...r,composition:t}}),subscribe:t=>(this.eventListeners.add(t),()=>this.eventListeners.delete(t))}}async bindHistorySession(t){if(!this.options.historyRoot)return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history is not configured."};if(this.activeHistorySessionId===t)return{ok:!0};let n=this.historySessionTransition.then(async()=>{if(this.activeHistorySessionId===t)return;let r=await(this.dependencies.openHistoryStore??Qs)(hc({root:this.options.historyRoot,siteId:this.options.siteId,snapshotId:this.options.snapshotId,editingSessionId:t}));if(!this.isStarted)return;let i=r.readDocumentVersion?await r.readDocumentVersion():0,o=this.compositions[0]?.context;if(o){let s=De(o);this.runtimeVersionFloors.set(s,Math.max(this.runtimeVersionFloors.get(s)??0,i))}this.createRuntime(r,t)});this.historySessionTransition=n.catch(()=>{});try{return await n,{ok:!0}}catch{return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history could not be opened."}}}recordRuntimeVersion(t,n){let r=n?De(n):null;r&&this.runtimeVersionFloors.set(r,Math.max(this.runtimeVersionFloors.get(r)??0,t));let i=this.activeHistoryStore;if(!i?.writeDocumentVersion)return Promise.resolve();let o=r?this.runtimeVersionFloors.get(r)??t:t;return this.versionPersistence=this.versionPersistence.then(()=>i.writeDocumentVersion(o)).catch(()=>{}),this.versionPersistence}handleFileChanged(t){this.handleFilesChanged([t])}handleFilesChanged(t){for(let r of t)this.pendingChangedFiles.add(r);this.fileChangeTimer&&clearTimeout(this.fileChangeTimer);let n=this.options.runtime.watch_debounce_ms??wr;this.fileChangeTimer=setTimeout(()=>{this.fileChangeTimer=null,this.flushChangedFiles()},n),this.fileChangeTimer?.unref?.()}flushChangedFiles(){if(this.fileChangeTimer&&(clearTimeout(this.fileChangeTimer),this.fileChangeTimer=null),this.pendingChangedFiles.size===0)return;let t=[...this.pendingChangedFiles].sort((n,r)=>n.localeCompare(r));if(this.pendingChangedFiles.clear(),!!this.refreshCompositions(!1))for(let n of t)this.runtime?.notifyFileChanged(n)}refreshCompositions(t=!1){try{let n=dc(this.options.projectRoot),r=nc(n),i=r.length>0?r:(this.options.runtime.routes??[]).map(a=>({...a})),o=ec({files:n});if(o.length===0)throw new Error("No canonical App Router composition is indexed by the preview bridge.");let s=new Map(this.compositions.map(a=>[De(a.context),a])),c=new Map(o.map(a=>[De(a.context),a]));if(this.runtime){for(let[a,u]of s){let l=c.get(a);(!l||l.entryFile!==u.entryFile)&&this.runtime.unregisterComposition(Ee(u.context))}for(let[a,u]of c){let l=s.get(a);(!l||l.entryFile!==u.entryFile)&&this.runtime.registerComposition(u.context,u.entryFile)}}return this.routes=i,this.compositions=o,this.compositionFiles=n,this.compositionResolutionError=null,!0}catch(n){let r=n instanceof Error?n:new Error(String(n));if(this.compositionResolutionError=r,t)throw r;return!1}}resolveComposition(t){if(this.compositionResolutionError)throw this.compositionResolutionError;let n=tc(t.routeId,this.routes,this.options.basePath);if(!n)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let r=this.routes.find(s=>s.routeId===n);if(!r)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let i=Zs({selector:{routeId:n,...t.templateId?{templateId:t.templateId}:{}},files:this.compositionFiles,canonicalEntryFile:r.entryFile}),o=De(i.context);if(!this.compositions.some(s=>De(s.context)===o))throw new Error(`Composition is not registered by the preview bridge: ${o}`);return i}getInitialDocumentVersions(){return this.compositions.flatMap(t=>{let n=this.runtimeVersionFloors.get(De(t.context));return n===void 0?[]:[{composition:t.context,version:n}]})}getRuntime(){if(!this.runtime)throw new Error("VCP site edit preview bridge runtime is not ready");return this.runtime}};function $r(e){return{tenantId:e.tenantId,siteId:e.siteId,snapshotId:e.snapshotId,projectRoot:Re.resolve(e.projectRoot??process.cwd()),basePath:e.basePath??"",host:e.host??ic,port:e.port??sc,path:e.path??cc,sessionKey:e.sessionKey??Ic(),historyRoot:e.historyRoot,allowedOrigins:e.allowedOrigins??[],runtime:e.runtime??{}}}function lc(e){let t=["app","src/app","components/site","src/components/site","lib/generated","src/lib/generated","public"];return[...new Set([...e?.length?e:t,".vcp"])]}function dc(e){let t=[],n=["app","src/app",".vcp"],r=new Set([".git",".next",".turbo","coverage","dist","node_modules","output","snapshot-store"]),i=o=>{if(!pn.existsSync(o))return;let s;try{s=pn.readdirSync(o,{withFileTypes:!0})}catch{return}for(let c of s){if(c.name.startsWith(".")&&c.name!==".vcp")continue;if(c.isDirectory()){if(r.has(c.name))continue;i(Re.join(o,c.name));continue}if(!c.isFile())continue;let a=Re.join(o,c.name),u="";try{u=pn.readFileSync(a,"utf8")}catch{}t.push({path:Re.relative(e,a).replaceAll(Re.sep,"/"),content:u})}};for(let o of n)i(Re.join(e,o));return t.sort((o,s)=>o.path.localeCompare(s.path))}function pc(e){if(!e||typeof e!="object"||typeof e.routeId!="string")throw new Error("Normalized composition context is required.");if("effectiveTemplateId"in e)return e;let t=e;return{routeId:t.routeId,...t.templateId?{effectiveTemplateId:t.templateId}:{}}}function Ee(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function hc(e){return Re.join(Re.resolve(e.root),Mr(e.siteId),Mr(e.snapshotId),qr("sha256").update(e.editingSessionId).digest("hex").slice(0,32))}function Mr(e){return/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)&&e!=="."&&e!==".."?e:qr("sha256").update(e).digest("hex").slice(0,32)}function Hr(){let e=globalThis;return e[Or]??=new Map,e[Or]}function Ur(e){return`${e.projectRoot}:${e.host}:${e.port}:${e.path}:${e.historyRoot??""}`}function hn(e,t,n){let r=n??(t?.composition?{routeId:t.composition.routeId,...t.composition.templateId?{effectiveTemplateId:t.composition.templateId}:{}}:void 0);if(!r)throw new Error("A normalized composition is required to construct a mutation result.");return{ok:!1,composition:r,error:{code:e.code,message:e.message},data:{requestId:t?.id??"mutation-context",kind:t?.kind??"update-text",composition:r,target:t?.target??{kind:"node",key:""},resultVersion:t?.documentVersion??0}}}function fc(e){let t=new Ls({maxPayload:Wr,noServer:!0}),n=new WeakSet,r=o=>{new st({socket:new mn(o),engine:e.engine,validateOperationRequest:s=>oc.safeParse(s).success})},i=(o,s,c)=>{if(!mc(o,e))return;let a=gc(o,e);if(!a){s.write(`HTTP/1.1 401 Unauthorized\r
|
|
25
|
+
[${f}="e"] { cursor: ew-resize !important; }
|
|
26
|
+
[${f}="s"] { cursor: ns-resize !important; }
|
|
27
|
+
[${f}="se"] { cursor: nwse-resize !important; }
|
|
28
|
+
[${f}="e"] { left: anchor(right); top: anchor(center); }
|
|
29
|
+
[${f}="se"] { left: anchor(right); top: anchor(bottom); }
|
|
30
|
+
[${f}="s"] { left: anchor(center); top: anchor(bottom); }
|
|
31
|
+
`,c.appendChild(E);let A=Bi.map(x=>{let P=s.createElement("div");return P.setAttribute(f,x),P.setAttribute("aria-hidden","true"),a.appendChild(P),P}),I=null,_=null,B=()=>{I?.removeAttribute(d),_?.(),_=null,I=null},D=x=>{B(),I=x,_=St(x,i),x.setAttribute(d,"true"),A.forEach(P=>P.style.removeProperty("display"))};D(l);let Z=!1,g=null,te=()=>{if(!g||!l)return;let x=(P,T,z)=>{T?l.style.setProperty(P,T,z):l.style.removeProperty(P)};x("width",g.widthValue,g.widthPriority),x("height",g.heightValue,g.heightPriority)},L=(x,P,T)=>g?{version:1,phase:x,sessionId:g.sessionId,pointerId:g.pointerId,edge:g.edge,ref:t,startWidth:g.startWidth,startHeight:g.startHeight,width:P,height:T,baselineStyleDeclarations:[{property:"width",value:g.widthValue||null,...g.widthPriority==="important"?{priority:"important"}:{}},{property:"height",value:g.heightValue||null,...g.heightPriority==="important"?{priority:"important"}:{}}]}:null,W=x=>{if(!g||!l?.isConnected||x.pointerId!==g.pointerId)return!1;let P=Number(x.clientX)-g.startX,T=Number(x.clientY)-g.startY,z=Math.max(1,Math.round(g.startWidth+P)),U=Math.max(1,Math.round(g.startHeight+T));return(g.edge==="e"||g.edge==="se")&&l.style.setProperty("width",`${z}px`,"important"),(g.edge==="s"||g.edge==="se")&&l.style.setProperty("height",`${U}px`,"important"),!0},ee=()=>{if(Z)return;let x=u();if(x===l&&x?.isConnected)return;te();let P=g?.captureTarget,T=g?.pointerId;g=null,T!==void 0&&P?.releasePointerCapture?.(T),B(),l=x,l?.isConnected?D(l):A.forEach(z=>z.style.setProperty("display","none","important"))},H=e.MutationObserver,$=typeof H=="function"?new H(ee):null;return $?.observe(s.documentElement,{attributeFilter:["data-vcp-edit-key"],attributes:!0,childList:!0,subtree:!0}),{begin(x,P){if(Z||g||!l?.isConnected)return null;let T=l.getBoundingClientRect();return g={sessionId:`resize-${r}-${x.pointerId}`,pointerId:x.pointerId,edge:P,startX:Number(x.clientX),startY:Number(x.clientY),startWidth:T.width,startHeight:T.height,widthValue:l.style.getPropertyValue("width"),widthPriority:l.style.getPropertyPriority("width"),heightValue:l.style.getPropertyValue("height"),heightPriority:l.style.getPropertyPriority("height"),captureTarget:x.target},L("start",T.width,T.height)},update:W,finish(x,P){if(!g||x.pointerId!==g.pointerId)return null;P==="commit"&&W(x);let T=Math.max(1,Math.round(g.startWidth+Number(x.clientX)-g.startX)),z=Math.max(1,Math.round(g.startHeight+Number(x.clientY)-g.startY)),U=L(P,P==="commit"?T:g.startWidth,P==="commit"?z:g.startHeight),h=g.captureTarget,v=g.pointerId;return P==="cancel"&&te(),g=null,h?.releasePointerCapture?.(v),U},cleanup(){if(Z)return;Z=!0,$?.disconnect(),te();let x=g?.captureTarget,P=g?.pointerId;g=null,P!==void 0&&x?.releasePointerCapture?.(P),B(),l=null,A.forEach(T=>T.remove()),E.remove()}}}function sr(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 Fi(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 Vi({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,nextRouteReadySequence:c,windowLike:a}){let u=a.__VCP_SITE_EDIT__;if(!u){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 l=await u.initializeSession({composition:e.payload.composition});o?.(l.data.document),Ir(a,{composition:l.data.document.composition,editEngineVersion:"unknown",sequence:c(),version:l.data.document.version}),n({type:"response",ok:!0,result:l});return}case"bridge-get-document":{let l=await u.getDocument(e.payload.composition);o?.(l.data),n({type:"response",ok:!0,result:l});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await u.getHistoryStatus(e.payload.composition)});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await u.getStyleContext(e.payload.composition)});return;case"bridge-ensure-document-version":{if(!Number.isFinite(Number(e.payload.minVersion))){n({type:"response",ok:!1,error:"Invalid document version"});return}let l=u.ensureDocumentVersion?await u.ensureDocumentVersion(e.payload.composition,Number(e.payload.minVersion)):await u.getDocument(e.payload.composition);o?.(l.data),n({type:"response",ok:!0,result:l});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let l=u.acknowledgeDocumentVersion?await u.acknowledgeDocumentVersion(e.payload.composition,Number(e.payload.version)):await u.getDocument(e.payload.composition);o?.(l.data),n({type:"response",ok:!0,result:l});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await u.getObjectEditContext(e.payload.key,e.payload.composition)});return;case"bridge-get-class-name-source":{let l=await u.getClassNameSource(e.payload.key,e.payload.composition);n({type:"response",ok:!0,result:qi(l,e.payload.key,a.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await u.getSourceTree(e.payload.composition)});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await u.getSourceFile({path:e.payload.path,composition:e.payload.composition})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await u.resolveSourceLocation({key:e.payload.key,composition:e.payload.composition})});return;case"bridge-execute":{let l=await u.execute(e.payload.request);if(l.ok&&u.acknowledgeDocumentVersion&&Fi(e.payload.request)){let d=await u.acknowledgeDocumentVersion(e.payload.composition,l.data.resultVersion);o?.(d.data)}n({type:"response",ok:!0,result:l});return}case"bridge-undo":n({type:"response",ok:!0,result:await u.undo(e.payload.composition)});return;case"bridge-redo":n({type:"response",ok:!0,result:await u.redo(e.payload.composition)});return;case"bridge-subscribe":{let l=e.payload.subscriptionId;r.get(l)?.();let d=u.subscribe(f=>{t({kind:"bridge-event",payload:{composition:f.composition,event:f,subscriptionId:l}})});r.set(l,d),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let l=e.payload.subscriptionId;r.get(l)?.(),r.delete(l),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(l){s?.(l,e),n({type:"response",ok:!1,error:Xi(l)})}}function qi(e,t,n,r){if(!e.ok)return e;let i=ye(n,{key:t},r),o=i?Ki(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function Ki(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 Wi(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let u=n();u!==o&&(o=u,t())},c=()=>s(),a=()=>s();return e.history.pushState=function(...l){let d=r.apply(this,l);return s(),d},e.history.replaceState=function(...l){let d=i.apply(this,l);return s(),d},e.addEventListener("popstate",c),e.addEventListener("hashchange",a),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",c),e.removeEventListener("hashchange",a)}}function zi(e,t){let n=e.MutationObserver;if(typeof n!="function")return()=>{};let r=cr(e.document),i=new n(()=>{let o=cr(e.document);o!==r&&(r=o,t())});return i.observe(e.document.documentElement,{attributes:!0,attributeFilter:[Tt,sn,cn],childList:!0,subtree:!0}),()=>i.disconnect()}function cr(e){let t=Array.from(e.querySelectorAll(yr)).filter(n=>n.getAttribute(Tt)===on);return JSON.stringify(t.map(n=>[n.getAttribute(sn),n.getAttribute(cn)]))}function Hi(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function Et(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function It(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function Ir(e,t){e.dispatchEvent(new CustomEvent(en,{detail:t}))}function $i(e,t){e.dispatchEvent(new CustomEvent(tn,{detail:t}))}function Ui(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function ji(e,t){return oe(e.composition)===t}function Gi(e){return Ze(e,"").includes(Xe)}function Yi(e){return Ze(e,"").includes(br)}function Ze(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function Cr(e){let t=Ze(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function Xi(e){let t=Ze(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":Cr(t)?"Site edit bridge disconnected":t}function Me(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 vr(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function an(e){return ui.has(xr(e))}function Li(e){return li.has(xr(e))}function Rr(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:Li(e.tagName),canInsertChild:an(e.tagName),canMove:!1,canRemove:!1}}function xr(e){return e?.trim().toLowerCase()??""}function ar(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 Ji(e,t,n){let r=ye(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=Qi(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 Qi(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Ct(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function Zi(e,t,n,r,i){let o=Qe(e,t,n,r),s=un(o);if(!s)return null;let c=s.getAttribute("data-vcp-edit-key")??"",a=ge(e,s,r),u=i?.(a.key)??i?.(c);if(!Rr({operationSummary:u?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let d=es(e,t,n,s);if(d){let f=ns(s,d);if(f!==null)return{element:s,textNode:d,textSegmentIndex:f}}return At(s)?null:{element:s}}function es(e,t,n,r){let i=ts(e,t,n);return!i||i.parentElement!==r?null:i}function ts(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(Ct(o))return o;let c=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return Ct(c)?c:null}function ns(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Ct(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function Ct(e){return e?.nodeType===3}function rs(e,t,n){return(typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean))[0]??null}function os(e,t,n){let r=t;for(;r&&!r.getAttribute("data-site-block-id");)r=r.parentElement;if(!r)return null;let i=r.getAttribute("data-site-block-id")??"",o=r.getAttribute("data-vcp-edit-key")??"";return!i||!o?null:{blockId:i,ref:vt(e,r,n),rect:ke(r.getBoundingClientRect()),targetIsSectionRoot:t===r}}function is(e,t){return Array.from(e.querySelectorAll("[data-site-block-id]")).filter(n=>{let r=n.parentElement;for(;r;){if(r.getAttribute("data-site-block-id"))return!1;r=r.parentElement}return!!(n.getAttribute("data-site-block-id")&&n.getAttribute("data-vcp-edit-key"))}).map(n=>({element:n,blockId:n.getAttribute("data-site-block-id")??"",ref:vt(e,n,t),rect:ke(n.getBoundingClientRect())})).filter(({rect:n})=>n.width>0&&n.height>0).sort((n,r)=>n.rect.top-r.rect.top||n.rect.left-r.rect.left)}function ss(e,t,n){let r=is(e,n),i=r[0],o=r.at(-1);return!i||!o?null:[{anchorBlockId:i.blockId,anchorRef:i.ref,placement:"before",boundary:{top:i.rect.top,left:i.rect.left,width:i.rect.width}},...r.slice(1).map(c=>({anchorBlockId:c.blockId,anchorRef:c.ref,placement:"before",boundary:{top:c.rect.top,left:c.rect.left,width:c.rect.width}})),{anchorBlockId:o.blockId,anchorRef:o.ref,placement:"after",boundary:{top:o.rect.top+o.rect.height,left:o.rect.left,width:o.rect.width}}].find(({boundary:c})=>t.clientX>=c.left&&t.clientX<=c.left+c.width&&Math.abs(t.clientY-c.top)<=Yn)??null}function Qe(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=un(o),c=s?.getAttribute("data-vcp-edit-key")??"";if(s&&Ar(s,r,c))return s}return null}function un(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(ln(t))return n??t;!cs(r)&&!n&&(n=t)}t=t.parentElement}return n}function ln(e){return e.getAttribute(ai)!==null}function cs(e){return as(e.split("::")[0]??"")}function as(e){if(!e)return!1;let t=us(e);return t===ft||t.startsWith(`${ft}/`)||t.includes(`/${ft}/`)||t.endsWith(`/${ft}`)}function us(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 ge(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=_r(Nr(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${Mr(r)}"]`))),n,r);if(i.length<=1)return{key:ur(n,r,0)};let o=i.indexOf(t);return o>=0?{key:ur(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function vt(e,t,n){return ge(e,t,n)}function ye(e,t,n){let r=Rt(t.key)??t.key,i=_r(Nr(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${Mr(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=(Rt(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let c=ls(n,t.key);return c!==null&&c>=0&&c<i.length?i[c]??null:o!==null?i[o]??null:i[0]??null}function ur(e,t,n){return Tr(e,t)[n]?.key??t}function ls(e,t){let n=Rt(t);if(!n)return null;let i=Tr(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function Tr(e,t){return(e?.entries??[]).filter(n=>(Rt(n.key)??n.key)===t)}function _r(e,t,n){let r=Pr(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function Ar(e,t,n){let r=Pr(t,n);return!r||e.tagName.toLowerCase()===r}function Pr(e,t){return null}var ds=2,ps=4;function Nr(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&ps)!==0?-1:(r&ds)!==0?1:0})}function Rt(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(er);if(n<0)break;let r=Number(t.slice(n+er.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function _t(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e);return{...dn(n),paddingTop:ue(n?.paddingTop),paddingRight:ue(n?.paddingRight),paddingBottom:ue(n?.paddingBottom),paddingLeft:ue(n?.paddingLeft),borderTopWidth:ue(n?.borderTopWidth),borderRightWidth:ue(n?.borderRightWidth),borderBottomWidth:ue(n?.borderBottomWidth),borderLeftWidth:ue(n?.borderLeftWidth),columnGap:ue(n?.columnGap),rowGap:ue(n?.rowGap)}}function dn(e){return{marginTop:ue(e?.marginTop,!0),marginRight:ue(e?.marginRight,!0),marginBottom:ue(e?.marginBottom,!0),marginLeft:ue(e?.marginLeft,!0)}}function ue(e,t=!1){let n=Number.parseFloat(e??"");return Number.isFinite(n)?t?n:Math.max(0,n):0}function pn(e){let t=e.ownerDocument?.defaultView;return Array.from(e.children).filter(n=>typeof n.getBoundingClientRect=="function").map(n=>({rect:ke(n.getBoundingClientRect()),margin:dn(t?.getComputedStyle(n))})).filter(({rect:n})=>n.width>0&&n.height>0)}function fs(e){return Array.from(e.children).filter(t=>typeof t.getBoundingClientRect=="function").map(t=>ke(t.getBoundingClientRect())).filter(t=>t.width>0&&t.height>0)}var lr=new WeakMap,dr=0;function Le(e){let t=lr.get(e);if(t)return t;dr+=1;let n=`runtime-node-${dr}`;return lr.set(e,n),n}function kr(e,t,n){let r=n??e.ownerDocument?.defaultView,i=e.ownerDocument?.defaultView?.getComputedStyle(e),o=ke(t),s=X(r?.scrollX),c=X(r?.scrollY),a=i?.position||"static";return{version:Yt,runtimeNodeId:Le(e),rect:{viewport:o,document:{top:o.top+c,left:o.left+s,width:o.width,height:o.height}},layout:{position:a,transform:i?.transform||"none",containingBlock:ms(e,a)},scrollContext:{scrollX:s,scrollY:c,viewportWidth:X(r?.innerWidth),viewportHeight:X(r?.innerHeight),scrollContainers:hs(e)}}}function hs(e){let t=e.ownerDocument,n=t?.defaultView,r=[],i=e.parentElement;for(;i;){if(i!==t?.body&&i!==t?.documentElement){let o=n?.getComputedStyle(i),s=o?.overflowX||o?.overflow||"visible",c=o?.overflowY||o?.overflow||"visible",a=X(i.scrollLeft),u=X(i.scrollTop),l=a!==0||pr(s)&&X(i.scrollWidth)>X(i.clientWidth),d=u!==0||pr(c)&&X(i.scrollHeight)>X(i.clientHeight);(l||d)&&r.push({runtimeNodeId:Le(i),scrollLeft:a,scrollTop:u})}i=i.parentElement}return r}function pr(e){return["auto","scroll","overlay","hidden"].includes(e)}function ms(e,t){if(t==="fixed"){let r=fr(e.parentElement,!0);return r?{kind:"element",runtimeNodeId:Le(r)}:{kind:"viewport"}}if(t==="absolute"){let r=e.offsetParent,i=gs(r)??fr(e.parentElement,!1);return i?{kind:"element",runtimeNodeId:Le(i)}:{kind:"document"}}let n=e.parentElement;return n?{kind:"element",runtimeNodeId:Le(n)}:{kind:"document"}}function fr(e,t){let n=e;for(;n;){let r=n.ownerDocument?.defaultView?.getComputedStyle(n);if(!!(r?.transform&&r.transform!=="none")||!!(r?.perspective&&r.perspective!=="none")||!!(r?.filter&&r.filter!=="none")||(r?.willChange??"").split(",").some(o=>["transform","perspective","filter"].includes(o.trim()))||!t&&(r?.position||"static")!=="static")return n;n=n.parentElement}return null}function gs(e){return e&&typeof e.getBoundingClientRect=="function"?e:null}function me(e,t,n,r="full",i){let o=e.getBoundingClientRect(),s=n?.(t.key)??null,c=e.tagName.toLowerCase(),a=et(e),u=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([_,B])=>[_,B??""])),attributes:Object.fromEntries(e.getAttributeNames().map(_=>[_,e.getAttribute(_)??""]))}:{},l=Rr({operationSummary:s?.operationSummary,tagName:c,fallbackMode:"preview"}),d=ln(e),f=!0,E=Dr(e)?.getAttribute("data-vcp-edit-key")??null,A=pn(e),I=kr(e,o,i);return{ref:t,key:t.key,detailLevel:r,tagName:c,...s?{sourceKind:"jsx"}:{},...E?{parentKey:E}:{},...s?.pageCompositionUnitKey?{pageCompositionUnitKey:s.pageCompositionUnitKey}:{},...u,runtimeFlags:{selectable:!0,movable:l.canMove,removable:l.canRemove,textEditable:l.canUpdateText,container:d?!1:!!At(e)||l.canInsertChild||f&&an(c)},layoutSnapshot:I,layout:a,rect:{top:o.top,left:o.left,width:o.width,height:o.height},childBoxes:A,childRects:A.map(({rect:_})=>_),spacing:_t(e)}}function hr(e,t,n,r){let i=e.getBoundingClientRect(),o=kr(e,i,n);if(r==="light")return{ref:t,layoutSnapshot:o};if(r==="child-rects")return{ref:t,layoutSnapshot:o,childRects:fs(e)};let s=pn(e);return{ref:t,layoutSnapshot:o,childBoxes:s,childRects:s.map(({rect:c})=>c),layout:et(e),spacing:_t(e)}}function mr(e){let t=e.layout?.display??"",n=e.spacing;return["flex","inline-flex","grid","inline-grid"].includes(t)&&!!(n&&(n.columnGap>0||n.rowGap>0)&&(e.childRects?.length??0)>=2)}function ys(e,t,n,r,i){let o=t,s=hr(o,n,e,"detailed"),c=mr(s),a=null,u=null,l="mutation",d=Fe(e),f=d,E=!1,A=!1,I=({reason:$,sourceEventAt:x,forceEmit:P=!1,includeDetailedGeometry:T=!1})=>{(a===null||($==="scroll"?0:1)>=(l==="scroll"?0:1))&&(l=$,d=x),E=E||P,A=A||T,a===null&&(a=Et(e,_))},_=()=>{let $=Fe(e);a=null;let x=l,P=d,T=E,z=A;E=!1,A=!1;let U=ye(e.document,n,r?.()??null);if(!U)return;U!==o&&(L?.unobserve(o),o=U,L?.observe(o),z=!0);let h=z?"detailed":c?"child-rects":"light",v=hr(o,n,e,h),O=v.layoutSnapshot.rect.viewport;O.width<=0||O.height<=0||!T&&!bs(s,v)||(s=v,h==="detailed"&&(c=mr(v)),i(x,v,{sourceEventAt:P,captureStartedAt:$,capturedAt:Fe(e)}))},B=()=>{u!==null&&(e.clearTimeout(u),u=null)},D=()=>{B(),I({reason:"resize",sourceEventAt:Fe(e),includeDetailedGeometry:!0})},Z=()=>{B(),I({reason:"mutation",sourceEventAt:Fe(e),includeDetailedGeometry:!0})},g=()=>{f=Fe(e),I({reason:"scroll",sourceEventAt:f}),B(),u=e.setTimeout(()=>{u=null,I({reason:"scroll",sourceEventAt:f,forceEmit:!0,includeDetailedGeometry:!0})},ii)},te=e.ResizeObserver,L=typeof te=="function"?new te(D):null;L?.observe(o);let W=e.MutationObserver,ee=typeof W=="function"?new W(Z):null;ee?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",D,{passive:!0}),e.addEventListener("scroll",g,{passive:!0});let H=e.visualViewport;return H?.addEventListener?.("resize",D,{passive:!0}),H?.addEventListener?.("scroll",g,{passive:!0}),e.document.addEventListener("scroll",g,{capture:!0,passive:!0}),e.document.addEventListener("load",Z,!0),()=>{a!==null&&(It(e,a),a=null),B(),L?.disconnect(),ee?.disconnect(),e.removeEventListener("resize",D),e.removeEventListener("scroll",g),H?.removeEventListener?.("resize",D),H?.removeEventListener?.("scroll",g),e.document.removeEventListener("scroll",g,!0),e.document.removeEventListener("load",Z,!0)}}function Fe(e){let t=e.performance;return t&&Number.isFinite(t.timeOrigin)&&typeof t.now=="function"?t.timeOrigin+t.now():Date.now()}function bs(e,t){return Ss(e.layoutSnapshot,t.layoutSnapshot)||t.childBoxes!==void 0&&Is(e.childBoxes,t.childBoxes)||t.childRects!==void 0&&Cs(e.childRects,t.childRects)||t.layout!==void 0&&nn(e.layout,t.layout)||t.spacing!==void 0&&nn(e.spacing,t.spacing)}function Ss(e,t){return!e||!t?e!==t:e.version!==t.version||e.runtimeNodeId!==t.runtimeNodeId||xt(e.rect.viewport,t.rect.viewport)||xt(e.rect.document,t.rect.document)||e.layout.position!==t.layout.position||e.layout.transform!==t.layout.transform||e.layout.containingBlock.kind!==t.layout.containingBlock.kind||e.layout.containingBlock.kind==="element"&&t.layout.containingBlock.kind==="element"&&e.layout.containingBlock.runtimeNodeId!==t.layout.containingBlock.runtimeNodeId||e.scrollContext.scrollX!==t.scrollContext.scrollX||e.scrollContext.scrollY!==t.scrollContext.scrollY||e.scrollContext.viewportWidth!==t.scrollContext.viewportWidth||e.scrollContext.viewportHeight!==t.scrollContext.viewportHeight||Es(e.scrollContext.scrollContainers,t.scrollContext.scrollContainers)}function Es(e,t){return e.length!==t.length||e.some((n,r)=>{let i=t[r];return!i||n.runtimeNodeId!==i.runtimeNodeId||n.scrollLeft!==i.scrollLeft||n.scrollTop!==i.scrollTop})}function Is(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>{let s=r[o];return!s||xt(i.rect,s.rect)||nn(i.margin,s.margin)})}function Cs(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>xt(i,r[o]??i))}function nn(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 ke(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function xt(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 vs(e,t,n,r,i,o,s){let c=e.document,a=Qe(c,t,n,o);if(!a)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let u=i?ye(c,i,o):null;if(u&&rn(a,u))return mt(c,a,"self-or-descendant",o,s);if(r==="move"&&u){let I=_s(c,a,u,o,s);if(I){let _=Qt(I.child,I.targetParent,t,n,"nearest");if(_)return gt(c,I.child,I.targetParent,_,o,s)}}let l=null,d=!1,f=a,E=a.parentElement;for(;E;){if(E.getAttribute("data-vcp-edit-key")){if(u&&rn(E,u))return mt(c,a,"self-or-descendant",o,s);let I=gr(E,r,s);if(I==="accept"){l={child:f,targetParent:E};break}I==="blocked"&&(d=!0),f=E}E=E.parentElement}let A=gr(a,r,s);if(A==="accept"){if(l){let I=Qt(l.child,l.targetParent,t,n,"edge");if(I)return gt(c,l.child,l.targetParent,I,o,s)}return gt(c,a,a,Rs(a,t,n),o,s)}if(l){let I=Qt(l.child,l.targetParent,t,n,"nearest");return gt(c,l.child,l.targetParent,I??"after",o,s)}return A==="blocked"||d?mt(c,a,"operation-boundary-blocked",o,s):mt(c,a,"no-accepting-parent",o,s)}function mt(e,t,n,r,i){return{anchorHit:me(t,ge(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function gt(e,t,n,r,i,o){let s=me(t,ge(e,t,i),o,"summary"),c=me(n,ge(e,n,i),o,"summary"),a=et(n).indicatorOrientation,u=r==="append"||r==="prepend"?xs(n.getBoundingClientRect(),a,r):Ts(t.getBoundingClientRect(),a,r);return{anchorHit:s,targetParentHit:c,relation:r,indicatorOrientation:a,indicatorBounds:u}}function gr(e,t,n){if(ln(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":At(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return an(o)?"accept":"not-container"}function Qt(e,t,n,r,i){let o=et(t).indicatorOrientation,s=e.getBoundingClientRect(),c=o==="vertical"?s.width>0?(n-s.left)/s.width:.5:s.height>0?(r-s.top)/s.height:.5;return i==="edge"&&c>=.25&&c<=.75?null:c<.5?"before":"after"}function Rs(e,t,n){let r=et(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 et(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 xs(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 Ts(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 rn(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function _s(e,t,n,r,i){let o=As(e,t,n,r,i);if(o)return o;let s=Dr(n);if(!s||t===s)return null;let c=t,a=t.getAttribute("data-vcp-edit-key")?t:null;for(;c&&c!==s;)c.getAttribute("data-vcp-edit-key")&&(a=c),c=c.parentElement;return c!==s||!a||a===s||a===n||rn(a,n)?null:{child:a,targetParent:s}}function As(e,t,n,r,i){return null}function Dr(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function At(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=At(n);if(r)return r}return null}function yt(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:X(e.scrollX),scrollY:X(e.scrollY),scrollWidth:Math.max(X(t?.scrollWidth),X(n?.scrollWidth),X(e.innerWidth)),scrollHeight:Math.max(X(t?.scrollHeight),X(n?.scrollHeight),X(e.innerHeight)),viewportWidth:X(e.innerWidth),viewportHeight:X(e.innerHeight)}}function Ps(e,t){Object.entries(t.attributes??{}).forEach(([r,i])=>{if(i===null){e.removeAttribute(r);return}e.setAttribute(r,i)}),typeof t.className=="string"&&(e.className=t.className);let n=new Set(t.styleDeclarations?.map(r=>r.property)??[]);Object.entries(t.style??{}).forEach(([r,i])=>{if(n.has(r))return;let o=e.style,s=r.replace(/[A-Z]/g,c=>`-${c.toLowerCase()}`);if(i==null||i===""){o.removeProperty(s);return}o.setProperty(s,String(i))}),t.styleDeclarations?.forEach(r=>{let i=e.style,o=r.property.replace(/[A-Z]/g,c=>`-${c.toLowerCase()}`),s=r.value;if(s==null||s===""){i.removeProperty(o);return}i.setProperty(o,String(s),r.priority)})}var Ns=500,Ye=new Map;function ks(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function Ds(e,t){if(Ye.size>=Ns){let n=Ye.keys().next().value;n&&Ye.delete(n)}Ye.set(e,t)}var Je=new Set;function Bs(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 Je)r.has(i)||n?.removeProperty(i);Je.clear();for(let i of r)Je.add(i);Vs(e,t.stylesheets??[])}function ws(e){let t=e.documentElement?.style;for(let n of Je)t?.removeProperty(n);Je.clear();for(let n of Or(e))n.remove()}function Os(e,t){let n=Array.from(new Set(t.filter(s=>typeof s=="string"&&s.startsWith("--"))));if(n.length===0)return{};let r=e.documentElement,i=r?e.defaultView?.getComputedStyle(r):null,o={};for(let s of n){let c=Br(i,s);c&&(o[s]=c)}return o}function Br(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return wr(e,r,n)}function wr(e,t,n){if(!t)return null;let r=Ms(t);if(!r)return t;let i=Br(e,r.name,n);return i||(r.fallback?wr(e,r.fallback,n)??r.fallback:null)}function Ms(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=Fs(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 Fs(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 Vs(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of Or(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(Sr,"true"),s.setAttribute("href",o),i.appendChild(s)}}function Or(e){return Array.from(e.querySelectorAll(`link[${Sr}]`))}function qs(e,t,n,r,i={}){let o=i.textNode?Ks(e.document,i.textNode):null;if(i.textNode&&!o)throw new Error("Failed to prepare text segment editor");let s=o?.element??t,c=s.textContent??"",a=o?void 0:t.innerHTML,u=Ws(s),l=!1,d=()=>{e.document.removeEventListener("pointerdown",E,!0),s.removeEventListener("keydown",A),s.removeEventListener("blur",I),s.removeEventListener("input",_),Hs(s,u)},f=B=>{if(l)return;l=!0;let D=s.textContent??"";if(d(),B==="cancel"){o?.restore(c),o||(t.textContent=c),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(D),B==="commit"&&D!==c){i.onCommitSnapshot?.({ref:n,initialText:c,...a!==void 0?{initialHtml:a}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:D}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function E(B){let D=B.target;D&&s.contains(D)||f("commit")}function A(B){if(B.key==="Escape"){B.preventDefault(),f("cancel");return}B.key==="Enter"&&(B.metaKey||B.ctrlKey)&&(B.preventDefault(),f("commit"))}function I(){f("commit")}function _(){r({kind:"text-edit-input",payload:{ref:n,hit:me(t,n,void 0,"full")}})}return zs(s),e.document.addEventListener("pointerdown",E,!0),s.addEventListener("keydown",A),s.addEventListener("blur",I),s.addEventListener("input",_),js(s),Gs(s,e.document),d}function Ks(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 Ws(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 zs(e){$s(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 Hs(e,t){Zt(e,"contenteditable",t.contentEditable),Zt(e,"spellcheck",t.spellcheck),Zt(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function $s(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 Zt(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function Us(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 js(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function Gs(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function Mr(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function X(e){let t=Number(e);return Number.isFinite(t)?t:0}import Ys from"node:http";import fn from"node:fs";import{createHash as zr,randomBytes as Xs,timingSafeEqual as Ls}from"node:crypto";import Re from"node:path";import{WebSocket as Hr,WebSocketServer as Js}from"ws";import{createPreviewSiteEditEngineRuntime as Qs,openFileHistoryStore as Zs,resolveManagedPageTemplateComposition as ec,scanSiteEditCompositionsFromFiles as tc}from"@vcp-dev/site-edit-engine";import{resolveNextAppRouteId as nc,scanNextAppRouterRoutesFromFiles as rc}from"@vcp-dev/site-edit-engine/next-app-router";import{SiteEditSourceWatcher as oc}from"@vcp-dev/site-edit-engine/source-watcher";var Pt=class{constructor(){this.tail=Promise.resolve()}run(t){let n=this.tail.then(t,t);return this.tail=n.then(()=>{},()=>{}),n}};import{SiteEditOperationRequestSchema as ic,computeSiteEditCompositionKey as De}from"@vcp-dev/contracts";var sc="127.0.0.1",cc=30218,ac="/__vcp/site-edit/bridge",$r=6*1024*1024,uc=$r*2,lc=3e3,Fr=50,Vr="__VCP_SITE_EDIT_BRIDGE_SERVERS__";function Ha(e){let t=jr(e),n=Yr(t),r=Gr(),i=r.get(n);if(i)return i;let o=new Nt(t);r.set(n,o);try{o.start()}catch(s){throw r.delete(n),o.stop(),s}return o}function Ur(e,t,n={}){let r=new Nt(jr(t),e,!1,n);return r.start({listen:!1}),r}var Nt=class{constructor(t,n=Ys.createServer((o,s)=>{s.writeHead(404),s.end("VCP site edit bridge server")}),r=!0,i={}){this.options=t,this.server=n,this.closeHttpServerOnStop=r,this.dependencies=i,this.runtime=null,this.activeHistorySessionId=null,this.historySessionTransition=Promise.resolve(),this.mutationQueue=new Pt,this.eventListeners=new Set,this.routes=[],this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.stopWatching=null,this.stopWebSocketServer=null,this.pendingChangedFiles=new Set,this.fileChangeTimer=null,this.isStarted=!1,this.runtimeVersionFloors=new Map,this.activeHistoryStore=null,this.versionPersistence=Promise.resolve()}start(t={}){if(this.isStarted)return;this.refreshCompositions(!0),this.isStarted=!0,this.createRuntime();let n=mc({server:this.server,path:this.options.path,sessionKey:this.options.sessionKey,host:this.options.host,allowedOrigins:this.options.allowedOrigins,engine:this.createBridgeEngine()});this.stopWebSocketServer=n.stop,this.stopWatching=new oc({projectRoot:this.options.projectRoot,watch_dirs:dc(this.options.runtime.watch_dirs),interval_ms:this.options.runtime.watch_interval_ms,debounce_ms:this.options.runtime.watch_debounce_ms??Fr,max_dirs:this.options.runtime.watch_max_dirs,max_files:this.options.runtime.watch_max_files,max_depth:this.options.runtime.watch_max_depth,max_startup_ms:this.options.runtime.watch_max_startup_ms,on_change:r=>this.handleFileChanged(r),on_batch_change:r=>this.handleFilesChanged(r)}).start(),t.listen!==!1&&this.server.listen(this.options.port,this.options.host)}getHealth(){let t=!!this.runtime&&!this.compositionResolutionError;return{ok:this.isStarted&&t,bridgePath:this.options.path,runtimeReady:t,routesIndexed:this.routes.length,sessionRequired:!!this.options.sessionKey}}stop(){this.stopWatching?.(),this.stopWatching=null,this.flushChangedFiles(),this.fileChangeTimer&&(clearTimeout(this.fileChangeTimer),this.fileChangeTimer=null),this.stopWebSocketServer?.(),this.stopWebSocketServer=null,this.runtime?.dispose(),this.runtime=null,this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.closeHttpServerOnStop&&this.server.close();let t=Gr(),n=Yr(this.options);t.get(n)===this&&t.delete(n),this.isStarted=!1}createRuntime(t,n=null){let r=this.runtime;this.activeHistoryStore=t??null;let i=(this.dependencies.createRuntime??Qs)({...this.options.tenantId?{tenantId:this.options.tenantId}:{},siteId:this.options.siteId,snapshotId:this.options.snapshotId,projectRoot:this.options.projectRoot,compositions:this.compositions,onEvent:o=>{"version"in o&&typeof o.version=="number"&&this.recordRuntimeVersion(o.version,"composition"in o?o.composition:void 0);for(let s of this.eventListeners)s(o)},...t?{historyStore:t}:{},...this.getInitialDocumentVersions().length>0?{initialDocumentVersions:this.getInitialDocumentVersions()}:{}});this.runtime=i,this.activeHistorySessionId=n,r?.dispose()}createBridgeEngine(){return{resolveComposition:t=>this.resolveComposition(t),initializeSession:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)throw new Error(`${n.code}: ${n.message}`);let r=fc(t.composition),i=this.getRuntime(),o=Ee(r);await i.initializeComposition(o);let c=i.getDocument(o).data;await this.recordRuntimeVersion(c.version,r);let a=(await i.getHistoryStatus()).data;return{ok:!0,composition:r,data:{document:c,historyStatus:a}}}),getDocument:async t=>{let n=this.getRuntime(),r=Ee(t);await n.initializeComposition(r);let i=n.getDocument(r);return await this.recordRuntimeVersion(i.data.version,t),{...i,composition:t}},getHistoryStatus:async t=>({...await this.getRuntime().getHistoryStatus(),composition:t}),getStyleContext:async t=>this.getRuntime().getStyleContext(Ee(t)),getObjectEditContext:async(t,n)=>this.getRuntime().getObjectEditContext(t,Ee(n)),getClassNameSource:async(t,n)=>this.getRuntime().getClassNameSource(t,Ee(n)),getSourceTree:async t=>this.getRuntime().getSourceTree(Ee(t)),getSourceFile:async t=>this.getRuntime().getSourceFile({path:t.path,composition:Ee(t.composition)}),resolveSourceLocation:async t=>this.getRuntime().resolveSourceLocation({key:t.key,composition:Ee(t.composition)}),execute:(t,n)=>this.mutationQueue.run(async()=>{let r=await this.bindHistorySession(this.options.snapshotId);if(!r.ok)return hn(r,t);let i=await this.getRuntime().executeOperation(t);return i.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(i.data.resultVersion,i.composition),i}),undo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return hn(n,void 0,t);let r=await this.getRuntime().undo();return r.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(r.data.resultVersion,r.composition??t),r.composition?r:{...r,composition:t}}),redo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return hn(n,void 0,t);let r=await this.getRuntime().redo();return r.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(r.data.resultVersion,r.composition??t),r.composition?r:{...r,composition:t}}),subscribe:t=>(this.eventListeners.add(t),()=>this.eventListeners.delete(t))}}async bindHistorySession(t){if(!this.options.historyRoot)return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history is not configured."};if(this.activeHistorySessionId===t)return{ok:!0};let n=this.historySessionTransition.then(async()=>{if(this.activeHistorySessionId===t)return;let r=await(this.dependencies.openHistoryStore??Zs)(hc({root:this.options.historyRoot,siteId:this.options.siteId,snapshotId:this.options.snapshotId,editingSessionId:t}));if(!this.isStarted)return;let i=r.readDocumentVersion?await r.readDocumentVersion():0,o=this.compositions[0]?.context;if(o){let s=De(o);this.runtimeVersionFloors.set(s,Math.max(this.runtimeVersionFloors.get(s)??0,i))}this.createRuntime(r,t)});this.historySessionTransition=n.catch(()=>{});try{return await n,{ok:!0}}catch{return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history could not be opened."}}}recordRuntimeVersion(t,n){let r=n?De(n):null;r&&this.runtimeVersionFloors.set(r,Math.max(this.runtimeVersionFloors.get(r)??0,t));let i=this.activeHistoryStore;if(!i?.writeDocumentVersion)return Promise.resolve();let o=r?this.runtimeVersionFloors.get(r)??t:t;return this.versionPersistence=this.versionPersistence.then(()=>i.writeDocumentVersion(o)).catch(()=>{}),this.versionPersistence}handleFileChanged(t){this.handleFilesChanged([t])}handleFilesChanged(t){for(let r of t)this.pendingChangedFiles.add(r);this.fileChangeTimer&&clearTimeout(this.fileChangeTimer);let n=this.options.runtime.watch_debounce_ms??Fr;this.fileChangeTimer=setTimeout(()=>{this.fileChangeTimer=null,this.flushChangedFiles()},n),this.fileChangeTimer?.unref?.()}flushChangedFiles(){if(this.fileChangeTimer&&(clearTimeout(this.fileChangeTimer),this.fileChangeTimer=null),this.pendingChangedFiles.size===0)return;let t=[...this.pendingChangedFiles].sort((n,r)=>n.localeCompare(r));if(this.pendingChangedFiles.clear(),!!this.refreshCompositions(!1))for(let n of t)this.runtime?.notifyFileChanged(n)}refreshCompositions(t=!1){try{let n=pc(this.options.projectRoot),r=rc(n),i=r.length>0?r:(this.options.runtime.routes??[]).map(a=>({...a})),o=tc({files:n});if(o.length===0)throw new Error("No canonical App Router composition is indexed by the preview bridge.");let s=new Map(this.compositions.map(a=>[De(a.context),a])),c=new Map(o.map(a=>[De(a.context),a]));if(this.runtime){for(let[a,u]of s){let l=c.get(a);(!l||l.entryFile!==u.entryFile)&&this.runtime.unregisterComposition(Ee(u.context))}for(let[a,u]of c){let l=s.get(a);(!l||l.entryFile!==u.entryFile)&&this.runtime.registerComposition(u.context,u.entryFile)}}return this.routes=i,this.compositions=o,this.compositionFiles=n,this.compositionResolutionError=null,!0}catch(n){let r=n instanceof Error?n:new Error(String(n));if(this.compositionResolutionError=r,t)throw r;return!1}}resolveComposition(t){if(this.compositionResolutionError)throw this.compositionResolutionError;let n=nc(t.routeId,this.routes,this.options.basePath);if(!n)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let r=this.routes.find(s=>s.routeId===n);if(!r)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let i=ec({selector:{routeId:n,...t.templateId?{templateId:t.templateId}:{}},files:this.compositionFiles,canonicalEntryFile:r.entryFile}),o=De(i.context);if(!this.compositions.some(s=>De(s.context)===o))throw new Error(`Composition is not registered by the preview bridge: ${o}`);return i}getInitialDocumentVersions(){return this.compositions.flatMap(t=>{let n=this.runtimeVersionFloors.get(De(t.context));return n===void 0?[]:[{composition:t.context,version:n}]})}getRuntime(){if(!this.runtime)throw new Error("VCP site edit preview bridge runtime is not ready");return this.runtime}};function jr(e){return{tenantId:e.tenantId,siteId:e.siteId,snapshotId:e.snapshotId,projectRoot:Re.resolve(e.projectRoot??process.cwd()),basePath:e.basePath??"",host:e.host??sc,port:e.port??cc,path:e.path??ac,sessionKey:e.sessionKey??Cc(),historyRoot:e.historyRoot,allowedOrigins:e.allowedOrigins??[],runtime:e.runtime??{}}}function dc(e){let t=["app","src/app","components/site","src/components/site","lib/generated","src/lib/generated","public"];return[...new Set([...e?.length?e:t,".vcp"])]}function pc(e){let t=[],n=["app","src/app",".vcp"],r=new Set([".git",".next",".turbo","coverage","dist","node_modules","output","snapshot-store"]),i=o=>{if(!fn.existsSync(o))return;let s;try{s=fn.readdirSync(o,{withFileTypes:!0})}catch{return}for(let c of s){if(c.name.startsWith(".")&&c.name!==".vcp")continue;if(c.isDirectory()){if(r.has(c.name))continue;i(Re.join(o,c.name));continue}if(!c.isFile())continue;let a=Re.join(o,c.name),u="";try{u=fn.readFileSync(a,"utf8")}catch{}t.push({path:Re.relative(e,a).replaceAll(Re.sep,"/"),content:u})}};for(let o of n)i(Re.join(e,o));return t.sort((o,s)=>o.path.localeCompare(s.path))}function fc(e){if(!e||typeof e!="object"||typeof e.routeId!="string")throw new Error("Normalized composition context is required.");if("effectiveTemplateId"in e)return e;let t=e;return{routeId:t.routeId,...t.templateId?{effectiveTemplateId:t.templateId}:{}}}function Ee(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function hc(e){return Re.join(Re.resolve(e.root),qr(e.siteId),qr(e.snapshotId),zr("sha256").update(e.editingSessionId).digest("hex").slice(0,32))}function qr(e){return/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)&&e!=="."&&e!==".."?e:zr("sha256").update(e).digest("hex").slice(0,32)}function Gr(){let e=globalThis;return e[Vr]??=new Map,e[Vr]}function Yr(e){return`${e.projectRoot}:${e.host}:${e.port}:${e.path}:${e.historyRoot??""}`}function hn(e,t,n){let r=n??(t?.composition?{routeId:t.composition.routeId,...t.composition.templateId?{effectiveTemplateId:t.composition.templateId}:{}}:void 0);if(!r)throw new Error("A normalized composition is required to construct a mutation result.");return{ok:!1,composition:r,error:{code:e.code,message:e.message},data:{requestId:t?.id??"mutation-context",kind:t?.kind??"update-text",composition:r,target:t?.target??{kind:"node",key:""},resultVersion:t?.documentVersion??0}}}function mc(e){let t=new Js({maxPayload:$r,noServer:!0}),n=new WeakSet,r=o=>{new st({socket:new gn(o),engine:e.engine,validateOperationRequest:s=>ic.safeParse(s).success})},i=(o,s,c)=>{if(!gc(o,e))return;let a=yc(o,e);if(!a){s.write(`HTTP/1.1 401 Unauthorized\r
|
|
32
32
|
Connection: close\r
|
|
33
33
|
\r
|
|
34
|
-
`),s.destroy();return}a.authenticatedByHeader&&n.add(o),t.handleUpgrade(o,s,c,u=>{t.emit("connection",u,o)})};return e.server.on("upgrade",i),t.on("connection",(o,s)=>{if(n.has(s)){r(o);return}yc(o,e.sessionKey,()=>{r(o)})}),t.stop=()=>{e.server.off("upgrade",i);for(let o of t.clients)o.close(1001,"bridge stopped");t.close()},t}var mn=class{constructor(t){this.socket=t,this.onmessage=null,this.onclose=null,t.on("error",()=>{}),t.on("message",n=>{this.onmessage?.({data:n.toString()})}),t.on("close",()=>{this.onclose?.()})}send(t){if(this.socket.readyState===Kr.OPEN){if(this.socket.bufferedAmount+Buffer.byteLength(t,"utf8")>ac){this.socket.close(1013,"bridge backpressure");return}this.socket.send(t)}}close(t,n){this.socket.close(t,n)}};function mc(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function gc(e,t){if(new URL(e.url??"/","http://localhost").searchParams.has("vcp_bridge_key"))return null;let r=fn(e.headers["x-vcp-site-edit-key"]),i=jr(r,t.sessionKey),o=fn(e.headers.host),s=fn(e.headers.origin);return o&&!bc(o,t.host,s)?null:s?Ec(s,o,t.allowedOrigins)?{authenticatedByHeader:i}:null:i?{authenticatedByHeader:!0}:null}function yc(e,t,n){let r=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},uc),i,o=()=>{clearTimeout(r),e.off("message",i),e.off("close",o)},s=()=>{o(),e.close(1008,"bridge authentication failed")};i=c=>{try{let a=se.parseMessage(c.toString());if(a.type!=="auth"||!jr(a.payload.key,t)){s();return}o(),e.readyState===Kr.OPEN&&e.send(se.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{s()}},e.on("message",i),e.on("close",o)}function jr(e,t){if(!e)return!1;let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&Xs(n,r)}function bc(e,t,n){let r=Vr(e),i=Vr(t);return r===i||Fr(i)&&Fr(r)&&(!n||gn(n,e))||Sc(i)&&(!n||gn(n,e))}function Sc(e){return e==="0.0.0.0"||e==="::"}function Fr(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Ec(e,t,n){return n.includes(e)||(t?gn(e,t):!1)}function gn(e,t){try{return new URL(e).host===Gr(t)}catch{return!1}}function Vr(e){let t=Gr(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function Gr(e){return e.trim().toLowerCase()}function fn(e){return Array.isArray(e)?e[0]:e}function Ic(){return Ys(32).toString("base64url")}import Cc from"node:http";import{existsSync as qe,readFileSync as Ve}from"node:fs";import{createRequire as Jr}from"node:module";import tt from"node:path";import{basename as Qr,dirname as nt,join as rt}from"node:path";import{fileURLToPath as Zr}from"node:url";var vc="next",Rc="127.0.0.1",xc=3e3,Dt="/__vcp/site-edit/bridge",eo="/__vcp/site-edit/health",Bt="/__vcp/site-edit/client/",Tc=`${Bt}auto-bootstrap.js`,to='data-vcp-site-edit-bootstrap="true"',_c=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],Ac="@vcp-dev/site-edit-engine/webpack-loader",Pc=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,kc=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],Nc=new Set(["auto-bootstrap.js","client.js","composition-key.js","designer-trace.js","document-codec.js","protocol.js","window-message.js"]);async function Qa(e={},t={}){let n=t.process??process,r=t.createServer??Cc.createServer,i=t.attachBridgeServer??zr,o=t.loadNext??ia,s=tt.resolve(e.projectRoot??process.cwd()),c=e.host??Rc,a=e.port??ua(n.env.PORT)??xc,u=e.bridgePath??Dt,l=Vc(u),d=ea(),h=e.basePath??n.env.VCP_SITE_PREVIEW_BASE_PATH??"/",E=(e.tenantId??n.env.VCP_TENANT_ID)?.trim()||void 0,N=await o(s),C=Dc(s),_=N({dev:!0,dir:s,hostname:c,port:a,...Bc(C)}),B=_.getRequestHandler(),D=e.siteId??n.env.VCP_SITE_ID??"018f6f4d-a9b8-7120-8000-000000000120",Z=e.snapshotId??n.env.VCP_SNAPSHOT_ID??aa(s),g=e.historyRoot??n.env.VCP_SITE_EDIT_HISTORY_ROOT,te=g?.trim()?tt.resolve(g):void 0,L=null,W=r((A,T)=>{Uc({basePath:h,bridgePath:u,bridgeHealthPath:l,bridgeSessionKey:d,getBridgeHealth:()=>L?.getHealth()??Gc(u),handle:B,request:A,response:T}).catch(z=>{console.error(z),T.headersSent||(T.statusCode=500),T.end("site edit preview request failed")})}),ee=null,$=null,H=()=>$||(Nt(()=>n.off("SIGINT",x)),Nt(()=>n.off("SIGTERM",x)),Nt(()=>ee?.()),ee=null,Nt(()=>L?.stop()),L=null,$=Promise.allSettled([da(W),pa(()=>_.close())]).then(()=>{}),$),x=()=>{H()};try{return await _.prepare(),L=i(W,{...E?{tenantId:E}:{},siteId:D,snapshotId:Z,projectRoot:s,basePath:h,host:c,port:a,path:u,sessionKey:d,...te?{historyRoot:te}:{}}),ee=Mc({server:W,bridgePath:u,handleUpgrade:_.getUpgradeHandler()}),n.on("SIGINT",x),n.on("SIGTERM",x),await la(W,a,c),{bundler:C,close:H,host:c,port:ha(W,a),server:W}}catch(A){throw await H(),A}}function Dc(e){let t=wc(e);return t&&Oc(t)?"webpack":"turbopack"}function Bc(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function wc(e){for(let t of _c){let n=rt(e,t);if(qe(n))return Ve(n,"utf8")}return null}function Oc(e){return e.includes(Ac)?!0:Pc.test(e)&&kc.some(t=>t.test(e))}function Mc(e){let t=(n,r,i)=>{Fc(n.url,e.bridgePath)||e.handleUpgrade(n,r,i).catch(o=>{console.error(o),r.destroyed||r.destroy()})};return e.server.on("upgrade",t),()=>e.server.off("upgrade",t)}function Fc(e,t){return new URL(e??"/","http://localhost").pathname===t}function Vc(e=Dt){if(e===Dt)return eo;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function qc(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??Kc()});return`<script type="module" ${to}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(Tc)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function Kc(){return{bridge:yn("@vcp-dev/site-edit-bridge"),contracts:yn("@vcp-dev/contracts"),engine:yn("@vcp-dev/site-edit-engine")}}function yn(e){let t=Jr(import.meta.url);try{let n=t.resolve(e),r=Wc(n,e);if(!r)return;let i=JSON.parse(Ve(r,"utf8"));return typeof i.version=="string"?i.version:void 0}catch{return}}function Wc(e,t){let n=tt.parse(e).root,r=nt(e);for(;r&&r!==n;){let i=rt(r,"package.json");if(qe(i))try{if(JSON.parse(Ve(i,"utf8")).name===t)return i}catch{return}r=nt(r)}}function zc(e,t){if(e.includes(to))return e;let n=qc(t),r=/<\/body\s*>/i.exec(e);return r?`${e.slice(0,r.index)}${n}${e.slice(r.index)}`:`${e}${n}`}function Za(e,t=nt(Zr(import.meta.url)),n=qe){return no(e,t,n)?.path??null}function no(e,t=nt(Zr(import.meta.url)),n=qe){let r=new URL(e??"/","http://localhost").pathname;if(!r.startsWith(Bt))return null;let i=r.slice(Bt.length);if(!Nc.has(i))return null;let o=bn(sa(t),i);if(Qr(t)!=="src")return{path:o,requiresTranspile:!1};let s=bn(t,i.replace(/\.js$/,".ts"));return n(s)?{path:s,requiresTranspile:!0}:{path:o,requiresTranspile:!1}}async function $c(e,t){let n=no(e.url);if(!n)return!1;if(!qe(n.path))return t.writeHead(404),t.end("site edit client asset not found"),!0;let r=n.requiresTranspile?await Hc(Ve(n.path,"utf8")):Ve(n.path);return t.writeHead(200,{"cache-control":"no-store","content-type":"text/javascript; charset=utf-8"}),t.end(r),!0}async function Hc(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function Uc({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:r,getBridgeHealth:i,handle:o,request:s,response:c}){if(jc(s,c,n,i)||await $c(s,c))return;let a=Yc(s),u=Xc(s),l=a||u?Qc(c,{basePath:e,bridgePath:t,bridgeSessionKey:r,patchNextDevChunk:u}):()=>{};try{await o(s,c)}catch(d){throw l(),d}}function jc(e,t,n,r){if(e.method!=="GET"||new URL(e.url??"/","http://localhost").pathname!==n)return!1;let o=r();return t.writeHead(o.ok?200:503,{"cache-control":"no-store","content-type":"application/json; charset=utf-8"}),t.end(JSON.stringify(o)),!0}function Gc(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function Yc(e){return Lc(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Xc(e){return Jc(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Lc(e){if(e.method!=="GET")return!1;let t=new URL(e.url??"/","http://localhost").pathname;if(t.startsWith("/_next/")||t.startsWith(Bt)||t===Dt||t===eo)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function Jc(e){if(e.method!=="GET"||!String(e.headers["user-agent"]??"").includes("Firefox"))return!1;let n=new URL(e.url??"/","http://localhost").pathname;return n.startsWith("/_next/static/chunks/")&&n.endsWith(".js")}function Qc(e,t){let n=[],r=e,i=r.flushHeaders.bind(e),o=r.write.bind(e),s=r.end.bind(e);return r.flushHeaders=()=>{},r.write=(c,a,u)=>(c!==void 0&&n.push(Yr(c,Xr(a))),Lr(a),Lr(u),!0),r.end=(c,a,u)=>{let l=typeof c=="function"?void 0:c;l!==void 0&&n.push(Yr(l,Xr(a))),r.write=o,r.end=s,r.flushHeaders=i;let d=Buffer.concat(n),h=Zc(e,d,t);h!==d&&!e.headersSent&&e.removeHeader("content-length");let E=typeof c=="function"?c:typeof a=="function"?a:typeof u=="function"?u:void 0;return E?s(h,E):s(h)},()=>{r.write=o,r.end=s,r.flushHeaders=i}}function Zc(e,t,n){if(ta(e,t))return Buffer.from(zc(t.toString("utf8"),n));if(n.patchNextDevChunk&&na(e)){let r=t.toString("utf8"),i=ra(r);if(i!==r)return Buffer.from(i)}return t}function ea(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function ta(e,t){if(e.statusCode<200||e.statusCode>=300)return!1;let n=e.getHeader("content-type"),r=Array.isArray(n)?n.join(";"):String(n??"");return t.toString("utf8",0,256).includes("<html")&&(r===""||r.includes("text/html"))}function na(e){if(e.statusCode<200||e.statusCode>=300)return!1;let t=e.getHeader("content-type"),n=Array.isArray(t)?t.join(";"):String(t??"");return n===""||n.includes("javascript")||n.includes("ecmascript")}function ra(e){return[["debugChannel = createDebugChannel(undefined);","debugChannel = undefined;"],["if (isStreamErrorOrUnfinished(ctr)) {","if (false) {"],["return ctr.desiredSize === null || ctr.desiredSize < 0;","return false;"],[["findSourceMapURL: _appfindsourcemapurl.findSourceMapURL,"," debugChannel,"," startTime: 0"].join(`
|
|
34
|
+
`),s.destroy();return}a.authenticatedByHeader&&n.add(o),t.handleUpgrade(o,s,c,u=>{t.emit("connection",u,o)})};return e.server.on("upgrade",i),t.on("connection",(o,s)=>{if(n.has(s)){r(o);return}bc(o,e.sessionKey,()=>{r(o)})}),t.stop=()=>{e.server.off("upgrade",i);for(let o of t.clients)o.close(1001,"bridge stopped");t.close()},t}var gn=class{constructor(t){this.socket=t,this.onmessage=null,this.onclose=null,t.on("error",()=>{}),t.on("message",n=>{this.onmessage?.({data:n.toString()})}),t.on("close",()=>{this.onclose?.()})}send(t){if(this.socket.readyState===Hr.OPEN){if(this.socket.bufferedAmount+Buffer.byteLength(t,"utf8")>uc){this.socket.close(1013,"bridge backpressure");return}this.socket.send(t)}}close(t,n){this.socket.close(t,n)}};function gc(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function yc(e,t){if(new URL(e.url??"/","http://localhost").searchParams.has("vcp_bridge_key"))return null;let r=mn(e.headers["x-vcp-site-edit-key"]),i=Xr(r,t.sessionKey),o=mn(e.headers.host),s=mn(e.headers.origin);return o&&!Sc(o,t.host,s)?null:s?Ic(s,o,t.allowedOrigins)?{authenticatedByHeader:i}:null:i?{authenticatedByHeader:!0}:null}function bc(e,t,n){let r=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},lc),i,o=()=>{clearTimeout(r),e.off("message",i),e.off("close",o)},s=()=>{o(),e.close(1008,"bridge authentication failed")};i=c=>{try{let a=se.parseMessage(c.toString());if(a.type!=="auth"||!Xr(a.payload.key,t)){s();return}o(),e.readyState===Hr.OPEN&&e.send(se.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{s()}},e.on("message",i),e.on("close",o)}function Xr(e,t){if(!e)return!1;let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&Ls(n,r)}function Sc(e,t,n){let r=Wr(e),i=Wr(t);return r===i||Kr(i)&&Kr(r)&&(!n||yn(n,e))||Ec(i)&&(!n||yn(n,e))}function Ec(e){return e==="0.0.0.0"||e==="::"}function Kr(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Ic(e,t,n){return n.includes(e)||(t?yn(e,t):!1)}function yn(e,t){try{return new URL(e).host===Lr(t)}catch{return!1}}function Wr(e){let t=Lr(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function Lr(e){return e.trim().toLowerCase()}function mn(e){return Array.isArray(e)?e[0]:e}function Cc(){return Xs(32).toString("base64url")}import vc from"node:http";import{existsSync as qe,readFileSync as Ve}from"node:fs";import{createRequire as Qr}from"node:module";import tt from"node:path";import{basename as Zr,dirname as nt,join as rt}from"node:path";import{fileURLToPath as eo}from"node:url";var Rc="next",xc="127.0.0.1",Tc=3e3,Bt="/__vcp/site-edit/bridge",to="/__vcp/site-edit/health",wt="/__vcp/site-edit/client/",_c=`${wt}auto-bootstrap.js`,no='data-vcp-site-edit-bootstrap="true"',Ac=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],Pc="@vcp-dev/site-edit-engine/webpack-loader",Nc=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,kc=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],Dc=new Set(["auto-bootstrap.js","client.js","composition-key.js","designer-trace.js","document-codec.js","protocol.js","window-message.js"]);async function Qa(e={},t={}){let n=t.process??process,r=t.createServer??vc.createServer,i=t.attachBridgeServer??Ur,o=t.loadNext??ia,s=tt.resolve(e.projectRoot??process.cwd()),c=e.host??xc,a=e.port??ua(n.env.PORT)??Tc,u=e.bridgePath??Bt,l=qc(u),d=ea(),f=e.basePath??n.env.VCP_SITE_PREVIEW_BASE_PATH??"/",E=(e.tenantId??n.env.VCP_TENANT_ID)?.trim()||void 0,A=await o(s),I=Bc(s),_=A({dev:!0,dir:s,hostname:c,port:a,...wc(I)}),B=_.getRequestHandler(),D=e.siteId??n.env.VCP_SITE_ID??"018f6f4d-a9b8-7120-8000-000000000120",Z=e.snapshotId??n.env.VCP_SNAPSHOT_ID??aa(s),g=e.historyRoot??n.env.VCP_SITE_EDIT_HISTORY_ROOT,te=g?.trim()?tt.resolve(g):void 0,L=null,W=r((P,T)=>{jc({basePath:f,bridgePath:u,bridgeHealthPath:l,bridgeSessionKey:d,getBridgeHealth:()=>L?.getHealth()??Yc(u),handle:B,request:P,response:T}).catch(z=>{console.error(z),T.headersSent||(T.statusCode=500),T.end("site edit preview request failed")})}),ee=null,H=null,$=()=>H||(Dt(()=>n.off("SIGINT",x)),Dt(()=>n.off("SIGTERM",x)),Dt(()=>ee?.()),ee=null,Dt(()=>L?.stop()),L=null,H=Promise.allSettled([da(W),pa(()=>_.close())]).then(()=>{}),H),x=()=>{$()};try{return await _.prepare(),L=i(W,{...E?{tenantId:E}:{},siteId:D,snapshotId:Z,projectRoot:s,basePath:f,host:c,port:a,path:u,sessionKey:d,...te?{historyRoot:te}:{}}),ee=Fc({server:W,bridgePath:u,handleUpgrade:_.getUpgradeHandler()}),n.on("SIGINT",x),n.on("SIGTERM",x),await la(W,a,c),{bundler:I,close:$,host:c,port:fa(W,a),server:W}}catch(P){throw await $(),P}}function Bc(e){let t=Oc(e);return t&&Mc(t)?"webpack":"turbopack"}function wc(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function Oc(e){for(let t of Ac){let n=rt(e,t);if(qe(n))return Ve(n,"utf8")}return null}function Mc(e){return e.includes(Pc)?!0:Nc.test(e)&&kc.some(t=>t.test(e))}function Fc(e){let t=(n,r,i)=>{Vc(n.url,e.bridgePath)||e.handleUpgrade(n,r,i).catch(o=>{console.error(o),r.destroyed||r.destroy()})};return e.server.on("upgrade",t),()=>e.server.off("upgrade",t)}function Vc(e,t){return new URL(e??"/","http://localhost").pathname===t}function qc(e=Bt){if(e===Bt)return to;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function Kc(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??Wc()});return`<script type="module" ${no}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(_c)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function Wc(){return{bridge:bn("@vcp-dev/site-edit-bridge"),contracts:bn("@vcp-dev/contracts"),engine:bn("@vcp-dev/site-edit-engine")}}function bn(e){let t=Qr(import.meta.url);try{let n=t.resolve(e),r=zc(n,e);if(!r)return;let i=JSON.parse(Ve(r,"utf8"));return typeof i.version=="string"?i.version:void 0}catch{return}}function zc(e,t){let n=tt.parse(e).root,r=nt(e);for(;r&&r!==n;){let i=rt(r,"package.json");if(qe(i))try{if(JSON.parse(Ve(i,"utf8")).name===t)return i}catch{return}r=nt(r)}}function Hc(e,t){if(e.includes(no))return e;let n=Kc(t),r=/<\/body\s*>/i.exec(e);return r?`${e.slice(0,r.index)}${n}${e.slice(r.index)}`:`${e}${n}`}function Za(e,t=nt(eo(import.meta.url)),n=qe){return ro(e,t,n)?.path??null}function ro(e,t=nt(eo(import.meta.url)),n=qe){let r=new URL(e??"/","http://localhost").pathname;if(!r.startsWith(wt))return null;let i=r.slice(wt.length);if(!Dc.has(i))return null;let o=In(sa(t),i);if(Zr(t)!=="src")return{path:o,requiresTranspile:!1};let s=In(t,i.replace(/\.js$/,".ts"));return n(s)?{path:s,requiresTranspile:!0}:{path:o,requiresTranspile:!1}}async function $c(e,t){let n=ro(e.url);if(!n)return!1;if(!qe(n.path))return t.writeHead(404),t.end("site edit client asset not found"),!0;let r=n.requiresTranspile?await Uc(Ve(n.path,"utf8")):Ve(n.path);return t.writeHead(200,{"cache-control":"no-store","content-type":"text/javascript; charset=utf-8"}),t.end(r),!0}async function Uc(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function jc({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:r,getBridgeHealth:i,handle:o,request:s,response:c}){if(Gc(s,c,n,i)||await $c(s,c))return;let a=Xc(s),u=Lc(s),l=a||u?Zc(c,{basePath:e,bridgePath:t,bridgeSessionKey:r,patchNextDevChunk:u}):()=>{};try{await o(s,c)}catch(d){throw l(),d}}function Gc(e,t,n,r){if(e.method!=="GET"||new URL(e.url??"/","http://localhost").pathname!==n)return!1;let o=r();return t.writeHead(o.ok?200:503,{"cache-control":"no-store","content-type":"application/json; charset=utf-8"}),t.end(JSON.stringify(o)),!0}function Yc(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function Xc(e){return Jc(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Lc(e){return Qc(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Jc(e){if(e.method!=="GET")return!1;let t=new URL(e.url??"/","http://localhost").pathname;if(t.startsWith("/_next/")||t.startsWith(wt)||t===Bt||t===to)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function Qc(e){if(e.method!=="GET"||!String(e.headers["user-agent"]??"").includes("Firefox"))return!1;let n=new URL(e.url??"/","http://localhost").pathname;return n.startsWith("/_next/static/chunks/")&&n.endsWith(".js")}function Zc(e,t){let n=[],r=e,i=r.flushHeaders.bind(e),o=r.write.bind(e),s=r.end.bind(e),c=!1;r.flushHeaders=()=>{};let a=()=>{if(t.patchNextDevChunk||c)return!1;let u=Buffer.concat(n);if(!/<body\b[^>]*>/iu.test(u.toString("utf8")))return!1;let l=Jr(e,u,t);return l!==u&&!e.headersSent&&e.removeHeader("content-length"),o(l),n.length=0,c=!0,!0};return r.write=(u,l,d)=>c?(u!==void 0&&o(Sn(u,En(l))),kt(l),kt(d),!0):(u!==void 0&&(n.push(Sn(u,En(l))),a()),kt(l),kt(d),!0),r.end=(u,l,d)=>{let f=typeof u=="function"?void 0:u;if(c)return r.write=o,r.end=s,r.flushHeaders=i,f===void 0?typeof u=="function"?s(u):typeof l=="function"?s(l):typeof d=="function"?s(d):s():typeof l=="function"?s(f,l):typeof d=="function"?s(f,l,d):s(f,l);f!==void 0&&n.push(Sn(f,En(l))),r.write=o,r.end=s,r.flushHeaders=i;let E=Buffer.concat(n),A=Jr(e,E,t);A!==E&&!e.headersSent&&e.removeHeader("content-length");let I=typeof u=="function"?u:typeof l=="function"?l:typeof d=="function"?d:void 0;return I?s(A,I):s(A)},()=>{r.write=o,r.end=s,r.flushHeaders=i}}function Jr(e,t,n){if(ta(e,t))return Buffer.from(Hc(t.toString("utf8"),n));if(n.patchNextDevChunk&&na(e)){let r=t.toString("utf8"),i=ra(r);if(i!==r)return Buffer.from(i)}return t}function ea(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function ta(e,t){if(e.statusCode<200||e.statusCode>=300)return!1;let n=e.getHeader("content-type"),r=Array.isArray(n)?n.join(";"):String(n??"");return t.toString("utf8",0,256).includes("<html")&&(r===""||r.includes("text/html"))}function na(e){if(e.statusCode<200||e.statusCode>=300)return!1;let t=e.getHeader("content-type"),n=Array.isArray(t)?t.join(";"):String(t??"");return n===""||n.includes("javascript")||n.includes("ecmascript")}function ra(e){return[["debugChannel = createDebugChannel(undefined);","debugChannel = undefined;"],["if (isStreamErrorOrUnfinished(ctr)) {","if (false) {"],["return ctr.desiredSize === null || ctr.desiredSize < 0;","return false;"],[["findSourceMapURL: _appfindsourcemapurl.findSourceMapURL,"," debugChannel,"," startTime: 0"].join(`
|
|
35
35
|
`),["unstable_allowPartialStream: true,"," debugChannel,"," startTime: 0"].join(`
|
|
36
|
-
`)],[["findSourceMapURL: _appfindsourcemapurl.findSourceMapURL,"," debugChannel,"," startTime: 0"].join("\\n"),["unstable_allowPartialStream: true,"," debugChannel,"," startTime: 0"].join("\\n")],["debugChannel: createDebugChannel && createDebugChannel(requestHeaders)","debugChannel: undefined"],["debugChannel: createDebugChannel && createDebugChannel(headers)","debugChannel: undefined"]].reduce((n,[r,i])=>oa(n,r,i),e)}function oa(e,t,n){if(n.length>t.length)throw new Error("Replacement must not be longer than the search string.");return e.replaceAll(t,n.padEnd(t.length," "))}function
|
|
36
|
+
`)],[["findSourceMapURL: _appfindsourcemapurl.findSourceMapURL,"," debugChannel,"," startTime: 0"].join("\\n"),["unstable_allowPartialStream: true,"," debugChannel,"," startTime: 0"].join("\\n")],["debugChannel: createDebugChannel && createDebugChannel(requestHeaders)","debugChannel: undefined"],["debugChannel: createDebugChannel && createDebugChannel(headers)","debugChannel: undefined"]].reduce((n,[r,i])=>oa(n,r,i),e)}function oa(e,t,n){if(n.length>t.length)throw new Error("Replacement must not be longer than the search string.");return e.replaceAll(t,n.padEnd(t.length," "))}function Sn(e,t){return Buffer.isBuffer(e)?e:e instanceof Uint8Array?Buffer.from(e):Buffer.from(String(e),t)}function En(e){return typeof e=="string"?e:void 0}function kt(e){typeof e=="function"&&e()}async function ia(e){let n=Qr(rt(e,"package.json"))(Rc);return n.default??n}function sa(e){return Zr(e)!=="src"?e:In(ca(e),"dist")}function ca(e){return oo(e)?tt.posix.dirname(e):nt(e)}function In(e,t){return oo(e)?tt.posix.join(e,t):rt(e,t)}function oo(e){return e.includes("/")&&!e.includes("\\")}function aa(e){let t=rt(e,".vcp/current-snapshot.json");if(!qe(t))return"sandbox_worktree";try{let n=JSON.parse(Ve(t,"utf8"));return typeof n.snapshotId=="string"?n.snapshotId:"sandbox_worktree"}catch{return"sandbox_worktree"}}function ua(e){if(!e)return null;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:null}function la(e,t,n){return new Promise((r,i)=>{e.once("error",i),e.listen(t,n,()=>{e.off("error",i),r()})})}function da(e){return new Promise(t=>{e.close(()=>t())})}function Dt(e){try{e()}catch{}}function pa(e){try{return e()}catch(t){return Promise.reject(t)}}function fa(e,t){let n=e.address();return typeof n=="object"&&n?n.port:t}export{uc as SITE_EDIT_BRIDGE_MAX_BUFFERED_BYTES,$r as SITE_EDIT_BRIDGE_MAX_PAYLOAD_BYTES,Xe as SITE_EDIT_COMPOSITION_MARKER_INVALID,ga as SITE_EDIT_COMPOSITION_REINITIALIZE_REQUIRED,br as SITE_EDIT_COMPOSITION_RENDER_MISMATCH,On as SITE_EDIT_COMPOSITION_SESSION_MISMATCH,Ht as SITE_EDIT_COMPOSITION_SESSION_REQUIRED,Gn as SITE_EDIT_FRAME_RUNTIME_CHANNEL,Yt as SITE_EDIT_FRAME_RUNTIME_LAYOUT_SNAPSHOT_VERSION,Ue as SITE_EDIT_FRAME_RUNTIME_RESIZE_VISUAL_VERSION,$e as SITE_EDIT_FRAME_RUNTIME_SELECTION_VISUAL_VERSION,Yn as SITE_EDIT_FRAME_SECTION_GAP_RADIUS_PX,jn as SITE_EDIT_WINDOW_MESSAGE_NAMESPACE,Nt as SiteEditBridgeServer,st as SiteEditBridgeSocketServer,se as SiteEditBridgeTransport,ct as SiteEditWebSocketClient,Tt as VCP_PAGE_TEMPLATE_CONTEXT_MARKER_ATTRIBUTE,yr as VCP_PAGE_TEMPLATE_CONTEXT_MARKER_SELECTOR,on as VCP_PAGE_TEMPLATE_CONTEXT_MARKER_VALUE,cn as VCP_PAGE_TEMPLATE_EFFECTIVE_TEMPLATE_ID_ATTRIBUTE,sn as VCP_PAGE_TEMPLATE_ROUTE_ID_ATTRIBUTE,tn as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,en as VCP_SITE_EDIT_ROUTE_READY_EVENT,$n as VCP_WINDOW_MESSAGE_SOURCE,Un as VCP_WINDOW_MESSAGE_VERSION,Fc as attachNextDevUpgradeHandler,Ur as attachSiteEditBridgeServer,mc as attachSiteEditWebSocketServer,Kc as createSiteEditAutoBootstrapHtmlSnippet,zn as createSiteEditBridge,Ge as createSiteEditFrameRuntimeMessage,Do as createVcpWindowMessageEnvelope,wn as decodeRenderDocument,Bn as encodeRenderDocument,Ha as ensureSiteEditBridgeServerStarted,Hc as injectSiteEditAutoBootstrap,ao as isCompactRenderDocument,Co as isDesignerTraceEnabled,Ln as isSiteEditFrameRuntimeLayoutSnapshot,Xn as isSiteEditFrameRuntimeMessage,Bo as isVcpWindowMessageEnvelope,ra as patchNextFirefoxDevChunk,Lc as prepareFirefoxNextDevChunkPatchRequest,Xc as prepareSiteEditHtmlInjectionRequest,pi as readVcpPageTemplateContextMarker,fi as resolveBrowserCompositionContext,qc as resolveSiteEditBridgeHealthPath,ro as resolveSiteEditClientAsset,Za as resolveSiteEditClientAssetPath,Bc as resolveSiteEditNextDevBundler,bt as resolveSiteEditRouteId,gi as resolveSiteEditWebSocketUrl,vo as sanitizeTracePayload,Pa as startSiteEditAutoBootstrap,vi as startSiteEditFrameRuntime,Qa as startSiteEditNextDevServer,di as syncRuntimeSiteBlockIds,Ce as traceDesignerEvent,Uc as transpileSiteEditClientSource};
|
package/dist/next-dev-server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import Rt from"node:http";import{existsSync as E,readFileSync as R}from"node:fs";import{createRequire as ve}from"node:module";import k from"node:path";import{basename as _e,dirname as T,join as P}from"node:path";import{fileURLToPath as ke}from"node:url";import $e from"node:http";import Y from"node:fs";import{createHash as ye,randomBytes as ze,timingSafeEqual as Je}from"node:crypto";import S from"node:path";import{WebSocket as Se,WebSocketServer as Ge}from"ws";import{createPreviewSiteEditEngineRuntime as Qe,openFileHistoryStore as Ye,resolveManagedPageTemplateComposition as Ze,scanSiteEditCompositionsFromFiles as Xe}from"@vcp-dev/site-edit-engine";import{resolveNextAppRouteId as et,scanNextAppRouterRoutesFromFiles as tt}from"@vcp-dev/site-edit-engine/next-app-router";import{SiteEditSourceWatcher as nt}from"@vcp-dev/site-edit-engine/source-watcher";function ce(e){let t=new Map,n=[],i=new Map,o=[],s=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=new Map(s.map((u,h)=>[u,h])),a=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(u=>({placementKey:u.placementKey,placementUnitKey:u.placementUnitKey,relation:u.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},c=e.entries.flatMap((u,h)=>u.dynamicDataSummary?[[h,u.dynamicDataSummary]]:[]),d=u=>{let h=t.get(u);if(typeof h=="number")return h;let f=n.length;return n.push(u),t.set(u,f),f},l=u=>{let h=null;for(let f of je(u)){let H=`${h??"root"}\0${f}`,v=i.get(H);if(typeof v=="number"){h=v;continue}let I=o.length;o.push([h,d(f)]),i.set(H,I),h=I}if(h===null)throw new Error("Document key must not be empty");return h};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,composition:{...e.composition},routeId:e.composition.routeId,version:e.version,pageComposition:a,tokens:n,nodes:o,entries:e.entries.map(u=>{let h=u.pageCompositionUnitKey?r.get(u.pageCompositionUnitKey)??-1:-1;if(u.pageCompositionUnitKey&&h<0)throw new Error(`Render entry ${u.key} references unknown page composition unit ${u.pageCompositionUnitKey}`);return[l(u.key),Ne(u.operationSummary),...h>=0?[h]:[]]}),...c.length>0?{dynamicDataSummaries:c}:{}}}function Ne(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function je(e){if(!e)return[];let t=[],n=0,i=ae(e,n);if(i<0)return t.push(e),t;for(t.push(e.slice(0,i)),n=i;n<e.length;){if(i=ae(e,n+(e.startsWith("::",n)?2:1)),i<0){t.push(e.slice(n));break}t.push(e.slice(n,i)),n=i}return t}function ae(e,t){let n=e.indexOf("/",t),i=e.indexOf("::",t);return n<0?i:i<0?n:Math.min(n,i)}var ue="SITE_EDIT_COMPOSITION_SESSION_MISMATCH",Q="SITE_EDIT_COMPOSITION_SESSION_REQUIRED";var m=class e{constructor(){}static parseMessage(t,n={}){let i=JSON.parse(t);if(!e.isMessage(i,n))throw new Error("Invalid site edit bridge message");return i}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(p(t)&&p(t.payload)){let n=typeof t.payload.id=="string"?t.payload.id:"unknown",i=this.isRequestKind(t.payload.kind)?t.payload.kind:"get-document";return{id:n,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!p(t)||typeof t.type!="string"?!1:t.type==="request"?Fe(t.payload,n):t.type==="response"||t.type==="error"?p(t.payload)&&typeof t.payload.id=="string":t.type==="event"?p(t.payload)&&p(t.payload.event):t.type==="auth"?p(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"&&p(t.payload)&&t.payload.ok===!0}},M=class{constructor(t){this.options=t,this.session={subscribedCompositionKeys:new Set},this.messageQueue=new G,this.eventDispatcher=new J(n=>{this.sendJson(n)}),this.unsubscribe=t.engine.subscribe(n=>{this.handleEngineEvent(n)}),t.socket.onmessage=n=>{try{this.messageQueue.enqueue(()=>this.handleRawMessage(n.data))}catch(i){this.sendJson({type:"error",payload:{id:"unknown",kind:"get-document",message:i instanceof Error?i.message:"Bridge queue overflow"}}),t.socket.close(1013,"bridge busy")}},t.socket.onclose=()=>{this.unsubscribe(),this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.clear()}}async handleMessage(t){try{let n=t;if(n.type!=="request")return;let i=n.payload,{id:o}=i;switch(i.kind){case"initialize-session":{let s=W(i),r=await this.resolve(s),a=await this.options.engine.initializeSession({composition:r.context,...i.mutationContext?{mutationContext:i.mutationContext}:{}});this.activateSession(r.context),this.sendJson({type:"response",payload:{id:o,kind:i.kind,result:y({...a,data:{...a.data,document:he(a.data.document)}},r.context)}});return}case"get-document":{let s=await this.resolveWireContext(i),r=await this.options.engine.getDocument(s);this.sendResult(o,i.kind,We(r,s));return}case"get-history-status":{let s=await this.resolveWireContext(i),r=await this.options.engine.getHistoryStatus(s);this.sendResult(o,i.kind,y(r,s));return}case"get-style-context":{let s=await this.resolveWireContext(i);this.sendResult(o,i.kind,y(await this.options.engine.getStyleContext(s),s));return}case"get-object-edit-context":{let s=await this.resolveWireContext(i);this.sendResult(o,i.kind,y(await this.options.engine.getObjectEditContext(i.key,s),s));return}case"get-class-name-source":{let s=await this.resolveWireContext(i);this.sendResult(o,i.kind,y(await this.options.engine.getClassNameSource(i.key,s),s));return}case"get-source-tree":{let s=await this.resolveWireContext(i);this.sendResult(o,i.kind,y(await this.options.engine.getSourceTree(s),s));return}case"get-source-file":{let s=await this.resolveWireContext(i);this.sendResult(o,i.kind,y(await this.options.engine.getSourceFile({path:i.path,composition:s}),s));return}case"resolve-source-location":{let s=await this.resolveWireContext(i),r=y(await this.options.engine.resolveSourceLocation({key:i.key,composition:s}),s);this.sendResult(o,i.kind,r);return}case"execute":{let s=await this.resolveOperationWireContext(i.request),r=await this.resolveWireContext(i);if(w(s)!==w(r))throw new x(ue,"The execute request composition does not match its operation composition.");let a=await this.normalizeOperationRequest(i.request,s);await this.handleBufferedOperation(o,i.kind,()=>this.options.engine.execute(a));return}case"undo":case"redo":{let s=await this.resolveWireContext(i);await this.handleBufferedOperation(o,i.kind,()=>i.kind==="undo"?this.options.engine.undo(s):this.options.engine.redo(s));return}}}catch(n){let i=m.extractRequestInfo(t);this.sendJson({type:"error",payload:{...i,message:z(n),code:$(n)}})}}async resolve(t){return this.options.engine.resolveComposition(t)}async resolveAndAssert(t){let n=await this.resolve(t),i=this.session.activeComposition;if(!i)throw new x(Q,"Initialize a composition session before issuing this request.");if(w(i)!==w(n.context))throw new x(ue,"The request composition does not match the active socket session.");return n.context}async resolveWireContext(t){let n=W(t);return this.resolveAndAssert(n)}async resolveOperationWireContext(t){let n=Ve(t);return this.resolveAndAssert(n)}activateSession(t){this.session.activeComposition=t,this.session.subscribedCompositionKeys.clear(),this.session.subscribedCompositionKeys.add(w(t))}async normalizeOperationRequest(t,n){let i={...t,composition:de(n)};if(i.target.kind==="route"){let o=i.target,s=W(o),r=await this.resolveAndAssert(s);i.target={...o,composition:de(r)}}return i}handleEngineEvent(t){let n=t?.composition;if(!Ke(n))return;let i=w(n);this.session.subscribedCompositionKeys.has(i)&&(this.eventDispatcher.push(t),t.type==="site-edit.graph.invalidated"&&i===qe(this.session)&&(this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.delete(i)))}sendResult(t,n,i){this.sendJson({type:"response",payload:{id:t,kind:n,result:i}})}async handleRawMessage(t){try{await this.handleMessage(m.parseMessage(t,{validateOperationRequest:this.options.validateOperationRequest}))}catch(n){let i=Le(t);this.sendJson({type:"error",payload:{...i,message:z(n),code:$(n)}})}}sendJson(t){this.options.socket.send(m.stringifyMessage(t))}async handleBufferedOperation(t,n,i){this.eventDispatcher.beginBuffering();try{let o=await i();this.sendResult(t,n,o)}catch(o){this.sendJson({type:"error",payload:{id:t,kind:n,message:z(o),code:$(o)}})}finally{this.eventDispatcher.flush()}}},x=class extends Error{constructor(t,n){super(n),this.code=t,this.name="BridgeProtocolError"}},J=class{constructor(t){this.send=t,this.bufferedEvents=null}push(t){let n={type:"event",payload:{event:t}};if(this.bufferedEvents){this.bufferedEvents.push(n);return}this.send(n)}beginBuffering(){this.bufferedEvents=[]}flush(){let t=this.bufferedEvents??[];this.bufferedEvents=null,t.forEach(n=>this.send(n))}},G=class{constructor(t=64){this.maxQueued=t,this.queue=Promise.resolve(),this.queued=0}enqueue(t){if(this.queued>=this.maxQueued)throw new Error("Bridge request queue is full");this.queued+=1;let n=async()=>{this.queued-=1,await t()},i=this.queue.then(n,n);return this.queue=i.then(()=>{},()=>{}),i}};function Fe(e,t){if(!p(e)||typeof e.id!="string"||!m.isRequestKind(e.kind))return!1;let n=_(e.composition);switch(e.kind){case"initialize-session":return n&&(e.mutationContext===void 0||L(e.mutationContext));case"get-document":case"get-style-context":return n;case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof e.key=="string"&&n;case"get-history-status":return n;case"get-source-tree":return n;case"get-source-file":return typeof e.path=="string"&&n;case"execute":return n&&Ue(e.request)&&(e.request.mutationContext===void 0||L(e.request.mutationContext))&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return n&&e.mutationContext===void 0||n&&L(e.mutationContext)}}function Ue(e){return p(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&_(e.composition)&&typeof e.kind=="string"&&p(e.target)&&(e.target.kind!=="route"||_(e.target.composition))&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&p(e.params)}function _(e){return p(e)&&typeof e.routeId=="string"&&e.routeId.length>0&&(e.templateId===void 0||typeof e.templateId=="string"&&e.templateId.length>0)&&Object.keys(e).every(t=>t==="routeId"||t==="templateId")}function Ke(e){return p(e)&&typeof e.routeId=="string"&&(e.effectiveTemplateId===void 0||typeof e.effectiveTemplateId=="string")}function W(e){if(_(e.composition))return e.composition;throw new x(Q,"A composition selector is required for this request.")}function Ve(e){if(p(e)&&_(e.composition))return e.composition;throw new x(Q,"A composition selector is required for execute.")}function de(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function qe(e){return e.activeComposition?w(e.activeComposition):null}function w(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}function y(e,t){return p(e)&&e.ok===!0?{...e,composition:t}:e}function We(e,t){return!p(e)||e.ok!==!0?e:{...e,...t?{composition:t}:{},data:he(e.data)}}function he(e){let t=e;return ce(t.routeId?t:{...t,routeId:t.composition.routeId})}function p(e){return typeof e=="object"&&e!==null}function L(e){return p(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}function $(e){if(!(!p(e)||typeof e.code!="string"||e.code.length===0))return e.code}function z(e){return e instanceof Error||p(e)&&typeof e.message=="string"&&e.message.length>0?e.message:"Unknown websocket operation failure"}function Le(e){try{return m.extractRequestInfo(JSON.parse(e))}catch{return{id:"unknown",kind:"get-document"}}}var N=class{constructor(){this.tail=Promise.resolve()}run(t){let n=this.tail.then(t,t);return this.tail=n.then(()=>{},()=>{}),n}};import{SiteEditOperationRequestSchema as it,computeSiteEditCompositionKey as C}from"@vcp-dev/contracts";var st="127.0.0.1",ot=30218,rt="/__vcp/site-edit/bridge",Ie=6*1024*1024,at=Ie*2,ct=3e3,pe=50,le="__VCP_SITE_EDIT_BRIDGE_SERVERS__";function we(e,t,n={}){let i=new ee(ut(t),e,!1,n);return i.start({listen:!1}),i}var ee=class{constructor(t,n=$e.createServer((s,r)=>{r.writeHead(404),r.end("VCP site edit bridge server")}),i=!0,o={}){this.options=t,this.server=n,this.closeHttpServerOnStop=i,this.dependencies=o,this.runtime=null,this.activeHistorySessionId=null,this.historySessionTransition=Promise.resolve(),this.mutationQueue=new N,this.eventListeners=new Set,this.routes=[],this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.stopWatching=null,this.stopWebSocketServer=null,this.pendingChangedFiles=new Set,this.fileChangeTimer=null,this.isStarted=!1,this.runtimeVersionFloors=new Map,this.activeHistoryStore=null,this.versionPersistence=Promise.resolve()}start(t={}){if(this.isStarted)return;this.refreshCompositions(!0),this.isStarted=!0,this.createRuntime();let n=gt({server:this.server,path:this.options.path,sessionKey:this.options.sessionKey,host:this.options.host,allowedOrigins:this.options.allowedOrigins,engine:this.createBridgeEngine()});this.stopWebSocketServer=n.stop,this.stopWatching=new nt({projectRoot:this.options.projectRoot,watch_dirs:dt(this.options.runtime.watch_dirs),interval_ms:this.options.runtime.watch_interval_ms,debounce_ms:this.options.runtime.watch_debounce_ms??pe,max_dirs:this.options.runtime.watch_max_dirs,max_files:this.options.runtime.watch_max_files,max_depth:this.options.runtime.watch_max_depth,max_startup_ms:this.options.runtime.watch_max_startup_ms,on_change:i=>this.handleFileChanged(i),on_batch_change:i=>this.handleFilesChanged(i)}).start(),t.listen!==!1&&this.server.listen(this.options.port,this.options.host)}getHealth(){let t=!!this.runtime&&!this.compositionResolutionError;return{ok:this.isStarted&&t,bridgePath:this.options.path,runtimeReady:t,routesIndexed:this.routes.length,sessionRequired:!!this.options.sessionKey}}stop(){this.stopWatching?.(),this.stopWatching=null,this.flushChangedFiles(),this.fileChangeTimer&&(clearTimeout(this.fileChangeTimer),this.fileChangeTimer=null),this.stopWebSocketServer?.(),this.stopWebSocketServer=null,this.runtime?.dispose(),this.runtime=null,this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.closeHttpServerOnStop&&this.server.close();let t=ft(),n=mt(this.options);t.get(n)===this&&t.delete(n),this.isStarted=!1}createRuntime(t,n=null){let i=this.runtime;this.activeHistoryStore=t??null;let o=(this.dependencies.createRuntime??Qe)({...this.options.tenantId?{tenantId:this.options.tenantId}:{},siteId:this.options.siteId,snapshotId:this.options.snapshotId,projectRoot:this.options.projectRoot,compositions:this.compositions,onEvent:s=>{"version"in s&&typeof s.version=="number"&&this.recordRuntimeVersion(s.version,"composition"in s?s.composition:void 0);for(let r of this.eventListeners)r(s)},...t?{historyStore:t}:{},...this.getInitialDocumentVersions().length>0?{initialDocumentVersions:this.getInitialDocumentVersions()}:{}});this.runtime=o,this.activeHistorySessionId=n,i?.dispose()}createBridgeEngine(){return{resolveComposition:t=>this.resolveComposition(t),initializeSession:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)throw new Error(`${n.code}: ${n.message}`);let i=pt(t.composition),o=this.getRuntime(),s=g(i);await o.initializeComposition(s);let a=o.getDocument(s).data;await this.recordRuntimeVersion(a.version,i);let c=(await o.getHistoryStatus()).data;return{ok:!0,composition:i,data:{document:a,historyStatus:c}}}),getDocument:async t=>{let n=this.getRuntime(),i=g(t);await n.initializeComposition(i);let o=n.getDocument(i);return await this.recordRuntimeVersion(o.data.version,t),{...o,composition:t}},getHistoryStatus:async t=>({...await this.getRuntime().getHistoryStatus(),composition:t}),getStyleContext:async t=>this.getRuntime().getStyleContext(g(t)),getObjectEditContext:async(t,n)=>this.getRuntime().getObjectEditContext(t,g(n)),getClassNameSource:async(t,n)=>this.getRuntime().getClassNameSource(t,g(n)),getSourceTree:async t=>this.getRuntime().getSourceTree(g(t)),getSourceFile:async t=>this.getRuntime().getSourceFile({path:t.path,composition:g(t.composition)}),resolveSourceLocation:async t=>this.getRuntime().resolveSourceLocation({key:t.key,composition:g(t.composition)}),execute:(t,n)=>this.mutationQueue.run(async()=>{let i=await this.bindHistorySession(this.options.snapshotId);if(!i.ok)return Z(i,t);let o=await this.getRuntime().executeOperation(t);return o.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(o.data.resultVersion,o.composition),o}),undo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return Z(n,void 0,t);let i=await this.getRuntime().undo();return i.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(i.data.resultVersion,i.composition??t),i.composition?i:{...i,composition:t}}),redo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return Z(n,void 0,t);let i=await this.getRuntime().redo();return i.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(i.data.resultVersion,i.composition??t),i.composition?i:{...i,composition:t}}),subscribe:t=>(this.eventListeners.add(t),()=>this.eventListeners.delete(t))}}async bindHistorySession(t){if(!this.options.historyRoot)return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history is not configured."};if(this.activeHistorySessionId===t)return{ok:!0};let n=this.historySessionTransition.then(async()=>{if(this.activeHistorySessionId===t)return;let i=await(this.dependencies.openHistoryStore??Ye)(lt({root:this.options.historyRoot,siteId:this.options.siteId,snapshotId:this.options.snapshotId,editingSessionId:t}));if(!this.isStarted)return;let o=i.readDocumentVersion?await i.readDocumentVersion():0,s=this.compositions[0]?.context;if(s){let r=C(s);this.runtimeVersionFloors.set(r,Math.max(this.runtimeVersionFloors.get(r)??0,o))}this.createRuntime(i,t)});this.historySessionTransition=n.catch(()=>{});try{return await n,{ok:!0}}catch{return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history could not be opened."}}}recordRuntimeVersion(t,n){let i=n?C(n):null;i&&this.runtimeVersionFloors.set(i,Math.max(this.runtimeVersionFloors.get(i)??0,t));let o=this.activeHistoryStore;if(!o?.writeDocumentVersion)return Promise.resolve();let s=i?this.runtimeVersionFloors.get(i)??t:t;return this.versionPersistence=this.versionPersistence.then(()=>o.writeDocumentVersion(s)).catch(()=>{}),this.versionPersistence}handleFileChanged(t){this.handleFilesChanged([t])}handleFilesChanged(t){for(let i of t)this.pendingChangedFiles.add(i);this.fileChangeTimer&&clearTimeout(this.fileChangeTimer);let n=this.options.runtime.watch_debounce_ms??pe;this.fileChangeTimer=setTimeout(()=>{this.fileChangeTimer=null,this.flushChangedFiles()},n),this.fileChangeTimer?.unref?.()}flushChangedFiles(){if(this.fileChangeTimer&&(clearTimeout(this.fileChangeTimer),this.fileChangeTimer=null),this.pendingChangedFiles.size===0)return;let t=[...this.pendingChangedFiles].sort((n,i)=>n.localeCompare(i));if(this.pendingChangedFiles.clear(),!!this.refreshCompositions(!1))for(let n of t)this.runtime?.notifyFileChanged(n)}refreshCompositions(t=!1){try{let n=ht(this.options.projectRoot),i=tt(n),o=i.length>0?i:(this.options.runtime.routes??[]).map(c=>({...c})),s=Xe({files:n});if(s.length===0)throw new Error("No canonical App Router composition is indexed by the preview bridge.");let r=new Map(this.compositions.map(c=>[C(c.context),c])),a=new Map(s.map(c=>[C(c.context),c]));if(this.runtime){for(let[c,d]of r){let l=a.get(c);(!l||l.entryFile!==d.entryFile)&&this.runtime.unregisterComposition(g(d.context))}for(let[c,d]of a){let l=r.get(c);(!l||l.entryFile!==d.entryFile)&&this.runtime.registerComposition(d.context,d.entryFile)}}return this.routes=o,this.compositions=s,this.compositionFiles=n,this.compositionResolutionError=null,!0}catch(n){let i=n instanceof Error?n:new Error(String(n));if(this.compositionResolutionError=i,t)throw i;return!1}}resolveComposition(t){if(this.compositionResolutionError)throw this.compositionResolutionError;let n=et(t.routeId,this.routes,this.options.basePath);if(!n)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let i=this.routes.find(r=>r.routeId===n);if(!i)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let o=Ze({selector:{routeId:n,...t.templateId?{templateId:t.templateId}:{}},files:this.compositionFiles,canonicalEntryFile:i.entryFile}),s=C(o.context);if(!this.compositions.some(r=>C(r.context)===s))throw new Error(`Composition is not registered by the preview bridge: ${s}`);return o}getInitialDocumentVersions(){return this.compositions.flatMap(t=>{let n=this.runtimeVersionFloors.get(C(t.context));return n===void 0?[]:[{composition:t.context,version:n}]})}getRuntime(){if(!this.runtime)throw new Error("VCP site edit preview bridge runtime is not ready");return this.runtime}};function ut(e){return{tenantId:e.tenantId,siteId:e.siteId,snapshotId:e.snapshotId,projectRoot:S.resolve(e.projectRoot??process.cwd()),basePath:e.basePath??"",host:e.host??st,port:e.port??ot,path:e.path??rt,sessionKey:e.sessionKey??bt(),historyRoot:e.historyRoot,allowedOrigins:e.allowedOrigins??[],runtime:e.runtime??{}}}function dt(e){let t=["app","src/app","components/site","src/components/site","lib/generated","src/lib/generated","public"];return[...new Set([...e?.length?e:t,".vcp"])]}function ht(e){let t=[],n=["app","src/app",".vcp"],i=new Set([".git",".next",".turbo","coverage","dist","node_modules","output","snapshot-store"]),o=s=>{if(!Y.existsSync(s))return;let r;try{r=Y.readdirSync(s,{withFileTypes:!0})}catch{return}for(let a of r){if(a.name.startsWith(".")&&a.name!==".vcp")continue;if(a.isDirectory()){if(i.has(a.name))continue;o(S.join(s,a.name));continue}if(!a.isFile())continue;let c=S.join(s,a.name),d="";try{d=Y.readFileSync(c,"utf8")}catch{}t.push({path:S.relative(e,c).replaceAll(S.sep,"/"),content:d})}};for(let s of n)o(S.join(e,s));return t.sort((s,r)=>s.path.localeCompare(r.path))}function pt(e){if(!e||typeof e!="object"||typeof e.routeId!="string")throw new Error("Normalized composition context is required.");if("effectiveTemplateId"in e)return e;let t=e;return{routeId:t.routeId,...t.templateId?{effectiveTemplateId:t.templateId}:{}}}function g(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function lt(e){return S.join(S.resolve(e.root),fe(e.siteId),fe(e.snapshotId),ye("sha256").update(e.editingSessionId).digest("hex").slice(0,32))}function fe(e){return/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)&&e!=="."&&e!==".."?e:ye("sha256").update(e).digest("hex").slice(0,32)}function ft(){let e=globalThis;return e[le]??=new Map,e[le]}function mt(e){return`${e.projectRoot}:${e.host}:${e.port}:${e.path}:${e.historyRoot??""}`}function Z(e,t,n){let i=n??(t?.composition?{routeId:t.composition.routeId,...t.composition.templateId?{effectiveTemplateId:t.composition.templateId}:{}}:void 0);if(!i)throw new Error("A normalized composition is required to construct a mutation result.");return{ok:!1,composition:i,error:{code:e.code,message:e.message},data:{requestId:t?.id??"mutation-context",kind:t?.kind??"update-text",composition:i,target:t?.target??{kind:"node",key:""},resultVersion:t?.documentVersion??0}}}function gt(e){let t=new Ge({maxPayload:Ie,noServer:!0}),n=new WeakSet,i=s=>{new M({socket:new te(s),engine:e.engine,validateOperationRequest:r=>it.safeParse(r).success})},o=(s,r,a)=>{if(!yt(s,e))return;let c=St(s,e);if(!c){r.write(`HTTP/1.1 401 Unauthorized\r
|
|
1
|
+
import bt from"node:http";import{existsSync as _,readFileSync as v}from"node:fs";import{createRequire as _e}from"node:module";import k from"node:path";import{basename as Te,dirname as P,join as H}from"node:path";import{fileURLToPath as ke}from"node:url";import ze from"node:http";import Z from"node:fs";import{createHash as we,randomBytes as Je,timingSafeEqual as Ge}from"node:crypto";import w from"node:path";import{WebSocket as xe,WebSocketServer as Qe}from"ws";import{createPreviewSiteEditEngineRuntime as Ye,openFileHistoryStore as Ze,resolveManagedPageTemplateComposition as Xe,scanSiteEditCompositionsFromFiles as et}from"@vcp-dev/site-edit-engine";import{resolveNextAppRouteId as tt,scanNextAppRouterRoutesFromFiles as nt}from"@vcp-dev/site-edit-engine/next-app-router";import{SiteEditSourceWatcher as it}from"@vcp-dev/site-edit-engine/source-watcher";function he(e){let t=new Map,n=[],i=new Map,s=[],o=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=new Map(o.map((u,p)=>[u,p])),a=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(u=>({placementKey:u.placementKey,placementUnitKey:u.placementUnitKey,relation:u.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},d=e.entries.flatMap((u,p)=>u.dynamicDataSummary?[[p,u.dynamicDataSummary]]:[]),c=u=>{let p=t.get(u);if(typeof p=="number")return p;let l=n.length;return n.push(u),t.set(u,l),l},h=u=>{let p=null;for(let l of Fe(u)){let y=`${p??"root"}\0${l}`,S=i.get(y);if(typeof S=="number"){p=S;continue}let x=s.length;s.push([p,c(l)]),i.set(y,x),p=x}if(p===null)throw new Error("Document key must not be empty");return p};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,composition:{...e.composition},routeId:e.composition.routeId,version:e.version,pageComposition:a,tokens:n,nodes:s,entries:e.entries.map(u=>{let p=u.pageCompositionUnitKey?r.get(u.pageCompositionUnitKey)??-1:-1;if(u.pageCompositionUnitKey&&p<0)throw new Error(`Render entry ${u.key} references unknown page composition unit ${u.pageCompositionUnitKey}`);return[h(u.key),je(u.operationSummary),...p>=0?[p]:[]]}),...d.length>0?{dynamicDataSummaries:d}:{}}}function je(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function Fe(e){if(!e)return[];let t=[],n=0,i=de(e,n);if(i<0)return t.push(e),t;for(t.push(e.slice(0,i)),n=i;n<e.length;){if(i=de(e,n+(e.startsWith("::",n)?2:1)),i<0){t.push(e.slice(n));break}t.push(e.slice(n,i)),n=i}return t}function de(e,t){let n=e.indexOf("/",t),i=e.indexOf("::",t);return n<0?i:i<0?n:Math.min(n,i)}var pe="SITE_EDIT_COMPOSITION_SESSION_MISMATCH",Y="SITE_EDIT_COMPOSITION_SESSION_REQUIRED";var m=class e{constructor(){}static parseMessage(t,n={}){let i=JSON.parse(t);if(!e.isMessage(i,n))throw new Error("Invalid site edit bridge message");return i}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(f(t)&&f(t.payload)){let n=typeof t.payload.id=="string"?t.payload.id:"unknown",i=this.isRequestKind(t.payload.kind)?t.payload.kind:"get-document";return{id:n,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!f(t)||typeof t.type!="string"?!1:t.type==="request"?Ue(t.payload,n):t.type==="response"||t.type==="error"?f(t.payload)&&typeof t.payload.id=="string":t.type==="event"?f(t.payload)&&f(t.payload.event):t.type==="auth"?f(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"&&f(t.payload)&&t.payload.ok===!0}},O=class{constructor(t){this.options=t,this.session={subscribedCompositionKeys:new Set},this.messageQueue=new Q,this.eventDispatcher=new G(n=>{this.sendJson(n)}),this.unsubscribe=t.engine.subscribe(n=>{this.handleEngineEvent(n)}),t.socket.onmessage=n=>{try{this.messageQueue.enqueue(()=>this.handleRawMessage(n.data))}catch(i){this.sendJson({type:"error",payload:{id:"unknown",kind:"get-document",message:i instanceof Error?i.message:"Bridge queue overflow"}}),t.socket.close(1013,"bridge busy")}},t.socket.onclose=()=>{this.unsubscribe(),this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.clear()}}async handleMessage(t){try{let n=t;if(n.type!=="request")return;let i=n.payload,{id:s}=i;switch(i.kind){case"initialize-session":{let o=L(i),r=await this.resolve(o),a=await this.options.engine.initializeSession({composition:r.context,...i.mutationContext?{mutationContext:i.mutationContext}:{}});this.activateSession(r.context),this.sendJson({type:"response",payload:{id:s,kind:i.kind,result:I({...a,data:{...a.data,document:le(a.data.document)}},r.context)}});return}case"get-document":{let o=await this.resolveWireContext(i),r=await this.options.engine.getDocument(o);this.sendResult(s,i.kind,Le(r,o));return}case"get-history-status":{let o=await this.resolveWireContext(i),r=await this.options.engine.getHistoryStatus(o);this.sendResult(s,i.kind,I(r,o));return}case"get-style-context":{let o=await this.resolveWireContext(i);this.sendResult(s,i.kind,I(await this.options.engine.getStyleContext(o),o));return}case"get-object-edit-context":{let o=await this.resolveWireContext(i);this.sendResult(s,i.kind,I(await this.options.engine.getObjectEditContext(i.key,o),o));return}case"get-class-name-source":{let o=await this.resolveWireContext(i);this.sendResult(s,i.kind,I(await this.options.engine.getClassNameSource(i.key,o),o));return}case"get-source-tree":{let o=await this.resolveWireContext(i);this.sendResult(s,i.kind,I(await this.options.engine.getSourceTree(o),o));return}case"get-source-file":{let o=await this.resolveWireContext(i);this.sendResult(s,i.kind,I(await this.options.engine.getSourceFile({path:i.path,composition:o}),o));return}case"resolve-source-location":{let o=await this.resolveWireContext(i),r=I(await this.options.engine.resolveSourceLocation({key:i.key,composition:o}),o);this.sendResult(s,i.kind,r);return}case"execute":{let o=await this.resolveOperationWireContext(i.request),r=await this.resolveWireContext(i);if(C(o)!==C(r))throw new R(pe,"The execute request composition does not match its operation composition.");let a=await this.normalizeOperationRequest(i.request,o);await this.handleBufferedOperation(s,i.kind,()=>this.options.engine.execute(a));return}case"undo":case"redo":{let o=await this.resolveWireContext(i);await this.handleBufferedOperation(s,i.kind,()=>i.kind==="undo"?this.options.engine.undo(o):this.options.engine.redo(o));return}}}catch(n){let i=m.extractRequestInfo(t);this.sendJson({type:"error",payload:{...i,message:J(n),code:z(n)}})}}async resolve(t){return this.options.engine.resolveComposition(t)}async resolveAndAssert(t){let n=await this.resolve(t),i=this.session.activeComposition;if(!i)throw new R(Y,"Initialize a composition session before issuing this request.");if(C(i)!==C(n.context))throw new R(pe,"The request composition does not match the active socket session.");return n.context}async resolveWireContext(t){let n=L(t);return this.resolveAndAssert(n)}async resolveOperationWireContext(t){let n=qe(t);return this.resolveAndAssert(n)}activateSession(t){this.session.activeComposition=t,this.session.subscribedCompositionKeys.clear(),this.session.subscribedCompositionKeys.add(C(t))}async normalizeOperationRequest(t,n){let i={...t,composition:fe(n)};if(i.target.kind==="route"){let s=i.target,o=L(s),r=await this.resolveAndAssert(o);i.target={...s,composition:fe(r)}}return i}handleEngineEvent(t){let n=t?.composition;if(!Ve(n))return;let i=C(n);this.session.subscribedCompositionKeys.has(i)&&(this.eventDispatcher.push(t),t.type==="site-edit.graph.invalidated"&&i===We(this.session)&&(this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.delete(i)))}sendResult(t,n,i){this.sendJson({type:"response",payload:{id:t,kind:n,result:i}})}async handleRawMessage(t){try{await this.handleMessage(m.parseMessage(t,{validateOperationRequest:this.options.validateOperationRequest}))}catch(n){let i=$e(t);this.sendJson({type:"error",payload:{...i,message:J(n),code:z(n)}})}}sendJson(t){this.options.socket.send(m.stringifyMessage(t))}async handleBufferedOperation(t,n,i){this.eventDispatcher.beginBuffering();try{let s=await i();this.sendResult(t,n,s)}catch(s){this.sendJson({type:"error",payload:{id:t,kind:n,message:J(s),code:z(s)}})}finally{this.eventDispatcher.flush()}}},R=class extends Error{constructor(t,n){super(n),this.code=t,this.name="BridgeProtocolError"}},G=class{constructor(t){this.send=t,this.bufferedEvents=null}push(t){let n={type:"event",payload:{event:t}};if(this.bufferedEvents){this.bufferedEvents.push(n);return}this.send(n)}beginBuffering(){this.bufferedEvents=[]}flush(){let t=this.bufferedEvents??[];this.bufferedEvents=null,t.forEach(n=>this.send(n))}},Q=class{constructor(t=64){this.maxQueued=t,this.queue=Promise.resolve(),this.queued=0}enqueue(t){if(this.queued>=this.maxQueued)throw new Error("Bridge request queue is full");this.queued+=1;let n=async()=>{this.queued-=1,await t()},i=this.queue.then(n,n);return this.queue=i.then(()=>{},()=>{}),i}};function Ue(e,t){if(!f(e)||typeof e.id!="string"||!m.isRequestKind(e.kind))return!1;let n=T(e.composition);switch(e.kind){case"initialize-session":return n&&(e.mutationContext===void 0||$(e.mutationContext));case"get-document":case"get-style-context":return n;case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof e.key=="string"&&n;case"get-history-status":return n;case"get-source-tree":return n;case"get-source-file":return typeof e.path=="string"&&n;case"execute":return n&&Ke(e.request)&&(e.request.mutationContext===void 0||$(e.request.mutationContext))&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return n&&e.mutationContext===void 0||n&&$(e.mutationContext)}}function Ke(e){return f(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&T(e.composition)&&typeof e.kind=="string"&&f(e.target)&&(e.target.kind!=="route"||T(e.target.composition))&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&f(e.params)}function T(e){return f(e)&&typeof e.routeId=="string"&&e.routeId.length>0&&(e.templateId===void 0||typeof e.templateId=="string"&&e.templateId.length>0)&&Object.keys(e).every(t=>t==="routeId"||t==="templateId")}function Ve(e){return f(e)&&typeof e.routeId=="string"&&(e.effectiveTemplateId===void 0||typeof e.effectiveTemplateId=="string")}function L(e){if(T(e.composition))return e.composition;throw new R(Y,"A composition selector is required for this request.")}function qe(e){if(f(e)&&T(e.composition))return e.composition;throw new R(Y,"A composition selector is required for execute.")}function fe(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function We(e){return e.activeComposition?C(e.activeComposition):null}function C(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}function I(e,t){return f(e)&&e.ok===!0?{...e,composition:t}:e}function Le(e,t){return!f(e)||e.ok!==!0?e:{...e,...t?{composition:t}:{},data:le(e.data)}}function le(e){let t=e;return he(t.routeId?t:{...t,routeId:t.composition.routeId})}function f(e){return typeof e=="object"&&e!==null}function $(e){return f(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}function z(e){if(!(!f(e)||typeof e.code!="string"||e.code.length===0))return e.code}function J(e){return e instanceof Error||f(e)&&typeof e.message=="string"&&e.message.length>0?e.message:"Unknown websocket operation failure"}function $e(e){try{return m.extractRequestInfo(JSON.parse(e))}catch{return{id:"unknown",kind:"get-document"}}}var N=class{constructor(){this.tail=Promise.resolve()}run(t){let n=this.tail.then(t,t);return this.tail=n.then(()=>{},()=>{}),n}};import{SiteEditOperationRequestSchema as ot,computeSiteEditCompositionKey as E}from"@vcp-dev/contracts";var st="127.0.0.1",rt=30218,at="/__vcp/site-edit/bridge",Ce=6*1024*1024,ct=Ce*2,ut=3e3,me=50,ge="__VCP_SITE_EDIT_BRIDGE_SERVERS__";function Re(e,t,n={}){let i=new te(dt(t),e,!1,n);return i.start({listen:!1}),i}var te=class{constructor(t,n=ze.createServer((o,r)=>{r.writeHead(404),r.end("VCP site edit bridge server")}),i=!0,s={}){this.options=t,this.server=n,this.closeHttpServerOnStop=i,this.dependencies=s,this.runtime=null,this.activeHistorySessionId=null,this.historySessionTransition=Promise.resolve(),this.mutationQueue=new N,this.eventListeners=new Set,this.routes=[],this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.stopWatching=null,this.stopWebSocketServer=null,this.pendingChangedFiles=new Set,this.fileChangeTimer=null,this.isStarted=!1,this.runtimeVersionFloors=new Map,this.activeHistoryStore=null,this.versionPersistence=Promise.resolve()}start(t={}){if(this.isStarted)return;this.refreshCompositions(!0),this.isStarted=!0,this.createRuntime();let n=yt({server:this.server,path:this.options.path,sessionKey:this.options.sessionKey,host:this.options.host,allowedOrigins:this.options.allowedOrigins,engine:this.createBridgeEngine()});this.stopWebSocketServer=n.stop,this.stopWatching=new it({projectRoot:this.options.projectRoot,watch_dirs:ht(this.options.runtime.watch_dirs),interval_ms:this.options.runtime.watch_interval_ms,debounce_ms:this.options.runtime.watch_debounce_ms??me,max_dirs:this.options.runtime.watch_max_dirs,max_files:this.options.runtime.watch_max_files,max_depth:this.options.runtime.watch_max_depth,max_startup_ms:this.options.runtime.watch_max_startup_ms,on_change:i=>this.handleFileChanged(i),on_batch_change:i=>this.handleFilesChanged(i)}).start(),t.listen!==!1&&this.server.listen(this.options.port,this.options.host)}getHealth(){let t=!!this.runtime&&!this.compositionResolutionError;return{ok:this.isStarted&&t,bridgePath:this.options.path,runtimeReady:t,routesIndexed:this.routes.length,sessionRequired:!!this.options.sessionKey}}stop(){this.stopWatching?.(),this.stopWatching=null,this.flushChangedFiles(),this.fileChangeTimer&&(clearTimeout(this.fileChangeTimer),this.fileChangeTimer=null),this.stopWebSocketServer?.(),this.stopWebSocketServer=null,this.runtime?.dispose(),this.runtime=null,this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.closeHttpServerOnStop&&this.server.close();let t=mt(),n=gt(this.options);t.get(n)===this&&t.delete(n),this.isStarted=!1}createRuntime(t,n=null){let i=this.runtime;this.activeHistoryStore=t??null;let s=(this.dependencies.createRuntime??Ye)({...this.options.tenantId?{tenantId:this.options.tenantId}:{},siteId:this.options.siteId,snapshotId:this.options.snapshotId,projectRoot:this.options.projectRoot,compositions:this.compositions,onEvent:o=>{"version"in o&&typeof o.version=="number"&&this.recordRuntimeVersion(o.version,"composition"in o?o.composition:void 0);for(let r of this.eventListeners)r(o)},...t?{historyStore:t}:{},...this.getInitialDocumentVersions().length>0?{initialDocumentVersions:this.getInitialDocumentVersions()}:{}});this.runtime=s,this.activeHistorySessionId=n,i?.dispose()}createBridgeEngine(){return{resolveComposition:t=>this.resolveComposition(t),initializeSession:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)throw new Error(`${n.code}: ${n.message}`);let i=ft(t.composition),s=this.getRuntime(),o=g(i);await s.initializeComposition(o);let a=s.getDocument(o).data;await this.recordRuntimeVersion(a.version,i);let d=(await s.getHistoryStatus()).data;return{ok:!0,composition:i,data:{document:a,historyStatus:d}}}),getDocument:async t=>{let n=this.getRuntime(),i=g(t);await n.initializeComposition(i);let s=n.getDocument(i);return await this.recordRuntimeVersion(s.data.version,t),{...s,composition:t}},getHistoryStatus:async t=>({...await this.getRuntime().getHistoryStatus(),composition:t}),getStyleContext:async t=>this.getRuntime().getStyleContext(g(t)),getObjectEditContext:async(t,n)=>this.getRuntime().getObjectEditContext(t,g(n)),getClassNameSource:async(t,n)=>this.getRuntime().getClassNameSource(t,g(n)),getSourceTree:async t=>this.getRuntime().getSourceTree(g(t)),getSourceFile:async t=>this.getRuntime().getSourceFile({path:t.path,composition:g(t.composition)}),resolveSourceLocation:async t=>this.getRuntime().resolveSourceLocation({key:t.key,composition:g(t.composition)}),execute:(t,n)=>this.mutationQueue.run(async()=>{let i=await this.bindHistorySession(this.options.snapshotId);if(!i.ok)return X(i,t);let s=await this.getRuntime().executeOperation(t);return s.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(s.data.resultVersion,s.composition),s}),undo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return X(n,void 0,t);let i=await this.getRuntime().undo();return i.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(i.data.resultVersion,i.composition??t),i.composition?i:{...i,composition:t}}),redo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return X(n,void 0,t);let i=await this.getRuntime().redo();return i.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(i.data.resultVersion,i.composition??t),i.composition?i:{...i,composition:t}}),subscribe:t=>(this.eventListeners.add(t),()=>this.eventListeners.delete(t))}}async bindHistorySession(t){if(!this.options.historyRoot)return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history is not configured."};if(this.activeHistorySessionId===t)return{ok:!0};let n=this.historySessionTransition.then(async()=>{if(this.activeHistorySessionId===t)return;let i=await(this.dependencies.openHistoryStore??Ze)(lt({root:this.options.historyRoot,siteId:this.options.siteId,snapshotId:this.options.snapshotId,editingSessionId:t}));if(!this.isStarted)return;let s=i.readDocumentVersion?await i.readDocumentVersion():0,o=this.compositions[0]?.context;if(o){let r=E(o);this.runtimeVersionFloors.set(r,Math.max(this.runtimeVersionFloors.get(r)??0,s))}this.createRuntime(i,t)});this.historySessionTransition=n.catch(()=>{});try{return await n,{ok:!0}}catch{return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history could not be opened."}}}recordRuntimeVersion(t,n){let i=n?E(n):null;i&&this.runtimeVersionFloors.set(i,Math.max(this.runtimeVersionFloors.get(i)??0,t));let s=this.activeHistoryStore;if(!s?.writeDocumentVersion)return Promise.resolve();let o=i?this.runtimeVersionFloors.get(i)??t:t;return this.versionPersistence=this.versionPersistence.then(()=>s.writeDocumentVersion(o)).catch(()=>{}),this.versionPersistence}handleFileChanged(t){this.handleFilesChanged([t])}handleFilesChanged(t){for(let i of t)this.pendingChangedFiles.add(i);this.fileChangeTimer&&clearTimeout(this.fileChangeTimer);let n=this.options.runtime.watch_debounce_ms??me;this.fileChangeTimer=setTimeout(()=>{this.fileChangeTimer=null,this.flushChangedFiles()},n),this.fileChangeTimer?.unref?.()}flushChangedFiles(){if(this.fileChangeTimer&&(clearTimeout(this.fileChangeTimer),this.fileChangeTimer=null),this.pendingChangedFiles.size===0)return;let t=[...this.pendingChangedFiles].sort((n,i)=>n.localeCompare(i));if(this.pendingChangedFiles.clear(),!!this.refreshCompositions(!1))for(let n of t)this.runtime?.notifyFileChanged(n)}refreshCompositions(t=!1){try{let n=pt(this.options.projectRoot),i=nt(n),s=i.length>0?i:(this.options.runtime.routes??[]).map(d=>({...d})),o=et({files:n});if(o.length===0)throw new Error("No canonical App Router composition is indexed by the preview bridge.");let r=new Map(this.compositions.map(d=>[E(d.context),d])),a=new Map(o.map(d=>[E(d.context),d]));if(this.runtime){for(let[d,c]of r){let h=a.get(d);(!h||h.entryFile!==c.entryFile)&&this.runtime.unregisterComposition(g(c.context))}for(let[d,c]of a){let h=r.get(d);(!h||h.entryFile!==c.entryFile)&&this.runtime.registerComposition(c.context,c.entryFile)}}return this.routes=s,this.compositions=o,this.compositionFiles=n,this.compositionResolutionError=null,!0}catch(n){let i=n instanceof Error?n:new Error(String(n));if(this.compositionResolutionError=i,t)throw i;return!1}}resolveComposition(t){if(this.compositionResolutionError)throw this.compositionResolutionError;let n=tt(t.routeId,this.routes,this.options.basePath);if(!n)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let i=this.routes.find(r=>r.routeId===n);if(!i)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let s=Xe({selector:{routeId:n,...t.templateId?{templateId:t.templateId}:{}},files:this.compositionFiles,canonicalEntryFile:i.entryFile}),o=E(s.context);if(!this.compositions.some(r=>E(r.context)===o))throw new Error(`Composition is not registered by the preview bridge: ${o}`);return s}getInitialDocumentVersions(){return this.compositions.flatMap(t=>{let n=this.runtimeVersionFloors.get(E(t.context));return n===void 0?[]:[{composition:t.context,version:n}]})}getRuntime(){if(!this.runtime)throw new Error("VCP site edit preview bridge runtime is not ready");return this.runtime}};function dt(e){return{tenantId:e.tenantId,siteId:e.siteId,snapshotId:e.snapshotId,projectRoot:w.resolve(e.projectRoot??process.cwd()),basePath:e.basePath??"",host:e.host??st,port:e.port??rt,path:e.path??at,sessionKey:e.sessionKey??Et(),historyRoot:e.historyRoot,allowedOrigins:e.allowedOrigins??[],runtime:e.runtime??{}}}function ht(e){let t=["app","src/app","components/site","src/components/site","lib/generated","src/lib/generated","public"];return[...new Set([...e?.length?e:t,".vcp"])]}function pt(e){let t=[],n=["app","src/app",".vcp"],i=new Set([".git",".next",".turbo","coverage","dist","node_modules","output","snapshot-store"]),s=o=>{if(!Z.existsSync(o))return;let r;try{r=Z.readdirSync(o,{withFileTypes:!0})}catch{return}for(let a of r){if(a.name.startsWith(".")&&a.name!==".vcp")continue;if(a.isDirectory()){if(i.has(a.name))continue;s(w.join(o,a.name));continue}if(!a.isFile())continue;let d=w.join(o,a.name),c="";try{c=Z.readFileSync(d,"utf8")}catch{}t.push({path:w.relative(e,d).replaceAll(w.sep,"/"),content:c})}};for(let o of n)s(w.join(e,o));return t.sort((o,r)=>o.path.localeCompare(r.path))}function ft(e){if(!e||typeof e!="object"||typeof e.routeId!="string")throw new Error("Normalized composition context is required.");if("effectiveTemplateId"in e)return e;let t=e;return{routeId:t.routeId,...t.templateId?{effectiveTemplateId:t.templateId}:{}}}function g(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function lt(e){return w.join(w.resolve(e.root),ye(e.siteId),ye(e.snapshotId),we("sha256").update(e.editingSessionId).digest("hex").slice(0,32))}function ye(e){return/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)&&e!=="."&&e!==".."?e:we("sha256").update(e).digest("hex").slice(0,32)}function mt(){let e=globalThis;return e[ge]??=new Map,e[ge]}function gt(e){return`${e.projectRoot}:${e.host}:${e.port}:${e.path}:${e.historyRoot??""}`}function X(e,t,n){let i=n??(t?.composition?{routeId:t.composition.routeId,...t.composition.templateId?{effectiveTemplateId:t.composition.templateId}:{}}:void 0);if(!i)throw new Error("A normalized composition is required to construct a mutation result.");return{ok:!1,composition:i,error:{code:e.code,message:e.message},data:{requestId:t?.id??"mutation-context",kind:t?.kind??"update-text",composition:i,target:t?.target??{kind:"node",key:""},resultVersion:t?.documentVersion??0}}}function yt(e){let t=new Qe({maxPayload:Ce,noServer:!0}),n=new WeakSet,i=o=>{new O({socket:new ne(o),engine:e.engine,validateOperationRequest:r=>ot.safeParse(r).success})},s=(o,r,a)=>{if(!St(o,e))return;let d=It(o,e);if(!d){r.write(`HTTP/1.1 401 Unauthorized\r
|
|
2
2
|
Connection: close\r
|
|
3
3
|
\r
|
|
4
|
-
`),r.destroy();return}c.authenticatedByHeader&&n.add(s),t.handleUpgrade(s,r,a,d=>{t.emit("connection",d,s)})};return e.server.on("upgrade",o),t.on("connection",(s,r)=>{if(n.has(r)){i(s);return}It(s,e.sessionKey,()=>{i(s)})}),t.stop=()=>{e.server.off("upgrade",o);for(let s of t.clients)s.close(1001,"bridge stopped");t.close()},t}var te=class{constructor(t){this.socket=t,this.onmessage=null,this.onclose=null,t.on("error",()=>{}),t.on("message",n=>{this.onmessage?.({data:n.toString()})}),t.on("close",()=>{this.onclose?.()})}send(t){if(this.socket.readyState===Se.OPEN){if(this.socket.bufferedAmount+Buffer.byteLength(t,"utf8")>at){this.socket.close(1013,"bridge backpressure");return}this.socket.send(t)}}close(t,n){this.socket.close(t,n)}};function yt(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function St(e,t){if(new URL(e.url??"/","http://localhost").searchParams.has("vcp_bridge_key"))return null;let i=X(e.headers["x-vcp-site-edit-key"]),o=xe(i,t.sessionKey),s=X(e.headers.host),r=X(e.headers.origin);return s&&!wt(s,t.host,r)?null:r?Ct(r,s,t.allowedOrigins)?{authenticatedByHeader:o}:null:o?{authenticatedByHeader:!0}:null}function It(e,t,n){let i=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},ct),o,s=()=>{clearTimeout(i),e.off("message",o),e.off("close",s)},r=()=>{s(),e.close(1008,"bridge authentication failed")};o=a=>{try{let c=m.parseMessage(a.toString());if(c.type!=="auth"||!xe(c.payload.key,t)){r();return}s(),e.readyState===Se.OPEN&&e.send(m.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{r()}},e.on("message",o),e.on("close",s)}function xe(e,t){if(!e)return!1;let n=Buffer.from(e),i=Buffer.from(t);return n.length===i.length&&Je(n,i)}function wt(e,t,n){let i=ge(e),o=ge(t);return i===o||me(o)&&me(i)&&(!n||ne(n,e))||xt(o)&&(!n||ne(n,e))}function xt(e){return e==="0.0.0.0"||e==="::"}function me(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Ct(e,t,n){return n.includes(e)||(t?ne(e,t):!1)}function ne(e,t){try{return new URL(e).host===Ce(t)}catch{return!1}}function ge(e){let t=Ce(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function Ce(e){return e.trim().toLowerCase()}function X(e){return Array.isArray(e)?e[0]:e}function bt(){return ze(32).toString("base64url")}var Et="next",vt="127.0.0.1",_t=3e3,F="/__vcp/site-edit/bridge",Te="/__vcp/site-edit/health",U="/__vcp/site-edit/client/",kt=`${U}auto-bootstrap.js`,Pe='data-vcp-site-edit-bootstrap="true"',Tt=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],Pt="@vcp-dev/site-edit-engine/webpack-loader",Ht=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,Bt=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],At=new Set(["auto-bootstrap.js","client.js","composition-key.js","designer-trace.js","document-codec.js","protocol.js","window-message.js"]);async function Un(e={},t={}){let n=t.process??process,i=t.createServer??Rt.createServer,o=t.attachBridgeServer??we,s=t.loadNext??cn,r=k.resolve(e.projectRoot??process.cwd()),a=e.host??vt,c=e.port??pn(n.env.PORT)??_t,d=e.bridgePath??F,l=Ut(d),u=nn(),h=e.basePath??n.env.VCP_SITE_PREVIEW_BASE_PATH??"/",f=(e.tenantId??n.env.VCP_TENANT_ID)?.trim()||void 0,H=await s(r),v=Ot(r),I=H({dev:!0,dir:r,hostname:a,port:c,...Dt(v)}),Ae=I.getRequestHandler(),Oe=e.siteId??n.env.VCP_SITE_ID??"018f6f4d-a9b8-7120-8000-000000000120",De=e.snapshotId??n.env.VCP_SNAPSHOT_ID??hn(r),oe=e.historyRoot??n.env.VCP_SITE_EDIT_HISTORY_ROOT,re=oe?.trim()?k.resolve(oe):void 0,B=null,b=i((q,D)=>{zt({basePath:h,bridgePath:d,bridgeHealthPath:l,bridgeSessionKey:u,getBridgeHealth:()=>B?.getHealth()??Gt(d),handle:Ae,request:q,response:D}).catch(Me=>{console.error(Me),D.headersSent||(D.statusCode=500),D.end("site edit preview request failed")})}),K=null,A=null,V=()=>A||(j(()=>n.off("SIGINT",O)),j(()=>n.off("SIGTERM",O)),j(()=>K?.()),K=null,j(()=>B?.stop()),B=null,A=Promise.allSettled([fn(b),mn(()=>I.close())]).then(()=>{}),A),O=()=>{V()};try{return await I.prepare(),B=o(b,{...f?{tenantId:f}:{},siteId:Oe,snapshotId:De,projectRoot:r,basePath:h,host:a,port:c,path:d,sessionKey:u,...re?{historyRoot:re}:{}}),K=jt({server:b,bridgePath:d,handleUpgrade:I.getUpgradeHandler()}),n.on("SIGINT",O),n.on("SIGTERM",O),await ln(b,c,a),{bundler:v,close:V,host:a,port:gn(b,c),server:b}}catch(q){throw await V(),q}}function Ot(e){let t=Mt(e);return t&&Nt(t)?"webpack":"turbopack"}function Dt(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function Mt(e){for(let t of Tt){let n=P(e,t);if(E(n))return R(n,"utf8")}return null}function Nt(e){return e.includes(Pt)?!0:Ht.test(e)&&Bt.some(t=>t.test(e))}function jt(e){let t=(n,i,o)=>{Ft(n.url,e.bridgePath)||e.handleUpgrade(n,i,o).catch(s=>{console.error(s),i.destroyed||i.destroy()})};return e.server.on("upgrade",t),()=>e.server.off("upgrade",t)}function Ft(e,t){return new URL(e??"/","http://localhost").pathname===t}function Ut(e=F){if(e===F)return Te;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function Kt(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??Vt()});return`<script type="module" ${Pe}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(kt)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function Vt(){return{bridge:ie("@vcp-dev/site-edit-bridge"),contracts:ie("@vcp-dev/contracts"),engine:ie("@vcp-dev/site-edit-engine")}}function ie(e){let t=ve(import.meta.url);try{let n=t.resolve(e),i=qt(n,e);if(!i)return;let o=JSON.parse(R(i,"utf8"));return typeof o.version=="string"?o.version:void 0}catch{return}}function qt(e,t){let n=k.parse(e).root,i=T(e);for(;i&&i!==n;){let o=P(i,"package.json");if(E(o))try{if(JSON.parse(R(o,"utf8")).name===t)return o}catch{return}i=T(i)}}function Wt(e,t){if(e.includes(Pe))return e;let n=Kt(t),i=/<\/body\s*>/i.exec(e);return i?`${e.slice(0,i.index)}${n}${e.slice(i.index)}`:`${e}${n}`}function Kn(e,t=T(ke(import.meta.url)),n=E){return He(e,t,n)?.path??null}function He(e,t=T(ke(import.meta.url)),n=E){let i=new URL(e??"/","http://localhost").pathname;if(!i.startsWith(U))return null;let o=i.slice(U.length);if(!At.has(o))return null;let s=se(un(t),o);if(_e(t)!=="src")return{path:s,requiresTranspile:!1};let r=se(t,o.replace(/\.js$/,".ts"));return n(r)?{path:r,requiresTranspile:!0}:{path:s,requiresTranspile:!1}}async function Lt(e,t){let n=He(e.url);if(!n)return!1;if(!E(n.path))return t.writeHead(404),t.end("site edit client asset not found"),!0;let i=n.requiresTranspile?await $t(R(n.path,"utf8")):R(n.path);return t.writeHead(200,{"cache-control":"no-store","content-type":"text/javascript; charset=utf-8"}),t.end(i),!0}async function $t(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function zt({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:i,getBridgeHealth:o,handle:s,request:r,response:a}){if(Jt(r,a,n,o)||await Lt(r,a))return;let c=Qt(r),d=Yt(r),l=c||d?en(a,{basePath:e,bridgePath:t,bridgeSessionKey:i,patchNextDevChunk:d}):()=>{};try{await s(r,a)}catch(u){throw l(),u}}function Jt(e,t,n,i){if(e.method!=="GET"||new URL(e.url??"/","http://localhost").pathname!==n)return!1;let s=i();return t.writeHead(s.ok?200:503,{"cache-control":"no-store","content-type":"application/json; charset=utf-8"}),t.end(JSON.stringify(s)),!0}function Gt(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function Qt(e){return Zt(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Yt(e){return Xt(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Zt(e){if(e.method!=="GET")return!1;let t=new URL(e.url??"/","http://localhost").pathname;if(t.startsWith("/_next/")||t.startsWith(U)||t===F||t===Te)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function Xt(e){if(e.method!=="GET"||!String(e.headers["user-agent"]??"").includes("Firefox"))return!1;let n=new URL(e.url??"/","http://localhost").pathname;return n.startsWith("/_next/static/chunks/")&&n.endsWith(".js")}function en(e,t){let n=[],i=e,o=i.flushHeaders.bind(e),s=i.write.bind(e),r=i.end.bind(e);return i.flushHeaders=()=>{},i.write=(a,c,d)=>(a!==void 0&&n.push(be(a,Re(c))),Ee(c),Ee(d),!0),i.end=(a,c,d)=>{let l=typeof a=="function"?void 0:a;l!==void 0&&n.push(be(l,Re(c))),i.write=s,i.end=r,i.flushHeaders=o;let u=Buffer.concat(n),h=tn(e,u,t);h!==u&&!e.headersSent&&e.removeHeader("content-length");let f=typeof a=="function"?a:typeof c=="function"?c:typeof d=="function"?d:void 0;return f?r(h,f):r(h)},()=>{i.write=s,i.end=r,i.flushHeaders=o}}function tn(e,t,n){if(sn(e,t))return Buffer.from(Wt(t.toString("utf8"),n));if(n.patchNextDevChunk&&on(e)){let i=t.toString("utf8"),o=rn(i);if(o!==i)return Buffer.from(o)}return t}function nn(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function sn(e,t){if(e.statusCode<200||e.statusCode>=300)return!1;let n=e.getHeader("content-type"),i=Array.isArray(n)?n.join(";"):String(n??"");return t.toString("utf8",0,256).includes("<html")&&(i===""||i.includes("text/html"))}function on(e){if(e.statusCode<200||e.statusCode>=300)return!1;let t=e.getHeader("content-type"),n=Array.isArray(t)?t.join(";"):String(t??"");return n===""||n.includes("javascript")||n.includes("ecmascript")}function rn(e){return[["debugChannel = createDebugChannel(undefined);","debugChannel = undefined;"],["if (isStreamErrorOrUnfinished(ctr)) {","if (false) {"],["return ctr.desiredSize === null || ctr.desiredSize < 0;","return false;"],[["findSourceMapURL: _appfindsourcemapurl.findSourceMapURL,"," debugChannel,"," startTime: 0"].join(`
|
|
4
|
+
`),r.destroy();return}d.authenticatedByHeader&&n.add(o),t.handleUpgrade(o,r,a,c=>{t.emit("connection",c,o)})};return e.server.on("upgrade",s),t.on("connection",(o,r)=>{if(n.has(r)){i(o);return}wt(o,e.sessionKey,()=>{i(o)})}),t.stop=()=>{e.server.off("upgrade",s);for(let o of t.clients)o.close(1001,"bridge stopped");t.close()},t}var ne=class{constructor(t){this.socket=t,this.onmessage=null,this.onclose=null,t.on("error",()=>{}),t.on("message",n=>{this.onmessage?.({data:n.toString()})}),t.on("close",()=>{this.onclose?.()})}send(t){if(this.socket.readyState===xe.OPEN){if(this.socket.bufferedAmount+Buffer.byteLength(t,"utf8")>ct){this.socket.close(1013,"bridge backpressure");return}this.socket.send(t)}}close(t,n){this.socket.close(t,n)}};function St(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function It(e,t){if(new URL(e.url??"/","http://localhost").searchParams.has("vcp_bridge_key"))return null;let i=ee(e.headers["x-vcp-site-edit-key"]),s=Ee(i,t.sessionKey),o=ee(e.headers.host),r=ee(e.headers.origin);return o&&!xt(o,t.host,r)?null:r?Rt(r,o,t.allowedOrigins)?{authenticatedByHeader:s}:null:s?{authenticatedByHeader:!0}:null}function wt(e,t,n){let i=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},ut),s,o=()=>{clearTimeout(i),e.off("message",s),e.off("close",o)},r=()=>{o(),e.close(1008,"bridge authentication failed")};s=a=>{try{let d=m.parseMessage(a.toString());if(d.type!=="auth"||!Ee(d.payload.key,t)){r();return}o(),e.readyState===xe.OPEN&&e.send(m.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{r()}},e.on("message",s),e.on("close",o)}function Ee(e,t){if(!e)return!1;let n=Buffer.from(e),i=Buffer.from(t);return n.length===i.length&&Ge(n,i)}function xt(e,t,n){let i=Ie(e),s=Ie(t);return i===s||Se(s)&&Se(i)&&(!n||ie(n,e))||Ct(s)&&(!n||ie(n,e))}function Ct(e){return e==="0.0.0.0"||e==="::"}function Se(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Rt(e,t,n){return n.includes(e)||(t?ie(e,t):!1)}function ie(e,t){try{return new URL(e).host===be(t)}catch{return!1}}function Ie(e){let t=be(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function be(e){return e.trim().toLowerCase()}function ee(e){return Array.isArray(e)?e[0]:e}function Et(){return Je(32).toString("base64url")}var vt="next",_t="127.0.0.1",Tt=3e3,U="/__vcp/site-edit/bridge",Pe="/__vcp/site-edit/health",K="/__vcp/site-edit/client/",kt=`${K}auto-bootstrap.js`,He='data-vcp-site-edit-bootstrap="true"',Pt=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],Ht="@vcp-dev/site-edit-engine/webpack-loader",Bt=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,At=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],Dt=new Set(["auto-bootstrap.js","client.js","composition-key.js","designer-trace.js","document-codec.js","protocol.js","window-message.js"]);async function Un(e={},t={}){let n=t.process??process,i=t.createServer??bt.createServer,s=t.attachBridgeServer??Re,o=t.loadNext??cn,r=k.resolve(e.projectRoot??process.cwd()),a=e.host??_t,d=e.port??pn(n.env.PORT)??Tt,c=e.bridgePath??U,h=Kt(c),u=nn(),p=e.basePath??n.env.VCP_SITE_PREVIEW_BASE_PATH??"/",l=(e.tenantId??n.env.VCP_TENANT_ID)?.trim()||void 0,y=await o(r),S=Mt(r),x=y({dev:!0,dir:r,hostname:a,port:d,...Ot(S)}),De=x.getRequestHandler(),Me=e.siteId??n.env.VCP_SITE_ID??"018f6f4d-a9b8-7120-8000-000000000120",Oe=e.snapshotId??n.env.VCP_SNAPSHOT_ID??hn(r),ce=e.historyRoot??n.env.VCP_SITE_EDIT_HISTORY_ROOT,ue=ce?.trim()?k.resolve(ce):void 0,B=null,b=i((W,M)=>{Jt({basePath:p,bridgePath:c,bridgeHealthPath:h,bridgeSessionKey:u,getBridgeHealth:()=>B?.getHealth()??Qt(c),handle:De,request:W,response:M}).catch(Ne=>{console.error(Ne),M.headersSent||(M.statusCode=500),M.end("site edit preview request failed")})}),V=null,A=null,q=()=>A||(F(()=>n.off("SIGINT",D)),F(()=>n.off("SIGTERM",D)),F(()=>V?.()),V=null,F(()=>B?.stop()),B=null,A=Promise.allSettled([ln(b),mn(()=>x.close())]).then(()=>{}),A),D=()=>{q()};try{return await x.prepare(),B=s(b,{...l?{tenantId:l}:{},siteId:Me,snapshotId:Oe,projectRoot:r,basePath:p,host:a,port:d,path:c,sessionKey:u,...ue?{historyRoot:ue}:{}}),V=Ft({server:b,bridgePath:c,handleUpgrade:x.getUpgradeHandler()}),n.on("SIGINT",D),n.on("SIGTERM",D),await fn(b,d,a),{bundler:S,close:q,host:a,port:gn(b,d),server:b}}catch(W){throw await q(),W}}function Mt(e){let t=Nt(e);return t&&jt(t)?"webpack":"turbopack"}function Ot(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function Nt(e){for(let t of Pt){let n=H(e,t);if(_(n))return v(n,"utf8")}return null}function jt(e){return e.includes(Ht)?!0:Bt.test(e)&&At.some(t=>t.test(e))}function Ft(e){let t=(n,i,s)=>{Ut(n.url,e.bridgePath)||e.handleUpgrade(n,i,s).catch(o=>{console.error(o),i.destroyed||i.destroy()})};return e.server.on("upgrade",t),()=>e.server.off("upgrade",t)}function Ut(e,t){return new URL(e??"/","http://localhost").pathname===t}function Kt(e=U){if(e===U)return Pe;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function Vt(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??qt()});return`<script type="module" ${He}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(kt)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function qt(){return{bridge:oe("@vcp-dev/site-edit-bridge"),contracts:oe("@vcp-dev/contracts"),engine:oe("@vcp-dev/site-edit-engine")}}function oe(e){let t=_e(import.meta.url);try{let n=t.resolve(e),i=Wt(n,e);if(!i)return;let s=JSON.parse(v(i,"utf8"));return typeof s.version=="string"?s.version:void 0}catch{return}}function Wt(e,t){let n=k.parse(e).root,i=P(e);for(;i&&i!==n;){let s=H(i,"package.json");if(_(s))try{if(JSON.parse(v(s,"utf8")).name===t)return s}catch{return}i=P(i)}}function Lt(e,t){if(e.includes(He))return e;let n=Vt(t),i=/<\/body\s*>/i.exec(e);return i?`${e.slice(0,i.index)}${n}${e.slice(i.index)}`:`${e}${n}`}function Kn(e,t=P(ke(import.meta.url)),n=_){return Be(e,t,n)?.path??null}function Be(e,t=P(ke(import.meta.url)),n=_){let i=new URL(e??"/","http://localhost").pathname;if(!i.startsWith(K))return null;let s=i.slice(K.length);if(!Dt.has(s))return null;let o=ae(un(t),s);if(Te(t)!=="src")return{path:o,requiresTranspile:!1};let r=ae(t,s.replace(/\.js$/,".ts"));return n(r)?{path:r,requiresTranspile:!0}:{path:o,requiresTranspile:!1}}async function $t(e,t){let n=Be(e.url);if(!n)return!1;if(!_(n.path))return t.writeHead(404),t.end("site edit client asset not found"),!0;let i=n.requiresTranspile?await zt(v(n.path,"utf8")):v(n.path);return t.writeHead(200,{"cache-control":"no-store","content-type":"text/javascript; charset=utf-8"}),t.end(i),!0}async function zt(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function Jt({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:i,getBridgeHealth:s,handle:o,request:r,response:a}){if(Gt(r,a,n,s)||await $t(r,a))return;let d=Yt(r),c=Zt(r),h=d||c?tn(a,{basePath:e,bridgePath:t,bridgeSessionKey:i,patchNextDevChunk:c}):()=>{};try{await o(r,a)}catch(u){throw h(),u}}function Gt(e,t,n,i){if(e.method!=="GET"||new URL(e.url??"/","http://localhost").pathname!==n)return!1;let o=i();return t.writeHead(o.ok?200:503,{"cache-control":"no-store","content-type":"application/json; charset=utf-8"}),t.end(JSON.stringify(o)),!0}function Qt(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function Yt(e){return Xt(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Zt(e){return en(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Xt(e){if(e.method!=="GET")return!1;let t=new URL(e.url??"/","http://localhost").pathname;if(t.startsWith("/_next/")||t.startsWith(K)||t===U||t===Pe)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function en(e){if(e.method!=="GET"||!String(e.headers["user-agent"]??"").includes("Firefox"))return!1;let n=new URL(e.url??"/","http://localhost").pathname;return n.startsWith("/_next/static/chunks/")&&n.endsWith(".js")}function tn(e,t){let n=[],i=e,s=i.flushHeaders.bind(e),o=i.write.bind(e),r=i.end.bind(e),a=!1;i.flushHeaders=()=>{};let d=()=>{if(t.patchNextDevChunk||a)return!1;let c=Buffer.concat(n);if(!/<body\b[^>]*>/iu.test(c.toString("utf8")))return!1;let h=ve(e,c,t);return h!==c&&!e.headersSent&&e.removeHeader("content-length"),o(h),n.length=0,a=!0,!0};return i.write=(c,h,u)=>a?(c!==void 0&&o(se(c,re(h))),j(h),j(u),!0):(c!==void 0&&(n.push(se(c,re(h))),d()),j(h),j(u),!0),i.end=(c,h,u)=>{let p=typeof c=="function"?void 0:c;if(a)return i.write=o,i.end=r,i.flushHeaders=s,p===void 0?typeof c=="function"?r(c):typeof h=="function"?r(h):typeof u=="function"?r(u):r():typeof h=="function"?r(p,h):typeof u=="function"?r(p,h,u):r(p,h);p!==void 0&&n.push(se(p,re(h))),i.write=o,i.end=r,i.flushHeaders=s;let l=Buffer.concat(n),y=ve(e,l,t);y!==l&&!e.headersSent&&e.removeHeader("content-length");let S=typeof c=="function"?c:typeof h=="function"?h:typeof u=="function"?u:void 0;return S?r(y,S):r(y)},()=>{i.write=o,i.end=r,i.flushHeaders=s}}function ve(e,t,n){if(on(e,t))return Buffer.from(Lt(t.toString("utf8"),n));if(n.patchNextDevChunk&&sn(e)){let i=t.toString("utf8"),s=rn(i);if(s!==i)return Buffer.from(s)}return t}function nn(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function on(e,t){if(e.statusCode<200||e.statusCode>=300)return!1;let n=e.getHeader("content-type"),i=Array.isArray(n)?n.join(";"):String(n??"");return t.toString("utf8",0,256).includes("<html")&&(i===""||i.includes("text/html"))}function sn(e){if(e.statusCode<200||e.statusCode>=300)return!1;let t=e.getHeader("content-type"),n=Array.isArray(t)?t.join(";"):String(t??"");return n===""||n.includes("javascript")||n.includes("ecmascript")}function rn(e){return[["debugChannel = createDebugChannel(undefined);","debugChannel = undefined;"],["if (isStreamErrorOrUnfinished(ctr)) {","if (false) {"],["return ctr.desiredSize === null || ctr.desiredSize < 0;","return false;"],[["findSourceMapURL: _appfindsourcemapurl.findSourceMapURL,"," debugChannel,"," startTime: 0"].join(`
|
|
5
5
|
`),["unstable_allowPartialStream: true,"," debugChannel,"," startTime: 0"].join(`
|
|
6
|
-
`)],[["findSourceMapURL: _appfindsourcemapurl.findSourceMapURL,"," debugChannel,"," startTime: 0"].join("\\n"),["unstable_allowPartialStream: true,"," debugChannel,"," startTime: 0"].join("\\n")],["debugChannel: createDebugChannel && createDebugChannel(requestHeaders)","debugChannel: undefined"],["debugChannel: createDebugChannel && createDebugChannel(headers)","debugChannel: undefined"]].reduce((n,[i,
|
|
6
|
+
`)],[["findSourceMapURL: _appfindsourcemapurl.findSourceMapURL,"," debugChannel,"," startTime: 0"].join("\\n"),["unstable_allowPartialStream: true,"," debugChannel,"," startTime: 0"].join("\\n")],["debugChannel: createDebugChannel && createDebugChannel(requestHeaders)","debugChannel: undefined"],["debugChannel: createDebugChannel && createDebugChannel(headers)","debugChannel: undefined"]].reduce((n,[i,s])=>an(n,i,s),e)}function an(e,t,n){if(n.length>t.length)throw new Error("Replacement must not be longer than the search string.");return e.replaceAll(t,n.padEnd(t.length," "))}function se(e,t){return Buffer.isBuffer(e)?e:e instanceof Uint8Array?Buffer.from(e):Buffer.from(String(e),t)}function re(e){return typeof e=="string"?e:void 0}function j(e){typeof e=="function"&&e()}async function cn(e){let n=_e(H(e,"package.json"))(vt);return n.default??n}function un(e){return Te(e)!=="src"?e:ae(dn(e),"dist")}function dn(e){return Ae(e)?k.posix.dirname(e):P(e)}function ae(e,t){return Ae(e)?k.posix.join(e,t):H(e,t)}function Ae(e){return e.includes("/")&&!e.includes("\\")}function hn(e){let t=H(e,".vcp/current-snapshot.json");if(!_(t))return"sandbox_worktree";try{let n=JSON.parse(v(t,"utf8"));return typeof n.snapshotId=="string"?n.snapshotId:"sandbox_worktree"}catch{return"sandbox_worktree"}}function pn(e){if(!e)return null;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:null}function fn(e,t,n){return new Promise((i,s)=>{e.once("error",s),e.listen(t,n,()=>{e.off("error",s),i()})})}function ln(e){return new Promise(t=>{e.close(()=>t())})}function F(e){try{e()}catch{}}function mn(e){try{return e()}catch(t){return Promise.reject(t)}}function gn(e,t){let n=e.address();return typeof n=="object"&&n?n.port:t}export{Ft as attachNextDevUpgradeHandler,Vt as createSiteEditAutoBootstrapHtmlSnippet,Lt as injectSiteEditAutoBootstrap,rn as patchNextFirefoxDevChunk,Zt as prepareFirefoxNextDevChunkPatchRequest,Yt as prepareSiteEditHtmlInjectionRequest,Kt as resolveSiteEditBridgeHealthPath,Be as resolveSiteEditClientAsset,Kn as resolveSiteEditClientAssetPath,Mt as resolveSiteEditNextDevBundler,Un as startSiteEditNextDevServer,zt as transpileSiteEditClientSource};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vcp-dev/site-edit-bridge",
|
|
3
|
-
"version": "0.7.
|
|
3
|
+
"version": "0.7.3",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"repository": {
|
|
@@ -74,8 +74,8 @@
|
|
|
74
74
|
"typecheck": "tsc -p tsconfig.json --noEmit"
|
|
75
75
|
},
|
|
76
76
|
"dependencies": {
|
|
77
|
-
"@vcp-dev/contracts": "0.7.
|
|
78
|
-
"@vcp-dev/site-edit-engine": "0.7.
|
|
77
|
+
"@vcp-dev/contracts": "0.7.3",
|
|
78
|
+
"@vcp-dev/site-edit-engine": "0.7.3",
|
|
79
79
|
"@types/ws": "^8.18.1",
|
|
80
80
|
"ws": "^8.20.1"
|
|
81
81
|
},
|