@visulima/api-platform 3.0.12 → 3.0.13

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.
@@ -6,8 +6,8 @@ import J from 'debug';
6
6
  import u from 'lodash.merge';
7
7
  import { toXML } from 'jstoxml';
8
8
 
9
- var y=e=>stringify(e,{indent:2}),I=y;var j=e=>e.toLowerCase().replaceAll(/[^\s\w]/gu," ").trimEnd().replaceAll(/\s+|_/gu,"-").replaceAll(/\b\w/gu,n=>n.toUpperCase());var P="application/json",A=(e,n,s)=>{e.responses[n].content===void 0&&(e.responses[n].content={}),e.responses[n].content?.[s]===void 0&&(e.responses[n].content[s]={});},h=(e,n,s)=>{typeof e.components!="object"&&(e.components={}),typeof e.components.schemas!="object"&&(e.components.schemas={}),e.components.schemas[n]===void 0&&(e.components.schemas[n]=s);},E=(e,n,s,o,f)=>{A(e,n,s),e.responses[n].content?.[s]?.schema===void 0&&(e.responses[n].content[s].schema={}),e.responses[n].content[s].schema=f?{items:{$ref:`#/components/schemas/${o}`},type:"array"}:{$ref:`#/components/schemas/${o}`};},M=(e,n,s,o,f,p)=>{let a,t;return Object.entries(n.content).forEach(([c,r])=>{if(typeof r.schema=="object"){let{schema:i}=r;c===P&&r.examples!==void 0?t=r.examples:c===P&&r.example!==void 0&&(a=r.example);let l=i.type==="array";Object.entries(s??{}).forEach(([O,V])=>{if(!V)return;let g;i?.$ref===void 0?(g=`${j(o.trim().replace("/",""))}${O==="application/ld+json"?".jsonld":""}`,h(f,g,i)):g=i.$ref.replace("#/components/schemas/",""),E(e,p,O,g,l);});}}),{example:a,examples:t}},T=(e,n,s,o,f,p)=>{Object.keys(n.content).forEach(a=>{a!==P&&Object.entries(o??{}).forEach(([t,c])=>{if(!c)return;A(e,s,t),e.responses[s].content?.[t]?.example===void 0&&(e.responses[s].content[t].example={});let r=!1;f.forEach(({regex:i,transformer:l})=>{!r&&i.test(t)&&(e.responses[s].content[t].example=l(p),r=!0);}),r||(e.responses[s].content[t].example=p);});});},C=(e,n,s)=>{typeof e.components!="object"&&(e.components={}),typeof e.components.examples!="object"&&(e.components.examples={}),e.components.examples[n]===void 0&&s[n]!==void 0&&(e.components.examples[n]=s[n]);},k=(e,n,s,o,f,p)=>{A(n,s,o),n.responses[s].content?.[o]?.examples===void 0&&(n.responses[s].content[o].examples={});let a={};Object.entries(p).forEach(([t,c])=>{let r=!1;f.forEach(({regex:i,transformer:l})=>{if(!r&&i.test(o)){let O="";e.components?.examples?.[t]?O=e.components.examples[t].value:c.$ref?O=(e.components?.examples?.[c.$ref.replace("#/components/examples/","")]).value:typeof c.value=="string"&&(O=c.value),a[t]={value:l(O)},r=!0;}}),r||(a[t]=e.components?.examples?.[t]===void 0?c:{$ref:`#/components/examples/${t}`});}),n.responses[s].content[o].examples=a;},$=(e,n,s,o,f,p,a,t)=>{let c=`${j(p.trim().replace("/",""))}`;Object.keys(o.content).forEach(r=>{r!==P&&Object.entries(f??{}).forEach(([i,l])=>{l&&(C(e,c,t),k(e,n,s,i,a,t));});});};function m(e,n,s=[{regex:/xml/u,transformer:o=>toXML(o,{header:!0,indent:" "})},{regex:/yaml|yml/,transformer:o=>stringify(o,{indent:2})}]){return typeof e=="object"&&typeof e.paths=="object"&&Object.entries(e.paths).forEach(([o,f])=>{Object.values(f).forEach(p=>{typeof p.responses=="object"&&Object.entries(p.responses).forEach(([a,t])=>{if(typeof t.content=="object"){let{example:c,examples:r}=M(p,t,n,o,e,a);c!==void 0?T(p,t,a,n,s,c):r!==void 0&&$(e,p,a,t,n,o,s,r);}});});}),e}var X=J("visulima:api-platform:swagger:crud:get-static-properties-swagger"),q=(e={})=>{let{allowedMediaTypes:n={"application/json":!0},crud:s,specs:o,swaggerFilePath:f}=e;return async(p,a)=>{let t=join(process.cwd(),f??"swagger/swagger.json");if(!existsSync(t))throw new Error(`Swagger file not found at "${t}".`);let c=readFileSync(t,"utf8"),r=m(JSON.parse(c),n),i={};if(s!==void 0)try{let O=await modelsToOpenApi(s);i={components:{examples:O.examples,schemas:O.schemas},paths:O.paths,tags:O.tags},i=m(i,n),X(JSON.stringify(i,null,2)),r=u(r,i);}catch(O){throw console.log(O),new Error("Please install @visulima/crud to use the crud swagger generator.")}Array.isArray(o)&&o.forEach(O=>{r=u(r,m(O,n));});let l;typeof p.headers.accept=="string"&&/yaml|yml/.test(p.headers.accept)?(a.setHeader("Content-Type",p.headers.accept),l=I(r)):(a.setHeader("Content-Type","application/json"),l=JSON.stringify(r,null,2)),a.statusCode=200,a.end(l);}},re=q;
9
+ var y=e=>stringify(e,{indent:2}),I=y;var j=e=>e.toLowerCase().replaceAll(/[^\s\w]/gu," ").trimEnd().replaceAll(/\s+|_/gu,"-").replaceAll(/\b\w/gu,n=>n.toUpperCase());var P="application/json",A=(e,n,s)=>{e.responses[n].content===void 0&&(e.responses[n].content={}),e.responses[n].content?.[s]===void 0&&(e.responses[n].content[s]={});},h=(e,n,s)=>{typeof e.components!="object"&&(e.components={}),typeof e.components.schemas!="object"&&(e.components.schemas={}),e.components.schemas[n]===void 0&&(e.components.schemas[n]=s);},E=(e,n,s,o,f)=>{A(e,n,s),e.responses[n].content?.[s]?.schema===void 0&&(e.responses[n].content[s].schema={}),e.responses[n].content[s].schema=f?{items:{$ref:`#/components/schemas/${o}`},type:"array"}:{$ref:`#/components/schemas/${o}`};},M=(e,n,s,o,f,p)=>{let a,t;return Object.entries(n.content).forEach(([c,r])=>{if(typeof r.schema=="object"){let{schema:i}=r;c===P&&r.examples!==void 0?t=r.examples:c===P&&r.example!==void 0&&(a=r.example);let l=i.type==="array";Object.entries(s??{}).forEach(([O,V])=>{if(!V)return;let g;i?.$ref===void 0?(g=`${j(o.trim().replace("/",""))}${O==="application/ld+json"?".jsonld":""}`,h(f,g,i)):g=i.$ref.replace("#/components/schemas/",""),E(e,p,O,g,l);});}}),{example:a,examples:t}},T=(e,n,s,o,f,p)=>{Object.keys(n.content).forEach(a=>{a!==P&&Object.entries(o??{}).forEach(([t,c])=>{if(!c)return;A(e,s,t),e.responses[s].content?.[t]?.example===void 0&&(e.responses[s].content[t].example={});let r=!1;f.forEach(({regex:i,transformer:l})=>{!r&&i.test(t)&&(e.responses[s].content[t].example=l(p),r=!0);}),r||(e.responses[s].content[t].example=p);});});},C=(e,n,s)=>{typeof e.components!="object"&&(e.components={}),typeof e.components.examples!="object"&&(e.components.examples={}),e.components.examples[n]===void 0&&s[n]!==void 0&&(e.components.examples[n]=s[n]);},k=(e,n,s,o,f,p)=>{A(n,s,o),n.responses[s].content?.[o]?.examples===void 0&&(n.responses[s].content[o].examples={});let a={};Object.entries(p).forEach(([t,c])=>{let r=!1;f.forEach(({regex:i,transformer:l})=>{if(!r&&i.test(o)){let O="";e.components?.examples?.[t]?O=e.components.examples[t].value:c.$ref?O=(e.components?.examples?.[c.$ref.replace("#/components/examples/","")]).value:typeof c.value=="string"&&(O=c.value),a[t]={value:l(O)},r=!0;}}),r||(a[t]=e.components?.examples?.[t]===void 0?c:{$ref:`#/components/examples/${t}`});}),n.responses[s].content[o].examples=a;},v=(e,n,s,o,f,p,a,t)=>{let c=j(p.trim().replace("/",""));Object.keys(o.content).forEach(r=>{r!==P&&Object.entries(f??{}).forEach(([i,l])=>{l&&(C(e,c,t),k(e,n,s,i,a,t));});});};function m(e,n,s=[{regex:/xml/u,transformer:o=>toXML(o,{header:!0,indent:" "})},{regex:/yaml|yml/,transformer:o=>stringify(o,{indent:2})}]){return typeof e=="object"&&typeof e.paths=="object"&&Object.entries(e.paths).forEach(([o,f])=>{Object.values(f).forEach(p=>{typeof p.responses=="object"&&Object.entries(p.responses).forEach(([a,t])=>{if(typeof t.content=="object"){let{example:c,examples:r}=M(p,t,n,o,e,a);c!==void 0?T(p,t,a,n,s,c):r!==void 0&&v(e,p,a,t,n,o,s,r);}});});}),e}var X=J("visulima:api-platform:swagger:crud:get-static-properties-swagger"),q=(e={})=>{let{allowedMediaTypes:n={"application/json":!0},crud:s,specs:o,swaggerFilePath:f}=e;return async(p,a)=>{let t=join(process.cwd(),f??"swagger/swagger.json");if(!existsSync(t))throw new Error(`Swagger file not found at "${t}".`);let c=readFileSync(t,"utf8"),r=m(JSON.parse(c),n),i={};if(s!==void 0)try{let O=await modelsToOpenApi(s);i={components:{examples:O.examples,schemas:O.schemas},paths:O.paths,tags:O.tags},i=m(i,n),X(JSON.stringify(i,null,2)),r=u(r,i);}catch(O){throw console.log(O),new Error("Please install @visulima/crud to use the crud swagger generator.")}Array.isArray(o)&&o.forEach(O=>{r=u(r,m(O,n));});let l;typeof p.headers.accept=="string"&&/yaml|yml/.test(p.headers.accept)?(a.setHeader("Content-Type",p.headers.accept),l=I(r)):(a.setHeader("Content-Type","application/json"),l=JSON.stringify(r,null,2)),a.statusCode=200,a.end(l);}},re=q;
10
10
 
11
11
  export { j as a, I as b, re as c };
12
12
  //# sourceMappingURL=out.js.map
13
- //# sourceMappingURL=chunk-IRBDVWUD.mjs.map
13
+ //# sourceMappingURL=chunk-T4ABIWHW.mjs.map
@@ -0,0 +1 @@
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","modelsToOpenApi","join","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\";\n\nimport type { ModelsToOpenApiParameters, SwaggerModelsConfig } from \"@visulima/crud\";\nimport { modelsToOpenApi } from \"@visulima/crud\";\nimport { join } from \"@visulima/path\";\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 = 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"]}
@@ -14,10 +14,10 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
14
14
  var H__default = /*#__PURE__*/_interopDefault(H);
15
15
  var I__default = /*#__PURE__*/_interopDefault(I);
16
16
 
17
- var R=e=>yaml.stringify(e,{indent:2}),A=R;var d=e=>e.toLowerCase().replaceAll(/[^\s\w]/gu," ").trimEnd().replaceAll(/\s+|_/gu,"-").replaceAll(/\b\w/gu,n=>n.toUpperCase());var P="application/json",j=(e,n,s)=>{e.responses[n].content===void 0&&(e.responses[n].content={}),e.responses[n].content?.[s]===void 0&&(e.responses[n].content[s]={});},w=(e,n,s)=>{typeof e.components!="object"&&(e.components={}),typeof e.components.schemas!="object"&&(e.components.schemas={}),e.components.schemas[n]===void 0&&(e.components.schemas[n]=s);},h=(e,n,s,o,f)=>{j(e,n,s),e.responses[n].content?.[s]?.schema===void 0&&(e.responses[n].content[s].schema={}),e.responses[n].content[s].schema=f?{items:{$ref:`#/components/schemas/${o}`},type:"array"}:{$ref:`#/components/schemas/${o}`};},E=(e,n,s,o,f,p)=>{let a,t;return Object.entries(n.content).forEach(([c,r])=>{if(typeof r.schema=="object"){let{schema:i}=r;c===P&&r.examples!==void 0?t=r.examples:c===P&&r.example!==void 0&&(a=r.example);let l=i.type==="array";Object.entries(s??{}).forEach(([O,u])=>{if(!u)return;let g;i?.$ref===void 0?(g=`${d(o.trim().replace("/",""))}${O==="application/ld+json"?".jsonld":""}`,w(f,g,i)):g=i.$ref.replace("#/components/schemas/",""),h(e,p,O,g,l);});}}),{example:a,examples:t}},M=(e,n,s,o,f,p)=>{Object.keys(n.content).forEach(a=>{a!==P&&Object.entries(o??{}).forEach(([t,c])=>{if(!c)return;j(e,s,t),e.responses[s].content?.[t]?.example===void 0&&(e.responses[s].content[t].example={});let r=!1;f.forEach(({regex:i,transformer:l})=>{!r&&i.test(t)&&(e.responses[s].content[t].example=l(p),r=!0);}),r||(e.responses[s].content[t].example=p);});});},T=(e,n,s)=>{typeof e.components!="object"&&(e.components={}),typeof e.components.examples!="object"&&(e.components.examples={}),e.components.examples[n]===void 0&&s[n]!==void 0&&(e.components.examples[n]=s[n]);},C=(e,n,s,o,f,p)=>{j(n,s,o),n.responses[s].content?.[o]?.examples===void 0&&(n.responses[s].content[o].examples={});let a={};Object.entries(p).forEach(([t,c])=>{let r=!1;f.forEach(({regex:i,transformer:l})=>{if(!r&&i.test(o)){let O="";e.components?.examples?.[t]?O=e.components.examples[t].value:c.$ref?O=(e.components?.examples?.[c.$ref.replace("#/components/examples/","")]).value:typeof c.value=="string"&&(O=c.value),a[t]={value:l(O)},r=!0;}}),r||(a[t]=e.components?.examples?.[t]===void 0?c:{$ref:`#/components/examples/${t}`});}),n.responses[s].content[o].examples=a;},k=(e,n,s,o,f,p,a,t)=>{let c=`${d(p.trim().replace("/",""))}`;Object.keys(o.content).forEach(r=>{r!==P&&Object.entries(f??{}).forEach(([i,l])=>{l&&(T(e,c,t),C(e,n,s,i,a,t));});});};function m(e,n,s=[{regex:/xml/u,transformer:o=>jstoxml.toXML(o,{header:!0,indent:" "})},{regex:/yaml|yml/,transformer:o=>yaml.stringify(o,{indent:2})}]){return typeof e=="object"&&typeof e.paths=="object"&&Object.entries(e.paths).forEach(([o,f])=>{Object.values(f).forEach(p=>{typeof p.responses=="object"&&Object.entries(p.responses).forEach(([a,t])=>{if(typeof t.content=="object"){let{example:c,examples:r}=E(p,t,n,o,e,a);c!==void 0?M(p,t,a,n,s,c):r!==void 0&&k(e,p,a,t,n,o,s,r);}});});}),e}var J=H__default.default("visulima:api-platform:swagger:crud:get-static-properties-swagger"),X=(e={})=>{let{allowedMediaTypes:n={"application/json":!0},crud:s,specs:o,swaggerFilePath:f}=e;return async(p,a)=>{let t=path.join(process.cwd(),f??"swagger/swagger.json");if(!fs.existsSync(t))throw new Error(`Swagger file not found at "${t}".`);let c=fs.readFileSync(t,"utf8"),r=m(JSON.parse(c),n),i={};if(s!==void 0)try{let O=await crud.modelsToOpenApi(s);i={components:{examples:O.examples,schemas:O.schemas},paths:O.paths,tags:O.tags},i=m(i,n),J(JSON.stringify(i,null,2)),r=I__default.default(r,i);}catch(O){throw console.log(O),new Error("Please install @visulima/crud to use the crud swagger generator.")}Array.isArray(o)&&o.forEach(O=>{r=I__default.default(r,m(O,n));});let l;typeof p.headers.accept=="string"&&/yaml|yml/.test(p.headers.accept)?(a.setHeader("Content-Type",p.headers.accept),l=A(r)):(a.setHeader("Content-Type","application/json"),l=JSON.stringify(r,null,2)),a.statusCode=200,a.end(l);}},oe=X;
17
+ var R=e=>yaml.stringify(e,{indent:2}),A=R;var d=e=>e.toLowerCase().replaceAll(/[^\s\w]/gu," ").trimEnd().replaceAll(/\s+|_/gu,"-").replaceAll(/\b\w/gu,n=>n.toUpperCase());var P="application/json",j=(e,n,s)=>{e.responses[n].content===void 0&&(e.responses[n].content={}),e.responses[n].content?.[s]===void 0&&(e.responses[n].content[s]={});},w=(e,n,s)=>{typeof e.components!="object"&&(e.components={}),typeof e.components.schemas!="object"&&(e.components.schemas={}),e.components.schemas[n]===void 0&&(e.components.schemas[n]=s);},h=(e,n,s,o,f)=>{j(e,n,s),e.responses[n].content?.[s]?.schema===void 0&&(e.responses[n].content[s].schema={}),e.responses[n].content[s].schema=f?{items:{$ref:`#/components/schemas/${o}`},type:"array"}:{$ref:`#/components/schemas/${o}`};},E=(e,n,s,o,f,p)=>{let a,t;return Object.entries(n.content).forEach(([c,r])=>{if(typeof r.schema=="object"){let{schema:i}=r;c===P&&r.examples!==void 0?t=r.examples:c===P&&r.example!==void 0&&(a=r.example);let l=i.type==="array";Object.entries(s??{}).forEach(([O,u])=>{if(!u)return;let g;i?.$ref===void 0?(g=`${d(o.trim().replace("/",""))}${O==="application/ld+json"?".jsonld":""}`,w(f,g,i)):g=i.$ref.replace("#/components/schemas/",""),h(e,p,O,g,l);});}}),{example:a,examples:t}},M=(e,n,s,o,f,p)=>{Object.keys(n.content).forEach(a=>{a!==P&&Object.entries(o??{}).forEach(([t,c])=>{if(!c)return;j(e,s,t),e.responses[s].content?.[t]?.example===void 0&&(e.responses[s].content[t].example={});let r=!1;f.forEach(({regex:i,transformer:l})=>{!r&&i.test(t)&&(e.responses[s].content[t].example=l(p),r=!0);}),r||(e.responses[s].content[t].example=p);});});},T=(e,n,s)=>{typeof e.components!="object"&&(e.components={}),typeof e.components.examples!="object"&&(e.components.examples={}),e.components.examples[n]===void 0&&s[n]!==void 0&&(e.components.examples[n]=s[n]);},C=(e,n,s,o,f,p)=>{j(n,s,o),n.responses[s].content?.[o]?.examples===void 0&&(n.responses[s].content[o].examples={});let a={};Object.entries(p).forEach(([t,c])=>{let r=!1;f.forEach(({regex:i,transformer:l})=>{if(!r&&i.test(o)){let O="";e.components?.examples?.[t]?O=e.components.examples[t].value:c.$ref?O=(e.components?.examples?.[c.$ref.replace("#/components/examples/","")]).value:typeof c.value=="string"&&(O=c.value),a[t]={value:l(O)},r=!0;}}),r||(a[t]=e.components?.examples?.[t]===void 0?c:{$ref:`#/components/examples/${t}`});}),n.responses[s].content[o].examples=a;},k=(e,n,s,o,f,p,a,t)=>{let c=d(p.trim().replace("/",""));Object.keys(o.content).forEach(r=>{r!==P&&Object.entries(f??{}).forEach(([i,l])=>{l&&(T(e,c,t),C(e,n,s,i,a,t));});});};function m(e,n,s=[{regex:/xml/u,transformer:o=>jstoxml.toXML(o,{header:!0,indent:" "})},{regex:/yaml|yml/,transformer:o=>yaml.stringify(o,{indent:2})}]){return typeof e=="object"&&typeof e.paths=="object"&&Object.entries(e.paths).forEach(([o,f])=>{Object.values(f).forEach(p=>{typeof p.responses=="object"&&Object.entries(p.responses).forEach(([a,t])=>{if(typeof t.content=="object"){let{example:c,examples:r}=E(p,t,n,o,e,a);c!==void 0?M(p,t,a,n,s,c):r!==void 0&&k(e,p,a,t,n,o,s,r);}});});}),e}var J=H__default.default("visulima:api-platform:swagger:crud:get-static-properties-swagger"),X=(e={})=>{let{allowedMediaTypes:n={"application/json":!0},crud:s,specs:o,swaggerFilePath:f}=e;return async(p,a)=>{let t=path.join(process.cwd(),f??"swagger/swagger.json");if(!fs.existsSync(t))throw new Error(`Swagger file not found at "${t}".`);let c=fs.readFileSync(t,"utf8"),r=m(JSON.parse(c),n),i={};if(s!==void 0)try{let O=await crud.modelsToOpenApi(s);i={components:{examples:O.examples,schemas:O.schemas},paths:O.paths,tags:O.tags},i=m(i,n),J(JSON.stringify(i,null,2)),r=I__default.default(r,i);}catch(O){throw console.log(O),new Error("Please install @visulima/crud to use the crud swagger generator.")}Array.isArray(o)&&o.forEach(O=>{r=I__default.default(r,m(O,n));});let l;typeof p.headers.accept=="string"&&/yaml|yml/.test(p.headers.accept)?(a.setHeader("Content-Type",p.headers.accept),l=A(r)):(a.setHeader("Content-Type","application/json"),l=JSON.stringify(r,null,2)),a.statusCode=200,a.end(l);}},oe=X;
18
18
 
19
19
  exports.a = d;
20
20
  exports.b = A;
21
21
  exports.c = oe;
22
22
  //# sourceMappingURL=out.js.map
23
- //# sourceMappingURL=chunk-IAHCIZME.js.map
23
+ //# sourceMappingURL=chunk-YG667K32.js.map
@@ -0,0 +1 @@
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","modelsToOpenApi","join","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\";\n\nimport type { ModelsToOpenApiParameters, SwaggerModelsConfig } from \"@visulima/crud\";\nimport { modelsToOpenApi } from \"@visulima/crud\";\nimport { join } from \"@visulima/path\";\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 = 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,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
- var chunkGM57ZYYC_js = require('../../../chunk-GM57ZYYC.js');
3
+ var chunkQHJJMANH_js = require('../../../chunk-QHJJMANH.js');
4
4
  require('../../../chunk-4C666HHU.js');
5
5
  var process = require('process');
6
6
 
7
- var i=(o,t="list",r="List all available API routes; Supported frameworks are next, express, koa, hapi and fastify")=>{o.command(t).description(r).option("--framework <framework>","Framework to use, choose from next, express, koa, hapi and fastify").option("-p, --path [path]","...").option("--group [type]","Groups routes. Supported: path, tag").option("--include-path [path]","Includes only routes which contain a given path element. (comma-separated values)",[]).option("--exclude-path [path]","Excludes routes which contain a given path element. (comma-separated values)",[]).option("-v, --verbose","Verbose output.",!1).action(async e=>{try{await chunkGM57ZYYC_js.a(e.framework,e.path,{excludePaths:e.excludePaths??[],group:e.group,includePaths:e.includePath??[],verbose:e.verbose});}catch(s){console.log(),console.error(s),process.exit(1);}});},m=i;
7
+ var i=(o,t="list",r="List all available API routes; Supported frameworks are next, express, koa, hapi and fastify")=>{o.command(t).description(r).option("--framework <framework>","Framework to use, choose from next, express, koa, hapi and fastify").option("-p, --path [path]","...").option("--group [type]","Groups routes. Supported: path, tag").option("--include-path [path]","Includes only routes which contain a given path element. (comma-separated values)",[]).option("--exclude-path [path]","Excludes routes which contain a given path element. (comma-separated values)",[]).option("-v, --verbose","Verbose output.",!1).action(async e=>{try{await chunkQHJJMANH_js.a(e.framework,e.path,{excludePaths:e.excludePaths??[],group:e.group,includePaths:e.includePath??[],verbose:e.verbose});}catch(s){console.log(),console.error(s),process.exit(1);}});},m=i;
8
8
 
9
9
  exports.listCommand = m;
10
10
  //# sourceMappingURL=out.js.map
@@ -1,4 +1,4 @@
1
- import { a } from '../../../chunk-MMLISJII.mjs';
1
+ import { a } from '../../../chunk-JAQUIWDG.mjs';
2
2
  import '../../../chunk-HZWWJL43.mjs';
3
3
  import { exit } from 'node:process';
4
4
 
@@ -1,13 +1,13 @@
1
1
  'use strict';
2
2
 
3
- var chunkGM57ZYYC_js = require('../../chunk-GM57ZYYC.js');
3
+ var chunkQHJJMANH_js = require('../../chunk-QHJJMANH.js');
4
4
  require('../../chunk-4C666HHU.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "listCommand", {
9
9
  enumerable: true,
10
- get: function () { return chunkGM57ZYYC_js.a; }
10
+ get: function () { return chunkQHJJMANH_js.a; }
11
11
  });
12
12
  //# sourceMappingURL=out.js.map
13
13
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { a as listCommand } from '../../chunk-MMLISJII.mjs';
1
+ export { a as listCommand } from '../../chunk-JAQUIWDG.mjs';
2
2
  import '../../chunk-HZWWJL43.mjs';
3
3
  //# sourceMappingURL=out.js.map
4
4
  //# sourceMappingURL=index.mjs.map
@@ -1,6 +1,6 @@
1
1
  'use strict';
2
2
 
3
- var chunkIAHCIZME_js = require('../../chunk-IAHCIZME.js');
3
+ var chunkYG667K32_js = require('../../chunk-YG667K32.js');
4
4
  var chunkMYU5ZKUN_js = require('../../chunk-MYU5ZKUN.js');
5
5
  require('../../chunk-4C666HHU.js');
6
6
  var d = require('fs');
@@ -11,7 +11,7 @@ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
11
11
 
12
12
  var d__default = /*#__PURE__*/_interopDefault(d);
13
13
 
14
- var m=(i={})=>chunkIAHCIZME_js.c(i),l=m;var u=({definition:i,output:r="swagger/swagger.json",sources:p,verbose:g})=>o=>({...o,webpack:(e,t)=>{if(!t.isServer)return e;if(r.startsWith("/")&&(r=r.slice(1)),!r.endsWith(".json"))throw new Error("The output path must end with .json");return e={...e,plugins:[...e.plugins,new jsdocOpenApi.SwaggerCompilerPlugin(`${t.dir}/${r}`,p.map(f=>{let n=path.join(t.dir,f.replace("./",""));return d__default.default.lstatSync(n).isDirectory(),n}),{openapi:"3.0.0",...i},{verbose:g})]},typeof o.webpack=="function"?o.webpack(e,t):e}}),x=u;
14
+ var m=(i={})=>chunkYG667K32_js.c(i),l=m;var u=({definition:i,output:r="swagger/swagger.json",sources:p,verbose:g})=>o=>({...o,webpack:(e,t)=>{if(!t.isServer)return e;if(r.startsWith("/")&&(r=r.slice(1)),!r.endsWith(".json"))throw new Error("The output path must end with .json");return e={...e,plugins:[...e.plugins,new jsdocOpenApi.SwaggerCompilerPlugin(`${t.dir}/${r}`,p.map(f=>{let n=path.join(t.dir,f.replace("./",""));return d__default.default.lstatSync(n).isDirectory(),n}),{openapi:"3.0.0",...i},{verbose:g})]},typeof o.webpack=="function"?o.webpack(e,t):e}}),x=u;
15
15
 
16
16
  Object.defineProperty(exports, "getSwaggerStaticProps", {
17
17
  enumerable: true,
@@ -1,4 +1,4 @@
1
- import { c } from '../../chunk-IRBDVWUD.mjs';
1
+ import { c } from '../../chunk-T4ABIWHW.mjs';
2
2
  export { a as getSwaggerStaticProps } from '../../chunk-GI7VS3DY.mjs';
3
3
  import '../../chunk-HZWWJL43.mjs';
4
4
  import w from 'node:fs';
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var chunkUPRO35MO_js = require('./chunk-UPRO35MO.js');
4
- var chunkIAHCIZME_js = require('./chunk-IAHCIZME.js');
4
+ var chunkYG667K32_js = require('./chunk-YG667K32.js');
5
5
  require('./chunk-4C666HHU.js');
6
6
  var connect = require('@visulima/connect');
7
7
  var q = require('http-errors');
@@ -20,7 +20,7 @@ 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=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;
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=chunkYG667K32_js.b(E(r)?JSON.parse(r):r)):c.includes("xml")&&(t.setHeader(g,c),d=y({[chunkYG667K32_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
25
  Object.defineProperty(exports, "dateIn", {
26
26
  enumerable: true,
@@ -36,11 +36,11 @@ Object.defineProperty(exports, "zod", {
36
36
  });
37
37
  Object.defineProperty(exports, "swaggerHandler", {
38
38
  enumerable: true,
39
- get: function () { return chunkIAHCIZME_js.c; }
39
+ get: function () { return chunkYG667K32_js.c; }
40
40
  });
41
41
  Object.defineProperty(exports, "yamlTransformer", {
42
42
  enumerable: true,
43
- get: function () { return chunkIAHCIZME_js.b; }
43
+ get: function () { return chunkYG667K32_js.b; }
44
44
  });
45
45
  Object.defineProperty(exports, "EdgeRouter", {
46
46
  enumerable: true,
@@ -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-IRBDVWUD.mjs';
3
- export { c as swaggerHandler, b as yamlTransformer } from './chunk-IRBDVWUD.mjs';
2
+ import { b, a } from './chunk-T4ABIWHW.mjs';
3
+ export { c as swaggerHandler, b as yamlTransformer } from './chunk-T4ABIWHW.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.12",
3
+ "version": "3.0.13",
4
4
  "description": "Visulima API platform is a set of tools to build and consume web APIs",
5
5
  "keywords": [
6
6
  "anolilab",
@@ -145,7 +145,7 @@
145
145
  "@anolilab/semantic-release-pnpm": "^1.1.3",
146
146
  "@anolilab/semantic-release-preset": "^9.0.0",
147
147
  "@arthurgeron/eslint-plugin-react-usememo": "^2.4.0",
148
- "@babel/core": "^7.24.7",
148
+ "@babel/core": "^7.24.9",
149
149
  "@hapi/hapi": "^21.3.10",
150
150
  "@koa/router": "^12.0.1",
151
151
  "@secretlint/secretlint-rule-preset-recommend": "^8.2.4",
@@ -167,17 +167,17 @@
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
- "@visulima/crud": "2.0.24",
170
+ "@visulima/crud": "2.0.25",
171
171
  "@visulima/fs": "2.1.10",
172
- "@vitest/coverage-v8": "^1.6.0",
173
- "@vitest/ui": "^1.6.0",
172
+ "@vitest/coverage-v8": "^2.0.3",
173
+ "@vitest/ui": "^2.0.3",
174
174
  "chalk": "5.3.0",
175
175
  "commander": "^12.1.0",
176
176
  "conventional-changelog-conventionalcommits": "8.0.0",
177
177
  "core-js": "^3.37.1",
178
178
  "cors": "^2.8.5",
179
179
  "cross-env": "^7.0.3",
180
- "eslint": "^8.57.0",
180
+ "eslint": "8.57.0",
181
181
  "eslint-plugin-deprecation": "^3.0.0",
182
182
  "eslint-plugin-etc": "^2.0.3",
183
183
  "eslint-plugin-import": "npm:eslint-plugin-i@^2.29.1",
@@ -194,33 +194,33 @@
194
194
  "express": "^4.19.2",
195
195
  "fastify": "^4.28.1",
196
196
  "koa": "^2.15.3",
197
- "mobx": "^6.12.5",
197
+ "mobx": "^6.13.0",
198
198
  "next": "^14.2.4",
199
199
  "next-test-api-route-handler": "^4.0.8",
200
200
  "node-mocks-http": "^1.15.0",
201
201
  "openapi-types": "^12.1.3",
202
- "prettier": "^3.3.2",
202
+ "prettier": "^3.3.3",
203
203
  "rate-limiter-flexible": "^5.0.3",
204
204
  "react": "^18.3.1",
205
205
  "react-dom": "^18.3.1",
206
206
  "redoc": "^2.1.5",
207
- "rimraf": "^5.0.7",
207
+ "rimraf": "5.0.9",
208
208
  "secretlint": "8.2.4",
209
209
  "semantic-release": "24.0.0",
210
210
  "styled-components": "^6.1.11",
211
211
  "swagger-ui-dist": "^5.17.14",
212
212
  "swagger-ui-react": "^5.17.14",
213
213
  "tsup": "^8.1.0",
214
- "type-fest": "^4.20.1",
214
+ "type-fest": "^4.21.0",
215
215
  "typescript": "5.4.5",
216
- "vitest": "^1.6.0",
217
- "webpack": "^5.92.1",
216
+ "vitest": "^2.0.3",
217
+ "webpack": "^5.93.0",
218
218
  "zod": "^3.23.8"
219
219
  },
220
220
  "peerDependencies": {
221
221
  "@hapi/hapi": "^21.3.9",
222
222
  "@koa/router": "^12.0.1",
223
- "@visulima/crud": "2.0.24",
223
+ "@visulima/crud": "2.0.25",
224
224
  "@visulima/readdir": "2.0.12",
225
225
  "chalk": "5.3.0",
226
226
  "commander": "^12.0.0",