All files / blong-gogo/src/codec/adapter/openapi request.ts

22.01% Statements 24/109
100% Branches 2/2
100% Functions 1/1
22.01% Lines 24/109

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 1101x 1x 1x 1x 1x 1x 1x 1x 1x 90x 90x 90x 90x 90x 90x 90x 90x 90x 90x 90x 90x 90x                                                                                                                                                                           90x 1x  
import {library} from '@feasibleone/blong/types';
import {type OpenAPIV2} from 'openapi-types';
import interpolate from 'ut-function.interpolate';
 
import {snakeToCamel} from '../../../lib.ts';
 
export default library(
    () =>
        function request({
            url,
            method,
            schemas,
            path,
            responseType,
        }: {
            url: string;
            method: string;
            schemas: OpenAPIV2.ParameterObject[];
            path: string;
            responseType: string;
        }) {
            return (
                msg: {
                    body?: unknown;
                    baseUrl?: string;
                    params?: Record<string, unknown>;
                    payload?: unknown;
                    headers?: Record<string, unknown>;
                    responseType?: string;
                } = {},
            ) => {
                const {params = msg, body, baseUrl, headers, payload} = msg;
                const result: {
                    url: string;
                    method: string;
                    body: unknown;
                    responseType: string | undefined;
                    headers: Record<string, unknown> | undefined;
                    form: Record<string, unknown> | undefined;
                    query: Record<string, unknown> | undefined;
                    json: unknown;
                } = {
                    url: baseUrl ? baseUrl + path : url,
                    method,
                    body,
                    responseType: msg.responseType || responseType,
                    headers: headers as Record<string, unknown> | undefined,
                    form: undefined,
                    query: undefined,
                    json: undefined,
                };
                schemas.forEach(schema => {
                    const identifier = snakeToCamel(schema.name);
                    const param =
                        typeof (params as Record<string, unknown>)[identifier] === 'undefined'
                            ? schema.default
                            : (params as Record<string, unknown>)[identifier];
                    switch (schema.in) {
                        case 'header':
                            if (schema.name.toLocaleLowerCase() === 'content-length') return;
                            result.headers ||= {};
                            result.headers[schema.name] = param;
                            break;
                        case 'query':
                            result.query ||= {};
                            result.query[schema.name] = param;
                            break;
                        case 'formData':
                            result.form ||= {};
                            result.form[schema.name] = param;
                            break;
                        case 'path':
                            result.url = interpolate(result.url, {[schema.name]: param});
                            break;
                        case 'body':
                            if (schema.schema?.properties || schema.schema?.additionalProperties)
                                result.json = schema.schema.additionalProperties
                                    ? payload
                                    : Object.fromEntries(
                                          Object.entries(
                                              schema.schema.properties as Record<
                                                  string,
                                                  {default?: unknown}
                                              >,
                                          )
                                              .map(
                                                  ([name, value]) =>
                                                      name in params && [
                                                          name,
                                                          typeof (
                                                              params as Record<string, unknown>
                                                          )[name] === 'undefined'
                                                              ? value.default
                                                              : (params as Record<string, unknown>)[
                                                                    name
                                                                ],
                                                      ],
                                              )
                                              .filter(Boolean) as [string, unknown][],
                                      );
                            break;
                        default:
                            break;
                    }
                });
                return result;
            };
        },
);