@vcp-dev/site-edit-bridge 0.10.0 → 0.10.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.
@@ -1,6 +1,6 @@
1
1
  import ue from"node:http";import{existsSync as _,readFileSync as E}from"node:fs";import{randomUUID as Bt}from"node:crypto";import{createRequire as Be}from"node:module";import{Socket as Pe}from"node:net";import H from"node:path";import{basename as De,dirname as A,join as B}from"node:path";import{fileURLToPath as Oe}from"node:url";import et from"node:http";import P from"node:fs";import{createHash as be,randomBytes as tt,timingSafeEqual as nt}from"node:crypto";import g from"node:path";import{WebSocket as ve,WebSocketServer as st}from"ws";import{createPreviewSiteEditEngineRuntime as ot,openFileHistoryStore as it,resolveManagedPageTemplateComposition as rt,scanSiteEditCompositionsFromFiles as at}from"@vcp-dev/site-edit-engine";import{resolveNextAppRouteId as ct,scanNextAppRouterRoutesFromFiles as ut}from"@vcp-dev/site-edit-engine/next-app-router";import{SiteEditSourceWatcher as dt}from"@vcp-dev/site-edit-engine/source-watcher";function ge(e){let t=new Map,n=[],s=new Map,o=[],i=e.pageComposition.status==="supported"?e.pageComposition.placementUnitKeys:[],r=new Map(i.map((d,p)=>[d,p])),a=e.pageComposition.status==="supported"?{status:"supported",containerKey:e.pageComposition.containerKey,hasBusinessMembers:e.pageComposition.hasBusinessMembers,placementUnitKeys:e.pageComposition.placementUnitKeys,placements:e.pageComposition.placements.map(d=>({placementKey:d.placementKey,placementUnitKey:d.placementUnitKey,relation:d.relation}))}:{status:"unsupported",reason:e.pageComposition.reason,diagnostics:e.pageComposition.diagnostics},u=e.entries.flatMap((d,p)=>d.dynamicDataSummary?[[p,d.dynamicDataSummary]]:[]),c=d=>{let p=t.get(d);if(typeof p=="number")return p;let l=n.length;return n.push(d),t.set(d,l),l},h=d=>{let p=null;for(let l of We(d)){let S=`${p??"root"}\0${l}`,I=s.get(S);if(typeof I=="number"){p=I;continue}let w=o.length;o.push([p,c(l)]),s.set(S,w),p=w}if(p===null)throw new Error("Document key must not be empty");return p};return{encoding:"segment-trie-v1",siteId:e.siteId,snapshotId:e.snapshotId,composition:{...e.composition},routeId:e.composition.routeId,version:e.version,pageComposition:a,tokens:n,nodes:o,entries:e.entries.map(d=>{let p=d.pageCompositionUnitKey?r.get(d.pageCompositionUnitKey)??-1:-1;if(d.pageCompositionUnitKey&&p<0)throw new Error(`Render entry ${d.key} references unknown page composition unit ${d.pageCompositionUnitKey}`);return[h(d.key),$e(d.operationSummary),...p>=0?[p]:[]]}),...u.length>0?{dynamicDataSummaries:u}:{}}}function $e(e){return(e.canUpdateText?1:0)|(e.canInsertChild?2:0)|(e.canMove?4:0)|(e.canRemove?8:0)}function We(e){if(!e)return[];let t=[],n=0,s=me(e,n);if(s<0)return t.push(e),t;for(t.push(e.slice(0,s)),n=s;n<e.length;){if(s=me(e,n+(e.startsWith("::",n)?2:1)),s<0){t.push(e.slice(n));break}t.push(e.slice(n,s)),n=s}return t}function me(e,t){let n=e.indexOf("/",t),s=e.indexOf("::",t);return n<0?s:s<0?n:Math.min(n,s)}var ye="SITE_EDIT_COMPOSITION_SESSION_MISMATCH",Z="SITE_EDIT_COMPOSITION_SESSION_REQUIRED";var m=class e{constructor(){}static parseMessage(t,n={}){let s=JSON.parse(t);if(!e.isMessage(s,n))throw new Error("Invalid site edit bridge message");return s}static stringifyMessage(t){return JSON.stringify(t)}static extractRequestInfo(t){if(f(t)&&f(t.payload)){let n=typeof t.payload.id=="string"?t.payload.id:"unknown",s=this.isRequestKind(t.payload.kind)?t.payload.kind:"get-document";return{id:n,kind:s}}return{id:"unknown",kind:"get-document"}}static isRequestKind(t){return t==="initialize-session"||t==="get-document"||t==="get-history-status"||t==="get-style-context"||t==="get-object-edit-context"||t==="get-class-name-source"||t==="get-source-tree"||t==="get-source-file"||t==="resolve-source-location"||t==="execute"||t==="undo"||t==="redo"}static isMessage(t,n={}){return!f(t)||typeof t.type!="string"?!1:t.type==="request"?Le(t.payload,n):t.type==="response"||t.type==="error"?f(t.payload)&&typeof t.payload.id=="string":t.type==="event"?f(t.payload)&&f(t.payload.event):t.type==="auth"?f(t.payload)&&typeof t.payload.key=="string":t.type==="auth-ok"&&f(t.payload)&&t.payload.ok===!0}},j=class{constructor(t){this.options=t,this.session={subscribedCompositionKeys:new Set},this.messageQueue=new Y,this.eventDispatcher=new Q(n=>{this.sendJson(n)}),this.unsubscribe=t.engine.subscribe(n=>{this.handleEngineEvent(n)}),t.socket.onmessage=n=>{try{this.messageQueue.enqueue(()=>this.handleRawMessage(n.data))}catch(s){this.sendJson({type:"error",payload:{id:"unknown",kind:"get-document",message:s instanceof Error?s.message:"Bridge queue overflow"}}),t.socket.close(1013,"bridge busy")}},t.socket.onclose=()=>{this.unsubscribe(),this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.clear()}}async handleMessage(t){try{let n=t;if(n.type!=="request")return;let s=n.payload,{id:o}=s;switch(s.kind){case"initialize-session":{let i=L(s),r=await this.resolve(i),a=await this.options.engine.initializeSession({composition:r.context,...s.mutationContext?{mutationContext:s.mutationContext}:{}});this.activateSession(r.context),this.sendJson({type:"response",payload:{id:o,kind:s.kind,result:x({...a,data:{...a.data,document:Ie(a.data.document)}},r.context)}});return}case"get-document":{let i=await this.resolveWireContext(s),r=await this.options.engine.getDocument(i);this.sendResult(o,s.kind,Ze(r,i));return}case"get-history-status":{let i=await this.resolveWireContext(s),r=await this.options.engine.getHistoryStatus(i);this.sendResult(o,s.kind,x(r,i));return}case"get-style-context":{let i=await this.resolveWireContext(s);this.sendResult(o,s.kind,x(await this.options.engine.getStyleContext(i),i));return}case"get-object-edit-context":{let i=await this.resolveWireContext(s);this.sendResult(o,s.kind,x(await this.options.engine.getObjectEditContext(s.key,i,s.selectionRef),i));return}case"get-class-name-source":{let i=await this.resolveWireContext(s);this.sendResult(o,s.kind,x(await this.options.engine.getClassNameSource(s.key,i),i));return}case"get-source-tree":{let i=await this.resolveWireContext(s);this.sendResult(o,s.kind,x(await this.options.engine.getSourceTree(i),i));return}case"get-source-file":{let i=await this.resolveWireContext(s);this.sendResult(o,s.kind,x(await this.options.engine.getSourceFile({path:s.path,composition:i}),i));return}case"resolve-source-location":{let i=await this.resolveWireContext(s),r=x(await this.options.engine.resolveSourceLocation({key:s.key,composition:i}),i);this.sendResult(o,s.kind,r);return}case"execute":{let i=await this.resolveOperationWireContext(s.request),r=await this.resolveWireContext(s);if(C(i)!==C(r))throw new R(ye,"The execute request composition does not match its operation composition.");let a=await this.normalizeOperationRequest(s.request,i);await this.handleBufferedOperation(o,s.kind,()=>this.options.engine.execute(a));return}case"undo":case"redo":{let i=await this.resolveWireContext(s);await this.handleBufferedOperation(o,s.kind,()=>s.kind==="undo"?this.options.engine.undo(i):this.options.engine.redo(i));return}}}catch(n){let s=m.extractRequestInfo(t);this.sendJson({type:"error",payload:{...s,message:G(n),code:J(n)}})}}async resolve(t){return this.options.engine.resolveComposition(t)}async resolveAndAssert(t){let n=await this.resolve(t),s=this.session.activeComposition;if(!s)throw new R(Z,"Initialize a composition session before issuing this request.");if(C(s)!==C(n.context))throw new R(ye,"The request composition does not match the active socket session.");return n.context}async resolveWireContext(t){let n=L(t);return this.resolveAndAssert(n)}async resolveOperationWireContext(t){let n=Qe(t);return this.resolveAndAssert(n)}activateSession(t){this.session.activeComposition=t,this.session.subscribedCompositionKeys.clear(),this.session.subscribedCompositionKeys.add(C(t))}async normalizeOperationRequest(t,n){let s={...t,composition:Se(n)};if(s.target.kind==="route"){let o=s.target,i=L(o),r=await this.resolveAndAssert(i);s.target={...o,composition:Se(r)}}return s}handleEngineEvent(t){let n=t?.composition;if(!Ge(n))return;let s=C(n);this.session.subscribedCompositionKeys.has(s)&&(this.eventDispatcher.push(t),t.type==="site-edit.graph.invalidated"&&s===Ye(this.session)&&(this.session.activeComposition=void 0,this.session.subscribedCompositionKeys.delete(s)))}sendResult(t,n,s){this.sendJson({type:"response",payload:{id:t,kind:n,result:s}})}async handleRawMessage(t){try{await this.handleMessage(m.parseMessage(t,{validateOperationRequest:this.options.validateOperationRequest}))}catch(n){let s=Xe(t);this.sendJson({type:"error",payload:{...s,message:G(n),code:J(n)}})}}sendJson(t){this.options.socket.send(m.stringifyMessage(t))}async handleBufferedOperation(t,n,s){this.eventDispatcher.beginBuffering();try{let o=await s();this.sendResult(t,n,o)}catch(o){this.sendJson({type:"error",payload:{id:t,kind:n,message:G(o),code:J(o)}})}finally{this.eventDispatcher.flush()}}},R=class extends Error{constructor(t,n){super(n),this.code=t,this.name="BridgeProtocolError"}},Q=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))}},Y=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()},s=this.queue.then(n,n);return this.queue=s.then(()=>{},()=>{}),s}};function Le(e,t){if(!f(e)||typeof e.id!="string"||!m.isRequestKind(e.kind))return!1;let n=k(e.composition);switch(e.kind){case"initialize-session":return n&&(e.mutationContext===void 0||z(e.mutationContext));case"get-document":case"get-style-context":return n;case"get-object-edit-context":return typeof e.key=="string"&&n&&ze(e.selectionRef);case"get-class-name-source":case"resolve-source-location":return typeof e.key=="string"&&n;case"get-history-status":return n;case"get-source-tree":return n;case"get-source-file":return typeof e.path=="string"&&n;case"execute":return n&&Je(e.request)&&(e.request.mutationContext===void 0||z(e.request.mutationContext))&&(t.validateOperationRequest?.(e.request)??!0);case"undo":case"redo":return n&&e.mutationContext===void 0||n&&z(e.mutationContext)}}function ze(e){if(e===void 0)return!0;if(!f(e)||typeof e.key!="string"||e.key.length===0)return!1;let t=e.instanceIndex,n=e.instanceCount;return t!==void 0&&(typeof t!="number"||!Number.isInteger(t)||t<0)||n!==void 0&&(typeof n!="number"||!Number.isInteger(n)||n<=0)||typeof t=="number"&&typeof n=="number"&&t>=n?!1:Object.keys(e).every(s=>s==="key"||s==="instanceIndex"||s==="instanceCount")}function Je(e){return f(e)&&typeof e.id=="string"&&typeof e.siteId=="string"&&typeof e.baseSnapshotId=="string"&&k(e.composition)&&typeof e.kind=="string"&&f(e.target)&&(e.target.kind!=="route"||k(e.target.composition))&&typeof e.documentVersion=="number"&&Number.isInteger(e.documentVersion)&&e.documentVersion>=0&&f(e.params)}function k(e){return f(e)&&typeof e.routeId=="string"&&e.routeId.length>0&&(e.templateId===void 0||typeof e.templateId=="string"&&e.templateId.length>0)&&Object.keys(e).every(t=>t==="routeId"||t==="templateId")}function Ge(e){return f(e)&&typeof e.routeId=="string"&&(e.effectiveTemplateId===void 0||typeof e.effectiveTemplateId=="string")}function L(e){if(k(e.composition))return e.composition;throw new R(Z,"A composition selector is required for this request.")}function Qe(e){if(f(e)&&k(e.composition))return e.composition;throw new R(Z,"A composition selector is required for execute.")}function Se(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function Ye(e){return e.activeComposition?C(e.activeComposition):null}function C(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}function x(e,t){return f(e)&&e.ok===!0?{...e,composition:t}:e}function Ze(e,t){return!f(e)||e.ok!==!0?e:{...e,...t?{composition:t}:{},data:Ie(e.data)}}function Ie(e){let t=e;return ge(t.routeId?t:{...t,routeId:t.composition.routeId})}function f(e){return typeof e=="object"&&e!==null}function z(e){return f(e)&&typeof e.editingSessionId=="string"&&e.editingSessionId.length>0&&typeof e.lockId=="string"&&e.lockId.length>0&&typeof e.ownerId=="string"&&e.ownerId.length>0&&typeof e.leaseAssertion=="string"&&e.leaseAssertion.length>0}function J(e){if(!(!f(e)||typeof e.code!="string"||e.code.length===0))return e.code}function G(e){return e instanceof Error||f(e)&&typeof e.message=="string"&&e.message.length>0?e.message:"Unknown websocket operation failure"}function Xe(e){try{return m.extractRequestInfo(JSON.parse(e))}catch{return{id:"unknown",kind:"get-document"}}}var F=class{constructor(){this.tail=Promise.resolve()}run(t){let n=this.tail.then(t,t);return this.tail=n.then(()=>{},()=>{}),n}};import{SiteEditOperationRequestSchema as ht,computeSiteEditCompositionKey as b}from"@vcp-dev/contracts";var pt="127.0.0.1",ft=30218,lt="/__vcp/site-edit/bridge",Ee=6*1024*1024,mt=Ee*2,gt=3e3,we=50,te=".vcp/current-snapshot.json",xe="__VCP_SITE_EDIT_BRIDGE_SERVERS__";function _e(e,t,n={}){let s=new ne(yt(t),e,!1,n);return s.start({listen:!1}),s}var ne=class{constructor(t,n=et.createServer((i,r)=>{r.writeHead(404),r.end("VCP site edit bridge server")}),s=!0,o={}){this.options=t,this.server=n,this.closeHttpServerOnStop=s,this.dependencies=o,this.runtime=null,this.activeHistorySessionId=null,this.historySessionTransition=Promise.resolve(),this.mutationQueue=new F,this.eventListeners=new Set,this.routes=[],this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.stopWatching=null,this.stopWebSocketServer=null,this.pendingChangedFiles=new Set,this.fileChangeTimer=null,this.isStarted=!1,this.stopping=!1,this.runtimeVersionFloors=new Map,this.activeHistoryStore=null,this.versionPersistence=Promise.resolve()}start(t={}){if(this.isStarted)return;this.stopping=!1;try{P.mkdirSync(g.join(this.options.projectRoot,".vcp"),{recursive:!0})}catch(s){console.warn(`[vcp-site-edit] failed to ensure .vcp directory: ${s instanceof Error?s.message:String(s)}`)}this.refreshCompositions(!0),this.isStarted=!0,this.createRuntime();let n=bt({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 dt({projectRoot:this.options.projectRoot,watch_dirs:St(this.options.runtime.watch_dirs),interval_ms:this.options.runtime.watch_interval_ms,debounce_ms:this.options.runtime.watch_debounce_ms??we,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:s=>this.handleFileChanged(s),on_batch_change:s=>this.handleFilesChanged(s)}).start(),t.listen!==!1&&this.server.listen(this.options.port,this.options.host)}getHealth(){let t=!!this.runtime&&!this.compositionResolutionError;return{ok:this.isStarted&&t,bridgePath:this.options.path,runtimeReady:t,routesIndexed:this.routes.length,sessionRequired:!!this.options.sessionKey}}stop(){this.stopping=!0,this.stopWatching?.(),this.stopWatching=null,this.flushChangedFiles(),this.fileChangeTimer&&(clearTimeout(this.fileChangeTimer),this.fileChangeTimer=null),this.stopWebSocketServer?.(),this.stopWebSocketServer=null,this.runtime?.dispose(),this.runtime=null,this.compositions=[],this.compositionFiles=[],this.compositionResolutionError=null,this.closeHttpServerOnStop&&this.server.close();let t=Ct(),n=Rt(this.options);t.get(n)===this&&t.delete(n),this.isStarted=!1}createRuntime(t,n=null){let s=this.runtime;this.activeHistoryStore=t??null;let o=(this.dependencies.createRuntime??ot)({...this.options.tenantId?{tenantId:this.options.tenantId}:{},siteId:this.options.siteId,snapshotId:this.options.snapshotId,projectRoot:this.options.projectRoot,compositions:this.compositions,onEvent:i=>{"version"in i&&typeof i.version=="number"&&this.recordRuntimeVersion(i.version,"composition"in i?i.composition:void 0);for(let r of this.eventListeners)r(i)},...t?{historyStore:t}:{},...this.getInitialDocumentVersions().length>0?{initialDocumentVersions:this.getInitialDocumentVersions()}:{}});this.runtime=o,this.activeHistorySessionId=n,s?.dispose()}createBridgeEngine(){return{resolveComposition:t=>this.resolveComposition(t),initializeSession:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)throw new Error(`${n.code}: ${n.message}`);let s=wt(t.composition),o=this.getRuntime(),i=y(s);await o.initializeComposition(i);let a=o.getDocument(i).data;await this.recordRuntimeVersion(a.version,s);let u=(await o.getHistoryStatus()).data;return{ok:!0,composition:s,data:{document:a,historyStatus:u}}}),getDocument:async t=>{let n=this.getRuntime(),s=y(t);await n.initializeComposition(s);let o=n.getDocument(s);return await this.recordRuntimeVersion(o.data.version,t),{...o,composition:t}},getHistoryStatus:async t=>({...await this.getRuntime().getHistoryStatus(),composition:t}),getStyleContext:async t=>this.getRuntime().getStyleContext(y(t)),getObjectEditContext:async(t,n,s)=>this.getRuntime().getObjectEditContext(t,y(n),s),getClassNameSource:async(t,n)=>this.getRuntime().getClassNameSource(t,y(n)),getSourceTree:async t=>this.getRuntime().getSourceTree(y(t)),getSourceFile:async t=>this.getRuntime().getSourceFile({path:t.path,composition:y(t.composition)}),resolveSourceLocation:async t=>this.getRuntime().resolveSourceLocation({key:t.key,composition:y(t.composition)}),execute:(t,n)=>this.mutationQueue.run(async()=>{let s=await this.bindHistorySession(this.options.snapshotId);if(!s.ok)return X(s,t);let o=await this.getRuntime().executeOperation(t);return o.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(o.data.resultVersion,o.composition),o}),undo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return X(n,void 0,t);let s=await this.getRuntime().undo();return s.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(s.data.resultVersion,s.composition??t),s.composition?s:{...s,composition:t}}),redo:t=>this.mutationQueue.run(async()=>{let n=await this.bindHistorySession(this.options.snapshotId);if(!n.ok)return X(n,void 0,t);let s=await this.getRuntime().redo();return s.data?.resultVersion!==void 0&&await this.recordRuntimeVersion(s.data.resultVersion,s.composition??t),s.composition?s:{...s,composition:t}}),subscribe:t=>(this.eventListeners.add(t),()=>this.eventListeners.delete(t))}}async bindHistorySession(t){if(!this.options.historyRoot)return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history is not configured."};if(this.activeHistorySessionId===t)return{ok:!0};let n=this.historySessionTransition.then(async()=>{if(this.activeHistorySessionId===t)return;let s=await(this.dependencies.openHistoryStore??it)(xt({root:this.options.historyRoot,siteId:this.options.siteId,snapshotId:this.options.snapshotId,editingSessionId:t}));if(!this.isStarted)return;let o=s.readDocumentVersion?await s.readDocumentVersion():0,i=this.compositions[0]?.context;if(i){let r=b(i);this.runtimeVersionFloors.set(r,Math.max(this.runtimeVersionFloors.get(r)??0,o))}this.createRuntime(s,t)});this.historySessionTransition=n.catch(()=>{});try{return await n,{ok:!0}}catch{return{ok:!1,code:"RECOVERY_PERSIST_FAILED",message:"Durable edit history could not be opened."}}}recordRuntimeVersion(t,n){let s=n?b(n):null;s&&this.runtimeVersionFloors.set(s,Math.max(this.runtimeVersionFloors.get(s)??0,t));let o=this.activeHistoryStore;if(!o?.writeDocumentVersion)return Promise.resolve();let i=s?this.runtimeVersionFloors.get(s)??t:t;return this.versionPersistence=this.versionPersistence.then(()=>o.writeDocumentVersion(i)).catch(()=>{}),this.versionPersistence}handleFileChanged(t){this.handleFilesChanged([t])}handleFilesChanged(t){for(let s of t)this.pendingChangedFiles.add(s);this.fileChangeTimer&&clearTimeout(this.fileChangeTimer);let n=this.options.runtime.watch_debounce_ms??we;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,s)=>n.localeCompare(s));if(this.pendingChangedFiles.clear(),t.some(At)&&this.scheduleSnapshotIdentityAdvance(),!!this.refreshCompositions(!1))for(let n of t)this.runtime?.notifyFileChanged(n)}scheduleSnapshotIdentityAdvance(){if(this.stopping||!this.isStarted)return;let t=this.readCurrentSnapshotMarker();!t||t===this.options.snapshotId||this.mutationQueue.run(()=>this.advanceSnapshotId(t)).catch(n=>{console.warn(`[vcp-site-edit] snapshot identity advance failed: ${n instanceof Error?n.message:String(n)}`)})}readCurrentSnapshotMarker(){try{let t=P.readFileSync(g.join(this.options.projectRoot,te),"utf8"),n=JSON.parse(t),s=typeof n.snapshot_id=="string"?n.snapshot_id:"";return!s||se(s)!==s?(console.warn("[vcp-site-edit] current-snapshot marker has no valid snapshot_id"),null):s}catch(t){return console.warn(`[vcp-site-edit] current-snapshot marker unreadable: ${t instanceof Error?t.message:String(t)}`),null}}async advanceSnapshotId(t){if(this.stopping||!this.isStarted||t===this.options.snapshotId)return;let n=this.options.snapshotId;this.options.snapshotId=t;try{if(this.options.historyRoot){let o=await this.bindHistorySession(t);if(!o.ok)throw new Error(`${o.code}: ${o.message}`)}else this.createRuntime()}catch(o){this.options.snapshotId=n,console.warn(`[vcp-site-edit] snapshot identity advance rolled back to ${n}: ${o instanceof Error?o.message:String(o)}`);return}let s=new Date().toISOString();for(let o of this.compositions){let i={type:"site-edit.snapshot.changed",siteId:this.options.siteId,composition:o.context,snapshotId:t,previousSnapshotId:n,at:s};for(let r of this.eventListeners)try{r(i)}catch(a){console.warn(`[vcp-site-edit] snapshot.changed listener failed: ${a instanceof Error?a.message:String(a)}`)}}try{this.options.onSnapshotIdChanged?.(t,n)}catch(o){console.warn(`[vcp-site-edit] onSnapshotIdChanged callback failed: ${o instanceof Error?o.message:String(o)}`)}}refreshCompositions(t=!1){try{let n=It(this.options.projectRoot),s=ut(n),o=s.length>0?s:(this.options.runtime.routes??[]).map(u=>({...u})),i=at({files:n});if(i.length===0)throw new Error("No canonical App Router composition is indexed by the preview bridge.");let r=new Map(this.compositions.map(u=>[b(u.context),u])),a=new Map(i.map(u=>[b(u.context),u]));if(this.runtime){for(let[u,c]of r){let h=a.get(u);(!h||h.entryFile!==c.entryFile)&&this.runtime.unregisterComposition(y(c.context))}for(let[u,c]of a){let h=r.get(u);(!h||h.entryFile!==c.entryFile)&&this.runtime.registerComposition(c.context,c.entryFile)}}return this.routes=o,this.compositions=i,this.compositionFiles=n,this.compositionResolutionError=null,!0}catch(n){let s=n instanceof Error?n:new Error(String(n));if(this.compositionResolutionError=s,t)throw s;return!1}}resolveComposition(t){if(this.compositionResolutionError)throw this.compositionResolutionError;let n=ct(t.routeId,this.routes,this.options.basePath);if(!n)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let s=this.routes.find(r=>r.routeId===n);if(!s)throw new Error(`Route is not indexed by the preview bridge: ${t.routeId}`);let o=rt({selector:{routeId:n,...t.templateId?{templateId:t.templateId}:{}},files:this.compositionFiles,canonicalEntryFile:s.entryFile}),i=b(o.context);if(!this.compositions.some(r=>b(r.context)===i))throw new Error(`Composition is not registered by the preview bridge: ${i}`);return o}getInitialDocumentVersions(){return this.compositions.flatMap(t=>{let n=this.runtimeVersionFloors.get(b(t.context));return n===void 0?[]:[{composition:t.context,version:n}]})}getRuntime(){if(!this.runtime)throw new Error("VCP site edit preview bridge runtime is not ready");return this.runtime}};function yt(e){return{tenantId:e.tenantId,siteId:e.siteId,snapshotId:e.snapshotId,projectRoot:g.resolve(e.projectRoot??process.cwd()),basePath:e.basePath??"",host:e.host??pt,port:e.port??ft,path:e.path??lt,sessionKey:e.sessionKey??Ht(),historyRoot:e.historyRoot,allowedOrigins:e.allowedOrigins??[],runtime:e.runtime??{},onSnapshotIdChanged:e.onSnapshotIdChanged}}function St(e){let t=["app","src/app","components/site","src/components/site","lib/generated","src/lib/generated","public"];return[...new Set([...e?.length?e:t,".vcp"])]}function It(e){let t=[],n=["app","src/app",".vcp"],s=new Set([".git",".next",".turbo","coverage","dist","node_modules","output","snapshot-store"]),o=i=>{if(!P.existsSync(i))return;let r;try{r=P.readdirSync(i,{withFileTypes:!0})}catch{return}for(let a of r){if(a.name.startsWith(".")&&a.name!==".vcp")continue;if(a.isDirectory()){if(s.has(a.name))continue;o(g.join(i,a.name));continue}if(!a.isFile())continue;let u=g.join(i,a.name),c="";try{c=P.readFileSync(u,"utf8")}catch{}t.push({path:g.relative(e,u).replaceAll(g.sep,"/"),content:c})}};for(let i of n)o(g.join(e,i));return t.sort((i,r)=>i.path.localeCompare(r.path))}function wt(e){if(!e||typeof e!="object"||typeof e.routeId!="string")throw new Error("Normalized composition context is required.");if("effectiveTemplateId"in e)return e;let t=e;return{routeId:t.routeId,...t.templateId?{effectiveTemplateId:t.templateId}:{}}}function y(e){return{routeId:e.routeId,...e.effectiveTemplateId?{templateId:e.effectiveTemplateId}:{}}}function xt(e){return g.join(g.resolve(e.root),se(e.siteId),se(e.snapshotId),be("sha256").update(e.editingSessionId).digest("hex").slice(0,32))}function se(e){return/^[A-Za-z0-9][A-Za-z0-9._-]{0,127}$/.test(e)&&e!=="."&&e!==".."?e:be("sha256").update(e).digest("hex").slice(0,32)}function Ct(){let e=globalThis;return e[xe]??=new Map,e[xe]}function Rt(e){return`${e.projectRoot}:${e.host}:${e.port}:${e.path}:${e.historyRoot??""}`}function X(e,t,n){let s=n??(t?.composition?{routeId:t.composition.routeId,...t.composition.templateId?{effectiveTemplateId:t.composition.templateId}:{}}:void 0);if(!s)throw new Error("A normalized composition is required to construct a mutation result.");return{ok:!1,composition:s,error:{code:e.code,message:e.message},data:{requestId:t?.id??"mutation-context",kind:t?.kind??"update-text",composition:s,target:t?.target??{kind:"node",key:""},resultVersion:t?.documentVersion??0}}}function bt(e){let t=new st({maxPayload:Ee,noServer:!0}),n=new WeakSet,s=i=>{new j({socket:new oe(i),engine:e.engine,validateOperationRequest:r=>ht.safeParse(r).success})},o=(i,r,a)=>{if(!vt(i,e))return;let u=Et(i,e);if(!u){r.write(`HTTP/1.1 401 Unauthorized\r
2
2
  Connection: close\r
3
3
  \r
4
- `),r.destroy();return}u.authenticatedByHeader&&n.add(i),t.handleUpgrade(i,r,a,c=>{t.emit("connection",c,i)})};return e.server.on("upgrade",o),t.on("connection",(i,r)=>{if(n.has(r)){s(i);return}_t(i,e.sessionKey,()=>{s(i)})}),t.stop=()=>{e.server.off("upgrade",o);for(let i of t.clients)i.close(1001,"bridge stopped");t.close()},t}var oe=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===ve.OPEN){if(this.socket.bufferedAmount+Buffer.byteLength(t,"utf8")>mt){this.socket.close(1013,"bridge backpressure");return}this.socket.send(t)}}close(t,n){this.socket.close(t,n)}};function vt(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function Et(e,t){if(new URL(e.url??"/","http://localhost").searchParams.has("vcp_bridge_key"))return null;let s=ee(e.headers["x-vcp-site-edit-key"]),o=Te(s,t.sessionKey),i=ee(e.headers.host),r=ee(e.headers.origin);return i&&!Tt(i,t.host,r)?null:r?Pt(r,i,t.allowedOrigins)?{authenticatedByHeader:o}:null:o?{authenticatedByHeader:!0}:null}function _t(e,t,n){let s=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},gt),o,i=()=>{clearTimeout(s),e.off("message",o),e.off("close",i)},r=()=>{i(),e.close(1008,"bridge authentication failed")};o=a=>{try{let u=m.parseMessage(a.toString());if(u.type!=="auth"||!Te(u.payload.key,t)){r();return}i(),e.readyState===ve.OPEN&&e.send(m.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{r()}},e.on("message",o),e.on("close",i)}function Te(e,t){if(!e)return!1;let n=Buffer.from(e),s=Buffer.from(t);return n.length===s.length&&nt(n,s)}function Tt(e,t,n){let s=Re(e),o=Re(t);return s===o||Ce(o)&&Ce(s)&&(!n||ie(n,e))||kt(o)&&(!n||ie(n,e))}function kt(e){return e==="0.0.0.0"||e==="::"}function Ce(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Pt(e,t,n){return n.includes(e)||(t?ie(e,t):!1)}function ie(e,t){try{return new URL(e).host===ke(t)}catch{return!1}}function Re(e){let t=ke(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function ke(e){return e.trim().toLowerCase()}function ee(e){return Array.isArray(e)?e[0]:e}function Ht(){return tt(32).toString("base64url")}function At(e){let t=e.replaceAll("\\","/");return t===te||t.endsWith(`/${te}`)}var Dt="next",Me="127.0.0.1",Ot=3e3,V="/__vcp/site-edit/bridge",Ne="/__vcp/site-edit/health",Mt="probe",Nt="render",He="/_error",q="/__vcp/site-edit/client/",jt=`${q}auto-bootstrap.js`,je='data-vcp-site-edit-bootstrap="true"',Ft=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],Ut="@vcp-dev/site-edit-engine/webpack-loader",Kt=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,Vt=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],qt=new Set(["auto-bootstrap.js","client.js","composition-key.js","designer-trace.js","document-codec.js","protocol.js","window-message.js"]);async function es(e={},t={}){let n=t.process??process,s=t.createServer??ue.createServer,o=t.attachBridgeServer??_e,i=t.loadNext??wn,r=H.resolve(e.projectRoot??process.cwd()),a=e.host??Me,u=e.port??bn(n.env.PORT)??Ot,c=e.bridgePath??V,h=Qt(c),d=mn(),p=e.basePath??n.env.VCP_SITE_PREVIEW_BASE_PATH??"/",l=(e.tenantId??n.env.VCP_TENANT_ID)?.trim()||void 0,S=await i(r),I=$t(r),w=S({dev:!0,dir:r,hostname:a,port:u,...Wt(I)}),Ke=w.getRequestHandler(),Ve=e.siteId??n.env.VCP_SITE_ID??"018f6f4d-a9b8-7120-8000-000000000120",he=e.snapshotId??n.env.VCP_SNAPSHOT_ID??Rn(r),pe=e.historyRoot??n.env.VCP_SITE_EDIT_HISTORY_ROOT,fe=pe?.trim()?H.resolve(pe):void 0,D=null,le={launchId:Bt(),pid:process.pid,snapshotId:he},v=s((T,N)=>{sn({basePath:p,bridgePath:c,bridgeHealthPath:h,bridgeSessionKey:d,getBridgeHealth:()=>D?.getHealth()??un(c),launch:le,runRenderProbe:()=>rn(w),handle:Ke,request:T,response:N}).catch(qe=>{console.error(qe),N.headersSent||(N.statusCode=500),N.end("site edit preview request failed")})}),$=null,O=null,W=()=>O||(K(()=>n.off("SIGINT",M)),K(()=>n.off("SIGTERM",M)),K(()=>$?.()),$=null,K(()=>D?.stop()),D=null,O=Promise.allSettled([En(v),_n(()=>w.close())]).then(()=>{}),O),M=()=>{W()};try{return await w.prepare(),D=o(v,{...l?{tenantId:l}:{},siteId:Ve,snapshotId:he,projectRoot:r,basePath:p,host:a,port:u,path:c,sessionKey:d,...fe?{historyRoot:fe}:{},onSnapshotIdChanged:T=>{le.snapshotId=T}}),$=Jt({server:v,bridgePath:c,handleUpgrade:w.getUpgradeHandler()}),n.on("SIGINT",M),n.on("SIGTERM",M),await vn(v,u,a),{bundler:I,close:W,host:a,port:Tn(v,u),server:v}}catch(T){throw await W(),T}}function $t(e){let t=Lt(e);return t&&zt(t)?"webpack":"turbopack"}function Wt(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function Lt(e){for(let t of Ft){let n=B(e,t);if(_(n))return E(n,"utf8")}return null}function zt(e){return e.includes(Ut)?!0:Kt.test(e)&&Vt.some(t=>t.test(e))}function Jt(e){let t=(n,s,o)=>{Gt(n.url,e.bridgePath)||e.handleUpgrade(n,s,o).catch(i=>{console.error(i),s.destroyed||s.destroy()})};return e.server.on("upgrade",t),()=>e.server.off("upgrade",t)}function Gt(e,t){return new URL(e??"/","http://localhost").pathname===t}function Qt(e=V){if(e===V)return Ne;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function Yt(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??Zt()});return`<script type="module" ${je}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(jt)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function Zt(){return{bridge:re("@vcp-dev/site-edit-bridge"),contracts:re("@vcp-dev/contracts"),engine:re("@vcp-dev/site-edit-engine")}}function re(e){let t=Be(import.meta.url);try{let n=t.resolve(e),s=Xt(n,e);if(!s)return;let o=JSON.parse(E(s,"utf8"));return typeof o.version=="string"?o.version:void 0}catch{return}}function Xt(e,t){let n=H.parse(e).root,s=A(e);for(;s&&s!==n;){let o=B(s,"package.json");if(_(o))try{if(JSON.parse(E(o,"utf8")).name===t)return o}catch{return}s=A(s)}}function en(e,t){if(e.includes(je))return e;let n=Yt(t),s=/<\/body\s*>/i.exec(e);return s?`${e.slice(0,s.index)}${n}${e.slice(s.index)}`:`${e}${n}`}function ts(e,t=A(Oe(import.meta.url)),n=_){return Fe(e,t,n)?.path??null}function Fe(e,t=A(Oe(import.meta.url)),n=_){let s=new URL(e??"/","http://localhost").pathname;if(!s.startsWith(q))return null;let o=s.slice(q.length);if(!qt.has(o))return null;let i=de(xn(t),o);if(De(t)!=="src")return{path:i,requiresTranspile:!1};let r=de(t,o.replace(/\.js$/,".ts"));return n(r)?{path:r,requiresTranspile:!0}:{path:i,requiresTranspile:!1}}async function tn(e,t){let n=Fe(e.url);if(!n)return!1;if(!_(n.path))return t.writeHead(404),t.end("site edit client asset not found"),!0;let s=n.requiresTranspile?await nn(E(n.path,"utf8")):E(n.path);return t.writeHead(200,{"cache-control":"no-store","content-type":"text/javascript; charset=utf-8"}),t.end(s),!0}async function nn(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function sn({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:s,getBridgeHealth:o,launch:i,runRenderProbe:r,handle:a,request:u,response:c}){if(await cn(u,c,n,o,i,r)||await tn(u,c))return;let h=dn(u),d=hn(u),p=h||d?ln(c,{basePath:e,bridgePath:t,bridgeSessionKey:s,patchNextDevChunk:d}):()=>{};try{await a(u,c)}catch(l){throw p(),l}}function on(e){let t=e instanceof Error?e.message:String(e),n=e&&typeof e=="object"&&"code"in e?e.code:void 0;return/\.next[/\\]/.test(t)||/chunks[/\\]ssr[/\\]/.test(t)?n==="ENOENT"||n==="MODULE_NOT_FOUND"?{verdict:"artifact_broken",detail:t}:t.includes("Cannot find module")?{verdict:"artifact_broken",detail:t}:{verdict:"inconclusive",detail:t}:{verdict:"inconclusive",detail:t}}async function rn(e){let t=new ue.IncomingMessage(new Pe);t.method="GET",t.url=He,t.headers={host:Me};let n=new ue.ServerResponse(t);n.assignSocket(new Pe);try{return await e.renderToHTML(t,n,He,{}),{verdict:"ok"}}catch(s){return on(s)}finally{try{let s=n.socket;s&&(n.detachSocket(s),s.destroy())}catch{}}}function an(e){return new URL(e??"/","http://localhost").searchParams.get(Mt)===Nt}async function cn(e,t,n,s,o,i){if(e.method!=="GET"||new URL(e.url??"/","http://localhost").pathname!==n)return!1;let a=s(),u=an(e.url)?await i():void 0,c={...a,launch:o,...u?{render:u}:{}};return t.writeHead(a.ok?200:503,{"cache-control":"no-store","content-type":"application/json; charset=utf-8"}),t.end(JSON.stringify(c)),!0}function un(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function dn(e){return pn(e)?(e.headers["accept-encoding"]="identity",!0):!1}function hn(e){return fn(e)?(e.headers["accept-encoding"]="identity",!0):!1}function pn(e){if(e.method!=="GET")return!1;let t=new URL(e.url??"/","http://localhost").pathname;if(t.startsWith("/_next/")||t.startsWith(q)||t===V||t===Ne)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function fn(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 ln(e,t){let n=[],s=e,o=s.flushHeaders.bind(e),i=s.write.bind(e),r=s.end.bind(e),a=!1;s.flushHeaders=()=>{};let u=()=>{if(t.patchNextDevChunk||a)return!1;let c=Buffer.concat(n);if(!/<body\b[^>]*>/iu.test(c.toString("utf8")))return!1;let h=Ae(e,c,t);return h!==c&&!e.headersSent&&e.removeHeader("content-length"),i(h),n.length=0,a=!0,!0};return s.write=(c,h,d)=>a?(c!==void 0&&i(ae(c,ce(h))),U(h),U(d),!0):(c!==void 0&&(n.push(ae(c,ce(h))),u()),U(h),U(d),!0),s.end=(c,h,d)=>{let p=typeof c=="function"?void 0:c;if(a)return s.write=i,s.end=r,s.flushHeaders=o,p===void 0?typeof c=="function"?r(c):typeof h=="function"?r(h):typeof d=="function"?r(d):r():typeof h=="function"?r(p,h):typeof d=="function"?r(p,h,d):r(p,h);p!==void 0&&n.push(ae(p,ce(h))),s.write=i,s.end=r,s.flushHeaders=o;let l=Buffer.concat(n),S=Ae(e,l,t);S!==l&&!e.headersSent&&e.removeHeader("content-length");let I=typeof c=="function"?c:typeof h=="function"?h:typeof d=="function"?d:void 0;return I?r(S,I):r(S)},()=>{s.write=i,s.end=r,s.flushHeaders=o}}function Ae(e,t,n){if(gn(e,t))return Buffer.from(en(t.toString("utf8"),n));if(n.patchNextDevChunk&&yn(e)){let s=t.toString("utf8"),o=Sn(s);if(o!==s)return Buffer.from(o)}return t}function mn(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function gn(e,t){if(e.statusCode<200||e.statusCode>=300)return!1;let n=e.getHeader("content-type"),s=Array.isArray(n)?n.join(";"):String(n??"");return t.toString("utf8",0,256).includes("<html")&&(s===""||s.includes("text/html"))}function yn(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 Sn(e){return[["debugChannel = createDebugChannel(undefined);","debugChannel = undefined;"],["if (isStreamErrorOrUnfinished(ctr)) {","if (false) {"],["return ctr.desiredSize === null || ctr.desiredSize < 0;","return false;"],[["findSourceMapURL: _appfindsourcemapurl.findSourceMapURL,"," debugChannel,"," startTime: 0"].join(`
4
+ `),r.destroy();return}u.authenticatedByHeader&&n.add(i),t.handleUpgrade(i,r,a,c=>{t.emit("connection",c,i)})};return e.server.on("upgrade",o),t.on("connection",(i,r)=>{if(n.has(r)){s(i);return}_t(i,e.sessionKey,()=>{s(i)})}),t.stop=()=>{e.server.off("upgrade",o);for(let i of t.clients)i.close(1001,"bridge stopped");t.close()},t}var oe=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===ve.OPEN){if(this.socket.bufferedAmount+Buffer.byteLength(t,"utf8")>mt){this.socket.close(1013,"bridge backpressure");return}this.socket.send(t)}}close(t,n){this.socket.close(t,n)}};function vt(e,t){return new URL(e.url??"/","http://localhost").pathname===t.path}function Et(e,t){if(new URL(e.url??"/","http://localhost").searchParams.has("vcp_bridge_key"))return null;let s=ee(e.headers["x-vcp-site-edit-key"]),o=Te(s,t.sessionKey),i=ee(e.headers.host),r=ee(e.headers.origin);return i&&!Tt(i,t.host,r)?null:r?Pt(r,i,t.allowedOrigins)?{authenticatedByHeader:o}:null:o?{authenticatedByHeader:!0}:null}function _t(e,t,n){let s=setTimeout(()=>{e.close(1008,"bridge authentication timeout")},gt),o,i=()=>{clearTimeout(s),e.off("message",o),e.off("close",i)},r=()=>{i(),e.close(1008,"bridge authentication failed")};o=a=>{try{let u=m.parseMessage(a.toString());if(u.type!=="auth"||!Te(u.payload.key,t)){r();return}i(),e.readyState===ve.OPEN&&e.send(m.stringifyMessage({type:"auth-ok",payload:{ok:!0}})),n()}catch{r()}},e.on("message",o),e.on("close",i)}function Te(e,t){if(!e)return!1;let n=Buffer.from(e),s=Buffer.from(t);return n.length===s.length&&nt(n,s)}function Tt(e,t,n){let s=Re(e),o=Re(t);return s===o||Ce(o)&&Ce(s)&&(!n||ie(n,e))||kt(o)&&(!n||ie(n,e))}function kt(e){return e==="0.0.0.0"||e==="::"}function Ce(e){return e==="localhost"||e==="127.0.0.1"||e==="::1"}function Pt(e,t,n){return n.includes(e)||(t?ie(e,t):!1)}function ie(e,t){try{return new URL(e).host===ke(t)}catch{return!1}}function Re(e){let t=ke(e);return t.startsWith("[")?t.slice(1,t.indexOf("]")):t.split(":").length-1===1?t.split(":",1)[0]??"":t}function ke(e){return e.trim().toLowerCase()}function ee(e){return Array.isArray(e)?e[0]:e}function Ht(){return tt(32).toString("base64url")}function At(e){let t=e.replaceAll("\\","/");return t===te||t.endsWith(`/${te}`)}var Dt="next",Me="127.0.0.1",Ot=3e3,V="/__vcp/site-edit/bridge",Ne="/__vcp/site-edit/health",Mt="probe",Nt="render",He="/_error",q="/__vcp/site-edit/client/",jt=`${q}auto-bootstrap.js`,je='data-vcp-site-edit-bootstrap="true"',Ft=["next.config.ts","next.config.mts","next.config.cts","next.config.js","next.config.mjs","next.config.cjs"],Ut="@vcp-dev/site-edit-engine/webpack-loader",Kt=/@vcp\/site-edit-engine\/(?:webpack-loader|site-edit-instrumentation-loader)/,Vt=[/\bconfig\.webpack\s*=/,/\bwebpack\s*\([^)]*\)\s*\{/,/\bwebpack\s*:\s*(?:async\s*)?(?:\([^)]*\)|[A-Za-z_$][\w$]*)?\s*=>/,/\bwebpack\s*:\s*(?:async\s+)?function\b/],qt=new Set(["auto-bootstrap.js","client.js","composition-key.js","designer-trace.js","document-codec.js","property-preview.js","protocol.js","window-message.js"]);async function es(e={},t={}){let n=t.process??process,s=t.createServer??ue.createServer,o=t.attachBridgeServer??_e,i=t.loadNext??wn,r=H.resolve(e.projectRoot??process.cwd()),a=e.host??Me,u=e.port??bn(n.env.PORT)??Ot,c=e.bridgePath??V,h=Qt(c),d=mn(),p=e.basePath??n.env.VCP_SITE_PREVIEW_BASE_PATH??"/",l=(e.tenantId??n.env.VCP_TENANT_ID)?.trim()||void 0,S=await i(r),I=$t(r),w=S({dev:!0,dir:r,hostname:a,port:u,...Wt(I)}),Ke=w.getRequestHandler(),Ve=e.siteId??n.env.VCP_SITE_ID??"018f6f4d-a9b8-7120-8000-000000000120",he=e.snapshotId??n.env.VCP_SNAPSHOT_ID??Rn(r),pe=e.historyRoot??n.env.VCP_SITE_EDIT_HISTORY_ROOT,fe=pe?.trim()?H.resolve(pe):void 0,D=null,le={launchId:Bt(),pid:process.pid,snapshotId:he},v=s((T,N)=>{sn({basePath:p,bridgePath:c,bridgeHealthPath:h,bridgeSessionKey:d,getBridgeHealth:()=>D?.getHealth()??un(c),launch:le,runRenderProbe:()=>rn(w),handle:Ke,request:T,response:N}).catch(qe=>{console.error(qe),N.headersSent||(N.statusCode=500),N.end("site edit preview request failed")})}),$=null,O=null,W=()=>O||(K(()=>n.off("SIGINT",M)),K(()=>n.off("SIGTERM",M)),K(()=>$?.()),$=null,K(()=>D?.stop()),D=null,O=Promise.allSettled([En(v),_n(()=>w.close())]).then(()=>{}),O),M=()=>{W()};try{return await w.prepare(),D=o(v,{...l?{tenantId:l}:{},siteId:Ve,snapshotId:he,projectRoot:r,basePath:p,host:a,port:u,path:c,sessionKey:d,...fe?{historyRoot:fe}:{},onSnapshotIdChanged:T=>{le.snapshotId=T}}),$=Jt({server:v,bridgePath:c,handleUpgrade:w.getUpgradeHandler()}),n.on("SIGINT",M),n.on("SIGTERM",M),await vn(v,u,a),{bundler:I,close:W,host:a,port:Tn(v,u),server:v}}catch(T){throw await W(),T}}function $t(e){let t=Lt(e);return t&&zt(t)?"webpack":"turbopack"}function Wt(e){return e==="webpack"?{webpack:!0}:{turbopack:!0}}function Lt(e){for(let t of Ft){let n=B(e,t);if(_(n))return E(n,"utf8")}return null}function zt(e){return e.includes(Ut)?!0:Kt.test(e)&&Vt.some(t=>t.test(e))}function Jt(e){let t=(n,s,o)=>{Gt(n.url,e.bridgePath)||e.handleUpgrade(n,s,o).catch(i=>{console.error(i),s.destroyed||s.destroy()})};return e.server.on("upgrade",t),()=>e.server.off("upgrade",t)}function Gt(e,t){return new URL(e??"/","http://localhost").pathname===t}function Qt(e=V){if(e===V)return Ne;let t=(e.startsWith("/")?e:`/${e}`).replace(/\/+$/,"");return t.endsWith("/bridge")?`${t.slice(0,-7)}/health`:t?`${t}/health`:"/health"}function Yt(e){let t=JSON.stringify({basePath:e.basePath,wsPath:e.bridgePath,bridge_session_key:e.bridgeSessionKey,defer_initial_sync:!0,runtime_versions:e.runtimeVersions??Zt()});return`<script type="module" ${je}>import { startSiteEditAutoBootstrap } from ${JSON.stringify(jt)};void startSiteEditAutoBootstrap(window, ${t}).catch(() => undefined);</script>`}function Zt(){return{bridge:re("@vcp-dev/site-edit-bridge"),contracts:re("@vcp-dev/contracts"),engine:re("@vcp-dev/site-edit-engine")}}function re(e){let t=Be(import.meta.url);try{let n=t.resolve(e),s=Xt(n,e);if(!s)return;let o=JSON.parse(E(s,"utf8"));return typeof o.version=="string"?o.version:void 0}catch{return}}function Xt(e,t){let n=H.parse(e).root,s=A(e);for(;s&&s!==n;){let o=B(s,"package.json");if(_(o))try{if(JSON.parse(E(o,"utf8")).name===t)return o}catch{return}s=A(s)}}function en(e,t){if(e.includes(je))return e;let n=Yt(t),s=/<\/body\s*>/i.exec(e);return s?`${e.slice(0,s.index)}${n}${e.slice(s.index)}`:`${e}${n}`}function ts(e,t=A(Oe(import.meta.url)),n=_){return Fe(e,t,n)?.path??null}function Fe(e,t=A(Oe(import.meta.url)),n=_){let s=new URL(e??"/","http://localhost").pathname;if(!s.startsWith(q))return null;let o=s.slice(q.length);if(!qt.has(o))return null;let i=de(xn(t),o);if(De(t)!=="src")return{path:i,requiresTranspile:!1};let r=de(t,o.replace(/\.js$/,".ts"));return n(r)?{path:r,requiresTranspile:!0}:{path:i,requiresTranspile:!1}}async function tn(e,t){let n=Fe(e.url);if(!n)return!1;if(!_(n.path))return t.writeHead(404),t.end("site edit client asset not found"),!0;let s=n.requiresTranspile?await nn(E(n.path,"utf8")):E(n.path);return t.writeHead(200,{"cache-control":"no-store","content-type":"text/javascript; charset=utf-8"}),t.end(s),!0}async function nn(e){let t=await import("typescript");return t.transpileModule(e,{compilerOptions:{module:t.ModuleKind.ES2022,target:t.ScriptTarget.ES2022}}).outputText}async function sn({basePath:e,bridgePath:t,bridgeHealthPath:n,bridgeSessionKey:s,getBridgeHealth:o,launch:i,runRenderProbe:r,handle:a,request:u,response:c}){if(await cn(u,c,n,o,i,r)||await tn(u,c))return;let h=dn(u),d=hn(u),p=h||d?ln(c,{basePath:e,bridgePath:t,bridgeSessionKey:s,patchNextDevChunk:d}):()=>{};try{await a(u,c)}catch(l){throw p(),l}}function on(e){let t=e instanceof Error?e.message:String(e),n=e&&typeof e=="object"&&"code"in e?e.code:void 0;return/\.next[/\\]/.test(t)||/chunks[/\\]ssr[/\\]/.test(t)?n==="ENOENT"||n==="MODULE_NOT_FOUND"?{verdict:"artifact_broken",detail:t}:t.includes("Cannot find module")?{verdict:"artifact_broken",detail:t}:{verdict:"inconclusive",detail:t}:{verdict:"inconclusive",detail:t}}async function rn(e){let t=new ue.IncomingMessage(new Pe);t.method="GET",t.url=He,t.headers={host:Me};let n=new ue.ServerResponse(t);n.assignSocket(new Pe);try{return await e.renderToHTML(t,n,He,{}),{verdict:"ok"}}catch(s){return on(s)}finally{try{let s=n.socket;s&&(n.detachSocket(s),s.destroy())}catch{}}}function an(e){return new URL(e??"/","http://localhost").searchParams.get(Mt)===Nt}async function cn(e,t,n,s,o,i){if(e.method!=="GET"||new URL(e.url??"/","http://localhost").pathname!==n)return!1;let a=s(),u=an(e.url)?await i():void 0,c={...a,launch:o,...u?{render:u}:{}};return t.writeHead(a.ok?200:503,{"cache-control":"no-store","content-type":"application/json; charset=utf-8"}),t.end(JSON.stringify(c)),!0}function un(e){return{ok:!1,bridgePath:e,runtimeReady:!1,routesIndexed:0,sessionRequired:!0}}function dn(e){return pn(e)?(e.headers["accept-encoding"]="identity",!0):!1}function hn(e){return fn(e)?(e.headers["accept-encoding"]="identity",!0):!1}function pn(e){if(e.method!=="GET")return!1;let t=new URL(e.url??"/","http://localhost").pathname;if(t.startsWith("/_next/")||t.startsWith(q)||t===V||t===Ne)return!1;let n=e.headers.accept??"";return n===""||n.includes("text/html")}function fn(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 ln(e,t){let n=[],s=e,o=s.flushHeaders.bind(e),i=s.write.bind(e),r=s.end.bind(e),a=!1;s.flushHeaders=()=>{};let u=()=>{if(t.patchNextDevChunk||a)return!1;let c=Buffer.concat(n);if(!/<body\b[^>]*>/iu.test(c.toString("utf8")))return!1;let h=Ae(e,c,t);return h!==c&&!e.headersSent&&e.removeHeader("content-length"),i(h),n.length=0,a=!0,!0};return s.write=(c,h,d)=>a?(c!==void 0&&i(ae(c,ce(h))),U(h),U(d),!0):(c!==void 0&&(n.push(ae(c,ce(h))),u()),U(h),U(d),!0),s.end=(c,h,d)=>{let p=typeof c=="function"?void 0:c;if(a)return s.write=i,s.end=r,s.flushHeaders=o,p===void 0?typeof c=="function"?r(c):typeof h=="function"?r(h):typeof d=="function"?r(d):r():typeof h=="function"?r(p,h):typeof d=="function"?r(p,h,d):r(p,h);p!==void 0&&n.push(ae(p,ce(h))),s.write=i,s.end=r,s.flushHeaders=o;let l=Buffer.concat(n),S=Ae(e,l,t);S!==l&&!e.headersSent&&e.removeHeader("content-length");let I=typeof c=="function"?c:typeof h=="function"?h:typeof d=="function"?d:void 0;return I?r(S,I):r(S)},()=>{s.write=i,s.end=r,s.flushHeaders=o}}function Ae(e,t,n){if(gn(e,t))return Buffer.from(en(t.toString("utf8"),n));if(n.patchNextDevChunk&&yn(e)){let s=t.toString("utf8"),o=Sn(s);if(o!==s)return Buffer.from(o)}return t}function mn(){let e=new Uint8Array(32);return globalThis.crypto.getRandomValues(e),Buffer.from(e).toString("base64url")}function gn(e,t){if(e.statusCode<200||e.statusCode>=300)return!1;let n=e.getHeader("content-type"),s=Array.isArray(n)?n.join(";"):String(n??"");return t.toString("utf8",0,256).includes("<html")&&(s===""||s.includes("text/html"))}function yn(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 Sn(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
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,[s,o])=>In(n,s,o),e)}function In(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 ae(e,t){return Buffer.isBuffer(e)?e:e instanceof Uint8Array?Buffer.from(e):Buffer.from(String(e),t)}function ce(e){return typeof e=="string"?e:void 0}function U(e){typeof e=="function"&&e()}async function wn(e){let n=Be(B(e,"package.json"))(Dt);return n.default??n}function xn(e){return De(e)!=="src"?e:de(Cn(e),"dist")}function Cn(e){return Ue(e)?H.posix.dirname(e):A(e)}function de(e,t){return Ue(e)?H.posix.join(e,t):B(e,t)}function Ue(e){return e.includes("/")&&!e.includes("\\")}function Rn(e){let t=B(e,".vcp/current-snapshot.json");if(!_(t))return"sandbox_worktree";try{let n=JSON.parse(E(t,"utf8"));return typeof n.snapshot_id=="string"&&n.snapshot_id?n.snapshot_id:typeof n.snapshotId=="string"&&n.snapshotId?n.snapshotId:"sandbox_worktree"}catch{return"sandbox_worktree"}}function bn(e){if(!e)return null;let t=Number.parseInt(e,10);return Number.isInteger(t)&&t>0&&t<=65535?t:null}function vn(e,t,n){return new Promise((s,o)=>{e.once("error",o),e.listen(t,n,()=>{e.off("error",o),s()})})}function En(e){return new Promise(t=>{e.close(()=>t())})}function K(e){try{e()}catch{}}function _n(e){try{return e()}catch(t){return Promise.reject(t)}}function Tn(e,t){let n=e.address();return typeof n=="object"&&n?n.port:t}export{Jt as attachNextDevUpgradeHandler,on as classifySiteEditRenderProbeError,Yt as createSiteEditAutoBootstrapHtmlSnippet,en as injectSiteEditAutoBootstrap,an as isSiteEditRenderProbeRequested,Sn as patchNextFirefoxDevChunk,hn as prepareFirefoxNextDevChunkPatchRequest,dn as prepareSiteEditHtmlInjectionRequest,Qt as resolveSiteEditBridgeHealthPath,Fe as resolveSiteEditClientAsset,ts as resolveSiteEditClientAssetPath,$t as resolveSiteEditNextDevBundler,rn as runSiteEditRenderProbe,es as startSiteEditNextDevServer,nn as transpileSiteEditClientSource};
@@ -1,4 +1,4 @@
1
- import { type SiteEditPropertyChange } from "@vcp-dev/contracts";
1
+ import type { SiteEditPropertyChange } from "@vcp-dev/contracts";
2
2
  import type { SiteEditFrameRuntimeNodePatch } from "./window-message.js";
3
3
  export type SiteEditPropertyPreviewElement = {
4
4
  kind: "host" | "component";
@@ -1,5 +1,5 @@
1
1
  import type { SiteEditCommandSuccess, SiteEditClassNameSourceStyleContext, SiteEditCompositionContext, SiteEditCompositionSelector, SiteEditEvent, SiteEditObjectEditContext, SiteEditGetClassNameSourceCommandResult, SiteEditOperationCommandResult, SiteEditOperationRequest, SiteEditRenderDocument, SiteEditSourceFileResponse, SiteEditSourceLocation, SiteEditSourceTreeResponse } from "@vcp-dev/contracts";
2
- import { type SiteEditOperationSelectionRef } from "@vcp-dev/contracts";
2
+ import type { SiteEditOperationSelectionRef } from "@vcp-dev/contracts";
3
3
  import type { SiteEditHistoryStatus } from "./protocol.js";
4
4
  export { getPropertyPreviewDomAttributeName, planPropertyPreview, type SiteEditPropertyPreviewElement, type SiteEditPropertyPreviewInput, type SiteEditPropertyPreviewResult, } from "./property-preview.js";
5
5
  export declare const VCP_WINDOW_MESSAGE_SOURCE = "vcp-window-message";
@@ -1 +1 @@
1
- import{SiteEditOperationSelectionRefSchema as te}from"@vcp-dev/contracts";function I(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}import{SiteEditSetPropsParamsSchema as Y,classifySiteEditPropertyName as N}from"@vcp-dev/contracts";var Z={allowFullScreen:"allowfullscreen",acceptCharset:"accept-charset",autoComplete:"autocomplete",autoFocus:"autofocus",autoPlay:"autoplay",cellPadding:"cellpadding",cellSpacing:"cellspacing",charSet:"charset",colSpan:"colspan",crossOrigin:"crossorigin",dateTime:"datetime",encType:"enctype",formAction:"formaction",formEncType:"formenctype",formMethod:"formmethod",formNoValidate:"formnovalidate",formTarget:"formtarget",hrefLang:"hreflang",htmlFor:"for",httpEquiv:"http-equiv",inputMode:"inputmode",itemID:"itemid",itemProp:"itemprop",itemRef:"itemref",itemScope:"itemscope",itemType:"itemtype",keyParams:"keyparams",keyType:"keytype",noModule:"nomodule",playsInline:"playsinline",readOnly:"readonly",rowSpan:"rowspan",srcDoc:"srcdoc",srcLang:"srclang",srcSet:"srcset",tabIndex:"tabindex",useMap:"usemap"},P=new Set(["allowFullScreen","async","autoFocus","autoPlay","controls","default","defer","disabled","formNoValidate","hidden","inert","itemScope","loop","multiple","muted","noModule","noValidate","open","playsInline","readOnly","required","reversed","scoped","seamless"]),F=new Set(["checked","selected","value"]),C=new Set(["accept","alt","action","cite","color","content","coords","crossOrigin","dateTime","formAction","formMethod","formTarget","headers","href","hrefLang","id","kind","label","lang","list","max","media","method","min","name","pattern","poster","property","referrerPolicy","rel","role","scope","slot","src","srcDoc","srcLang","srcSet","step","target","title","type","useMap","width","height"]);function $(e){let n=Y.safeParse({kind:"set-props",scope:e.scope,changes:e.changes});if(!n.success)return _("Typed property changes are not previewable");if(e.element.kind!=="host")return _(`The '${e.element.tagName}' component may transform its props before rendering`);let t={};for(let i of n.data.changes){let c=J(i);if(!c)return _(`The DOM result for '${i.name}' cannot be proven equivalent`);t[c.name]=c.value}return e.runtimeAttributes,{mode:"dom",patch:{attributes:t}}}function J(e){if(N(e.name).owner!=="generic")return null;let t=e.name,i=D(t);if(!i||F.has(t))return null;if(e.operation==="remove")return{name:i,value:null};let c=e.value;return t==="download"?v(i,c):P.has(t)?Q(i,c):/^(aria|data)-[A-Za-z0-9_.:-]+$/u.test(t)?ee(i,c):C.has(t)?typeof c=="string"?{name:i,value:c}:typeof c=="number"&&Number.isFinite(c)?{name:i,value:String(c)}:c===null?{name:i,value:null}:null:null}function D(e){return N(e).owner!=="generic"?null:e==="download"||F.has(e)||P.has(e)||C.has(e)||/^(aria|data)-[A-Za-z0-9_.:-]+$/u.test(e)?Z[e]??e:null}function Q(e,n){return n===null||n===!1?{name:e,value:null}:n===!0?{name:e,value:""}:null}function v(e,n){return n===null||n===!1?{name:e,value:null}:n===!0?{name:e,value:""}:typeof n=="string"?{name:e,value:n}:null}function ee(e,n){return n===null?{name:e,value:null}:typeof n=="string"||typeof n=="boolean"||typeof n=="number"&&Number.isFinite(n)?{name:e,value:String(n)}:null}function _(e){return{mode:"after-render",reason:e}}var L="vcp-window-message",B=1;function K(e){return{source:L,version:B,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function W(e){try{return o(e)?d(e,"source",L)&&d(e,"version",B)&&s(e,"namespace")&&s(e,"channel")&&f(e,"body")&&(!y(e,"sessionKey")||s(e,"sessionKey")):!1}catch{return!1}}var O="site-edit",k="frame-runtime",q="frame-announce",ne=1,M=1,V=1,Me=24;function Ve(e,n={}){return K({namespace:O,channel:k,sessionKey:n.sessionKey,body:e})}function Le(){return K({namespace:O,channel:q,body:{type:"announce"}})}function Be(e){try{return!W(e)||e.namespace!==O||e.channel!==q?!1:o(e.body)&&d(e.body,"type","announce")&&u(e.body,["type"])}catch{return!1}}function Ke(e){try{return!W(e)||e.namespace!==O||e.channel!==k?!1:xe(e.body)}catch{return!1}}function m(e){return o(e)&&s(e,"routeId")&&h(e,"templateId")&&u(e,["routeId","templateId"])}function w(e){return o(e)&&s(e,"routeId")&&h(e,"effectiveTemplateId")&&u(e,["routeId","effectiveTemplateId"])}function u(e,n){let t=new Set(n);return Reflect.ownKeys(e).every(i=>typeof i=="string"&&t.has(i))}var y=(e,n)=>Object.prototype.hasOwnProperty.call(e,n);function f(e,n){let t=Object.getOwnPropertyDescriptor(e,n);return t!==void 0&&"value"in t}function r(e,n){return Object.getOwnPropertyDescriptor(e,n)?.value}function d(e,n,t){return f(e,n)&&r(e,n)===t}function s(e,n){return f(e,n)&&typeof r(e,n)=="string"}function A(e,n){return f(e,n)&&typeof r(e,n)=="boolean"}function a(e,n){let t=r(e,n);return f(e,n)&&typeof t=="number"&&Number.isFinite(t)}function re(e,n){let t=r(e,n);return f(e,n)&&typeof t=="number"&&Number.isInteger(t)&&t>0}function h(e,n){return!y(e,n)||r(e,n)===void 0||s(e,n)}function b(e,n){return!y(e,n)||r(e,n)===void 0||a(e,n)}function R(e,n){let t=r(e,n);return!y(e,n)||t===void 0||f(e,n)&&typeof t=="number"&&Number.isInteger(t)&&t>=0}function p(e,n){return!y(e,n)||r(e,n)===void 0}function o(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let n=Object.getPrototypeOf(e);return n===Object.prototype||n===null}function oe(e){return o(e)&&Reflect.ownKeys(e).length===0}function T(e){if(!Array.isArray(e))return!1;for(let n=0;n<e.length;n+=1){let t=Object.getOwnPropertyDescriptor(e,String(n));if(t===void 0||!("value"in t)||typeof t.value!="string")return!1}return!0}function l(e){return o(e)&&s(e,"key")&&R(e,"instanceIndex")&&R(e,"instanceCount")&&R(e,"textSegmentIndex")}function ie(e){return o(e)&&s(e,"blockId")&&l(r(e,"ref"))&&E(r(e,"rect"))&&A(e,"targetIsSectionRoot")}function se(e){if(!o(e))return!1;let n=r(e,"placement"),t=r(e,"boundary");return s(e,"anchorBlockId")&&l(r(e,"anchorRef"))&&(n==="before"||n==="after")&&o(t)&&a(t,"top")&&a(t,"left")&&a(t,"width")}function E(e){return o(e)&&["top","left","width","height"].every(n=>a(e,n))}function G(e){if(!o(e))return!1;let n=r(e,"rect"),t=r(e,"layout"),i=o(t)?r(t,"containingBlock"):null,c=r(e,"scrollContext"),g=o(i)&&(d(i,"kind","viewport")&&Reflect.ownKeys(i).length===1||d(i,"kind","document")&&Reflect.ownKeys(i).length===1||d(i,"kind","element")&&s(i,"runtimeNodeId"));return d(e,"version",ne)&&s(e,"runtimeNodeId")&&o(n)&&E(r(n,"viewport"))&&E(r(n,"document"))&&o(t)&&s(t,"position")&&s(t,"transform")&&g&&o(c)&&["scrollX","scrollY","viewportWidth","viewportHeight"].every(S=>a(c,S))&&f(c,"scrollContainers")&&ce(r(c,"scrollContainers"))}function ce(e){return Array.isArray(e)&&e.every(n=>o(n)&&s(n,"runtimeNodeId")&&a(n,"scrollLeft")&&a(n,"scrollTop"))}function x(e){return o(e)&&(p(e,"layoutSnapshot")||G(r(e,"layoutSnapshot")))}function ae(e){return o(e)&&l(r(e,"ref"))&&f(e,"layoutSnapshot")&&G(r(e,"layoutSnapshot"))&&(p(e,"childBoxes")||ue(r(e,"childBoxes")))&&(p(e,"childRects")||pe(r(e,"childRects")))&&(p(e,"layout")||de(r(e,"layout")))&&(p(e,"spacing")||fe(r(e,"spacing")))}function de(e){if(!o(e))return!1;let n=r(e,"indicatorOrientation");return s(e,"display")&&(n==="horizontal"||n==="vertical")&&h(e,"flexDirection")&&h(e,"gridAutoFlow")}function pe(e){return Array.isArray(e)&&e.every(n=>E(n))}function ue(e){return Array.isArray(e)&&e.every(n=>o(n)&&E(r(n,"rect"))&&U(r(n,"margin")))}function U(e){return o(e)&&["marginTop","marginRight","marginBottom","marginLeft"].every(n=>a(e,n))}function fe(e){return U(e)&&["paddingTop","paddingRight","paddingBottom","paddingLeft","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","columnGap","rowGap"].every(n=>a(e,n))}function le(e){if(!Array.isArray(e))return!1;for(let n=0;n<e.length;n+=1){let t=Object.getOwnPropertyDescriptor(e,String(n));if(t===void 0||!("value"in t)||!ae(t.value))return!1}return!0}function me(e){return o(e)&&Reflect.ownKeys(e).every(n=>typeof n=="string"&&f(e,n)&&(typeof r(e,n)=="string"||r(e,n)===null))}function z(e){return e==null||typeof e=="string"||typeof e=="number"&&Number.isFinite(e)}function ye(e){return o(e)&&Reflect.ownKeys(e).every(n=>typeof n=="string"&&f(e,n)&&z(r(e,n)))}function ge(e){if(!o(e))return!1;let n=r(e,"priority");return s(e,"property")&&f(e,"value")&&z(r(e,"value"))&&(!y(e,"priority")||n===void 0||n==="important")}function he(e){return o(e)?(p(e,"attributes")||me(r(e,"attributes")))&&h(e,"className")&&(p(e,"style")||ye(r(e,"style")))&&(p(e,"styleDeclarations")||Array.isArray(r(e,"styleDeclarations"))&&r(e,"styleDeclarations").every(ge)):!1}function be(e){return o(e)&&a(e,"x")&&a(e,"y")&&(p(e,"detailLevel")||d(e,"detailLevel","summary")||d(e,"detailLevel","full"))}function Se(e){return o(e)&&l(r(e,"ref"))}function Ie(e){if(!o(e)||!o(r(e,"variables")))return!1;let n=r(e,"variables");return Reflect.ownKeys(n).every(t=>typeof t=="string"&&s(n,t))?p(e,"stylesheets")||T(r(e,"stylesheets")):!1}function Ee(e){if(!d(e,"type","request")||!s(e,"id")||!s(e,"kind")||!f(e,"payload"))return!1;let n=r(e,"kind"),t=r(e,"payload");switch(n){case"hit-test-at-point":case"start-text-edit-at-point":return be(t);case"bridge-get-source-tree":return o(t)&&m(r(t,"composition"))&&u(t,["composition"]);case"get-scroll-metrics":case"clear-theme-override":return oe(t);case"bridge-get-history-status":case"bridge-undo":case"bridge-redo":return o(t)&&m(r(t,"composition"))&&u(t,["composition"]);case"bridge-get-source-file":return o(t)&&s(t,"path")&&m(r(t,"composition"))&&u(t,["path","composition"]);case"bridge-get-object-edit-context":return o(t)&&s(t,"key")&&m(r(t,"composition"))&&_e(r(t,"selectionRef"))&&u(t,["key","composition","selectionRef"]);case"bridge-resolve-source-location":case"bridge-get-class-name-source":return o(t)&&s(t,"key")&&m(r(t,"composition"))&&u(t,["key","composition"]);case"scroll-to":return o(t)&&a(t,"x")&&a(t,"y");case"scroll-by":return o(t)&&a(t,"deltaX")&&a(t,"deltaY");case"set-interaction-mode":return o(t)&&A(t,"enabled");case"set-selection-visual":return o(t)&&d(t,"version",M)&&l(r(t,"ref"))&&d(t,"visible",!0);case"clear-selection-visual":return o(t)&&d(t,"version",M);case"set-resize-visual":return o(t)&&d(t,"version",V)&&l(r(t,"ref"))&&d(t,"visible",!0);case"clear-resize-visual":return o(t)&&d(t,"version",V);case"set-theme-override":return Ie(t);case"get-theme-variables":return o(t)&&T(r(t,"names"));case"compute-drop-target-at-point":return o(t)&&a(t,"x")&&a(t,"y")&&(d(t,"dragKind","insert")||d(t,"dragKind","move"))&&(p(t,"movingRef")||l(r(t,"movingRef")));case"observe-node-bounds":case"clear-node-bounds-observer":return o(t)&&(p(t,"ref")||l(r(t,"ref")));case"apply-node-patch":return o(t)&&l(r(t,"ref"))&&he(r(t,"patch"))&&(p(t,"preview")||o(r(t,"preview"))&&s(r(t,"preview"),"sessionId")&&R(r(t,"preview"),"revision")&&y(r(t,"preview"),"revision"));case"get-hit-by-ref":case"get-path-by-ref":case"restore-text-edit":case"clear-text-edit-rollback":return Se(t);case"bridge-initialize-session":case"bridge-get-style-context":return o(t)&&m(r(t,"composition"))&&u(t,["composition"]);case"bridge-get-document":case"bridge-ensure-document-version":case"bridge-acknowledge-document-version":return o(t)&&m(r(t,"composition"))&&b(t,"minVersion")&&b(t,"version")&&u(t,["composition","minVersion","version"]);case"bridge-execute":{if(!o(t))return!1;let i=r(t,"request"),c=r(t,"composition"),g=o(i)?r(i,"composition"):null;return!m(c)||!o(i)||!m(g)?!1:I({routeId:c.routeId,...c.templateId?{effectiveTemplateId:c.templateId}:{}})===I({routeId:g.routeId,...g.templateId?{effectiveTemplateId:g.templateId}:{}})&&u(t,["composition","request"])}case"bridge-subscribe":case"bridge-unsubscribe":return o(t)&&s(t,"subscriptionId")&&m(r(t,"composition"))&&u(t,["subscriptionId","composition"]);default:return!1}}function we(e){return d(e,"type","response")&&s(e,"id")&&A(e,"ok")&&(p(e,"error")||s(e,"error"))}function Re(e){if(!o(e))return!1;let n=r(e,"type");if(typeof n!="string"||!w(r(e,"composition"))||!s(e,"siteId")||!s(e,"at"))return!1;switch(n){case"site-edit.document.changed":return s(e,"snapshotId")&&a(e,"version");case"site-edit.operation.planned":return s(e,"operationId")&&s(e,"baseSnapshotId")&&T(r(e,"changedFiles"));case"site-edit.operation.completed":return o(r(e,"result"));case"site-edit.operation.failed":return s(e,"requestId")&&o(r(e,"error"));case"site-edit.capability.changed":return T(r(e,"keys"));case"site-edit.graph.invalidated":return!0;case"site-edit.graph.ready":return a(e,"version");case"site-edit.graph.error":return s(e,"message");default:return!1}}var Te=new Set(["pointer-down","pointer-move","pointer-leave","pointer-up","pointer-cancel","pointer-click","pointer-double-click"]),j=new Set(["e","s","se"]);function Oe(e,n){if(p(e,"resizeSession"))return!0;let t=r(e,"resizeSession");if(!o(t))return!1;let i=r(e,"pointerId"),c=r(t,"pointerId"),g=r(t,"phase"),S=r(t,"edge"),H=n==="pointer-down"?"start":n==="pointer-up"?"commit":n==="pointer-cancel"?"cancel":null;return r(t,"version")===1&&g===H&&s(t,"sessionId")&&String(r(t,"sessionId")).length>0&&typeof i=="number"&&Number.isInteger(i)&&typeof c=="number"&&Number.isInteger(c)&&i===c&&typeof S=="string"&&j.has(S)&&r(e,"resizeEdge")===S&&l(r(t,"ref"))&&["startWidth","startHeight","width","height"].every(X=>a(t,X))}function Ae(e){if(!d(e,"type","event")||!s(e,"kind")||!o(r(e,"payload")))return!1;let n=r(e,"kind"),t=r(e,"payload");switch(n){case"text-edit-commit":case"text-edit-cancel":case"text-edit-exit":case"text-edit-input":return l(r(t,"ref"))&&h(t,"value")&&(p(t,"hit")||x(r(t,"hit")));case"node-bounds-change":return x(r(t,"hit"));case"geometry-batch":{let i=r(t,"reason");return re(t,"sequence")&&a(t,"sourceEventAt")&&a(t,"captureStartedAt")&&a(t,"capturedAt")&&(i==="scroll"||i==="resize"||i==="mutation")&&le(r(t,"snapshots"))}case"bridge-event":{let i=r(t,"event"),c=r(t,"composition");return!Re(i)||!w(c)?!1:s(t,"subscriptionId")&&I(c)===I(i.composition)}case"route-ready":return w(r(t,"composition"))&&s(t,"editEngineVersion")&&a(t,"sequence")&&a(t,"version");case"bridge-status":{let i=r(t,"state");return(i==="connecting"||i==="ready"||i==="reconnecting"||i==="failed"||i==="reload-required")&&w(r(t,"composition"))&&a(t,"sequence")&&b(t,"attempt")&&b(t,"retryInMs")&&h(t,"messageKey")}case"scroll":{let i=r(t,"metrics");return o(i)&&["scrollX","scrollY","scrollWidth","scrollHeight","viewportWidth","viewportHeight"].every(c=>a(i,c))}default:return Te.has(n)&&a(t,"clientX")&&a(t,"clientY")&&b(t,"buttons")&&b(t,"pointerId")&&(p(t,"hoverVisualOwned")||A(t,"hoverVisualOwned"))&&(p(t,"resizeEdge")||s(t,"resizeEdge")&&j.has(r(t,"resizeEdge")))&&Oe(t,n)&&(r(t,"hit")===null||x(r(t,"hit")))&&(p(t,"section")||r(t,"section")===null||ie(r(t,"section")))&&(p(t,"sectionGap")||r(t,"sectionGap")===null||se(r(t,"sectionGap")))}}function _e(e){if(e===void 0)return!0;if(!o(e)||!u(e,["key","instanceIndex","instanceCount"]))return!1;let n={key:r(e,"key"),...y(e,"instanceIndex")?{instanceIndex:r(e,"instanceIndex")}:{},...y(e,"instanceCount")?{instanceCount:r(e,"instanceCount")}:{}};if(!te.safeParse(n).success)return!1;let t=r(e,"instanceIndex"),i=r(e,"instanceCount");return!(typeof t=="number"&&typeof i=="number"&&t>=i)}function xe(e){if(!o(e))return!1;switch(r(e,"type")){case"request":return Ee(e);case"response":return we(e);case"event":return Ae(e);default:return!1}}export{q as SITE_EDIT_FRAME_ANNOUNCE_CHANNEL,k as SITE_EDIT_FRAME_RUNTIME_CHANNEL,ne as SITE_EDIT_FRAME_RUNTIME_LAYOUT_SNAPSHOT_VERSION,V as SITE_EDIT_FRAME_RUNTIME_RESIZE_VISUAL_VERSION,M as SITE_EDIT_FRAME_RUNTIME_SELECTION_VISUAL_VERSION,Me as SITE_EDIT_FRAME_SECTION_GAP_RADIUS_PX,O as SITE_EDIT_WINDOW_MESSAGE_NAMESPACE,L as VCP_WINDOW_MESSAGE_SOURCE,B as VCP_WINDOW_MESSAGE_VERSION,Le as createSiteEditFrameAnnounceMessage,Ve as createSiteEditFrameRuntimeMessage,K as createVcpWindowMessageEnvelope,D as getPropertyPreviewDomAttributeName,Be as isSiteEditFrameAnnounceMessage,G as isSiteEditFrameRuntimeLayoutSnapshot,Ke as isSiteEditFrameRuntimeMessage,W as isVcpWindowMessageEnvelope,$ as planPropertyPreview};
1
+ function I(e){return JSON.stringify([e.routeId,e.effectiveTemplateId??null])}var $={allowFullScreen:"allowfullscreen",acceptCharset:"accept-charset",autoComplete:"autocomplete",autoFocus:"autofocus",autoPlay:"autoplay",cellPadding:"cellpadding",cellSpacing:"cellspacing",charSet:"charset",colSpan:"colspan",crossOrigin:"crossorigin",dateTime:"datetime",encType:"enctype",formAction:"formaction",formEncType:"formenctype",formMethod:"formmethod",formNoValidate:"formnovalidate",formTarget:"formtarget",hrefLang:"hreflang",htmlFor:"for",httpEquiv:"http-equiv",inputMode:"inputmode",itemID:"itemid",itemProp:"itemprop",itemRef:"itemref",itemScope:"itemscope",itemType:"itemtype",keyParams:"keyparams",keyType:"keytype",noModule:"nomodule",playsInline:"playsinline",readOnly:"readonly",rowSpan:"rowspan",srcDoc:"srcdoc",srcLang:"srclang",srcSet:"srcset",tabIndex:"tabindex",useMap:"usemap"},x=new Set(["allowFullScreen","async","autoFocus","autoPlay","controls","default","defer","disabled","formNoValidate","hidden","inert","itemScope","loop","multiple","muted","noModule","noValidate","open","playsInline","readOnly","required","reversed","scoped","seamless"]),P=new Set(["checked","selected","value"]),Z=new Set(["children","key","ref","dangerouslysetinnerhtml"]),J=new Set(["data-designer-hover-outline","data-designer-select-outline"]),Q=/^[A-Za-z_$][A-Za-z0-9_$:-]*$/u,F=new Set(["accept","alt","action","cite","color","content","coords","crossOrigin","dateTime","formAction","formMethod","formTarget","headers","href","hrefLang","id","kind","label","lang","list","max","media","method","min","name","pattern","poster","property","referrerPolicy","rel","role","scope","slot","src","srcDoc","srcLang","srcSet","step","target","title","type","useMap","width","height"]);function v(e){if(!te(e))return O("Typed property changes are not previewable");if(e.element.kind!=="host")return O(`The '${e.element.tagName}' component may transform its props before rendering`);let n={};for(let t of e.changes){let i=ee(t);if(!i)return O(`The DOM result for '${t.name}' cannot be proven equivalent`);n[i.name]=i.value}return e.runtimeAttributes,{mode:"dom",patch:{attributes:n}}}function ee(e){if(!D(e.name))return null;let n=e.name,t=C(n);if(!t||P.has(n))return null;if(e.operation==="remove")return{name:t,value:null};let i=e.value;return n==="download"?re(t,i):x.has(n)?ne(t,i):/^(aria|data)-[A-Za-z0-9_.:-]+$/u.test(n)?oe(t,i):F.has(n)?typeof i=="string"?{name:t,value:i}:typeof i=="number"&&Number.isFinite(i)?{name:t,value:String(i)}:i===null?{name:t,value:null}:null:null}function C(e){return D(e)&&(e==="download"||P.has(e)||x.has(e)||F.has(e)||/^(aria|data)-[A-Za-z0-9_.:-]+$/u.test(e))?$[e]??e:null}function te(e){if(e.scope!=="selection"&&e.scope!=="template"||!Array.isArray(e.changes)||e.changes.length===0)return!1;let n=new Set;for(let t of e.changes){if(!t||typeof t!="object"||typeof t.name!="string"||t.name.length===0||t.operation!=="set"&&t.operation!=="remove"||n.has(t.name))return!1;n.add(t.name)}return!0}function D(e){if(!Q.test(e))return!1;let n=e.toLowerCase();return Z.has(n)||n.startsWith("data-vcp-")||J.has(n)||/^on[a-z]/iu.test(e)?!1:n!=="classname"&&n!=="class"&&n!=="style"}function ne(e,n){return n===null||n===!1?{name:e,value:null}:n===!0?{name:e,value:""}:null}function re(e,n){return n===null||n===!1?{name:e,value:null}:n===!0?{name:e,value:""}:typeof n=="string"?{name:e,value:n}:null}function oe(e,n){return n===null?{name:e,value:null}:typeof n=="string"||typeof n=="boolean"||typeof n=="number"&&Number.isFinite(n)?{name:e,value:String(n)}:null}function O(e){return{mode:"after-render",reason:e}}var L="vcp-window-message",B=1;function K(e){return{source:L,version:B,namespace:e.namespace,channel:e.channel,...e.sessionKey?{sessionKey:e.sessionKey}:{},body:e.body}}function z(e){try{return o(e)?d(e,"source",L)&&d(e,"version",B)&&s(e,"namespace")&&s(e,"channel")&&f(e,"body")&&(!h(e,"sessionKey")||s(e,"sessionKey")):!1}catch{return!1}}var A="site-edit",W="frame-runtime",G="frame-announce",ie=1,M=1,V=1,Me=24;function Ve(e,n={}){return K({namespace:A,channel:W,sessionKey:n.sessionKey,body:e})}function Le(){return K({namespace:A,channel:G,body:{type:"announce"}})}function Be(e){try{return!z(e)||e.namespace!==A||e.channel!==G?!1:o(e.body)&&d(e.body,"type","announce")&&u(e.body,["type"])}catch{return!1}}function Ke(e){try{return!z(e)||e.namespace!==A||e.channel!==W?!1:Pe(e.body)}catch{return!1}}function m(e){return o(e)&&s(e,"routeId")&&g(e,"templateId")&&u(e,["routeId","templateId"])}function w(e){return o(e)&&s(e,"routeId")&&g(e,"effectiveTemplateId")&&u(e,["routeId","effectiveTemplateId"])}function u(e,n){let t=new Set(n);return Reflect.ownKeys(e).every(i=>typeof i=="string"&&t.has(i))}var h=(e,n)=>Object.prototype.hasOwnProperty.call(e,n);function f(e,n){let t=Object.getOwnPropertyDescriptor(e,n);return t!==void 0&&"value"in t}function r(e,n){return Object.getOwnPropertyDescriptor(e,n)?.value}function d(e,n,t){return f(e,n)&&r(e,n)===t}function s(e,n){return f(e,n)&&typeof r(e,n)=="string"}function _(e,n){return f(e,n)&&typeof r(e,n)=="boolean"}function c(e,n){let t=r(e,n);return f(e,n)&&typeof t=="number"&&Number.isFinite(t)}function U(e,n){let t=r(e,n);return f(e,n)&&typeof t=="number"&&Number.isInteger(t)&&t>0}function g(e,n){return!h(e,n)||r(e,n)===void 0||s(e,n)}function b(e,n){return!h(e,n)||r(e,n)===void 0||c(e,n)}function E(e,n){let t=r(e,n);return!h(e,n)||t===void 0||f(e,n)&&typeof t=="number"&&Number.isInteger(t)&&t>=0}function a(e,n){return!h(e,n)||r(e,n)===void 0}function o(e){if(typeof e!="object"||e===null||Array.isArray(e))return!1;let n=Object.getPrototypeOf(e);return n===Object.prototype||n===null}function se(e){return o(e)&&Reflect.ownKeys(e).length===0}function T(e){if(!Array.isArray(e))return!1;for(let n=0;n<e.length;n+=1){let t=Object.getOwnPropertyDescriptor(e,String(n));if(t===void 0||!("value"in t)||typeof t.value!="string")return!1}return!0}function l(e){return o(e)&&s(e,"key")&&E(e,"instanceIndex")&&E(e,"instanceCount")&&E(e,"textSegmentIndex")}function ce(e){return o(e)&&s(e,"blockId")&&l(r(e,"ref"))&&R(r(e,"rect"))&&_(e,"targetIsSectionRoot")}function ae(e){if(!o(e))return!1;let n=r(e,"placement"),t=r(e,"boundary");return s(e,"anchorBlockId")&&l(r(e,"anchorRef"))&&(n==="before"||n==="after")&&o(t)&&c(t,"top")&&c(t,"left")&&c(t,"width")}function R(e){return o(e)&&["top","left","width","height"].every(n=>c(e,n))}function k(e){if(!o(e))return!1;let n=r(e,"rect"),t=r(e,"layout"),i=o(t)?r(t,"containingBlock"):null,p=r(e,"scrollContext"),y=o(i)&&(d(i,"kind","viewport")&&Reflect.ownKeys(i).length===1||d(i,"kind","document")&&Reflect.ownKeys(i).length===1||d(i,"kind","element")&&s(i,"runtimeNodeId"));return d(e,"version",ie)&&s(e,"runtimeNodeId")&&o(n)&&R(r(n,"viewport"))&&R(r(n,"document"))&&o(t)&&s(t,"position")&&s(t,"transform")&&y&&o(p)&&["scrollX","scrollY","viewportWidth","viewportHeight"].every(S=>c(p,S))&&f(p,"scrollContainers")&&de(r(p,"scrollContainers"))}function de(e){return Array.isArray(e)&&e.every(n=>o(n)&&s(n,"runtimeNodeId")&&c(n,"scrollLeft")&&c(n,"scrollTop"))}function N(e){return o(e)&&(a(e,"layoutSnapshot")||k(r(e,"layoutSnapshot")))}function pe(e){return o(e)&&l(r(e,"ref"))&&f(e,"layoutSnapshot")&&k(r(e,"layoutSnapshot"))&&(a(e,"childBoxes")||le(r(e,"childBoxes")))&&(a(e,"childRects")||fe(r(e,"childRects")))&&(a(e,"layout")||ue(r(e,"layout")))&&(a(e,"spacing")||me(r(e,"spacing")))}function ue(e){if(!o(e))return!1;let n=r(e,"indicatorOrientation");return s(e,"display")&&(n==="horizontal"||n==="vertical")&&g(e,"flexDirection")&&g(e,"gridAutoFlow")}function fe(e){return Array.isArray(e)&&e.every(n=>R(n))}function le(e){return Array.isArray(e)&&e.every(n=>o(n)&&R(r(n,"rect"))&&q(r(n,"margin")))}function q(e){return o(e)&&["marginTop","marginRight","marginBottom","marginLeft"].every(n=>c(e,n))}function me(e){return q(e)&&["paddingTop","paddingRight","paddingBottom","paddingLeft","borderTopWidth","borderRightWidth","borderBottomWidth","borderLeftWidth","columnGap","rowGap"].every(n=>c(e,n))}function ye(e){if(!Array.isArray(e))return!1;for(let n=0;n<e.length;n+=1){let t=Object.getOwnPropertyDescriptor(e,String(n));if(t===void 0||!("value"in t)||!pe(t.value))return!1}return!0}function ge(e){return o(e)&&Reflect.ownKeys(e).every(n=>typeof n=="string"&&f(e,n)&&(typeof r(e,n)=="string"||r(e,n)===null))}function j(e){return e==null||typeof e=="string"||typeof e=="number"&&Number.isFinite(e)}function he(e){return o(e)&&Reflect.ownKeys(e).every(n=>typeof n=="string"&&f(e,n)&&j(r(e,n)))}function be(e){if(!o(e))return!1;let n=r(e,"priority");return s(e,"property")&&f(e,"value")&&j(r(e,"value"))&&(!h(e,"priority")||n===void 0||n==="important")}function Se(e){return o(e)?(a(e,"attributes")||ge(r(e,"attributes")))&&g(e,"className")&&(a(e,"style")||he(r(e,"style")))&&(a(e,"styleDeclarations")||Array.isArray(r(e,"styleDeclarations"))&&r(e,"styleDeclarations").every(be)):!1}function Ie(e){return o(e)&&c(e,"x")&&c(e,"y")&&(a(e,"detailLevel")||d(e,"detailLevel","summary")||d(e,"detailLevel","full"))}function Ee(e){return o(e)&&l(r(e,"ref"))}function Re(e){if(!o(e)||!o(r(e,"variables")))return!1;let n=r(e,"variables");return Reflect.ownKeys(n).every(t=>typeof t=="string"&&s(n,t))?a(e,"stylesheets")||T(r(e,"stylesheets")):!1}function we(e){if(!d(e,"type","request")||!s(e,"id")||!s(e,"kind")||!f(e,"payload"))return!1;let n=r(e,"kind"),t=r(e,"payload");switch(n){case"hit-test-at-point":case"start-text-edit-at-point":return Ie(t);case"bridge-get-source-tree":return o(t)&&m(r(t,"composition"))&&u(t,["composition"]);case"get-scroll-metrics":case"clear-theme-override":return se(t);case"bridge-get-history-status":case"bridge-undo":case"bridge-redo":return o(t)&&m(r(t,"composition"))&&u(t,["composition"]);case"bridge-get-source-file":return o(t)&&s(t,"path")&&m(r(t,"composition"))&&u(t,["path","composition"]);case"bridge-get-object-edit-context":return o(t)&&s(t,"key")&&m(r(t,"composition"))&&xe(r(t,"selectionRef"))&&u(t,["key","composition","selectionRef"]);case"bridge-resolve-source-location":case"bridge-get-class-name-source":return o(t)&&s(t,"key")&&m(r(t,"composition"))&&u(t,["key","composition"]);case"scroll-to":return o(t)&&c(t,"x")&&c(t,"y");case"scroll-by":return o(t)&&c(t,"deltaX")&&c(t,"deltaY");case"set-interaction-mode":return o(t)&&_(t,"enabled");case"set-selection-visual":return o(t)&&d(t,"version",M)&&l(r(t,"ref"))&&d(t,"visible",!0);case"clear-selection-visual":return o(t)&&d(t,"version",M);case"set-resize-visual":return o(t)&&d(t,"version",V)&&l(r(t,"ref"))&&d(t,"visible",!0);case"clear-resize-visual":return o(t)&&d(t,"version",V);case"set-theme-override":return Re(t);case"get-theme-variables":return o(t)&&T(r(t,"names"));case"compute-drop-target-at-point":return o(t)&&c(t,"x")&&c(t,"y")&&(d(t,"dragKind","insert")||d(t,"dragKind","move"))&&(a(t,"movingRef")||l(r(t,"movingRef")));case"observe-node-bounds":case"clear-node-bounds-observer":return o(t)&&(a(t,"ref")||l(r(t,"ref")));case"apply-node-patch":return o(t)&&l(r(t,"ref"))&&Se(r(t,"patch"))&&(a(t,"preview")||o(r(t,"preview"))&&s(r(t,"preview"),"sessionId")&&E(r(t,"preview"),"revision")&&h(r(t,"preview"),"revision"));case"get-hit-by-ref":case"get-path-by-ref":case"restore-text-edit":case"clear-text-edit-rollback":return Ee(t);case"bridge-initialize-session":case"bridge-get-style-context":return o(t)&&m(r(t,"composition"))&&u(t,["composition"]);case"bridge-get-document":case"bridge-ensure-document-version":case"bridge-acknowledge-document-version":return o(t)&&m(r(t,"composition"))&&b(t,"minVersion")&&b(t,"version")&&u(t,["composition","minVersion","version"]);case"bridge-execute":{if(!o(t))return!1;let i=r(t,"request"),p=r(t,"composition"),y=o(i)?r(i,"composition"):null;return!m(p)||!o(i)||!m(y)?!1:I({routeId:p.routeId,...p.templateId?{effectiveTemplateId:p.templateId}:{}})===I({routeId:y.routeId,...y.templateId?{effectiveTemplateId:y.templateId}:{}})&&u(t,["composition","request"])}case"bridge-subscribe":case"bridge-unsubscribe":return o(t)&&s(t,"subscriptionId")&&m(r(t,"composition"))&&u(t,["subscriptionId","composition"]);default:return!1}}function Te(e){return d(e,"type","response")&&s(e,"id")&&_(e,"ok")&&(a(e,"error")||s(e,"error"))}function Ae(e){if(!o(e))return!1;let n=r(e,"type");if(typeof n!="string"||!w(r(e,"composition"))||!s(e,"siteId")||!s(e,"at"))return!1;switch(n){case"site-edit.document.changed":return s(e,"snapshotId")&&c(e,"version");case"site-edit.operation.planned":return s(e,"operationId")&&s(e,"baseSnapshotId")&&T(r(e,"changedFiles"));case"site-edit.operation.completed":return o(r(e,"result"));case"site-edit.operation.failed":return s(e,"requestId")&&o(r(e,"error"));case"site-edit.capability.changed":return T(r(e,"keys"));case"site-edit.graph.invalidated":return!0;case"site-edit.graph.ready":return c(e,"version");case"site-edit.graph.error":return s(e,"message");default:return!1}}var _e=new Set(["pointer-down","pointer-move","pointer-leave","pointer-up","pointer-cancel","pointer-click","pointer-double-click"]),H=new Set(["e","s","se"]);function Oe(e,n){if(a(e,"resizeSession"))return!0;let t=r(e,"resizeSession");if(!o(t))return!1;let i=r(e,"pointerId"),p=r(t,"pointerId"),y=r(t,"phase"),S=r(t,"edge"),X=n==="pointer-down"?"start":n==="pointer-up"?"commit":n==="pointer-cancel"?"cancel":null;return r(t,"version")===1&&y===X&&s(t,"sessionId")&&String(r(t,"sessionId")).length>0&&typeof i=="number"&&Number.isInteger(i)&&typeof p=="number"&&Number.isInteger(p)&&i===p&&typeof S=="string"&&H.has(S)&&r(e,"resizeEdge")===S&&l(r(t,"ref"))&&["startWidth","startHeight","width","height"].every(Y=>c(t,Y))}function Ne(e){if(!d(e,"type","event")||!s(e,"kind")||!o(r(e,"payload")))return!1;let n=r(e,"kind"),t=r(e,"payload");switch(n){case"text-edit-commit":case"text-edit-cancel":case"text-edit-exit":case"text-edit-input":return l(r(t,"ref"))&&g(t,"value")&&(a(t,"hit")||N(r(t,"hit")));case"node-bounds-change":return N(r(t,"hit"));case"geometry-batch":{let i=r(t,"reason");return U(t,"sequence")&&c(t,"sourceEventAt")&&c(t,"captureStartedAt")&&c(t,"capturedAt")&&(i==="scroll"||i==="resize"||i==="mutation")&&ye(r(t,"snapshots"))}case"bridge-event":{let i=r(t,"event"),p=r(t,"composition");return!Ae(i)||!w(p)?!1:s(t,"subscriptionId")&&I(p)===I(i.composition)}case"route-ready":return w(r(t,"composition"))&&s(t,"editEngineVersion")&&c(t,"sequence")&&c(t,"version");case"bridge-status":{let i=r(t,"state");return(i==="connecting"||i==="ready"||i==="reconnecting"||i==="failed"||i==="reload-required")&&w(r(t,"composition"))&&c(t,"sequence")&&b(t,"attempt")&&b(t,"retryInMs")&&g(t,"messageKey")}case"scroll":{let i=r(t,"metrics");return o(i)&&["scrollX","scrollY","scrollWidth","scrollHeight","viewportWidth","viewportHeight"].every(p=>c(i,p))}default:return _e.has(n)&&c(t,"clientX")&&c(t,"clientY")&&b(t,"buttons")&&b(t,"pointerId")&&(a(t,"hoverVisualOwned")||_(t,"hoverVisualOwned"))&&(a(t,"resizeEdge")||s(t,"resizeEdge")&&H.has(r(t,"resizeEdge")))&&Oe(t,n)&&(r(t,"hit")===null||N(r(t,"hit")))&&(a(t,"section")||r(t,"section")===null||ce(r(t,"section")))&&(a(t,"sectionGap")||r(t,"sectionGap")===null||ae(r(t,"sectionGap")))}}function xe(e){if(e===void 0)return!0;if(!o(e)||!u(e,["key","instanceIndex","instanceCount"])||!s(e,"key")||r(e,"key").length===0||!E(e,"instanceIndex")||!a(e,"instanceCount")&&!U(e,"instanceCount"))return!1;let n=r(e,"instanceIndex"),t=r(e,"instanceCount");return!(typeof n=="number"&&typeof t=="number"&&n>=t)}function Pe(e){if(!o(e))return!1;switch(r(e,"type")){case"request":return we(e);case"response":return Te(e);case"event":return Ne(e);default:return!1}}export{G as SITE_EDIT_FRAME_ANNOUNCE_CHANNEL,W as SITE_EDIT_FRAME_RUNTIME_CHANNEL,ie as SITE_EDIT_FRAME_RUNTIME_LAYOUT_SNAPSHOT_VERSION,V as SITE_EDIT_FRAME_RUNTIME_RESIZE_VISUAL_VERSION,M as SITE_EDIT_FRAME_RUNTIME_SELECTION_VISUAL_VERSION,Me as SITE_EDIT_FRAME_SECTION_GAP_RADIUS_PX,A as SITE_EDIT_WINDOW_MESSAGE_NAMESPACE,L as VCP_WINDOW_MESSAGE_SOURCE,B as VCP_WINDOW_MESSAGE_VERSION,Le as createSiteEditFrameAnnounceMessage,Ve as createSiteEditFrameRuntimeMessage,K as createVcpWindowMessageEnvelope,C as getPropertyPreviewDomAttributeName,Be as isSiteEditFrameAnnounceMessage,k as isSiteEditFrameRuntimeLayoutSnapshot,Ke as isSiteEditFrameRuntimeMessage,z as isVcpWindowMessageEnvelope,v as planPropertyPreview};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vcp-dev/site-edit-bridge",
3
- "version": "0.10.0",
3
+ "version": "0.10.1",
4
4
  "type": "module",
5
5
  "license": "UNLICENSED",
6
6
  "repository": {
@@ -74,8 +74,8 @@
74
74
  "typecheck": "tsc -p tsconfig.json --noEmit"
75
75
  },
76
76
  "dependencies": {
77
- "@vcp-dev/contracts": "0.10.0",
78
- "@vcp-dev/site-edit-engine": "0.10.0",
77
+ "@vcp-dev/contracts": "0.10.1",
78
+ "@vcp-dev/site-edit-engine": "0.10.1",
79
79
  "@types/ws": "^8.18.1",
80
80
  "ws": "^8.20.1"
81
81
  },