msw-dynamic-http-middleware
Version:
Set API handlers for your mock server on runtime
44 lines (37 loc) • 7.47 kB
HTML
<html lang="en">
<head>
<meta charset="UTF-8" />
<link rel="icon" type="image/svg+xml" href="/assets/favicon.17e50649.svg" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>MSW UI</title>
<script type="module">
//assets/index.858ab40e.js
const e=async()=>{const t=(await fetch("/scenario").then((e=>e.json()))).scenarios,n=Object.entries(t).filter((([e,t])=>!Array.isArray(t))).reduce(((e,t)=>{const[n,r]=t,a=r.header,[c,i]=a.split(" ");return a in e||(e[a]={method:c,path:i,scenarios:[]}),e[a].scenarios.push({active:r.isActive,label:n}),e}),{}),r=Object.entries(t).filter((([e,t])=>Array.isArray(t))),a=(t,n)=>{const r=document.createElement("button");return n&&(r.className="active"),r.innerText=t,r.addEventListener("click",(async()=>{await fetch("/scenario",{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({scenario:t})}),e()})),r},c=document.querySelector("#global-scenarios");c.innerHTML="",r.forEach((([e])=>{const t=a(e);c.appendChild(t)}));const i=e=>{var t=document.createElement("td");return t.innerHTML=e,t},s=document.querySelector("#scenarios-per-handler");s.innerHTML="",Object.values(n).forEach((e=>{var t=document.createElement("tr");const{method:n,path:r,scenarios:c}=e;t.appendChild(i(n)),t.appendChild(i(r));const o=document.createElement("td");c.forEach((e=>{o.appendChild(a(e.label,e.active))})),t.appendChild(o),s.appendChild(t)}))};e();
</script>
<!-- assets/index.98b4630d.css --><style type="text/css">
/*! tailwindcss v2.2.7 | MIT License | https://tailwindcss.com *//*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */*,::after,::before{box-sizing:border-box}html{-moz-tab-size:4;-o-tab-size:4;tab-size:4}html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}body{font-family:system-ui,-apple-system,'Segoe UI',Roboto,Helvetica,Arial,sans-serif,'Apple Color Emoji','Segoe UI Emoji'}hr{height:0;color:inherit}abbr[title]{-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Consolas,'Liberation Mono',Menlo,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,select{text-transform:none}[type=button],button{-webkit-appearance:button}legend{padding:0}progress{vertical-align:baseline}summary{display:list-item}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}fieldset{margin:0;padding:0}ol,ul{list-style:none;margin:0;padding:0}html{font-family:ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",Roboto,"Helvetica Neue",Arial,"Noto Sans",sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";line-height:1.5}body{font-family:inherit;line-height:inherit}*,::after,::before{box-sizing:border-box;border-width:0;border-style:solid;border-color:currentColor}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input:-ms-input-placeholder,textarea:-ms-input-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}*,::after,::before{--tw-border-opacity:1;border-color:rgba(229,231,235,var(--tw-border-opacity))}#app{padding:1rem}h1{font-size:2.25rem;line-height:2.5rem;font-weight:700}h2{margin-top:2rem;margin-bottom:1rem;font-size:1.25rem;line-height:1.75rem;font-weight:500}button{margin-right:.5rem;border-radius:.25rem;--tw-bg-opacity:1;background-color:rgba(209,213,219,var(--tw-bg-opacity))}button:hover{--tw-bg-opacity:1;background-color:rgba(156,163,175,var(--tw-bg-opacity))}button{padding-left:.75rem;padding-right:.75rem;padding-top:.25rem;padding-bottom:.25rem;--tw-text-opacity:1;color:rgba(31,41,55,var(--tw-text-opacity))}button.active{--tw-bg-opacity:1;background-color:rgba(29,78,216,var(--tw-bg-opacity))}button.active:hover{--tw-bg-opacity:1;background-color:rgba(37,99,235,var(--tw-bg-opacity))}button.active{--tw-text-opacity:1;color:rgba(255,255,255,var(--tw-text-opacity))}table tr th{font-weight:500;--tw-text-opacity:1;color:rgba(75,85,99,var(--tw-text-opacity))}table tr td,table tr th{padding-left:1rem;padding-right:1rem;padding-top:.5rem;padding-bottom:.5rem;text-align:left}table tr td:first-child,table tr th:first-child{padding-left:0}.table{display:table}.contents{display:contents}@-webkit-keyframes spin{to{transform:rotate(360deg)}}@keyframes spin{to{transform:rotate(360deg)}}@-webkit-keyframes ping{100%,75%{transform:scale(2);opacity:0}}@keyframes ping{100%,75%{transform:scale(2);opacity:0}}@-webkit-keyframes pulse{50%{opacity:.5}}@keyframes pulse{50%{opacity:.5}}@-webkit-keyframes bounce{0%,100%{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(0.8,0,1,1);animation-timing-function:cubic-bezier(0.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,0.2,1);animation-timing-function:cubic-bezier(0,0,0.2,1)}}@keyframes bounce{0%,100%{transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(0.8,0,1,1);animation-timing-function:cubic-bezier(0.8,0,1,1)}50%{transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,0.2,1);animation-timing-function:cubic-bezier(0,0,0.2,1)}}.text-center{text-align:center}*,::after,::before{--tw-shadow:0 0 #0000}*,::after,::before{--tw-ring-inset:var(--tw-empty, );/*!*//*!*/--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-color:rgba(59, 130, 246, 0.5);--tw-ring-offset-shadow:0 0 #0000;--tw-ring-shadow:0 0 #0000}.filter{--tw-blur:var(--tw-empty, );/*!*//*!*/--tw-brightness:var(--tw-empty, );/*!*//*!*/--tw-contrast:var(--tw-empty, );/*!*//*!*/--tw-grayscale:var(--tw-empty, );/*!*//*!*/--tw-hue-rotate:var(--tw-empty, );/*!*//*!*/--tw-invert:var(--tw-empty, );/*!*//*!*/--tw-saturate:var(--tw-empty, );/*!*//*!*/--tw-sepia:var(--tw-empty, );/*!*//*!*/--tw-drop-shadow:var(--tw-empty, );/*!*//*!*/filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}
</style>
</head>
<body>
<div id="app">
<div class="text-center">
<h1>MSW UI</h1>
</div>
<h2>Set global scenario</h2>
<div id="global-scenarios"></div>
<h2>Set scenario per endpoint</h2>
<table>
<thead>
<tr>
<th>Method</th>
<th>Path</th>
<th>Scenario</th>
</tr>
</thead>
<tbody id="scenarios-per-handler"></tbody>
</table>
</div>
<!-- ASSET NOT INLINED: assets/favicon.17e50649.svg -->
</body>
</html>