From 96cdfa08ab31294f02e681169b372a31cdc4b705 Mon Sep 17 00:00:00 2001 From: "Michael H." Date: Tue, 6 Oct 2026 19:38:43 +0200 Subject: [PATCH 1/7] feat: moonrepo --- .cargo/moon.yml | 72 ++++ .github/actions/setup/action.yml | 54 +++ .github/workflows/check-generic.yml | 27 -- .github/workflows/check-rust.yml | 20 -- .github/workflows/{turbo-ci.yml => ci.yml} | 73 ++-- .github/workflows/daedalus-docker.yml | 63 +--- .github/workflows/frontend-deploy.yml | 15 +- .github/workflows/frontend-docker.yml | 15 +- .github/workflows/frontend-preview.yml | 15 +- .github/workflows/i18n-pull.yml | 7 +- .github/workflows/i18n-push.yml | 7 +- .github/workflows/labrinth-build.yml | 91 +---- .github/workflows/rust-docker.yml | 132 +++++++ .github/workflows/theseus-build.yml | 12 +- .gitignore | 2 + .moon/tasks/all.yml | 95 +++++ .moon/tasks/app-lib.yml | 27 ++ .moon/tasks/rust.yml | 30 ++ .moon/toolchains.yml | 12 + .moon/workspace.yml | 18 + AGENTS.md | 2 +- apps/app-frontend/eslint.config.mjs | 5 - apps/app-frontend/moon.yml | 7 + apps/app-frontend/package.json | 3 +- apps/app-frontend/vite.config.ts | 6 +- apps/app-playground/moon.yml | 10 + apps/app-playground/package.json | 12 - apps/app-playground/turbo.jsonc | 73 ---- apps/app/moon.yml | 3 + apps/app/package.json | 11 +- apps/app/tauri.conf.json | 4 +- apps/app/turbo.jsonc | 77 ----- apps/daedalus_client/moon.yml | 8 + apps/daedalus_client/package.json | 15 - apps/daedalus_client/turbo.jsonc | 48 --- apps/docs/moon.yml | 7 + .../docs/contributing/getting-started.md | 2 +- apps/frontend/moon.yml | 8 + apps/labrinth/.prettierrc.json | 1 + apps/labrinth/moon.yml | 28 ++ apps/labrinth/package.json | 17 - apps/labrinth/turbo.jsonc | 48 --- package.json | 33 +- packages/api-client/README.md | 2 +- packages/api-client/moon.yml | 7 + packages/app-lib/.prettierignore | 3 + packages/app-lib/.prettierrc.json | 1 + packages/app-lib/package.json | 12 - packages/app-lib/turbo.jsonc | 48 --- packages/async-minecraft-ping/README.md | 8 +- packages/daedalus/package.json | 11 - packages/daedalus/turbo.jsonc | 48 --- packages/tooling-config/eslint/nuxt.mjs | 11 - packages/tooling-config/package.json | 6 +- packages/ui/src/composables/server-console.ts | 1 - pnpm-lock.yaml | 326 +++++------------- scripts/moon.yml | 50 +++ turbo.jsonc | 118 ------- 58 files changed, 752 insertions(+), 1115 deletions(-) create mode 100644 .cargo/moon.yml create mode 100644 .github/actions/setup/action.yml delete mode 100644 .github/workflows/check-generic.yml delete mode 100644 .github/workflows/check-rust.yml rename .github/workflows/{turbo-ci.yml => ci.yml} (65%) create mode 100644 .github/workflows/rust-docker.yml create mode 100644 .moon/tasks/all.yml create mode 100644 .moon/tasks/app-lib.yml create mode 100644 .moon/tasks/rust.yml create mode 100644 .moon/toolchains.yml create mode 100644 .moon/workspace.yml create mode 100644 apps/app-frontend/moon.yml create mode 100644 apps/app-playground/moon.yml delete mode 100644 apps/app-playground/package.json delete mode 100644 apps/app-playground/turbo.jsonc create mode 100644 apps/app/moon.yml delete mode 100644 apps/app/turbo.jsonc create mode 100644 apps/daedalus_client/moon.yml delete mode 100644 apps/daedalus_client/package.json delete mode 100644 apps/daedalus_client/turbo.jsonc create mode 100644 apps/docs/moon.yml create mode 100644 apps/frontend/moon.yml create mode 100644 apps/labrinth/.prettierrc.json create mode 100644 apps/labrinth/moon.yml delete mode 100644 apps/labrinth/package.json delete mode 100644 apps/labrinth/turbo.jsonc create mode 100644 packages/api-client/moon.yml create mode 100644 packages/app-lib/.prettierrc.json delete mode 100644 packages/app-lib/package.json delete mode 100644 packages/app-lib/turbo.jsonc delete mode 100644 packages/daedalus/package.json delete mode 100644 packages/daedalus/turbo.jsonc create mode 100644 scripts/moon.yml delete mode 100644 turbo.jsonc diff --git a/.cargo/moon.yml b/.cargo/moon.yml new file mode 100644 index 00000000000..ce8867c3b30 --- /dev/null +++ b/.cargo/moon.yml @@ -0,0 +1,72 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +# Rust lint, fix and test run once for the whole Cargo workspace instead of per +# crate. Separate per-crate cargo invocations resolve different feature sets and +# recompile shared dependencies for each crate, while waiting on each other's +# build directory lock. All Rust test tasks use identical cargo arguments so they +# share build artifacts, and only differ in the nextest filter. + +workspace: + inheritedTasks: + include: [] + +fileGroups: + rust: + - '/Cargo.lock' + - '/rust-toolchain.toml' + - '/clippy.toml' + - '/rustfmt.toml' + - '/.cargo/config.toml' + - '/**/Cargo.toml' + - '/**/*.rs' + - '/**/.sqlx/**/*' + - '/**/migrations/**/*' + - '/apps/app/**/*' + - '/apps/labrinth/**/*' + - '/packages/app-lib/**/*' + - '/packages/app-lib/.env' + - '$CARGO_*' + - '$RUST_*' + - '$RUSTFLAGS' + - '$SQLX_OFFLINE' + - '$DATABASE_URL' + +# Tauri embeds the app frontend at compile time +tasks: + lint: + script: | + set -e + cargo fmt --all --check + cargo clippy --workspace --all-targets --features sqlx-tracing/sqlite + cargo clippy --workspace --all-targets --features sqlx-tracing/sqlite,theseus_gui/updater + deps: + - 'app-frontend:build' + inputs: + - '@group(rust)' + options: + runFromWorkspaceRoot: true + + fix: + script: | + set -e + cargo clippy --workspace --all-targets --features sqlx-tracing/sqlite,theseus_gui/updater --fix --allow-dirty + cargo fmt --all + deps: + - 'app-frontend:build' + options: + cache: false + runInCI: false + runFromWorkspaceRoot: true + + # Labrinth's tests need Docker services, so they run in `labrinth:test` + test: + command: "cargo nextest run --workspace --all-targets --features sqlx-tracing/sqlite --no-fail-fast -E 'not package(labrinth)'" + deps: + - 'app-frontend:build' + inputs: + - '@group(rust)' + - '!/apps/labrinth/**/*' + - '$REDIS_*' + - '$NEXTEST_*' + options: + runFromWorkspaceRoot: true diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml new file mode 100644 index 00000000000..fbb1fe7359b --- /dev/null +++ b/.github/actions/setup/action.yml @@ -0,0 +1,54 @@ +name: Setup +description: Set up Node.js, pnpm and caches (Namespace cache volume, or GitHub caches elsewhere) + +inputs: + namespace: + description: Whether the job runs on Namespace, which enables cache volumes + default: 'true' + cache: + description: Cache modes for nscloud-cache-action, in addition to the moon cache + default: pnpm + +runs: + using: composite + steps: + - name: Setup Node + uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + with: + node-version-file: .nvmrc + + - name: Enable Corepack + shell: bash + run: corepack enable + + - name: Set up caches + if: inputs.namespace == 'true' + uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1 + with: + cache: ${{ inputs.cache }} + path: | + ${{ github.workspace }}/.moon/cache + + - name: Get pnpm store path + if: inputs.namespace != 'true' + id: pnpm-store + shell: bash + run: echo "path=$(pnpm store path --silent)" >> "$GITHUB_OUTPUT" + + - name: Cache pnpm store + if: inputs.namespace != 'true' + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: ${{ steps.pnpm-store.outputs.path }} + key: pnpm-store-${{ runner.os }}-${{ hashFiles('pnpm-lock.yaml') }} + restore-keys: | + pnpm-store-${{ runner.os }}- + + - name: Cache moon outputs + if: inputs.namespace != 'true' + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 + with: + path: .moon/cache + key: moon-${{ runner.os }}-${{ github.sha }} + restore-keys: | + moon-${{ runner.os }}- diff --git a/.github/workflows/check-generic.yml b/.github/workflows/check-generic.yml deleted file mode 100644 index 25fc4ad8ef5..00000000000 --- a/.github/workflows/check-generic.yml +++ /dev/null @@ -1,27 +0,0 @@ -on: - pull_request: - push: - branches: - - main - -env: - CARGO_TERM_COLOR: always - SQLX_OFFLINE: true - -jobs: - typos: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: crate-ci/typos@bee27e3a4fd1ea2111cf90ab89cd076c870fce14 # v1.48.0 - - # see - tombi: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: taiki-e/install-action@b6ff580856c41316412a0b9b60540fbc6f8c82cc # v2.86.7 - with: - tool: tombi@1.4.1 - - run: tombi lint - - run: tombi fmt --check diff --git a/.github/workflows/check-rust.yml b/.github/workflows/check-rust.yml deleted file mode 100644 index 8fa131f83fc..00000000000 --- a/.github/workflows/check-rust.yml +++ /dev/null @@ -1,20 +0,0 @@ -on: - pull_request: - push: - branches: - - main - -env: - CARGO_TERM_COLOR: always - CARGO_INCREMENTAL: 0 - SQLX_OFFLINE: true - -jobs: - shear: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - uses: dtolnay/rust-toolchain@4cda84d5c5c54efe2404f9d843567869ab1699d4 # stable - - uses: cargo-bins/cargo-binstall@ead08b90bd7b2e6d81963fb9cf0b7239f66d5db4 # v1.21.0 - - run: cargo binstall --no-confirm cargo-shear - - run: cargo shear diff --git a/.github/workflows/turbo-ci.yml b/.github/workflows/ci.yml similarity index 65% rename from .github/workflows/turbo-ci.yml rename to .github/workflows/ci.yml index 2b42774aa84..aca71be4e33 100644 --- a/.github/workflows/turbo-ci.yml +++ b/.github/workflows/ci.yml @@ -36,6 +36,9 @@ jobs: REDIS_URL: redis://127.0.0.1:7000,redis://127.0.0.1:7001,redis://127.0.0.1:7002,redis://127.0.0.1:7003,redis://127.0.0.1:7004,redis://127.0.0.1:7005 # Avoid stack overflows in tests RUST_MIN_STACK: 134217728 + # Namespace's sccache backend is only available to internal runs + SCCACHE_CACHE_SIZE: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && '20G' || '' }} + RUSTC_WRAPPER: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && 'sccache' || '' }} steps: - name: Check out code @@ -50,27 +53,15 @@ jobs: with: fetch-depth: 2 - - name: Setup Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - with: - node-version-file: .nvmrc - - - name: Enable Corepack - run: corepack enable - - - name: Set up caches - if: env.INTERNAL == 'true' - uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1 + - name: Setup Node and caches + uses: ./.github/actions/setup with: + namespace: ${{ env.INTERNAL }} cache: | rust pnpm apt - - name: Set up Turborepo caching - if: env.INTERNAL == 'true' - uses: namespace-actions/setup-turbocache@f96bd6befa13ae74b2858a5be49573640d4636f5 # v0.0.2 - - name: Install apt dependencies run: | sudo apt-get update @@ -83,14 +74,33 @@ jobs: components: clippy, rustfmt cache: false + # External contributors run on GitHub runners without the Namespace cache volume. + # Pushes to main save their Rust build to GitHub's cache (only when dependencies + # change, without restoring it over the Namespace cache) so those runs start warm. + # RUSTC_WRAPPER is left out of the key since only Namespace runs use sccache. + - name: Set up GitHub Rust cache + if: env.INTERNAL != 'true' || (github.event_name == 'push' && github.ref == 'refs/heads/main') + uses: Swatinem/rust-cache@6323deb102c322ba6fcbdcafc7e3dddab59af2b6 # v2.9.2 + with: + env-vars: CARGO CC CFLAGS CXX CMAKE RUSTFLAGS RUST_ + lookup-only: ${{ env.INTERNAL == 'true' }} + save-if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/main' }} + - name: Setup mold uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0 - - name: Setup binstall - uses: cargo-bins/cargo-binstall@ead08b90bd7b2e6d81963fb9cf0b7239f66d5db4 # v1.21.0 + - name: Setup sccache + if: env.INTERNAL == 'true' + uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 + + - name: Configure sccache + if: env.INTERNAL == 'true' + run: nsc cache sccache setup --cache_name default >> "$GITHUB_ENV" - - name: Setup nextest - run: cargo binstall --no-confirm --secure --locked cargo-nextest@0.9.133 + - name: Setup Rust tools + uses: taiki-e/install-action@b6ff580856c41316412a0b9b60540fbc6f8c82cc # v2.86.7 + with: + tool: cargo-nextest@0.9.133,typos@1.48.0,tombi@1.4.1,cargo-shear # cargo-binstall does not have pre-built binaries for sqlx-cli, so we fall # back to a cached cargo install @@ -109,34 +119,11 @@ jobs: working-directory: packages/app-lib run: cp .env.staging .env - # check if labrinth tests will actually run (cache miss) - - name: Check if labrinth tests need to run - id: check-labrinth - run: | - LABRINTH_TEST_STATUS=$(pnpm turbo run test --filter=@modrinth/labrinth --dry-run=json | jq -r '.tasks[] | select(.task == "test") | .cache.status') - echo "Labrinth test cache status: $LABRINTH_TEST_STATUS" - if [ "$LABRINTH_TEST_STATUS" = "HIT" ]; then - echo "needs_services=false" >> $GITHUB_OUTPUT - else - echo "needs_services=true" >> $GITHUB_OUTPUT - fi - - - name: Start services - if: steps.check-labrinth.outputs.needs_services == 'true' - run: docker compose --profile clustered-redis up --wait - - - name: Setup labrinth environment and database - if: steps.check-labrinth.outputs.needs_services == 'true' - working-directory: apps/labrinth - run: | - cp .env.local .env - sqlx database setup - - name: Lint and test run: pnpm run ci - name: Verify intl:extract has been run run: | - pnpm turbo run intl:extract --force + pnpm moon run :intl-extract --force pnpm scripts i18n-icu-contract prune-local --check git diff --exit-code --color */*/src/locales/*/index.json diff --git a/.github/workflows/daedalus-docker.yml b/.github/workflows/daedalus-docker.yml index dfb12d160f7..5549afa856f 100644 --- a/.github/workflows/daedalus-docker.yml +++ b/.github/workflows/daedalus-docker.yml @@ -7,6 +7,7 @@ on: - 'prod' paths: - .github/workflows/daedalus-docker.yml + - .github/workflows/rust-docker.yml - 'apps/daedalus_client/**' - 'packages/daedalus/**' - Cargo.toml @@ -15,6 +16,7 @@ on: types: [opened, synchronize] paths: - .github/workflows/daedalus-docker.yml + - .github/workflows/rust-docker.yml - 'apps/daedalus_client/**' - 'packages/daedalus/**' - Cargo.toml @@ -26,63 +28,14 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/prod' }} -env: - INTERNAL: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }} - jobs: - build: - name: Build daedalus_client - runs-on: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && 'namespace-profile-medium-amd64' || 'ubuntu-latest' }} - steps: - - name: Check out code - if: env.INTERNAL != 'true' - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - - name: Check out code (Namespace) - if: env.INTERNAL == 'true' - uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 - - - name: Setup Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0 - with: - rustflags: '' - cache: false - - - name: Setup mold - uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0 - - - name: Build daedalus_client - run: cargo build --release --package daedalus_client - - - name: Stage Docker context - run: | - mkdir -p apps/daedalus_client/docker-stage - cp target/release/daedalus_client apps/daedalus_client/docker-stage/daedalus_client - - - name: Upload Docker context - if: env.INTERNAL == 'true' - uses: namespace-actions/upload-artifact@f6ccaacc655aec41b93af180d1d7eef21af862d2 # v1.0.3 - with: - name: daedalus-docker-context - retention-days: 1 - path: apps/daedalus_client/docker-stage - - docker-build: - needs: [build] - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }} - uses: SparkUniverse/workflows/.github/workflows/docker-build.yaml@main - with: - image-name: daedalus - dockerfile-path: apps/daedalus_client/Dockerfile - artifacts-name: daedalus-docker-context - - deploy: - needs: [docker-build] - if: ${{ github.ref == 'refs/heads/prod' && github.event_name == 'push' }} - uses: SparkUniverse/workflows/.github/workflows/argo-update.yaml@main + daedalus: + uses: ./.github/workflows/rust-docker.yml secrets: ARGOCD_DEPLOY_KEY: ${{ secrets.ARGOCD_DEPLOY_KEY }} with: + package: daedalus_client + project-dir: apps/daedalus_client + runner: namespace-profile-medium-amd64 + image-name: daedalus application-set: launcher-meta - branch: main - environment-name: production diff --git a/.github/workflows/frontend-deploy.yml b/.github/workflows/frontend-deploy.yml index f08ed21e7bd..6cbca819159 100644 --- a/.github/workflows/frontend-deploy.yml +++ b/.github/workflows/frontend-deploy.yml @@ -91,25 +91,14 @@ jobs: echo "url=https://modrinth.com" >> $GITHUB_OUTPUT fi - - name: Setup Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - with: - node-version-file: .nvmrc - - - name: Enable Corepack - run: corepack enable - - - name: Set up caches - uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1 + - name: Setup Node and caches + uses: ./.github/actions/setup with: cache: | rust pnpm apt - - name: Set up Turborepo caching - uses: namespace-actions/setup-turbocache@f96bd6befa13ae74b2858a5be49573640d4636f5 # v0.0.2 - - name: Inject build variables working-directory: ./apps/frontend run: | diff --git a/.github/workflows/frontend-docker.yml b/.github/workflows/frontend-docker.yml index 38abfec2bff..f7739f77e52 100644 --- a/.github/workflows/frontend-docker.yml +++ b/.github/workflows/frontend-docker.yml @@ -41,19 +41,8 @@ jobs: echo "env=production" >> $GITHUB_OUTPUT fi - - name: Setup Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - with: - node-version-file: .nvmrc - - - name: Enable Corepack - run: corepack enable - - - name: Set up caches - uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1 - with: - cache: | - pnpm + - name: Setup Node and caches + uses: ./.github/actions/setup - name: Inject build variables working-directory: ./apps/frontend diff --git a/.github/workflows/frontend-preview.yml b/.github/workflows/frontend-preview.yml index d1a582ad835..26ba39be53f 100644 --- a/.github/workflows/frontend-preview.yml +++ b/.github/workflows/frontend-preview.yml @@ -51,19 +51,8 @@ jobs: - name: Checkout code uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 - - name: Setup Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - with: - node-version-file: .nvmrc - - - name: Enable Corepack - run: corepack enable - - - name: Set up caches - uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1 - with: - cache: | - pnpm + - name: Setup Node and caches + uses: ./.github/actions/setup - name: Install dependencies working-directory: ./packages/ui diff --git a/.github/workflows/i18n-pull.yml b/.github/workflows/i18n-pull.yml index 32037100df2..98746e73cc0 100644 --- a/.github/workflows/i18n-pull.yml +++ b/.github/workflows/i18n-pull.yml @@ -61,12 +61,9 @@ jobs: token: ${{ secrets.CROWDIN_GH_TOKEN }} - name: Setup Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + uses: ./.github/actions/setup with: - node-version-file: .nvmrc - - - name: Enable Corepack - run: corepack enable + namespace: 'false' - name: Install script dependencies run: pnpm install --frozen-lockfile --ignore-scripts diff --git a/.github/workflows/i18n-push.yml b/.github/workflows/i18n-push.yml index 89de7713af7..253c75dfb7c 100644 --- a/.github/workflows/i18n-push.yml +++ b/.github/workflows/i18n-push.yml @@ -62,12 +62,9 @@ jobs: fetch-depth: 2 - name: Setup Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 + uses: ./.github/actions/setup with: - node-version-file: .nvmrc - - - name: Enable Corepack - run: corepack enable + namespace: 'false' - name: Install script dependencies run: pnpm install --frozen-lockfile --ignore-scripts diff --git a/.github/workflows/labrinth-build.yml b/.github/workflows/labrinth-build.yml index 23e6ebf9dfd..88411e03545 100644 --- a/.github/workflows/labrinth-build.yml +++ b/.github/workflows/labrinth-build.yml @@ -7,6 +7,7 @@ on: - 'prod' paths: - .github/workflows/labrinth-build.yml + - .github/workflows/rust-docker.yml - 'apps/labrinth/**' - 'packages/**' - '!packages/api-client/**' @@ -17,6 +18,7 @@ on: types: [opened, synchronize] paths: - .github/workflows/labrinth-build.yml + - .github/workflows/rust-docker.yml - 'apps/labrinth/**' - 'packages/**' - '!packages/api-client/**' @@ -30,89 +32,16 @@ concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: ${{ github.ref != 'refs/heads/main' && github.ref != 'refs/heads/prod' }} -env: - INTERNAL: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }} - jobs: - build: - name: Build Labrinth - runs-on: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && 'namespace-profile-modrinth-labrinth' || 'ubuntu-latest' }} - env: - SQLX_OFFLINE: 'true' - GIT_HASH: ${{ github.sha }} - SCCACHE_CACHE_SIZE: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && '20G' || '' }} - RUSTC_WRAPPER: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && 'sccache' || '' }} - RUST_MIN_STACK: '268435456' - steps: - - name: Check out code - if: env.INTERNAL != 'true' - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - - - name: Check out code (Namespace) - if: env.INTERNAL == 'true' - uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 - - - name: Setup Rust toolchain - uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0 - with: - rustflags: '' - cache: false - - - name: Setup mold - uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0 - - - name: Setup sccache - uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 - - - name: Set up caches - if: env.INTERNAL == 'true' - uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1 - with: - cache: | - rust - apt - - - name: Configure sccache - if: env.INTERNAL == 'true' - run: nsc cache sccache setup --cache_name default >> "$GITHUB_ENV" - - - name: Install build dependencies - run: sudo apt-get update && sudo apt-get install -y --no-install-recommends cmake libcurl4-openssl-dev - - - name: Build labrinth - run: cargo build --profile release-labrinth --package labrinth - - - name: Stage Docker context - run: | - mkdir -p apps/labrinth/docker-stage - cp target/release-labrinth/labrinth apps/labrinth/docker-stage/labrinth - cp -r apps/labrinth/migrations apps/labrinth/docker-stage/migrations - cp -r apps/labrinth/assets apps/labrinth/docker-stage/assets - - - name: Upload Docker context - if: env.INTERNAL == 'true' - uses: namespace-actions/upload-artifact@f6ccaacc655aec41b93af180d1d7eef21af862d2 # v1.0.3 - with: - name: labrinth-docker-context - retention-days: 1 - path: apps/labrinth/docker-stage - - docker-build: - needs: [build] - if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }} - uses: SparkUniverse/workflows/.github/workflows/docker-build.yaml@main - with: - image-name: labrinth - dockerfile-path: apps/labrinth/Dockerfile - artifacts-name: labrinth-docker-context - - deploy: - needs: [docker-build] - if: ${{ github.ref == 'refs/heads/prod' }} - uses: SparkUniverse/workflows/.github/workflows/argo-update.yaml@main + labrinth: + uses: ./.github/workflows/rust-docker.yml secrets: ARGOCD_DEPLOY_KEY: ${{ secrets.ARGOCD_DEPLOY_KEY }} with: + package: labrinth + profile: release-labrinth + project-dir: apps/labrinth + stage-paths: migrations assets + runner: namespace-profile-modrinth-labrinth + image-name: labrinth application-set: labrinth - branch: ${{ github.ref == 'refs/heads/prod' && 'main' || 'develop' }} - environment-name: ${{ github.ref == 'refs/heads/prod' && 'production' || 'staging' }} diff --git a/.github/workflows/rust-docker.yml b/.github/workflows/rust-docker.yml new file mode 100644 index 00000000000..2bb1dcb995c --- /dev/null +++ b/.github/workflows/rust-docker.yml @@ -0,0 +1,132 @@ +name: Rust Docker build + +on: + workflow_call: + inputs: + package: + description: Cargo package to build + type: string + required: true + profile: + description: Cargo profile to build with + type: string + default: release + project-dir: + description: Directory containing the Dockerfile + type: string + required: true + stage-paths: + description: Extra paths relative to project-dir to copy into the Docker context + type: string + default: '' + runner: + description: Namespace runner profile for internal builds + type: string + required: true + image-name: + type: string + required: true + application-set: + description: Argo CD application set deployed from the prod branch + type: string + required: true + secrets: + ARGOCD_DEPLOY_KEY: + required: false + +env: + INTERNAL: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }} + +jobs: + build: + name: Build ${{ inputs.package }} + runs-on: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && inputs.runner || 'ubuntu-latest' }} + env: + SQLX_OFFLINE: 'true' + GIT_HASH: ${{ github.sha }} + SCCACHE_CACHE_SIZE: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && '20G' || '' }} + RUSTC_WRAPPER: ${{ (github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository) && 'sccache' || '' }} + RUST_MIN_STACK: '268435456' + steps: + - name: Check out code + if: env.INTERNAL != 'true' + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: Check out code (Namespace) + if: env.INTERNAL == 'true' + uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 + + - name: Setup Rust toolchain + uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0 + with: + rustflags: '' + # Namespace runners cache Rust on their cache volume instead + cache: ${{ env.INTERNAL != 'true' }} + + - name: Setup mold + uses: rui314/setup-mold@9c9c13bf4c3f1adef0cc596abc155580bcb04444 # v1 / Mold 2.41.0 + + - name: Setup sccache + uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 + + - name: Set up caches + if: env.INTERNAL == 'true' + uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1 + with: + cache: | + rust + apt + + - name: Configure sccache + if: env.INTERNAL == 'true' + run: nsc cache sccache setup --cache_name default >> "$GITHUB_ENV" + + - name: Install build dependencies + run: sudo apt-get update && sudo apt-get install -y --no-install-recommends cmake libcurl4-openssl-dev + + - name: Build ${{ inputs.package }} + env: + PACKAGE: ${{ inputs.package }} + PROFILE: ${{ inputs.profile }} + run: cargo build --profile "$PROFILE" --package "$PACKAGE" + + - name: Stage Docker context + env: + PACKAGE: ${{ inputs.package }} + PROFILE: ${{ inputs.profile }} + PROJECT_DIR: ${{ inputs.project-dir }} + STAGE_PATHS: ${{ inputs.stage-paths }} + run: | + mkdir -p "$PROJECT_DIR/docker-stage" + cp "target/$PROFILE/$PACKAGE" "$PROJECT_DIR/docker-stage/" + for stage_path in $STAGE_PATHS; do + cp -r "$PROJECT_DIR/$stage_path" "$PROJECT_DIR/docker-stage/$stage_path" + done + + - name: Upload Docker context + if: env.INTERNAL == 'true' + uses: namespace-actions/upload-artifact@f6ccaacc655aec41b93af180d1d7eef21af862d2 # v1.0.3 + with: + name: ${{ inputs.image-name }}-docker-context + retention-days: 1 + path: ${{ inputs.project-dir }}/docker-stage + + docker-build: + needs: [build] + if: ${{ github.event_name != 'pull_request' || github.event.pull_request.head.repo.full_name == github.repository }} + uses: SparkUniverse/workflows/.github/workflows/docker-build.yaml@main + with: + image-name: ${{ inputs.image-name }} + dockerfile-path: ${{ inputs.project-dir }}/Dockerfile + artifacts-name: ${{ inputs.image-name }}-docker-context + + deploy: + needs: [docker-build] + if: ${{ github.ref == 'refs/heads/prod' && github.event_name == 'push' }} + uses: SparkUniverse/workflows/.github/workflows/argo-update.yaml@main + secrets: + ARGOCD_DEPLOY_KEY: ${{ secrets.ARGOCD_DEPLOY_KEY }} + with: + application-set: ${{ inputs.application-set }} + branch: main + environment-name: production diff --git a/.github/workflows/theseus-build.yml b/.github/workflows/theseus-build.yml index c92521b6338..7f86d3d6d75 100644 --- a/.github/workflows/theseus-build.yml +++ b/.github/workflows/theseus-build.yml @@ -83,16 +83,8 @@ jobs: - name: Setup sccache uses: mozilla-actions/sccache-action@9e7fa8a12102821edf02ca5dbea1acd0f89a2696 # v0.0.10 - - name: Setup Node - uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0 - with: - node-version-file: .nvmrc - - - name: Enable Corepack - run: corepack enable - - - name: Set up caches - uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1 + - name: Setup Node and caches + uses: ./.github/actions/setup with: cache: | rust diff --git a/.gitignore b/.gitignore index d442251099c..6fa3cd0d085 100644 --- a/.gitignore +++ b/.gitignore @@ -58,6 +58,8 @@ apps/frontend/src/generated /packages/ui/src/layouts/wrapped/settings/language-settings/language-settings-coverage.generated.ts .turbo +.moon/cache +.moon/docker target generated !apps/app-frontend/src/generated/ diff --git a/.moon/tasks/all.yml b/.moon/tasks/all.yml new file mode 100644 index 00000000000..903107de28c --- /dev/null +++ b/.moon/tasks/all.yml @@ -0,0 +1,95 @@ +$schema: 'https://moonrepo.dev/schemas/tasks.json' + +implicitInputs: + - '/packages/tooling-config/**/*' + - '/packages/app-lib/.env' + - '$MODRINTH_URL' + - '$MODRINTH_API_BASE_URL' + - '$SHARED_INSTANCES_API_BASE_URL' + - '$MODRINTH_ARCHON_BASE_URL' + - '$VITE_STRIPE_PUBLISHABLE_KEY' + +# Tasks are inferred from each package.json script (`:` becomes `-`). +# These definitions only add caching config on top of them, and act as +# no-ops in projects without the matching script. +tasks: + build: + deps: + - 'repo:i18n-coverage' + - '^:build' + inputs: + - '**/*' + - '.env*' + - '$NODE_ENV' + - '$SITE_URL' + - '$BASE_URL' + - '$PREVIEW' + - '$BUILD_ENV' + - '$FLAG_OVERRIDES' + - '$BROWSER_BASE_URL' + - '$RATE_LIMIT_IGNORE_KEY' + - '$VERCEL_*' + - '$CF_PAGES_*' + - '$HEROKU_APP_NAME' + - '$STRIPE_PUBLISHABLE_KEY' + - '$INTERCOM_APP_ID' + - '$INTERCOM_IDENTITY_SECRET' + - '$PYRO_BASE_URL' + - '$PROD_OVERRIDE' + - '$PYRO_MASTER_KEY' + - '$PORT' + - '$SQLX_OFFLINE' + - '$DATABASE_URL' + - '$CARGO_*' + - '$RUST_*' + - '$RUSTFLAGS' + - '$FORCE_COLOR' + - '$NEXTEST_*' + + lint: + inputs: + - '**/*' + - '$DATABASE_URL' + - '$SQLX_OFFLINE' + - '$CARGO_*' + - '$RUST_*' + - '$RUSTFLAGS' + - '$FORCE_COLOR' + - '$NEXTEST_*' + + test: + inputs: + - '**/*' + - '$SQLX_OFFLINE' + - '$DATABASE_URL' + - '$REDIS_*' + - '$CARGO_*' + - '$RUST_*' + - '$RUSTFLAGS' + - '$FORCE_COLOR' + - '$NEXTEST_*' + + fix: {} + + fix-ancillary: + options: + cache: false + + intl-extract: + options: + runInCI: true + + intl-prune-local: + deps: + - 'intl-extract' + options: + cache: false + + prepr: + deps: + - '^:prepr' + - 'fix' + - 'intl-extract' + - 'intl-prune-local' + options: + runInCI: false diff --git a/.moon/tasks/app-lib.yml b/.moon/tasks/app-lib.yml new file mode 100644 index 00000000000..8c5f1d917bc --- /dev/null +++ b/.moon/tasks/app-lib.yml @@ -0,0 +1,27 @@ +$schema: 'https://moonrepo.dev/schemas/tasks.json' + +inheritedBy: + tags: ['app-lib'] + +# Mirrors the rerun-if-changed list in app-lib's build.rs +fileGroups: + app-lib: + - '/packages/app-lib/build.rs' + - '/packages/app-lib/src/**/*' + - '/packages/app-lib/migrations/**/*' + - '/packages/app-lib/.sqlx/**/*' + - '/packages/app-lib/java/src/**/*' + - '/packages/app-lib/java/gradle/**/*' + - '/packages/app-lib/java/*.kts' + - '/packages/app-lib/java/gradle.properties' + +tasks: + build: + inputs: + - '@group(app-lib)' + lint: + inputs: + - '@group(app-lib)' + test: + inputs: + - '@group(app-lib)' diff --git a/.moon/tasks/rust.yml b/.moon/tasks/rust.yml new file mode 100644 index 00000000000..f52b2a8be4c --- /dev/null +++ b/.moon/tasks/rust.yml @@ -0,0 +1,30 @@ +$schema: 'https://moonrepo.dev/schemas/tasks.json' + +inheritedBy: + toolchains: ['rust'] + +# moon does not derive crate relationships from Cargo, so the workspace +# files and sibling crates every crate compiles against are hashed explicitly +fileGroups: + cargo: + - '/Cargo.toml' + - '/Cargo.lock' + - '/rust-toolchain.toml' + - '/clippy.toml' + - '/rustfmt.toml' + - '/.cargo/config.toml' + - '/packages/*/Cargo.toml' + - '/packages/*/src/**/*.rs' + +# Linting, fixing and testing run workspace-wide from `rust` (.cargo/moon.yml). +# Rust files are formatted by rustfmt and Cargo.toml by tombi (`repo:tombi`) +tasks: + build: + inputs: + - '@group(cargo)' + lint-ancillary: + command: 'prettier --check --no-error-on-unmatched-pattern . "!**/*.rs" "!**/Cargo.{toml,lock}"' + toolchains: ['javascript', 'node'] + fix-ancillary: + command: 'prettier --write --no-error-on-unmatched-pattern . "!**/*.rs" "!**/Cargo.{toml,lock}"' + toolchains: ['javascript', 'node'] diff --git a/.moon/toolchains.yml b/.moon/toolchains.yml new file mode 100644 index 00000000000..ec12cb1d8ce --- /dev/null +++ b/.moon/toolchains.yml @@ -0,0 +1,12 @@ +$schema: 'https://moonrepo.dev/schemas/toolchains.json' + +javascript: + packageManager: 'pnpm' + inferTasksFromScripts: true + syncProjectWorkspaceDependencies: false + +node: {} + +pnpm: {} + +rust: {} diff --git a/.moon/workspace.yml b/.moon/workspace.yml new file mode 100644 index 00000000000..e320152203d --- /dev/null +++ b/.moon/workspace.yml @@ -0,0 +1,18 @@ +$schema: 'https://moonrepo.dev/schemas/workspace.json' + +projects: + globs: + - 'apps/*/{Cargo.toml,package.json}' + - 'packages/*/{Cargo.toml,package.json}' + # The repo root can't be a project since its package.json scripts call moon + # and would be inferred as recursive tasks, so workspace-wide tasks live in: + sources: + repo: 'scripts' + rust: '.cargo' + +vcs: + client: 'git' + defaultBranch: 'main' + +pipeline: + installDependencies: false diff --git a/AGENTS.md b/AGENTS.md index 4e46b24039b..99406abb51d 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -4,7 +4,7 @@ This is the Modrinth monorepo — it contains all Modrinth projects, both fronte ## Architecture -- **Monorepo tooling:** [Turborepo](https://turbo.build/) (`turbo.jsonc`) + [pnpm workspaces](https://pnpm.io/workspaces) (`pnpm-workspace.yaml`) +- **Monorepo tooling:** [moon](https://moonrepo.dev/) (`.moon/`, per-project `moon.yml`) + [pnpm workspaces](https://pnpm.io/workspaces) (`pnpm-workspace.yaml`) + Cargo workspace (`Cargo.toml`). Rust lint, fix and test run workspace-wide via `rust:lint`, `rust:fix` and `rust:test` (`.cargo/moon.yml`), repo-wide checks live in `repo` (`scripts/moon.yml`) - **Frontend:** Vue 3 / Nuxt 3, Tailwind CSS v3 - **Backend:** Rust (Labrinth API), Postgres, Clickhouse - **Indentation:** Use TAB everywhere, never spaces diff --git a/apps/app-frontend/eslint.config.mjs b/apps/app-frontend/eslint.config.mjs index 5bed0847036..b8555099f1a 100644 --- a/apps/app-frontend/eslint.config.mjs +++ b/apps/app-frontend/eslint.config.mjs @@ -4,9 +4,4 @@ export default config.append([ { ignores: ['src/generated/app-events/*.ts', 'src/generated/app-events/postcard/**'], }, - { - rules: { - 'turbo/no-undeclared-env-vars': ['error', { allowList: ['^DEV$', '^PROD$'] }], - }, - }, ]) diff --git a/apps/app-frontend/moon.yml b/apps/app-frontend/moon.yml new file mode 100644 index 00000000000..3f9bb8c380f --- /dev/null +++ b/apps/app-frontend/moon.yml @@ -0,0 +1,7 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +tasks: + build: + command: 'pnpm run build' + outputs: + - 'dist/**/*' diff --git a/apps/app-frontend/package.json b/apps/app-frontend/package.json index 4f67741f59f..5ea220e14bc 100644 --- a/apps/app-frontend/package.json +++ b/apps/app-frontend/package.json @@ -15,6 +15,7 @@ }, "dependencies": { "@dnd-kit/vue": "^0.5.0", + "@floating-ui/vue": "^2.0.1", "@modrinth/api-client": "workspace:^", "@modrinth/assets": "workspace:*", "@modrinth/ui": "workspace:*", @@ -34,7 +35,6 @@ "@vueuse/core": "^11.1.0", "ace-builds": "^1.43.5", "dayjs": "^1.11.10", - "@floating-ui/vue": "^2.0.1", "fuse.js": "^6.6.2", "intl-messageformat": "^10.7.7", "motion-v": "2.2.1", @@ -59,7 +59,6 @@ "@vitejs/plugin-vue": "^6.0.3", "autoprefixer": "^10.4.19", "eslint": "^9.9.1", - "eslint-plugin-turbo": "^2.5.4", "postcss": "^8.4.39", "prettier": "^3.2.5", "sass": "^1.74.1", diff --git a/apps/app-frontend/vite.config.ts b/apps/app-frontend/vite.config.ts index 5b5d80d1748..7fb4f3083e2 100644 --- a/apps/app-frontend/vite.config.ts +++ b/apps/app-frontend/vite.config.ts @@ -103,10 +103,10 @@ export default defineConfig({ }, }, // Tauri supports es2021 - target: process.env.TAURI_ENV_PLATFORM == 'windows' ? 'chrome105' : 'safari13', // eslint-disable-line turbo/no-undeclared-env-vars + target: process.env.TAURI_ENV_PLATFORM == 'windows' ? 'chrome105' : 'safari13', // don't minify for debug builds - minify: !process.env.TAURI_ENV_DEBUG, // eslint-disable-line turbo/no-undeclared-env-vars + minify: !process.env.TAURI_ENV_DEBUG, // produce sourcemaps for debug builds - sourcemap: !!process.env.TAURI_ENV_DEBUG, // eslint-disable-line turbo/no-undeclared-env-vars + sourcemap: !!process.env.TAURI_ENV_DEBUG, }, }) diff --git a/apps/app-playground/moon.yml b/apps/app-playground/moon.yml new file mode 100644 index 00000000000..43fe1d89ff3 --- /dev/null +++ b/apps/app-playground/moon.yml @@ -0,0 +1,10 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +tags: ['app-lib'] + +tasks: + build: + command: 'cargo build --release' + dev: + command: 'cargo run' + preset: 'server' diff --git a/apps/app-playground/package.json b/apps/app-playground/package.json deleted file mode 100644 index 7d9fdaa610c..00000000000 --- a/apps/app-playground/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "@modrinth/app-playground", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "lint:ancillary": "prettier --check .", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "fix:ancillary": "prettier --check .", - "dev": "cargo run", - "test": "cargo nextest run --all-targets --no-fail-fast" - } -} diff --git a/apps/app-playground/turbo.jsonc b/apps/app-playground/turbo.jsonc deleted file mode 100644 index 86e983d2f61..00000000000 --- a/apps/app-playground/turbo.jsonc +++ /dev/null @@ -1,73 +0,0 @@ -{ - "$schema": "../../node_modules/turbo/schema.json", - "extends": ["//"], - "tasks": { - // Turborepo only knows the pnpm dependency graph, so the Cargo workspace - // files and sibling crates this crate compiles against are hashed explicitly. - // The app-lib entries mirror the rerun-if-changed list in its build.rs - "build": { - "inputs": [ - "$TURBO_DEFAULT$", - ".env*", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs", - "$TURBO_ROOT$/packages/app-lib/build.rs", - "$TURBO_ROOT$/packages/app-lib/src/**", - "$TURBO_ROOT$/packages/app-lib/migrations/**", - "$TURBO_ROOT$/packages/app-lib/.sqlx/**", - "$TURBO_ROOT$/packages/app-lib/java/src/**", - "$TURBO_ROOT$/packages/app-lib/java/gradle/**", - "$TURBO_ROOT$/packages/app-lib/java/*.kts", - "$TURBO_ROOT$/packages/app-lib/java/gradle.properties" - ] - }, - "lint": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs", - "$TURBO_ROOT$/packages/app-lib/build.rs", - "$TURBO_ROOT$/packages/app-lib/src/**", - "$TURBO_ROOT$/packages/app-lib/migrations/**", - "$TURBO_ROOT$/packages/app-lib/.sqlx/**", - "$TURBO_ROOT$/packages/app-lib/java/src/**", - "$TURBO_ROOT$/packages/app-lib/java/gradle/**", - "$TURBO_ROOT$/packages/app-lib/java/*.kts", - "$TURBO_ROOT$/packages/app-lib/java/gradle.properties" - ] - }, - "test": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs", - "$TURBO_ROOT$/packages/app-lib/build.rs", - "$TURBO_ROOT$/packages/app-lib/src/**", - "$TURBO_ROOT$/packages/app-lib/migrations/**", - "$TURBO_ROOT$/packages/app-lib/.sqlx/**", - "$TURBO_ROOT$/packages/app-lib/java/src/**", - "$TURBO_ROOT$/packages/app-lib/java/gradle/**", - "$TURBO_ROOT$/packages/app-lib/java/*.kts", - "$TURBO_ROOT$/packages/app-lib/java/gradle.properties" - ] - } - } -} diff --git a/apps/app/moon.yml b/apps/app/moon.yml new file mode 100644 index 00000000000..95c5f579fb2 --- /dev/null +++ b/apps/app/moon.yml @@ -0,0 +1,3 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +tags: ['app-lib'] diff --git a/apps/app/package.json b/apps/app/package.json index 433f2f36d5b..ff6a5890606 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -3,19 +3,12 @@ "scripts": { "tauri": "tauri", "build": "tauri build", - "dev": "tauri dev --features export-app-events", - "test": "cargo nextest run --all-targets --no-fail-fast", - "lint": "cargo fmt --check && cargo clippy --all-targets && cargo clippy --all-targets --features updater", - "lint:ancillary": "prettier --check .", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo clippy --all-targets --features updater --fix --allow-dirty && cargo fmt", - "fix:ancillary": "prettier --write ." + "dev": "tauri dev --features export-app-events" }, "devDependencies": { "@tauri-apps/cli": "2.5.0" }, "dependencies": { - "@modrinth/app-frontend": "workspace:*", - "@modrinth/app-lib": "workspace:*", - "@modrinth/daedalus": "workspace:*" + "@modrinth/app-frontend": "workspace:*" } } diff --git a/apps/app/tauri.conf.json b/apps/app/tauri.conf.json index db4ef3624bf..3b7cb1b52c3 100644 --- a/apps/app/tauri.conf.json +++ b/apps/app/tauri.conf.json @@ -1,8 +1,8 @@ { "$schema": "https://schema.tauri.app/config/2", "build": { - "beforeDevCommand": "pnpm -w i18n:coverage && pnpm turbo run dev --filter=@modrinth/app-frontend", - "beforeBuildCommand": "pnpm turbo run build --filter=@modrinth/app-frontend", + "beforeDevCommand": "pnpm -w i18n:coverage && pnpm moon run app-frontend:dev", + "beforeBuildCommand": "pnpm moon run app-frontend:build", "frontendDist": "../app-frontend/dist", "devUrl": "http://localhost:1420" }, diff --git a/apps/app/turbo.jsonc b/apps/app/turbo.jsonc deleted file mode 100644 index 122ae9effe0..00000000000 --- a/apps/app/turbo.jsonc +++ /dev/null @@ -1,77 +0,0 @@ -{ - "$schema": "../../node_modules/turbo/schema.json", - "extends": ["//"], - "tasks": { - // Turborepo only knows the pnpm dependency graph, so the Cargo workspace - // files and sibling crates this crate compiles against are hashed explicitly. - // The app-lib entries mirror the rerun-if-changed list in its build.rs - "build": { - "inputs": [ - "$TURBO_DEFAULT$", - ".env*", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs", - "$TURBO_ROOT$/packages/app-lib/build.rs", - "$TURBO_ROOT$/packages/app-lib/src/**", - "$TURBO_ROOT$/packages/app-lib/migrations/**", - "$TURBO_ROOT$/packages/app-lib/.sqlx/**", - "$TURBO_ROOT$/packages/app-lib/java/src/**", - "$TURBO_ROOT$/packages/app-lib/java/gradle/**", - "$TURBO_ROOT$/packages/app-lib/java/*.kts", - "$TURBO_ROOT$/packages/app-lib/java/gradle.properties" - ] - }, - // Running Clippy and tests on a Tauri application requires - // the frontend to be built at least once first - "lint": { - "dependsOn": ["@modrinth/app-frontend#build"], - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs", - "$TURBO_ROOT$/packages/app-lib/build.rs", - "$TURBO_ROOT$/packages/app-lib/src/**", - "$TURBO_ROOT$/packages/app-lib/migrations/**", - "$TURBO_ROOT$/packages/app-lib/.sqlx/**", - "$TURBO_ROOT$/packages/app-lib/java/src/**", - "$TURBO_ROOT$/packages/app-lib/java/gradle/**", - "$TURBO_ROOT$/packages/app-lib/java/*.kts", - "$TURBO_ROOT$/packages/app-lib/java/gradle.properties" - ] - }, - "test": { - "dependsOn": ["@modrinth/app-frontend#build"], - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs", - "$TURBO_ROOT$/packages/app-lib/build.rs", - "$TURBO_ROOT$/packages/app-lib/src/**", - "$TURBO_ROOT$/packages/app-lib/migrations/**", - "$TURBO_ROOT$/packages/app-lib/.sqlx/**", - "$TURBO_ROOT$/packages/app-lib/java/src/**", - "$TURBO_ROOT$/packages/app-lib/java/gradle/**", - "$TURBO_ROOT$/packages/app-lib/java/*.kts", - "$TURBO_ROOT$/packages/app-lib/java/gradle.properties" - ] - } - } -} diff --git a/apps/daedalus_client/moon.yml b/apps/daedalus_client/moon.yml new file mode 100644 index 00000000000..98acba94126 --- /dev/null +++ b/apps/daedalus_client/moon.yml @@ -0,0 +1,8 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +tasks: + build: + command: 'cargo build --release' + dev: + command: 'cargo run' + preset: 'server' diff --git a/apps/daedalus_client/package.json b/apps/daedalus_client/package.json deleted file mode 100644 index e7e94f8a61f..00000000000 --- a/apps/daedalus_client/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "@modrinth/daedalus_client", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "lint:ancillary": "prettier --check .", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "fix:ancillary": "prettier --write .", - "dev": "cargo run", - "test": "cargo nextest run --all-targets --no-fail-fast" - }, - "dependencies": { - "@modrinth/daedalus": "workspace:*" - } -} diff --git a/apps/daedalus_client/turbo.jsonc b/apps/daedalus_client/turbo.jsonc deleted file mode 100644 index 3f7c4ed8a2b..00000000000 --- a/apps/daedalus_client/turbo.jsonc +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "../../node_modules/turbo/schema.json", - "extends": ["//"], - "tasks": { - // Turborepo only knows the pnpm dependency graph, so the Cargo workspace - // files and sibling crates this crate compiles against are hashed explicitly - "build": { - "inputs": [ - "$TURBO_DEFAULT$", - ".env*", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - }, - "lint": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - }, - "test": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - } - } -} diff --git a/apps/docs/moon.yml b/apps/docs/moon.yml new file mode 100644 index 00000000000..3f9bb8c380f --- /dev/null +++ b/apps/docs/moon.yml @@ -0,0 +1,7 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +tasks: + build: + command: 'pnpm run build' + outputs: + - 'dist/**/*' diff --git a/apps/docs/src/content/docs/contributing/getting-started.md b/apps/docs/src/content/docs/contributing/getting-started.md index f8dea788117..8d0178b68bd 100644 --- a/apps/docs/src/content/docs/contributing/getting-started.md +++ b/apps/docs/src/content/docs/contributing/getting-started.md @@ -13,7 +13,7 @@ Every public-facing aspect of Modrinth, including everything from our [API/backe If you wish to contribute code to a specific project, here's the place to start. Most of Modrinth is written in the [Rust language](https://www.rust-lang.org), but some things are written in other languages/frameworks like [Nuxt.js](https://nuxtjs.org) or Java. -Most of Modrinth's code is in our monorepo, which you can find [here](https://github.com/modrinth/code). Our monorepo is powered by [Turborepo](https://turborepo.org). +Most of Modrinth's code is in our monorepo, which you can find [here](https://github.com/modrinth/code). Our monorepo is powered by [moon](https://moonrepo.dev). Follow the project-specific instructions below to get started: diff --git a/apps/frontend/moon.yml b/apps/frontend/moon.yml new file mode 100644 index 00000000000..3c220483f1b --- /dev/null +++ b/apps/frontend/moon.yml @@ -0,0 +1,8 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +tasks: + build: + command: 'pnpm run build' + outputs: + - '.nuxt/**/*' + - '.output/**/*' diff --git a/apps/labrinth/.prettierrc.json b/apps/labrinth/.prettierrc.json new file mode 100644 index 00000000000..939c57ab4ac --- /dev/null +++ b/apps/labrinth/.prettierrc.json @@ -0,0 +1 @@ +"@modrinth/tooling-config/labrinth.prettier.config.cjs" diff --git a/apps/labrinth/moon.yml b/apps/labrinth/moon.yml new file mode 100644 index 00000000000..e94bca37136 --- /dev/null +++ b/apps/labrinth/moon.yml @@ -0,0 +1,28 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +tasks: + build: + command: 'cargo build --release' + dev: + command: 'cargo run' + preset: 'server' + # Builds with the same arguments as `rust:test` to share its artifacts. + # In CI, the Docker services and database are only started when this task + # misses the cache. The integration tests also need a lot of disk space, so + # unused tools are removed from the runner image first, freeing ~20 GiB. + # To debug what is taking up space, run: + # sudo du -xh --max-depth=4 / | sort -rh | curl -X POST --data-urlencode content@/dev/fd/0 https://api.mclo.gs/1/log + test: + script: | + set -e + if [ -n "$CI" ]; then + sudo rm -rf /usr/local/lib/android /usr/local/.ghcup /opt/hostedtoolcache/CodeQL /usr/share/swift + docker compose -f ../../docker-compose.yml --profile clustered-redis up --wait + cp .env.local .env + sqlx database setup + fi + cargo nextest run --workspace --all-targets --features sqlx-tracing/sqlite --no-fail-fast -E 'package(labrinth)' + deps: + - 'app-frontend:build' + inputs: + - '@group(cargo)' diff --git a/apps/labrinth/package.json b/apps/labrinth/package.json deleted file mode 100644 index 40873a2bc16..00000000000 --- a/apps/labrinth/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "@modrinth/labrinth", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "lint:ancillary": "prettier --check .", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "fix:ancillary": "prettier --write .", - "dev": "cargo run", - "//": "labrinth integration tests require a lot of disk space, so in the standard GitHub Actions", - "//": "runners we must remove useless development tools from the base image, which frees up ~20 GiB.", - "//": "The command commented out below can be used in CI to debug what is taking up space:", - "//": "sudo du -xh --max-depth=4 / | sort -rh | curl -X POST --data-urlencode content@/dev/fd/0 https://api.mclo.gs/1/log", - "test": "if-ci sudo rm -rf /usr/local/lib/android /usr/local/.ghcup /opt/hostedtoolcache/CodeQL /usr/share/swift && cargo nextest run --all-targets --no-fail-fast" - }, - "prettier": "@modrinth/tooling-config/labrinth.prettier.config.cjs" -} diff --git a/apps/labrinth/turbo.jsonc b/apps/labrinth/turbo.jsonc deleted file mode 100644 index 3f7c4ed8a2b..00000000000 --- a/apps/labrinth/turbo.jsonc +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "../../node_modules/turbo/schema.json", - "extends": ["//"], - "tasks": { - // Turborepo only knows the pnpm dependency graph, so the Cargo workspace - // files and sibling crates this crate compiles against are hashed explicitly - "build": { - "inputs": [ - "$TURBO_DEFAULT$", - ".env*", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - }, - "lint": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - }, - "test": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - } - } -} diff --git a/package.json b/package.json index 8b059102322..ff636278edf 100644 --- a/package.json +++ b/package.json @@ -3,24 +3,24 @@ "version": "0.0.0", "private": true, "scripts": { - "web:dev": "pnpm i18n:coverage && turbo run dev --filter=@modrinth/frontend", - "web:build": "turbo run build --filter=@modrinth/frontend", - "app:dev": "turbo run dev --filter=@modrinth/app", - "app:build": "turbo run build --filter=@modrinth/app", - "docs:dev": "turbo run dev --filter=@modrinth/docs", + "web:dev": "pnpm i18n:coverage && moon run frontend:dev", + "web:build": "moon run frontend:build", + "app:dev": "moon run app:dev", + "app:build": "moon run app:build", + "docs:dev": "moon run docs:dev", "pages:build": "pnpm i18n:coverage && NITRO_PRESET=cloudflare-pages pnpm --filter frontend run build", - "build": "turbo run build --continue", - "lint": "turbo run lint lint:ancillary --continue", + "build": "moon exec --on-failure continue :build", + "lint": "moon exec --on-failure continue :lint :lint-ancillary", "lint:ancillary": "prettier --check .github *.*", - "test": "turbo run test --continue", - "fix": "turbo run fix fix:ancillary --continue", + "test": "moon exec --on-failure continue :test", + "fix": "moon exec --on-failure continue :fix :fix-ancillary", "fix:ancillary": "prettier --write .github *.*", - "ci": "turbo run lint test --continue", - "prepr": "turbo run prepr --continue", - "prepr:frontend": "turbo run prepr --filter=@modrinth/frontend --filter=@modrinth/app-frontend", - "prepr:frontend:lib": "turbo run prepr --filter=@modrinth/ui --filter=@modrinth/moderation --filter=@modrinth/assets --filter=@modrinth/blog --filter=@modrinth/api-client --filter=@modrinth/utils --filter=@modrinth/tooling-config", - "prepr:frontend:web": "turbo run prepr --filter=@modrinth/frontend", - "prepr:frontend:app": "turbo run prepr --filter=@modrinth/app-frontend", + "ci": "moon exec --on-failure continue :lint :test", + "prepr": "moon exec --on-failure continue :prepr", + "prepr:frontend": "moon run frontend:prepr app-frontend:prepr", + "prepr:frontend:lib": "moon run ui:prepr moderation:prepr assets:prepr blog:prepr api-client:prepr utils:prepr tooling-config:prepr", + "prepr:frontend:web": "moon run frontend:prepr", + "prepr:frontend:app": "moon run app-frontend:prepr", "storybook": "pnpm i18n:coverage && pnpm --filter @modrinth/ui storybook", "build-storybook": "pnpm i18n:coverage && pnpm --filter @modrinth/ui build-storybook", "icons:add": "pnpm --filter @modrinth/assets icons:add", @@ -34,16 +34,15 @@ "@crowdin/crowdin-api-client": "^1.55.2", "@formatjs/icu-messageformat-parser": "^2.11.4", "@modrinth/tooling-config": "workspace:*", + "@moonrepo/cli": "2.5.6", "@tailwindcss/container-queries": "^0.1.1", "@types/node": "^24", "@typescript-eslint/typescript-estree": "^8.64.0", "@vue/compiler-dom": "^3.5.26", "@vue/compiler-sfc": "^3.5.26", "chalk": "^5.6.2", - "if-ci": "^3.0.0", "keep-a-changelog": "^3.0.2", "prettier": "^3.3.2", - "turbo": "^2.5.4", "vue": "^3.5.13", "yaml": "^2.8.2" }, diff --git a/packages/api-client/README.md b/packages/api-client/README.md index 8ae1bedbd28..118e27b6c80 100644 --- a/packages/api-client/README.md +++ b/packages/api-client/README.md @@ -167,7 +167,7 @@ Uploads use `XMLHttpRequest` for progress tracking and are only available in bro ```bash pnpm --filter @modrinth/api-client build pnpm --filter @modrinth/api-client lint -# or pnpm prepr:frontend:lib in turborepo root. +# or pnpm prepr:frontend:lib in the monorepo root. ``` When adding a module, add it to `src/modules/index.ts` so it is included in the typed client structure. diff --git a/packages/api-client/moon.yml b/packages/api-client/moon.yml new file mode 100644 index 00000000000..3f9bb8c380f --- /dev/null +++ b/packages/api-client/moon.yml @@ -0,0 +1,7 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +tasks: + build: + command: 'pnpm run build' + outputs: + - 'dist/**/*' diff --git a/packages/app-lib/.prettierignore b/packages/app-lib/.prettierignore index cd53c223538..c3dcc64c3a9 100644 --- a/packages/app-lib/.prettierignore +++ b/packages/app-lib/.prettierignore @@ -6,3 +6,6 @@ java/build # Migrations existing before Prettier formatted them shall always be ignored, # as any changes to them will break existing deployments migrations/** + +# Generated by optionstxt_diff_calc.py +src/api/instance/synced_options/game_options/catalog/README.md diff --git a/packages/app-lib/.prettierrc.json b/packages/app-lib/.prettierrc.json new file mode 100644 index 00000000000..1291e25c18e --- /dev/null +++ b/packages/app-lib/.prettierrc.json @@ -0,0 +1 @@ +"@modrinth/tooling-config/app-lib.prettier.config.cjs" diff --git a/packages/app-lib/package.json b/packages/app-lib/package.json deleted file mode 100644 index c887cdffc97..00000000000 --- a/packages/app-lib/package.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "name": "@modrinth/app-lib", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "lint:ancillary": "prettier --check .", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "fix:ancillary": "prettier --write .", - "test": "cargo nextest run --all-targets --no-fail-fast" - }, - "prettier": "@modrinth/tooling-config/app-lib.prettier.config.cjs" -} diff --git a/packages/app-lib/turbo.jsonc b/packages/app-lib/turbo.jsonc deleted file mode 100644 index 3f7c4ed8a2b..00000000000 --- a/packages/app-lib/turbo.jsonc +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "../../node_modules/turbo/schema.json", - "extends": ["//"], - "tasks": { - // Turborepo only knows the pnpm dependency graph, so the Cargo workspace - // files and sibling crates this crate compiles against are hashed explicitly - "build": { - "inputs": [ - "$TURBO_DEFAULT$", - ".env*", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - }, - "lint": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - }, - "test": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - } - } -} diff --git a/packages/async-minecraft-ping/README.md b/packages/async-minecraft-ping/README.md index ae8804ac4f8..a78f83f9aeb 100644 --- a/packages/async-minecraft-ping/README.md +++ b/packages/async-minecraft-ping/README.md @@ -55,10 +55,10 @@ When SRV lookup is enabled, the library queries `_minecraft._tcp.
` for Licensed under either of - * Apache License, Version 2.0 - ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) - * MIT license - ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) +- Apache License, Version 2.0 + ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) +- MIT license + ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. diff --git a/packages/daedalus/package.json b/packages/daedalus/package.json deleted file mode 100644 index 5a972cf6a09..00000000000 --- a/packages/daedalus/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "@modrinth/daedalus", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "lint:ancillary": "prettier --check .", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "fix:ancillary": "prettier --write .", - "test": "cargo nextest run --all-targets --no-fail-fast" - } -} diff --git a/packages/daedalus/turbo.jsonc b/packages/daedalus/turbo.jsonc deleted file mode 100644 index 3f7c4ed8a2b..00000000000 --- a/packages/daedalus/turbo.jsonc +++ /dev/null @@ -1,48 +0,0 @@ -{ - "$schema": "../../node_modules/turbo/schema.json", - "extends": ["//"], - "tasks": { - // Turborepo only knows the pnpm dependency graph, so the Cargo workspace - // files and sibling crates this crate compiles against are hashed explicitly - "build": { - "inputs": [ - "$TURBO_DEFAULT$", - ".env*", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - }, - "lint": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - }, - "test": { - "inputs": [ - "$TURBO_DEFAULT$", - "$TURBO_ROOT$/Cargo.toml", - "$TURBO_ROOT$/Cargo.lock", - "$TURBO_ROOT$/rust-toolchain.toml", - "$TURBO_ROOT$/clippy.toml", - "$TURBO_ROOT$/rustfmt.toml", - "$TURBO_ROOT$/.cargo/config.toml", - "$TURBO_ROOT$/packages/*/Cargo.toml", - "$TURBO_ROOT$/packages/*/src/**/*.rs" - ] - } - } -} diff --git a/packages/tooling-config/eslint/nuxt.mjs b/packages/tooling-config/eslint/nuxt.mjs index afbba595655..15c3ef8a8bc 100644 --- a/packages/tooling-config/eslint/nuxt.mjs +++ b/packages/tooling-config/eslint/nuxt.mjs @@ -1,19 +1,8 @@ -import { fixupPluginRules } from '@eslint/compat' import { createConfigForNuxt } from '@nuxt/eslint-config/flat' -import turboPlugin from 'eslint-plugin-turbo' import common from './common.mjs' export const configurationNuxtToAppend = [ ...common, - { - name: 'turbo', - plugins: { - turbo: fixupPluginRules(turboPlugin), - }, - rules: { - 'turbo/no-undeclared-env-vars': 'error', - }, - }, { name: 'modrinth', rules: { diff --git a/packages/tooling-config/package.json b/packages/tooling-config/package.json index 81fc725cdd2..4aa790159e7 100644 --- a/packages/tooling-config/package.json +++ b/packages/tooling-config/package.json @@ -37,7 +37,6 @@ "prettier-plugin-toml": "^2.0.6" }, "devDependencies": { - "@eslint/compat": "^1.4.1", "@eslint/js": "^9.32.0", "@nuxt/eslint-config": "^0.5.7", "@vue/tsconfig": "^0.7.0", @@ -45,10 +44,9 @@ "eslint-config-prettier": "^10.1.8", "eslint-plugin-prettier": "^5.5.3", "eslint-plugin-simple-import-sort": "^12.1.1", - "eslint-plugin-turbo": "^2.5.4", "eslint-plugin-vue": "^10.4.0", - "vue-eslint-parser": "^10.1.3", "globals": "^16.3.0", - "typescript-eslint": "^8.38.0" + "typescript-eslint": "^8.38.0", + "vue-eslint-parser": "^10.1.3" } } diff --git a/packages/ui/src/composables/server-console.ts b/packages/ui/src/composables/server-console.ts index f2675d89d21..086dd4bb0c8 100644 --- a/packages/ui/src/composables/server-console.ts +++ b/packages/ui/src/composables/server-console.ts @@ -5,7 +5,6 @@ import { detectLogLevel } from '../layouts/shared/console/composables/log-level' import type { Log4jEvent, LogLevel, LogLine } from '../layouts/shared/console/types' // Flip to true during development to enable console perf logging. -// Uses a plain constant to avoid turbo env-var declarations. const DEBUG_PERF = false // TODO: for true unbounded history, consider IndexedDB or similar diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index cc707e2269f..55eff6326b2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -33,6 +33,9 @@ importers: '@modrinth/tooling-config': specifier: workspace:* version: link:packages/tooling-config + '@moonrepo/cli': + specifier: 2.5.6 + version: 2.5.6 '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@4.1.18) @@ -51,18 +54,12 @@ importers: chalk: specifier: ^5.6.2 version: 5.6.2 - if-ci: - specifier: ^3.0.0 - version: 3.0.0 keep-a-changelog: specifier: ^3.0.2 version: 3.0.2 prettier: specifier: ^3.3.2 version: 3.8.1 - turbo: - specifier: ^2.5.4 - version: 2.8.2 vue: specifier: ^3.5.13 version: 3.5.27(typescript@5.9.3) @@ -75,12 +72,6 @@ importers: '@modrinth/app-frontend': specifier: workspace:* version: link:../app-frontend - '@modrinth/app-lib': - specifier: workspace:* - version: link:../../packages/app-lib - '@modrinth/daedalus': - specifier: workspace:* - version: link:../../packages/daedalus devDependencies: '@tauri-apps/cli': specifier: 2.5.0 @@ -218,9 +209,6 @@ importers: eslint: specifier: ^9.9.1 version: 9.39.2(jiti@1.21.7) - eslint-plugin-turbo: - specifier: ^2.5.4 - version: 2.8.2(eslint@9.39.2(jiti@1.21.7))(turbo@2.8.2) postcss: specifier: ^8.4.39 version: 8.5.6 @@ -246,14 +234,6 @@ importers: specifier: ^2.1.6 version: 2.2.12(typescript@5.9.3) - apps/app-playground: {} - - apps/daedalus_client: - dependencies: - '@modrinth/daedalus': - specifier: workspace:* - version: link:../../packages/daedalus - apps/docs: dependencies: '@astrojs/check': @@ -468,8 +448,6 @@ importers: specifier: ^4.115.0 version: 4.116.0 - apps/labrinth: {} - packages/api-client: dependencies: mitt: @@ -498,8 +476,6 @@ importers: specifier: ^1.0.3 version: 1.0.3(@microsoft/api-extractor@7.58.9(@types/node@24.12.2))(@vue/language-core@3.2.4)(esbuild@0.27.2)(rollup@4.57.1)(typescript@5.9.3)(vite@8.0.3(@types/node@24.12.2)(esbuild@0.27.2)(jiti@2.6.1)(sass@1.97.3)(terser@5.46.0)(yaml@2.8.2)) - packages/app-lib: {} - packages/assets: devDependencies: '@modrinth/tooling-config': @@ -561,8 +537,6 @@ importers: specifier: ^2.4.2 version: 2.6.1 - packages/daedalus: {} - packages/moderation: dependencies: '@modrinth/api-client': @@ -612,9 +586,6 @@ importers: specifier: '>=5.0.0' version: 5.9.3 devDependencies: - '@eslint/compat': - specifier: ^1.4.1 - version: 1.4.1(eslint@9.39.2(jiti@2.6.1)) '@eslint/js': specifier: ^9.32.0 version: 9.39.2 @@ -636,9 +607,6 @@ importers: eslint-plugin-simple-import-sort: specifier: ^12.1.1 version: 12.1.1(eslint@9.39.2(jiti@2.6.1)) - eslint-plugin-turbo: - specifier: ^2.5.4 - version: 2.8.2(eslint@9.39.2(jiti@2.6.1))(turbo@2.8.2) eslint-plugin-vue: specifier: ^10.4.0 version: 10.7.0(@stylistic/eslint-plugin@2.13.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(@typescript-eslint/parser@8.54.0(eslint@9.39.2(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.2(jiti@2.6.1))(vue-eslint-parser@10.2.0(eslint@9.39.2(jiti@2.6.1))) @@ -2846,6 +2814,49 @@ packages: '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} + '@moonrepo/cli@2.5.6': + resolution: {integrity: sha512-Wkwzbx8ZbXQVCo0SA2KGxDw4FwrbiLZr9HaqxNQLa/LUmziLQZBoXbmgYFDqE8a9gE73HxNtac0CFNMZUQ5x6A==} + hasBin: true + + '@moonrepo/core-linux-arm64-gnu@2.5.6': + resolution: {integrity: sha512-G8cq1eBEr7gz2GBMgj2q7kgyeIKvyQnTJkvSVdFAIvpUpRCKDfIibp2xqVGQxAWA54ZaMDiIWq78mgmpuQycjw==} + cpu: [arm64] + os: [linux] + libc: [glibc] + + '@moonrepo/core-linux-arm64-musl@2.5.6': + resolution: {integrity: sha512-1MuCAHRiEd4D4Onoeo/zcAtyVlEStc4AigMC7ekgI+1UgsYAbwL+/poz6ry71iRFZm8qVnt1TGkaUpyl+XrL8g==} + cpu: [arm64] + os: [linux] + libc: [musl] + + '@moonrepo/core-linux-x64-gnu@2.5.6': + resolution: {integrity: sha512-ZZYKTr4Sjgl0pi8cbQhaxf22nwr46wrkmF3s9xRq9pahFT/ZTeWVg7c5tMJ36Tv9nkk958fTnoUdX795A25HYA==} + cpu: [x64] + os: [linux] + libc: [glibc] + + '@moonrepo/core-linux-x64-musl@2.5.6': + resolution: {integrity: sha512-73VGovApf4jsA7PY0jjKq3A6YFZ5kjuKBBL1LBqoknqMZU1a5+P85WTw3z36lDnv1Uw3O9bfM+0GDUk2pfkv7Q==} + cpu: [x64] + os: [linux] + libc: [musl] + + '@moonrepo/core-macos-arm64@2.5.6': + resolution: {integrity: sha512-VUyq46qsUX32XzHso+CDmRPvjolCQ0/t4HyAZxOVPbjHqH6DDJOcTalSJExTWa5gfX+yHUNWndyNFxIMhu1tPw==} + cpu: [arm64] + os: [darwin] + + '@moonrepo/core-macos-x64@2.5.6': + resolution: {integrity: sha512-DYSl8493eWI+VVk92mFDyqVRg1akU/lnxoEOmvxCKGkZrC+rcT3T/Z2VyuOrhGD8Gfy3EDrjebdDg09MYn0JMQ==} + cpu: [x64] + os: [darwin] + + '@moonrepo/core-windows-x64-msvc@2.5.6': + resolution: {integrity: sha512-fcC3g3A7ckPTgv0/+aDU0aiwb/LwpV58tfhBQw4PXe7sSohk88SlmHLV31lUMbTjOmKiXegc8A9IEUhxsa92dA==} + cpu: [x64] + os: [win32] + '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -5743,9 +5754,6 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} - ci-info@2.0.0: - resolution: {integrity: sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==} - ci-info@4.4.0: resolution: {integrity: sha512-77PSwercCZU2Fc4sX94eF8k8Pxte6JAwL4/ICZLFjJLqegs7kCuAsqqj/70NQF6TvDpgFjkubQB2FW2ZZddvQg==} engines: {node: '>=8'} @@ -5921,10 +5929,6 @@ packages: resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} engines: {node: '>=18.0'} - cross-spawn@6.0.6: - resolution: {integrity: sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==} - engines: {node: '>=4.8'} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -6168,10 +6172,6 @@ packages: resolution: {integrity: sha512-MVUtAugQMOff5RnBy2d9N31iG0lNwg1qAoAOn7pOK5wf94WIaE3My2p3uwTQuvS2AcqchkcR3bHByjaM0mmi7Q==} engines: {node: '>=20'} - dotenv@16.0.3: - resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} - engines: {node: '>=12'} - dotenv@16.6.1: resolution: {integrity: sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==} engines: {node: '>=12'} @@ -6410,12 +6410,6 @@ packages: eslint: '>=8' storybook: ^10.2.4 - eslint-plugin-turbo@2.8.2: - resolution: {integrity: sha512-NHa/+NNVj3+0Cf/BNI99Al0XqAsMpv7FW5RGJ6ayGB4BYggnqcvvoV+FihJN6fLLpznW2UUBf5D2rpAj0ERTcQ==} - peerDependencies: - eslint: '>6.6.0' - turbo: '>2.0.0' - eslint-plugin-unicorn@55.0.0: resolution: {integrity: sha512-n3AKiVpY2/uDcGrS3+QsYDkjPfaOrNrsfQxU9nt5nitd9KuvVXrfAvgCO9DYPSfap+Gqjw9EOrXIsBp5tlHZjA==} engines: {node: '>=18.18'} @@ -6547,10 +6541,6 @@ packages: resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} engines: {node: '>=0.8.x'} - execa@1.0.0: - resolution: {integrity: sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==} - engines: {node: '>=6'} - execa@8.0.1: resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} engines: {node: '>=16.17'} @@ -6756,10 +6746,6 @@ packages: resolution: {integrity: sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==} engines: {node: '>= 0.4'} - get-stream@4.1.0: - resolution: {integrity: sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==} - engines: {node: '>=6'} - get-stream@8.0.1: resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} engines: {node: '>=16'} @@ -7026,11 +7012,6 @@ packages: ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - if-ci@3.0.0: - resolution: {integrity: sha512-/0vPNr5ZDR3znyP83SFMqe6oUVeiAeGt5QnPanVJjPGH7Z7JrZnYUEt7gpkK7C8NTIH5BLSqnA5IPdUnYof6pA==} - engines: {node: '>=6'} - hasBin: true - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -7123,10 +7104,6 @@ packages: resolution: {integrity: sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==} engines: {node: '>=6'} - is-ci@2.0.0: - resolution: {integrity: sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==} - hasBin: true - is-core-module@2.16.1: resolution: {integrity: sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==} engines: {node: '>= 0.4'} @@ -7206,10 +7183,6 @@ packages: is-ssh@1.4.1: resolution: {integrity: sha512-JNeu1wQsHjyHgn9NcWTaXq6zWSR6hqE0++zhfZlkFBbScNkyvxCdeV8sRkSBaeLKxmbpR21brail63ACNxJ0Tg==} - is-stream@1.1.0: - resolution: {integrity: sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==} - engines: {node: '>=0.10.0'} - is-stream@2.0.1: resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} engines: {node: '>=8'} @@ -8023,9 +7996,6 @@ packages: resolution: {integrity: sha512-Z4SmBUweYa09+o6pG+eASabEpP6QkQ70yHj351pQoEXIs8uHbaU2DWVmzBANKgflPa47A50PtB2+NgRpQvr7vA==} engines: {node: '>= 10'} - nice-try@1.0.5: - resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==} - nitropack@2.13.1: resolution: {integrity: sha512-2dDj89C4wC2uzG7guF3CnyG+zwkZosPEp7FFBGHB3AJo11AywOolWhyQJFHDzve8COvGxJaqscye9wW2IrUsNw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -8092,10 +8062,6 @@ packages: resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} engines: {node: '>=0.10.0'} - npm-run-path@2.0.2: - resolution: {integrity: sha512-lJxZYlT4DW/bRUtFh1MQIWqmLwQfAxnqWG4HhEdjMlkrJYnJn0Jrr2u3mgxqaWsdiBc76TYkTG/mhrnYTuzfHw==} - engines: {node: '>=4'} - npm-run-path@5.3.0: resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -8208,10 +8174,6 @@ packages: peerDependencies: oxc-parser: '>=0.98.0' - p-finally@1.0.0: - resolution: {integrity: sha512-LICb2p9CB7FS+0eR1oqWnHhp0FljGLZCWBE9aix0Uye9W8LTQPwMTYVGWQWIw9RdQiDg4+epXQODwIYJtSJaow==} - engines: {node: '>=4'} - p-limit@2.3.0: resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} engines: {node: '>=6'} @@ -8307,10 +8269,6 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} - path-key@2.0.1: - resolution: {integrity: sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==} - engines: {node: '>=4'} - path-key@3.1.1: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} @@ -9220,18 +9178,10 @@ packages: resolution: {integrity: sha512-FVtFjtBCMiJS6yb5CX7Sop45WFMpeGw6oRKuJnXYgf/f1ms/D7LE/ZUSNxnW7rZ/dbslQWYkoqFHGPaDBtaK4w==} engines: {node: '>=20.9.0'} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -9262,9 +9212,6 @@ packages: resolution: {integrity: sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==} engines: {node: '>= 0.4'} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -9441,10 +9388,6 @@ packages: resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} engines: {node: '>=0.10.0'} - strip-eof@1.0.0: - resolution: {integrity: sha512-7FCwGGmx8mD5xQd3RPUvnSpUXHM3BWuzjtpD4TXsfcZ9EL4azvVVUscFYwD9nx8Kh+uCBC00XBtAykoMHwTh8Q==} - engines: {node: '>=0.10.0'} - strip-final-newline@3.0.0: resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} engines: {node: '>=12'} @@ -9710,40 +9653,6 @@ packages: tunnel-agent@0.6.0: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} - turbo-darwin-64@2.8.2: - resolution: {integrity: sha512-sumREbxABHxrWIwlK67sZEaDRE7+BFSU8gZj8OK+X7dLpgW1vTjsHzTECB5m2qzWlXHRdueAk8sKv7wyHqv9jw==} - cpu: [x64] - os: [darwin] - - turbo-darwin-arm64@2.8.2: - resolution: {integrity: sha512-J3zoDkf+k9yozdJmdNUOc9YfIoFs01Zm+GgNyfY8pU6siMWlPlgdt+3ezbIMeOns6CAQUzUcqo9awowykAS9Vw==} - cpu: [arm64] - os: [darwin] - - turbo-linux-64@2.8.2: - resolution: {integrity: sha512-iVYUM+tyNAPd34HhMSjYWi7OSXnxnDhPjFKVvzSb7cZmQS6GlDSr7MALc5Wt/zn6/7jm1FuS7c5Wffg9WD2e1Q==} - cpu: [x64] - os: [linux] - - turbo-linux-arm64@2.8.2: - resolution: {integrity: sha512-v7FJAHUhY2nSEE87mr5ZBO51GmsFKp0EmK2P6rO+vGimCPmnGlLNj1at/eVcnp/cHRDnJj8J+b3QHWdUzTPTkg==} - cpu: [arm64] - os: [linux] - - turbo-windows-64@2.8.2: - resolution: {integrity: sha512-d1X+U5JLhyAse0VXM0rpmu6iLbBTAvjwc7MX0PBkEaTz2aZQqOHBpQkkrxia7bZzRNbfXHbGSqY/vbE3GSFWzw==} - cpu: [x64] - os: [win32] - - turbo-windows-arm64@2.8.2: - resolution: {integrity: sha512-fMln07/l/5kscs79V0kTwdf17gkZW+E2iyqnzz691gLM7Jf6la0afd3IMsNtLzUh+dxKIFCswNiFVmHe8g+2jA==} - cpu: [arm64] - os: [win32] - - turbo@2.8.2: - resolution: {integrity: sha512-biW/S5hENCcJ5vxxJszCozEKcXtwGK29vxXzNbdfY/0q7QpYTCoyKdj0e8k/ADA6qkqaKDJwgrrHbC8Vy6wszg==} - hasBin: true - type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} @@ -10558,10 +10467,6 @@ packages: resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} engines: {node: '>=4'} - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -12479,6 +12384,39 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} + '@moonrepo/cli@2.5.6': + dependencies: + detect-libc: 2.1.2 + optionalDependencies: + '@moonrepo/core-linux-arm64-gnu': 2.5.6 + '@moonrepo/core-linux-arm64-musl': 2.5.6 + '@moonrepo/core-linux-x64-gnu': 2.5.6 + '@moonrepo/core-linux-x64-musl': 2.5.6 + '@moonrepo/core-macos-arm64': 2.5.6 + '@moonrepo/core-macos-x64': 2.5.6 + '@moonrepo/core-windows-x64-msvc': 2.5.6 + + '@moonrepo/core-linux-arm64-gnu@2.5.6': + optional: true + + '@moonrepo/core-linux-arm64-musl@2.5.6': + optional: true + + '@moonrepo/core-linux-x64-gnu@2.5.6': + optional: true + + '@moonrepo/core-linux-x64-musl@2.5.6': + optional: true + + '@moonrepo/core-macos-arm64@2.5.6': + optional: true + + '@moonrepo/core-macos-x64@2.5.6': + optional: true + + '@moonrepo/core-windows-x64-msvc@2.5.6': + optional: true + '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.8.1 @@ -15857,8 +15795,6 @@ snapshots: chownr@3.0.0: {} - ci-info@2.0.0: {} - ci-info@4.4.0: {} citty@0.1.6: @@ -16004,14 +15940,6 @@ snapshots: croner@9.1.0: {} - cross-spawn@6.0.6: - dependencies: - nice-try: 1.0.5 - path-key: 2.0.1 - semver: 5.7.2 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -16233,8 +16161,6 @@ snapshots: dependencies: type-fest: 5.4.3 - dotenv@16.0.3: {} - dotenv@16.6.1: {} dotenv@17.2.3: {} @@ -16282,6 +16208,7 @@ snapshots: end-of-stream@1.4.5: dependencies: once: 1.4.0 + optional: true enhanced-resolve@5.19.0: dependencies: @@ -16630,18 +16557,6 @@ snapshots: - supports-color - typescript - eslint-plugin-turbo@2.8.2(eslint@9.39.2(jiti@1.21.7))(turbo@2.8.2): - dependencies: - dotenv: 16.0.3 - eslint: 9.39.2(jiti@1.21.7) - turbo: 2.8.2 - - eslint-plugin-turbo@2.8.2(eslint@9.39.2(jiti@2.6.1))(turbo@2.8.2): - dependencies: - dotenv: 16.0.3 - eslint: 9.39.2(jiti@2.6.1) - turbo: 2.8.2 - eslint-plugin-unicorn@55.0.0(eslint@9.39.2(jiti@1.21.7)): dependencies: '@babel/helper-validator-identifier': 7.28.5 @@ -16899,16 +16814,6 @@ snapshots: events@3.3.0: {} - execa@1.0.0: - dependencies: - cross-spawn: 6.0.6 - get-stream: 4.1.0 - is-stream: 1.1.0 - npm-run-path: 2.0.2 - p-finally: 1.0.0 - signal-exit: 3.0.7 - strip-eof: 1.0.0 - execa@8.0.1: dependencies: cross-spawn: 7.0.6 @@ -17110,10 +17015,6 @@ snapshots: dunder-proto: 1.0.1 es-object-atoms: 1.1.1 - get-stream@4.1.0: - dependencies: - pump: 3.0.3 - get-stream@8.0.1: {} get-tsconfig@4.13.1: @@ -17532,11 +17433,6 @@ snapshots: ieee754@1.2.1: {} - if-ci@3.0.0: - dependencies: - execa: 1.0.0 - is-ci: 2.0.0 - ignore@5.3.2: {} ignore@7.0.5: {} @@ -17634,10 +17530,6 @@ snapshots: dependencies: builtin-modules: 3.3.0 - is-ci@2.0.0: - dependencies: - ci-info: 2.0.0 - is-core-module@2.16.1: dependencies: hasown: 2.0.2 @@ -17702,8 +17594,6 @@ snapshots: dependencies: protocols: 2.0.2 - is-stream@1.1.0: {} - is-stream@2.0.1: {} is-stream@3.0.0: {} @@ -18749,8 +18639,6 @@ snapshots: neotraverse@0.6.18: {} - nice-try@1.0.5: {} - nitropack@2.13.1(rolldown@1.0.0-rc.12)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.4.2 @@ -18902,10 +18790,6 @@ snapshots: normalize-path@3.0.0: {} - npm-run-path@2.0.2: - dependencies: - path-key: 2.0.1 - npm-run-path@5.3.0: dependencies: path-key: 4.0.0 @@ -19076,6 +18960,7 @@ snapshots: once@1.4.0: dependencies: wrappy: 1.0.2 + optional: true onetime@6.0.0: dependencies: @@ -19182,8 +19067,6 @@ snapshots: magic-regexp: 0.10.0 oxc-parser: 0.102.0 - p-finally@1.0.0: {} - p-limit@2.3.0: dependencies: p-try: 2.2.0 @@ -19298,8 +19181,6 @@ snapshots: path-exists@4.0.0: {} - path-key@2.0.1: {} - path-key@3.1.1: {} path-key@4.0.0: {} @@ -19764,6 +19645,7 @@ snapshots: dependencies: end-of-stream: 1.4.5 once: 1.4.0 + optional: true punycode.js@2.3.1: {} @@ -20373,16 +20255,10 @@ snapshots: '@img/sharp-win32-ia32': 0.35.2 '@img/sharp-win32-x64': 0.35.2 - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} shell-quote@1.8.3: {} @@ -20437,8 +20313,6 @@ snapshots: side-channel-map: 1.0.1 side-channel-weakmap: 1.0.2 - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} simple-concat@1.0.1: @@ -20631,8 +20505,6 @@ snapshots: strip-bom-string@1.0.0: {} - strip-eof@1.0.0: {} - strip-final-newline@3.0.0: {} strip-indent@3.0.0: @@ -20919,33 +20791,6 @@ snapshots: safe-buffer: 5.2.1 optional: true - turbo-darwin-64@2.8.2: - optional: true - - turbo-darwin-arm64@2.8.2: - optional: true - - turbo-linux-64@2.8.2: - optional: true - - turbo-linux-arm64@2.8.2: - optional: true - - turbo-windows-64@2.8.2: - optional: true - - turbo-windows-arm64@2.8.2: - optional: true - - turbo@2.8.2: - optionalDependencies: - turbo-darwin-64: 2.8.2 - turbo-darwin-arm64: 2.8.2 - turbo-linux-64: 2.8.2 - turbo-linux-arm64: 2.8.2 - turbo-windows-64: 2.8.2 - turbo-windows-arm64: 2.8.2 - type-check@0.4.0: dependencies: prelude-ls: 1.2.1 @@ -21749,10 +21594,6 @@ snapshots: which-pm-runs@1.1.0: {} - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -21840,7 +21681,8 @@ snapshots: string-width: 7.2.0 strip-ansi: 7.1.2 - wrappy@1.0.2: {} + wrappy@1.0.2: + optional: true ws@8.18.0: {} diff --git a/scripts/moon.yml b/scripts/moon.yml new file mode 100644 index 00000000000..6581e276a0b --- /dev/null +++ b/scripts/moon.yml @@ -0,0 +1,50 @@ +$schema: 'https://moonrepo.dev/schemas/project.json' + +tasks: + i18n-coverage: + command: 'pnpm run i18n:coverage' + inputs: + - '/package.json' + - '/scripts/run.mjs' + - '/scripts/coverage-i18n.ts' + - '/scripts/i18n-icu-contract.ts' + - '/apps/app-frontend/src/**/*.vue' + - '/apps/app-frontend/src/locales/**/*.json' + - '/apps/frontend/src/**/*.vue' + - '/apps/frontend/src/locales/**/*.json' + - '/packages/moderation/src/**/*.vue' + - '/packages/moderation/src/locales/**/*.json' + - '/packages/ui/src/**/*.vue' + - '/packages/ui/src/locales/**/*.json' + outputs: + - '/packages/ui/src/layouts/wrapped/settings/language-settings/language-settings-coverage.generated.ts' + options: + runFromWorkspaceRoot: true + + typos: + command: 'typos' + inputs: + - '/**/*' + options: + runFromWorkspaceRoot: true + + tombi: + script: 'tombi lint && tombi fmt --check' + inputs: + - '/**/*.toml' + options: + runFromWorkspaceRoot: true + + shear: + command: 'cargo shear' + inputs: + - '/**/Cargo.toml' + - '/**/*.rs' + options: + runFromWorkspaceRoot: true + + lint: + deps: + - 'typos' + - 'tombi' + - 'shear' diff --git a/turbo.jsonc b/turbo.jsonc deleted file mode 100644 index 81459cc8b00..00000000000 --- a/turbo.jsonc +++ /dev/null @@ -1,118 +0,0 @@ -{ - "$schema": "./node_modules/turbo/schema.json", - "concurrency": "100%", - "globalDependencies": [ - "packages/tooling-config/**", - "!packages/tooling-config/.turbo/**", - "!packages/tooling-config/node_modules/**", - "packages/app-lib/.env" - ], - "globalEnv": [ - "MODRINTH_URL", - "MODRINTH_API_BASE_URL", - "SHARED_INSTANCES_API_BASE_URL", - "MODRINTH_ARCHON_BASE_URL", - "VITE_STRIPE_PUBLISHABLE_KEY" - ], - "tasks": { - "build": { - "dependsOn": ["//#i18n:coverage", "^build"], - "inputs": ["$TURBO_DEFAULT$", ".env*"], - "outputs": [".nuxt/**", "dist/**", ".output/**"], - "env": [ - "NODE_ENV", - "SITE_URL", - "BASE_URL", - "PREVIEW", - "BUILD_ENV", - "FLAG_OVERRIDES", - "BROWSER_BASE_URL", - "RATE_LIMIT_IGNORE_KEY", - "VERCEL_*", - "CF_PAGES_*", - "HEROKU_APP_NAME", - "STRIPE_PUBLISHABLE_KEY", - "INTERCOM_APP_ID", - "INTERCOM_IDENTITY_SECRET", - "PYRO_BASE_URL", - "PROD_OVERRIDE", - "PYRO_MASTER_KEY", - "PORT", - "SQLX_OFFLINE", - "DATABASE_URL", - "CARGO_*", - "RUST_*", - "RUSTFLAGS", - "FORCE_COLOR", - "NEXTEST_*", - "BUILD_ENV", - "PREVIEW" - ], - "passThroughEnv": ["SCCACHE_*", "RUSTC_WRAPPER", "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"] - }, - "lint": { - "env": [ - "DATABASE_URL", - "SQLX_OFFLINE", - "CARGO_*", - "RUST_*", - "RUSTFLAGS", - "FORCE_COLOR", - "NEXTEST_*" - ], - "passThroughEnv": ["SCCACHE_*", "RUSTC_WRAPPER", "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"] - }, - "lint:ancillary": {}, - "//#i18n:coverage": { - "inputs": [ - "package.json", - "scripts/run.mjs", - "scripts/coverage-i18n.ts", - "scripts/i18n-icu-contract.ts", - "apps/app-frontend/src/**/*.vue", - "apps/app-frontend/src/locales/**/*.json", - "apps/frontend/src/**/*.vue", - "apps/frontend/src/locales/**/*.json", - "packages/moderation/src/**/*.vue", - "packages/moderation/src/locales/**/*.json", - "packages/ui/src/**/*.vue", - "packages/ui/src/locales/**/*.json" - ], - "outputs": [ - "packages/ui/src/layouts/wrapped/settings/language-settings/language-settings-coverage.generated.ts" - ] - }, - "dev": { - "cache": false, - "persistent": true, - "inputs": ["$TURBO_DEFAULT$", ".env*"], - "env": ["CARGO_*", "RUST_*", "RUSTFLAGS", "FORCE_COLOR", "NEXTEST_*"], - "passThroughEnv": ["DISPLAY", "WEBKIT_DISABLE_DMABUF_RENDERER", "JAVA_HOME"] - }, - "test": { - "env": [ - "SQLX_OFFLINE", - "DATABASE_URL", - "REDIS_*", - "CARGO_*", - "RUST_*", - "RUSTFLAGS", - "FORCE_COLOR", - "NEXTEST_*" - ], - "passThroughEnv": ["SCCACHE_*", "RUSTC_WRAPPER", "AWS_ACCESS_KEY_ID", "AWS_SECRET_ACCESS_KEY"] - }, - "fix": {}, - "fix:ancillary": { - "cache": false - }, - "intl:extract": {}, - "intl:prune-local": { - "cache": false, - "dependsOn": ["intl:extract"] - }, - "prepr": { - "dependsOn": ["^prepr", "fix", "intl:extract", "intl:prune-local"] - } - } -} From a8f174fbdfad75146d5c6287a22a9ce625e0ebcc Mon Sep 17 00:00:00 2001 From: "Michael H." Date: Tue, 6 Oct 2026 19:44:10 +0200 Subject: [PATCH 2/7] fix: remove shallow clone to make moon happy --- .github/workflows/ci.yml | 7 +++++-- .github/workflows/frontend-docker.yml | 2 ++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index aca71be4e33..995091cd5d8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,13 +45,16 @@ jobs: if: env.INTERNAL != 'true' uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: - fetch-depth: 2 + # moon compares against main in CI, which needs full history. + # Skipping blobs keeps the clone small on GitHub-hosted runners + fetch-depth: 0 + filter: blob:none - name: Check out code (Namespace) if: env.INTERNAL == 'true' uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 with: - fetch-depth: 2 + fetch-depth: 0 - name: Setup Node and caches uses: ./.github/actions/setup diff --git a/.github/workflows/frontend-docker.yml b/.github/workflows/frontend-docker.yml index f7739f77e52..109e87388b6 100644 --- a/.github/workflows/frontend-docker.yml +++ b/.github/workflows/frontend-docker.yml @@ -29,6 +29,8 @@ jobs: steps: - name: Checkout code uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 + with: + fetch-depth: 0 - name: Configure environment id: meta From 731e85b53d650d3391db7b3642166e4f54c4ea64 Mon Sep 17 00:00:00 2001 From: "Michael H." Date: Tue, 6 Oct 2026 19:56:27 +0200 Subject: [PATCH 3/7] add moon debug logging --- .github/actions/setup/action.yml | 4 ++++ .github/workflows/api-client-release.yml | 1 + .github/workflows/ci.yml | 5 +++++ .github/workflows/frontend-deploy.yml | 1 + .github/workflows/frontend-docker.yml | 1 + .github/workflows/frontend-preview.yml | 1 + .github/workflows/i18n-pull.yml | 1 + .github/workflows/i18n-push.yml | 1 + .github/workflows/rust-docker.yml | 2 ++ .github/workflows/theseus-build.yml | 1 + .github/workflows/theseus-release.yml | 1 + 11 files changed, 19 insertions(+) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index fbb1fe7359b..1cd2cd3eeb5 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -21,6 +21,10 @@ runs: shell: bash run: corepack enable + - name: Force colored moon output + shell: bash + run: echo "MOON_COLOR=3" >> "$GITHUB_ENV" + - name: Set up caches if: inputs.namespace == 'true' uses: namespacelabs/nscloud-cache-action@c5f8dab7560444c4bf8dbc64f1b203431873c547 # v1.6.1 diff --git a/.github/workflows/api-client-release.yml b/.github/workflows/api-client-release.yml index 222aab6f051..ab3944d6292 100644 --- a/.github/workflows/api-client-release.yml +++ b/.github/workflows/api-client-release.yml @@ -28,6 +28,7 @@ jobs: steps: - name: Check out code uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + timeout-minutes: 2 with: fetch-depth: 0 diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 995091cd5d8..07a60eba84e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -44,6 +44,7 @@ jobs: - name: Check out code if: env.INTERNAL != 'true' uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + timeout-minutes: 2 with: # moon compares against main in CI, which needs full history. # Skipping blobs keeps the clone small on GitHub-hosted runners @@ -53,6 +54,7 @@ jobs: - name: Check out code (Namespace) if: env.INTERNAL == 'true' uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 + timeout-minutes: 2 with: fetch-depth: 0 @@ -124,6 +126,9 @@ jobs: - name: Lint and test run: pnpm run ci + env: + # "Re-run jobs" with debug logging enabled also turns on moon's debug output + MOON_LOG: ${{ runner.debug == '1' && 'debug' || 'info' }} - name: Verify intl:extract has been run run: | diff --git a/.github/workflows/frontend-deploy.yml b/.github/workflows/frontend-deploy.yml index 6cbca819159..d81288a049b 100644 --- a/.github/workflows/frontend-deploy.yml +++ b/.github/workflows/frontend-deploy.yml @@ -48,6 +48,7 @@ jobs: steps: - name: Checkout code uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 + timeout-minutes: 2 with: fetch-depth: 0 dissociate: true diff --git a/.github/workflows/frontend-docker.yml b/.github/workflows/frontend-docker.yml index 109e87388b6..0e560d34540 100644 --- a/.github/workflows/frontend-docker.yml +++ b/.github/workflows/frontend-docker.yml @@ -29,6 +29,7 @@ jobs: steps: - name: Checkout code uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 + timeout-minutes: 2 with: fetch-depth: 0 diff --git a/.github/workflows/frontend-preview.yml b/.github/workflows/frontend-preview.yml index 26ba39be53f..7d132fa2b8c 100644 --- a/.github/workflows/frontend-preview.yml +++ b/.github/workflows/frontend-preview.yml @@ -50,6 +50,7 @@ jobs: steps: - name: Checkout code uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 + timeout-minutes: 2 - name: Setup Node and caches uses: ./.github/actions/setup diff --git a/.github/workflows/i18n-pull.yml b/.github/workflows/i18n-pull.yml index 98746e73cc0..a22274fd0af 100644 --- a/.github/workflows/i18n-pull.yml +++ b/.github/workflows/i18n-pull.yml @@ -56,6 +56,7 @@ jobs: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + timeout-minutes: 2 with: ref: ${{ github.ref }} token: ${{ secrets.CROWDIN_GH_TOKEN }} diff --git a/.github/workflows/i18n-push.yml b/.github/workflows/i18n-push.yml index 253c75dfb7c..a4c55d5e7b0 100644 --- a/.github/workflows/i18n-push.yml +++ b/.github/workflows/i18n-push.yml @@ -57,6 +57,7 @@ jobs: - name: Checkout uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + timeout-minutes: 2 with: ref: ${{ github.ref }} fetch-depth: 2 diff --git a/.github/workflows/rust-docker.yml b/.github/workflows/rust-docker.yml index 2bb1dcb995c..ce4defbb6c5 100644 --- a/.github/workflows/rust-docker.yml +++ b/.github/workflows/rust-docker.yml @@ -51,10 +51,12 @@ jobs: - name: Check out code if: env.INTERNAL != 'true' uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + timeout-minutes: 2 - name: Check out code (Namespace) if: env.INTERNAL == 'true' uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 + timeout-minutes: 2 - name: Setup Rust toolchain uses: actions-rust-lang/setup-rust-toolchain@166cdcfd11aee3cb47222f9ddb555ce30ddb9659 # v1.17.0 diff --git a/.github/workflows/theseus-build.yml b/.github/workflows/theseus-build.yml index 7f86d3d6d75..8f94af3f2bc 100644 --- a/.github/workflows/theseus-build.yml +++ b/.github/workflows/theseus-build.yml @@ -67,6 +67,7 @@ jobs: steps: - name: Check out code uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 + timeout-minutes: 2 with: fetch-depth: 0 diff --git a/.github/workflows/theseus-release.yml b/.github/workflows/theseus-release.yml index 3fd848384eb..7ef9ef3c879 100644 --- a/.github/workflows/theseus-release.yml +++ b/.github/workflows/theseus-release.yml @@ -26,6 +26,7 @@ jobs: steps: - name: Check out code uses: namespacelabs/nscloud-checkout-action@66f2dc6f6c42a8ac6c4e53473c4840006822831e # v9.0.1 + timeout-minutes: 2 - name: Verify ref is a tag env: From b1d3537d3f0187c7c3ef4b6413df951bfb555999 Mon Sep 17 00:00:00 2001 From: "Michael H." Date: Tue, 6 Oct 2026 20:50:03 +0200 Subject: [PATCH 4/7] merge labrinth integration tests into one binary --- .cargo/moon.yml | 7 +++++- apps/labrinth/Cargo.toml | 6 +++++ apps/labrinth/tests/error.rs | 2 +- apps/labrinth/tests/games.rs | 2 +- apps/labrinth/tests/limits.rs | 2 +- apps/labrinth/tests/loader_fields.rs | 2 +- apps/labrinth/tests/{v2_tests.rs => main.rs} | 24 ++++++++++++++++++++ apps/labrinth/tests/moderation_lock.rs | 2 +- apps/labrinth/tests/moderation_notes.rs | 2 +- apps/labrinth/tests/notifications.rs | 2 +- apps/labrinth/tests/oauth.rs | 2 +- apps/labrinth/tests/oauth_clients.rs | 2 +- apps/labrinth/tests/organizations.rs | 2 +- apps/labrinth/tests/pats.rs | 2 +- apps/labrinth/tests/project.rs | 2 +- apps/labrinth/tests/redis.rs | 2 +- apps/labrinth/tests/scopes.rs | 2 +- apps/labrinth/tests/search.rs | 2 +- apps/labrinth/tests/tags.rs | 2 +- apps/labrinth/tests/teams.rs | 2 +- apps/labrinth/tests/user.rs | 2 +- apps/labrinth/tests/v2/error.rs | 1 - apps/labrinth/tests/v2/project.rs | 21 ++++++++--------- apps/labrinth/tests/v2/search.rs | 1 - apps/labrinth/tests/v2/teams.rs | 17 ++++++-------- apps/labrinth/tests/v2/version.rs | 1 - apps/labrinth/tests/version.rs | 2 +- 27 files changed, 71 insertions(+), 45 deletions(-) rename apps/labrinth/tests/{v2_tests.rs => main.rs} (52%) diff --git a/.cargo/moon.yml b/.cargo/moon.yml index ce8867c3b30..af8171f2b7e 100644 --- a/.cargo/moon.yml +++ b/.cargo/moon.yml @@ -4,7 +4,8 @@ $schema: 'https://moonrepo.dev/schemas/project.json' # crate. Separate per-crate cargo invocations resolve different feature sets and # recompile shared dependencies for each crate, while waiting on each other's # build directory lock. All Rust test tasks use identical cargo arguments so they -# share build artifacts, and only differ in the nextest filter. +# share build artifacts, and only differ in the nextest filter. Clippy uses its +# own target directory so it doesn't wait on the test build's lock in CI. workspace: inheritedTasks: @@ -43,6 +44,8 @@ tasks: - 'app-frontend:build' inputs: - '@group(rust)' + env: + CARGO_TARGET_DIR: 'target/clippy' options: runFromWorkspaceRoot: true @@ -53,6 +56,8 @@ tasks: cargo fmt --all deps: - 'app-frontend:build' + env: + CARGO_TARGET_DIR: 'target/clippy' options: cache: false runInCI: false diff --git a/apps/labrinth/Cargo.toml b/apps/labrinth/Cargo.toml index 49511942cca..9152a7eb94f 100644 --- a/apps/labrinth/Cargo.toml +++ b/apps/labrinth/Cargo.toml @@ -4,12 +4,18 @@ version = "2.7.0" edition.workspace = true license = "AGPL-3.0-only" default-run = "labrinth" +# Integration tests are compiled into a single binary, see tests/main.rs +autotests = false # This seems redundant, but it's necessary for Docker to work [[bin]] name = "labrinth" path = "src/main.rs" +[[test]] +name = "integration" +path = "tests/main.rs" + [dependencies] actix-cors = { workspace = true } actix-files = { workspace = true } diff --git a/apps/labrinth/tests/error.rs b/apps/labrinth/tests/error.rs index 5f53a78dfae..8bd2abfc957 100644 --- a/apps/labrinth/tests/error.rs +++ b/apps/labrinth/tests/error.rs @@ -7,7 +7,7 @@ use common::api_v3::ApiV3; use common::database::USER_USER_PAT; use common::environment::{TestEnvironment, with_test_environment}; -pub mod common; +use crate::common; #[actix_rt::test] pub async fn error_404_body() { diff --git a/apps/labrinth/tests/games.rs b/apps/labrinth/tests/games.rs index 449f0035d06..3199151c7cd 100644 --- a/apps/labrinth/tests/games.rs +++ b/apps/labrinth/tests/games.rs @@ -5,7 +5,7 @@ use common::{ environment::{TestEnvironment, with_test_environment}, }; -pub mod common; +use crate::common; #[actix_rt::test] async fn get_games() { diff --git a/apps/labrinth/tests/limits.rs b/apps/labrinth/tests/limits.rs index 5ec590d4382..d5bc3a96078 100644 --- a/apps/labrinth/tests/limits.rs +++ b/apps/labrinth/tests/limits.rs @@ -15,7 +15,7 @@ use serde_json::Value; use crate::common::api_common::{ApiProject, ApiUser, ApiVersion}; use crate::common::api_v3::request_data::get_public_project_creation_data; -pub mod common; +use crate::common; async fn set_project_daily_limit(pool: &PgPool, projects_per_day: u64) { let defaults = DBUserLimits::get_defaults(pool).await.unwrap(); diff --git a/apps/labrinth/tests/loader_fields.rs b/apps/labrinth/tests/loader_fields.rs index 4e5f30bb456..c49552eef62 100644 --- a/apps/labrinth/tests/loader_fields.rs +++ b/apps/labrinth/tests/loader_fields.rs @@ -25,7 +25,7 @@ use crate::common::dummy_data::{ DummyProjectAlpha, DummyProjectBeta, TestFile, }; -pub mod common; +use crate::common; #[actix_rt::test] diff --git a/apps/labrinth/tests/v2_tests.rs b/apps/labrinth/tests/main.rs similarity index 52% rename from apps/labrinth/tests/v2_tests.rs rename to apps/labrinth/tests/main.rs index f1fb05caefb..24397cc18a2 100644 --- a/apps/labrinth/tests/v2_tests.rs +++ b/apps/labrinth/tests/main.rs @@ -1,5 +1,29 @@ +//! All integration tests compile into this single binary, since linking a separate +//! test binary per file against all of labrinth's dependencies is slow. + +#[macro_use] pub mod common; +mod error; +mod games; +mod limits; +mod loader_fields; +mod moderation_lock; +mod moderation_notes; +mod notifications; +mod oauth; +mod oauth_clients; +mod organizations; +mod pats; +mod project; +mod redis; +mod scopes; +mod search; +mod tags; +mod teams; +mod user; +mod version; + // Not all tests expect exactly the same functionality in v2 and v3. // For example, though we expect the /GET version to return the corresponding project, // we may want to do different checks for each. diff --git a/apps/labrinth/tests/moderation_lock.rs b/apps/labrinth/tests/moderation_lock.rs index db73082d5f5..3b94f7f569f 100644 --- a/apps/labrinth/tests/moderation_lock.rs +++ b/apps/labrinth/tests/moderation_lock.rs @@ -14,7 +14,7 @@ use serde_json::{Value, json}; use std::sync::Arc; use tokio::sync::Barrier; -pub mod common; +use crate::common; /// Force a project into `processing` status directly in the database. /// Clears the Redis project row so `DBProject::get` used by PATCH sees the new status. diff --git a/apps/labrinth/tests/moderation_notes.rs b/apps/labrinth/tests/moderation_notes.rs index 28194dcc9bf..9b21b1a734d 100644 --- a/apps/labrinth/tests/moderation_notes.rs +++ b/apps/labrinth/tests/moderation_notes.rs @@ -7,7 +7,7 @@ use common::{ }; use serde_json::{Value, json}; -pub mod common; +use crate::common; #[actix_rt::test] pub async fn moderation_notes_users() { diff --git a/apps/labrinth/tests/notifications.rs b/apps/labrinth/tests/notifications.rs index d4d6ce65981..541eef1e7c8 100644 --- a/apps/labrinth/tests/notifications.rs +++ b/apps/labrinth/tests/notifications.rs @@ -5,7 +5,7 @@ use common::{ use crate::common::api_common::ApiTeams; -pub mod common; +use crate::common; #[actix_rt::test] pub async fn get_user_notifications_after_team_invitation_returns_notification() diff --git a/apps/labrinth/tests/oauth.rs b/apps/labrinth/tests/oauth.rs index ee4d537458a..c854179bb58 100644 --- a/apps/labrinth/tests/oauth.rs +++ b/apps/labrinth/tests/oauth.rs @@ -16,7 +16,7 @@ use common::{ }; use labrinth::auth::oauth::TokenResponse; -pub mod common; +use crate::common; #[actix_rt::test] async fn oauth_flow_happy_path() { diff --git a/apps/labrinth/tests/oauth_clients.rs b/apps/labrinth/tests/oauth_clients.rs index 8dd8604c5a0..d4c7678da15 100644 --- a/apps/labrinth/tests/oauth_clients.rs +++ b/apps/labrinth/tests/oauth_clients.rs @@ -17,7 +17,7 @@ use labrinth::{ use common::database::USER_USER_ID_PARSED; -pub mod common; +use crate::common; #[actix_rt::test] async fn can_create_edit_get_oauth_client() { diff --git a/apps/labrinth/tests/organizations.rs b/apps/labrinth/tests/organizations.rs index 193305eb7e0..946dc7d2657 100644 --- a/apps/labrinth/tests/organizations.rs +++ b/apps/labrinth/tests/organizations.rs @@ -22,7 +22,7 @@ use common::{ use labrinth::models::teams::{OrganizationPermissions, ProjectPermissions}; use serde_json::json; -pub mod common; +use crate::common; #[actix_rt::test] async fn create_organization() { diff --git a/apps/labrinth/tests/pats.rs b/apps/labrinth/tests/pats.rs index 8ea02592207..939c0083a73 100644 --- a/apps/labrinth/tests/pats.rs +++ b/apps/labrinth/tests/pats.rs @@ -8,7 +8,7 @@ use serde_json::json; use crate::common::api_common::AppendsOptionalPat; -pub mod common; +use crate::common; // Full pat test: // - create a PAT and ensure it can be used for the scope diff --git a/apps/labrinth/tests/project.rs b/apps/labrinth/tests/project.rs index a86def9e787..1e3e768d180 100644 --- a/apps/labrinth/tests/project.rs +++ b/apps/labrinth/tests/project.rs @@ -33,7 +33,7 @@ use serde_json::json; use sha1::Digest; use xredis::RedisValue; -pub mod common; +use crate::common; #[actix_rt::test] async fn test_get_project() { diff --git a/apps/labrinth/tests/redis.rs b/apps/labrinth/tests/redis.rs index 607a3836a0c..d56c9916c4a 100644 --- a/apps/labrinth/tests/redis.rs +++ b/apps/labrinth/tests/redis.rs @@ -24,7 +24,7 @@ use tokio::time::timeout; use uuid::Uuid; use xredis::{KeyBuilder, RedisPool, RedisTopology, RedisValue}; -pub mod common; +use crate::common; async fn isolated_redis_pool(label: &str) -> RedisPool { labrinth::env::init().expect("failed to initialize test environment"); diff --git a/apps/labrinth/tests/scopes.rs b/apps/labrinth/tests/scopes.rs index aa609285f58..75af3b907e6 100644 --- a/apps/labrinth/tests/scopes.rs +++ b/apps/labrinth/tests/scopes.rs @@ -30,7 +30,7 @@ use serde_json::json; // - test the function with the PAT with the given scopes // - test the function with the PAT with all other scopes -pub mod common; +use crate::common; // Test for users, emails, and payout scopes (not user auth scope or notifs) #[actix_rt::test] diff --git a/apps/labrinth/tests/search.rs b/apps/labrinth/tests/search.rs index f583d4a3875..ce3c48217d8 100644 --- a/apps/labrinth/tests/search.rs +++ b/apps/labrinth/tests/search.rs @@ -15,7 +15,7 @@ use serde_json::json; use crate::common::api_common::Api; use crate::common::api_common::ApiProject; -pub mod common; +use crate::common; // TODO: Revisit this wit h the new modify_json in the version maker // That change here should be able to simplify it vastly diff --git a/apps/labrinth/tests/tags.rs b/apps/labrinth/tests/tags.rs index d1e6ba26675..f0ff6de15a6 100644 --- a/apps/labrinth/tests/tags.rs +++ b/apps/labrinth/tests/tags.rs @@ -9,7 +9,7 @@ use common::{ use crate::common::api_common::ApiTags; -pub mod common; +use crate::common; #[actix_rt::test] async fn get_tags() { diff --git a/apps/labrinth/tests/teams.rs b/apps/labrinth/tests/teams.rs index c94f4ac3f88..9abcbab1764 100644 --- a/apps/labrinth/tests/teams.rs +++ b/apps/labrinth/tests/teams.rs @@ -10,7 +10,7 @@ use labrinth::models::teams::{OrganizationPermissions, ProjectPermissions}; use rust_decimal::Decimal; use serde_json::json; -pub mod common; +use crate::common; #[actix_rt::test] async fn test_get_team() { diff --git a/apps/labrinth/tests/user.rs b/apps/labrinth/tests/user.rs index 6286343cd64..e24cb0e05f4 100644 --- a/apps/labrinth/tests/user.rs +++ b/apps/labrinth/tests/user.rs @@ -12,7 +12,7 @@ use common::{ }; use labrinth::test::api_v3::ApiV3; -pub mod common; +use crate::common; #[actix_rt::test] async fn discord_lookup_requires_admin_and_returns_public_user() { diff --git a/apps/labrinth/tests/v2/error.rs b/apps/labrinth/tests/v2/error.rs index 8cafa91ab03..4195b859b98 100644 --- a/apps/labrinth/tests/v2/error.rs +++ b/apps/labrinth/tests/v2/error.rs @@ -4,7 +4,6 @@ use actix_http::StatusCode; use actix_web::test; use bytes::Bytes; -use crate::assert_status; use crate::common::database::USER_USER_PAT; use crate::common::{ api_v2::ApiV2, diff --git a/apps/labrinth/tests/v2/project.rs b/apps/labrinth/tests/v2/project.rs index 07074886b41..f0a2aabe018 100644 --- a/apps/labrinth/tests/v2/project.rs +++ b/apps/labrinth/tests/v2/project.rs @@ -1,18 +1,15 @@ use std::sync::Arc; -use crate::{ - assert_status, - common::{ - api_common::{ApiProject, ApiVersion, AppendsOptionalPat}, - api_v2::{ApiV2, request_data::get_public_project_creation_data_json}, - database::{ - ADMIN_USER_PAT, FRIEND_USER_ID, FRIEND_USER_PAT, USER_USER_PAT, - generate_random_name, - }, - dummy_data::TestFile, - environment::{TestEnvironment, with_test_environment}, - permissions::{PermissionsTest, PermissionsTestContext}, +use crate::common::{ + api_common::{ApiProject, ApiVersion, AppendsOptionalPat}, + api_v2::{ApiV2, request_data::get_public_project_creation_data_json}, + database::{ + ADMIN_USER_PAT, FRIEND_USER_ID, FRIEND_USER_PAT, USER_USER_PAT, + generate_random_name, }, + dummy_data::TestFile, + environment::{TestEnvironment, with_test_environment}, + permissions::{PermissionsTest, PermissionsTestContext}, }; use actix_http::StatusCode; use actix_web::test; diff --git a/apps/labrinth/tests/v2/search.rs b/apps/labrinth/tests/v2/search.rs index f16b0ee20a9..ffb622e7ed2 100644 --- a/apps/labrinth/tests/v2/search.rs +++ b/apps/labrinth/tests/v2/search.rs @@ -1,4 +1,3 @@ -use crate::assert_status; use crate::common::api_common::Api; use crate::common::api_common::ApiProject; use crate::common::api_common::ApiVersion; diff --git a/apps/labrinth/tests/v2/teams.rs b/apps/labrinth/tests/v2/teams.rs index e83c4d8c0ac..44b9c266265 100644 --- a/apps/labrinth/tests/v2/teams.rs +++ b/apps/labrinth/tests/v2/teams.rs @@ -2,17 +2,14 @@ use actix_http::StatusCode; use labrinth::models::teams::ProjectPermissions; use serde_json::json; -use crate::{ - assert_status, - common::{ - api_common::ApiTeams, - api_v2::ApiV2, - database::{ - FRIEND_USER_ID, FRIEND_USER_ID_PARSED, FRIEND_USER_PAT, - USER_USER_ID_PARSED, USER_USER_PAT, - }, - environment::{TestEnvironment, with_test_environment}, +use crate::common::{ + api_common::ApiTeams, + api_v2::ApiV2, + database::{ + FRIEND_USER_ID, FRIEND_USER_ID_PARSED, FRIEND_USER_PAT, + USER_USER_ID_PARSED, USER_USER_PAT, }, + environment::{TestEnvironment, with_test_environment}, }; // transfer ownership (requires being owner, etc) diff --git a/apps/labrinth/tests/v2/version.rs b/apps/labrinth/tests/v2/version.rs index a4d6c70f1fb..5626a31d63d 100644 --- a/apps/labrinth/tests/v2/version.rs +++ b/apps/labrinth/tests/v2/version.rs @@ -1,4 +1,3 @@ -use crate::assert_status; use crate::common::api_common::{ApiProject, ApiVersion}; use crate::common::api_v2::ApiV2; use actix_http::StatusCode; diff --git a/apps/labrinth/tests/version.rs b/apps/labrinth/tests/version.rs index 19ab8fab796..75b93689aeb 100644 --- a/apps/labrinth/tests/version.rs +++ b/apps/labrinth/tests/version.rs @@ -26,7 +26,7 @@ use labrinth::routes::v3::version_file::FileUpdateData; use serde_json::json; use xredis::RedisValue; -pub mod common; +use crate::common; #[actix_rt::test] async fn test_get_version() { From 4a9175a74dbf4ef343f6d9ce77e612c2bbe03a16 Mon Sep 17 00:00:00 2001 From: "Michael H." Date: Tue, 6 Oct 2026 21:12:00 +0200 Subject: [PATCH 5/7] debug --- .github/workflows/ci.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 07a60eba84e..de9985d4c54 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -125,7 +125,8 @@ jobs: run: cp .env.staging .env - name: Lint and test - run: pnpm run ci + # TEMPORARY: `moon run` prints task spawn errors that `moon exec --on-failure continue` swallows + run: pnpm moon run :lint :test env: # "Re-run jobs" with debug logging enabled also turns on moon's debug output MOON_LOG: ${{ runner.debug == '1' && 'debug' || 'info' }} From 81df7f477fb9b939a568e3d4a8015e01ca4ed048 Mon Sep 17 00:00:00 2001 From: "Michael H." Date: Tue, 6 Oct 2026 21:43:10 +0200 Subject: [PATCH 6/7] fix: moon running out of memory --- .cargo/moon.yml | 1 + .github/workflows/ci.yml | 3 +-- .moon/tasks/all.yml | 1 + .moon/workspace.yml | 10 ++++++++++ scripts/moon.yml | 2 ++ 5 files changed, 15 insertions(+), 2 deletions(-) diff --git a/.cargo/moon.yml b/.cargo/moon.yml index af8171f2b7e..01435f2726f 100644 --- a/.cargo/moon.yml +++ b/.cargo/moon.yml @@ -25,6 +25,7 @@ fileGroups: - '/apps/app/**/*' - '/apps/labrinth/**/*' - '/packages/app-lib/**/*' + - '!/**/node_modules/**' - '/packages/app-lib/.env' - '$CARGO_*' - '$RUST_*' diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index de9985d4c54..07a60eba84e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -125,8 +125,7 @@ jobs: run: cp .env.staging .env - name: Lint and test - # TEMPORARY: `moon run` prints task spawn errors that `moon exec --on-failure continue` swallows - run: pnpm moon run :lint :test + run: pnpm run ci env: # "Re-run jobs" with debug logging enabled also turns on moon's debug output MOON_LOG: ${{ runner.debug == '1' && 'debug' || 'info' }} diff --git a/.moon/tasks/all.yml b/.moon/tasks/all.yml index 903107de28c..032c3ee57f7 100644 --- a/.moon/tasks/all.yml +++ b/.moon/tasks/all.yml @@ -2,6 +2,7 @@ $schema: 'https://moonrepo.dev/schemas/tasks.json' implicitInputs: - '/packages/tooling-config/**/*' + - '!/packages/tooling-config/node_modules/**' - '/packages/app-lib/.env' - '$MODRINTH_URL' - '$MODRINTH_API_BASE_URL' diff --git a/.moon/workspace.yml b/.moon/workspace.yml index e320152203d..8c43a9b2f7a 100644 --- a/.moon/workspace.yml +++ b/.moon/workspace.yml @@ -16,3 +16,13 @@ vcs: pipeline: installDependencies: false + +# Workspace-root input globs (like `/**/*`) aren't filtered by .gitignore, and would +# otherwise hash all of target/ and node_modules/, running CI runners out of memory +hasher: + ignorePatterns: + - '**/node_modules/**' + - '**/target/**' + - '**/.nuxt/**' + - '**/.output/**' + - '**/dist/**' diff --git a/scripts/moon.yml b/scripts/moon.yml index 6581e276a0b..9eb2f74c9d5 100644 --- a/scripts/moon.yml +++ b/scripts/moon.yml @@ -25,6 +25,8 @@ tasks: command: 'typos' inputs: - '/**/*' + - '!/**/node_modules/**' + - '!/.moon/cache/**' options: runFromWorkspaceRoot: true From c3d4a265fe0f2d2d586fe4650ce4838443b3ed5f Mon Sep 17 00:00:00 2001 From: "Michael H." Date: Tue, 6 Oct 2026 21:44:43 +0200 Subject: [PATCH 7/7] bump moon to 2.6 --- package.json | 2 +- pnpm-lock.yaml | 66 ++++++++++++++++++++++----------------------- pnpm-workspace.yaml | 2 ++ 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index ff636278edf..4fce3b87d0c 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "@crowdin/crowdin-api-client": "^1.55.2", "@formatjs/icu-messageformat-parser": "^2.11.4", "@modrinth/tooling-config": "workspace:*", - "@moonrepo/cli": "2.5.6", + "@moonrepo/cli": "2.6.0", "@tailwindcss/container-queries": "^0.1.1", "@types/node": "^24", "@typescript-eslint/typescript-estree": "^8.64.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 55eff6326b2..043d6f26980 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -34,8 +34,8 @@ importers: specifier: workspace:* version: link:packages/tooling-config '@moonrepo/cli': - specifier: 2.5.6 - version: 2.5.6 + specifier: 2.6.0 + version: 2.6.0 '@tailwindcss/container-queries': specifier: ^0.1.1 version: 0.1.1(tailwindcss@4.1.18) @@ -2814,46 +2814,46 @@ packages: '@microsoft/tsdoc@0.16.0': resolution: {integrity: sha512-xgAyonlVVS+q7Vc7qLW0UrJU7rSFcETRWsqdXZtjzRU8dF+6CkozTK4V4y1LwOX7j8r/vHphjDeMeGI4tNGeGA==} - '@moonrepo/cli@2.5.6': - resolution: {integrity: sha512-Wkwzbx8ZbXQVCo0SA2KGxDw4FwrbiLZr9HaqxNQLa/LUmziLQZBoXbmgYFDqE8a9gE73HxNtac0CFNMZUQ5x6A==} + '@moonrepo/cli@2.6.0': + resolution: {integrity: sha512-AbP2SB0qnuwP3d4BpK0M1xapo/2OLG3DMVnPVyFBMH8SD/0UcyxQz9mo86DPyZbK0BWDeNkj3OMawaUcIWqG4w==} hasBin: true - '@moonrepo/core-linux-arm64-gnu@2.5.6': - resolution: {integrity: sha512-G8cq1eBEr7gz2GBMgj2q7kgyeIKvyQnTJkvSVdFAIvpUpRCKDfIibp2xqVGQxAWA54ZaMDiIWq78mgmpuQycjw==} + '@moonrepo/core-linux-arm64-gnu@2.6.0': + resolution: {integrity: sha512-1+uWrsZDfONh1U3K+0bAqWR8gnoD4t9f82YCI1hL8PZVDAwumlCaHbo11y/8abnrj6ws6TQ/bGIa8vnFEIUN1A==} cpu: [arm64] os: [linux] libc: [glibc] - '@moonrepo/core-linux-arm64-musl@2.5.6': - resolution: {integrity: sha512-1MuCAHRiEd4D4Onoeo/zcAtyVlEStc4AigMC7ekgI+1UgsYAbwL+/poz6ry71iRFZm8qVnt1TGkaUpyl+XrL8g==} + '@moonrepo/core-linux-arm64-musl@2.6.0': + resolution: {integrity: sha512-avrogwEZ4eQAA1vQHKSTaCPxHT2tfAOnOflOb7am3sDXr78FcMMFFmfZT13bIzgPK1GeOY8TXvZUzz4E6vp48g==} cpu: [arm64] os: [linux] libc: [musl] - '@moonrepo/core-linux-x64-gnu@2.5.6': - resolution: {integrity: sha512-ZZYKTr4Sjgl0pi8cbQhaxf22nwr46wrkmF3s9xRq9pahFT/ZTeWVg7c5tMJ36Tv9nkk958fTnoUdX795A25HYA==} + '@moonrepo/core-linux-x64-gnu@2.6.0': + resolution: {integrity: sha512-EGmI0Yl4LRgjnFffrDsV6dQBjgbqAR39rvFqOq5qiMeDFv7NlBPhpbPGrNfLilMkK2xftJMb15osgSPf157Pjg==} cpu: [x64] os: [linux] libc: [glibc] - '@moonrepo/core-linux-x64-musl@2.5.6': - resolution: {integrity: sha512-73VGovApf4jsA7PY0jjKq3A6YFZ5kjuKBBL1LBqoknqMZU1a5+P85WTw3z36lDnv1Uw3O9bfM+0GDUk2pfkv7Q==} + '@moonrepo/core-linux-x64-musl@2.6.0': + resolution: {integrity: sha512-sTcuNMS7/z0uTkxNAPlwmV9tt6jLfarbt/MYmTwNxjLMG3JNfQak1GHlZIJka6q+xIQkV7A+lc71aUXCp7quBQ==} cpu: [x64] os: [linux] libc: [musl] - '@moonrepo/core-macos-arm64@2.5.6': - resolution: {integrity: sha512-VUyq46qsUX32XzHso+CDmRPvjolCQ0/t4HyAZxOVPbjHqH6DDJOcTalSJExTWa5gfX+yHUNWndyNFxIMhu1tPw==} + '@moonrepo/core-macos-arm64@2.6.0': + resolution: {integrity: sha512-6M7u1/Fbm2PYoC5UJnEqa3WHEJilDZH9mRA2iNmhQHKq2l6C4C4yyNxKFD6Oe9EfRssHOVqZ1dLqc88Hl6YPiQ==} cpu: [arm64] os: [darwin] - '@moonrepo/core-macos-x64@2.5.6': - resolution: {integrity: sha512-DYSl8493eWI+VVk92mFDyqVRg1akU/lnxoEOmvxCKGkZrC+rcT3T/Z2VyuOrhGD8Gfy3EDrjebdDg09MYn0JMQ==} + '@moonrepo/core-macos-x64@2.6.0': + resolution: {integrity: sha512-mjswlUn+d/I4MsnItvWUoBlM2ig1jgVaacQmus5RAV8lkj1Y2GbtIkPzTKwL6M452l/8FBEzk3iEGwJrwzDXZw==} cpu: [x64] os: [darwin] - '@moonrepo/core-windows-x64-msvc@2.5.6': - resolution: {integrity: sha512-fcC3g3A7ckPTgv0/+aDU0aiwb/LwpV58tfhBQw4PXe7sSohk88SlmHLV31lUMbTjOmKiXegc8A9IEUhxsa92dA==} + '@moonrepo/core-windows-x64-msvc@2.6.0': + resolution: {integrity: sha512-ocAf8pZecRjcxJL7BkUOBQr81p4PYyCTKyU2Y5BdrzFOJ0MSLtQr+ZDWszX0A8TCRa24U3oRvLkSGMn4R3zXVA==} cpu: [x64] os: [win32] @@ -12384,37 +12384,37 @@ snapshots: '@microsoft/tsdoc@0.16.0': {} - '@moonrepo/cli@2.5.6': + '@moonrepo/cli@2.6.0': dependencies: detect-libc: 2.1.2 optionalDependencies: - '@moonrepo/core-linux-arm64-gnu': 2.5.6 - '@moonrepo/core-linux-arm64-musl': 2.5.6 - '@moonrepo/core-linux-x64-gnu': 2.5.6 - '@moonrepo/core-linux-x64-musl': 2.5.6 - '@moonrepo/core-macos-arm64': 2.5.6 - '@moonrepo/core-macos-x64': 2.5.6 - '@moonrepo/core-windows-x64-msvc': 2.5.6 + '@moonrepo/core-linux-arm64-gnu': 2.6.0 + '@moonrepo/core-linux-arm64-musl': 2.6.0 + '@moonrepo/core-linux-x64-gnu': 2.6.0 + '@moonrepo/core-linux-x64-musl': 2.6.0 + '@moonrepo/core-macos-arm64': 2.6.0 + '@moonrepo/core-macos-x64': 2.6.0 + '@moonrepo/core-windows-x64-msvc': 2.6.0 - '@moonrepo/core-linux-arm64-gnu@2.5.6': + '@moonrepo/core-linux-arm64-gnu@2.6.0': optional: true - '@moonrepo/core-linux-arm64-musl@2.5.6': + '@moonrepo/core-linux-arm64-musl@2.6.0': optional: true - '@moonrepo/core-linux-x64-gnu@2.5.6': + '@moonrepo/core-linux-x64-gnu@2.6.0': optional: true - '@moonrepo/core-linux-x64-musl@2.5.6': + '@moonrepo/core-linux-x64-musl@2.6.0': optional: true - '@moonrepo/core-macos-arm64@2.5.6': + '@moonrepo/core-macos-arm64@2.6.0': optional: true - '@moonrepo/core-macos-x64@2.5.6': + '@moonrepo/core-macos-x64@2.6.0': optional: true - '@moonrepo/core-windows-x64-msvc@2.5.6': + '@moonrepo/core-windows-x64-msvc@2.6.0': optional: true '@napi-rs/wasm-runtime@0.2.12': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index d21d086c530..c219f23b58e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -2,3 +2,5 @@ packages: - 'apps/*' - 'packages/*' minimumReleaseAge: 10080 # 7 days +minimumReleaseAgeExclude: + - '@moonrepo/*'