@vcp-dev/site-edit-bridge 0.7.2 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +6 -6
- package/dist/next-dev-server.d.ts +18 -0
- package/dist/next-dev-server.js +3 -3
- package/package.json +3 -3
package/dist/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
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=`
|
|
1
|
+
function Nn(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 S=n.length;return n.push(d),t.set(d,S),S},l=d=>{let f=null;for(let S of ho(d)){let N=`${f??"root"}\0${S}`,C=r.get(N);if(typeof C=="number"){f=C;continue}let _=i.length;i.push([f,u(S)]),r.set(N,_),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),uo(d.operationSummary),...f>=0?[f]:[]]}),...a.length>0?{dynamicDataSummaries:a}:{}}}function Dn(e){if(!po(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:lo(a),...r.get(s)?{dynamicDataSummary:r.get(s)}:{}}})}}function uo(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function lo(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function po(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"||!fo(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 fo(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 ho(e){if(!e)return[];let t=[],n=0,r=kn(e,n);if(r<0)return t.push(e),t;for(t.push(e.slice(0,r)),n=r;n<e.length;){if(r=kn(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 kn(e,t){let n=e.indexOf("/",t),r=e.indexOf("::",t);return n<0?r:r<0?n:Math.min(n,r)}var Bn="SITE_EDIT_COMPOSITION_SESSION_MISMATCH",zt="SITE_EDIT_COMPOSITION_SESSION_REQUIRED",Ra="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"?mo(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:On(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,Eo(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(Bn,"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(Bn,"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=bo(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:wn(n)};if(r.target.kind==="route"){let i=r.target,o=Mt(i),s=await this.resolveAndAssert(o);r.target={...i,composition:wn(s)}}return r}handleEngineEvent(t){let n=t?.composition;if(!yo(n))return;let r=_e(n);this.session.subscribedCompositionKeys.has(r)&&(this.eventDispatcher.push(t),t.type==="site-edit.graph.invalidated"&&r===So(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=Io(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 mo(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&&go(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 go(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 yo(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 bo(e){if(G(e)&&We(e.composition))return e.composition;throw new Ae(zt,"A composition selector is required for execute.")}function wn(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function So(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 Eo(e,t){return!G(e)||e.ok!==!0?e:{...e,...t?{composition:t}:{},data:On(e.data)}}function On(e){let t=e;return Nn(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 Io(e){try{return se.extractRequestInfo(JSON.parse(e))}catch{return{id:"unknown",kind:"get-document"}}}var Co="vcp:designer:trace",vo="designer_trace",Mn="__VCP_DESIGNER_TRACE__";var Ro=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function xo(e=globalThis){let t=e;try{if(t.localStorage?.getItem(Co)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(vo)==="1"}catch{return!1}}function Ce(e,t={},n=globalThis){if(!xo(n))return;let r={type:e,timestamp:Date.now(),payload:To(t)},i=n,o=i[Mn]??[];o.push(r),o.length>1e3&&o.splice(0,o.length-1e3),i[Mn]=o;let s=n.console?.debug;r.payload.diagnosticOnly!==!0&&typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function To(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(Ro.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(ko(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=wo(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:Fn(n.request,"kind"),documentVersion:Fn(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:No(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Wn(n.payload.result.data,n.payload.result.composition)}:r.kind==="initialize-session"?Do(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):Po[t]??Ao}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===_o||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)}},_o=0,Ht=1,Ao=15e3,Po={"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 ko(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 Fn(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function No(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 Kn(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=!Vn(t.initialDocument),this.activeCompositionContext=this.sessionInitialized?{...t.initialDocument.composition}:null}async getDocument(t){this.requireBoundComposition(t);let n=Vn(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??Bo(this.composition);return qn(t)===qn(n)}};function Vn(e){return e.version===0&&e.entries.length===0}function Do(e){let t=e;return{...t,data:{...t.data,document:Wn(t.data.document,t.composition)}}}function Wn(e,t){let n=e,r=Dn(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 qn(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}function Bo(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 wo(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 zn="vcp-window-message",$n=1;function Oo(e){return{source:zn,version:$n,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function Mo(e){try{return I(e)?J(e,"source",zn)&&J(e,"version",$n)&&k(e,"namespace")&&k(e,"channel")&&le(e,"body")&&(!ke(e,"sessionKey")||k(e,"sessionKey")):!1}catch{return!1}}var Hn="site-edit",Un="frame-runtime",Gt=1,He=1,Ue=1,jn=24;function Ge(e,t={}){return Oo({namespace:Hn,channel:Un,sessionKey:t.sessionKey,body:e})}function Gn(e){try{return!Mo(e)||e.namespace!==Hn||e.channel!==Un?!1:ci(e.body)}catch{return!1}}function Se(e){return I(e)&&k(e,"routeId")&&Pe(e,"templateId")&&he(e,["routeId","templateId"])}function ut(e){return I(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 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 Fo(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 Vo(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 fe(e){return I(e)&&k(e,"key")&<(e,"instanceIndex")&<(e,"instanceCount")&<(e,"textSegmentIndex")}function qo(e){return I(e)&&k(e,"blockId")&&fe(p(e,"ref"))&&je(p(e,"rect"))&&pt(e,"targetIsSectionRoot")}function Ko(e){if(!I(e))return!1;let t=p(e,"placement"),n=p(e,"boundary");return k(e,"anchorBlockId")&&fe(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 Yn(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")&&Wo(p(i,"scrollContainers"))}function Wo(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")||Yn(p(e,"layoutSnapshot")))}function zo(e){return I(e)&&fe(p(e,"ref"))&&le(e,"layoutSnapshot")&&Yn(p(e,"layoutSnapshot"))&&(Y(e,"childBoxes")||Uo(p(e,"childBoxes")))&&(Y(e,"childRects")||Ho(p(e,"childRects")))&&(Y(e,"layout")||$o(p(e,"layout")))&&(Y(e,"spacing")||jo(p(e,"spacing")))}function $o(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 Ho(e){return Array.isArray(e)&&e.every(t=>je(t))}function Uo(e){return Array.isArray(e)&&e.every(t=>I(t)&&je(p(t,"rect"))&&Xn(p(t,"margin")))}function Xn(e){return I(e)&&["marginTop","marginRight","marginBottom","marginLeft"].every(t=>M(e,t))}function jo(e){return Xn(e)&&["paddingTop","paddingRight","paddingBottom","paddingLeft","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","columnGap","rowGap"].every(t=>M(e,t))}function Go(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)||!zo(n.value))return!1}return!0}function Yo(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 Ln(e){return e==null||typeof e=="string"||typeof e=="number"&&Number.isFinite(e)}function Xo(e){return I(e)&&Reflect.ownKeys(e).every(t=>typeof t=="string"&&le(e,t)&&Ln(p(e,t)))}function Lo(e){if(!I(e))return!1;let t=p(e,"priority");return k(e,"property")&&le(e,"value")&&Ln(p(e,"value"))&&(!ke(e,"priority")||t===void 0||t==="important")}function Jo(e){return I(e)?(Y(e,"attributes")||Yo(p(e,"attributes")))&&Pe(e,"className")&&(Y(e,"style")||Xo(p(e,"style")))&&(Y(e,"styleDeclarations")||Array.isArray(p(e,"styleDeclarations"))&&p(e,"styleDeclarations").every(Lo)):!1}function Qo(e){return I(e)&&M(e,"x")&&M(e,"y")&&(Y(e,"detailLevel")||J(e,"detailLevel","summary")||J(e,"detailLevel","full"))}function Zo(e){return I(e)&&fe(p(e,"ref"))}function ei(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 ti(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 Qo(n);case"bridge-get-source-tree":return I(n)&&Se(p(n,"composition"))&&he(n,["composition"]);case"get-scroll-metrics":case"clear-theme-override":return Vo(n);case"bridge-get-history-status":case"bridge-undo":case"bridge-redo":return I(n)&&Se(p(n,"composition"))&&he(n,["composition"]);case"bridge-get-source-file":return I(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 I(n)&&k(n,"key")&&Se(p(n,"composition"))&&he(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)&&fe(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)&&fe(p(n,"ref"))&&J(n,"visible",!0);case"clear-resize-visual":return I(n)&&J(n,"version",Ue);case"set-theme-override":return ei(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")||fe(p(n,"movingRef")));case"observe-node-bounds":case"clear-node-bounds-observer":return I(n)&&(Y(n,"ref")||fe(p(n,"ref")));case"apply-node-patch":return I(n)&&fe(p(n,"ref"))&&Jo(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 Zo(n);case"bridge-initialize-session":case"bridge-get-style-context":return I(n)&&Se(p(n,"composition"))&&he(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")&&he(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}:{}})&&he(n,["composition","request"])}case"bridge-subscribe":case"bridge-unsubscribe":return I(n)&&k(n,"subscriptionId")&&Se(p(n,"composition"))&&he(n,["subscriptionId","composition"]);default:return!1}}function ni(e){return J(e,"type","response")&&k(e,"id")&&pt(e,"ok")&&(Y(e,"error")||k(e,"error"))}function ri(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 oi=new Set(["pointer-down","pointer-move","pointer-leave","pointer-up","pointer-cancel","pointer-click","pointer-double-click"]),Jn=new Set(["e","s","se"]);function ii(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"&&Jn.has(s)&&p(e,"resizeEdge")===s&&fe(p(n,"ref"))&&["startWidth","startHeight","width","height"].every(a=>M(n,a))}function si(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 fe(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 Fo(n,"sequence")&&M(n,"sourceEventAt")&&M(n,"captureStartedAt")&&M(n,"capturedAt")&&(r==="scroll"||r==="resize"||r==="mutation")&&Go(p(n,"snapshots"))}case"bridge-event":{let r=p(n,"event"),i=p(n,"composition");return!ri(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 oi.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")&&Jn.has(p(n,"resizeEdge")))&&ii(n,t)&&(p(n,"hit")===null||jt(p(n,"hit")))&&(Y(n,"section")||p(n,"section")===null||qo(p(n,"section")))&&(Y(n,"sectionGap")||p(n,"sectionGap")===null||Ko(p(n,"sectionGap")))}}function ci(e){if(!I(e))return!1;switch(p(e,"type")){case"request":return ti(e);case"response":return ni(e);case"event":return si(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",mr=`[${Tt}="${rn}"]`,Xe="SITE_EDIT_COMPOSITION_MARKER_INVALID",gr="SITE_EDIT_COMPOSITION_RENDER_MISMATCH",ai=80,ui=120,li=1e3,di="data-vcp-ui-component",yr="data-vcp-theme-preview",Qn="::repeat-item#",ft="components/ui",Yt="data-site-block-id",Xt="data-vcp-runtime-site-block-id",pi=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),fi=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function hi(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 f=`vcp-runtime:${encodeURIComponent(l)}:${d}`;c.setAttribute(Yt,f),c.setAttribute(Xt,"true")}}function bt(e,t=""){let n=Ir(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function mi(e){let t=Array.from(e.querySelectorAll(mr)).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=yi(r);if(!o)throw new Error(`${Xe}: marker route is invalid`);return{routeId:o,effectiveTemplateId:i}}function gi(e){let t=bt(e.pathname,e.basePath??""),n=mi(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 yi(e){return!e.startsWith("/")||e.includes("?")||e.includes("#")?null:bt(e)}function Zn(e,t){return oe(e)===oe(t)}function Lt(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function bi(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 Si(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 Fa(e=window,t={}){let n=Si(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=Ei({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(Ii(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??ji,l=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},d=()=>gi({pathname:e.location.pathname,document:e.document,basePath:t.basePath}),f=()=>oe(d()),S=()=>bt(e.location.pathname,t.basePath||""),N=!!e.parent&&e.parent!==e,C=h=>{Gi(e,{...h,sequence:h.sequence??o.routeSequence})},_=h=>{o.currentDocument=h,o.currentEntriesByKey=new Map((h?.entries??[]).map(v=>[v.key,v])),hi(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}},Q=async(h,v,O)=>{let F=o.activeBridge;if(!F)return null;let q=await F.getDocument(h);return D(v,O)&&_(q.data),q.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&&(N||!!(o.currentDocument&&Xi(o.currentDocument,h)))&&Yi(o.activeClient),L=h=>Math.min(li*2**Math.max(0,h),8e3),ee=(h,v,O,F)=>{if(o.disposed)return;l();let q=L(F);C({state:"reconnecting",composition:h,attempt:F,retryInMs:q,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)){C({state:"reload-required",composition:h,attempt:F,messageKey:"studio.errors.previewBridgeReloadRequired"});return}ee(h,v,o.routeSequence,F+1)}})},q)},U=(h,v,O,F)=>{if(!D(v,O)||o.activeClient===null)return;if(Me(F.message)){g(),l(),C({state:"reload-required",composition:h,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let q=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,q?.disconnect(),ee(h,v,O,0)},j=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(),C({state:"reload-required",composition:v,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Er(h)&&U(v,O,F,{state:"failed",message:Ze(h,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=Ti(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:h=>o.currentEntriesByKey.get(h)??null,setCurrentDocument:_,onBridgeRequestError:h=>{j(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 q=o.routeSequence+1,ce=A(v,O,q,h);o.syncInFlight={compositionKey:O,sequence:q,promise:ce};try{await ce}finally{o.syncInFlight?.promise===ce&&(o.syncInFlight=null)}},A=async(h,v,O,F)=>{o.routeSequence=O,l(),g(),C({state:F>0?"reconnecting":"connecting",composition:h,attempt:F,messageKey:F>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let q=a(n),ce=!1;o.activeClient=q,o.unsubscribeConnectionStatus=q.subscribeConnectionStatus?.(y=>{ce&&(y.state==="closed"||y.state==="failed")&&U(h,v,O,y)});try{if(await q.connect(),!D(v,O)){q.disconnect();return}let y=Kn({composition:Lt(h),client:q,initialDocument:xi(h)});o.activeBridge=y,c()&&(e.__VCP_SITE_EDIT__=y),o.activeClient=q,o.unsubscribeDocument=y.subscribe(K=>{oe(K.composition)===v&&(K.type==="site-edit.document.changed"&&o.currentDocument&&K.version>o.currentDocument.version?Q(Lt(h),v,O).catch(()=>{}):K.type==="site-edit.graph.invalidated"&&V())}),c()&&(s.routeId=h.routeId,s.composition=h,s.compositionKey=v);let E=N?null:await y.initializeSession({composition:Lt(h)}),m=E?.data.document??null;if(E&&(!Zn(E.composition,h)||!Zn(E.data.document.composition,h)))throw new Error(`${gr}: initialize response does not match marker`);if(m&&_(m),!D(v,O)){q.disconnect();return}ce=!0,C({state:"ready",composition:h,attempt:F,messageKey:"studio.status.previewReady"}),bi(e,{documentVersion:m?.version??0,routeId:h.routeId,versions:t.runtime_versions}),m&&Sr(e,{composition:h,editEngineVersion:t.runtime_versions?.engine??"unknown",sequence:O,version:m.version})}catch(y){if(B(),o.activeClient===q&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,q.disconnect(),_(null),!D(v,O))return;throw C({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{C({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(),C({state:"reload-required",composition:v,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}if(Ji(h)||Li(h)){C({state:"failed",composition:v,attempt:0,messageKey:"studio.errors.previewBridgeDisconnected"});return}ee(v,O,o.routeSequence,0)},V=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,u(()=>{o.syncScheduled=!1,!o.disposed&&$().catch(h=>T(h))}))},z=()=>{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:z},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=vi(e,z),o.unbindRouteChange=Hi(e,V,S),o.unbindCompositionMarker=Ui(e,V),t.defer_initial_sync){V();return}await $()}function Ei(e){return{basePath:Ir(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:Ci(e.options.bridge_session_key)}}function Ii(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function Ci(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 vi(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),Ri(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function Ri(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function xi(e){return{siteId:"preview",snapshotId:"preview",composition:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function Ti(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,S=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},Q=(y,E,m)=>{let K=u?.sessionKey!==y||u?.sourceWindow!==E||u?.targetOrigin!==m;u={sessionKey:y,sourceWindow:E,targetOrigin:m},K&&(a=0,f=null,S=null)},g=(y,E)=>{let m=e.parent&&e.parent!==e?e.parent:null;return!m||E!==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]),ee=()=>!d||d.state==="ready",U=y=>JSON.stringify([y.state,oe(y.composition),y.sequence,y.attempt??null,y.retryInMs??null,y.messageKey??null]),j=y=>{if(!ee())return;let E=L(y);f!==E&&(o?.(),o=null,s?.(),s=null,c?.cleanup(),c=null,z({kind:"route-ready",payload:{composition:y.composition,editEngineVersion:y.editEngineVersion,sequence:y.sequence,version:y.version}}),u&&(f=E))},$=y=>{let E=U(y);S!==E&&(y.state!=="ready"&&(f=null,l=null),z({kind:"bridge-status",payload:y}),u&&(S=E))},x=y=>{l=y,j(y)},A=y=>{d=y,$(y)},T=()=>{l&&j(l)},V=()=>{d&&$(d)},z=y=>{u&&u.sourceWindow.postMessage(Ge({type:"event",...y},{sessionKey:u.sessionKey}),u.targetOrigin)},h=(y,E,m,K)=>{let H=t.getCurrentDocument?.()??null,ie=ss(e.document,E.clientX,E.clientY),R=E.resizeSession?null:Qe(e.document,E.clientX,E.clientY,H),Z=R?me(R,m==="full"?ge(e.document,R,H):vt(e.document,R,H),t.getDocumentEntry,m):null,ae=cs(e.document,ie,H),de=us(e.document,E,H);K&&Z&&(y==="pointer-click"||y==="pointer-double-click")&&(K.preventDefault(),K.stopPropagation(),typeof K.stopImmediatePropagation=="function"&&K.stopImmediatePropagation()),z({kind:y,payload:{clientX:E.clientX,clientY:E.clientY,buttons:Number(E.buttons??0),pointerId:E.pointerId,hoverVisualOwned:E.hoverVisualOwned,resizeEdge:E.resizeEdge,resizeSession:E.resizeSession,hit:Z,section:ae,sectionGap:de}})},v=y=>{z({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,E,m)=>{D(),u={sessionKey:y,sourceWindow:E,targetOrigin:m};let K=Ys(e.document),H=_i(e,t.getCurrentDocument),ie=null,R=null,Z=null,ae=null,de=null,pe=()=>{de!==null&&(e.clearTimeout(de),de=null)},xe=()=>{Z!==null&&(It(e,Z),Z=null),ie=null},ot=()=>{Z=null;let b=ie;ie=null,b&&h("pointer-move",b,"summary")},Ke=b=>{pe(),R=b,ie=b,Z===null&&(Z=Et(e,ot))},ne=()=>{R&&Ke({...R,hoverVisualOwned:H?.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:H?.update(b.target)??!1})},re=b=>{let W=Vi(b.target),Pn=W?c?.begin(b,W):null;Pn&&(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:W,resizeSession:Pn??void 0},"full",b)},be=b=>{let W=c?.finish(b,"commit")??null;if(W){h("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:Number(b.pointerId),resizeEdge:W.edge,resizeSession:W},"summary",b);return}h("pointer-up",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"summary",b)},Be=b=>{let W=c?.finish(b,"cancel")??null;h("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:W?.pointerId,resizeEdge:W?.edge,resizeSession:W??void 0},"summary",b)},En=b=>{let W=c?.finish(b,"cancel")??null;W&&h("pointer-cancel",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons),pointerId:W.pointerId,resizeEdge:W.edge,resizeSession:W},"summary",b)},In=b=>{h("pointer-click",{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)},"full",b)},Cn=b=>{h("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 W=b?{clientX:Number(b.clientX),clientY:Number(b.clientY),buttons:Number(b.buttons)}:R;if(b&&W&&W.clientX>0&&W.clientX<e.innerWidth&&W.clientY>0&&W.clientY<e.innerHeight){ne();return}if(xe(),b){pe(),de=e.setTimeout(()=>{de=null,R=null,v(W??void 0)},ui);return}pe(),R=null,H?.clear(),v(W??void 0)},vn=()=>wt(),ao=()=>{ae=null,z({kind:"scroll",payload:{metrics:yt(e)}}),ne()},Rn=()=>{ae===null&&(ae=Et(e,ao))};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",En,!0),e.document.addEventListener("click",In,!0),e.document.addEventListener("dblclick",Cn,!0),e.addEventListener("scroll",Rn,{passive:!0}),e.addEventListener("resize",ne,{passive:!0}),e.addEventListener("blur",vn),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 xn=e.ResizeObserver,Tn=typeof xn=="function"?new xn(ne):null;Tn?.observe(Te);let _n=e.MutationObserver,An=typeof _n=="function"?new _n(ne):null;An?.observe(Te,{attributes:!0,childList:!0,subtree:!0}),i=()=>{xe(),pe(),R=null,H?.cleanup(),Tn?.disconnect(),An?.disconnect(),ae!==null&&(It(e,ae),ae=null),K(),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",En,!0),e.document.removeEventListener("click",In,!0),e.document.removeEventListener("dblclick",Cn,!0),e.removeEventListener("scroll",Rn),e.removeEventListener("resize",ne),e.removeEventListener("blur",vn),e.document.removeEventListener("load",ne,!0),P.removeEventListener("pointerleave",wt,!0),it?.removeEventListener?.("resize",ne),it?.removeEventListener?.("scroll",ne)}},F=y=>{let E=y.detail;E?.composition?.routeId&&x(E)},q=y=>{let E=y.detail;E?.state&&A(E)},ce=y=>{let E=y.data;if(!Gn(E)||E.body.type!=="request"||E.body.kind!=="apply-node-patch"&&E.body.kind!=="get-hit-by-ref"&&E.body.kind!=="get-path-by-ref"&&E.body.kind!=="get-scroll-metrics"&&E.body.kind!=="scroll-to"&&E.body.kind!=="scroll-by"&&E.body.kind!=="set-interaction-mode"&&E.body.kind!=="set-selection-visual"&&E.body.kind!=="clear-selection-visual"&&E.body.kind!=="set-resize-visual"&&E.body.kind!=="clear-resize-visual"&&E.body.kind!=="set-theme-override"&&E.body.kind!=="clear-theme-override"&&E.body.kind!=="get-theme-variables"&&E.body.kind!=="compute-drop-target-at-point"&&E.body.kind!=="observe-node-bounds"&&E.body.kind!=="clear-node-bounds-observer"&&E.body.kind!=="restore-text-edit"&&E.body.kind!=="clear-text-edit-rollback"&&E.body.kind!=="start-text-edit-at-point"&&E.body.kind!=="hit-test-at-point"&&!or(E.body))return;let m=E.body,K=typeof E.sessionKey=="string"?E.sessionKey:null,H=y.source,ie=y.origin;if(!K||!ie||!H||typeof H.postMessage!="function"||!g(K,H))return;if(u){if(u.sourceWindow!==H||u.targetOrigin!==ie)return;u.sessionKey!==K&&(B(),D(),te(),u=null)}Q(K,H,ie),V(),T();let R=Z=>{let ae=typeof m.id=="string"?m.id:"unknown";H.postMessage(Ge({id:ae,...Z},{sessionKey:K}),ie)};try{if(or(m)){Wi({message:m,sendEvent:P=>{H.postMessage(Ge({type:"event",...P},{sessionKey:K}),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?ws(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(Ds(P,m.payload.patch),re&&w&&Os(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&&sr(r.ref,P)&&(r=null),R({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!sr(r.ref,P)){R({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let w=es(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(K,H,ie):u?.sourceWindow===H&&u.targetOrigin===ie&&u.sessionKey===K&&D(),R({type:"response",ok:!0,result:{interactionEnabled:m.payload.enabled}});return}if(m.kind==="set-selection-visual"){s?.(),s=null,i&&(s=Pi(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=qi(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"){Ms(e.document,m.payload),R({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(m.kind==="clear-theme-override"){Fs(e.document),R({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(m.kind==="get-theme-variables"){R({type:"response",ok:!0,result:Vs(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:Ts(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=Es(e,w,P,t.getCurrentDocument,(re,be,Be)=>{a+=1,z({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}}),z({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 Z=Number(m.payload?.x),ae=Number(m.payload?.y);if(!Number.isFinite(Z)||!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,Z,ae,t.getCurrentDocument?.()??null):ns(e.document,Z,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=zs(e,xe,ne,P=>{H.postMessage(Ge({type:"event",...P},{sessionKey:K}),ie)},{...pe?.textNode?{textNode:pe.textNode}:{},onCommitSnapshot:P=>{r=P}}),R({type:"response",ok:!0,result:{ref:ne}})}catch(Z){R({type:"response",ok:!1,error:Z instanceof Error?Z.message:"Failed to start text edit"})}};return e.addEventListener("message",ce),e.addEventListener(Zt,F),e.addEventListener(en,q),()=>{B(),D(),u=null,te(),e.removeEventListener("message",ce),e.removeEventListener(Zt,F),e.removeEventListener(en,q)}}function _i(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=f=>{let
|
|
5
|
+
}`,r.appendChild(s);let c=null,a=()=>{c?.removeAttribute(i),c=null},u=f=>{let S=an(f),N=S?.getAttribute("data-vcp-edit-key")??"",C=S&&Tr(S,t?.()??null,N)?S:null;return C===c||(a(),c=C,c?.setAttribute(i,"true")),!0};return{clear:a,cleanup:()=>{a(),s.remove()},update:u,updateAtPoint:(f,S)=>u(Qe(n,f,S,t?.()??null))}}var Ai=0;function Pi(e,t,n){let r=e.document,i=r.head??r.documentElement,o=++Ai,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(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=`
|
|
9
|
+
}`,i.appendChild(f);let S=r.createElement("div");S.setAttribute("data-vcp-designer-spacing-visual-layer","true"),S.setAttribute("aria-hidden","true"),S.style.setProperty("position","fixed","important"),S.style.setProperty("inset","0","important"),S.style.setProperty("overflow","hidden","important"),S.style.setProperty("pointer-events","none","important"),S.style.setProperty("z-index","2147483645","important"),r.documentElement.appendChild(S),l.setAttribute(d,"true");let N=a?St(l,s):null,C=!1,_=null,B=[],D=[],Q=()=>{_=null,D.forEach(T=>T()),D=ki(S,B,l,a?s:null,c)},g=()=>{C||_!==null||(_=Et(e,Q))};Q();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),j(),g())},L=e.ResizeObserver,ee=typeof L=="function"?new L(g):null,U=[];function j(){U.forEach(T=>ee?.unobserve(T)),U=l?.isConnected?[l,...Array.from(l.children)].filter(T=>typeof T.getBoundingClientRect=="function"):[],U.forEach(T=>ee?.observe(T))}j();let $=e.MutationObserver,x=typeof $=="function"?new $(T=>{let V=l;te();let z=V!==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!==S);!z&&!h||(j(),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(),ee?.disconnect(),l?.removeAttribute(d),D.forEach(T=>T()),D=[],N?.(),N=null,l=null,S.remove(),f.remove())}}function ki(e,t,n,r,i){if(n?.isConnected===!0&&r)return Ni(e,t,n,r,i);let o=n?.isConnected===!0?Di(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 Ni(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=er(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=wi(n,o),a=c.map((u,l)=>{let d=er(e,t,s.length+l),f=`${i}-${l}`,S=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"),S});return t.slice(s.length+c.length).forEach(u=>{u.style.setProperty("display","none","important")}),a}function er(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 Di(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(...Bi(e,n)),u.filter(l=>l.width>.5&&l.height>.5)}function Bi(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[...nr(r,"horizontal",t.columnGap),...nr(r,"vertical",t.rowGap)]}function wi(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[...tr(i,"horizontal",t.columnGap),...tr(i,"vertical",t.rowGap)].filter(o=>o.width>.5&&o.height>.5)}function tr(e,t,n){if(n<=0||e.length<2)return[];let r=br(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 nr(e,t,n){if(n<=0||e.length<2)return[];let r=br(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 br(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=>Oi(c.rect,i.rect,t)>.5));o?o.push(i):r.push([i])}),r}function Oi(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),rr(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){rr(e,i);return}i.originalValue?e.style.setProperty("anchor-name",i.originalValue,i.originalPriority):e.style.removeProperty("anchor-name"),ht.delete(e)}}}function rr(e,t){let n=t.originalValue.trim()||t.computedValue;e.style.setProperty("anchor-name",[...n?[n]:[],...t.names].join(", "),"important")}var Mi=["e","se","s"],Fi=0;function Vi(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 qi(e,t,n){let r=++Fi,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",S=s.createElement("style");S.setAttribute("data-vcp-designer-resize-visual-style","true"),S.textContent=`
|
|
10
10
|
[${f}] {
|
|
11
11
|
position: fixed !important;
|
|
12
12
|
position-anchor: ${i};
|
|
@@ -28,9 +28,9 @@ function Bn(e){let t=new Map,n=[],r=new Map,i=[],o=e.pageComposition.status==="s
|
|
|
28
28
|
[${f}="e"] { left: anchor(right); top: anchor(center); }
|
|
29
29
|
[${f}="se"] { left: anchor(right); top: anchor(bottom); }
|
|
30
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
|
|
31
|
+
`,c.appendChild(S);let N=Mi.map(x=>{let A=s.createElement("div");return A.setAttribute(f,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 Q=!1,g=null,te=()=>{if(!g||!l)return;let x=(A,T,V)=>{T?l.style.setProperty(A,T,V):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,ee=x=>{if(!g||!l?.isConnected||x.pointerId!==g.pointerId)return!1;let A=Number(x.clientX)-g.startX,T=Number(x.clientY)-g.startY,V=Math.max(1,Math.round(g.startWidth+A)),z=Math.max(1,Math.round(g.startHeight+T));return(g.edge==="e"||g.edge==="se")&&l.style.setProperty("width",`${V}px`,"important"),(g.edge==="s"||g.edge==="se")&&l.style.setProperty("height",`${z}px`,"important"),!0},U=()=>{if(Q)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(V=>V.style.setProperty("display","none","important"))},j=e.MutationObserver,$=typeof j=="function"?new j(U):null;return $?.observe(s.documentElement,{attributeFilter:["data-vcp-edit-key"],attributes:!0,childList:!0,subtree:!0}),{begin(x,A){if(Q||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:ee,finish(x,A){if(!g||x.pointerId!==g.pointerId)return null;A==="commit"&&ee(x);let T=Math.max(1,Math.round(g.startWidth+Number(x.clientX)-g.startX)),V=Math.max(1,Math.round(g.startHeight+Number(x.clientY)-g.startY)),z=L(A,A==="commit"?T:g.startWidth,A==="commit"?V:g.startHeight),h=g.captureTarget,v=g.pointerId;return A==="cancel"&&te(),g=null,h?.releasePointerCapture?.(v),z},cleanup(){if(Q)return;Q=!0,$?.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()),S.remove()}}}function or(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 Ki(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 Wi({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),Sr(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:zi(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&&Ki(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:Qi(l)})}}function zi(e,t,n,r){if(!e.ok)return e;let i=ye(n,{key:t},r),o=i?$i(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function $i(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 Hi(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 Ui(e,t){let n=e.MutationObserver;if(typeof n!="function")return()=>{};let r=ir(e.document),i=new n(()=>{let o=ir(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 ir(e){let t=Array.from(e.querySelectorAll(mr)).filter(n=>n.getAttribute(Tt)===rn);return JSON.stringify(t.map(n=>[n.getAttribute(on),n.getAttribute(sn)]))}function ji(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 Sr(e,t){e.dispatchEvent(new CustomEvent(Zt,{detail:t}))}function Gi(e,t){e.dispatchEvent(new CustomEvent(en,{detail:t}))}function Yi(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function Xi(e,t){return oe(e.composition)===t}function Li(e){return Ze(e,"").includes(Xe)}function Ji(e){return Ze(e,"").includes(gr)}function Ze(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function Er(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 Qi(e){let t=Ze(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":Er(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 Ir(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function cn(e){return pi.has(vr(e))}function Zi(e){return fi.has(vr(e))}function Cr(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:Zi(e.tagName),canInsertChild:cn(e.tagName),canMove:!1,canRemove:!1}}function vr(e){return e?.trim().toLowerCase()??""}function sr(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 es(e,t,n){let r=ye(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=ts(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 ts(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 ns(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(!Cr({operationSummary:u?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let d=rs(e,t,n,s);if(d){let f=is(s,d);if(f!==null)return{element:s,textNode:d,textSegmentIndex:f}}return At(s)?null:{element:s}}function rs(e,t,n,r){let i=os(e,t,n);return!i||i.parentElement!==r?null:i}function os(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 is(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 ss(e,t,n){return(typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean))[0]??null}function cs(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 as(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 us(e,t,n){let r=as(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)<=jn)??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&&Tr(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;!ls(r)&&!n&&(n=t)}t=t.parentElement}return n}function un(e){return e.getAttribute(di)!==null}function ls(e){return ds(e.split("::")[0]??"")}function ds(e){if(!e)return!1;let t=ps(e);return t===ft||t.startsWith(`${ft}/`)||t.includes(`/${ft}/`)||t.endsWith(`/${ft}`)}function ps(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=xr(Ar(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${wr(r)}"]`))),n,r);if(i.length<=1)return{key:cr(n,r,0)};let o=i.indexOf(t);return o>=0?{key:cr(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=xr(Ar(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${wr(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=fs(n,t.key);return c!==null&&c>=0&&c<i.length?i[c]??null:o!==null?i[o]??null:i[0]??null}function cr(e,t,n){return Rr(e,t)[n]?.key??t}function fs(e,t){let n=Rt(t);if(!n)return null;let i=Rr(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function Rr(e,t){return(e?.entries??[]).filter(n=>(Rt(n.key)??n.key)===t)}function xr(e,t,n){let r=_r(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function Tr(e,t,n){let r=_r(t,n);return!r||e.tagName.toLowerCase()===r}function _r(e,t){return null}var hs=2,ms=4;function Ar(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&ms)!==0?-1:(r&hs)!==0?1:0})}function Rt(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(Qn);if(n<0)break;let r=Number(t.slice(n+Qn.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 gs(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 ar=new WeakMap,ur=0;function Le(e){let t=ar.get(e);if(t)return t;ur+=1;let n=`runtime-node-${ur}`;return ar.set(e,n),n}function Pr(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:bs(e,a)},scrollContext:{scrollX:s,scrollY:c,viewportWidth:X(r?.innerWidth),viewportHeight:X(r?.innerHeight),scrollContainers:ys(e)}}}function ys(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||lr(s)&&X(i.scrollWidth)>X(i.clientWidth),d=u!==0||lr(c)&&X(i.scrollHeight)>X(i.clientHeight);(l||d)&&r.push({runtimeNodeId:Le(i),scrollLeft:a,scrollTop:u})}i=i.parentElement}return r}function lr(e){return["auto","scroll","overlay","hidden"].includes(e)}function bs(e,t){if(t==="fixed"){let r=dr(e.parentElement,!0);return r?{kind:"element",runtimeNodeId:Le(r)}:{kind:"viewport"}}if(t==="absolute"){let r=e.offsetParent,i=Ss(r)??dr(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 dr(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 Ss(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=Cr({operationSummary:s?.operationSummary,tagName:c,fallbackMode:"preview"}),d=un(e),f=!0,S=kr(e)?.getAttribute("data-vcp-edit-key")??null,N=dn(e),C=Pr(e,o,i);return{ref:t,key:t.key,detailLevel:r,tagName:c,...s?{sourceKind:"jsx"}:{},...S?{parentKey:S}:{},...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&&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 pr(e,t,n,r){let i=e.getBoundingClientRect(),o=Pr(e,i,n);if(r==="light")return{ref:t,layoutSnapshot:o};if(r==="child-rects")return{ref:t,layoutSnapshot:o,childRects:gs(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 fr(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 Es(e,t,n,r,i){let o=t,s=pr(o,n,e,"detailed"),c=fr(s),a=null,u=null,l="mutation",d=Fe(e),f=d,S=!1,N=!1,C=({reason:$,sourceEventAt:x,forceEmit:A=!1,includeDetailedGeometry:T=!1})=>{(a===null||($==="scroll"?0:1)>=(l==="scroll"?0:1))&&(l=$,d=x),S=S||A,N=N||T,a===null&&(a=Et(e,_))},_=()=>{let $=Fe(e);a=null;let x=l,A=d,T=S,V=N;S=!1,N=!1;let z=ye(e.document,n,r?.()??null);if(!z)return;z!==o&&(L?.unobserve(o),o=z,L?.observe(o),V=!0);let h=V?"detailed":c?"child-rects":"light",v=pr(o,n,e,h),O=v.layoutSnapshot.rect.viewport;O.width<=0||O.height<=0||!T&&!Is(s,v)||(s=v,h==="detailed"&&(c=fr(v)),i(x,v,{sourceEventAt:A,captureStartedAt:$,capturedAt:Fe(e)}))},B=()=>{u!==null&&(e.clearTimeout(u),u=null)},D=()=>{B(),C({reason:"resize",sourceEventAt:Fe(e),includeDetailedGeometry:!0})},Q=()=>{B(),C({reason:"mutation",sourceEventAt:Fe(e),includeDetailedGeometry:!0})},g=()=>{f=Fe(e),C({reason:"scroll",sourceEventAt:f}),B(),u=e.setTimeout(()=>{u=null,C({reason:"scroll",sourceEventAt:f,forceEmit:!0,includeDetailedGeometry:!0})},ai)},te=e.ResizeObserver,L=typeof te=="function"?new te(D):null;L?.observe(o);let ee=e.MutationObserver,U=typeof ee=="function"?new ee(Q):null;U?.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 j=e.visualViewport;return j?.addEventListener?.("resize",D,{passive:!0}),j?.addEventListener?.("scroll",g,{passive:!0}),e.document.addEventListener("scroll",g,{capture:!0,passive:!0}),e.document.addEventListener("load",Q,!0),()=>{a!==null&&(It(e,a),a=null),B(),L?.disconnect(),U?.disconnect(),e.removeEventListener("resize",D),e.removeEventListener("scroll",g),j?.removeEventListener?.("resize",D),j?.removeEventListener?.("scroll",g),e.document.removeEventListener("scroll",g,!0),e.document.removeEventListener("load",Q,!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 Is(e,t){return Cs(e.layoutSnapshot,t.layoutSnapshot)||t.childBoxes!==void 0&&Rs(e.childBoxes,t.childBoxes)||t.childRects!==void 0&&xs(e.childRects,t.childRects)||t.layout!==void 0&&tn(e.layout,t.layout)||t.spacing!==void 0&&tn(e.spacing,t.spacing)}function Cs(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||vs(e.scrollContext.scrollContainers,t.scrollContext.scrollContainers)}function vs(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 Rs(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 xs(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 Ts(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=ks(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,f=a,S=a.parentElement;for(;S;){if(S.getAttribute("data-vcp-edit-key")){if(u&&nn(S,u))return mt(c,a,"self-or-descendant",o,s);let C=hr(S,r,s);if(C==="accept"){l={child:f,targetParent:S};break}C==="blocked"&&(d=!0),f=S}S=S.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,_s(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"?As(n.getBoundingClientRect(),a,r):Ps(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 _s(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 As(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 Ps(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 ks(e,t,n,r,i){let o=Ns(e,t,n,r,i);if(o)return o;let s=kr(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 Ns(e,t,n,r,i){return null}function kr(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 Ds(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 Bs=500,Ye=new Map;function ws(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function Os(e,t){if(Ye.size>=Bs){let n=Ye.keys().next().value;n&&Ye.delete(n)}Ye.set(e,t)}var Je=new Set;function Ms(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);Ws(e,t.stylesheets??[])}function Fs(e){let t=e.documentElement?.style;for(let n of Je)t?.removeProperty(n);Je.clear();for(let n of Br(e))n.remove()}function Vs(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=Nr(i,s);c&&(o[s]=c)}return o}function Nr(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return Dr(e,r,n)}function Dr(e,t,n){if(!t)return null;let r=qs(t);if(!r)return t;let i=Nr(e,r.name,n);return i||(r.fallback?Dr(e,r.fallback,n)??r.fallback:null)}function qs(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=Ks(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 Ks(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 Ws(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of Br(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(yr,"true"),s.setAttribute("href",o),i.appendChild(s)}}function Br(e){return Array.from(e.querySelectorAll(`link[${yr}]`))}function zs(e,t,n,r,i={}){let o=i.textNode?$s(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=Hs(s),l=!1,d=()=>{e.document.removeEventListener("pointerdown",S,!0),s.removeEventListener("keydown",N),s.removeEventListener("blur",C),s.removeEventListener("input",_),js(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 S(B){let D=B.target;D&&s.contains(D)||f("commit")}function N(B){if(B.key==="Escape"){B.preventDefault(),f("cancel");return}B.key==="Enter"&&(B.metaKey||B.ctrlKey)&&(B.preventDefault(),f("commit"))}function C(){f("commit")}function _(){r({kind:"text-edit-input",payload:{ref:n,hit:me(t,n,void 0,"full")}})}return Us(s),e.document.addEventListener("pointerdown",S,!0),s.addEventListener("keydown",N),s.addEventListener("blur",C),s.addEventListener("input",_),Xs(s),Ls(s,e.document),d}function $s(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 Hs(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 Us(e){Gs(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 js(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 Gs(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 Ys(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 Xs(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function Ls(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function wr(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function X(e){let t=Number(e);return Number.isFinite(t)?t:0}import Js from"node:http";import pn from"node:fs";import{createHash as Kr,randomBytes as Qs,timingSafeEqual as Zs}from"node:crypto";import Re from"node:path";import{WebSocket as Wr,WebSocketServer as ec}from"ws";import{createPreviewSiteEditEngineRuntime as tc,openFileHistoryStore as nc,resolveManagedPageTemplateComposition as rc,scanSiteEditCompositionsFromFiles as oc}from"@vcp-dev/site-edit-engine";import{resolveNextAppRouteId as ic,scanNextAppRouterRoutesFromFiles as sc}from"@vcp-dev/site-edit-engine/next-app-router";import{SiteEditSourceWatcher as cc}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 ac,computeSiteEditCompositionKey as De}from"@vcp-dev/contracts";var uc="127.0.0.1",lc=30218,dc="/__vcp/site-edit/bridge",zr=6*1024*1024,pc=zr*2,fc=3e3,Or=50,Mr="__VCP_SITE_EDIT_BRIDGE_SERVERS__";function Ja(e){let t=Hr(e),n=jr(t),r=Ur(),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 $r(e,t,n={}){let r=new kt(Hr(t),e,!1,n);return r.start({listen:!1}),r}var kt=class{constructor(t,n=Js.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=bc({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 cc({projectRoot:this.options.projectRoot,watch_dirs:hc(this.options.runtime.watch_dirs),interval_ms:this.options.runtime.watch_interval_ms,debounce_ms:this.options.runtime.watch_debounce_ms??Or,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=Ur(),n=jr(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??tc)({...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=gc(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 fn(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 fn(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 fn(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??nc)(yc({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??Or;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=mc(this.options.projectRoot),r=sc(n),i=r.length>0?r:(this.options.runtime.routes??[]).map(a=>({...a})),o=oc({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=ic(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=rc({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 Hr(e){return{tenantId:e.tenantId,siteId:e.siteId,snapshotId:e.snapshotId,projectRoot:Re.resolve(e.projectRoot??process.cwd()),basePath:e.basePath??"",host:e.host??uc,port:e.port??lc,path:e.path??dc,sessionKey:e.sessionKey??xc(),historyRoot:e.historyRoot,allowedOrigins:e.allowedOrigins??[],runtime:e.runtime??{}}}function hc(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 mc(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 gc(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 yc(e){return Re.join(Re.resolve(e.root),Fr(e.siteId),Fr(e.snapshotId),Kr("sha256").update(e.editingSessionId).digest("hex").slice(0,32))}function Fr(e){return/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)&&e!=="."&&e!==".."?e:Kr("sha256").update(e).digest("hex").slice(0,32)}function Ur(){let e=globalThis;return e[Mr]??=new Map,e[Mr]}function jr(e){return`${e.projectRoot}:${e.host}:${e.port}:${e.path}:${e.historyRoot??""}`}function fn(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 bc(e){let t=new ec({maxPayload:zr,noServer:!0}),n=new WeakSet,r=o=>{new st({socket:new mn(o),engine:e.engine,validateOperationRequest:s=>ac.safeParse(s).success})},i=(o,s,c)=>{if(!Sc(o,e))return;let a=Ec(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}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(`
|
|
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}Ic(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===Wr.OPEN){if(this.socket.bufferedAmount+Buffer.byteLength(t,"utf8")>pc){this.socket.close(1013,"bridge backpressure");return}this.socket.send(t)}}close(t,n){this.socket.close(t,n)}};function Sc(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function Ec(e,t){if(new URL(e.url??"/","http://localhost").searchParams.has("vcp_bridge_key"))return null;let r=hn(e.headers["x-vcp-site-edit-key"]),i=Gr(r,t.sessionKey),o=hn(e.headers.host),s=hn(e.headers.origin);return o&&!Cc(o,t.host,s)?null:s?Rc(s,o,t.allowedOrigins)?{authenticatedByHeader:i}:null:i?{authenticatedByHeader:!0}:null}function Ic(e,t,n){let r=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},fc),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"||!Gr(a.payload.key,t)){s();return}o(),e.readyState===Wr.OPEN&&e.send(se.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{s()}},e.on("message",i),e.on("close",o)}function Gr(e,t){if(!e)return!1;let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&Zs(n,r)}function Cc(e,t,n){let r=qr(e),i=qr(t);return r===i||Vr(i)&&Vr(r)&&(!n||gn(n,e))||vc(i)&&(!n||gn(n,e))}function vc(e){return e==="0.0.0.0"||e==="::"}function Vr(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Rc(e,t,n){return n.includes(e)||(t?gn(e,t):!1)}function gn(e,t){try{return new URL(e).host===Yr(t)}catch{return!1}}function qr(e){let t=Yr(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function Yr(e){return e.trim().toLowerCase()}function hn(e){return Array.isArray(e)?e[0]:e}function xc(){return Qs(32).toString("base64url")}import bn from"node:http";import{existsSync as qe,readFileSync as Ve}from"node:fs";import{randomUUID as Tc}from"node:crypto";import{createRequire as eo}from"node:module";import{Socket as Xr}from"node:net";import tt from"node:path";import{basename as to,dirname as nt,join as rt}from"node:path";import{fileURLToPath as no}from"node:url";var _c="next",ro="127.0.0.1",Ac=3e3,Dt="/__vcp/site-edit/bridge",oo="/__vcp/site-edit/health",Pc="probe",kc="render",Lr="/_error",Bt="/__vcp/site-edit/client/",Nc=`${Bt}auto-bootstrap.js`,io='data-vcp-site-edit-bootstrap="true"',Dc=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],Bc="@vcp-dev/site-edit-engine/webpack-loader",wc=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,Oc=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],Mc=new Set(["auto-bootstrap.js","client.js","composition-key.js","designer-trace.js","document-codec.js","protocol.js","window-message.js"]);async function au(e={},t={}){let n=t.process??process,r=t.createServer??bn.createServer,i=t.attachBridgeServer??$r,o=t.loadNext??fa,s=tt.resolve(e.projectRoot??process.cwd()),c=e.host??ro,a=e.port??ya(n.env.PORT)??Ac,u=e.bridgePath??Dt,l=$c(u),d=aa(),f=e.basePath??n.env.VCP_SITE_PREVIEW_BASE_PATH??"/",S=(e.tenantId??n.env.VCP_TENANT_ID)?.trim()||void 0,N=await o(s),C=Fc(s),_=N({dev:!0,dir:s,hostname:c,port:a,...Vc(C)}),B=_.getRequestHandler(),D=e.siteId??n.env.VCP_SITE_ID??"018f6f4d-a9b8-7120-8000-000000000120",Q=e.snapshotId??n.env.VCP_SNAPSHOT_ID??ga(s),g=e.historyRoot??n.env.VCP_SITE_EDIT_HISTORY_ROOT,te=g?.trim()?tt.resolve(g):void 0,L=null,ee={launchId:Tc(),pid:process.pid,snapshotId:Q},U=r((T,V)=>{Lc({basePath:f,bridgePath:u,bridgeHealthPath:l,bridgeSessionKey:d,getBridgeHealth:()=>L?.getHealth()??ta(u),launch:ee,runRenderProbe:()=>Qc(_),handle:B,request:T,response:V}).catch(z=>{console.error(z),V.headersSent||(V.statusCode=500),V.end("site edit preview request failed")})}),j=null,$=null,x=()=>$||(Nt(()=>n.off("SIGINT",A)),Nt(()=>n.off("SIGTERM",A)),Nt(()=>j?.()),j=null,Nt(()=>L?.stop()),L=null,$=Promise.allSettled([Sa(U),Ea(()=>_.close())]).then(()=>{}),$),A=()=>{x()};try{return await _.prepare(),L=i(U,{...S?{tenantId:S}:{},siteId:D,snapshotId:Q,projectRoot:s,basePath:f,host:c,port:a,path:u,sessionKey:d,...te?{historyRoot:te}:{}}),j=Wc({server:U,bridgePath:u,handleUpgrade:_.getUpgradeHandler()}),n.on("SIGINT",A),n.on("SIGTERM",A),await ba(U,a,c),{bundler:C,close:x,host:c,port:Ia(U,a),server:U}}catch(T){throw await x(),T}}function Fc(e){let t=qc(e);return t&&Kc(t)?"webpack":"turbopack"}function Vc(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function qc(e){for(let t of Dc){let n=rt(e,t);if(qe(n))return Ve(n,"utf8")}return null}function Kc(e){return e.includes(Bc)?!0:wc.test(e)&&Oc.some(t=>t.test(e))}function Wc(e){let t=(n,r,i)=>{zc(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 zc(e,t){return new URL(e??"/","http://localhost").pathname===t}function $c(e=Dt){if(e===Dt)return oo;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function Hc(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??Uc()});return`<script type="module" ${io}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(Nc)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function Uc(){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=eo(import.meta.url);try{let n=t.resolve(e),r=jc(n,e);if(!r)return;let i=JSON.parse(Ve(r,"utf8"));return typeof i.version=="string"?i.version:void 0}catch{return}}function jc(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 Gc(e,t){if(e.includes(io))return e;let n=Hc(t),r=/<\/body\s*>/i.exec(e);return r?`${e.slice(0,r.index)}${n}${e.slice(r.index)}`:`${e}${n}`}function uu(e,t=nt(no(import.meta.url)),n=qe){return so(e,t,n)?.path??null}function so(e,t=nt(no(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(!Mc.has(i))return null;let o=Sn(ha(t),i);if(to(t)!=="src")return{path:o,requiresTranspile:!1};let s=Sn(t,i.replace(/\.js$/,".ts"));return n(s)?{path:s,requiresTranspile:!0}:{path:o,requiresTranspile:!1}}async function Yc(e,t){let n=so(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 Xc(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 Xc(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function Lc({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:r,getBridgeHealth:i,launch:o,runRenderProbe:s,handle:c,request:a,response:u}){if(await ea(a,u,n,i,o,s)||await Yc(a,u))return;let l=na(a),d=ra(a),f=l||d?sa(u,{basePath:e,bridgePath:t,bridgeSessionKey:r,patchNextDevChunk:d}):()=>{};try{await c(a,u)}catch(S){throw f(),S}}function Jc(e){let t=e instanceof Error?e.message:String(e),n=e&&typeof e=="object"&&"code"in e?e.code:void 0;return/\.next[/\\]/.test(t)||/chunks[/\\]ssr[/\\]/.test(t)?n==="ENOENT"||n==="MODULE_NOT_FOUND"?{verdict:"artifact_broken",detail:t}:t.includes("Cannot find module")?{verdict:"artifact_broken",detail:t}:{verdict:"inconclusive",detail:t}:{verdict:"inconclusive",detail:t}}async function Qc(e){let t=new bn.IncomingMessage(new Xr);t.method="GET",t.url=Lr,t.headers={host:ro};let n=new bn.ServerResponse(t);n.assignSocket(new Xr);try{return await e.renderToHTML(t,n,Lr,{}),{verdict:"ok"}}catch(r){return Jc(r)}finally{try{let r=n.socket;r&&(n.detachSocket(r),r.destroy())}catch{}}}function Zc(e){return new URL(e??"/","http://localhost").searchParams.get(Pc)===kc}async function ea(e,t,n,r,i,o){if(e.method!=="GET"||new URL(e.url??"/","http://localhost").pathname!==n)return!1;let c=r(),a=Zc(e.url)?await o():void 0,u={...c,launch:i,...a?{render:a}:{}};return t.writeHead(c.ok?200:503,{"cache-control":"no-store","content-type":"application/json; charset=utf-8"}),t.end(JSON.stringify(u)),!0}function ta(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function na(e){return oa(e)?(e.headers["accept-encoding"]="identity",!0):!1}function ra(e){return ia(e)?(e.headers["accept-encoding"]="identity",!0):!1}function oa(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===oo)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function ia(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 sa(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(Jr(c,Qr(a))),Zr(a),Zr(u),!0),r.end=(c,a,u)=>{let l=typeof c=="function"?void 0:c;l!==void 0&&n.push(Jr(l,Qr(a))),r.write=o,r.end=s,r.flushHeaders=i;let d=Buffer.concat(n),f=ca(e,d,t);f!==d&&!e.headersSent&&e.removeHeader("content-length");let S=typeof c=="function"?c:typeof a=="function"?a:typeof u=="function"?u:void 0;return S?s(f,S):s(f)},()=>{r.write=o,r.end=s,r.flushHeaders=i}}function ca(e,t,n){if(ua(e,t))return Buffer.from(Gc(t.toString("utf8"),n));if(n.patchNextDevChunk&&la(e)){let r=t.toString("utf8"),i=da(r);if(i!==r)return Buffer.from(i)}return t}function aa(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function ua(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 la(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 da(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])=>
|
|
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])=>pa(n,r,i),e)}function pa(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 Jr(e,t){return Buffer.isBuffer(e)?e:e instanceof Uint8Array?Buffer.from(e):Buffer.from(String(e),t)}function Qr(e){return typeof e=="string"?e:void 0}function Zr(e){typeof e=="function"&&e()}async function fa(e){let n=eo(rt(e,"package.json"))(_c);return n.default??n}function ha(e){return to(e)!=="src"?e:Sn(ma(e),"dist")}function ma(e){return co(e)?tt.posix.dirname(e):nt(e)}function Sn(e,t){return co(e)?tt.posix.join(e,t):rt(e,t)}function co(e){return e.includes("/")&&!e.includes("\\")}function ga(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 ya(e){if(!e)return null;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:null}function ba(e,t,n){return new Promise((r,i)=>{e.once("error",i),e.listen(t,n,()=>{e.off("error",i),r()})})}function Sa(e){return new Promise(t=>{e.close(()=>t())})}function Nt(e){try{e()}catch{}}function Ea(e){try{return e()}catch(t){return Promise.reject(t)}}function Ia(e,t){let n=e.address();return typeof n=="object"&&n?n.port:t}export{pc as SITE_EDIT_BRIDGE_MAX_BUFFERED_BYTES,zr as SITE_EDIT_BRIDGE_MAX_PAYLOAD_BYTES,Xe as SITE_EDIT_COMPOSITION_MARKER_INVALID,Ra as SITE_EDIT_COMPOSITION_REINITIALIZE_REQUIRED,gr as SITE_EDIT_COMPOSITION_RENDER_MISMATCH,Bn as SITE_EDIT_COMPOSITION_SESSION_MISMATCH,zt as SITE_EDIT_COMPOSITION_SESSION_REQUIRED,Un as SITE_EDIT_FRAME_RUNTIME_CHANNEL,Gt as SITE_EDIT_FRAME_RUNTIME_LAYOUT_SNAPSHOT_VERSION,Ue as SITE_EDIT_FRAME_RUNTIME_RESIZE_VISUAL_VERSION,He as SITE_EDIT_FRAME_RUNTIME_SELECTION_VISUAL_VERSION,jn as SITE_EDIT_FRAME_SECTION_GAP_RADIUS_PX,Hn as SITE_EDIT_WINDOW_MESSAGE_NAMESPACE,kt as SiteEditBridgeServer,st as SiteEditBridgeSocketServer,se as SiteEditBridgeTransport,ct as SiteEditWebSocketClient,Tt as VCP_PAGE_TEMPLATE_CONTEXT_MARKER_ATTRIBUTE,mr as VCP_PAGE_TEMPLATE_CONTEXT_MARKER_SELECTOR,rn as VCP_PAGE_TEMPLATE_CONTEXT_MARKER_VALUE,sn as VCP_PAGE_TEMPLATE_EFFECTIVE_TEMPLATE_ID_ATTRIBUTE,on as VCP_PAGE_TEMPLATE_ROUTE_ID_ATTRIBUTE,en as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,Zt as VCP_SITE_EDIT_ROUTE_READY_EVENT,zn as VCP_WINDOW_MESSAGE_SOURCE,$n as VCP_WINDOW_MESSAGE_VERSION,Wc as attachNextDevUpgradeHandler,$r as attachSiteEditBridgeServer,bc as attachSiteEditWebSocketServer,Jc as classifySiteEditRenderProbeError,Hc as createSiteEditAutoBootstrapHtmlSnippet,Kn as createSiteEditBridge,Ge as createSiteEditFrameRuntimeMessage,Oo as createVcpWindowMessageEnvelope,Dn as decodeRenderDocument,Nn as encodeRenderDocument,Ja as ensureSiteEditBridgeServerStarted,Gc as injectSiteEditAutoBootstrap,po as isCompactRenderDocument,xo as isDesignerTraceEnabled,Yn as isSiteEditFrameRuntimeLayoutSnapshot,Gn as isSiteEditFrameRuntimeMessage,Zc as isSiteEditRenderProbeRequested,Mo as isVcpWindowMessageEnvelope,da as patchNextFirefoxDevChunk,ra as prepareFirefoxNextDevChunkPatchRequest,na as prepareSiteEditHtmlInjectionRequest,mi as readVcpPageTemplateContextMarker,gi as resolveBrowserCompositionContext,$c as resolveSiteEditBridgeHealthPath,so as resolveSiteEditClientAsset,uu as resolveSiteEditClientAssetPath,Fc as resolveSiteEditNextDevBundler,bt as resolveSiteEditRouteId,Si as resolveSiteEditWebSocketUrl,Qc as runSiteEditRenderProbe,To as sanitizeTracePayload,Fa as startSiteEditAutoBootstrap,Ti as startSiteEditFrameRuntime,au as startSiteEditNextDevServer,hi as syncRuntimeSiteBlockIds,Ce as traceDesignerEvent,Xc as transpileSiteEditClientSource};
|
|
@@ -16,6 +16,7 @@ export type SiteEditNextDevServerOptions = {
|
|
|
16
16
|
export type SiteEditNextDevBundler = "turbopack" | "webpack";
|
|
17
17
|
type NextDevApp = {
|
|
18
18
|
close(): Promise<void>;
|
|
19
|
+
renderToHTML(request: IncomingMessage, response: ServerResponse, pathname: string, query: Record<string, string>): Promise<string | null>;
|
|
19
20
|
getRequestHandler(): (request: IncomingMessage, response: ServerResponse) => Promise<void>;
|
|
20
21
|
getUpgradeHandler(): (request: IncomingMessage, socket: Duplex, head: Buffer) => Promise<void>;
|
|
21
22
|
prepare(): Promise<void>;
|
|
@@ -67,6 +68,23 @@ export declare function injectSiteEditAutoBootstrap(html: string, input: {
|
|
|
67
68
|
export declare function resolveSiteEditClientAssetPath(requestUrl: string | undefined, moduleDir?: string, fileExists?: (path: string) => boolean): string | null;
|
|
68
69
|
export declare function resolveSiteEditClientAsset(requestUrl: string | undefined, moduleDir?: string, fileExists?: (path: string) => boolean): SiteEditClientAsset | null;
|
|
69
70
|
export declare function transpileSiteEditClientSource(source: string): Promise<string>;
|
|
71
|
+
export type SiteEditRenderProbeVerdict = "ok" | "artifact_broken" | "inconclusive";
|
|
72
|
+
export type SiteEditRenderProbeResult = {
|
|
73
|
+
verdict: SiteEditRenderProbeVerdict;
|
|
74
|
+
detail?: string;
|
|
75
|
+
};
|
|
76
|
+
export type SiteEditLaunchIdentity = {
|
|
77
|
+
launchId: string;
|
|
78
|
+
pid: number;
|
|
79
|
+
snapshotId: string;
|
|
80
|
+
};
|
|
81
|
+
export type SiteEditBridgeHealthPayload = SiteEditBridgeHealth & {
|
|
82
|
+
launch: SiteEditLaunchIdentity;
|
|
83
|
+
render?: SiteEditRenderProbeResult;
|
|
84
|
+
};
|
|
85
|
+
export declare function classifySiteEditRenderProbeError(error: unknown): SiteEditRenderProbeResult;
|
|
86
|
+
export declare function runSiteEditRenderProbe(app: Pick<NextDevApp, "renderToHTML">): Promise<SiteEditRenderProbeResult>;
|
|
87
|
+
export declare function isSiteEditRenderProbeRequested(url: string | undefined): boolean;
|
|
70
88
|
export declare function prepareSiteEditHtmlInjectionRequest(request: Pick<IncomingMessage, "headers" | "method" | "url">): boolean;
|
|
71
89
|
export declare function prepareFirefoxNextDevChunkPatchRequest(request: Pick<IncomingMessage, "headers" | "method" | "url">): boolean;
|
|
72
90
|
export declare function patchNextFirefoxDevChunk(source: string): string;
|
package/dist/next-dev-server.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
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
|
|
1
|
+
import oe from"node:http";import{existsSync as E,readFileSync as R}from"node:fs";import{randomUUID as Tt}from"node:crypto";import{createRequire as Pe}from"node:module";import{Socket as Ee}from"node:net";import _ from"node:path";import{basename as Oe,dirname as T,join as P}from"node:path";import{fileURLToPath as Be}from"node:url";import Ye from"node:http";import Y from"node:fs";import{createHash as Ie,randomBytes as Ze,timingSafeEqual as Xe}from"node:crypto";import I from"node:path";import{WebSocket as we,WebSocketServer as et}from"ws";import{createPreviewSiteEditEngineRuntime as tt,openFileHistoryStore as nt,resolveManagedPageTemplateComposition as it,scanSiteEditCompositionsFromFiles as ot}from"@vcp-dev/site-edit-engine";import{resolveNextAppRouteId as st,scanNextAppRouterRoutesFromFiles as rt}from"@vcp-dev/site-edit-engine/next-app-router";import{SiteEditSourceWatcher as at}from"@vcp-dev/site-edit-engine/source-watcher";function de(e){let t=new Map,n=[],i=new Map,s=[],o=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=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 f=n.length;return n.push(d),t.set(d,f),f},l=d=>{let h=null;for(let f of qe(d)){let O=`${h??"root"}\0${f}`,v=i.get(O);if(typeof v=="number"){h=v;continue}let y=s.length;s.push([h,u(f)]),i.set(O,y),h=y}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:s,entries:e.entries.map(d=>{let h=d.pageCompositionUnitKey?r.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),Ve(d.operationSummary),...h>=0?[h]:[]]}),...a.length>0?{dynamicDataSummaries:a}:{}}}function Ve(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function qe(e){if(!e)return[];let t=[],n=0,i=ue(e,n);if(i<0)return t.push(e),t;for(t.push(e.slice(0,i)),n=i;n<e.length;){if(i=ue(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 ue(e,t){let n=e.indexOf("/",t),i=e.indexOf("::",t);return n<0?i:i<0?n:Math.min(n,i)}var he="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"?We(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:s}=i;switch(i.kind){case"initialize-session":{let o=W(i),r=await this.resolve(o),c=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:S({...c,data:{...c.data,document:le(c.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,Ge(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,S(r,o));return}case"get-style-context":{let o=await this.resolveWireContext(i);this.sendResult(s,i.kind,S(await this.options.engine.getStyleContext(o),o));return}case"get-object-edit-context":{let o=await this.resolveWireContext(i);this.sendResult(s,i.kind,S(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,S(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,S(await this.options.engine.getSourceTree(o),o));return}case"get-source-file":{let o=await this.resolveWireContext(i);this.sendResult(s,i.kind,S(await this.options.engine.getSourceFile({path:i.path,composition:o}),o));return}case"resolve-source-location":{let o=await this.resolveWireContext(i),r=S(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(w(o)!==w(r))throw new x(he,"The execute request composition does not match its operation composition.");let c=await this.normalizeOperationRequest(i.request,o);await this.handleBufferedOperation(s,i.kind,()=>this.options.engine.execute(c));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: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(he,"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=ze(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:pe(n)};if(i.target.kind==="route"){let s=i.target,o=W(s),r=await this.resolveAndAssert(o);i.target={...s,composition:pe(r)}}return i}handleEngineEvent(t){let n=t?.composition;if(!$e(n))return;let i=w(n);this.session.subscribedCompositionKeys.has(i)&&(this.eventDispatcher.push(t),t.type==="site-edit.graph.invalidated"&&i===Je(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=Qe(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 s=await i();this.sendResult(t,n,s)}catch(s){this.sendJson({type:"error",payload:{id:t,kind:n,message:z(s),code:$(s)}})}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 We(e,t){if(!p(e)||typeof e.id!="string"||!m.isRequestKind(e.kind))return!1;let n=k(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&&Le(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 Le(e){return p(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&k(e.composition)&&typeof e.kind=="string"&&p(e.target)&&(e.target.kind!=="route"||k(e.target.composition))&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&p(e.params)}function k(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 $e(e){return p(e)&&typeof e.routeId=="string"&&(e.effectiveTemplateId===void 0||typeof e.effectiveTemplateId=="string")}function W(e){if(k(e.composition))return e.composition;throw new x(Q,"A composition selector is required for this request.")}function ze(e){if(p(e)&&k(e.composition))return e.composition;throw new x(Q,"A composition selector is required for execute.")}function pe(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function Je(e){return e.activeComposition?w(e.activeComposition):null}function w(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}function S(e,t){return p(e)&&e.ok===!0?{...e,composition:t}:e}function Ge(e,t){return!p(e)||e.ok!==!0?e:{...e,...t?{composition:t}:{},data:le(e.data)}}function le(e){let t=e;return de(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 Qe(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 ct,computeSiteEditCompositionKey as C}from"@vcp-dev/contracts";var ut="127.0.0.1",dt=30218,ht="/__vcp/site-edit/bridge",xe=6*1024*1024,pt=xe*2,lt=3e3,fe=50,me="__VCP_SITE_EDIT_BRIDGE_SERVERS__";function Ce(e,t,n={}){let i=new ee(ft(t),e,!1,n);return i.start({listen:!1}),i}var ee=class{constructor(t,n=Ye.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=xt({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 at({projectRoot:this.options.projectRoot,watch_dirs:mt(this.options.runtime.watch_dirs),interval_ms:this.options.runtime.watch_interval_ms,debounce_ms:this.options.runtime.watch_debounce_ms??fe,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=It(),n=wt(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??tt)({...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=yt(t.composition),s=this.getRuntime(),o=g(i);await s.initializeComposition(o);let c=s.getDocument(o).data;await this.recordRuntimeVersion(c.version,i);let a=(await s.getHistoryStatus()).data;return{ok:!0,composition:i,data:{document:c,historyStatus:a}}}),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 Z(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 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??nt)(St({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=C(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?C(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??fe;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=gt(this.options.projectRoot),i=rt(n),s=i.length>0?i:(this.options.runtime.routes??[]).map(a=>({...a})),o=ot({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(a=>[C(a.context),a])),c=new Map(o.map(a=>[C(a.context),a]));if(this.runtime){for(let[a,u]of r){let l=c.get(a);(!l||l.entryFile!==u.entryFile)&&this.runtime.unregisterComposition(g(u.context))}for(let[a,u]of c){let l=r.get(a);(!l||l.entryFile!==u.entryFile)&&this.runtime.registerComposition(u.context,u.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=st(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=it({selector:{routeId:n,...t.templateId?{templateId:t.templateId}:{}},files:this.compositionFiles,canonicalEntryFile:i.entryFile}),o=C(s.context);if(!this.compositions.some(r=>C(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(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 ft(e){return{tenantId:e.tenantId,siteId:e.siteId,snapshotId:e.snapshotId,projectRoot:I.resolve(e.projectRoot??process.cwd()),basePath:e.basePath??"",host:e.host??ut,port:e.port??dt,path:e.path??ht,sessionKey:e.sessionKey??_t(),historyRoot:e.historyRoot,allowedOrigins:e.allowedOrigins??[],runtime:e.runtime??{}}}function mt(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 gt(e){let t=[],n=["app","src/app",".vcp"],i=new Set([".git",".next",".turbo","coverage","dist","node_modules","output","snapshot-store"]),s=o=>{if(!Y.existsSync(o))return;let r;try{r=Y.readdirSync(o,{withFileTypes:!0})}catch{return}for(let c of r){if(c.name.startsWith(".")&&c.name!==".vcp")continue;if(c.isDirectory()){if(i.has(c.name))continue;s(I.join(o,c.name));continue}if(!c.isFile())continue;let a=I.join(o,c.name),u="";try{u=Y.readFileSync(a,"utf8")}catch{}t.push({path:I.relative(e,a).replaceAll(I.sep,"/"),content:u})}};for(let o of n)s(I.join(e,o));return t.sort((o,r)=>o.path.localeCompare(r.path))}function yt(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 St(e){return I.join(I.resolve(e.root),ge(e.siteId),ge(e.snapshotId),Ie("sha256").update(e.editingSessionId).digest("hex").slice(0,32))}function ge(e){return/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)&&e!=="."&&e!==".."?e:Ie("sha256").update(e).digest("hex").slice(0,32)}function It(){let e=globalThis;return e[me]??=new Map,e[me]}function wt(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 xt(e){let t=new et({maxPayload:xe,noServer:!0}),n=new WeakSet,i=o=>{new M({socket:new te(o),engine:e.engine,validateOperationRequest:r=>ct.safeParse(r).success})},s=(o,r,c)=>{if(!Ct(o,e))return;let a=bt(o,e);if(!a){r.write(`HTTP/1.1 401 Unauthorized\r
|
|
2
2
|
Connection: close\r
|
|
3
3
|
\r
|
|
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(`
|
|
4
|
+
`),r.destroy();return}a.authenticatedByHeader&&n.add(o),t.handleUpgrade(o,r,c,u=>{t.emit("connection",u,o)})};return e.server.on("upgrade",s),t.on("connection",(o,r)=>{if(n.has(r)){i(o);return}Rt(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 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===we.OPEN){if(this.socket.bufferedAmount+Buffer.byteLength(t,"utf8")>pt){this.socket.close(1013,"bridge backpressure");return}this.socket.send(t)}}close(t,n){this.socket.close(t,n)}};function Ct(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function bt(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"]),s=be(i,t.sessionKey),o=X(e.headers.host),r=X(e.headers.origin);return o&&!Et(o,t.host,r)?null:r?kt(r,o,t.allowedOrigins)?{authenticatedByHeader:s}:null:s?{authenticatedByHeader:!0}:null}function Rt(e,t,n){let i=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},lt),s,o=()=>{clearTimeout(i),e.off("message",s),e.off("close",o)},r=()=>{o(),e.close(1008,"bridge authentication failed")};s=c=>{try{let a=m.parseMessage(c.toString());if(a.type!=="auth"||!be(a.payload.key,t)){r();return}o(),e.readyState===we.OPEN&&e.send(m.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{r()}},e.on("message",s),e.on("close",o)}function be(e,t){if(!e)return!1;let n=Buffer.from(e),i=Buffer.from(t);return n.length===i.length&&Xe(n,i)}function Et(e,t,n){let i=Se(e),s=Se(t);return i===s||ye(s)&&ye(i)&&(!n||ne(n,e))||vt(s)&&(!n||ne(n,e))}function vt(e){return e==="0.0.0.0"||e==="::"}function ye(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function kt(e,t,n){return n.includes(e)||(t?ne(e,t):!1)}function ne(e,t){try{return new URL(e).host===Re(t)}catch{return!1}}function Se(e){let t=Re(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function Re(e){return e.trim().toLowerCase()}function X(e){return Array.isArray(e)?e[0]:e}function _t(){return Ze(32).toString("base64url")}var Pt="next",He="127.0.0.1",Ot=3e3,F="/__vcp/site-edit/bridge",Ae="/__vcp/site-edit/health",Bt="probe",Ht="render",ve="/_error",U="/__vcp/site-edit/client/",At=`${U}auto-bootstrap.js`,De='data-vcp-site-edit-bootstrap="true"',Dt=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],Mt="@vcp-dev/site-edit-engine/webpack-loader",Nt=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,jt=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],Ft=new Set(["auto-bootstrap.js","client.js","composition-key.js","designer-trace.js","document-codec.js","protocol.js","window-message.js"]);async function Yn(e={},t={}){let n=t.process??process,i=t.createServer??oe.createServer,s=t.attachBridgeServer??Ce,o=t.loadNext??yn,r=_.resolve(e.projectRoot??process.cwd()),c=e.host??He,a=e.port??xn(n.env.PORT)??Ot,u=e.bridgePath??F,l=$t(u),d=pn(),h=e.basePath??n.env.VCP_SITE_PREVIEW_BASE_PATH??"/",f=(e.tenantId??n.env.VCP_TENANT_ID)?.trim()||void 0,O=await o(r),v=Ut(r),y=O({dev:!0,dir:r,hostname:c,port:a,...Kt(v)}),je=y.getRequestHandler(),Fe=e.siteId??n.env.VCP_SITE_ID??"018f6f4d-a9b8-7120-8000-000000000120",re=e.snapshotId??n.env.VCP_SNAPSHOT_ID??wn(r),ae=e.historyRoot??n.env.VCP_SITE_EDIT_HISTORY_ROOT,ce=ae?.trim()?_.resolve(ae):void 0,B=null,Ue={launchId:Tt(),pid:process.pid,snapshotId:re},b=i((q,D)=>{Xt({basePath:h,bridgePath:u,bridgeHealthPath:l,bridgeSessionKey:d,getBridgeHealth:()=>B?.getHealth()??sn(u),launch:Ue,runRenderProbe:()=>tn(y),handle:je,request:q,response:D}).catch(Ke=>{console.error(Ke),D.headersSent||(D.statusCode=500),D.end("site edit preview request failed")})}),K=null,H=null,V=()=>H||(j(()=>n.off("SIGINT",A)),j(()=>n.off("SIGTERM",A)),j(()=>K?.()),K=null,j(()=>B?.stop()),B=null,H=Promise.allSettled([bn(b),Rn(()=>y.close())]).then(()=>{}),H),A=()=>{V()};try{return await y.prepare(),B=s(b,{...f?{tenantId:f}:{},siteId:Fe,snapshotId:re,projectRoot:r,basePath:h,host:c,port:a,path:u,sessionKey:d,...ce?{historyRoot:ce}:{}}),K=Wt({server:b,bridgePath:u,handleUpgrade:y.getUpgradeHandler()}),n.on("SIGINT",A),n.on("SIGTERM",A),await Cn(b,a,c),{bundler:v,close:V,host:c,port:En(b,a),server:b}}catch(q){throw await V(),q}}function Ut(e){let t=Vt(e);return t&&qt(t)?"webpack":"turbopack"}function Kt(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function Vt(e){for(let t of Dt){let n=P(e,t);if(E(n))return R(n,"utf8")}return null}function qt(e){return e.includes(Mt)?!0:Nt.test(e)&&jt.some(t=>t.test(e))}function Wt(e){let t=(n,i,s)=>{Lt(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 Lt(e,t){return new URL(e??"/","http://localhost").pathname===t}function $t(e=F){if(e===F)return Ae;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function zt(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??Jt()});return`<script type="module" ${De}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(At)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function Jt(){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=Pe(import.meta.url);try{let n=t.resolve(e),i=Gt(n,e);if(!i)return;let s=JSON.parse(R(i,"utf8"));return typeof s.version=="string"?s.version:void 0}catch{return}}function Gt(e,t){let n=_.parse(e).root,i=T(e);for(;i&&i!==n;){let s=P(i,"package.json");if(E(s))try{if(JSON.parse(R(s,"utf8")).name===t)return s}catch{return}i=T(i)}}function Qt(e,t){if(e.includes(De))return e;let n=zt(t),i=/<\/body\s*>/i.exec(e);return i?`${e.slice(0,i.index)}${n}${e.slice(i.index)}`:`${e}${n}`}function Zn(e,t=T(Be(import.meta.url)),n=E){return Me(e,t,n)?.path??null}function Me(e,t=T(Be(import.meta.url)),n=E){let i=new URL(e??"/","http://localhost").pathname;if(!i.startsWith(U))return null;let s=i.slice(U.length);if(!Ft.has(s))return null;let o=se(Sn(t),s);if(Oe(t)!=="src")return{path:o,requiresTranspile:!1};let r=se(t,s.replace(/\.js$/,".ts"));return n(r)?{path:r,requiresTranspile:!0}:{path:o,requiresTranspile:!1}}async function Yt(e,t){let n=Me(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 Zt(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 Zt(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function Xt({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:i,getBridgeHealth:s,launch:o,runRenderProbe:r,handle:c,request:a,response:u}){if(await on(a,u,n,s,o,r)||await Yt(a,u))return;let l=rn(a),d=an(a),h=l||d?dn(u,{basePath:e,bridgePath:t,bridgeSessionKey:i,patchNextDevChunk:d}):()=>{};try{await c(a,u)}catch(f){throw h(),f}}function en(e){let t=e instanceof Error?e.message:String(e),n=e&&typeof e=="object"&&"code"in e?e.code:void 0;return/\.next[/\\]/.test(t)||/chunks[/\\]ssr[/\\]/.test(t)?n==="ENOENT"||n==="MODULE_NOT_FOUND"?{verdict:"artifact_broken",detail:t}:t.includes("Cannot find module")?{verdict:"artifact_broken",detail:t}:{verdict:"inconclusive",detail:t}:{verdict:"inconclusive",detail:t}}async function tn(e){let t=new oe.IncomingMessage(new Ee);t.method="GET",t.url=ve,t.headers={host:He};let n=new oe.ServerResponse(t);n.assignSocket(new Ee);try{return await e.renderToHTML(t,n,ve,{}),{verdict:"ok"}}catch(i){return en(i)}finally{try{let i=n.socket;i&&(n.detachSocket(i),i.destroy())}catch{}}}function nn(e){return new URL(e??"/","http://localhost").searchParams.get(Bt)===Ht}async function on(e,t,n,i,s,o){if(e.method!=="GET"||new URL(e.url??"/","http://localhost").pathname!==n)return!1;let c=i(),a=nn(e.url)?await o():void 0,u={...c,launch:s,...a?{render:a}:{}};return t.writeHead(c.ok?200:503,{"cache-control":"no-store","content-type":"application/json; charset=utf-8"}),t.end(JSON.stringify(u)),!0}function sn(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function rn(e){return cn(e)?(e.headers["accept-encoding"]="identity",!0):!1}function an(e){return un(e)?(e.headers["accept-encoding"]="identity",!0):!1}function cn(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===Ae)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function un(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 dn(e,t){let n=[],i=e,s=i.flushHeaders.bind(e),o=i.write.bind(e),r=i.end.bind(e);return i.flushHeaders=()=>{},i.write=(c,a,u)=>(c!==void 0&&n.push(ke(c,_e(a))),Te(a),Te(u),!0),i.end=(c,a,u)=>{let l=typeof c=="function"?void 0:c;l!==void 0&&n.push(ke(l,_e(a))),i.write=o,i.end=r,i.flushHeaders=s;let d=Buffer.concat(n),h=hn(e,d,t);h!==d&&!e.headersSent&&e.removeHeader("content-length");let f=typeof c=="function"?c:typeof a=="function"?a:typeof u=="function"?u:void 0;return f?r(h,f):r(h)},()=>{i.write=o,i.end=r,i.flushHeaders=s}}function hn(e,t,n){if(ln(e,t))return Buffer.from(Qt(t.toString("utf8"),n));if(n.patchNextDevChunk&&fn(e)){let i=t.toString("utf8"),s=mn(i);if(s!==i)return Buffer.from(s)}return t}function pn(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function ln(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 fn(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 mn(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,s])=>
|
|
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])=>gn(n,i,s),e)}function gn(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 ke(e,t){return Buffer.isBuffer(e)?e:e instanceof Uint8Array?Buffer.from(e):Buffer.from(String(e),t)}function _e(e){return typeof e=="string"?e:void 0}function Te(e){typeof e=="function"&&e()}async function yn(e){let n=Pe(P(e,"package.json"))(Pt);return n.default??n}function Sn(e){return Oe(e)!=="src"?e:se(In(e),"dist")}function In(e){return Ne(e)?_.posix.dirname(e):T(e)}function se(e,t){return Ne(e)?_.posix.join(e,t):P(e,t)}function Ne(e){return e.includes("/")&&!e.includes("\\")}function wn(e){let t=P(e,".vcp/current-snapshot.json");if(!E(t))return"sandbox_worktree";try{let n=JSON.parse(R(t,"utf8"));return typeof n.snapshotId=="string"?n.snapshotId:"sandbox_worktree"}catch{return"sandbox_worktree"}}function xn(e){if(!e)return null;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:null}function Cn(e,t,n){return new Promise((i,s)=>{e.once("error",s),e.listen(t,n,()=>{e.off("error",s),i()})})}function bn(e){return new Promise(t=>{e.close(()=>t())})}function j(e){try{e()}catch{}}function Rn(e){try{return e()}catch(t){return Promise.reject(t)}}function En(e,t){let n=e.address();return typeof n=="object"&&n?n.port:t}export{Wt as attachNextDevUpgradeHandler,en as classifySiteEditRenderProbeError,zt as createSiteEditAutoBootstrapHtmlSnippet,Qt as injectSiteEditAutoBootstrap,nn as isSiteEditRenderProbeRequested,mn as patchNextFirefoxDevChunk,an as prepareFirefoxNextDevChunkPatchRequest,rn as prepareSiteEditHtmlInjectionRequest,$t as resolveSiteEditBridgeHealthPath,Me as resolveSiteEditClientAsset,Zn as resolveSiteEditClientAssetPath,Ut as resolveSiteEditNextDevBundler,tn as runSiteEditRenderProbe,Yn 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.
|
|
3
|
+
"version": "0.8.0",
|
|
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.
|
|
78
|
-
"@vcp-dev/site-edit-engine": "0.
|
|
77
|
+
"@vcp-dev/contracts": "0.8.0",
|
|
78
|
+
"@vcp-dev/site-edit-engine": "0.8.0",
|
|
79
79
|
"@types/ws": "^8.18.1",
|
|
80
80
|
"ws": "^8.20.1"
|
|
81
81
|
},
|