UNPKG

api-ref-bundler

Version:

Bundle all external $ref in Json based API document into single document

8 lines (7 loc) 15.2 kB
/*! * allof-merge v0.4.3 * Copyright (C) 2012-2024 Damir Yusipov * Date: Sat, 06 Apr 2024 20:31:19 GMT */ function e(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 t(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 n(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 s(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 o=(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},r=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 r(o)}}else t[s]=n[0][s]}return t},i=e=>"object"==typeof e&&null!==e,a=e=>Array.isArray(e),l=(e,t,l={})=>s(void 0,void 0,void 0,(function*(){var s,c;t=a(t)?t:[t];const u=a(l.rules)?r(l.rules):l.rules,f=[{data:e,state:l.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===(s=e.hooks)||void 0===s?void 0:s.length;)e.hooks.pop()();f.pop();continue}const r=e.keys[e.keyIndex++],[l,d,p]=f.length>1?[e.data[r],[...e.path,r],o(e.rules,r,[...e.path,r],e.data[r])]:[e.data,e.path,u];let h={value:l,path:d,key:r,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:s,done:o,exitHook:r}=t,i=n(t,["terminate","done","exitHook"]);if(s)return;if(h=Object.assign(Object.assign({},h),i),r&&v.push(r),o){h=null;break}}if(h&&i(h.value)){const e=a(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()()}})),c=(e,t=[],n={})=>s(void 0,void 0,void 0,(function*(){t=Array.isArray(t)?t:[t];const o={},r=Object.assign({state:Object.assign(Object.assign({},n.state),{root:o,node:o})},n.rules?{rules:n.rules}:{});return yield l(e,[...t,({value:e,path:t,key:n,state:o})=>s(void 0,void 0,void 0,(function*(){return n=t.length?n:"#",o.node[n]=i(e)?Array.isArray(e)?[]:{}:e,{value:e,state:Object.assign(Object.assign({},o),{node:o.node[n]})}}))],r),o["#"]})),u=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},f=/\//g,d=/~/g,p=/~1/g,h=/~0/g;class v extends Map{add(e,t){const n=this.get(e);return n?n.push(t):this.set(e,[t]),this}}const g=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),y=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":j(e)?"JsonSchema":"unknown":"unknown",b=(e,t="")=>{const[n=t,s]=e.split("#"),o=g(n)?new URL(n).href:O(n,t),r=s&&"/"!==s?s:"";return{filePath:o,pointer:r,normalized:m(o,r)}},m=(e,t)=>e?`${e}${t?"#"+t:""}`:t?`#${t}`:"#",O=(e,t)=>{if(t){if(e){const n=t.split("/");return n[n.length-1]=e,u(n.join("/"))}return u(t)}return u(e)},k=e=>{const t=e.split("/").pop()||"";return null==t?void 0:t.replace(new RegExp(".(json|yaml|yml)$","gi"),"")},j=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),P=e=>e.split("/").map((e=>decodeURIComponent(e.replace(p,"/").replace(h,"~")))).slice(1),w=(e,t="")=>e.length?t+"#"+$(e):t||"#",$=e=>e.length?"/"+e.map((e=>encodeURIComponent(String(e).replace(d,"~0").replace(f,"~1")))).join("/"):"",A=(e,t)=>{if(a(e)&&Array.isArray(t))return a(t)?[...e,...t]:[...e];if(i(e)&&i(t)){const n=Object.assign({},e);for(const e of Object.keys(t))n[e]=A(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},R=(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:R(e[o],t,n,s+1)};class H{constructor(e,t){this.basePath=e,this.resolver=t,this.cache=new Map}base(e=""){return t(this,void 0,void 0,(function*(){const{value:t}=yield this.resolvePointer(e,this.basePath);return t}))}resolve(e){return t(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(n,s="",o){return t(this,void 0,void 0,(function*(){const t=yield this.resolve(null!=s?s:this.basePath);if("string"==typeof t)return{filePath:s,value:t};let r=t;if(i(r)){const t=P(n);for(const n of t)if(Array.isArray(r)&&r.length>+n)r=r[+n];else if(i(r)&&n in r)r=r[n];else{if(!i(r)||!r.$ref)return{filePath:s};{const{$ref:t}=r,o=e(r,["$ref"]),i=b(t,s),a=yield this.resolvePointerRef(i.pointer,i.filePath,o);if(s=a.filePath,!(n in a.value))return{filePath:s};r=a.value[n]}}return r=o?A(r,o):r,{filePath:s,value:r}}return n?{filePath:s}:{filePath:s,value:r}}))}resolverRef(e,n,s){return t(this,void 0,void 0,(function*(){const t=b(e,n);return this.resolvePointer(t.pointer,t.filePath,s)}))}resolvePointerRef(n,s="",o){return t(this,void 0,void 0,(function*(){const t=yield this.resolvePointer(n,s,o);if(i(t.value)&&"$ref"in t.value){const n=t.value,{$ref:s}=n,o=e(n,["$ref"]);return this.resolverRef(s,t.filePath,o)}return t}))}}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)}}),I=E("/definitions"),S="/components/schemas",z="/components/servers",B="/components/serverVariables",N="/components/channels",F="/components/messages",M="/components/securitySchemes",T="/components/correlationIds",U="/components/operationTraits",q="/components/messageTraits",_="/components/serverBindings",J="/components/channelBindings",V="/components/operationBindings",D="/components/messageBindings",L={"/*":{"#":"/components/parameters","/schema":E(S)}},G={"/*":{"#":z,"/variables":{"/*":{"#":B}},"/bindings":{"#":_}}},K={"/*":{"#":U,"/bindings":{"#":V}}},Q={"/*":{"#":q,"/headers":E(S),"/correlationId":{"#":T},"/bindings":{"#":D}}},W={"#":F,"/headers":E(S),"/correlationId":{"#":T},"/traits":Q,"/payload":E(S),"/bindings":{"#":D}},X={"/traits":K,"/message":Object.assign(Object.assign({},W),{"/oneOf":{"/*":W}}),"/bindings":{"#":V}},Y={"/*":{"#":N,"/bindings":{"#":J},"/subscribe":X,"/publish":X,"/parameters":L}},Z={"/servers":G,"/channels":Y,"/components":{"/schemas":{"/*":()=>E(S)},"/servers":G,"/serverVariables":{"/*":{"#":B}},"/channels":Y,"/messages":{"/*":W},"/parameters":L,"/correlationIds":{"/*":{"#":T}},"/operationTraits":K,"/messageTraits":Q,"/securitySchemes":{"/*":{"#":M}},"/serverBindings":{"/*":{"#":_}},"/channelBindings":{"/*":{"#":J}},"/operationBindings":{"/*":{"#":V}},"/messageBindings":{"/*":{"#":D}}}},ee="/components/schemas",te="/components/responses",ne="/components/examples",se="/components/requestBodies",oe="/components/securitySchemes",re="/components/headers",ie="/components/links",ae="/components/callbacks",le={"/*":{"#":ne}},ce={"/*":{"#":"/components/parameters","/schema":E(ee),"/example":{"#":ne},"/examples":le}},ue={"/*":{"#":re,"/schema":E(ee),"/example":{"#":ne},"/examples":le}},fe={"/*":{"/schema":E(ee),"/example":{"#":ne},"/examples":le,"/encoding":{"/headers":ue}}},de={"#":se,"/content":fe},pe={"/*":{"#":ae}},he={"/*":{"#":ie}},ve={"/*":{"#":te,"/headers":ue,"/content":fe,"/links":he}},ge={"/paths":{"/*":{"/*":{"/parameters":ce,"/requestBody":de,"/responses":ve,"/callbacks":pe},"/parameters":ce}},"/components":{"/schemas":{"/*":E(ee)},"/responses":ve,"/parameters":ce,"/examples":le,"/requestBodies":{"/*":de},"/securitySchemes":{"/*":{"#":oe}},"/headers":ue,"/links":he,"/callbacks":pe}},ye="/definitions",be="/responses",me="/parameters",Oe={"/*":Object.assign(Object.assign({},E(ye)),{"#":me,"/schema":E(ye)})},ke={"/*":{"#":be,"/*":{"/schema":E(ye),"/headers":Oe}}},je={OpenApi3:ge,OpenApi2:{"/paths":{"/*":{"/*":{"/parameters":Oe,"/responses":ke},"/parameters":Oe}},"/definitions":{"/*":E(ye)},"/responses":ke,"/parameters":Oe},AsyncApi2:Z,JsonSchema:I,unknown:{}},xe=(n,s,o={})=>t(void 0,void 0,void 0,(function*(){var r;const a=new H(n,s),l=yield a.base(),f=m(u(n)),d={},p=new Map,h=new Map,{hooks:v,ignoreSibling:g}=o,O=n=>t(void 0,void 0,void 0,(function*(){const{value:t,path:s,state:o}=n;(null==v?void 0:v.onCrawl)&&(null==v||v.onCrawl(t,n));const r=s.length?n.key:"#",l=[...o.path,...s],u=$(l);if(h.has(u)){if(h.get(u))return{done:!0};h.set(u,!0)}if(!i(t)||!t.hasOwnProperty("$ref")||"string"!=typeof t.$ref)return;const y=()=>{(null==v?void 0:v.onExit)&&v.onExit(n.state.node[r],n)},{$ref:j}=t,x=e(t,["$ref"]),{filePath:w,pointer:H,normalized:E}=b(j,o.baseFile);if((null==v?void 0:v.onRef)&&v.onRef(E,n),w===f)return{value:Object.assign({$ref:m("",H)},x),exitHook:y};if(p.has(E))return{value:Object.assign({$ref:p.get(E)},x),exitHook:y};if(p.has(w)&&!/\/(definitions|defs)/g.test(H))return{value:Object.assign({$ref:p.get(w)+H},x),exitHook:y};{const t=yield a.resolvePointer(H,w);if(!t.value)return(null==v?void 0:v.onError)&&v.onError(`Cannot resolve: ${E}`,n),{value:{$ref:E},exitHook:y};if("string"==typeof t.value)return{value:t.value,exitHook:y};const s=n.rules&&"#"in n.rules?n.rules["#"]:void 0;if(s){const r=P(s),l=e(t.value,["$defs","definitions"]),v=C(d,r)||{};let g=v&&we(v,E,f);if(!g){const e=yield a.resolvePointerRef(s,f);if(g=we(e.value||{},E,e.filePath),!g){const n=l.$id||l.id||k(H||t.filePath);g=Pe(Object.assign(Object.assign({},e.value),v),n)}}if(p.has(E))return{value:Object.assign({$ref:p.get(E)},x),exitHook:y};r.push(g);const b=$(r);p.set(E,"#"+b),h.set(b,!1);const j={ref:m(w,H),pointer:b},A=yield c(l,O,{state:{baseFile:t.filePath,path:r,refNodes:[...o.refNodes,j],defPrefix:g+"-"},rules:n.rules});if(i(A)&&R(d,r,A),C(d,r))return b===u?{done:!0}:{value:Object.assign({$ref:"#"+b},x),exitHook:y}}p.set(E,"#"+u);const b={ref:m(w,H),pointer:$(l)},j=yield c(t.value,O,{state:{refNodes:[...o.refNodes,b],baseFile:t.filePath,path:l},rules:n.rules});return{value:g?{}:x,exitHook:()=>{n.state.node[r]=!i(j)||g?j:A(j,n.state.node[r]),y()}}}})),j=yield c(l,O,{state:{refNodes:[{ref:f,pointer:""}],baseFile:f,path:[]},rules:null!==(r=o.rules)&&void 0!==r?r:je[y(l)]});return A(j,d)})),Pe=(e,t,n=0)=>{const s=n?t+n:t;return e&&e[s]?Pe(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===b(o.$ref,n).normalized)return s}},$e=Symbol("cycleRef"),Ae=(n,s={})=>{const{ignoreSibling:o,enableCircular:r,fullCrawl:a,hooks:l}=s,c=new Map,u=new v,f=s=>t(void 0,void 0,void 0,(function*(){const{value:t,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),i(v[h])&&(c.set(w(d,p.baseFile),v[h]),r)){const e=u.get($(d));if(!e)return;for(const t of e){const e=C(g["#"],t);if(e&&e[$e])continue;const n=e?A(v[h],e):v[h];n[$e]=w(d),R(g["#"],t,n)}}};if(!i(t)||!t.hasOwnProperty("$ref")||"string"!=typeof t.$ref)return(null==l?void 0:l.onCrawl)&&l.onCrawl(t,s),{value:t,state:p,exitHook:y};const{$ref:m}=t,O=e(t,["$ref"]),k=!Object.keys(O).length||o?null:O,{filePath:j,pointer:x,normalized:P}=b(m,p.baseFile);(null==l?void 0:l.onRef)&&l.onRef(P,s);const H=p.refNodes.find(((e,t,n)=>{var s;if(P!==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(H){let e;return(null==l?void 0:l.onCycle)&&l.onCycle(H.pointer,s),r?(u.add(H.pointer,d),e=k||null):e=Object.assign({$ref:"#"+H.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(P)){const e=c.get(P),t=i(e)&&k?A(e,k):e;return(null==l?void 0:l.onCrawl)&&l.onCrawl(t,s),a?{value:t,state:p,exitHook:y}:{value:k,state:p,exitHook:()=>{v[h]=i(e)&&k?A(e,v[h]):e,y()}}}{const e=yield n.resolvePointer(x,j);if(!e.value)return(null==l?void 0:l.onError)&&l.onError(`Cannot resolve: ${P}`,s),{value:Object.assign({$ref:P},k),state:p};const t=i(e.value)?k?A(e.value,k):Object.assign({},e.value):e.value,o=Object.assign(Object.assign({},p),{refNodes:[...p.refNodes,{ref:P,pointer:$(d),sibling:k}],baseFile:e.filePath}),r=yield f(Object.assign(Object.assign({},s),{value:t,state:o}));return Object.assign(Object.assign({value:t},r),{exitHook:()=>{!k&&i(v[h])&&c.set(P,v[h]),(null==r?void 0:r.exitHook)&&r.exitHook()}})}}));return f},Ce=(e,n,s={})=>t(void 0,void 0,void 0,(function*(){const t=b(e),o=new H(t.filePath,n),r=yield o.base(t.pointer);return c(r,Ae(o,s),{state:{refNodes:[{ref:e,pointer:""}],baseFile:t.filePath}})}));export{v as MapArray,H as RefResolver,$ as buildPointer,w as buildRef,xe as bundle,y as calcJsonType,m as createRef,Ce as dereference,Ae as dereferenceHook,k as filename,C as getValueByPath,x as isBasicJsonSchema,j as isJsonSchema,A as mergeValues,P as parsePointer,b as parseRef,O as relativePath,R as setValueByPath,g as validURL}; //# sourceMappingURL=index.mjs.map