api-ref-bundler
Version:
Bundle all external $ref in Json based API document into single document
8 lines (7 loc) • 15.3 kB
JavaScript
/*!
* allof-merge v0.4.3
* Copyright (C) 2012-2024 Damir Yusipov
* Date: Sat, 06 Apr 2024 20:31:19 GMT
*/
var ApiRefBundler=function(e){"use strict";function t(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(s=Object.getOwnPropertySymbols(e);o<s.length;o++)t.indexOf(s[o])<0&&Object.prototype.propertyIsEnumerable.call(e,s[o])&&(n[s[o]]=e[s[o]])}return n}function n(e,t,n,s){return new(n||(n=Promise))((function(o,r){function i(e){try{l(s.next(e))}catch(e){r(e)}}function a(e){try{l(s.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,a)}l((s=s.apply(e,t||[])).next())}))}function s(e,t){var n={};for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.indexOf(s)<0&&(n[s]=e[s]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(s=Object.getOwnPropertySymbols(e);o<s.length;o++)t.indexOf(s[o])<0&&Object.prototype.propertyIsEnumerable.call(e,s[o])&&(n[s[o]]=e[s[o]])}return n}function o(e,t,n,s){return new(n||(n=Promise))((function(o,r){function i(e){try{l(s.next(e))}catch(e){r(e)}}function a(e){try{l(s.throw(e))}catch(e){r(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof n?t:new n((function(e){e(t)}))).then(i,a)}l((s=s.apply(e,t||[])).next())}))}const r=(e={},t,n,s)=>{const o=`/${t}`,r="function"==typeof e["/**"]?e["/**"]({key:t,path:n,value:s}):e["/**"],i="function"==typeof e["/*"]?e["/*"]({key:t,path:n,value:s}):e["/*"];let a={};if(o in e)a=e[o];else if(!r&&!i)return;return a="function"==typeof a?a({key:t,path:n,value:s}):a,i&&(a=Object.assign(Object.assign({},i),a)),r?Object.assign(Object.assign({"/**":e["/**"]},r),a):a},i=e=>{const t={},n=e.reduce(((e,t)=>(Object.keys(t).forEach((t=>e.add(t))),e)),new Set);for(const s of n.keys()){const n=e.filter((e=>s in e));if(1!==n.length){if("/"!==s.charAt(0))throw new Error(`Cannot merge rules. Duplicate key: ${s}. Rules should not have same Rule key`);t[s]=(e,t)=>{const o=n.map((n=>"function"==typeof n[s]?n[s](e,t):n[s]));return i(o)}}else t[s]=n[0][s]}return t},a=e=>"object"==typeof e&&null!==e,l=e=>Array.isArray(e),c=(e,t,n={})=>o(void 0,void 0,void 0,(function*(){var o,c;t=l(t)?t:[t];const u=l(n.rules)?i(n.rules):n.rules,f=[{data:e,state:n.state,path:[],keys:[],keyIndex:-1,rules:u}];for(;f.length>0;){const e=f[f.length-1];if(e.keyIndex>=e.keys.length){for(;null===(o=e.hooks)||void 0===o?void 0:o.length;)e.hooks.pop()();f.pop();continue}const n=e.keys[e.keyIndex++],[i,d,p]=f.length>1?[e.data[n],[...e.path,n],r(e.rules,n,[...e.path,n],e.data[n])]:[e.data,e.path,u];let h={value:i,path:d,key:n,state:e.state,rules:p};const v=[];for(const e of t){if(!e||"function"!=typeof e)continue;const t=null!==(c=yield e(h))&&void 0!==c?c:{},{terminate:n,done:o,exitHook:r}=t,i=s(t,["terminate","done","exitHook"]);if(n)return;if(h=Object.assign(Object.assign({},h),i),r&&v.push(r),o){h=null;break}}if(h&&a(h.value)){const e=l(h.value)?[...h.value.keys()]:Object.keys(h.value);f.push({hooks:v,state:h.state,data:h.value,path:d,keys:e,keyIndex:0,rules:h.rules})}else for(;v.length;)v.pop()()}})),u=(e,t=[],n={})=>o(void 0,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t];const s={},r=Object.assign({state:Object.assign(Object.assign({},n.state),{root:s,node:s})},n.rules?{rules:n.rules}:{});return yield c(e,[...t,({value:e,path:t,key:n,state:s})=>o(void 0,void 0,void 0,(function*(){return n=t.length?n:"#",s.node[n]=a(e)?Array.isArray(e)?[]:{}:e,{value:e,state:Object.assign(Object.assign({},s),{node:s.node[n]})}}))],r),s["#"]})),f=e=>{let t=e;if(0===t.length)return".";const n=47===t.charCodeAt(0),s=47===t.charCodeAt(t.length-1);try{t=decodeURIComponent(t)}finally{t=((e,t)=>{let n,s="",o=0,r=-1,i=0;for(let a=0;a<=e.length;++a){if(a<e.length)n=e.charCodeAt(a);else{if(47===n)break;n=47}if(47===n){if(r===a-1||1===i);else if(r!==a-1&&2===i){if(s.length<2||2!==o||46!==s.charCodeAt(s.length-1)||46!==s.charCodeAt(s.length-2))if(s.length>2){const e=s.lastIndexOf("/");if(e!==s.length-1){-1===e?(s="",o=0):(s=s.slice(0,e),o=s.length-1-s.lastIndexOf("/")),r=a,i=0;continue}}else if(2===s.length||1===s.length){s="",o=0,r=a,i=0;continue}t&&(s.length>0?s+="/..":s="..",o=2)}else s.length>0?s+="/"+e.slice(r+1,a):s=e.slice(r+1,a),o=a-r-1;r=a,i=0}else 46===n&&-1!==i?++i:i=-1}return s})(t,!n)}return 0!==t.length||n||(t="."),t.length>0&&s&&(t+="/"),n?"/"+t:t},d=/\//g,p=/~/g,h=/~1/g,v=/~0/g;class g extends Map{add(e,t){const n=this.get(e);return n?n.push(t):this.set(e,[t]),this}}const y=e=>!!new RegExp("^(https?:\\/\\/)((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|((\\d{1,3}\\.){3}\\d{1,3}))(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*(\\?[;&a-z\\d%_.~+=-]*)?(\\#[-a-z\\d_]*)?$","i").test(e),b=e=>"object"==typeof e&&e?/3.+/.test((null==e?void 0:e.openapi)||"")?"OpenApi3":/2.+/.test((null==e?void 0:e.swagger)||"")?"OpenApi2":/2.+/.test((null==e?void 0:e.asyncapi)||"")?"AsyncApi2":P(e)?"JsonSchema":"unknown":"unknown",m=(e,t="")=>{const[n=t,s]=e.split("#"),o=y(n)?new URL(n).href:k(n,t),r=s&&"/"!==s?s:"";return{filePath:o,pointer:r,normalized:O(o,r)}},O=(e,t)=>e?`${e}${t?"#"+t:""}`:t?`#${t}`:"#",k=(e,t)=>{if(t){if(e){const n=t.split("/");return n[n.length-1]=e,f(n.join("/"))}return f(t)}return f(e)},j=e=>{const t=e.split("/").pop()||"";return null==t?void 0:t.replace(new RegExp(".(json|yaml|yml)$","gi"),"")},P=e=>x(e)||Array.isArray(e.anyOf)||Array.isArray(e.oneOf)||Array.isArray(e.allOf),x=e=>"object"==typeof e&&("type"in e||"definitions"in e||"properties"in e),w=e=>e.split("/").map((e=>decodeURIComponent(e.replace(h,"/").replace(v,"~")))).slice(1),$=(e,t="")=>e.length?t+"#"+A(e):t||"#",A=e=>e.length?"/"+e.map((e=>encodeURIComponent(String(e).replace(p,"~0").replace(d,"~1")))).join("/"):"",R=(e,t)=>{if(l(e)&&Array.isArray(t))return l(t)?[...e,...t]:[...e];if(a(e)&&a(t)){const n=Object.assign({},e);for(const e of Object.keys(t))n[e]=R(n[e],t[e]);return n}return t},C=(e,t)=>{let n=e;for(const e of t)if(n=Array.isArray(n)?n[+e]:n[e],void 0===n)break;return n},H=(e,t,n,s=0)=>{if(s>=t.length)return;const o=t[s];"object"!=typeof e[o]&&(e[o]={}),s===t.length-1?e[o]=n:H(e[o],t,n,s+1)};class S{constructor(e,t){this.basePath=e,this.resolver=t,this.cache=new Map}base(e=""){return n(this,void 0,void 0,(function*(){const{value:t}=yield this.resolvePointer(e,this.basePath);return t}))}resolve(e){return n(this,void 0,void 0,(function*(){if(this.cache.has(e))return this.cache.get(e);try{const t=yield this.resolver(e);return this.cache.set(e,t),t}catch(e){return}}))}resolvePointer(e,s="",o){return n(this,void 0,void 0,(function*(){const n=yield this.resolve(null!=s?s:this.basePath);if("string"==typeof n)return{filePath:s,value:n};let r=n;if(a(r)){const n=w(e);for(const e of n)if(Array.isArray(r)&&r.length>+e)r=r[+e];else if(a(r)&&e in r)r=r[e];else{if(!a(r)||!r.$ref)return{filePath:s};{const{$ref:n}=r,o=t(r,["$ref"]),i=m(n,s),a=yield this.resolvePointerRef(i.pointer,i.filePath,o);if(s=a.filePath,!(e in a.value))return{filePath:s};r=a.value[e]}}return r=o?R(r,o):r,{filePath:s,value:r}}return e?{filePath:s}:{filePath:s,value:r}}))}resolverRef(e,t,s){return n(this,void 0,void 0,(function*(){const n=m(e,t);return this.resolvePointer(n.pointer,n.filePath,s)}))}resolvePointerRef(e,s="",o){return n(this,void 0,void 0,(function*(){const n=yield this.resolvePointer(e,s,o);if(a(n.value)&&"$ref"in n.value){const e=n.value,{$ref:s}=e,o=t(e,["$ref"]);return this.resolverRef(s,n.filePath,o)}return n}))}}const E=e=>({"#":e,"/not":()=>E(e),"/allOf":{"/*":()=>E(e)},"/oneOf":{"/*":()=>E(e)},"/anyOf":{"/*":()=>E(e)},"/items":()=>Object.assign(Object.assign({},E(e)),{"/*":()=>E(e)}),"/properties":{"/*":()=>E(e)},"/additionalProperties":()=>E(e),"/definitions":{"/*":()=>E(e)}}),B=E("/definitions"),I="/components/schemas",z="/components/servers",N="/components/serverVariables",F="/components/channels",M="/components/messages",J="/components/securitySchemes",T="/components/correlationIds",U="/components/operationTraits",V="/components/messageTraits",_="/components/serverBindings",q="/components/channelBindings",L="/components/operationBindings",D="/components/messageBindings",G={"/*":{"#":"/components/parameters","/schema":E(I)}},K={"/*":{"#":z,"/variables":{"/*":{"#":N}},"/bindings":{"#":_}}},Q={"/*":{"#":U,"/bindings":{"#":L}}},W={"/*":{"#":V,"/headers":E(I),"/correlationId":{"#":T},"/bindings":{"#":D}}},X={"#":M,"/headers":E(I),"/correlationId":{"#":T},"/traits":W,"/payload":E(I),"/bindings":{"#":D}},Y={"/traits":Q,"/message":Object.assign(Object.assign({},X),{"/oneOf":{"/*":X}}),"/bindings":{"#":L}},Z={"/*":{"#":F,"/bindings":{"#":q},"/subscribe":Y,"/publish":Y,"/parameters":G}},ee={"/servers":K,"/channels":Z,"/components":{"/schemas":{"/*":()=>E(I)},"/servers":K,"/serverVariables":{"/*":{"#":N}},"/channels":Z,"/messages":{"/*":X},"/parameters":G,"/correlationIds":{"/*":{"#":T}},"/operationTraits":Q,"/messageTraits":W,"/securitySchemes":{"/*":{"#":J}},"/serverBindings":{"/*":{"#":_}},"/channelBindings":{"/*":{"#":q}},"/operationBindings":{"/*":{"#":L}},"/messageBindings":{"/*":{"#":D}}}},te="/components/schemas",ne="/components/responses",se="/components/examples",oe="/components/requestBodies",re="/components/securitySchemes",ie="/components/headers",ae="/components/links",le="/components/callbacks",ce={"/*":{"#":se}},ue={"/*":{"#":"/components/parameters","/schema":E(te),"/example":{"#":se},"/examples":ce}},fe={"/*":{"#":ie,"/schema":E(te),"/example":{"#":se},"/examples":ce}},de={"/*":{"/schema":E(te),"/example":{"#":se},"/examples":ce,"/encoding":{"/headers":fe}}},pe={"#":oe,"/content":de},he={"/*":{"#":le}},ve={"/*":{"#":ae}},ge={"/*":{"#":ne,"/headers":fe,"/content":de,"/links":ve}},ye={"/paths":{"/*":{"/*":{"/parameters":ue,"/requestBody":pe,"/responses":ge,"/callbacks":he},"/parameters":ue}},"/components":{"/schemas":{"/*":E(te)},"/responses":ge,"/parameters":ue,"/examples":ce,"/requestBodies":{"/*":pe},"/securitySchemes":{"/*":{"#":re}},"/headers":fe,"/links":ve,"/callbacks":he}},be="/definitions",me="/responses",Oe="/parameters",ke={"/*":Object.assign(Object.assign({},E(be)),{"#":Oe,"/schema":E(be)})},je={"/*":{"#":me,"/*":{"/schema":E(be),"/headers":ke}}},Pe={OpenApi3:ye,OpenApi2:{"/paths":{"/*":{"/*":{"/parameters":ke,"/responses":je},"/parameters":ke}},"/definitions":{"/*":E(be)},"/responses":je,"/parameters":ke},AsyncApi2:ee,JsonSchema:B,unknown:{}},xe=(e,t,n=0)=>{const s=n?t+n:t;return e&&e[s]?xe(e,t,n+1):s},we=(e,t,n)=>{for(const s of Object.keys(e)){const o=e[s];if(o.$ref&&!(Object.keys(o).length>1)&&t===m(o.$ref,n).normalized)return s}},$e=Symbol("cycleRef"),Ae=(e,s={})=>{const{ignoreSibling:o,enableCircular:r,fullCrawl:i,hooks:l}=s,c=new Map,u=new g,f=s=>n(void 0,void 0,void 0,(function*(){const{value:n,path:d,state:p}=s,h=d.length?s.key:"#",{node:v,root:g}=p,y=()=>{if((null==l?void 0:l.onExit)&&l.onExit(v[h],s),a(v[h])&&(c.set($(d,p.baseFile),v[h]),r)){const e=u.get(A(d));if(!e)return;for(const t of e){const e=C(g["#"],t);if(e&&e[$e])continue;const n=e?R(v[h],e):v[h];n[$e]=$(d),H(g["#"],t,n)}}};if(!a(n)||!n.hasOwnProperty("$ref")||"string"!=typeof n.$ref)return(null==l?void 0:l.onCrawl)&&l.onCrawl(n,s),{value:n,state:p,exitHook:y};const{$ref:b}=n,O=t(n,["$ref"]),k=!Object.keys(O).length||o?null:O,{filePath:j,pointer:P,normalized:x}=m(b,p.baseFile);(null==l?void 0:l.onRef)&&l.onRef(x,s);const w=p.refNodes.find(((e,t,n)=>{var s;if(x!==e.ref)return;const o=n[n.length-1];return!e.sibling||(null===(s=n[t-1])||void 0===s?void 0:s.ref)===o.ref}));if(w){let e;return(null==l?void 0:l.onCycle)&&l.onCycle(w.pointer,s),r?(u.add(w.pointer,d),e=k||null):e=Object.assign({$ref:"#"+w.pointer},k),(null==l?void 0:l.onCrawl)&&l.onCrawl(e,s),{value:e,state:p,exitHook:()=>{(null==l?void 0:l.onExit)&&l.onExit(v[h],s)}}}if(c.has(x)){const e=c.get(x),t=a(e)&&k?R(e,k):e;return(null==l?void 0:l.onCrawl)&&l.onCrawl(t,s),i?{value:t,state:p,exitHook:y}:{value:k,state:p,exitHook:()=>{v[h]=a(e)&&k?R(e,v[h]):e,y()}}}{const t=yield e.resolvePointer(P,j);if(!t.value)return(null==l?void 0:l.onError)&&l.onError(`Cannot resolve: ${x}`,s),{value:Object.assign({$ref:x},k),state:p};const n=a(t.value)?k?R(t.value,k):Object.assign({},t.value):t.value,o=Object.assign(Object.assign({},p),{refNodes:[...p.refNodes,{ref:x,pointer:A(d),sibling:k}],baseFile:t.filePath}),r=yield f(Object.assign(Object.assign({},s),{value:n,state:o}));return Object.assign(Object.assign({value:n},r),{exitHook:()=>{!k&&a(v[h])&&c.set(x,v[h]),(null==r?void 0:r.exitHook)&&r.exitHook()}})}}));return f};return e.MapArray=g,e.RefResolver=S,e.buildPointer=A,e.buildRef=$,e.bundle=(e,s,o={})=>n(void 0,void 0,void 0,(function*(){var r;const i=new S(e,s),l=yield i.base(),c=O(f(e)),d={},p=new Map,h=new Map,{hooks:v,ignoreSibling:g}=o,y=e=>n(void 0,void 0,void 0,(function*(){const{value:n,path:s,state:o}=e;(null==v?void 0:v.onCrawl)&&(null==v||v.onCrawl(n,e));const r=s.length?e.key:"#",l=[...o.path,...s],f=A(l);if(h.has(f)){if(h.get(f))return{done:!0};h.set(f,!0)}if(!a(n)||!n.hasOwnProperty("$ref")||"string"!=typeof n.$ref)return;const b=()=>{(null==v?void 0:v.onExit)&&v.onExit(e.state.node[r],e)},{$ref:k}=n,P=t(n,["$ref"]),{filePath:x,pointer:$,normalized:S}=m(k,o.baseFile);if((null==v?void 0:v.onRef)&&v.onRef(S,e),x===c)return{value:Object.assign({$ref:O("",$)},P),exitHook:b};if(p.has(S))return{value:Object.assign({$ref:p.get(S)},P),exitHook:b};if(p.has(x)&&!/\/(definitions|defs)/g.test($))return{value:Object.assign({$ref:p.get(x)+$},P),exitHook:b};{const n=yield i.resolvePointer($,x);if(!n.value)return(null==v?void 0:v.onError)&&v.onError(`Cannot resolve: ${S}`,e),{value:{$ref:S},exitHook:b};if("string"==typeof n.value)return{value:n.value,exitHook:b};const s=e.rules&&"#"in e.rules?e.rules["#"]:void 0;if(s){const r=w(s),l=t(n.value,["$defs","definitions"]),v=C(d,r)||{};let g=v&&we(v,S,c);if(!g){const e=yield i.resolvePointerRef(s,c);if(g=we(e.value||{},S,e.filePath),!g){const t=l.$id||l.id||j($||n.filePath);g=xe(Object.assign(Object.assign({},e.value),v),t)}}if(p.has(S))return{value:Object.assign({$ref:p.get(S)},P),exitHook:b};r.push(g);const m=A(r);p.set(S,"#"+m),h.set(m,!1);const k={ref:O(x,$),pointer:m},R=yield u(l,y,{state:{baseFile:n.filePath,path:r,refNodes:[...o.refNodes,k],defPrefix:g+"-"},rules:e.rules});if(a(R)&&H(d,r,R),C(d,r))return m===f?{done:!0}:{value:Object.assign({$ref:"#"+m},P),exitHook:b}}p.set(S,"#"+f);const m={ref:O(x,$),pointer:A(l)},k=yield u(n.value,y,{state:{refNodes:[...o.refNodes,m],baseFile:n.filePath,path:l},rules:e.rules});return{value:g?{}:P,exitHook:()=>{e.state.node[r]=!a(k)||g?k:R(k,e.state.node[r]),b()}}}})),k=yield u(l,y,{state:{refNodes:[{ref:c,pointer:""}],baseFile:c,path:[]},rules:null!==(r=o.rules)&&void 0!==r?r:Pe[b(l)]});return R(k,d)})),e.calcJsonType=b,e.createRef=O,e.dereference=(e,t,s={})=>n(void 0,void 0,void 0,(function*(){const n=m(e),o=new S(n.filePath,t),r=yield o.base(n.pointer);return u(r,Ae(o,s),{state:{refNodes:[{ref:e,pointer:""}],baseFile:n.filePath}})})),e.dereferenceHook=Ae,e.filename=j,e.getValueByPath=C,e.isBasicJsonSchema=x,e.isJsonSchema=P,e.mergeValues=R,e.parsePointer=w,e.parseRef=m,e.relativePath=k,e.setValueByPath=H,e.validURL=y,Object.defineProperty(e,"__esModule",{value:!0}),e}({});
//# sourceMappingURL=index.iife.js.map