Passed
Push — main ( 4b1ac8...307470 )
by Andrii
05:26 queued 02:56
created

src/naming.ts   A

Complexity

Total Complexity 4
Complexity/F 2

Size

Lines of Code 95
Function Count 2

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 4
eloc 70
mnd 2
bc 2
fnc 2
dl 0
loc 95
rs 10
bpm 1
cpm 2
noi 0
c 0
b 0
f 0
1
import type {
2
  ClassHash,
3
} from "./types"
4
import type {
5
  CssModule,
6
  ActionsOf,
7
} from "./definitions.defs"
8
import type { Falsy } from "./ts-swiss.defs"
9
import {
10
  joinWithLead,
11
  resolver,
12
  wrapper
13
} from "./core"
14
import { emptize } from "./utils"
15
import { EMPTY_OBJECT } from "./consts.json"
16
import type {
17
  ClassNamingFn,
18
  ClassNaming
19
} from "./index-types.defs"
20
21
emptize(classes)
22
23
export { classNaming }
24
25
/** Set context
26
 * @example
27
 * ```typescript
28
 *   const classes = classNaming(this.props)
29
 *   const classes = classNaming({classnames: require("./some.css"), className?})
30
 *   const classes = classNaming<Props>()
31
 *   const classes = classNaming<MyClassNames>()
32
 * ```
33
 */
34
function classNaming<
35
  Ctx extends {classnames: Source, className?: string},
36
  Source extends CssModule = Ctx["classnames"],
37
  WithClassName extends boolean = Ctx["className"] extends string ? true : false
38
>(
39
  context: Ctx = EMPTY_OBJECT as Ctx
40
): ClassNaming<WithClassName, {}, Source> {
41
  const {classnames, className = ""} = context
42
  classnames && emptize(classnames)
43
  
44
  const host: ClassNamingFn<Source, {}, WithClassName> = (arg0?, arg1?) => classes({
45
    classnames,
46
    className,
47
    stacked: undefined
48
  },
49
    arg0,
50
    arg1
51
  )
52
53
  return wrapper(host, className)
54
}
55
56
/// CONTEXTED. TS-notation not matters
57
58
function classes<
59
  Source extends CssModule,
60
  Actions extends ActionsOf<Source>
61
>(
62
  {
63
    className,
64
    classnames,
65
    stacked: preStacked,
66
  }: {
67
    className: string,
68
    classnames: Source,
69
    stacked: string|undefined
70
  },
71
  arg0?: Falsy | true | Actions,
72
  arg1?: Falsy | Actions
73
): ClassNaming<boolean, {}, Source> {
74
  const source = typeof arg0 === "object" ? arg0 as Actions: arg1 as Actions
75
  , allowed = source && resolver(classnames, source! /* TS-bug? `source` couldn't be `undefined`*/)
76
  , stacked = joinWithLead(preStacked, allowed)
77
  , result = arg0 === true && className
78
  ? joinWithLead(className, stacked)
79
  : stacked
80
  , host: ClassNamingFn<
81
    {[K in Exclude<keyof Source, keyof Actions>]: ClassHash},
82
    {},
83
    boolean
84
  > = (arg0?, arg1?) => classes({classnames, className, stacked: result},
85
    arg0,
86
    arg1
87
  )
88
89
  classnames && emptize(classnames)
90
91
  return wrapper(
92
    host,
93
    result,
94
  )
95
}   
96