blob: 97256b3fa4c7135a0557867cfa0217359e9d14eb [file] [log] [blame]
'use strict';
Object.defineProperty(exports, '__esModule', { value: true });
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
var React = require('react');
var loadable = _interopDefault(require('@loadable/component'));
var _get = _interopDefault(require('lodash/fp/get'));
var tslib_1 = require('tslib');
var __chunk_1 = require('./chunk.js');
var _omit = _interopDefault(require('lodash/fp/omit'));
var router = require('@reach/router');
var _first = _interopDefault(require('lodash/fp/first'));
var capitalize = _interopDefault(require('capitalize'));
require('fast-deep-equal');
require('lodash/fp/merge');
require('array-sort');
require('lodash/fp/unionBy');
require('lodash/fp/flattenDepth');
require('lodash/fp/pipe');
require('ulid');
require('match-sorter');
require('lodash/fp/throttle');
var react = require('@mdx-js/react');
var createHashSource = require('hash-source');
let source = createHashSource.default();;
const BasePlayground = loadable(() => Promise.resolve(require('./Playground.js')));
const Playground = props => typeof window !== 'undefined' ? React.createElement(React.Suspense, {
fallback: null
}, React.createElement(BasePlayground, Object.assign({}, props))) : null;
const AsyncComponent = defaultProps => {
const [loading, setLoading] = React.useState(true);
const [error, setError] = React.useState(null);
const [data, setData] = React.useState({});
React.useEffect(() => {
const {
getInitialProps
} = defaultProps;
if (getInitialProps && __chunk_1.isFn(getInitialProps)) {
setLoading(true);
getInitialProps(defaultProps).then(data => {
setLoading(false);
setError(null);
setData(data);
}).catch(err => {
setLoading(false);
setError(err);
setData({});
});
}
}, []);
const {
as: Comp,
getInitialProps
} = defaultProps,
props = tslib_1.__rest(defaultProps, ["as", "getInitialProps"]);
return React.createElement(Comp, Object.assign({}, props, {
data: Object.assign({}, data, {
loading,
error
})
}));
};
const loadRoute = (path, imports, components) => {
const Loading = components.loading;
const fn = async () => {
const importFn = _get(path, imports);
const {
default: Component,
getInitialProps
} = await importFn();
const ExportedComponent = props => React.createElement(AsyncComponent, Object.assign({}, props, {
as: Component || 'div',
getInitialProps: getInitialProps
}));
return ExportedComponent;
};
return loadable(fn, {
fallback: React.createElement(Loading, null)
});
};
const AsyncRoute = defaultProps => {
const {
asyncComponent,
path,
entry
} = defaultProps,
routeProps = tslib_1.__rest(defaultProps, ["asyncComponent", "path", "entry"]);
const components = __chunk_1.useComponents();
const Page = components.page;
const Component = asyncComponent;
const props = Object.assign({}, routeProps, {
doc: entry
});
return Page ? React.createElement(Page, Object.assign({}, props), React.createElement(Component, Object.assign({}, props))) : React.createElement(Component, Object.assign({}, props));
};
const Link = React.forwardRef((defaultProps, ref) => {
const props = _omit(['activeClassName', 'partiallyActive'], defaultProps);
const isActive = React.useCallback(({
isCurrent
}) => {
return isCurrent ? {
className: `${props.className} active`
} : {};
}, [props.className]);
return React.createElement(router.Link, Object.assign({}, props, {
getProps: isActive,
ref: ref
}));
});
Link.displayName = 'Link';
const RE_OBJECTOF = /(?:React\.)?(?:PropTypes\.)?objectOf\((?:React\.)?(?:PropTypes\.)?(\w+)\)/;
const getTypeStr = type => {
switch (type.name.toLowerCase()) {
case 'instanceof':
return `Class(${type.value})`;
case 'enum':
if (type.computed) return type.value;
return type.value ? type.value.map(v => `${v.value}`).join(' │ ') : type.raw;
case 'union':
return type.value ? type.value.map(t => `${getTypeStr(t)}`).join(' │ ') : type.raw;
case 'array':
return type.raw;
case 'arrayof':
return `Array<${getTypeStr(type.value)}>`;
case 'custom':
if (type.raw.indexOf('function') !== -1 || type.raw.indexOf('=>') !== -1) return 'Custom(Function)';else if (type.raw.toLowerCase().indexOf('objectof') !== -1) {
const m = type.raw.match(RE_OBJECTOF);
if (m && m[1]) return `ObjectOf(${capitalize(m[1])})`;
return 'ObjectOf';
}
return 'Custom';
case 'bool':
return 'Boolean';
case 'func':
return 'Function';
case 'shape':
const shape = type.value;
const rst = {};
Object.keys(shape).forEach(key => {
rst[key] = getTypeStr(shape[key]);
});
return JSON.stringify(rst, null, 2);
default:
return capitalize(type.name);
}
};
const humanize = type => getTypeStr(type);
const getPropType = prop => {
const propName = _get('name', prop.flowType || prop.type);
if (!propName) return null;
const isEnum = propName.startsWith('"') || propName === 'enum';
const name = capitalize(isEnum ? 'enum' : propName);
const value = _get('type.value', prop);
if (!name) return null;
if (isEnum && typeof value === 'string' || !prop.flowType && !isEnum && !value || prop.flowType && !prop.flowType.elements) {
return name;
}
return prop.flowType ? humanize(prop.flowType) : humanize(prop.type);
};
const Props = ({
title,
isToggle,
isRaw,
of: component
}) => {
const components = __chunk_1.useComponents();
const {
props: stateProps
} = React.useContext(__chunk_1.doczState.context);
const PropsComponent = components.props;
const filename = _get('__filemeta.filename', component);
const filemetaName = _get('__filemeta.name', component);
const componentName = filemetaName || component.displayName || component.name;
const found = stateProps && stateProps.length > 0 && stateProps.find(item => filename ? item.key === filename : item.key.includes(`${componentName}.`));
const value = _get('value', found) || [];
const firstDefinition = _first(value);
const definition = value.find(i => i.displayName === componentName);
const props = _get('props', definition || firstDefinition);
if (!props) return null;
if (!PropsComponent) return null;
return React.createElement(PropsComponent, {
title: title,
isRaw: isRaw,
isToggle: isToggle,
props: props,
getPropType: getPropType
});
};
const goToHash = ({
location
}) => {
setTimeout(() => {
if (location && location.hash) {
const decodedHash = decodeURI(location.hash);
const id = decodedHash.substring(1);
const el = document.getElementById(id);
if (el) el.scrollIntoView();
}
});
};
const Routes = ({
imports
}) => {
const components = __chunk_1.useComponents();
const {
entries
} = React.useContext(__chunk_1.doczState.context);
const NotFound = components.notFound;
const history = React.useMemo(() => router.createHistory(source), []);
React.useEffect(() => {
history.listen(goToHash);
}, []);
return React.createElement(react.MDXProvider, {
components: components
}, React.createElement(router.LocationProvider, {
history: history
}, React.createElement(router.Router, null, React.createElement(NotFound, {
default: true
}), entries && entries.map(({
key: path,
value: entry
}) => {
const props = {
path,
entries,
components
};
const component = loadRoute(path, imports, components);
return React.createElement(AsyncRoute, Object.assign({}, props, {
entry: entry,
key: entry.id,
path: entry.route,
asyncComponent: component
}));
}))));
};
function theme(themeConfig, transform = c => c) {
return WrappedComponent => {
const Theme = React.memo(props => {
const {
linkComponent
} = props;
const {
db,
children,
wrapper: Wrapper = React.Fragment
} = props;
const initial = Object.assign({}, db, {
themeConfig,
transform,
linkComponent
});
return React.createElement(__chunk_1.doczState.Provider, {
initial: initial
}, React.createElement(Wrapper, null, React.createElement(WrappedComponent, null, children)));
});
Theme.displayName = WrappedComponent.displayName || 'DoczTheme';
return Theme;
};
}
exports.ComponentsProvider = __chunk_1.ComponentsProvider;
exports.doczState = __chunk_1.doczState;
exports.useComponents = __chunk_1.useComponents;
exports.useConfig = __chunk_1.useConfig;
exports.useDataServer = __chunk_1.useDataServer;
exports.useDocs = __chunk_1.useDocs;
exports.useMenus = __chunk_1.useMenus;
exports.usePrevious = __chunk_1.usePrevious;
exports.useWindowSize = __chunk_1.useWindowSize;
exports.AsyncRoute = AsyncRoute;
exports.Link = Link;
exports.Playground = Playground;
exports.Props = Props;
exports.Routes = Routes;
exports.loadRoute = loadRoute;
exports.theme = theme;