Passed
Push — main ( a21397...1da5a1 )
by Andrii
01:49
created

map.ts ➔ mapping   A

Complexity

Conditions 2

Size

Total Lines 19
Code Lines 16

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 2
eloc 16
dl 0
loc 19
rs 9.6
c 0
b 0
f 0
1
import {
2
  Action,
3
  ClassNamesProperty,
4
  CssModule
5
} from "./defs";
6
import {resolver} from "./core"
7
8
const {keys: $keys} = Object
9
10
export default classNamesMap
11
12
function classNamesMap<
13
  Source extends CssModule,
14
>(classnames: Source){
15
  const mapper: ClassNamesMap<Source> = map => mapping(classnames, map)
16
  return mapper
17
}
18
19
type ClassNamesMap<Source extends CssModule> = (
20
  <
21
    Target extends ClassNamesProperty<TargetClasses>,
22
    TargetClasses extends CssModule = CssModule
23
  >(map: {
24
    [T in keyof Target["classnames"]]:
25
      {[S in keyof Source]?: Action}
26
  }) => {classnames: {[T in keyof Target["classnames"]]: string}}
27
)
28
29
function mapping<
30
  Target extends ClassNamesProperty<CssModule>,
31
  Source extends CssModule,
32
>(source: Source, map: {
33
  [T in keyof Target["classnames"]]:
34
    {[S in keyof Source]?: Action}
35
  }
36
): {classnames: {[T in keyof Target["classnames"]]: string}} {
37
  const keys = $keys(map) as (keyof Target["classnames"])[]
38
  , classnames = {} as {[T in keyof Target["classnames"]]: string}
39
40
  for (let i = keys.length; i--;) {
41
    const key = keys[i]
42
    
43
    classnames[key] = resolver(source, map[key]).join(" ")
44
  }
45
46
  return {classnames}
47
}
48
49