1
+ /// <reference path="../src/global.d.ts" />
2
+ import type { CssIdentifiersMap as BootStrap4 } from "../__typing__/bootstrap4.css"
1
3
import type { Cut , Strip , UnionToIntersection } from "../src/ts-swiss.types"
2
4
3
- it ( "stripper" , ( ) => {
4
- type C1 = `${"visible-print" } -${"inline" | "block" | "inline-block" } `| `col${"" | "-y" | "-x" } `| "display"
5
- type Pairs < classes extends string > = {
6
- [ root in Strip < classes , "-" > ] : {
7
- [ m1 in Merge < root , `${root } -${Strip < Cut < classes , `${root } -`, true > , "-" > } `> ] : true
8
- }
9
- }
5
+ type After < Str extends string , Start extends string > = Str extends `${Start } ${infer End } ` ? End : never
6
+ type StrToInt < K extends string > = K extends keyof ReactClassNaming . StrToNum ? ReactClassNaming . StrToNum [ K ] : K
7
+ type Merge < Base extends string , Result extends string > = [ Result ] extends [ never ] ? Base : [ UnionToIntersection < Result > ] extends [ never ] ? Base : Result
8
+
9
+ type RootProps < classes extends string > = {
10
+ [ root in Strip < classes , "-" > ] : Merge < root , `${root } -${Strip < Cut < classes , `${root } -`, true > , "-" > } `>
11
+ } [ Strip < classes , "-" > ]
12
+
13
+ type MiddleProps < classes extends string > = {
14
+ [ root in Strip < classes , "-" , true > ] : Exclude < classes extends `${string } -${root } ` ? never : root , classes >
15
+ } [ Strip < classes , "-" , true > ]
10
16
11
- type Merge < Base extends string , Result extends string > = [ Result ] extends [ never ] ? Base : [ UnionToIntersection < Result > ] extends [ never ] ? Base : Result
17
+ type ValuesQ < classes extends string , props extends string , values extends string > = (
18
+ false
19
+ | values
20
+ | { [ p in props | "_" ] ?: p extends "_" ? values : After < classes , `${p } -`> }
21
+ | [
22
+ values ,
23
+ { [ p in props ] ?: After < classes , `${p } -`> }
24
+ ]
25
+ )
12
26
13
- const checks : Record < string , Pairs < C1 > > = {
14
- "x" : {
15
- visible : { "visible-print" : true } ,
16
- col : { col : true } ,
17
- display : { display : true }
27
+ type Values < classes extends string > = ValuesQ <
28
+ classes ,
29
+ MiddleProps < classes > ,
30
+ StrToInt < Cut < classes , `${MiddleProps < classes > } -`> >
31
+ >
32
+
33
+ type AtomicQuery < classes extends string > = {
34
+ [ p in RootProps < classes > ] ?: Values < After < classes , `${p } -`> >
35
+ }
36
+
37
+ it ( "atomic bootstrap" , ( ) => {
38
+ const check : Record < string , AtomicQuery < keyof BootStrap4 > > = {
39
+ "1" : {
40
+ d : [ "inline" , { lg : "inline-block" } ]
18
41
}
19
42
}
43
+ expect ( check ) . toBeInstanceOf ( Object )
44
+ } )
20
45
21
- expect ( checks ) . toBeInstanceOf ( Object )
22
- } )
46
+ it ( "merge values" , ( ) => {
47
+ type Display = `${"" | "lg-" | "md-" } ${
48
+ "none"
49
+ | `table${"" | "-row" | "-cell" } `
50
+ | "inline"
51
+ | `${"inline-" | "" } ${"block" | "flex" } `
52
+ } `
53
+ const check : Record < string , Values < Display > > = {
54
+ "1" : [ "block" , { lg : "block" } ]
55
+ }
56
+ expect ( check ) . toBeInstanceOf ( Object )
57
+ } )
0 commit comments