diff --git a/.github/filters.yml b/.github/filters.yml new file mode 100644 index 0000000..1c9ab81 --- /dev/null +++ b/.github/filters.yml @@ -0,0 +1,29 @@ +# Основная документация: https://github.com/dorny/paths-filter (см. всё к полю `filters`) + +# Пути прописываются в виде picomatch-паттернов: +# https://github.com/micromatch/picomatch#basic-globbing + +# Можно использовать все фишки YAML-я: +# https://ru.wikipedia.org/wiki/YAML#%D0%A1%D0%B8%D0%BD%D1%82%D0%B0%D0%BA%D1%81%D0%B8%D1%81 + +# Имена последних объектов (packages, lintable) лучше не менять + +configs: &configs # изменения тут обязательно запускают все пайплайны + - ".github/workflows/*" + - ".github/package-filters.yml" + - "package.json" + - ".npmrc" + +lintable: # запускает прогон линтера + - *configs + - "**/eslint.config.js" + - "prettier.config.js" + - "**.[jt]s" + - "**.[jt]sx" + - "**.md" + +packages: # запускает деплой @xipkg/calls-* в main-ветке (только обновлённых) + - *configs + - "packages/calls/**" + - "packages/calls.*/**" + - "tsup.calls.base.ts" diff --git a/.github/package-filters.yml b/.github/package-filters.yml new file mode 100644 index 0000000..30a37ee --- /dev/null +++ b/.github/package-filters.yml @@ -0,0 +1,25 @@ +# Per-package path filters for selective npm publish (dorny/paths-filter). +# Update this file when adding a new packages/calls.* package. + +calls.types: + - packages/calls.types/** +calls.config: + - packages/calls.config/** +calls.utils: + - packages/calls.utils/** +calls.store: + - packages/calls.store/** +calls.providers: + - packages/calls.providers/** +calls.hooks: + - packages/calls.hooks/** +calls.ui: + - packages/calls.ui/** +calls.risehand: + - packages/calls.risehand/** +calls.chat: + - packages/calls.chat/** +calls.compactview: + - packages/calls.compactview/** +calls: + - packages/calls/** diff --git a/.github/workflows/common-prepare.yml b/.github/workflows/common-prepare.yml new file mode 100644 index 0000000..d51e439 --- /dev/null +++ b/.github/workflows/common-prepare.yml @@ -0,0 +1,55 @@ +name: Common Preparation Steps + +on: + workflow_call: + outputs: + packages: + description: Will be 'true' if any package files have changed + value: ${{ jobs.analyze_files.outputs.packages }} + +jobs: + analyze_files: + runs-on: ubuntu-latest + + outputs: + lintable: ${{ steps.path_filter.outputs.lintable }} + packages: ${{ steps.path_filter.outputs.packages }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Filter paths + uses: dorny/paths-filter@v4 + id: path_filter + with: + filters: .github/filters.yml + + lint_and_format: + needs: analyze_files + if: needs.analyze_files.outputs.lintable == 'true' + runs-on: ubuntu-latest + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 8.15.4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22.22.1 + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile --ignore-scripts + + - name: Check format + run: pnpm run format-check + + - name: Lint + run: pnpm run lint diff --git a/.github/workflows/front-development.yml b/.github/workflows/front-development.yml new file mode 100644 index 0000000..f662c56 --- /dev/null +++ b/.github/workflows/front-development.yml @@ -0,0 +1,20 @@ +name: Development + +on: + push: + branches-ignore: + - main + workflow_dispatch: + +jobs: + prepare: + uses: ./.github/workflows/common-prepare.yml + + # build-frodo: + # needs: prepare + # if: needs.prepare.outputs.xi-frodo == 'true' + # uses: xi-effect/xi.actions/.github/workflows/docker-build-nocache.yml@main + # with: + # tag: frodo-${{ github.run_id }} + # arguments: "APP_NAME=xi.frodo" + # secrets: inherit diff --git a/.github/workflows/front-production.yml b/.github/workflows/front-production.yml new file mode 100644 index 0000000..a26de48 --- /dev/null +++ b/.github/workflows/front-production.yml @@ -0,0 +1,130 @@ +name: Production + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: read + id-token: write + +jobs: + prepare: + uses: ./.github/workflows/common-prepare.yml + + analyze-packages: + needs: prepare + if: needs.prepare.outputs.packages == 'true' + runs-on: ubuntu-latest + + outputs: + packages: ${{ steps.package_filter.outputs.changes }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Filter packages + uses: dorny/paths-filter@v4 + id: package_filter + with: + filters: .github/package-filters.yml + + deploy-packages: + needs: analyze-packages + if: needs.analyze-packages.outputs.packages != '[]' + runs-on: ubuntu-latest + + permissions: + contents: read + id-token: write + + environment: >- + ${{ case( + contains(fromJSON('["niqzart", "unknownproperty"]'), github.triggering_actor) + && github.ref == format('refs/heads/{0}', github.event.repository.default_branch), + 'xi-production', + 'xi-production-manual' + ) }} + + steps: + - name: Checkout repository + uses: actions/checkout@v4 + + - name: Install pnpm + uses: pnpm/action-setup@v4 + with: + version: 8.15.4 + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: 22.22.1 + registry-url: https://registry.npmjs.org + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile --ignore-scripts + + - name: Upgrade npm (required for trusted publishing) + run: npm install -g npm@latest + + - name: Build calls packages + run: pnpm exec turbo run build --filter='./packages/calls...' + + - name: Publish calls.types + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.types') + working-directory: packages/calls.types + run: npm publish --access public --provenance + + - name: Publish calls.config + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.config') + working-directory: packages/calls.config + run: npm publish --access public --provenance + + - name: Publish calls.utils + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.utils') + working-directory: packages/calls.utils + run: npm publish --access public --provenance + + - name: Publish calls.store + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.store') + working-directory: packages/calls.store + run: npm publish --access public --provenance + + - name: Publish calls.providers + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.providers') + working-directory: packages/calls.providers + run: npm publish --access public --provenance + + - name: Publish calls.hooks + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.hooks') + working-directory: packages/calls.hooks + run: npm publish --access public --provenance + + - name: Publish calls.ui + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.ui') + working-directory: packages/calls.ui + run: npm publish --access public --provenance + + - name: Publish calls.risehand + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.risehand') + working-directory: packages/calls.risehand + run: npm publish --access public --provenance + + - name: Publish calls.chat + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.chat') + working-directory: packages/calls.chat + run: npm publish --access public --provenance + + - name: Publish calls.compactview + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls.compactview') + working-directory: packages/calls.compactview + run: npm publish --access public --provenance + + - name: Publish calls + if: contains(fromJSON(needs.analyze-packages.outputs.packages), 'calls') + working-directory: packages/calls + run: npm publish --access public --provenance diff --git a/docs/migrations/calls-build.md b/docs/migrations/calls-build.md index 7e8c219..904e34b 100644 --- a/docs/migrations/calls-build.md +++ b/docs/migrations/calls-build.md @@ -56,7 +56,7 @@ pnpm --filter @xipkg/calls-hooks dev ## npm publish -Перед публикацией CI (или локально) запускает `pnpm run build`. В npm уходит только `dist/` (+ CSS для ui). +CI при merge в `main` сам запускает build и публикует изменённые пакеты. В npm уходит только `dist/` (+ CSS для ui). `publishConfig.access: public` уже прописан во всех calls-пакетах. @@ -73,6 +73,8 @@ Trusted publishing: workflow `front-production.yml`, environment `xi-production` Перед publish нужно **поднять version** в `package.json` — npm вернёт `409`, если версия уже есть. +При добавлении нового `packages/calls.*` обновите `.github/package-filters.yml` и шаг publish в `front-production.yml`. + ## Замечания - Зависимости (`@xipkg/*`, `livekit-client`, `react` и т.д.) **не бандлятся** — `esbuildOptions.packages = 'external'` diff --git a/packages/calls.riseHand/README.md b/packages/calls.risehand/README.md similarity index 100% rename from packages/calls.riseHand/README.md rename to packages/calls.risehand/README.md diff --git a/packages/calls.riseHand/eslint.config.js b/packages/calls.risehand/eslint.config.js similarity index 100% rename from packages/calls.riseHand/eslint.config.js rename to packages/calls.risehand/eslint.config.js diff --git a/packages/calls.riseHand/index.ts b/packages/calls.risehand/index.ts similarity index 100% rename from packages/calls.riseHand/index.ts rename to packages/calls.risehand/index.ts diff --git a/packages/calls.riseHand/package.json b/packages/calls.risehand/package.json similarity index 100% rename from packages/calls.riseHand/package.json rename to packages/calls.risehand/package.json diff --git a/packages/calls.riseHand/src/hooks/index.ts b/packages/calls.risehand/src/hooks/index.ts similarity index 100% rename from packages/calls.riseHand/src/hooks/index.ts rename to packages/calls.risehand/src/hooks/index.ts diff --git a/packages/calls.riseHand/src/hooks/useHandFocus.ts b/packages/calls.risehand/src/hooks/useHandFocus.ts similarity index 100% rename from packages/calls.riseHand/src/hooks/useHandFocus.ts rename to packages/calls.risehand/src/hooks/useHandFocus.ts diff --git a/packages/calls.riseHand/src/hooks/useRaisedHands.ts b/packages/calls.risehand/src/hooks/useRaisedHands.ts similarity index 100% rename from packages/calls.riseHand/src/hooks/useRaisedHands.ts rename to packages/calls.risehand/src/hooks/useRaisedHands.ts diff --git a/packages/calls.riseHand/src/index.ts b/packages/calls.risehand/src/index.ts similarity index 100% rename from packages/calls.riseHand/src/index.ts rename to packages/calls.risehand/src/index.ts diff --git a/packages/calls.riseHand/src/ui/RaiseHandButton.tsx b/packages/calls.risehand/src/ui/RaiseHandButton.tsx similarity index 100% rename from packages/calls.riseHand/src/ui/RaiseHandButton.tsx rename to packages/calls.risehand/src/ui/RaiseHandButton.tsx diff --git a/packages/calls.riseHand/src/ui/index.ts b/packages/calls.risehand/src/ui/index.ts similarity index 100% rename from packages/calls.riseHand/src/ui/index.ts rename to packages/calls.risehand/src/ui/index.ts diff --git a/packages/calls.riseHand/tsconfig.json b/packages/calls.risehand/tsconfig.json similarity index 100% rename from packages/calls.riseHand/tsconfig.json rename to packages/calls.risehand/tsconfig.json diff --git a/packages/calls.riseHand/tsup.config.ts b/packages/calls.risehand/tsup.config.ts similarity index 100% rename from packages/calls.riseHand/tsup.config.ts rename to packages/calls.risehand/tsup.config.ts