From 155e6368299c8d853152e3e10e7eb15d8abd7ba3 Mon Sep 17 00:00:00 2001 From: Yangshun Date: Fri, 20 Mar 2026 15:59:43 +0800 Subject: [PATCH] Migrate workspace to Vite+ --- .github/workflows/lint.yml | 35 +- .github/workflows/tsc.yml | 38 +- .oxfmtrc.json | 51 -- .oxlintrc.json | 90 ---- .vite-hooks/pre-commit | 1 + AGENTS.md | 76 +++ apps/portal/package.json | 2 +- apps/website/README.md | 16 +- apps/website/package.json | 2 +- apps/website/src/pages/index.js | 5 +- package.json | 20 +- pnpm-lock.yaml | 920 +++++++++++++++++++++++++++++--- pnpm-workspace.yaml | 14 + turbo.json | 32 -- vite.config.ts | 189 +++++++ 15 files changed, 1175 insertions(+), 316 deletions(-) delete mode 100644 .oxfmtrc.json delete mode 100644 .oxlintrc.json create mode 100755 .vite-hooks/pre-commit create mode 100644 AGENTS.md delete mode 100644 turbo.json create mode 100644 vite.config.ts diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 45396870..b70ea308 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -1,5 +1,5 @@ -# Copied from https://github.com/facebook/docusaurus/blob/main/.github/workflows/lint.yml -name: Lint +# Workspace validation using Vite+ +name: Check on: pull_request: @@ -13,33 +13,22 @@ concurrency: permissions: contents: read -env: - DATABASE_URL: 'postgresql://postgres:password@localhost:5432/postgres' - GITHUB_CLIENT_ID: '1234' - GITHUB_CLIENT_SECRET: 'abcd' - NEXTAUTH_SECRET: 'efgh' - NEXTAUTH_URL: 'http://localhost:3000' - NODE_ENV: test - SUPABASE_ANON_KEY: 'ijkl' - SUPABASE_URL: 'https://abcd.supabase.co' - jobs: - lint: - name: Lint + check: + name: Check timeout-minutes: 30 runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - - name: Set up pnpm - uses: pnpm/action-setup@v4 - - name: Set up Node - uses: actions/setup-node@v6 + - name: Set up Vite+ + uses: voidzero-dev/setup-vp@v1 with: node-version: '25.8.1' - cache: pnpm - cache-dependency-path: pnpm-lock.yaml + cache: true - name: Installation - run: pnpm install --frozen-lockfile - - name: Lint - run: pnpm lint + run: vp install + - name: Check + run: vp check + - name: Test + run: vp test diff --git a/.github/workflows/tsc.yml b/.github/workflows/tsc.yml index a8705ee2..06895833 100644 --- a/.github/workflows/tsc.yml +++ b/.github/workflows/tsc.yml @@ -1,5 +1,5 @@ -# Copied from https://github.com/facebook/docusaurus/blob/main/.github/workflows/lint.yml -name: Typecheck +# Framework builds using Vite+ task orchestration +name: Build on: pull_request: @@ -13,26 +13,32 @@ concurrency: permissions: contents: read +env: + DATABASE_URL: 'postgresql://postgres:password@localhost:5432/postgres' + GITHUB_CLIENT_ID: '1234' + GITHUB_CLIENT_SECRET: 'abcd' + NEXTAUTH_SECRET: 'efgh' + NEXTAUTH_URL: 'http://localhost:3000' + NODE_ENV: test + SUPABASE_ANON_KEY: 'ijkl' + SUPABASE_URL: 'https://abcd.supabase.co' + jobs: - tsc: - name: Typecheck + build: + name: Build timeout-minutes: 30 runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v6 - - name: Set up pnpm - uses: pnpm/action-setup@v4 - - name: Set up Node - uses: actions/setup-node@v6 + - name: Set up Vite+ + uses: voidzero-dev/setup-vp@v1 with: node-version: '25.8.1' - cache: pnpm - cache-dependency-path: pnpm-lock.yaml + cache: true - name: Installation - run: pnpm install --frozen-lockfile - # Build the shared types in dependent packages. - - name: Build dependencies - run: pnpm turbo run build --filter=ui - - name: Typecheck - run: pnpm tsc + run: vp install + - name: Build website + run: vp run --filter @tih/website build + - name: Build portal + run: vp run --filter @tih/portal build diff --git a/.oxfmtrc.json b/.oxfmtrc.json deleted file mode 100644 index eba8bb8f..00000000 --- a/.oxfmtrc.json +++ /dev/null @@ -1,51 +0,0 @@ -{ - "$schema": "./node_modules/oxfmt/configuration_schema.json", - "bracketSameLine": true, - "printWidth": 80, - "proseWrap": "never", - "singleQuote": true, - "trailingComma": "all", - "sortPackageJson": false, - "overrides": [ - { - "files": ["apps/portal/**/*.{js,jsx,ts,tsx}"], - "options": { - "sortTailwindcss": { - "config": "apps/portal/tailwind.config.cjs", - "functions": ["clsx"] - } - } - } - ], - "ignorePatterns": [ - "node_modules", - ".vscode", - ".next", - "build", - "dist", - "*.tsbuildinfo", - "*.gitignore", - "*.svg", - "*.lock", - "*.npmignore", - "*.sql", - "*.png", - "*.jpg", - "*.jpeg", - "*.gif", - "*.ico", - "*.sh", - "Dockerfile", - "Dockerfile.*", - ".env", - ".env.*", - "LICENSE", - "*.log", - ".DS_Store", - ".dockerignore", - "*.patch", - "*.toml", - "*.prisma", - "apps/website/experimental/domain/**/*.html" - ] -} diff --git a/.oxlintrc.json b/.oxlintrc.json deleted file mode 100644 index 931989e7..00000000 --- a/.oxlintrc.json +++ /dev/null @@ -1,90 +0,0 @@ -{ - "$schema": "./node_modules/oxlint/configuration_schema.json", - "plugins": ["typescript", "react"], - "categories": { - "correctness": "error" - }, - "settings": { - "next": { - "rootDir": ["apps/portal/"] - } - }, - "ignorePatterns": [ - ".next/**", - ".turbo/**", - ".cache/**", - "dist/**", - "dist-ssr/**", - "coverage/**", - "public/dist/**", - "server/dist/**", - "apps/portal/build/**", - "apps/portal/out/**", - "apps/portal/prisma/**", - "apps/website/.docusaurus/**", - "apps/website/.cache-loader/**", - "apps/website/experimental/**" - ], - "rules": { - "camelcase": ["error", { "properties": "never", "ignoreDestructuring": true }], - "capitalized-comments": [ - "error", - "always", - { "ignoreConsecutiveComments": true } - ], - "curly": "error", - "eqeqeq": ["error", "smart"], - "func-names": ["error", "as-needed"], - "func-style": ["error", "declaration", { "allowArrowFunctions": true }], - "guard-for-in": "error", - "init-declarations": "error", - "no-console": ["error", { "allow": ["warn", "error", "info"] }], - "no-else-return": ["error", { "allowElseIf": false }], - "no-lonely-if": "error", - "no-shadow": "off", - "no-unused-vars": ["error", { "argsIgnorePattern": "^_" }], - "operator-assignment": "error", - "prefer-const": "error", - "prefer-destructuring": ["error", { "object": true }], - "radix": "error", - "react/button-has-type": "error", - "react/display-name": "off", - "react/exhaustive-deps": "off", - "react/jsx-boolean-value": ["error", "always"], - "react/jsx-curly-brace-presence": [ - "error", - { "props": "never", "children": "never" } - ], - "react/jsx-no-useless-fragment": "error", - "react/no-array-index-key": "error", - "react/no-unescaped-entities": "off", - "react/react-in-jsx-scope": "off", - "react/void-dom-elements-no-children": "error", - "typescript/array-type": [ - "error", - { "default": "generic", "readonly": "generic" } - ], - "typescript/ban-ts-comment": "off", - "typescript/consistent-generic-constructors": ["error", "constructor"], - "typescript/consistent-indexed-object-style": ["error", "record"], - "typescript/consistent-type-definitions": ["error", "type"], - "typescript/consistent-type-imports": "error", - "typescript/dot-notation": "error", - "typescript/no-duplicate-enum-values": "error", - "typescript/no-explicit-any": "off", - "typescript/no-for-in-array": "error", - "typescript/prefer-optional-chain": "error", - "typescript/require-array-sort-compare": "error", - "typescript/restrict-plus-operands": "error" - }, - "overrides": [ - { - "files": ["apps/portal/**/*.{js,jsx,ts,tsx}"], - "plugins": ["typescript", "react", "nextjs"], - "rules": { - "nextjs/no-html-link-for-pages": "off", - "nextjs/no-img-element": "off" - } - } - ] -} diff --git a/.vite-hooks/pre-commit b/.vite-hooks/pre-commit new file mode 100755 index 00000000..85fb65b4 --- /dev/null +++ b/.vite-hooks/pre-commit @@ -0,0 +1 @@ +vp staged diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 00000000..f190a523 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,76 @@ + + +# Using Vite+, the Unified Toolchain for the Web + +This project is using Vite+, a unified toolchain built on top of Vite, Rolldown, Vitest, tsdown, Oxlint, Oxfmt, and Vite Task. Vite+ wraps runtime management, package management, and frontend tooling in a single global CLI called `vp`. Vite+ is distinct from Vite, but it invokes Vite through `vp dev` and `vp build`. + +## Vite+ Workflow + +`vp` is a global binary that handles the full development lifecycle. Run `vp help` to print a list of commands and `vp --help` for information about a specific command. + +### Start + +- create - Create a new project from a template +- migrate - Migrate an existing project to Vite+ +- config - Configure hooks and agent integration +- staged - Run linters on staged files +- install (`i`) - Install dependencies +- env - Manage Node.js versions + +### Develop + +- dev - Run the development server +- check - Run format, lint, and TypeScript type checks +- lint - Lint code +- fmt - Format code +- test - Run tests + +### Execute + +- run - Run monorepo tasks +- exec - Execute a command from local `node_modules/.bin` +- dlx - Execute a package binary without installing it as a dependency +- cache - Manage the task cache + +### Build + +- build - Build for production +- pack - Build libraries +- preview - Preview production build + +### Manage Dependencies + +Vite+ automatically detects and wraps the underlying package manager such as pnpm, npm, or Yarn through the `packageManager` field in `package.json` or package manager-specific lockfiles. + +- add - Add packages to dependencies +- remove (`rm`, `un`, `uninstall`) - Remove packages from dependencies +- update (`up`) - Update packages to latest versions +- dedupe - Deduplicate dependencies +- outdated - Check for outdated packages +- list (`ls`) - List installed packages +- why (`explain`) - Show why a package is installed +- info (`view`, `show`) - View package information from the registry +- link (`ln`) / unlink - Manage local package links +- pm - Forward a command to the package manager + +### Maintain + +- upgrade - Update `vp` itself to the latest version + +These commands map to their corresponding tools. For example, `vp dev --port 3000` runs Vite's dev server and works the same as Vite. `vp test` runs JavaScript tests through the bundled Vitest. The version of all tools can be checked using `vp --version`. This is useful when researching documentation, features, and bugs. + +## Common Pitfalls + +- **Using the package manager directly:** Do not use pnpm, npm, or Yarn directly. Vite+ can handle all package manager operations. +- **Always use Vite commands to run tools:** Don't attempt to run `vp vitest` or `vp oxlint`. They do not exist. Use `vp test` and `vp lint` instead. +- **Running scripts:** Vite+ built-in commands (`vp dev`, `vp build`, `vp test`, etc.) always run the Vite+ built-in tool, not any `package.json` script of the same name. To run a custom script that shares a name with a built-in command, use `vp run