@@ -3,26 +3,26 @@ import fs from "fs";
33import path from "path" ;
44import process from "process" ;
55
6- import { createChecker } from "vue-component-meta" ;
6+ import { createChecker , PropertyMeta } from "vue-component-meta" ;
77
88import {
9- getComponents ,
10- fileExist ,
11- getFolders ,
9+ getComponents ,
10+ fileExist ,
11+ getFolders ,
1212} from "../packages/docs/src/utils.ts" ;
1313
1414const __dirname = process . cwd ( ) ;
1515
1616const componentDirectory = "./packages/oruga/src/components" ;
1717
1818if ( ! fileExist ( path . resolve ( __dirname , componentDirectory ) ) )
19- throw new Error ( "Path not exist: " + componentDirectory ) ;
19+ throw new Error ( "Path not exist: " + componentDirectory ) ;
2020
2121console . log ( "Creating vue-component-meta checker..." ) ;
2222// create component meta checker
2323const checker = createChecker (
24- path . resolve ( __dirname , "./packages/oruga/tsconfig.app.json" ) ,
25- { forceUseTs : true , printer : { newLine : 1 } } ,
24+ path . resolve ( __dirname , "./packages/oruga/tsconfig.app.json" ) ,
25+ { forceUseTs : true , printer : { newLine : 1 } } ,
2626) ;
2727
2828// get all component folders
@@ -31,102 +31,102 @@ const component_folders = getFolders(componentDirectory);
3131console . log ( `Processing components...` ) ;
3232
3333const components = component_folders
34- . map ( ( folder ) => {
35- const name = folder . toLowerCase ( ) ;
36- const folderPath = path . resolve ( __dirname , componentDirectory , folder ) ;
37-
38- // get all components in component folder
39- const folderComponents = getComponents ( folderPath ) ;
40-
41- // get all configurable props from all components in folder
42- const props = folderComponents
43- . flatMap ( ( comp ) => {
44- const file = comp + ".vue" ;
45- const componentPath = path . resolve (
46- __dirname ,
47- componentDirectory ,
48- folder ,
49- file ,
50- ) ;
51- const meta = checker . getComponentMeta ( componentPath ) ;
52-
53- if ( ! meta . props . length ) {
54- console . warn (
55- `Failure parsing component '${ name } ': no properties found.` ,
56- ) ;
57- console . log ( "Recreating vue-component-meta checker..." ) ;
58- }
59-
60- return meta . props
61- . filter ( ( prop ) => {
62- // filter only class props and configurable props
63- if ( prop . name . includes ( "Class" ) ) return true ;
64- if ( prop . default ?. includes ( "getDefault" ) ) {
65- const path = ( prop . default . match ( / " ( .* ?) " / ) || [
66- "" ,
67- ] ) [ 0 ] ;
68- return path . includes ( "." ) ;
69- }
70- return false ;
71- } )
72- . map ( ( prop ) => {
73- // remove undefined because we wrap the object with partial
74- if ( prop . type . includes ( "| undefined" ) )
75- prop . type = prop . type . replace ( " | undefined" , "" ) ;
76-
77- // change type for class props
78- if ( prop . type === "ComponentClass" )
79- prop . type = "ClassDefinition" ;
80-
81- if ( prop . name . includes ( "Classes" ) ) {
82- prop . type = "Record<string, any>" ;
83- return prop ;
84- }
85-
86- // change property name based on config path
87- if (
88- prop . default &&
89- prop . default ?. includes ( "getDefault" )
90- ) {
91- let name = ( prop . default . match ( / " ( .* ?) " / ) || [
92- "" ,
93- ] ) [ 0 ] ;
94- name = name . substring ( 1 , name . length - 1 ) ;
95- const split = name . split ( "." ) ;
96- name = split . length == 2 ? split [ 1 ] : split [ 0 ] ;
97- if ( prop . name !== name ) prop . name = name ;
98- }
99-
100- // sort union types
101- if (
102- prop . type . includes ( " | " ) &&
103- ! prop . type . includes ( "(" ) &&
104- ! prop . type . includes ( "[" )
105- )
106- prop . type = prop . type
107- . split ( " | " )
108- . sort ( ( a , b ) => a . localeCompare ( b ) )
109- . join ( " | " ) ;
110-
111- // set deprecated text if available
112- prop . deprecated = prop . tags
113- ?. filter ( ( tag ) => tag . name === "deprecated" )
114- . map ( ( tag ) => tag . text )
115- . join ( "" ) ;
116-
117- return prop ;
118- } ) ;
119- } )
120- // filter duplicates
121- . filter (
122- ( item , idx , self ) =>
123- idx === self . findIndex ( ( p ) => p . name === item . name ) ,
124- ) ;
125-
126- return { name, props } ;
127- } )
128- // sort components by name
129- . sort ( ( a , b ) => a . name . localeCompare ( b . name ) ) ;
34+ . map ( ( folder ) => {
35+ const name = folder . toLowerCase ( ) ;
36+ const folderPath = path . resolve ( __dirname , componentDirectory , folder ) ;
37+
38+ // get all components in component folder
39+ const folderComponents = getComponents ( folderPath ) ;
40+
41+ // get all configurable props from all components in folder
42+ const props = folderComponents
43+ . flatMap ( ( comp ) => {
44+ const file = comp + ".vue" ;
45+ const componentPath = path . resolve (
46+ __dirname ,
47+ componentDirectory ,
48+ folder ,
49+ file ,
50+ ) ;
51+ const meta = checker . getComponentMeta ( componentPath ) ;
52+
53+ if ( ! meta . props . length ) {
54+ console . warn (
55+ `Failure parsing component '${ name } ': no properties found.` ,
56+ ) ;
57+ console . log ( "Recreating vue-component-meta checker..." ) ;
58+ }
59+
60+ return meta . props
61+ . filter ( ( prop ) => {
62+ // filter only class props and configurable props
63+ if ( prop . name . includes ( "Class" ) ) return true ;
64+ if ( prop . default ?. includes ( "getDefault" ) ) {
65+ const path = ( prop . default . match ( / " ( .* ?) " / ) || [
66+ "" ,
67+ ] ) [ 0 ] ;
68+ return path . includes ( "." ) ;
69+ }
70+ return false ;
71+ } )
72+ . map ( ( prop : PropertyMeta & { deprecated ?: string } ) => {
73+ // remove undefined because we wrap the object with partial
74+ if ( prop . type . includes ( "| undefined" ) )
75+ prop . type = prop . type . replace ( " | undefined" , "" ) ;
76+
77+ // change type for class props
78+ if ( prop . type === "ComponentClass" )
79+ prop . type = "ClassDefinition" ;
80+
81+ if ( prop . name . includes ( "Classes" ) ) {
82+ prop . type = "Record<string, any>" ;
83+ return prop ;
84+ }
85+
86+ // change property name based on config path
87+ if (
88+ prop . default &&
89+ prop . default ?. includes ( "getDefault" )
90+ ) {
91+ let name = ( prop . default . match ( / " ( .* ?) " / ) || [
92+ "" ,
93+ ] ) [ 0 ] ;
94+ name = name . substring ( 1 , name . length - 1 ) ;
95+ const split = name . split ( "." ) ;
96+ name = split . length == 2 ? split [ 1 ] : split [ 0 ] ;
97+ if ( prop . name !== name ) prop . name = name ;
98+ }
99+
100+ // sort union types
101+ if (
102+ prop . type . includes ( " | " ) &&
103+ ! prop . type . includes ( "(" ) &&
104+ ! prop . type . includes ( "[" )
105+ )
106+ prop . type = prop . type
107+ . split ( " | " )
108+ . sort ( ( a , b ) => a . localeCompare ( b ) )
109+ . join ( " | " ) ;
110+
111+ // set deprecated text if available
112+ prop . deprecated = prop . tags
113+ ?. filter ( ( tag ) => tag . name === "deprecated" )
114+ . map ( ( tag ) => tag . text )
115+ . join ( "" ) ;
116+
117+ return prop ;
118+ } ) ;
119+ } )
120+ // filter duplicates
121+ . filter (
122+ ( item , idx , self ) =>
123+ idx === self . findIndex ( ( p ) => p . name === item . name ) ,
124+ ) ;
125+
126+ return { name, props } ;
127+ } )
128+ // sort components by name
129+ . sort ( ( a , b ) => a . name . localeCompare ( b . name ) ) ;
130130
131131console . log ( `${ components . length } components processed.` ) ;
132132
@@ -139,28 +139,27 @@ const code = `import type {
139139
140140// Auto generated component theme config definition
141141declare module "../index" {
142- interface OrugaOptions {
143- ${ components . map (
144- ( { name, props } ) =>
145- `${ name . toLowerCase ( ) } ?: ComponentConfigBase &
146- Partial<{${ props
147- . map (
148- ( prop ) => `
149- /**
150- * ${ prop . description } ${
151- prop . deprecated
152- ? `
153- * @deprecated ${ prop . deprecated } `
154- : ""
155- }
156- */
157- ${ prop . name } : ${ prop . type } ;` ,
158- )
159- . join ( "" ) }
160- }>;` ,
161- ) . join ( `
162- ` ) }
163- }
142+ interface OrugaOptions {
143+ ${ components . map ( ( { name, props } ) =>
144+ `${ name . toLowerCase ( ) } ?: ComponentConfigBase &
145+ Partial<{${ props
146+ . map (
147+ ( prop ) => `
148+ /**
149+ * ${ prop . description } ${
150+ prop . deprecated
151+ ? `
152+ * @deprecated ${ prop . deprecated } `
153+ : ""
154+ }
155+ */
156+ ${ prop . name } : ${ prop . type } ;` ,
157+ )
158+ . join ( "" ) }
159+ }>;` ,
160+ ) . join ( `
161+ ` ) }
162+ }
164163}
165164` ;
166165
0 commit comments