2015-03-23 17:55:49 +00:00
|
|
|
/**
|
|
|
|
* Copyright (c) 2015-present, Facebook, Inc.
|
|
|
|
* All rights reserved.
|
|
|
|
*
|
|
|
|
* This source code is licensed under the BSD-style license found in the
|
|
|
|
* LICENSE file in the root directory of this source tree. An additional grant
|
|
|
|
* of patent rights can be found in the PATENTS file in the same directory.
|
|
|
|
*/
|
|
|
|
|
2015-03-19 21:05:07 +00:00
|
|
|
var docgen = require('react-docgen');
|
|
|
|
var docgenHelpers = require('./docgenHelpers');
|
2015-02-12 22:43:41 +00:00
|
|
|
var fs = require('fs');
|
|
|
|
var path = require('path');
|
|
|
|
var slugify = require('../core/slugify');
|
2015-03-13 22:30:31 +00:00
|
|
|
var jsDocs = require('../jsdocs/jsdocs.js');
|
2015-02-12 22:43:41 +00:00
|
|
|
|
2015-09-14 14:35:58 +00:00
|
|
|
var ANDROID_SUFFIX = 'android';
|
|
|
|
var CROSS_SUFFIX = 'cross';
|
|
|
|
var IOS_SUFFIX = 'ios';
|
|
|
|
|
|
|
|
function endsWith(str, suffix) {
|
|
|
|
return str.indexOf(suffix, str.length - suffix.length) !== -1;
|
|
|
|
}
|
|
|
|
|
2015-02-12 22:43:41 +00:00
|
|
|
function getNameFromPath(filepath) {
|
|
|
|
var ext = null;
|
|
|
|
while (ext = path.extname(filepath)) {
|
|
|
|
filepath = path.basename(filepath, ext);
|
|
|
|
}
|
2015-05-07 19:16:48 +00:00
|
|
|
|
2015-03-23 22:22:47 +00:00
|
|
|
if (filepath === 'LayoutPropTypes') {
|
|
|
|
return 'Flexbox';
|
2015-05-07 19:16:48 +00:00
|
|
|
} else if (filepath === 'TransformPropTypes') {
|
|
|
|
return 'Transforms';
|
|
|
|
} else if (filepath === 'TabBarItemIOS') {
|
2015-04-21 17:19:36 +00:00
|
|
|
return 'TabBarIOS.Item';
|
2015-09-22 19:54:04 +00:00
|
|
|
} else if (filepath === 'AnimatedImplementation') {
|
|
|
|
return 'Animated';
|
2015-03-23 22:22:47 +00:00
|
|
|
}
|
2015-02-12 22:43:41 +00:00
|
|
|
return filepath;
|
|
|
|
}
|
|
|
|
|
2015-09-14 14:35:58 +00:00
|
|
|
function getPlatformFromPath(filepath) {
|
|
|
|
var ext = null;
|
|
|
|
while (ext = path.extname(filepath)) {
|
|
|
|
filepath = path.basename(filepath, ext);
|
|
|
|
}
|
2015-09-22 19:54:04 +00:00
|
|
|
|
2015-09-14 14:35:58 +00:00
|
|
|
if (endsWith(filepath, 'Android')) {
|
|
|
|
return ANDROID_SUFFIX;
|
|
|
|
} else if (endsWith(filepath, 'IOS')) {
|
|
|
|
return IOS_SUFFIX;
|
|
|
|
}
|
|
|
|
return CROSS_SUFFIX;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getExample(componentName, componentPlatform) {
|
2015-03-31 19:28:26 +00:00
|
|
|
var path = '../Examples/UIExplorer/' + componentName + 'Example.js';
|
|
|
|
if (!fs.existsSync(path)) {
|
2015-09-14 14:35:58 +00:00
|
|
|
path = '../Examples/UIExplorer/' + componentName + 'Example.'+ componentPlatform +'.js';
|
2015-03-31 21:05:15 +00:00
|
|
|
if (!fs.existsSync(path)) {
|
|
|
|
return;
|
|
|
|
}
|
2015-03-31 19:28:26 +00:00
|
|
|
}
|
|
|
|
return {
|
2015-03-31 19:31:37 +00:00
|
|
|
path: path.replace(/^\.\.\//, ''),
|
2015-03-31 19:28:26 +00:00
|
|
|
content: fs.readFileSync(path).toString(),
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
2015-06-30 21:39:49 +00:00
|
|
|
// Determines whether a component should have a link to a runnable example
|
|
|
|
|
2016-04-04 13:04:54 +00:00
|
|
|
function isRunnable(componentName, componentPlatform) {
|
|
|
|
var path = '../Examples/UIExplorer/' + componentName + 'Example.js';
|
|
|
|
if (!fs.existsSync(path)) {
|
|
|
|
path = '../Examples/UIExplorer/' + componentName + 'Example.'+ componentPlatform +'.js';
|
|
|
|
if (!fs.existsSync(path)) {
|
|
|
|
return false;
|
|
|
|
}
|
2015-06-30 21:39:49 +00:00
|
|
|
}
|
2016-04-04 13:04:54 +00:00
|
|
|
return true;
|
2015-06-30 21:39:49 +00:00
|
|
|
}
|
|
|
|
|
2015-05-07 23:05:30 +00:00
|
|
|
// Hide a component from the sidebar by making it return false from
|
|
|
|
// this function
|
|
|
|
function shouldDisplayInSidebar(componentName) {
|
|
|
|
if (componentName === 'Transforms') {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
function getNextComponent(i) {
|
|
|
|
var next;
|
|
|
|
var filepath = all[i];
|
|
|
|
|
|
|
|
if (all[i + 1]) {
|
|
|
|
var nextComponentName = getNameFromPath(all[i + 1]);
|
|
|
|
|
|
|
|
if (shouldDisplayInSidebar(nextComponentName)) {
|
|
|
|
return slugify(nextComponentName);
|
|
|
|
} else {
|
|
|
|
return getNextComponent(i + 1);
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
return 'network';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2015-03-19 21:05:07 +00:00
|
|
|
function componentsToMarkdown(type, json, filepath, i, styles) {
|
2015-02-12 22:43:41 +00:00
|
|
|
var componentName = getNameFromPath(filepath);
|
2015-09-14 14:35:58 +00:00
|
|
|
var componentPlatform = getPlatformFromPath(filepath);
|
2015-03-05 05:03:24 +00:00
|
|
|
var docFilePath = '../docs/' + componentName + '.md';
|
2015-09-22 19:54:04 +00:00
|
|
|
|
2015-03-05 05:03:24 +00:00
|
|
|
if (fs.existsSync(docFilePath)) {
|
|
|
|
json.fullDescription = fs.readFileSync(docFilePath).toString();
|
|
|
|
}
|
2015-03-12 18:03:32 +00:00
|
|
|
json.type = type;
|
2015-03-31 17:10:05 +00:00
|
|
|
json.filepath = filepath.replace(/^\.\.\//, '');
|
|
|
|
json.componentName = componentName;
|
2015-09-14 14:35:58 +00:00
|
|
|
json.componentPlatform = componentPlatform;
|
2015-03-19 21:05:07 +00:00
|
|
|
if (styles) {
|
|
|
|
json.styles = styles;
|
|
|
|
}
|
2015-09-14 14:35:58 +00:00
|
|
|
json.example = getExample(componentName, componentPlatform);
|
2015-03-05 05:03:24 +00:00
|
|
|
|
2015-05-07 23:05:30 +00:00
|
|
|
// Put Flexbox into the Polyfills category
|
|
|
|
var category = (type === 'style' ? 'Polyfills' : type + 's');
|
|
|
|
var next = getNextComponent(i);
|
|
|
|
|
2015-02-12 22:43:41 +00:00
|
|
|
var res = [
|
|
|
|
'---',
|
|
|
|
'id: ' + slugify(componentName),
|
|
|
|
'title: ' + componentName,
|
2015-03-05 02:10:12 +00:00
|
|
|
'layout: autodocs',
|
2015-05-07 23:05:30 +00:00
|
|
|
'category: ' + category,
|
2015-02-12 22:43:41 +00:00
|
|
|
'permalink: docs/' + slugify(componentName) + '.html',
|
2015-09-14 14:35:58 +00:00
|
|
|
'platform: ' + componentPlatform,
|
2015-05-07 23:05:30 +00:00
|
|
|
'next: ' + next,
|
|
|
|
'sidebar: ' + shouldDisplayInSidebar(componentName),
|
2016-04-04 13:04:54 +00:00
|
|
|
'runnable:' + isRunnable(componentName, componentPlatform),
|
2016-01-31 07:01:14 +00:00
|
|
|
'path:' + json.filepath,
|
2015-02-12 22:43:41 +00:00
|
|
|
'---',
|
2015-03-05 02:10:12 +00:00
|
|
|
JSON.stringify(json, null, 2),
|
2015-02-12 22:43:41 +00:00
|
|
|
].filter(function(line) { return line; }).join('\n');
|
|
|
|
return res;
|
|
|
|
}
|
|
|
|
|
2015-03-25 04:13:55 +00:00
|
|
|
var n;
|
|
|
|
|
|
|
|
function renderComponent(filepath) {
|
|
|
|
var json = docgen.parse(
|
|
|
|
fs.readFileSync(filepath),
|
|
|
|
docgenHelpers.findExportedOrFirst,
|
2016-01-29 10:04:44 +00:00
|
|
|
docgen.defaultHandlers.concat([
|
|
|
|
docgenHelpers.stylePropTypeHandler,
|
|
|
|
docgenHelpers.deprecatedPropTypeHandler,
|
|
|
|
])
|
2015-03-25 04:13:55 +00:00
|
|
|
);
|
2015-05-07 19:50:41 +00:00
|
|
|
|
2015-03-25 04:13:55 +00:00
|
|
|
return componentsToMarkdown('component', json, filepath, n++, styleDocs);
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderAPI(type) {
|
|
|
|
return function(filepath) {
|
|
|
|
var json;
|
|
|
|
try {
|
|
|
|
json = jsDocs(fs.readFileSync(filepath).toString());
|
|
|
|
} catch(e) {
|
2015-09-01 19:41:51 +00:00
|
|
|
console.error('Cannot parse file', filepath, e);
|
2015-03-25 04:13:55 +00:00
|
|
|
json = {};
|
|
|
|
}
|
|
|
|
return componentsToMarkdown(type, json, filepath, n++);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
|
|
|
|
function renderStyle(filepath) {
|
|
|
|
var json = docgen.parse(
|
|
|
|
fs.readFileSync(filepath),
|
|
|
|
docgenHelpers.findExportedObject,
|
|
|
|
[docgen.handlers.propTypeHandler]
|
|
|
|
);
|
2015-05-07 19:50:41 +00:00
|
|
|
|
2015-05-07 23:05:30 +00:00
|
|
|
// Remove deprecated transform props from docs
|
2015-05-07 19:50:41 +00:00
|
|
|
if (filepath === "../Libraries/StyleSheet/TransformPropTypes.js") {
|
|
|
|
['rotation', 'scaleX', 'scaleY', 'translateX', 'translateY'].forEach(function(key) {
|
|
|
|
delete json['props'][key];
|
|
|
|
});
|
|
|
|
}
|
|
|
|
|
2015-03-25 04:13:55 +00:00
|
|
|
return componentsToMarkdown('style', json, filepath, n++);
|
|
|
|
}
|
|
|
|
|
2015-02-12 22:43:41 +00:00
|
|
|
var components = [
|
2015-03-05 05:03:24 +00:00
|
|
|
'../Libraries/Components/ActivityIndicatorIOS/ActivityIndicatorIOS.ios.js',
|
2015-03-10 20:55:54 +00:00
|
|
|
'../Libraries/Components/DatePicker/DatePickerIOS.ios.js',
|
2015-09-14 14:35:58 +00:00
|
|
|
'../Libraries/Components/DrawerAndroid/DrawerLayoutAndroid.android.js',
|
2015-03-03 01:31:26 +00:00
|
|
|
'../Libraries/Image/Image.ios.js',
|
2015-03-21 17:07:45 +00:00
|
|
|
'../Libraries/CustomComponents/ListView/ListView.js',
|
2015-03-13 22:30:31 +00:00
|
|
|
'../Libraries/Components/MapView/MapView.js',
|
2015-08-31 19:23:11 +00:00
|
|
|
'../Libraries/Modal/Modal.js',
|
2015-11-26 05:26:32 +00:00
|
|
|
'../Libraries/CustomComponents/Navigator/Navigator.js',
|
2015-02-12 22:43:41 +00:00
|
|
|
'../Libraries/Components/Navigation/NavigatorIOS.ios.js',
|
2015-03-13 22:30:31 +00:00
|
|
|
'../Libraries/Picker/PickerIOS.ios.js',
|
2016-01-31 01:10:14 +00:00
|
|
|
'../Libraries/Components/Picker/Picker.js',
|
2015-09-14 14:35:58 +00:00
|
|
|
'../Libraries/Components/ProgressBarAndroid/ProgressBarAndroid.android.js',
|
2015-08-31 19:23:11 +00:00
|
|
|
'../Libraries/Components/ProgressViewIOS/ProgressViewIOS.ios.js',
|
2016-01-09 15:43:02 +00:00
|
|
|
'../Libraries/Components/RefreshControl/RefreshControl.js',
|
2015-03-09 18:49:58 +00:00
|
|
|
'../Libraries/Components/ScrollView/ScrollView.js',
|
2015-05-15 03:22:31 +00:00
|
|
|
'../Libraries/Components/SegmentedControlIOS/SegmentedControlIOS.ios.js',
|
2016-04-06 15:50:33 +00:00
|
|
|
'../Libraries/Components/Slider/Slider.js',
|
2015-08-11 17:25:39 +00:00
|
|
|
'../Libraries/Components/SliderIOS/SliderIOS.ios.js',
|
2016-02-03 14:40:39 +00:00
|
|
|
'../Libraries/Components/StatusBar/StatusBar.js',
|
2015-11-18 15:58:21 +00:00
|
|
|
'../Libraries/Components/Switch/Switch.js',
|
2015-03-10 20:55:54 +00:00
|
|
|
'../Libraries/Components/TabBarIOS/TabBarIOS.ios.js',
|
2015-04-21 17:19:36 +00:00
|
|
|
'../Libraries/Components/TabBarIOS/TabBarItemIOS.ios.js',
|
2015-03-03 01:31:26 +00:00
|
|
|
'../Libraries/Text/Text.js',
|
2015-03-31 16:46:45 +00:00
|
|
|
'../Libraries/Components/TextInput/TextInput.js',
|
2015-09-14 14:35:58 +00:00
|
|
|
'../Libraries/Components/ToolbarAndroid/ToolbarAndroid.android.js',
|
2015-02-12 22:43:41 +00:00
|
|
|
'../Libraries/Components/Touchable/TouchableHighlight.js',
|
2015-09-14 14:35:58 +00:00
|
|
|
'../Libraries/Components/Touchable/TouchableNativeFeedback.android.js',
|
2015-03-05 05:03:24 +00:00
|
|
|
'../Libraries/Components/Touchable/TouchableOpacity.js',
|
2015-02-12 22:43:41 +00:00
|
|
|
'../Libraries/Components/Touchable/TouchableWithoutFeedback.js',
|
2015-02-19 00:39:28 +00:00
|
|
|
'../Libraries/Components/View/View.js',
|
2015-10-17 02:25:43 +00:00
|
|
|
'../Libraries/Components/ViewPager/ViewPagerAndroid.android.js',
|
2015-03-18 03:41:06 +00:00
|
|
|
'../Libraries/Components/WebView/WebView.ios.js',
|
2015-02-12 22:43:41 +00:00
|
|
|
];
|
|
|
|
|
2015-03-10 20:55:54 +00:00
|
|
|
var apis = [
|
2015-06-11 03:41:21 +00:00
|
|
|
'../Libraries/ActionSheetIOS/ActionSheetIOS.js',
|
2015-12-18 14:15:22 +00:00
|
|
|
'../Libraries/Utilities/Alert.js',
|
2015-03-18 03:41:06 +00:00
|
|
|
'../Libraries/Utilities/AlertIOS.js',
|
2015-09-22 19:54:04 +00:00
|
|
|
'../Libraries/Animated/src/AnimatedImplementation.js',
|
2015-03-13 22:30:31 +00:00
|
|
|
'../Libraries/AppRegistry/AppRegistry.js',
|
|
|
|
'../Libraries/AppStateIOS/AppStateIOS.ios.js',
|
2016-01-21 19:43:51 +00:00
|
|
|
'../Libraries/AppState/AppState.js',
|
2015-10-27 18:10:59 +00:00
|
|
|
'../Libraries/Storage/AsyncStorage.js',
|
2015-09-14 14:35:58 +00:00
|
|
|
'../Libraries/Utilities/BackAndroid.android.js',
|
2015-03-12 18:03:32 +00:00
|
|
|
'../Libraries/CameraRoll/CameraRoll.js',
|
2016-03-02 16:47:37 +00:00
|
|
|
'../Libraries/Components/Clipboard/Clipboard.js',
|
2016-02-09 17:15:36 +00:00
|
|
|
'../Libraries/Components/DatePickerAndroid/DatePickerAndroid.android.js',
|
2015-10-09 21:44:36 +00:00
|
|
|
'../Libraries/Utilities/Dimensions.js',
|
2015-12-15 15:50:40 +00:00
|
|
|
'../Libraries/Components/Intent/IntentAndroid.android.js',
|
2015-03-18 03:41:06 +00:00
|
|
|
'../Libraries/Interaction/InteractionManager.js',
|
2015-08-25 18:23:41 +00:00
|
|
|
'../Libraries/LayoutAnimation/LayoutAnimation.js',
|
2016-01-31 08:53:01 +00:00
|
|
|
'../Libraries/Linking/Linking.js',
|
2015-03-26 16:32:35 +00:00
|
|
|
'../Libraries/LinkingIOS/LinkingIOS.js',
|
2015-10-07 17:04:42 +00:00
|
|
|
'../Libraries/ReactIOS/NativeMethodsMixin.js',
|
2015-03-18 03:41:06 +00:00
|
|
|
'../Libraries/Network/NetInfo.js',
|
2015-03-25 03:38:29 +00:00
|
|
|
'../Libraries/vendor/react/browser/eventPlugins/PanResponder.js',
|
2015-03-12 18:03:32 +00:00
|
|
|
'../Libraries/Utilities/PixelRatio.js',
|
2015-03-25 03:38:29 +00:00
|
|
|
'../Libraries/PushNotificationIOS/PushNotificationIOS.js',
|
2015-03-12 18:03:32 +00:00
|
|
|
'../Libraries/Components/StatusBar/StatusBarIOS.ios.js',
|
|
|
|
'../Libraries/StyleSheet/StyleSheet.js',
|
2016-02-09 17:15:36 +00:00
|
|
|
'../Libraries/Components/TimePickerAndroid/TimePickerAndroid.android.js',
|
2015-09-14 14:35:58 +00:00
|
|
|
'../Libraries/Components/ToastAndroid/ToastAndroid.android.js',
|
2015-03-18 03:41:06 +00:00
|
|
|
'../Libraries/Vibration/VibrationIOS.ios.js',
|
2016-03-03 12:08:10 +00:00
|
|
|
'../Libraries/Vibration/Vibration.js',
|
2015-03-10 20:55:54 +00:00
|
|
|
];
|
|
|
|
|
2016-02-04 23:45:34 +00:00
|
|
|
var stylesWithPermalink = [
|
2015-03-19 21:05:07 +00:00
|
|
|
'../Libraries/StyleSheet/LayoutPropTypes.js',
|
2015-05-07 19:16:48 +00:00
|
|
|
'../Libraries/StyleSheet/TransformPropTypes.js',
|
2016-02-04 23:45:34 +00:00
|
|
|
'../Libraries/Components/View/ShadowPropTypesIOS.js',
|
|
|
|
];
|
|
|
|
|
|
|
|
var stylesForEmbed = [
|
2015-03-19 21:05:07 +00:00
|
|
|
'../Libraries/Components/View/ViewStylePropTypes.js',
|
|
|
|
'../Libraries/Text/TextStylePropTypes.js',
|
|
|
|
'../Libraries/Image/ImageStylePropTypes.js',
|
|
|
|
];
|
|
|
|
|
2015-03-25 04:13:55 +00:00
|
|
|
var polyfills = [
|
2016-02-11 14:16:34 +00:00
|
|
|
'../Libraries/Geolocation/Geolocation.js',
|
2015-03-25 04:13:55 +00:00
|
|
|
];
|
|
|
|
|
|
|
|
var all = components
|
|
|
|
.concat(apis)
|
2016-02-04 23:45:34 +00:00
|
|
|
.concat(stylesWithPermalink)
|
2015-03-25 04:13:55 +00:00
|
|
|
.concat(polyfills);
|
|
|
|
|
2016-02-04 23:45:34 +00:00
|
|
|
var styleDocs = stylesForEmbed.reduce(function(docs, filepath) {
|
2015-03-19 21:05:07 +00:00
|
|
|
docs[path.basename(filepath).replace(path.extname(filepath), '')] =
|
|
|
|
docgen.parse(
|
|
|
|
fs.readFileSync(filepath),
|
|
|
|
docgenHelpers.findExportedObject,
|
2016-01-25 17:52:51 +00:00
|
|
|
[
|
|
|
|
docgen.handlers.propTypeHandler,
|
|
|
|
docgen.handlers.propTypeCompositionHandler,
|
|
|
|
docgen.handlers.propDocBlockHandler,
|
|
|
|
]
|
2015-03-19 21:05:07 +00:00
|
|
|
);
|
2015-05-05 22:27:43 +00:00
|
|
|
|
2015-03-19 21:05:07 +00:00
|
|
|
return docs;
|
|
|
|
}, {});
|
2015-03-12 18:03:32 +00:00
|
|
|
|
2015-02-12 22:43:41 +00:00
|
|
|
module.exports = function() {
|
2015-03-25 04:13:55 +00:00
|
|
|
n = 0;
|
2015-03-12 18:03:32 +00:00
|
|
|
return [].concat(
|
2015-03-25 04:13:55 +00:00
|
|
|
components.map(renderComponent),
|
|
|
|
apis.map(renderAPI('api')),
|
2016-02-04 23:45:34 +00:00
|
|
|
stylesWithPermalink.map(renderStyle),
|
2015-03-25 04:13:55 +00:00
|
|
|
polyfills.map(renderAPI('Polyfill'))
|
2015-03-12 18:03:32 +00:00
|
|
|
);
|
2015-02-12 22:43:41 +00:00
|
|
|
};
|