Skip to content

Commit

Permalink
Use Merge as it's stricter than the intersection operator
Browse files Browse the repository at this point in the history
Fixes #1167
  • Loading branch information
szmarczak committed Apr 21, 2020
1 parent f839ae7 commit d3b972e
Show file tree
Hide file tree
Showing 3 changed files with 19 additions and 17 deletions.
7 changes: 4 additions & 3 deletions source/create.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@ import {
GotPaginate,
GotStream,
GotRequestFunction,
OptionsWithPagination
OptionsWithPagination,
StreamOptions
} from './types';
import createRejection from './as-promise/create-rejection';
import Request, {kIsNormalizedAlready} from './core';
Expand Down Expand Up @@ -253,12 +254,12 @@ const create = (defaults: InstanceDefaults): Got => {
return results;
}) as GotPaginate['all'];

got.stream = ((url: string | URL, options?: Options) => got(url, {...options, isStream: true})) as GotStream;
got.stream = ((url: string | URL, options?: StreamOptions) => got(url, {...options, isStream: true})) as GotStream;

for (const method of aliases) {
got[method] = ((url: string | URL, options?: Options): GotReturn => got(url, {...options, method})) as GotRequestFunction;

got.stream[method] = ((url: string | URL, options?: Options & {isStream: true}) => {
got.stream[method] = ((url: string | URL, options?: StreamOptions) => {
return got(url, {...options, method, isStream: true});
}) as GotStream;
}
Expand Down
27 changes: 14 additions & 13 deletions source/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,11 @@ export interface ExtendOptions extends Options {
mutableDefaults?: boolean;
}

export type OptionsOfTextResponseBody = Options & {isStream?: false; resolveBodyOnly?: false; responseType?: 'text'};
export type OptionsOfJSONResponseBody = Options & {isStream?: false; resolveBodyOnly?: false; responseType: 'json'};
export type OptionsOfBufferResponseBody = Options & {isStream?: false; resolveBodyOnly?: false; responseType: 'buffer'};
export type OptionsOfTextResponseBody = Merge<Options, {isStream?: false; resolveBodyOnly?: false; responseType?: 'text'}>;
export type OptionsOfJSONResponseBody = Merge<Options, {isStream?: false; resolveBodyOnly?: false; responseType: 'json'}>;
export type OptionsOfBufferResponseBody = Merge<Options, {isStream?: false; resolveBodyOnly?: false; responseType: 'buffer'}>;
export type StrictOptions = Except<Options, 'isStream' | 'responseType' | 'resolveBodyOnly'>;
export type StreamOptions = Merge<Options, {isStream?: true}>;
type ResponseBodyOnly = {resolveBodyOnly: true};

export type OptionsWithPagination<T = unknown> = Merge<Options, PaginationOptions<T>>;
Expand Down Expand Up @@ -72,18 +73,18 @@ export interface GotRequestFunction {
(options: OptionsOfBufferResponseBody): CancelableRequest<Response<Buffer>>;

// `resolveBodyOnly` usage
(url: string | URL, options?: (OptionsOfTextResponseBody & ResponseBodyOnly)): CancelableRequest<string>;
<T>(url: string | URL, options?: (OptionsOfJSONResponseBody & ResponseBodyOnly)): CancelableRequest<T>;
(url: string | URL, options?: (OptionsOfBufferResponseBody & ResponseBodyOnly)): CancelableRequest<Buffer>;
(url: string | URL, options?: (Merge<OptionsOfTextResponseBody, ResponseBodyOnly>)): CancelableRequest<string>;
<T>(url: string | URL, options?: (Merge<OptionsOfJSONResponseBody, ResponseBodyOnly>)): CancelableRequest<T>;
(url: string | URL, options?: (Merge<OptionsOfBufferResponseBody, ResponseBodyOnly>)): CancelableRequest<Buffer>;

(options: (OptionsOfTextResponseBody & ResponseBodyOnly)): CancelableRequest<string>;
<T>(options: (OptionsOfJSONResponseBody & ResponseBodyOnly)): CancelableRequest<T>;
(options: (OptionsOfBufferResponseBody & ResponseBodyOnly)): CancelableRequest<Buffer>;
(options: (Merge<OptionsOfTextResponseBody, ResponseBodyOnly>)): CancelableRequest<string>;
<T>(options: (Merge<OptionsOfJSONResponseBody, ResponseBodyOnly>)): CancelableRequest<T>;
(options: (Merge<OptionsOfBufferResponseBody, ResponseBodyOnly>)): CancelableRequest<Buffer>;

// `asStream` usage
(url: string | URL, options?: Options & {isStream: true}): Request;
(url: string | URL, options?: Merge<Options, {isStream: true}>): Request;

(options: Options & {isStream: true}): Request;
(options: Merge<Options, {isStream: true}>): Request;

// Fallback
(url: string | URL, options?: Options): CancelableRequest | Request;
Expand All @@ -100,8 +101,8 @@ export type HTTPAlias =
| 'delete';

interface GotStreamFunction {
(url: string | URL, options?: Options & {isStream?: true}): Request;
(options?: Options & {isStream?: true}): Request;
(url: string | URL, options?: Merge<Options, {isStream?: true}>): Request;
(options?: Merge<Options, {isStream?: true}>): Request;
}

export type GotStream = GotStreamFunction & Record<HTTPAlias, GotStreamFunction>;
Expand Down
2 changes: 1 addition & 1 deletion test/response-parse.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ const defaultHandler: Handler = (_request, response) => {
test('`options.resolveBodyOnly` works', withServer, async (t, server, got) => {
server.get('/', defaultHandler);

t.deepEqual(await got({responseType: 'json', resolveBodyOnly: true}), dog);
t.deepEqual(await got<object>({responseType: 'json', resolveBodyOnly: true}), dog);
});

test('`options.resolveBodyOnly` combined with `options.throwHttpErrors`', withServer, async (t, server, got) => {
Expand Down

0 comments on commit d3b972e

Please sign in to comment.