@visulima/api-platform 3.0.1 → 3.0.3

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.
Files changed (38) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/dist/chunk-DY57MKPR.js +27 -0
  3. package/dist/chunk-DY57MKPR.js.map +1 -0
  4. package/dist/{chunk-BYMOIJWB.js → chunk-IAHCIZME.js} +3 -4
  5. package/dist/chunk-IAHCIZME.js.map +1 -0
  6. package/dist/{chunk-4CYX3UMQ.mjs → chunk-IRBDVWUD.mjs} +3 -3
  7. package/dist/chunk-IRBDVWUD.mjs.map +1 -0
  8. package/dist/chunk-LTJU3JVK.mjs +19 -0
  9. package/dist/chunk-LTJU3JVK.mjs.map +1 -0
  10. package/dist/framework/cli/commander/index.js +2 -2
  11. package/dist/framework/cli/commander/index.mjs +1 -1
  12. package/dist/framework/cli/index.js +3 -3
  13. package/dist/framework/cli/index.mjs +1 -1
  14. package/dist/framework/next/index-browser.js +1 -1
  15. package/dist/framework/next/index-server.d.mts +1 -1
  16. package/dist/framework/next/index-server.d.ts +1 -1
  17. package/dist/framework/next/index-server.js +4 -5
  18. package/dist/framework/next/index-server.js.map +1 -1
  19. package/dist/framework/next/index-server.mjs +3 -3
  20. package/dist/framework/next/index-server.mjs.map +1 -1
  21. package/dist/index-browser.d.mts +1 -1
  22. package/dist/index-browser.d.ts +1 -1
  23. package/dist/index-browser.js +1 -1
  24. package/dist/index-server.d.mts +2 -2
  25. package/dist/index-server.d.ts +2 -2
  26. package/dist/index-server.js +57 -57
  27. package/dist/index-server.mjs +2 -2
  28. package/package.json +16 -16
  29. package/dist/chunk-4CYX3UMQ.mjs.map +0 -1
  30. package/dist/chunk-BYMOIJWB.js.map +0 -1
  31. package/dist/chunk-IWQGMV5V.js +0 -28
  32. package/dist/chunk-IWQGMV5V.js.map +0 -1
  33. package/dist/chunk-LZNF7WWH.mjs +0 -20
  34. package/dist/chunk-LZNF7WWH.mjs.map +0 -1
  35. /package/dist/{index-browser-siaokSlR.d.mts → index-browser-4YWjgmTg.d.mts} +0 -0
  36. /package/dist/{index-browser-siaokSlR.d.ts → index-browser-4YWjgmTg.d.ts} +0 -0
  37. /package/dist/{swagger-handler-RUaF1sKn.d.mts → swagger-handler-CsN63rqo.d.mts} +0 -0
  38. /package/dist/{swagger-handler-RUaF1sKn.d.ts → swagger-handler-CsN63rqo.d.ts} +0 -0
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkUPRO35MO_js = require('./chunk-UPRO35MO.js');
4
- var chunkBYMOIJWB_js = require('./chunk-BYMOIJWB.js');
4
+ var chunkIAHCIZME_js = require('./chunk-IAHCIZME.js');
5
5
  require('./chunk-4C666HHU.js');
6
6
  var connect = require('@visulima/connect');
7
7
  var q = require('http-errors');
@@ -20,217 +20,217 @@ var ee__default = /*#__PURE__*/_interopDefault(ee);
20
20
  var Q__default = /*#__PURE__*/_interopDefault(Q);
21
21
  var ie__default = /*#__PURE__*/_interopDefault(ie);
22
22
 
23
- var u=(e,o)=>{let t=o.headers??{};Object.keys(t).forEach(r=>{e.setHeader(r,t[r]);});},l=(e,o)=>{e.setHeader("content-type","application/json; charset=utf-8"),e.end(JSON.stringify(o));},R=(e,o)=>{o.statusCode!==void 0&&(e.statusCode=o.statusCode),o.status!==void 0&&(e.statusCode=o.status),e.statusCode<400&&(e.statusCode=httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR);};var z="An error occurred",U=(e,o,t)=>{if(R(t,e),u(t,e),e instanceof x__default.default.JapiError||x__default.default.JapiError.isLikeJapiError(e)){let r=new x__default.default.ErrorSerializer;l(t,r.serialize(e));}else if(e instanceof q.HttpError){let{message:r,statusCode:n,title:a}=e;l(t,{errors:[{code:n,title:a||httpStatusCodes.getReasonPhrase(n)||z,detail:r}]});}else {let{message:r}=e;l(t,{errors:[{code:"500",title:httpStatusCodes.getReasonPhrase(t.statusCode)||z,detail:r}]});}},T=U;var M="https://tools.ietf.org/html/rfc2616#section-10",C="An error occurred",F=(e,o,t)=>{let{message:r,stack:n}=e;if(e instanceof q.HttpError){let{expose:a,statusCode:s,title:i,type:d}=e;t.statusCode=s,u(t,e),l(t,{type:d||M,title:i||httpStatusCodes.getReasonPhrase(s)||C,details:r,...a?{trace:n}:{}});}else R(t,e),l(t,{type:M,title:httpStatusCodes.getReasonPhrase(t.statusCode)||C,details:r,...e.expose?{trace:n}:{}});},I=F;var h=(e,o)=>async(t,r,n)=>{let a=r.headers.accept,s=I;a==="application/vnd.api+json"&&(s=T);for(let{handler:i,regex:d}of e)if(d.test(a)){s=i;break}t.expose=o,s(t,r,n);},H=async(e,o,t)=>{let r=[...new Set(t.map(n=>n.method))].join(", ");throw o.setHeader("Allow",r),o.statusCode=405,q__default.default(405,`No route with [${e.method}] method found.`)};var O={alpn:"ALPN","c-pep":"C-PEP","c-pep-info":"C-PEP-Info","caldav-timezones":"CalDAV-Timezones","content-id":"Content-ID","content-md5":"Content-MD5",dasl:"DASL",dav:"DAV",dnt:"DNT",etag:"ETag",getprofile:"GetProfile","http2-settings":"HTTP2-Settings","last-event-id":"Last-Event-ID","mime-version":"MIME-Version","optional-www-authenticate":"Optional-WWW-Authenticate","sec-webSocket-key":"Sec-WebSocket-Key","sec-webSocket-protocol":"Sec-WebSocket-Protocol","sec-webSocket-version":"Sec-WebSocket-Version","sec-websocket-accept":"Sec-WebSocket-Accept","sec-websocket-extensions":"Sec-WebSocket-Extensions",slug:"SLUG",tcn:"TCN",te:"TE",ttl:"TTL","www-authenticate":"WWW-Authenticate","x-att-deviceid":"X-ATT-DeviceId","x-dnsprefetch-control":"X-DNSPrefetch-Control","x-uidh":"X-UIDH"},K=(e,o)=>{let t=e.toLowerCase();return o?O[t]?O[t]:t.split("-").map(r=>r[0]?.toUpperCase()+r.slice(1)).join("-"):t},Z={canonical:!1,normalizeHeaderKey:K},B=e=>{let o={...Z,...e};return async(t,r,n)=>{let a={},s={};return Object.keys(t.headers).forEach(i=>{a[i]=t.headers[i];let d=o.normalizeHeaderKey(i,o.canonical);d&&(s[d]=t.headers[i]);}),t.headers=s,t.rawHeaders=a,n()}},S=B;var G=e=>{if(typeof e!="string")return !1;try{let o=JSON.parse(e),t=Object.prototype.toString.call(o);return t==="[object Object]"||t==="[object Array]"}catch{return !1}},E=G;var $=e=>jstoxml.toXML(e,{header:!0,indent:" "}),y=$;var g="Content-Type",Y=(e,o,t,r,n)=>{if(typeof t.getHeader(g)=="string")return r;let i=[...Q__default.default(o).types(),n.defaultContentType],d=r,N=!1;return i.forEach(c=>{e.forEach(({regex:P,serializer:k})=>{P.test(c)&&(t.setHeader(g,c),d=k(d),N=!0);}),N||(/yaml|yml/.test(c)?(t.setHeader(g,c),d=chunkBYMOIJWB_js.b(E(r)?JSON.parse(r):r)):c.includes("xml")&&(t.setHeader(g,c),d=y({[chunkBYMOIJWB_js.a(`${o.url?.replace("/api/","")}`.trim())]:E(r)?JSON.parse(r):r})));}),d},m=Y;var te=ee__default.default("api-platform:connect:serializers-middleware"),re=(e=[],o="application/json; charset=utf-8")=>async(t,r,n)=>{if(typeof r.send=="function"){let a=r.send;r.send=s=>{r.send=a,s=m(e,t,r,s,{defaultContentType:o}),r.send(s);};}else if(typeof r.json=="function")te("response.json() is not supported by @visulima/api-platform serializer. Use response.send() or response.end() instead.");else {let a=r.end;r.end=(s,...i)=>(r.end=a,s=m(e,t,r,s,{defaultContentType:o}),r.end(s,...i));}return n()},w=re;var se=(e={})=>new connect.NodeRouter({onError:h(e.errorHandlers??[],e.showTrace??!1),onNoMatch:H}).use(S(e.middlewares?.["http-header-normalizer"]??{})).use(w(e.middlewares?.serializers?.serializers??[],e.middlewares?.serializers?.defaultContentType??"application/json; charset=utf-8")),ne=se;var de=e=>connect.expressWrapper(ie__default.default(e)),pe=de;var le=e=>e.ip??e.headers["x-forwarded-for"]??e.headers["x-real-ip"]??e.socket.remoteAddress,ce=(e,o)=>async(t,r,n)=>{let a=le(t);if(a===void 0)throw q__default.default(400,"Missing IP");try{let s=await e.consume(a),i={"Retry-After":Math.round(s.msBeforeNext/1e3)||1,"X-RateLimit-Remaining":s.remainingPoints,"X-RateLimit-Reset":new Date(Date.now()+s.msBeforeNext).toISOString(),...o};Object.keys(i).forEach(d=>{r.setHeader(d,i[d]);}),await n();}catch{throw q__default.default(429,"Too Many Requests")}},me=ce;
23
+ var u=(e,o)=>{let t=o.headers??{};Object.keys(t).forEach(r=>{e.setHeader(r,t[r]);});},l=(e,o)=>{e.setHeader("content-type","application/json; charset=utf-8"),e.end(JSON.stringify(o));},R=(e,o)=>{o.statusCode!==void 0&&(e.statusCode=o.statusCode),o.status!==void 0&&(e.statusCode=o.status),e.statusCode<400&&(e.statusCode=httpStatusCodes.StatusCodes.INTERNAL_SERVER_ERROR);};var z="An error occurred",U=(e,o,t)=>{if(R(t,e),u(t,e),e instanceof x__default.default.JapiError||x__default.default.JapiError.isLikeJapiError(e)){let r=new x__default.default.ErrorSerializer;l(t,r.serialize(e));}else if(e instanceof q.HttpError){let{message:r,statusCode:n,title:a}=e;l(t,{errors:[{code:n,title:a||httpStatusCodes.getReasonPhrase(n)||z,detail:r}]});}else {let{message:r}=e;l(t,{errors:[{code:"500",title:httpStatusCodes.getReasonPhrase(t.statusCode)||z,detail:r}]});}},T=U;var M="https://tools.ietf.org/html/rfc2616#section-10",C="An error occurred",F=(e,o,t)=>{let{message:r,stack:n}=e;if(e instanceof q.HttpError){let{expose:a,statusCode:s,title:i,type:d}=e;t.statusCode=s,u(t,e),l(t,{type:d||M,title:i||httpStatusCodes.getReasonPhrase(s)||C,details:r,...a?{trace:n}:{}});}else R(t,e),l(t,{type:M,title:httpStatusCodes.getReasonPhrase(t.statusCode)||C,details:r,...e.expose?{trace:n}:{}});},I=F;var h=(e,o)=>async(t,r,n)=>{let a=r.headers.accept,s=I;a==="application/vnd.api+json"&&(s=T);for(let{handler:i,regex:d}of e)if(d.test(a)){s=i;break}t.expose=o,s(t,r,n);},H=async(e,o,t)=>{let r=[...new Set(t.map(n=>n.method))].join(", ");throw o.setHeader("Allow",r),o.statusCode=405,q__default.default(405,`No route with [${e.method}] method found.`)};var O={alpn:"ALPN","c-pep":"C-PEP","c-pep-info":"C-PEP-Info","caldav-timezones":"CalDAV-Timezones","content-id":"Content-ID","content-md5":"Content-MD5",dasl:"DASL",dav:"DAV",dnt:"DNT",etag:"ETag",getprofile:"GetProfile","http2-settings":"HTTP2-Settings","last-event-id":"Last-Event-ID","mime-version":"MIME-Version","optional-www-authenticate":"Optional-WWW-Authenticate","sec-webSocket-key":"Sec-WebSocket-Key","sec-webSocket-protocol":"Sec-WebSocket-Protocol","sec-webSocket-version":"Sec-WebSocket-Version","sec-websocket-accept":"Sec-WebSocket-Accept","sec-websocket-extensions":"Sec-WebSocket-Extensions",slug:"SLUG",tcn:"TCN",te:"TE",ttl:"TTL","www-authenticate":"WWW-Authenticate","x-att-deviceid":"X-ATT-DeviceId","x-dnsprefetch-control":"X-DNSPrefetch-Control","x-uidh":"X-UIDH"},K=(e,o)=>{let t=e.toLowerCase();return o?O[t]?O[t]:t.split("-").map(r=>r[0]?.toUpperCase()+r.slice(1)).join("-"):t},Z={canonical:!1,normalizeHeaderKey:K},B=e=>{let o={...Z,...e};return async(t,r,n)=>{let a={},s={};return Object.keys(t.headers).forEach(i=>{a[i]=t.headers[i];let d=o.normalizeHeaderKey(i,o.canonical);d&&(s[d]=t.headers[i]);}),t.headers=s,t.rawHeaders=a,n()}},S=B;var G=e=>{if(typeof e!="string")return !1;try{let o=JSON.parse(e),t=Object.prototype.toString.call(o);return t==="[object Object]"||t==="[object Array]"}catch{return !1}},E=G;var $=e=>jstoxml.toXML(e,{header:!0,indent:" "}),y=$;var g="Content-Type",Y=(e,o,t,r,n)=>{if(typeof t.getHeader(g)=="string")return r;let i=[...Q__default.default(o).types(),n.defaultContentType],d=r,N=!1;return i.forEach(c=>{e.forEach(({regex:P,serializer:k})=>{P.test(c)&&(t.setHeader(g,c),d=k(d),N=!0);}),N||(/yaml|yml/.test(c)?(t.setHeader(g,c),d=chunkIAHCIZME_js.b(E(r)?JSON.parse(r):r)):c.includes("xml")&&(t.setHeader(g,c),d=y({[chunkIAHCIZME_js.a(`${o.url?.replace("/api/","")}`.trim())]:E(r)?JSON.parse(r):r})));}),d},m=Y;var te=ee__default.default("api-platform:connect:serializers-middleware"),re=(e=[],o="application/json; charset=utf-8")=>async(t,r,n)=>{if(typeof r.send=="function"){let a=r.send;r.send=s=>{r.send=a,s=m(e,t,r,s,{defaultContentType:o}),r.send(s);};}else if(typeof r.json=="function")te("response.json() is not supported by @visulima/api-platform serializer. Use response.send() or response.end() instead.");else {let a=r.end;r.end=(s,...i)=>(r.end=a,s=m(e,t,r,s,{defaultContentType:o}),r.end(s,...i));}return n()},w=re;var se=(e={})=>new connect.NodeRouter({onError:h(e.errorHandlers??[],e.showTrace??!1),onNoMatch:H}).use(S(e.middlewares?.["http-header-normalizer"]??{})).use(w(e.middlewares?.serializers?.serializers??[],e.middlewares?.serializers?.defaultContentType??"application/json; charset=utf-8")),ne=se;var de=e=>connect.expressWrapper(ie__default.default(e)),pe=de;var le=e=>e.ip??e.headers["x-forwarded-for"]??e.headers["x-real-ip"]??e.socket.remoteAddress,ce=(e,o)=>async(t,r,n)=>{let a=le(t);if(a===void 0)throw q__default.default(400,"Missing IP");try{let s=await e.consume(a),i={"Retry-After":Math.round(s.msBeforeNext/1e3)||1,"X-RateLimit-Remaining":s.remainingPoints,"X-RateLimit-Reset":new Date(Date.now()+s.msBeforeNext).toISOString(),...o};Object.keys(i).forEach(d=>{r.setHeader(d,i[d]);}),await n();}catch{throw q__default.default(429,"Too Many Requests")}},me=ce;
24
24
 
25
- Object.defineProperty(exports, 'dateIn', {
25
+ Object.defineProperty(exports, "dateIn", {
26
26
  enumerable: true,
27
27
  get: function () { return chunkUPRO35MO_js.a; }
28
28
  });
29
- Object.defineProperty(exports, 'dateOut', {
29
+ Object.defineProperty(exports, "dateOut", {
30
30
  enumerable: true,
31
31
  get: function () { return chunkUPRO35MO_js.b; }
32
32
  });
33
- Object.defineProperty(exports, 'zod', {
33
+ Object.defineProperty(exports, "zod", {
34
34
  enumerable: true,
35
35
  get: function () { return chunkUPRO35MO_js.c; }
36
36
  });
37
- Object.defineProperty(exports, 'swaggerHandler', {
37
+ Object.defineProperty(exports, "swaggerHandler", {
38
38
  enumerable: true,
39
- get: function () { return chunkBYMOIJWB_js.c; }
39
+ get: function () { return chunkIAHCIZME_js.c; }
40
40
  });
41
- Object.defineProperty(exports, 'yamlTransformer', {
41
+ Object.defineProperty(exports, "yamlTransformer", {
42
42
  enumerable: true,
43
- get: function () { return chunkBYMOIJWB_js.b; }
43
+ get: function () { return chunkIAHCIZME_js.b; }
44
44
  });
45
- Object.defineProperty(exports, 'EdgeRouter', {
45
+ Object.defineProperty(exports, "EdgeRouter", {
46
46
  enumerable: true,
47
47
  get: function () { return connect.EdgeRouter; }
48
48
  });
49
- Object.defineProperty(exports, 'NodeRouter', {
49
+ Object.defineProperty(exports, "NodeRouter", {
50
50
  enumerable: true,
51
51
  get: function () { return connect.NodeRouter; }
52
52
  });
53
- Object.defineProperty(exports, 'Router', {
53
+ Object.defineProperty(exports, "Router", {
54
54
  enumerable: true,
55
55
  get: function () { return connect.Router; }
56
56
  });
57
- Object.defineProperty(exports, 'createEdgeRouter', {
57
+ Object.defineProperty(exports, "createEdgeRouter", {
58
58
  enumerable: true,
59
59
  get: function () { return connect.createEdgeRouter; }
60
60
  });
61
- Object.defineProperty(exports, 'expressWrapper', {
61
+ Object.defineProperty(exports, "expressWrapper", {
62
62
  enumerable: true,
63
63
  get: function () { return connect.expressWrapper; }
64
64
  });
65
- Object.defineProperty(exports, 'sendJson', {
65
+ Object.defineProperty(exports, "sendJson", {
66
66
  enumerable: true,
67
67
  get: function () { return connect.sendJson; }
68
68
  });
69
- Object.defineProperty(exports, 'withZod', {
69
+ Object.defineProperty(exports, "withZod", {
70
70
  enumerable: true,
71
71
  get: function () { return connect.withZod; }
72
72
  });
73
- Object.defineProperty(exports, 'BadGateway', {
73
+ Object.defineProperty(exports, "BadGateway", {
74
74
  enumerable: true,
75
75
  get: function () { return q.BadGateway; }
76
76
  });
77
- Object.defineProperty(exports, 'BadRequest', {
77
+ Object.defineProperty(exports, "BadRequest", {
78
78
  enumerable: true,
79
79
  get: function () { return q.BadRequest; }
80
80
  });
81
- Object.defineProperty(exports, 'BandwidthLimitExceeded', {
81
+ Object.defineProperty(exports, "BandwidthLimitExceeded", {
82
82
  enumerable: true,
83
83
  get: function () { return q.BandwidthLimitExceeded; }
84
84
  });
85
- Object.defineProperty(exports, 'Conflict', {
85
+ Object.defineProperty(exports, "Conflict", {
86
86
  enumerable: true,
87
87
  get: function () { return q.Conflict; }
88
88
  });
89
- Object.defineProperty(exports, 'ExpectationFailed', {
89
+ Object.defineProperty(exports, "ExpectationFailed", {
90
90
  enumerable: true,
91
91
  get: function () { return q.ExpectationFailed; }
92
92
  });
93
- Object.defineProperty(exports, 'FailedDependency', {
93
+ Object.defineProperty(exports, "FailedDependency", {
94
94
  enumerable: true,
95
95
  get: function () { return q.FailedDependency; }
96
96
  });
97
- Object.defineProperty(exports, 'Forbidden', {
97
+ Object.defineProperty(exports, "Forbidden", {
98
98
  enumerable: true,
99
99
  get: function () { return q.Forbidden; }
100
100
  });
101
- Object.defineProperty(exports, 'GatewayTimeout', {
101
+ Object.defineProperty(exports, "GatewayTimeout", {
102
102
  enumerable: true,
103
103
  get: function () { return q.GatewayTimeout; }
104
104
  });
105
- Object.defineProperty(exports, 'Gone', {
105
+ Object.defineProperty(exports, "Gone", {
106
106
  enumerable: true,
107
107
  get: function () { return q.Gone; }
108
108
  });
109
- Object.defineProperty(exports, 'HTTPVersionNotSupported', {
109
+ Object.defineProperty(exports, "HTTPVersionNotSupported", {
110
110
  enumerable: true,
111
111
  get: function () { return q.HTTPVersionNotSupported; }
112
112
  });
113
- Object.defineProperty(exports, 'ImATeapot', {
113
+ Object.defineProperty(exports, "ImATeapot", {
114
114
  enumerable: true,
115
115
  get: function () { return q.ImATeapot; }
116
116
  });
117
- Object.defineProperty(exports, 'InsufficientStorage', {
117
+ Object.defineProperty(exports, "InsufficientStorage", {
118
118
  enumerable: true,
119
119
  get: function () { return q.InsufficientStorage; }
120
120
  });
121
- Object.defineProperty(exports, 'InternalServerError', {
121
+ Object.defineProperty(exports, "InternalServerError", {
122
122
  enumerable: true,
123
123
  get: function () { return q.InternalServerError; }
124
124
  });
125
- Object.defineProperty(exports, 'LengthRequired', {
125
+ Object.defineProperty(exports, "LengthRequired", {
126
126
  enumerable: true,
127
127
  get: function () { return q.LengthRequired; }
128
128
  });
129
- Object.defineProperty(exports, 'Locked', {
129
+ Object.defineProperty(exports, "Locked", {
130
130
  enumerable: true,
131
131
  get: function () { return q.Locked; }
132
132
  });
133
- Object.defineProperty(exports, 'LoopDetected', {
133
+ Object.defineProperty(exports, "LoopDetected", {
134
134
  enumerable: true,
135
135
  get: function () { return q.LoopDetected; }
136
136
  });
137
- Object.defineProperty(exports, 'MethodNotAllowed', {
137
+ Object.defineProperty(exports, "MethodNotAllowed", {
138
138
  enumerable: true,
139
139
  get: function () { return q.MethodNotAllowed; }
140
140
  });
141
- Object.defineProperty(exports, 'MisdirectedRequest', {
141
+ Object.defineProperty(exports, "MisdirectedRequest", {
142
142
  enumerable: true,
143
143
  get: function () { return q.MisdirectedRequest; }
144
144
  });
145
- Object.defineProperty(exports, 'NetworkAuthenticationRequire', {
145
+ Object.defineProperty(exports, "NetworkAuthenticationRequire", {
146
146
  enumerable: true,
147
147
  get: function () { return q.NetworkAuthenticationRequire; }
148
148
  });
149
- Object.defineProperty(exports, 'NotAcceptable', {
149
+ Object.defineProperty(exports, "NotAcceptable", {
150
150
  enumerable: true,
151
151
  get: function () { return q.NotAcceptable; }
152
152
  });
153
- Object.defineProperty(exports, 'NotExtended', {
153
+ Object.defineProperty(exports, "NotExtended", {
154
154
  enumerable: true,
155
155
  get: function () { return q.NotExtended; }
156
156
  });
157
- Object.defineProperty(exports, 'NotFound', {
157
+ Object.defineProperty(exports, "NotFound", {
158
158
  enumerable: true,
159
159
  get: function () { return q.NotFound; }
160
160
  });
161
- Object.defineProperty(exports, 'NotImplemented', {
161
+ Object.defineProperty(exports, "NotImplemented", {
162
162
  enumerable: true,
163
163
  get: function () { return q.NotImplemented; }
164
164
  });
165
- Object.defineProperty(exports, 'PayloadTooLarge', {
165
+ Object.defineProperty(exports, "PayloadTooLarge", {
166
166
  enumerable: true,
167
167
  get: function () { return q.PayloadTooLarge; }
168
168
  });
169
- Object.defineProperty(exports, 'PaymentRequired', {
169
+ Object.defineProperty(exports, "PaymentRequired", {
170
170
  enumerable: true,
171
171
  get: function () { return q.PaymentRequired; }
172
172
  });
173
- Object.defineProperty(exports, 'PreconditionFailed', {
173
+ Object.defineProperty(exports, "PreconditionFailed", {
174
174
  enumerable: true,
175
175
  get: function () { return q.PreconditionFailed; }
176
176
  });
177
- Object.defineProperty(exports, 'PreconditionRequired', {
177
+ Object.defineProperty(exports, "PreconditionRequired", {
178
178
  enumerable: true,
179
179
  get: function () { return q.PreconditionRequired; }
180
180
  });
181
- Object.defineProperty(exports, 'ProxyAuthenticationRequired', {
181
+ Object.defineProperty(exports, "ProxyAuthenticationRequired", {
182
182
  enumerable: true,
183
183
  get: function () { return q.ProxyAuthenticationRequired; }
184
184
  });
185
- Object.defineProperty(exports, 'RangeNotSatisfiable', {
185
+ Object.defineProperty(exports, "RangeNotSatisfiable", {
186
186
  enumerable: true,
187
187
  get: function () { return q.RangeNotSatisfiable; }
188
188
  });
189
- Object.defineProperty(exports, 'RequestHeaderFieldsTooLarge', {
189
+ Object.defineProperty(exports, "RequestHeaderFieldsTooLarge", {
190
190
  enumerable: true,
191
191
  get: function () { return q.RequestHeaderFieldsTooLarge; }
192
192
  });
193
- Object.defineProperty(exports, 'RequestTimeout', {
193
+ Object.defineProperty(exports, "RequestTimeout", {
194
194
  enumerable: true,
195
195
  get: function () { return q.RequestTimeout; }
196
196
  });
197
- Object.defineProperty(exports, 'ServiceUnavailable', {
197
+ Object.defineProperty(exports, "ServiceUnavailable", {
198
198
  enumerable: true,
199
199
  get: function () { return q.ServiceUnavailable; }
200
200
  });
201
- Object.defineProperty(exports, 'TooManyRequests', {
201
+ Object.defineProperty(exports, "TooManyRequests", {
202
202
  enumerable: true,
203
203
  get: function () { return q.TooManyRequests; }
204
204
  });
205
- Object.defineProperty(exports, 'URITooLong', {
205
+ Object.defineProperty(exports, "URITooLong", {
206
206
  enumerable: true,
207
207
  get: function () { return q.URITooLong; }
208
208
  });
209
- Object.defineProperty(exports, 'Unauthorized', {
209
+ Object.defineProperty(exports, "Unauthorized", {
210
210
  enumerable: true,
211
211
  get: function () { return q.Unauthorized; }
212
212
  });
213
- Object.defineProperty(exports, 'UnavailableForLegalReasons', {
213
+ Object.defineProperty(exports, "UnavailableForLegalReasons", {
214
214
  enumerable: true,
215
215
  get: function () { return q.UnavailableForLegalReasons; }
216
216
  });
217
- Object.defineProperty(exports, 'UnprocessableEntity', {
217
+ Object.defineProperty(exports, "UnprocessableEntity", {
218
218
  enumerable: true,
219
219
  get: function () { return q.UnprocessableEntity; }
220
220
  });
221
- Object.defineProperty(exports, 'UnsupportedMediaType', {
221
+ Object.defineProperty(exports, "UnsupportedMediaType", {
222
222
  enumerable: true,
223
223
  get: function () { return q.UnsupportedMediaType; }
224
224
  });
225
- Object.defineProperty(exports, 'UpgradeRequired', {
225
+ Object.defineProperty(exports, "UpgradeRequired", {
226
226
  enumerable: true,
227
227
  get: function () { return q.UpgradeRequired; }
228
228
  });
229
- Object.defineProperty(exports, 'VariantAlsoNegotiates', {
229
+ Object.defineProperty(exports, "VariantAlsoNegotiates", {
230
230
  enumerable: true,
231
231
  get: function () { return q.VariantAlsoNegotiates; }
232
232
  });
233
- Object.defineProperty(exports, 'createHttpError', {
233
+ Object.defineProperty(exports, "createHttpError", {
234
234
  enumerable: true,
235
235
  get: function () { return q__default.default; }
236
236
  });
@@ -1,6 +1,6 @@
1
1
  export { a as dateIn, b as dateOut, c as zod } from './chunk-66EUOAFS.mjs';
2
- import { b, a } from './chunk-4CYX3UMQ.mjs';
3
- export { c as swaggerHandler, b as yamlTransformer } from './chunk-4CYX3UMQ.mjs';
2
+ import { b, a } from './chunk-IRBDVWUD.mjs';
3
+ export { c as swaggerHandler, b as yamlTransformer } from './chunk-IRBDVWUD.mjs';
4
4
  import './chunk-HZWWJL43.mjs';
5
5
  import { NodeRouter, expressWrapper } from '@visulima/connect';
6
6
  export { EdgeRouter, NodeRouter, Router, createEdgeRouter, expressWrapper, sendJson, withZod } from '@visulima/connect';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@visulima/api-platform",
3
- "version": "3.0.1",
3
+ "version": "3.0.3",
4
4
  "description": "Visulima API platform is a set of tools to build and consume web APIs",
5
5
  "keywords": [
6
6
  "anolilab",
@@ -125,18 +125,18 @@
125
125
  "LICENSE.md"
126
126
  ],
127
127
  "dependencies": {
128
- "@visulima/connect": "3.0.10",
129
- "@visulima/jsdoc-open-api": "2.0.43",
128
+ "@visulima/connect": "3.0.11",
129
+ "@visulima/jsdoc-open-api": "2.0.45",
130
+ "@visulima/path": "1.0.1",
130
131
  "accepts": "^1.3.8",
131
- "debug": "^4.3.4",
132
+ "debug": "^4.3.5",
132
133
  "http-errors": "^2.0.0",
133
134
  "http-status-codes": "^2.3.0",
134
135
  "jstoxml": "^5.0.1",
135
136
  "lodash.merge": "^4.6.2",
136
- "pathe": "^1.1.2",
137
137
  "schema-dts": "^1.1.2",
138
138
  "ts-japi": "^1.11.4",
139
- "yaml": "^2.4.2",
139
+ "yaml": "^2.4.3",
140
140
  "zod-to-ts": "^1.2.0"
141
141
  },
142
142
  "devDependencies": {
@@ -145,17 +145,17 @@
145
145
  "@anolilab/semantic-release-pnpm": "^1.1.0",
146
146
  "@anolilab/semantic-release-preset": "^8.1.0",
147
147
  "@arthurgeron/eslint-plugin-react-usememo": "^2.4.0",
148
- "@babel/core": "^7.24.5",
148
+ "@babel/core": "^7.24.6",
149
149
  "@hapi/hapi": "^21.3.9",
150
150
  "@koa/router": "^12.0.1",
151
151
  "@secretlint/secretlint-rule-preset-recommend": "^8.2.4",
152
- "@testing-library/react": "^15.0.7",
152
+ "@testing-library/react": "^16.0.0",
153
153
  "@total-typescript/ts-reset": "^0.5.1",
154
154
  "@types/accepts": "^1.3.7",
155
155
  "@types/cors": "^2.8.17",
156
156
  "@types/debug": "^4.1.12",
157
157
  "@types/express": "^4.17.21",
158
- "@types/express-serve-static-core": "^4.19.1",
158
+ "@types/express-serve-static-core": "^4.19.3",
159
159
  "@types/http-errors": "^2.0.4",
160
160
  "@types/jstoxml": "^2.0.4",
161
161
  "@types/koa": "^2.15.0",
@@ -163,12 +163,12 @@
163
163
  "@types/lodash.merge": "^4.6.9",
164
164
  "@types/node": "18.18.14",
165
165
  "@types/qs": "^6.9.15",
166
- "@types/react": "^18.3.2",
166
+ "@types/react": "^18.3.3",
167
167
  "@types/react-dom": "^18.3.0",
168
168
  "@types/swagger-ui-react": "^4.18.3",
169
169
  "@types/webpack": "^5.28.5",
170
170
  "@visulima/crud": "2.0.21",
171
- "@visulima/fs": "2.1.1",
171
+ "@visulima/fs": "2.1.3",
172
172
  "@vitest/coverage-v8": "^1.6.0",
173
173
  "@vitest/ui": "^1.6.0",
174
174
  "chalk": "5.3.0",
@@ -177,7 +177,7 @@
177
177
  "cors": "^2.8.5",
178
178
  "cross-env": "^7.0.3",
179
179
  "eslint": "^8.57.0",
180
- "eslint-plugin-deprecation": "^2.0.0",
180
+ "eslint-plugin-deprecation": "^3.0.0",
181
181
  "eslint-plugin-etc": "^2.0.3",
182
182
  "eslint-plugin-import": "npm:eslint-plugin-i@^2.29.1",
183
183
  "eslint-plugin-jsx-a11y": "^6.8.0",
@@ -198,19 +198,19 @@
198
198
  "next-test-api-route-handler": "^4.0.7",
199
199
  "node-mocks-http": "^1.14.1",
200
200
  "openapi-types": "^12.1.3",
201
- "prettier": "^3.2.5",
201
+ "prettier": "^3.3.0",
202
202
  "rate-limiter-flexible": "^5.0.3",
203
203
  "react": "^18.3.1",
204
204
  "react-dom": "^18.3.1",
205
205
  "redoc": "^2.1.4",
206
206
  "rimraf": "^5.0.7",
207
207
  "secretlint": "8.2.3",
208
- "semantic-release": "^23.1.1",
208
+ "semantic-release": "23.1.1",
209
209
  "styled-components": "^6.1.11",
210
210
  "swagger-ui-dist": "^4.19.1",
211
211
  "swagger-ui-react": "^4.19.1",
212
- "tsup": "^8.0.2",
213
- "type-fest": "^4.18.2",
212
+ "tsup": "^8.1.0",
213
+ "type-fest": "^4.19.0",
214
214
  "typescript": "^5.4.5",
215
215
  "vitest": "^1.6.0",
216
216
  "webpack": "^5.91.0",
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/serializers/transformer/yaml.ts","../src/swagger/api/swagger-handler.ts","../src/swagger/extend-swagger-spec.ts","../src/utils.ts"],"names":["stringify","yamlTransformer","data","yaml_default","existsSync","readFileSync","path","modelsToOpenApi","debug","merge","toXML","toHeaderCase","string_","c","jsonMediaType","prepareStatusContent","methodSpec","status","mediaType","extendComponentSchemas","spec","schemaName","schema","extendResponseSchema","schemaIsArray","extendSwaggerWithMediaTypeSchema","responseSpec","allowedMediaTypes","pathKey","example","examples","mediaName","contentSpec","allowed","extendSwaggerWithMediaTypeExample","transformers","transformed","regex","transformer","extendComponentExamples","exampleName","prepareResponseExamples","transformedExamples","extendSwaggerWithMediaTypeExamples","examplesName","extendSwaggerSpec","value","pathSpec","swaggerCrudDebug","swaggerHandler","options","crud","specs","swaggerFilePath","request","response","swaggerPath","fileContents","crudSwagger","modelsOpenApi","error","swagger_handler_default"],"mappings":"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","sourcesContent":["import { stringify } from \"yaml\";\n\nimport type { Serializer } from \"../types\";\n\nconst yamlTransformer: Serializer = (data) => stringify(data, { indent: 2 });\n\nexport default yamlTransformer;\n","import { existsSync, readFileSync } from \"node:fs\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport path from \"node:path\";\n\nimport type { ModelsToOpenApiParameters, SwaggerModelsConfig } from \"@visulima/crud\";\nimport { modelsToOpenApi } from \"@visulima/crud\";\nimport debug from \"debug\";\n// eslint-disable-next-line no-restricted-imports\nimport merge from \"lodash.merge\";\nimport type { OpenAPIV3 } from \"openapi-types\";\n\nimport yamlTransformer from \"../../serializers/transformer/yaml\";\nimport extendSwaggerSpec from \"../extend-swagger-spec\";\n\nconst swaggerCrudDebug = debug(\"visulima:api-platform:swagger:crud:get-static-properties-swagger\");\n\nconst swaggerHandler = <M extends string, PrismaClient>(\n options: Partial<SwaggerHandlerOptions<M, PrismaClient>> = {},\n): ((request: IncomingMessage, response: ServerResponse) => Promise<void>) => {\n const {\n allowedMediaTypes = {\n \"application/json\": true,\n },\n crud,\n specs,\n swaggerFilePath,\n } = options;\n\n return async <Request extends IncomingMessage, Response extends ServerResponse>(request: Request, response: Response) => {\n const swaggerPath = path.join(process.cwd(), swaggerFilePath ?? \"swagger/swagger.json\");\n\n if (!existsSync(swaggerPath)) {\n throw new Error(`Swagger file not found at \"${swaggerPath}\".`);\n }\n\n const fileContents = readFileSync(swaggerPath, \"utf8\");\n\n let spec = extendSwaggerSpec(JSON.parse(fileContents) as OpenAPIV3.Document, allowedMediaTypes) as OpenAPIV3.Document;\n let crudSwagger: Partial<OpenAPIV3.Document> = {};\n\n if (crud !== undefined) {\n try {\n const modelsOpenApi = await modelsToOpenApi(crud);\n\n crudSwagger = {\n components: { examples: modelsOpenApi.examples, schemas: modelsOpenApi.schemas },\n paths: modelsOpenApi.paths,\n tags: modelsOpenApi.tags,\n };\n\n crudSwagger = extendSwaggerSpec(crudSwagger, allowedMediaTypes);\n\n swaggerCrudDebug(JSON.stringify(crudSwagger, null, 2));\n\n spec = merge(spec, crudSwagger);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.log(error);\n\n throw new Error(\"Please install @visulima/crud to use the crud swagger generator.\");\n }\n }\n\n if (Array.isArray(specs)) {\n specs.forEach((value) => {\n spec = merge(spec, extendSwaggerSpec(value, allowedMediaTypes));\n });\n }\n\n let data: Buffer | Uint8Array | string;\n\n if (typeof request.headers.accept === \"string\" && /yaml|yml/.test(request.headers.accept)) {\n response.setHeader(\"Content-Type\", request.headers.accept);\n\n data = yamlTransformer(spec);\n } else {\n response.setHeader(\"Content-Type\", \"application/json\");\n\n data = JSON.stringify(spec, null, 2);\n }\n\n response.statusCode = 200;\n response.end(data);\n };\n};\n\nexport interface SwaggerHandlerOptions<M extends string, PrismaClient> {\n allowedMediaTypes: Record<string, boolean>;\n crud: Exclude<ModelsToOpenApiParameters<M, PrismaClient>, \"swagger\"> & {\n swagger?: {\n models?: SwaggerModelsConfig<M>;\n };\n };\n specs?: Partial<OpenAPIV3.Document>[];\n swaggerFilePath: string;\n}\n\nexport default swaggerHandler;\n","import type { XmlElement } from \"jstoxml\";\nimport { toXML } from \"jstoxml\";\nimport type { OpenAPIV3 } from \"openapi-types\";\nimport { stringify } from \"yaml\";\n\nimport { toHeaderCase } from \"../utils\";\n\ntype Transformers = { regex: RegExp; transformer: (data: any) => string }[];\n\nconst jsonMediaType = \"application/json\";\n\nconst prepareStatusContent = (methodSpec: OpenAPIV3.OperationObject, status: string, mediaType: string) => {\n if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content === undefined) {\n // eslint-disable-next-line no-param-reassign\n ((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content = {};\n }\n\n if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType] === undefined) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] = {} as OpenAPIV3.MediaTypeObject;\n }\n};\n\nconst extendComponentSchemas = (spec: Partial<OpenAPIV3.Document>, schemaName: string, schema: OpenAPIV3.SchemaObject) => {\n if (typeof spec.components !== \"object\") {\n // eslint-disable-next-line no-param-reassign\n spec.components = {};\n }\n\n if (typeof spec.components.schemas !== \"object\") {\n // eslint-disable-next-line no-param-reassign\n spec.components.schemas = {};\n }\n\n if (spec.components.schemas[schemaName] === undefined) {\n // eslint-disable-next-line no-param-reassign\n spec.components.schemas[schemaName] = schema;\n }\n};\n\nconst extendResponseSchema = (methodSpec: OpenAPIV3.OperationObject, status: string, mediaType: string, schemaName: string, schemaIsArray: boolean) => {\n prepareStatusContent(methodSpec, status, mediaType);\n\n if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType]?.schema === undefined) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).schema =\n {} as OpenAPIV3.SchemaObject;\n }\n\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).schema =\n schemaIsArray\n ? {\n items: {\n $ref: `#/components/schemas/${schemaName}`,\n },\n type: \"array\",\n }\n : {\n $ref: `#/components/schemas/${schemaName}`,\n };\n};\n\nconst extendSwaggerWithMediaTypeSchema = (\n methodSpec: OpenAPIV3.OperationObject,\n responseSpec: OpenAPIV3.ResponseObject,\n allowedMediaTypes: Record<string, boolean> | undefined,\n pathKey: string,\n spec: Partial<OpenAPIV3.Document>,\n status: string,\n): {\n example?: any;\n examples?: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>;\n} => {\n let example: any | undefined;\n let examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> | undefined;\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n Object.entries(responseSpec.content as object).forEach(([mediaName, contentSpec]) => {\n if (typeof contentSpec.schema === \"object\") {\n const { schema } = contentSpec;\n\n if (mediaName === jsonMediaType && contentSpec.examples !== undefined) {\n examples = contentSpec.examples;\n } else if (mediaName === jsonMediaType && contentSpec.example !== undefined) {\n example = contentSpec.example;\n }\n\n const schemaIsArray = (schema as OpenAPIV3.SchemaObject).type === \"array\";\n\n Object.entries(allowedMediaTypes ?? {}).forEach(([mediaType, allowed]) => {\n if (!allowed) {\n return;\n }\n\n let schemaName: string;\n\n if (schema?.$ref === undefined) {\n schemaName = `${toHeaderCase(pathKey.trim().replace(\"/\", \"\"))}${mediaType === \"application/ld+json\" ? \".jsonld\" : \"\"}`;\n\n extendComponentSchemas(spec as OpenAPIV3.Document, schemaName, schema as OpenAPIV3.SchemaObject);\n } else {\n schemaName = (schema as OpenAPIV3.ReferenceObject).$ref.replace(\"#/components/schemas/\", \"\");\n }\n\n extendResponseSchema(methodSpec, status, mediaType, schemaName, schemaIsArray);\n });\n }\n });\n\n return { example, examples };\n};\n\nconst extendSwaggerWithMediaTypeExample = (\n methodSpec: OpenAPIV3.OperationObject,\n responseSpec: OpenAPIV3.ResponseObject,\n status: string,\n allowedMediaTypes: Record<string, boolean> | undefined,\n transformers: Transformers,\n example: any,\n) => {\n Object.keys(responseSpec.content as object).forEach((mediaName) => {\n if (mediaName === jsonMediaType) {\n return;\n }\n\n Object.entries(allowedMediaTypes ?? {}).forEach(([mediaType, allowed]) => {\n if (!allowed) {\n return;\n }\n\n prepareStatusContent(methodSpec, status, mediaType);\n\n if (\n ((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType]?.example === undefined\n ) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).example =\n {};\n }\n\n let transformed = false;\n\n transformers.forEach(({ regex, transformer }) => {\n if (!transformed && regex.test(mediaType)) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).example =\n transformer(example);\n\n transformed = true;\n }\n });\n\n if (!transformed) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).example =\n example;\n }\n });\n });\n};\n\nconst extendComponentExamples = (\n spec: Partial<OpenAPIV3.Document>,\n exampleName: string,\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>,\n) => {\n if (typeof spec.components !== \"object\") {\n // eslint-disable-next-line no-param-reassign\n spec.components = {};\n }\n\n if (typeof spec.components.examples !== \"object\") {\n // eslint-disable-next-line no-param-reassign\n spec.components.examples = {};\n }\n\n if (spec.components.examples[exampleName] === undefined && examples[exampleName] !== undefined) {\n // eslint-disable-next-line no-param-reassign\n spec.components.examples[exampleName] = examples[exampleName] as OpenAPIV3.ExampleObject;\n }\n};\n\nconst prepareResponseExamples = (\n spec: Partial<OpenAPIV3.Document>,\n methodSpec: OpenAPIV3.OperationObject,\n status: string,\n mediaType: string,\n transformers: Transformers,\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>,\n // eslint-disable-next-line sonarjs/cognitive-complexity\n) => {\n prepareStatusContent(methodSpec, status, mediaType);\n\n if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType]?.examples === undefined) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).examples =\n {};\n }\n\n const transformedExamples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> = {};\n\n Object.entries(examples).forEach(([exampleName, example]) => {\n let transformed = false;\n\n transformers.forEach(({ regex, transformer }) => {\n if (!transformed && regex.test(mediaType)) {\n let data: any = \"\";\n\n if (spec.components?.examples?.[exampleName]) {\n data = (spec.components.examples[exampleName] as OpenAPIV3.ExampleObject).value;\n } else if ((example as OpenAPIV3.ReferenceObject).$ref) {\n data = (\n spec.components?.examples?.[\n (example as OpenAPIV3.ReferenceObject).$ref.replace(\"#/components/examples/\", \"\")\n ] as OpenAPIV3.ExampleObject\n ).value;\n } else if (typeof (example as OpenAPIV3.ExampleObject).value === \"string\") {\n data = (example as OpenAPIV3.ExampleObject).value;\n }\n\n transformedExamples[exampleName] = {\n value: transformer(data),\n };\n\n transformed = true;\n }\n });\n\n if (!transformed) {\n transformedExamples[exampleName] =\n spec.components?.examples?.[exampleName] === undefined\n ? example\n : {\n $ref: `#/components/examples/${exampleName}`,\n };\n }\n });\n\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).examples =\n transformedExamples;\n};\n\nconst extendSwaggerWithMediaTypeExamples = (\n spec: Partial<OpenAPIV3.Document>,\n methodSpec: OpenAPIV3.OperationObject,\n status: string,\n responseSpec: OpenAPIV3.ResponseObject,\n allowedMediaTypes: Record<string, boolean> | undefined,\n pathKey: string,\n transformers: Transformers,\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>,\n) => {\n const examplesName = `${toHeaderCase(pathKey.trim().replace(\"/\", \"\"))}`;\n\n Object.keys(responseSpec.content as object).forEach((mediaName) => {\n if (mediaName === jsonMediaType) {\n return;\n }\n\n Object.entries(allowedMediaTypes ?? {}).forEach(([mediaType, allowed]) => {\n if (!allowed) {\n return;\n }\n\n extendComponentExamples(spec, examplesName, examples);\n\n prepareResponseExamples(spec, methodSpec, status, mediaType, transformers, examples);\n });\n });\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport default function extendSwaggerSpec(\n spec: Partial<OpenAPIV3.Document>,\n allowedMediaTypes?: Record<string, boolean>,\n transformers: Transformers = [\n {\n regex: /xml/u,\n transformer: (value: XmlElement | XmlElement[] | undefined) =>\n toXML(value, {\n header: true,\n indent: \" \",\n }),\n },\n {\n regex: /yaml|yml/,\n transformer: (value) => stringify(value, { indent: 2 }),\n },\n ],\n): Partial<OpenAPIV3.Document> {\n if (typeof spec === \"object\" && typeof spec.paths === \"object\") {\n Object.entries(spec.paths).forEach(([pathKey, pathSpec]) => {\n Object.values(pathSpec as OpenAPIV3.OperationObject & OpenAPIV3.PathsObject).forEach((methodSpec) => {\n if (typeof (methodSpec as OpenAPIV3.OperationObject).responses === \"object\") {\n Object.entries((methodSpec as OpenAPIV3.OperationObject).responses).forEach(([status, responseSpec]) => {\n if (typeof (responseSpec as OpenAPIV3.ResponseObject).content === \"object\") {\n const { example, examples } = extendSwaggerWithMediaTypeSchema(\n methodSpec as OpenAPIV3.OperationObject,\n responseSpec as OpenAPIV3.ResponseObject,\n allowedMediaTypes,\n pathKey,\n spec,\n status,\n );\n\n if (example !== undefined) {\n extendSwaggerWithMediaTypeExample(\n methodSpec as OpenAPIV3.OperationObject,\n responseSpec as OpenAPIV3.ResponseObject,\n status,\n allowedMediaTypes,\n transformers,\n example,\n );\n } else if (examples !== undefined) {\n extendSwaggerWithMediaTypeExamples(\n spec,\n methodSpec as OpenAPIV3.OperationObject,\n status,\n responseSpec as OpenAPIV3.ResponseObject,\n allowedMediaTypes,\n pathKey,\n transformers,\n examples,\n );\n }\n }\n });\n }\n });\n });\n }\n\n return spec;\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { URL } from \"node:url\";\n\ntype IncomingApiRequest<TApiRequest = IncomingMessage> = TApiRequest & {\n body?: any;\n query?: any;\n};\n\nexport const jsonResponse = (response: ServerResponse, status: number, data?: unknown): void => {\n response.statusCode = status;\n response.setHeader(\"Content-Type\", \"application/json\");\n response.end(data ? JSON.stringify(data) : \"\");\n};\n\nexport const parseBody = async (request: IncomingApiRequest): Promise<any> => {\n if (request.body) {\n return request.body;\n }\n\n const buffers = [];\n\n // eslint-disable-next-line no-restricted-syntax,no-loops/no-loops\n for await (const chunk of request) {\n buffers.push(chunk);\n }\n\n const data = Buffer.concat(buffers).toString();\n\n return data ? JSON.parse(data) : null;\n};\n\nexport const parseQuery = (request: IncomingApiRequest): Record<string, unknown> => {\n if (request.query) {\n return request.query;\n }\n\n if (!request.url) {\n return {};\n }\n\n // Note: Fake protocol is required to parse query string\n const url = new URL(`https://${request.headers.host?.replace(/\\/$/u, \"\")}/${request.url}`);\n\n return Object.fromEntries(url.searchParams.entries());\n};\n\nexport const toHeaderCase = (string_: string): string =>\n string_\n .toLowerCase()\n .replaceAll(/[^\\s\\w]/gu, \" \") // Remove all non-word characters\n .trimEnd() // Remove trailing spaces\n .replaceAll(/\\s+|_/gu, \"-\") // Replace multiple spaces or underline with a single hyphen\n .replaceAll(/\\b\\w/gu, (c) => c.toUpperCase());\n"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/serializers/transformer/yaml.ts","../src/swagger/api/swagger-handler.ts","../src/swagger/extend-swagger-spec.ts","../src/utils.ts"],"names":["stringify","yamlTransformer","data","yaml_default","existsSync","readFileSync","path","modelsToOpenApi","debug","merge","toXML","URL","toHeaderCase","string_","c","jsonMediaType","prepareStatusContent","methodSpec","status","mediaType","extendComponentSchemas","spec","schemaName","schema","extendResponseSchema","schemaIsArray","extendSwaggerWithMediaTypeSchema","responseSpec","allowedMediaTypes","pathKey","example","examples","mediaName","contentSpec","allowed","extendSwaggerWithMediaTypeExample","transformers","transformed","regex","transformer","extendComponentExamples","exampleName","prepareResponseExamples","transformedExamples","extendSwaggerWithMediaTypeExamples","examplesName","extendSwaggerSpec","value","pathSpec","swaggerCrudDebug","swaggerHandler","options","crud","specs","swaggerFilePath","request","response","swaggerPath","fileContents","crudSwagger","modelsOpenApi","error","swagger_handler_default"],"mappings":"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","sourcesContent":["import { stringify } from \"yaml\";\n\nimport type { Serializer } from \"../types\";\n\nconst yamlTransformer: Serializer = (data) => stringify(data, { indent: 2 });\n\nexport default yamlTransformer;\n","import { existsSync, readFileSync } from \"node:fs\";\nimport type { IncomingMessage, ServerResponse } from \"node:http\";\nimport path from \"node:path\";\n\nimport type { ModelsToOpenApiParameters, SwaggerModelsConfig } from \"@visulima/crud\";\nimport { modelsToOpenApi } from \"@visulima/crud\";\nimport debug from \"debug\";\n// eslint-disable-next-line no-restricted-imports\nimport merge from \"lodash.merge\";\nimport type { OpenAPIV3 } from \"openapi-types\";\n\nimport yamlTransformer from \"../../serializers/transformer/yaml\";\nimport extendSwaggerSpec from \"../extend-swagger-spec\";\n\nconst swaggerCrudDebug = debug(\"visulima:api-platform:swagger:crud:get-static-properties-swagger\");\n\nconst swaggerHandler = <M extends string, PrismaClient>(\n options: Partial<SwaggerHandlerOptions<M, PrismaClient>> = {},\n): ((request: IncomingMessage, response: ServerResponse) => Promise<void>) => {\n const {\n allowedMediaTypes = {\n \"application/json\": true,\n },\n crud,\n specs,\n swaggerFilePath,\n } = options;\n\n return async <Request extends IncomingMessage, Response extends ServerResponse>(request: Request, response: Response) => {\n const swaggerPath = path.join(process.cwd(), swaggerFilePath ?? \"swagger/swagger.json\");\n\n if (!existsSync(swaggerPath)) {\n throw new Error(`Swagger file not found at \"${swaggerPath}\".`);\n }\n\n const fileContents = readFileSync(swaggerPath, \"utf8\");\n\n let spec = extendSwaggerSpec(JSON.parse(fileContents) as OpenAPIV3.Document, allowedMediaTypes) as OpenAPIV3.Document;\n let crudSwagger: Partial<OpenAPIV3.Document> = {};\n\n if (crud !== undefined) {\n try {\n const modelsOpenApi = await modelsToOpenApi(crud);\n\n crudSwagger = {\n components: { examples: modelsOpenApi.examples, schemas: modelsOpenApi.schemas },\n paths: modelsOpenApi.paths,\n tags: modelsOpenApi.tags,\n };\n\n crudSwagger = extendSwaggerSpec(crudSwagger, allowedMediaTypes);\n\n swaggerCrudDebug(JSON.stringify(crudSwagger, null, 2));\n\n spec = merge(spec, crudSwagger);\n } catch (error) {\n // eslint-disable-next-line no-console\n console.log(error);\n\n throw new Error(\"Please install @visulima/crud to use the crud swagger generator.\");\n }\n }\n\n if (Array.isArray(specs)) {\n specs.forEach((value) => {\n spec = merge(spec, extendSwaggerSpec(value, allowedMediaTypes));\n });\n }\n\n let data: Buffer | Uint8Array | string;\n\n if (typeof request.headers.accept === \"string\" && /yaml|yml/.test(request.headers.accept)) {\n response.setHeader(\"Content-Type\", request.headers.accept);\n\n data = yamlTransformer(spec);\n } else {\n response.setHeader(\"Content-Type\", \"application/json\");\n\n data = JSON.stringify(spec, null, 2);\n }\n\n response.statusCode = 200;\n response.end(data);\n };\n};\n\nexport interface SwaggerHandlerOptions<M extends string, PrismaClient> {\n allowedMediaTypes: Record<string, boolean>;\n crud: Exclude<ModelsToOpenApiParameters<M, PrismaClient>, \"swagger\"> & {\n swagger?: {\n models?: SwaggerModelsConfig<M>;\n };\n };\n specs?: Partial<OpenAPIV3.Document>[];\n swaggerFilePath: string;\n}\n\nexport default swaggerHandler;\n","import type { XmlElement } from \"jstoxml\";\nimport { toXML } from \"jstoxml\";\nimport type { OpenAPIV3 } from \"openapi-types\";\nimport { stringify } from \"yaml\";\n\nimport { toHeaderCase } from \"../utils\";\n\ntype Transformers = { regex: RegExp; transformer: (data: any) => string }[];\n\nconst jsonMediaType = \"application/json\";\n\nconst prepareStatusContent = (methodSpec: OpenAPIV3.OperationObject, status: string, mediaType: string) => {\n if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content === undefined) {\n // eslint-disable-next-line no-param-reassign\n ((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content = {};\n }\n\n if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType] === undefined) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] = {} as OpenAPIV3.MediaTypeObject;\n }\n};\n\nconst extendComponentSchemas = (spec: Partial<OpenAPIV3.Document>, schemaName: string, schema: OpenAPIV3.SchemaObject) => {\n if (typeof spec.components !== \"object\") {\n // eslint-disable-next-line no-param-reassign\n spec.components = {};\n }\n\n if (typeof spec.components.schemas !== \"object\") {\n // eslint-disable-next-line no-param-reassign\n spec.components.schemas = {};\n }\n\n if (spec.components.schemas[schemaName] === undefined) {\n // eslint-disable-next-line no-param-reassign\n spec.components.schemas[schemaName] = schema;\n }\n};\n\nconst extendResponseSchema = (methodSpec: OpenAPIV3.OperationObject, status: string, mediaType: string, schemaName: string, schemaIsArray: boolean) => {\n prepareStatusContent(methodSpec, status, mediaType);\n\n if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType]?.schema === undefined) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).schema =\n {} as OpenAPIV3.SchemaObject;\n }\n\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).schema =\n schemaIsArray\n ? {\n items: {\n $ref: `#/components/schemas/${schemaName}`,\n },\n type: \"array\",\n }\n : {\n $ref: `#/components/schemas/${schemaName}`,\n };\n};\n\nconst extendSwaggerWithMediaTypeSchema = (\n methodSpec: OpenAPIV3.OperationObject,\n responseSpec: OpenAPIV3.ResponseObject,\n allowedMediaTypes: Record<string, boolean> | undefined,\n pathKey: string,\n spec: Partial<OpenAPIV3.Document>,\n status: string,\n): {\n example?: any;\n examples?: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>;\n} => {\n let example: any | undefined;\n let examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> | undefined;\n\n // eslint-disable-next-line sonarjs/cognitive-complexity\n Object.entries(responseSpec.content as object).forEach(([mediaName, contentSpec]) => {\n if (typeof contentSpec.schema === \"object\") {\n const { schema } = contentSpec;\n\n if (mediaName === jsonMediaType && contentSpec.examples !== undefined) {\n examples = contentSpec.examples;\n } else if (mediaName === jsonMediaType && contentSpec.example !== undefined) {\n example = contentSpec.example;\n }\n\n const schemaIsArray = (schema as OpenAPIV3.SchemaObject).type === \"array\";\n\n Object.entries(allowedMediaTypes ?? {}).forEach(([mediaType, allowed]) => {\n if (!allowed) {\n return;\n }\n\n let schemaName: string;\n\n if (schema?.$ref === undefined) {\n schemaName = `${toHeaderCase(pathKey.trim().replace(\"/\", \"\"))}${mediaType === \"application/ld+json\" ? \".jsonld\" : \"\"}`;\n\n extendComponentSchemas(spec as OpenAPIV3.Document, schemaName, schema as OpenAPIV3.SchemaObject);\n } else {\n schemaName = (schema as OpenAPIV3.ReferenceObject).$ref.replace(\"#/components/schemas/\", \"\");\n }\n\n extendResponseSchema(methodSpec, status, mediaType, schemaName, schemaIsArray);\n });\n }\n });\n\n return { example, examples };\n};\n\nconst extendSwaggerWithMediaTypeExample = (\n methodSpec: OpenAPIV3.OperationObject,\n responseSpec: OpenAPIV3.ResponseObject,\n status: string,\n allowedMediaTypes: Record<string, boolean> | undefined,\n transformers: Transformers,\n example: any,\n) => {\n Object.keys(responseSpec.content as object).forEach((mediaName) => {\n if (mediaName === jsonMediaType) {\n return;\n }\n\n Object.entries(allowedMediaTypes ?? {}).forEach(([mediaType, allowed]) => {\n if (!allowed) {\n return;\n }\n\n prepareStatusContent(methodSpec, status, mediaType);\n\n if (\n ((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType]?.example === undefined\n ) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).example =\n {};\n }\n\n let transformed = false;\n\n transformers.forEach(({ regex, transformer }) => {\n if (!transformed && regex.test(mediaType)) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).example =\n transformer(example);\n\n transformed = true;\n }\n });\n\n if (!transformed) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).example =\n example;\n }\n });\n });\n};\n\nconst extendComponentExamples = (\n spec: Partial<OpenAPIV3.Document>,\n exampleName: string,\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>,\n) => {\n if (typeof spec.components !== \"object\") {\n // eslint-disable-next-line no-param-reassign\n spec.components = {};\n }\n\n if (typeof spec.components.examples !== \"object\") {\n // eslint-disable-next-line no-param-reassign\n spec.components.examples = {};\n }\n\n if (spec.components.examples[exampleName] === undefined && examples[exampleName] !== undefined) {\n // eslint-disable-next-line no-param-reassign\n spec.components.examples[exampleName] = examples[exampleName] as OpenAPIV3.ExampleObject;\n }\n};\n\nconst prepareResponseExamples = (\n spec: Partial<OpenAPIV3.Document>,\n methodSpec: OpenAPIV3.OperationObject,\n status: string,\n mediaType: string,\n transformers: Transformers,\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>,\n // eslint-disable-next-line sonarjs/cognitive-complexity\n) => {\n prepareStatusContent(methodSpec, status, mediaType);\n\n if (((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content?.[mediaType]?.examples === undefined) {\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).examples =\n {};\n }\n\n const transformedExamples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject> = {};\n\n Object.entries(examples).forEach(([exampleName, example]) => {\n let transformed = false;\n\n transformers.forEach(({ regex, transformer }) => {\n if (!transformed && regex.test(mediaType)) {\n let data: any = \"\";\n\n if (spec.components?.examples?.[exampleName]) {\n data = (spec.components.examples[exampleName] as OpenAPIV3.ExampleObject).value;\n } else if ((example as OpenAPIV3.ReferenceObject).$ref) {\n data = (\n spec.components?.examples?.[\n (example as OpenAPIV3.ReferenceObject).$ref.replace(\"#/components/examples/\", \"\")\n ] as OpenAPIV3.ExampleObject\n ).value;\n } else if (typeof (example as OpenAPIV3.ExampleObject).value === \"string\") {\n data = (example as OpenAPIV3.ExampleObject).value;\n }\n\n transformedExamples[exampleName] = {\n value: transformer(data),\n };\n\n transformed = true;\n }\n });\n\n if (!transformed) {\n transformedExamples[exampleName] =\n spec.components?.examples?.[exampleName] === undefined\n ? example\n : {\n $ref: `#/components/examples/${exampleName}`,\n };\n }\n });\n\n // prettier-ignore\n // eslint-disable-next-line no-param-reassign\n ((((methodSpec.responses as unknown as OpenAPIV3.ResponsesObject)[status] as OpenAPIV3.ResponseObject).content as Record<\n string,\n OpenAPIV3.MediaTypeObject\n >)[\n mediaType\n ] as OpenAPIV3.MediaTypeObject).examples =\n transformedExamples;\n};\n\nconst extendSwaggerWithMediaTypeExamples = (\n spec: Partial<OpenAPIV3.Document>,\n methodSpec: OpenAPIV3.OperationObject,\n status: string,\n responseSpec: OpenAPIV3.ResponseObject,\n allowedMediaTypes: Record<string, boolean> | undefined,\n pathKey: string,\n transformers: Transformers,\n examples: Record<string, OpenAPIV3.ExampleObject | OpenAPIV3.ReferenceObject>,\n) => {\n const examplesName = `${toHeaderCase(pathKey.trim().replace(\"/\", \"\"))}`;\n\n Object.keys(responseSpec.content as object).forEach((mediaName) => {\n if (mediaName === jsonMediaType) {\n return;\n }\n\n Object.entries(allowedMediaTypes ?? {}).forEach(([mediaType, allowed]) => {\n if (!allowed) {\n return;\n }\n\n extendComponentExamples(spec, examplesName, examples);\n\n prepareResponseExamples(spec, methodSpec, status, mediaType, transformers, examples);\n });\n });\n};\n\n// eslint-disable-next-line sonarjs/cognitive-complexity\nexport default function extendSwaggerSpec(\n spec: Partial<OpenAPIV3.Document>,\n allowedMediaTypes?: Record<string, boolean>,\n transformers: Transformers = [\n {\n regex: /xml/u,\n transformer: (value: XmlElement | XmlElement[] | undefined) =>\n toXML(value, {\n header: true,\n indent: \" \",\n }),\n },\n {\n regex: /yaml|yml/,\n transformer: (value) => stringify(value, { indent: 2 }),\n },\n ],\n): Partial<OpenAPIV3.Document> {\n if (typeof spec === \"object\" && typeof spec.paths === \"object\") {\n Object.entries(spec.paths).forEach(([pathKey, pathSpec]) => {\n Object.values(pathSpec as OpenAPIV3.OperationObject & OpenAPIV3.PathsObject).forEach((methodSpec) => {\n if (typeof (methodSpec as OpenAPIV3.OperationObject).responses === \"object\") {\n Object.entries((methodSpec as OpenAPIV3.OperationObject).responses).forEach(([status, responseSpec]) => {\n if (typeof (responseSpec as OpenAPIV3.ResponseObject).content === \"object\") {\n const { example, examples } = extendSwaggerWithMediaTypeSchema(\n methodSpec as OpenAPIV3.OperationObject,\n responseSpec as OpenAPIV3.ResponseObject,\n allowedMediaTypes,\n pathKey,\n spec,\n status,\n );\n\n if (example !== undefined) {\n extendSwaggerWithMediaTypeExample(\n methodSpec as OpenAPIV3.OperationObject,\n responseSpec as OpenAPIV3.ResponseObject,\n status,\n allowedMediaTypes,\n transformers,\n example,\n );\n } else if (examples !== undefined) {\n extendSwaggerWithMediaTypeExamples(\n spec,\n methodSpec as OpenAPIV3.OperationObject,\n status,\n responseSpec as OpenAPIV3.ResponseObject,\n allowedMediaTypes,\n pathKey,\n transformers,\n examples,\n );\n }\n }\n });\n }\n });\n });\n }\n\n return spec;\n}\n","import type { IncomingMessage, ServerResponse } from \"node:http\";\nimport { URL } from \"node:url\";\n\ntype IncomingApiRequest<TApiRequest = IncomingMessage> = TApiRequest & {\n body?: any;\n query?: any;\n};\n\nexport const jsonResponse = (response: ServerResponse, status: number, data?: unknown): void => {\n response.statusCode = status;\n response.setHeader(\"Content-Type\", \"application/json\");\n response.end(data ? JSON.stringify(data) : \"\");\n};\n\nexport const parseBody = async (request: IncomingApiRequest): Promise<any> => {\n if (request.body) {\n return request.body;\n }\n\n const buffers = [];\n\n // eslint-disable-next-line no-restricted-syntax,no-loops/no-loops\n for await (const chunk of request) {\n buffers.push(chunk);\n }\n\n const data = Buffer.concat(buffers).toString();\n\n return data ? JSON.parse(data) : null;\n};\n\nexport const parseQuery = (request: IncomingApiRequest): Record<string, unknown> => {\n if (request.query) {\n return request.query;\n }\n\n if (!request.url) {\n return {};\n }\n\n // Note: Fake protocol is required to parse query string\n const url = new URL(`https://${request.headers.host?.replace(/\\/$/u, \"\")}/${request.url}`);\n\n return Object.fromEntries(url.searchParams.entries());\n};\n\nexport const toHeaderCase = (string_: string): string =>\n string_\n .toLowerCase()\n .replaceAll(/[^\\s\\w]/gu, \" \") // Remove all non-word characters\n .trimEnd() // Remove trailing spaces\n .replaceAll(/\\s+|_/gu, \"-\") // Replace multiple spaces or underline with a single hyphen\n .replaceAll(/\\b\\w/gu, (c) => c.toUpperCase());\n"]}
@@ -1,28 +0,0 @@
1
- 'use strict';
2
-
3
- var child_process = require('child_process');
4
- var fs = require('fs');
5
- var path = require('path');
6
- var oe = require('process');
7
- var y = require('chalk');
8
- var jsdocOpenApi = require('@visulima/jsdoc-open-api');
9
- var pathe = require('pathe');
10
- var url = require('url');
11
- var promises = require('fs/promises');
12
- require('zlib');
13
- require('yaml');
14
-
15
- function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
16
-
17
- var oe__default = /*#__PURE__*/_interopDefault(oe);
18
- var y__default = /*#__PURE__*/_interopDefault(y);
19
-
20
- var ie=(e,t)=>{if(t.length===0)throw new Error("must include at least one key to map");let r=e.toString();return t.forEach(o=>{r=o.optional?r.replace("(?:\\/([^\\/]+?))?\\",`/:${o.name}?`):r.replace("(?:([^\\/]+?))",`:${o.name}`);}),r.replace("/?(?=\\/|$)/i","").replace("/^","").replaceAll("\\","").replaceAll(/\/{2,}/gu,"/")},T=ie;var se=(e,t)=>{if(typeof e=="string")return e;if(e.fast_slash)return "";if(e.fast_star)return "*";let r="";t.length>0&&(r=T(e,t));let o=/^\/\^((?:\\[$()*+./?[\\\]^{|}]|[^$()*+./?[\\\]^{|}])*)\$\//u.exec(e.toString().replace("\\/?","").replace("(?=\\/|$)","$"));return Array.isArray(o)&&o.length>1?o[1].replaceAll(/\\(.)/gu,"$1").slice(1):r?r.slice(1):e.toString()},D=se;var ae=(e,t,r)=>{let o=e.route.stack.at(-1),n=t.map(a=>({in:"path",name:a.name,required:!a.optional})),i=e.route.stack.filter(a=>a.handle.metadata);if(i.length>1)throw new Error("Only one metadata middleware is allowed per route");let l=(r+e.route.path).replaceAll(/\/{2,}/gu,"/");return i.length===0?{method:o.method,path:l,pathParams:n}:{metadata:i[0].handle.metadata,method:o.method,path:l,pathParams:n}},R=(e,t,r,o)=>{o=[...o,...r.keys],r.name==="router"&&r.handle&&r.handle.stack.forEach(n=>{t=t||"",R(e,`${t}/${D(r.regexp,r.keys)}`,n,o);}),!(!r.route||r.route.stack.length===0)&&e.push(ae(r,o,t));},ce=e=>{let t=e._router||e.router,r=[];return t.stack.forEach(o=>{R(r,"",o,[]);}),r},P=ce;var le=e=>{let t=[];return P(e).forEach(r=>{t.push({file:"unknown",method:r.method.toUpperCase(),path:r.path,tags:[]});}),t},F=le;var N=e=>e.replaceAll(/ \(.*\)/gu,"").trim(),O=e=>e.trim().split(" ")[1].slice(1,-1),pe=e=>{let r=e.printRoutes().replaceAll(/[─│└├]/gu," ").trimEnd().split(`
21
- `),o=r.reduce((i,l,a)=>{let c=N(l);if(N(r[a-1]??"")===c){let v=i.filter($=>$.index<a&&$.segment===c),{methods:b}=v.at(-1);return b!==null&&b.push(O(l)),i}let p=l.replaceAll(/ \(.*\)/gu,"").match(/ /gu);if(p===null)throw new Error("Invalid spaces");let s=p.length/4,m=l.includes("("),E=m?[O(l)]:null;return i.push({depth:s,index:a,isRoute:m,methods:E,segment:c}),i},[]),n=[];return o.filter(i=>i.isRoute).forEach(i=>{let a=[...o.filter(c=>c.index<i.index&&c.depth<i.depth).filter((c,f,p)=>!p.find(s=>s.depth===c.depth&&s.index>c.index)).map(c=>c.segment),i.segment].join("");if(i.methods===null)throw new Error("Invalid methods");i.methods.forEach(c=>{n.push({file:"unknown",method:c.toUpperCase(),path:a,tags:[]});});}),n},L=pe;var fe=e=>{let r=e._core.router.routes,o=[];return [...r.keys()].forEach(n=>{r.get(n).routes.forEach(i=>{o.push({file:"unknown",method:i.route.method.toUpperCase(),path:i.path,tags:[]});});}),o},I=fe;var ue=e=>{let t=[];return e.middleware.filter(r=>r.router).flatMap(r=>r.router.stack).forEach(r=>{t.push({file:"unknown",method:r.methods.join("|").toUpperCase(),path:r.path,tags:[]});}),t},j=ue;var M=/\.(js|ts|mjs|cjs)$/u,ge=(e,t,r=!1)=>{e=pathe.toNamespacedPath(e);let o=pathe.toNamespacedPath(oe.cwd()),n=[],i=jsdocOpenApi.parseFile(e,jsdocOpenApi.jsDocumentCommentsToOpenApi,r);n=[...n,...i.map(c=>c.spec)];let l=jsdocOpenApi.parseFile(e,jsdocOpenApi.swaggerJsDocumentCommentsToOpenApi,r);n=[...n,...l.map(c=>c.spec)];let a=[];return n.length===0?(fs.readFileSync(e,"utf8").split(/\r?\n/u).forEach(f=>{let p=/[=aces|]+\s["'|](GET|POST|PUT|PATCH|HEAD|DELETE|OPTIONS)["'|]/u.exec(f);if(p){let[,s]=p;s==="GET"&&(s="GET|HEAD"),a.push({file:e.replace(`${o}/`,""),method:s,path:pathe.toNamespacedPath(e.replace(t,"").replace(M,"")),tags:[]});}}),a.length===0&&a.push({file:e.replace(`${o}/`,""),method:"GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS",path:pathe.toNamespacedPath(e.replace(t,"").replace(M,"")),tags:[]}),a):(n.forEach(c=>{Object.entries(c?.paths??{}).forEach(([p,s])=>{Object.entries(s).forEach(([E,v])=>{a.push({file:e.replace(`${o}/`,""),method:E.toUpperCase(),path:pathe.toNamespacedPath(p),tags:v.tags});});});}),a)},U=ge;var we=class extends Error{root;constructor(e,t){super(`${e instanceof Error?e.message:e} for path "${t}"`),this.cause=e,this.root=t;}get name(){return "WalkError"}set name(e){throw new Error("Cannot overwrite name of WalkError")}},S=we;var ve=e=>{if(!e||!(e instanceof URL)&&typeof e!="string")throw new TypeError("Path must be a non-empty string or URL.")},J=ve,Se=e=>e instanceof URL?url.fileURLToPath(e):e,K=Se;var xe=globalThis.process||Object.create(null),W={versions:{}},ke=new Proxy(xe,{get(e,t){if(t in e)return e[t];if(t in W)return W[t]}}),_=ke;_.platform==="win32"&&!_.env?.WT_SESSION?">":"\u276F";process.platform==="win32"||/^(?:msys|cygwin)$/.test(process.env.OSTYPE);process.platform==="win32"||/^(?:msys|cygwin)$/.test(process.env.OSTYPE);var Fe=e=>{let t=e.replace(/\.\*/g,".([^/]*)").replace(/\*\*/g,"(.*)").replace(/(?<!\.)\*(?!\*)/g,"([^/]*)").replace(/\?/g,"[^/]").replace(/\.(?!\*)/g,"\\.").replace(/\{/g,"(").replace(/\}/g,")").replace(/,/g,"|").replace(/\[!(.*?)\]/g,"[^$1]");return new RegExp(`^${t}$`)},G=Fe,Ne=(e,t,r,o)=>Array.isArray(t)&&t.length>0&&!t.some(n=>e.endsWith(n))||r&&!r.some(n=>n.test(e))?!1:!(o&&o.some(n=>n.test(e))),g=Ne,Oe=async e=>{let t=pathe.normalize(e),r=pathe.basename(t),o=await promises.stat(t);return {isDirectory:o.isDirectory,isFile:o.isFile,isSymbolicLink:o.isSymbolicLink,name:r,path:t}};async function*H(e,{extensions:t,followSymlinks:r=!1,includeDirs:o=!0,includeFiles:n=!0,includeSymlinks:i=!0,match:l,maxDepth:a=Number.POSITIVE_INFINITY,skip:c}={}){if(J(e),a<0)return;let f=l?l.map(s=>typeof s=="string"?G(s):s):void 0,p=c?c.map(s=>typeof s=="string"?G(s):s):void 0;if(e=pathe.resolve(K(e)),o&&g(e,t,f,p)&&(yield await Oe(e)),!(a<1||!g(e,void 0,void 0,p)))try{for await(let s of await promises.readdir(e,{withFileTypes:!0})){let m=pathe.join(e,s.name);if(s.isSymbolicLink())if(r)m=await promises.realpath(m);else if(i&&g(m,t,f,p))yield {isDirectory:s.isDirectory,isFile:s.isFile,isSymbolicLink:s.isSymbolicLink,name:s.name,path:m};else continue;s.isSymbolicLink()||s.isDirectory()?yield*H(m,{extensions:t,followSymlinks:r,includeDirs:o,includeFiles:n,includeSymlinks:i,match:f,maxDepth:a-1,skip:p}):s.isFile()&&n&&g(m,t,f,p)&&(yield {isDirectory:s.isDirectory,isFile:s.isFile,isSymbolicLink:s.isSymbolicLink,name:s.name,path:m});}}catch(s){throw s instanceof S?s:new S(s,e)}}var Le=async(e,t={})=>{Array.isArray(t.extensions)||(t.extensions=["js","mjs","cjs","ts"]);let r=[];for await(let o of H(e,t))r.push(o.path);return r},B=Le;new TextEncoder;var w=[".js",".ts",".mjs",".cjs"],X=e=>{let t=pathe.parse(e);for(;t.base&&t.root!==t.dir;){if(fs.readdirSync(t.dir).find(n=>n==="package.json"))return t.dir;t=pathe.parse(t.dir);}return null},q=e=>{let t=`${e}/package.json`,{dependencies:r}=JSON.parse(fs.readFileSync(t).toString());return r?.express?"express":r?.koa&&(r["@koa/router"]||r["koa-router"])?"koa":r?.next?"next":r?.["@hapi/hapi"]?"hapi":r?.fastify?"fastify":null},z=(e,t)=>Object.keys(e).length===0?null:t==="hapi"?typeof e.app.app=="string"?e.app:e:e.app??e;var Q=e=>{try{return fs.statSync(e).isDirectory()}catch{return !1}},Me=async(e="")=>{let t=path.join(e,"pages/api");return !Q(t)&&(t=path.join(e,"src/pages/api"),!Q(t))?[]:B(t,{extensions:w,includeDirs:!1})},Z=Me;var x=async(e,t,r)=>{if(t==="express")return F(e);if(t==="koa")return j(e);if(t==="hapi")return I(e);if(t==="fastify")return L(e);if(t==="next"){let o=await Z(e);if(o.length===0)throw new Error(`No API routes found, in "${e}".`);return o.flatMap(n=>U(n,e,r))}return null};var Ue=(e,t)=>{let r=new Map;return e.forEach(o=>{let n=t(o),i=r.get(n);i?i.push(o):r.set(n,[o]);}),r},ee=Ue;var We=(e,t)=>{let r={ANY:y__default.default.redBright,DELETE:y__default.default.redBright,GET:y__default.default.blue,HEAD:y__default.default.hex("#6C7280"),OPTIONS:y__default.default.hex("#6C7280"),PATCH:y__default.default.yellow,POST:y__default.default.yellow,PUT:y__default.default.yellow},o;if(e==="GET|HEAD")o=`${y__default.default.blue("GET")}${y__default.default.grey("|HEAD")}`;else {let f=r[e](e);o=e==="GET"?`${f}${y__default.default.grey("|HEAD")}`:f;}let n=e==="GET"?6:14-e.length,i=Array.from({length:n}).fill(" ").join(""),l=process.stdout.columns-16-t.length-4,a=l>0?Array.from({length:l}).fill(".").join(""):"",c=t.split("/").map(f=>[":","["].includes(f[0]??"")?y__default.default.yellowBright(f):f).join("/");return ` ${o}${i}${c}${y__default.default.grey(a)}`},_e=(e,t={})=>e.map(r=>{if(!(Array.isArray(t.methods)&&t.methods.includes(r.method)))return r.method==="GET|POST|PUT|PATCH|DELETE|HEAD|OPTIONS"&&(r.method="ANY"),We(r.method,r.path.replace("/pages",""))}).filter(Boolean),k=_e;var Ge=async(e,t,r={})=>{let o=path.join(oe__default.default.cwd(),t);if(!fs.existsSync(o))throw new Error("No such file, invalid path provided.");let n=X(o);if(!n)throw new Error("Please initialize local package.json.");if(e===void 0){let l=q(n);if(!l)throw new Error("Couldn't detect supported back-end framework.");e=l;}let i=null;if(e==="next")i=await x(o,"next",r.verbose??!1);else {if(!fs.statSync(o).isFile())throw new Error(`${o} is directory, but file expected.`);if(!w.includes(path.extname(o)))throw new Error("Please specify application .ts/.js/.mjs/.cjs file.");let l=`${n}/.env`;fs.existsSync(l)&&(await import(`${n}/node_modules/dotenv/lib/main.js`)).config({path:l});let a=path.extname(o)===".ts",c=path.join(n,"node_modules/.bin/tsc");if(a&&!fs.existsSync(c))throw new Error(`Please install typescript in ${n}`);try{if(a)try{child_process.execSync(`${c} --outDir framework-list >&2`,{cwd:n});}catch(s){console.log(`TSC compilation failed. Please resolve issues in your project.
22
- `),console.log(s),fs.rmSync(path.join(n,"framework-list"),{recursive:!0});}let f=a?path.join(n,"framework-list",o.replace(n,"").replace(".ts",".js")):o,{default:p}=await import(f);i=await x(["AsyncFunction","Function"].includes(p.constructor.name)?await p():z(p,e),e,r.verbose??!1);}finally{a&&fs.rmSync(path.join(n,"framework-list"),{recursive:!0});}}if(i===null)throw new Error(`Framework "${e}" is not supported.`);if(Array.isArray(r.includePaths)&&r.includePaths.length>0&&(i=r.includePaths.flatMap(l=>i.filter(a=>a.path.startsWith(l)))),Array.isArray(r.excludePaths)&&r.excludePaths.length>0&&(i=r.excludePaths.flatMap(l=>i.filter(a=>!a.path.startsWith(l)))),typeof r.group=="string"&&r.group!==""){console.log();let l=ee(i,c=>r.group==="path"?c.path.replace("/pages","").split("/")[1]:c.tags[0]??"unsorted"),a=0;l.forEach((c,f)=>{a>0&&console.log();let p=(oe__default.default.stdout.columns-16-f.length)/2,s=p>0?Array.from({length:p}).fill(" ").join(""):"";console.log(s+y__default.default.bold.underline(f)),k(c,r).forEach(m=>{console.log(m);}),a+=1;});}else console.log(),k(i,r).forEach(l=>{console.log(l);});console.log(`
23
- Listed ${y__default.default.greenBright(String(i.length))} HTTP ${i.length===1?"route":"routes"}.
24
- `);},io=Ge;
25
-
26
- exports.a = io;
27
- //# sourceMappingURL=out.js.map
28
- //# sourceMappingURL=chunk-IWQGMV5V.js.map