Passed
Push — main ( b61daa...91a216 )
by Andrii
01:54
created

src/naming.ts   A

Complexity

Total Complexity 4
Complexity/F 2

Size

Lines of Code 94
Function Count 2

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 69
dl 0
loc 94
rs 10
c 0
b 0
f 0
wmc 4
mnd 2
bc 2
fnc 2
bpm 1
cpm 2
noi 0

2 Functions

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