@antv/dumi-theme-antv 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +9 -0
- package/es/antv/404/index.js +20 -0
- package/es/antv/Banner/Banner.module.less +412 -0
- package/es/antv/Banner/Notification.js +44 -0
- package/es/antv/Banner/Notification.module.less +108 -0
- package/es/antv/Banner/index.js +115 -0
- package/es/antv/Cases/Cases.js +124 -0
- package/es/antv/Cases/Cases.module.less +203 -0
- package/es/antv/Features/FeatureCard.js +25 -0
- package/es/antv/Features/FeatureCard.module.less +51 -0
- package/es/antv/Features/Features.module.less +169 -0
- package/es/antv/Features/index.js +102 -0
- package/es/antv/Footer/Footer.module.less +36 -0
- package/es/antv/Footer/index.js +232 -0
- package/es/antv/Header/Logo.js +130 -0
- package/es/antv/Products/Product.js +61 -0
- package/es/antv/Products/Product.module.less +146 -0
- package/es/antv/Products/getNewProducts.js +41 -0
- package/es/antv/Products/getProducts.js +466 -0
- package/es/antv/Products/index.js +81 -0
- package/es/antv/hooks.js +81 -0
- package/es/antv/mixins.less +21 -0
- package/es/antv/utils.js +49 -0
- package/es/builtins/API.js +37 -0
- package/es/builtins/Alert.js +9 -0
- package/es/builtins/Alert.less +62 -0
- package/es/builtins/Badge.js +9 -0
- package/es/builtins/Badge.less +31 -0
- package/es/builtins/Example.js +48 -0
- package/es/builtins/Example.less +47 -0
- package/es/builtins/Previewer.js +225 -0
- package/es/builtins/Previewer.less +406 -0
- package/es/builtins/SourceCode.js +72 -0
- package/es/builtins/SourceCode.less +103 -0
- package/es/builtins/Table.js +56 -0
- package/es/builtins/Table.less +43 -0
- package/es/builtins/Tree.js +219 -0
- package/es/builtins/Tree.less +159 -0
- package/es/components/Dark.js +125 -0
- package/es/components/Dark.less +121 -0
- package/es/components/LocaleSelect.js +53 -0
- package/es/components/LocaleSelect.less +59 -0
- package/es/components/Navbar.js +155 -0
- package/es/components/Navbar.less +180 -0
- package/es/components/SearchBar.js +83 -0
- package/es/components/SearchBar.less +165 -0
- package/es/components/SideMenu.js +99 -0
- package/es/components/SideMenu.less +379 -0
- package/es/components/SlugList.js +33 -0
- package/es/components/SlugList.less +18 -0
- package/es/layout.js +276 -0
- package/es/style/layout.less +402 -0
- package/es/style/markdown.less +240 -0
- package/es/style/variables.less +37 -0
- package/package.json +58 -0
- package/src/antv/404/index.tsx +25 -0
- package/src/antv/Banner/Banner.module.less +412 -0
- package/src/antv/Banner/Notification.module.less +108 -0
- package/src/antv/Banner/Notification.tsx +45 -0
- package/src/antv/Banner/index.tsx +121 -0
- package/src/antv/Cases/Cases.module.less +203 -0
- package/src/antv/Cases/Cases.tsx +116 -0
- package/src/antv/Features/FeatureCard.module.less +51 -0
- package/src/antv/Features/FeatureCard.tsx +24 -0
- package/src/antv/Features/Features.module.less +169 -0
- package/src/antv/Features/index.tsx +86 -0
- package/src/antv/Footer/Footer.module.less +36 -0
- package/src/antv/Footer/index.tsx +272 -0
- package/src/antv/Header/Logo.tsx +85 -0
- package/src/antv/Products/Product.module.less +146 -0
- package/src/antv/Products/Product.tsx +80 -0
- package/src/antv/Products/getNewProducts.tsx +53 -0
- package/src/antv/Products/getProducts.tsx +626 -0
- package/src/antv/Products/index.tsx +70 -0
- package/src/antv/hooks.ts +87 -0
- package/src/antv/mixins.less +21 -0
- package/src/antv/utils.ts +44 -0
- package/src/builtins/API.tsx +57 -0
- package/src/builtins/Alert.less +62 -0
- package/src/builtins/Alert.tsx +4 -0
- package/src/builtins/Badge.less +31 -0
- package/src/builtins/Badge.tsx +4 -0
- package/src/builtins/Example.less +47 -0
- package/src/builtins/Example.tsx +34 -0
- package/src/builtins/Previewer.less +406 -0
- package/src/builtins/Previewer.tsx +264 -0
- package/src/builtins/SourceCode.less +103 -0
- package/src/builtins/SourceCode.tsx +55 -0
- package/src/builtins/Table.less +43 -0
- package/src/builtins/Table.tsx +42 -0
- package/src/builtins/Tree.less +159 -0
- package/src/builtins/Tree.tsx +130 -0
- package/src/components/Dark.less +121 -0
- package/src/components/Dark.tsx +78 -0
- package/src/components/LocaleSelect.less +59 -0
- package/src/components/LocaleSelect.tsx +53 -0
- package/src/components/Navbar.less +180 -0
- package/src/components/Navbar.tsx +152 -0
- package/src/components/SearchBar.less +165 -0
- package/src/components/SearchBar.tsx +68 -0
- package/src/components/SideMenu.less +379 -0
- package/src/components/SideMenu.tsx +148 -0
- package/src/components/SlugList.less +18 -0
- package/src/components/SlugList.tsx +20 -0
- package/src/layout.tsx +225 -0
- package/src/style/layout.less +402 -0
- package/src/style/markdown.less +240 -0
- package/src/style/variables.less +37 -0
- package/src/test/SearchBar.test.ts +32 -0
- package/src/test/Table.test.tsx +41 -0
- package/src/test/index.test.tsx +377 -0
|
@@ -0,0 +1,377 @@
|
|
|
1
|
+
import '@testing-library/jest-dom';
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { render, queryByAttribute, queryAllByAttribute, fireEvent } from '@testing-library/react';
|
|
4
|
+
import type { MemoryHistory} from '@umijs/runtime';
|
|
5
|
+
import { createMemoryHistory, Router } from '@umijs/runtime';
|
|
6
|
+
import { context as Context } from 'dumi/theme';
|
|
7
|
+
import SourceCode from '../builtins/SourceCode';
|
|
8
|
+
import Alert from '../builtins/Alert';
|
|
9
|
+
import Badge from '../builtins/Badge';
|
|
10
|
+
import Tree from '../builtins/Tree';
|
|
11
|
+
import Previewer from '../builtins/Previewer';
|
|
12
|
+
import API from '../builtins/API';
|
|
13
|
+
import Layout from '../layout';
|
|
14
|
+
|
|
15
|
+
let history: MemoryHistory;
|
|
16
|
+
|
|
17
|
+
// mock history location which import from 'dumi'
|
|
18
|
+
jest.mock('dumi', () => ({
|
|
19
|
+
history: { location: { pathname: '/' } },
|
|
20
|
+
}));
|
|
21
|
+
|
|
22
|
+
describe('default theme', () => {
|
|
23
|
+
history = createMemoryHistory({ initialEntries: ['/', '/en-US'], initialIndex: 0 });
|
|
24
|
+
const baseCtx = {
|
|
25
|
+
title: 'test',
|
|
26
|
+
locale: 'zh-CN',
|
|
27
|
+
routes: [
|
|
28
|
+
{
|
|
29
|
+
path: '/',
|
|
30
|
+
title: '首页',
|
|
31
|
+
meta: {},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
path: '/en-US',
|
|
35
|
+
title: 'Home',
|
|
36
|
+
meta: {},
|
|
37
|
+
},
|
|
38
|
+
],
|
|
39
|
+
config: {
|
|
40
|
+
locales: [
|
|
41
|
+
{ name: 'zh-CN', label: '中文' },
|
|
42
|
+
{ name: 'en-US', label: 'English' },
|
|
43
|
+
],
|
|
44
|
+
menus: {},
|
|
45
|
+
navs: {},
|
|
46
|
+
title: 'test',
|
|
47
|
+
logo: '/',
|
|
48
|
+
mode: 'site' as 'doc' | 'site',
|
|
49
|
+
repository: { branch: 'master' },
|
|
50
|
+
},
|
|
51
|
+
meta: {},
|
|
52
|
+
menu: [
|
|
53
|
+
{
|
|
54
|
+
title: '分组',
|
|
55
|
+
children: [
|
|
56
|
+
{
|
|
57
|
+
title: 'English',
|
|
58
|
+
path: '/en',
|
|
59
|
+
},
|
|
60
|
+
],
|
|
61
|
+
},
|
|
62
|
+
],
|
|
63
|
+
nav: [
|
|
64
|
+
{
|
|
65
|
+
path: '/',
|
|
66
|
+
title: '首页',
|
|
67
|
+
children: [],
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
title: '生态',
|
|
71
|
+
children: [
|
|
72
|
+
{
|
|
73
|
+
path: 'https://d.umijs.org',
|
|
74
|
+
title: 'GitHub',
|
|
75
|
+
children: [],
|
|
76
|
+
},
|
|
77
|
+
],
|
|
78
|
+
},
|
|
79
|
+
],
|
|
80
|
+
base: '/',
|
|
81
|
+
apis: {
|
|
82
|
+
MultipleExports: {
|
|
83
|
+
Other: [
|
|
84
|
+
{
|
|
85
|
+
identifier: 'other',
|
|
86
|
+
type: 'string',
|
|
87
|
+
},
|
|
88
|
+
],
|
|
89
|
+
},
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
const baseProps = {
|
|
93
|
+
history,
|
|
94
|
+
location: { ...history.location, query: {} },
|
|
95
|
+
match: { params: {}, isExact: true, path: '/', url: '/' },
|
|
96
|
+
route: { path: '/', routes: baseCtx.routes },
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
it('should render site home page', () => {
|
|
100
|
+
const attrName = 'data-prefers-color';
|
|
101
|
+
document.documentElement.setAttribute(attrName, 'light');
|
|
102
|
+
localStorage.setItem('dumi:prefers-color', 'light');
|
|
103
|
+
const wrapper = ({ children }) => (
|
|
104
|
+
<Context.Provider
|
|
105
|
+
value={{
|
|
106
|
+
...baseCtx,
|
|
107
|
+
meta: {
|
|
108
|
+
title: 'test',
|
|
109
|
+
hero: {
|
|
110
|
+
title: 'Hero',
|
|
111
|
+
desc: 'Hero Description',
|
|
112
|
+
actions: [{ text: '开始', link: '/' }],
|
|
113
|
+
},
|
|
114
|
+
features: [
|
|
115
|
+
{ title: 'Feat', desc: 'Feature' },
|
|
116
|
+
{ title: 'Feat2', link: '/' },
|
|
117
|
+
],
|
|
118
|
+
},
|
|
119
|
+
}}
|
|
120
|
+
>
|
|
121
|
+
{children}
|
|
122
|
+
</Context.Provider>
|
|
123
|
+
);
|
|
124
|
+
const { container, getAllByText, getByText } = render(
|
|
125
|
+
<Router history={history}>
|
|
126
|
+
<Layout {...baseProps}>
|
|
127
|
+
<h1>Home Page</h1>
|
|
128
|
+
</Layout>
|
|
129
|
+
</Router>,
|
|
130
|
+
{ wrapper },
|
|
131
|
+
);
|
|
132
|
+
|
|
133
|
+
// expect navbar be rendered
|
|
134
|
+
expect(getAllByText('首页')).not.toBeNull();
|
|
135
|
+
|
|
136
|
+
// expect content be rendered
|
|
137
|
+
expect(getByText('Home Page')).not.toBeNull();
|
|
138
|
+
|
|
139
|
+
// expect hero be rendered
|
|
140
|
+
expect(getByText('Hero')).not.toBeNull();
|
|
141
|
+
|
|
142
|
+
// expect features be rendered
|
|
143
|
+
expect(getByText('Feature')).not.toBeNull();
|
|
144
|
+
expect(getByText('Feat2')).not.toBeNull();
|
|
145
|
+
|
|
146
|
+
// trigger mobile menu display
|
|
147
|
+
queryByAttribute('class', container, '__dumi-default-navbar-toggle').click();
|
|
148
|
+
|
|
149
|
+
// expect sidemenu display for mobile
|
|
150
|
+
expect(queryByAttribute('data-mobile-show', container, 'true')).not.toBeNull();
|
|
151
|
+
|
|
152
|
+
// expect dark render and click success
|
|
153
|
+
const menu = queryByAttribute('class', container, '__dumi-default-menu');
|
|
154
|
+
const sunMenu = queryByAttribute('class', menu, '__dumi-default-dark-sun __dumi-default-dark-switch-active');
|
|
155
|
+
expect(sunMenu).not.toBeNull();
|
|
156
|
+
const moonMenu = queryByAttribute('class', container, '__dumi-default-dark-moon');
|
|
157
|
+
expect(moonMenu).not.toBeNull();
|
|
158
|
+
moonMenu.click();
|
|
159
|
+
expect(document.documentElement.getAttribute(attrName)).toEqual('dark');
|
|
160
|
+
expect(queryByAttribute('data-mobile-show', container, 'true')).toBeNull();
|
|
161
|
+
|
|
162
|
+
const navbar = queryByAttribute('class', container, '__dumi-default-navbar');
|
|
163
|
+
const moonNav = queryByAttribute('class', navbar, '__dumi-default-dark-moon __dumi-default-dark-switch-active');
|
|
164
|
+
moonNav.click();
|
|
165
|
+
expect(queryByAttribute('class', navbar, '__dumi-default-dark-switch __dumi-default-dark-switch-open')).not.toBeNull();
|
|
166
|
+
const switchList = queryByAttribute('class', navbar, '__dumi-default-dark-switch-list');
|
|
167
|
+
expect(switchList).not.toBeNull();
|
|
168
|
+
queryByAttribute('class', switchList, '__dumi-default-dark-sun').click();
|
|
169
|
+
expect(document.documentElement.getAttribute(attrName)).toEqual('light');
|
|
170
|
+
expect(queryByAttribute('class', navbar, '__dumi-default-dark-switch-list')).toBeNull();
|
|
171
|
+
expect(queryByAttribute('class', navbar, '__dumi-default-dark-switch __dumi-default-dark-switch-open')).toBeNull();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it('should render documentation page', async () => {
|
|
175
|
+
const updatedTime = 1604026996000;
|
|
176
|
+
const wrapper = ({ children }) => (
|
|
177
|
+
<Context.Provider
|
|
178
|
+
value={{
|
|
179
|
+
...baseCtx,
|
|
180
|
+
meta: {
|
|
181
|
+
title: 'test',
|
|
182
|
+
slugs: [{ value: 'Slug A', heading: 'a', depth: 2 }],
|
|
183
|
+
updatedTime,
|
|
184
|
+
filePath: 'temp',
|
|
185
|
+
},
|
|
186
|
+
}}
|
|
187
|
+
>
|
|
188
|
+
{children}
|
|
189
|
+
</Context.Provider>
|
|
190
|
+
);
|
|
191
|
+
const { getByText, getAllByText } = render(
|
|
192
|
+
<Router history={history}>
|
|
193
|
+
<Layout {...baseProps}>
|
|
194
|
+
<h1>Doc</h1>
|
|
195
|
+
</Layout>
|
|
196
|
+
</Router>,
|
|
197
|
+
{ wrapper },
|
|
198
|
+
);
|
|
199
|
+
|
|
200
|
+
// expect slugs be rendered
|
|
201
|
+
expect(getByText('Slug A')).not.toBeNull();
|
|
202
|
+
|
|
203
|
+
// expect footer date show
|
|
204
|
+
expect(new Date(updatedTime).toLocaleString([], { hour12: false })).not.toBeNull();
|
|
205
|
+
|
|
206
|
+
// trigger locale change
|
|
207
|
+
getAllByText('English')[0].click();
|
|
208
|
+
|
|
209
|
+
// expect location change
|
|
210
|
+
expect(history.location.pathname).toEqual(baseCtx.routes[1].path);
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
it('should render builtin components correctly', () => {
|
|
214
|
+
const code = "console.log('Hello World!')";
|
|
215
|
+
const wrapper = ({ children }) => (
|
|
216
|
+
<Context.Provider
|
|
217
|
+
value={{
|
|
218
|
+
...baseCtx,
|
|
219
|
+
meta: {
|
|
220
|
+
title: 'test',
|
|
221
|
+
slugs: [{ value: 'Slug A', heading: 'a', depth: 2 }],
|
|
222
|
+
},
|
|
223
|
+
}}
|
|
224
|
+
>
|
|
225
|
+
{children}
|
|
226
|
+
</Context.Provider>
|
|
227
|
+
);
|
|
228
|
+
|
|
229
|
+
const { getByText, getByTitle, getAllByTitle, container } = render(
|
|
230
|
+
<Router history={history}>
|
|
231
|
+
<Layout {...baseProps}>
|
|
232
|
+
<>
|
|
233
|
+
<a href="" id="btn">
|
|
234
|
+
click
|
|
235
|
+
</a>
|
|
236
|
+
<SourceCode code={code} lang="javascript" />
|
|
237
|
+
<Alert type="info">Alert</Alert>
|
|
238
|
+
<Badge type="info">Badge</Badge>
|
|
239
|
+
<Tree>
|
|
240
|
+
<ul>
|
|
241
|
+
<li>
|
|
242
|
+
1
|
|
243
|
+
<small>test1</small>
|
|
244
|
+
<ul>
|
|
245
|
+
<li>
|
|
246
|
+
1-1
|
|
247
|
+
<small>test1-1</small>
|
|
248
|
+
</li>
|
|
249
|
+
</ul>
|
|
250
|
+
</li>
|
|
251
|
+
</ul>
|
|
252
|
+
</Tree>
|
|
253
|
+
<Previewer
|
|
254
|
+
title="demo-1"
|
|
255
|
+
identifier="demo-1"
|
|
256
|
+
sources={{
|
|
257
|
+
_: {
|
|
258
|
+
jsx: "export default () => 'JavaScript'",
|
|
259
|
+
tsx: "export default () => 'TypeScript'",
|
|
260
|
+
},
|
|
261
|
+
}}
|
|
262
|
+
dependencies={{}}
|
|
263
|
+
>
|
|
264
|
+
<>demo-1 Content</>
|
|
265
|
+
</Previewer>
|
|
266
|
+
<Previewer
|
|
267
|
+
title="demo-2"
|
|
268
|
+
identifier="demo-2"
|
|
269
|
+
sources={{
|
|
270
|
+
_: {
|
|
271
|
+
jsx: "export default () => 'Main'",
|
|
272
|
+
},
|
|
273
|
+
'Other.jsx': {
|
|
274
|
+
import: './Other.jsx',
|
|
275
|
+
content: "export default () => 'Other'",
|
|
276
|
+
},
|
|
277
|
+
}}
|
|
278
|
+
dependencies={{}}
|
|
279
|
+
>
|
|
280
|
+
<>demo-2 Content</>
|
|
281
|
+
</Previewer>
|
|
282
|
+
<Previewer
|
|
283
|
+
title="demo-3"
|
|
284
|
+
identifier="demo-3"
|
|
285
|
+
sources={{
|
|
286
|
+
_: {
|
|
287
|
+
jsx: "export default () => 'Main'",
|
|
288
|
+
},
|
|
289
|
+
'Other.jsx': {
|
|
290
|
+
import: './Other.jsx',
|
|
291
|
+
content: "export default () => 'Other'",
|
|
292
|
+
},
|
|
293
|
+
}}
|
|
294
|
+
dependencies={{}}
|
|
295
|
+
iframe={100}
|
|
296
|
+
>
|
|
297
|
+
<>demo-3 Content</>
|
|
298
|
+
</Previewer>
|
|
299
|
+
<API identifier="MultipleExports" export="Other" />
|
|
300
|
+
</>
|
|
301
|
+
</Layout>
|
|
302
|
+
</Router>,
|
|
303
|
+
{ wrapper },
|
|
304
|
+
);
|
|
305
|
+
|
|
306
|
+
// toggle side menu display
|
|
307
|
+
fireEvent(
|
|
308
|
+
container.querySelector('.__dumi-default-navbar-toggle'),
|
|
309
|
+
new MouseEvent('click', {
|
|
310
|
+
bubbles: true,
|
|
311
|
+
cancelable: true,
|
|
312
|
+
}),
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
fireEvent(
|
|
316
|
+
container.querySelector('#btn'),
|
|
317
|
+
new MouseEvent('click', {
|
|
318
|
+
bubbles: true,
|
|
319
|
+
cancelable: true,
|
|
320
|
+
}),
|
|
321
|
+
);
|
|
322
|
+
|
|
323
|
+
// test tree render
|
|
324
|
+
expect(queryAllByAttribute('class', container, '__dumi-site-tree-icon icon-minus-square').length).toBe(2);
|
|
325
|
+
expect(queryAllByAttribute('class', container, '__dumi-site-tree-icon icon-folder-open').length).toBe(2);
|
|
326
|
+
expect(queryAllByAttribute('class', container, '__dumi-site-tree-icon icon-file').length).toBe(1);
|
|
327
|
+
|
|
328
|
+
expect(getByText('<root>')).toHaveClass('rc-tree-title');
|
|
329
|
+
expect(getByText('1')).toHaveClass('rc-tree-title');
|
|
330
|
+
expect(getByText('test1')).not.toBeNull();
|
|
331
|
+
|
|
332
|
+
getAllByTitle('<root>')[0].click();
|
|
333
|
+
expect(queryAllByAttribute('class', container, '__dumi-site-tree-icon icon-plus-square').length).toBe(1);
|
|
334
|
+
expect(queryAllByAttribute('class', container, '__dumi-site-tree-icon icon-folder').length).toBe(1);
|
|
335
|
+
|
|
336
|
+
// expect SourceCode highlight
|
|
337
|
+
expect(getByText('console')).toHaveClass('token');
|
|
338
|
+
|
|
339
|
+
// expect Alert be rendered
|
|
340
|
+
expect(getByText('Alert')).toHaveAttribute('type', 'info');
|
|
341
|
+
|
|
342
|
+
// expect Badge be rendered
|
|
343
|
+
expect(getByText('Badge')).toHaveClass('__dumi-default-badge');
|
|
344
|
+
|
|
345
|
+
// expect Previewer be rendered
|
|
346
|
+
expect(getByText('demo-1')).not.toBeNull();
|
|
347
|
+
|
|
348
|
+
// trigger source code display for demo-1
|
|
349
|
+
getAllByTitle('Toggle source code panel')[0].click();
|
|
350
|
+
|
|
351
|
+
// expect show TypeScript code default
|
|
352
|
+
expect(getByText("'TypeScript'")).not.toBeNull();
|
|
353
|
+
|
|
354
|
+
// trigger source code display for demo-2
|
|
355
|
+
getAllByTitle('Toggle source code panel')[1].click();
|
|
356
|
+
|
|
357
|
+
// expect show code of main file
|
|
358
|
+
expect(getByText("'Main'")).not.toBeNull();
|
|
359
|
+
|
|
360
|
+
// trigger file change
|
|
361
|
+
getByText('Other.jsx').click();
|
|
362
|
+
|
|
363
|
+
// expect show code of main file
|
|
364
|
+
expect(getByText("'Other'")).not.toBeNull();
|
|
365
|
+
|
|
366
|
+
// expect render iframe demo
|
|
367
|
+
(container.querySelector('[data-iframe] button[role=refresh]') as HTMLElement).click();
|
|
368
|
+
expect(container.querySelector('[data-iframe]').innerHTML).not.toContain('demo-3 Content');
|
|
369
|
+
expect(container.querySelector('[data-iframe] iframe')).not.toBeNull();
|
|
370
|
+
expect((container.querySelector('[data-iframe] iframe') as HTMLElement).style.height).toEqual(
|
|
371
|
+
'100px',
|
|
372
|
+
);
|
|
373
|
+
|
|
374
|
+
// expect render API property
|
|
375
|
+
expect(getByText('other', { selector: 'table td' })).not.toBeNull();
|
|
376
|
+
});
|
|
377
|
+
});
|