diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..249020c --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,95 @@ +# 1. 准备工作:配置 GitHub Secrets +# 在你的 GitHub 仓库中,进入 Settings -> Secrets and variables -> Actions,添加以下 Repository secrets: +# SERVER_HOST: 你的服务器 IP。 +# SERVER_USER: 服务器用户名(如 root)。 +# SERVER_SSH_KEY: 你的 SSH 私钥(id_rsa 的内容)。 +# GLITCHTIP_URL: 你的 GlitchTip 域名(如 https://glitchtip.example.com/)。 +# GLITCHTIP_ORG: GlitchTip 里的组织 Slug。 +# GLITCHTIP_PROJECT: GlitchTip 里的项目 Slug。 +# GLITCHTIP_TOKEN: GlitchTip 的 API Auth Token。 +# REMOTE_PATH: 服务器部署根路径(如 /www/wwwroot/alert)。 + +# 2. 配置 GitHub Actions +# 在你的 GitHub 仓库中,进入 Actions -> Workflows,创建一个新的 Workflow 文件,例如 deploy.yml。 +name: Pro-CI-CD-Pipeline + +on: + push: + tags: + - "v*" # 仅当推送 v 开头的 tag 时触发 (例如 v1.1.0) + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + # 1. 检出代码 + - name: Checkout Code + uses: actions/checkout@v4 + + # 2. 安装 pnpm (Node >= 20) + - name: Install pnpm + uses: pnpm/action-setup@v2 + with: + version: 8 # 或者使用 latest + + - name: Set Up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + cache: "pnpm" + + # 3. 安装依赖并执行打包 + - name: Install Dependencies and Build + run: | + pnpm install + pnpm run build + env: + # 注入版本号给 UmiJS (Ant Design Pro) + UMI_APP_SENTRY_RELEASE: ${{ github.ref_name }} + + # 4. 上传 SourceMap 到 GlitchTip + - name: Upload SourceMaps to GlitchTip + uses: getsentry/action-release@v1 + env: + SENTRY_AUTH_TOKEN: ${{ secrets.GLITCHTIP_TOKEN }} + SENTRY_URL: ${{ secrets.GLITCHTIP_URL }} + SENTRY_ORG: ${{ secrets.GLITCHTIP_ORG }} + SENTRY_PROJECT: ${{ secrets.GLITCHTIP_PROJECT }} + with: + version: ${{ github.ref_name }} + sourcemaps: "./dist" + url_prefix: "~/" # 匹配线上 JS 路径 + + # 5. 安全清理:删除本地打包后的 .map 文件 + - name: Clean SourceMaps + run: find dist -name "*.map" -type f -delete + + # 6. 配置 SSH 密钥 + - name: Install SSH Key + uses: shimataro/ssh-key-action@v2 + with: + key: ${{ secrets.SERVER_SSH_KEY }} + known_hosts: unnecessary # 第一次连接自动确认 + if_key_exists: replace + + # 7. 远程原子化部署 (Atomic Deployment) + - name: Deploy to Server + run: | + VERSION=${{ github.ref_name }} + REMOTE_BASE=${{ secrets.REMOTE_PATH }} + RELEASES_PATH="$REMOTE_BASE/releases/$VERSION" + CURRENT_PATH="$REMOTE_BASE/current" + + echo ">>> 正在创建远程目录: $RELEASES_PATH" + ssh -o StrictHostKeyChecking=no ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "mkdir -p $RELEASES_PATH" + + echo ">>> 正在上传打包产物 (rsync)..." + # 使用 rsync 同传 dist 目录内容到 releases 下的版本目录 + rsync -avz --delete ./dist/ ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }}:$RELEASES_PATH + + echo ">>> 正在更新服务器软链接 (ln -snf)..." + # 原子化切换软链接 + ssh ${{ secrets.SERVER_USER }}@${{ secrets.SERVER_HOST }} "ln -snf $RELEASES_PATH $CURRENT_PATH" + + - name: Success Notification + run: echo "🎉 Version ${{ github.ref_name }} successfully deployed to ${{ secrets.SERVER_HOST }}" diff --git a/.husky/commit-msg b/.husky/commit-msg deleted file mode 100644 index 6a2e4c8..0000000 --- a/.husky/commit-msg +++ /dev/null @@ -1 +0,0 @@ -pnpm exec commitlint --edit $1 diff --git a/.husky/pre-commit b/.husky/pre-commit deleted file mode 100644 index 5ee7abd..0000000 --- a/.husky/pre-commit +++ /dev/null @@ -1 +0,0 @@ -pnpm exec lint-staged diff --git a/config/config.ts b/config/config.ts index fa42e8e..06273cb 100644 --- a/config/config.ts +++ b/config/config.ts @@ -58,8 +58,7 @@ const config: ConfigType = defineConfig({ */ ignoreMomentLocale: true, - // Only enable sourcemap during the dev stage - devtool: isDev ? 'source-map' : false, + devtool: process.env.UMI_APP_SENTRY_DSN ? 'source-map' : false, /** * @name Proxy configuration * @description Allows your local server to proxy requests to your backend so you can access server data locally diff --git a/deploy.js b/deploy.js index f978fdc..3860138 100644 --- a/deploy.js +++ b/deploy.js @@ -6,10 +6,11 @@ const path = require('node:path'); const CONFIG = { // 1. 开发源码所在的根目录 devProjectRoot: path.join(__dirname, './'), - // 2. phpStudy 实际运行网站的目录 (目标位置) - phpStudyPath: 'D:/phpstudy_pro/WWW/alert', + // 2. 实际运行网站的目录 (目标位置) + prodProjectPath: 'D:\\phpstudy_pro\\WWW\\alert', deployRemote: false, + // 需要配置ssh密钥对,否则会提示输入密码 remote: { host: '1.2.3.4', // 服务器IP user: 'root', // 用户名 @@ -19,8 +20,8 @@ const CONFIG = { // 预定义几个常用路径 const DEV_DIST = path.join(CONFIG.devProjectRoot, 'dist'); -const PHPSTUDY_RELEASES = path.join(CONFIG.phpStudyPath, 'releases'); -const PHPSTUDY_CURRENT = path.join(CONFIG.phpStudyPath, 'current'); +const PROD_RELEASES = path.join(CONFIG.prodProjectPath, 'releases'); +const PROD_CURRENT = path.join(CONFIG.prodProjectPath, 'current'); // 颜色工具 const log = { @@ -30,9 +31,68 @@ const log = { error: (msg) => console.log(`\x1b[31m✘ ${msg}\x1b[0m`), }; -async function start() { - let version = ''; +async function main() { + // 解析参数: node scripts/deploy.js --rollback v1.0.0 + const args = process.argv.slice(2); + const isStatus = args[0] === '--status' || args[0] === '-s'; + const isRollback = args[0] === '--rollback' || args[0] === '-r'; + const targetVersion = isRollback ? args[1] : ''; + if (isStatus) { + showStatus(); + return; // 结束执行 + } + + if (isRollback) { + if (!targetVersion) { + log.error( + '请指定要切换的版本号,例如: node scripts/deploy.js --rollback v1.0.0', + ); + process.exit(1); + } + await performRollback(targetVersion); + } else { + await performFullDeploy(); + } +} + +// --- 【逻辑函数:秒级回退/切换】 --- +async function performRollback(version) { + log.info(`开始秒级切换至版本: ${version}...`); + + // 1. 检查本地是否存在该版本 + const localTarget = path.join(PROD_RELEASES, version); + if (!fs.existsSync(localTarget)) { + log.error( + `本地 releases 目录中未找到版本 ${version},请检查路径: ${localTarget}`, + ); + process.exit(1); + } + + // 2. 切换本地软链接 + try { + updateLocalLink(localTarget); + log.success(`本地 Prod项目 已成功切换至 ${version}`); + } catch (e) { + log.error(`本地切换失败: ${e.message}`); + } + + // 3. 切换远程软链接 + if (CONFIG.deployRemote) { + try { + updateRemoteLink(version); + log.success(`远程服务器已成功切换至 ${version}`); + } catch (e) { + log.error(`远程切换失败: ${e.message}`); + } + } + + log.info('切换任务结束。'); +} + +// --- 【逻辑函数:全流程发布】 --- +async function performFullDeploy() { + let version = ''; // 1. 获取 Git Tag try { version = execSync('git describe --tags --abbrev=0').toString().trim(); @@ -42,6 +102,8 @@ async function start() { process.exit(1); } + log.info(`开始全流程发布版本: ${version}`); + // 2. 执行编译 try { log.info('开始执行构建 (npm run build)...'); @@ -71,14 +133,27 @@ async function start() { log.warn('您可以稍后手动补传,部署将继续进行...'); } - // 4. 清理并本地归档 + // 4. 清理 Map try { - log.info('正在清理.map 文件并执行本地归档...'); + log.info('正在尝试清理 SourceMap...'); cleanSourceMaps(DEV_DIST); - deployToLocal(version); - log.success('本地归档与软链接更新完成'); + log.success('SourceMap 清理成功'); } catch (_e) { - log.error(`本地归档失败: ${_e.message}`); + log.error(`SourceMap 清理失败: ${_e.message}`); + } + + // D. 归档到本地 Prod项目 + try { + const targetDir = path.join(PROD_RELEASES, version); + if (fs.existsSync(targetDir)) + fs.rmSync(targetDir, { recursive: true, force: true }); + if (!fs.existsSync(PROD_RELEASES)) + fs.mkdirSync(PROD_RELEASES, { recursive: true }); + fs.cpSync(DEV_DIST, targetDir, { recursive: true }); + updateLocalLink(targetDir); + log.success('本地部署成功'); + } catch (e) { + log.error(`本地归档失败: ${e.message}`); process.exit(1); } @@ -100,43 +175,55 @@ async function start() { log.info(`\n🎉 所有任务执行完毕 [Version: ${version}]`); } -// --- 逻辑封装函数 --- +// --- 新增状态查看函数 --- +function showStatus() { + log.info('正在查询当前版本状态...'); -function deployToLocal(version) { - const targetDir = path.join(PHPSTUDY_RELEASES, version); - - // A. 确保 phpStudy 下的 releases 文件夹存在 - if (!fs.existsSync(PHPSTUDY_RELEASES)) { - fs.mkdirSync(PHPSTUDY_RELEASES, { recursive: true }); + // 1. 查看本地版本 (Node.js 获取软链接指向的真实路径) + if (fs.existsSync(PROD_CURRENT)) { + // realpathSync 可以获取软链接指向的真实绝对路径 + const realPath = fs.realpathSync(PROD_CURRENT); + const version = path.basename(realPath); + log.success(`本地 Prod 当前版本: ${version}`); + log.info(` 路径: ${realPath}`); + } else { + log.warn('本地尚未创建 current 软链接。'); } - // B. 如果该版本已存在,先删除旧的 - if (fs.existsSync(targetDir)) { - fs.rmSync(targetDir, { recursive: true, force: true }); - } - - // C. 【关键】将开发目录下的 dist 复制到 phpStudy 对应的版本目录 - // fs.cpSync 需要 Node.js v16.7.0+ - try { - fs.cpSync(DEV_DIST, targetDir, { recursive: true }); - log.success(`已将产物复制到: ${targetDir}`); - } catch (_e) { - throw new Error(`复制产物到 phpStudy 目录失败: ${_e.message}`); - } - - // D. 更新 phpStudy 目录下的软链接 (Junction) - if (fs.existsSync(PHPSTUDY_CURRENT)) { + // 2. 查看远程版本 (通过 SSH 执行 readlink) + if (CONFIG.deployRemote) { try { - // Windows 下删除目录链接 - fs.rmSync(PHPSTUDY_CURRENT, { recursive: true, force: true }); + const { host, user, path: remotePath } = CONFIG.remote; + const remoteCurrentLink = `${remotePath}/current`; + // readlink -f 可以获取链接指向的完整路径 + const cmd = `ssh ${user}@${host} "readlink -f ${remoteCurrentLink}"`; + const remoteRealPath = execSync(cmd).toString().trim(); + const remoteVersion = path.basename(remoteRealPath); + log.success(`远程服务器当前版本: ${remoteVersion}`); } catch (_e) { - throw new Error(`无法删除 phpStudy 旧的软链接: ${_e.message}`); + log.error('无法获取远程版本状态,请检查 SSH 连接。'); } } +} - // 在 phpStudy 目录下创建链接,指向刚复制过去的版本 +// --- 【通用工具函数】 --- + +function updateLocalLink(targetDir) { + if (fs.existsSync(PROD_CURRENT)) { + fs.rmSync(PROD_CURRENT, { recursive: true, force: true }); + } const linkType = process.platform === 'win32' ? 'junction' : 'dir'; - fs.symlinkSync(targetDir, PHPSTUDY_CURRENT, linkType); + fs.symlinkSync(targetDir, PROD_CURRENT, linkType); +} + +function updateRemoteLink(version) { + const { host, user, path: remotePath } = CONFIG.remote; + const remoteVersionDir = `${remotePath}/releases/${version}`; + const remoteCurrentLink = `${remotePath}/current`; + // 直接发送 ln 命令,前提是该目录已经在服务器 releases 里了 + execSync( + `ssh ${user}@${host} "ln -snf ${remoteVersionDir} ${remoteCurrentLink}"`, + ); } function deployToRemote(version) { @@ -188,4 +275,4 @@ function cleanSourceMaps(dir) { } // 启动执行 -start(); +main(); diff --git a/package.json b/package.json index acd99b6..3e9f3bc 100644 --- a/package.json +++ b/package.json @@ -11,14 +11,13 @@ "dev:mock": "npm run start:mock", "postinstall": "max setup", "lint": "npm run biome:lint && npm run tsc", - "lint-staged": "lint-staged", "biome:lint": "npx @biomejs/biome lint", - "prepare": "husky", "preview": "max preview --port 8000", "start": "cross-env UMI_ENV=dev MOCK=none max dev", "start:mock": "cross-env UMI_ENV=dev max dev", "tsc": "tsc --noEmit", - "dpl": "node deploy.js" + "dpl": "node deploy.js", + "rollback": "node deploy.js --rollback" }, "browserslist": [ "defaults" @@ -54,8 +53,6 @@ "@umijs/max": "^4.3.24", "cross-env": "^7.0.3", "express": "^4.21.1", - "husky": "^9.1.7", - "lint-staged": "^16.1.2", "mockjs": "^1.1.0", "ts-node": "^10.9.2", "typescript": "^5.6.3", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e880555..ffabfef 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -93,12 +93,6 @@ importers: express: specifier: ^4.21.1 version: 4.22.1 - husky: - specifier: ^9.1.7 - version: 9.1.7 - lint-staged: - specifier: ^16.1.2 - version: 16.2.7 mockjs: specifier: ^1.1.0 version: 1.1.0 @@ -3659,10 +3653,6 @@ packages: resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} engines: {node: '>=8'} - ansi-escapes@7.2.0: - resolution: {integrity: sha512-g6LhBsl+GBPRWGWsBtutpzBYuIIdBkLEvad5C/va/74Db018+5TZiyA26cZJAr3Rft5lprVqOIPxf5Vid6tqAw==} - engines: {node: '>=18'} - ansi-html-community@0.0.8: resolution: {integrity: sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==} engines: {'0': node >= 0.8.0} @@ -4336,10 +4326,6 @@ packages: resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} engines: {node: '>=8'} - cli-cursor@5.0.0: - resolution: {integrity: sha512-aCj4O5wKyszjMmDT4tZj93kxyydN/K5zPWSCe6/0AV/AA1pqe5ZBIw0a2ZfPQV7lL5/yb5HsUreJ6UFAF1tEQw==} - engines: {node: '>=18'} - cli-spinners@2.9.2: resolution: {integrity: sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==} engines: {node: '>=6'} @@ -4348,10 +4334,6 @@ packages: resolution: {integrity: sha512-IqLQi4lO0nIB4tcdTpN4LCB9FI3uqrJZK7RC515EnhZ6qBaglkIgICb1wjeAqpdoOabm1+SuQtkXIPdYC93jhQ==} engines: {node: '>= 0.2.0'} - cli-truncate@5.1.1: - resolution: {integrity: sha512-SroPvNHxUnk+vIW/dOSfNqdy1sPEFkrTk6TUtqLCnBlo3N7TNYYkzzN7uSD6+jVjrdO4+p8nH7JzH6cIvUem6A==} - engines: {node: '>=20'} - cli-width@3.0.0: resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} engines: {node: '>= 10'} @@ -4428,9 +4410,6 @@ packages: colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} - colorette@2.0.20: - resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} - colors@1.0.3: resolution: {integrity: sha512-pFGrxThWcWQ2MsAz6RtgeWe4NK2kUE1WfsrvvlctdII745EW9I0yflqhe7++M5LEc7bV2c/9/5zc8sFcpL0Drw==} engines: {node: '>=0.1.90'} @@ -5198,9 +5177,6 @@ packages: resolution: {integrity: sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==} engines: {node: '>=12'} - emoji-regex@10.6.0: - resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==} - emoji-regex@7.0.3: resolution: {integrity: sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==} @@ -5258,10 +5234,6 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} - environment@1.1.0: - resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==} - engines: {node: '>=18'} - err-code@2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -5882,10 +5854,6 @@ packages: resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} engines: {node: 6.* || 8.* || >= 10.*} - get-east-asian-width@1.4.0: - resolution: {integrity: sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q==} - engines: {node: '>=18'} - get-intrinsic@1.3.0: resolution: {integrity: sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==} engines: {node: '>= 0.4'} @@ -6250,11 +6218,6 @@ packages: humanize-ms@1.2.1: resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} - husky@9.1.7: - resolution: {integrity: sha512-5gs5ytaNjBrh5Ow3zrvdUUY+0VxIuWVL4i9irt6friV+BqdCfmV11CQTWMiBYWHbXhco+J1kHfTOUkePhCDvMA==} - engines: {node: '>=18'} - hasBin: true - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -6528,10 +6491,6 @@ packages: resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} engines: {node: '>=8'} - is-fullwidth-code-point@5.1.0: - resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==} - engines: {node: '>=18'} - is-generator-fn@2.1.0: resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} engines: {node: '>=6'} @@ -7172,15 +7131,6 @@ packages: lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - lint-staged@16.2.7: - resolution: {integrity: sha512-lDIj4RnYmK7/kXMya+qJsmkRFkGolciXjrsZ6PC25GdTfWOAWetR0ZbsNXRAj1EHHImRSalc+whZFg56F5DVow==} - engines: {node: '>=20.17'} - hasBin: true - - listr2@9.0.5: - resolution: {integrity: sha512-ME4Fb83LgEgwNw96RKNvKV4VTLuXfoKudAmm2lP8Kk87KaMK0/Xrx/aAkMWmT8mDb+3MlFDspfbCs7adjRxA2g==} - engines: {node: '>=20.0.0'} - load-json-file@4.0.0: resolution: {integrity: sha512-Kx8hMakjX03tiGTLAIdJ+lL0htKnXjEZN6hk/tozf/WOuYGdZBJrZ+rCJRbVCugsjB3jMLn9746NsQIf5VjBMw==} engines: {node: '>=4'} @@ -7287,10 +7237,6 @@ packages: resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} engines: {node: '>=10'} - log-update@6.1.0: - resolution: {integrity: sha512-9ie8ItPR6tjY5uYJh8K/Zrv/RMZ5VOlOWvtZdEHYSTFKZfIBPQa9tOAEeAWhd+AnIneLJ22w5fjOYtoutpWq5w==} - engines: {node: '>=18'} - log4js@1.1.1: resolution: {integrity: sha512-lYb14ZSs1M/CUFuvy7Zk3VZLDtqrqOaVql9CE0tv8g6/qE1Gfq97XKdltBsjSxxvcJ+t8fAXOnvFxSsms7gGVg==} engines: {node: '>=0.12'} @@ -7503,10 +7449,6 @@ packages: resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} engines: {node: '>=12'} - mimic-function@5.0.1: - resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==} - engines: {node: '>=18'} - mimic-response@1.0.1: resolution: {integrity: sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==} engines: {node: '>=4'} @@ -7655,10 +7597,6 @@ packages: mute-stream@0.0.8: resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} - nano-spawn@2.0.0: - resolution: {integrity: sha512-tacvGzUY5o2D8CBh2rrwxyNojUsZNU2zjNTzKQrkgGJQTbGAfArVWXSKMBokBeeg6C7OLRGUEyoFlYbfeWQIqw==} - engines: {node: '>=20.17'} - nanoid@3.3.11: resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -7984,10 +7922,6 @@ packages: resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} engines: {node: '>=12'} - onetime@7.0.0: - resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==} - engines: {node: '>=18'} - open@8.4.2: resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==} engines: {node: '>=12'} @@ -8246,11 +8180,6 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} - pidtree@0.6.0: - resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==} - engines: {node: '>=0.10'} - hasBin: true - pify@2.3.0: resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} engines: {node: '>=0.10.0'} @@ -9693,10 +9622,6 @@ packages: resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} engines: {node: '>=8'} - restore-cursor@5.1.0: - resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} - engines: {node: '>=18'} - retry@0.12.0: resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} engines: {node: '>= 4'} @@ -9705,9 +9630,6 @@ packages: resolution: {integrity: sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rfdc@1.4.1: - resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} - rimraf@2.7.1: resolution: {integrity: sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==} deprecated: Rimraf versions prior to v4 are no longer supported @@ -10094,10 +10016,6 @@ packages: resolution: {integrity: sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==} engines: {node: '>=10'} - slice-ansi@7.1.2: - resolution: {integrity: sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w==} - engines: {node: '>=18'} - smart-buffer@4.2.0: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} @@ -10258,10 +10176,6 @@ packages: resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} engines: {node: '>=4'} - string-argv@0.3.2: - resolution: {integrity: sha512-aqD2Q0144Z+/RqG52NeHEkZauTAUWJO8c6yTftGJKO3Tja5tUgIfmIl6kExvhtxSDP7fXB6DvzkfMpCd/F3G+Q==} - engines: {node: '>=0.6.19'} - string-convert@0.2.1: resolution: {integrity: sha512-u/1tdPl4yQnPBjnVrmdLo9gtuLvELKsAoRapekWggdiQNvvvum+jYF329d84NAa660KQw7pB2n36KrIKVoXa3A==} @@ -10285,14 +10199,6 @@ packages: resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} engines: {node: '>=12'} - string-width@7.2.0: - resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==} - engines: {node: '>=18'} - - string-width@8.1.0: - resolution: {integrity: sha512-Kxl3KJGb/gxkaUMOjRsQ8IrXiGW75O4E3RPjFIINOVH8AMl2SQ/yWdTzWwF3FevIX9LcMAjJW+GRwAlAbTSXdg==} - engines: {node: '>=20'} - string.prototype.matchall@4.0.12: resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==} engines: {node: '>= 0.4'} @@ -11182,10 +11088,6 @@ packages: resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} engines: {node: '>=12'} - wrap-ansi@9.0.2: - resolution: {integrity: sha512-42AtmgqjV+X1VpdOfyTGOYRi0/zsoLqtXQckTmqTeybT+BDIbM/Guxo7x3pE2vtpr1ok6xRqM9OpBe+Jyoqyww==} - engines: {node: '>=18'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -11251,11 +11153,6 @@ packages: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} engines: {node: '>= 6'} - yaml@2.8.2: - resolution: {integrity: sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A==} - engines: {node: '>= 14.6'} - hasBin: true - yargs-parser@13.1.1: resolution: {integrity: sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==} @@ -16912,10 +16809,6 @@ snapshots: dependencies: type-fest: 0.21.3 - ansi-escapes@7.2.0: - dependencies: - environment: 1.1.0 - ansi-html-community@0.0.8: {} ansi-regex@3.0.1: {} @@ -17959,21 +17852,12 @@ snapshots: dependencies: restore-cursor: 3.1.0 - cli-cursor@5.0.0: - dependencies: - restore-cursor: 5.1.0 - cli-spinners@2.9.2: {} cli-table@0.3.11: dependencies: colors: 1.0.3 - cli-truncate@5.1.1: - dependencies: - slice-ansi: 7.1.2 - string-width: 8.1.0 - cli-width@3.0.0: {} click-to-react-component@1.1.0(@types/react@19.2.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1): @@ -18050,8 +17934,6 @@ snapshots: colord@2.9.3: {} - colorette@2.0.20: {} - colors@1.0.3: {} combined-stream@1.0.8: @@ -18810,8 +18692,6 @@ snapshots: emittery@0.13.1: optional: true - emoji-regex@10.6.0: {} - emoji-regex@7.0.3: {} emoji-regex@8.0.0: {} @@ -18860,8 +18740,6 @@ snapshots: env-paths@2.2.1: {} - environment@1.1.0: {} - err-code@2.0.3: {} errno@0.1.8: @@ -19861,8 +19739,6 @@ snapshots: get-caller-file@2.0.5: {} - get-east-asian-width@1.4.0: {} - get-intrinsic@1.3.0: dependencies: call-bind-apply-helpers: 1.0.2 @@ -20314,8 +20190,6 @@ snapshots: dependencies: ms: 2.1.3 - husky@9.1.7: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -20585,10 +20459,6 @@ snapshots: is-fullwidth-code-point@3.0.0: {} - is-fullwidth-code-point@5.1.0: - dependencies: - get-east-asian-width: 1.4.0 - is-generator-fn@2.1.0: optional: true @@ -21443,25 +21313,6 @@ snapshots: lines-and-columns@1.2.4: {} - lint-staged@16.2.7: - dependencies: - commander: 14.0.2 - listr2: 9.0.5 - micromatch: 4.0.8 - nano-spawn: 2.0.0 - pidtree: 0.6.0 - string-argv: 0.3.2 - yaml: 2.8.2 - - listr2@9.0.5: - dependencies: - cli-truncate: 5.1.1 - colorette: 2.0.20 - eventemitter3: 5.0.1 - log-update: 6.1.0 - rfdc: 1.4.1 - wrap-ansi: 9.0.2 - load-json-file@4.0.0: dependencies: graceful-fs: 4.2.11 @@ -21555,14 +21406,6 @@ snapshots: chalk: 4.1.2 is-unicode-supported: 0.1.0 - log-update@6.1.0: - dependencies: - ansi-escapes: 7.2.0 - cli-cursor: 5.0.0 - slice-ansi: 7.1.2 - strip-ansi: 7.1.2 - wrap-ansi: 9.0.2 - log4js@1.1.1: dependencies: debug: 2.6.9 @@ -21848,8 +21691,6 @@ snapshots: mimic-fn@4.0.0: {} - mimic-function@5.0.1: {} - mimic-response@1.0.1: {} min-document@2.19.2: @@ -22005,8 +21846,6 @@ snapshots: mute-stream@0.0.8: {} - nano-spawn@2.0.0: {} - nanoid@3.3.11: {} napi-postinstall@0.3.4: @@ -22441,10 +22280,6 @@ snapshots: dependencies: mimic-fn: 4.0.0 - onetime@7.0.0: - dependencies: - mimic-function: 5.0.1 - open@8.4.2: dependencies: define-lazy-prop: 2.0.0 @@ -22751,8 +22586,6 @@ snapshots: picomatch@4.0.3: optional: true - pidtree@0.6.0: {} - pify@2.3.0: {} pify@3.0.0: {} @@ -24559,17 +24392,10 @@ snapshots: onetime: 5.1.2 signal-exit: 3.0.7 - restore-cursor@5.1.0: - dependencies: - onetime: 7.0.0 - signal-exit: 4.1.0 - retry@0.12.0: {} reusify@1.1.0: {} - rfdc@1.4.1: {} - rimraf@2.7.1: dependencies: glob: 7.2.3 @@ -25053,11 +24879,6 @@ snapshots: astral-regex: 2.0.0 is-fullwidth-code-point: 3.0.0 - slice-ansi@7.1.2: - dependencies: - ansi-styles: 6.2.3 - is-fullwidth-code-point: 5.1.0 - smart-buffer@4.2.0: {} socks-proxy-agent@6.2.1: @@ -25245,8 +25066,6 @@ snapshots: strict-uri-encode@2.0.0: {} - string-argv@0.3.2: {} - string-convert@0.2.1: {} string-length@4.0.2: @@ -25278,17 +25097,6 @@ snapshots: emoji-regex: 9.2.2 strip-ansi: 7.1.2 - string-width@7.2.0: - dependencies: - emoji-regex: 10.6.0 - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 - - string-width@8.1.0: - dependencies: - get-east-asian-width: 1.4.0 - strip-ansi: 7.1.2 - string.prototype.matchall@4.0.12: dependencies: call-bind: 1.0.8 @@ -26472,12 +26280,6 @@ snapshots: string-width: 5.1.2 strip-ansi: 7.1.2 - wrap-ansi@9.0.2: - dependencies: - ansi-styles: 6.2.3 - string-width: 7.2.0 - strip-ansi: 7.1.2 - wrappy@1.0.2: {} write-file-atomic@2.4.3: @@ -26524,8 +26326,6 @@ snapshots: yaml@1.10.2: {} - yaml@2.8.2: {} - yargs-parser@13.1.1: dependencies: camelcase: 5.3.1 diff --git a/src/assets/imgs/unnamed.png b/src/assets/imgs/unnamed.png deleted file mode 100644 index cf74d69..0000000 Binary files a/src/assets/imgs/unnamed.png and /dev/null differ diff --git a/src/pages/login/index.tsx b/src/pages/login/index.tsx index deb523b..e90bf53 100644 --- a/src/pages/login/index.tsx +++ b/src/pages/login/index.tsx @@ -85,7 +85,7 @@ const Login: React.FC = () => {