Skip to content

Commit 0008100

Browse files
authoredMay 4, 2024
Revert "fix(core): improve NonReadonly type (#1237)" (#1352)
This reverts commit 5b76e3b. Fixes #1348
1 parent 97ced54 commit 0008100

File tree

9 files changed

+59
-60
lines changed

9 files changed

+59
-60
lines changed
 

‎packages/core/src/writers/types.ts

+25-26
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,27 @@
11
export const getOrvalGeneratedTypes = () => `
2-
type IsAny<T> = 0 extends 1 & T ? true : false;
3-
type IsUnknown<T> = IsAny<T> extends true ? false : unknown extends T ? true : false;
4-
type Primitive = string | number | boolean | bigint | symbol | undefined | null;
5-
type isBuiltin = Primitive | Function | Date | Error | RegExp;
6-
type NonReadonly<T> =
7-
T extends Exclude<isBuiltin, Error>
8-
? T
9-
: T extends Map<infer Key, infer Value>
10-
? Map<NonReadonly<Key>, NonReadonly<Value>>
11-
: T extends ReadonlyMap<infer Key, infer Value>
12-
? Map<NonReadonly<Key>, NonReadonly<Value>>
13-
: T extends WeakMap<infer Key, infer Value>
14-
? WeakMap<NonReadonly<Key>, NonReadonly<Value>>
15-
: T extends Set<infer Values>
16-
? Set<NonReadonly<Values>>
17-
: T extends ReadonlySet<infer Values>
18-
? Set<NonReadonly<Values>>
19-
: T extends WeakSet<infer Values>
20-
? WeakSet<NonReadonly<Values>>
21-
: T extends Promise<infer Value>
22-
? Promise<NonReadonly<Value>>
23-
: T extends {}
24-
? { -readonly [Key in keyof T]: NonReadonly<T[Key]> }
25-
: IsUnknown<T> extends true
26-
? unknown
27-
: T;
2+
// https://stackoverflow.com/questions/49579094/typescript-conditional-types-filter-out-readonly-properties-pick-only-requir/49579497#49579497
3+
type IfEquals<X, Y, A = X, B = never> = (<T>() => T extends X ? 1 : 2) extends <
4+
T,
5+
>() => T extends Y ? 1 : 2
6+
? A
7+
: B;
8+
9+
type WritableKeys<T> = {
10+
[P in keyof T]-?: IfEquals<
11+
{ [Q in P]: T[P] },
12+
{ -readonly [Q in P]: T[P] },
13+
P
14+
>;
15+
}[keyof T];
16+
17+
type UnionToIntersection<U> =
18+
(U extends any ? (k: U)=>void : never) extends ((k: infer I)=>void) ? I : never;
19+
type DistributeReadOnlyOverUnions<T> = T extends any ? NonReadonly<T> : never;
20+
21+
type Writable<T> = Pick<T, WritableKeys<T>>;
22+
type NonReadonly<T> = [T] extends [UnionToIntersection<T>] ? {
23+
[P in keyof Writable<T>]: T[P] extends object
24+
? NonReadonly<NonNullable<T[P]>>
25+
: T[P];
26+
} : DistributeReadOnlyOverUnions<T>;
2827
`;

‎samples/angular-app/src/api/endpoints/pets/pets.msw.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const getListPetsResponseMock = (overrideResponse: any = {}): Pets =>
1919
...overrideResponse,
2020
}));
2121

22-
export const getShowPetByIdResponseMock = () =>
22+
export const getShowPetByIdResponseMock = (): Pet =>
2323
(() => ({
2424
id: faker.number.int({ min: 1, max: 99 }),
2525
name: faker.person.firstName(),

‎samples/react-app-with-swr/src/api/endpoints/petstoreFromFileSpecWithTransformer.msw.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ export const getCreatePetsResponseMock = (overrideResponse: any = {}): Pet => ({
3030
...overrideResponse,
3131
});
3232

33-
export const getShowPetByIdResponseMock = () =>
33+
export const getShowPetByIdResponseMock = (): Pet =>
3434
(() => ({
3535
id: faker.number.int({ min: 1, max: 99 }),
3636
name: faker.person.firstName(),

‎samples/react-app/src/api/endpoints/petstoreFromFileSpecWithTransformer.msw.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const getListPetsResponseMock = (overrideResponse: any = {}): Pets =>
1919
...overrideResponse,
2020
}));
2121

22-
export const getShowPetByIdResponseMock = () =>
22+
export const getShowPetByIdResponseMock = (): Pet =>
2323
(() => ({
2424
id: faker.number.int({ min: 1, max: 99 }),
2525
name: faker.person.firstName(),

‎samples/react-query/basic/src/api/endpoints/petstoreFromFileSpecWithTransformer.msw.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ export const getUpdatePetsResponseMock = (overrideResponse: any = {}): Pet =>
268268
},
269269
]);
270270

271-
export const getShowPetByIdResponseMock = () =>
271+
export const getShowPetByIdResponseMock = (): Pet =>
272272
(() => ({
273273
id: faker.number.int({ min: 1, max: 99 }),
274274
name: faker.person.firstName(),

‎samples/react-query/basic/src/api/endpoints/petstoreFromFileSpecWithTransformer.ts

+27-27
Original file line numberDiff line numberDiff line change
@@ -37,33 +37,33 @@ import type {
3737
import { customInstance } from '../mutator/custom-instance';
3838
import type { ErrorType } from '../mutator/custom-instance';
3939

40-
type IsAny<T> = 0 extends 1 & T ? true : false;
41-
type IsUnknown<T> =
42-
IsAny<T> extends true ? false : unknown extends T ? true : false;
43-
type Primitive = string | number | boolean | bigint | symbol | undefined | null;
44-
type isBuiltin = Primitive | Function | Date | Error | RegExp;
45-
type NonReadonly<T> =
46-
T extends Exclude<isBuiltin, Error>
47-
? T
48-
: T extends Map<infer Key, infer Value>
49-
? Map<NonReadonly<Key>, NonReadonly<Value>>
50-
: T extends ReadonlyMap<infer Key, infer Value>
51-
? Map<NonReadonly<Key>, NonReadonly<Value>>
52-
: T extends WeakMap<infer Key, infer Value>
53-
? WeakMap<NonReadonly<Key>, NonReadonly<Value>>
54-
: T extends Set<infer Values>
55-
? Set<NonReadonly<Values>>
56-
: T extends ReadonlySet<infer Values>
57-
? Set<NonReadonly<Values>>
58-
: T extends WeakSet<infer Values>
59-
? WeakSet<NonReadonly<Values>>
60-
: T extends Promise<infer Value>
61-
? Promise<NonReadonly<Value>>
62-
: T extends {}
63-
? { -readonly [Key in keyof T]: NonReadonly<T[Key]> }
64-
: IsUnknown<T> extends true
65-
? unknown
66-
: T;
40+
// https://stackoverflow.com/questions/49579094/typescript-conditional-types-filter-out-readonly-properties-pick-only-requir/49579497#49579497
41+
type IfEquals<X, Y, A = X, B = never> =
42+
(<T>() => T extends X ? 1 : 2) extends <T>() => T extends Y ? 1 : 2 ? A : B;
43+
44+
type WritableKeys<T> = {
45+
[P in keyof T]-?: IfEquals<
46+
{ [Q in P]: T[P] },
47+
{ -readonly [Q in P]: T[P] },
48+
P
49+
>;
50+
}[keyof T];
51+
52+
type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
53+
k: infer I,
54+
) => void
55+
? I
56+
: never;
57+
type DistributeReadOnlyOverUnions<T> = T extends any ? NonReadonly<T> : never;
58+
59+
type Writable<T> = Pick<T, WritableKeys<T>>;
60+
type NonReadonly<T> = [T] extends [UnionToIntersection<T>]
61+
? {
62+
[P in keyof Writable<T>]: T[P] extends object
63+
? NonReadonly<NonNullable<T[P]>>
64+
: T[P];
65+
}
66+
: DistributeReadOnlyOverUnions<T>;
6767

6868
type AwaitedInput<T> = PromiseLike<T> | T;
6969

‎samples/react-query/custom-client/src/api/endpoints/petstoreFromFileSpecWithTransformer.msw.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export const getCreatePetsResponseMock = (overrideResponse: any = {}): Pet => ({
5252
...overrideResponse,
5353
});
5454

55-
export const getShowPetByIdResponseMock = () =>
55+
export const getShowPetByIdResponseMock = (): Pet =>
5656
(() => ({
5757
id: faker.number.int({ min: 1, max: 99 }),
5858
name: faker.person.firstName(),

‎samples/svelte-query/src/api/endpoints/petstoreFromFileSpecWithTransformer.msw.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export const getListPetsResponseMock = (overrideResponse: any = {}): Pets =>
1919
...overrideResponse,
2020
}));
2121

22-
export const getShowPetByIdResponseMock = () =>
22+
export const getShowPetByIdResponseMock = (): Pet =>
2323
(() => ({
2424
id: faker.number.int({ min: 1, max: 99 }),
2525
name: faker.person.firstName(),

‎samples/vue-query/src/api/endpoints/petstoreFromFileSpecWithTransformer.msw.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ export const getCreatePetsResponseMock = (overrideResponse: any = {}): Pet => ({
2828
...overrideResponse,
2929
});
3030

31-
export const getShowPetByIdResponseMock = () =>
31+
export const getShowPetByIdResponseMock = (): Pet =>
3232
(() => ({
3333
id: faker.number.int({ min: 1, max: 99 }),
3434
name: faker.person.firstName(),

0 commit comments

Comments
 (0)
Please sign in to comment.