@databehave/server 0.1.1 → 0.1.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/admin/ui.js CHANGED
@@ -1,4 +1,4 @@
1
- var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[i]=e;var l=(a,i,e)=>F(a,typeof i!="symbol"?i+"":i,e);(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))t(s);new MutationObserver(s=>{for(const n of s)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&t(o)}).observe(document,{childList:!0,subtree:!0});function e(s){const n={};return s.integrity&&(n.integrity=s.integrity),s.referrerPolicy&&(n.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?n.credentials="include":s.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function t(s){if(s.ep)return;s.ep=!0;const n=e(s);fetch(s.href,n)}})();const U=()=>({search:"",methods:new Set(["GET","POST","PUT","DELETE","PATCH"]),activeOnly:!1,rightPanelOpen:!1,helpOpen:!1,globalOpen:!1,expandedKey:null,focusedKey:null,routes:[],doc:null,overrides:[],scenarios:[],loading:!0}),L=(a,i)=>`${a.toUpperCase()} ${i}`,B=(...a)=>{let i=U();const e=new Set;return{get:()=>i,set:o=>{i={...i,...o};for(const r of e)r(i)},subscribe:o=>(e.add(o),()=>{e.delete(o)})}},G=(a,i)=>{const e=[];for(const t of a){const s=i?.paths?.[t.path]?.[t.method.toLowerCase()]??{},n=s.tags?.[0],o=t.path.split("/").filter(Boolean)[0]??"other",r=n??o;e.push({method:t.method.toUpperCase(),path:t.path,op:{...s,...t.summary&&!s.summary?{summary:t.summary}:{}},groupKey:r.toLowerCase(),groupLabel:r,source:t.source??"openapi"})}return e},Q=(a,i)=>{const e=new Map;for(const t of a){const s=e.get(t.groupKey)??{key:t.groupKey,label:t.groupLabel,ops:[]};s.ops.push(t),e.set(t.groupKey,s)}for(const t of e.values())t.ops.sort((s,n)=>s.path===n.path?s.method.localeCompare(n.method):s.path.localeCompare(n.path));return[...e.values()].sort((t,s)=>t.label.localeCompare(s.label))},z=a=>{const i=new Map;for(const e of a){if(e.matcher.kind!=="exact")continue;const t=L(e.matcher.method,e.matcher.path);i.set(t,(i.get(t)??0)+1)}return i},m=typeof window<"u"&&window.__DATABEHAVE_BASE__||"";let k;const v=async a=>{const i=await a.text(),e=i?JSON.parse(i):void 0;if(!a.ok){const t=typeof e=="object"&&e!==null?e.error:void 0;throw new Error(t??`HTTP ${a.status}`)}return e},f={async listOverrides(){const a=await fetch(m+"/overrides");return(await v(a)).overrides??[]},async addOverride(a){const i=await fetch(m+"/overrides",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(a)});return(await v(i)).override},async removeOverride(a){await v(await fetch(m+"/overrides/"+encodeURIComponent(a),{method:"DELETE"}))},async clearOverrides(){await v(await fetch(m+"/overrides",{method:"DELETE"}))},async listRoutes(){const a=await fetch(m+"/openapi-routes");return(await v(a)).routes??[]},async fetchOpenApi(){if(k!==void 0)return k;try{const a=await fetch(m+"/openapi.json");return a.ok?(k=await a.json(),k):(k=null,null)}catch{return k=null,null}},async listScenarios(){const a=await fetch(m+"/scenarios");return a.status===404?[]:(await v(a)).scenarios??[]},async saveScenario(a){await v(await fetch(m+"/scenarios",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:a})}))},async loadScenario(a){await v(await fetch(m+"/scenarios/"+encodeURIComponent(a)+"/load",{method:"POST"}))},async deleteScenario(a){await v(await fetch(m+"/scenarios/"+encodeURIComponent(a),{method:"DELETE"}))}},c=B();let J=0;const T=new Set;let g=[];const V=a=>(T.add(a),()=>{T.delete(a)}),O=()=>{for(const a of T)a(g)},p=(a,i)=>{const e=++J;g=[...g,{id:e,kind:a,message:i}],O(),setTimeout(()=>{g=g.filter(t=>t.id!==e),O()},3e3)},X=a=>{g=g.filter(i=>i.id!==a),O()},Z=()=>g,w=async()=>{try{c.set({overrides:await f.listOverrides()})}catch{}},q=async()=>{try{c.set({scenarios:await f.listScenarios()})}catch{}},D=async(a,i,e)=>{const t=await f.addOverride({matcher:a,mode:i,description:e});return p("success","Override applied"),await w(),t},E=async a=>{await f.removeOverride(a),p("success","Override removed"),await w()},W=async()=>{if(window.confirm("Clear ALL sticky overrides?"))try{await f.clearOverrides(),p("success","Cleared"),await w()}catch(a){p("error",a instanceof Error?a.message:String(a))}},Y=async a=>{try{await f.saveScenario(a),p("success","Saved: "+a),await q()}catch(i){p("error",i instanceof Error?i.message:String(i))}},ee=async a=>{try{await f.loadScenario(a),p("success","Loaded: "+a),await w()}catch(i){p("error",i instanceof Error?i.message:String(i))}},te=async a=>{try{await f.deleteScenario(a),p("success","Deleted: "+a),await q()}catch(i){p("error",i instanceof Error?i.message:String(i))}},C=()=>c.set({globalOpen:!0,rightPanelOpen:!1}),se={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},h=a=>a==null?"":String(a).replace(/[&<>"']/g,i=>se[i]??i);class ae extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub");l(this,"_open",!1)}connectedCallback(){this._render(),this._unsub=c.subscribe(()=>this._render())}disconnectedCallback(){this._unsub?.()}_render(){const e=c.get().scenarios;this.innerHTML=`
1
+ var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configurable:!0,writable:!0,value:e}):a[i]=e;var l=(a,i,e)=>F(a,typeof i!="symbol"?i+"":i,e);(function(){const i=document.createElement("link").relList;if(i&&i.supports&&i.supports("modulepreload"))return;for(const s of document.querySelectorAll('link[rel="modulepreload"]'))t(s);new MutationObserver(s=>{for(const n of s)if(n.type==="childList")for(const o of n.addedNodes)o.tagName==="LINK"&&o.rel==="modulepreload"&&t(o)}).observe(document,{childList:!0,subtree:!0});function e(s){const n={};return s.integrity&&(n.integrity=s.integrity),s.referrerPolicy&&(n.referrerPolicy=s.referrerPolicy),s.crossOrigin==="use-credentials"?n.credentials="include":s.crossOrigin==="anonymous"?n.credentials="omit":n.credentials="same-origin",n}function t(s){if(s.ep)return;s.ep=!0;const n=e(s);fetch(s.href,n)}})();const U=()=>({search:"",methods:new Set(["GET","POST","PUT","DELETE","PATCH"]),activeOnly:!1,rightPanelOpen:!1,helpOpen:!1,globalOpen:!1,expandedKey:null,focusedKey:null,routes:[],doc:null,overrides:[],scenarios:[],loading:!0}),L=(a,i)=>`${a.toUpperCase()} ${i}`,B=(...a)=>{let i=U();const e=new Set;return{get:()=>i,set:o=>{i={...i,...o};for(const r of e)r(i)},subscribe:o=>(e.add(o),()=>{e.delete(o)})}},G=(a,i)=>{const e=[];for(const t of a){const s=i?.paths?.[t.path]?.[t.method.toLowerCase()]??{},n=s.tags?.[0],o=t.path.split("/").filter(Boolean)[0]??"other",r=n??o;e.push({method:t.method.toUpperCase(),path:t.path,op:{...s,...t.summary&&!s.summary?{summary:t.summary}:{}},groupKey:r.toLowerCase(),groupLabel:r,source:t.source??"openapi"})}return e},Q=(a,i)=>{const e=new Map;for(const t of a){const s=e.get(t.groupKey)??{key:t.groupKey,label:t.groupLabel,ops:[]};s.ops.push(t),e.set(t.groupKey,s)}for(const t of e.values())t.ops.sort((s,n)=>s.path===n.path?s.method.localeCompare(n.method):s.path.localeCompare(n.path));return[...e.values()].sort((t,s)=>t.label.localeCompare(s.label))},z=a=>{const i=new Map;for(const e of a){if(e.matcher.kind!=="exact")continue;const t=L(e.matcher.method,e.matcher.path);i.set(t,(i.get(t)??0)+1)}return i},m=typeof window<"u"&&window.__DATABEHAVE_BASE__||"";let k;const v=async a=>{const i=await a.text(),e=i?JSON.parse(i):void 0;if(!a.ok){const t=typeof e=="object"&&e!==null?e.error:void 0;throw new Error(t??`HTTP ${a.status}`)}return e},f={async listOverrides(){const a=await fetch(m+"/overrides");return(await v(a)).overrides??[]},async addOverride(a){const i=await fetch(m+"/overrides",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify(a)});return(await v(i)).override},async removeOverride(a){await v(await fetch(m+"/overrides/"+encodeURIComponent(a),{method:"DELETE"}))},async clearOverrides(){await v(await fetch(m+"/overrides",{method:"DELETE"}))},async listRoutes(){const a=await fetch(m+"/openapi-routes");return(await v(a)).routes??[]},async fetchOpenApi(){if(k!==void 0)return k;try{const a=await fetch(m+"/openapi.json");return a.ok?(k=await a.json(),k):(k=null,null)}catch{return k=null,null}},async listScenarios(){const a=await fetch(m+"/scenarios");return a.status===404?[]:(await v(a)).scenarios??[]},async saveScenario(a){await v(await fetch(m+"/scenarios",{method:"POST",headers:{"content-type":"application/json"},body:JSON.stringify({name:a})}))},async loadScenario(a){await v(await fetch(m+"/scenarios/"+encodeURIComponent(a)+"/load",{method:"POST"}))},async deleteScenario(a){await v(await fetch(m+"/scenarios/"+encodeURIComponent(a),{method:"DELETE"}))}},c=B();let J=0;const T=new Set;let g=[];const V=a=>(T.add(a),()=>{T.delete(a)}),O=()=>{for(const a of T)a(g)},b=(a,i)=>{const e=++J;g=[...g,{id:e,kind:a,message:i}],O(),setTimeout(()=>{g=g.filter(t=>t.id!==e),O()},3e3)},X=a=>{g=g.filter(i=>i.id!==a),O()},Z=()=>g,w=async()=>{try{c.set({overrides:await f.listOverrides()})}catch{}},q=async()=>{try{c.set({scenarios:await f.listScenarios()})}catch{}},D=async(a,i,e)=>{const t=await f.addOverride({matcher:a,mode:i,description:e});return b("success","Override applied"),await w(),t},E=async a=>{await f.removeOverride(a),b("success","Override removed"),await w()},W=async()=>{if(window.confirm("Clear ALL sticky overrides?"))try{await f.clearOverrides(),b("success","Cleared"),await w()}catch(a){b("error",a instanceof Error?a.message:String(a))}},Y=async a=>{try{await f.saveScenario(a),b("success","Saved: "+a),await q()}catch(i){b("error",i instanceof Error?i.message:String(i))}},ee=async a=>{try{await f.loadScenario(a),b("success","Loaded: "+a),await w()}catch(i){b("error",i instanceof Error?i.message:String(i))}},te=async a=>{try{await f.deleteScenario(a),b("success","Deleted: "+a),await q()}catch(i){b("error",i instanceof Error?i.message:String(i))}},C=()=>c.set({globalOpen:!0,rightPanelOpen:!1}),se={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},h=a=>a==null?"":String(a).replace(/[&<>"']/g,i=>se[i]??i);class ae extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub");l(this,"_open",!1)}connectedCallback(){this._render(),this._unsub=c.subscribe(()=>this._render())}disconnectedCallback(){this._unsub?.()}_render(){const e=c.get().scenarios;this.innerHTML=`
2
2
  <div style="position:relative">
3
3
  <button class="ghost" type="button" data-toggle>Scenarios (${e.length})</button>
4
4
  ${this._open?`
@@ -29,14 +29,14 @@ var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configura
29
29
  <span class="path">${h(e.path)}${r?' <span class="no-oas-pill" title="No OpenAPI spec for this route">(no OAS)</span>':""}</span>
30
30
  <span class="summary">${h(e.op.summary??"")}</span>
31
31
  <span class="dot${t?" active":""}" style="${t?`background:${o}`:""}" title="${h(t?.mode.kind??"")}"></span>
32
- </div>`,this.querySelector(".op-row")?.addEventListener("click",()=>{const b=e.method+" "+e.path,u=c.get().expandedKey;c.set({expandedKey:u===b?null:b})})}}customElements.define("dbh-operation-row",ce);const he=a=>a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),ue=a=>a?a.split(/\n{2,}/).map(e=>`<p>${he(e.trim()).replace(/`([^`]+)`/g,(o,r)=>`<code>${r}</code>`).replace(/\n/g,"<br/>")}</p>`).join(""):"",H={string:"string",integer:0,number:0,boolean:!0,null:null},_=(a,i,e=0,t=new Set)=>{if(!a||e>8)return null;if(a.example!==void 0)return a.example;if(a.default!==void 0)return a.default;if(a.enum&&a.enum.length>0)return a.enum[0];if(a.$ref){if(t.has(a.$ref))return null;const s=new Set(t);s.add(a.$ref);const n=a.$ref.replace(/^#\/components\/schemas\//,""),o=i?.components?.schemas?.[n];return _(o,i,e+1,s)}if(a.oneOf?.[0])return _(a.oneOf[0],i,e+1,t);if(a.anyOf?.[0])return _(a.anyOf[0],i,e+1,t);if(a.allOf&&a.allOf.length>0){const s={};for(const n of a.allOf){const o=_(n,i,e+1,t);o&&typeof o=="object"&&!Array.isArray(o)&&Object.assign(s,o)}return s}if(a.type==="object"||a.properties){const s={},n=a.properties??{};for(const[o,r]of Object.entries(n))s[o]=_(r,i,e+1,t);return s}return a.type==="array"?[_(a.items,i,e+1,t)]:typeof a.type=="string"&&a.type in H?H[a.type]:null},pe=(a,i)=>{const e=a.replace(/^#\/components\/schemas\//,"");return i?.components?.schemas?.[e]},P=a=>a?a.$ref?a.$ref.split("/").pop()??"ref":a.type==="array"?`${P(a.items)}[]`:a.type??(a.properties?"object":"any"):"any",x=(a,i,e=0,t,s)=>{if(!a)return'<span class="type">any</span>';if(e>6)return'<span class="type">…</span>';const n=a.$ref?pe(a.$ref,i)??a:a,o=t?`<span class="key">${h(t)}${s?'<span class="req">*</span>':""}: </span>`:"",r=`<span class="type">${h(P(n))}</span>`,d=e<2?" open":"";return n.type==="object"||n.properties?`<details${d}><summary>${o}${r}</summary>`+Object.entries(n.properties??{}).map(([b,u])=>x(u,i,e+1,b,n.required?.includes(b))).join("")+"</details>":n.type==="array"?`<details${d}><summary>${o}${r}</summary>`+x(n.items,i,e+1)+"</details>":`<div style="margin-left:${e?14:0}px">${o}${r}</div>`};class be extends HTMLElement{constructor(){super(...arguments);l(this,"_op",null);l(this,"_doc",null)}setOp(e,t){this._op=e,this._doc=t,this._render()}_render(){const e=this._op;if(!e){this.innerHTML="";return}if(e.source==="handler"){this.innerHTML=`
32
+ </div>`,this.querySelector(".op-row")?.addEventListener("click",()=>{const p=e.method+" "+e.path,u=c.get().expandedKey;c.set({expandedKey:u===p?null:p})})}}customElements.define("dbh-operation-row",ce);const he=a=>a.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/"/g,"&quot;"),ue=a=>a?a.split(/\n{2,}/).map(e=>`<p>${he(e.trim()).replace(/`([^`]+)`/g,(o,r)=>`<code>${r}</code>`).replace(/\n/g,"<br/>")}</p>`).join(""):"",A={string:"string",integer:0,number:0,boolean:!0,null:null},_=(a,i,e=0,t=new Set)=>{if(!a||e>8)return null;if(a.example!==void 0)return a.example;if(a.default!==void 0)return a.default;if(a.enum&&a.enum.length>0)return a.enum[0];if(a.$ref){if(t.has(a.$ref))return null;const s=new Set(t);s.add(a.$ref);const n=a.$ref.replace(/^#\/components\/schemas\//,""),o=i?.components?.schemas?.[n];return _(o,i,e+1,s)}if(a.oneOf?.[0])return _(a.oneOf[0],i,e+1,t);if(a.anyOf?.[0])return _(a.anyOf[0],i,e+1,t);if(a.allOf&&a.allOf.length>0){const s={};for(const n of a.allOf){const o=_(n,i,e+1,t);o&&typeof o=="object"&&!Array.isArray(o)&&Object.assign(s,o)}return s}if(a.type==="object"||a.properties){const s={},n=a.properties??{};for(const[o,r]of Object.entries(n))s[o]=_(r,i,e+1,t);return s}return a.type==="array"?[_(a.items,i,e+1,t)]:typeof a.type=="string"&&a.type in A?A[a.type]:null},pe=(a,i)=>{const e=a.replace(/^#\/components\/schemas\//,"");return i?.components?.schemas?.[e]},P=a=>a?a.$ref?a.$ref.split("/").pop()??"ref":a.type==="array"?`${P(a.items)}[]`:a.type??(a.properties?"object":"any"):"any",x=(a,i,e=0,t,s)=>{if(!a)return'<span class="type">any</span>';if(e>6)return'<span class="type">…</span>';const n=a.$ref?pe(a.$ref,i)??a:a,o=t?`<span class="key">${h(t)}${s?'<span class="req">*</span>':""}: </span>`:"",r=`<span class="type">${h(P(n))}</span>`,d=e<2?" open":"";return n.type==="object"||n.properties?`<details${d}><summary>${o}${r}</summary>`+Object.entries(n.properties??{}).map(([p,u])=>x(u,i,e+1,p,n.required?.includes(p))).join("")+"</details>":n.type==="array"?`<details${d}><summary>${o}${r}</summary>`+x(n.items,i,e+1)+"</details>":`<div style="margin-left:${e?14:0}px">${o}${r}</div>`};class be extends HTMLElement{constructor(){super(...arguments);l(this,"_op",null);l(this,"_doc",null)}setOp(e,t){this._op=e,this._doc=t,this._render()}_render(){const e=this._op;if(!e){this.innerHTML="";return}if(e.source==="handler"){this.innerHTML=`
33
33
  <div class="spec-zone">
34
34
  <h4>Spec</h4>
35
35
  <div class="desc" style="color:#57606a;font-style:italic">
36
36
  No OpenAPI spec for this route. Inject controls and Try-it-out still
37
37
  work; request/response schemas are unavailable.
38
38
  </div>
39
- </div>`;return}const t=this._doc,s=e.op.requestBody?.content?.["application/json"],n=s?.schema,o=s?s.example??_(n,t):null,r=o!=null?JSON.stringify(o,null,2):"",d=e.op.parameters??[],b=e.op.responses??{};this.innerHTML=`
39
+ </div>`;return}const t=this._doc,s=e.op.requestBody?.content?.["application/json"],n=s?.schema,o=s?s.example??_(n,t):null,r=o!=null?JSON.stringify(o,null,2):"",d=e.op.parameters??[],p=e.op.responses??{};this.innerHTML=`
40
40
  <div class="spec-zone">
41
41
  <h4>Spec</h4>
42
42
  ${e.op.description?`<div class="desc">${ue(e.op.description)}</div>`:""}
@@ -63,16 +63,16 @@ var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configura
63
63
  <div class="schema-tree">${x(n,t)}</div>
64
64
  ${r?'<button class="btn ghost" style="margin-top:6px" type="button" data-copy>Copy as JSON example</button>':""}
65
65
  </div>`:""}
66
- ${Object.keys(b).length>0?`
66
+ ${Object.keys(p).length>0?`
67
67
  <div style="margin-top:8px">
68
68
  <h4>Responses</h4>
69
- ${Object.entries(b).map(([u,y])=>{const S=y.content?.["application/json"]?.schema;return`
69
+ ${Object.entries(p).map(([u,y])=>{const S=y.content?.["application/json"]?.schema;return`
70
70
  <details style="margin-top:4px">
71
71
  <summary><strong>${h(u)}</strong> — ${h(y.description??"")}</summary>
72
72
  ${S?`<div class="schema-tree">${x(S,t)}</div>`:""}
73
73
  </details>`}).join("")}
74
74
  </div>`:""}
75
- </div>`,this.querySelector("[data-copy]")?.addEventListener("click",()=>{navigator.clipboard?.writeText(r),p("info","Copied")})}}customElements.define("dbh-spec-zone",be);const K=a=>{const i=new TextEncoder().encode(a);let e="";for(const t of i)e+=String.fromCharCode(t);return btoa(e)},N=a=>{for(let i=0;i<a.length;i++)if(a.charCodeAt(i)>127)return!1;return!0},me=["http-status","business-failure","custom-body","empty-body","malformed-json","delay","hang","destroy"];class fe extends HTMLElement{constructor(){super(...arguments);l(this,"_op",null);l(this,"_existing");l(this,"_globalActive",!1);l(this,"headerOverride",null);l(this,"_scope","exact");l(this,"_kind","http-status");l(this,"_status",500);l(this,"_message","");l(this,"_body","{}");l(this,"_contentType","application/json");l(this,"_ms",1e3);l(this,"_description","")}setOp(e){const t=this._existing?.id===e.existing?.id&&this._op?.path===e.op.path&&this._op?.method===e.op.method;this._op=e.op,this._existing=e.existing,this._globalActive=e.globalActive,t||this._syncFromExisting(),this._render()}_syncFromExisting(){const e=this._existing;if(!e){this._scope="exact",this._kind="http-status",this._status=500,this._message="",this._body="{}",this._contentType="application/json",this._ms=1e3,this._description="";return}(e.matcher.kind==="exact"||e.matcher.kind==="path")&&(this._scope=e.matcher.kind),this._kind=e.mode.kind,this._description=e.description??"";const t=e.mode;t.kind==="http-status"?this._status=t.status:t.kind==="business-failure"?this._message=t.message:t.kind==="custom-body"?(this._status=t.status??200,this._body=JSON.stringify(t.body,null,2),this._contentType=t.contentType??"application/json"):t.kind==="empty-body"?this._status=t.status??204:t.kind==="delay"&&(this._ms=t.ms)}_renderFieldsHtml(){const e=this._kind;return e==="http-status"||e==="empty-body"||e==="malformed-json"?`<div class="row"><label>Status</label><input type="number" data-field="status" value="${this._status}" /></div>`:e==="business-failure"?`<div class="row"><label>Message</label><input type="text" data-field="message" value="${h(this._message)}" placeholder="Optional message returned with the failure" /></div>`:e==="custom-body"?`
75
+ </div>`,this.querySelector("[data-copy]")?.addEventListener("click",()=>{navigator.clipboard?.writeText(r),b("info","Copied")})}}customElements.define("dbh-spec-zone",be);const K=a=>{const i=new TextEncoder().encode(a);let e="";for(const t of i)e+=String.fromCharCode(t);return btoa(e)},N=a=>{for(let i=0;i<a.length;i++)if(a.charCodeAt(i)>127)return!1;return!0},me=["http-status","business-failure","custom-body","empty-body","malformed-json","delay","hang","destroy"];class fe extends HTMLElement{constructor(){super(...arguments);l(this,"_op",null);l(this,"_existing");l(this,"_globalActive",!1);l(this,"headerOverride",null);l(this,"_scope","exact");l(this,"_kind","http-status");l(this,"_status",500);l(this,"_message","");l(this,"_body","{}");l(this,"_contentType","application/json");l(this,"_ms",1e3);l(this,"_description","")}setOp(e){const t=this._existing?.id===e.existing?.id&&this._op?.path===e.op.path&&this._op?.method===e.op.method;this._op=e.op,this._existing=e.existing,this._globalActive=e.globalActive,t||this._syncFromExisting(),this._render()}_syncFromExisting(){const e=this._existing;if(!e){this._scope="exact",this._kind="http-status",this._status=500,this._message="",this._body="{}",this._contentType="application/json",this._ms=1e3,this._description="";return}(e.matcher.kind==="exact"||e.matcher.kind==="path")&&(this._scope=e.matcher.kind),this._kind=e.mode.kind,this._description=e.description??"";const t=e.mode;t.kind==="http-status"?this._status=t.status:t.kind==="business-failure"?this._message=t.message:t.kind==="custom-body"?(this._status=t.status??200,this._body=JSON.stringify(t.body,null,2),this._contentType=t.contentType??"application/json"):t.kind==="empty-body"?this._status=t.status??204:t.kind==="delay"&&(this._ms=t.ms)}_renderFieldsHtml(){const e=this._kind;return e==="http-status"||e==="empty-body"||e==="malformed-json"?`<div class="row"><label>Status</label><input type="number" data-field="status" value="${this._status}" /></div>`:e==="business-failure"?`<div class="row"><label>Message</label><input type="text" data-field="message" value="${h(this._message)}" placeholder="Optional message returned with the failure" /></div>`:e==="custom-body"?`
76
76
  <div class="row"><label>Status</label><input type="number" data-field="status" value="${this._status}" /></div>
77
77
  <div class="row"><label>Content-Type</label><input type="text" data-field="contentType" value="${h(this._contentType)}" /></div>
78
78
  <div class="row"><label>Body</label><textarea data-field="body">${h(this._body)}</textarea></div>`:e==="delay"?`<div class="row"><label>Delay (ms)</label><input type="number" data-field="ms" value="${this._ms}" /></div>`:""}_render(){if(!this._op){this.innerHTML="";return}const e=this._existing;this.innerHTML=`
@@ -103,7 +103,7 @@ var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configura
103
103
  <button class="btn primary" type="button" data-submit>${e?"Update":"Apply"}</button>
104
104
  ${e?`<button class="btn danger" type="button" data-remove="${h(e.id)}">Remove</button>`:""}
105
105
  </div>
106
- </div>`,this._wire()}_wire(){this.querySelector("[data-open-global]")?.addEventListener("click",()=>C());for(const s of this.querySelectorAll("[data-scope]"))s.addEventListener("change",()=>{s.checked&&(this._scope=s.dataset.scope)});const e=this.querySelector("[data-mode]");e?.addEventListener("change",()=>{this._kind=e.value;const s=this.querySelector("[data-fields]");s&&(s.innerHTML=this._renderFieldsHtml(),this._wireFields())}),this._wireFields(),this.querySelector("[data-submit]")?.addEventListener("click",()=>this._submit());const t=this.querySelector("[data-remove]");t?.addEventListener("click",()=>{E(t.dataset.remove??"")})}_wireFields(){const e=this.querySelector('[data-field="description"]');e?.addEventListener("input",()=>{this._description=e.value});for(const t of this.querySelectorAll("[data-fields] [data-field]"))t.addEventListener("input",()=>{const s=t.dataset.field;s==="status"?this._status=Number(t.value):s==="ms"?this._ms=Number(t.value):s==="message"?this._message=t.value:s==="body"?this._body=t.value:s==="contentType"&&(this._contentType=t.value)})}_submit(){const e=this._op;if(!e)return;const t=this._scope==="exact"?{kind:"exact",method:e.method,path:e.path}:{kind:"path",path:e.path};let s,n=null;const o=this._kind;switch(o){case"http-status":s={kind:o,status:this._status};break;case"business-failure":s={kind:o,message:this._message},N(this._message)||(n={name:"x-mock-business-failure-b64",value:K(this._message)});break;case"custom-body":{let r;try{r=JSON.parse(this._body)}catch{r=this._body}s={kind:o,status:this._status,body:r,contentType:this._contentType};break}case"empty-body":s={kind:o,status:this._status};break;case"malformed-json":s={kind:o,status:this._status};break;case"delay":s={kind:o,ms:this._ms};break;case"hang":s={kind:o};break;case"destroy":s={kind:o};break}this.headerOverride=n,this.dispatchEvent(new CustomEvent("dbh-header-override",{detail:n,bubbles:!0})),(async()=>{const r=this._existing;if(r&&t.kind===r.matcher.kind)try{await E(r.id)}catch{}try{await D(t,s,this._description||void 0)}catch(d){p("error",d instanceof Error?d.message:String(d))}})()}}customElements.define("dbh-inject-error-panel",fe);const ye=(a,i)=>{const e=a.op.requestBody?.content?.["application/json"]?.schema;return e?JSON.stringify(_(e,i),null,2):""};class ve extends HTMLElement{constructor(){super(...arguments);l(this,"_op",null);l(this,"_doc",null);l(this,"extraHeader",null);l(this,"_pvals",{});l(this,"_freeQuery",[]);l(this,"_body","");l(this,"_busy",!1)}setOp(e,t){this._op=e,this._doc=t,this._pvals={};for(const s of e.op.parameters??[])this._pvals[s.name]=String(s.schema?.default??"");this._body=ye(e,t),this._freeQuery=e.source==="handler"?[{key:"",value:""}]:[],this._render()}_render(){const e=this._op;if(!e){this.innerHTML="";return}const t=e.op.parameters??[],s=e.method!=="GET"&&e.method!=="HEAD",n=e.source==="handler";this.innerHTML=`
106
+ </div>`,this._wire()}_wire(){this.querySelector("[data-open-global]")?.addEventListener("click",()=>C());for(const s of this.querySelectorAll("[data-scope]"))s.addEventListener("change",()=>{s.checked&&(this._scope=s.dataset.scope)});const e=this.querySelector("[data-mode]");e?.addEventListener("change",()=>{this._kind=e.value;const s=this.querySelector("[data-fields]");s&&(s.innerHTML=this._renderFieldsHtml(),this._wireFields())}),this._wireFields(),this.querySelector("[data-submit]")?.addEventListener("click",()=>this._submit());const t=this.querySelector("[data-remove]");t?.addEventListener("click",()=>{E(t.dataset.remove??"")})}_wireFields(){const e=this.querySelector('[data-field="description"]');e?.addEventListener("input",()=>{this._description=e.value});for(const t of this.querySelectorAll("[data-fields] [data-field]"))t.addEventListener("input",()=>{const s=t.dataset.field;s==="status"?this._status=Number(t.value):s==="ms"?this._ms=Number(t.value):s==="message"?this._message=t.value:s==="body"?this._body=t.value:s==="contentType"&&(this._contentType=t.value)})}_submit(){const e=this._op;if(!e)return;const t=this._scope==="exact"?{kind:"exact",method:e.method,path:e.path}:{kind:"path",path:e.path};let s,n=null;const o=this._kind;switch(o){case"http-status":s={kind:o,status:this._status};break;case"business-failure":s={kind:o,message:this._message},N(this._message)||(n={name:"x-mock-business-failure-b64",value:K(this._message)});break;case"custom-body":{let r;try{r=JSON.parse(this._body)}catch{r=this._body}s={kind:o,status:this._status,body:r,contentType:this._contentType};break}case"empty-body":s={kind:o,status:this._status};break;case"malformed-json":s={kind:o,status:this._status};break;case"delay":s={kind:o,ms:this._ms};break;case"hang":s={kind:o};break;case"destroy":s={kind:o};break}this.headerOverride=n,this.dispatchEvent(new CustomEvent("dbh-header-override",{detail:n,bubbles:!0})),(async()=>{const r=this._existing;if(r&&t.kind===r.matcher.kind)try{await E(r.id)}catch{}try{await D(t,s,this._description||void 0)}catch(d){b("error",d instanceof Error?d.message:String(d))}})()}}customElements.define("dbh-inject-error-panel",fe);const ye=(a,i)=>{const e=a.op.requestBody?.content?.["application/json"]?.schema;return e?JSON.stringify(_(e,i),null,2):""};class ve extends HTMLElement{constructor(){super(...arguments);l(this,"_op",null);l(this,"_doc",null);l(this,"extraHeader",null);l(this,"_pvals",{});l(this,"_freeQuery",[]);l(this,"_body","");l(this,"_busy",!1)}setOp(e,t){this._op=e,this._doc=t,this._pvals={};for(const s of e.op.parameters??[])this._pvals[s.name]=String(s.schema?.default??"");this._body=ye(e,t),this._freeQuery=e.source==="handler"?[{key:"",value:""}]:[],this._render()}_render(){const e=this._op;if(!e){this.innerHTML="";return}const t=e.op.parameters??[],s=e.method!=="GET"&&e.method!=="HEAD",n=e.source==="handler";this.innerHTML=`
107
107
  <details class="try-it">
108
108
  <summary>Try it out</summary>
109
109
  ${t.map(r=>`
@@ -131,7 +131,7 @@ var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configura
131
131
  </div>`:""}
132
132
  <button class="btn primary" type="button" data-send${this._busy?" disabled":""}>${this._busy?"…":"Send"}</button>
133
133
  <dbh-response-viewer></dbh-response-viewer>
134
- </details>`;for(const r of this.querySelectorAll("[data-pname]"))r.addEventListener("input",()=>{this._pvals[r.dataset.pname??""]=r.value});for(const r of this.querySelectorAll("[data-fq-key]"))r.addEventListener("input",()=>{const d=Number(r.dataset.fqKey);this._freeQuery[d]&&(this._freeQuery[d].key=r.value)});for(const r of this.querySelectorAll("[data-fq-val]"))r.addEventListener("input",()=>{const d=Number(r.dataset.fqVal);this._freeQuery[d]&&(this._freeQuery[d].value=r.value)});for(const r of this.querySelectorAll("[data-fq-rm]"))r.addEventListener("click",()=>{const d=Number(r.dataset.fqRm);this._freeQuery.splice(d,1),this._freeQuery.length===0&&this._freeQuery.push({key:"",value:""}),this._render()});this.querySelector("[data-fq-add]")?.addEventListener("click",()=>{this._freeQuery.push({key:"",value:""}),this._render()});const o=this.querySelector("[data-body]");o?.addEventListener("input",()=>{this._body=o.value}),this.querySelector("[data-send]")?.addEventListener("click",()=>{this._send()})}_buildUrl(){const e=this._op;if(!e)return"";const t=e.op.parameters??[];let s=e.path;const n=new URLSearchParams;for(const r of t){const d=this._pvals[r.name];d&&(r.in==="path"?s=s.replace(`{${r.name}}`,encodeURIComponent(d)):r.in==="query"&&n.set(r.name,d))}for(const r of this._freeQuery)r.key&&n.append(r.key,r.value);const o=n.toString();return o?`${s}?${o}`:s}async _send(){const e=this._op;if(!e)return;this._busy=!0;const t=this.querySelector("dbh-response-viewer");t?.setResult(null);const s=this.querySelector("[data-send]");s&&(s.disabled=!0,s.textContent="…");const n=performance.now();try{const o={};for(const y of e.op.parameters??[])y.in==="header"&&this._pvals[y.name]&&(o[y.name]=this._pvals[y.name]);this.extraHeader&&(o[this.extraHeader.name]=this.extraHeader.value);const r={method:e.method,headers:o};e.method!=="GET"&&e.method!=="HEAD"&&this._body&&(o["content-type"]=o["content-type"]??"application/json",r.body=this._body);const d=await fetch(this._buildUrl(),r),b=await d.text(),u={status:d.status,headers:{},body:b,elapsedMs:Math.round(performance.now()-n)};d.headers.forEach((y,S)=>{u.headers[S]=y}),t?.setResult(u)}catch(o){t?.setResult({error:o instanceof Error?o.message:String(o)})}finally{this._busy=!1,s&&(s.disabled=!1,s.textContent="Send")}}}customElements.define("dbh-try-it-out",ve);const I=(a,i)=>{if(!a.methods||a.methods.length===0)return!0;const e=i.toUpperCase();return a.methods.some(t=>t.toUpperCase()===e)};class _e extends HTMLElement{constructor(){super(...arguments);l(this,"_spec");l(this,"_inject");l(this,"_try")}connectedCallback(){this.childElementCount===0&&(this.innerHTML=`
134
+ </details>`;for(const r of this.querySelectorAll("[data-pname]"))r.addEventListener("input",()=>{this._pvals[r.dataset.pname??""]=r.value});for(const r of this.querySelectorAll("[data-fq-key]"))r.addEventListener("input",()=>{const d=Number(r.dataset.fqKey);this._freeQuery[d]&&(this._freeQuery[d].key=r.value)});for(const r of this.querySelectorAll("[data-fq-val]"))r.addEventListener("input",()=>{const d=Number(r.dataset.fqVal);this._freeQuery[d]&&(this._freeQuery[d].value=r.value)});for(const r of this.querySelectorAll("[data-fq-rm]"))r.addEventListener("click",()=>{const d=Number(r.dataset.fqRm);this._freeQuery.splice(d,1),this._freeQuery.length===0&&this._freeQuery.push({key:"",value:""}),this._render()});this.querySelector("[data-fq-add]")?.addEventListener("click",()=>{this._freeQuery.push({key:"",value:""}),this._render()});const o=this.querySelector("[data-body]");o?.addEventListener("input",()=>{this._body=o.value}),this.querySelector("[data-send]")?.addEventListener("click",()=>{this._send()})}_buildUrl(){const e=this._op;if(!e)return"";const t=e.op.parameters??[];let s=e.path;const n=new URLSearchParams;for(const r of t){const d=this._pvals[r.name];d&&(r.in==="path"?s=s.replace(`{${r.name}}`,encodeURIComponent(d)):r.in==="query"&&n.set(r.name,d))}for(const r of this._freeQuery)r.key&&n.append(r.key,r.value);const o=n.toString();return o?`${s}?${o}`:s}async _send(){const e=this._op;if(!e)return;this._busy=!0;const t=this.querySelector("dbh-response-viewer");t?.setResult(null);const s=this.querySelector("[data-send]");s&&(s.disabled=!0,s.textContent="…");const n=performance.now();try{const o={};for(const y of e.op.parameters??[])y.in==="header"&&this._pvals[y.name]&&(o[y.name]=this._pvals[y.name]);this.extraHeader&&(o[this.extraHeader.name]=this.extraHeader.value);const r={method:e.method,headers:o};e.method!=="GET"&&e.method!=="HEAD"&&this._body&&(o["content-type"]=o["content-type"]??"application/json",r.body=this._body);const d=await fetch(this._buildUrl(),r),p=await d.text(),u={status:d.status,headers:{},body:p,elapsedMs:Math.round(performance.now()-n)};d.headers.forEach((y,S)=>{u.headers[S]=y}),t?.setResult(u)}catch(o){t?.setResult({error:o instanceof Error?o.message:String(o)})}finally{this._busy=!1,s&&(s.disabled=!1,s.textContent="Send")}}}customElements.define("dbh-try-it-out",ve);const I=(a,i)=>{if(!a.methods||a.methods.length===0)return!0;const e=i.toUpperCase();return a.methods.some(t=>t.toUpperCase()===e)};class _e extends HTMLElement{constructor(){super(...arguments);l(this,"_spec");l(this,"_inject");l(this,"_try")}connectedCallback(){this.childElementCount===0&&(this.innerHTML=`
135
135
  <div class="op-card">
136
136
  <dbh-spec-zone></dbh-spec-zone>
137
137
  <dbh-inject-error-panel></dbh-inject-error-panel>
@@ -144,7 +144,7 @@ var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configura
144
144
  <span>${this._open?"−":"+"}</span>
145
145
  </div>
146
146
  <div class="group-body" data-body></div>
147
- </div>`,this.querySelector("[data-header]")?.addEventListener("click",()=>{this._open=!this._open,this._render()});const t=this.querySelector("[data-body]");if(t)for(const s of this._ops){const n=`${s.method} ${s.path}`,o=this._overrides.find(d=>d.matcher.kind==="exact"&&d.matcher.method===s.method&&d.matcher.path===s.path),r=document.createElement("dbh-operation-row");if(r.setRow({op:s,override:o,expanded:this._expandedKey===n,focused:this._focusedKey===n}),t.appendChild(r),this._expandedKey===n){const d=document.createElement("dbh-operation-card");t.appendChild(d),d.setData({op:s,doc:this._doc,overrides:this._overrides})}}}}customElements.define("dbh-tag-group",ge);const ke=a=>{if(a.matcher.kind==="exact")return`${a.matcher.method} ${a.matcher.path}`;if(a.matcher.kind==="path")return`* ${a.matcher.path}`;const i=a.matcher.methods;return i&&i.length>0?`${i.join("|")} (global)`:"* (global)"},A=a=>a.matcher.kind==="global"?0:a.matcher.kind==="path"?1:2;class $e extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub")}connectedCallback(){this._render(),this._unsub=c.subscribe(()=>this._render())}disconnectedCallback(){this._unsub?.()}_render(){const e=c.get(),t=[...e.overrides].sort((s,n)=>A(s)-A(n));this.innerHTML=`
147
+ </div>`,this.querySelector("[data-header]")?.addEventListener("click",()=>{this._open=!this._open,this._render()});const t=this.querySelector("[data-body]");if(t)for(const s of this._ops){const n=`${s.method} ${s.path}`,o=this._overrides.find(d=>d.matcher.kind==="exact"&&d.matcher.method===s.method&&d.matcher.path===s.path),r=document.createElement("dbh-operation-row");if(r.setRow({op:s,override:o,expanded:this._expandedKey===n,focused:this._focusedKey===n}),t.appendChild(r),this._expandedKey===n){const d=document.createElement("dbh-operation-card");t.appendChild(d),d.setData({op:s,doc:this._doc,overrides:this._overrides})}}}}customElements.define("dbh-tag-group",ge);const ke=a=>{if(a.matcher.kind==="exact")return`${a.matcher.method} ${a.matcher.path}`;if(a.matcher.kind==="path")return`* ${a.matcher.path}`;const i=a.matcher.methods;return i&&i.length>0?`${i.join("|")} (global)`:"* (global)"},H=a=>a.matcher.kind==="global"?0:a.matcher.kind==="path"?1:2;class $e extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub")}connectedCallback(){this._render(),this._unsub=c.subscribe(()=>this._render())}disconnectedCallback(){this._unsub?.()}_render(){const e=c.get(),t=[...e.overrides].sort((s,n)=>H(s)-H(n));this.innerHTML=`
148
148
  <aside class="right-panel${e.rightPanelOpen?" open":""}">
149
149
  <header>
150
150
  <h2>Active overrides (${e.overrides.length})</h2>
@@ -162,7 +162,7 @@ var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configura
162
162
  <button class="btn danger" type="button" data-remove="${h(s.id)}">Remove</button>
163
163
  </div>`).join("")}
164
164
  </div>
165
- </aside>`,this.querySelector("[data-close]")?.addEventListener("click",()=>c.set({rightPanelOpen:!1}));for(const s of this.querySelectorAll("[data-jump]"))s.addEventListener("click",()=>{const n=s.dataset.jump??"",o=c.get().overrides.find(d=>d.id===n);if(!o)return;if(o.matcher.kind==="global"){C();return}if(o.matcher.kind!=="exact"){c.set({rightPanelOpen:!1});return}const r=L(o.matcher.method,o.matcher.path);c.set({expandedKey:r,focusedKey:r,rightPanelOpen:!1}),setTimeout(()=>{const d=document.querySelector(`[data-key="${r.replace(/"/g,'\\"')}"]`);d&&"scrollIntoView"in d&&d.scrollIntoView({behavior:"smooth",block:"center"})},50)});for(const s of this.querySelectorAll("[data-remove]"))s.addEventListener("click",n=>{n.stopPropagation(),E(s.dataset.remove??"")})}}customElements.define("dbh-active-overrides-panel",$e);class Ee extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub")}connectedCallback(){this._render(),this._unsub=c.subscribe(()=>this._render())}disconnectedCallback(){this._unsub?.()}_render(){const t=c.get().overrides.length;if(t===0){this.innerHTML="";return}this.innerHTML=`<button class="pill-float" type="button">${t} Active overrides</button>`,this.querySelector("button")?.addEventListener("click",()=>c.set({rightPanelOpen:!0}))}}customElements.define("dbh-floating-pill",Ee);class we extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub")}connectedCallback(){this._render(Z()),this._unsub=V(e=>this._render(e))}disconnectedCallback(){this._unsub?.()}_render(e){this.innerHTML='<div class="toast-stack">'+e.map(t=>`<div class="toast ${h(t.kind)}" data-id="${t.id}">${h(t.message)}</div>`).join("")+"</div>";for(const t of this.querySelectorAll(".toast"))t.addEventListener("click",()=>{const s=Number(t.dataset.id);Number.isFinite(s)&&X(s)})}}customElements.define("dbh-toasts",we);class Se extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub")}connectedCallback(){this._render(),this._unsub=c.subscribe(()=>this._render())}disconnectedCallback(){this._unsub?.()}_render(){if(!c.get().helpOpen){this.innerHTML="";return}this.innerHTML=`
165
+ </aside>`,this.querySelector("[data-close]")?.addEventListener("click",()=>c.set({rightPanelOpen:!1}));for(const s of this.querySelectorAll("[data-jump]"))s.addEventListener("click",()=>{const n=s.dataset.jump??"",o=c.get().overrides.find(d=>d.id===n);if(!o)return;if(o.matcher.kind==="global"){C();return}if(o.matcher.kind!=="exact"){c.set({rightPanelOpen:!1});return}const r=L(o.matcher.method,o.matcher.path);c.set({expandedKey:r,focusedKey:r,rightPanelOpen:!1}),setTimeout(()=>{const d=Array.from(document.querySelectorAll("[data-key]")).find(p=>p.getAttribute("data-key")===r);d&&"scrollIntoView"in d&&d.scrollIntoView({behavior:"smooth",block:"center"})},50)});for(const s of this.querySelectorAll("[data-remove]"))s.addEventListener("click",n=>{n.stopPropagation(),E(s.dataset.remove??"")})}}customElements.define("dbh-active-overrides-panel",$e);class Ee extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub")}connectedCallback(){this._render(),this._unsub=c.subscribe(()=>this._render())}disconnectedCallback(){this._unsub?.()}_render(){const t=c.get().overrides.length;if(t===0){this.innerHTML="";return}this.innerHTML=`<button class="pill-float" type="button">${t} Active overrides</button>`,this.querySelector("button")?.addEventListener("click",()=>c.set({rightPanelOpen:!0}))}}customElements.define("dbh-floating-pill",Ee);class we extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub")}connectedCallback(){this._render(Z()),this._unsub=V(e=>this._render(e))}disconnectedCallback(){this._unsub?.()}_render(e){this.innerHTML='<div class="toast-stack">'+e.map(t=>`<div class="toast ${h(t.kind)}" data-id="${t.id}">${h(t.message)}</div>`).join("")+"</div>";for(const t of this.querySelectorAll(".toast"))t.addEventListener("click",()=>{const s=Number(t.dataset.id);Number.isFinite(s)&&X(s)})}}customElements.define("dbh-toasts",we);class Se extends HTMLElement{constructor(){super(...arguments);l(this,"_unsub")}connectedCallback(){this._render(),this._unsub=c.subscribe(()=>this._render())}disconnectedCallback(){this._unsub?.()}_render(){if(!c.get().helpOpen){this.innerHTML="";return}this.innerHTML=`
166
166
  <div class="modal-backdrop">
167
167
  <div class="modal">
168
168
  <h2>Keyboard shortcuts</h2>
@@ -227,7 +227,7 @@ var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configura
227
227
  </div>`}).join("")}
228
228
  </div>`:""}
229
229
  </div>
230
- </div>`,this._wire()}_wire(){const e=()=>c.set({globalOpen:!1});this.querySelector(".modal-backdrop")?.addEventListener("click",e),this.querySelector(".modal")?.addEventListener("click",s=>s.stopPropagation()),this.querySelector("[data-close]")?.addEventListener("click",e);const t=this.querySelector("[data-mode]");t?.addEventListener("change",()=>{this._kind=t.value;const s=this.querySelector("[data-fields]");s&&(s.innerHTML=this._renderFieldsHtml(),this._wireFields())}),this._wireFields();for(const s of this.querySelectorAll("[data-method]"))s.addEventListener("change",()=>{const n=s.dataset.method??"";s.checked?this._methods.add(n):this._methods.delete(n)});this.querySelector("[data-submit]")?.addEventListener("click",()=>this._submit());for(const s of this.querySelectorAll("[data-remove]"))s.addEventListener("click",()=>{E(s.dataset.remove??"")})}_wireFields(){const e=this.querySelector('[data-field="description"]');e?.addEventListener("input",()=>{this._description=e.value});for(const t of this.querySelectorAll("[data-fields] [data-field]"))t.addEventListener("input",()=>{const s=t.dataset.field;s==="status"?this._status=Number(t.value):s==="ms"?this._ms=Number(t.value):s==="message"?this._message=t.value:s==="body"?this._body=t.value:s==="contentType"&&(this._contentType=t.value)})}_submit(){let e;const t=this._kind;switch(t){case"http-status":e={kind:t,status:this._status};break;case"business-failure":e={kind:t,message:this._message},N(this._message)||K(this._message);break;case"custom-body":{let r;try{r=JSON.parse(this._body)}catch{r=this._body}e={kind:t,status:this._status,body:r,contentType:this._contentType};break}case"empty-body":e={kind:t,status:this._status};break;case"malformed-json":e={kind:t,status:this._status};break;case"delay":e={kind:t,ms:this._ms};break;case"hang":e={kind:t};break;case"destroy":e={kind:t};break}const s=$.length,n=$.filter(r=>this._methods.has(r));if(n.length===0){p("error","Select at least one HTTP method.");return}const o=n.length===s?{kind:"global"}:{kind:"global",methods:n};(async()=>{const r=this._globals()[0];if(r)try{await E(r.id)}catch{}try{await D(o,e,this._description||void 0)}catch(d){p("error",d instanceof Error?d.message:String(d))}})()}}customElements.define("dbh-global-override-panel",Te);const Oe=["GET","POST","PUT","DELETE","PATCH"];class Le extends HTMLElement{constructor(){super(...arguments);l(this,"_filter");l(this,"_main");l(this,"_unsub");l(this,"_debounce");l(this,"_debouncedSearch","");l(this,"_onKeyDown",e=>this._handleKey(e))}connectedCallback(){this.innerHTML=`
230
+ </div>`,this._wire()}_wire(){const e=()=>c.set({globalOpen:!1});this.querySelector(".modal-backdrop")?.addEventListener("click",e),this.querySelector(".modal")?.addEventListener("click",s=>s.stopPropagation()),this.querySelector("[data-close]")?.addEventListener("click",e);const t=this.querySelector("[data-mode]");t?.addEventListener("change",()=>{this._kind=t.value;const s=this.querySelector("[data-fields]");s&&(s.innerHTML=this._renderFieldsHtml(),this._wireFields())}),this._wireFields();for(const s of this.querySelectorAll("[data-method]"))s.addEventListener("change",()=>{const n=s.dataset.method??"";s.checked?this._methods.add(n):this._methods.delete(n)});this.querySelector("[data-submit]")?.addEventListener("click",()=>this._submit());for(const s of this.querySelectorAll("[data-remove]"))s.addEventListener("click",()=>{E(s.dataset.remove??"")})}_wireFields(){const e=this.querySelector('[data-field="description"]');e?.addEventListener("input",()=>{this._description=e.value});for(const t of this.querySelectorAll("[data-fields] [data-field]"))t.addEventListener("input",()=>{const s=t.dataset.field;s==="status"?this._status=Number(t.value):s==="ms"?this._ms=Number(t.value):s==="message"?this._message=t.value:s==="body"?this._body=t.value:s==="contentType"&&(this._contentType=t.value)})}_submit(){let e;const t=this._kind;switch(t){case"http-status":e={kind:t,status:this._status};break;case"business-failure":e={kind:t,message:this._message},N(this._message)||K(this._message);break;case"custom-body":{let r;try{r=JSON.parse(this._body)}catch{r=this._body}e={kind:t,status:this._status,body:r,contentType:this._contentType};break}case"empty-body":e={kind:t,status:this._status};break;case"malformed-json":e={kind:t,status:this._status};break;case"delay":e={kind:t,ms:this._ms};break;case"hang":e={kind:t};break;case"destroy":e={kind:t};break}const s=$.length,n=$.filter(r=>this._methods.has(r));if(n.length===0){b("error","Select at least one HTTP method.");return}const o=n.length===s?{kind:"global"}:{kind:"global",methods:n};(async()=>{const r=this._globals()[0];if(r)try{await E(r.id)}catch{}try{await D(o,e,this._description||void 0)}catch(d){b("error",d instanceof Error?d.message:String(d))}})()}}customElements.define("dbh-global-override-panel",Te);const Oe=["GET","POST","PUT","DELETE","PATCH"];class Le extends HTMLElement{constructor(){super(...arguments);l(this,"_filter");l(this,"_main");l(this,"_unsub");l(this,"_debounce");l(this,"_debouncedSearch","");l(this,"_onKeyDown",e=>this._handleKey(e))}connectedCallback(){this.innerHTML=`
231
231
  <div class="app">
232
232
  <dbh-top-bar></dbh-top-bar>
233
233
  <dbh-filter-bar></dbh-filter-bar>
@@ -237,4 +237,4 @@ var R=Object.defineProperty;var F=(a,i,e)=>i in a?R(a,i,{enumerable:!0,configura
237
237
  <dbh-toasts></dbh-toasts>
238
238
  <dbh-help-modal></dbh-help-modal>
239
239
  <dbh-global-override-panel></dbh-global-override-panel>
240
- </div>`,this._filter=this.querySelector("dbh-filter-bar"),this._main=this.querySelector("[data-main]"),this._unsub=c.subscribe(()=>this._onStateChange()),window.addEventListener("keydown",this._onKeyDown),(async()=>{const[e,t]=await Promise.all([f.listRoutes(),f.fetchOpenApi()]);c.set({routes:e,doc:t??null,loading:!1}),await w(),await q(),this._renderList()})()}disconnectedCallback(){this._unsub?.(),window.removeEventListener("keydown",this._onKeyDown),this._debounce&&clearTimeout(this._debounce)}_onStateChange(){c.get().search!==this._debouncedSearch?(this._debounce&&clearTimeout(this._debounce),this._debounce=setTimeout(()=>{this._debouncedSearch=c.get().search,this._renderList()},150)):this._renderList()}_filtered(){const e=c.get(),t=G(e.routes,e.doc),s=this._debouncedSearch.trim().toLowerCase(),n=e.methods.size>0?e.methods:new Set(Oe);return t.filter(o=>!(!n.has(o.method)||s&&!o.path.toLowerCase().includes(s)&&!o.op.summary?.toLowerCase().includes(s)||e.activeOnly&&!e.overrides.some(d=>d.matcher.kind==="exact"&&d.matcher.method===o.method&&d.matcher.path===o.path||d.matcher.kind==="path"&&d.matcher.path===o.path||d.matcher.kind==="global"&&I(d.matcher,o.method))))}_renderList(){const e=c.get(),t=this._filtered(),s=Q(t,z(e.overrides));if(this._main.innerHTML="",s.length===0){const n=document.createElement("p");n.style.color="#57606a",n.textContent="No operations match these filters.",this._main.appendChild(n);return}for(const n of s){const o=document.createElement("dbh-tag-group");this._main.appendChild(o),o.setData({label:n.label,ops:n.ops,doc:e.doc,overrides:e.overrides,expandedKey:e.expandedKey,focusedKey:e.focusedKey})}}_handleKey(e){const t=e.target,s=!!t&&(t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.tagName==="SELECT"),n=this._filter?.searchInput,o=c.get();if(e.key==="/"&&!s)e.preventDefault(),n?.focus();else if((e.ctrlKey||e.metaKey)&&e.key.toLowerCase()==="k")e.preventDefault(),n?.focus();else if(e.key==="?"&&!s)e.preventDefault(),c.set({helpOpen:!0});else if(e.key==="Escape")o.helpOpen?c.set({helpOpen:!1}):o.globalOpen?c.set({globalOpen:!1}):o.rightPanelOpen?c.set({rightPanelOpen:!1}):o.expandedKey?c.set({expandedKey:null}):n?.blur();else if((e.key==="ArrowDown"||e.key==="ArrowUp")&&document.activeElement===n){e.preventDefault();const r=this._filtered().map(u=>L(u.method,u.path));if(r.length===0)return;const d=o.focusedKey?r.indexOf(o.focusedKey):-1,b=e.key==="ArrowDown"?Math.min(r.length-1,d+1):Math.max(0,d-1);c.set({focusedKey:r[b]??null})}else e.key==="Enter"&&document.activeElement===n&&o.focusedKey&&(e.preventDefault(),c.set({expandedKey:o.expandedKey===o.focusedKey?null:o.focusedKey}))}}customElements.define("dbh-app",Le);const j=document.getElementById("root");if(j){const a=document.createElement("dbh-app");j.appendChild(a)}
240
+ </div>`,this._filter=this.querySelector("dbh-filter-bar"),this._main=this.querySelector("[data-main]"),this._unsub=c.subscribe(()=>this._onStateChange()),window.addEventListener("keydown",this._onKeyDown),(async()=>{const[e,t]=await Promise.all([f.listRoutes(),f.fetchOpenApi()]);c.set({routes:e,doc:t??null,loading:!1}),await w(),await q(),this._renderList()})()}disconnectedCallback(){this._unsub?.(),window.removeEventListener("keydown",this._onKeyDown),this._debounce&&clearTimeout(this._debounce)}_onStateChange(){c.get().search!==this._debouncedSearch?(this._debounce&&clearTimeout(this._debounce),this._debounce=setTimeout(()=>{this._debouncedSearch=c.get().search,this._renderList()},150)):this._renderList()}_filtered(){const e=c.get(),t=G(e.routes,e.doc),s=this._debouncedSearch.trim().toLowerCase(),n=e.methods.size>0?e.methods:new Set(Oe);return t.filter(o=>!(!n.has(o.method)||s&&!o.path.toLowerCase().includes(s)&&!o.op.summary?.toLowerCase().includes(s)||e.activeOnly&&!e.overrides.some(d=>d.matcher.kind==="exact"&&d.matcher.method===o.method&&d.matcher.path===o.path||d.matcher.kind==="path"&&d.matcher.path===o.path||d.matcher.kind==="global"&&I(d.matcher,o.method))))}_renderList(){const e=c.get(),t=this._filtered(),s=Q(t,z(e.overrides));if(this._main.innerHTML="",s.length===0){const n=document.createElement("p");n.style.color="#57606a",n.textContent="No operations match these filters.",this._main.appendChild(n);return}for(const n of s){const o=document.createElement("dbh-tag-group");this._main.appendChild(o),o.setData({label:n.label,ops:n.ops,doc:e.doc,overrides:e.overrides,expandedKey:e.expandedKey,focusedKey:e.focusedKey})}}_handleKey(e){const t=e.target,s=!!t&&(t.tagName==="INPUT"||t.tagName==="TEXTAREA"||t.tagName==="SELECT"),n=this._filter?.searchInput,o=c.get();if(e.key==="/"&&!s)e.preventDefault(),n?.focus();else if((e.ctrlKey||e.metaKey)&&e.key.toLowerCase()==="k")e.preventDefault(),n?.focus();else if(e.key==="?"&&!s)e.preventDefault(),c.set({helpOpen:!0});else if(e.key==="Escape")o.helpOpen?c.set({helpOpen:!1}):o.globalOpen?c.set({globalOpen:!1}):o.rightPanelOpen?c.set({rightPanelOpen:!1}):o.expandedKey?c.set({expandedKey:null}):n?.blur();else if((e.key==="ArrowDown"||e.key==="ArrowUp")&&document.activeElement===n){e.preventDefault();const r=this._filtered().map(u=>L(u.method,u.path));if(r.length===0)return;const d=o.focusedKey?r.indexOf(o.focusedKey):-1,p=e.key==="ArrowDown"?Math.min(r.length-1,d+1):Math.max(0,d-1);c.set({focusedKey:r[p]??null})}else e.key==="Enter"&&document.activeElement===n&&o.focusedKey&&(e.preventDefault(),c.set({expandedKey:o.expandedKey===o.focusedKey?null:o.focusedKey}))}}customElements.define("dbh-app",Le);const j=document.getElementById("root");if(j){const a=document.createElement("dbh-app");j.appendChild(a)}
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAA;AAmB/B,OAAO,KAAK,EACV,MAAM,EAKN,WAAW,EACX,YAAY,EAGZ,MAAM,EACP,MAAM,YAAY,CAAA;AAInB;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,KAAK,eAAe,GAAG,SAAS,KAC/B;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,OAAO,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,eAAe,GAAG,KAAK,CAAA;IAC7B,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1C,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,IAkBH,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,UACI,CAAC,CACC,GAAG,EAAE,WAAW,KACb,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,GACxD,SAAS,EACb,WAAW,CACT,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KAChC,CAAC,CACF,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAOhC,CAAA;AA+FD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB,GACnC,KAAK,KAAK,EACV,eAAe,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,KAChD,IAYF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MA2W7C,CAAA"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAUA,OAAO,EAEL,KAAK,eAAe,EACrB,MAAM,wBAAwB,CAAA;AAmB/B,OAAO,KAAK,EACV,MAAM,EAKN,WAAW,EACX,YAAY,EAGZ,MAAM,EACP,MAAM,YAAY,CAAA;AAInB;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,GAC3B,KAAK,eAAe,GAAG,SAAS,KAC/B;IACD,IAAI,EAAE,MAAM,CAAA;IACZ,EAAE,EAAE,OAAO,CAAA;IACX,OAAO,EAAE,OAAO,CAAA;IAChB,IAAI,EAAE,eAAe,GAAG,KAAK,CAAA;IAC7B,IAAI,EAAE,WAAW,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC,CAAA;IAC1C,YAAY,EAAE,OAAO,CAAA;IACrB,WAAW,EAAE,MAAM,GAAG,SAAS,CAAA;IAC/B,YAAY,EAAE,MAAM,CAAA;CACrB,GAAG,IAkBH,CAAA;AAED;;;;GAIG;AACH,eAAO,MAAM,qBAAqB,GAChC,UACI,CAAC,CACC,GAAG,EAAE,WAAW,KACb,YAAY,GAAG,IAAI,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC,GACxD,SAAS,EACb,WAAW,CACT,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,KAChC,CAAC,CACF,GAAG,EAAE,WAAW,KACb,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAOhC,CAAA;AA+FD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,wBAAwB,GACnC,KAAK,KAAK,EACV,eAAe,CAAC,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,KAChD,IAYF,CAAA;AAED,eAAO,MAAM,YAAY,GAAI,QAAQ,MAAM,KAAG,MA6W7C,CAAA"}
package/dist/server.js CHANGED
@@ -386,7 +386,7 @@ export const createServer = (config) => {
386
386
  status: 500,
387
387
  json: {
388
388
  error: 'internal_error',
389
- message: errMsg,
389
+ message: 'Internal server error',
390
390
  },
391
391
  };
392
392
  return finalize(buildResponse(decorateWithCors(errRes, probe)), errMsg);
@@ -458,12 +458,14 @@ export const createServer = (config) => {
458
458
  }
459
459
  return;
460
460
  }
461
+ // Keep diagnostics on the server side; never leak internals to clients.
462
+ // eslint-disable-next-line no-console
463
+ console.error('[@databehave/server] request handling error:', err);
461
464
  if (!res.headersSent) {
462
465
  res.statusCode = 500;
463
466
  res.setHeader('content-type', 'application/json');
464
467
  }
465
- const message = err instanceof Error ? err.message : String(err);
466
- res.end(JSON.stringify({ error: 'internal_error', message }));
468
+ res.end(JSON.stringify({ error: 'internal_error', message: 'Internal server error' }));
467
469
  });
468
470
  });
469
471
  return new Promise((resolve, reject) => {
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,19 +1,12 @@
1
1
  {
2
2
  "name": "@databehave/server",
3
- "version": "0.1.1",
3
+ "version": "0.1.3",
4
4
  "description": "A JSON file config-driven mock server",
5
- "keywords": [
6
- "mock",
7
- "mock-server",
8
- "openapi",
9
- "databehave",
10
- "testing",
11
- "http",
12
- "json",
13
- "jsonc"
14
- ],
15
- "license": "MIT",
5
+ "type": "module",
16
6
  "author": "ochairo",
7
+ "license": "MIT",
8
+ "homepage": "https://github.com/ochairo/databehave/tree/main/packages/server#readme",
9
+ "readme": "README.md",
17
10
  "repository": {
18
11
  "type": "git",
19
12
  "url": "git+https://github.com/ochairo/databehave.git",
@@ -22,8 +15,18 @@
22
15
  "bugs": {
23
16
  "url": "https://github.com/ochairo/databehave/issues"
24
17
  },
25
- "homepage": "https://github.com/ochairo/databehave/tree/main/packages/server#readme",
26
- "type": "module",
18
+ "keywords": [
19
+ "mock-server",
20
+ "api-mock",
21
+ "openapi-mock",
22
+ "http-mock",
23
+ "schema-driven",
24
+ "test-server",
25
+ "json",
26
+ "jsonc",
27
+ "typescript",
28
+ "databehave"
29
+ ],
27
30
  "main": "./dist/index.js",
28
31
  "types": "./dist/index.d.ts",
29
32
  "exports": {
@@ -37,10 +40,9 @@
37
40
  },
38
41
  "files": [
39
42
  "dist",
40
- "docs",
41
43
  "README.md",
42
- "CHANGELOG.md",
43
- "LICENSE"
44
+ "LICENSE",
45
+ "CHANGELOG.md"
44
46
  ],
45
47
  "engines": {
46
48
  "node": ">=18"
@@ -60,7 +62,7 @@
60
62
  "typescript": "^6.0.3",
61
63
  "vite": "^6.4.3",
62
64
  "vitest": "^3.2.6",
63
- "@databehave/schema": "0.1.1"
65
+ "@databehave/schema": "0.1.3"
64
66
  },
65
67
  "publishConfig": {
66
68
  "access": "public",
@@ -69,12 +71,12 @@
69
71
  "scripts": {
70
72
  "build:admin": "vite build --config vite.admin.config.ts && mv dist/admin/ui-shell.html dist/admin/ui.html",
71
73
  "build": "pnpm run build:admin && tsc -p tsconfig.build.json && chmod +x dist/bin.js",
72
- "clean": "rm -rf dist coverage dist-test",
73
- "bench": "vitest bench --run",
74
- "pretypecheck": "pnpm --filter @databehave/schema build",
75
74
  "typecheck": "tsc -p tsconfig.json --noEmit && tsc -p tsconfig.build.json --noEmit && tsc -p tsconfig.ui.json --noEmit",
76
75
  "test": "vitest run --coverage",
77
76
  "test:watch": "vitest",
78
- "test:no-coverage": "vitest run"
77
+ "test:no-coverage": "vitest run",
78
+ "bench": "vitest bench --run",
79
+ "clean": "rm -rf dist coverage dist-test",
80
+ "pretypecheck": "pnpm --filter @databehave/schema build"
79
81
  }
80
82
  }
@@ -1,14 +0,0 @@
1
- # `ErrorMode` reference
2
-
3
- | Kind | Minimal body | Description |
4
- | - | - | - |
5
- | `http-status` | `{"kind":"http-status","status":500}` | Force the response status. Body from OAS schema if any. |
6
- | `business-failure` | `{"kind":"business-failure","message":"…","extra":{ }}` | 2xx envelope `{success:false, message, …extra}`. |
7
- | `custom-body` | `{"kind":"custom-body","body":{…},"status":200,"contentType":"application/json"}` | Arbitrary body / status / content-type.` |
8
- | `empty-body` | `{"kind":"empty-body","status":204}` | Empty response body. |
9
- | `malformed-json` | `{"kind":"malformed-json","status":200}` | Body is literally `{` — clients see `JSON.parse` failure. |
10
- | `delay` | `{"kind":"delay","ms":2000,"then":{"kind":"http-status","status":500}}` | Sleep `ms`, then run `then` (or passthrough if omitted). |
11
- | `hang` | `{"kind":"hang"}` | Never resolve — exercises client timeout / hang detection. |
12
- | `destroy` | `{"kind":"destroy"}` | Drop the socket. Gated by `allowDestroy: true`. |
13
-
14
- `delay.then` cannot itself be `delay`, `hang`, or `destroy`.
@@ -1,63 +0,0 @@
1
- # `x-mock-*` header reference
2
-
3
- Per-request overrides. A header beats every sticky override and is
4
- discarded after the request. Conflicting terminal headers, an invalid
5
- base64 payload, or invalid JSON return **HTTP 400** with
6
- `{error: "invalid …: <reason>"}` so the typo is loud.
7
-
8
- | Header | ErrorMode kind | Example value |
9
- | ------------------------------------------------ | ---------------------- | -------------------------------------- |
10
- | `x-mock-status` | `http-status` | `500` |
11
- | `x-mock-business-failure` | `business-failure` | `update conflict` |
12
- | `x-mock-business-failure-b64` | `business-failure` | `5pON5L2c44GM…` (base64 of UTF-8) |
13
- | `x-mock-business-failure-extra` | merged into `extra` | base64-of-JSON object |
14
- | `x-mock-body` (+ `-status`, `-content-type`) | `custom-body` | base64 JSON |
15
- | `x-mock-empty` (+ `-status`) | `empty-body` | `1` |
16
- | `x-mock-malformed` (+ `-status`) | `malformed-json` | `1` |
17
- | `x-mock-delay` | `delay` (wraps others) | `2000` |
18
- | `x-mock-hang` | `hang` | `1` |
19
- | `x-mock-destroy` | `destroy` | `1` (rejected with 503 if `allowDestroy:false`) |
20
-
21
- Base64 is standard (not URL-safe). Non-ASCII messages must use the
22
- `-b64` variant — HTTP headers reject byte values > 255.
23
-
24
- ```sh
25
- # unicode business-failure
26
- MSG_B64=$(printf 'cannot copy: record was modified during operation — café' | base64)
27
- curl -sS -X POST http://127.0.0.1:8000/api/v1/widgets/copy \
28
- -H "x-mock-business-failure-b64: $MSG_B64" \
29
- -H 'content-type: application/json' -d '{}'
30
- ```
31
-
32
- ## `x-mock-injected` response header
33
-
34
- Whenever the admin inject hook overrides a response — whether from
35
- an `x-mock-*` request header or a sticky override — the response is
36
- tagged with `x-mock-injected: <kind>:<source>`:
37
-
38
- | `kind` | Where it came from |
39
- | ------ | --- |
40
- | `http-status`, `business-failure`, `custom-body`, `empty-body`, `malformed-json`, `delay`, `hang`, `destroy` | The ErrorMode that fired. |
41
- | `header-error` | Header parsing failed; the request was rejected with 400. |
42
-
43
- | `source` | Meaning |
44
- | -------- | --- |
45
- | `header` | The override came from an `x-mock-*` request header. |
46
- | `sticky` | The override came from a `POST /overrides` sticky entry. |
47
-
48
- Examples:
49
-
50
- ```text
51
- x-mock-injected: http-status:header
52
- x-mock-injected: business-failure:sticky
53
- x-mock-injected: header-error
54
- ```
55
-
56
- This is the single observability signal that proves an override
57
- fired — without it, a 500 from the mock server is indistinguishable
58
- from a 500 the real handler would have produced. Tests assert on
59
- this header to verify a mock pathway, and dashboards filter by it
60
- to separate injected failures from organic ones.
61
-
62
- `header-error` carries no `:source` suffix because the rejection
63
- happens before the override taxonomy applies.
@@ -1,111 +0,0 @@
1
- # Admin mode
2
-
3
- Opt-in error-injection panel + REST API + per-request `x-mock-*` headers,
4
- mounted under a configurable base path (default `/databehave`). All routes,
5
- headers, and behaviours below are served **only** when
6
- `admin.enabled: true`. With the flag off, the kit behaves exactly as
7
- the pre-`admin` versions did — no admin routes, no header parsing, no
8
- overrides store.
9
-
10
- For the `admin` config schema (`enabled`, `path`, `bind`, `cors`,
11
- `allowDestroy`, `scenariosDir`) see
12
- [../config/admin.md](../config/admin.md).
13
-
14
- ## Sub-pages
15
-
16
- - [rest-api.md](./rest-api.md) — every `__databehave/*` endpoint.
17
- - [headers.md](./headers.md) — every `x-mock-*` request header.
18
- - [overrides.md](./overrides.md) — sticky overrides, matchers, resolution priority.
19
- - [scenarios.md](./scenarios.md) — scenario file format and lifecycle.
20
- - [error-mode.md](./error-mode.md) — `ErrorMode` reference.
21
-
22
- ## Quick start
23
-
24
- ```jsonc
25
- // databehave.jsonc
26
- {
27
- "openapi": "./openapi.json",
28
- "basePath": "/api/v1",
29
- "endpoints": { /* ... */ },
30
- "admin": { "enabled": true }
31
- }
32
- ```
33
-
34
- ```sh
35
- npx @databehave/server databehave.jsonc
36
- # stdout: [@databehave/server] admin panel ready at http://127.0.0.1:8000/databehave (dev mock — disable in production)
37
- ```
38
-
39
- Point a browser at `http://127.0.0.1:8000/databehave`.
40
-
41
- Programmatic equivalent:
42
-
43
- ```ts
44
- import { createServer } from '@databehave/server'
45
-
46
- const server = createServer({
47
- routes: { 'GET /api/v1/ping': () => ({ json: { ok: true } }) },
48
- admin: { enabled: true },
49
- })
50
- await server.listen({ port: 8000, host: '127.0.0.1' })
51
- ```
52
-
53
- ## UI overview
54
-
55
- The UI is shipped as `dist/admin/{ui.html, ui.js, ui.css}` and rendered
56
- with native Web Components — zero runtime framework, no CDN dependency.
57
- English-only.
58
-
59
- - **Endpoint list** — populated from `GET {path}/openapi-routes`, grouped by
60
- OpenAPI tag, filterable. Each row opens an inject panel that pre-fills
61
- from any existing sticky override targeting the same route.
62
- - **Global override modal** — top-bar button. Owns `kind: 'global'`
63
- overrides (the per-endpoint inject panel only offers `exact` and `path`
64
- scopes).
65
- - **Active overrides side panel** — right side. Global rows are tagged
66
- `GLOBAL` and float above `path` / `exact` rows. A floating bottom-right
67
- pill shows the active count.
68
- - **Try-it-out** — runs the live request through the dispatcher so the
69
- injected override actually applies. The response viewer renders the
70
- body as a collapsible **schema tree** for JSON responses (each
71
- property is a fold-able row) and falls back to a raw text panel for
72
- non-JSON bodies.
73
- - **Scenarios menu** — list, save (snapshot of the current overrides),
74
- load, and delete named scenarios from disk.
75
- - **Toasts** — successful saves, deletes, and override-create actions
76
- fire a top-right toast (`success` / `error` / `info` variants);
77
- failures show the REST [error envelope](./rest-api.md#error-envelope)
78
- detail verbatim.
79
- - **Keyboard** — `/` and `Cmd/Ctrl+K` focus the route filter, `Esc`
80
- closes modals, `?` shows the help overlay.
81
-
82
- ### Non-default `admin.path`
83
-
84
- The UI is path-agnostic. When `admin.path` is set to anything
85
- other than the default `/databehave`, the boot-time HTML injects a
86
- `window.__DATABEHAVE_BASE__ = '<path>'` shim before `ui.js` runs.
87
- The UI reads that constant for every REST call so the panel works
88
- unchanged behind a reverse proxy or a custom mount point.
89
-
90
- If you load the panel through a build of your own (rare), set
91
- `window.__DATABEHAVE_BASE__` yourself before importing
92
- `ui.js` — the script falls back to `/databehave` only when the
93
- constant is absent.
94
-
95
- ## Security notes
96
-
97
- `admin` is a developer tool — not a hardened endpoint. Do not expose
98
- the admin panel to untrusted networks.
99
-
100
- - **Startup notice.** Every enabled boot writes
101
- `admin panel ready at http://…/databehave (dev mock — disable in production)` to stdout. Misconfiguration is visible.
102
- - **`bind: 'loopback-only'` (default).** The CLI exits 1 (and
103
- `server.listen()` rejects) when the configured host is not a loopback
104
- address. Set `bind: 'any'` to opt out — only in trusted environments.
105
- - **`cors: 'auto'` (default).** Returns `Access-Control-Allow-Origin: *`
106
- on loopback (so a localhost bookmarklet works) and switches to
107
- `same-origin` (no CORS headers added) when `bind: 'any'`. Override with
108
- `'any'`, `'same-origin'`, or `{ origin }`.
109
- - **`allowDestroy: true` (default).** Honours `x-mock-destroy` and the
110
- matching `destroy` ErrorMode. Set `false` to reject those requests with
111
- HTTP 503 instead.