From c1c8941c63cdec31d62412456ba45bbd72968dd8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Allen=20Zhang=20=28=E5=BC=A0=E6=B6=9B=29?= Date: Mon, 29 Jul 2024 19:08:35 +0800 Subject: [PATCH] feat: update canyon-ui-old --- packages/canyon-platform/package.json | 3 +- packages/canyon-platform/vite.config.ts | 6 + packages/canyon-ui-old/.gitignore | 28 +++ packages/canyon-ui-old/index.html | 18 ++ packages/canyon-ui-old/languages.json | 14 ++ packages/canyon-ui-old/locales/cn.json | 72 ++++++ packages/canyon-ui-old/locales/en.json | 72 ++++++ packages/canyon-ui-old/package.json | 41 ++++ packages/canyon-ui-old/postcss.config.js | 6 + packages/canyon-ui-old/public/light-logo.svg | 1 + packages/canyon-ui-old/public/logo.svg | 1 + packages/canyon-ui-old/public/welcome-bg.svg | 25 +++ .../src/assets/icons/EpTopRight.tsx | 6 + .../canyon-ui-old/src/assets/img/github.svg | 1 + .../canyon-ui-old/src/assets/img/gitlab.svg | 1 + .../canyon-ui-old/src/assets/img/google.svg | 1 + packages/canyon-ui-old/src/assets/img/img.png | Bin 0 -> 32413 bytes .../src/components/card/Primary.tsx | 26 +++ .../src/components/card/index.ts | 1 + .../canyon-ui-old/src/components/index.ts | 4 + .../src/components/layout/Base.tsx | 205 ++++++++++++++++++ .../components/layout/ScrollBasedLayout.tsx | 69 ++++++ .../src/components/layout/app.json | 56 +++++ .../src/components/layout/footer.tsx | 14 ++ .../src/components/layout/index.ts | 1 + .../src/components/modal/GlobalSearch.tsx | 37 ++++ .../src/components/modal/index.ts | 1 + .../src/components/page/BillingCollapse.tsx | 107 +++++++++ .../src/components/page/BillingRadio.tsx | 42 ++++ .../src/components/page/BillingUpdateCard.tsx | 41 ++++ .../src/components/page/Oauth.tsx | 42 ++++ .../src/components/page/index.ts | 5 + .../src/components/page/login/LoginBtn.tsx | 35 +++ .../src/components/page/login/LoginForm.tsx | 94 ++++++++ .../src/components/page/login/index.tsx | 77 +++++++ packages/canyon-ui-old/src/index.ts | 1 + packages/canyon-ui-old/src/vite-env.d.ts | 2 + packages/canyon-ui-old/tailwind.config.js | 12 + packages/canyon-ui-old/tsconfig.node.json | 10 + packages/canyon-ui-old/vite.config.ts | 22 ++ 40 files changed, 1198 insertions(+), 2 deletions(-) create mode 100644 packages/canyon-ui-old/.gitignore create mode 100644 packages/canyon-ui-old/index.html create mode 100644 packages/canyon-ui-old/languages.json create mode 100644 packages/canyon-ui-old/locales/cn.json create mode 100644 packages/canyon-ui-old/locales/en.json create mode 100644 packages/canyon-ui-old/package.json create mode 100644 packages/canyon-ui-old/postcss.config.js create mode 100644 packages/canyon-ui-old/public/light-logo.svg create mode 100644 packages/canyon-ui-old/public/logo.svg create mode 100644 packages/canyon-ui-old/public/welcome-bg.svg create mode 100644 packages/canyon-ui-old/src/assets/icons/EpTopRight.tsx create mode 100644 packages/canyon-ui-old/src/assets/img/github.svg create mode 100644 packages/canyon-ui-old/src/assets/img/gitlab.svg create mode 100644 packages/canyon-ui-old/src/assets/img/google.svg create mode 100644 packages/canyon-ui-old/src/assets/img/img.png create mode 100644 packages/canyon-ui-old/src/components/card/Primary.tsx create mode 100644 packages/canyon-ui-old/src/components/card/index.ts create mode 100644 packages/canyon-ui-old/src/components/index.ts create mode 100644 packages/canyon-ui-old/src/components/layout/Base.tsx create mode 100644 packages/canyon-ui-old/src/components/layout/ScrollBasedLayout.tsx create mode 100644 packages/canyon-ui-old/src/components/layout/app.json create mode 100644 packages/canyon-ui-old/src/components/layout/footer.tsx create mode 100644 packages/canyon-ui-old/src/components/layout/index.ts create mode 100644 packages/canyon-ui-old/src/components/modal/GlobalSearch.tsx create mode 100644 packages/canyon-ui-old/src/components/modal/index.ts create mode 100644 packages/canyon-ui-old/src/components/page/BillingCollapse.tsx create mode 100644 packages/canyon-ui-old/src/components/page/BillingRadio.tsx create mode 100644 packages/canyon-ui-old/src/components/page/BillingUpdateCard.tsx create mode 100644 packages/canyon-ui-old/src/components/page/Oauth.tsx create mode 100644 packages/canyon-ui-old/src/components/page/index.ts create mode 100644 packages/canyon-ui-old/src/components/page/login/LoginBtn.tsx create mode 100644 packages/canyon-ui-old/src/components/page/login/LoginForm.tsx create mode 100644 packages/canyon-ui-old/src/components/page/login/index.tsx create mode 100644 packages/canyon-ui-old/src/index.ts create mode 100644 packages/canyon-ui-old/src/vite-env.d.ts create mode 100644 packages/canyon-ui-old/tailwind.config.js create mode 100644 packages/canyon-ui-old/tsconfig.node.json create mode 100644 packages/canyon-ui-old/vite.config.ts diff --git a/packages/canyon-platform/package.json b/packages/canyon-platform/package.json index 5b0eb430..336ba955 100644 --- a/packages/canyon-platform/package.json +++ b/packages/canyon-platform/package.json @@ -7,7 +7,6 @@ "dev-platform": "vite", "do-build": "node --max_old_space_size=16384 ./node_modules/vite/bin/vite.js build", "preview": "vite preview", - "postinstall": "npm run codegen", "codegen": "graphql-codegen --config codegen.ts" }, "dependencies": { @@ -22,7 +21,7 @@ "antd": "5.14.1", "axios": "^1.7.2", "canyon-ui": "0.0.10-alpha.20", - "canyon-ui-old": "0.0.9", + "canyon-ui-old": "workspace:^", "copy-to-clipboard": "^3.3.3", "dayjs": "^1.11.11", "echarts": "^5.5.1", diff --git a/packages/canyon-platform/vite.config.ts b/packages/canyon-platform/vite.config.ts index 89d4de5e..f6b32344 100644 --- a/packages/canyon-platform/vite.config.ts +++ b/packages/canyon-platform/vite.config.ts @@ -35,6 +35,12 @@ export default defineConfig({ build: { sourcemap: true, }, + resolve: { + alias: { + 'canyon-ui-old': path.resolve('../canyon-ui-old/src'), + // '@': path.resolve(__dirname, './src'), + }, + }, server: { port: 8000, host: '0.0.0.0', diff --git a/packages/canyon-ui-old/.gitignore b/packages/canyon-ui-old/.gitignore new file mode 100644 index 00000000..ea02b6de --- /dev/null +++ b/packages/canyon-ui-old/.gitignore @@ -0,0 +1,28 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? + +pnpm-lock.yaml + +src/helpers/backend/gen diff --git a/packages/canyon-ui-old/index.html b/packages/canyon-ui-old/index.html new file mode 100644 index 00000000..df2a96a1 --- /dev/null +++ b/packages/canyon-ui-old/index.html @@ -0,0 +1,18 @@ + + + + + + + + Canyon + + +
+ + + diff --git a/packages/canyon-ui-old/languages.json b/packages/canyon-ui-old/languages.json new file mode 100644 index 00000000..20c6b5b3 --- /dev/null +++ b/packages/canyon-ui-old/languages.json @@ -0,0 +1,14 @@ +[ + { + "code": "en", + "file": "en.json", + "iso": "en-US", + "name": "English" + }, + { + "code": "cn", + "file": "cn.json", + "iso": "zh-CN", + "name": "简体中文" + } +] diff --git a/packages/canyon-ui-old/locales/cn.json b/packages/canyon-ui-old/locales/cn.json new file mode 100644 index 00000000..d8c4e7d6 --- /dev/null +++ b/packages/canyon-ui-old/locales/cn.json @@ -0,0 +1,72 @@ +{ + "welcome": { + "hello": "你好,", + "copywriter": "欢迎来到Canyon。", + "desc": "您将被重定向到源代码控制管理系统进行身份验证。", + "continue": "继续" + }, + "menus": { + "projects": "项目", + "settings": "设置", + "docs": "文档" + }, + "projects": { + "create": "创建项目", + "desc": "查看与您的账户相关的所有项目", + "name": "名称", + "report_times": "次数", + "report_time": "上报时间", + "max_coverage": "最大覆盖率", + "latest_report_time": "最近上报时间", + "latest_report_coverage": "最近上报覆盖率", + "no_data": "{{msg}}个项目没数据", + "total_times": "总次数", + "trends_in_coverage": "覆盖率趋势", + "records": "记录", + "overview": "概览", + "branch": "分支", + "compare_target": "对比目标", + "message": "提交信息", + "functions": "函数", + "branches": "分支", + "statements": "语句", + "lines": "行", + "newlines": "新增行", + "reported_details": "上报细节", + "reporter": "上报人", + "search_keywords": "按项目 ID 或名称搜索", + "overview_search_keywords": "输入 \"Commit Sha \"或 \"分支 \"或 \"比较目标 \"关键词进行搜索", + "coverage_details": "覆盖率详情", + "report_id": "上报 ID", + "coverage_id": "覆盖率 ID", + "view_detail": "查看详情", + "max_coverage_tooltip": "近30天的最大覆盖率", + "statements_tooltip": "语句覆盖率也是总体覆盖率", + "newlines_tooltip": "变更代码行覆盖率", + "statements_tour_title": "语句覆盖率", + "newlines_tour_title": "变更代码行覆盖率", + "statements_tour_description": "点击此列中的百分比数字以跳转至全量覆盖详情页面。", + "newlines_tour_description": "点击此列中的百分比数字以跳转至变更行覆盖详情页面。" + }, + "settings": { + "desc": "设置您的账户信息", + "preference": "偏好", + "user_auth_tokens": "用户授权令牌", + "copied_to_clipboard": "已复制到剪贴板" + }, + "common": { + "option": "操作", + "detail": "详情", + "configure": "配置", + "delete": "删除", + "language": "语言", + "theme": "主题", + "light": "光明", + "dark": "黑暗", + "created_at": "创建时间", + "total_items": "共计 {{total}} 项" + }, + "app": { + "logout": "退出登录" + } +} diff --git a/packages/canyon-ui-old/locales/en.json b/packages/canyon-ui-old/locales/en.json new file mode 100644 index 00000000..f8309c71 --- /dev/null +++ b/packages/canyon-ui-old/locales/en.json @@ -0,0 +1,72 @@ +{ + "welcome": { + "hello": "Hello,", + "copywriter": "Welcome to Canyon.", + "desc": "You will be redirected to the source code control management system for authentication.", + "continue": "Continue" + }, + "menus": { + "projects": "Projects", + "settings": "Settings", + "docs": "Docs" + }, + "projects": { + "create": "Create a Project", + "desc": "View all projects related to your account", + "name": "Name", + "report_times": "Times", + "report_time": "Report Time", + "max_coverage": "Max Coverage", + "latest_report_time": "Last Reported", + "latest_report_coverage": "Latest Report Coverage", + "no_data": "{{msg}} projects have no data", + "total_times": "Total Times", + "trends_in_coverage": "Trends in coverage", + "records": "Records", + "overview": "Overview", + "branch": "Branch", + "compare_target": "Compare Target", + "message": "Commit Message", + "functions": "Functions", + "branches": "Branches", + "statements": "Statements", + "lines": "Lines", + "newlines": "New Lines", + "reported_details": "Logs", + "reporter": "Reporter", + "search_keywords": "Search by project id or name", + "overview_search_keywords": "Enter the \"Commit Sha\" or \"Branch\" or \"Compare Target\" keyword for search", + "coverage_details": "Coverage Details", + "report_id": "Report ID", + "coverage_id": "Coverage ID", + "view_detail": "View Detail", + "max_coverage_tooltip": "Maximum coverage for the last 30 days", + "statements_tooltip": "Statement coverage is also overall coverage", + "newlines_tooltip": "Change code line coverage", + "statements_tour_title": "Statement Coverage", + "newlines_tour_title": "New Line Coverage", + "statements_tour_description": "Click on the percentage number in this column to jump to the full coverage details page.", + "newlines_tour_description": "Click on the percentage number in this column to jump to the changed line coverage details page." + }, + "settings": { + "desc": "Set up your account information", + "preference": "Preferences", + "user_auth_tokens": "User Authorization Tokens", + "copied_to_clipboard": "Copied to clipboard" + }, + "common": { + "option": "Option", + "detail": "Detail", + "configure": "Configure", + "delete": "Delete", + "language": "Language", + "theme": "Theme", + "light": "Light", + "dark": "Dark", + "created_at": "Created At", + "total_items": "Total {{total}} Items" + }, + "app": { + "logout": "Logout" + } +} diff --git a/packages/canyon-ui-old/package.json b/packages/canyon-ui-old/package.json new file mode 100644 index 00000000..32b308da --- /dev/null +++ b/packages/canyon-ui-old/package.json @@ -0,0 +1,41 @@ +{ + "name": "canyon-ui-old", + "version": "0.0.14", + "type": "module", + "main": "dist/canyon-ui-old.cjs", + "module": "dist/canyon-ui-old.js", + "types": "./dist/index.d.ts", + "files": [ + "dist/*" + ], + "scripts": { + "dev-ui": "vite", + "build": "vite build" + }, + "dependencies": { + "@ant-design/icons": "^5.3.0", + "ahooks": "^3.7.10", + "antd": "^5.14.1", + "axios": "^1.6.7", + "i18next": "^23.8.2", + "i18next-browser-languagedetector": "^7.2.0", + "react": "^18.3.1", + "react-dom": "^18.3.1", + "react-i18next": "^14.0.5", + "swr": "^2.2.5" + }, + "devDependencies": { + "@types/react": "^18.2.56", + "@types/react-dom": "^18.2.19", + "@vitejs/plugin-react": "^4.2.1", + "autoprefixer": "^10.4.17", + "postcss": "^8.4.35", + "react-router-dom": "^6.22.1", + "tailwindcss": "^3.4.1", + "typescript": "^5.3.3", + "vite": "^5.3.2", + "vite-plugin-dts": "^3.5.3", + "vite-plugin-pages": "^0.32.0", + "vite-plugin-svgr": "^4.2.0" + } +} diff --git a/packages/canyon-ui-old/postcss.config.js b/packages/canyon-ui-old/postcss.config.js new file mode 100644 index 00000000..2e7af2b7 --- /dev/null +++ b/packages/canyon-ui-old/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, +} diff --git a/packages/canyon-ui-old/public/light-logo.svg b/packages/canyon-ui-old/public/light-logo.svg new file mode 100644 index 00000000..8fca65d1 --- /dev/null +++ b/packages/canyon-ui-old/public/light-logo.svg @@ -0,0 +1 @@ + diff --git a/packages/canyon-ui-old/public/logo.svg b/packages/canyon-ui-old/public/logo.svg new file mode 100644 index 00000000..3c78311c --- /dev/null +++ b/packages/canyon-ui-old/public/logo.svg @@ -0,0 +1 @@ + diff --git a/packages/canyon-ui-old/public/welcome-bg.svg b/packages/canyon-ui-old/public/welcome-bg.svg new file mode 100644 index 00000000..cf73914e --- /dev/null +++ b/packages/canyon-ui-old/public/welcome-bg.svg @@ -0,0 +1,25 @@ + diff --git a/packages/canyon-ui-old/src/assets/icons/EpTopRight.tsx b/packages/canyon-ui-old/src/assets/icons/EpTopRight.tsx new file mode 100644 index 00000000..231975b1 --- /dev/null +++ b/packages/canyon-ui-old/src/assets/icons/EpTopRight.tsx @@ -0,0 +1,6 @@ +// import React from 'react'; +import type { SVGProps } from 'react'; + +export function EpTopRight(props: SVGProps) { + return (); +} diff --git a/packages/canyon-ui-old/src/assets/img/github.svg b/packages/canyon-ui-old/src/assets/img/github.svg new file mode 100644 index 00000000..6eeeace6 --- /dev/null +++ b/packages/canyon-ui-old/src/assets/img/github.svg @@ -0,0 +1 @@ + diff --git a/packages/canyon-ui-old/src/assets/img/gitlab.svg b/packages/canyon-ui-old/src/assets/img/gitlab.svg new file mode 100644 index 00000000..f5556c4b --- /dev/null +++ b/packages/canyon-ui-old/src/assets/img/gitlab.svg @@ -0,0 +1 @@ + diff --git a/packages/canyon-ui-old/src/assets/img/google.svg b/packages/canyon-ui-old/src/assets/img/google.svg new file mode 100644 index 00000000..6f895153 --- /dev/null +++ b/packages/canyon-ui-old/src/assets/img/google.svg @@ -0,0 +1 @@ + diff --git a/packages/canyon-ui-old/src/assets/img/img.png b/packages/canyon-ui-old/src/assets/img/img.png new file mode 100644 index 0000000000000000000000000000000000000000..fc5292a6a94f4e1421bc93f66f9806bd6f72ee55 GIT binary patch literal 32413 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 literal 0 HcmV?d00001 diff --git a/packages/canyon-ui-old/src/components/card/Primary.tsx b/packages/canyon-ui-old/src/components/card/Primary.tsx new file mode 100644 index 00000000..37576f1f --- /dev/null +++ b/packages/canyon-ui-old/src/components/card/Primary.tsx @@ -0,0 +1,26 @@ +// import { CanyonCardPrimary } from './index.ts'; +import { StockOutlined } from '@ant-design/icons'; +import { Button, Col, Divider, Row, Space, Statistic, theme, Typography } from 'antd'; +import { FC } from 'react'; +const { useToken } = theme; +const { Title } = Typography; +const CanyonCardPrimary: FC<{ + theme?: any; + language?: any; + children: any; +}> = ({ theme, language, children }) => { + const { token } = useToken(); + return ( +
+ {children} +
+ ); +}; + +export default CanyonCardPrimary; diff --git a/packages/canyon-ui-old/src/components/card/index.ts b/packages/canyon-ui-old/src/components/card/index.ts new file mode 100644 index 00000000..b1274f7d --- /dev/null +++ b/packages/canyon-ui-old/src/components/card/index.ts @@ -0,0 +1 @@ +export { default as CanyonCardPrimary } from './Primary'; diff --git a/packages/canyon-ui-old/src/components/index.ts b/packages/canyon-ui-old/src/components/index.ts new file mode 100644 index 00000000..cb9d0c90 --- /dev/null +++ b/packages/canyon-ui-old/src/components/index.ts @@ -0,0 +1,4 @@ +export * from './card'; +export * from './layout'; +export * from './modal'; +export * from './page'; diff --git a/packages/canyon-ui-old/src/components/layout/Base.tsx b/packages/canyon-ui-old/src/components/layout/Base.tsx new file mode 100644 index 00000000..26c33b16 --- /dev/null +++ b/packages/canyon-ui-old/src/components/layout/Base.tsx @@ -0,0 +1,205 @@ +// import { ArrowRightOutlined, MoreOutlined } from '@ant-design/icons'; +// import { Avatar, Breadcrumb, Dropdown, Menu, Tooltip } from 'antd'; +// import { Outlet } from 'react-router-dom'; + +import { + ArrowRightOutlined, + FolderOutlined, + MoreOutlined, + SearchOutlined, + SettingOutlined, +} from '@ant-design/icons'; +import { + Avatar, + Button, + Dropdown, + Menu, + MenuProps, + Select, + theme, + Tooltip, + Typography, +} from 'antd'; +import { FC, ReactNode } from 'react'; + +import { CanyonCardPrimary } from '../card'; +import Footer from './footer.tsx'; +import ScrollBasedLayout from './ScrollBasedLayout.tsx'; +const { useToken } = theme; +const { Text, Title } = Typography; +interface CanyonLayoutBaseProps { + title?: string; + logo?: ReactNode; + mainTitleRightNode?: ReactNode; + menuSelectedKey?: string; + onSelectMenu?: (selectInfo: { key: string }) => void; + menuItems: MenuProps['items']; + renderMainContent?: ReactNode; + onClickGlobalSearch?: () => void; + MeData: any; + itemsDropdown: any; + search: any; + account: any; + breadcrumb: any; + footerName?: string; +} +const CanyonLayoutBase: FC = ({ + title = 'Canyon', + logo, + mainTitleRightNode, + menuSelectedKey = '', + onSelectMenu, + menuItems, + renderMainContent, + onClickGlobalSearch, + MeData, + itemsDropdown, + search, + account, + breadcrumb, + footerName = 'CANYON', +}) => { + const { token } = useToken(); + + return ( +
+ <> + +
+
+
{ + window.location.href = '/'; + }} + > + {logo} + + {title} + +
+ +
{mainTitleRightNode}
+
+
+ {search && ( +
+ + + +
+ )} + + {account && ( +
+ + Account + + + + + + + label='Password' + name='password' + rules={[{ required: true, message: 'Please input your password!' }]} + > + + + + + + + + ); +}; + +export default LoginForm; diff --git a/packages/canyon-ui-old/src/components/page/login/index.tsx b/packages/canyon-ui-old/src/components/page/login/index.tsx new file mode 100644 index 00000000..8c9647b8 --- /dev/null +++ b/packages/canyon-ui-old/src/components/page/login/index.tsx @@ -0,0 +1,77 @@ +import Icon from '@ant-design/icons'; +import { Divider, Tabs, Typography } from 'antd'; +import { FC } from 'react'; + +import { EpTopRight } from '../../../assets/icons/EpTopRight.tsx'; +import img from '../../../assets/img/img.png'; +import { CanyonCardPrimary } from '../../card'; +import LoginBtn from './LoginBtn.tsx'; +import LoginForm from './LoginForm.tsx'; + +const { Title } = Typography; + +const CanyonPageLogin: FC<{ + onLoginSuccess: () => void; + oauthUrl: { gitlab: string }; + logo: React.ReactNode; + register?: string; +}> = ({ onLoginSuccess, oauthUrl, logo, register }) => { + return ( +
+
+ +
+
+ + {logo} + +
+ +
+
+ Log in and continue +
+ + + Register + + +
+ ) + } + items={[ + { + label: 'Sign In', + key: 'login', + children: ( +
+ + + +
+ ), + }, + ]} + /> +
+
+ +
+ +
+
+ ); +}; + +export default CanyonPageLogin; diff --git a/packages/canyon-ui-old/src/index.ts b/packages/canyon-ui-old/src/index.ts new file mode 100644 index 00000000..07635cbb --- /dev/null +++ b/packages/canyon-ui-old/src/index.ts @@ -0,0 +1 @@ +export * from './components'; diff --git a/packages/canyon-ui-old/src/vite-env.d.ts b/packages/canyon-ui-old/src/vite-env.d.ts new file mode 100644 index 00000000..26064990 --- /dev/null +++ b/packages/canyon-ui-old/src/vite-env.d.ts @@ -0,0 +1,2 @@ +/// +// vite-env.d.ts diff --git a/packages/canyon-ui-old/tailwind.config.js b/packages/canyon-ui-old/tailwind.config.js new file mode 100644 index 00000000..65490f9b --- /dev/null +++ b/packages/canyon-ui-old/tailwind.config.js @@ -0,0 +1,12 @@ +/** @type {import('tailwindcss').Config} */ +export default { + darkMode: 'class', + content: ['./index.html', './src/**/*.{js,ts,jsx,tsx}'], + theme: { + extend: {}, + }, + plugins: [], + corePlugins: { + preflight: false, + }, +}; diff --git a/packages/canyon-ui-old/tsconfig.node.json b/packages/canyon-ui-old/tsconfig.node.json new file mode 100644 index 00000000..42872c59 --- /dev/null +++ b/packages/canyon-ui-old/tsconfig.node.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "composite": true, + "skipLibCheck": true, + "module": "ESNext", + "moduleResolution": "bundler", + "allowSyntheticDefaultImports": true + }, + "include": ["vite.config.ts"] +} diff --git a/packages/canyon-ui-old/vite.config.ts b/packages/canyon-ui-old/vite.config.ts new file mode 100644 index 00000000..8995c42d --- /dev/null +++ b/packages/canyon-ui-old/vite.config.ts @@ -0,0 +1,22 @@ +import { resolve } from 'path'; +import { defineConfig } from 'vite'; +import dts from 'vite-plugin-dts'; +import Pages from 'vite-plugin-pages'; +export default defineConfig({ + plugins: [ + Pages({ + exclude: ['**/helper/**'], + }), + dts(), + ], + build: { + outDir: './dist', + emptyOutDir: true, + commonjsOptions: {}, + lib: { + entry: resolve(__dirname, 'src/index.ts'), + fileName: 'canyon-ui-old', + name: 'CanyonUiOld', + } + }, +});