ecyrbe/zodios

Zodios v10.9.3 brakes path parameters

wilfried-huss opened this issue · 3 comments

With v10.9.3 I get a compilation error on API definitions that worked in previous zodios version.

Here is an abbreviated example that shows the problem:

import { makeApi, Zodios } from "@zodios/core";
import { z } from "zod";

const boosterEndpoints = makeApi([
    {
        method: "post",
        path: "/boosters/:booster/:channel_index/:enabled",
        requestFormat: "json",
        parameters: [
            {
                name: "booster",
                type: "Path",
                schema: z.string(),
            },
            {
                name: "channel_index",
                type: "Path",
                schema: z.number().int(),
            },
            {
                name: "enabled",
                type: "Path",
                schema: z.boolean(),
            },
        ],
        response: z.string(),
    },
]);

export const boosterApi = new Zodios(boosterEndpoints);

boosterApi.post("/boosters/:booster/:channel_index/:enabled", undefined, {
    params: { enabled: true, booster: "booster0", channel_index: 0 },
});

This gives the follow compilation error:

src/api/client/booster.ts:36:7 - error TS2345: Argument of type '{ params: { enabled: boolean; booster: string; channel_index: number; }; }' is not assignable to parameter of type 'DeepReadonlyObject<{ headers?: AxiosHeaders | (Partial<RawAxiosHeaders & { Accept: AxiosHeaderValue; "Content-Length": AxiosHeaderValue; "User-Agent": AxiosHeaderValue; "Content-Encoding": AxiosHeaderValue; Authorization: AxiosHeaderValue; } & { 'Content-Type': ContentType; }> & Partial<{ head: AxiosHeaders; link: AxiosHeaders; get: AxiosHeaders; options: AxiosHeaders; post: AxiosHeaders; put: AxiosHeaders; patch: AxiosHeaders; delete: AxiosHeaders; purge: AxiosHeaders; unlink: AxiosHeaders; } & { common: AxiosHeaders; }>) | undefined; transformRequest?: AxiosRequestTransformer | AxiosRequestTransformer[] | undefined; transformResponse?: AxiosResponseTransformer | AxiosResponseTransformer[] | undefined; paramsSerializer?: ParamsSerializerOptions | CustomParamsSerializer | undefined; timeout?: number | undefined; timeoutErrorMessage?: string | undefined; withCredentials?: boolean | undefined; adapter?: AxiosAdapterConfig | AxiosAdapterConfig[] | undefined; auth?: AxiosBasicCredentials | undefined; responseType?: ResponseType | undefined; responseEncoding?: string | undefined; xsrfCookieName?: string | undefined; xsrfHeaderName?: string | undefined; onUploadProgress?: ((progressEvent: AxiosProgressEvent) => void) | undefined; onDownloadProgress?: ((progressEvent: AxiosProgressEvent) => void) | undefined; maxContentLength?: number | undefined; validateStatus?: ((status: number) => boolean) | null | undefined; maxBodyLength?: number | undefined; maxRedirects?: number | undefined; maxRate?: number | [number, number] | undefined; beforeRedirect?: ((options: Record<string, any>, responseDetails: { headers: Record<string, string>; }) => void) | undefined; socketPath?: string | null | undefined; transport?: any; httpAgent?: any; httpsAgent?: any; proxy?: false | AxiosProxyConfig | undefined; cancelToken?: CancelToken | undefined; decompress?: boolean | undefined; transitional?: TransitionalOptions | undefined; signal?: GenericAbortSignal | undefined; insecureHTTPParser?: boolean | undefined; env?: { FormData?: (new (...args: any[]) => object) | undefined; } | undefined; formSerializer?: FormSerializerOptions | undefined; family?: 6 | 4 | undefined; lookup?: ((hostname: string, options: object, cb: (err: Error | null, address: string, family: number) => void) => void) | ((hostname: string, options: object) => Promise<string | [address: string, family: number]>) | undefined; }>'.
  Object literal may only specify known properties, and 'params' does not exist in type 'DeepReadonlyObject<{ headers?: AxiosHeaders | (Partial<RawAxiosHeaders & { Accept: AxiosHeaderValue; "Content-Length": AxiosHeaderValue; "User-Agent": AxiosHeaderValue; "Content-Encoding": AxiosHeaderValue; Authorization: AxiosHeaderValue; } & { 'Content-Type': ContentType; }> & Partial<{ head: AxiosHeaders; link: AxiosHeaders; get: AxiosHeaders; options: AxiosHeaders; post: AxiosHeaders; put: AxiosHeaders; patch: AxiosHeaders; delete: AxiosHeaders; purge: AxiosHeaders; unlink: AxiosHeaders; } & { common: AxiosHeaders; }>) | undefined; transformRequest?: AxiosRequestTransformer | AxiosRequestTransformer[] | undefined; transformResponse?: AxiosResponseTransformer | AxiosResponseTransformer[] | undefined; paramsSerializer?: ParamsSerializerOptions | CustomParamsSerializer | undefined; timeout?: number | undefined; timeoutErrorMessage?: string | undefined; withCredentials?: boolean | undefined; adapter?: AxiosAdapterConfig | AxiosAdapterConfig[] | undefined; auth?: AxiosBasicCredentials | undefined; responseType?: ResponseType | undefined; responseEncoding?: string | undefined; xsrfCookieName?: string | undefined; xsrfHeaderName?: string | undefined; onUploadProgress?: ((progressEvent: AxiosProgressEvent) => void) | undefined; onDownloadProgress?: ((progressEvent: AxiosProgressEvent) => void) | undefined; maxContentLength?: number | undefined; validateStatus?: ((status: number) => boolean) | null | undefined; maxBodyLength?: number | undefined; maxRedirects?: number | undefined; maxRate?: number | [number, number] | undefined; beforeRedirect?: ((options: Record<string, any>, responseDetails: { headers: Record<string, string>; }) => void) | undefined; socketPath?: string | null | undefined; transport?: any; httpAgent?: any; httpsAgent?: any; proxy?: false | AxiosProxyConfig | undefined; cancelToken?: CancelToken | undefined; decompress?: boolean | undefined; transitional?: TransitionalOptions | undefined; signal?: GenericAbortSignal | undefined; insecureHTTPParser?: boolean | undefined; env?: { FormData?: (new (...args: any[]) => object) | undefined; } | undefined; formSerializer?: FormSerializerOptions | undefined; family?: 6 | 4 | undefined; lookup?: ((hostname: string, options: object, cb: (err: Error | null, address: string, family: number) => void) => void) | ((hostname: string, options: object) => Promise<string | [address: string, family: number]>) | undefined; }>'.

36     { params: { enabled: true, booster: "booster0", channel_index: 0 } },
         ~~~~~~

With v10.9.2 the same code compiles without issues.

ecyrbe commented

thanks for the report, the bug seeams to happen when having a boolean defined. i'll fix that ASAP

ecyrbe commented

this is fixed in v10.9.4, thanks again for the early report.

Thanks, for fixing the problem so fast.