src/atom.types.ts   A
last analyzed

Complexity

Total Complexity 1
Complexity/F 0

Size

Lines of Code 71
Function Count 0

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 1
eloc 56
mnd 1
bc 1
fnc 0
dl 0
loc 71
bpm 0
cpm 0
noi 0
c 0
b 0
f 0
rs 10
1
/// <reference path="../src/global.d.ts" />
2
3
import type { After, Cut, Ever0, Strip, UnionToIntersection } from "../src/ts-swiss.types"
4
import type { CssModule } from "definitions.types"
5
6
export type AtomInGeneral = {
7
  [property: string]: boolean | number | string
8
  | {[record: string]: boolean | number | string}
9
  | [
10
    boolean | number | string,
11
    {[record: string]: boolean | number | string}
12
  ]
13
}
14
15
export type AtomicQuery<
16
  css extends CssModule,
17
  delimiter extends string = "delimiter" extends keyof ReactClassNaming.AtomOptions
18
  ? ReactClassNaming.AtomOptions["delimiter"]
19
  : ReactClassNaming.AtomOptions["$default"]["delimiter"],
20
  selfKey extends string = "selfKey" extends keyof ReactClassNaming.AtomOptions
21
  ? ReactClassNaming.AtomOptions["selfKey"]
22
  : ReactClassNaming.AtomOptions["$default"]["selfKey"]
23
> = {
24
  //TODO #38 Make good values hint here and without delimiter and selfkey
25
  [p in RootProps<keyof css, delimiter>]?: Values<After<keyof css, `${p}${delimiter}`>, delimiter, selfKey>
26
}
27
28
type MergeProps<Base extends string, Result extends string> = [Result] extends [never] ? Base : [UnionToIntersection<Result>] extends [never] ? Base : Result
29
30
type RootProps<
31
  classes extends string,
32
  delimiter extends string
33
> = {
34
  [root in Strip<classes, delimiter>]: MergeProps<root, `${root}${delimiter}${Strip<Cut<classes, `${root}${delimiter}`, true>, delimiter>}`>
35
}[Strip<classes, delimiter>]
36
37
type MiddleProps<
38
  classes extends string,
39
  delimiter extends string
40
> = {
41
  [root in Strip<classes, delimiter, true>]: Exclude<classes extends `${string}${delimiter}${root}` ? never : root, classes>
42
}[Strip<classes, delimiter, true>]
43
44
type ValuesQ<
45
  classes extends string,
46
  props extends string,
47
  values extends boolean|string|number,
48
  delimiter extends string,
49
  selfKey extends string
50
> = (
51
  false
52
  | values
53
  | {[p in props|selfKey]?: p extends selfKey ? values : After<classes, `${p}${delimiter}`>}
54
  | [
55
    values,
56
    {[p in props]?: After<classes, `${p}${delimiter}`>}
57
  ]
58
)
59
60
export type Values<
61
  classes extends string,
62
  delimiter extends string,
63
  selfKey extends string
64
> = ValuesQ<
65
  classes,
66
  MiddleProps<classes, delimiter>,
67
  Ever0<ReactClassNaming.ParseInt<Cut<classes, `${MiddleProps<classes, delimiter>}${delimiter}`>>, true>,
68
  delimiter,
69
  selfKey
70
>
71