schema-finder
Version:
A simple React component for viewing and exploring a JSONSchema
172 lines (151 loc) • 14.3 kB
JavaScript
var We=Object.create;var v=Object.defineProperty,Te=Object.defineProperties,Ke=Object.getOwnPropertyDescriptor,Re=Object.getOwnPropertyDescriptors,Fe=Object.getOwnPropertyNames,Y=Object.getOwnPropertySymbols,Me=Object.getPrototypeOf,re=Object.prototype.hasOwnProperty,Ae=Object.prototype.propertyIsEnumerable;var ee=(e,r,t)=>r in e?v(e,r,{enumerable:!0,configurable:!0,writable:!0,value:t}):e[r]=t,y=(e,r)=>{for(var t in r||(r={}))re.call(r,t)&&ee(e,t,r[t]);if(Y)for(var t of Y(r))Ae.call(r,t)&&ee(e,t,r[t]);return e},S=(e,r)=>Te(e,Re(r)),te=e=>v(e,"__esModule",{value:!0});var Ge=(e,r)=>{for(var t in r)v(e,t,{get:r[t],enumerable:!0})},oe=(e,r,t,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of Fe(r))!re.call(e,n)&&(t||n!=="default")&&v(e,n,{get:()=>r[n],enumerable:!(o=Ke(r,n))||o.enumerable});return e},w=(e,r)=>oe(te(v(e!=null?We(Me(e)):{},"default",!r&&e&&e.__esModule?{get:()=>e.default,enumerable:!0}:{value:e,enumerable:!0})),e),Ve=(e=>(r,t)=>e&&e.get(r)||(t=oe(te({}),r,1),e&&e.set(r,t),t))(typeof WeakMap!="undefined"?new WeakMap:0);var fr={};Ge(fr,{Finder:()=>xe});var J=e=>e!==null&&typeof e=="object"&&!!Object.keys(e).length;var W=e=>r=>!!r&&e.includes(r),He=["additionalItems","additionalProperties","allOf","anyOf","contains","else","if","items","not","oneOf","patternProperties","properties","propertyNames","then"],T=W(He),Le=["anyOf","oneOf","allOf"],ne=W(Le),qe=["$comment","$id","$ref","$schema","additionalItems","additionalProperties","allOf","anyOf","const","contains","contentEncoding","contentMediaType","default","definitions","dependencies","description","else","enum","examples","exclusiveMaximum","exclusiveMinimum","format","if","items","maxItems","maxLength","maxProperties","maximum","minItems","minLength","minProperties","minimum","multipleOf","not","oneOf","pattern","patternProperties","properties","propertyNames","readOnly","required","then","title","type","uniqueItems","writeOnly"],I=W(qe);var N=e=>!Number.isNaN(Number.parseInt(e))||I(e);var K=w(require("react")),R=w(require("styled-components"));var se=w(require("styled-components")),ie=se.default.button`
outline: 0;
border: none;
margin: 0;
padding: 0;
width: auto;
overflow: visible;
background: transparent;
color: inherit;
font: inherit;
line-height: normal;
-webkit-font-smoothing: inherit;
-moz-osx-font-smoothing: inherit;
-webkit-appearance: none;
&::-moz-focus-inner {
border: 0;
padding: 0;
}
&:focus:not(:focus-visible) {
outline: none;
}
&:focus:not(:-moz-focusring) {
outline: none;
}
`;var ze=R.default.div`
display: flex;
flex-flow: row nowrap;
border: thin black solid;
overflow-x: auto;
`,Ue=(0,R.default)(ie)`
cursor: pointer;
padding: 0.1em 0.6em;
position: relative;
display: flex;
align-items: center;
&::after {
content: "";
--tri-height: 5px;
border-left: var(--tri-height) #0003 solid;
border-top: var(--tri-height) transparent solid;
border-bottom: var(--tri-height) transparent solid;
width: 0;
height: 0;
position: absolute;
right: -3px;
}
&:last-of-type::after {
display: none;
}
&:hover,
&:focus {
text-decoration: underline;
}
`,F=({entries:e,setPath:r})=>e.length?K.default.createElement(ze,null,e.map(({key:t,name:o},n)=>{let s=()=>{r(i=>i.slice(0,n+1))};return K.default.createElement(Ue,{key:`bc-${n}-${t}`,onClick:s},N(t)?o:t)})):null;var g=w(require("react"));var ae="default",_e=(e,r)=>e!==ae&&r.length===1&&N(r[0].key)&&r[0].name!==e,M=({entries:e,isLast:r,selectedRow:t,clickHandler:o,idx:n,focus:s})=>{let i={};for(let p of e){let{group:h=ae}=p;h in i||(i[h]=[]),i[h].push(p)}let a=p=>{s&&(p==null||p.scrollIntoView({behavior:"smooth",block:"nearest",inline:"end"}))};return g.default.createElement(L,{id:`col-${n}`,ref:a},Object.entries(i).map(([p,h])=>g.default.createElement(q,{key:`gr-${n}-${p}`},_e(p,h)&&g.default.createElement(A,null,p),h.map(x=>g.default.createElement(Xe,{clickHandler:o,colIdx:n,entry:x,isLast:r,selectedRow:t})))))},Xe=({clickHandler:e,colIdx:r,entry:t,isLast:o,selectedRow:n})=>{let{key:s,hasChildren:i,isRequired:a,idx:p,name:h}=t,x=g.default.useRef(null);return g.default.useEffect(()=>{var m;o&&n===p&&((m=x.current)==null||m.focus())},[n,o]),g.default.createElement(G,{key:`row-${r}-${p}`,ref:x,tabIndex:-1,inPath:p===n,lastInPath:o&&p===n,isRequired:a,onClick:e(t)},g.default.createElement(V,null,N(s)?h:s),i&&g.default.createElement(H,null,">"))};var ce=w(require("react")),b=class extends ce.default.Component{constructor(r){super(r);this.state={hasError:!1}}static getDerivedStateFromError(r){return{hasError:!0}}componentDidCatch(r,t){console.error(r,t)}render(){return this.state.hasError?null:this.props.children||null}};var c=w(require("react"));var Ze=({examples:e,path:r})=>e?c.default.createElement(c.default.Fragment,null,c.default.createElement("p",null,c.default.createElement(k,null,"Examples:")),Array.isArray(e)?e.map((t,o)=>c.default.createElement(j,{key:`ex-${r}-${o}`},JSON.stringify(t,null," "))):typeof e=="object"?c.default.createElement(j,null,JSON.stringify(e,null," ")):c.default.createElement(j,null,e)):null,Qe=({sConst:e,sEnum:r})=>{let t=[];if(e&&t.push(e),r&&t.push(...r),!t.length)return null;let o=t.map(n=>`"${n}"`).join(", ");return c.default.createElement("p",null,c.default.createElement(k,null,"Value:")," ",t.length>1&&c.default.createElement("i",null,"(oneOf)")," ",o)},U=({entry:e})=>{let{name:r,schema:t,isRequired:o,path:n}=e,{description:s,type:i,enum:a,const:p,examples:h,required:x}=t;return c.default.createElement(b,null,c.default.createElement(le,null,c.default.createElement(me,null,r),o&&c.default.createElement("p",null,c.default.createElement("i",null,"Required")),c.default.createElement(b,null,s&&c.default.createElement(pe,{s,path:n==null?void 0:n.join(".")})),c.default.createElement(z,null),c.default.createElement(b,null,c.default.createElement(Qe,{sConst:p,sEnum:a})),c.default.createElement(b,null,i&&c.default.createElement("p",null,c.default.createElement(k,null,"Type:")," ",Array.isArray(i)?i.join(", "):i)),c.default.createElement(b,null,x&&c.default.createElement("p",null,c.default.createElement(k,null,"Required Properties:")," ",x.join(", "))),c.default.createElement(b,null,c.default.createElement(Ze,{examples:h,path:n==null?void 0:n.join(".")})),c.default.createElement(z,null),!!(n==null?void 0:n.length)&&c.default.createElement("p",null,c.default.createElement(k,null,"Full Path:")," ",n.join("\u200B."))))};var E=w(require("react")),C=(e,r="")=>`desc-${r}-${e}`,pe=({s:e,path:r})=>{let t=[],o="",n=!1,s=!1,i=!1;for(let a=0;a<e.length;++a)switch(e[a]){case"`":{n?(t.push(E.default.createElement("code",{key:C(a,r)},o)),o=""):(t.push(o),o=""),n=!n;break}case"_":{e[a+1]==="_"?(s?(t.push(E.default.createElement("strong",{key:C(a,r)},o)),o=""):(t.push(o),o=""),s=!s,++a):(i?(t.push(E.default.createElement("i",{key:C(a,r)},o)),o=""):(t.push(o),o=""),i=!i);break}case"*":{e[a+1]==="*"?(s?(t.push(E.default.createElement("strong",{key:C(a,r)},o)),o=""):(t.push(o),o=""),s=!s,++a):(i?(t.push(E.default.createElement("i",{key:C(a,r)},o)),o=""):(t.push(o),o=""),i=!i);break}default:{o+=e[a];break}}return t.push(o),E.default.createElement("p",null,t)};var l=w(require("styled-components")),_=l.default.div`
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
"Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
display: flex;
flex-direction: column;
gap: 0.5rem;
`,X=l.default.div`
display: flex;
flex-flow: row nowrap;
border: thin black solid;
font-size: 12px;
height: 30em;
`,Z=l.default.div`
display: flex;
flex-flow: row nowrap;
flex: 2;
overflow-x: auto;
`,de=l.default.li`
margin: 0;
padding: 0.25em 0.5em;
`,A=(0,l.default)(de)`
font-style: italic;
`,G=(0,l.default)(de)`
margin: 0;
padding: 0.25em 0.5em;
display: flex;
flex-flow: row nowrap;
gap: 0.25em;
overflow: hidden;
font-style: ${({isKeyword:e})=>e&&"italic"};
&:hover,
&:focus {
cursor: pointer;
background: #0003;
}
${({inPath:e})=>e&&l.css`
background: #0001;
`}
${({lastInPath:e})=>e&&l.css`
color: white;
background: #000a ;
cursor: default ;
`}
${({isRequired:e})=>e&&l.css`
font-weight: bold;
`}
`,V=l.default.span`
text-overflow: ellipsis;
flex: 1;
max-width: 100%;
white-space: nowrap;
overflow: hidden;
`,H=l.default.span``,L=l.default.div`
display: flex;
flex-direction: column;
row-gap: 0.5em;
width: 15em;
min-width: 15em;
border-right: thin #0002 solid;
overflow-y: auto;
`,q=l.default.ul`
display: flex;
flex-direction: column;
list-style: none;
margin: 0;
padding: 0;
`,le=l.default.div`
padding: 1em;
border-left: thin black solid;
display: flex;
flex-direction: column;
gap: 0.5em;
overflow-y: auto;
flex: 1;
p {
margin: 0;
}
`,me=l.default.p`
font-weight: bold;
font-size: 1.5em;
overflow-wrap: break-word;
`,Hr=l.default.p`
font-style: italic;
`,k=l.default.span`
font-weight: bold;
`,j=l.default.code`
font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
monospace;
white-space: pre-wrap;
tab-size: 2;
`,z=l.default.hr`
width: 80%;
color: #0002;
`;var ue=(e,r)=>async t=>{if(t===void 0)return[{}];let[o,n]=t.split(/\/?#\/?/),s=e;if(o.length&&(r==null?void 0:r.unsafeAllowRemoteUriResolution)){let[i,a]=await Ye(o);if(a!==void 0)return[{},a];s=i}return er(s,rr(n))};async function Ye(e){try{let r=await fetch(e);return r.ok?[await r.json()]:[{},new Error(`${r.status}: ${r.statusText}`)]}catch(r){return[{},r]}}function er(e,r){for(let t of r){if(!(t in e))return[e,new Error(`No key "${t}" in given object: ${JSON.stringify(e,void 0," ")}`)];e=e[t]}return[e]}function rr(e){return e.split("/").map(r=>r.replace("~1","/").replace("~0","~"))}function tr([e,r],t){return Promise.resolve({key:e,schema:r,name:e,deref:t})}var or=async e=>{let{schema:r,deref:t}=e,[o,n]=await t(r.$ref);return n&&console.warn("Error dereferencing entry",e,n),J(o)?S(y({},e),{schema:y(y({},r),o)}):e},nr=e=>{let{schema:r}=e;if(r.title)return S(y({},e),{name:r.title});if(r.$ref){let t=he(r.$ref);if(t)return S(y({},e),{name:t})}return e},sr=e=>{let{schema:r}=e,t=Object.entries(r).filter(([o])=>T(o)).some(([,o])=>J(o));return S(y({},e),{hasChildren:t})},ir=e=>r=>{let{key:t}=r,o=e==null?void 0:e.includes(t);return S(y({},r),{isRequired:o})},ar=(e=[])=>r=>S(y({},r),{path:[...e,r.key]}),cr=e=>r=>S(y({},r),{group:e}),pr=e=>r=>S(y({},r),{idx:e});function Q({entry:e,group:r,required:t,path:o,idx:n,deref:s,derefOptions:i}){if(s===void 0){let[,a]=e;s=ue(a,i)}return tr(e,s).then(or).then(nr).then(sr).then(cr(r)).then(ir(t)).then(ar(o)).then(pr(n))}async function fe(e){if(e===void 0)return Promise.reject("no entry");let{path:r,schema:t,deref:o}=e;if(!t||typeof t!="object")return console.error("parent schema is not a schema:",t),Promise.reject(new TypeError("parent schema not a schema"));let{required:n}=t,{additionalItems:s,additionalProperties:i,allOf:a,anyOf:p,contains:h,else:x,if:m,items:d,not:O,oneOf:P,patternProperties:B,properties:$,propertyNames:D,then:Se}=t,f=lr.bind(null,{required:n,path:r,deref:o}),ge=f($,"properties"),we=f(B,"patternProperties"),be=f({additionalProperties:i},"additionalProperties"),Ee=f({propertyNames:D},"propertyNames"),Oe=Array.isArray(d)?f(d,"items"):f({items:d},"items"),Pe=f({additionalItems:s},"additionalItems"),Ne=f({contains:h},"contains"),ke=f(a,"allOf"),ve=f(p,"anyOf"),Ce=f(P,"oneOf"),De=f({not:O},"not"),Je=f({if:m},"if"),Ie=f({then:Se},"then"),je=f({else:x},"else");return(await Promise.all([ge,we,be,Ee,Oe,Pe,Ne,ke,ve,Ce,De,Je,Ie,je])).flat().map((Be,$e)=>S(y({},Be),{idx:$e}))}function lr({required:e,path:r,deref:t},o,n){if(!o)return Promise.resolve([]);let s=Object.entries(o).flatMap(([i,a])=>typeof a!="object"?[]:[[i,a]]).map(i=>Q({entry:i,deref:t,path:r,required:e,group:n}));return Promise.all(s)}var u=w(require("react"));function mr({entries:e,lastCol:r,lastRow:t,path:o},n){switch(n.key){default:return;case"h":case"ArrowLeft":return o.slice(0,-1);case"l":case"ArrowRight":return o.length===e.length?o:[...o,0];case"k":case"ArrowUp":{let s;return n.ctrlKey?s=0:s=Math.max(t-1,0),[...o.slice(0,-1),s]}case"j":case"ArrowDown":{let s;if(n.ctrlKey||!o.length)s=e[Math.max(r,0)].length-1;else{let i=e[r].length;s=Math.min(t+1,i-1)}return[...o.slice(0,-1),s]}case"g":return[...o.slice(0,-1),0];case"G":return[...o.slice(0,-1),e[Math.max(r,0)].length-1];case"Home":return o.slice(0,1)}}function ye(e){let r=mr.bind(null,e),{setPath:t}=e;return function(n){let s=r(n);s!==void 0&&(t(s),n.preventDefault())}}var dr=({schemas:e,unsafeAllowRemoteUriResolution:r})=>{let[t,o]=u.default.useState([]),[n,s=0]=u.default.useMemo(()=>[t.length-1,...t.slice(-1)],[t]),[i,a]=u.default.useState([]),p=u.default.useMemo(()=>{var m;return(m=i[t.length-1])==null?void 0:m[s]},[t,s,i]);u.default.useEffect(()=>{Promise.all(Object.entries(e).map((m,d)=>Q({entry:m,idx:d,derefOptions:{unsafeAllowRemoteUriResolution:r}}))).then(m=>{a([m]),o([])}).catch(console.error)},[e,r]),u.default.useEffect(()=>{var d;let m=(d=i[n])==null?void 0:d[s];m!==void 0&&fe(m).then(O=>{!O.length||a(P=>[...P.slice(0,t.length),O])}).catch(console.error)},[t]);let h=u.default.useMemo(()=>i.map((m,d)=>{var P;let O=B=>()=>{o($=>{var D;return[...$.slice(0,d),(D=B.idx)!=null?D:0]})};return u.default.createElement(M,{key:`col-${d}-${(P=t[d-1])!=null?P:0}`,idx:d,entries:m,selectedRow:t[d],isLast:d===n,focus:d===i.length-1,clickHandler:O})}),[i,o,t]),x=u.default.useCallback(ye({entries:i,lastCol:n,lastRow:s,path:t,setPath:o}),[i,n,s,t,o]);return u.default.createElement(_,null,u.default.createElement(X,null,u.default.createElement(Z,{tabIndex:0,onKeyDown:x},h),p&&u.default.createElement(U,{entry:p})),u.default.createElement(F,{entries:t.map((m,d)=>i[d][m]),setPath:o}))},xe=e=>u.default.createElement("div",null,u.default.createElement(dr,y({},e)));var ur=e=>e==null?void 0:e.split("/").slice(1);var he=e=>{var r;return(r=ur(e))==null?void 0:r.slice(-1)[0]};module.exports=Ve(fr);0&&(module.exports={Finder});
//# sourceMappingURL=index.js.map