@@ -3,6 +3,7 @@ import glob from 'glob';
33import fsp from 'fs-promise' ;
44import promisify from '../tools/promisify' ;
55import marked from 'marked' ;
6+ import defaultDescriptions from './src/defaultPropDescriptions' ;
67
78marked . setOptions ( {
89 xhtml : true
@@ -18,6 +19,7 @@ let cleanDoclets = desc => {
1819
1920let cleanDocletValue = str => str . trim ( ) . replace ( / ^ \{ / , '' ) . replace ( / \} $ / , '' ) ;
2021
22+ let quote = str => str && `'${ str } '` ;
2123
2224let isLiteral = str => ( / ^ ( ' | " ) / ) . test ( str . trim ( ) ) ;
2325
@@ -26,10 +28,11 @@ let isLiteral = str => (/^('|")/).test(str.trim());
2628 *
2729 * @param {ComponentMetadata|PropMetadata } obj
2830 */
29- function parseDoclets ( obj ) {
30- obj . doclets = metadata . parseDoclets ( obj . desc || '' ) || { } ;
31- obj . desc = cleanDoclets ( obj . desc || '' ) ;
32- obj . descHtml = marked ( obj . desc || '' ) ;
31+ function parseDoclets ( obj , propName ) {
32+ let desc = obj . desc || defaultDescriptions [ propName ] || '' ;
33+ obj . doclets = metadata . parseDoclets ( desc ) || { } ;
34+ obj . desc = cleanDoclets ( desc ) ;
35+ obj . descHtml = marked ( desc ) ;
3336}
3437
3538/**
@@ -61,7 +64,7 @@ function applyPropDoclets(props, propName) {
6164
6265 // Use @required to mark a prop as required
6366 // useful for custom propTypes where there isn't a `.isRequired` addon
64- if ( doclets . required ) {
67+ if ( doclets . required ) {
6568 prop . required = true ;
6669 }
6770
@@ -71,27 +74,71 @@ function applyPropDoclets(props, propName) {
7174 }
7275}
7376
77+ function addBootstrapPropTypes ( Component , componentData ) {
78+ let propTypes = Component . propTypes || { } ;
79+ let defaultProps = Component . defaultProps || { } ;
80+
81+ function bsPropInfo ( propName ) {
82+ let props = componentData . props ;
83+ let prop = propTypes [ propName ] ;
84+
85+ if ( prop && ! props [ propName ] ) {
86+ let values = prop . _values || [ ] ;
87+
88+ props [ propName ] = {
89+ desc : '' ,
90+ defaultValue : quote ( defaultProps [ propName ] ) ,
91+ type : {
92+ name : 'enum' ,
93+ value : values . map ( v => `"${ v } "` ) ,
94+ }
95+ } ;
96+ }
97+ }
98+
99+ bsPropInfo ( 'bsStyle' ) ;
100+ bsPropInfo ( 'bsSize' ) ;
101+
102+ if ( propTypes . bsClass ) {
103+ componentData . props . bsClass = {
104+ desc : '' ,
105+ defaultValue : quote ( defaultProps . bsClass ) ,
106+ type : { name : 'string' }
107+ } ;
108+ }
109+ }
74110
75111export default function generate ( destination , options = { mixins : true , inferComponent : true } ) {
76112 return globp ( __dirname + '/../src/**/*.js' ) // eslint-disable-line no-path-concat
77113 . then ( files => {
78114 let results = files . map (
79- filename => fsp . readFile ( filename ) . then ( content => metadata ( content , options ) ) ) ;
115+ filename => fsp . readFile ( filename ) . then ( content => metadata ( content , options ) ) ) ;
80116
81117 return Promise . all ( results )
82118 . then ( data => {
83119 let result = { } ;
84120
85121 data . forEach ( components => {
86122 Object . keys ( components ) . forEach ( key => {
123+ let Component ;
124+
125+ try {
126+ // require the actual component to inspect props we can only get a runtime
127+ Component = require ( '../src/' + key ) ;
128+ } catch ( e ) { } //eslint-disable-line
129+
87130 const component = components [ key ] ;
88131
132+ if ( Component ) {
133+ addBootstrapPropTypes ( Component , component ) ;
134+ }
135+
89136 parseDoclets ( component ) ;
90137
91138 Object . keys ( component . props ) . forEach ( propName => {
92139 const prop = component . props [ propName ] ;
93140
94- parseDoclets ( prop ) ;
141+ parseDoclets ( prop , propName ) ;
95142 applyPropDoclets ( component . props , propName ) ;
96143 } ) ;
97144 } ) ;
0 commit comments