Passed
Push — main ( 6facca...56d5bd )
by Andrii
02:21
created

src/map.ts   A

Complexity

Total Complexity 3
Complexity/F 1.5

Size

Lines of Code 49
Function Count 2

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 34
dl 0
loc 49
rs 10
c 0
b 0
f 0
wmc 3
mnd 1
bc 1
fnc 2
bpm 0.5
cpm 1.5
noi 0
1
import {
2
  CssModule,
3
} from "./types";
4
import type {
5
  ClassNamesMapping, ClassNamesMap,
6
} from "./index-types";
7
import {resolver} from "./core"
8
import { AnyObject } from "./ts-swiss";
9
10
const {keys: $keys} = Object
11
12
export {
13
  classNamesMap
14
}
15
16
/**
17
 * Set up mapping classnames function
18
 * @example
19
 * ```typescript
20
 * const mapping = classNamesMap(classnames)
21
 * ```
22
 */
23
function classNamesMap<
24
  Source extends CssModule,
25
>(classnames: Source){
26
  const mapper: ClassNamesMapping<Source> = map => mapping(classnames, map)
27
  return mapper
28
}
29
30
function mapping<
31
  Source extends CssModule,
32
  Target extends AnyObject = CssModule,
33
  Map extends ClassNamesMap<Target, Source> = ClassNamesMap<Target, Source>
34
>(
35
  source: Source,
36
  map: Map
37
): {[T in keyof Map]: string} {
38
  const keys = $keys(map) as (keyof Map)[]
39
  , classnames = {} as {[T in keyof Map]: string}
40
41
  for (let i = keys.length; i--;) {
42
    const key = keys[i]
43
    
44
    classnames[key] = resolver(source, map[key]!).join(" ")
45
  }
46
47
  return classnames
48
}
49
50