src/map.ts   A
last analyzed

Complexity

Total Complexity 5
Complexity/F 2.5

Size

Lines of Code 61
Function Count 2

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 5
eloc 44
mnd 3
bc 3
fnc 2
dl 0
loc 61
rs 10
bpm 1.5
cpm 2.5
noi 0
c 0
b 0
f 0

2 Functions

Rating   Name   Duplication   Size   Complexity  
A map.ts ➔ classNamesMap 0 13 1
A map.ts ➔ mapping 0 31 4
1
import type {
2
  CssModule,
3
} from "./definitions.types";
4
import type {
5
  ClassNamesMapping, ClassNamesMap,
6
} from "./naming.types";
7
import {resolver} from "./core"
8
import type { AnyObject, OmitIndexed } from "./ts-swiss.types";
9
import type { GetProps } from "./react-swiss.types"
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> = (target, map) => mapping(classnames, target, map)
27
  return mapper
28
}
29
30
function mapping<
31
  Source extends CssModule,
32
  Target extends AnyObject,
33
  Mapping extends ClassNamesMap<OmitIndexed<GetProps<Target>>, Source>
34
>(
35
  source: Source,
36
  _: Target,
37
  map: Mapping
38
): {[M in keyof Mapping]: string} {
39
  // TODO #33 change to for-in https://jsbench.me/prkm3gn4ji
40
  const keys = $keys(map) as (keyof Mapping)[]
41
  // TODO = {...keys} + reassign or delete?
42
  , classnames = {} as {[M in keyof Mapping]: string}
43
44
  for (let i = keys.length; i--;) {
45
    const key = keys[i]
46
    , val = map[key]
47
48
    if (val === undefined)
49
      continue
50
51
    classnames[key] = typeof val === "function"
52
    ? `${val}`
53
    : resolver(source,
54
      //@ts-expect-error #27 TS doesn't understand that ClassNaming is first of all function
55
      val
56
    ).join(" ")
57
  }
58
59
  return classnames
60
}
61