Skip to content

Commit

Permalink
Fix error type of operation created by createJson* (#265)
Browse files Browse the repository at this point in the history
* fixed docs import typo

* added default request error type to handle unknown coming from error generic param in queries

* Revert "added default request error type to handle unknown coming from error generic param in queries"

This reverts commit b7bb0ab.

* replaced json query and json mutation error type to uncontrollable JsonApiRequest error

* Error generic is removed in create_json_query and create_json_mutation and replaced with default JsonApiRequestsError
  • Loading branch information
StanislavMyakishev committed Feb 14, 2023
1 parent 568cb3a commit 25c051f
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 44 deletions.
5 changes: 5 additions & 0 deletions .changeset/empty-mayflies-count.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@farfetched/core': patch
---

Error generic is removed in create_json_query and create_json_mutation and replaced with default JsonApiRequestsError
2 changes: 1 addition & 1 deletion apps/website/docs/recipes/custom_mutation.md
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ function createAsyncStorageMutation({ storageKey }) {
Of course, it looks pretty verbose, so Farfetched provides a special helper that aims to simplify creation of custom [_Mutation_](/api/primitives/mutation.md) factories — `createHeadlessMutation`. Let us rewrite provided example with this helper 👇

```ts
import { createHeadlessMutation } from '@fafetched/core';
import { createHeadlessMutation } from '@farfetched/core';

function createAsyncStorageMutation({ storageKey }) {
const executeFx = createEffect((value) =>
Expand Down
2 changes: 1 addition & 1 deletion apps/website/docs/recipes/custom_query.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ function createAsyncStorageQuery({ storageKey }) {
Of course, it looks pretty hard, so Farfetched provides a special helper that aims to simplify creation of custom [_Query_](/api/primitives/query) factories — `createHeadlessQuery`. Let us rewrite provided example with this helper 👇

```ts
import { createHeadlessQuery } from '@fafetched/core';
import { createHeadlessQuery } from '@farfetched/core';

function createAsyncStorageQuery({ storageKey }) {
const fetchFx = createEffect(() => asyncLocalStorage.getItem(storageKey));
Expand Down
3 changes: 3 additions & 0 deletions packages/core/src/fetch/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ import { NonOptionalKeys } from '../libs/lohyphen';
import {
AbortError,
HttpError,
InvalidDataError,
NetworkError,
PreparationError,
TimeoutError,
Expand Down Expand Up @@ -153,6 +154,8 @@ export type ApiRequestError =
| NetworkError
| HttpError;

export type JsonApiRequestError = ApiRequestError | InvalidDataError;

export function createApiRequest<
R extends CreationRequestConfig<B>,
P,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { ExecutionMeta } from '../../remote_operation/type';
import { declareParams } from '../../remote_operation/params';
import { createJsonMutation } from '../create_json_mutation';
import { Mutation } from '../type';
import { JsonApiRequestError } from '../../fetch/api';

describe('createJsonMutation', () => {
test('no params and no body in GET', () => {
Expand Down Expand Up @@ -417,6 +418,8 @@ describe('createJsonMutation', () => {
response: { contract: unknownContract },
});

expectTypeOf(mutation).toEqualTypeOf<Mutation<void, unknown, unknown>>();
expectTypeOf(mutation).toEqualTypeOf<
Mutation<void, unknown, JsonApiRequestError>
>();
});
});
18 changes: 5 additions & 13 deletions packages/core/src/mutation/create_json_mutation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { attach, createEvent, Event, sample, type Json } from 'effector';
import { Contract } from '../contract/type';
import { unknownContract } from '../contract/unknown_contract';
import { InvalidDataError } from '../errors/type';
import { ApiRequestError, HttpMethod } from '../fetch/api';
import { ApiRequestError, HttpMethod, JsonApiRequestError } from '../fetch/api';
import { createJsonApiRequest } from '../fetch/json';
import { FetchApiRecord } from '../fetch/lib';
import { ParamsDeclaration } from '../remote_operation/params';
Expand Down Expand Up @@ -84,7 +84,6 @@ export function createJsonMutation<
Params,
Data,
TransformedData,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -111,17 +110,12 @@ export function createJsonMutation<
status?: { expected: number | number[] };
};
}
): Mutation<
Params,
TransformedData,
ApiRequestError | Error | InvalidDataError
>;
): Mutation<Params, TransformedData, JsonApiRequestError>;

// params + no mapData
export function createJsonMutation<
Params,
Data,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -142,13 +136,12 @@ export function createJsonMutation<
status?: { expected: number | number[] };
};
}
): Mutation<Params, Data, ApiRequestError | Error | InvalidDataError>;
): Mutation<Params, Data, JsonApiRequestError>;

// No params + mapData
export function createJsonMutation<
Data,
TransformedData,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -174,12 +167,11 @@ export function createJsonMutation<
status?: { expected: number | number[] };
};
}
): Mutation<void, TransformedData, ApiRequestError | Error | InvalidDataError>;
): Mutation<void, TransformedData, JsonApiRequestError>;

// No params + no mapData
export function createJsonMutation<
Data,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -199,7 +191,7 @@ export function createJsonMutation<
status?: { expected: number | number[] };
};
}
): Mutation<void, Data, ApiRequestError | Error | InvalidDataError>;
): Mutation<void, Data, JsonApiRequestError>;

// -- Implementation --
export function createJsonMutation(config: any): Mutation<any, any, any> {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { describe, test, expectTypeOf } from 'vitest';
import { unknownContract } from '../../contract/unknown_contract';
import { Query } from '../type';
import { createJsonQuery } from '../create_json_query';
import { JsonApiRequestError } from '../../fetch/api';

describe('createJsonQuery', () => {
test('allow to pass credentials', () => {
Expand All @@ -15,6 +16,8 @@ describe('createJsonQuery', () => {
response: { contract: unknownContract },
});

expectTypeOf(mutation).toEqualTypeOf<Query<void, unknown, unknown>>();
expectTypeOf(mutation).toEqualTypeOf<
Query<void, unknown, JsonApiRequestError>
>();
});
});
36 changes: 9 additions & 27 deletions packages/core/src/query/create_json_query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { attach, createEvent, Event, sample, type Json } from 'effector';

import { Contract } from '../contract/type';
import { createJsonApiRequest } from '../fetch/json';
import { ApiRequestError, HttpMethod } from '../fetch/api';
import { ApiRequestError, HttpMethod, JsonApiRequestError } from '../fetch/api';
import {
normalizeSourced,
type SourcedField,
Expand Down Expand Up @@ -85,7 +85,6 @@ export function createJsonQuery<
Params,
Data,
TransformedData,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -111,13 +110,12 @@ export function createJsonQuery<
validate?: Validator<TransformedData, Params, ValidationSource>;
};
}
): Query<Params, TransformedData, ApiRequestError | Error | InvalidDataError>;
): Query<Params, TransformedData, JsonApiRequestError>;

export function createJsonQuery<
Params,
Data,
TransformedData,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -144,18 +142,12 @@ export function createJsonQuery<
validate?: Validator<TransformedData, Params, ValidationSource>;
};
}
): Query<
Params,
TransformedData,
ApiRequestError | Error | InvalidDataError,
TransformedData
>;
): Query<Params, TransformedData, JsonApiRequestError, TransformedData>;

// params + no mapData
export function createJsonQuery<
Params,
Data,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -175,12 +167,11 @@ export function createJsonQuery<
validate?: Validator<Data, Params, ValidationSource>;
};
}
): Query<Params, Data, ApiRequestError | Error | InvalidDataError>;
): Query<Params, Data, JsonApiRequestError>;

export function createJsonQuery<
Params,
Data,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -201,13 +192,12 @@ export function createJsonQuery<
validate?: Validator<Data, Params, ValidationSource>;
};
}
): Query<Params, Data, ApiRequestError | Error | InvalidDataError, Data>;
): Query<Params, Data, JsonApiRequestError, Data>;

// No params + mapData
export function createJsonQuery<
Data,
TransformedData,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -232,12 +222,11 @@ export function createJsonQuery<
validate?: Validator<TransformedData, void, ValidationSource>;
};
}
): Query<void, TransformedData, ApiRequestError | Error | InvalidDataError>;
): Query<void, TransformedData, JsonApiRequestError>;

export function createJsonQuery<
Data,
TransformedData,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -263,17 +252,11 @@ export function createJsonQuery<
validate?: Validator<TransformedData, void, ValidationSource>;
};
}
): Query<
void,
TransformedData,
ApiRequestError | Error | InvalidDataError,
TransformedData
>;
): Query<void, TransformedData, JsonApiRequestError, TransformedData>;

// No params + no mapData
export function createJsonQuery<
Data,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -292,11 +275,10 @@ export function createJsonQuery<
validate?: Validator<Data, void, ValidationSource>;
};
}
): Query<void, Data, ApiRequestError | Error | InvalidDataError>;
): Query<void, Data, JsonApiRequestError>;

export function createJsonQuery<
Data,
Error,
BodySource = void,
QuerySource = void,
HeadersSource = void,
Expand All @@ -316,7 +298,7 @@ export function createJsonQuery<
validate?: Validator<Data, void, ValidationSource>;
};
}
): Query<void, Data, ApiRequestError | Error | InvalidDataError, Data>;
): Query<void, Data, JsonApiRequestError, Data>;

// -- Implementation --
export function createJsonQuery(config: any) {
Expand Down

0 comments on commit 25c051f

Please sign in to comment.