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