Skip to content

Commit 513f636

Browse files
fix: fixed problem preventing using RegleRoot as type parameter for nested objects #149
1 parent 715a6bc commit 513f636

File tree

14 files changed

+641
-3084
lines changed

14 files changed

+641
-3084
lines changed

package.json

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,8 @@
4646
"@playwright/test": "1.52.0",
4747
"@types/node": "catalog:",
4848
"@types/semver": "7.7.0",
49-
"@typescript-eslint/eslint-plugin": "8.35.0",
50-
"@typescript-eslint/parser": "8.35.0",
49+
"@typescript-eslint/eslint-plugin": "catalog:",
50+
"@typescript-eslint/parser": "catalog:",
5151
"@vitejs/plugin-vue": "5.2.4",
5252
"@vitejs/plugin-vue-jsx": "4.2.0",
5353
"@vitest/coverage-istanbul": "3.2.4",
@@ -63,7 +63,7 @@
6363
"happy-dom": "17.6.3",
6464
"husky": "9.1.7",
6565
"lint-staged": "16.1.2",
66-
"nuxt": "3.17.5",
66+
"nuxt": "catalog:",
6767
"pinia-2.2.5": "catalog:",
6868
"playwright": "1.52.0",
6969
"playwright-core": "1.52.0",
@@ -74,8 +74,8 @@
7474
"tsdown": "catalog:",
7575
"tsx": "4.20.3",
7676
"typescript": "catalog:",
77-
"typescript-eslint": "8.35.0",
78-
"vite": "6.3.5",
77+
"typescript-eslint": "catalog:",
78+
"vite": "catalog:",
7979
"vitest": "catalog:",
8080
"vue-3.4": "catalog:",
8181
"vue-eslint-parser": "catalog:",

packages/core/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@
2020
}
2121
},
2222
"devDependencies": {
23-
"@total-typescript/ts-reset": "0.6.1",
23+
"@total-typescript/ts-reset": "catalog:",
2424
"@types/node": "catalog:",
25-
"@typescript-eslint/eslint-plugin": "8.28.0",
26-
"@typescript-eslint/parser": "8.28.0",
25+
"@typescript-eslint/eslint-plugin": "catalog:",
26+
"@typescript-eslint/parser": "catalog:",
2727
"@vue/test-utils": "catalog:",
2828
"eslint": "catalog:",
2929
"eslint-config-prettier": "catalog:",

packages/core/src/types/core/results.types.ts

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,14 @@ import type {
1313
ArrayElement,
1414
ExtendOnlyRealRecord,
1515
ExtractFromGetter,
16+
HasNamedKeys,
1617
JoinDiscriminatedUnions,
1718
Maybe,
1819
MaybeInput,
1920
MaybeOutput,
2021
Prettify,
2122
} from '../utils';
22-
import type { IsUnknown } from 'type-fest';
23+
import type { IsAny, IsUnknown } from 'type-fest';
2324

2425
export type PartialFormState<TState extends Record<string, any>> = [unknown] extends [TState]
2526
? {}
@@ -46,25 +47,33 @@ export type RegleResult<Data extends Record<string, any> | any[] | unknown, TRul
4647
valid: false;
4748
data: IsUnknown<Data> extends true
4849
? unknown
49-
: NonNullable<Data> extends Date | File
50-
? MaybeOutput<Data>
51-
: NonNullable<Data> extends Array<infer U extends Record<string, any>>
52-
? PartialFormState<U>[]
53-
: NonNullable<Data> extends Record<string, any>
54-
? PartialFormState<NonNullable<Data>>
55-
: MaybeOutput<Data>;
50+
: IsAny<Data> extends true
51+
? unknown
52+
: HasNamedKeys<Data> extends true
53+
? NonNullable<Data> extends Date | File
54+
? MaybeOutput<Data>
55+
: NonNullable<Data> extends Array<infer U extends Record<string, any>>
56+
? PartialFormState<U>[]
57+
: NonNullable<Data> extends Record<string, any>
58+
? PartialFormState<NonNullable<Data>>
59+
: MaybeOutput<Data>
60+
: unknown;
5661
}
5762
| {
5863
valid: true;
5964
data: IsUnknown<Data> extends true
6065
? unknown
61-
: Data extends Array<infer U extends Record<string, any>>
62-
? DeepSafeFormState<U, TRules>[]
63-
: Data extends Date | File
64-
? SafeFieldProperty<Data, TRules>
65-
: Data extends Record<string, any>
66-
? DeepSafeFormState<Data, TRules>
67-
: SafeFieldProperty<Data, TRules>;
66+
: IsAny<Data> extends true
67+
? unknown
68+
: HasNamedKeys<Data> extends true
69+
? Data extends Array<infer U extends Record<string, any>>
70+
? DeepSafeFormState<U, TRules>[]
71+
: Data extends Date | File
72+
? SafeFieldProperty<Data, TRules>
73+
: Data extends Record<string, any>
74+
? DeepSafeFormState<Data, TRules>
75+
: SafeFieldProperty<Data, TRules>
76+
: unknown;
6877
};
6978

7079
/**

packages/core/src/types/rules/rule.status.types.ts

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import type { IsUnion } from 'expect-type';
22
import type { EmptyObject, IsEmptyObject, IsUnknown, Or, PartialDeep } from 'type-fest';
3-
import type { Ref, UnwrapNestedRefs } from 'vue';
3+
import type { UnwrapNestedRefs } from 'vue';
44
import type {
55
$InternalRegleCollectionErrors,
66
$InternalRegleCollectionIssues,
@@ -39,7 +39,7 @@ import type {
3939
* @public
4040
*/
4141
export type RegleRoot<
42-
TState extends Record<string, any> = {},
42+
TState extends Record<string, unknown> = {},
4343
TRules extends ReglePartialRuleTree<TState> = Record<string, any>,
4444
TValidationGroups extends Record<string, RegleValidationGroupEntry[]> = never,
4545
TShortcuts extends RegleShortcutDefinition = {},
@@ -146,33 +146,36 @@ export type InferRegleStatusType<
146146
TState extends Record<PropertyKey, any> = any,
147147
TKey extends PropertyKey = string,
148148
TShortcuts extends RegleShortcutDefinition = {},
149-
> = [TState[TKey]] extends [undefined | null]
150-
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
151-
: NonNullable<TState[TKey]> extends Array<infer U extends Record<string, any>>
152-
? ExtendOnlyRealRecord<U> extends true
153-
? TRule extends RegleCollectionRuleDefinition<any, any>
154-
? ExtractFromGetter<TRule['$each']> extends ReglePartialRuleTree<any>
155-
? RegleCollectionStatus<TState[TKey], ExtractFromGetter<TRule['$each']>, TRule, TShortcuts>
149+
> =
150+
HasNamedKeys<TState> extends true
151+
? [TState[TKey]] extends [undefined | null]
152+
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
153+
: NonNullable<TState[TKey]> extends Array<infer U extends Record<string, any>>
154+
? ExtendOnlyRealRecord<U> extends true
155+
? TRule extends RegleCollectionRuleDefinition<any, any>
156+
? ExtractFromGetter<TRule['$each']> extends ReglePartialRuleTree<any>
157+
? RegleCollectionStatus<TState[TKey], ExtractFromGetter<TRule['$each']>, TRule, TShortcuts>
158+
: RegleFieldStatus<TState[TKey], TRule, TShortcuts>
159+
: RegleCollectionStatus<TState[TKey], {}, TRule, TShortcuts>
156160
: RegleFieldStatus<TState[TKey], TRule, TShortcuts>
157-
: RegleCollectionStatus<TState[TKey], {}, TRule, TShortcuts>
158-
: RegleFieldStatus<TState[TKey], TRule, TShortcuts>
159-
: TRule extends ReglePartialRuleTree<any>
160-
? NonNullable<TState[TKey]> extends Array<any>
161-
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
162-
: NonNullable<TState[TKey]> extends Date | File
163-
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
164-
: unknown extends TState[TKey]
161+
: TRule extends ReglePartialRuleTree<any>
162+
? NonNullable<TState[TKey]> extends Array<any>
165163
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
166-
: NonNullable<TState[TKey]> extends Record<PropertyKey, any>
167-
? MaybeVariantStatus<TState[TKey], TRule, TShortcuts>
168-
: RegleFieldStatus<TState[TKey], TRule, TShortcuts>
169-
: NonNullable<TState[TKey]> extends Date | File
170-
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
171-
: unknown extends TState[TKey]
172-
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
173-
: NonNullable<TState[TKey]> extends Record<PropertyKey, any>
174-
? MaybeVariantStatus<TState[TKey], ReglePartialRuleTree<TState[TKey]>, TShortcuts>
175-
: RegleFieldStatus<TState[TKey], TRule, TShortcuts>;
164+
: NonNullable<TState[TKey]> extends Date | File
165+
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
166+
: unknown extends TState[TKey]
167+
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
168+
: NonNullable<TState[TKey]> extends Record<PropertyKey, any>
169+
? MaybeVariantStatus<TState[TKey], TRule, TShortcuts>
170+
: RegleFieldStatus<TState[TKey], TRule, TShortcuts>
171+
: NonNullable<TState[TKey]> extends Date | File
172+
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
173+
: unknown extends TState[TKey]
174+
? RegleFieldStatus<TState[TKey], TRule, TShortcuts>
175+
: NonNullable<TState[TKey]> extends Record<PropertyKey, any>
176+
? MaybeVariantStatus<TState[TKey], ReglePartialRuleTree<TState[TKey]>, TShortcuts>
177+
: RegleFieldStatus<TState[TKey], TRule, TShortcuts>
178+
: RegleCommonStatus<unknown>;
176179

177180
/**
178181
* @internal

packages/core/src/types/utils/misc.types.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { IsAny } from 'type-fest';
21
import type { MaybeRef, Ref, UnwrapNestedRefs, UnwrapRef } from 'vue';
32

43
export type Prettify<T> = T extends infer R

packages/core/src/types/utils/object.types.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,15 +76,17 @@ type NormalizeUnion<TUnion> = RetrieveUnionUnknownValues<
7676
* Combine all members of a union type, merging types for each key, and keeping loose types
7777
*/
7878
export type JoinDiscriminatedUnions<TUnion extends unknown> =
79-
isRecordLiteral<TUnion> extends true
80-
? Prettify<
81-
Partial<
82-
UnionToIntersection<
83-
RemoveCommonKey<UnionToTuple<NonNullable<TUnion>>, keyof NormalizeUnion<NonNullable<TUnion>>>[number]
84-
>
85-
> &
86-
Pick<NormalizeUnion<NonNullable<TUnion>>, keyof NormalizeUnion<NonNullable<TUnion>>>
87-
>
79+
HasNamedKeys<TUnion> extends true
80+
? isRecordLiteral<TUnion> extends true
81+
? Prettify<
82+
Partial<
83+
UnionToIntersection<
84+
RemoveCommonKey<UnionToTuple<NonNullable<TUnion>>, keyof NormalizeUnion<NonNullable<TUnion>>>[number]
85+
>
86+
> &
87+
Pick<NormalizeUnion<NonNullable<TUnion>>, keyof NormalizeUnion<NonNullable<TUnion>>>
88+
>
89+
: TUnion
8890
: TUnion;
8991

9092
export type LazyJoinDiscriminatedUnions<TUnion extends unknown> =

packages/rules/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
"@regle/core": "workspace:*"
1515
},
1616
"devDependencies": {
17-
"@typescript-eslint/eslint-plugin": "8.28.0",
18-
"@typescript-eslint/parser": "8.28.0",
17+
"@typescript-eslint/eslint-plugin": "catalog:",
18+
"@typescript-eslint/parser": "catalog:",
1919
"@types/node": "catalog:",
2020
"@vue/reactivity": "catalog:",
2121
"@vue/test-utils": "catalog:",

packages/schemas/package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,10 @@
3232
}
3333
},
3434
"devDependencies": {
35-
"@total-typescript/ts-reset": "0.6.1",
35+
"@total-typescript/ts-reset": "catalog:",
3636
"@types/node": "catalog:",
37-
"@typescript-eslint/eslint-plugin": "8.28.0",
38-
"@typescript-eslint/parser": "8.28.0",
37+
"@typescript-eslint/eslint-plugin": "catalog:",
38+
"@typescript-eslint/parser": "catalog:",
3939
"@vue/test-utils": "catalog:",
4040
"eslint": "catalog:",
4141
"eslint-config-prettier": "catalog:",

0 commit comments

Comments
 (0)