Skip to content
Merged

aaa #99

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@kne/modules-dev",
"version": "2.1.13",
"version": "2.1.15",
"description": "用于辅助在项目内启动一个规范化组件开发的环境",
"publishConfig": {
"access": "public",
Expand Down Expand Up @@ -40,6 +40,7 @@
"@kne/fetch-npm-package": "^0.1.1",
"@kne/md-doc": "^0.1.13",
"@kne/react-fetch": "^1.4.3",
"@kne/react-icon": "^0.1.4",
"ajv": "^8.14.0",
"chokidar": "^3.5.3",
"classnames": "^2.3.2",
Expand Down
60 changes: 60 additions & 0 deletions src/FontList.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,60 @@
import {useState} from 'react';
import {Flex, Slider, Typography, Card} from 'antd';
import Icon from '@kne/react-icon';

const FontList = ({fonts}) => {
const [value, setValue] = useState(30);
return <Flex vertical gap={20}>
<Flex gap={8}>
<div>调整大小:</div>
<Slider style={{ width: 100 }} max={60} min={12} value={value} onChange={setValue} />
<div>{value}px</div>
</Flex>
{Object.keys(fonts).map(fontClassName => {
const { glyphs: list } = fonts[fontClassName];
const isColorful = /-colorful$/.test(fontClassName);
return (
<Flex vertical gap={8} key={fontClassName}>
<Typography.Title level={4}>{fontClassName}</Typography.Title>
<Flex gap={12} wrap>
{list.map(({ font_class }) => {
return (
<Card size="small" key={font_class}>
{isColorful ? (
<>
<Flex justify="center">
<Icon colorful type={font_class} size={value} />
</Flex>
<Typography.Text
style={{ display: 'block', width: '120px', wordBreak: 'break-all' }}
copyable={{
text: '<Icon colorful type="' + font_class + '" size={' + value + '}/>'
}}>
{font_class}
</Typography.Text>
</>
) : (
<>
<Flex justify="center">
<Icon type={font_class} size={value} fontClassName={fontClassName} />
</Flex>
<Typography.Text
style={{ display: 'block', width: '120px', wordBreak: 'break-all' }}
copyable={{
text: '<Icon type="' + font_class + '" size={' + value + '} fontClassName={' + fontClassName + '}/>'
}}>
{font_class}
</Typography.Text>
</>
)}
</Card>
);
})}
</Flex>
</Flex>
);
})}
</Flex>
};

export default FontList;
104 changes: 104 additions & 0 deletions src/createEntry.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
import React, {useEffect, useState} from 'react';
import {Navigate, Route, Routes, useLocation, useNavigate, Outlet} from 'react-router-dom';
import {createWithRemoteLoader} from '@kne/remote-loader';
import ensureSlash from '@kne/ensure-slash';
import {Result, FloatButton} from 'antd';
import Example from './Example';
import ExamplePage, {ExampleContent} from './ExamplePage';
import get from 'lodash/get';

const ModulesIsEmpty = ({readme, baseUrl}) => {
const location = useLocation();
if (readme && Object.keys(readme).length > 0 && ensureSlash(location.pathname, true) === baseUrl) {
return <Navigate to={`${baseUrl}${Object.keys(readme)[0]}`}/>;
}
if (readme && Object.keys(readme).length > 0) {
return <Outlet/>
}
return <Result
status="404"
title="没有检测到业务组件"
subTitle="您可以通过 modules-dev create 命令创建组件,如果已经有组件请检查环境变量 MODULES_DEV_BASE_DIR和MODULES_DEV_ALIAS_NAME 是否设置正确"
/>
};

const EntryButton = createWithRemoteLoader({
modules: ['components-core:Icon']
})(({remoteModules}) => {
const [Icon] = remoteModules;
const navigate = useNavigate();
return <FloatButton icon={<Icon className="icon" type="icon-liangdian"/>} onClick={() => {
navigate('/modules-dev-components');
}}/>;
});

const MainLayout = createWithRemoteLoader({
modules: ["components-core:Global", "components-core:Layout"]
})(({remoteModules, paths, preset, ...props}) => {
const [Global, Layout] = remoteModules;
return <Global {...props} preset={preset}><Layout navigation={{
showIndex: false, list: paths
}}><Outlet/></Layout></Global>;
});

const ExampleRoutes = ({
preset, themeToken, projectName, baseUrl = '', paths = [{
key: 'index', path: '/', title: '首页'
}, {
key: 'components', path: `${baseUrl}/components`, title: '组件'
}], readme, pageProps, children, ...props
}) => {
const componentsPath = paths.find((item) => item.key === 'components');
const componentsBaseUrl = ensureSlash(get(componentsPath, 'path', '/'), true);
const baseUrlPrefix = new RegExp(`^${ensureSlash(baseUrl,true)}`);
const componentsRoutePath = ensureSlash(componentsBaseUrl.replace(baseUrlPrefix, ''));
return <Routes>
<Route element={<MainLayout paths={paths} preset={preset} themeToken={themeToken} {...props}/>}>
{componentsPath && <Route path={componentsRoutePath}
element={<ModulesIsEmpty baseUrl={componentsBaseUrl} readme={readme}/>}>
<Route path=":id"
element={<Example baseUrl={componentsBaseUrl} readme={readme} pageProps={pageProps}/>}/>
<Route path=":id/*"
element={<Example baseUrl={componentsBaseUrl} readme={readme} pageProps={pageProps}/>}/>
</Route>}
</Route>
<Route path='*' element={children}/>
</Routes>
};


const createEntry = (WrappedComponents) => (({
remoteModules,
preset,
projectName,
themeToken,
pageProps,
baseUrl = '',
...props
}) => {
const [readme, setReadme] = useState({});
useEffect(() => {
import('readme').then((module) => {
setReadme(module.__esModule === true ? module.default : module);
});
}, []);
return <>
{Object.keys(readme).length > 0 ?
<ExampleRoutes preset={preset} baseUrl={baseUrl} projectName={projectName} readme={readme}
pageProps={pageProps}
paths={[{
key: 'index', path: '/', title: '首页'
}, {
key: 'components', path: `${baseUrl}/modules-dev-components`, title: '组件'
}]}
themeToken={themeToken}>
<WrappedComponents {...props}/><EntryButton/>
</ExampleRoutes> : <WrappedComponents {...props}/>}
</>;
});
createEntry.Example = Example;
createEntry.ExampleRoutes = ExampleRoutes;
createEntry.ExamplePage = ExamplePage;
createEntry.ExampleContent = ExampleContent;

export default createEntry;
108 changes: 4 additions & 104 deletions src/index.js
Original file line number Diff line number Diff line change
@@ -1,104 +1,4 @@
import React, {useEffect, useState} from 'react';
import {Navigate, Route, Routes, useLocation, useNavigate, Outlet} from 'react-router-dom';
import {createWithRemoteLoader} from '@kne/remote-loader';
import ensureSlash from '@kne/ensure-slash';
import {Result, FloatButton} from 'antd';
import Example from './Example';
import ExamplePage, {ExampleContent} from './ExamplePage';
import get from 'lodash/get';

const ModulesIsEmpty = ({readme, baseUrl}) => {
const location = useLocation();
if (readme && Object.keys(readme).length > 0 && ensureSlash(location.pathname, true) === baseUrl) {
return <Navigate to={`${baseUrl}${Object.keys(readme)[0]}`}/>;
}
if (readme && Object.keys(readme).length > 0) {
return <Outlet/>
}
return <Result
status="404"
title="没有检测到业务组件"
subTitle="您可以通过 modules-dev create 命令创建组件,如果已经有组件请检查环境变量 MODULES_DEV_BASE_DIR和MODULES_DEV_ALIAS_NAME 是否设置正确"
/>
};

const EntryButton = createWithRemoteLoader({
modules: ['components-core:Icon']
})(({remoteModules}) => {
const [Icon] = remoteModules;
const navigate = useNavigate();
return <FloatButton icon={<Icon className="icon" type="icon-liangdian"/>} onClick={() => {
navigate('/modules-dev-components');
}}/>;
});

const MainLayout = createWithRemoteLoader({
modules: ["components-core:Global", "components-core:Layout"]
})(({remoteModules, paths, preset, ...props}) => {
const [Global, Layout] = remoteModules;
return <Global {...props} preset={preset}><Layout navigation={{
showIndex: false, list: paths
}}><Outlet/></Layout></Global>;
});

const ExampleRoutes = ({
preset, themeToken, projectName, baseUrl = '', paths = [{
key: 'index', path: '/', title: '首页'
}, {
key: 'components', path: `${baseUrl}/components`, title: '组件'
}], readme, pageProps, children, ...props
}) => {
const componentsPath = paths.find((item) => item.key === 'components');
const componentsBaseUrl = ensureSlash(get(componentsPath, 'path', '/'), true);
const baseUrlPrefix = new RegExp(`^${ensureSlash(baseUrl,true)}`);
const componentsRoutePath = ensureSlash(componentsBaseUrl.replace(baseUrlPrefix, ''));
return <Routes>
<Route element={<MainLayout paths={paths} preset={preset} themeToken={themeToken} {...props}/>}>
{componentsPath && <Route path={componentsRoutePath}
element={<ModulesIsEmpty baseUrl={componentsBaseUrl} readme={readme}/>}>
<Route path=":id"
element={<Example baseUrl={componentsBaseUrl} readme={readme} pageProps={pageProps}/>}/>
<Route path=":id/*"
element={<Example baseUrl={componentsBaseUrl} readme={readme} pageProps={pageProps}/>}/>
</Route>}
</Route>
<Route path='*' element={children}/>
</Routes>
};


const createEntry = (WrappedComponents) => (({
remoteModules,
preset,
projectName,
themeToken,
pageProps,
baseUrl = '',
...props
}) => {
const [readme, setReadme] = useState({});
useEffect(() => {
import('readme').then((module) => {
setReadme(module.__esModule === true ? module.default : module);
});
}, []);
return <>
{Object.keys(readme).length > 0 ?
<ExampleRoutes preset={preset} baseUrl={baseUrl} projectName={projectName} readme={readme}
pageProps={pageProps}
paths={[{
key: 'index', path: '/', title: '首页'
}, {
key: 'components', path: `${baseUrl}/modules-dev-components`, title: '组件'
}]}
themeToken={themeToken}>
<WrappedComponents {...props}/><EntryButton/>
</ExampleRoutes> : <WrappedComponents {...props}/>}
</>;
});
createEntry.Example = Example;
createEntry.ExampleRoutes = ExampleRoutes;
createEntry.ExamplePage = ExamplePage;
createEntry.ExampleContent = ExampleContent;

export default createEntry;
export {default} from './createEntry';
export {default as FontList} from './FontList';
export {default as Example} from './Example';
export {default as ExamplePage} from './ExamplePage';