@vcp-dev/site-edit-bridge 0.4.9 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auto-bootstrap.d.ts +2 -1
- package/dist/auto-bootstrap.js +1 -1
- package/dist/client.d.ts +77 -99
- package/dist/client.js +1 -1
- package/dist/document-codec.d.ts +13 -14
- package/dist/document-codec.js +1 -1
- package/dist/index.js +3 -3
- package/dist/next-dev-server.d.ts +2 -0
- package/dist/next-dev-server.js +3 -3
- package/dist/protocol.d.ts +60 -15
- package/dist/server.d.ts +39 -2
- package/dist/server.js +2 -2
- package/dist/window-message.d.ts +29 -4
- package/package.json +4 -4
package/dist/index.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
function Je(e){let t=new Map,n=[],r=new Map,o=[],s=a=>{let c=t.get(a);if(typeof c=="number")return c;let u=n.length;return n.push(a),t.set(a,u),u},i=a=>{let c=null;for(let u of Yt(a)){let f=`${c??"root"}\0${u}`,m=r.get(f);if(typeof m=="number"){c=m;continue}let g=o.length;o.push({parent:c,token:s(u)}),r.set(f,g),c=g}if(c===null)throw new Error("Document key must not be empty");return c};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,tokens:n,nodes:o,rootKeyNodeIds:e.rootKeys.map(i),entries:e.entries.map(a=>({keyNodeId:i(a.key),tag:a.tag,label:a.label,parentKeyNodeId:a.parentKey?i(a.parentKey):null,childKeyNodeIds:a.childKeys.map(i),operationSummary:a.operationSummary}))}}function Ye(e){if(!Jt(e))return e;let t=new Map,n=r=>{let o=t.get(r);if(o)return o;let s=e.nodes[r];if(!s)throw new Error(`Missing compact document node ${r}`);let i=e.tokens[s.token];if(typeof i!="string")throw new Error(`Missing compact document token ${s.token}`);let a=`${s.parent===null?"":n(s.parent)}${i}`;return t.set(r,a),a};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,rootKeys:e.rootKeyNodeIds.map(n),entries:e.entries.map(r=>({key:n(r.keyNodeId),tag:r.tag,label:r.label,parentKey:r.parentKeyNodeId===null?null:n(r.parentKeyNodeId),childKeys:r.childKeyNodeIds.map(n),operationSummary:r.operationSummary}))}}function Jt(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}function Yt(e){if(!e)return[];let t=[],n=0,r=ze(e,n);if(r<0)return t.push(e),t;for(t.push(e.slice(0,r)),n=r;n<e.length;){if(r=ze(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 ze(e,t){let n=e.indexOf("/",t),r=e.indexOf("::",t);return n<0?r:r<0?n:Math.min(n,r)}var B=class e{constructor(){}static parseMessage(t,n={}){let r=JSON.parse(t);if(!e.isMessage(r,n))throw new Error("Invalid site edit bridge message");return r}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(typeof t=="object"&&t!==null&&"payload"in t&&typeof t.payload=="object"&&t.payload!==null){let n=t.payload,r=typeof n.id=="string"?n.id:"unknown",o=e.isRequestKind(n.kind)?n.kind:"get-document";return{id:r,kind:o}}return{id:"unknown",kind:"get-document"}}static isRequestKind(t){return t==="get-document"||t==="get-object-summary"||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!q(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?q(t.payload)&&typeof t.payload.id=="string":t.type==="event"?q(t.payload)&&q(t.payload.event):t.type==="auth"?q(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?q(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!q(t)||typeof t.id!="string"||!e.isRequestKind(t.kind))return!1;switch(t.kind){case"get-document":return typeof t.routeId=="string";case"get-object-summary":case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof t.key=="string"&&(t.routeId===void 0||typeof t.routeId=="string");case"get-source-tree":return!0;case"get-source-file":return typeof t.path=="string";case"execute":return Xt(t.request)&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return!0}}},fe=class{constructor(t){this.options=t,this.messageQueue=new Pe,this.eventDispatcher=new ke(n=>{this.sendJson(n)}),this.unsubscribe=t.engine.subscribe(n=>{this.eventDispatcher.push(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()}}async handleMessage(t){try{let n=t;if(n.type!=="request")return;let r=n.payload,{id:o}=r;switch(r.kind){case"get-document":this.sendJson({type:"response",payload:{id:o,kind:r.kind,result:{ok:!0,data:Je((await this.options.engine.getDocument(r.routeId)).data)}}});return;case"get-object-summary":this.sendJson({type:"response",payload:{id:o,kind:r.kind,result:await this.options.engine.getObjectSummary(r.key,r.routeId)}});return;case"get-object-edit-context":this.sendJson({type:"response",payload:{id:o,kind:r.kind,result:await this.options.engine.getObjectEditContext(r.key,r.routeId)}});return;case"get-class-name-source":this.sendJson({type:"response",payload:{id:o,kind:r.kind,result:await this.options.engine.getClassNameSource(r.key,r.routeId)}});return;case"get-source-tree":this.sendJson({type:"response",payload:{id:o,kind:r.kind,result:await this.options.engine.getSourceTree()}});return;case"get-source-file":this.sendJson({type:"response",payload:{id:o,kind:r.kind,result:await this.options.engine.getSourceFile({path:r.path})}});return;case"resolve-source-location":this.sendJson({type:"response",payload:{id:o,kind:r.kind,result:await this.options.engine.resolveSourceLocation({key:r.key,routeId:r.routeId})}});return;case"execute":await this.handleBufferedOperation(o,r.kind,()=>this.options.engine.execute(r.request));return;case"undo":await this.handleBufferedOperation(o,r.kind,()=>this.options.engine.undo());return;case"redo":await this.handleBufferedOperation(o,r.kind,()=>this.options.engine.redo());return}}catch(n){let r=B.extractRequestInfo(t);this.sendJson({type:"error",payload:{...r,message:n instanceof Error?n.message:"Unknown websocket operation failure"}})}}async handleRawMessage(t){try{await this.handleMessage(B.parseMessage(t,{validateOperationRequest:this.options.validateOperationRequest}))}catch(n){let r=n instanceof Error?n.message:"Invalid websocket message",o=Qt(t);this.sendJson({type:"error",payload:{...o,message:r}})}}sendJson(t){this.options.socket.send(B.stringifyMessage(t))}async handleBufferedOperation(t,n,r){this.eventDispatcher.beginBuffering();try{let o=await r();this.sendJson({type:"response",payload:{id:t,kind:n,result:o}}),this.eventDispatcher.flush()}catch(o){this.sendJson({type:"error",payload:{id:t,kind:n,message:o instanceof Error?o.message:"Unknown websocket operation failure"}}),this.eventDispatcher.flush()}}},ke=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)})}},Pe=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 q(e){return typeof e=="object"&&e!==null}function Xt(e){return q(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&(e.routeId===void 0||typeof e.routeId=="string")&&typeof e.kind=="string"&&q(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&q(e.params)}function Qt(e){try{return B.extractRequestInfo(JSON.parse(e))}catch{return{id:"unknown",kind:"get-document"}}}var Zt="vcp:designer:trace",Lt="designer_trace",Xe="__VCP_DESIGNER_TRACE__";var en=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function tn(e=globalThis){let t=e;try{if(t.localStorage?.getItem(Zt)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(Lt)==="1"}catch{return!1}}function $(e,t={},n=globalThis){if(!tn(n))return;let r={type:e,timestamp:Date.now(),payload:nn(t)},o=n,s=o[Xe]??[];s.push(r),s.length>200&&s.splice(0,s.length-200),o[Xe]=s;let i=n.console?.debug;typeof i=="function"&&i.call(n.console,"[designer-trace]",r)}function nn(e){return Ne(e,0)}function Ne(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>Ne(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,o]of Object.entries(e)){if(en.test(r)){n[r]="[redacted]";continue}n[r]=Ne(o,t+1)}return n}var pe=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===De&&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(a){let c=ne(a,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",c.message),n(c);return}let o={socket:r,settled:!1,reject:n};this.connectAttempt=o,this.socket=r;let s=()=>{this.socket!==r||this.connectAttempt!==o||(o.settled=!0,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("open"),t())},i=(a,c)=>{this.cleanupSocket(r,a,c)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==o)){if(this.options.authKey){try{r.send(B.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(a){i(ne(a,"WebSocket auth failed"),"failed")}return}s()}},r.onerror=a=>{if(this.socket!==r)return;let c=ne(a,"WebSocket failed");i(c,"failed")},r.onmessage=a=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===o&&!o.settled){this.handleAuthHandshakeMessage(a.data,r,o,()=>{s()});return}this.handleMessage(a.data)}},r.onclose=a=>{if(this.socket!==r)return;let c=this.intentionalClose,u=new Error(an(a,{intentional:c}));i(u,c?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let t=this.socket;if(!t){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(t,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(t){return this.connectionStatusListeners.add(t),t({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(t)}}getDocument(t){return this.request("get-document",{routeId:t})}getObjectSummary(t,n){return this.request("get-object-summary",{key:t,routeId:n})}getObjectEditContext(t,n){return this.request("get-object-edit-context",{key:t,routeId:n})}getClassNameSource(t,n){return this.request("get-class-name-source",{key:t,routeId:n})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(t){return this.request("get-source-file",t)}resolveSourceLocation(t){return this.request("resolve-source-location",t)}execute(t){return this.request("execute",{request:t})}undo(){return this.request("undo",{})}redo(){return this.request("redo",{})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}request(t,n){let r=this.socket;if(!r||r.readyState!==De||this.connectionState!=="open")return Promise.reject(new Error(`WebSocket is not open (state: ${this.connectionState}, readyState: ${r?.readyState??"none"})`));let o=`${t}-${this.sequence+=1}`,s=ln(o,t,n);return $("bridge.request",{id:o,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:Qe(n.request,"kind"),documentVersion:Qe(n.request,"documentVersion")}),new Promise((i,a)=>{let c=this.resolveRequestTimeoutMs(t),u=c>0?setTimeout(()=>{let f=this.pending.get(o);f&&(this.pending.delete(o),$("bridge.response",{id:o,kind:t,ok:!1,timedOut:!0}),f.reject(new Error(`Bridge request timed out after ${c}ms: ${t}`)))},c):null;u?.unref?.(),this.pending.set(o,{kind:t,timeout:u,resolve:f=>i(f),reject:a});try{r.send(B.stringifyMessage(s))}catch(f){let m=ne(f,"WebSocket send failed");this.clearPendingRequest(o),a(m),this.cleanupSocket(r,m,"failed")}})}handleAuthHandshakeMessage(t,n,r,o){try{if(B.parseMessage(t).type==="auth-ok"){o();return}throw new Error("Bridge authentication failed")}catch(s){let i=ne(s,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,i,"failed")}}handleMessage(t){let n=B.parseMessage(t);if(n.type==="event"){for(let o of this.listeners)o(n.payload.event);return}if(n.type!=="response"&&n.type!=="error")return;let r=this.pending.get(n.payload.id);if(r){if(this.clearPendingRequest(n.payload.id),n.type==="error"){$("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1}),r.reject(new Error(n.payload.message));return}$("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:cn(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Ye(n.payload.result.data)}: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):sn[t]??on}cleanupSocket(t,n,r){if(this.socket===t&&(this.socket=null),this.connectAttempt?.socket===t){let o=this.connectAttempt;this.connectAttempt=null,o.settled||(o.settled=!0,o.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===rn||t.readyState===De)&&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 o of this.connectionStatusListeners)o(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)}},rn=0,De=1,on=15e3,sn={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function ne(e,t){return e instanceof Error?e:new Error(t)}function an(e,t){return t.intentional?"WebSocket disconnected":e?.code===1008?e.reason?`Bridge session authentication failed: ${e.reason}`:"Bridge session authentication failed":e?.reason?`WebSocket closed: ${e.reason}`:typeof e?.code=="number"&&e.code!==1005?`WebSocket closed with code ${e.code}`:"WebSocket closed"}function Qe(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function cn(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 Ze(e){return new Be(e)}var Be=class{constructor(t){this.params=t,this.refreshInFlight=null,this.currentDocument=t.initialDocument,this.summaryCache=new Map(Object.entries(t.initialDetails??{}).map(([n,r])=>[n,dn(r)])),this.editContextCache=new Map(Object.entries(t.initialDetails??{}).map(([n,r])=>[n,fn(r)]))}async getDocument(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);return un(this.currentDocument)&&(this.currentDocument=await this.refreshSnapshot(void 0,"get-document")),{ok:!0,data:this.currentDocument}}async ensureDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let r=await this.refreshSnapshot(n,"ensure-version");if(r.version<n)throw new Error(`Document refresh returned version ${r.version}, expected at least ${n}`);return{ok:!0,data:r}}async getObjectSummary(t,n){let r=this.summaryCache.get(t);if(r)return{ok:!0,data:r};let o=await this.params.client.getObjectSummary(t,n??this.params.routeId);return this.summaryCache.set(t,o.data),o}async getObjectEditContext(t,n){let r=this.editContextCache.get(t);if(r)return{ok:!0,data:r};let o=await this.params.client.getObjectEditContext(t,n??this.params.routeId);return this.editContextCache.set(t,o.data),o}async getClassNameSource(t,n){return this.params.client.getClassNameSource(t,n??this.params.routeId)}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(t){return this.params.client.getSourceFile(t)}async resolveSourceLocation(t){return this.params.client.resolveSourceLocation({...t,routeId:t.routeId??this.params.routeId})}async execute(t){return this.params.client.execute(t.target.kind==="node"&&!t.routeId?{...t,routeId:this.params.routeId}:t)}async undo(){return this.params.client.undo()}async redo(){return this.params.client.redo()}subscribe(t){return this.params.client.subscribe(n=>{if(n.type==="site-edit.document.changed"&&n.routeId===this.params.routeId){this.refreshSnapshot(n.version,"event").catch(()=>{}).finally(()=>t(n));return}t(n)})}async refreshSnapshot(t,n="ensure-version"){if(typeof t=="number"&&this.currentDocument.version>=t)return $("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;if(this.refreshInFlight){$("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let o=await this.refreshInFlight;if(typeof t!="number"||o.version>=t||this.currentDocument.version>=t)return this.currentDocument}$("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!1,source:n});let r=this.params.client.getDocument(this.params.routeId).then(o=>(this.currentDocument=o.data,this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=r;try{return await r}finally{this.refreshInFlight===r&&(this.refreshInFlight=null)}}clearObjectCaches(){this.summaryCache.clear(),this.editContextCache.clear()}};function un(e){return e.version===0&&e.rootKeys.length===0}function ln(e,t,n){switch(t){case"get-document":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-object-summary":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-object-edit-context":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:e,kind:t}};case"get-source-file":return{type:"request",payload:{id:e,kind:t,path:String(n.path)}};case"resolve-source-location":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"execute":return{type:"request",payload:{id:e,kind:t,request:n.request}};case"undo":case"redo":return{type:"request",payload:{id:e,kind:t}}}}function dn(e){return{key:e.key,tag:e.tag,label:e.label,capabilities:{constraints:e.capabilities.constraints},isOpaque:e.isOpaque,provenanceChain:e.provenanceChain?{editMode:e.provenanceChain.editMode,diagnostics:e.provenanceChain.diagnostics}:void 0,ancestors:e.ancestors}}function fn(e){return{key:e.key,componentName:e.componentName,sourceFile:e.sourceFile,capabilities:e.capabilities,writeTarget:e.writeTarget,effectiveWriteTarget:e.effectiveWriteTarget,provenanceChain:e.provenanceChain,componentSemantic:e.componentSemantic,textSegments:e.textSegments,boundaryKind:e.boundaryKind,children:e.children,siblings:e.siblings}}var Le="vcp-window-message",Lo=1;function pn(e){return{source:Le,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function hn(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.source===Le&&t.version===1&&typeof t.namespace=="string"&&typeof t.channel=="string"&&"body"in t}var et="site-edit",tt="frame-runtime";function re(e,t={}){return pn({namespace:et,channel:tt,sessionKey:t.sessionKey,body:e})}function nt(e){return!hn(e)||e.namespace!==et||e.channel!==tt?!1:typeof e.body?.type=="string"}var Fe="vcp-site-edit:route-ready",Me="vcp-site-edit:bridge-status",mn=1e3,gn="data-vcp-ui-component",lt="data-vcp-theme-preview",rt="::repeat-item#",he="components/ui",yn=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),bn=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function Sn(e,t=""){let n=ht(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,o=r.startsWith("/")?r:`/${r}`;return o==="/"?"/":o.replace(/\/+$/,"")}function En(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 vn(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 rs(e=window,t={}){let n=vn(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=Rn({bridgeUrl:n,options:t}),o=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(o?.started){if(In(o.signature,r)){await o.syncRoute?.();return}o.cleanup?.()}let s={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},i,a=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===i,c=t.create_client??(p=>new pe({url:p,authKey:t.bridge_session_key})),u=t.schedule_after_navigation??An,f=()=>{s.retryTimer&&(e.clearTimeout(s.retryTimer),s.retryTimer=void 0)},m=()=>Sn(e.location.pathname,t.basePath||""),g=p=>{Fn(e,p)},y=p=>{s.currentDocument=p,s.currentEntriesByKey=new Map((p?.entries??[]).map(b=>[b.key,b]))},_=()=>{s.unsubscribeConnectionStatus?.(),s.unsubscribeConnectionStatus=void 0,s.unsubscribeDocument?.(),s.unsubscribeDocument=void 0},I=(p,b)=>!s.disposed&&b===s.routeSequence&&p===m(),D=async(p,b)=>{let x=s.activeBridge;if(!x)return null;let C=await x.getDocument(p);return I(p,b)&&y(C.data),C.data},k=()=>{_(),y(null);let p=s.activeBridge;s.activeBridge=null,p&&e.__VCP_SITE_EDIT__===p&&delete e.__VCP_SITE_EDIT__;let b=s.activeClient;s.activeClient=null,b?.disconnect()},K=p=>p===i.routeId&&!!s.activeBridge&&!!(s.currentDocument&&Kn(s.currentDocument,p))&&Mn(s.activeClient),_e=p=>Math.min(mn*2**Math.max(0,p),8e3),Q=(p,b,x)=>{if(s.disposed)return;f();let C=_e(x);g({state:"reconnecting",routeId:p,attempt:x,retryInMs:C,messageKey:"studio.status.previewBridgeConnecting"}),s.retryTimer=e.setTimeout(()=>{s.retryTimer=void 0,!(s.disposed||b!==s.routeSequence)&&le(x+1).catch(h=>{let d=m();if(p===d){if(J(h)){g({state:"reload-required",routeId:p,attempt:x,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Q(p,s.routeSequence,x+1)}})},C)},Z=(p,b,x)=>{if(!I(p,b)||s.activeClient===null)return;if(J(x.message)){k(),f(),g({state:"reload-required",routeId:p,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let C=s.activeClient;_(),y(null);let h=s.activeBridge;s.activeBridge=null,h&&e.__VCP_SITE_EDIT__===h&&delete e.__VCP_SITE_EDIT__,s.activeClient=null,C?.disconnect(),Q(p,b,0)},ue=p=>{let b=m(),x=s.routeSequence;if(!(!I(b,x)||s.activeClient===null)){if(J(p)){k(),f(),g({state:"reload-required",routeId:b,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}pt(p)&&Z(b,x,{state:"failed",message:qe(p,"Site edit bridge request failed")})}};s.cleanupFrameRuntime=kn(e,{getCurrentDocument:()=>s.currentDocument,getDocumentEntry:p=>s.currentEntriesByKey.get(p)??null,onBridgeRequestError:p=>{ue(p)}});let L=async()=>le(0),le=async p=>{if(s.disposed)return;let b=m();if(K(b))return;let x=s.syncInFlight;if(x?.routeId===b)return x.promise;let C=s.routeSequence+1,h=Ce(b,C,p);s.syncInFlight={routeId:b,sequence:C,promise:h};try{await h}finally{s.syncInFlight?.promise===h&&(s.syncInFlight=null)}},Ce=async(p,b,x)=>{s.routeSequence=b,f(),k(),g({state:x>0?"reconnecting":"connecting",routeId:p,attempt:x,messageKey:x>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let C=c(n),h=!1;s.activeClient=C,s.unsubscribeConnectionStatus=C.subscribeConnectionStatus?.(d=>{h&&(d.state==="closed"||d.state==="failed")&&Z(p,b,d)});try{if(await C.connect(),!I(p,b)){C.disconnect();return}let d=Ze({routeId:p,client:C,initialDocument:Tn(p)});s.activeBridge=d,a()&&(e.__VCP_SITE_EDIT__=d),s.activeClient=C,s.unsubscribeDocument=d.subscribe(T=>{T.type==="site-edit.document.changed"&&T.routeId===p&&D(p,b).catch(()=>{})}),a()&&(i.routeId=p);let l=await D(p,b);if(!I(p,b)){C.disconnect();return}h=!0,g({state:"ready",routeId:p,attempt:x,messageKey:"studio.status.previewReady"}),En(e,{documentVersion:l?.version??0,routeId:p,versions:t.runtime_versions}),On(e,{routeId:p,version:l?.version??0})}catch(d){if(_(),s.activeClient===C&&(s.activeClient=null),s.activeBridge&&e.__VCP_SITE_EDIT__===s.activeBridge&&delete e.__VCP_SITE_EDIT__,s.activeBridge=null,C.disconnect(),y(null),!I(p,b))return;throw g({state:J(d)?"reload-required":"failed",routeId:p,attempt:x,messageKey:J(d)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),d}},Te=p=>{if(s.disposed)return;let b=m();if(J(p)){f(),g({state:"reload-required",routeId:b,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Q(b,s.routeSequence,0)},j=()=>{s.syncScheduled||s.disposed||(s.syncScheduled=!0,u(()=>{s.syncScheduled=!1,!s.disposed&&L().catch(p=>Te(p))}))},W=()=>{s.disposed||(s.disposed=!0,s.syncScheduled=!1,s.syncInFlight=null,f(),s.routeSequence+=1,s.unbindRouteChange?.(),s.unbindRouteChange=void 0,s.unbindBootstrapLifecycle?.(),s.unbindBootstrapLifecycle=void 0,s.cleanupFrameRuntime(),k(),a()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(i={started:!0,signature:r,syncRoute:L,cleanup:W},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=i,s.unbindBootstrapLifecycle=_n(e,W),s.unbindRouteChange=Bn(e,j,m),t.defer_initial_sync){j();return}await L()}function Rn(e){return{basePath:ht(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:xn(e.options.bridge_session_key)}}function In(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function xn(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 _n(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),Cn(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function Cn(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function Tn(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,rootKeys:[],entries:[]}}function kn(e=window,t={}){let n=null,r=null,o=null,s=null,i=null,a=null,c=null,u=null,f=null,m=new Map,g=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,y=()=>{n?.(),n=null,r=null},_=()=>{o?.(),o=null,s?.(),s=null},I=(h,d,l)=>{let T=i?.sessionKey!==h||i?.sourceWindow!==d||i?.targetOrigin!==l;i={sessionKey:h,sourceWindow:d,targetOrigin:l},T&&(u=null,f=null)},D=(h,d)=>{let l=e.parent&&e.parent!==e?e.parent:null;return!l||d!==l?!1:!g||h===g},k=()=>{for(let h of m.values())h();m.clear()},K=h=>JSON.stringify([h.routeId,h.version]),_e=()=>!c||c.state==="ready",Q=h=>JSON.stringify([h.state,h.routeId??null,h.attempt??null,h.retryInMs??null,h.messageKey??null]),Z=h=>{if(!_e())return;let d=K(h);u!==d&&(s?.(),s=null,j({kind:"route-ready",payload:{routeId:h.routeId,version:h.version}}),i&&(u=d))},ue=h=>{let d=Q(h);f!==d&&(h.state!=="ready"&&(u=null,a=null),j({kind:"bridge-status",payload:h}),i&&(f=d))},L=h=>{a=h,Z(h)},le=h=>{c=h,ue(h)},Ce=()=>{a&&Z(a)},Te=()=>{c&&ue(c)},j=h=>{i&&i.sourceWindow.postMessage(re({type:"event",...h},{sessionKey:i.sessionKey}),i.targetOrigin)},W=(h,d,l,T)=>{let P=Se(e.document,d.clientX,d.clientY,t.getCurrentDocument?.()??null),N=P?O(P,l==="full"?F(e.document,P,t.getCurrentDocument?.()??null):it(e.document,P,t.getCurrentDocument?.()??null),t.getDocumentEntry,l):null;T&&N&&(h==="pointer-click"||h==="pointer-double-click")&&(T.preventDefault(),T.stopPropagation(),typeof T.stopImmediatePropagation=="function"&&T.stopImmediatePropagation()),j({kind:h,payload:{clientX:d.clientX,clientY:d.clientY,buttons:Number(d.buttons??0),hit:N}})},p=(h,d,l)=>{_(),i={sessionKey:h,sourceWindow:d,targetOrigin:l};let T=Pr(e.document),P=null,N=null,S=()=>{N=null;let E=P;P=null,E&&W("pointer-move",E,"summary")},M=E=>{P={clientX:Number(E.clientX),clientY:Number(E.clientY),buttons:Number(E.buttons)},N===null&&(N=dt(e,S))},V=E=>{W("pointer-down",{clientX:Number(E.clientX),clientY:Number(E.clientY),buttons:Number(E.buttons)},"full",E)},z=E=>{W("pointer-up",{clientX:Number(E.clientX),clientY:Number(E.clientY),buttons:Number(E.buttons)},"summary",E)},H=E=>{W("pointer-cancel",{clientX:Number(E.clientX),clientY:Number(E.clientY),buttons:Number(E.buttons)},"summary",E)},G=E=>{W("pointer-click",{clientX:Number(E.clientX),clientY:Number(E.clientY),buttons:Number(E.buttons)},"full",E)},ee=E=>{W("pointer-double-click",{clientX:Number(E.clientX),clientY:Number(E.clientY),buttons:Number(E.buttons)},"full",E)},te=()=>{j({kind:"scroll",payload:{metrics:ye(e)}})};e.document.addEventListener("pointerdown",V,!0),e.document.addEventListener("pointermove",M,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",z,!0),e.document.addEventListener("pointercancel",H,!0),e.document.addEventListener("click",G,!0),e.document.addEventListener("dblclick",ee,!0),e.addEventListener("scroll",te,{passive:!0}),o=()=>{N!==null&&(ft(e,N),N=null),P=null,T(),e.document.removeEventListener("pointerdown",V,!0),e.document.removeEventListener("pointermove",M,!0),e.document.removeEventListener("pointerup",z,!0),e.document.removeEventListener("pointercancel",H,!0),e.document.removeEventListener("click",G,!0),e.document.removeEventListener("dblclick",ee,!0),e.removeEventListener("scroll",te)}},b=h=>{let d=h.detail;d?.routeId&&L(d)},x=h=>{let d=h.detail;d?.state&&le(d)},C=h=>{let d=h.data;if(!nt(d)||d.body.type!=="request"||d.body.kind!=="apply-node-patch"&&d.body.kind!=="get-hit-by-ref"&&d.body.kind!=="get-path-by-ref"&&d.body.kind!=="get-scroll-metrics"&&d.body.kind!=="scroll-to"&&d.body.kind!=="scroll-by"&&d.body.kind!=="set-interaction-mode"&&d.body.kind!=="set-theme-override"&&d.body.kind!=="clear-theme-override"&&d.body.kind!=="get-theme-variables"&&d.body.kind!=="compute-drop-target-at-point"&&d.body.kind!=="observe-node-bounds"&&d.body.kind!=="clear-node-bounds-observer"&&d.body.kind!=="restore-text-edit"&&d.body.kind!=="clear-text-edit-rollback"&&d.body.kind!=="start-text-edit-at-point"&&d.body.kind!=="hit-test-at-point"&&!ot(d.body))return;let l=d.body,T=typeof d.sessionKey=="string"?d.sessionKey:null,P=h.source,N=h.origin;if(!T||!N||!P||typeof P.postMessage!="function"||!D(T,P))return;if(i){if(i.sourceWindow!==P||i.targetOrigin!==N)return;i.sessionKey!==T&&(y(),_(),k(),i=null)}I(T,P,N),Te(),Ce();let S=M=>{let V=typeof l.id=="string"?l.id:"unknown";P.postMessage(re({id:V,...M},{sessionKey:T}),N)};try{if(ot(l)){Pn({message:l,sendEvent:v=>{P.postMessage(re({type:"event",...v},{sessionKey:T}),N)},sendResponse:S,subscriptions:m,getCurrentDocument:t.getCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(l.kind==="apply-node-patch"){let v=U(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!v){S({type:"response",ok:!1,error:"No editable element found for patch target"});return}let R=l.payload.preview,A=R?mr(R.sessionId,l.payload.ref):null;if(A&&R){let de=oe.get(A)??-1;if(R.revision<de){S({type:"response",ok:!0,result:{applied:!1,appliedRevision:R.revision,stale:!0,latestRevision:de}});return}if(R.revision===de){S({type:"response",ok:!0,result:{applied:!1,appliedRevision:R.revision,duplicate:!0,latestRevision:de}});return}}if(pr(v,l.payload.patch),A&&R&&gr(A,R.revision),R?.responseDetail==="none"){S({type:"response",ok:!0,result:{applied:!0,appliedRevision:R.revision}});return}S({type:"response",ok:!0,result:O(v,F(e.document,v,t.getCurrentDocument?.()??null),t.getDocumentEntry,R?.responseDetail??"full")});return}if(l.kind==="get-hit-by-ref"){let v=U(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!v){S({type:"response",ok:!1,error:"No editable element found for hit target"});return}S({type:"response",ok:!0,result:O(v,F(e.document,v,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(l.kind==="get-path-by-ref"){let v=U(e.document,l.payload.ref,t.getCurrentDocument?.()??null);if(!v){S({type:"response",ok:!1,error:"No editable element found for path target"});return}let R=[],A=v;for(;A;)A.getAttribute("data-vcp-edit-key")&&R.push(O(A,F(e.document,A,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),A=A.parentElement;S({type:"response",ok:!0,result:R.reverse()});return}if(l.kind==="restore-text-edit"||l.kind==="clear-text-edit-rollback"){let v=l.payload.ref;if(l.kind==="clear-text-edit-rollback"){r&&st(r.ref,v)&&(r=null),S({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!st(r.ref,v)){S({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let R=jn(e.document,r,t.getCurrentDocument?.()??null);r=null,S(R?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(l.kind==="get-scroll-metrics"){S({type:"response",ok:!0,result:ye(e)});return}if(l.kind==="scroll-to"){let v=Number(l.payload.x),R=Number(l.payload.y);if(!Number.isFinite(v)||!Number.isFinite(R)){S({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:v,top:R}),S({type:"response",ok:!0,result:ye(e)});return}if(l.kind==="scroll-by"){let v=Number(l.payload.deltaX),R=Number(l.payload.deltaY);if(!Number.isFinite(v)||!Number.isFinite(R)){S({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:v,top:R}),S({type:"response",ok:!0,result:{...ye(e),scrolled:!0}});return}if(l.kind==="set-interaction-mode"){l.payload.enabled?p(T,P,N):i?.sourceWindow===P&&i.targetOrigin===N&&i.sessionKey===T&&_(),S({type:"response",ok:!0,result:{interactionEnabled:l.payload.enabled}});return}if(l.kind==="set-theme-override"){yr(e.document,l.payload),S({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(l.kind==="clear-theme-override"){br(e.document),S({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(l.kind==="get-theme-variables"){S({type:"response",ok:!0,result:Sr(e.document,l.payload.names)});return}if(l.kind==="compute-drop-target-at-point"){let v=Number(l.payload?.x),R=Number(l.payload?.y);if(!Number.isFinite(v)||!Number.isFinite(R)){S({type:"response",ok:!1,error:"Invalid drop target point"});return}S({type:"response",ok:!0,result:sr(e,v,R,l.payload.dragKind,l.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(l.kind==="observe-node-bounds"){let v=l.payload.ref;if(!v){S({type:"response",ok:!1,error:"Missing bounds observer target"});return}let R=U(e.document,v,t.getCurrentDocument?.()??null);if(!R){S({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}s?.(),s=tr(e,R,v,t.getDocumentEntry,A=>j({kind:"node-bounds-change",payload:{hit:A}})),S({type:"response",ok:!0,result:{observing:!0}}),j({kind:"node-bounds-change",payload:{hit:O(R,v,t.getDocumentEntry,"summary")}});return}if(l.kind==="clear-node-bounds-observer"){s?.(),s=null,S({type:"response",ok:!0,result:{cleared:!0}});return}if(l.kind!=="hit-test-at-point"&&l.kind!=="start-text-edit-at-point")return;let M=Number(l.payload?.x),V=Number(l.payload?.y);if(!Number.isFinite(M)||!Number.isFinite(V)){S({type:"response",ok:!1,error:"Invalid text edit point"});return}let z=l.kind==="hit-test-at-point"?Se(e.document,M,V,t.getCurrentDocument?.()??null):Hn(e.document,M,V,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!z){S({type:"response",ok:!1,error:l.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let H=l.kind==="start-text-edit-at-point"?z:null,G=l.kind==="hit-test-at-point"?z:H.element,ee=l.payload.detailLevel??"full",te=ee==="full"?F(e.document,G,t.getCurrentDocument?.()??null):it(e.document,G,t.getCurrentDocument?.()??null),E=H&&typeof H.textSegmentIndex=="number"?{...te,textSegmentIndex:H.textSegmentIndex}:te,zt=O(G,E,t.getDocumentEntry,ee);if(l.kind==="hit-test-at-point"){S({type:"response",ok:!0,result:zt});return}y(),n=Ir(e,G,E,v=>{P.postMessage(re({type:"event",...v},{sessionKey:T}),N)},{...H?.textNode?{textNode:H.textNode}:{},onCommitSnapshot:v=>{r=v}}),S({type:"response",ok:!0,result:{ref:E}})}catch(M){S({type:"response",ok:!1,error:M instanceof Error?M.message:"Failed to start text edit"})}};return e.addEventListener("message",C),e.addEventListener(Fe,b),e.addEventListener(Me,x),()=>{y(),_(),i=null,k(),e.removeEventListener("message",C),e.removeEventListener(Fe,b),e.removeEventListener(Me,x)}}function ot(e){let t=e.kind;return t==="bridge-get-document"||t==="bridge-ensure-document-version"||t==="bridge-get-object-summary"||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"}async function Pn({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:o,onBridgeRequestError:s,windowLike:i}){let a=i.__VCP_SITE_EDIT__;if(!a){n({type:"response",ok:!1,error:"Site edit bridge is not ready in preview frame"});return}try{switch(e.kind){case"bridge-get-document":n({type:"response",ok:!0,result:await a.getDocument(e.payload.routeId)});return;case"bridge-ensure-document-version":if(!Number.isFinite(Number(e.payload.minVersion))){n({type:"response",ok:!1,error:"Invalid document version"});return}n({type:"response",ok:!0,result:a.ensureDocumentVersion?await a.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await a.getDocument(e.payload.routeId)});return;case"bridge-get-object-summary":n({type:"response",ok:!0,result:await a.getObjectSummary(e.payload.key,e.payload.routeId)});return;case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await a.getObjectEditContext(e.payload.key,e.payload.routeId)});return;case"bridge-get-class-name-source":{let c=await a.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:Nn(c,e.payload.key,i.document,o?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await a.getSourceTree()});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await a.getSourceFile({path:e.payload.path})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await a.resolveSourceLocation({key:e.payload.key,routeId:e.payload.routeId})});return;case"bridge-execute":n({type:"response",ok:!0,result:await a.execute(e.payload.request)});return;case"bridge-undo":n({type:"response",ok:!0,result:await a.undo()});return;case"bridge-redo":n({type:"response",ok:!0,result:await a.redo()});return;case"bridge-subscribe":{let c=e.payload.subscriptionId;r.get(c)?.();let u=a.subscribe(f=>{t({kind:"bridge-event",payload:{event:f,subscriptionId:c}})});r.set(c,u),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let c=e.payload.subscriptionId;r.get(c)?.(),r.delete(c),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(c){s?.(c,e),n({type:"response",ok:!1,error:qn(c)})}}function Nn(e,t,n,r){if(!e.ok||!e.data.styleContext)return e;let o=U(n,{key:t},r),s=o?Dn(o):null;return s?{...e,data:{...e.data,styleContext:{...e.data.styleContext,computedStyle:{...e.data.styleContext.computedStyle??{},...s}}}}:e}function Dn(e){let t=e.ownerDocument.defaultView;if(!t)return null;let n=t.getComputedStyle(e);return{color:n.color,backgroundColor:n.backgroundColor,borderColor:n.borderColor}}function Bn(e,t,n=()=>e.location.pathname){let r=e.history.pushState,o=e.history.replaceState,s=n(),i=()=>{let u=n();u!==s&&(s=u,t())},a=()=>i(),c=()=>i();return e.history.pushState=function(...f){let m=r.apply(this,f);return i(),m},e.history.replaceState=function(...f){let m=o.apply(this,f);return i(),m},e.addEventListener("popstate",a),e.addEventListener("hashchange",c),()=>{e.history.pushState=r,e.history.replaceState=o,e.removeEventListener("popstate",a),e.removeEventListener("hashchange",c)}}function An(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function dt(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function ft(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function On(e,t){e.dispatchEvent(new CustomEvent(Fe,{detail:t}))}function Fn(e,t){e.dispatchEvent(new CustomEvent(Me,{detail:t}))}function Mn(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function Kn(e,t){return e.routeId===t}function qe(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function pt(e){let t=qe(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function qn(e){let t=qe(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":pt(t)?"Site edit bridge disconnected":t}function J(e){let t=e instanceof Error?e.message:typeof e=="string"?e:"";return/authentication|auth failed|auth rejected|bridge key|session|unauthorized|forbidden|expired/i.test(t)}function ht(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function we(e){return yn.has(gt(e))}function wn(e){return bn.has(gt(e))}function mt(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:wn(e.tagName),canInsertChild:we(e.tagName),canMove:!1,canRemove:!1}}function gt(e){return e?.trim().toLowerCase()??""}function st(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 jn(e,t,n){let r=U(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let o=Wn(r,t.ref.textSegmentIndex);return o?(o.nodeValue=t.initialText,!0):!1}return typeof t.initialHtml=="string"?(r.innerHTML=t.initialHtml,!0):(r.textContent=t.initialText,!0)}function Wn(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!be(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function Hn(e,t,n,r,o){let s=Se(e,t,n,r),i=yt(s);if(!i)return null;let a=i.getAttribute("data-vcp-edit-key")??"",c=F(e,i,r),u=o?.(c.key)??o?.(a);if(!mt({operationSummary:u?.operationSummary,tagName:i.tagName,fallbackMode:"preview"}).canUpdateText)return null;let m=Un(e,t,n,i);if(m){let g=$n(i,m);if(g!==null)return{element:i,textNode:m,textSegmentIndex:g}}return(u?.childKeys.length??0)===0?{element:i}:null}function Un(e,t,n,r){let o=Vn(e,t,n);return!o||o.parentElement!==r?null:o}function Vn(e,t,n){let r=e,s=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(be(s))return s;let a=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return be(a)?a:null}function $n(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!be(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function be(e){return e?.nodeType===3}function Se(e,t,n,r=null){let o=typeof e.elementsFromPoint=="function"?e.elementsFromPoint(t,n):[e.elementFromPoint(t,n)].filter(Boolean);for(let s of o){let i=yt(s),a=i?.getAttribute("data-vcp-edit-key")??"";if(i&&Xn(i,r,a))return i}return null}function yt(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if(je(t))return n??t;!Gn(r)&&!n&&(n=t)}t=t.parentElement}return n}function je(e){return e.getAttribute(gn)!==null}function Gn(e){return zn(e.split("::")[0]??"")}function zn(e){if(!e)return!1;let t=Jn(e);return t===he||t.startsWith(`${he}/`)||t.includes(`/${he}/`)||t.endsWith(`/${he}`)}function Jn(e){let n=(e.split("?")[0]??e).replace(/\\/g,"/").replace(/^\.\//,""),r=[];for(let o of n.split("/"))if(!(!o||o===".")){if(o===".."){r.pop();continue}r.push(o)}return r.join("/")}function F(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",o=bt(Et(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${_t(r)}"]`))),n,r);if(o.length<=1)return{key:at(n,r,0)};let s=o.indexOf(t);return s>=0?{key:at(n,r,s),instanceIndex:s,instanceCount:o.length}:{key:r}}function it(e,t,n){return F(e,t,n)}function U(e,t,n){let r=ie(t.key)??t.key,o=bt(Et(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${_t(r)}"]`))),n,t.key);if(o.length===0)return null;let s=typeof t.instanceIndex=="number"&&t.instanceIndex>=0&&t.instanceIndex<o.length?t.instanceIndex:null,i=(ie(t.key)??t.key)!==t.key;if(s!==null&&!i)return o[s]??null;let a=Yn(n,t.key);return a!==null&&a>=0&&a<o.length?o[a]??null:s!==null?o[s]??null:o[0]??null}function at(e,t,n){return We(e,t)[n]?.key??t}function Yn(e,t){let n=ie(t);if(!n)return null;let o=We(e,n).findIndex(s=>s.key===t);return o>=0?o:null}function We(e,t){return(e?.entries??[]).filter(n=>(ie(n.key)??n.key)===t)}function bt(e,t,n){let r=St(t,n);return r?e.filter(o=>o.tagName.toLowerCase()===r):e}function Xn(e,t,n){let r=St(t,n);return!r||e.tagName.toLowerCase()===r}function St(e,t){let n=ie(t)??t,o=(e?.entries.find(s=>s.key===t)??We(e,n)[0])?.tag.trim();return!o||o!==o.toLowerCase()?null:o}var Qn=2,Zn=4;function Et(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&Zn)!==0?-1:(r&Qn)!==0?1:0})}function ie(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(rt);if(n<0)break;let r=Number(t.slice(n+rt.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function Ln(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=o=>{let s=Number.parseFloat(o??"");return Number.isFinite(s)&&s>0?s:0};return{marginTop:r(n?.marginTop),marginRight:r(n?.marginRight),marginBottom:r(n?.marginBottom),marginLeft:r(n?.marginLeft),paddingTop:r(n?.paddingTop),paddingRight:r(n?.paddingRight),paddingBottom:r(n?.paddingBottom),paddingLeft:r(n?.paddingLeft),borderTopWidth:r(n?.borderTopWidth),borderRightWidth:r(n?.borderRightWidth),borderBottomWidth:r(n?.borderBottomWidth),borderLeftWidth:r(n?.borderLeftWidth),columnGap:r(n?.columnGap),rowGap:r(n?.rowGap)}}function er(e){return Array.from(e.children).filter(t=>typeof t.getBoundingClientRect=="function").map(t=>or(t.getBoundingClientRect())).filter(t=>t.width>0&&t.height>0)}function O(e,t,n,r="full"){let o=e.getBoundingClientRect(),s=n?.(t.key)??null,i=e.tagName.toLowerCase(),a=Ee(e),c=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([y,_])=>[y,_??""])),attributes:Object.fromEntries(e.getAttributeNames().map(y=>[y,e.getAttribute(y)??""]))}:{},u=mt({operationSummary:s?.operationSummary,tagName:i,fallbackMode:"preview"}),f=je(e),m=!!(s&&/^[A-Z]/.test(s.tag)),g=!s||!m;return{ref:t,key:t.key,detailLevel:r,tagName:i,...s?{sourceKind:m?"component-call":"jsx"}:{},...m&&s?.tag?{componentName:s.tag}:{},...s?.parentKey?{parentKey:s.parentKey}:{},...c,runtimeFlags:{selectable:!0,movable:u.canMove,removable:u.canRemove,textEditable:u.canUpdateText,container:f?!1:(s?.childKeys.length??0)>0||u.canInsertChild||g&&we(i)},layout:a,rect:{top:o.top,left:o.left,width:o.width,height:o.height},childRects:er(e),spacing:Ln(e)}}function tr(e,t,n,r,o){let s=O(t,n,r,"summary"),i=null,a=()=>{i===null&&(i=dt(e,c))},c=()=>{if(i=null,"isConnected"in t&&!t.isConnected)return;let _=O(t,n,r,"summary");nr(s,_)&&(s=_,o(_))},u=e.ResizeObserver,f=typeof u=="function"?new u(a):null;f?.observe(t);let m=e.MutationObserver,g=typeof m=="function"?new m(a):null;g?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",a,{passive:!0});let y=e.visualViewport;return y?.addEventListener?.("resize",a,{passive:!0}),e.document.addEventListener("load",a,!0),()=>{i!==null&&(ft(e,i),i=null),f?.disconnect(),g?.disconnect(),e.removeEventListener("resize",a),y?.removeEventListener?.("resize",a),e.document.removeEventListener("load",a,!0)}}function nr(e,t){return vt(e.rect,t.rect)||rr(e.childRects,t.childRects)||ct(e.spacing,t.spacing)||ct(e.layout,t.layout)}function rr(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((o,s)=>vt(o,r[s]??o))}function ct(e,t){let n=e??{},r=t??{},o=new Set([...Object.keys(n),...Object.keys(r)]);return Array.from(o).some(s=>n[s]!==r[s])}function or(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function vt(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 sr(e,t,n,r,o,s,i){let a=e.document,c=Se(a,t,n,s);if(!c)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let u=o?U(a,o,s):null;if(u&&Ke(c,u))return me(a,c,"self-or-descendant",s,i);if(r==="move"&&u){let I=ur(a,c,u,s,i);if(I){let D=Ae(I.child,I.targetParent,t,n,"nearest");if(D)return ge(a,I.child,I.targetParent,D,s,i)}}let f=null,m=!1,g=c,y=c.parentElement;for(;y;){if(y.getAttribute("data-vcp-edit-key")){if(u&&Ke(y,u))return me(a,c,"self-or-descendant",s,i);let I=ut(y,r,i);if(I==="accept"){f={child:g,targetParent:y};break}I==="blocked"&&(m=!0),g=y}y=y.parentElement}let _=ut(c,r,i);if(_==="accept"){if(f){let I=Ae(f.child,f.targetParent,t,n,"edge");if(I)return ge(a,f.child,f.targetParent,I,s,i)}return ge(a,c,c,ir(c,t,n),s,i)}if(f){let I=Ae(f.child,f.targetParent,t,n,"nearest");return ge(a,f.child,f.targetParent,I??"after",s,i)}return _==="blocked"||m?me(a,c,"operation-boundary-blocked",s,i):me(a,c,"no-accepting-parent",s,i)}function me(e,t,n,r,o){return{anchorHit:O(t,F(e,t,r),o,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function ge(e,t,n,r,o,s){let i=O(t,F(e,t,o),s,"summary"),a=O(n,F(e,n,o),s,"summary"),c=Ee(n).indicatorOrientation,u=r==="append"||r==="prepend"?ar(n.getBoundingClientRect(),c,r):cr(t.getBoundingClientRect(),c,r);return{anchorHit:i,targetParentHit:a,relation:r,indicatorOrientation:c,indicatorBounds:u}}function ut(e,t,n){if(je(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",o=n?.(r)??null;if(o)return o.operationSummary.canInsertChild===!0?"accept":o.childKeys.length>0?"blocked":"not-container";let s=e.tagName.toLowerCase();return we(s)?"accept":"not-container"}function Ae(e,t,n,r,o){let s=Ee(t).indicatorOrientation,i=e.getBoundingClientRect(),a=s==="vertical"?i.width>0?(n-i.left)/i.width:.5:i.height>0?(r-i.top)/i.height:.5;return o==="edge"&&a>=.25&&a<=.75?null:a<.5?"before":"after"}function ir(e,t,n){let r=Ee(e).indicatorOrientation,o=e.getBoundingClientRect();return(r==="vertical"?o.width>0?(t-o.left)/o.width:.5:o.height>0?(n-o.top)/o.height:.5)<.5?"prepend":"append"}function Ee(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=n?.display??"",o=n?.flexDirection,s=n?.gridAutoFlow,i="horizontal";return r==="flex"||r==="inline-flex"?i=(o??"row").startsWith("row")?"vertical":"horizontal":(r==="grid"||r==="inline-grid")&&(i=(s??"row").includes("column")?"vertical":"horizontal"),{display:r,...o?{flexDirection:o}:{},...s?{gridAutoFlow:s}:{},indicatorOrientation:i}}function ar(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 cr(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 Ke(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function ur(e,t,n,r,o){let s=lr(e,t,n,r,o);if(s)return s;let i=fr(n);if(!i||t===i)return null;let a=t,c=t.getAttribute("data-vcp-edit-key")?t:null;for(;a&&a!==i;)a.getAttribute("data-vcp-edit-key")&&(c=a),a=a.parentElement;return a!==i||!c||c===i||c===n||Ke(c,n)?null:{child:c,targetParent:i}}function lr(e,t,n,r,o){if(!o)return null;let s=F(e,n,r),a=o(s.key)?.parentKey??null;if(!a)return null;let u=F(e,t,r).key;for(;u;){let f=o(u);if(!f?.parentKey)return null;if(f.parentKey===a){if(u===s.key||dr(u,s.key,o))return null;let m=U(e,{key:u},r),g=U(e,{key:a},r);return m&&g?{child:m,targetParent:g}:null}u=f.parentKey}return null}function dr(e,t,n){let r=e;for(;r;){if(r===t)return!0;r=n(r)?.parentKey}return!1}function fr(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function ye(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:w(e.scrollX),scrollY:w(e.scrollY),scrollWidth:Math.max(w(t?.scrollWidth),w(n?.scrollWidth),w(e.innerWidth)),scrollHeight:Math.max(w(t?.scrollHeight),w(n?.scrollHeight),w(e.innerHeight)),viewportWidth:w(e.innerWidth),viewportHeight:w(e.innerHeight)}}function pr(e,t){Object.entries(t.attributes??{}).forEach(([r,o])=>{if(o===null){e.removeAttribute(r);return}e.setAttribute(r,o)}),typeof t.className=="string"&&(e.className=t.className);let n=new Set(t.styleDeclarations?.map(r=>r.property)??[]);Object.entries(t.style??{}).forEach(([r,o])=>{if(n.has(r))return;let s=e.style,i=r.replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`);if(o==null||o===""){s.removeProperty(i);return}s.setProperty(i,String(o))}),t.styleDeclarations?.forEach(r=>{let o=e.style,s=r.property.replace(/[A-Z]/g,a=>`-${a.toLowerCase()}`),i=r.value;if(i==null||i===""){o.removeProperty(s);return}o.setProperty(s,String(i),r.priority)})}var hr=500,oe=new Map;function mr(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function gr(e,t){if(oe.size>=hr){let n=oe.keys().next().value;n&&oe.delete(n)}oe.set(e,t)}var se=new Set;function yr(e,t){let n=e.documentElement?.style,r=new Set;for(let[o,s]of Object.entries(t.variables??{}))o.startsWith("--")&&(r.add(o),n?.setProperty(o,s));for(let o of se)r.has(o)||n?.removeProperty(o);se.clear();for(let o of r)se.add(o);Rr(e,t.stylesheets??[])}function br(e){let t=e.documentElement?.style;for(let n of se)t?.removeProperty(n);se.clear();for(let n of xt(e))n.remove()}function Sr(e,t){let n=Array.from(new Set(t.filter(i=>typeof i=="string"&&i.startsWith("--"))));if(n.length===0)return{};let r=e.documentElement,o=r?e.defaultView?.getComputedStyle(r):null,s={};for(let i of n){let a=Rt(o,i);a&&(s[i]=a)}return s}function Rt(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return It(e,r,n)}function It(e,t,n){if(!t)return null;let r=Er(t);if(!r)return t;let o=Rt(e,r.name,n);return o||(r.fallback?It(e,r.fallback,n)??r.fallback:null)}function Er(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=vr(n),o=r>=0?n.slice(0,r).trim():n;if(!o.startsWith("--"))return null;let s=r>=0?n.slice(r+1).trim():null;return{name:o,fallback:s||null}}function vr(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 Rr(e,t){let n=new Set(t.filter(s=>typeof s=="string"&&s.length>0)),r=new Map;for(let s of xt(e)){let i=s.getAttribute("href")??"";if(!n.has(i)||r.has(i)){s.remove();continue}r.set(i,s)}let o=e.head;if(o)for(let s of n){if(r.has(s))continue;let i=e.createElement("link");i.setAttribute("rel","stylesheet"),i.setAttribute(lt,"true"),i.setAttribute("href",s),o.appendChild(i)}}function xt(e){return Array.from(e.querySelectorAll(`link[${lt}]`))}function Ir(e,t,n,r,o={}){let s=o.textNode?xr(e.document,o.textNode):null;if(o.textNode&&!s)throw new Error("Failed to prepare text segment editor");let i=s?.element??t,a=i.textContent??"",c=s?void 0:t.innerHTML,u=_r(i),f=!1,m=()=>{e.document.removeEventListener("pointerdown",y,!0),i.removeEventListener("keydown",_),i.removeEventListener("blur",I),i.removeEventListener("input",D),Tr(i,u)},g=k=>{if(f)return;f=!0;let K=i.textContent??"";if(m(),k==="cancel"){s?.restore(a),s||(t.textContent=a),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(s?.restore(K),k==="commit"&&K!==a){o.onCommitSnapshot?.({ref:n,initialText:a,...c!==void 0?{initialHtml:c}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:K}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function y(k){let K=k.target;K&&i.contains(K)||g("commit")}function _(k){if(k.key==="Escape"){k.preventDefault(),g("cancel");return}k.key==="Enter"&&(k.metaKey||k.ctrlKey)&&(k.preventDefault(),g("commit"))}function I(){g("commit")}function D(){r({kind:"text-edit-input",payload:{ref:n,hit:O(t,n,void 0,"full")}})}return Cr(i),e.document.addEventListener("pointerdown",y,!0),i.addEventListener("keydown",_),i.addEventListener("blur",I),i.addEventListener("input",D),Nr(i),Dr(i,e.document),m}function xr(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(o){t.nodeValue=o,r.parentNode&&r.parentNode.replaceChild(t,r)}}}function _r(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 Cr(e){kr(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 Tr(e,t){Oe(e,"contenteditable",t.contentEditable),Oe(e,"spellcheck",t.spellcheck),Oe(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function kr(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 Oe(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function Pr(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 Nr(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function Dr(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function _t(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function w(e){let t=Number(e);return Number.isFinite(t)?t:0}import Br from"node:http";import{randomBytes as Ar,timingSafeEqual as Or}from"node:crypto";import Fr from"node:path";import{WebSocket as Nt,WebSocketServer as Mr}from"ws";import{createPreviewSiteEditEngineRuntime as Kr}from"@vcp-dev/site-edit-engine";import{resolveNextAppRouteId as qr,scanNextAppRouterRoutes as wr}from"@vcp-dev/site-edit-engine/next-app-router";import{SiteEditSourceWatcher as jr}from"@vcp-dev/site-edit-engine/source-watcher";import{SiteEditOperationRequestSchema as Wr}from"@vcp-dev/contracts";var Hr="127.0.0.1",Ur=30218,Vr="/__vcp/site-edit/bridge",$r=6*1024*1024,Gr=3e3,Ct=50,Tt="__VCP_SITE_EDIT_BRIDGE_SERVERS__";function hs(e){let t=Bt(e),n=Ot(t),r=At(),o=r.get(n);if(o)return o;let s=new ve(t);r.set(n,s);try{s.start()}catch(i){throw r.delete(n),s.stop(),i}return s}function Dt(e,t){let n=new ve(Bt(t),e,!1);return n.start({listen:!1}),n}var ve=class{constructor(t,n=Br.createServer((o,s)=>{s.writeHead(404),s.end("VCP site edit bridge server")}),r=!0){this.options=t,this.server=n,this.closeHttpServerOnStop=r,this.runtime=null,this.routes=[],this.stopWatching=null,this.stopWebSocketServer=null,this.pendingChangedFiles=new Set,this.fileChangeTimer=null,this.isStarted=!1}start(t={}){if(this.isStarted)return;this.refreshRoutes(),this.runtime=Kr({siteId:this.options.siteId,snapshotId:this.options.snapshotId,projectRoot:this.options.projectRoot,routes:this.routes});let n=zr({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 jr({projectRoot:this.options.projectRoot,watch_dirs:this.options.runtime.watch_dirs,debounce_ms:this.options.runtime.watch_debounce_ms??Ct,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),this.isStarted=!0}getHealth(){let t=!!this.runtime;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.closeHttpServerOnStop&&this.server.close();let t=At(),n=Ot(this.options);t.get(n)===this&&t.delete(n),this.isStarted=!1}createBridgeEngine(){return{getDocument:async t=>{let{runtime:n,resolvedRouteId:r}=await this.activateRoute(t);return n.getDocument(r)},getObjectSummary:async(t,n)=>this.getRuntime().getObjectSummary(t,n?this.resolveRouteId(n):void 0),getObjectEditContext:async(t,n)=>this.getRuntime().getObjectEditContext(t,n?this.resolveRouteId(n):void 0),getClassNameSource:async(t,n)=>{let r=this.getRuntime(),o=n?this.resolveRouteId(n):void 0;return await r.refreshSourceForKey(t,o),r.getClassNameSource(t,o)},getSourceTree:async()=>this.getRuntime().getSourceTree(),getSourceFile:async t=>this.getRuntime().getSourceFile(t),resolveSourceLocation:async t=>this.getRuntime().resolveSourceLocation({key:t.key,routeId:t.routeId?this.resolveRouteId(t.routeId):void 0}),execute:async t=>this.getRuntime().executeOperation(this.normalizeRequest(t)),undo:async()=>this.getRuntime().undo(),redo:async()=>this.getRuntime().redo(),subscribe:t=>this.getRuntime().subscribe(t)}}async activateRoute(t){let n=this.getRuntime(),r=this.resolveRouteId(t);return await n.setActiveRoute(r),{runtime:n,resolvedRouteId:r}}normalizeRequest(t){return t.target.kind!=="route"?t.routeId?{...t,routeId:this.resolveRouteId(t.routeId)}:t:{...t,target:{...t.target,routeId:this.resolveRouteId(t.target.routeId)}}}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??Ct;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));this.pendingChangedFiles.clear(),this.refreshRoutes();for(let n of t)this.runtime?.notifyFileChanged(n)}refreshRoutes(){let t=this.options.runtime.routes?.length?this.options.runtime.routes:wr(this.options.projectRoot),n=new Map(this.routes.map(o=>[o.routeId,o.entryFile])),r=new Set(t.map(o=>o.routeId));this.routes=t;for(let o of t)n.get(o.routeId)!==o.entryFile&&this.runtime?.registerRoute(o.routeId,o.entryFile);for(let o of n.keys())r.has(o)||this.runtime?.unregisterRoute(o)}resolveRouteId(t){let n=qr(t,this.routes,this.options.basePath);if(!n)throw new Error(`Route is not indexed by the preview bridge: ${t}`);return n}getRuntime(){if(!this.runtime)throw new Error("VCP site edit preview bridge runtime is not ready");return this.runtime}};function Bt(e){return{siteId:e.siteId,snapshotId:e.snapshotId,projectRoot:Fr.resolve(e.projectRoot??process.cwd()),basePath:e.basePath??"",host:e.host??Hr,port:e.port??Ur,path:e.path??Vr,sessionKey:e.sessionKey??eo(),allowedOrigins:e.allowedOrigins??[],runtime:e.runtime??{}}}function At(){let e=globalThis;return e[Tt]??=new Map,e[Tt]}function Ot(e){return`${e.projectRoot}:${e.host}:${e.port}:${e.path}`}function zr(e){let t=new Mr({maxPayload:$r,noServer:!0}),n=new WeakSet,r=s=>{new fe({socket:new Ue(s),engine:e.engine,validateOperationRequest:i=>Wr.safeParse(i).success})},o=(s,i,a)=>{if(!Jr(s,e))return;let c=Yr(s,e);if(!c){i.write(`HTTP/1.1 401 Unauthorized\r
|
|
1
|
+
function Pe(e){let t=new Map,n=[],r=new Map,i=[],o=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],s=new Map(o.map((l,f)=>[l,f])),a=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(l=>({placementKey:l.placementKey,placementUnitKey:l.placementUnitKey,relation:l.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},u=l=>{let f=t.get(l);if(typeof f=="number")return f;let y=n.length;return n.push(l),t.set(l,y),y},c=l=>{let f=null;for(let y of dn(l)){let g=`${f??"root"}\0${y}`,C=r.get(g);if(typeof C=="number"){f=C;continue}let I=i.length;i.push([f,u(y)]),r.set(g,I),f=I}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,routeId:e.routeId,version:e.version,pageComposition:a,tokens:n,nodes:i,entries:e.entries.map(l=>{let f=l.pageCompositionUnitKey?s.get(l.pageCompositionUnitKey)??-1:-1;if(l.pageCompositionUnitKey&&f<0)throw new Error(`Render entry ${l.key} references unknown page composition unit ${l.pageCompositionUnitKey}`);return[c(l.key),un(l.operationSummary),...f>=0?[f]:[]]})}}function Ne(e){if(!ln(e))return e;let t=new Map,n=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=i=>{let o=t.get(i);if(o)return o;let s=e.nodes[i];if(!s)throw new Error(`Missing compact document node ${i}`);let[a,u]=s,c=e.tokens[u];if(typeof c!="string")throw new Error(`Missing compact document token ${u}`);let l=`${a===null?"":r(a)}${c}`;return t.set(i,l),l};return{siteId:e.siteId,snapshotId:e.snapshotId,routeId:e.routeId,version:e.version,pageComposition:e.pageComposition,entries:e.entries.map(i=>{let[o,s,a]=i,u=a===void 0?void 0:n[a];if(a!==void 0&&!u)throw new Error(`Missing page composition unit ${a}`);return{key:r(o),...u?{pageCompositionUnitKey:u}:{},operationSummary:cn(s)}})}}function un(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function cn(e){return{canUpdateText:(e&1)!==0,canInsertChild:(e&2)!==0,canMove:(e&4)!==0,canRemove:(e&8)!==0}}function ln(e){return typeof e=="object"&&e!==null&&"encoding"in e&&e.encoding==="segment-trie-v1"}function dn(e){if(!e)return[];let t=[],n=0,r=Le(e,n);if(r<0)return t.push(e),t;for(t.push(e.slice(0,r)),n=r;n<e.length;){if(r=Le(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 Le(e,t){let n=e.indexOf("/",t),r=e.indexOf("::",t);return n<0?r:r<0?n:Math.min(n,r)}var B=class e{constructor(){}static parseMessage(t,n={}){let r=JSON.parse(t);if(!e.isMessage(r,n))throw new Error("Invalid site edit bridge message");return r}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(typeof t=="object"&&t!==null&&"payload"in t&&typeof t.payload=="object"&&t.payload!==null){let n=t.payload,r=typeof n.id=="string"?n.id:"unknown",i=e.isRequestKind(n.kind)?n.kind:"get-document";return{id:r,kind:i}}return{id:"unknown",kind:"get-document"}}static isRequestKind(t){return t==="initialize-session"||t==="get-document"||t==="get-history-status"||t==="get-style-context"||t==="get-object-edit-context"||t==="get-class-name-source"||t==="get-source-tree"||t==="get-source-file"||t==="resolve-source-location"||t==="execute"||t==="undo"||t==="redo"}static isMessage(t,n={}){return!w(t)||typeof t.type!="string"?!1:t.type==="request"?e.isRequestPayload(t.payload,n):t.type==="response"||t.type==="error"?w(t.payload)&&typeof t.payload.id=="string":t.type==="event"?w(t.payload)&&w(t.payload.event):t.type==="auth"?w(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"?w(t.payload)&&t.payload.ok===!0:!1}static isRequestPayload(t,n={}){if(!w(t)||typeof t.id!="string"||!e.isRequestKind(t.kind))return!1;switch(t.kind){case"initialize-session":return typeof t.routeId=="string"&&(t.mutationContext===void 0||Be(t.mutationContext));case"get-document":case"get-style-context":return typeof t.routeId=="string";case"get-object-edit-context":case"get-class-name-source":case"resolve-source-location":return typeof t.key=="string"&&(t.routeId===void 0||typeof t.routeId=="string");case"get-history-status":return t.mutationContext===void 0;case"get-source-tree":return!0;case"get-source-file":return typeof t.path=="string";case"execute":return hn(t.request)&&(t.request.mutationContext===void 0||Be(t.request.mutationContext))&&(n.validateOperationRequest?.(t.request)??!0);case"undo":case"redo":return t.mutationContext===void 0||Be(t.mutationContext)}}},fe=class{constructor(t){this.options=t,this.messageQueue=new Fe,this.eventDispatcher=new Ae(n=>{this.sendJson(n)}),this.unsubscribe=t.engine.subscribe(n=>{this.eventDispatcher.push(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()}}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=await this.options.engine.initializeSession({routeId:r.routeId,...r.mutationContext?{mutationContext:r.mutationContext}:{}});this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:{ok:!0,data:{document:Pe(o.data.document),historyStatus:o.data.historyStatus}}}});return}case"get-document":this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:{ok:!0,data:Pe((await this.options.engine.getDocument(r.routeId)).data)}}});return;case"get-history-status":this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:await this.options.engine.getHistoryStatus()}});return;case"get-style-context":this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:await this.options.engine.getStyleContext(r.routeId)}});return;case"get-object-edit-context":this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:await this.options.engine.getObjectEditContext(r.key,r.routeId)}});return;case"get-class-name-source":this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:await this.options.engine.getClassNameSource(r.key,r.routeId)}});return;case"get-source-tree":this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:await this.options.engine.getSourceTree()}});return;case"get-source-file":this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:await this.options.engine.getSourceFile({path:r.path})}});return;case"resolve-source-location":this.sendJson({type:"response",payload:{id:i,kind:r.kind,result:await this.options.engine.resolveSourceLocation({key:r.key,routeId:r.routeId})}});return;case"execute":{await this.handleBufferedOperation(i,r.kind,()=>this.options.engine.execute(r.request));return}case"undo":await this.handleBufferedOperation(i,r.kind,()=>this.options.engine.undo());return;case"redo":await this.handleBufferedOperation(i,r.kind,()=>this.options.engine.redo());return}}catch(n){let r=B.extractRequestInfo(t);this.sendJson({type:"error",payload:{...r,message:tt(n),code:et(n)}})}}async handleRawMessage(t){try{await this.handleMessage(B.parseMessage(t,{validateOperationRequest:this.options.validateOperationRequest}))}catch(n){let r=n instanceof Error?n.message:"Invalid websocket message",i=pn(t);this.sendJson({type:"error",payload:{...i,message:r}})}}sendJson(t){this.options.socket.send(B.stringifyMessage(t))}async handleBufferedOperation(t,n,r){this.eventDispatcher.beginBuffering();try{let i=await r();this.sendJson({type:"response",payload:{id:t,kind:n,result:i}}),this.eventDispatcher.flush()}catch(i){this.sendJson({type:"error",payload:{id:t,kind:n,message:tt(i),code:et(i)}}),this.eventDispatcher.flush()}}},Ae=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)})}},Fe=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 w(e){return typeof e=="object"&&e!==null}function hn(e){return w(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&(e.routeId===void 0||typeof e.routeId=="string")&&typeof e.kind=="string"&&w(e.target)&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&w(e.params)}function Be(e){return fn(e)}function et(e){if(!e||typeof e!="object")return;let t=e.code;return typeof t=="string"&&t.length>0?t:void 0}function tt(e){if(e instanceof Error)return e.message;if(!e||typeof e!="object")return"Unknown websocket operation failure";let t=e.message;return typeof t=="string"&&t.length>0?t:"Unknown websocket operation failure"}function fn(e){return w(e)?typeof e.editingSessionId=="string"&&e.editingSessionId.length>0&&typeof e.lockId=="string"&&e.lockId.length>0&&typeof e.ownerId=="string"&&e.ownerId.length>0&&typeof e.leaseAssertion=="string"&&e.leaseAssertion.length>0:!1}function pn(e){try{return B.extractRequestInfo(JSON.parse(e))}catch{return{id:"unknown",kind:"get-document"}}}var mn="vcp:designer:trace",gn="designer_trace",nt="__VCP_DESIGNER_TRACE__";var yn=/(authorization|cookie|token|secret|providerTrace|headers?|sourceCode|rawSource|fullSource)/i;function bn(e=globalThis){let t=e;try{if(t.localStorage?.getItem(mn)==="1")return!0}catch{}try{let n=t.location?.search??"";return new URLSearchParams(n).get(gn)==="1"}catch{return!1}}function W(e,t={},n=globalThis){if(!bn(n))return;let r={type:e,timestamp:Date.now(),payload:Sn(t)},i=n,o=i[nt]??[];o.push(r),o.length>200&&o.splice(0,o.length-200),i[nt]=o;let s=n.console?.debug;typeof s=="function"&&s.call(n.console,"[designer-trace]",r)}function Sn(e){return Me(e,0)}function Me(e,t){if(t>4)return"[truncated]";if(Array.isArray(e))return e.map(r=>Me(r,t+1));if(!e||typeof e!="object")return e;let n={};for(let[r,i]of Object.entries(e)){if(yn.test(r)){n[r]="[redacted]";continue}n[r]=Me(i,t+1)}return n}var pe=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===Oe&&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(a){let u=re(a,"WebSocket failed");this.socket=null,this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("failed",u.message),n(u);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=(a,u)=>{this.cleanupSocket(r,a,u)};r.onopen=()=>{if(!(this.socket!==r||this.connectAttempt!==i)){if(this.options.authKey){try{r.send(B.stringifyMessage({type:"auth",payload:{key:this.options.authKey}}))}catch(a){s(re(a,"WebSocket auth failed"),"failed")}return}o()}},r.onerror=a=>{if(this.socket!==r)return;let u=re(a,"WebSocket failed");s(u,"failed")},r.onmessage=a=>{if(this.socket===r){if(this.options.authKey&&this.connectAttempt===i&&!i.settled){this.handleAuthHandshakeMessage(a.data,r,i,()=>{o()});return}this.handleMessage(a.data)}},r.onclose=a=>{if(this.socket!==r)return;let u=this.intentionalClose,c=new Error(xn(a,{intentional:u}));s(c,u?"closed":"failed")}}),this.connectPromise)}disconnect(){this.intentionalClose=!0,this.setConnectionState("closing");let t=this.socket;if(!t){this.rejectAll(new Error("WebSocket disconnected")),this.connectAttempt=null,this.connectPromise=null,this.setConnectionState("closed");return}this.cleanupSocket(t,new Error("WebSocket disconnected"),"closed")}getConnectionState(){return this.connectionState}subscribeConnectionStatus(t){return this.connectionStatusListeners.add(t),t({state:this.connectionState}),()=>{this.connectionStatusListeners.delete(t)}}getDocument(t){return this.request("get-document",{routeId:t})}initializeSession(t){return this.request("initialize-session",t)}getHistoryStatus(){return this.request("get-history-status",{})}getStyleContext(t){return this.request("get-style-context",{routeId:t})}getObjectEditContext(t,n){return this.request("get-object-edit-context",{key:t,routeId:n})}getClassNameSource(t,n){return this.request("get-class-name-source",{key:t,routeId:n})}getSourceTree(){return this.request("get-source-tree",{})}getSourceFile(t){return this.request("get-source-file",t)}resolveSourceLocation(t){return this.request("resolve-source-location",t)}execute(t,n){return this.request("execute",{request:t})}undo(t){return this.request("undo",{})}redo(t){return this.request("redo",{})}subscribe(t){return this.listeners.add(t),()=>{this.listeners.delete(t)}}request(t,n){let r=this.socket;if(!r||r.readyState!==Oe||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=_n(i,t,n);return W("bridge.request",{id:i,kind:t,routeId:typeof n.routeId=="string"?n.routeId:null,key:typeof n.key=="string"?n.key:null,operationKind:rt(n.request,"kind"),documentVersion:rt(n.request,"documentVersion")}),new Promise((s,a)=>{let u=this.resolveRequestTimeoutMs(t),c=u>0?setTimeout(()=>{let l=this.pending.get(i);l&&(this.pending.delete(i),W("bridge.response",{id:i,kind:t,ok:!1,timedOut:!0}),l.reject(new Error(`Bridge request timed out after ${u}ms: ${t}`)))},u):null;c?.unref?.(),this.pending.set(i,{kind:t,timeout:c,resolve:l=>s(l),reject:a});try{r.send(B.stringifyMessage(o))}catch(l){let f=re(l,"WebSocket send failed");this.clearPendingRequest(i),a(f),this.cleanupSocket(r,f,"failed")}})}handleAuthHandshakeMessage(t,n,r,i){try{if(B.parseMessage(t).type==="auth-ok"){i();return}throw new Error("Bridge authentication failed")}catch(o){let s=re(o,"Bridge authentication failed");this.connectAttempt===r&&this.cleanupSocket(n,s,"failed")}}handleMessage(t){let n=B.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"){W("bridge.response",{id:n.payload.id,kind:r.kind,ok:!1}),r.reject(new Error(n.payload.message));return}W("bridge.response",{id:n.payload.id,kind:r.kind,ok:!0,resultVersion:Cn(n.payload.result)}),r.resolve(r.kind==="get-document"?{...n.payload.result,data:Ne(n.payload.result.data)}:r.kind==="initialize-session"?Rn(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):In[t]??En}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===vn||t.readyState===Oe)&&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)}},vn=0,Oe=1,En=15e3,In={"get-source-tree":1e4,"get-source-file":1e4,"resolve-source-location":1e4,execute:6e4,undo:2e4,redo:2e4};function re(e,t){return e instanceof Error?e:new Error(t)}function xn(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 rt(e,t){if(!e||typeof e!="object")return null;let r=e[t];return typeof r=="string"||typeof r=="number"?r:null}function Cn(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 ot(e){return new we(e)}var we=class{constructor(t){this.params=t,this.refreshInFlight=null,this.objectGeneration=0,this.styleGeneration=0,this.editContextCache=new Map,this.editContextInFlight=new Map,this.classNameSourceCache=new Map,this.classNameSourceInFlight=new Map,this.styleContextCache=null,this.styleContextInFlight=null,this.currentDocument=t.initialDocument,this.observedDocumentVersion=t.initialDocument.version,this.sessionInitialized=!it(t.initialDocument)}async getDocument(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=it(this.currentDocument);return(n||this.currentDocument.version<this.observedDocumentVersion)&&(this.currentDocument=await this.refreshSnapshot(n?void 0:this.observedDocumentVersion,"get-document"),this.sessionInitialized=!0),{ok:!0,data:this.currentDocument}}async initializeSession(t){if(t.routeId!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t.routeId}`);if(!this.params.client.initializeSession)throw new Error("Site edit bridge client does not support initialize-session");let n=await this.params.client.initializeSession(t);return this.currentDocument=n.data.document,this.observedDocumentVersion=n.data.document.version,this.sessionInitialized=!0,this.clearObjectCaches(),n}async getHistoryStatus(){return this.params.client.getHistoryStatus()}async getStyleContext(t){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let n=this.styleContextCache;if(n?.generation===this.styleGeneration)return{ok:!0,data:n.value};let r=this.styleContextInFlight;if(r?.generation===this.styleGeneration)return r.request;let i=this.styleGeneration,o=this.params.client.getStyleContext(t).then(s=>(this.styleGeneration===i&&(this.styleContextCache={generation:i,value:s.data}),s)).finally(()=>{this.styleContextInFlight?.request===o&&(this.styleContextInFlight=null)});return this.styleContextInFlight={generation:i,request:o},o}async ensureDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);let r=await this.refreshSnapshot(n,"ensure-version");if(r.version<n)throw new Error(`Document refresh returned version ${r.version}, expected at least ${n}`);return{ok:!0,data:r}}async acknowledgeDocumentVersion(t,n){if(t!==this.params.routeId)throw new Error(`Site edit bridge is bound to route ${this.params.routeId}, received ${t}`);return n>this.currentDocument.version&&(this.currentDocument={...this.currentDocument,version:n},this.clearObjectCaches({preserveStyleContext:!0})),this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n),{ok:!0,data:this.currentDocument}}async getObjectEditContext(t,n){let r=this.objectCacheKey(t,n),i=this.editContextCache.get(r);if(i)return{ok:!0,data:i};let o=this.editContextInFlight.get(r);if(o)return o;let s=this.objectGeneration,a=this.params.client.getObjectEditContext(t,n??this.params.routeId).then(u=>(this.objectGeneration===s&&this.editContextCache.set(r,u.data),u)).finally(()=>{this.editContextInFlight.get(r)===a&&this.editContextInFlight.delete(r)});return this.editContextInFlight.set(r,a),a}async getClassNameSource(t,n){let r=this.objectCacheKey(t,n),i=this.classNameSourceCache.get(r);if(i)return i;let o=this.classNameSourceInFlight.get(r);if(o)return o;let s=this.objectGeneration,a=this.params.client.getClassNameSource(t,n??this.params.routeId).then(u=>(this.objectGeneration===s&&this.classNameSourceCache.set(r,u),u)).finally(()=>{this.classNameSourceInFlight.get(r)===a&&this.classNameSourceInFlight.delete(r)});return this.classNameSourceInFlight.set(r,a),a}async getSourceTree(){return this.params.client.getSourceTree()}async getSourceFile(t){return this.params.client.getSourceFile(t)}async resolveSourceLocation(t){return this.params.client.resolveSourceLocation({...t,routeId:t.routeId??this.params.routeId})}async execute(t,n){let r=t.target.kind==="node"&&!t.routeId?{...t,routeId:this.params.routeId}:t;return this.params.client.execute(r)}async undo(t){return this.params.client.undo()}async redo(t){return this.params.client.redo()}subscribe(t){return this.params.client.subscribe(n=>{if(n.type==="site-edit.document.changed"&&n.routeId===this.params.routeId&&this.sessionInitialized){this.observedDocumentVersion=Math.max(this.observedDocumentVersion,n.version),n.version>this.currentDocument.version&&this.clearObjectCaches(),t(n);return}t(n)})}async refreshSnapshot(t,n="ensure-version"){if(typeof t=="number"&&this.currentDocument.version>=t)return W("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,skipped:!0,source:n}),this.currentDocument;if(this.refreshInFlight){W("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!0,source:n});let i=await this.refreshInFlight;if(typeof t!="number"||i.version>=t||this.currentDocument.version>=t)return this.currentDocument}W("bridge.document-refresh",{routeId:this.params.routeId,minVersion:t,currentVersion:this.currentDocument.version,deduped:!1,source:n});let r=this.params.client.getDocument(this.params.routeId).then(i=>(this.currentDocument=i.data,this.observedDocumentVersion=Math.max(this.observedDocumentVersion,i.data.version),this.clearObjectCaches(),this.currentDocument));this.refreshInFlight=r;try{return await r}finally{this.refreshInFlight===r&&(this.refreshInFlight=null)}}clearObjectCaches(t){this.objectGeneration+=1,this.editContextCache.clear(),this.editContextInFlight.clear(),this.classNameSourceCache.clear(),this.classNameSourceInFlight.clear(),!t?.preserveStyleContext&&(this.styleGeneration+=1,this.styleContextCache=null,this.styleContextInFlight=null)}objectCacheKey(t,n){return`${n??this.params.routeId}\0${t}`}};function it(e){return e.version===0&&e.entries.length===0}function Rn(e){let t=e;return{...t,data:{...t.data,document:Ne(t.data.document)}}}function _n(e,t,n){switch(t){case"initialize-session":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId),...n.mutationContext?{mutationContext:n.mutationContext}:{}}};case"get-document":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-history-status":return{type:"request",payload:{id:e,kind:t}};case"get-style-context":return{type:"request",payload:{id:e,kind:t,routeId:String(n.routeId)}};case"get-object-edit-context":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-class-name-source":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"get-source-tree":return{type:"request",payload:{id:e,kind:t}};case"get-source-file":return{type:"request",payload:{id:e,kind:t,path:String(n.path)}};case"resolve-source-location":return{type:"request",payload:{id:e,kind:t,key:String(n.key),routeId:typeof n.routeId=="string"?n.routeId:void 0}};case"execute":return{type:"request",payload:{id:e,kind:t,request:n.request}};case"undo":case"redo":return{type:"request",payload:{id:e,kind:t,mutationContext:n.mutationContext}}}}var st="vcp-window-message",ho=1;function Tn(e){return{source:st,version:1,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function kn(e){if(typeof e!="object"||e===null)return!1;let t=e;return t.source===st&&t.version===1&&typeof t.namespace=="string"&&typeof t.channel=="string"&&"body"in t}var at="site-edit",ut="frame-runtime";function ie(e,t={}){return Tn({namespace:at,channel:ut,sessionKey:t.sessionKey,body:e})}function ct(e){return!kn(e)||e.namespace!==at||e.channel!==ut?!1:typeof e.body?.type=="string"}var qe="vcp-site-edit:route-ready",He="vcp-site-edit:bridge-status",Dn=1e3,Pn="data-vcp-ui-component",yt="data-vcp-theme-preview",lt="::repeat-item#",me="components/ui",Nn=new Set(["article","aside","div","footer","form","header","li","main","nav","ol","section","select","table","tbody","tfoot","thead","tr","ul"]),Bn=new Set(["a","button","em","h1","h2","h3","h4","h5","h6","label","p","small","span","strong"]);function An(e,t=""){let n=It(t),r=n&&(e===n||e.startsWith(`${n}/`))?e.slice(n.length)||"/":e,i=r.startsWith("/")?r:`/${r}`;return i==="/"?"/":i.replace(/\/+$/,"")}function Fn(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 Mn(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 go(e=window,t={}){let n=Mn(e,{explicit_ws_url:t.explicit_ws_url,port:t.ws_port,path:t.wsPath||"/__vcp/site-edit/bridge"}),r=On({bridgeUrl:n,options:t}),i=e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__;if(i?.started){if(wn(i.signature,r)){await i.syncRoute?.();return}i.cleanup?.()}let o={activeClient:null,activeBridge:null,cleanupFrameRuntime:(()=>{}),retryTimer:void 0,routeSequence:0,syncInFlight:null,syncScheduled:!1,disposed:!1,currentDocument:null,currentEntriesByKey:new Map,unsubscribeDocument:void 0,unsubscribeConnectionStatus:void 0,unbindBootstrapLifecycle:void 0,unbindRouteChange:void 0},s,a=()=>e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__===s,u=t.create_client??(p=>new pe({url:p,authKey:t.bridge_session_key})),c=t.schedule_after_navigation??Jn,l=()=>{o.retryTimer&&(e.clearTimeout(o.retryTimer),o.retryTimer=void 0)},f=()=>An(e.location.pathname,t.basePath||""),y=!!e.parent&&e.parent!==e,g=p=>{Yn(e,p)},C=p=>{o.currentDocument=p,o.currentEntriesByKey=new Map((p?.entries??[]).map(b=>[b.key,b]))},I=()=>{o.unsubscribeConnectionStatus?.(),o.unsubscribeConnectionStatus=void 0,o.unsubscribeDocument?.(),o.unsubscribeDocument=void 0},D=(p,b)=>!o.disposed&&b===o.routeSequence&&p===f(),R=async(p,b)=>{let T=o.activeBridge;if(!T)return null;let h=await T.getDocument(p);return D(p,b)&&C(h.data),h.data},N=()=>{I(),C(null);let p=o.activeBridge;o.activeBridge=null,p&&e.__VCP_SITE_EDIT__===p&&delete e.__VCP_SITE_EDIT__;let b=o.activeClient;o.activeClient=null,b?.disconnect()},z=p=>p===s.routeId&&!!o.activeBridge&&(y||!!(o.currentDocument&&Qn(o.currentDocument,p)))&&Xn(o.activeClient),L=p=>Math.min(Dn*2**Math.max(0,p),8e3),M=(p,b,T)=>{if(o.disposed)return;l();let h=L(T);g({state:"reconnecting",routeId:p,attempt:T,retryInMs:h,messageKey:"studio.status.previewBridgeConnecting"}),o.retryTimer=e.setTimeout(()=>{o.retryTimer=void 0,!(o.disposed||b!==o.routeSequence)&&le(T+1).catch(m=>{let d=f();if(p===d){if(X(m)){g({state:"reload-required",routeId:p,attempt:T,messageKey:"studio.errors.previewBridgeReloadRequired"});return}M(p,o.routeSequence,T+1)}})},h)},G=(p,b,T)=>{if(!D(p,b)||o.activeClient===null)return;if(X(T.message)){N(),l(),g({state:"reload-required",routeId:p,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}let h=o.activeClient;I(),C(null);let m=o.activeBridge;o.activeBridge=null,m&&e.__VCP_SITE_EDIT__===m&&delete e.__VCP_SITE_EDIT__,o.activeClient=null,h?.disconnect(),M(p,b,0)},ke=p=>{let b=f(),T=o.routeSequence;if(!(!D(b,T)||o.activeClient===null)){if(X(p)){N(),l(),g({state:"reload-required",routeId:b,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}Et(p)&&G(b,T,{state:"failed",message:Ue(p,"Site edit bridge request failed")})}};o.cleanupFrameRuntime=jn(e,{getCurrentDocument:()=>o.currentDocument,getDocumentEntry:p=>o.currentEntriesByKey.get(p)??null,setCurrentDocument:C,onBridgeRequestError:p=>{ke(p)}});let ee=async()=>le(0),le=async p=>{if(o.disposed)return;let b=f();if(z(b))return;let T=o.syncInFlight;if(T?.routeId===b)return T.promise;let h=o.routeSequence+1,m=De(b,h,p);o.syncInFlight={routeId:b,sequence:h,promise:m};try{await m}finally{o.syncInFlight?.promise===m&&(o.syncInFlight=null)}},De=async(p,b,T)=>{o.routeSequence=b,l(),N(),g({state:T>0?"reconnecting":"connecting",routeId:p,attempt:T,messageKey:T>0?"studio.status.previewBridgeConnecting":"studio.status.previewLoading"});let h=u(n),m=!1;o.activeClient=h,o.unsubscribeConnectionStatus=h.subscribeConnectionStatus?.(d=>{m&&(d.state==="closed"||d.state==="failed")&&G(p,b,d)});try{if(await h.connect(),!D(p,b)){h.disconnect();return}let d=ot({routeId:p,client:h,initialDocument:Hn(p)});o.activeBridge=d,a()&&(e.__VCP_SITE_EDIT__=d),o.activeClient=h,o.unsubscribeDocument=d.subscribe(k=>{k.type==="site-edit.document.changed"&&k.routeId===p&&o.currentDocument&&k.version>o.currentDocument.version&&R(p,b).catch(()=>{})}),a()&&(s.routeId=p);let _=(y?null:await d.initializeSession({routeId:p}))?.data.document??null;if(_&&C(_),!D(p,b)){h.disconnect();return}m=!0,g({state:"ready",routeId:p,attempt:T,messageKey:"studio.status.previewReady"}),Fn(e,{documentVersion:_?.version??0,routeId:p,versions:t.runtime_versions}),_&&vt(e,{routeId:p,version:_.version})}catch(d){if(I(),o.activeClient===h&&(o.activeClient=null),o.activeBridge&&e.__VCP_SITE_EDIT__===o.activeBridge&&delete e.__VCP_SITE_EDIT__,o.activeBridge=null,h.disconnect(),C(null),!D(p,b))return;throw g({state:X(d)?"reload-required":"failed",routeId:p,attempt:T,messageKey:X(d)?"studio.errors.previewBridgeReloadRequired":"studio.errors.previewBridgeDisconnected"}),d}},j=p=>{if(o.disposed)return;let b=f();if(X(p)){l(),g({state:"reload-required",routeId:b,attempt:0,messageKey:"studio.errors.previewBridgeReloadRequired"});return}M(b,o.routeSequence,0)},q=()=>{o.syncScheduled||o.disposed||(o.syncScheduled=!0,c(()=>{o.syncScheduled=!1,!o.disposed&&ee().catch(p=>j(p))}))},de=()=>{o.disposed||(o.disposed=!0,o.syncScheduled=!1,o.syncInFlight=null,l(),o.routeSequence+=1,o.unbindRouteChange?.(),o.unbindRouteChange=void 0,o.unbindBootstrapLifecycle?.(),o.unbindBootstrapLifecycle=void 0,o.cleanupFrameRuntime(),N(),a()&&delete e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__)};if(s={started:!0,signature:r,syncRoute:ee,cleanup:de},e.__VCP_SITE_EDIT_AUTO_BOOTSTRAP__=s,o.unbindBootstrapLifecycle=Kn(e,de),o.unbindRouteChange=Gn(e,q,f),t.defer_initial_sync){q();return}await ee()}function On(e){return{basePath:It(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:Vn(e.options.bridge_session_key)}}function wn(e,t){return!!e&&JSON.stringify(e)===JSON.stringify(t)}function Vn(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 Kn(e,t){let n=()=>t();return e.addEventListener("pagehide",n),e.addEventListener("beforeunload",n),qn(t),()=>{e.removeEventListener("pagehide",n),e.removeEventListener("beforeunload",n)}}function qn(e){let t=import.meta.hot,n=import.meta.webpackHot,r=t??n;!r||typeof r.dispose!="function"||r.dispose(()=>e())}function Hn(e){return{siteId:"preview",snapshotId:"preview",routeId:e,version:0,pageComposition:{status:"unsupported",reason:"ROUTE_RETURN_NOT_FOUND",diagnostics:[]},entries:[]}}function jn(e=window,t={}){let n=null,r=null,i=null,o=null,s=null,a=null,u=null,c=null,l=null,f=new Map,y=typeof t.expectedSessionKey=="string"&&t.expectedSessionKey.length>0?t.expectedSessionKey:null,g=()=>{n?.(),n=null,r=null},C=()=>{i?.(),i=null,o?.(),o=null},I=(h,m,d)=>{let P=s?.sessionKey!==h||s?.sourceWindow!==m||s?.targetOrigin!==d;s={sessionKey:h,sourceWindow:m,targetOrigin:d},P&&(c=null,l=null)},D=(h,m)=>{let d=e.parent&&e.parent!==e?e.parent:null;return!d||m!==d?!1:!y||h===y},R=()=>{for(let h of f.values())h();f.clear()},N=h=>JSON.stringify([h.routeId,h.version]),z=()=>!u||u.state==="ready",L=h=>JSON.stringify([h.state,h.routeId??null,h.attempt??null,h.retryInMs??null,h.messageKey??null]),M=h=>{if(!z())return;let m=N(h);c!==m&&(o?.(),o=null,j({kind:"route-ready",payload:{routeId:h.routeId,version:h.version}}),s&&(c=m))},G=h=>{let m=L(h);l!==m&&(h.state!=="ready"&&(c=null,a=null),j({kind:"bridge-status",payload:h}),s&&(l=m))},ke=h=>{a=h,M(h)},ee=h=>{u=h,G(h)},le=()=>{a&&M(a)},De=()=>{u&&G(u)},j=h=>{s&&s.sourceWindow.postMessage(ie({type:"event",...h},{sessionKey:s.sessionKey}),s.targetOrigin)},q=(h,m,d,P)=>{let _=ve(e.document,m.clientX,m.clientY,t.getCurrentDocument?.()??null),k=_?F(_,d==="full"?K(e.document,_,t.getCurrentDocument?.()??null):ft(e.document,_,t.getCurrentDocument?.()??null),t.getDocumentEntry,d):null;P&&k&&(h==="pointer-click"||h==="pointer-double-click")&&(P.preventDefault(),P.stopPropagation(),typeof P.stopImmediatePropagation=="function"&&P.stopImmediatePropagation()),j({kind:h,payload:{clientX:m.clientX,clientY:m.clientY,buttons:Number(m.buttons??0),hit:k}})},de=(h,m,d)=>{C(),s={sessionKey:h,sourceWindow:m,targetOrigin:d};let P=Hr(e.document),_=null,k=null,S=()=>{k=null;let v=_;_=null,v&&q("pointer-move",v,"summary")},O=v=>{_={clientX:Number(v.clientX),clientY:Number(v.clientY),buttons:Number(v.buttons)},k===null&&(k=bt(e,S))},U=v=>{q("pointer-down",{clientX:Number(v.clientX),clientY:Number(v.clientY),buttons:Number(v.buttons)},"full",v)},Y=v=>{q("pointer-up",{clientX:Number(v.clientX),clientY:Number(v.clientY),buttons:Number(v.buttons)},"summary",v)},H=v=>{q("pointer-cancel",{clientX:Number(v.clientX),clientY:Number(v.clientY),buttons:Number(v.buttons)},"summary",v)},J=v=>{q("pointer-click",{clientX:Number(v.clientX),clientY:Number(v.clientY),buttons:Number(v.buttons)},"full",v)},te=v=>{q("pointer-double-click",{clientX:Number(v.clientX),clientY:Number(v.clientY),buttons:Number(v.buttons)},"full",v)},ne=()=>{j({kind:"scroll",payload:{metrics:be(e)}})};e.document.addEventListener("pointerdown",U,!0),e.document.addEventListener("pointermove",O,{passive:!0,capture:!0}),e.document.addEventListener("pointerup",Y,!0),e.document.addEventListener("pointercancel",H,!0),e.document.addEventListener("click",J,!0),e.document.addEventListener("dblclick",te,!0),e.addEventListener("scroll",ne,{passive:!0}),i=()=>{k!==null&&(St(e,k),k=null),_=null,P(),e.document.removeEventListener("pointerdown",U,!0),e.document.removeEventListener("pointermove",O,!0),e.document.removeEventListener("pointerup",Y,!0),e.document.removeEventListener("pointercancel",H,!0),e.document.removeEventListener("click",J,!0),e.document.removeEventListener("dblclick",te,!0),e.removeEventListener("scroll",ne)}},p=h=>{let m=h.detail;m?.routeId&&ke(m)},b=h=>{let m=h.detail;m?.state&&ee(m)},T=h=>{let m=h.data;if(!ct(m)||m.body.type!=="request"||m.body.kind!=="apply-node-patch"&&m.body.kind!=="get-hit-by-ref"&&m.body.kind!=="get-path-by-ref"&&m.body.kind!=="get-scroll-metrics"&&m.body.kind!=="scroll-to"&&m.body.kind!=="scroll-by"&&m.body.kind!=="set-interaction-mode"&&m.body.kind!=="set-theme-override"&&m.body.kind!=="clear-theme-override"&&m.body.kind!=="get-theme-variables"&&m.body.kind!=="compute-drop-target-at-point"&&m.body.kind!=="observe-node-bounds"&&m.body.kind!=="clear-node-bounds-observer"&&m.body.kind!=="restore-text-edit"&&m.body.kind!=="clear-text-edit-rollback"&&m.body.kind!=="start-text-edit-at-point"&&m.body.kind!=="hit-test-at-point"&&!dt(m.body))return;let d=m.body,P=typeof m.sessionKey=="string"?m.sessionKey:null,_=h.source,k=h.origin;if(!P||!k||!_||typeof _.postMessage!="function"||!D(P,_))return;if(s){if(s.sourceWindow!==_||s.targetOrigin!==k)return;s.sessionKey!==P&&(g(),C(),R(),s=null)}I(P,_,k),De(),le();let S=O=>{let U=typeof d.id=="string"?d.id:"unknown";_.postMessage(ie({id:U,...O},{sessionKey:P}),k)};try{if(dt(d)){Wn({message:d,sendEvent:E=>{_.postMessage(ie({type:"event",...E},{sessionKey:P}),k)},sendResponse:S,subscriptions:f,getCurrentDocument:t.getCurrentDocument,setCurrentDocument:t.setCurrentDocument,onBridgeRequestError:t.onBridgeRequestError,windowLike:e});return}if(d.kind==="apply-node-patch"){let E=$(e.document,d.payload.ref,t.getCurrentDocument?.()??null);if(!E){S({type:"response",ok:!1,error:"No editable element found for patch target"});return}let x=d.payload.preview,A=x?Tr(x.sessionId,d.payload.ref):null;if(A&&x){let he=oe.get(A)??-1;if(x.revision<he){S({type:"response",ok:!0,result:{applied:!1,appliedRevision:x.revision,stale:!0,latestRevision:he}});return}if(x.revision===he){S({type:"response",ok:!0,result:{applied:!1,appliedRevision:x.revision,duplicate:!0,latestRevision:he}});return}}if(Rr(E,d.payload.patch),A&&x&&kr(A,x.revision),x?.responseDetail==="none"){S({type:"response",ok:!0,result:{applied:!0,appliedRevision:x.revision}});return}S({type:"response",ok:!0,result:F(E,K(e.document,E,t.getCurrentDocument?.()??null),t.getDocumentEntry,x?.responseDetail??"full")});return}if(d.kind==="get-hit-by-ref"){let E=$(e.document,d.payload.ref,t.getCurrentDocument?.()??null);if(!E){S({type:"response",ok:!1,error:"No editable element found for hit target"});return}S({type:"response",ok:!0,result:F(E,K(e.document,E,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")});return}if(d.kind==="get-path-by-ref"){let E=$(e.document,d.payload.ref,t.getCurrentDocument?.()??null);if(!E){S({type:"response",ok:!1,error:"No editable element found for path target"});return}let x=[],A=E;for(;A;)A.getAttribute("data-vcp-edit-key")&&x.push(F(A,K(e.document,A,t.getCurrentDocument?.()??null),t.getDocumentEntry,"full")),A=A.parentElement;S({type:"response",ok:!0,result:x.reverse()});return}if(d.kind==="restore-text-edit"||d.kind==="clear-text-edit-rollback"){let E=d.payload.ref;if(d.kind==="clear-text-edit-rollback"){r&&ht(r.ref,E)&&(r=null),S({type:"response",ok:!0,result:{cleared:!0}});return}if(!r||!ht(r.ref,E)){S({type:"response",ok:!1,error:"No pending text edit rollback snapshot"});return}let x=er(e.document,r,t.getCurrentDocument?.()??null);r=null,S(x?{type:"response",ok:!0,result:{restored:!0}}:{type:"response",ok:!1,error:"Failed to restore text edit snapshot"});return}if(d.kind==="get-scroll-metrics"){S({type:"response",ok:!0,result:be(e)});return}if(d.kind==="scroll-to"){let E=Number(d.payload.x),x=Number(d.payload.y);if(!Number.isFinite(E)||!Number.isFinite(x)){S({type:"response",ok:!1,error:"Invalid scroll position"});return}e.scrollTo({left:E,top:x}),S({type:"response",ok:!0,result:be(e)});return}if(d.kind==="scroll-by"){let E=Number(d.payload.deltaX),x=Number(d.payload.deltaY);if(!Number.isFinite(E)||!Number.isFinite(x)){S({type:"response",ok:!1,error:"Invalid scroll delta"});return}e.scrollBy({left:E,top:x}),S({type:"response",ok:!0,result:{...be(e),scrolled:!0}});return}if(d.kind==="set-interaction-mode"){d.payload.enabled?de(P,_,k):s?.sourceWindow===_&&s.targetOrigin===k&&s.sessionKey===P&&C(),S({type:"response",ok:!0,result:{interactionEnabled:d.payload.enabled}});return}if(d.kind==="set-theme-override"){Dr(e.document,d.payload),S({type:"response",ok:!0,result:{themeOverrideApplied:!0}});return}if(d.kind==="clear-theme-override"){Pr(e.document),S({type:"response",ok:!0,result:{themeOverrideCleared:!0}});return}if(d.kind==="get-theme-variables"){S({type:"response",ok:!0,result:Nr(e.document,d.payload.names)});return}if(d.kind==="compute-drop-target-at-point"){let E=Number(d.payload?.x),x=Number(d.payload?.y);if(!Number.isFinite(E)||!Number.isFinite(x)){S({type:"response",ok:!1,error:"Invalid drop target point"});return}S({type:"response",ok:!0,result:Sr(e,E,x,d.payload.dragKind,d.payload.movingRef,t.getCurrentDocument?.()??null,t.getDocumentEntry)});return}if(d.kind==="observe-node-bounds"){let E=d.payload.ref;if(!E){S({type:"response",ok:!1,error:"Missing bounds observer target"});return}let x=$(e.document,E,t.getCurrentDocument?.()??null);if(!x){S({type:"response",ok:!1,error:"No editable element found for bounds observer target"});return}o?.(),o=mr(e,x,E,t.getCurrentDocument,t.getDocumentEntry,A=>j({kind:"node-bounds-change",payload:{hit:A}})),S({type:"response",ok:!0,result:{observing:!0}}),j({kind:"node-bounds-change",payload:{hit:F(x,E,t.getDocumentEntry,"summary")}});return}if(d.kind==="clear-node-bounds-observer"){o?.(),o=null,S({type:"response",ok:!0,result:{cleared:!0}});return}if(d.kind!=="hit-test-at-point"&&d.kind!=="start-text-edit-at-point")return;let O=Number(d.payload?.x),U=Number(d.payload?.y);if(!Number.isFinite(O)||!Number.isFinite(U)){S({type:"response",ok:!1,error:"Invalid text edit point"});return}let Y=d.kind==="hit-test-at-point"?ve(e.document,O,U,t.getCurrentDocument?.()??null):nr(e.document,O,U,t.getCurrentDocument?.()??null,t.getDocumentEntry);if(!Y){S({type:"response",ok:!1,error:d.kind==="hit-test-at-point"?"No editable element at point":"No editable text element at point"});return}let H=d.kind==="start-text-edit-at-point"?Y:null,J=d.kind==="hit-test-at-point"?Y:H.element,te=d.payload.detailLevel??"full",ne=te==="full"?K(e.document,J,t.getCurrentDocument?.()??null):ft(e.document,J,t.getCurrentDocument?.()??null),v=H&&typeof H.textSegmentIndex=="number"?{...ne,textSegmentIndex:H.textSegmentIndex}:ne,an=F(J,v,t.getDocumentEntry,te);if(d.kind==="hit-test-at-point"){S({type:"response",ok:!0,result:an});return}g(),n=Mr(e,J,v,E=>{_.postMessage(ie({type:"event",...E},{sessionKey:P}),k)},{...H?.textNode?{textNode:H.textNode}:{},onCommitSnapshot:E=>{r=E}}),S({type:"response",ok:!0,result:{ref:v}})}catch(O){S({type:"response",ok:!1,error:O instanceof Error?O.message:"Failed to start text edit"})}};return e.addEventListener("message",T),e.addEventListener(qe,p),e.addEventListener(He,b),()=>{g(),C(),s=null,R(),e.removeEventListener("message",T),e.removeEventListener(qe,p),e.removeEventListener(He,b)}}function dt(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 Un(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 Wn({message:e,sendEvent:t,sendResponse:n,subscriptions:r,getCurrentDocument:i,setCurrentDocument:o,onBridgeRequestError:s,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 c=await u.initializeSession({routeId:e.payload.routeId});o?.(c.data.document),vt(a,{routeId:c.data.document.routeId,version:c.data.document.version}),n({type:"response",ok:!0,result:c});return}case"bridge-get-document":{let c=await u.getDocument(e.payload.routeId);o?.(c.data),n({type:"response",ok:!0,result:c});return}case"bridge-get-history-status":n({type:"response",ok:!0,result:await u.getHistoryStatus()});return;case"bridge-get-style-context":n({type:"response",ok:!0,result:await u.getStyleContext(e.payload.routeId)});return;case"bridge-ensure-document-version":{if(!Number.isFinite(Number(e.payload.minVersion))){n({type:"response",ok:!1,error:"Invalid document version"});return}let c=u.ensureDocumentVersion?await u.ensureDocumentVersion(e.payload.routeId,Number(e.payload.minVersion)):await u.getDocument(e.payload.routeId);o?.(c.data),n({type:"response",ok:!0,result:c});return}case"bridge-acknowledge-document-version":{if(!Number.isFinite(Number(e.payload.version))){n({type:"response",ok:!1,error:"Invalid document version"});return}let c=u.acknowledgeDocumentVersion?await u.acknowledgeDocumentVersion(e.payload.routeId,Number(e.payload.version)):await u.getDocument(e.payload.routeId);o?.(c.data),n({type:"response",ok:!0,result:c});return}case"bridge-get-object-edit-context":n({type:"response",ok:!0,result:await u.getObjectEditContext(e.payload.key,e.payload.routeId)});return;case"bridge-get-class-name-source":{let c=await u.getClassNameSource(e.payload.key,e.payload.routeId);n({type:"response",ok:!0,result:$n(c,e.payload.key,a.document,i?.()??null)});return}case"bridge-get-source-tree":n({type:"response",ok:!0,result:await u.getSourceTree()});return;case"bridge-get-source-file":n({type:"response",ok:!0,result:await u.getSourceFile({path:e.payload.path})});return;case"bridge-resolve-source-location":n({type:"response",ok:!0,result:await u.resolveSourceLocation({key:e.payload.key,routeId:e.payload.routeId})});return;case"bridge-execute":{let c=await u.execute(e.payload.request),l=i?.()?.routeId;if(c.ok&&l&&u.acknowledgeDocumentVersion&&Un(e.payload.request)){let f=await u.acknowledgeDocumentVersion(l,c.data.resultVersion);o?.(f.data)}n({type:"response",ok:!0,result:c});return}case"bridge-undo":n({type:"response",ok:!0,result:await u.undo()});return;case"bridge-redo":n({type:"response",ok:!0,result:await u.redo()});return;case"bridge-subscribe":{let c=e.payload.subscriptionId;r.get(c)?.();let l=u.subscribe(f=>{t({kind:"bridge-event",payload:{event:f,subscriptionId:c}})});r.set(c,l),n({type:"response",ok:!0,result:{subscribed:!0}});return}case"bridge-unsubscribe":{let c=e.payload.subscriptionId;r.get(c)?.(),r.delete(c),n({type:"response",ok:!0,result:{unsubscribed:!0}});return}}}catch(c){s?.(c,e),n({type:"response",ok:!1,error:Zn(c)})}}function $n(e,t,n,r){if(!e.ok)return e;let i=$(n,{key:t},r),o=i?zn(i):null;return o?{...e,data:{...e.data,computedStyle:{...e.data.computedStyle??{},...o}}}:e}function zn(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 Gn(e,t,n=()=>e.location.pathname){let r=e.history.pushState,i=e.history.replaceState,o=n(),s=()=>{let c=n();c!==o&&(o=c,t())},a=()=>s(),u=()=>s();return e.history.pushState=function(...l){let f=r.apply(this,l);return s(),f},e.history.replaceState=function(...l){let f=i.apply(this,l);return s(),f},e.addEventListener("popstate",a),e.addEventListener("hashchange",u),()=>{e.history.pushState=r,e.history.replaceState=i,e.removeEventListener("popstate",a),e.removeEventListener("hashchange",u)}}function Jn(e){if(typeof requestAnimationFrame=="function"){requestAnimationFrame(()=>requestAnimationFrame(e));return}setTimeout(e,0)}function bt(e,t){return typeof e.requestAnimationFrame=="function"?e.requestAnimationFrame(t):e.setTimeout(t,0)}function St(e,t){if(typeof e.cancelAnimationFrame=="function"){e.cancelAnimationFrame(t);return}e.clearTimeout(t)}function vt(e,t){e.dispatchEvent(new CustomEvent(qe,{detail:t}))}function Yn(e,t){e.dispatchEvent(new CustomEvent(He,{detail:t}))}function Xn(e){return e?e.getConnectionState?e.getConnectionState()==="open":!0:!1}function Qn(e,t){return e.routeId===t}function Ue(e,t){return e instanceof Error&&e.message?e.message:typeof e=="string"&&e?e:t}function Et(e){let t=Ue(e,"");return/websocket|readyState|not open|disconnected|bridge request timed out|network|econnreset|broken pipe|socket closed/i.test(t)}function Zn(e){let t=Ue(e,"Site edit bridge request failed");return/bridge request timed out/i.test(t)?"Site edit bridge request timed out":Et(t)?"Site edit bridge disconnected":t}function X(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 It(e){let t=e.trim();return!t||t==="/"?"":(t.startsWith("/")?t:`/${t}`).replace(/\/+$/,"")}function We(e){return Nn.has(Ct(e))}function Ln(e){return Bn.has(Ct(e))}function xt(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:Ln(e.tagName),canInsertChild:We(e.tagName),canMove:!1,canRemove:!1}}function Ct(e){return e?.trim().toLowerCase()??""}function ht(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 er(e,t,n){let r=$(e,t.ref,n);if(!r)return!1;if(typeof t.ref.textSegmentIndex=="number"){let i=tr(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 tr(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Se(r)||(r.textContent??"").trim().length===0)){if(n===t)return r;n+=1}return null}function nr(e,t,n,r,i){let o=ve(e,t,n,r),s=Rt(o);if(!s)return null;let a=s.getAttribute("data-vcp-edit-key")??"",u=K(e,s,r),c=i?.(u.key)??i?.(a);if(!xt({operationSummary:c?.operationSummary,tagName:s.tagName,fallbackMode:"preview"}).canUpdateText)return null;let f=rr(e,t,n,s);if(f){let y=or(s,f);if(y!==null)return{element:s,textNode:f,textSegmentIndex:y}}return xe(s)?null:{element:s}}function rr(e,t,n,r){let i=ir(e,t,n);return!i||i.parentElement!==r?null:i}function ir(e,t,n){let r=e,o=r.caretPositionFromPoint?.(t,n)?.offsetNode??null;if(Se(o))return o;let a=r.caretRangeFromPoint?.(t,n)?.startContainer??null;return Se(a)?a:null}function or(e,t){let n=0;for(let r of Array.from(e.childNodes))if(!(!Se(r)||(r.textContent??"").trim().length===0)){if(r===t)return n;n+=1}return null}function Se(e){return e?.nodeType===3}function ve(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=Rt(o),a=s?.getAttribute("data-vcp-edit-key")??"";if(s&&lr(s,r,a))return s}return null}function Rt(e){let t=e,n=null;for(;t;){let r=t.getAttribute("data-vcp-edit-key")??"";if(r){if($e(t))return n??t;!sr(r)&&!n&&(n=t)}t=t.parentElement}return n}function $e(e){return e.getAttribute(Pn)!==null}function sr(e){return ar(e.split("::")[0]??"")}function ar(e){if(!e)return!1;let t=ur(e);return t===me||t.startsWith(`${me}/`)||t.includes(`/${me}/`)||t.endsWith(`/${me}`)}function ur(e){let n=(e.split("?")[0]??e).replace(/\\/g,"/").replace(/^\.\//,""),r=[];for(let i of n.split("/"))if(!(!i||i===".")){if(i===".."){r.pop();continue}r.push(i)}return r.join("/")}function K(e,t,n){let r=t.getAttribute("data-vcp-edit-key")??"",i=Tt(Dt(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${Mt(r)}"]`))),n,r);if(i.length<=1)return{key:pt(n,r,0)};let o=i.indexOf(t);return o>=0?{key:pt(n,r,o),instanceIndex:o,instanceCount:i.length}:{key:r}}function ft(e,t,n){return K(e,t,n)}function $(e,t,n){let r=Ee(t.key)??t.key,i=Tt(Dt(Array.from(e.querySelectorAll(`[data-vcp-edit-key="${Mt(r)}"]`))),n,t.key);if(i.length===0)return null;let o=typeof t.instanceIndex=="number"&&t.instanceIndex>=0&&t.instanceIndex<i.length?t.instanceIndex:null,s=(Ee(t.key)??t.key)!==t.key;if(o!==null&&!s)return i[o]??null;let a=cr(n,t.key);return a!==null&&a>=0&&a<i.length?i[a]??null:o!==null?i[o]??null:i[0]??null}function pt(e,t,n){return _t(e,t)[n]?.key??t}function cr(e,t){let n=Ee(t);if(!n)return null;let i=_t(e,n).findIndex(o=>o.key===t);return i>=0?i:null}function _t(e,t){return(e?.entries??[]).filter(n=>(Ee(n.key)??n.key)===t)}function Tt(e,t,n){let r=kt(t,n);return r?e.filter(i=>i.tagName.toLowerCase()===r):e}function lr(e,t,n){let r=kt(t,n);return!r||e.tagName.toLowerCase()===r}function kt(e,t){return null}var dr=2,hr=4;function Dt(e){return[...e].sort((t,n)=>{if(t===n)return 0;let r=typeof t.compareDocumentPosition=="function"?t.compareDocumentPosition(n):0;return(r&hr)!==0?-1:(r&dr)!==0?1:0})}function Ee(e){if(typeof e!="string"||e.length===0)return e??null;let t=e;for(;;){let n=t.lastIndexOf(lt);if(n<0)break;let r=Number(t.slice(n+lt.length));if(!Number.isInteger(r)||r<0)return e;t=t.slice(0,n)}return t}function fr(e){let n=e.ownerDocument?.defaultView?.getComputedStyle(e),r=i=>{let o=Number.parseFloat(i??"");return Number.isFinite(o)&&o>0?o:0};return{marginTop:r(n?.marginTop),marginRight:r(n?.marginRight),marginBottom:r(n?.marginBottom),marginLeft:r(n?.marginLeft),paddingTop:r(n?.paddingTop),paddingRight:r(n?.paddingRight),paddingBottom:r(n?.paddingBottom),paddingLeft:r(n?.paddingLeft),borderTopWidth:r(n?.borderTopWidth),borderRightWidth:r(n?.borderRightWidth),borderBottomWidth:r(n?.borderBottomWidth),borderLeftWidth:r(n?.borderLeftWidth),columnGap:r(n?.columnGap),rowGap:r(n?.rowGap)}}function pr(e){return Array.from(e.children).filter(t=>typeof t.getBoundingClientRect=="function").map(t=>br(t.getBoundingClientRect())).filter(t=>t.width>0&&t.height>0)}function F(e,t,n,r="full"){let i=e.getBoundingClientRect(),o=n?.(t.key)??null,s=e.tagName.toLowerCase(),a=Ie(e),u=r==="full"?{textPreview:e.textContent?.trim().slice(0,80),dataset:Object.fromEntries(Object.entries(e.dataset).map(([g,C])=>[g,C??""])),attributes:Object.fromEntries(e.getAttributeNames().map(g=>[g,e.getAttribute(g)??""]))}:{},c=xt({operationSummary:o?.operationSummary,tagName:s,fallbackMode:"preview"}),l=$e(e),f=!0,y=Nt(e)?.getAttribute("data-vcp-edit-key")??null;return{ref:t,key:t.key,detailLevel:r,tagName:s,...o?{sourceKind:"jsx"}:{},...y?{parentKey:y}:{},...o?.pageCompositionUnitKey?{pageCompositionUnitKey:o.pageCompositionUnitKey}:{},...u,runtimeFlags:{selectable:!0,movable:c.canMove,removable:c.canRemove,textEditable:c.canUpdateText,container:l?!1:!!xe(e)||c.canInsertChild||f&&We(s)},layout:a,rect:{top:i.top,left:i.left,width:i.width,height:i.height},childRects:pr(e),spacing:fr(e)}}function mr(e,t,n,r,i,o){let s=t,a=F(s,n,i,"summary"),u=null,c=()=>{u===null&&(u=bt(e,l))},l=()=>{u=null;let D=$(e.document,n,r?.()??null);if(!D)return;D!==s&&(y?.unobserve(s),s=D,y?.observe(s));let R=F(s,n,i,"summary");R.rect.width<=0||R.rect.height<=0||gr(a,R)&&(a=R,o(R))},f=e.ResizeObserver,y=typeof f=="function"?new f(c):null;y?.observe(s);let g=e.MutationObserver,C=typeof g=="function"?new g(c):null;C?.observe(e.document.documentElement,{attributes:!0,childList:!0,characterData:!0,subtree:!0}),e.addEventListener("resize",c,{passive:!0});let I=e.visualViewport;return I?.addEventListener?.("resize",c,{passive:!0}),e.document.addEventListener("load",c,!0),()=>{u!==null&&(St(e,u),u=null),y?.disconnect(),C?.disconnect(),e.removeEventListener("resize",c),I?.removeEventListener?.("resize",c),e.document.removeEventListener("load",c,!0)}}function gr(e,t){return Pt(e.rect,t.rect)||yr(e.childRects,t.childRects)||mt(e.spacing,t.spacing)||mt(e.layout,t.layout)}function yr(e,t){let n=e??[],r=t??[];return n.length!==r.length||n.some((i,o)=>Pt(i,r[o]??i))}function mt(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 br(e){return{top:e.top,left:e.left,width:e.width,height:e.height}}function Pt(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 Sr(e,t,n,r,i,o,s){let a=e.document,u=ve(a,t,n,o);if(!u)return{anchorHit:null,targetParentHit:null,relation:"none",rejectionReason:"no-editable-hit"};let c=i?$(a,i,o):null;if(c&&je(u,c))return ge(a,u,"self-or-descendant",o,s);if(r==="move"&&c){let I=xr(a,u,c,o,s);if(I){let D=Ve(I.child,I.targetParent,t,n,"nearest");if(D)return ye(a,I.child,I.targetParent,D,o,s)}}let l=null,f=!1,y=u,g=u.parentElement;for(;g;){if(g.getAttribute("data-vcp-edit-key")){if(c&&je(g,c))return ge(a,u,"self-or-descendant",o,s);let I=gt(g,r,s);if(I==="accept"){l={child:y,targetParent:g};break}I==="blocked"&&(f=!0),y=g}g=g.parentElement}let C=gt(u,r,s);if(C==="accept"){if(l){let I=Ve(l.child,l.targetParent,t,n,"edge");if(I)return ye(a,l.child,l.targetParent,I,o,s)}return ye(a,u,u,vr(u,t,n),o,s)}if(l){let I=Ve(l.child,l.targetParent,t,n,"nearest");return ye(a,l.child,l.targetParent,I??"after",o,s)}return C==="blocked"||f?ge(a,u,"operation-boundary-blocked",o,s):ge(a,u,"no-accepting-parent",o,s)}function ge(e,t,n,r,i){return{anchorHit:F(t,K(e,t,r),i,"summary"),targetParentHit:null,relation:"none",rejectionReason:n}}function ye(e,t,n,r,i,o){let s=F(t,K(e,t,i),o,"summary"),a=F(n,K(e,n,i),o,"summary"),u=Ie(n).indicatorOrientation,c=r==="append"||r==="prepend"?Er(n.getBoundingClientRect(),u,r):Ir(t.getBoundingClientRect(),u,r);return{anchorHit:s,targetParentHit:a,relation:r,indicatorOrientation:u,indicatorBounds:c}}function gt(e,t,n){if($e(e))return"not-container";let r=e.getAttribute("data-vcp-edit-key")??"",i=n?.(r)??null;if(i)return i.operationSummary.canInsertChild===!0?"accept":xe(e)?"blocked":"not-container";let o=e.tagName.toLowerCase();return We(o)?"accept":"not-container"}function Ve(e,t,n,r,i){let o=Ie(t).indicatorOrientation,s=e.getBoundingClientRect(),a=o==="vertical"?s.width>0?(n-s.left)/s.width:.5:s.height>0?(r-s.top)/s.height:.5;return i==="edge"&&a>=.25&&a<=.75?null:a<.5?"before":"after"}function vr(e,t,n){let r=Ie(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 Ie(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 Er(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 Ir(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 je(e,t){let n=e;for(;n;){if(n===t)return!0;n=n.parentElement}return!1}function xr(e,t,n,r,i){let o=Cr(e,t,n,r,i);if(o)return o;let s=Nt(n);if(!s||t===s)return null;let a=t,u=t.getAttribute("data-vcp-edit-key")?t:null;for(;a&&a!==s;)a.getAttribute("data-vcp-edit-key")&&(u=a),a=a.parentElement;return a!==s||!u||u===s||u===n||je(u,n)?null:{child:u,targetParent:s}}function Cr(e,t,n,r,i){return null}function Nt(e){let t=e.parentElement;for(;t;){if(t.getAttribute("data-vcp-edit-key"))return t;t=t.parentElement}return null}function xe(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=xe(n);if(r)return r}return null}function be(e){let t=e.document.documentElement,n=e.document.body;return{scrollX:V(e.scrollX),scrollY:V(e.scrollY),scrollWidth:Math.max(V(t?.scrollWidth),V(n?.scrollWidth),V(e.innerWidth)),scrollHeight:Math.max(V(t?.scrollHeight),V(n?.scrollHeight),V(e.innerHeight)),viewportWidth:V(e.innerWidth),viewportHeight:V(e.innerHeight)}}function Rr(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,a=>`-${a.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,a=>`-${a.toLowerCase()}`),s=r.value;if(s==null||s===""){i.removeProperty(o);return}i.setProperty(o,String(s),r.priority)})}var _r=500,oe=new Map;function Tr(e,t){return`${e}:${t.key}:${t.instanceIndex??""}`}function kr(e,t){if(oe.size>=_r){let n=oe.keys().next().value;n&&oe.delete(n)}oe.set(e,t)}var se=new Set;function Dr(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 se)r.has(i)||n?.removeProperty(i);se.clear();for(let i of r)se.add(i);Fr(e,t.stylesheets??[])}function Pr(e){let t=e.documentElement?.style;for(let n of se)t?.removeProperty(n);se.clear();for(let n of Ft(e))n.remove()}function Nr(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 a=Bt(i,s);a&&(o[s]=a)}return o}function Bt(e,t,n=new Set){if(!e||n.has(t))return null;n.add(t);let r=e.getPropertyValue(t).trim();return At(e,r,n)}function At(e,t,n){if(!t)return null;let r=Br(t);if(!r)return t;let i=Bt(e,r.name,n);return i||(r.fallback?At(e,r.fallback,n)??r.fallback:null)}function Br(e){let t=e.trim();if(!t.startsWith("var(")||!t.endsWith(")"))return null;let n=t.slice(4,-1).trim(),r=Ar(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 Ar(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 Fr(e,t){let n=new Set(t.filter(o=>typeof o=="string"&&o.length>0)),r=new Map;for(let o of Ft(e)){let s=o.getAttribute("href")??"";if(!n.has(s)||r.has(s)){o.remove();continue}r.set(s,o)}let i=e.head;if(i)for(let o of n){if(r.has(o))continue;let s=e.createElement("link");s.setAttribute("rel","stylesheet"),s.setAttribute(yt,"true"),s.setAttribute("href",o),i.appendChild(s)}}function Ft(e){return Array.from(e.querySelectorAll(`link[${yt}]`))}function Mr(e,t,n,r,i={}){let o=i.textNode?Or(e.document,i.textNode):null;if(i.textNode&&!o)throw new Error("Failed to prepare text segment editor");let s=o?.element??t,a=s.textContent??"",u=o?void 0:t.innerHTML,c=wr(s),l=!1,f=()=>{e.document.removeEventListener("pointerdown",g,!0),s.removeEventListener("keydown",C),s.removeEventListener("blur",I),s.removeEventListener("input",D),Kr(s,c)},y=R=>{if(l)return;l=!0;let N=s.textContent??"";if(f(),R==="cancel"){o?.restore(a),o||(t.textContent=a),r({kind:"text-edit-cancel",payload:{ref:n}});return}if(o?.restore(N),R==="commit"&&N!==a){i.onCommitSnapshot?.({ref:n,initialText:a,...u!==void 0?{initialHtml:u}:{}}),r({kind:"text-edit-commit",payload:{ref:n,value:N}});return}r({kind:"text-edit-exit",payload:{ref:n}})};function g(R){let N=R.target;N&&s.contains(N)||y("commit")}function C(R){if(R.key==="Escape"){R.preventDefault(),y("cancel");return}R.key==="Enter"&&(R.metaKey||R.ctrlKey)&&(R.preventDefault(),y("commit"))}function I(){y("commit")}function D(){r({kind:"text-edit-input",payload:{ref:n,hit:F(t,n,void 0,"full")}})}return Vr(s),e.document.addEventListener("pointerdown",g,!0),s.addEventListener("keydown",C),s.addEventListener("blur",I),s.addEventListener("input",D),jr(s),Ur(s,e.document),f}function Or(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 wr(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 Vr(e){qr(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 Kr(e,t){Ke(e,"contenteditable",t.contentEditable),Ke(e,"spellcheck",t.spellcheck),Ke(e,"data-vcp-edit-text-editing",t.marker),e.style.cursor=t.cursor,e.style.userSelect=t.userSelect}function qr(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 Ke(e,t,n){if(n===null){e.removeAttribute(t);return}e.setAttribute(t,n)}function Hr(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 jr(e){try{e.focus({preventScroll:!0})}catch{e.focus()}}function Ur(e,t){let n=t.createRange();n.selectNodeContents(e);let r=t.getSelection?.();r?.removeAllRanges(),r?.addRange(n)}function Mt(e){return e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}function V(e){let t=Number(e);return Number.isFinite(t)?t:0}import Wr from"node:http";import{createHash as Ht,randomBytes as $r,timingSafeEqual as zr}from"node:crypto";import Je from"node:path";import{WebSocket as jt,WebSocketServer as Gr}from"ws";import{createPreviewSiteEditEngineRuntime as Jr,openFileHistoryStore as Yr}from"@vcp-dev/site-edit-engine";import{resolveNextAppRouteId as Xr,scanNextAppRouterRoutes as Qr}from"@vcp-dev/site-edit-engine/next-app-router";import{SiteEditSourceWatcher as Zr}from"@vcp-dev/site-edit-engine/source-watcher";var Ce=class{constructor(){this.tail=Promise.resolve()}run(t){let n=this.tail.then(t,t);return this.tail=n.then(()=>{},()=>{}),n}};import{SiteEditOperationRequestSchema as Lr}from"@vcp-dev/contracts";var ei="127.0.0.1",ti=30218,ni="/__vcp/site-edit/bridge",Ut=6*1024*1024,ri=Ut*2,ii=3e3,Ot=50,wt="__VCP_SITE_EDIT_BRIDGE_SERVERS__";function Do(e){let t=$t(e),n=Gt(t),r=zt(),i=r.get(n);if(i)return i;let o=new Re(t);r.set(n,o);try{o.start()}catch(s){throw r.delete(n),o.stop(),s}return o}function Wt(e,t,n={}){let r=new Re($t(t),e,!1,n);return r.start({listen:!1}),r}var Re=class{constructor(t,n=Wr.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 Ce,this.eventListeners=new Set,this.routes=[],this.stopWatching=null,this.stopWebSocketServer=null,this.pendingChangedFiles=new Set,this.fileChangeTimer=null,this.isStarted=!1,this.runtimeVersionFloor=0,this.activeHistoryStore=null,this.versionPersistence=Promise.resolve()}start(t={}){if(this.isStarted)return;this.refreshRoutes(),this.isStarted=!0,this.createRuntime();let n=si({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 Zr({projectRoot:this.options.projectRoot,watch_dirs:this.options.runtime.watch_dirs,debounce_ms:this.options.runtime.watch_debounce_ms??Ot,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;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.closeHttpServerOnStop&&this.server.close();let t=zt(),n=Gt(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??Jr)({...this.options.tenantId?{tenantId:this.options.tenantId}:{},siteId:this.options.siteId,snapshotId:this.options.snapshotId,projectRoot:this.options.projectRoot,routes:this.routes,onEvent:o=>{"version"in o&&typeof o.version=="number"&&this.recordRuntimeVersion(o.version);for(let s of this.eventListeners)s(o)},...t?{historyStore:t}:{},initialDocumentVersion:this.runtimeVersionFloor});this.runtime=i,this.activeHistorySessionId=n,r?.dispose()}createBridgeEngine(){return{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{runtime:r,resolvedRouteId:i}=await this.activateRoute(t.routeId),o=r.getDocument(i).data;await this.recordRuntimeVersion(o.version);let s=(await r.getHistoryStatus()).data;return{ok:!0,data:{document:o,historyStatus:s}}}),getDocument:async t=>{let{runtime:n,resolvedRouteId:r}=await this.activateRoute(t),i=n.getDocument(r);return await this.recordRuntimeVersion(i.data.version),i},getHistoryStatus:async()=>this.getRuntime().getHistoryStatus(),getStyleContext:async t=>{let{runtime:n,resolvedRouteId:r}=await this.activateRoute(t);return n.getStyleContext(r)},getObjectEditContext:async(t,n)=>this.getRuntime().getObjectEditContext(t,n?this.resolveRouteId(n):void 0),getClassNameSource:async(t,n)=>{let r=this.getRuntime(),i=n?this.resolveRouteId(n):void 0;return r.getClassNameSource(t,i)},getSourceTree:async()=>this.getRuntime().getSourceTree(),getSourceFile:async t=>this.getRuntime().getSourceFile(t),resolveSourceLocation:async t=>this.getRuntime().resolveSourceLocation({key:t.key,routeId:t.routeId?this.resolveRouteId(t.routeId):void 0}),execute:(t,n)=>this.mutationQueue.run(async()=>{let r=await this.bindHistorySession(this.options.snapshotId);if(!r.ok)return ze(r,t);let i=await this.getRuntime().executeOperation(this.normalizeRequest(t));return i.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(i.data.resultVersion),i}),undo:()=>this.mutationQueue.run(async()=>{let t=await this.bindHistorySession(this.options.snapshotId);if(!t.ok)return ze(t);let n=await this.getRuntime().undo();return n.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(n.data.resultVersion),n}),redo:()=>this.mutationQueue.run(async()=>{let t=await this.bindHistorySession(this.options.snapshotId);if(!t.ok)return ze(t);let n=await this.getRuntime().redo();return n.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(n.data.resultVersion),n}),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??Yr)(oi({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;this.runtimeVersionFloor=Math.max(this.runtimeVersionFloor,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){this.runtimeVersionFloor=Math.max(this.runtimeVersionFloor,t);let n=this.activeHistoryStore;return n?.writeDocumentVersion?(this.versionPersistence=this.versionPersistence.then(()=>n.writeDocumentVersion(this.runtimeVersionFloor)).catch(()=>{}),this.versionPersistence):Promise.resolve()}async activateRoute(t){let n=this.getRuntime(),r=this.resolveRouteId(t);return await n.setActiveRoute(r),{runtime:n,resolvedRouteId:r}}normalizeRequest(t){return t.target.kind!=="route"?t.routeId?{...t,routeId:this.resolveRouteId(t.routeId)}:t:{...t,target:{...t.target,routeId:this.resolveRouteId(t.target.routeId)}}}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??Ot;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));this.pendingChangedFiles.clear(),this.refreshRoutes();for(let n of t)this.runtime?.notifyFileChanged(n)}refreshRoutes(){let t=this.options.runtime.routes?.length?this.options.runtime.routes:Qr(this.options.projectRoot),n=new Map(this.routes.map(i=>[i.routeId,i.entryFile])),r=new Set(t.map(i=>i.routeId));this.routes=t;for(let i of t)n.get(i.routeId)!==i.entryFile&&this.runtime?.registerRoute(i.routeId,i.entryFile);for(let i of n.keys())r.has(i)||this.runtime?.unregisterRoute(i)}resolveRouteId(t){let n=Xr(t,this.routes,this.options.basePath);if(!n)throw new Error(`Route is not indexed by the preview bridge: ${t}`);return n}getRuntime(){if(!this.runtime)throw new Error("VCP site edit preview bridge runtime is not ready");return this.runtime}};function $t(e){return{tenantId:e.tenantId,siteId:e.siteId,snapshotId:e.snapshotId,projectRoot:Je.resolve(e.projectRoot??process.cwd()),basePath:e.basePath??"",host:e.host??ei,port:e.port??ti,path:e.path??ni,sessionKey:e.sessionKey??fi(),historyRoot:e.historyRoot,allowedOrigins:e.allowedOrigins??[],runtime:e.runtime??{}}}function oi(e){return Je.join(Je.resolve(e.root),Vt(e.siteId),Vt(e.snapshotId),Ht("sha256").update(e.editingSessionId).digest("hex").slice(0,32))}function Vt(e){return/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)&&e!=="."&&e!==".."?e:Ht("sha256").update(e).digest("hex").slice(0,32)}function zt(){let e=globalThis;return e[wt]??=new Map,e[wt]}function Gt(e){return`${e.projectRoot}:${e.host}:${e.port}:${e.path}:${e.historyRoot??""}`}function ze(e,t){return{ok:!1,error:{code:e.code,message:e.message},data:{requestId:t?.id??"mutation-context",kind:t?.kind??"update-text",target:t?.target??{kind:"node",key:""},resultVersion:t?.documentVersion??0}}}function si(e){let t=new Gr({maxPayload:Ut,noServer:!0}),n=new WeakSet,r=o=>{new fe({socket:new Ye(o),engine:e.engine,validateOperationRequest:s=>Lr.safeParse(s).success})},i=(o,s,a)=>{if(!ai(o,e))return;let u=ui(o,e);if(!u){s.write(`HTTP/1.1 401 Unauthorized\r
|
|
2
2
|
Connection: close\r
|
|
3
3
|
\r
|
|
4
|
-
`),i.destroy();return}c.authenticatedByHeader&&n.add(s),t.handleUpgrade(s,i,a,u=>{t.emit("connection",u,s)})};return e.server.on("upgrade",o),t.on("connection",(s,i)=>{if(n.has(i)){r(s);return}Xr(s,e.sessionKey,()=>{r(s)})}),t.stop=()=>{e.server.off("upgrade",o);for(let s of t.clients)s.close(1001,"bridge stopped");t.close()},t}var Ue=class{constructor(t){this.socket=t,this.onmessage=null,this.onclose=null,t.on("message",n=>{this.onmessage?.({data:n.toString()})}),t.on("close",()=>{this.onclose?.()})}send(t){this.socket.readyState===Nt.OPEN&&this.socket.send(t)}close(t,n){this.socket.close(t,n)}};function Jr(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function Yr(e,t){if(new URL(e.url??"/","http://localhost").searchParams.has("vcp_bridge_key"))return null;let r=He(e.headers["x-vcp-site-edit-key"]),o=Ft(r,t.sessionKey),s=He(e.headers.host),i=He(e.headers.origin);return s&&!Qr(s,t.host,i)?null:i?Lr(i,s,t.allowedOrigins)?{authenticatedByHeader:o}:null:o?{authenticatedByHeader:!0}:null}function Xr(e,t,n){let r=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},Gr),o,s=()=>{clearTimeout(r),e.off("message",o),e.off("close",s)},i=()=>{s(),e.close(1008,"bridge authentication failed")};o=a=>{try{let c=B.parseMessage(a.toString());if(c.type!=="auth"||!Ft(c.payload.key,t)){i();return}s(),e.readyState===Nt.OPEN&&e.send(B.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{i()}},e.on("message",o),e.on("close",s)}function Ft(e,t){if(!e)return!1;let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&Or(n,r)}function Qr(e,t,n){let r=Pt(e),o=Pt(t);return r===o||kt(o)&&kt(r)&&(!n||Ve(n,e))||Zr(o)&&(!n||Ve(n,e))}function Zr(e){return e==="0.0.0.0"||e==="::"}function kt(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Lr(e,t,n){return n.includes(e)||(t?Ve(e,t):!1)}function Ve(e,t){try{return new URL(e).host===Mt(t)}catch{return!1}}function Pt(e){let t=Mt(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function Mt(e){return e.trim().toLowerCase()}function He(e){return Array.isArray(e)?e[0]:e}function eo(){return Ar(32).toString("base64url")}import to from"node:http";import{existsSync as X,readFileSync as Y}from"node:fs";import{createRequire as jt}from"node:module";import xe from"node:path";import{basename as Wt,dirname as ae,join as ce}from"node:path";import{fileURLToPath as Ht}from"node:url";var no="next",ro="127.0.0.1",oo=3e3,Re="/__vcp/site-edit/bridge",Ut="/__vcp/site-edit/health",Ie="/__vcp/site-edit/client/",so=`${Ie}auto-bootstrap.js`,Vt='data-vcp-site-edit-bootstrap="true"',io=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],ao="@vcp-dev/site-edit-engine/webpack-loader",co=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,uo=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],lo=new Set(["auto-bootstrap.js","client.js","designer-trace.js","document-codec.js","protocol.js","window-message.js"]);async function Is(e={}){let t=xe.resolve(e.projectRoot??process.cwd()),n=e.host??ro,r=e.port??Uo(process.env.PORT)??oo,o=e.bridgePath??Re,s=bo(o),i=Oo(),a=e.basePath??process.env.VCP_SITE_PREVIEW_BASE_PATH??"/",c=await wo(t),u=fo(t),f=c({dev:!0,dir:t,hostname:n,port:r,...po(u)}),m=f.getRequestHandler();await f.prepare();let g=null,y=to.createServer((I,D)=>{_o({basePath:a,bridgePath:o,bridgeHealthPath:s,bridgeSessionKey:i,getBridgeHealth:()=>g?.getHealth()??To(o),handle:m,request:I,response:D}).catch(k=>{console.error(k),D.headersSent||(D.statusCode=500),D.end("site edit preview request failed")})});g=Dt(y,{siteId:e.siteId??process.env.VCP_SITE_ID??"site_preview",snapshotId:e.snapshotId??process.env.VCP_SNAPSHOT_ID??Ho(t),projectRoot:t,basePath:a,host:n,port:r,path:o,sessionKey:i}),go({server:y,bridgePath:o,handleUpgrade:f.getUpgradeHandler()});let _=()=>{g?.stop(),f.close().catch(()=>{}),y.close()};return process.on("SIGINT",_),process.on("SIGTERM",_),await Vo(y,r,n),{bundler:u,close:_,server:y}}function fo(e){let t=ho(e);return t&&mo(t)?"webpack":"turbopack"}function po(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function ho(e){for(let t of io){let n=ce(e,t);if(X(n))return Y(n,"utf8")}return null}function mo(e){return e.includes(ao)?!0:co.test(e)&&uo.some(t=>t.test(e))}function go(e){let t=(n,r,o)=>{yo(n.url,e.bridgePath)||e.handleUpgrade(n,r,o).catch(s=>{console.error(s),r.destroyed||r.destroy()})};return e.server.on("upgrade",t),()=>e.server.off("upgrade",t)}function yo(e,t){return new URL(e??"/","http://localhost").pathname===t}function bo(e=Re){if(e===Re)return Ut;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function So(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??Eo()});return`<script type="module" ${Vt}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(so)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function Eo(){return{bridge:$e("@vcp-dev/site-edit-bridge"),contracts:$e("@vcp-dev/contracts"),engine:$e("@vcp-dev/site-edit-engine")}}function $e(e){let t=jt(import.meta.url);try{let n=t.resolve(e),r=vo(n,e);if(!r)return;let o=JSON.parse(Y(r,"utf8"));return typeof o.version=="string"?o.version:void 0}catch{return}}function vo(e,t){let n=xe.parse(e).root,r=ae(e);for(;r&&r!==n;){let o=ce(r,"package.json");if(X(o))try{if(JSON.parse(Y(o,"utf8")).name===t)return o}catch{return}r=ae(r)}}function Ro(e,t){if(e.includes(Vt))return e;let n=So(t),r=/<\/body\s*>/i.exec(e);return r?`${e.slice(0,r.index)}${n}${e.slice(r.index)}`:`${e}${n}`}function xs(e,t=ae(Ht(import.meta.url)),n=X){return $t(e,t,n)?.path??null}function $t(e,t=ae(Ht(import.meta.url)),n=X){let r=new URL(e??"/","http://localhost").pathname;if(!r.startsWith(Ie))return null;let o=r.slice(Ie.length);if(!lo.has(o))return null;let s=Ge(jo(t),o);if(Wt(t)!=="src")return{path:s,requiresTranspile:!1};let i=Ge(t,o.replace(/\.js$/,".ts"));return n(i)?{path:i,requiresTranspile:!0}:{path:s,requiresTranspile:!1}}async function Io(e,t){let n=$t(e.url);if(!n)return!1;if(!X(n.path))return t.writeHead(404),t.end("site edit client asset not found"),!0;let r=n.requiresTranspile?await xo(Y(n.path,"utf8")):Y(n.path);return t.writeHead(200,{"cache-control":"no-store","content-type":"text/javascript; charset=utf-8"}),t.end(r),!0}async function xo(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function _o({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:r,getBridgeHealth:o,handle:s,request:i,response:a}){if(Co(i,a,n,o)||await Io(i,a))return;let c=ko(i),u=Po(i),f=c||u?Bo(a,{basePath:e,bridgePath:t,bridgeSessionKey:r,patchNextDevChunk:u}):()=>{};try{await s(i,a)}catch(m){throw f(),m}}function Co(e,t,n,r){if(e.method!=="GET"||new URL(e.url??"/","http://localhost").pathname!==n)return!1;let s=r();return t.writeHead(s.ok?200:503,{"cache-control":"no-store","content-type":"application/json; charset=utf-8"}),t.end(JSON.stringify(s)),!0}function To(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function ko(e){return No(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Po(e){return Do(e)?(e.headers["accept-encoding"]="identity",!0):!1}function No(e){if(e.method!=="GET")return!1;let t=new URL(e.url??"/","http://localhost").pathname;if(t.startsWith("/_next/")||t.startsWith(Ie)||t===Re||t===Ut)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function Do(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 Bo(e,t){let n=[],r=e,o=r.flushHeaders.bind(e),s=r.write.bind(e),i=r.end.bind(e);return r.flushHeaders=()=>{},r.write=(a,c,u)=>(a!==void 0&&n.push(Kt(a,qt(c))),wt(c),wt(u),!0),r.end=(a,c,u)=>{let f=typeof a=="function"?void 0:a;f!==void 0&&n.push(Kt(f,qt(c))),r.write=s,r.end=i,r.flushHeaders=o;let m=Buffer.concat(n),g=Ao(e,m,t);g!==m&&!e.headersSent&&e.removeHeader("content-length");let y=typeof a=="function"?a:typeof c=="function"?c:typeof u=="function"?u:void 0;return y?i(g,y):i(g)},()=>{r.write=s,r.end=i,r.flushHeaders=o}}function Ao(e,t,n){if(Fo(e,t))return Buffer.from(Ro(t.toString("utf8"),n));if(n.patchNextDevChunk&&Mo(e)){let r=t.toString("utf8"),o=Ko(r);if(o!==r)return Buffer.from(o)}return t}function Oo(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function Fo(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 Mo(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 Ko(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
|
+
`),s.destroy();return}u.authenticatedByHeader&&n.add(o),t.handleUpgrade(o,s,a,c=>{t.emit("connection",c,o)})};return e.server.on("upgrade",i),t.on("connection",(o,s)=>{if(n.has(s)){r(o);return}ci(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 Ye=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===jt.OPEN){if(this.socket.bufferedAmount+Buffer.byteLength(t,"utf8")>ri){this.socket.close(1013,"bridge backpressure");return}this.socket.send(t)}}close(t,n){this.socket.close(t,n)}};function ai(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function ui(e,t){if(new URL(e.url??"/","http://localhost").searchParams.has("vcp_bridge_key"))return null;let r=Ge(e.headers["x-vcp-site-edit-key"]),i=Jt(r,t.sessionKey),o=Ge(e.headers.host),s=Ge(e.headers.origin);return o&&!li(o,t.host,s)?null:s?hi(s,o,t.allowedOrigins)?{authenticatedByHeader:i}:null:i?{authenticatedByHeader:!0}:null}function ci(e,t,n){let r=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},ii),i,o=()=>{clearTimeout(r),e.off("message",i),e.off("close",o)},s=()=>{o(),e.close(1008,"bridge authentication failed")};i=a=>{try{let u=B.parseMessage(a.toString());if(u.type!=="auth"||!Jt(u.payload.key,t)){s();return}o(),e.readyState===jt.OPEN&&e.send(B.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{s()}},e.on("message",i),e.on("close",o)}function Jt(e,t){if(!e)return!1;let n=Buffer.from(e),r=Buffer.from(t);return n.length===r.length&&zr(n,r)}function li(e,t,n){let r=qt(e),i=qt(t);return r===i||Kt(i)&&Kt(r)&&(!n||Xe(n,e))||di(i)&&(!n||Xe(n,e))}function di(e){return e==="0.0.0.0"||e==="::"}function Kt(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function hi(e,t,n){return n.includes(e)||(t?Xe(e,t):!1)}function Xe(e,t){try{return new URL(e).host===Yt(t)}catch{return!1}}function qt(e){let t=Yt(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function Yt(e){return e.trim().toLowerCase()}function Ge(e){return Array.isArray(e)?e[0]:e}function fi(){return $r(32).toString("base64url")}import pi from"node:http";import{existsSync as Z,readFileSync as Q}from"node:fs";import{createRequire as Lt}from"node:module";import ae from"node:path";import{basename as en,dirname as ue,join as ce}from"node:path";import{fileURLToPath as tn}from"node:url";var mi="next",gi="127.0.0.1",yi=3e3,_e="/__vcp/site-edit/bridge",nn="/__vcp/site-edit/health",Te="/__vcp/site-edit/client/",bi=`${Te}auto-bootstrap.js`,rn='data-vcp-site-edit-bootstrap="true"',Si=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],vi="@vcp-dev/site-edit-engine/webpack-loader",Ei=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,Ii=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],xi=new Set(["auto-bootstrap.js","client.js","designer-trace.js","document-codec.js","protocol.js","window-message.js"]);async function Vo(e={}){let t=ae.resolve(e.projectRoot??process.cwd()),n=e.host??gi,r=e.port??to(process.env.PORT)??yi,i=e.bridgePath??_e,o=Pi(i),s=zi(),a=e.basePath??process.env.VCP_SITE_PREVIEW_BASE_PATH??"/",u=(e.tenantId??process.env.VCP_TENANT_ID)?.trim()||void 0,c=await Qi(t),l=Ci(t),f=c({dev:!0,dir:t,hostname:n,port:r,...Ri(l)}),y=f.getRequestHandler(),g=e.siteId??process.env.VCP_SITE_ID??"site_preview",C=e.snapshotId??process.env.VCP_SNAPSHOT_ID??eo(t),I=e.historyRoot??process.env.VCP_SITE_EDIT_HISTORY_ROOT,D=I?.trim()?ae.resolve(I):void 0;await f.prepare();let R=null,N=pi.createServer((L,M)=>{wi({basePath:a,bridgePath:i,bridgeHealthPath:o,bridgeSessionKey:s,getBridgeHealth:()=>R?.getHealth()??Ki(i),handle:y,request:L,response:M}).catch(G=>{console.error(G),M.headersSent||(M.statusCode=500),M.end("site edit preview request failed")})});R=Wt(N,{...u?{tenantId:u}:{},siteId:g,snapshotId:C,projectRoot:t,basePath:a,host:n,port:r,path:i,sessionKey:s,...D?{historyRoot:D}:{}}),ki({server:N,bridgePath:i,handleUpgrade:f.getUpgradeHandler()});let z=()=>{R?.stop(),f.close().catch(()=>{}),N.close()};return process.on("SIGINT",z),process.on("SIGTERM",z),await no(N,r,n),{bundler:l,close:z,server:N}}function Ci(e){let t=_i(e);return t&&Ti(t)?"webpack":"turbopack"}function Ri(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function _i(e){for(let t of Si){let n=ce(e,t);if(Z(n))return Q(n,"utf8")}return null}function Ti(e){return e.includes(vi)?!0:Ei.test(e)&&Ii.some(t=>t.test(e))}function ki(e){let t=(n,r,i)=>{Di(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 Di(e,t){return new URL(e??"/","http://localhost").pathname===t}function Pi(e=_e){if(e===_e)return nn;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function Ni(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??Bi()});return`<script type="module" ${rn}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(bi)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function Bi(){return{bridge:Qe("@vcp-dev/site-edit-bridge"),contracts:Qe("@vcp-dev/contracts"),engine:Qe("@vcp-dev/site-edit-engine")}}function Qe(e){let t=Lt(import.meta.url);try{let n=t.resolve(e),r=Ai(n,e);if(!r)return;let i=JSON.parse(Q(r,"utf8"));return typeof i.version=="string"?i.version:void 0}catch{return}}function Ai(e,t){let n=ae.parse(e).root,r=ue(e);for(;r&&r!==n;){let i=ce(r,"package.json");if(Z(i))try{if(JSON.parse(Q(i,"utf8")).name===t)return i}catch{return}r=ue(r)}}function Fi(e,t){if(e.includes(rn))return e;let n=Ni(t),r=/<\/body\s*>/i.exec(e);return r?`${e.slice(0,r.index)}${n}${e.slice(r.index)}`:`${e}${n}`}function Ko(e,t=ue(tn(import.meta.url)),n=Z){return on(e,t,n)?.path??null}function on(e,t=ue(tn(import.meta.url)),n=Z){let r=new URL(e??"/","http://localhost").pathname;if(!r.startsWith(Te))return null;let i=r.slice(Te.length);if(!xi.has(i))return null;let o=Ze(Zi(t),i);if(en(t)!=="src")return{path:o,requiresTranspile:!1};let s=Ze(t,i.replace(/\.js$/,".ts"));return n(s)?{path:s,requiresTranspile:!0}:{path:o,requiresTranspile:!1}}async function Mi(e,t){let n=on(e.url);if(!n)return!1;if(!Z(n.path))return t.writeHead(404),t.end("site edit client asset not found"),!0;let r=n.requiresTranspile?await Oi(Q(n.path,"utf8")):Q(n.path);return t.writeHead(200,{"cache-control":"no-store","content-type":"text/javascript; charset=utf-8"}),t.end(r),!0}async function Oi(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function wi({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:r,getBridgeHealth:i,handle:o,request:s,response:a}){if(Vi(s,a,n,i)||await Mi(s,a))return;let u=qi(s),c=Hi(s),l=u||c?Wi(a,{basePath:e,bridgePath:t,bridgeSessionKey:r,patchNextDevChunk:c}):()=>{};try{await o(s,a)}catch(f){throw l(),f}}function Vi(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 Ki(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function qi(e){return ji(e)?(e.headers["accept-encoding"]="identity",!0):!1}function Hi(e){return Ui(e)?(e.headers["accept-encoding"]="identity",!0):!1}function ji(e){if(e.method!=="GET")return!1;let t=new URL(e.url??"/","http://localhost").pathname;if(t.startsWith("/_next/")||t.startsWith(Te)||t===_e||t===nn)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function Ui(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 Wi(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=(a,u,c)=>(a!==void 0&&n.push(Xt(a,Qt(u))),Zt(u),Zt(c),!0),r.end=(a,u,c)=>{let l=typeof a=="function"?void 0:a;l!==void 0&&n.push(Xt(l,Qt(u))),r.write=o,r.end=s,r.flushHeaders=i;let f=Buffer.concat(n),y=$i(e,f,t);y!==f&&!e.headersSent&&e.removeHeader("content-length");let g=typeof a=="function"?a:typeof u=="function"?u:typeof c=="function"?c:void 0;return g?s(y,g):s(y)},()=>{r.write=o,r.end=s,r.flushHeaders=i}}function $i(e,t,n){if(Gi(e,t))return Buffer.from(Fi(t.toString("utf8"),n));if(n.patchNextDevChunk&&Ji(e)){let r=t.toString("utf8"),i=Yi(r);if(i!==r)return Buffer.from(i)}return t}function zi(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function Gi(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 Ji(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 Yi(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,[r,
|
|
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,[r,i])=>Xi(n,r,i),e)}function Xi(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 Xt(e,t){return Buffer.isBuffer(e)?e:e instanceof Uint8Array?Buffer.from(e):Buffer.from(String(e),t)}function Qt(e){return typeof e=="string"?e:void 0}function Zt(e){typeof e=="function"&&e()}async function Qi(e){let n=Lt(ce(e,"package.json"))(mi);return n.default??n}function Zi(e){return en(e)!=="src"?e:Ze(Li(e),"dist")}function Li(e){return sn(e)?ae.posix.dirname(e):ue(e)}function Ze(e,t){return sn(e)?ae.posix.join(e,t):ce(e,t)}function sn(e){return e.includes("/")&&!e.includes("\\")}function eo(e){let t=ce(e,".vcp/current-snapshot.json");if(!Z(t))return"sandbox_worktree";try{let n=JSON.parse(Q(t,"utf8"));return typeof n.snapshotId=="string"?n.snapshotId:"sandbox_worktree"}catch{return"sandbox_worktree"}}function to(e){if(!e)return null;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:null}function no(e,t,n){return new Promise((r,i)=>{e.once("error",i),e.listen(t,n,()=>{e.off("error",i),r()})})}export{ri as SITE_EDIT_BRIDGE_MAX_BUFFERED_BYTES,Ut as SITE_EDIT_BRIDGE_MAX_PAYLOAD_BYTES,ut as SITE_EDIT_FRAME_RUNTIME_CHANNEL,at as SITE_EDIT_WINDOW_MESSAGE_NAMESPACE,Re as SiteEditBridgeServer,fe as SiteEditBridgeSocketServer,B as SiteEditBridgeTransport,pe as SiteEditWebSocketClient,He as VCP_SITE_EDIT_BRIDGE_STATUS_EVENT,qe as VCP_SITE_EDIT_ROUTE_READY_EVENT,st as VCP_WINDOW_MESSAGE_SOURCE,ho as VCP_WINDOW_MESSAGE_VERSION,ki as attachNextDevUpgradeHandler,Wt as attachSiteEditBridgeServer,si as attachSiteEditWebSocketServer,Ni as createSiteEditAutoBootstrapHtmlSnippet,ot as createSiteEditBridge,ie as createSiteEditFrameRuntimeMessage,Tn as createVcpWindowMessageEnvelope,Ne as decodeRenderDocument,Pe as encodeRenderDocument,Do as ensureSiteEditBridgeServerStarted,Fi as injectSiteEditAutoBootstrap,ln as isCompactRenderDocument,bn as isDesignerTraceEnabled,ct as isSiteEditFrameRuntimeMessage,kn as isVcpWindowMessageEnvelope,Yi as patchNextFirefoxDevChunk,Hi as prepareFirefoxNextDevChunkPatchRequest,qi as prepareSiteEditHtmlInjectionRequest,Pi as resolveSiteEditBridgeHealthPath,on as resolveSiteEditClientAsset,Ko as resolveSiteEditClientAssetPath,Ci as resolveSiteEditNextDevBundler,An as resolveSiteEditRouteId,Mn as resolveSiteEditWebSocketUrl,Sn as sanitizeTracePayload,go as startSiteEditAutoBootstrap,jn as startSiteEditFrameRuntime,Vo as startSiteEditNextDevServer,W as traceDesignerEvent,Oi as transpileSiteEditClientSource};
|
|
@@ -7,8 +7,10 @@ export type SiteEditNextDevServerOptions = {
|
|
|
7
7
|
host?: string;
|
|
8
8
|
port?: number;
|
|
9
9
|
projectRoot?: string;
|
|
10
|
+
tenantId?: string;
|
|
10
11
|
siteId?: string;
|
|
11
12
|
snapshotId?: string;
|
|
13
|
+
historyRoot?: string;
|
|
12
14
|
};
|
|
13
15
|
export type SiteEditNextDevBundler = "turbopack" | "webpack";
|
|
14
16
|
type SiteEditClientAsset = {
|