-
Notifications
You must be signed in to change notification settings - Fork 156
feat(ci): add vp create e2e tests and fix yarn/bun migration bugs #1317
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from all commits
2cd5fd7
2692c87
a2e8ba8
8ffa427
2f889e9
a938cf5
3690d5f
c1e5ad7
08724f1
38801db
35632dd
738755c
d67b5be
3fa2541
7de2e6c
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,265 @@ | ||
| name: Test vp create | ||
|
|
||
| permissions: {} | ||
|
|
||
| on: | ||
| workflow_dispatch: | ||
| push: | ||
| branches: | ||
| - main | ||
| paths: | ||
| - 'packages/cli/src/create/**' | ||
| - 'packages/cli/templates/**' | ||
| - 'packages/cli/src/migration/**' | ||
| - '.github/workflows/test-vp-create.yml' | ||
| pull_request: | ||
| types: [opened, synchronize, labeled] | ||
|
|
||
| concurrency: | ||
| group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.sha }} | ||
| cancel-in-progress: ${{ github.ref_name != 'main' }} | ||
|
|
||
| defaults: | ||
| run: | ||
| shell: bash | ||
|
|
||
| jobs: | ||
| detect-changes: | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: read | ||
| pull-requests: read | ||
| outputs: | ||
| related-files-changed: ${{ steps.filter.outputs.related-files }} | ||
| steps: | ||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | ||
Check noticeCode scanning / zizmor credential persistence through GitHub Actions artifacts Note test
credential persistence through GitHub Actions artifacts
|
||
| - uses: dorny/paths-filter@de90cc6fb38fc0963ad72b210f1f284cd68cea36 # v3.0.2 | ||
| id: filter | ||
| with: | ||
| filters: | | ||
| related-files: | ||
| - 'packages/cli/src/create/**' | ||
| - 'packages/cli/templates/**' | ||
| - 'packages/cli/src/migration/**' | ||
| - .github/workflows/test-vp-create.yml | ||
|
|
||
| download-previous-rolldown-binaries: | ||
| needs: detect-changes | ||
| runs-on: ubuntu-latest | ||
| # Run if: not a PR, OR PR has 'test: create-e2e' label, OR create-related files changed | ||
| if: >- | ||
| github.event_name != 'pull_request' || | ||
| contains(github.event.pull_request.labels.*.name, 'test: create-e2e') || | ||
| needs.detect-changes.outputs.related-files-changed == 'true' | ||
| permissions: | ||
| contents: read | ||
| packages: read | ||
| steps: | ||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | ||
Check noticeCode scanning / zizmor credential persistence through GitHub Actions artifacts Note test
credential persistence through GitHub Actions artifacts
|
||
fengmk2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| - uses: ./.github/actions/download-rolldown-binaries | ||
| with: | ||
| github-token: ${{ secrets.GITHUB_TOKEN }} | ||
|
|
||
| build: | ||
| name: Build vite-plus packages | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: read | ||
| packages: read | ||
| needs: | ||
| - download-previous-rolldown-binaries | ||
| steps: | ||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | ||
Check noticeCode scanning / zizmor credential persistence through GitHub Actions artifacts Note test
credential persistence through GitHub Actions artifacts
|
||
fengmk2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| - uses: ./.github/actions/clone | ||
|
|
||
| - uses: oxc-project/setup-rust@23f38cfb0c04af97a055f76acee94d5be71c7c82 # v1.0.16 | ||
| with: | ||
| save-cache: ${{ github.ref_name == 'main' }} | ||
| cache-key: create-e2e-build | ||
|
|
||
| - uses: oxc-project/setup-node@4c26e7cb3605b6bdef5450dacd02c434b10fd8ba # v1.2.0 | ||
|
|
||
| - uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 | ||
| with: | ||
| name: rolldown-binaries | ||
| path: ./rolldown/packages/rolldown/src | ||
| merge-multiple: true | ||
|
|
||
| - name: Build with upstream | ||
| uses: ./.github/actions/build-upstream | ||
| with: | ||
| target: x86_64-unknown-linux-gnu | ||
|
|
||
| - name: Pack packages into tgz | ||
| run: | | ||
| mkdir -p tmp/tgz | ||
| cd packages/core && pnpm pack --pack-destination ../../tmp/tgz && cd ../.. | ||
| cd packages/test && pnpm pack --pack-destination ../../tmp/tgz && cd ../.. | ||
| cd packages/cli && pnpm pack --pack-destination ../../tmp/tgz && cd ../.. | ||
| # Copy vp binary for test jobs | ||
| cp target/x86_64-unknown-linux-gnu/release/vp tmp/tgz/vp | ||
| ls -la tmp/tgz | ||
|
|
||
| - name: Upload tgz artifacts | ||
| uses: actions/upload-artifact@ea165f8d65b6e75b540449e92b4886f43607fa02 # v4.6.2 | ||
| with: | ||
| name: vite-plus-packages | ||
| path: tmp/tgz/ | ||
| retention-days: 1 | ||
|
|
||
| test-vp-create: | ||
| name: vp create ${{ matrix.template.name }} (${{ matrix.package-manager }}) | ||
| runs-on: ubuntu-latest | ||
| permissions: | ||
| contents: read | ||
| needs: | ||
| - build | ||
| timeout-minutes: 15 | ||
| strategy: | ||
| fail-fast: false | ||
| matrix: | ||
| template: | ||
| - name: monorepo | ||
| create-args: vite:monorepo --directory test-project | ||
| template-args: '' | ||
| verify-command: vp run ready | ||
| - name: application | ||
| create-args: vite:application --directory test-project | ||
| template-args: '-- --template vanilla-ts' | ||
| verify-command: vp run build | ||
| - name: library | ||
| create-args: vite:library --directory test-project | ||
| template-args: '' | ||
| verify-command: | | ||
| vp run build | ||
| vp run test | ||
| package-manager: | ||
| - pnpm | ||
| - npm | ||
| - yarn | ||
| - bun | ||
| env: | ||
| VP_OVERRIDE_PACKAGES: '{"vite":"file:${{ github.workspace }}/tmp/tgz/voidzero-dev-vite-plus-core-0.0.0.tgz","vitest":"file:${{ github.workspace }}/tmp/tgz/voidzero-dev-vite-plus-test-0.0.0.tgz","@voidzero-dev/vite-plus-core":"file:${{ github.workspace }}/tmp/tgz/voidzero-dev-vite-plus-core-0.0.0.tgz","@voidzero-dev/vite-plus-test":"file:${{ github.workspace }}/tmp/tgz/voidzero-dev-vite-plus-test-0.0.0.tgz"}' | ||
| VP_VERSION: 'file:${{ github.workspace }}/tmp/tgz/vite-plus-0.0.0.tgz' | ||
| # Force full dependency rewriting so the library template's existing | ||
| # vite-plus dep gets overridden with the local tgz | ||
| VP_FORCE_MIGRATE: '1' | ||
| steps: | ||
| - uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2 | ||
Check noticeCode scanning / zizmor credential persistence through GitHub Actions artifacts Note test
credential persistence through GitHub Actions artifacts
|
||
fengmk2 marked this conversation as resolved.
Show resolved
Hide resolved
|
||
|
|
||
| - uses: actions/setup-node@53b83947a5a98c8d113130e565377fae1a50d02f # v6.3.0 | ||
| with: | ||
| node-version: 24 | ||
|
|
||
| - name: Download vite-plus packages | ||
| uses: actions/download-artifact@d3f86a106a0bac45b974a628896c90dbdf5c8093 # v4.3.0 | ||
| with: | ||
| name: vite-plus-packages | ||
| path: tmp/tgz | ||
|
|
||
| - name: Install vp CLI | ||
| run: | | ||
| mkdir -p target/release | ||
| cp tmp/tgz/vp target/release/vp | ||
| chmod +x target/release/vp | ||
| node $GITHUB_WORKSPACE/packages/tools/src/install-global-cli.ts --tgz $GITHUB_WORKSPACE/tmp/tgz/vite-plus-0.0.0.tgz | ||
| echo "$HOME/.vite-plus/bin" >> $GITHUB_PATH | ||
|
|
||
| - name: Verify vp installation | ||
| run: | | ||
| which vp | ||
| vp --version | ||
|
|
||
| - name: Run vp create ${{ matrix.template.name }} with ${{ matrix.package-manager }} | ||
| working-directory: ${{ runner.temp }} | ||
| env: | ||
| # Yarn Berry enables hardened mode on public PRs, blocking lockfile creation | ||
| YARN_ENABLE_HARDENED_MODE: '0' | ||
| run: | | ||
| vp create ${{ matrix.template.create-args }} \ | ||
| --no-interactive \ | ||
| --no-agent \ | ||
| --package-manager ${{ matrix.package-manager }} \ | ||
| ${{ matrix.template.template-args }} | ||
|
|
||
| - name: Verify project structure | ||
| working-directory: ${{ runner.temp }}/test-project | ||
| run: | | ||
| # package.json must exist | ||
| test -f package.json | ||
| echo "✓ package.json exists" | ||
| cat package.json | ||
|
|
||
| # List all files for debugging | ||
| echo "--- Project root files ---" | ||
| ls -la | ||
|
|
||
| # Check correct lockfile exists | ||
| case "${{ matrix.package-manager }}" in | ||
| pnpm) | ||
| test -f pnpm-lock.yaml | ||
| echo "✓ pnpm-lock.yaml exists" | ||
| ;; | ||
| npm) | ||
| test -f package-lock.json | ||
| echo "✓ package-lock.json exists" | ||
| ;; | ||
| yarn) | ||
| test -f yarn.lock | ||
| echo "✓ yarn.lock exists" | ||
| ;; | ||
| bun) | ||
| if [ -f bun.lock ]; then | ||
| echo "✓ bun.lock exists" | ||
| elif [ -f bun.lockb ]; then | ||
| echo "✓ bun.lockb exists" | ||
| else | ||
| echo "✗ No bun lockfile found" | ||
| exit 1 | ||
| fi | ||
| ;; | ||
| esac | ||
|
|
||
| # node_modules must exist (vp install ran successfully) | ||
| test -d node_modules | ||
| echo "✓ node_modules exists" | ||
|
|
||
| # Monorepo-specific checks | ||
| if [ "${{ matrix.template.name }}" = "monorepo" ]; then | ||
| test -d apps/website | ||
| echo "✓ apps/website exists" | ||
| test -d packages/utils | ||
| echo "✓ packages/utils exists" | ||
|
|
||
| case "${{ matrix.package-manager }}" in | ||
| pnpm) | ||
| test -f pnpm-workspace.yaml | ||
| echo "✓ pnpm-workspace.yaml exists" | ||
| ;; | ||
| yarn) | ||
| test -f .yarnrc.yml | ||
| echo "✓ .yarnrc.yml exists" | ||
| ;; | ||
| esac | ||
| fi | ||
|
|
||
| - name: Verify local tgz packages installed | ||
| working-directory: ${{ runner.temp }}/test-project | ||
| run: | | ||
| node -e " | ||
| const path = require('path'); | ||
| const pkg = require(path.resolve('node_modules/vite-plus/package.json')); | ||
| if (pkg.version !== '0.0.0') { | ||
| console.error('Expected vite-plus@0.0.0, got ' + pkg.version); | ||
| process.exit(1); | ||
| } | ||
| console.log('✓ vite-plus@' + pkg.version + ' installed correctly'); | ||
| " | ||
|
|
||
| - name: Run vp check | ||
| working-directory: ${{ runner.temp }}/test-project | ||
| run: vp check | ||
|
|
||
| - name: Verify project builds | ||
| working-directory: ${{ runner.temp }}/test-project | ||
| run: ${{ matrix.template.verify-command }} | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,89 @@ | ||
| import fs from 'node:fs'; | ||
| import os from 'node:os'; | ||
| import path from 'node:path'; | ||
|
|
||
| import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; | ||
|
|
||
| import { PackageManager, type WorkspaceInfo } from '../../types/index.js'; | ||
|
|
||
| // Mock with file: protocol paths (simulating VP_OVERRIDE_PACKAGES in CI) | ||
| vi.mock('../../utils/constants.js', async (importOriginal) => { | ||
| const mod = await importOriginal<typeof import('../../utils/constants.js')>(); | ||
| return { | ||
| ...mod, | ||
| VITE_PLUS_VERSION: 'file:/tmp/tgz/vite-plus-0.0.0.tgz', | ||
| VITE_PLUS_OVERRIDE_PACKAGES: { | ||
| vite: 'file:/tmp/tgz/voidzero-dev-vite-plus-core-0.0.0.tgz', | ||
| vitest: 'file:/tmp/tgz/voidzero-dev-vite-plus-test-0.0.0.tgz', | ||
| '@voidzero-dev/vite-plus-core': 'file:/tmp/tgz/voidzero-dev-vite-plus-core-0.0.0.tgz', | ||
| '@voidzero-dev/vite-plus-test': 'file:/tmp/tgz/voidzero-dev-vite-plus-test-0.0.0.tgz', | ||
| }, | ||
| }; | ||
| }); | ||
|
|
||
| const { rewriteMonorepo } = await import('../migrator.js'); | ||
|
|
||
| function makeWorkspaceInfo(rootDir: string, packageManager: PackageManager): WorkspaceInfo { | ||
| return { | ||
| rootDir, | ||
| isMonorepo: false, | ||
| monorepoScope: '', | ||
| workspacePatterns: [], | ||
| parentDirs: [], | ||
| packageManager, | ||
| packageManagerVersion: '10.33.0', | ||
| downloadPackageManager: { | ||
| name: packageManager, | ||
| installDir: '/tmp', | ||
| binPrefix: '/tmp/bin', | ||
| packageName: packageManager, | ||
| version: '1.0.0', | ||
| }, | ||
| packages: [], | ||
| }; | ||
| } | ||
|
|
||
| function readJson(filePath: string): Record<string, unknown> { | ||
| return JSON.parse(fs.readFileSync(filePath, 'utf8')); | ||
| } | ||
|
|
||
| describe('rewriteMonorepo bun catalog with file: protocol', () => { | ||
| let tmpDir: string; | ||
|
|
||
| beforeEach(() => { | ||
| tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'vp-test-bun-file-')); | ||
| }); | ||
|
|
||
| afterEach(() => { | ||
| fs.rmSync(tmpDir, { recursive: true, force: true }); | ||
| }); | ||
|
|
||
| it('uses file: paths directly in overrides instead of catalog:', () => { | ||
| fs.writeFileSync( | ||
| path.join(tmpDir, 'package.json'), | ||
| JSON.stringify({ | ||
| name: 'bun-monorepo', | ||
| workspaces: ['packages/*'], | ||
| devDependencies: { vite: '^7.0.0' }, | ||
| packageManager: 'bun@1.3.11', | ||
| }), | ||
| ); | ||
| rewriteMonorepo(makeWorkspaceInfo(tmpDir, PackageManager.bun), true); | ||
|
|
||
| const pkg = readJson(path.join(tmpDir, 'package.json')); | ||
| // catalog should not contain file: entries | ||
| const catalog = (pkg.catalog ?? {}) as Record<string, string>; | ||
| expect(catalog.vite).toBeUndefined(); | ||
| expect(catalog.vitest).toBeUndefined(); | ||
| // overrides should use file: paths directly, not catalog: | ||
| const overrides = pkg.overrides as Record<string, string>; | ||
| expect(overrides.vite).toBe('file:/tmp/tgz/voidzero-dev-vite-plus-core-0.0.0.tgz'); | ||
| expect(overrides.vitest).toBe('file:/tmp/tgz/voidzero-dev-vite-plus-test-0.0.0.tgz'); | ||
| expect(overrides['@voidzero-dev/vite-plus-core']).toBe( | ||
| 'file:/tmp/tgz/voidzero-dev-vite-plus-core-0.0.0.tgz', | ||
| ); | ||
| expect(overrides['@voidzero-dev/vite-plus-test']).toBe( | ||
| 'file:/tmp/tgz/voidzero-dev-vite-plus-test-0.0.0.tgz', | ||
| ); | ||
| }); | ||
| }); |
Uh oh!
There was an error while loading. Please reload this page.