Skip to content
This repository was archived by the owner on Jan 24, 2025. It is now read-only.

Commit a9c26e6

Browse files
committed
feat: split router logic from theme
1 parent 4162a1c commit a9c26e6

File tree

13 files changed

+166
-142
lines changed

13 files changed

+166
-142
lines changed

core/docz-core/src/bundler/config.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,6 @@ export const createConfig = (args: Args, env: Env) => async (hooks: Hooks) => {
9090
.add('.mdx')
9191
.end()
9292

93-
config.resolve.alias.set('~db', paths.db)
94-
config.resolve.alias.set('~imports', paths.importsJs)
9593
config.resolve.alias.set('react-native$', 'react-native-web')
9694

9795
const inYarnWorkspaces = __dirname.includes('/docz/core/docz-core')

core/docz-core/templates/root.tpl.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
import React from 'react'
2+
import { Router, Routes } from 'docz'
23
import { hot } from 'react-hot-loader'
34
import Theme from '<%- theme %>'
45

6+
import { imports } from './imports'
7+
import database from './db.json'
58
<% if (wrapper) {%>import Wrapper from '<%- wrapper %>'<%}%>
69

710
const Root = () => (
8-
<Theme <% if (wrapper) {%>wrapper={Wrapper}<%}%> />
11+
<Theme <% if (wrapper) {%>wrapper={Wrapper}<%}%> db={database}>
12+
<Router>
13+
<Routes imports={imports} />
14+
</Router>
15+
</Theme>
916
)
1017

1118
export default hot(module)(Root)

core/docz-theme-default/src/index.tsx

Lines changed: 27 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { SFC } from 'react'
12
import { theme, DocPreview, ThemeConfig } from 'docz'
23
import { ThemeProvider } from 'emotion-theming'
34
import { jsx } from '@emotion/core'
@@ -8,39 +9,34 @@ import { config } from './config'
89
import * as components from './components/ui'
910
import * as modes from './styles/modes'
1011

11-
const Theme = () => (
12+
const componentsMap = {
13+
page: components.Page,
14+
notFound: components.NotFound,
15+
render: components.Render,
16+
blockquote: components.Blockquote,
17+
h1: components.H1,
18+
h2: components.H2,
19+
h3: components.H3,
20+
h4: components.H4,
21+
h5: components.H5,
22+
h6: components.H6,
23+
hr: components.Hr,
24+
ul: components.UnorderedList,
25+
ol: components.OrderedList,
26+
p: components.Paragraph,
27+
a: components.Link,
28+
inlineCode: components.InlineCode,
29+
loading: components.Loading,
30+
table: components.Table,
31+
pre: components.Pre,
32+
tooltip: components.Tooltip,
33+
}
34+
35+
const Theme: SFC = ({ children }) => (
1236
<ThemeConfig>
1337
{config => (
14-
<ThemeProvider
15-
theme={prev => ({
16-
...prev,
17-
docz: config.themeConfig,
18-
})}
19-
>
20-
<DocPreview
21-
components={{
22-
page: components.Page,
23-
notFound: components.NotFound,
24-
render: components.Render,
25-
blockquote: components.Blockquote,
26-
h1: components.H1,
27-
h2: components.H2,
28-
h3: components.H3,
29-
h4: components.H4,
30-
h5: components.H5,
31-
h6: components.H6,
32-
hr: components.Hr,
33-
ul: components.UnorderedList,
34-
ol: components.OrderedList,
35-
p: components.Paragraph,
36-
a: components.Link,
37-
inlineCode: components.InlineCode,
38-
loading: components.Loading,
39-
table: components.Table,
40-
pre: components.Pre,
41-
tooltip: components.Tooltip,
42-
}}
43-
/>
38+
<ThemeProvider theme={prev => ({ ...prev, docz: config.themeConfig })}>
39+
<DocPreview components={componentsMap}>{children}</DocPreview>
4440
</ThemeProvider>
4541
)}
4642
</ThemeConfig>

core/docz/package.json

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,6 @@
2727
"@mdx-js/tag": "^0.16.6",
2828
"@sindresorhus/slugify": "^0.8.0",
2929
"array-sort": "^1.0.0",
30-
"callbag-observe": "^1.0.0",
31-
"callbag-subject": "^1.0.2",
3230
"capitalize": "^2.0.0",
3331
"deepmerge": "^3.1.0",
3432
"docz-core": "^0.13.5",

core/docz/rollup.config.js

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,5 @@ import { config } from 'docz-rollup'
33
export default config({
44
input: 'src/index.ts',
55
external: id =>
6-
id === '~db' ||
7-
id === '~imports' ||
8-
(!id.startsWith('\0') && !id.startsWith('.') && !id.startsWith('/')),
6+
!id.startsWith('\0') && !id.startsWith('.') && !id.startsWith('/'),
97
})

core/docz/src/components/AsyncRoute.tsx

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,12 @@ import { EntryMap } from '../state'
77
import { ComponentsMap } from './DocPreview'
88
import { AsyncComponent } from './AsyncComponent'
99

10-
export async function loadFromImports(path: string): Promise<SFC<any>> {
10+
export type Imports = Record<string, () => Promise<any>>
11+
export async function loadFromImports(
12+
path: string,
13+
imports: Imports
14+
): Promise<SFC<any>> {
1115
// tslint:disable-next-line
12-
const { imports } = await import('~imports')
1316
const { default: Component, getInitialData } = await imports[path]()
1417
const ExportedComponent: SFC<any> = props => (
1518
<AsyncComponent
@@ -22,9 +25,13 @@ export async function loadFromImports(path: string): Promise<SFC<any>> {
2225
return withMDXComponents(ExportedComponent)
2326
}
2427

25-
export const loadRoute: any = (path: string, LoadingComponent: any) => {
28+
export const loadRoute: any = (
29+
path: string,
30+
imports: Imports,
31+
LoadingComponent: any
32+
) => {
2633
const opts: any = { LoadingComponent }
27-
return importedComponent(async () => loadFromImports(path), opts)
34+
return importedComponent(async () => loadFromImports(path, imports), opts)
2835
}
2936

3037
interface AsyncRouteProps {
Lines changed: 10 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import * as React from 'react'
22
import { Fragment, SFC, ComponentType as CT } from 'react'
3-
import { Switch, Route, RouteComponentProps } from 'react-router-dom'
3+
import { RouteComponentProps } from 'react-router-dom'
44
import { MDXProvider } from '@mdx-js/tag'
5-
import { get } from 'lodash/fp'
65

7-
import { AsyncRoute, loadRoute } from './AsyncRoute'
8-
import { state, Entry } from '../state'
6+
import { Entry } from '../state'
97

108
export type PageProps = RouteComponentProps<any> & {
119
doc: Entry
@@ -46,27 +44,23 @@ export interface ComponentsMap {
4644
[key: string]: any
4745
}
4846

47+
export type NotFoundComponent = CT<RouteComponentProps<any>>
48+
const DefaultNotFound: NotFoundComponent = () => <Fragment>Not found</Fragment>
4949
const DefaultLoading: SFC = () => <Fragment>Loading</Fragment>
5050

51-
export const Identity: SFC<any> = ({ children }) => (
52-
<Fragment>{children}</Fragment>
53-
)
54-
55-
export const DefaultRender: RenderComponent = ({ component, code }) => (
51+
const DefaultPage: SFC<any> = ({ children }) => <Fragment>{children}</Fragment>
52+
const DefaultRender: RenderComponent = ({ component, code }) => (
5653
<Fragment>
5754
{component}
5855
{code}
5956
</Fragment>
6057
)
6158

62-
export type NotFoundComponent = CT<RouteComponentProps<any>>
63-
const DefaultNotFound: NotFoundComponent = () => <Fragment>Not found</Fragment>
64-
6559
const defaultComponents: ComponentsMap = {
6660
loading: DefaultLoading,
6761
render: DefaultRender,
6862
notFound: DefaultNotFound,
69-
page: Identity,
63+
page: DefaultPage,
7064
}
7165

7266
export interface DocPreviewProps {
@@ -75,45 +69,11 @@ export interface DocPreviewProps {
7569

7670
export const DocPreview: SFC<DocPreviewProps> = ({
7771
components: themeComponents = {},
72+
children,
7873
}) => {
79-
const components = {
80-
...defaultComponents,
81-
...themeComponents,
82-
}
83-
84-
const NotFound: any = components.notFound
85-
8674
return (
87-
<MDXProvider components={components}>
88-
{state.get(({ entries }) => {
89-
if (!entries) return null
90-
return (
91-
<Switch>
92-
{Object.keys(entries).map(path => {
93-
const entry = get(path, entries)
94-
const props = { path, entries, components }
95-
const component: any = loadRoute(path, components.loading)
96-
97-
component.preload()
98-
return (
99-
<Route
100-
exact
101-
key={entry.id}
102-
path={entry.route}
103-
render={routeProps => (
104-
<AsyncRoute
105-
{...routeProps}
106-
{...props}
107-
asyncComponent={component}
108-
/>
109-
)}
110-
/>
111-
)
112-
})}
113-
{NotFound && <Route component={NotFound} />}
114-
</Switch>
115-
)
116-
})}
75+
<MDXProvider components={{ ...defaultComponents, ...themeComponents }}>
76+
{children}
11777
</MDXProvider>
11878
)
11979
}

core/docz/src/components/Router.tsx

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import * as React from 'react'
2+
import { SFC } from 'react'
3+
import { HashRouter, BrowserRouter } from 'react-router-dom'
4+
import { StaticRouterProps } from 'react-router'
5+
6+
import { ScrollToTop } from '../utils/ScrollToTop'
7+
8+
declare var DOCZ_BASE_URL: string
9+
declare var DOCZ_HASH_ROUTER: boolean
10+
11+
const BaseRouter: SFC<StaticRouterProps> = (props: any) =>
12+
Boolean(DOCZ_HASH_ROUTER) ? (
13+
<HashRouter {...props} />
14+
) : (
15+
<BrowserRouter {...props} />
16+
)
17+
18+
export const Router: SFC = ({ children }) => (
19+
<BaseRouter basename={DOCZ_BASE_URL}>
20+
<ScrollToTop>{children}</ScrollToTop>
21+
</BaseRouter>
22+
)

core/docz/src/components/Routes.tsx

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import * as React from 'react'
2+
import { Fragment, SFC } from 'react'
3+
import { Switch, Route } from 'react-router-dom'
4+
import { withMDXComponents } from '@mdx-js/tag/dist/mdx-provider'
5+
import { get } from 'lodash/fp'
6+
7+
import { state } from '../state'
8+
import { AsyncRoute, loadRoute, Imports } from './AsyncRoute'
9+
import { ComponentsMap } from './DocPreview'
10+
11+
export interface RoutesProps {
12+
components: ComponentsMap
13+
imports: Imports
14+
}
15+
16+
export const Routes: SFC = withMDXComponents(
17+
({ components, imports }: RoutesProps) => (
18+
<Fragment>
19+
{state.get(({ entries }) => {
20+
if (!entries || !components) return null
21+
22+
const NotFound: any = components.notFound
23+
const Loading: any = components.loading
24+
25+
return (
26+
<Switch>
27+
{Object.keys(entries).map(path => {
28+
const entry = get(path, entries)
29+
const props = { path, entries, components }
30+
const component: any = loadRoute(path, imports, Loading)
31+
32+
component.preload()
33+
return (
34+
<Route
35+
exact
36+
key={entry.id}
37+
path={entry.route}
38+
render={routeProps => (
39+
<AsyncRoute
40+
{...routeProps}
41+
{...props}
42+
asyncComponent={component}
43+
/>
44+
)}
45+
/>
46+
)
47+
})}
48+
{NotFound && <Route component={NotFound} />}
49+
</Switch>
50+
)
51+
})}
52+
</Fragment>
53+
)
54+
)

core/docz/src/index.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,12 @@
1-
export { theme } from './theme'
2-
export { Entry, MenuItem } from './state'
31
export { Docs, DocsRenderProps } from './components/Docs'
42
export { Link, LinkProps } from './components/Link'
53
export { Menu, MenuRenderProps } from './components/Menu'
64
export { Playground } from './components/Playground'
75
export { PropsTable } from './components/PropsTable'
86
export { ThemeConfig } from './components/ThemeConfig'
9-
export {
10-
DocPreview,
11-
PageProps,
12-
RenderComponent,
13-
RenderComponentProps,
14-
} from './components/DocPreview'
7+
export { Router } from './components/Router'
8+
export { Routes } from './components/Routes'
9+
export * from './components/DocPreview'
10+
11+
export { theme } from './theme'
12+
export { Entry, MenuItem } from './state'

0 commit comments

Comments
 (0)