@specbook/ui 0.4.0 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,15 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./Host-ClcN3YPO.js","./panel-nV09I7Wr.js","./panel-l1xvY4kI.css","./mount-D3holu10.js"])))=>i.map(i=>d[i]);
2
+ import{a as e,c as t,d as n,h as r,l as i,m as a,n as o,o as s,p as c,r as l,s as u,u as d,v as f,y as p}from"./panel-nV09I7Wr.js";import{a as m,n as h}from"./mount-D3holu10.js";var g=Object.defineProperty,_=(e,t)=>{let n={};for(var r in e)g(n,r,{get:e[r],enumerable:!0});return t||g(n,Symbol.toStringTag,{value:`Module`}),n},v=Object.prototype.hasOwnProperty;function y(e,t,n){for(n of e.keys())if(b(n,t))return n}function b(e,t){var n,r,i;if(e===t)return!0;if(e&&t&&(n=e.constructor)===t.constructor){if(n===Date)return e.getTime()===t.getTime();if(n===RegExp)return e.toString()===t.toString();if(n===Array){if((r=e.length)===t.length)for(;r--&&b(e[r],t[r]););return r===-1}if(n===Set){if(e.size!==t.size)return!1;for(r of e)if(i=r,i&&typeof i==`object`&&(i=y(t,i),!i)||!t.has(i))return!1;return!0}if(n===Map){if(e.size!==t.size)return!1;for(r of e)if(i=r[0],i&&typeof i==`object`&&(i=y(t,i),!i)||!b(r[1],t.get(i)))return!1;return!0}if(n===ArrayBuffer)e=new Uint8Array(e),t=new Uint8Array(t);else if(n===DataView){if((r=e.byteLength)===t.byteLength)for(;r--&&e.getInt8(r)===t.getInt8(r););return r===-1}if(ArrayBuffer.isView(e)){if((r=e.byteLength)===t.byteLength)for(;r--&&e[r]===t[r];);return r===-1}if(!n||typeof e==`object`){for(n in r=0,e)if(v.call(e,n)&&++r&&!v.call(t,n)||!(n in t)||!b(e[n],t[n]))return!1;return Object.keys(t).length===r}}return e!==e&&t!==t}var x,S,C,w,T=!0;typeof process<`u`&&({FORCE_COLOR:x,NODE_DISABLE_COLORS:S,NO_COLOR:C,TERM:w}={},T=process.stdout&&process.stdout.isTTY);var E={enabled:!S&&C==null&&w!==`dumb`&&(x!=null&&x!==`0`||T),reset:k(0,0),bold:k(1,22),dim:k(2,22),italic:k(3,23),underline:k(4,24),inverse:k(7,27),hidden:k(8,28),strikethrough:k(9,29),black:k(30,39),red:k(31,39),green:k(32,39),yellow:k(33,39),blue:k(34,39),magenta:k(35,39),cyan:k(36,39),white:k(37,39),gray:k(90,39),grey:k(90,39),bgBlack:k(40,49),bgRed:k(41,49),bgGreen:k(42,49),bgYellow:k(43,49),bgBlue:k(44,49),bgMagenta:k(45,49),bgCyan:k(46,49),bgWhite:k(47,49)};function D(e,t){let n=0,r,i=``,a=``;for(;n<e.length;n++)r=e[n],i+=r.open,a+=r.close,~t.indexOf(r.close)&&(t=t.replace(r.rgx,r.close+r.open));return i+t+a}function O(e,t){let n={has:e,keys:t};return n.reset=E.reset.bind(n),n.bold=E.bold.bind(n),n.dim=E.dim.bind(n),n.italic=E.italic.bind(n),n.underline=E.underline.bind(n),n.inverse=E.inverse.bind(n),n.hidden=E.hidden.bind(n),n.strikethrough=E.strikethrough.bind(n),n.black=E.black.bind(n),n.red=E.red.bind(n),n.green=E.green.bind(n),n.yellow=E.yellow.bind(n),n.blue=E.blue.bind(n),n.magenta=E.magenta.bind(n),n.cyan=E.cyan.bind(n),n.white=E.white.bind(n),n.gray=E.gray.bind(n),n.grey=E.grey.bind(n),n.bgBlack=E.bgBlack.bind(n),n.bgRed=E.bgRed.bind(n),n.bgGreen=E.bgGreen.bind(n),n.bgYellow=E.bgYellow.bind(n),n.bgBlue=E.bgBlue.bind(n),n.bgMagenta=E.bgMagenta.bind(n),n.bgCyan=E.bgCyan.bind(n),n.bgWhite=E.bgWhite.bind(n),n}function k(e,t){let n={open:`\x1b[${e}m`,close:`\x1b[${t}m`,rgx:RegExp(`\\x1b\\[${t}m`,`g`)};return function(t){return this!==void 0&&this.has!==void 0?(~this.has.indexOf(e)||(this.has.push(e),this.keys.push(n)),t===void 0?this:E.enabled?D(this.keys,t+``):t+``):t===void 0?O([e],[n]):E.enabled?D([n],t+``):t+``}}function A(){}A.prototype={diff:function(e,t){var n=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},r=n.callback;typeof n==`function`&&(r=n,n={}),this.options=n;var i=this;function a(e){return r?(setTimeout(function(){r(void 0,e)},0),!0):e}e=this.castInput(e),t=this.castInput(t),e=this.removeEmpty(this.tokenize(e)),t=this.removeEmpty(this.tokenize(t));var o=t.length,s=e.length,c=1,l=o+s;n.maxEditLength&&(l=Math.min(l,n.maxEditLength));var u=n.timeout??1/0,d=Date.now()+u,f=[{oldPos:-1,lastComponent:void 0}],p=this.extractCommon(f[0],t,e,0);if(f[0].oldPos+1>=s&&p+1>=o)return a([{value:this.join(t),count:t.length}]);var m=-1/0,h=1/0;function g(){for(var n=Math.max(m,-c);n<=Math.min(h,c);n+=2){var r=void 0,l=f[n-1],u=f[n+1];l&&(f[n-1]=void 0);var d=!1;if(u){var g=u.oldPos-n;d=u&&0<=g&&g<o}var _=l&&l.oldPos+1<s;if(!d&&!_)f[n]=void 0;else{if(r=!_||d&&l.oldPos+1<u.oldPos?i.addToPath(u,!0,void 0,0):i.addToPath(l,void 0,!0,1),p=i.extractCommon(r,t,e,n),r.oldPos+1>=s&&p+1>=o)return a(ee(i,r.lastComponent,t,e,i.useLongestToken));f[n]=r,r.oldPos+1>=s&&(h=Math.min(h,n-1)),p+1>=o&&(m=Math.max(m,n+1))}}c++}if(r)(function e(){setTimeout(function(){if(c>l||Date.now()>d)return r();g()||e()},0)})();else for(;c<=l&&Date.now()<=d;){var _=g();if(_)return _}},addToPath:function(e,t,n,r){var i=e.lastComponent;return i&&i.added===t&&i.removed===n?{oldPos:e.oldPos+r,lastComponent:{count:i.count+1,added:t,removed:n,previousComponent:i.previousComponent}}:{oldPos:e.oldPos+r,lastComponent:{count:1,added:t,removed:n,previousComponent:i}}},extractCommon:function(e,t,n,r){for(var i=t.length,a=n.length,o=e.oldPos,s=o-r,c=0;s+1<i&&o+1<a&&this.equals(t[s+1],n[o+1]);)s++,o++,c++;return c&&(e.lastComponent={count:c,previousComponent:e.lastComponent}),e.oldPos=o,s},equals:function(e,t){return this.options.comparator?this.options.comparator(e,t):e===t||this.options.ignoreCase&&e.toLowerCase()===t.toLowerCase()},removeEmpty:function(e){for(var t=[],n=0;n<e.length;n++)e[n]&&t.push(e[n]);return t},castInput:function(e){return e},tokenize:function(e){return e.split(``)},join:function(e){return e.join(``)}};function ee(e,t,n,r,i){for(var a=[],o;t;)a.push(t),o=t.previousComponent,delete t.previousComponent,t=o;a.reverse();for(var s=0,c=a.length,l=0,u=0;s<c;s++){var d=a[s];if(!d.removed){if(!d.added&&i){var f=n.slice(l,l+d.count);f=f.map(function(e,t){var n=r[u+t];return n.length>e.length?n:e}),d.value=e.join(f)}else d.value=e.join(n.slice(l,l+d.count));l+=d.count,d.added||(u+=d.count)}else if(d.value=e.join(r.slice(u,u+d.count)),u+=d.count,s&&a[s-1].added){var p=a[s-1];a[s-1]=a[s],a[s]=p}}var m=a[c-1];return c>1&&typeof m.value==`string`&&(m.added||m.removed)&&e.equals(``,m.value)&&(a[c-2].value+=m.value,a.pop()),a}var te=new A;function ne(e,t,n){return te.diff(e,t,n)}var re=/^[A-Za-z\xC0-\u02C6\u02C8-\u02D7\u02DE-\u02FF\u1E00-\u1EFF]+$/,ie=/\S/,ae=new A;ae.equals=function(e,t){return this.options.ignoreCase&&(e=e.toLowerCase(),t=t.toLowerCase()),e===t||this.options.ignoreWhitespace&&!ie.test(e)&&!ie.test(t)},ae.tokenize=function(e){for(var t=e.split(/([^\S\r\n]+|[()[\]{}'"\r\n]|\b)/),n=0;n<t.length-1;n++)!t[n+1]&&t[n+2]&&re.test(t[n])&&re.test(t[n+2])&&(t[n]+=t[n+2],t.splice(n+1,2),n--);return t};var oe=new A;oe.tokenize=function(e){this.options.stripTrailingCr&&(e=e.replace(/\r\n/g,`
3
+ `));var t=[],n=e.split(/(\n|\r\n)/);n[n.length-1]||n.pop();for(var r=0;r<n.length;r++){var i=n[r];r%2&&!this.options.newlineIsToken?t[t.length-1]+=i:(this.options.ignoreWhitespace&&(i=i.trim()),t.push(i))}return t};function se(e,t,n){return oe.diff(e,t,n)}var ce=new A;ce.tokenize=function(e){return e.split(/(\S.+?[.!?])(?=\s+|$)/)};var le=new A;le.tokenize=function(e){return e.split(/([{}:;,]|\s+)/)};function ue(e){"@babel/helpers - typeof";return ue=typeof Symbol==`function`&&typeof Symbol.iterator==`symbol`?function(e){return typeof e}:function(e){return e&&typeof Symbol==`function`&&e.constructor===Symbol&&e!==Symbol.prototype?`symbol`:typeof e},ue(e)}var de=Object.prototype.toString,fe=new A;fe.useLongestToken=!0,fe.tokenize=oe.tokenize,fe.castInput=function(e){var t=this.options,n=t.undefinedReplacement,r=t.stringifyReplacer,i=r===void 0?function(e,t){return t===void 0?n:t}:r;return typeof e==`string`?e:JSON.stringify(pe(e,null,null,i),i,` `)},fe.equals=function(e,t){return A.prototype.equals.call(fe,e.replace(/,([\r\n])/g,`$1`),t.replace(/,([\r\n])/g,`$1`))};function pe(e,t,n,r,i){t||=[],n||=[],r&&(e=r(i,e));for(var a=0;a<t.length;a+=1)if(t[a]===e)return n[a];var o;if(de.call(e)===`[object Array]`){for(t.push(e),o=Array(e.length),n.push(o),a=0;a<e.length;a+=1)o[a]=pe(e[a],t,n,r,i);return t.pop(),n.pop(),o}if(e&&e.toJSON&&(e=e.toJSON()),ue(e)===`object`&&e!==null){t.push(e),o={},n.push(o);var s=[],c;for(c in e)e.hasOwnProperty(c)&&s.push(c);for(s.sort(),a=0;a<s.length;a+=1)c=s[a],o[c]=pe(e[c],t,n,r,c);t.pop(),n.pop()}else o=e;return o}var me=new A;me.tokenize=function(e){return e.slice()},me.join=me.removeEmpty=function(e){return e};function he(e,t,n){return me.diff(e,t,n)}var ge={"--":E.red,"··":E.grey,"++":E.green},_e=E.dim().italic,ve=E.dim(`→`),ye=E.dim(`·`),be=E.dim(`↵`),xe=(e,t)=>ge[e](e+Ce(t))+`
4
+ `,Se=(e,t)=>E.dim(`L`+String(e).padStart(t,`0`)+` `),Ce=e=>e.replace(/[ ]/g,ye).replace(/\t/g,ve).replace(/(\r?\n)/g,be);function we(e,t,n){let r=e.removed?`--`:e.added?`++`:`··`,i=e.value.replace(/\r?\n$/,``).split(`
5
+ `),a=0,o,s=``;for(e.added?s+=ge[r]().underline(_e(`Expected:`))+`
6
+ `:e.removed&&(s+=ge[r]().underline(_e(`Actual:`))+`
7
+ `);a<i.length;a++)o=i[a],o!=null&&(t&&(s+=Se(t+a,n)),s+=xe(r,o||`
8
+ `));return s}function Te(e,t){let n=he(e,t),r=0,i=0,a=0,o,s,c,l,u,d=xe(`··`,`[`);for(;r<n.length;r++)for(c=(o=n[r]).removed?`--`:o.added?`++`:`··`,o.added?d+=ge[c]().underline(_e(`Expected:`))+`
9
+ `:o.removed&&(d+=ge[c]().underline(_e(`Actual:`))+`
10
+ `),i=0;i<o.value.length;i++)for(l=o.value[i]&&typeof o.value[i]==`object`,s=je(o.value[i]).split(/\r?\n/g),a=0;a<s.length;)u=` `+s[a++]+(l?``:`,`),l&&a===s.length&&i+1<o.value.length&&(u+=`,`),d+=xe(c,u);return d+xe(`··`,`]`)}function Ee(e,t,n=0){let r=0,i,a=``,o=se(e,t),s=String(t.split(/\r?\n/g).length-n).length;for(;r<o.length;r++)a+=we(i=o[r],n,s),n&&!i.removed&&(n+=i.count);return a}function De(e,t){let n=ne(e,t),r=0,i=``,a,o=e.length,s=t.length,c=Ce(e),l=Ce(t);if(a=n[r],o!==s&&a.removed&&n[r+1]){let i=a.count-n[r+1].count;i==0||(i>0?(t=` `.repeat(i)+t,l=` `.repeat(i)+l,s+=i):i<0&&(e=` `.repeat(-i)+e,c=` `.repeat(-i)+c,o+=-i))}if(i+=Oe(c,l,o,s),o===s)for(a=` `;r<o;r++)a+=e[r]===t[r]?` `:`^`;else for(a=` `;r<n.length;r++)a+=(n[r].added||n[r].removed?`^`:` `).repeat(Math.max(n[r].count,0)),r+1<n.length&&(n[r].added&&n[r+1].removed||n[r].removed&&n[r+1].added)&&(n[r+1].count-=n[r].count);return i+E.red(a)}function Oe(e,t,n=String(e).length,r=String(t).length){let i=4,a=Math.max(n,r),o=typeof e,s=typeof t;if(o!==s){i=2;let c=i+a-n,l=i+a-r;e+=` `.repeat(c)+E.dim(`[${o}]`),t+=` `.repeat(l)+E.dim(`[${s}]`),n+=c+o.length+2,r+=l+s.length+2,a=Math.max(n,r)}return ge[`++`](`++`+t+` `.repeat(i+a-r)+_e(`(Expected)`))+`
11
+ `+ge[`--`](`--`+e+` `.repeat(i+a-n)+_e(`(Actual)`))+`
12
+ `}function ke(e,t){var n,r=0,i,a=Array.isArray(e),o=[],s=a?Array(e.length):{};if(a)for(r=0;r<s.length;r++)i=e[r],!i||typeof i!=`object`?s[r]=i:s[r]=ke(i,t[r]);else{for(n in t)o.push(n);for(;r<o.length;r++)Object.prototype.hasOwnProperty.call(e,n=o[r])&&(!(i=e[n])||typeof i!=`object`?s[n]=i:s[n]=ke(i,t[n]));for(n in e)s.hasOwnProperty(n)||(s[n]=e[n])}return s}function Ae(){var e=new Set;return function(t,n){return n===void 0?`[__VOID__]`:typeof n==`number`&&n!==n?`[__NAN__]`:typeof n==`bigint`?n.toString():!n||typeof n!=`object`?n:e.has(n)?`[Circular]`:(e.add(n),n)}}function je(e){return JSON.stringify(e,Ae(),2).replace(/"\[__NAN__\]"/g,`NaN`).replace(/"\[__VOID__\]"/g,`undefined`)}function Me(e,t){if(Array.isArray(t)&&Array.isArray(e))return Te(e,t);if(t instanceof RegExp)return De(``+e,``+t);let n=e&&typeof e==`object`,r=t&&typeof t==`object`;return n&&r&&(e=ke(e,t)),r&&(t=je(t)),n&&(e=je(e)),t&&typeof t==`object`&&(e=je(ke(e,t)),t=je(t)),n=typeof e==`string`,r=typeof t==`string`,n&&/\r?\n/.test(e)?Ee(e,``+t):r&&/\r?\n/.test(t)?Ee(``+e,t):n&&r?De(e,t):Oe(e,t)}var Ne=_({Assertion:()=>Pe,equal:()=>Le,fixture:()=>We,instance:()=>Be,is:()=>Ie,match:()=>Ve,not:()=>N,ok:()=>Fe,snapshot:()=>He,throws:()=>Ge,type:()=>ze,unreachable:()=>Re});function j(e){e=e.replace(/\r?\n/g,`
13
+ `);let t=e.match(/^[ \t]*(?=\S)/gm),n=0,r=1/0,i=(t||[]).length;for(;n<i;n++)r=Math.min(r,t[n].length);return i&&r?e.replace(RegExp(`^[ \\t]{${r}}`,`gm`),``):e}var Pe=class extends Error{constructor(e={}){super(e.message),this.name=`Assertion`,this.code=`ERR_ASSERTION`,Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor),this.details=e.details||!1,this.generated=!!e.generated,this.operator=e.operator,this.expects=e.expects,this.actual=e.actual}};function M(e,t,n,r,i,a,o){if(e)return;let s=o||a;throw o instanceof Error?o:new Pe({actual:t,expects:n,operator:r,message:s,details:i&&i(t,n),generated:!o})}function Fe(e,t){M(!!e,!1,!0,`ok`,!1,`Expected value to be truthy`,t)}function Ie(e,t,n){M(e===t,e,t,`is`,Me,`Expected values to be strictly equal:`,n)}function Le(e,t,n){M(b(e,t),e,t,`equal`,Me,`Expected values to be deeply equal:`,n)}function Re(e){M(!1,!0,!1,`unreachable`,!1,`Expected not to be reached!`,e)}function ze(e,t,n){let r=typeof e;M(r===t,r,t,`type`,!1,`Expected "${r}" to be "${t}"`,n)}function Be(e,t,n){let r="`"+(t.name||t.constructor.name)+"`";M(e instanceof t,e,t,`instance`,!1,`Expected value to be an instance of ${r}`,n)}function Ve(e,t,n){typeof t==`string`?M(e.includes(t),e,t,`match`,!1,`Expected value to include "${t}" substring`,n):M(t.test(e),e,t,`match`,!1,`Expected value to match \`${String(t)}\` pattern`,n)}function He(e,t,n){e=j(e),t=j(t),M(e===t,e,t,`snapshot`,Ee,`Expected value to match snapshot:`,n)}var Ue=(e,t)=>Ee(e,t,1);function We(e,t,n){e=j(e),t=j(t),M(e===t,e,t,`fixture`,Ue,`Expected value to match fixture:`,n)}function Ge(e,t,n){!n&&typeof t==`string`&&(n=t,t=null);try{e(),M(!1,!1,!0,`throws`,!1,`Expected function to throw`,n)}catch(e){if(e instanceof Pe)throw e;typeof t==`function`?M(t(e),!1,!0,`throws`,!1,`Expected function to throw matching exception`,n):t instanceof RegExp&&M(t.test(e.message),!1,!0,`throws`,!1,`Expected function to throw exception matching \`${String(t)}\` pattern`,n)}}function N(e,t){M(!e,!0,!1,`not`,!1,`Expected value to be falsey`,t)}N.ok=N,Ie.not=function(e,t,n){M(e!==t,e,t,`is.not`,!1,`Expected values not to be strictly equal`,n)},N.equal=function(e,t,n){M(!b(e,t),e,t,`not.equal`,!1,`Expected values not to be deeply equal`,n)},N.type=function(e,t,n){let r=typeof e;M(r!==t,r,t,`not.type`,!1,`Expected "${r}" not to be "${t}"`,n)},N.instance=function(e,t,n){let r="`"+(t.name||t.constructor.name)+"`";M(!(e instanceof t),e,t,`not.instance`,!1,`Expected value not to be an instance of ${r}`,n)},N.snapshot=function(e,t,n){e=j(e),t=j(t),M(e!==t,e,t,`not.snapshot`,!1,`Expected value not to match snapshot`,n)},N.fixture=function(e,t,n){e=j(e),t=j(t),M(e!==t,e,t,`not.fixture`,!1,`Expected value not to match fixture`,n)},N.match=function(e,t,n){typeof t==`string`?M(!e.includes(t),e,t,`not.match`,!1,`Expected value not to include "${t}" substring`,n):M(!t.test(e),e,t,`not.match`,!1,`Expected value not to match \`${String(t)}\` pattern`,n)},N.throws=function(e,t,n){!n&&typeof t==`string`&&(n=t,t=null);try{e()}catch(e){typeof t==`function`?M(!t(e),!0,!1,`not.throws`,!1,`Expected function not to throw matching exception`,n):t instanceof RegExp?M(!t.test(e.message),!0,!1,`not.throws`,!1,`Expected function not to throw exception matching \`${String(t)}\` pattern`,n):t||M(!1,!0,!1,`not.throws`,!1,`Expected function not to throw`,n)}};var Ke=/\u001b\[[0-9;]*m/g,qe=e=>e.replace(Ke,``),Je=/(?:\(|at )?([^\s()]+):(\d+):(\d+)\)?\s*$/;function Ye(e){if(!e)return;let t=e.split(`
14
+ `).slice(1).map(e=>({line:e,m:Je.exec(e)})),n=t[0]?.m?.[1];for(let{line:e,m:r}of t)if(!(!r||e.includes(`/core/src/assert`)||e.includes(`node_modules`))&&r[1]!==n)return{file:r[1],line:Number(r[2]),column:Number(r[3])}}function Xe(e=`soft`){let t=[],n=(n,r)=>{let i=r.length-1;return(...a)=>{let o=typeof a[i]==`string`?a[i]:void 0;try{r(...a),t.push({label:o??n,operator:n,pass:!0,location:Ye(Error().stack)})}catch(r){if(r?.name!==`Assertion`||(t.push({label:qe(String(r.message??o??n)),operator:n,pass:!1,actual:r.actual,expected:r.expects,diff:r.details?qe(String(r.details)):void 0,location:Ye(Error().stack)}),e===`hard`))throw r}}},r=Ne,i={};for(let e of[`ok`,`is`,`equal`,`type`,`instance`,`match`,`throws`,`unreachable`,`snapshot`,`fixture`])typeof r[e]==`function`&&(i[e]=n(e,r[e]));let a=n(`not`,r.not);for(let e of Object.keys(r.not??{}))typeof r.not[e]==`function`&&(a[e]=n(`not.${e}`,r.not[e]));return i.not=a,{assert:i,results:t}}var Ze=e=>typeof e.opts.default==`function`;function Qe(e){return typeof e==`function`?e():e}var $e=class extends Error{};function et(e,t){let n=e.opts.value;return n?n(t):t}function tt(e,t){return e===t||JSON.stringify(e)===JSON.stringify(t)}function nt(e,t,n){switch(t.kind){case`select`:{let r=t.opts.options;if(r.length===0)throw new $e(`No options available for "${e}"`);let i=r.map(e=>et(t,e));if(n!==void 0){if(!i.some(e=>tt(e,n)))throw new $e(`Value for "${e}" is not one of the available options`);return n}let a=t.opts.default;return typeof a==`number`&&Number.isInteger(a)&&a>=0&&a<i.length&&typeof i[0]!=`number`?i[a]:typeof a==`function`?a(r):a!==void 0&&i.some(e=>tt(e,a))?a:i[0]}case`multiselect`:{let e=t.opts.options;if(n!==void 0)return n;let r=t.opts.default;return typeof r==`function`?r(e):r??[]}case`object`:{let e=t.opts.shape,r=n??{};return Object.fromEntries(Object.entries(e).map(([e,t])=>[e,nt(e,t,r[e])]))}case`array`:{let r=n??t.opts.default??[],{min:i,max:a}=t.opts;if(i!==void 0&&r.length<i)throw new $e(`"${e}" needs at least ${i} items`);if(a!==void 0&&r.length>a)throw new $e(`"${e}" allows at most ${a} items`);return r.map(n=>nt(e,t.opts.item,n))}case`boolean`:return n??Qe(t.opts.default)??!1;case`number`:return n??Qe(t.opts.default)??0;default:return n??Qe(t.opts.default)??``}}function rt(e,t={}){return Object.fromEntries(Object.entries(e).map(([e,n])=>[e,nt(e,n,t[e])]))}function it(e){return Object.fromEntries(Object.entries(e).map(([e,t])=>{if(t.kind===`select`||t.kind===`multiselect`){let n=t.opts.label,r=t.opts.options.map(e=>({label:n?n(e):String(et(t,e)),value:et(t,e)}));return[e,{kind:t.kind,options:r}]}return[e,{kind:t.kind,default:Qe(t.opts.default),generated:Ze(t)}]}))}var at=`__specbookFaker`,ot=globalThis,st=new Proxy({},{get(e,t){let n=ot[at];if(!n)throw Error(`faker is not initialised. Install "@faker-js/faker" in your project; specbook sets it up before each run.`);return n[t]}});function ct(e){ot[at]=e}function lt(e={},t){let n=t??e.default??`en`;return[...new Set([...e.locales?.[n]??[n,`en`],`base`])]}async function ut(e,t={},n){let r=e.locales;if(!r)return e;let i={Faker:e.Faker};return await Promise.all(lt(t,n).map(async e=>{let t=r[e];t&&(i[e]=await t())})),i}function dt(e,t={},n={}){let r=n.locale??t.default??`en`,i=lt(t,r).map(t=>{let n=e[t];if(!n)throw Error(`Unknown faker locale "${t}" (from "${r}")`);return n}),a=new e.Faker({locale:i});return n.seed!==void 0&&a.seed(n.seed),ct(a),a}var ft=String.raw`[\w.$\[\]-]+`,pt=new RegExp(String.raw`^\s*\{\{\s*(${ft})\s*\}\}\s*$`),mt=new RegExp(String.raw`\{\{\s*(${ft})\s*\}\}`,`g`),ht=e=>e.split(/[.[]/,1)[0],gt=[`secrets`,`session`],_t=class extends Error{variable;constructor(e){super(`Missing variable "{{${e}}}"`),this.variable=e,this.name=`TemplateError`}};function vt(e){let t=e.split(`.`)[0];return gt.includes(t)&&e.includes(`.`)}var yt=e=>e.startsWith(`faker.`),bt=class extends _t{message;constructor(e,t){super(e),this.message=t,this.name=`FakerPlaceholderError`}};function xt(e){let[,t,n,...r]=e.split(`.`),i=()=>new bt(e,`Unknown faker generator "{{${e}}}": use faker.<module>.<method>`);if(!t||!n||r.length>0)throw i();let a=st[t],o=typeof a==`object`&&a?a[n]:void 0;if(typeof o!=`function`||n===`constructor`)throw i();return{found:!0,value:o.call(a)}}function St(e){return[...F(e)].some(yt)}var Ct=e=>e.replace(/\[(\d+)\]/g,`.$1`).split(`.`);function wt(e,t){if(yt(t))return xt(t);let n=e;for(let e of Ct(t))if(typeof n==`object`&&n&&Object.hasOwn(n,e))n=n[e];else return{found:!1};return{found:!0,value:n}}function Tt(e){if(!e.includes(`faker`))return;let t=/\{\{\s*(faker\.[\s\S]*?)(?:\}\}|$)/.exec(e.replace(mt,``));if(t){let e=t[1].trim();throw new bt(e,`"{{${e}}}" is not a faker placeholder: placeholders take no arguments. Use faker in a request file for those.`)}}function Et(e,t){Tt(e);let n=pt.exec(e);if(n){let r=n[1];if(vt(r))return e;let i=wt(t,r);if(!i.found)throw new _t(r);return i.value}return e.replace(mt,(e,n)=>{if(vt(n))return e;let r=wt(t,n);if(!r.found)throw new _t(n);let i=r.value;return typeof i==`object`&&i?JSON.stringify(i):String(i)})}function P(e,t){if(typeof e==`string`)return Et(e,t);if(Dt(e))return e;if(Array.isArray(e))return e.map(e=>P(e,t));if(typeof e==`object`&&e){let n={};for(let[r,i]of Object.entries(e))n[r]=P(i,t);return n}return e}function F(e,t=new Set){if(typeof e==`string`)for(let n of e.matchAll(mt))t.add(n[1]);else if(Array.isArray(e))for(let n of e)F(n,t);else if(typeof e==`object`&&e)for(let n of Object.values(e))F(n,t);return t}var Dt=e=>typeof Blob<`u`&&e instanceof Blob;function Ot(e){return typeof e==`object`&&!!e&&!Array.isArray(e)&&!Dt(e)}function I(e,t){if(!Ot(e)||!Ot(t))return t===void 0?e:t;let n={...e};for(let[e,r]of Object.entries(t))n[e]=I(n[e],r);return n}var L=class extends Error{variable;constructor(e,t){super(e),this.variable=t,this.name=`AddressError`}},kt=[`authorizationUrl`,`tokenUrl`,`openIdConnectUrl`,`clientId`];function At(e,t,n={},r={}){return{...e.vars,...e.environments?.[t]?.vars,...n,...r}}function jt(e,t,n){for(let t of F(e))if(vt(t)||yt(t))throw new L(`${n} cannot use {{${t}}}: only environment variables are available`);let r;try{r=Et(e,t)}catch(e){throw e instanceof _t?new L(`${n}: set ${e.variable}`,e.variable):e}if(typeof r==`object`&&r)throw new L(`${n} is not a text value`);let i=r==null?``:String(r).trim();if(/\{\{/.test(i))throw new L(`${n} still contains a placeholder: ${i}`);return i}function Mt(e,t,n,r){let i=e.services[t]?.baseUrl,a=typeof i==`string`?i:i?.[n];if(!a)return;let o=`No base URL for ${t} in ${n}`,s=/\{\{/.test(a)?jt(a,r,o):a.trim();return s?s.replace(/\/+$/,``):void 0}function Nt(e,t,n=`sign-in`){let r={...e};for(let e of kt){let i=r[e];if(typeof i!=`string`||!/\{\{/.test(i))continue;let a=jt(i,t,`${n} ${e}`);a?r[e]=a:delete r[e]}return r}function Pt(e,t=[],n=[]){let r=new Set([`mock`]),i=Object.values(e.services??{});i.some(e=>typeof e.baseUrl==`string`)&&r.add(`live`);for(let e of i)if(e.baseUrl&&typeof e.baseUrl==`object`)for(let t of Object.keys(e.baseUrl))r.add(t);for(let t of Object.keys(e.environments??{}))r.add(t);for(let e of t)r.add(e);for(let e of n)r.add(e);return[...r]}function Ft(e){let t={},n=e=>{if(!(vt(e)||yt(e)))return t[e]??={services:[],profiles:[]},t[e]};for(let[t,r]of Object.entries(e.services??{})){let e=typeof r.baseUrl==`string`?[r.baseUrl]:Object.values(r.baseUrl??{});for(let r of e)for(let e of F(r)){let r=n(e);r&&!r.services.includes(t)&&r.services.push(t)}}for(let[t,r]of Object.entries(e.auth??{}))for(let e of kt){let i=r.oauth?.[e];if(typeof i==`string`)for(let r of F(i))n(r)?.profiles.push({profile:t,field:e})}return t}var It={comma:`,`,space:` `,pipe:`|`},Lt=e=>typeof Blob<`u`&&e instanceof Blob;function Rt(e,t=`indices`,n=``,r=[]){if(typeof t==`string`||n||typeof e!=`object`||!e)zt(n,e,r,typeof t==`string`?t:`indices`);else for(let[n,i]of Object.entries(e))zt(n,i,r,t[n]??`indices`);return r}function zt(e,t,n,r){if(t!=null){if(Array.isArray(t)&&r in It&&t.every(e=>typeof e!=`object`||!e))n.push([e,t.map(String).join(It[r])]);else if(Array.isArray(t))t.forEach((t,i)=>{zt(r===`indices`||r in It?`${e}[${i}]`:r===`brackets`?`${e}[]`:e,t,n,r)});else if(typeof t==`object`)for(let[i,a]of Object.entries(t))zt(e?`${e}[${i}]`:i,a,n,r);else n.push([e,String(t)])}}function Bt(e,t=`indices`){return Rt(e,t).map(([e,t])=>`${encodeURIComponent(e)}=${encodeURIComponent(t)}`).join(`&`)}function Vt(e){let t=new FormData,n=(e,n)=>{n!=null&&(Lt(n)?t.append(e,n,n.name??`file`):typeof n==`object`?t.append(e,new Blob([JSON.stringify(n)],{type:`application/json`})):t.append(e,String(n)))};for(let[t,r]of Object.entries(e??{}))if(Array.isArray(r))for(let e of r)n(t,e);else n(t,r);return t}function Ht(e){return JSON.stringify(typeof e==`string`?{query:e}:e)}function Ut(e,t,n,r){switch(e){case`json`:return{body:JSON.stringify(t),contentType:`application/json`};case`graphql`:return{body:Ht(t),contentType:`application/json`};case`form`:return{body:Bt(t,n),contentType:`application/x-www-form-urlencoded`};case`text`:return{body:String(t),contentType:`text/plain`};case`multipart`:return{body:Vt(t)};case`binary`:return{body:t,contentType:r||(Lt(t)&&t.type?t.type:`application/octet-stream`)};default:return{body:t}}}function Wt(e){if(Lt(e)){let t=e;return{file:t.name??`file`,type:t.type,size:t.size}}return Array.isArray(e)?e.map(Wt):typeof e==`object`&&e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,Wt(t)])):e}var R=e=>typeof e==`object`&&!!e&&!Array.isArray(e),Gt=e=>[`string`,`number`,`boolean`].includes(typeof e);function Kt(e,t){return typeof t==`number`&&typeof e==`string`&&e.trim()!==``&&!Number.isNaN(Number(e))?Number(e):typeof t==`string`&&typeof e==`number`?String(e):e}function qt(e,t){if(R(e)&&R(t)){let n={...e};for(let[e,r]of Object.entries(t))e in n&&(n[e]=qt(n[e],r));return n}if(Array.isArray(e)&&Array.isArray(t)){if(t.length===0)return e;if(t.every(Gt)&&e.every(Gt))return t;let n=e[0];return R(n)&&t.every(R)?t.map(e=>qt(n,e)):e}return Gt(t)&&Gt(e)&&typeof t==typeof e?t:typeof e==`number`&&typeof t==`string`&&t.trim()!==``&&!Number.isNaN(Number(t))?Number(t):e}function Jt(e,t){let n={...e},r=Object.entries(t).filter(([,e])=>e!==void 0&&e!==``);for(let[e,t]of r)e in n&&!R(n[e])&&!Array.isArray(n[e])?n[e]=Kt(t,n[e]):r.length===1&&`id`in n&&/^(id|.*[a-z]Id|.*_id)$/.test(e)&&!R(n.id)&&!Array.isArray(n.id)&&(n.id=Kt(t,n.id));return n}var Yt=e=>Gt(e),Xt=new Set([`id`,`object`,`type`,`kind`,`created`,`updated`,`url`,`livemode`,`metadata`,`status`]);function Zt(e,t=[],n=[],r=0){if(r>6)return n;if(R(e))for(let[i,a]of Object.entries(e))Zt(a,[...t,i],n,r+1);else Array.isArray(e)?e.length&&Zt(e[0],[...t,0],n,r+1):Yt(e)&&n.push({path:t,value:e});return n}var Qt=(e,t)=>{let n=e;for(let e of t){if(typeof n!=`object`||!n)return;n=n[e]}return n};function $t(e,t,n=[],r=[],i=0){if(i>5)return r;if(R(e))for(let[a,o]of Object.entries(e))a===t&&Yt(o)?r.push([...n,a]):$t(o,t,[...n,a],r,i+1);else Array.isArray(e)&&e.length&&$t(e[0],t,[...n,0],r,i+1);return r}var en=(e,t)=>typeof e==typeof t||typeof t==`number`&&typeof e==`string`&&e.trim()!==``&&!Number.isNaN(Number(e));function tn(e,t,n){let r=Qt(e,t.slice(0,-1));typeof r==`object`&&r&&(r[t[t.length-1]]=n)}function nn(e,t,n){let r=structuredClone(e),i=new Set(Zt(n).map(e=>e.path.join(`\0`)));for(let e of Zt(t)){if(Qt(r,e.path)!==void 0)continue;let t=String(e.path[e.path.length-1]);if(Xt.has(t)||typeof e.path[e.path.length-1]==`number`)continue;let n=$t(r,t).filter(e=>!i.has(e.join(`\0`)));if(n.length!==1)continue;let a=n[0],o=Qt(r,a);en(e.value,o)&&(tn(r,a,Kt(e.value,o)),i.add(a.join(`\0`)))}return r}var rn=/^(limit|per_?page|page_?size|size|count|max|max_?results|take)$/i;function an(e){return Array.isArray(e)?e[0]:typeof e==`string`&&e.includes(`,`)?e.split(`,`)[0]?.trim():e}function on(e,t){let n=Object.entries(t).map(([e,t])=>[e,an(t)]).filter(([,e])=>Yt(e)&&e!==``);if(n.length===0)return e;let r=e=>{let t={...e};for(let[e,r]of n)e in t&&Yt(t[e])&&en(r,t[e])&&(t[e]=Kt(r,t[e]));return t},i=n.find(([e])=>rn.test(e))?.[1],a=i!==void 0&&Number.isFinite(Number(i))?Math.min(Math.max(Math.trunc(Number(i)),1),10):void 0,o=e=>{if(!e.every(R))return e;let t=e.map(e=>r(e));if(a===void 0||t.length===0||t.length>=a)return t.slice(0,a??t.length);let n=t[0];return Array.from({length:a},(e,r)=>r<t.length?t[r]:{...n,...typeof n.id==`number`?{id:n.id+r}:{}})};if(Array.isArray(e))return o(e);if(R(e)){let t={...e},n=Object.entries(t).filter(([,e])=>Array.isArray(e)&&e.length>0&&e.every(R));if(n.length===1)t[n[0]?.[0]]=o(n[0]?.[1]);else return r(t);return t}return e}function sn(e,t){let n=e;if(t.body!==void 0){let e=R(n)&&Array.isArray(t.body)&&t.body.length>0&&t.body.every(R)?t.body[0]:t.body;(R(n)&&R(e)||Array.isArray(n)&&Array.isArray(e))&&(n=qt(n,e),R(n)&&R(e)&&(n=nn(n,e,e)))}return R(n)&&t.path&&(n=Jt(n,t.path)),t.query&&(n=on(n,t.query)),n}var cn=e=>e>=200&&e<300,ln=e=>e===void 0?e:JSON.parse(JSON.stringify(e));function un(e){let t=e.sleep??((e,t)=>new Promise((n,r)=>{if(t?.aborted)return r(Error(`Stopped before the API answered.`));let i=setTimeout(n,e);t?.addEventListener(`abort`,()=>{clearTimeout(i),r(Error(`Stopped before the API answered.`))},{once:!0})}));return async(n,r)=>{let i=n.mock,a=await e.loader.statuses(n.service,n.opId),o=n.mockStatus??a.find(cn)??a[0]??200;if(i?.secured&&!n.headers.authorization&&!Object.keys(n.headers).some(e=>/api[-_]?key|token/i.test(e))&&n.mockStatus===void 0&&a.includes(401))return dn(401,await e.loader.example(n.service,n.opId,401));let s={...i?.vars??{},...i?.pathParams??{},...i?.rawQuery??{}},c=async t=>{let r=ln(await e.loader.example(n.service,n.opId,t));return cn(t)&&(r=sn(r,{body:n.body,path:i?.pathParams,query:i?.rawQuery})),r===void 0?void 0:P(r,s)},l={status:o,data:await c(o),headers:{},delayMs:0,respond:(e,t)=>{u={status:e,data:t}}},u;if(i?.hook&&await i.hook({vars:i.vars??{},body:n.body,query:i.rawQuery,path:i.pathParams,headers:n.headers},l),u){let e=await c(u.status);l.status=u.status,l.data=u.data===void 0?e:I(e,u.data)}return l.delayMs&&await t(l.delayMs,r),{...dn(l.status,l.data),headers:{"content-type":`application/json`,...l.headers}}}}function dn(e,t){return{status:e,headers:{"content-type":`application/json`},text:t===void 0?``:JSON.stringify(t),body:t}}var z=class extends Error{constructor(e){super(e),this.name=`OAuthError`}},fn=e=>`openIdConnectUrl`in e;function pn(e){let t=e&&typeof e==`object`?e:{},n=e=>typeof e==`string`&&/^https?:\/\//i.test(e)?e:void 0,r=n(t.authorization_endpoint),i=n(t.token_endpoint);if(!r||!i)throw new z(`The provider’s discovery document has no authorization or token endpoint`);let a=[`openid`,...(Array.isArray(t.scopes_supported)?t.scopes_supported.filter(e=>typeof e==`string`):[]).filter(e=>e!==`openid`)];return{authorizationUrl:r,tokenUrl:i,scopes:Object.fromEntries(a.map(e=>[e,``]))}}var mn=e=>{let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)},hn=e=>mn(crypto.getRandomValues(new Uint8Array(e)));async function gn(e){if(!globalThis.crypto?.subtle)throw new z(`Sign-in needs a secure page (https, or localhost). Open the viewer over https, or paste an access token.`);let t=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(e));return mn(new Uint8Array(t))}async function _n(){let e=hn(48);return{verifier:e,challenge:await gn(e)}}var vn=()=>hn(24);function yn(e){let t=new URL(e.authorizationUrl);return t.searchParams.set(`response_type`,`code`),t.searchParams.set(`client_id`,e.clientId),t.searchParams.set(`redirect_uri`,e.redirectUri),e.scopes?.length&&t.searchParams.set(`scope`,e.scopes.join(` `)),t.searchParams.set(`state`,e.state),t.searchParams.set(`code_challenge`,e.challenge),t.searchParams.set(`code_challenge_method`,`S256`),t.toString()}function bn(e,t){let n=t=>(e instanceof URLSearchParams?e.get(t):e[t])??void 0,r=n(`error`);if(r){let e=n(`error_description`);throw new z(`Sign-in was refused: ${e?`${r} (${e})`:r}`)}if(n(`state`)!==t)throw new z(`Sign-in was rejected: the response did not match this request (state)`);let i=n(`code`);if(!i)throw new z(`Sign-in returned no authorization code`);return{code:i}}function xn(e){return{grant_type:`authorization_code`,code:e.code,redirect_uri:e.redirectUri,client_id:e.clientId,code_verifier:e.verifier}}function Sn(e){let t=e&&typeof e==`object`?e:{};if(typeof t.error==`string`){let e=typeof t.error_description==`string`?` (${t.error_description})`:``;throw new z(`The token endpoint refused the code: ${t.error}${e}`)}if(typeof t.access_token!=`string`||t.access_token===``)throw new z(`The token endpoint returned no access token`);return{accessToken:t.access_token,...typeof t.expires_in==`number`?{expiresIn:t.expires_in}:{},...typeof t.scope==`string`?{scope:t.scope}:{}}}var Cn=123,wn=125,Tn=e=>e===32||e===9||e===10||e===13,En=e=>e>=48&&e<=57||e>=65&&e<=90||e>=97&&e<=122||e===95||e===36||e===45,Dn=[115,101,99,114,101,116,115,46];function On(e,t){let n=t+2;for(;n<e.length&&Tn(e[n]);)n++;for(let t of Dn)if(e[n++]!==t)return;let r=n;for(;n<e.length&&En(e[n]);)n++;if(n===r)return;let i=String.fromCharCode(...e.subarray(r,n));for(;n<e.length&&Tn(e[n]);)n++;if(e[n]===wn&&e[n+1]===wn)return{start:t,end:n+2,name:i}}function kn(e){let t=[];for(let n=0;n<e.length-1;n++)if(e[n]===Cn&&e[n+1]===Cn){let r=On(e,n);r&&(t.push(r),n=r.end-1)}return t}var An=new TextEncoder;function jn(e){return[...new Set(kn(e).map(e=>e.name))]}function Mn(e,t){let n=kn(e).filter(e=>t.has(e.name));if(n.length===0)return e;let r=[],i=0;for(let a of n)r.push(e.subarray(i,a.start),An.encode(t.get(a.name))),i=a.end;r.push(e.subarray(i));let a=new Uint8Array(r.reduce((e,t)=>e+t.length,0)),o=0;for(let e of r)a.set(e,o),o+=e.length;return a}var Nn=new TextDecoder;function Pn(e,t){return e.includes(`{{`)?Nn.decode(Mn(An.encode(e),t)):e}var Fn=new TextDecoder(`utf-8`,{fatal:!0}),In=new TextEncoder;function Ln(e){let t=``;for(let n=0;n<e.length;n+=32768)t+=String.fromCharCode(...e.subarray(n,n+32768));return btoa(t)}function Rn(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function zn(e){try{return{kind:`text`,text:Fn.decode(e)}}catch{return{kind:`b64`,b64:Ln(e)}}}function Bn(e){return e.kind===`text`?In.encode(e.text):Rn(e.b64)}async function Vn(e){let t={};e.headers.forEach((e,n)=>{t[n]=e});let n=e.method!==`GET`&&e.method!==`HEAD`&&e.body!==null;return{method:e.method,url:e.url,headers:t,...n?{body:zn(new Uint8Array(await e.arrayBuffer()))}:{}}}function Hn(e){let t=e.status===204||e.status===205||e.status===304;return new Response(e.body&&!t?Bn(e.body):null,{status:e.status,headers:e.headers})}function Un(e,t,n,r={},i){return{kind:`request`,op:e,input:t,dataPatches:n,varOverrides:r,mockHook:i,with(a){let o={...t};return a.path&&(o.path=I(t.path,a.path)),a.query&&(o.query=I(t.query,a.query)),a.headers&&(o.headers={...t.headers??{},...a.headers}),a.capture&&(o.capture={...t.capture??{},...a.capture}),a.assert&&(o.assert=a.assert),a.auth!==void 0&&(o.auth=a.auth),a.assertMode&&(o.assertMode=a.assertMode),a.tags&&(o.tags=[...new Set([...t.tags??[],...a.tags])]),Un(e,o,a.data===void 0?n:[...n,a.data],a.vars?{...r,...a.vars}:r,i)}}}function Wn(e,t){return Un(e.op,e.input,e.dataPatches,e.varOverrides,t)}function Gn(e){return{meta:e,request(t={}){return Un(e,t,[])}}}var Kn=class extends Error{names;constructor(e){super(`Missing secrets: ${e.join(`, `)}`),this.names=e,this.name=`MissingSecretsError`}},qn=3;function Jn(e){let t=new Set([e]),n=e=>{try{t.add(e())}catch{}};return n(()=>encodeURIComponent(e)),n(()=>encodeURI(e)),n(()=>JSON.stringify(e).slice(1,-1)),n(()=>btoa(String.fromCharCode(...new TextEncoder().encode(e)))),[...t]}function Yn(e,t){let n=[...new Set([...t].filter(e=>e.length>=qn).flatMap(Jn))].sort((e,t)=>t.length-e.length);if(n.length===0)return e;let r=e=>n.reduce((e,t)=>e.split(t).join(`***`),e),i=e=>typeof e==`string`?r(e):Array.isArray(e)?e.map(i):typeof e==`object`&&e?Object.fromEntries(Object.entries(e).map(([e,t])=>[r(e),i(t)])):e;return i(e)}function Xn(e,t){let n=new URLSearchParams;for(let[e,r]of Object.entries(t.query))for(let t of Array.isArray(r)?r:[r])n.append(e,t);let r=n.toString();return`${e.replace(/\/+$/,``)}${t.url}${r?`?${r}`:``}`}function Zn(e,t){try{return new URL(e,t).toString()}catch{return e}}var Qn={ECONNREFUSED:`connection refused`,ENOTFOUND:`host not found`,EAI_AGAIN:`host not found`,ECONNRESET:`connection reset`,ETIMEDOUT:`connection timed out`,UND_ERR_CONNECT_TIMEOUT:`connection timed out`,EHOSTUNREACH:`host unreachable`,ENETUNREACH:`network unreachable`};function $n(e,t){let n=e?.cause;if(!(e instanceof TypeError)||!n)return e;let r=n.code??n.errors?.find(e=>e.code)?.code,i=r&&/^CERT_|^ERR_TLS|SELF_SIGNED|UNABLE_TO_VERIFY/.test(r)?`certificate problem`:``,a=typeof n.message==`string`&&n.message.length<=120?n.message:``,o=r&&Qn[r]||i||a;if(!o)return e;let s=t;try{s=new URL(t).host}catch{}return Error(`Could not reach ${s}: ${o}.`,{cause:e})}function er(e){return async(t,n)=>{if(n?.aborted)throw Error(`Stopped before the API answered.`);let r=e.fetch??fetch,i={...t.headers},a;if(t.body!==void 0&&t.method!==`GET`&&t.method!==`HEAD`){let e=Ut(t.encoding,t.body,t.formArrays,t.mediaType);a=e.body,e.contentType&&(i[`content-type`]??=e.contentType)}let o=new AbortController,s=!1,c=t.timeoutMs?setTimeout(()=>{s=!0,o.abort()},t.timeoutMs):void 0;n?.addEventListener(`abort`,()=>o.abort());let l=Xn(e.baseUrl(t.service),t);try{let e=await r(l,{method:t.method,headers:i,body:a,signal:o.signal}),n=await e.text(),s={};e.headers.forEach((e,t)=>{s[t.toLowerCase()]=e});let c=n;if(n.length===0)c=void 0;else try{c=JSON.parse(n)}catch{c=n}return{status:e.status,headers:s,text:n,body:c}}catch(e){throw s?Error(`Timed out after ${t.timeoutMs}ms: no answer from the API.`):n?.aborted?Error(`Stopped before the API answered.`):$n(e,l)}finally{c&&clearTimeout(c)}}}var B=()=>Date.now(),tr=class extends Error{};function nr(){return`run_${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}var rr=(e={})=>Object.fromEntries(Object.entries(e).map(([e,t])=>[e.toLowerCase(),t]));function ir(e){let t={};for(let[n,r]of Object.entries(e??{}))t[n]=typeof r==`function`?r():r;return t}async function ar(e){return typeof e==`function`?(await e()).default:e}async function or(e,t,n){if(t.length===0)return Array.isArray(e)?Promise.all(e.map(e=>typeof e==`string`?n(e):e)):typeof e==`string`?n(e):e;if(Array.isArray(e))return Promise.all(e.map(e=>or(e,t,n)));let[r,...i]=t;return Ot(e)&&r in e?{...e,[r]:await or(e[r],i,n)}:e}async function sr(e,t,n,r,i){let a=e=>r(e,i);if(n===`binary`)return typeof e==`string`?a(e):e;let o=e;for(let e of t)o=await or(o,e.split(`.`),a);return o}function cr(e,t,n){let r=new Set,i=[];for(let a of e){if(vt(a)||yt(a))continue;let e=ht(a);if(!r.has(e)){r.add(e);for(let r=t.length-1;r>=0;r--){let[a,o]=t[r];if(e in o){let s=a===`capture`?{key:e,source:a,step:n[e]}:{key:e,source:a};if(a===`capture`){let n=t.slice(0,r).reverse().find(([,t])=>e in t),[i,a]=[typeof n?.[1][e],typeof o[e]];n&&i!==a&&(s.shadows={source:n[0],type:i,replacedBy:a})}i.push(s);break}}}}return i}function lr(e,t,n){let r=e=>e.replace(/\{\{\s*((?:secrets|session)\.[\w$-]+)\s*\}\}/g,(e,r)=>{let[i,a]=r.split(`.`);if(i===`secrets`){let n=t.o.secrets?.[a];if(n===void 0&&(t.o.env===`mock`||t.o.deferSecrets))return e;if(n===void 0)throw new Kn([a]);return t.mask.add(n),n}let o=(n?t.sessions.get(`${t.o.env}:${n}`)?.session:void 0)?.[a];if(o===void 0)throw new tr(`No session value "${a}" for profile "${n}"`);return t.mask.add(String(o)),String(o)}),i=e=>Lt(e)?e:typeof e==`string`?r(e):Array.isArray(e)?e.map(i):typeof e==`object`&&e?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,i(t)])):e;return i(e)}function V(e,t){e.o.onEvent?.(e.mask.size?Yn(t,e.mask):t)}var ur=new Set([`GET`,`HEAD`,`OPTIONS`]);function dr(e,t){if(e.input.safe||ur.has(t.method))return!0;if(t.encoding===`graphql`){let e=t.body;return typeof e?.query==`string`&&!/(^|[\s}])mutation\b/.test(e.query)}return!1}function fr(e,t){if(t.op.security===!1)return;let n=t.input.auth===void 0?e.seqAuth:t.input.auth;if(n===!1)return;let r=n??e.o.serviceAuth?.[t.op.service];return r&&e.o.auth?.[r]?r:void 0}function pr(e,t){return{status:e.status,ok:e.status>=200&&e.status<300,headers:rr(e.headers),data:e.body,text:e.text,durationMs:t}}async function mr(e,t,n,r=!1){let i=e.o.auth?.[t];if(!i.login||!i.token)return;let a=`${e.o.env}:${t}`,o=e.sessions.get(a);if(o&&(o.expiresAt===void 0||o.expiresAt>(e.o.now?.()??B()))&&!r)return;let s=e.inflight.get(a);if(s)return s;let c=(async()=>{let r=i;V(e,{type:`auth:login`,profile:t});let{result:o,response:s}=await gr(e,await r.login(),`Login (${t})`,hr,`auth`,!0);if(n.push(o),!s?.ok)throw new tr(`Login for profile "${t}" failed (${s?.status})`);let c=r.token(s),l=typeof c.expiresIn==`number`?(e.o.now?.()??B())+c.expiresIn*1e3:void 0;e.sessions.set(a,{session:c,expiresAt:l});for(let t of Object.values(c))typeof t==`string`&&e.mask.add(t)})().finally(()=>e.inflight.delete(a));return e.inflight.set(a,c),c}var hr={inputs:{},captured:{},from:{}};async function gr(e,t,n,r,i=`request`,a=!1){let o=e.o.now?.()??B(),s=[],c={name:n,kind:i,status:`pass`,assertions:[],captured:{},durationMs:0},l=t.input.assertMode??e.seqAssertMode??e.o.assertMode??`soft`;V(e,{type:`step:start`,name:n});let u;try{let o=[[`config`,e.o.vars??{}],[`init`,ir(t.input.init)],[`input`,r.inputs],[`capture`,r.captured],[`override`,ir(t.varOverrides)],[`override`,e.o.overrides??{}]],d=Object.assign({},...o.map(e=>e[1])),f;if(t.input.example&&(f=await e.o.example?.(t.op,t.input.example),!f))throw new tr(`Example "${t.input.example}" not found for ${t.op.id}`);let p=I(f?.body,await ar(t.input.data));for(let e of t.dataPatches)p=I(p,e);let m=I(f?.path??{},t.input.path??{}),h=I(f?.query??{},t.input.query??{}),g={...f?.headers??{},...t.input.headers??{}};c.uses=cr(F([p,m,h,g]),o,r.from);let _=p===void 0?void 0:P(p,d),v=P(m,d)??{},y=P(h,d)??{},b=rr(P(g,d)),x=t.input.encoding??t.op.encoding??(_===void 0?`none`:`json`);_!==void 0&&e.o.readFile&&(t.op.files?.length||x===`binary`)&&(_=await sr(_,t.op.files??[],x,e.o.readFile,f?.dir));let S=a?void 0:fr(e,t),C=S?e.o.auth?.[S]:void 0,w={};C&&S&&(b={...rr(P(C.apply.headers??{},d)),...b},Object.assign(w,P(C.apply.query??{},d)));let T=t.op.path.replace(/\{([^}]+)\}/g,(e,t)=>{let n=v[t];if(n==null)throw new tr(`Missing path parameter "${t}"`);return encodeURIComponent(String(n))}),E={};for(let[e,t]of Object.entries({...y,...w}))t!=null&&(E[e]=Array.isArray(t)?t.map(String):String(t));let D={service:t.op.service,opId:t.op.id,method:t.op.method,url:T,query:E,headers:b,body:_,encoding:x,mediaType:x===`binary`?t.op.mediaType:void 0,formArrays:t.op.formArrays,timeoutMs:t.input.timeoutMs??e.o.timeoutMs??3e4,mockStatus:e.o.env===`mock`?e.o.mockStatus:void 0,mock:e.o.env===`mock`?{hook:t.mockHook,vars:d,pathParams:v,rawQuery:y,secured:t.op.security}:void 0};if(c.request={opId:t.op.id,method:D.method,service:D.service,url:D.url,query:D.query,headers:D.headers,body:Wt(D.body),profile:S},V(e,{type:`request`,name:n,request:c.request}),e.o.readOnly&&i!==`auth`&&!dr(t,D))throw new tr(`Refusing ${D.method} ${t.op.path} in "${e.o.env}": this is a --safe run, which only reads.`);let O=async()=>{S&&await mr(e,S,s);let{mock:t,...n}=D,r={...lr(n,e,S),mock:t},i=e.o.now?.()??B();return pr(await e.o.transport(r,e.o.signal),(e.o.now?.()??B())-i)};u=await O(),u.status===401&&S&&C?.retryOn401!==!1&&C?.login&&(await mr(e,S,s,!0),u=await O()),c.response={status:u.status,headers:u.headers,body:u.data,durationMs:u.durationMs},V(e,{type:`response`,name:n,status:u.status,durationMs:u.durationMs});for(let[e,n]of Object.entries(t.input.capture??{}))c.captured[e]=n(u,d);if(V(e,{type:`capture`,name:n,captured:c.captured}),t.input.assert){let r=Xe(l);try{await t.input.assert(u,{assert:r.assert,vars:{...d,...c.captured},req:c.request})}catch(e){e?.name!==`Assertion`&&(c.status=`error`,c.error=`assert threw: ${e?.message??e}`)}c.assertions=r.results;for(let t of r.results)V(e,{type:t.pass?`assert:pass`:`assert:fail`,name:n,assertion:t})}else if(e.o.implicitStatusCheck&&i===`request`){let t=u.status>=200&&u.status<300,r={label:`status is 2xx`,operator:`status`,pass:t,actual:u.status,expected:`2xx`};c.assertions=[r],V(e,{type:t?`assert:pass`:`assert:fail`,name:n,assertion:r})}c.status===`pass`&&c.assertions.some(e=>!e.pass)&&(c.status=`fail`)}catch(e){c.status=`error`,c.error=e instanceof Error?e.message:String(e)}return c.durationMs=(e.o.now?.()??B())-o,V(e,{type:`step:end`,name:n,status:c.status}),{result:c,response:u,authResults:s}}function _r(e){let t={steps:0,passed:0,failed:0,skipped:0,assertions:{passed:0,failed:0}},n=e=>{if(e.children?.length)e.children.forEach(n);else{t.steps++,e.status===`pass`?t.passed++:e.status===`skipped`?t.skipped++:t.failed++;for(let n of e.assertions)n.pass?t.assertions.passed++:t.assertions.failed++}};return e.forEach(n),t}function vr(e){let t=[],n=e=>{t.push(e),e.children?.forEach(n)};return e.forEach(n),t.some(e=>e.status===`error`)?`error`:t.some(e=>e.status===`fail`)?`fail`:`pass`}function yr(e,t,n,r,i){let a=Yn({schemaVersion:1,runId:nr(),kind:t,id:n.id,title:n.title,env:e.o.env,locale:e.o.locale,seed:e.o.seed,usedDrafts:e.o.usedDrafts??!1,tags:n.tags??[],status:vr(r),startedAt:new Date(i).toISOString(),durationMs:(e.o.now?.()??B())-i,totals:_r(r),steps:r},e.mask);return V(e,{type:`done`,result:a}),a}function br(e){return{o:e,sessions:new Map,inflight:new Map,mask:new Set(Object.values(e.secrets??{}))}}async function xr(e,t){let n=br(t),r=t.now?.()??B();V(n,{type:`run:start`,id:e.op.id,title:e.input.name??e.op.id,kind:`request`,tags:e.input.tags});let i=e.input.name??e.op.id,{result:a,authResults:o}=await gr(n,e,i,hr);return yr(n,`request`,{id:e.op.id,title:i,tags:e.input.tags},[...o,a],r)}async function Sr(e,t){let n=br(t);n.seqAuth=e.meta.auth,n.seqAssertMode=e.meta.assertMode;let r=t.now?.()??B();V(n,{type:`run:start`,id:e.meta.id,title:e.meta.title,kind:`sequence`,tags:e.meta.tags});let i=[],a={},o={},s=(e,t)=>{Object.assign(a,e);for(let n of Object.keys(e))o[n]=t},c;try{c=rt(e.meta.inputs??{},t.inputs)}catch(t){return i.push({name:`inputs`,kind:`input`,status:`error`,assertions:[],captured:{},error:t.message,durationMs:0}),yr(n,`sequence`,e.meta,i,r)}let l=t.vars??{},u=()=>({inputs:c,captured:a,vars:{...l,...t.overrides??{}},env:t.env}),d=!1,f=(e,t)=>i.push({name:e,kind:t,status:`skipped`,assertions:[],captured:{},durationMs:0});for(let r of e.nodes)if(d&&!e.meta.continueOnFailure)f(r.name,r.kind===`step`?`request`:r.kind);else if(t.signal?.aborted)f(r.name,r.kind===`step`?`request`:r.kind),d=!0;else try{if(r.kind===`step`){let{result:e,authResults:t}=await gr(n,typeof r.def==`function`?r.def(u()):r.def,r.name,{inputs:c,captured:a,from:o});i.push(...t,e),s(e.captured,r.name),e.status!==`pass`&&(d=!0)}else if(r.kind===`each`){let l=r.items(u()),f={name:r.name,kind:`each`,status:`pass`,assertions:[],captured:{},durationMs:0,children:[]},p=t.now?.()??B(),m={};for(let t=0;t<l.length;t++){let{result:i,authResults:s}=await gr(n,r.def(l[t],u(),t),`${r.name} #${t+1}`,{inputs:c,captured:a,from:o});f.children?.push(...s,i);for(let[e,t]of Object.entries(i.captured))m[e]??=[],m[e]?.push(t);if(i.status!==`pass`&&(f.status=i.status,!e.meta.continueOnFailure))break}f.captured=m,f.durationMs=(t.now?.()??B())-p,s(m,r.name),i.push(f),f.status!==`pass`&&(d=!0)}else if(r.kind===`input`){let e=r.controls(u()),a=it(e);V(n,{type:`input:required`,name:r.name,controls:a});let o=rt(e,t.onInput?await t.onInput({name:r.name,controls:a}):t.inputs??{});c={...c,...o},i.push({name:r.name,kind:`input`,status:`pass`,assertions:[],captured:o,durationMs:0})}else if(r.kind===`check`){let a=Xe(e.meta.assertMode??t.assertMode??`soft`),o={name:r.name,kind:`check`,status:`pass`,assertions:[],captured:{},durationMs:0};V(n,{type:`step:start`,name:r.name});try{await r.fn(u(),{assert:a.assert})}catch(e){e?.name!==`Assertion`&&(o.status=`error`,o.error=e?.message??String(e))}o.assertions=a.results,o.status===`pass`&&a.results.some(e=>!e.pass)&&(o.status=`fail`),V(n,{type:`step:end`,name:r.name,status:o.status}),i.push(o),o.status!==`pass`&&(d=!0)}}catch(e){let t=e instanceof $e;i.push({name:r.name,kind:r.kind===`step`?`request`:r.kind,status:`error`,assertions:[],captured:{},error:t?e.message:e?.message??String(e),durationMs:0}),d=!0}return yr(n,`sequence`,e.meta,i,r)}function Cr(e,t){let n={},r={};for(let i of e){let e=i.description?{description:i.description}:{};i.name===`live`?(n[t]=i.url,i.description&&(r.live=e)):r[i.name]={...e,vars:{[t]:i.url}}}return{vars:n,environments:r,baseUrl:`{{${t}}}`}}var wr=_({assets:()=>Zr,brandingAssets:()=>Lr,definitions:()=>qr,docs:()=>zr,environmentStore:()=>oi,environmentVars:()=>Rr,examples:()=>Jr,fakerUnavailable:()=>$r,loadConfig:()=>si,loadFaker:()=>null,loadManifests:()=>Ar,manifests:()=>kr,mode:()=>Dr,operationDocs:()=>Kr,operations:()=>Qr,project:()=>Or,requestExamples:()=>Yr,requestMeta:()=>Mr,requests:()=>jr,responseSchemas:()=>Gr,schemas:()=>Wr,sequenceMeta:()=>Fr,sequences:()=>Pr,unresolvedRequests:()=>Nr,unresolvedSequences:()=>Ir}),H=globalThis.__SPECBOOK_VIEWER__;if(!H)throw Error(`The viewer registry was imported before a spec was opened`);var{open:U}=H,W=U.service,Tr=e=>`${W}/${e}`,Er=Object.keys(U.metas),Dr=`static`,Or={root:``,outDir:``,requestsDir:`requests`},kr={[W]:U.manifest},Ar=async e=>{},jr=[],Mr={},Nr=[],Pr=[],Fr={},Ir=[],Lr={},Rr={},zr=[],Br=new Map,Vr=e=>{let t=e.slice(W.length+1),n=Br.get(e);if(n)return n;let r=H.bundle(t).catch(()=>({}));return Br.set(e,r),r},Hr=e=>new Proxy({},{get:(t,n)=>typeof n==`string`&&n.startsWith(`${W}/`)&&Er.includes(n.slice(W.length+1))?e(n):void 0,has:(e,t)=>typeof t==`string`&&t.startsWith(`${W}/`)&&Er.includes(t.slice(W.length+1)),ownKeys:()=>Er.map(Tr),getOwnPropertyDescriptor:()=>({enumerable:!0,configurable:!0})}),Ur=e=>Hr(t=>()=>Vr(t).then(t=>({default:e(t)}))),Wr=Ur(e=>e.schema),Gr=Ur(e=>e.responses),Kr=Ur(e=>e.docs),qr={[W]:()=>H.definitions().then(e=>({default:e}))},Jr=new Proxy({},{get:(e,t)=>{if(typeof t!=`string`||!t.includes(`.`))return;let n=t.lastIndexOf(`.`),r=t.slice(0,n);if(Er.includes(r.slice(W.length+1)))return()=>Vr(r).then(e=>({default:e.mock?.[t.slice(n+1)]}))}}),Yr=Hr(e=>(U.exampleNames[e.slice(W.length+1)]??[]).map(t=>({name:t,source:`generated`,dir:`${e}@generated`,load:()=>Vr(e).then(e=>({default:e.examples?.[t]}))}))),Xr,Zr=new Proxy({},{get:(e,t)=>typeof t==`string`&&t.endsWith(`/sample.txt`)?()=>(Xr??=URL.createObjectURL(new Blob([`specbook sample file
15
+ `],{type:`text/plain`})),Promise.resolve(Xr)):void 0}),Qr=Object.fromEntries(Er.map(e=>[Tr(e),async()=>({[e]:Gn(U.metas[e])})])),$r=`Generated values ({{faker.…}}) work in a Specbook project, not in the hosted viewer. Type a value instead.`,ei=H.baseUrl??U.baseUrl,ti=U.servers.find(e=>e.name===`live`),ni=Cr([...ei?[{name:`live`,url:ei,description:ti?.description}]:[],...U.servers.filter(e=>e.name!==`live`)],`baseUrl`),ri=e=>{if(/^https?:\/\//i.test(e)||!H.baseUrl)return e;try{return new URL(e,`${H.baseUrl.replace(/\/+$/,``)}/`).toString()}catch{return e}},ii={...ni.vars,...Object.fromEntries(Object.entries(U.authVars).map(([e,t])=>[e,ri(t)]))},ai={...ni.environments};for(let[e,t]of Object.entries(U.authEnvironmentVars))ai[e]={...ai[e],vars:{...ai[e]?.vars,...t}};var oi=H.source?{scope:H.source.kind===`url`?H.source.url:`upload:${W}`,session:H.source.kind!==`url`}:null,si=()=>Promise.resolve({default:{project:W,secrets:U.secrets,auth:U.auth,...Object.keys(ii).length?{vars:ii}:{},...Object.keys(ai).length?{environments:ai}:{},services:{[W]:{spec:``,baseUrl:ei||U.servers.length?ni.baseUrl:{},...U.defaultProfile?{auth:U.defaultProfile}:{}}}}}),G=d({links:[],ready:!1});function ci(e){let t=/^#([0-9a-f]{3}|[0-9a-f]{6})$/i.exec(e.trim());if(!t)return;let n=t[1].length===3?[...t[1]].map(e=>e+e).join(``):t[1];return[0,2,4].map(e=>Number.parseInt(n.slice(e,e+2),16))}function li(e){let t=ci(e);if(!t)return;let n=t.map(e=>{let t=e/255;return t<=.03928?t/12.92:((t+.055)/1.055)**2.4}),r=.2126*n[0]+.7152*n[1]+.0722*n[2],i=1.05/(r+.05);return(r+.05)/.056>i?`#0b1020`:`#ffffff`}var ui=e=>`--sb-accent:${e};--sb-accent-hover:color-mix(in srgb,${e} 82%,black);--sb-focus-ring:color-mix(in srgb,${e} 45%,white);`+(li(e)?`--sb-text-on-accent:${li(e)};`:``);function di(e,t=`root`){if(!e.accent&&!e.accentDark)return``;let n=t===`host`?`:host`:`:root`,r=t===`host`?`:host(:not([data-theme="light"]))`:`:root:not([data-theme="light"])`,i=t===`host`?`:host([data-theme="dark"])`:`:root[data-theme="dark"]`,a=e.accent?`${n}{${ui(e.accent)}}`:``;return e.accentDark?`${a}@media (prefers-color-scheme: dark){${r}{${ui(e.accentDark)}}}${i}{${ui(e.accentDark)}}`:a}function fi(e,t,n){if(typeof document>`u`)return;let r=document.getElementById(`specbook-brand`);r||(r=document.createElement(`style`),r.id=`specbook-brand`,document.head.append(r)),r.textContent=e?di(e):``;let i=t.name??n;if(globalThis.__SPECBOOK_VIEWER__?.setTitle!==!1&&(document.title=t.title?`${i} · ${t.title}`:i),t.favicon||t.logo){let e=document.querySelector(`link[rel="icon"]`);e||(e=document.createElement(`link`),e.rel=`icon`,document.head.append(e)),e.href=t.favicon??t.logo}}var pi;function mi(e){pi=e,typeof location<`u`&&(K.value=vi(location.hash))}var hi=e=>pi&&e.startsWith(`${pi}/`)?e.slice(pi.length+1):e,gi=e=>pi&&!e.includes(`/`)?`${pi}/${e}`:e,_i=e=>encodeURIComponent(e).replace(/%2F/gi,`/`);function vi(e){let[t=``,n=``]=e.split(`?`),r=new URLSearchParams(n),i=r.get(`play`)??void 0,a=r.get(`tab`),o=a===`docs`||a===`try`?a:void 0,s=/^#\/op\/(.+)$/.exec(t);if(s)return{kind:`op`,key:gi(decodeURIComponent(s[1])),play:i,tab:o};let c=/^#\/seq\/(.+)$/.exec(t);return c?{kind:`seq`,id:decodeURIComponent(c[1]),play:i,tab:o}:t===`#/browse`?{kind:`browse`}:{kind:`home`}}function yi(e){if(e.kind===`home`)return`#/`;if(e.kind===`browse`)return`#/browse`;let t=e.kind===`op`?`#/op/${_i(hi(e.key))}`:`#/seq/${encodeURIComponent(e.id)}`,n=new URLSearchParams;e.play!==void 0&&n.set(`play`,e.play),e.tab&&n.set(`tab`,e.tab);let r=n.toString();return r?`${t}?${r}`:t}var bi=()=>typeof matchMedia==`function`&&matchMedia(`(max-width: 820px)`).matches,xi=e=>bi()?{kind:`browse`}:{kind:`home`},K=d(vi(typeof location>`u`?``:location.hash)),q=d(!1),Si=d(``),Ci=d(``);function J(e){location.hash=yi(e),K.value=e}function wi(e,t,n=40){let r=t.trim().toLowerCase().split(/\s+/).filter(Boolean);if(r.length===0)return e.slice(0,n);let i=[];for(let t of e){let e=t.title.toLowerCase(),n=`${e} ${t.group.toLowerCase()} ${t.hay.toLowerCase()}`;if(!r.every(e=>n.includes(e)))continue;let a=0;for(let t of r)a+=e.startsWith(t)?3:e.includes(t)?2:1;t.kind===`seq`&&(a+=.5),t.kind===`req`&&(a+=.4),i.push([a,t])}return i.sort((e,t)=>t[0]-e[0]).slice(0,n).map(([,e])=>e)}function Ti({size:t=16}){return e(`svg`,{viewBox:`0 0 24 24`,width:t,height:t,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`,children:[e(`path`,{d:`M3 3l19 9-19 9 3.5-9z`}),e(`path`,{d:`M6.5 12H14`})]})}function Ei({size:t=12}){return e(`svg`,{viewBox:`0 0 24 24`,width:t,height:t,fill:`none`,stroke:`currentColor`,"stroke-width":`2`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`,children:[e(`rect`,{x:`4`,y:`11`,width:`16`,height:`10`,rx:`2`}),e(`path`,{d:`M8 11V7a4 4 0 0 1 8 0v4`})]})}function Di({size:t=16}){return e(`svg`,{viewBox:`0 0 24 24`,width:t,height:t,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`,children:[e(`path`,{d:`M12 15V3`}),e(`path`,{d:`M7.5 7.5 12 3l4.5 4.5`}),e(`path`,{d:`M5 11H4.5A1.5 1.5 0 0 0 3 12.5v7A1.5 1.5 0 0 0 4.5 21h15a1.5 1.5 0 0 0 1.5-1.5v-7a1.5 1.5 0 0 0-1.5-1.5H19`})]})}function Oi({size:t=16}){return e(`svg`,{viewBox:`0 0 16 16`,width:t,height:t,fill:`currentColor`,"aria-hidden":`true`,children:e(`path`,{d:`M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.6 7.6 0 0 1 4 0c1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.01 8.01 0 0 0 16 8c0-4.42-3.58-8-8-8Z`})})}function ki({size:t=16}){return e(`svg`,{viewBox:`0 0 24 24`,width:t,height:t,fill:`currentColor`,"aria-hidden":`true`,children:e(`rect`,{x:`6`,y:`6`,width:`12`,height:`12`,rx:`2`})})}function Ai(){let e=new Map;return{getItem:t=>e.get(t)??null,setItem:(t,n)=>void e.set(t,String(n)),removeItem:t=>void e.delete(t)}}function ji(e){try{let t=globalThis[e];if(t)return t}catch{}return Ai()}var Mi={get local(){return ji(`localStorage`)},get session(){return ji(`sessionStorage`)}},Ni=`specbook.environments.v1`,Pi={local:{},session:{}},Fi=e=>e===`local`?Mi.local:Mi.session;function Ii(e){try{let t=Fi(e).getItem(Ni);return t?JSON.parse(t):Pi[e]}catch{return Pi[e]}}function Li(e,t){Pi[e]=t;try{Fi(e).setItem(Ni,JSON.stringify(t))}catch{}}function Ri(e,t=`local`){return{all:()=>Ii(t)[e]??{},save(n,r){let i=Ii(t);Li(t,{...i,[e]:{...i[e],[n]:r}})},remove(n){let r=Ii(t),{[n]:i,...a}=r[e]??{};Li(t,{...r,[e]:a})}}}var zi=`specbook`;function Bi(e){return{version:e,send(e,t){return new Promise((n,r)=>{let i=e.id,a=e=>{let t=e.data;if(e.source!==window||t?.channel!==`${zi}:reply`||!t.reply)return;let r=t.reply;(i===void 0||r.id===i)&&(s(),n(t.reply))},o=()=>{s(),window.postMessage({channel:`${zi}:call`,call:{v:1,type:`abort`,id:i}},`*`),r(new DOMException(`aborted`,`AbortError`))},s=()=>{window.removeEventListener(`message`,a),t?.removeEventListener(`abort`,o)};window.addEventListener(`message`,a),t?.addEventListener(`abort`,o),window.postMessage({channel:`${zi}:call`,call:e},`*`)})}}}async function Vi(e=250){let t=globalThis.__SPECBOOK_EXTENSION__;if(t)return t;if(typeof window>`u`)return;let n=Bi(1),r=new Promise(t=>setTimeout(()=>t(void 0),e)),i=await Promise.race([n.send({v:1,type:`ping`}).catch(()=>void 0),r]);return i?.type===`pong`?{...n,version:i.version}:void 0}var Hi=0;function Ui(e,t){return er({baseUrl:t,fetch:async(t,n)=>{let r=new Request(t,n),i=`c${Date.now().toString(36)}${Hi++}`,a=await e.send({v:1,type:`fetch`,id:i,req:await Vn(r)},n?.signal??void 0);if(a.type===`error`)throw Error(a.message);if(a.type!==`response`)throw Error(`unexpected reply from the extension`);return Hn(a.res)}})}var Wi=`specbook.secrets.v1`,Gi={},Ki=()=>{try{let e=Mi.session.getItem(Wi);return e?JSON.parse(e):Gi}catch{return Gi}},qi=e=>{Gi=e;try{Mi.session.setItem(Wi,JSON.stringify(e))}catch{}},Ji={get:(e,t)=>Ki()[e]?.[t],set(e,t,n){let r=Ki();qi({...r,[e]:{...r[e],[t]:n}})},remove(e,t){let n=Ki(),{[t]:r,...i}=n[e]??{};qi({...n,[e]:i})}},Yi=e=>{try{return e?new URL(e).origin:void 0}catch{return}},Xi=/\{\{\s*secrets\.([\w$-]+)\s*\}\}/g;function Zi(e){return e.proxy?`proxy`:e.pageOrigin&&Yi(e.baseUrl)===e.pageOrigin?`direct`:e.extension?`extension`:`direct`}var Qi=e=>{let t=new Set,n=e=>{if(typeof e==`string`)for(let n of jn(new TextEncoder().encode(e)))t.add(n);else Array.isArray(e)?e.forEach(n):e&&typeof e==`object`&&Object.getPrototypeOf(e)===Object.prototype&&Object.values(e).forEach(n)};return n(e.headers),n(e.query),n(e.body),[...t]};function $i(e,t){return(n,r)=>{let i=Qi(n);if(i.length===0)return e(n,r);let a=t.originFor(n.service),o=new Map,s=[];for(let e of i){let n=a?t.store.get(a,e):void 0;n===void 0?s.push(e):o.set(e,n)}if(s.length&&t.unresolved===`fail`)throw new Kn(s);let c=e=>typeof e==`string`?Pn(e,o):Array.isArray(e)?e.map(c):e&&typeof e==`object`&&Object.getPrototypeOf(e)===Object.prototype?Object.fromEntries(Object.entries(e).map(([e,t])=>[e,c(t)])):e;return e({...n,headers:c(n.headers),query:c(n.query),body:c(n.body)},r)}}function ea(e){return(t,n)=>{let r=Zi({proxy:!!e.proxy,extension:!!e.extension,baseUrl:e.baseOf(t.service),pageOrigin:e.pageOrigin});return((r===`proxy`?e.proxy:r===`extension`?e.extension:e.direct)??e.direct)(t,n)}}var ta=`auth:`,na=e=>`${ta}${encodeURIComponent(e)}`,ra=`discovery:`,ia=e=>`${ra}${encodeURIComponent(e)}`,aa=/^[A-Za-z0-9_-]+$/,oa=/^[A-Za-z_][\w.-]*$/,sa=e=>typeof e==`string`?/\{\{/.test(e):typeof e==`object`&&!!e&&Object.values(e).some(sa),ca=e=>typeof e==`object`&&e?JSON.stringify(e):String(e??``);function la(e,t={}){if(!e.loadFaker&&e.fakerUnavailable){let t=e.fakerUnavailable;ct(new Proxy({},{get(){throw Error(t)}}))}let n={statuses:(t,n)=>e.manifests[t]?.operations.find(e=>e.id===n)?.statuses??[],async example(t,n,r){let i=async r=>(await e.examples[`${t}/${n}.${r}`]?.(0))?.default;return await i(r)??await i(`default`)}};async function r(t){return(await e.loadConfig(t)).default}let i=()=>e.mode!==`dev`,a=()=>i()?t.environmentStore?.all()??{}:{},o=new Set;async function s(e){let t=await r(e),n={};for(let[e,r]of Object.entries(t.environments??{})){let t=r?.risk;(t===`production`||t===`sandbox`)&&(n[e]=t)}for(let[e,t]of Object.entries(a()))t.from&&n[t.from]&&!n[e]&&(n[e]=n[t.from]);return n}async function c(e){let t=await r(e),n={};for(let[e,r]of Object.entries(t.environments??{})){let t=r?.description;t&&(n[e]=t)}for(let[e,t]of Object.entries(a()))t.from&&(n[e]=`copy of ${t.from}, kept in this browser`);return n}async function l(t){let n=await r(t);return Pt({services:n.services??{},environments:n.environments},[...Object.keys(e.environmentVars??{}),...o],Object.keys(a()))}async function u(t){if(e.mode===`dev`)try{let e=await fetch(`/__specbook/environment?env=${encodeURIComponent(t)}`);if(e.ok)return(await e.json()).vars}catch{}return{...e.environmentVars?.[t],...a()[t]?.vars}}async function d(e,t){return At(await r(t),e,await u(e))}async function f(e,t,n){return Mt(await r(n),e,t,await d(t,n))}async function p(e,t,n){let i=(await r(n)).auth?.[e]?.oauth;return!i||!sa(i)?i:Nt(i,await d(t,n),e)}async function m(e,t){let n=At(e,t,Object.values(e.services??{}).some(e=>sa(e.baseUrl))||Object.values(e.auth??{}).some(e=>sa(e.oauth))?await u(t):{});return{baseUrl(r){try{return Mt(e,r,t,n)}catch{return}},oauth(t){let r=e.auth?.[t]?.oauth;try{return r?Nt(r,n,t):void 0}catch{return}}}}async function h(n,o){let s=await r(o),c=s.vars??{},l=s.environments?.[n]?.vars??{},d=a()[n],f=i()?e.environmentVars?.[n]??{}:await u(n),p=d?.vars??{},m=[...new Set([...Object.keys(c),...Object.keys(l),...Object.keys(f),...Object.keys(p)])],h=e.mode===`dev`||!!t.environmentStore,g=m.map(e=>{let t=e in l?l[e]:c[e],n=e in p?`browser`:e in f?`file`:void 0,r=e in p?p[e]:e in f?f[e]:t,i=e in p&&e in f?f[e]:t;return{name:e,value:ca(r),source:n??(e in l?`config`:`default`),fallback:n&&i!==void 0?ca(i):void 0,editable:h}}),_=At(s,n,{...f,...p}),v=[];if(n!==`mock`)for(let e of Object.keys(s.services??{}))try{let t=Mt(s,e,n,_);v.push({service:e,...t?{url:t}:{}})}catch(t){if(!(t instanceof L))throw t;v.push({service:e,error:t.message})}return{rows:g,addresses:v,uses:Ft(s),removable:!!d?.from}}let g=()=>e.mode===`dev`||!!t.environmentStore;async function _(n,i,a){if(!aa.test(n))throw Error(`Use letters, digits, "-" and "_" in an environment name`);if(n===`mock`||(await l(a)).includes(n))throw Error(`"${n}" already exists`);if(e.mode===`dev`){let e=await fetch(`/__specbook/environment`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({name:n,from:i})});if(!e.ok)throw Error((await e.json()).error??`could not create`);o.add(n);return}if(!t.environmentStore)throw Error(`This page has nowhere to keep a new environment`);let s={...(await r(a)).environments?.[i]?.vars??{},...await u(i)};t.environmentStore.save(n,{from:i,vars:Object.fromEntries(Object.entries(s).filter(([,e])=>e!==null&&typeof e!=`object`).map(([e,t])=>[e,String(t)]))})}async function v(n,r,i){if(!oa.test(r))throw Error(`"${r}" is not a variable name`);if(e.mode===`dev`){let e=await fetch(`/__specbook/var`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({env:n,name:r,value:i})});if(!e.ok)throw Error((await e.json()).error??`save failed`);return}let a=t.environmentStore;if(!a)throw Error(`This page has nowhere to keep a variable`);let o=a.all()[n]??{vars:{}},s={...o.vars};i===null?delete s[r]:s[r]=i,!o.from&&Object.keys(s).length===0?a.remove(n):a.save(n,{...o,vars:s})}function y(e){t.environmentStore?.remove(e)}async function b(e,t){let n=await r(t);return[...new Set([...Object.keys(n.vars??{}),...Object.keys(n.environments?.[e]?.vars??{}),...Object.keys(await u(e))])]}async function x(i,a,o,s={}){if(i===`mock`)return un({loader:n});let c=await r(o),l=Object.values(c.services??{}).some(e=>sa(e.baseUrl))?await d(i,o):{},u=globalThis.location?.href,f=globalThis.location?.origin,p=e=>{if(s[e])return s[e];let t;try{t=Mt(c,e,i,l)}catch(e){throw e instanceof L?Error(e.message):e}if(!t)throw Error(`No base URL for ${e} in ${i}`);return Zn(t,u)},m=e.mode!==`static`,h=await t.extension?.(),g=h?Ui(h,x):void 0,_=t.secrets??Ji,v=er({baseUrl:p}),y=m?er({baseUrl:e=>`${a}/${i}/${e}`}):void 0;return ea({direct:S($i(v,{store:_,originFor:b,unresolved:`fail`})),proxy:y?$i(y,{store:_,originFor:b,unresolved:`keep`}):void 0,extension:g?$i(g,{store:_,originFor:b,unresolved:`keep`}):void 0,baseOf:x,pageOrigin:f});function b(e){return Yi(x(e))}function x(e){try{return p(e)}catch{return``}}function S(e){return async(t,n)=>{try{return await e(t,n)}catch(e){throw e instanceof TypeError&&(t.service.startsWith(ta)||t.service.startsWith(ra))?Error(`The browser could not reach the sign-in provider (${s[t.service]??`unknown`}). It probably does not allow calls from this page (CORS). Embedding the viewer on the API's origin does not help when the sign-in server is on another host; the browser extension can make the call. You can still paste an access token.`):e instanceof TypeError?Error(`The browser could not reach ${t.service} in "${i}". The API probably does not allow calls from this page (CORS). It works when the viewer runs on the API's own origin: embed it in the API's docs route ("Embed the viewer" in the README). Mock data keeps working.`):e}}}}async function S(t){if(e.mode!==`dev`||t===`mock`)return{};try{let e=await fetch(`/__specbook/environment?env=${encodeURIComponent(t)}`);if(!e.ok)return{};let n=await e.json();return Object.fromEntries((n.secrets??[]).filter(e=>e.source).map(e=>[e.name,e.source]))}catch{return{}}}let C=new Map;async function w(e){if(e.env===`mock`)throw Error(`Sign in needs a live environment, not mock`);let t;try{t=await p(e.profile,e.env,e.version)}catch(e){throw e instanceof L?Error(e.message):e}if(!t)throw Error(`"${e.profile}" has no sign-in configured`);if(!fn(t))return{authorizationUrl:t.authorizationUrl,tokenUrl:t.tokenUrl,scopes:t.scopes??{}};let n=new URL(t.openIdConnectUrl),r=C.get(n.href);r||(r=(async()=>{let t=ia(e.profile),r=await(await x(e.env,e.proxyBase??`/__specbook/proxy`,e.version,{[t]:n.origin}))({service:t,opId:`oidc-discovery`,method:`GET`,url:n.pathname,query:Object.fromEntries(n.searchParams),headers:{accept:`application/json`},encoding:`none`},e.signal);if(r.status>=400)throw Error(`The provider's discovery document answered ${r.status}`);return pn(r.body)})(),C.set(n.href,r),r.catch(()=>C.delete(n.href)));let i=await r;return{...i,scopes:t.scopes&&Object.keys(t.scopes).length?t.scopes:i.scopes}}async function T(e){let{tokenUrl:t}=await w(e),n=new URL(t),r=na(e.profile),i=await(await x(e.env,e.proxyBase??`/__specbook/proxy`,e.version,{[r]:n.origin}))({service:r,opId:`oauth-token`,method:`POST`,url:n.pathname,query:Object.fromEntries(n.searchParams),headers:{accept:`application/json`},body:e.fields,encoding:`form`},e.signal),a=i.body;if(i.status>=400&&typeof a?.error!=`string`)throw Error(`The token endpoint answered ${i.status}`);return i.body}let E=e=>e.replace(/^\.\//,``),D=t=>e.requestExamples[t]??[];async function O(e,t,n){let r=D(e).find(e=>e.name===t);if(r)return{...(await r.load(n)).default,source:r.source,dir:r.dir}}async function k(t,n){let r=await e.assets[`${n}/${E(t)}`]?.();if(!r)throw Error(`File "${t}" not found next to the example`);let i=await fetch(r);if(!i.ok)throw Error(`Could not read "${t}" (${i.status})`);return new File([await i.blob()],E(t).split(`/`).pop(),{type:i.headers.get(`content-type`)??void 0})}async function A(e){let t=await r(e.version),n=t.auth??{},i=Object.fromEntries(Object.entries(t.services??{}).filter(([,e])=>e.auth).map(([e,t])=>[e,t.auth]));return{env:e.env,vars:await d(e.env,e.version),overrides:e.vars,inputs:e.inputs,transport:await x(e.env,e.proxyBase??`/__specbook/proxy`,e.version),deferSecrets:!0,auth:n,serviceAuth:i,onEvent:e.onEvent,onInput:e.onInput,signal:e.signal,timeoutMs:t.timeoutMs,example:(t,n)=>O(`${t.service}/${t.id}`,n,e.version),readFile:(t,n)=>k(t,n??e.fileDir)}}async function ee(e,t){if(e.kind===`sequence`)return!0;let{init:n,data:r,example:i,path:a,query:o,headers:s}=e.input;return Object.values(n??{}).some(e=>typeof e==`function`)||typeof r==`function`?!0:St([i?await O(`${e.op.service}/${e.op.id}`,i,t.version):void 0,r,e.dataPatches,a,o,s,t.vars])}async function te(t,n,i){if(!e.loadFaker)return!1;let[a,o]=await Promise.all([e.loadFaker(t),r(t)]);return dt(await ut(a,o.faker,n),o.faker,{locale:n,seed:i}),!0}async function ne(t,n){e.loadFaker&&await ee(t,n)&&await te(n.version,n.locale,n.seed);let r=await A(n);return t.kind===`sequence`?Sr(t,r):xr(t,n.env===`mock`?{...r,mockStatus:n.mockStatus}:r)}async function re(t,n,r,i){let a=e.operations[t];if(!a)throw Error(`Unknown operation ${t}`);let o=(await a(n))[t.split(`/`)[1]];if(!o)throw Error(`Operation module for ${t} has no export`);let s=Object.fromEntries(Object.entries(r).filter(([,e])=>e!==void 0)),c=o.request({...i?.input??{},...s});return i?.mockHook?Wn(c,i.mockHook):c}async function ie(t,n){return(await e.operations[t]?.(n))?.[t.split(`/`)[1]]?.meta}async function ae(e,t){let n=`${e.op.service}/${e.op.id}`,r=e.input.example?await O(n,e.input.example,t):void 0,i=e.input.data;typeof i==`function`&&(i=(await i()).default);let a=I(r?.body,i);for(let t of e.dataPatches)a=I(a,t);return{name:e.input.name??e.op.id,source:`project`,dir:r?.dir,path:I(r?.path??{},e.input.path??{}),query:I(r?.query??{},e.input.query??{}),headers:{...r?.headers??{},...e.input.headers??{}},body:a}}async function oe(e,t){let n={};await Promise.all(e.map(async e=>{try{let r=ua(await e.load(t));if(r?.kind!==`request`)return;let i=`${r.op.service}/${r.op.id}`,a=r.input.name??e.file.replace(/^.*\//,``).replace(/\.req\.ts$/,``);n[i]??=[],n[i]?.push({file:e.file,name:a,def:r})}catch{}}));for(let e of Object.values(n))e.sort((e,t)=>e.name.localeCompare(t.name));return n}async function se(e,t){let n=[];return await Promise.all(e.map(async e=>{try{let r=ua(await e.load(t));r?.kind===`sequence`&&n.push({file:e.file,seq:r})}catch{}})),n.sort((e,t)=>e.seq.meta.title.localeCompare(t.seq.meta.title))}return{config:r,environments:l,environmentRisks:s,environmentNotes:c,environmentVars:u,environmentView:h,canCreateEnvironment:g,createEnvironment:_,deleteEnvironment:y,setVariable:v,baseUrlOf:f,oauthOf:p,addressesIn:m,managedSecrets:S,oauthEndpoints:w,oauthExchange:T,run:ne,fakerReady:te,operationRequest:re,operationMeta:ie,examplesOf:D,knownVars:b,loadExample:O,savedExample:ae,loadVariants:oe,loadSequences:se}}function ua(e){let t=e=>e&&(e.kind===`request`||e.kind===`sequence`);return t(e.default)?e.default:Object.values(e).find(t)}var Y=d(Date.now()),X=d(`mock`),Z=d([`mock`]),da=d({}),fa=d({}),pa=d(void 0),ma=d(void 0),ha=d(!1),ga=d(0),_a=d(!1),va=d(!1),ya=d({createEnvironment:!0,environmentSettings:!0}),Q=wr,ba,xa=async()=>{if(ba&&Date.now()-ba.at<3e4)return ba.bridge;let e=await Vi();return ba={at:Date.now(),bridge:e},e},Sa=oi,$=la(wr,{extension:xa,environmentStore:Sa===null?void 0:Ri(Sa?.scope??`${globalThis.location?.origin}${globalThis.location?.pathname}`,Sa?.session?`session`:`local`)}),Ca=Dr===`static`;async function wa(e,t){let n=await fetch(`/__specbook/save`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({path:e,content:t})});if(!n.ok)throw Error((await n.json()).error??`save failed`);Y.value=Date.now()}function Ta(){if(!globalThis.__SPECBOOK_VIEWER__)return null;let t=Z.value.some(e=>e!==`mock`);return e(`p`,{class:`muted overview-mode`,children:t?`Requests start on mock data. Switch Environment to live to call the real API.`:`Requests run on generated mock data: this document does not say where the API lives.`})}var Ea=/(^|\.)specbook\.dev$/i;function Da(e){return e.published&&e.badge!==!1&&!Ea.test(e.host)}var Oa=e=>`https://ui.specbook.dev/?ref=${encodeURIComponent(e)}`;function ka(){let t=globalThis.location?.hostname??``;return Da({host:t,published:Ca,badge:G.value.badge})?e(`p`,{class:`powered-by`,children:e(`a`,{href:Oa(t),target:`_blank`,rel:`noopener`,children:`Powered by Specbook`})}):null}var Aa=60,ja=`Default`;function Ma(e){let t=K.value;if(e.route.kind===`op`&&t.kind===`op`&&e.route.key===t.key){let n=(t.play??``).startsWith(`saved:`);return e.kind===`req`?t.play===e.route.play:!n}return e.route.kind===`seq`&&t.kind===`seq`&&e.route.id===t.id}function Na({e:t}){return e(`button`,{type:`button`,class:`op-row ${Ma(t)?`active`:``}`,onClick:()=>J(t.route),title:t.path?`${t.title}\n${t.path}`:t.title,children:[e(`span`,{class:`method ${t.method}`,children:t.method}),e(`span`,{class:`op-title`,children:[t.title,t.secured&&e(`span`,{class:`op-lock`,title:`Needs credentials`,children:e(Ei,{})})]}),e(`span`,{class:`op-path`,children:t.path})]})}function Pa(e,t){let n=Ci.value.trim(),r=t.length<=1,i=r?t[0]?.id??``:Si.value,o=a(()=>e.filter(e=>e.kind===`op`),[e]),s=a(()=>e.filter(e=>e.kind===`seq`),[e]),c=a(()=>e.filter(e=>e.kind===`req`),[e]),l=a(()=>{let e=i?c.filter(e=>e.service===i):c;return n?wi(e,n,200):e},[c,i,n]);return{q:n,single:r,svc:i,shownOps:a(()=>{let e=i?o.filter(e=>e.service===i):o;return n?wi(e,n,500):e},[o,i,n]),shownFlows:a(()=>{let e=i&&!r?s.filter(e=>e.tags?.includes(i)):s;return n?wi(e,n,100):e},[s,i,n,r]),shownReqs:l}}function Fa({entries:t,services:i}){let o=c(null),s=c(null),[l,u]=r(new Map),{q:d,single:f,svc:p,shownOps:m,shownFlows:h,shownReqs:g}=Pa(t,i),_=e=>l.get(`section:${e}`)??!0,v=e=>{let t=new Map(l);t.set(`section:${e}`,!_(e)),u(t)};n(()=>{let e=e=>{let t=e.target;e.key===`/`&&!/^(INPUT|TEXTAREA|SELECT)$/.test(t.tagName)&&(e.preventDefault(),o.current?.focus())};return addEventListener(`keydown`,e),()=>removeEventListener(`keydown`,e)},[]),n(()=>{let e=s.current;if(!e)return;let t=t=>{if(t.key!==`ArrowDown`&&t.key!==`ArrowUp`)return;let n=[...e.querySelectorAll(`.op-row, .flow-row`)],r=n.indexOf(document.activeElement);if(r<0)return;let i=t.key===`ArrowDown`?r+1:r-1;t.preventDefault(),i>=0&&i<n.length?n[i]?.focus():i<0&&o.current?.focus()};return e.addEventListener(`keydown`,t),()=>e.removeEventListener(`keydown`,t)},[]);let y=a(()=>{let e=new Map;for(let t of m){let n=t.tag??`default`,r=p||f?n:`${t.service} · ${n}`;e.set(r,[...e.get(r)??[],t])}return[...e.entries()].sort(([e],[t])=>e.localeCompare(t))},[m,p,f]),b=a(()=>{let e=new Map;for(let t of h){let n=t.flowGroup?.trim()||ja;e.set(n,[...e.get(n)??[],t])}let t=e=>e===ja?0:1;return[...e.entries()].sort(([e],[n])=>t(e)-t(n)||e.localeCompare(n))},[h]),x=m.length>Aa&&!d,S=(e,t)=>l.get(e)??(!x||t.some(Ma)),C=(e,t)=>{let n=new Map(l);n.set(e,!S(e,t)),u(n)};return e(`div`,{class:`catalog`,ref:s,children:[e(`div`,{class:`cat-top`,children:[!f&&e(`div`,{class:`pills`,role:`tablist`,"aria-label":`APIs`,children:[e(`button`,{type:`button`,role:`tab`,"aria-selected":p===``,class:`pill ${p===``?`on`:``}`,onClick:()=>Si.value=``,children:`All`}),i.map(t=>e(`button`,{type:`button`,role:`tab`,"aria-selected":p===t.id,class:`pill ${p===t.id?`on`:``}`,onClick:()=>Si.value=t.id,children:[t.id,` `,e(`span`,{class:`count`,children:t.ops})]}))]}),e(`div`,{class:`cat-filter-wrap`,children:[e(`input`,{ref:o,type:`text`,class:`cat-filter`,placeholder:p?`Filter ${p}`:`Filter operations and flows`,"aria-label":`Filter`,value:Ci.value,onInput:e=>Ci.value=e.target.value,onKeyDown:e=>{e.key===`ArrowDown`&&(e.preventDefault(),s.current?.querySelector(`.op-row, .flow-row`)?.focus()),e.key===`Escape`&&(Ci.value=``)}}),e(`kbd`,{class:`cat-hint`,title:`Focus the filter`,children:`/`})]})]}),b.length>0&&e(`section`,{class:`flows`,"aria-label":`Flows`,children:[e(`button`,{type:`button`,class:`flows-title`,"aria-expanded":_(`flows`),onClick:()=>v(`flows`),children:[e(`span`,{class:`caret`,children:_(`flows`)?`▾`:`▸`}),e(`span`,{class:`method flow`,children:`FLOW`}),e(`span`,{class:`muted small`,children:`Multi-step flows you can run end to end`}),e(`span`,{class:`count`,children:h.length})]}),_(`flows`)&&b.map(([t,n])=>{let r=`flows:${t}`,i=b.length===1,a=i||(l.get(r)??!0);return e(`div`,{class:`flow-group`,children:[!i&&e(`button`,{type:`button`,class:`group-head flow-head`,"aria-expanded":a,onClick:()=>{let e=new Map(l);e.set(r,!a),u(e)},children:[e(`span`,{class:`caret`,children:a?`▾`:`▸`}),` `,t,` `,e(`span`,{class:`count`,children:n.length})]}),a&&n.map(t=>e(`button`,{type:`button`,class:`op-row flow-row ${Ma(t)?`active`:``}`,onClick:()=>J(t.route),children:[e(`span`,{class:`flow-play`,"aria-hidden":`true`,children:`▶`}),e(`span`,{class:`op-title`,children:t.title})]}))]},r)})]}),g.length>0&&e(`section`,{class:`flows requests`,"aria-label":`Requests`,children:[e(`button`,{type:`button`,class:`flows-title`,"aria-expanded":_(`requests`),onClick:()=>v(`requests`),children:[e(`span`,{class:`caret`,children:_(`requests`)?`▾`:`▸`}),e(`span`,{class:`method req`,children:`REQ`}),e(`span`,{class:`muted small`,children:`Requests you can run and check`}),e(`span`,{class:`count`,children:g.length})]}),_(`requests`)&&g.map(t=>e(`button`,{type:`button`,class:`op-row req-row ${Ma(t)?`active`:``}`,onClick:()=>J(t.route),title:`${t.method} ${t.path}`,children:[e(`span`,{class:`method ${t.method}`,children:t.method}),e(`span`,{class:`op-title`,children:[t.title,(t.tags??[]).map(t=>e(`span`,{class:`chip req-tag`,children:t}))]}),e(`span`,{class:`op-path`,children:t.path})]}))]}),y.map(([t,n])=>{let r=S(t,n);return e(`div`,{class:`op-group`,children:[e(`button`,{type:`button`,class:`group-head`,"aria-expanded":r,onClick:()=>C(t,n),children:[e(`span`,{class:`caret`,children:r?`▾`:`▸`}),` `,t,` `,e(`span`,{class:`count`,children:n.length})]}),r&&n.map(t=>e(Na,{e:t}))]},t)}),y.length===0&&b.length===0&&g.length===0&&e(`p`,{class:`muted cat-empty`,children:[d?`Nothing matches “${d}”.`:`No operations.`,` `,d&&e(`button`,{type:`button`,class:`link`,onClick:()=>Ci.value=``,children:`Clear the filter`})]})]})}function Ia({services:t,counts:n}){let r=G.value;if(!r.ready)return e(`div`,{class:`overview`,"aria-busy":`true`});let i=t.reduce((e,t)=>e+t.ops,0),a=t.length===1?t[0]:void 0,o=r.title??r.name??(a?a.title??a.id:`${t.length} APIs · ${i.toLocaleString()} operations`),s=a?`${a.ops} ${a.ops===1?`operation`:`operations`}${a.version?` · v${a.version}`:``}`:r.name||r.title?`${t.length} APIs · ${i.toLocaleString()} operations`:void 0;return e(`div`,{class:`overview`,children:[r.logo&&e(`img`,{class:`overview-logo`,src:r.logo,alt:``,style:r.logoBackground?{background:r.logoBackground,padding:`10px 16px`,borderRadius:`10px`}:void 0}),r.title&&r.name&&e(`p`,{class:`overview-name`,children:r.name}),e(`h1`,{children:o}),r.tagline&&e(`p`,{class:`tagline`,children:r.tagline}),s&&e(`p`,{class:`muted`,children:s}),e(`p`,{class:`overview-hint`,children:`Choose an operation or flow on the left to read it and try it.`}),e(Ta,{}),e(`button`,{type:`button`,class:`btn primary overview-browse`,onClick:()=>J({kind:`browse`}),children:`Browse operations and flows`}),r.links.length>0&&e(`p`,{class:`overview-links`,children:r.links.map(t=>e(`a`,{href:t.href,target:`_blank`,rel:`noreferrer`,children:t.label}))}),e(`p`,{class:`muted overview-keys`,children:[e(`kbd`,{children:`⌘`}),` `,e(`kbd`,{children:`K`}),` jumps anywhere · `,e(`kbd`,{children:`/`}),` filters the list`]}),e(ka,{})]})}var La=`\0new-environment`;function Ra(){let t=X.value,n=Z.value.includes(t)?Z.value:[t,...Z.value],r=da.value[t],i=t===`mock`?`mock`:r===`production`||r!==`sandbox`&&/prod/i.test(t)?`prod`:`live`,a=ya.value.createEnvironment&&$.canCreateEnvironment(),o=n.length>1||a;return e(`span`,{class:`env-badge ${i} ${o?`switch`:``}`,title:t===`mock`?`Environment: mock (no network)`:`Environment: ${t}. Requests go to the real API.`,children:[e(`span`,{class:`env-name`,children:t}),o&&e(`select`,{"aria-label":`Environment`,value:t,onChange:e=>{let t=e.target.value;t===La?(e.target.value=X.value,va.value=!0):X.value=t},children:[n.map(t=>e(`option`,{value:t,title:fa.value[t],children:t})),a&&e(`option`,{value:La,children:`New environment…`})]})]})}async function za(){let e=Y.value,[t,n,r]=await Promise.all([$.environments(e),$.environmentRisks(e),$.environmentNotes(e)]);Z.value=t,da.value=n,fa.value=r,ga.value+=1}var Ba={session:`this session`,process:`environment variable`,environment:`environment file`,shared:`shared file`},Va={default:`default`,config:`config`,file:`file`,browser:`this browser`};async function Ha(e,t){let n=await fetch(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)});if(!n.ok)throw Error((await n.json()).error??`save failed`)}function Ua(e,t){let n=t.uses[e.name];if(!n)return[];let r=[];for(let e of n.services){let n=t.addresses.find(t=>t.service===e);r.push(n?.url?`${e} calls go to ${n.url}`:`${e} calls use this address`)}for(let e of n.profiles)r.push(`${e.profile} sign-in reads this (${e.field})`);return r}function Wa(){let[t,i]=r(),[o,s]=r(),[c,l]=r({}),u=_a.value,d=e=>_a.value=e,[f,m]=r(`environment`),[h,g]=r({}),[_,v]=r({name:``,value:``}),[y,b]=r(),x=X.value,S=()=>Ca?Promise.resolve():fetch(`/__specbook/environment?env=${encodeURIComponent(x)}`).then(e=>e.json()).then(i,()=>i(void 0));n(()=>{S(),m(x===`mock`?`session`:`environment`),g({})},[x]),n(()=>{let e=!0;return $.environmentView(x,Y.value).then(t=>e&&s(t)),()=>{e=!1}},[x,Y.value,ga.value]),n(()=>{$.config(Y.value).then(e=>{let t={};for(let[n,r]of Object.entries(e.auth??{}))for(let e of JSON.stringify(r.apply).matchAll(/secrets\.([\w$-]+)/g))t[e[1]]=r.title??n;l(t)})},[]);let C=a(()=>x===`mock`?0:t?.secrets.filter(e=>!e.source).length??0,[t,x]);if(!o||!Ca&&!t)return null;let w=t?.secrets??[];if(!(w.length>0||o.rows.length>0||x!==`mock`))return null;let T=async e=>{b(void 0);try{await e(),await S()}catch(e){b(e instanceof Error?e.message:String(e))}},E=(e,t)=>T(async()=>{await Ha(`/__specbook/secret`,{name:e,value:t,scope:f,env:f===`shared`?void 0:x}),g(t=>({...t,[e]:``}))}),D=(e,t)=>T(async()=>{await $.setVariable(x,e,t===``?null:t),ga.value+=1}),O=()=>T(async()=>{$.deleteEnvironment(x),X.value=`mock`,await za()}),k=[...t?.warnings??[],...x===`mock`?[]:o.addresses.filter(e=>e.error).map(e=>e.error)],A=[...o.rows].sort((e,t)=>Number(!!o.uses[t.name])-Number(!!o.uses[e.name])||e.name.localeCompare(t.name));return e(`div`,{class:`envmenu`,children:[e(`button`,{type:`button`,class:`btn envmenu-btn`,"aria-expanded":u,title:`Variables and credentials for ${x}`,"aria-label":C>0?`Environment settings, ${C} missing`:`Environment settings`,onClick:()=>d(!u),children:[e(`span`,{"aria-hidden":`true`,children:`⚙︎`}),` `,e(`span`,{class:`envmenu-label`,children:`Environment settings`}),C>0&&e(`span`,{class:`badge-missing`,children:C})]}),u&&e(`div`,{class:`envmenu-pop`,role:`dialog`,"aria-label":`Settings for ${x}`,children:[e(`header`,{class:`envmenu-head`,children:[e(`strong`,{children:x}),e(`span`,{class:`muted small`,children:x===`mock`?`mocks need no credentials`:`values apply to this environment`}),e(`span`,{class:`spacer`}),e(`button`,{type:`button`,class:`icon`,"aria-label":`Close`,onClick:()=>d(!1),children:`×`})]}),k.map(t=>e(`p`,{class:`envmenu-warn`,children:t})),y&&e(`p`,{class:`envmenu-warn`,children:y}),e(`section`,{children:[e(`h3`,{children:`Variables`}),e(`p`,{class:`muted small`,children:Ca?`Kept in this browser; the defaults come from the spec or site.`:e(p,{children:[`Shared with the team in `,e(`code`,{children:[`.specbook/environments/`,x,`.env`]}),`. Defaults come from specbook.config.ts.`]})}),A.map(t=>{let n=t.source===`file`||t.source===`browser`,r=`var:${t.name}`;return e(`div`,{children:[e(`div`,{class:`envrow`,children:[e(`code`,{children:t.name}),e(`input`,{"aria-label":`Value of ${t.name}`,value:h[r]??t.value,disabled:!t.editable,onInput:e=>g({...h,[r]:e.target.value}),onBlur:()=>{let e=h[r];e!==void 0&&e!==t.value&&D(t.name,e)},onKeyDown:e=>e.key===`Enter`&&e.target.blur()}),e(`span`,{class:`src ${n?`set`:`inherited`}`,children:Va[t.source]}),n&&t.editable&&e(`button`,{type:`button`,class:`icon`,"aria-label":t.fallback===void 0?`Remove ${t.name}`:`Reset ${t.name}`,title:t.fallback===void 0?`Remove this variable`:`Back to ${t.fallback}`,onClick:()=>D(t.name,null),children:`×`})]}),Ua(t,o).map(t=>e(`p`,{class:`muted small envuse`,children:t}))]},t.name)}),x!==`mock`&&o.addresses.filter(e=>e.url&&!Object.values(o.uses).some(t=>t.services.includes(e.service))).map(t=>e(`p`,{class:`muted small envuse`,children:[t.service,` calls go to `,t.url]})),x!==`mock`&&e(`form`,{class:`envrow`,onSubmit:e=>{e.preventDefault(),_.name&&D(_.name,_.value).then(()=>v({name:``,value:``}))},children:[e(`input`,{placeholder:`name`,"aria-label":`New variable name`,value:_.name,onInput:e=>v({..._,name:e.target.value})}),e(`input`,{placeholder:`value`,"aria-label":`New variable value`,value:_.value,onInput:e=>v({..._,value:e.target.value})}),e(`button`,{type:`submit`,class:`btn`,disabled:!_.name,children:`Add`})]}),o.removable&&e(`p`,{children:e(`button`,{type:`button`,class:`link`,onClick:O,children:`Delete environment`})})]}),!Ca&&e(`section`,{children:[e(`h3`,{children:`Secrets`}),w.length===0?e(`p`,{class:`muted small`,children:[`None declared. Add `,e(`code`,{children:[`secrets: `,`{ NAME: {} }`]}),` to the config.`]}):e(p,{children:[e(`label`,{class:`envrow scope`,children:[e(`span`,{class:`muted small`,children:`Save to`}),e(`select`,{"aria-label":`Where to save secrets`,value:f,onChange:e=>m(e.target.value),children:[e(`option`,{value:`environment`,children:[x,`.secrets.env (remembered here)`]}),e(`option`,{value:`session`,children:`this session only`}),e(`option`,{value:`shared`,children:`all environments (secrets.local.env)`})]})]}),w.map(t=>e(`form`,{class:`secretrow`,onSubmit:e=>{e.preventDefault(),E(t.name,h[t.name]??``)},children:[e(`div`,{class:`secretrow-head`,children:[e(`span`,{children:c[t.name]??t.name}),e(`code`,{class:`muted small`,children:t.key}),e(`span`,{class:`src ${t.source?`set`:`missing`}`,children:t.source?Ba[t.source]:`missing`})]}),e(`div`,{class:`envrow`,children:[e(`input`,{type:`password`,autocomplete:`off`,"aria-label":`Value of ${t.name}`,placeholder:t.source?`•••••• (type to replace)`:`paste a value`,value:h[t.name]??``,onInput:e=>g({...h,[t.name]:e.target.value})}),e(`button`,{type:`submit`,class:`btn`,disabled:!h[t.name],children:`Save`}),t.source&&t.source!==`process`&&e(`button`,{type:`button`,class:`link`,onClick:()=>E(t.name,``),title:`Remove the value from the selected place`,children:`Clear`})]})]}))]})]})]})]})}var Ga=`https://github.com/specbook-dev/specbook`;function Ka(){return globalThis.__SPECBOOK_VIEWER__?.source?e(`a`,{class:`btn gh-star`,href:Ga,target:`_blank`,rel:`noopener`,title:`Specbook's source is on GitHub`,children:[e(Oi,{}),e(`span`,{class:`gh-label`,children:`GitHub`})]}):null}var qa=`specbook:list-width`,Ja=()=>Math.round(innerWidth*.55);function Ya(){try{let e=Number(localStorage.getItem(qa));return e>=280?e:void 0}catch{return}}var Xa=d(Ya());function Za(e){Xa.value=e===void 0?void 0:Math.round(Math.max(280,Math.min(Ja(),e)));try{Xa.value===void 0?localStorage.removeItem(qa):localStorage.setItem(qa,String(Xa.value))}catch{}}function Qa(){let t=e=>{e.preventDefault(),document.body.classList.add(`resizing`);let t=e=>Za(e.clientX),n=()=>{document.body.classList.remove(`resizing`),removeEventListener(`pointermove`,t),removeEventListener(`pointerup`,n)};addEventListener(`pointermove`,t),addEventListener(`pointerup`,n)},n=()=>Xa.value??document.querySelector(`.list-col`)?.offsetWidth??360;return e(`div`,{class:`list-resizer`,role:`separator`,"aria-orientation":`vertical`,"aria-label":`Resize the list`,"aria-valuenow":Xa.value,"aria-valuemin":280,tabIndex:0,title:`Drag to resize · double-click to reset`,onPointerDown:t,onDblClick:()=>Za(void 0),onKeyDown:e=>{e.key===`ArrowLeft`?(e.preventDefault(),Za(n()-24)):e.key===`ArrowRight`&&(e.preventDefault(),Za(n()+24))}})}var $a=/^[A-Za-z0-9_-]+$/;function eo(){return va.value?e(to,{}):null}function to(){let[t,i]=r(``),[a,o]=r(()=>X.value===`mock`?Z.value.find(e=>e!==`mock`)??`mock`:X.value),[s,l]=r(),[u,d]=r(!1),f=c(null);n(()=>{f.current?.focus();let e=e=>{e.key===`Escape`&&(va.value=!1)};return addEventListener(`keydown`,e),()=>removeEventListener(`keydown`,e)},[]);let p=()=>va.value=!1,m=Z.value.includes(t),h=t===``?void 0:$a.test(t)?t===`mock`||m?`"${t}" already exists`:void 0:`Use letters, digits, "-" and "_"`,g=async()=>{d(!0),l(void 0);try{await $.createEnvironment(t,a,Y.value),await za(),X.value=t,va.value=!1,_a.value=!0}catch(e){l(e instanceof Error?e.message:String(e))}finally{d(!1)}};return e(`div`,{class:`palette-backdrop newenv-backdrop`,children:[e(`button`,{type:`button`,class:`palette-dismiss`,"aria-label":`Close`,onClick:p}),e(`div`,{class:`palette newenv`,role:`dialog`,"aria-label":`New environment`,children:e(`form`,{onSubmit:e=>{e.preventDefault(),t&&!h&&!u&&g()},children:[e(`h2`,{children:`New environment`}),e(`label`,{children:[e(`span`,{class:`muted small`,children:`Name`}),e(`input`,{ref:f,type:`text`,"aria-label":`Environment name`,placeholder:`staging`,value:t,onInput:e=>i(e.target.value.trim())})]}),e(`label`,{children:[e(`span`,{class:`muted small`,children:`Duplicate of`}),e(`select`,{"aria-label":`Duplicate of`,value:a,onChange:e=>o(e.target.value),children:Z.value.filter(e=>e!==`mock`).map(t=>e(`option`,{value:t,children:t}))})]}),e(`p`,{class:`muted small`,children:[`It starts with `,a,`'s variables. Change its address in Variables; secrets are asked for again.`]}),(h||s)&&e(`p`,{class:`envmenu-warn`,children:h??s}),e(`div`,{class:`envrow`,children:[e(`span`,{class:`spacer`}),e(`button`,{type:`button`,class:`btn`,onClick:p,children:`Cancel`}),e(`button`,{type:`submit`,class:`btn primary`,disabled:!t||!!h||u,children:`Create`})]})]})})]})}function no({entries:t}){let[i,o]=r(``),[s,l]=r(0),u=c(null),d=q.value;n(()=>{let e=e=>{(e.metaKey||e.ctrlKey)&&e.key.toLowerCase()===`k`?(e.preventDefault(),q.value=!q.value):e.key===`Escape`&&(q.value=!1)};return addEventListener(`keydown`,e),()=>removeEventListener(`keydown`,e)},[]),n(()=>{d&&(o(``),l(0),setTimeout(()=>u.current?.focus(),0))},[d]);let f=a(()=>wi(t,i,30),[t,i]);if(!d)return null;let p=e=>{e&&(q.value=!1,J(e.route))};return e(`div`,{class:`palette-backdrop`,children:[e(`button`,{type:`button`,class:`palette-dismiss`,"aria-label":`Close`,onClick:()=>q.value=!1}),e(`div`,{class:`palette`,role:`dialog`,"aria-label":`Jump to`,children:[e(`input`,{ref:u,type:`text`,placeholder:`Jump to a sequence, request or operation…`,value:i,onInput:e=>{o(e.target.value),l(0)},onKeyDown:e=>{e.key===`ArrowDown`?(e.preventDefault(),l(Math.min(f.length-1,s+1))):e.key===`ArrowUp`?(e.preventDefault(),l(Math.max(0,s-1))):e.key===`Enter`&&p(f[s])}}),e(`ul`,{children:[f.map((t,n)=>e(`li`,{children:e(`button`,{type:`button`,class:n===s?`sel`:``,onMouseEnter:()=>l(n),onClick:()=>p(t),children:[e(`span`,{class:`p-title`,children:t.title}),e(`span`,{class:`muted`,children:t.kind===`seq`?`Sequence`:t.kind===`req`?`Request`:t.group})]})})),f.length===0&&e(`li`,{class:`muted pad`,children:[`Nothing matches “`,i,`”`]})]})]})]})}function ro(){let t=globalThis.__SPECBOOK_VIEWER__,[n,i]=r(!1),[a,s]=r(!1);if(!t?.source)return null;K.value;let c=l(t.source),u=c.ok?o({origin:location.origin,pathname:location.pathname,hash:location.hash},c.spec,t.open.title):void 0;return e(`div`,{class:`share`,children:[e(`button`,{type:`button`,class:`btn`,"aria-expanded":n,"aria-haspopup":`true`,"aria-label":`Share`,onClick:()=>i(!n),children:[e(Di,{}),e(`span`,{class:`share-label`,children:`Share`})]}),n&&e(`div`,{class:`share-pop`,role:`menu`,children:u?e(p,{children:[e(`input`,{class:`share-link`,readOnly:!0,value:u.link,"aria-label":`Link to this view`,onFocus:e=>e.target.select()}),e(`div`,{class:`share-actions`,children:[e(`button`,{type:`button`,class:`btn primary`,onClick:async()=>{if(u)try{await navigator.clipboard.writeText(u.link),s(!0),setTimeout(()=>s(!1),1500)}catch{}},children:a?`Copied`:`Copy link`}),typeof navigator.share==`function`&&e(`button`,{type:`button`,class:`btn`,onClick:()=>void navigator.share({title:u.title,url:u.link}).catch(()=>{}),children:`Share…`})]}),e(`ul`,{class:`share-targets`,children:u.targets.map(t=>e(`li`,{children:e(`a`,{href:t.href,target:`_blank`,rel:`noopener noreferrer`,children:t.label})}))})]}):e(`p`,{class:`muted`,children:c.ok?``:c.reason})})]})}var io={auto:`Theme: follows your system. Click for light.`,light:`Theme: light. Click for dark.`,dark:`Theme: dark. Click to follow your system.`},ao=({mode:t})=>e(`svg`,{viewBox:`0 0 24 24`,width:`16`,height:`16`,fill:`none`,stroke:`currentColor`,"stroke-width":`1.8`,"stroke-linecap":`round`,"stroke-linejoin":`round`,"aria-hidden":`true`,children:[t===`light`&&e(p,{children:[e(`circle`,{cx:`12`,cy:`12`,r:`4`}),e(`path`,{d:`M12 2v2M12 20v2M4.9 4.9l1.4 1.4M17.7 17.7l1.4 1.4M2 12h2M20 12h2M4.9 19.1l1.4-1.4M17.7 6.3l1.4-1.4`})]}),t===`dark`&&e(`path`,{d:`M20 14.5A8.5 8.5 0 0 1 9.5 4 8.5 8.5 0 1 0 20 14.5z`}),t===`auto`&&e(p,{children:[e(`circle`,{cx:`12`,cy:`12`,r:`8.5`}),e(`path`,{d:`M12 3.5v17a8.5 8.5 0 0 0 0-17z`,fill:`currentColor`,stroke:`none`})]})]});function oo(){let n=i.value;return e(`button`,{type:`button`,class:`icon theme-toggle`,title:io[n],"aria-label":io[n],"data-theme-mode":n,onClick:t,children:e(ao,{mode:n})})}var so=`\0new-environment`,co=globalThis.__SPECBOOK_VIEWER__?.source?s:void 0;function lo(){r(()=>{let e=Object.keys(Q.manifests);mi(e.length===1?e[0]:void 0)})}var uo=d([]);function fo(){let[e,t]=r(),i=K.value.kind===`op`||K.value.kind===`seq`;return n(()=>{i&&!e&&h(()=>import(`./Host-ClcN3YPO.js`).then(t),__vite__mapDeps([0,1,2,3]),import.meta.url)},[i,e]),i?e:void 0}function po(){lo();let[t,i]=r({}),[o,s]=r(void 0),[l,u]=r(!1);n(()=>{let e=()=>{K.value=vi(location.hash)};return addEventListener(`hashchange`,e),$.config(Y.value).then(async e=>{uo.value=Object.keys(e.faker?.locales??{}),e.faker?.default&&(pa.value=e.faker.default);let t=e.branding,n=Q.brandingAssets,r=Object.values(Q.manifests),i=r.length===1?r[0]?.logo:void 0,a=t?.logo??await n.logo?.().catch(()=>void 0),o={ready:!0,name:t?.name,title:t?.title,tagline:t?.tagline,links:t?.links??[],badge:t?.badge,logo:a??i?.url,logoBackground:a?void 0:i?.backgroundColor,favicon:t?.favicon??await n.favicon?.().catch(()=>void 0)};G.value=o,fi(t,o,r.length===1?r[0]?.title??`Specbook`:`Specbook`)}).catch(()=>{G.value={...G.value,ready:!0}}).finally(()=>{$.loadVariants(Q.requests,Y.value).then(i);let e=Q.sequences.filter(e=>Q.unresolvedSequences.includes(e.file));e.length&&$.loadSequences(e,Y.value).then(s)}),$.environments(Y.value).then(e=>{Z.value=e;let t=globalThis.__SPECBOOK_VIEWER__?.defaultEnv;t&&e.includes(t)&&(X.value=t)}),$.environmentRisks(Y.value).then(e=>{da.value=e}),$.environmentNotes(Y.value).then(e=>{fa.value=e}),()=>removeEventListener(`hashchange`,e)},[]);let d=c(K.value);n(()=>{d.current!==K.value&&(d.current=K.value,u(!1))},[K.value]),n(()=>{if(!l)return;let e=e=>e.key===`Escape`&&u(!1);return addEventListener(`keydown`,e),()=>removeEventListener(`keydown`,e)},[l]);let f=Object.keys(Q.manifests).length>1,p=a(()=>{let e=[],n=[...Object.values(Q.sequenceMeta),...(o??[]).map(e=>({...e.seq.meta}))];for(let t of n)e.push({kind:`seq`,route:{kind:`seq`,id:t.id},title:t.title,group:t.tags?.[0]??`sequence`,tags:t.tags,flowGroup:t.group,description:t.description,hay:`${t.description??``} ${(t.tags??[]).join(` `)}`});for(let n of Object.values(Q.manifests))for(let r of n.operations){let i=`${n.service}/${r.id}`;for(let a of t[i]??[])e.push({kind:`req`,route:{kind:`op`,key:i,play:`saved:${a.file}`},title:a.name,group:`request`,service:n.service,tag:r.tags[0]??`default`,method:r.method,path:r.path,tags:a.def.input.tags,hay:`${r.id} ${r.method} ${r.path} ${(a.def.input.tags??[]).join(` `)} ${a.file}`});let a=(t[i]??[]).map(e=>e.name).join(` `);e.push({kind:`op`,route:{kind:`op`,key:i},title:r.summary?.replace(/\.$/,``)||r.path,group:`${f?`${n.service} · `:``}${r.tags[0]??`default`}`,service:n.service,tag:r.tags[0]??`default`,method:r.method,path:r.path,secured:r.secured,hay:`${r.id} ${r.method} ${r.path} ${r.tags.join(` `)} ${a}`})}return e},[o,t,f]),m=K.value,h=m.kind===`op`?mo(m.key):void 0,g=m.kind===`seq`?m.id:void 0,[_,v]=r();n(()=>{if(!g)return;let e=Q.sequenceMeta[g]?.file;if(e){let t=Q.sequences.filter(t=>t.file===e);$.loadSequences(t,Y.value).then(e=>v(e[0]))}else v(o?.find(e=>e.seq.meta.id===g))},[g,o,Y.value]);let y=_?.seq.meta.id===g?_:void 0,b=fo(),x=()=>J(xi(K.value)),S=a(()=>Object.values(Q.manifests).map(e=>({id:e.service,title:e.title,version:e.version,ops:e.operations.length})).sort((e,t)=>e.id.localeCompare(t.id)),[]),C=a(()=>{if(m.kind!==`op`&&m.kind!==`seq`)return{};let e=p.find(e=>e.kind===`op`&&m.kind===`op`&&e.route.kind===`op`&&e.route.key===m.key||e.kind===`seq`&&m.kind===`seq`&&e.route.kind===`seq`&&e.route.id===m.id);if(!e)return{};let t=p.filter(t=>e.kind===`seq`?t.kind===`seq`:t.kind===`op`&&t.service===e.service&&t.tag===e.tag),n=t.indexOf(e),r=e=>e?()=>J({...e.route,play:``}):void 0;return{prev:r(t[n-1]),next:r(t[n+1])}},[p,m.kind===`op`?m.key:m.kind===`seq`?m.id:``]),w=e=>J(m.kind===`op`?{kind:`op`,key:m.key,play:e.example??m.play??``,tab:e.tab}:m.kind===`seq`?{kind:`seq`,id:m.id,play:``,tab:e.tab}:m);return e(`div`,{class:`app`,style:Xa.value?{"--sb-list-w":`${Xa.value}px`}:void 0,children:[e(`header`,{class:`header`,children:[e(`button`,{type:`button`,class:`brand`,onClick:()=>J({kind:`home`}),children:[(G.value.logo??co)&&e(`img`,{class:`brand-logo`,src:G.value.logo??co,alt:``,style:G.value.logoBackground?{background:G.value.logoBackground,padding:`3px 6px`,borderRadius:`4px`}:void 0}),e(`span`,{class:`brand-name`,children:G.value.name??`Specbook`})]}),e(`button`,{type:`button`,class:`palette-btn`,onClick:()=>q.value=!0,children:[e(`span`,{children:`Jump to an operation or flow…`}),e(`kbd`,{children:`⌘K`})]}),e(`span`,{class:`spacer`}),e(`span`,{class:`header-env`,children:e(Ra,{})}),e(`button`,{type:`button`,class:`menu-btn icon`,"aria-label":`Settings`,"aria-expanded":l,onClick:()=>u(!l),children:`⋯`}),e(`div`,{class:`header-controls ${l?`open`:``}`,children:[Q.loadFaker&&e(`span`,{class:`row muted`,title:ha.value?"Generated values such as {{faker.person.fullName}}: new on every run, or fixed so the same number always gives the same data. `specbook test --seed` reproduces a run.":`Applies when the open request or flow uses {{faker.*}}`,children:[e(`label`,{class:`row`,children:[`Generated values`,e(`select`,{"aria-label":`Generated values`,disabled:!ha.value,value:ma.value===void 0?`random`:`fixed`,onChange:e=>{ma.value=e.target.value===`fixed`?ma.value??42:void 0},children:[e(`option`,{value:`random`,children:`New each run`}),e(`option`,{value:`fixed`,children:`Fixed`})]})]}),ma.value!==void 0&&e(`input`,{type:`number`,class:`seed-input`,"aria-label":`Seed number`,title:`The same number gives the same data every run`,disabled:!ha.value,value:ma.value,onInput:e=>{let t=e.target.valueAsNumber;ma.value=Number.isFinite(t)?t:void 0}})]}),uo.value.length>1&&e(`label`,{class:`row muted`,children:[`locale`,e(`select`,{value:pa.value??``,onChange:e=>pa.value=e.target.value||void 0,children:uo.value.map(t=>e(`option`,{value:t,children:t}))})]}),e(Wa,{}),e(`label`,{class:`row`,children:[`Environment`,e(`select`,{value:X.value,onChange:e=>{let t=e.target.value;t===so?(e.target.value=X.value,va.value=!0):X.value=t},children:[Z.value.map(t=>e(`option`,{value:t,title:fa.value[t],children:t})),$.canCreateEnvironment()&&e(`option`,{value:so,children:`New environment…`})]})]}),e(Ka,{}),e(ro,{}),e(oo,{})]})]}),e(`div`,{class:`layout`,"data-view":m.kind===`home`?`splash`:`list`,children:[e(`nav`,{class:`list-col`,"aria-label":`Operations and flows`,children:e(Fa,{entries:p,services:S})}),e(Qa,{}),e(`main`,{class:`stage`,children:(m.kind===`home`||m.kind===`browse`)&&e(Ia,{services:S,counts:{flows:p.filter(e=>e.kind===`seq`).length,requests:p.filter(e=>e.kind===`req`).length}})})]}),e(no,{entries:p}),e(eo,{}),b&&m.kind===`op`&&h&&e(b.Host,{kind:`op`,modal:!1,service:h.service,op:h.op,variants:t[m.key]??[],example:m.play??``,tab:m.tab,onNavigate:w,onPrev:C.prev,onNext:C.next,onClose:x}),b&&m.kind===`seq`&&y&&e(b.Host,{kind:`seq`,modal:!1,info:y,tab:m.tab,onNavigate:w,onPrev:C.prev,onNext:C.next,onClose:x})]})}function mo(e){let[t,n]=e.split(`/`),r=Q.manifests[t]?.operations.find(e=>e.id===n);return r?{service:t,op:r}:void 0}var ho=_({});u(),(globalThis.__SPECBOOK_VIEWER__===void 0?m():Promise.resolve(!1)).then(async t=>{t||(await Ar(),f(e(po,{}),document.getElementById(`app`)))});export{bn as A,J as C,_n as D,yn as E,F,P as I,ht as L,xn as M,Rt as N,fn as O,Lt as P,ki as S,z as T,Xi as _,Q as a,Mi as b,_a as c,Z as d,ha as f,Y as g,ma as h,Ca as i,Sn as j,vn as k,ga as l,pa as m,Ra as n,wa as o,ya as p,$ as r,X as s,ho as t,fa as u,Yi as v,Zn as w,Ti as x,Ji as y};
@@ -1,2 +1,2 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./main-i06Egg5h.js","./panel-nV09I7Wr.js","./panel-l1xvY4kI.css","./registry-b_jzfqy0.js"])))=>i.map(i=>d[i]);
2
- var e=`specbook-oauth`;function t(t={}){let n=t.stripWhenUnclaimed??!0,r=globalThis.location;if(!r||typeof BroadcastChannel>`u`&&!globalThis.opener)return Promise.resolve(!1);let i=new URLSearchParams(r.search),a=i.get(`state`);if(!a||!(i.has(`code`)||i.has(`error`)))return Promise.resolve(!1);let o={type:`callback`,state:a,...i.get(`code`)?{code:i.get(`code`)}:{},...i.get(`error`)?{error:i.get(`error`)}:{},...i.get(`error_description`)?{description:i.get(`error_description`)}:{}},s=()=>history.replaceState(null,``,r.pathname+r.hash);return n&&s(),new Promise(t=>{let n=typeof BroadcastChannel>`u`?null:new BroadcastChannel(e),i=!1,c=e=>{i||(i=!0,clearTimeout(f),n?.close(),removeEventListener(`message`,d),t(e))},l=()=>{i||(s(),c(!0),document.body.textContent=`Signed in. You can close this window.`,window.close())},u=e=>e?.type===`ack`&&e.state===a,d=e=>{e.origin===r.origin&&u(e.data)&&l()},f=setTimeout(()=>c(!1),1500);n&&(n.onmessage=e=>u(e.data)&&l()),addEventListener(`message`,d),n?.postMessage(o);try{window.opener?.postMessage(o,r.origin)}catch{}})}var n=new URL(`worker-BmvGpsJS.js`,import.meta.url).href;function r(){let e=new URL(n,import.meta.url);if(e.origin===location.origin)return new Worker(e,{type:`module`});let t=new Blob([`import ${JSON.stringify(e.href)}`],{type:`text/javascript`});return new Worker(URL.createObjectURL(t),{type:`module`})}var i=class{worker;next=1;pending=new Map;constructor(){this.worker=r(),this.worker.addEventListener(`message`,e=>{let t=e.data,n=this.pending.get(t.id);if(n){if(`progress`in t)return n.onProgress?.(t.progress);this.pending.delete(t.id),t.ok?n.resolve(t.result):n.reject(Object.assign(Error(t.error),{code:t.code}))}})}call(e,t){let n=this.next++;return{id:n,promise:new Promise((r,i)=>{this.pending.set(n,{resolve:r,reject:i,onProgress:t}),this.worker.postMessage({...e,id:n})})}}open(e,t){let{id:n,promise:r}=this.call({type:`open`,source:e},t);return{promise:r,cancel:()=>this.worker.postMessage({type:`cancel`,id:n})}}async bundle(e){let t=await this.call({type:`bundle`,opId:e}).promise;return JSON.parse(t)}async definitions(){return JSON.parse(await this.call({type:`definitions`}).promise)}},a=`modulepreload`,o=function(e,t){return new URL(e,t).href},s={},c=function(e){return e.pathname.endsWith(`.css`)},l=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},u=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),u=i?.nonce||i?.getAttribute(`nonce`);function d(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function f(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=d(t.map(t=>{t=o(t,n);let r=f(t),i=c(r);return l(s,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:a,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,u&&t.setAttribute(`nonce`,u),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};async function d(e){let{worker:t}=e,n={open:e.result,baseUrl:e.baseUrl,defaultEnv:e.defaultEnv,source:e.shareable===!1?void 0:e.source.kind===`url`?{kind:`url`,url:e.source.url}:{kind:`text`},bundle:e=>t.bundle(e),definitions:()=>t.definitions()};globalThis.__SPECBOOK_VIEWER__=n,e.setTitle!==!1&&(document.title=`${e.result.title} · Specbook`),await u(()=>import(`./main-i06Egg5h.js`).then(e=>e.t),__vite__mapDeps([0,1,2,3]),import.meta.url),f()}function f(){navigator.connection?.saveData||(window.requestIdleCallback??(e=>setTimeout(e,1500)))(()=>{u(()=>import(`./registry-b_jzfqy0.js`).then(e=>e.loadFaker()),[],import.meta.url).catch(()=>{})})}export{t as a,e as i,u as n,i as r,d as t};
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["./main-CAlriyIm.js","./panel-nV09I7Wr.js","./panel-l1xvY4kI.css"])))=>i.map(i=>d[i]);
2
+ var e=`specbook-oauth`;function t(t={}){let n=t.stripWhenUnclaimed??!0,r=globalThis.location;if(!r||typeof BroadcastChannel>`u`&&!globalThis.opener)return Promise.resolve(!1);let i=new URLSearchParams(r.search),a=i.get(`state`);if(!a||!(i.has(`code`)||i.has(`error`)))return Promise.resolve(!1);let o={type:`callback`,state:a,...i.get(`code`)?{code:i.get(`code`)}:{},...i.get(`error`)?{error:i.get(`error`)}:{},...i.get(`error_description`)?{description:i.get(`error_description`)}:{}},s=()=>history.replaceState(null,``,r.pathname+r.hash);return n&&s(),new Promise(t=>{let n=typeof BroadcastChannel>`u`?null:new BroadcastChannel(e),i=!1,c=e=>{i||(i=!0,clearTimeout(f),n?.close(),removeEventListener(`message`,d),t(e))},l=()=>{i||(s(),c(!0),document.body.textContent=`Signed in. You can close this window.`,window.close())},u=e=>e?.type===`ack`&&e.state===a,d=e=>{e.origin===r.origin&&u(e.data)&&l()},f=setTimeout(()=>c(!1),1500);n&&(n.onmessage=e=>u(e.data)&&l()),addEventListener(`message`,d),n?.postMessage(o);try{window.opener?.postMessage(o,r.origin)}catch{}})}var n=new URL(`worker-13v89DyZ.js`,import.meta.url).href;function r(){let e=new URL(n,import.meta.url);if(e.origin===location.origin)return new Worker(e,{type:`module`});let t=new Blob([`import ${JSON.stringify(e.href)}`],{type:`text/javascript`});return new Worker(URL.createObjectURL(t),{type:`module`})}var i=class{worker;next=1;pending=new Map;constructor(){this.worker=r(),this.worker.addEventListener(`message`,e=>{let t=e.data,n=this.pending.get(t.id);if(n){if(`progress`in t)return n.onProgress?.(t.progress);this.pending.delete(t.id),t.ok?n.resolve(t.result):n.reject(Object.assign(Error(t.error),{code:t.code}))}})}call(e,t){let n=this.next++;return{id:n,promise:new Promise((r,i)=>{this.pending.set(n,{resolve:r,reject:i,onProgress:t}),this.worker.postMessage({...e,id:n})})}}open(e,t){let{id:n,promise:r}=this.call({type:`open`,source:e},t);return{promise:r,cancel:()=>this.worker.postMessage({type:`cancel`,id:n})}}async bundle(e){let t=await this.call({type:`bundle`,opId:e}).promise;return JSON.parse(t)}async definitions(){return JSON.parse(await this.call({type:`definitions`}).promise)}},a=`modulepreload`,o=function(e,t){return new URL(e,t).href},s={},c=function(e){return e.pathname.endsWith(`.css`)},l=function(e,t,n){if(t in e)return e[t];let r=n();if(!r){e[t]=void 0;return}let i=r.then(()=>{e[t]=void 0},n=>{throw e[t]=void 0,n});return e[t]=i,i},u=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e,i=document.querySelector(`meta[property=csp-nonce]`),u=i?.nonce||i?.getAttribute(`nonce`);function d(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function f(e){return import.meta.resolve?new URL(import.meta.resolve(e)):new URL(e,import.meta.url)}r=d(t.map(t=>{t=o(t,n);let r=f(t),i=c(r);return l(s,r.href,()=>{if(e===void 0){e={all:new Set,styles:new Set};let t=document.getElementsByTagName(`link`);for(let n=t.length-1;n>=0;n--){let r=t[n];e.all.add(r.href),r.rel===`stylesheet`&&e.styles.add(r.href)}}if((i?e.styles:e.all).has(r.href))return;let t=document.createElement(`link`);if(t.rel=i?`stylesheet`:a,i||(t.as=`script`),t.crossOrigin=``,t.href=r.href,u&&t.setAttribute(`nonce`,u),document.head.appendChild(t),i)return new Promise((e,n)=>{t.addEventListener(`load`,e),t.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${r}`)))})})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})};async function d(e){let{worker:t}=e,n={open:e.result,baseUrl:e.baseUrl,defaultEnv:e.defaultEnv,setTitle:e.setTitle,source:e.shareable===!1?void 0:e.source.kind===`url`?{kind:`url`,url:e.source.url}:{kind:`text`},bundle:e=>t.bundle(e),definitions:()=>t.definitions()};globalThis.__SPECBOOK_VIEWER__=n,e.setTitle!==!1&&(document.title=`${e.result.title} · Specbook`),await u(()=>import(`./main-CAlriyIm.js`).then(e=>e.t),__vite__mapDeps([0,1,2]),import.meta.url)}export{t as a,e as i,u as n,i as r,d as t};