1
+ const fs = require ( 'fs-extra' )
2
+ const types = fs . readFileSync ( 'src/components/index.d.ts' , 'utf-8' )
3
+ const classes = getTypesClasses ( types )
4
+
5
+ function getTypesClasses ( types ) {
6
+ let classes = { }
7
+ const rawClasses = types . replace ( / ( \r | \n ) / ig, '' ) . match ( / ( .* ?c l a s s ) .* ?( } ) / g)
8
+ rawClasses . forEach ( rawClass => {
9
+ const name = rawClass . match ( / (?< = c l a s s \s + ) .* ?(? = \s + e x t e n d s ) / gs) [ 0 ]
10
+
11
+ const propsRaw = rawClass . substring ( rawClass . indexOf ( '{' ) + 1 , rawClass . indexOf ( '}' ) )
12
+ let props = propsRaw . match ( / ( [ a - z A - Z ] + : ) .* ?(? = [ a - z A - Z ] + : | $ ) / g)
13
+ if ( props ) {
14
+ props = props . map ( prop => prop . trim ( ) )
15
+ }
16
+
17
+ classes [ name ] = {
18
+ isExported : rawClass . includes ( 'export' ) ,
19
+ extend : rawClass . match ( / (?< = e x t e n d s \s + ) .* ?(? = \s + { ) / gs) [ 0 ] ,
20
+ props,
21
+ }
22
+ } )
23
+ Object . entries ( classes ) . forEach ( ( [ key , value ] ) => {
24
+ if ( value . extend !== 'Vue' ) {
25
+ const props = classes [ key ] . props || [ ]
26
+ classes [ key ] . props = [ ...props , ...( classes [ value . extend ] . props ) ]
27
+ }
28
+ } )
29
+ return classes
30
+ }
31
+
32
+ const components = { }
33
+ Object . entries ( classes ) . forEach ( ( [ key , value ] ) => {
34
+ if ( value . isExported ) {
35
+ components [ key ] = value
36
+ }
37
+ } )
38
+
39
+ generateVeturFiles ( components )
40
+
41
+ function generateVeturFiles ( content ) {
42
+ const dir = 'dist/vetur'
43
+ if ( ! fs . existsSync ( dir ) ) {
44
+ fs . mkdirSync ( dir )
45
+ }
46
+
47
+ const attributes = generateAttributes ( content )
48
+ fs . writeFile (
49
+ `dist/vetur/coreui-attributes.json` ,
50
+ attributes ,
51
+ ( ) => ''
52
+ )
53
+
54
+ const tags = generateTags ( content )
55
+ fs . writeFile (
56
+ `dist/vetur/coreui-tags.json` ,
57
+ tags ,
58
+ ( ) => ''
59
+ )
60
+ }
61
+
62
+ function generateTags ( content ) {
63
+ let tags = { }
64
+ Object . entries ( content ) . forEach ( ( [ name , component ] ) => {
65
+ let attributes = [ ]
66
+ if ( component . props ) {
67
+ attributes = component . props . map ( prop => toKebabCase ( prop . split ( ':' ) [ 0 ] ) )
68
+ }
69
+ tags [ name ] = {
70
+ attributes,
71
+ description : ''
72
+ }
73
+ tags [ toKebabCase ( name ) ] = {
74
+ attributes,
75
+ description : ''
76
+ }
77
+ } )
78
+ return JSON . stringify ( tags )
79
+ }
80
+
81
+ function generateAttributes ( content ) {
82
+ let attributes = { }
83
+ Object . entries ( content ) . forEach ( ( [ name , component ] ) => {
84
+ if ( component . props ) {
85
+ component . props . forEach ( prop => {
86
+ const propName = toKebabCase ( prop . split ( ':' ) [ 0 ] )
87
+ const key = name + '/' + propName
88
+ const kebabKey = toKebabCase ( name ) + '/' + propName
89
+ const type = prop . split ( ':' ) [ 1 ] . trim ( )
90
+ const description = ''
91
+
92
+ attributes [ kebabKey ] = {
93
+ type,
94
+ description
95
+ }
96
+ attributes [ key ] = {
97
+ type,
98
+ description
99
+ }
100
+ } )
101
+ }
102
+ } )
103
+ return JSON . stringify ( attributes )
104
+ }
105
+
106
+ function toKebabCase ( str ) {
107
+ const camelCase = str . charAt ( 0 ) . toLowerCase ( ) + str . slice ( 1 )
108
+ return camelCase . replace ( / ( [ a - z ] ) ( [ A - Z ] ) / g, '$1-$2' ) . toLowerCase ( )
109
+ }
0 commit comments