@@ -29,26 +29,79 @@ THE SOFTWARE.
2929// deno-fmt-ignore-file
3030
3131import type { XSchema } from '../types/schema.ts'
32+ import type { XRequired } from '../types/required.ts'
3233import type { XStaticSchema } from './schema.ts'
33- import type { XIsReadonly } from './~readonly.ts'
3434
3535// ------------------------------------------------------------------
36- // ReadonlyOptionalProperties
36+ // IsReadonly
3737// ------------------------------------------------------------------
38- type XReadonlyOptionalProperties < Stack extends string [ ] , Root extends XSchema , Properties extends Record < PropertyKey , XSchema > > = {
39- readonly [ Key in keyof Properties as XIsReadonly < Properties [ Key ] > extends true ? Key : never ] ?: XStaticSchema < Stack , Root , Properties [ Key ] >
40- }
38+ type XIsReadonly < Schema extends XSchema > = (
39+ Schema extends { readOnly : true } ? true :
40+ Schema extends { '~readonly' : true } ? true : // review
41+ false
42+ )
43+ // ------------------------------------------------------------------
44+ // RequiredArray
45+ // ------------------------------------------------------------------
46+ type XRequiredArray < Schema extends XSchema ,
47+ Result extends PropertyKey [ ] = Schema extends XRequired < infer Keys extends string [ ] > ? Keys : [ ]
48+ > = Result
49+ // ------------------------------------------------------------------
50+ // Keys
51+ // ------------------------------------------------------------------
52+ type XReadonlyKeys < Properties extends Record < PropertyKey , XSchema > ,
53+ ReadonlyProperties extends Record < PropertyKey , unknown > = { [ Key in keyof Properties as XIsReadonly < Properties [ Key ] > extends true ? Key : never ] : unknown } ,
54+ Result extends PropertyKey = keyof ReadonlyProperties
55+ > = Result
56+ type XRequiredKeys < Properties extends Record < PropertyKey , XSchema > , RequiredArray extends string [ ] ,
57+ Result extends PropertyKey = RequiredArray extends [ ] ? never : Extract < keyof Properties , RequiredArray [ number ] >
58+ > = Result
59+ type XUnknownKeys < Properties extends Record < PropertyKey , XSchema > , RequiredArray extends string [ ] ,
60+ Result extends PropertyKey = Exclude < RequiredArray [ number ] , keyof Properties >
61+ > = Result
62+ type XOptionalKeys < Properties extends Record < PropertyKey , XSchema > , RequiredArray extends string [ ] ,
63+ Result extends PropertyKey = RequiredArray extends [ ] ? keyof Properties : Exclude < keyof Properties , RequiredArray [ number ] >
64+ > = Result
4165// ------------------------------------------------------------------
42- // OptionalProperties
66+ // Properties
4367// ------------------------------------------------------------------
44- type XOptionalProperties < Stack extends string [ ] , Root extends XSchema , Properties extends Record < PropertyKey , XSchema > > = {
45- [ Key in keyof Properties as XIsReadonly < Properties [ Key ] > extends true ? never : Key ] ?: XStaticSchema < Stack , Root , Properties [ Key ] >
68+ type XReadonlyOptionalProperties < Stack extends string [ ] , Root extends XSchema , OptionalKeys extends PropertyKey , Properties extends Record < PropertyKey , XSchema > > = {
69+ readonly [ Key in Extract < keyof Properties , OptionalKeys > ] ?: XStaticSchema < Stack , Root , Properties [ Key ] >
70+ }
71+ type XReadonlyRequiredProperties < Stack extends string [ ] , Root extends XSchema , RequiredKeys extends PropertyKey , Properties extends Record < PropertyKey , XSchema > > = {
72+ readonly [ Key in Extract < keyof Properties , RequiredKeys > ] : XStaticSchema < Stack , Root , Properties [ Key ] >
73+ }
74+ type XOptionalProperties < Stack extends string [ ] , Root extends XSchema , OptionalKeys extends PropertyKey , Properties extends Record < PropertyKey , XSchema > > = {
75+ [ Key in Extract < keyof Properties , OptionalKeys > ] ?: XStaticSchema < Stack , Root , Properties [ Key ] >
76+ }
77+ type XRequiredProperties < Stack extends string [ ] , Root extends XSchema , RequiredKeys extends PropertyKey , Properties extends Record < PropertyKey , XSchema > > = {
78+ [ Key in Extract < keyof Properties , RequiredKeys > ] : XStaticSchema < Stack , Root , Properties [ Key ] >
79+ }
80+ type XUnknownProperties < UnknownKeys extends PropertyKey > = {
81+ [ Key in UnknownKeys ] : unknown
4682}
4783// ------------------------------------------------------------------
4884// XStaticProperties
4985// ------------------------------------------------------------------
50- export type XStaticProperties < Stack extends string [ ] , Root extends XSchema , Properties extends Record < PropertyKey , XSchema > ,
51- ReadonlyOptional extends Record < PropertyKey , unknown > = XReadonlyOptionalProperties < Stack , Root , Properties > ,
52- Optional extends Record < PropertyKey , unknown > = XOptionalProperties < Stack , Root , Properties > ,
53- Result extends Record < PropertyKey , unknown > = ReadonlyOptional & Optional
86+ export type XStaticProperties < Stack extends string [ ] , Root extends XSchema , Schema extends XSchema , Properties extends Record < PropertyKey , XSchema > ,
87+ RequiredArray extends string [ ] = XRequiredArray < Schema > ,
88+ // Keys
89+ ReadonlyKeys extends PropertyKey = XReadonlyKeys < Properties > ,
90+ OptionalKeys extends PropertyKey = XOptionalKeys < Properties , RequiredArray > ,
91+ RequiredKeys extends PropertyKey = XRequiredKeys < Properties , RequiredArray > ,
92+ UnknownKeys extends PropertyKey = XUnknownKeys < Properties , RequiredArray > ,
93+ // Properties
94+ ReadonlyOptionalProperties extends Record < PropertyKey , unknown > = XReadonlyOptionalProperties < Stack , Root , Extract < OptionalKeys , ReadonlyKeys > , Properties > ,
95+ ReadonlyRequiredProperties extends Record < PropertyKey , unknown > = XReadonlyRequiredProperties < Stack , Root , Extract < RequiredKeys , ReadonlyKeys > , Properties > ,
96+ OptionalProperties extends Record < PropertyKey , unknown > = XOptionalProperties < Stack , Root , Exclude < OptionalKeys , ReadonlyKeys > , Properties > ,
97+ RequiredProperties extends Record < PropertyKey , unknown > = XRequiredProperties < Stack , Root , Exclude < RequiredKeys , ReadonlyKeys > , Properties > ,
98+ UnknownProperties extends Record < PropertyKey , unknown > = XUnknownProperties < UnknownKeys > ,
99+ // Properties
100+ Result extends Record < PropertyKey , unknown > = (
101+ ReadonlyOptionalProperties &
102+ ReadonlyRequiredProperties &
103+ OptionalProperties &
104+ RequiredProperties &
105+ UnknownProperties
106+ )
54107> = Result
0 commit comments