diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index e7a976a7be4..00000000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,18 +0,0 @@ -* @element-hq/element-web-reviewers -/.github/workflows/** @element-hq/element-web-team -/package.json @element-hq/element-web-team -/yarn.lock @element-hq/element-web-team - -/src/SecurityManager.ts @element-hq/element-crypto-web-reviewers -/test/SecurityManager-test.ts @element-hq/element-crypto-web-reviewers -/src/async-components/views/dialogs/security/ @element-hq/element-crypto-web-reviewers -/src/components/views/dialogs/security/ @element-hq/element-crypto-web-reviewers -/test/components/views/dialogs/security/ @element-hq/element-crypto-web-reviewers -/src/stores/SetupEncryptionStore.ts @element-hq/element-crypto-web-reviewers -/test/stores/SetupEncryptionStore-test.ts @element-hq/element-crypto-web-reviewers - -# Ignore translations as those will be updated by GHA for Localazy download -/src/i18n/strings -# Ignore the synapse plugin as this is updated by GHA for docker image updating -/playwright/plugins/homeserver/synapse/index.ts - diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index afc29f01425..00000000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -patreon: matrixdotorg -liberapay: matrixdotorg diff --git a/.github/ISSUE_TEMPLATE/bug-desktop.yml b/.github/ISSUE_TEMPLATE/bug-desktop.yml deleted file mode 100644 index 529c0a0ebcf..00000000000 --- a/.github/ISSUE_TEMPLATE/bug-desktop.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: Bug report for the Element desktop app (not in a browser) -description: File a bug report if you are using the desktop Element application. -labels: [T-Defect] -body: - - type: markdown - attributes: - value: | - Thanks for taking the time to fill out this bug report! - - Please report security issues by email to security@matrix.org - - type: textarea - id: reproduction-steps - attributes: - label: Steps to reproduce - description: Please attach screenshots, videos or logs if you can. - placeholder: Tell us what you see! - value: | - 1. Where are you starting? What can you see? - 2. What do you click? - 3. More steps… - validations: - required: true - - type: textarea - id: result - attributes: - label: Outcome - placeholder: Tell us what went wrong - value: | - #### What did you expect? - - #### What happened instead? - validations: - required: true - - type: input - id: os - attributes: - label: Operating system - placeholder: Windows, macOS, Ubuntu, Arch Linux… - validations: - required: false - - type: input - id: version - attributes: - label: Application version - description: You can find the version information in Settings -> Help & About. - placeholder: e.g. Element version 1.7.34, olm version 3.2.3 - validations: - required: false - - type: input - id: source - attributes: - label: How did you install the app? - description: Where did you install the app from? Please give a link or a description. - placeholder: e.g. From https://element.io/get-started - validations: - required: false - - type: input - id: homeserver - attributes: - label: Homeserver - description: | - Which server is your account registered on? If it is a local or non-public homeserver, please tell us what is the homeserver implementation (ex: Synapse/Dendrite/etc.) and the version. - placeholder: e.g. matrix.org or Synapse 1.50.0rc1 - validations: - required: false - - type: dropdown - id: rageshake - attributes: - label: Will you send logs? - description: | - Did you know that you can send a /rageshake command from your application to submit logs for this issue? Trigger the defect, then type `/rageshake` into the message input area followed by a description of the problem and send the command. You will be able to add a link to this defect report and submit anonymous logs to the developers. - options: - - "Yes" - - "No" - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/bug-web.yml b/.github/ISSUE_TEMPLATE/bug-web.yml deleted file mode 100644 index 24ab78a153d..00000000000 --- a/.github/ISSUE_TEMPLATE/bug-web.yml +++ /dev/null @@ -1,84 +0,0 @@ -name: Bug report for Element Web (in browser) -description: File a bug report if you are using Element in a web browser like Firefox, Chrome, Edge, and so on. -labels: [T-Defect] -body: - - type: markdown - attributes: - value: | - Thanks for taking the time to fill out this bug report! - - Please report security issues by email to security@matrix.org - - type: textarea - id: reproduction-steps - attributes: - label: Steps to reproduce - description: Please attach screenshots, videos or logs if you can. - placeholder: Tell us what you see! - value: | - 1. Where are you starting? What can you see? - 2. What do you click? - 3. More steps… - validations: - required: true - - type: textarea - id: result - attributes: - label: Outcome - placeholder: Tell us what went wrong - value: | - #### What did you expect? - - #### What happened instead? - validations: - required: true - - type: input - id: os - attributes: - label: Operating system - placeholder: Windows, macOS, Ubuntu, Arch Linux… - validations: - required: false - - type: input - id: browser - attributes: - label: Browser information - description: Which browser are you using? Which version? - placeholder: e.g. Chromium Version 92.0.4515.131 - validations: - required: false - - type: input - id: webapp-url - attributes: - label: URL for webapp - description: Which URL are you using to access the webapp? If a private server, tell us what version of Element Web you are using. - placeholder: e.g. develop.element.io, app.element.io - validations: - required: false - - type: input - id: version - attributes: - label: Application version - description: You can find the version information in Settings -> Help & About. - placeholder: e.g. Element version 1.7.34, olm version 3.2.3 - validations: - required: false - - type: input - id: homeserver - attributes: - label: Homeserver - description: | - Which server is your account registered on? If it is a local or non-public homeserver, please tell us what is the homeserver implementation (ex: Synapse/Dendrite/etc.) and the version. - placeholder: e.g. matrix.org or Synapse 1.50.0rc1 - validations: - required: false - - type: dropdown - id: rageshake - attributes: - label: Will you send logs? - description: | - Did you know that you can send a /rageshake command from the web application to submit logs for this issue? Trigger the defect, then type `/rageshake` into the message input area followed by a description of the problem and send the command. You will be able to add a link to this defect report and submit anonymous logs to the developers. - options: - - "Yes" - - "No" - validations: - required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index b34e4493684..00000000000 --- a/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,5 +0,0 @@ -blank_issues_enabled: false -contact_links: - - name: Questions & support - url: https://matrix.to/#/#element-web:matrix.org - about: Please ask and answer questions here. diff --git a/.github/ISSUE_TEMPLATE/enhancement.yml b/.github/ISSUE_TEMPLATE/enhancement.yml deleted file mode 100644 index 7dd384e78ff..00000000000 --- a/.github/ISSUE_TEMPLATE/enhancement.yml +++ /dev/null @@ -1,36 +0,0 @@ -name: Enhancement request -description: Do you have a suggestion or feature request? -labels: [T-Enhancement] -body: - - type: markdown - attributes: - value: | - Thank you for taking the time to propose an enhancement to an existing feature. If you would like to propose a new feature or a major cross-platform change, please [start a discussion here](https://github.com/element-hq/element-meta/discussions/new?category=ideas). - - type: textarea - id: usecase - attributes: - label: Your use case - description: What would you like to be able to do? Please feel welcome to include screenshots or mock ups. - placeholder: Tell us what you would like to do! - value: | - #### What would you like to do? - - #### Why would you like to do it? - - #### How would you like to achieve it? - validations: - required: true - - type: textarea - id: alternative - attributes: - label: Have you considered any alternatives? - placeholder: A clear and concise description of any alternative solutions or features you've considered. - validations: - required: false - - type: textarea - id: additional-context - attributes: - label: Additional context - placeholder: Is there anything else you'd like to add? - validations: - required: false diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md deleted file mode 100644 index 16036541f88..00000000000 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ /dev/null @@ -1,8 +0,0 @@ - - -## Checklist - -- [ ] Tests written for new code (and old code if feasible). -- [ ] New or updated `public`/`exported` symbols have accurate [TSDoc](https://tsdoc.org/) documentation. -- [ ] Linter and other CI checks pass. -- [ ] I have licensed the changes to Element by completing the [Contributor License Agreement (CLA)](https://cla-assistant.io/element-hq/element-web) diff --git a/.github/actions/download-verify-element-tarball/action.yml b/.github/actions/download-verify-element-tarball/action.yml deleted file mode 100644 index e61b96596bf..00000000000 --- a/.github/actions/download-verify-element-tarball/action.yml +++ /dev/null @@ -1,39 +0,0 @@ -name: Upload release assets -description: Uploads assets to an existing release and optionally signs them -inputs: - tag: - description: GitHub release tag to fetch assets from. - required: true - out-file-path: - description: Path to where the webapp should be extracted to. - required: true -runs: - using: composite - steps: - - name: Download release tarball - id: current_download - uses: robinraju/release-downloader@a96f54c1b5f5e09e47d9504526e96febd949d4c2 # v1 - with: - tag: ${{ inputs.tag }} - fileName: element-*.tar.gz* - out-file-path: ${{ runner.temp }}/download-verify-element-tarball - - - name: Verify tarball - shell: bash - run: gpg --verify element-*.tar.gz.asc element-*.tar.gz - working-directory: ${{ runner.temp }}/download-verify-element-tarball - - - name: Extract tarball - shell: bash - run: | - mkdir webapp - tar xvzf element-*.tar.gz -C webapp --strip-components=1 - working-directory: ${{ runner.temp }}/download-verify-element-tarball - - - name: Move webapp to out-file-path - shell: bash - run: mv ${{ runner.temp }}/download-verify-element-tarball/webapp ${{ inputs.out-file-path }} - - - name: Clean up temp directory - shell: bash - run: rm -R ${{ runner.temp }}/download-verify-element-tarball diff --git a/.github/cfp_headers b/.github/cfp_headers index 497a5ff58d9..482c9ead0dd 100644 --- a/.github/cfp_headers +++ b/.github/cfp_headers @@ -5,6 +5,7 @@ X-Frame-Options: SAMEORIGIN Content-Security-Policy: frame-ancestors 'self' Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + permissions-policy: accelerometer=(), gyroscope=(), magnetometer=(), usb=(), interest-cohort=() /version Content-Type: text/plain diff --git a/.github/labels.yml b/.github/labels.yml deleted file mode 100644 index 80c5408c1e3..00000000000 --- a/.github/labels.yml +++ /dev/null @@ -1,269 +0,0 @@ -- name: "A-Aliases" - color: "bfd4f2" -- name: "A-Authentication" - color: "bfd4f2" -- name: "A-Autocomplete" - color: "bfd4f2" -- name: "A-Breadcrumbs" - color: "bfd4f2" -- name: "A-Bridge" - color: "bfd4f2" -- name: "A-Broadcast" - description: "Broadcast-style voice messages" - color: "bfd4f2" -- name: "A-Create-Room" - description: "Create room flow, user suggestions, etc." - color: "bfd4f2" -- name: "A-DevTools" - description: "/devtools, show hidden events, etc." - color: "bfd4f2" -- name: "A-Dialogs" - color: "bfd4f2" -- name: "A-Disambiguation" - color: "bfd4f2" -- name: "A-DM-Start" - description: "Creating a DM with another user" - color: "bfd4f2" -- name: "A-E2EE-Dehydration" - color: "8CC59A" -- name: "A-Electron" - color: "bfd4f2" -- name: "A-Element-Call" - description: "Group calls via Element Call" - color: "bfd4f2" -- name: "A-Element-R" - description: "Issues affecting the port of Element's crypto layer to Rust" - color: "bfd4f2" -- name: "A-ELS" - description: "Event List Summary (and Membership ELS, MELS)" - color: "bfd4f2" -- name: "A-Emotes" - color: "bfd4f2" -- name: "A-EMS" - description: "Issues related to EMS" - color: "bfd4f2" -- name: "A-Error-Message" - color: "bfd4f2" -- name: "A-Federation" - color: "bfd4f2" -- name: "A-Feedback-Reporting" - description: "Reporting process for bugs, debug logs (rageshakes), suggestions" - color: "bfd4f2" -- name: "A-File-Download" - color: "bfd4f2" -- name: "A-File-Panel" - color: "bfd4f2" -- name: "A-Identity-Server" - color: "bfd4f2" -- name: "A-Indexing" - description: "Indexing messages via Seshat" - color: "bfd4f2" -- name: "A-IRC-Layout" - color: "bfd4f2" -- name: "A-Jump-To-Date" - description: "Jump to date headers or slash command" - color: "bfd4f2" -- name: "A-Lazy-Loading" - color: "bfd4f2" -- name: "A-Light-Box" - description: "UI when viewing an image" - color: "bfd4f2" -- name: "A-Location-Sharing" - color: "bfd4f2" -- name: "A-Logout" - description: "Logout, sign out, etc." - color: "bfd4f2" -- name: "A-Maths" - description: "Render LaTeX maths in messages" - color: "bfd4f2" -- name: "A-Memory" - description: "Memory leaks, leak hunting tools" - color: "bfd4f2" -- name: "A-Message-Forwarding" - color: "bfd4f2" -- name: "A-Message-Pinning" - color: "bfd4f2" -- name: "A-Message-Previews" - color: "bfd4f2" -- name: "A-Message-Starring" - description: "Saving favourite messages for later" - color: "bfd4f2" -- name: "A-Modules" - description: "Module system related" - color: "bfd4f2" -- name: "A-New-Search-Experience" - description: "The new search dialog available in Labs" - color: "bfd4f2" -- name: "A-Packaging" - description: "Packaging, signing, releasing" - color: "bfd4f2" -- name: "A-Peeking" - color: "bfd4f2" -- name: "A-Picture-in-Picture" - color: "bfd4f2" -- name: "A-Power-Levels" - description: "The permissions that users have in rooms and spaces" - color: "bfd4f2" -- name: "A-Replies" - description: "reply" - color: "bfd4f2" -- name: "A-Session-Mgmt" - description: "Session / device names, management UI, etc." - color: "bfd4f2" -- name: "A-Share" - color: "bfd4f2" -- name: "A-Shortcuts" - description: "Keyboard shortcuts" - color: "bfd4f2" -- name: "A-Sliding-Sync" - description: "Also known as Sync v3 - https://github.com/matrix-org/sliding-sync" - color: "bfd4f2" -- name: "A-Soft-Logout" - description: "https://github.com/element-hq/element-web/issues/10224" - color: "bfd4f2" -- name: "A-Spaces-Settings" - color: "bfd4f2" -- name: "A-SSO" - color: "bfd4f2" -- name: "A-Status-Bar" - description: "Unsent messages warning and 'Connectivity to the server has been lost'" - color: "bfd4f2" -- name: "A-Storage" - description: "Storage layer of the app, including IndexedDB, local storage, etc." - color: "bfd4f2" -- name: "A-Technical-Debt" - color: "bfd4f2" -- name: "A-Testing" - description: "Testing, code coverage, etc." - color: "bfd4f2" -- name: "A-Themes-Custom" - description: "Custom theme variables or support" - color: "bfd4f2" -- name: "A-Themes-Official" - description: "Official themes (light, dark)" - color: "bfd4f2" -- name: "A-Theming" - color: "bfd4f2" -- name: "A-Timeline-Jumpy-Scroll" - description: "Stable timeline dream ✨" - color: "bfd4f2" -- name: "A-Timesheet-1" - description: "Log any time spent on this into the A-Timesheet-1 project" - color: "5319E7" -- name: "A-Toast" - color: "bfd4f2" -- name: "A-Tooltips" - description: "Anything related to tooltips" - color: "bfd4f2" -- name: "A-UI-Customisation" - description: "UIFeatures etc. for customising entire parts of the UI" - color: "bfd4f2" -- name: "A-URL-Previews" - color: "bfd4f2" -- name: "A-User-Menu" - description: "The top left main menu with the user's name and avatar" - color: "bfd4f2" -- name: "A-User-Search" - description: "The start DM or invite to room dialogs (things dealing with `/user_directory/search`)" - color: "bfd4f2" -- name: "A-Video-Rooms" - description: "Persistent group calls" - color: "bfd4f2" -- name: "A-Voice-Messages" - color: "bfd4f2" -- name: "A-Welcome-Page" - color: "bfd4f2" -- name: "backport staging" - description: "Label to automatically backport PR to staging branch" - color: "B60205" -- name: "Dependencies" - description: "Pull requests that update a dependency file" - color: "0366d6" -- name: "Hacktoberfest" - description: "Issues which are suitable for Hacktoberfest PRs: https://hacktoberfest.digitalocean.com/" - color: "ff7518" -- name: "P4" - description: "[OBSOLETE LABEL] Interesting — Not yet scheduled, will accept patches" - color: "d1e5f0" -- name: "spam" - color: "B60205" -- name: "Sponsored" - color: "ffc8f4" -- name: "T-Deprecation" - description: "A pull request that makes something deprecated" - color: "98e6ae" -- name: "T-Other" - description: "Questions, user support, anything else" - color: "98e6ae" -- name: "Team: App" - color: "FFA500" -- name: "X-Blocked" - color: "ff7979" -- name: "X-Cannot-Reproduce" - color: "ff7979" -- name: "X-Command" - description: "Created using the !github command" - color: "ff7979" -- name: "X-Community-Supported-Platform" - description: "This issue occurs in a platform not directly supported by us, but by a community project elsewhere" - color: "ff7979" -- name: "X-Upcoming-Release-Blocker" - description: "This does not affect the current release cycle but will affect the next one" - color: "e99695" -- name: "Z-Actions" - color: "ededed" -- name: "Z-Cache-Confusion" - description: "Related to internal cache (clearing helps / causes the issue)" - color: "ededed" -- name: "Z-Community-PR" - description: "Issue is solved by a community member's PR" - color: "ededed" -- name: "Z-Element-R-Blocker" - description: "A blocker for enabling Element R by default" - color: "ededed" -- name: "Z-Experimental" - color: "ededed" -- name: "Z-Fixed by Element Call" - description: "Issues which can be closed when we move to Element Call" - color: "ededed" -- name: "Z-Fixed-By-OIDC" - description: "Issues which can be closed when we move to OIDC" - color: "ededed" -- name: "Z-Flaky-Test" - description: "A test is raising false alarms" - color: "ededed" -- name: "Z-Flaky-Jest-Test" - description: "A Jest test is raising false alarms" - color: "ededed" -- name: "Z-FOSDEM" - description: "Issues in chat.fosdem.org" - color: "ededed" -- name: "Z-Gitter" - description: "Issues relating to or coming out of the Gitter migration, feature parity, etc" - color: "ededed" -- name: "Z-Legacy-Crypto" - description: "Issues affecting the legacy crypto stack" - color: "EEEEEE" -- name: "Z-Maximised-Widgets" - color: "ededed" -- name: "Z-Papercuts" - description: "Visible. Impactful. Predictable to action." - color: "ededed" -- name: "Z-Power-Users" - color: "ededed" -- name: "Z-Rageshake" - description: "Has attached rageshake (not for log submission process)" - color: "ededed" -- name: "Z-RICE" - color: "ededed" -- name: "Z-Soft-Crash" - description: "React soft crash caught by an error boundary" - color: "ededed" -- name: "Z-Spec-Compliance" - description: "An area where Element doesn't correctly implement the spec" - color: "ededed" -- name: "Z-t3chguy" - color: "ededed" -- name: "Z-Flaky-Test-Disabled" - description: "The flaking test has been disabled" - color: "ededed" diff --git a/.github/release-drafter.yml b/.github/release-drafter.yml deleted file mode 100644 index 5045f2bfc9e..00000000000 --- a/.github/release-drafter.yml +++ /dev/null @@ -1,3 +0,0 @@ -_extends: matrix-org/matrix-js-sdk -version-resolver: - default: patch diff --git a/.github/renovate.json b/.github/renovate.json deleted file mode 100644 index 76320426d9e..00000000000 --- a/.github/renovate.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "$schema": "https://docs.renovatebot.com/renovate-schema.json", - "extends": ["github>matrix-org/renovate-config-element-web"] -} diff --git a/.github/workflows/backport.yml b/.github/workflows/backport.yml deleted file mode 100644 index 5a11ad5bbd5..00000000000 --- a/.github/workflows/backport.yml +++ /dev/null @@ -1,32 +0,0 @@ -name: Backport -on: - pull_request_target: - types: - - closed - - labeled - branches: - - develop - -permissions: {} # We use ELEMENT_BOT_TOKEN instead - -jobs: - backport: - name: Backport - runs-on: ubuntu-24.04 - # Only react to merged PRs for security reasons. - # See https://docs.github.com/en/actions/using-workflows/events-that-trigger-workflows#pull_request_target. - if: > - github.event.pull_request.merged - && ( - github.event.action == 'closed' - || ( - github.event.action == 'labeled' - && contains(github.event.label.name, 'backport') - ) - ) - steps: - - uses: tibdex/backport@9565281eda0731b1d20c4025c43339fb0a23812e # v2 - with: - labels_template: "<%= JSON.stringify([...labels, 'X-Release-Blocker']) %>" - # We can't use GITHUB_TOKEN here or CI won't run on the new PR - github_token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 381755b6067..19afbe5c32d 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -2,7 +2,7 @@ name: Build on: pull_request: {} push: - branches: [develop, master] + branches: [release, master] merge_group: types: [checks_requested] # develop pushes and repository_dispatch handled in build_develop.yaml @@ -20,8 +20,8 @@ jobs: matrix: image: - ubuntu-24.04 - - windows-2022 - - macos-14 + # - windows-2022 + # - macos-14 isDevelop: - ${{ github.event_name == 'push' && github.ref_name == 'develop' }} # Skip the ubuntu-24.04 build for the develop branch as the dedicated CD build_develop workflow handles that @@ -46,5 +46,107 @@ jobs: - name: Install Dependencies run: "./scripts/layered.sh" - - name: Build - run: "yarn build" + # - name: Build + # run: "yarn build" + + # Build step from develop workflow + - name: Build and Package + run: "./scripts/ci_package.sh" + + - run: mv dist/elecord-*.tar.gz dist/elecord.tar.gz + + - name: Upload Artifact + uses: actions/upload-artifact@v4 + with: + name: webapp + path: dist/elecord.tar.gz + + deploy: + needs: build + name: Deploy webapp + runs-on: ubuntu-24.04 + permissions: + pull-requests: write + steps: + # Download and extract the build folder + - name: Download Artifact + uses: actions/download-artifact@v4 + with: + name: webapp + path: . + + - name: Extract tarball + run: tar -xvzf elecord.tar.gz + + - name: Move to dist + run: mv elecord-*/ dist + + # Set the Cloudflare pages branch name + # - PR to master : test + # - Push to master : dev + # - PR to release : preview + # - Push to release : release (Production environment) + - name: Set Pages branch + run: | + if [[ "${{ github.event_name }}" == "pull_request" ]]; then + if [[ "${{ github.event.pull_request.base.ref }}" == "master" ]]; then + echo "cf_branch=test" >> $GITHUB_ENV + elif [[ "${{ github.event.pull_request.base.ref }}" == "release" ]]; then + echo "cf_branch=preview" >> $GITHUB_ENV + fi + elif [[ "${{ github.event_name }}" == "push" ]]; then + if [[ "${{ github.ref_name }}" == "master" ]]; then + echo "cf_branch=dev" >> $GITHUB_ENV + elif [[ "${{ github.ref_name }}" == "release" ]]; then + echo "cf_branch=release" >> $GITHUB_ENV + fi + fi + + # Deploy to Cloudflare Pages (using wrangler) + - name: Deploy to Cloudflare Pages + id: cf + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_PAGES_API_TOKEN }} + accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} + command: pages deploy dist --project-name=elecord-web --branch=${{ env.cf_branch }} + + # Update PR status comment with deployment URL + - name: Update status comment (Failure) + if: ${{ github.event_name == 'pull_request' && failure() }} + uses: thollander/actions-comment-pull-request@v3 + with: + message: | + ## Cloudflare Pages deployment + + | **Latest commit** | ${{ github.event.pull_request.head.sha || github.sha }} | + |-------------------|:-:| + | **Status** | ❌ Failure. Check workflow logs for details | + | **Preview URL** | Not available | + pr-number: ${{ github.event.pull_request.number }} + comment-tag: CFPages-deployment + reactions: -1 + mode: recreate + + # When deploying to the preview branch, add the preview URL + - name: Add preview URL + run: | + if [[ "${{ env.cf_branch }}" == "preview" ]]; then + echo -e "cf_preview=https://preview.elecord.app\n" >> $GITHUB_ENV + fi + + - name: Update status comment (Success) + if: ${{ github.event_name == 'pull_request' && success() }} + uses: thollander/actions-comment-pull-request@v3 + with: + message: | + ## Cloudflare Pages deployment + + | **Latest commit** | ${{ github.event.pull_request.head.sha || github.sha }} | + |-------------------|:-:| + | **Status** | ✅ Deployed! | + | **URL** | ${{ env.cf_preview }}${{ steps.cf.outputs.deployment-url != '' && steps.cf.outputs.deployment-url || 'Not available' }} | + pr-number: ${{ github.event.pull_request.number }} + comment-tag: CFPages-deployment + reactions: rocket + mode: recreate \ No newline at end of file diff --git a/.github/workflows/build_debian.yaml b/.github/workflows/build_debian.yaml deleted file mode 100644 index f46678512a7..00000000000 --- a/.github/workflows/build_debian.yaml +++ /dev/null @@ -1,79 +0,0 @@ -name: Build Debian package -on: - release: - types: [published] -concurrency: ${{ github.workflow }} -permissions: {} # We use ELEMENT_BOT_TOKEN instead -jobs: - build: - name: Build package - environment: packages.element.io - runs-on: ubuntu-24.04 - env: - R2_INCOMING_BUCKET: ${{ vars.R2_INCOMING_BUCKET }} - R2_URL: ${{ vars.CF_R2_S3_API }} - VERSION: ${{ github.ref_name }} - steps: - - uses: actions/checkout@v4 - - - name: Download package - run: | - wget "https://github.com/element-hq/element-web/releases/download/$VERSION/element-$VERSION.tar.gz" - wget "https://github.com/element-hq/element-web/releases/download/$VERSION/element-$VERSION.tar.gz.asc" - - - name: Check GPG signature - run: | - wget "https://packages.element.io/element-release-key.gpg" - gpg --import element-release-key.gpg - gpg --fingerprint "$FINGERPRINT" - gpg --verify "element-$VERSION.tar.gz.asc" "element-$VERSION.tar.gz" - env: - FINGERPRINT: ${{ vars.GPG_FINGERPRINT }} - - - name: Prepare - run: | - mkdir -p debian/tmp/DEBIAN - find debian -maxdepth 1 -type f -exec cp "{}" debian/tmp/DEBIAN/ \; - mkdir -p debian/tmp/usr/share/element-web/ debian/tmp/etc/element-web/ - - tar -xf "element-$VERSION.tar.gz" -C debian/tmp/usr/share/element-web --strip-components=1 --no-same-owner --no-same-permissions - mv debian/tmp/usr/share/element-web/config.sample.json debian/tmp/etc/element-web/config.json - ln -s /etc/element-web/config.json debian/tmp/usr/share/element-web/config.json - - - name: Write changelog - run: | - VERSION=$(cat package.json | jq -r .version) - TIME=$(date -d "$PUBLISHED_AT" -R) - { - echo "element-web ($VERSION) default; urgency=medium" - echo "$BODY" | sed 's/^##/\n */g;s/^\*/ */g' | perl -pe 's/\[.+?]\((.+?)\)/\1/g' - echo "" - echo " -- $ACTOR $TIME" - } > debian/tmp/DEBIAN/changelog - env: - ACTOR: ${{ github.actor }} - VERSION: ${{ github.event.release.tag_name }} - BODY: ${{ github.event.release.body }} - PUBLISHED_AT: ${{ github.event.release.published_at }} - - - name: Build deb package - run: | - VERSION=$(cat package.json | jq -r .version) - dpkg-gencontrol -v"$VERSION" -ldebian/tmp/DEBIAN/changelog - dpkg-deb -Zxz --root-owner-group --build debian/tmp element-web.deb - - - uses: actions/upload-artifact@v4 - with: - name: element-web.deb - path: element-web.deb - retention-days: 14 - - - name: Publish to packages.element.io - if: github.event.release.prerelease == false - uses: element-hq/packages.element.io@master - with: - file: element-web.deb - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - bucket-api: ${{ vars.CF_R2_S3_API }} - bucket-key-id: ${{ secrets.CF_R2_ACCESS_KEY_ID }} - bucket-access-key: ${{ secrets.CF_R2_TOKEN }} diff --git a/.github/workflows/build_develop.yml b/.github/workflows/build_develop.yml deleted file mode 100644 index 8bbcfe726f5..00000000000 --- a/.github/workflows/build_develop.yml +++ /dev/null @@ -1,131 +0,0 @@ -# Separate to the main build workflow for access to develop -# environment secrets, largely similar to build.yaml. -name: Build and Deploy develop -on: - push: - branches: [develop] - repository_dispatch: - types: [element-web-notify] -concurrency: - group: ${{ github.repository_owner }}-${{ github.workflow }}-${{ github.ref_name }} - cancel-in-progress: true -permissions: {} -jobs: - build: - name: "Build & Deploy develop.element.io" - # Only respect triggers from our develop branch, ignore that of forks - if: github.repository == 'element-hq/element-web' - runs-on: ubuntu-24.04 - environment: develop - permissions: - checks: read - pages: write - deployments: write - env: - R2_BUCKET: "element-web-develop" - R2_URL: ${{ vars.CF_R2_S3_API }} - R2_PUBLIC_URL: "https://element-web-develop.element.io" - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - node-version: "lts/*" - - - name: Install Dependencies - run: "./scripts/layered.sh" - - - name: Build, Package & Upload sourcemaps - run: "./scripts/ci_package.sh" - env: - SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} - SENTRY_DSN: ${{ secrets.SENTRY_DSN }} - SENTRY_URL: ${{ secrets.SENTRY_URL }} - SENTRY_ORG: element - SENTRY_PROJECT: riot-web - # We only deploy the latest bundles to Cloudflare Pages and use _redirects to fallback to R2 for - # older ones. This redirect means that 'self' is insufficient in the CSP, - # and we have to add the R2 URL. - # Once Cloudflare redirects support proxying mode we will be able to ditch this. - # See Proxying in support table at https://developers.cloudflare.com/pages/platform/redirects - CSP_EXTRA_SOURCE: ${{ env.R2_PUBLIC_URL }} - - - run: mv dist/element-*.tar.gz dist/develop.tar.gz - - - uses: actions/upload-artifact@v4 - with: - name: webapp - path: dist/develop.tar.gz - retention-days: 1 - - - name: Extract webapp - run: | - mkdir _deploy - tar xf dist/develop.tar.gz -C _deploy --strip-components=1 - - - name: Copy config - run: cp element.io/develop/config.json _deploy/config.json - - - name: Populate 404.html - run: echo "404 Not Found" > _deploy/404.html - - - name: Populate _headers - run: cp .github/cfp_headers _deploy/_headers - - # Redirect requests for the develop tarball and the historical bundles to R2 - # We find the latest 100 bundle.css files and add their bundles to the redirects file - # S3 has no sane way to get the age of a directory as they don't really exist - - name: Populate _redirects - run: | - { - echo "/develop.tar.gz $R2_PUBLIC_URL/develop.tar.gz 301" - aws s3api --region auto --endpoint-url $R2_URL list-objects-v2 --bucket $R2_BUCKET \ - --query "sort_by(Contents[?ends_with(Key, '/bundle.css')], &LastModified)[-100:].Key" \ - --prefix "bundles/" | jq -r '.[]' | grep -oE '[^\"].*\/\s*' | while read -r path ; do - echo "/${path}* $R2_PUBLIC_URL/${path}:splat 301" - done - } | tee _deploy/_redirects - env: - AWS_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_TOKEN }} - - # We may be trying to deploy the same webapp bundles again, we need to ensure that the live bundles - # are not present in the _redirects file and instead accessed directly from Cloudflare Pages. - - name: Trim _redirects - working-directory: _deploy - run: | - find bundles -type d -mindepth 1 -maxdepth 1 -exec sed -i "\:{}:d" _redirects \; - - - name: Wait for other steps to succeed - uses: t3chguy/wait-on-check-action@18541021811b56544d90e0f073401c2b99e249d6 # fork - with: - ref: ${{ github.sha }} - running-workflow-name: "Build & Deploy develop.element.io" - repo-token: ${{ secrets.GITHUB_TOKEN }} - wait-interval: 10 - check-regexp: ^((?!SonarCloud|SonarQube|issue|board|label|Release|prepare|GitHub Pages).)*$ - - # We keep the latest develop.tar.gz on R2 instead of relying on the github artifact uploaded earlier - # as the expires after 24h and requires auth to download. - # Element Desktop's fetch script uses this tarball to fetch latest develop to build Nightlies. - - name: Deploy to R2 - run: | - aws s3 cp dist/develop.tar.gz s3://$R2_BUCKET/develop.tar.gz --endpoint-url $R2_URL --region=auto - aws s3 cp _deploy/ s3://$R2_BUCKET/ --recursive --endpoint-url $R2_URL --region=auto - env: - AWS_ACCESS_KEY_ID: ${{ secrets.CF_R2_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.CF_R2_TOKEN }} - - - name: Deploy to Cloudflare Pages - id: cfp - uses: cloudflare/pages-action@f0a1cd58cd66095dee69bfa18fa5efd1dde93bca # v1 - with: - apiToken: ${{ secrets.CF_PAGES_TOKEN }} - accountId: ${{ secrets.CF_PAGES_ACCOUNT_ID }} - projectName: element-web-develop - directory: _deploy - gitHubToken: ${{ secrets.GITHUB_TOKEN }} - - - run: | - echo "Deployed to ${{ steps.cfp.outputs.url }}" >> $GITHUB_STEP_SUMMARY diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index ac6249d654a..00000000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,91 +0,0 @@ -# Manual deploy workflow for deploying to app.element.io & staging.element.io -# Runs automatically for staging.element.io when an RC or Release is published -# Note: Does *NOT* run automatically for app.element.io so that it gets tested on staging.element.io beforehand -name: Deploy release -run-name: Deploy ${{ github.ref_name }} to ${{ inputs.site || 'staging.element.io' }} -on: - release: - types: [published] - workflow_dispatch: - inputs: - site: - description: Which site to deploy to - required: true - default: staging.element.io - type: choice - options: - - staging.element.io - - app.element.io -concurrency: ${{ inputs.site || 'staging.element.io' }} -permissions: {} -jobs: - deploy: - name: "Deploy to Cloudflare Pages" - runs-on: ubuntu-24.04 - environment: ${{ inputs.site || 'staging.element.io' }} - permissions: - checks: read - deployments: write - env: - SITE: ${{ inputs.site || 'staging.element.io' }} - steps: - - uses: actions/checkout@v4 - - - name: Load GPG key - run: | - curl https://packages.element.io/element-release-key.gpg | gpg --import - gpg -k "$GPG_FINGERPRINT" - env: - GPG_FINGERPRINT: ${{ vars.GPG_FINGERPRINT }} - - - name: Check current version on deployment - id: current_version - run: | - echo "version=v$(curl -s https://$SITE/version)" >> $GITHUB_OUTPUT - - # The current version bundle melding dance is skipped if the version we're deploying is the same - # as then we're just doing a re-deploy of the same version with potentially different configs. - - name: Download current version for its old bundles - id: current_download - if: steps.current_version.outputs.version != github.ref_name - uses: ./.github/actions/download-verify-element-tarball - with: - tag: ${{ steps.current_version.outputs.version }} - out-file-path: _current_version - - - name: Download target version - uses: ./.github/actions/download-verify-element-tarball - with: - tag: ${{ github.ref_name }} - out-file-path: _deploy - - - name: Merge current bundles into target - if: steps.current_download.outcome == 'success' - run: cp -vnpr _current_version/bundles/* _deploy/bundles/ - - - name: Copy config - run: cp element.io/app/config.json _deploy/config.json - - - name: Populate 404.html - run: echo "404 Not Found" > _deploy/404.html - - - name: Populate _headers - run: cp .github/cfp_headers _deploy/_headers - - - name: Wait for other steps to succeed - uses: t3chguy/wait-on-check-action@18541021811b56544d90e0f073401c2b99e249d6 # fork - with: - ref: ${{ github.sha }} - running-workflow-name: "Deploy to Cloudflare Pages" - repo-token: ${{ secrets.GITHUB_TOKEN }} - wait-interval: 10 - check-regexp: ^((?!SonarCloud|SonarQube|issue|board|label|Release|prepare|GitHub Pages).)*$ - - - name: Deploy to Cloudflare Pages - uses: cloudflare/pages-action@f0a1cd58cd66095dee69bfa18fa5efd1dde93bca # v1 - with: - apiToken: ${{ secrets.CF_PAGES_TOKEN }} - accountId: ${{ secrets.CF_PAGES_ACCOUNT_ID }} - projectName: ${{ env.SITE == 'staging.element.io' && 'element-web-staging' || 'element-web' }} - directory: _deploy - gitHubToken: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/dockerhub.yaml b/.github/workflows/dockerhub.yaml deleted file mode 100644 index 7911cf794a9..00000000000 --- a/.github/workflows/dockerhub.yaml +++ /dev/null @@ -1,79 +0,0 @@ -name: Dockerhub -on: - workflow_dispatch: {} - push: - tags: [v*] - schedule: - # This job can take a while, and we have usage limits, so just publish develop only twice a day - - cron: "0 7/12 * * *" -concurrency: ${{ github.workflow }}-${{ github.ref_name }} -permissions: {} -jobs: - buildx: - name: Docker Buildx - runs-on: ubuntu-24.04 - environment: dockerhub - permissions: - id-token: write # needed for signing the images with GitHub OIDC Token - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 # needed for docker-package to be able to calculate the version - - - name: Install Cosign - uses: sigstore/cosign-installer@dc72c7d5c4d10cd6bcb8cf6e3fd625a9e5e537da # v3 - - - name: Set up QEMU - uses: docker/setup-qemu-action@49b3bc8e6bdd4a60e6116a5414239cba5943d3cf # v3 - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@c47758b77c9736f4b2ef4073d4d51994fabfe349 # v3 - with: - install: true - - - name: Login to Docker Hub - uses: docker/login-action@9780b0c442fbb1117ed29e0efdff1e18412f7567 # v3 - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - - - name: Docker meta - id: meta - uses: docker/metadata-action@8e5442c4ef9f78752691e2d8f8d19755c6f78e81 # v5 - with: - images: | - vectorim/element-web - tags: | - type=ref,event=branch - type=ref,event=tag - flavor: | - latest=${{ contains(github.ref_name, '-rc.') && 'false' || 'auto' }} - - - name: Build and push - id: build-and-push - uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75 # v6 - with: - context: . - push: true - platforms: linux/amd64,linux/arm64 - tags: ${{ steps.meta.outputs.tags }} - labels: ${{ steps.meta.outputs.labels }} - - - name: Sign the images with GitHub OIDC Token - env: - DIGEST: ${{ steps.build-and-push.outputs.digest }} - TAGS: ${{ steps.meta.outputs.tags }} - run: | - images="" - for tag in ${TAGS}; do - images+="${tag}@${DIGEST} " - done - cosign sign --yes ${images} - - - name: Update repo description - uses: peter-evans/dockerhub-description@e98e4d1628a5f3be2be7c231e50981aee98723ae # v4 - continue-on-error: true - with: - username: ${{ secrets.DOCKERHUB_USERNAME }} - password: ${{ secrets.DOCKERHUB_TOKEN }} - repository: vectorim/element-web diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml deleted file mode 100644 index a301b6daf6f..00000000000 --- a/.github/workflows/docs.yml +++ /dev/null @@ -1,107 +0,0 @@ -name: Deploy documentation - -on: - push: - branches: [develop] - workflow_dispatch: {} - -permissions: {} - -concurrency: - group: "pages" - cancel-in-progress: false - -jobs: - build: - name: GitHub Pages - runs-on: ubuntu-24.04 - steps: - - name: Fetch element-desktop - uses: actions/checkout@v4 - with: - repository: element-hq/element-desktop - path: element-desktop - - - name: Fetch element-web - uses: actions/checkout@v4 - with: - path: element-web - - - name: Fetch matrix-js-sdk - uses: actions/checkout@v4 - with: - repository: matrix-org/matrix-js-sdk - path: matrix-js-sdk - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - cache-dependency-path: element-web/yarn.lock - node-version: "lts/*" - - - name: Generate automations docs - working-directory: element-web - run: | - yarn install --frozen-lockfile - yarn ts-node ./scripts/gen-workflow-mermaid.ts ../element-desktop ../element-web ../matrix-js-sdk > docs/automations.md - echo "- [Automations](automations.md)" >> docs/SUMMARY.md - - - name: Setup mdBook - uses: peaceiris/actions-mdbook@v2 - with: - mdbook-version: "0.4.10" - - - name: Install mdbook extensions - run: cargo install mdbook-combiner mdbook-mermaid - - - name: Prepare docs - run: | - mkdir docs - - mv element-desktop/README.md element-desktop/docs/ - mv element-desktop/docs "docs/Element Desktop" - - mv element-web/README.md element-web/docs/ - mv element-web/docs/lib docs/ - mv element-web/docs "docs/Element Web" - - mv matrix-js-sdk/README.md matrix-js-sdk/docs/ - mv matrix-js-sdk/docs "docs/Matrix JS SDK" - - sed -i -e 's/\.\.\/README.md/README.md/' docs/**/SUMMARY.md - - mdbook-combiner -m docs - sed -i -E 's/^\t# (.+)$/- [\1]()/gm;t' SUMMARY.md - sed -i -E 's/^- \[(.+)]\(<>\)$/---\n# \1/gm;t' SUMMARY.md - sed -i -E 's/\t- \[Introduction]/- [Introduction]/gm;t' SUMMARY.md - - cat < docs/SUMMARY.md - # Summary - - [Introduction]() - - EOF - cat SUMMARY.md >> docs/SUMMARY.md - - mv element-web/book.toml . - - - name: Build docs - run: mdbook build - - - name: Upload artifact - uses: actions/upload-pages-artifact@v3 - with: - path: ./book - - deploy: - environment: - name: github-pages - url: ${{ steps.deployment.outputs.page_url }} - runs-on: ubuntu-24.04 - permissions: - pages: write - id-token: write - needs: build - steps: - - name: Deploy to GitHub Pages - id: deployment - uses: actions/deploy-pages@v4 diff --git a/.github/workflows/end-to-end-tests-netlify.yaml b/.github/workflows/end-to-end-tests-netlify.yaml deleted file mode 100644 index e25994ec9df..00000000000 --- a/.github/workflows/end-to-end-tests-netlify.yaml +++ /dev/null @@ -1,46 +0,0 @@ -# Triggers after the playwright tests have finished, -# taking the artifact and uploading it to Netlify for easier viewing -name: Upload End to End Test report to Netlify -on: - workflow_run: - workflows: ["End to End Tests"] - types: - - completed - -concurrency: - group: ${{ github.workflow }}-${{ github.event.workflow_run.head_branch || github.run_id }} - cancel-in-progress: ${{ github.event.workflow_run.event == 'pull_request' }} - -permissions: {} - -jobs: - report: - if: github.event.workflow_run.conclusion != 'cancelled' - name: Report results - runs-on: ubuntu-24.04 - environment: Netlify - permissions: - statuses: write - deployments: write - actions: read - steps: - - name: Download HTML report - uses: actions/download-artifact@v4 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - run-id: ${{ github.event.workflow_run.id }} - name: html-report - path: playwright-report - - - name: 📤 Deploy to Netlify - uses: matrix-org/netlify-pr-preview@v3 - with: - path: playwright-report - owner: ${{ github.event.workflow_run.head_repository.owner.login }} - branch: ${{ github.event.workflow_run.head_branch }} - revision: ${{ github.event.workflow_run.head_sha }} - token: ${{ secrets.NETLIFY_AUTH_TOKEN }} - site_id: ${{ vars.NETLIFY_SITE_ID }} - desc: Playwright Report - deployment_env: EndToEndTests - prefix: "e2e-" diff --git a/.github/workflows/end-to-end-tests.yaml b/.github/workflows/end-to-end-tests.yaml deleted file mode 100644 index 1a31f750656..00000000000 --- a/.github/workflows/end-to-end-tests.yaml +++ /dev/null @@ -1,191 +0,0 @@ -# Produce a build of element-web with this version of react-sdk -# and any matching branches of element-web and js-sdk, output it -# as an artifact and run end-to-end tests. -name: End to End Tests -on: - pull_request: {} - merge_group: - types: [checks_requested] - push: - branches: [develop, master] - repository_dispatch: - types: [element-web-notify] - - # support triggering from other workflows - workflow_call: - inputs: - skip: - type: boolean - required: false - default: false - description: "A boolean to skip the playwright check itself while still creating the passing check. Useful when only running in Merge Queues." - - matrix-js-sdk-sha: - type: string - required: false - description: "The Git SHA of matrix-js-sdk to build against. By default, will use a matching branch name if it exists, or develop." - -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} - cancel-in-progress: true - -env: - # fetchdep.sh needs to know our PR number - PR_NUMBER: ${{ github.event.pull_request.number }} - -permissions: {} # No permissions required - -jobs: - build: - name: "Build Element-Web" - runs-on: ubuntu-24.04 - if: inputs.skip != true - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - repository: element-hq/element-web - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - node-version: "lts/*" - - - name: Fetch layered build - id: layered_build - env: - # tell layered.sh to check out the right sha of the JS-SDK & EW, if they were given one - JS_SDK_GITHUB_BASE_REF: ${{ inputs.matrix-js-sdk-sha }} - run: | - scripts/layered.sh - JSSDK_SHA=$(git -C matrix-js-sdk rev-parse --short=12 HEAD) - VECTOR_SHA=$(git rev-parse --short=12 HEAD) - echo "VERSION=$VECTOR_SHA--js-$JSSDK_SHA" >> $GITHUB_OUTPUT - - - name: Copy config - run: cp element.io/develop/config.json config.json - - - name: Build - env: - CI_PACKAGE: true - VERSION: "${{ steps.layered_build.outputs.VERSION }}" - run: | - yarn build - - - name: Upload Artifact - uses: actions/upload-artifact@v4 - with: - name: webapp - path: webapp - retention-days: 1 - - playwright: - name: "Run Tests ${{ matrix.runner }}/${{ strategy.job-total }}" - needs: build - if: inputs.skip != true - runs-on: ubuntu-22.04 - permissions: - actions: read - issues: read - pull-requests: read - strategy: - fail-fast: false - matrix: - # Run multiple instances in parallel to speed up the tests - runner: [1, 2, 3, 4, 5, 6] - steps: - - uses: actions/checkout@v4 - with: - persist-credentials: false - repository: element-hq/element-web - - - name: 📥 Download artifact - uses: actions/download-artifact@v4 - with: - name: webapp - path: webapp - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - cache-dependency-path: yarn.lock - node-version: "lts/*" - - - name: Install dependencies - run: yarn install --frozen-lockfile - - - name: Get installed Playwright version - id: playwright - run: echo "version=$(yarn list --pattern @playwright/test --depth=0 --json --non-interactive --no-progress | jq -r '.data.trees[].name')" >> $GITHUB_OUTPUT - - - name: Cache playwright binaries - uses: actions/cache@v4 - id: playwright-cache - with: - path: | - ~/.cache/ms-playwright - key: ${{ runner.os }}-playwright-${{ steps.playwright.outputs.version }} - - - name: Install Playwright browsers - if: steps.playwright-cache.outputs.cache-hit != 'true' - run: yarn playwright install --with-deps - - - name: Run Playwright tests - run: yarn playwright test --shard ${{ matrix.runner }}/${{ strategy.job-total }} - - - name: Upload blob report to GitHub Actions Artifacts - if: always() - uses: actions/upload-artifact@v4 - with: - name: all-blob-reports-${{ matrix.runner }} - path: blob-report - retention-days: 1 - - complete: - name: end-to-end-tests - needs: playwright - if: always() - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - if: inputs.skip != true - with: - persist-credentials: false - repository: element-hq/element-web - - - uses: actions/setup-node@v4 - if: inputs.skip != true - with: - cache: "yarn" - node-version: "lts/*" - - - name: Install dependencies - if: inputs.skip != true - run: yarn install --frozen-lockfile - - - name: Download blob reports from GitHub Actions Artifacts - if: inputs.skip != true - uses: actions/download-artifact@v4 - with: - pattern: all-blob-reports-* - path: all-blob-reports - merge-multiple: true - - - name: Merge into HTML Report - if: inputs.skip != true - run: yarn playwright merge-reports --reporter=html,./playwright/flaky-reporter.ts,./playwright/stale-screenshot-reporter.ts ./all-blob-reports - env: - # Only pass creds to the flaky-reporter on main branch runs - GITHUB_TOKEN: ${{ github.ref_name == 'develop' && secrets.ELEMENT_BOT_TOKEN || '' }} - - # Upload the HTML report even if one of our reporters fails, this can happen when stale screenshots are detected - - name: Upload HTML report - if: always() && inputs.skip != true - uses: actions/upload-artifact@v4 - with: - name: html-report - path: playwright-report - retention-days: 14 - - - if: needs.playwright.result != 'skipped' && needs.playwright.result != 'success' - run: exit 1 diff --git a/.github/workflows/issue_closed.yml b/.github/workflows/issue_closed.yml deleted file mode 100644 index 2cffae0011a..00000000000 --- a/.github/workflows/issue_closed.yml +++ /dev/null @@ -1,157 +0,0 @@ -# For duplicate issues, ensure the close type is right (not planned), update it if not -# For all closed (completed) issues, cascade the closure onto any referenced rageshakes -# For all closed (not planned) issues, comment on rageshakes to move them into the canonical issue if one exists -on: - issues: - types: [closed] -permissions: {} # We use ELEMENT_BOT_TOKEN instead -jobs: - tidy: - name: Tidy closed issues - runs-on: ubuntu-24.04 - steps: - - uses: actions/github-script@v7 - id: main - with: - # PAT needed as the GITHUB_TOKEN won't be able to see cross-references from other orgs (matrix-org) - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - script: | - const variables = { - owner: context.repo.owner, - name: context.repo.repo, - number: context.issue.number, - }; - - const query = `query($owner:String!, $name:String!, $number:Int!) { - repository(owner: $owner, name: $name) { - issue(number: $number) { - stateReason, - timelineItems(first: 100, itemTypes: [MARKED_AS_DUPLICATE_EVENT, UNMARKED_AS_DUPLICATE_EVENT, CROSS_REFERENCED_EVENT]) { - edges { - node { - __typename - ... on MarkedAsDuplicateEvent { - canonical { - ... on Issue { - repository { - nameWithOwner - } - number - } - ... on PullRequest { - repository { - nameWithOwner - } - number - } - } - } - ... on UnmarkedAsDuplicateEvent { - canonical { - ... on Issue { - repository { - nameWithOwner - } - number - } - ... on PullRequest { - repository { - nameWithOwner - } - number - } - } - } - ... on CrossReferencedEvent { - source { - ... on Issue { - repository { - nameWithOwner - } - number - } - ... on PullRequest { - repository { - nameWithOwner - } - number - } - } - } - } - } - } - } - } - }`; - - const result = await github.graphql(query, variables); - const { stateReason, timelineItems: { edges } } = result.repository.issue; - - const RAGESHAKE_OWNER = "matrix-org"; - const RAGESHAKE_REPO = "element-web-rageshakes"; - const rageshakes = new Set(); - const duplicateOf = new Set(); - - console.log("Edges: ", JSON.stringify(edges)); - - for (const { node } of edges) { - switch(node.__typename) { - case "MarkedAsDuplicateEvent": - duplicateOf.add(node.canonical.repository.nameWithOwner + "#" + node.canonical.number); - break; - case "UnmarkedAsDuplicateEvent": - duplicateOf.remove(node.canonical.repository.nameWithOwner + "#" + node.canonical.number); - break; - case "CrossReferencedEvent": - if (node.source.repository.nameWithOwner === (RAGESHAKE_OWNER + "/" + RAGESHAKE_REPO)) { - rageshakes.add(node.source.number); - } - break; - } - } - - console.log("Duplicate of: ", duplicateOf); - console.log("Found rageshakes: ", rageshakes); - - if (duplicateOf.size) { - const body = Array.from(duplicateOf).join("\n"); - - // Comment on all rageshakes to create relationship to the issue this was closed as duplicate of - for (const rageshake of rageshakes) { - github.rest.issues.createComment({ - owner: RAGESHAKE_OWNER, - repo: RAGESHAKE_REPO, - issue_number: rageshake, - body, - }); - } - - // Duplicate was closed with wrong reason, fix it - if (stateReason === "COMPLETED") { - core.setOutput("closeAsNotPlanned", "true"); - } - } else { - // This issue was closed, close all related rageshakes - for (const rageshake of rageshakes) { - github.rest.issues.update({ - owner: RAGESHAKE_OWNER, - repo: RAGESHAKE_REPO, - issue_number: rageshake, - state: "closed", - }); - } - } - - uses: actions/github-script@v7 - name: Close duplicate as Not Planned - if: steps.main.outputs.closeAsNotPlanned - with: - # We do this step separately, and with the default token so as to not re-trigger this workflow when re-closing - script: | - await github.graphql(`mutation($id:ID!) { - closeIssue(input: { issueId:$id, stateReason:NOT_PLANNED }) { - clientMutationId - } - }`, { - id: context.payload.issue.node_id, - }); diff --git a/.github/workflows/localazy_download.yaml b/.github/workflows/localazy_download.yaml deleted file mode 100644 index 435b8154ba5..00000000000 --- a/.github/workflows/localazy_download.yaml +++ /dev/null @@ -1,11 +0,0 @@ -name: Localazy Download -on: - workflow_dispatch: {} - schedule: - - cron: "0 6 * * 1,3,5" # Every Monday, Wednesday and Friday at 6am UTC -permissions: {} # We use ELEMENT_BOT_TOKEN instead -jobs: - download: - uses: matrix-org/matrix-web-i18n/.github/workflows/localazy_download.yaml@main - secrets: - ELEMENT_BOT_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/localazy_upload.yaml b/.github/workflows/localazy_upload.yaml deleted file mode 100644 index 8cb77439680..00000000000 --- a/.github/workflows/localazy_upload.yaml +++ /dev/null @@ -1,12 +0,0 @@ -name: Localazy Upload -on: - push: - branches: [develop] - paths: - - "src/i18n/strings/en_EN.json" -permissions: {} # No permissions needed -jobs: - upload: - uses: matrix-org/matrix-web-i18n/.github/workflows/localazy_upload.yaml@main - secrets: - LOCALAZY_WRITE_KEY: ${{ secrets.LOCALAZY_WRITE_KEY }} diff --git a/.github/workflows/netlify.yaml b/.github/workflows/netlify.yaml deleted file mode 100644 index 63bac7d33f5..00000000000 --- a/.github/workflows/netlify.yaml +++ /dev/null @@ -1,51 +0,0 @@ -# Triggers after the layered build has finished, taking the artifact -# and uploading it to netlify -name: Upload Preview Build to Netlify -on: - workflow_run: - workflows: ["End to End Tests"] - types: - - completed -jobs: - deploy: - if: github.event.workflow_run.conclusion != 'cancelled' && github.event.workflow_run.event == 'pull_request' - runs-on: ubuntu-24.04 - environment: Netlify - permissions: - actions: read - deployments: write - steps: - - name: 📝 Create Deployment - uses: bobheadxi/deployments@648679e8e4915b27893bd7dbc35cb504dc915bc8 # v1 - id: deployment - with: - step: start - token: ${{ secrets.GITHUB_TOKEN }} - env: Netlify - ref: ${{ github.event.workflow_run.head_sha }} - desc: | - Do you trust the author of this PR? Maybe this build will steal your keys or give you malware. - Exercise caution. Use test accounts. - - - name: 📥 Download artifact - uses: actions/download-artifact@v4 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - run-id: ${{ github.event.workflow_run.id }} - name: webapp - path: webapp - - - name: 📤 Deploy to Netlify - uses: matrix-org/netlify-pr-preview@v3 - with: - path: webapp - owner: ${{ github.event.workflow_run.head_repository.owner.login }} - branch: ${{ github.event.workflow_run.head_branch }} - revision: ${{ github.event.workflow_run.head_sha }} - token: ${{ secrets.NETLIFY_AUTH_TOKEN }} - site_id: ${{ vars.NETLIFY_SITE_ID }} - deployment_env: ${{ steps.deployment.outputs.env }} - deployment_id: ${{ steps.deployment.outputs.deployment_id }} - desc: | - Do you trust the author of this PR? Maybe this build will steal your keys or give you malware. - Exercise caution. Use test accounts. diff --git a/.github/workflows/pending-reviews.yaml b/.github/workflows/pending-reviews.yaml deleted file mode 100644 index c96ed3f17e8..00000000000 --- a/.github/workflows/pending-reviews.yaml +++ /dev/null @@ -1,92 +0,0 @@ -name: Pending reviews automation -on: - # The bot exceeded its API rate limit. Disabling for now (adding workflow dispatch so the workflow file stays valid & we can test to see if it starts working again) - workflow_dispatch: {} - # We run it on a schedule instead of on pull_request_* events to not create confusing messaging in the PR - #schedule: - # - cron: "*/10 * * * *" -concurrency: ${{ github.workflow }} -permissions: {} # We use ELEMENT_BOT_TOKEN instead -jobs: - bot: - name: Pending reviews bot - runs-on: ubuntu-24.04 - environment: Matrix - env: - URL: "https://github.com/pulls?q=is%3Apr+is%3Aopen+repo%3Amatrix-org%2Fmatrix-js-sdk+repo%3Amatrix-org%2Fmatrix-react-sdk+repo%3Aelement-hq%2Felement-web+repo%3Aelement-hq%2Felement-desktop+review-requested%3A%40me+sort%3Aupdated-desc+" - RELEASE_BLOCKERS_URL: "https://github.com/pulls?q=is%3Aopen+repo%3Amatrix-org%2Fmatrix-js-sdk+repo%3Amatrix-org%2Fmatrix-react-sdk+repo%3Aelement-hq%2Felement-web+repo%3Aelement-hq%2Felement-desktop+sort%3Aupdated-desc+label%3AX-Release-Blocker+" - steps: - - uses: actions/github-script@v7 - env: - HS_URL: ${{ secrets.BETABOT_HS_URL }} - ROOM_ID: ${{ secrets.ROOM_ID }} - TOKEN: ${{ secrets.BETABOT_ACCESS_TOKEN }} - with: - # PAT needed as the GITHUB_TOKEN won't be able to see cross-references from other orgs (matrix-org) - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - script: | - const { HS_URL, ROOM_ID, TOKEN, URL, RELEASE_BLOCKERS_URL } = process.env; - - async function updateCounter(counter, link, severity, title, value, clearOnZero) { - const apiUrl = `${HS_URL}/_matrix/client/v3/rooms/${ROOM_ID}/state/re.jki.counter/${counter}`; - const headers = { - "Content-Type": "application/json", - "Authorization": `Bearer ${TOKEN}`, - }; - const res = await fetch(apiUrl, { - method: "GET", - headers, - }); - - const data = await res.json(); - - if (data.value === issueCount) { - console.log("Pending review count already correct"); - return; - } - - let body = {}; - if (issueCount || !clearOnZero) { - body = JSON.stringify({ - link, - severity, - title, - value, - }); - } - - await fetch(apiUrl, { - method: "PUT", - body, - headers, - }); - } - - const repos = [ - "element-hq/element-desktop", - "element-hq/element-web", - "matrix-org/matrix-js-sdk", - ]; - const teams = [ - "matrix-org/element-web-team", - "matrix-org/element-web-reviewers", - "element-hq/element-web-team", - "element-hq/element-web-reviewers", - ]; - - let issueCount = 0; - for (const team of teams) { - const org = team.split("/", 2)[0]; - const reposInOrg = repos.filter(repo => repo.startsWith(org + "/")); - const { data } = await github.rest.search.issuesAndPullRequests({ - q: `is:pr is:open review:required ${reposInOrg.map(r => `repo:${r}`).join(" ")} team-review-requested:${team}`, - }); - issueCount += data.total_count; - } - await updateCounter("gh_reviews", URL, "warning", "Pending reviews", issueCount); - - const { data } = await github.rest.search.issuesAndPullRequests({ - q: `is:open ${repos.map(repo => `repo:${repo}`).join(" ")} label:X-Release-Blocker`, - }); - const blockerCount = data.total_count; - await updateCounter("release_blockers", RELEASE_BLOCKERS_URL, "alert", "Release Blockers", blockerCount, true); diff --git a/.github/workflows/playwright-image-updates.yaml b/.github/workflows/playwright-image-updates.yaml deleted file mode 100644 index 1613b42dfb7..00000000000 --- a/.github/workflows/playwright-image-updates.yaml +++ /dev/null @@ -1,48 +0,0 @@ -name: Update Playwright docker images -on: - workflow_dispatch: {} - schedule: - - cron: "0 6 * * *" # Every day at 6am UTC -permissions: {} -jobs: - update: - runs-on: ubuntu-24.04 - permissions: - pull-requests: write - steps: - - uses: actions/checkout@v4 - - - name: Update synapse image - run: | - docker pull "$IMAGE" - INSPECT=$(docker inspect --format='{{index .RepoDigests 0}}' "$IMAGE") - DIGEST=${INSPECT#*@} - sed -i "s/const DOCKER_TAG.*/const DOCKER_TAG = \"develop@$DIGEST\";/" playwright/plugins/homeserver/synapse/index.ts - env: - IMAGE: ghcr.io/element-hq/synapse:develop - - - name: Create Pull Request - id: cpr - uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7 - with: - token: ${{ secrets.ELEMENT_BOT_TOKEN }} - branch: actions/playwright-image-updates - delete-branch: true - title: Playwright Docker image updates - labels: | - T-Task - - - name: Enable automerge - run: gh pr merge --merge --auto "$PR_NUMBER" - if: steps.cpr.outputs.pull-request-operation == 'created' - env: - GH_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - PR_NUMBER: ${{ steps.cpr.outputs.pull-request-number }} - - - name: Enable autoapprove - run: | - gh pr review --approve "$PR_NUMBER" - if: steps.cpr.outputs.pull-request-operation == 'created' - env: - GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - PR_NUMBER: ${{ steps.cpr.outputs.pull-request-number }} diff --git a/.github/workflows/pull_request.yaml b/.github/workflows/pull_request.yaml deleted file mode 100644 index 2f97ccbbb41..00000000000 --- a/.github/workflows/pull_request.yaml +++ /dev/null @@ -1,14 +0,0 @@ -name: Pull Request -on: - pull_request_target: - types: [opened, edited, labeled, unlabeled, synchronize] - merge_group: - types: [checks_requested] -permissions: {} -jobs: - action: - uses: matrix-org/matrix-js-sdk/.github/workflows/pull_request.yaml@develop - permissions: - pull-requests: read - secrets: - ELEMENT_BOT_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/pull_request_base_branch.yaml b/.github/workflows/pull_request_base_branch.yaml deleted file mode 100644 index 6610ee48791..00000000000 --- a/.github/workflows/pull_request_base_branch.yaml +++ /dev/null @@ -1,17 +0,0 @@ -name: Pull Request Base Branch -on: - pull_request: - types: [opened, edited, synchronize] -permissions: {} # No permissions required -jobs: - check_base_branch: - name: Check PR base branch - runs-on: ubuntu-24.04 - steps: - - uses: actions/github-script@v7 - with: - script: | - const baseBranch = context.payload.pull_request.base.ref; - if (!['develop', 'staging'].includes(baseBranch) && !baseBranch.startsWith('feat/')) { - core.setFailed(`Invalid base branch: ${baseBranch}`); - } diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml deleted file mode 100644 index c4bf8e6ab30..00000000000 --- a/.github/workflows/release-drafter.yml +++ /dev/null @@ -1,12 +0,0 @@ -name: Release Drafter -on: - push: - branches: [staging] - workflow_dispatch: {} -concurrency: ${{ github.workflow }} -permissions: {} -jobs: - draft: - permissions: - contents: write - uses: matrix-org/matrix-js-sdk/.github/workflows/release-drafter-workflow.yml@develop diff --git a/.github/workflows/release-gitflow.yml b/.github/workflows/release-gitflow.yml deleted file mode 100644 index 128c6a1e05d..00000000000 --- a/.github/workflows/release-gitflow.yml +++ /dev/null @@ -1,15 +0,0 @@ -# Gitflow merge-back master->develop -name: Merge master -> develop -on: - push: - branches: [master] -concurrency: ${{ github.repository }}-${{ github.workflow }} -permissions: {} # We use ELEMENT_BOT_TOKEN instead -jobs: - merge: - uses: matrix-org/matrix-js-sdk/.github/workflows/release-gitflow.yml@develop - secrets: - ELEMENT_BOT_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - with: - dependencies: | - matrix-js-sdk diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml deleted file mode 100644 index 2ecc4a46626..00000000000 --- a/.github/workflows/release.yml +++ /dev/null @@ -1,68 +0,0 @@ -name: Release Process -on: - workflow_dispatch: - inputs: - mode: - description: What type of release - required: true - default: rc - type: choice - options: - - rc - - final -concurrency: ${{ github.workflow }} -permissions: {} -jobs: - release: - uses: matrix-org/matrix-js-sdk/.github/workflows/release-make.yml@develop - permissions: - contents: write - issues: write - secrets: - ELEMENT_BOT_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }} - GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }} - with: - final: ${{ inputs.mode == 'final' }} - gpg-fingerprint: ${{ vars.GPG_FINGERPRINT }} - asset-path: dist/*.tar.gz - expected-asset-count: 3 - - notify-downstream: - name: Trigger release drafter downstream - needs: release - runs-on: ubuntu-24.04 - steps: - - name: Notify element-desktop repo that element-web release has completed to re-trigger release-drafter - uses: benc-uk/workflow-dispatch@e2e5e9a103e331dad343f381a29e654aea3cf8fc # v1 - with: - workflow: release-drafter.yml - repo: element-hq/element-desktop - ref: staging - # Required when using the `repo` option. Either a PAT or a token generated from the GitHub app or CLI - token: "${{ secrets.ELEMENT_BOT_TOKEN }}" - - check: - name: Post release checks - needs: release - runs-on: ubuntu-24.04 - permissions: - checks: read - steps: - - name: Wait for dockerhub - uses: t3chguy/wait-on-check-action@18541021811b56544d90e0f073401c2b99e249d6 # fork - with: - ref: master - repo-token: ${{ secrets.GITHUB_TOKEN }} - wait-interval: 10 - check-name: "Docker Buildx" - allowed-conclusions: success - - - name: Wait for debian package - uses: t3chguy/wait-on-check-action@18541021811b56544d90e0f073401c2b99e249d6 # fork - with: - ref: master - repo-token: ${{ secrets.GITHUB_TOKEN }} - wait-interval: 10 - check-name: Build package - allowed-conclusions: success diff --git a/.github/workflows/release_prepare.yml b/.github/workflows/release_prepare.yml deleted file mode 100644 index b655bb42061..00000000000 --- a/.github/workflows/release_prepare.yml +++ /dev/null @@ -1,111 +0,0 @@ -name: Cut branches -on: - workflow_dispatch: - inputs: - element-desktop: - description: Prepare element-desktop - required: true - type: boolean - default: true - element-web: - description: Prepare element-web - required: true - type: boolean - default: true - matrix-js-sdk: - description: Prepare matrix-js-sdk - required: true - type: boolean - default: true -permissions: {} # Uses ELEMENT_BOT_TOKEN instead -jobs: - prepare: - runs-on: ubuntu-24.04 - env: - # The order is specified bottom-up to avoid any races for allchange - REPOS: matrix-js-sdk element-web element-desktop - steps: - - name: Checkout Element Desktop - uses: actions/checkout@v4 - if: inputs.element-desktop - with: - repository: element-hq/element-desktop - path: element-desktop - ref: staging - fetch-depth: 0 - fetch-tags: true - token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - name: Checkout Element Web - uses: actions/checkout@v4 - if: inputs.element-web - with: - repository: element-hq/element-web - path: element-web - ref: staging - fetch-depth: 0 - fetch-tags: true - token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - name: Checkout Matrix JS SDK - uses: actions/checkout@v4 - if: inputs.matrix-js-sdk - with: - repository: matrix-org/matrix-js-sdk - path: matrix-js-sdk - ref: staging - fetch-depth: 0 - fetch-tags: true - token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - - name: Prepare Git - run: | - git config --global user.email "releases@riot.im" - git config --global user.name "RiotRobot" - - - name: Merge Element Desktop - if: inputs.element-desktop - run: | - git -C "element-desktop" merge origin/develop - - name: Merge Element Web - if: inputs.element-web - run: | - git -C "element-web" merge origin/develop - - name: Merge JS SDK - if: inputs.matrix-js-sdk - run: | - git -C "matrix-js-sdk" merge origin/develop - - - name: Push staging - run: for REPO in $REPOS; do [ -d "$REPO" ] && git -C "$REPO" push origin staging; done - - - name: Wait for matrix-js-sdk draft - if: inputs.matrix-js-sdk - uses: t3chguy/wait-on-check-action@18541021811b56544d90e0f073401c2b99e249d6 # fork - with: - ref: staging - repo: matrix-org/matrix-js-sdk - repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - wait-interval: 10 - check-name: draft - allowed-conclusions: success - - - name: Wait for element-web draft - if: inputs.element-web - uses: t3chguy/wait-on-check-action@18541021811b56544d90e0f073401c2b99e249d6 # fork - with: - ref: staging - repo: element-hq/element-web - repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - wait-interval: 10 - check-name: draft - allowed-conclusions: success - - - name: Wait for element-desktop draft - if: inputs.element-desktop - uses: t3chguy/wait-on-check-action@18541021811b56544d90e0f073401c2b99e249d6 # fork - with: - ref: staging - repo: element-hq/element-desktop - repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - wait-interval: 10 - check-name: draft - allowed-conclusions: success diff --git a/.github/workflows/sonarqube.yml b/.github/workflows/sonarqube.yml deleted file mode 100644 index 0ee457bac21..00000000000 --- a/.github/workflows/sonarqube.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: SonarQube -on: - workflow_run: - workflows: ["Tests"] - types: - - completed -concurrency: - group: ${{ github.workflow }}-${{ github.event.workflow_run.head_branch }} - cancel-in-progress: true -permissions: {} -jobs: - sonarqube: - name: 🩻 SonarQube - if: github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event != 'merge_group' - uses: matrix-org/matrix-js-sdk/.github/workflows/sonarcloud.yml@develop - permissions: - actions: read - statuses: write - id-token: write # sonar - secrets: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - ELEMENT_BOT_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - with: - sharded: true diff --git a/.github/workflows/static_analysis.yaml b/.github/workflows/static_analysis.yaml deleted file mode 100644 index b7c02c3f2e9..00000000000 --- a/.github/workflows/static_analysis.yaml +++ /dev/null @@ -1,140 +0,0 @@ -name: Static Analysis -on: - pull_request: {} - push: - branches: [develop, master] - merge_group: - types: [checks_requested] - repository_dispatch: - types: [element-web-notify] -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} - cancel-in-progress: true - -env: - # These must be set for fetchdep.sh to get the right branch - REPOSITORY: ${{ github.repository }} - PR_NUMBER: ${{ github.event.pull_request.number }} - -permissions: {} # No permissions required - -jobs: - ts_lint: - name: "Typescript Syntax Check" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - node-version: "lts/*" - - - name: Install Dependencies - run: "./scripts/layered.sh" - - - name: Typecheck - run: "yarn run lint:types" - - i18n_lint: - name: "i18n Check" - uses: matrix-org/matrix-web-i18n/.github/workflows/i18n_check.yml@main - permissions: - pull-requests: read - with: - hardcoded-words: "Element" - allowed-hardcoded-keys: | - console_dev_note - labs|element_call_video_rooms - labs|feature_disable_call_per_sender_encryption - voip|element_call - error|invalid_json - error|misconfigured - welcome_to_element - - rethemendex_lint: - name: "Rethemendex Check" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - run: ./res/css/rethemendex.sh - - - run: git diff --exit-code - - js_lint: - name: "ESLint" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - node-version: "lts/*" - - # Does not need branch matching as only analyses this layer - - name: Install Deps - run: "yarn install --frozen-lockfile" - - - name: Run Linter - run: "yarn run lint:js" - - style_lint: - name: "Style Lint" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - node-version: "lts/*" - - # Does not need branch matching as only analyses this layer - - name: Install Deps - run: "yarn install" - - - name: Run Linter - run: "yarn run lint:style" - - workflow_lint: - name: "Workflow Lint" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - node-version: "lts/*" - - # Does not need branch matching as only analyses this layer - - name: Install Deps - run: "yarn install --frozen-lockfile" - - - name: Run Linter - run: "yarn lint:workflows" - - analyse_dead_code: - name: "Analyse Dead Code" - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - node-version: "lts/*" - - - name: Install Deps - run: "yarn install --frozen-lockfile" - - - name: Run linter - run: "yarn run lint:knip" - - - name: Install Deps - run: "scripts/layered.sh" - - - name: Dead Code Analysis - run: "yarn run analyse:unused-exports" diff --git a/.github/workflows/sync-labels.yml b/.github/workflows/sync-labels.yml deleted file mode 100644 index fa1be485bb0..00000000000 --- a/.github/workflows/sync-labels.yml +++ /dev/null @@ -1,24 +0,0 @@ -name: Sync labels -on: - workflow_dispatch: {} - schedule: - - cron: "0 1 * * *" # 1am every day - push: - branches: - - develop - paths: - - .github/labels.yml - -permissions: {} # We use ELEMENT_BOT_TOKEN instead - -jobs: - sync-labels: - uses: element-hq/element-meta/.github/workflows/sync-labels.yml@develop - with: - LABELS: | - element-hq/element-meta - .github/labels.yml - DELETE: true - WET: true - secrets: - ELEMENT_BOT_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml deleted file mode 100644 index 14fd5ffd648..00000000000 --- a/.github/workflows/tests.yml +++ /dev/null @@ -1,114 +0,0 @@ -name: Tests -on: - pull_request: {} - merge_group: - types: [checks_requested] - push: - branches: [develop, master] - repository_dispatch: - types: [element-web-notify] - workflow_call: - inputs: - disable_coverage: - type: boolean - required: false - description: "Specify true to skip generating and uploading coverage for tests" - matrix-js-sdk-sha: - type: string - required: false - description: "The matrix-js-sdk SHA to use" -concurrency: - group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event_name }} - cancel-in-progress: true - -env: - ENABLE_COVERAGE: ${{ github.event_name != 'merge_group' && inputs.disable_coverage != 'true' }} - # fetchdep.sh needs to know our PR number - PR_NUMBER: ${{ github.event.pull_request.number }} - -permissions: {} - -jobs: - jest: - name: Jest - runs-on: ubuntu-24.04 - strategy: - fail-fast: false - matrix: - # Run multiple instances in parallel to speed up the tests - runner: [1, 2] - steps: - - name: Checkout code - uses: actions/checkout@v4 - with: - repository: ${{ inputs.matrix-js-sdk-sha && 'element-hq/element-web' || github.repository }} - - - name: Yarn cache - uses: actions/setup-node@v4 - with: - node-version: "lts/*" - cache: "yarn" - - - name: Install Deps - run: "./scripts/layered.sh" - env: - JS_SDK_GITHUB_BASE_REF: ${{ inputs.matrix-js-sdk-sha }} - - - name: Jest Cache - uses: actions/cache@v4 - with: - path: /tmp/jest_cache - key: ${{ hashFiles('**/yarn.lock') }} - - - name: Get number of CPU cores - id: cpu-cores - uses: SimenB/github-actions-cpu-cores@97ba232459a8e02ff6121db9362b09661c875ab8 # v2 - - - name: Run tests - run: | - yarn test \ - --coverage=${{ env.ENABLE_COVERAGE }} \ - --ci \ - --max-workers ${{ steps.cpu-cores.outputs.count }} \ - --shard ${{ matrix.runner }}/${{ strategy.job-total }} \ - --cacheDirectory /tmp/jest_cache - env: - JEST_SONAR_UNIQUE_OUTPUT_NAME: true - - # tell jest to use coloured output - FORCE_COLOR: true - - - name: Move coverage files into place - if: env.ENABLE_COVERAGE == 'true' - run: mv coverage/lcov.info coverage/${{ steps.setupNode.outputs.node-version }}-${{ matrix.runner }}.lcov.info - - - name: Upload Artifact - if: env.ENABLE_COVERAGE == 'true' - uses: actions/upload-artifact@v4 - with: - name: coverage-${{ matrix.runner }} - path: | - coverage - !coverage/lcov-report - - complete: - name: jest-tests - needs: jest - if: always() - runs-on: ubuntu-24.04 - permissions: - statuses: write - steps: - - if: needs.jest.result != 'skipped' && needs.jest.result != 'success' - run: exit 1 - - - name: Skip SonarCloud in merge queue - if: github.event_name == 'merge_group' || inputs.disable_coverage == 'true' - uses: guibranco/github-status-action-v2@1f26a0237cd1a57626fbb5a0eb2494c9b8797d07 - with: - authToken: ${{ secrets.GITHUB_TOKEN }} - state: success - description: SonarCloud skipped - context: SonarCloud Code Analysis - sha: ${{ github.sha }} - target_url: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }} diff --git a/.github/workflows/triage-assigned.yml b/.github/workflows/triage-assigned.yml deleted file mode 100644 index e43eb946183..00000000000 --- a/.github/workflows/triage-assigned.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Move issued assigned to specific team members to their boards - -on: - issues: - types: [assigned] - -permissions: {} # We use ELEMENT_BOT_TOKEN instead - -jobs: - web-app-team: - runs-on: ubuntu-24.04 - if: | - contains(github.event.issue.assignees.*.login, 't3chguy') || - contains(github.event.issue.assignees.*.login, 'andybalaam') || - contains(github.event.issue.assignees.*.login, 'MidhunSureshR') - steps: - - uses: actions/add-to-project@main - with: - project-url: https://github.com/orgs/element-hq/projects/67 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-incoming.yml b/.github/workflows/triage-incoming.yml deleted file mode 100644 index b084b4d55eb..00000000000 --- a/.github/workflows/triage-incoming.yml +++ /dev/null @@ -1,16 +0,0 @@ -name: Move new issues into Issue triage board - -on: - issues: - types: [opened] - -permissions: {} # We use ELEMENT_BOT_TOKEN instead - -jobs: - automate-project-columns: - runs-on: ubuntu-24.04 - steps: - - uses: actions/add-to-project@main - with: - project-url: https://github.com/orgs/element-hq/projects/120 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-labelled.yml b/.github/workflows/triage-labelled.yml deleted file mode 100644 index 2cb05a8bcff..00000000000 --- a/.github/workflows/triage-labelled.yml +++ /dev/null @@ -1,178 +0,0 @@ -name: Move labelled issues to correct projects - -on: - issues: - types: [labeled] - workflow_call: - secrets: - ELEMENT_BOT_TOKEN: - required: true - -permissions: {} # We use ELEMENT_BOT_TOKEN instead - -jobs: - apply_Z-Labs_label: - name: Add Z-Labs label for features behind labs flags - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'A-Maths') || - contains(github.event.issue.labels.*.name, 'A-Location-Sharing') || - contains(github.event.issue.labels.*.name, 'Z-IA') || - contains(github.event.issue.labels.*.name, 'A-Jump-To-Date ') || - contains(github.event.issue.labels.*.name, 'A-Themes-Custom') || - contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') || - contains(github.event.issue.labels.*.name, 'A-Tags') || - contains(github.event.issue.labels.*.name, 'A-Video-Rooms') || - contains(github.event.issue.labels.*.name, 'A-Message-Starring') || - contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor') || - contains(github.event.issue.labels.*.name, 'A-Element-Call') - steps: - - uses: actions/github-script@v7 - with: - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['Z-Labs'] - }) - - apply_Help-Wanted_label: - name: Add "Help Wanted" label to all "good first issue" and Hacktoberfest - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'good first issue') || - contains(github.event.issue.labels.*.name, 'Hacktoberfest') - steps: - - uses: actions/github-script@v7 - with: - script: | - github.rest.issues.addLabels({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - labels: ['Help Wanted'] - }) - - move_needs_info_issues: - name: X-Needs-Info issues to Need info column on triage board - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'X-Needs-Info') - steps: - - id: add_to_project - uses: actions/add-to-project@v1.0.2 - with: - project-url: ${{ env.PROJECT_URL }} - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - - id: set_fields - uses: titoportas/update-project-fields@421a54430b3cdc9eefd8f14f9ce0142ab7678751 # v0.1.0 - with: - project-url: ${{ env.PROJECT_URL }} - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - item-id: ${{ steps.add_to_project.outputs.itemId }} # Use the item-id output of the previous step - field-keys: Status - field-values: "Needs info" - env: - PROJECT_URL: https://github.com/orgs/element-hq/projects/120 - - move_flakey_test_issues: - name: Z-Flaky-Test issues to Sized for maintainer column on triage board - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'Z-Flaky-Test') - steps: - - id: add_to_project - uses: actions/add-to-project@v1.0.2 - with: - project-url: ${{ env.PROJECT_URL }} - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - - id: set_fields - uses: titoportas/update-project-fields@421a54430b3cdc9eefd8f14f9ce0142ab7678751 # v0.1.0 - with: - project-url: ${{ env.PROJECT_URL }} - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - item-id: ${{ steps.add_to_project.outputs.itemId }} # Use the item-id output of the previous step - field-keys: Status - field-values: "Sized for maintainer" - env: - PROJECT_URL: https://github.com/orgs/element-hq/projects/120 - - add_priority_design_issues_to_project: - name: P1 X-Needs-Design to Design project board - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'X-Needs-Design') && - (contains(github.event.issue.labels.*.name, 'S-Critical') && - (contains(github.event.issue.labels.*.name, 'O-Frequent') || - contains(github.event.issue.labels.*.name, 'O-Occasional')) || - contains(github.event.issue.labels.*.name, 'S-Major') && - contains(github.event.issue.labels.*.name, 'O-Frequent') || - contains(github.event.issue.labels.*.name, 'A11y')) - steps: - - uses: actions/add-to-project@main - with: - project-url: https://github.com/orgs/element-hq/projects/18 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - add_product_issues: - name: X-Needs-Product to product project board - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'X-Needs-Product') - steps: - - uses: actions/add-to-project@main - with: - project-url: https://github.com/orgs/element-hq/projects/28 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - Search_issues_to_board: - name: Search issues to project board - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'A-New-Search-Experience') - steps: - - uses: actions/add-to-project@main - with: - project-url: https://github.com/orgs/element-hq/projects/48 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - voip: - name: Add labelled issues to VoIP project board - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'Team: VoIP') - steps: - - uses: actions/add-to-project@main - with: - project-url: https://github.com/orgs/element-hq/projects/41 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - verticals_feature: - name: Add labelled issues to Verticals Feature project - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'Team: Verticals Feature') - steps: - - uses: actions/add-to-project@main - with: - project-url: https://github.com/orgs/element-hq/projects/57 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - tech_debt: - name: Add labelled issues to tech debt project - runs-on: ubuntu-24.04 - if: > - contains(github.event.issue.labels.*.name, 'A-Developer-Experience') || - contains(github.event.issue.labels.*.name, 'A-Documentation') || - contains(github.event.issue.labels.*.name, 'A-Packaging') || - contains(github.event.issue.labels.*.name, 'A-Technical-Debt') || - contains(github.event.issue.labels.*.name, 'A-Testing') || - contains(github.event.issue.labels.*.name, 'Z-Flaky-Test') - steps: - - uses: actions/add-to-project@main - with: - project-url: https://github.com/orgs/element-hq/projects/101 - github-token: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-move-review-requests.yml b/.github/workflows/triage-move-review-requests.yml deleted file mode 100644 index d3bcda270bb..00000000000 --- a/.github/workflows/triage-move-review-requests.yml +++ /dev/null @@ -1,140 +0,0 @@ -name: Move pull requests asking for review to the relevant project -on: - pull_request_target: - types: [review_requested] - -permissions: {} # Uses ELEMENT_BOT_TOKEN instead -jobs: - add_design_pr_to_project: - name: Move PRs asking for design review to the design board - runs-on: ubuntu-24.04 - steps: - - uses: octokit/graphql-action@v2.x - id: find_team_members - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - query find_team_members($team: String!) { - organization(login: "element-hq") { - team(slug: $team) { - members { - nodes { - login - } - } - } - } - } - team: ${{ env.TEAM }} - env: - TEAM: "design" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - - id: any_matching_reviewers - run: | - # Fetch requested reviewers, and people who are on the team - echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json - echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json - jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt - jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt - - # Fetch requested team reviewers, and the name of the team - echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json - jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt - echo '${{ env.TEAM }}' | tee /tmp/team.txt - - # If either a reviewer matches a team member, or a team matches our team, say "true" - if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then - echo "match=true" >> $GITHUB_OUTPUT - elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then - echo "match=true" >> $GITHUB_OUTPUT - else - echo "match=false" >> $GITHUB_OUTPUT - fi - env: - TEAM: "design" - - uses: octokit/graphql-action@v2.x - id: add_to_project - if: steps.any_matching_reviewers.outputs.match == 'true' - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!, $contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.pull_request.node_id }} - env: - PROJECT_ID: "PVT_kwDOAM0swc0sUA" - TEAM: "design" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - - add_product_pr_to_project: - name: Move PRs asking for design review to the design board - runs-on: ubuntu-24.04 - steps: - - uses: octokit/graphql-action@v2.x - id: find_team_members - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - query find_team_members($team: String!) { - organization(login: "element-hq") { - team(slug: $team) { - members { - nodes { - login - } - } - } - } - } - team: ${{ env.TEAM }} - env: - TEAM: "product" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} - - id: any_matching_reviewers - run: | - # Fetch requested reviewers, and people who are on the team - echo '${{ tojson(fromjson(steps.find_team_members.outputs.data).organization.team.members.nodes[*].login) }}' | tee /tmp/team_members.json - echo '${{ tojson(github.event.pull_request.requested_reviewers[*].login) }}' | tee /tmp/reviewers.json - jq --raw-output .[] < /tmp/team_members.json | sort | tee /tmp/team_members.txt - jq --raw-output .[] < /tmp/reviewers.json | sort | tee /tmp/reviewers.txt - - # Fetch requested team reviewers, and the name of the team - echo '${{ tojson(github.event.pull_request.requested_teams[*].slug) }}' | tee /tmp/team_reviewers.json - jq --raw-output .[] < /tmp/team_reviewers.json | sort | tee /tmp/team_reviewers.txt - echo '${{ env.TEAM }}' | tee /tmp/team.txt - - # If either a reviewer matches a team member, or a team matches our team, say "true" - if [ $(join /tmp/team_members.txt /tmp/reviewers.txt | wc -l) != 0 ]; then - echo "match=true" >> $GITHUB_OUTPUT - elif [ $(join /tmp/team.txt /tmp/team_reviewers.txt | wc -l) != 0 ]; then - echo "match=true" >> $GITHUB_OUTPUT - else - echo "match=false" >> $GITHUB_OUTPUT - fi - env: - TEAM: "product" - - uses: octokit/graphql-action@v2.x - id: add_to_project - if: steps.any_matching_reviewers.outputs.match == 'true' - with: - headers: '{"GraphQL-Features": "projects_next_graphql"}' - query: | - mutation add_to_project($projectid:ID!, $contentid:ID!) { - addProjectV2ItemById(input: {projectId: $projectid contentId: $contentid}) { - item { - id - } - } - } - projectid: ${{ env.PROJECT_ID }} - contentid: ${{ github.event.pull_request.node_id }} - env: - PROJECT_ID: "PVT_kwDOAM0swc4AAg6N" - TEAM: "product" - GITHUB_TOKEN: ${{ secrets.ELEMENT_BOT_TOKEN }} diff --git a/.github/workflows/triage-stale-flaky-tests.yml b/.github/workflows/triage-stale-flaky-tests.yml deleted file mode 100644 index 90ba7c40f75..00000000000 --- a/.github/workflows/triage-stale-flaky-tests.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Close stale flaky issues -on: - schedule: - - cron: "30 1 * * *" -permissions: {} -jobs: - close: - runs-on: ubuntu-24.04 - permissions: - actions: write - issues: write - steps: - - uses: actions/stale@v9 - with: - only-labels: "Z-Flaky-Test" - days-before-stale: 14 - days-before-close: 0 - close-issue-message: "This flaky test issue has not been updated in 14 days. It is being closed as presumed resolved." - exempt-issue-labels: "Z-Flaky-Test-Disabled" diff --git a/.github/workflows/triage-unlabelled.yml b/.github/workflows/triage-unlabelled.yml deleted file mode 100644 index efbf80eea99..00000000000 --- a/.github/workflows/triage-unlabelled.yml +++ /dev/null @@ -1,73 +0,0 @@ -name: Move unlabelled from needs info columns to triaged - -on: - issues: - types: [unlabeled] -permissions: {} -jobs: - Move_Unabeled_Issue_On_Project_Board: - name: Move no longer X-Needs-Info issues to Triaged - runs-on: ubuntu-24.04 - permissions: - repository-projects: read - if: > - ${{ - !contains(github.event.issue.labels.*.name, 'X-Needs-Info') }} - env: - BOARD_NAME: "Issue triage" - OWNER: ${{ github.repository_owner }} - REPO: ${{ github.event.repository.name }} - ISSUE: ${{ github.event.issue.number }} - steps: - - name: Check if issue is already in "${{ env.BOARD_NAME }}" - run: | - json=$(curl -s -H 'Content-Type: application/json' -H "Authorization: bearer ${{ secrets.GITHUB_TOKEN }}" -X POST -d '{"query": "query($issue: Int!, $owner: String!, $repo: String!) { repository(owner: $owner, name: $repo) { issue(number: $issue) { projectCards { nodes { project { name } isArchived } } } } } ", "variables" : "{ \"issue\": '${ISSUE}', \"owner\": \"'${OWNER}'\", \"repo\": \"'${REPO}'\" }" }' https://api.github.com/graphql) - if echo $json | jq '.data.repository.issue.projectCards.nodes | length'; then - if [[ $(echo $json | jq '.data.repository.issue.projectCards.nodes[0].project.name') =~ "${BOARD_NAME}" ]]; then - if [[ $(echo $json | jq '.data.repository.issue.projectCards.nodes[0].isArchived') == 'true' ]]; then - echo "Issue is already in Project '$BOARD_NAME', but is archived - skipping workflow"; - echo "SKIP_ACTION=true" >> $GITHUB_ENV - else - echo "Issue is already in Project '$BOARD_NAME', proceeding"; - echo "ALREADY_IN_BOARD=true" >> $GITHUB_ENV - fi - else - echo "Issue is not in project '$BOARD_NAME', cancelling this workflow" - echo "ALREADY_IN_BOARD=false" >> $GITHUB_ENV - fi - fi - - name: Move issue - uses: alex-page/github-project-automation-plus@303f24a24c67ce7adf565a07e96720faf126fe36 - if: ${{ env.ALREADY_IN_BOARD == 'true' && env.SKIP_ACTION != 'true' }} - with: - project: Issue triage - column: Triaged - repo-token: ${{ secrets.ELEMENT_BOT_TOKEN }} - - remove_Z-Labs_label: - name: Remove Z-Labs label when features behind labs flags are removed - runs-on: ubuntu-24.04 - if: > - !(contains(github.event.issue.labels.*.name, 'A-Maths') || - contains(github.event.issue.labels.*.name, 'A-Message-Pinning') || - contains(github.event.issue.labels.*.name, 'A-Location-Sharing') || - contains(github.event.issue.labels.*.name, 'Z-IA') || - contains(github.event.issue.labels.*.name, 'A-Jump-To-Date') || - contains(github.event.issue.labels.*.name, 'A-Themes-Custom') || - contains(github.event.issue.labels.*.name, 'A-E2EE-Dehydration') || - contains(github.event.issue.labels.*.name, 'A-Tags') || - contains(github.event.issue.labels.*.name, 'A-Video-Rooms') || - contains(github.event.issue.labels.*.name, 'A-Message-Starring') || - contains(github.event.issue.labels.*.name, 'A-Rich-Text-Editor') || - contains(github.event.issue.labels.*.name, 'A-Element-Call')) && - contains(github.event.issue.labels.*.name, 'Z-Labs') - steps: - - uses: actions/github-script@v7 - with: - script: | - github.rest.issues.removeLabel({ - issue_number: context.issue.number, - owner: context.repo.owner, - repo: context.repo.repo, - name: ['Z-Labs'] - }) diff --git a/.github/workflows/update-jitsi.yml b/.github/workflows/update-jitsi.yml deleted file mode 100644 index bf0414e73a4..00000000000 --- a/.github/workflows/update-jitsi.yml +++ /dev/null @@ -1,33 +0,0 @@ -# Re-fetches the Jitsi SDK and opens a PR to update it if it's different from what's in the repository -name: Update Jitsi -on: - workflow_dispatch: {} - schedule: - - cron: "0 3 * * 0" # 3am every Sunday -permissions: {} # We use ELEMENT_BOT_TOKEN instead -jobs: - update: - runs-on: ubuntu-24.04 - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - cache: "yarn" - node-version: "lts/*" - - - name: Install Deps - run: "yarn install --frozen-lockfile" - - - name: Fetch Jitsi - run: "yarn update:jitsi" - - - name: Create Pull Request - uses: peter-evans/create-pull-request@5e914681df9dc83aa4e4905692ca88beb2f9e91f # v7 - with: - token: ${{ secrets.ELEMENT_BOT_TOKEN }} - branch: actions/jitsi-update - delete-branch: true - title: Jitsi Update - labels: | - T-Task diff --git a/.github/workflows/update-topics.yaml b/.github/workflows/update-topics.yaml deleted file mode 100644 index cd6c2fc5533..00000000000 --- a/.github/workflows/update-topics.yaml +++ /dev/null @@ -1,103 +0,0 @@ -name: Update release topics -on: - workflow_dispatch: - inputs: - expected_status: - description: What type of release is the next expected release - required: true - default: RC - type: choice - options: - - RC - - Release - expected_date: - description: Expected release date e.g. July 11th - required: true - type: string -concurrency: ${{ github.workflow }} -permissions: {} # No permissions required -jobs: - bot: - name: Release topic update - runs-on: ubuntu-24.04 - environment: Matrix - steps: - - uses: actions/github-script@v7 - env: - HS_URL: ${{ secrets.BETABOT_HS_URL }} - LOBBY_ROOM_ID: ${{ secrets.ROOM_ID }} - PUBLIC_ROOM_ID: "!YTvKGNlinIzlkMTVRl:matrix.org" - ANNOUNCEMENT_ROOM_ID: "!bijaLdadorKgNGtHdA:matrix.org" - TOKEN: ${{ secrets.BETABOT_ACCESS_TOKEN }} - RELEASE_STATUS: "Release status: ${{ inputs.expected_status }} expected ${{ inputs.expected_date }}" - with: - script: | - const { HS_URL, TOKEN, RELEASE_STATUS, LOBBY_ROOM_ID, PUBLIC_ROOM_ID, ANNOUNCEMENT_ROOM_ID } = process.env; - - const repo = context.repo; - const { data } = await github.rest.repos.getLatestRelease({ - owner: repo.owner, - repo: repo.repo, - }); - console.log("Found latest version: " + data.tag_name); - - const releaseTopic = `Stable: ${data.tag_name} | ${RELEASE_STATUS}`; - console.log("Release topic: " + releaseTopic); - - const regex = /Stable: v(.+) \| Release status: (\w+) expected (\w+ \d+\w\w)/gm; - - async function updateReleaseInTopic(roomId) { - const apiUrl = `${HS_URL}/_matrix/client/v3/rooms/${roomId}/state/m.room.topic/`; - const headers = { - "Content-Type": "application/json", - "Authorization": `Bearer ${TOKEN}`, - }; - await fetch(`${HS_URL}/_matrix/client/v3/rooms/${roomId}/join`, { - method: "POST", - headers, - body: "{}", - }); - - let res = await fetch(apiUrl, { - method: "GET", - headers, - }); - - if (!res.ok) { - console.log(roomId, "failed to fetch", await res.text()); - return; - } - - const data = await res.json(); - console.log(roomId, "got event", data); - - const topic = data.topic.replace(regex, releaseTopic); - if (topic === data.topic) { - console.log(roomId, "nothing to do"); - return; - } - if (data["org.matrix.msc3765.topic"]) { - data["org.matrix.msc3765.topic"].forEach(d => { - d.body = d.body.replace(regex, releaseTopic); - }); - } - - res = await fetch(apiUrl, { - method: "PUT", - body: JSON.stringify({ - ...data, - topic, - }), - headers, - }); - - if (res.ok) { - console.log(roomId, "topic updated:", topic); - } else { - console.log(roomId, await res.text()); - } - } - - await updateReleaseInTopic(LOBBY_ROOM_ID); - await updateReleaseInTopic(PUBLIC_ROOM_ID); - await updateReleaseInTopic(ANNOUNCEMENT_ROOM_ID); diff --git a/.gitignore b/.gitignore index 685a2cc3172..5a140777f37 100644 --- a/.gitignore +++ b/.gitignore @@ -13,8 +13,6 @@ package-lock.json electron/dist electron/pub **/.idea -/config.json -/config.json.* /config.local*.json # Legacy skinning file that some people might still have /src/component-index.js diff --git a/README.md b/README.md index fa4ac89ff99..8ca08213ec1 100644 --- a/README.md +++ b/README.md @@ -1,313 +1,11 @@ -[![Chat](https://img.shields.io/matrix/element-web:matrix.org?logo=matrix)](https://matrix.to/#/#element-web:matrix.org) -![Tests](https://github.com/element-hq/element-web/actions/workflows/tests.yaml/badge.svg) -![Static Analysis](https://github.com/element-hq/element-web/actions/workflows/static_analysis.yaml/badge.svg) -[![Localazy](https://img.shields.io/endpoint?url=https%3A%2F%2Fconnect.localazy.com%2Fstatus%2Felement-web%2Fdata%3Fcontent%3Dall%26title%3Dlocalazy%26logo%3Dtrue)](https://localazy.com/p/element-web) -[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=element-web&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=element-web) -[![Coverage](https://sonarcloud.io/api/project_badges/measure?project=element-web&metric=coverage)](https://sonarcloud.io/summary/new_code?id=element-web) -[![Vulnerabilities](https://sonarcloud.io/api/project_badges/measure?project=element-web&metric=vulnerabilities)](https://sonarcloud.io/summary/new_code?id=element-web) -[![Bugs](https://sonarcloud.io/api/project_badges/measure?project=element-web&metric=bugs)](https://sonarcloud.io/summary/new_code?id=element-web) +[![Build](https://github.com/elecordapp/elecord-web/actions/workflows/build.yml/badge.svg)](https://github.com/elecordapp/elecord-web/actions/workflows/build.yml) -# Element +# elecord-web -Element (formerly known as Vector and Riot) is a Matrix web client built using the [Matrix -JS SDK](https://github.com/matrix-org/matrix-js-sdk). + -# Supported Environments +#### Privacy focused chat app for gamers -Element has several tiers of support for different environments: +Elecord is a heavily personalised fork of Element, a Matrix web client. -- Supported - - Definition: - - Issues **actively triaged**, regressions **block** the release - - Last 2 major versions of Chrome, Firefox, and Edge on desktop OSes - - Last 2 versions of Safari - - Latest release of official Element Desktop app on desktop OSes - - Desktop OSes means macOS, Windows, and Linux versions for desktop devices - that are actively supported by the OS vendor and receive security updates -- Best effort - - Definition: - - Issues **accepted**, regressions **do not block** the release - - The wider Element Products(including Element Call and the Enterprise Server Suite) do still not officially support these browsers. - - The element web project and its contributors should keep the client functioning and gracefully degrade where other sibling features (E.g. Element Call) may not function. - - Last major release of Firefox ESR and Chrome/Edge Extended Stable -- Community Supported - - Definition: - - Issues **accepted**, regressions **do not block** the release - - Community contributions are welcome to support these issues - - Mobile web for current stable version of Chrome, Firefox, and Safari on Android, iOS, and iPadOS -- Not supported - - Definition: Issues only affecting unsupported environments are **closed** - - Everything else - -The period of support for these tiers should last until the releases specified above, plus 1 app release cycle(2 weeks). In the case of Firefox ESR this is extended further to allow it land in Debian Stable. - -For accessing Element on an Android or iOS device, we currently recommend the -native apps [element-android](https://github.com/element-hq/element-android) -and [element-ios](https://github.com/element-hq/element-ios). - -# Getting Started - -The easiest way to test Element is to just use the hosted copy at . -The `develop` branch is continuously deployed to -for those who like living dangerously. - -To host your own instance of Element see [Installing Element Web](docs/install.md). - -To install Element as a desktop application, see [Running as a desktop app](#running-as-a-desktop-app) below. - -# Important Security Notes - -## Separate domains - -We do not recommend running Element from the same domain name as your Matrix -homeserver. The reason is the risk of XSS (cross-site-scripting) -vulnerabilities that could occur if someone caused Element to load and render -malicious user generated content from a Matrix API which then had trusted -access to Element (or other apps) due to sharing the same domain. - -We have put some coarse mitigations into place to try to protect against this -situation, but it's still not good practice to do it in the first place. See - for more details. - -## Configuration best practices - -Unless you have special requirements, you will want to add the following to -your web server configuration when hosting Element Web: - -- The `X-Frame-Options: SAMEORIGIN` header, to prevent Element Web from being - framed and protect from [clickjacking][owasp-clickjacking]. -- The `frame-ancestors 'self'` directive to your `Content-Security-Policy` - header, as the modern replacement for `X-Frame-Options` (though both should be - included since not all browsers support it yet, see - [this][owasp-clickjacking-csp]). -- The `X-Content-Type-Options: nosniff` header, to [disable MIME - sniffing][mime-sniffing]. -- The `X-XSS-Protection: 1; mode=block;` header, for basic XSS protection in - legacy browsers. - -[mime-sniffing]: https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#mime_sniffing -[owasp-clickjacking-csp]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html#content-security-policy-frame-ancestors-examples -[owasp-clickjacking]: https://cheatsheetseries.owasp.org/cheatsheets/Clickjacking_Defense_Cheat_Sheet.html - -If you are using nginx, this would look something like the following: - -``` -add_header X-Frame-Options SAMEORIGIN; -add_header X-Content-Type-Options nosniff; -add_header X-XSS-Protection "1; mode=block"; -add_header Content-Security-Policy "frame-ancestors 'self'"; -``` - -For Apache, the configuration looks like: - -``` -Header set X-Frame-Options SAMEORIGIN -Header set X-Content-Type-Options nosniff -Header set X-XSS-Protection "1; mode=block" -Header set Content-Security-Policy "frame-ancestors 'self'" -``` - -Note: In case you are already setting a `Content-Security-Policy` header -elsewhere, you should modify it to include the `frame-ancestors` directive -instead of adding that last line. - -# Building From Source - -Element is a modular webapp built with modern ES6 and uses a Node.js build system. -Ensure you have the latest LTS version of Node.js installed. - -Using `yarn` instead of `npm` is recommended. Please see the Yarn [install -guide](https://classic.yarnpkg.com/en/docs/install) if you do not have it already. - -1. Install or update `node.js` so that your `node` is at least the current recommended LTS. -1. Install `yarn` if not present already. -1. Clone the repo: `git clone https://github.com/element-hq/element-web.git`. -1. Switch to the element-web directory: `cd element-web`. -1. Install the prerequisites: `yarn install`. - - If you're using the `develop` branch, then it is recommended to set up a - proper development environment (see [Setting up a dev - environment](#setting-up-a-dev-environment) below). Alternatively, you - can use - the continuous integration release of - the develop branch. -1. Configure the app by copying `config.sample.json` to `config.json` and - modifying it. See the [configuration docs](docs/config.md) for details. -1. `yarn dist` to build a tarball to deploy. Untaring this file will give - a version-specific directory containing all the files that need to go on your - web server. - -Note that `yarn dist` is not supported on Windows, so Windows users can run `yarn build`, -which will build all the necessary files into the `webapp` directory. The version of Element -will not appear in Settings without using the dist script. You can then mount the -`webapp` directory on your web server to actually serve up the app, which is -entirely static content. - -# Running as a Desktop app - -Element can also be run as a desktop app, wrapped in Electron. You can download a -pre-built version from or, if you prefer, -build it yourself. - -To build it yourself, follow the instructions at . - -Many thanks to @aviraldg for the initial work on the Electron integration. - -The [configuration docs](docs/config.md#desktop-app-configuration) show how to override the desktop app's default settings if desired. - -# config.json - -Element supports a variety of settings to configure default servers, behaviour, themes, etc. -See the [configuration docs](docs/config.md) for more details. - -# Labs Features - -Some features of Element may be enabled by flags in the `Labs` section of the settings. -Some of these features are described in [labs.md](https://github.com/element-hq/element-web/blob/develop/docs/labs.md). - -# Caching requirements - -Element requires the following URLs not to be cached, when/if you are serving Element from your own webserver: - -``` -/config.*.json -/i18n -/home -/sites -/index.html -``` - -We also recommend that you force browsers to re-validate any cached copy of Element on page load by configuring your -webserver to return `Cache-Control: no-cache` for `/`. This ensures the browser will fetch a new version of Element on -the next page load after it's been deployed. Note that this is already configured for you in the nginx config of our -Dockerfile. - -# Development - -Before attempting to develop on Element you **must** read the [developer guide -for `matrix-react-sdk`](https://github.com/matrix-org/matrix-react-sdk#developer-guide), which -also defines the design, architecture and style for Element too. - -Read the [Choosing an issue](docs/choosing-an-issue.md) page for some guidance -about where to start. Before starting work on a feature, it's best to ensure -your plan aligns well with our vision for Element. Please chat with the team in -[#element-dev:matrix.org](https://matrix.to/#/#element-dev:matrix.org) before -you start so we can ensure it's something we'd be willing to merge. - -You should also familiarise yourself with the ["Here be Dragons" guide -](https://docs.google.com/document/d/12jYzvkidrp1h7liEuLIe6BMdU0NUjndUYI971O06ooM) -to the tame & not-so-tame dragons (gotchas) which exist in the codebase. - -The idea of Element is to be a relatively lightweight "skin" of customisations on -top of the underlying `matrix-react-sdk`. `matrix-react-sdk` provides both the -higher and lower level React components useful for building Matrix communication -apps using React. - -Please note that Element is intended to run correctly without access to the public -internet. So please don't depend on resources (JS libs, CSS, images, fonts) -hosted by external CDNs or servers but instead please package all dependencies -into Element itself. - -# Setting up a dev environment - -Much of the functionality in Element is actually in the `matrix-js-sdk` module. -It is possible to set these up in a way that makes it easy to track the `develop` branches -in git and to make local changes without having to manually rebuild each time. - -First clone and build `matrix-js-sdk`: - -```bash -git clone https://github.com/matrix-org/matrix-js-sdk.git -pushd matrix-js-sdk -yarn link -yarn install -popd -``` - -Clone the repo and switch to the `element-web` directory: - -```bash -git clone https://github.com/element-hq/element-web.git -cd element-web -``` - -Configure the app by copying `config.sample.json` to `config.json` and -modifying it. See the [configuration docs](docs/config.md) for details. - -Finally, build and start Element itself: - -```bash -yarn link matrix-js-sdk -yarn install -yarn start -``` - -Wait a few seconds for the initial build to finish; you should see something like: - -``` -[element-js] [webpack.Progress] 100% -[element-js] -[element-js] ℹ 「wdm」: 1840 modules -[element-js] ℹ 「wdm」: Compiled successfully. -``` - -Remember, the command will not terminate since it runs the web server -and rebuilds source files when they change. This development server also -disables caching, so do NOT use it in production. - -Open in your browser to see your newly built Element. - -**Note**: The build script uses inotify by default on Linux to monitor directories -for changes. If the inotify limits are too low your build will fail silently or with -`Error: EMFILE: too many open files`. To avoid these issues, we recommend a watch limit -of at least `128M` and instance limit around `512`. - -You may be interested in issues [#15750](https://github.com/element-hq/element-web/issues/15750) and -[#15774](https://github.com/element-hq/element-web/issues/15774) for further details. - -To set a new inotify watch and instance limit, execute: - -``` -sudo sysctl fs.inotify.max_user_watches=131072 -sudo sysctl fs.inotify.max_user_instances=512 -sudo sysctl -p -``` - -If you wish, you can make the new limits permanent, by executing: - -``` -echo fs.inotify.max_user_watches=131072 | sudo tee -a /etc/sysctl.conf -echo fs.inotify.max_user_instances=512 | sudo tee -a /etc/sysctl.conf -sudo sysctl -p -``` - ---- - -When you make changes to `matrix-js-sdk` they should be automatically picked up by webpack and built. - -If any of these steps error with, `file table overflow`, you are probably on a mac -which has a very low limit on max open files. Run `ulimit -Sn 1024` and try again. -You'll need to do this in each new terminal you open before building Element. - -## Running the tests - -There are a number of application-level tests in the `tests` directory; these -are designed to run with Jest and JSDOM. To run them - -``` -yarn test -``` - -### End-to-End tests - -See [matrix-react-sdk](https://github.com/matrix-org/matrix-react-sdk/#end-to-end-tests) for how to run the end-to-end tests. - -# Translations - -To add a new translation, head to the [translating doc](docs/translating.md). - -For a developer guide, see the [translating dev doc](docs/translating-dev.md). - -# Triaging issues - -Issues are triaged by community members and the Web App Team, following the [triage process](https://github.com/element-hq/element-meta/wiki/Triage-process). - -We use [issue labels](https://github.com/element-hq/element-meta/wiki/Issue-labelling) to sort all incoming issues. +For detailed documentation, see [element-web](https://github.com/element-hq/element-web). diff --git a/banner.webp b/banner.webp new file mode 100644 index 00000000000..6747255e133 Binary files /dev/null and b/banner.webp differ diff --git a/config.json b/config.json new file mode 100644 index 00000000000..f26c0613f0b --- /dev/null +++ b/config.json @@ -0,0 +1,53 @@ +{ + "default_server_name": "matrix.org", + "default_server_config": { + "m.homeserver": { + "base_url": "https://matrix-client.matrix.org" + }, + "m.identity_server": { + "base_url": "https://vector.im" + } + }, + "brand": "elecord", + "integrations_ui_url": "https://scalar.vector.im/", + "integrations_rest_url": "https://scalar.vector.im/api", + "integrations_widgets_urls": [ + "https://scalar.vector.im/_matrix/integrations/v1", + "https://scalar.vector.im/api", + "https://scalar-staging.vector.im/_matrix/integrations/v1", + "https://scalar-staging.vector.im/api", + "https://scalar-staging.riot.im/scalar/api" + ], + "bug_report_endpoint_url": "https://element.io/bugreports/submit", + "uisi_autorageshake_app": "element-auto-uisi", + "show_labs_settings": false, + "room_directory": { + "servers": ["matrix.org", "gitter.im"] + }, + "enable_presence_by_hs_url": { + "https://matrix.org": false, + "https://matrix-client.matrix.org": false + }, + "terms_and_conditions_links": [ + { + "url": "https://element.io/privacy", + "text": "Privacy Policy" + }, + { + "url": "https://element.io/cookie-policy", + "text": "Cookie Policy" + } + ], + "privacy_policy_url": "https://element.io/cookie-policy", + "setting_defaults": { + "RustCrypto.staged_rollout_percent": 100 + }, + "features": { + "feature_video_rooms": true, + "feature_group_calls": true, + "feature_element_call_video_rooms": true + }, + "element_call": { + "url": "https://call.element.io" + } +} \ No newline at end of file diff --git a/res/manifest.json b/res/manifest.json index f6f1e91bf47..69f8ecf86b4 100644 --- a/res/manifest.json +++ b/res/manifest.json @@ -1,8 +1,8 @@ { - "name": "Element", - "short_name": "Element", + "name": "elecord", + "short_name": "elecord", "display": "standalone", - "theme_color": "#76CFA6", + "theme_color": "#3e9fed", "start_url": "index.html", "icons": [ { diff --git a/res/themes/element/img/backgrounds/lake.jpg b/res/themes/element/img/backgrounds/lake.jpg index eb3d19a7cc9..f824133faa1 100644 Binary files a/res/themes/element/img/backgrounds/lake.jpg and b/res/themes/element/img/backgrounds/lake.jpg differ diff --git a/res/themes/element/img/logos/element-logo.svg b/res/themes/element/img/logos/element-logo.svg index 54a91b72f80..540a6081d7e 100644 --- a/res/themes/element/img/logos/element-logo.svg +++ b/res/themes/element/img/logos/element-logo.svg @@ -1,7 +1,124 @@ - - - - - - - + + + + diff --git a/res/themes/element/img/logos/opengraph.png b/res/themes/element/img/logos/opengraph.png index d1b9d70e081..d818fdd7242 100644 Binary files a/res/themes/element/img/logos/opengraph.png and b/res/themes/element/img/logos/opengraph.png differ diff --git a/res/vector-icons/1024.png b/res/vector-icons/1024.png index f4f073930b3..3e301e8b288 100644 Binary files a/res/vector-icons/1024.png and b/res/vector-icons/1024.png differ diff --git a/res/vector-icons/120.png b/res/vector-icons/120.png index 5a8544944e5..067192ef63b 100644 Binary files a/res/vector-icons/120.png and b/res/vector-icons/120.png differ diff --git a/res/vector-icons/1240x600.png b/res/vector-icons/1240x600.png index 11a963db656..c2fff2de00e 100644 Binary files a/res/vector-icons/1240x600.png and b/res/vector-icons/1240x600.png differ diff --git a/res/vector-icons/150.png b/res/vector-icons/150.png index 407668e679f..4a5755ff091 100644 Binary files a/res/vector-icons/150.png and b/res/vector-icons/150.png differ diff --git a/res/vector-icons/152.png b/res/vector-icons/152.png index aefe0df014d..7002fb34f3b 100644 Binary files a/res/vector-icons/152.png and b/res/vector-icons/152.png differ diff --git a/res/vector-icons/180.png b/res/vector-icons/180.png index bfb7a33243f..1934189ef0e 100644 Binary files a/res/vector-icons/180.png and b/res/vector-icons/180.png differ diff --git a/res/vector-icons/24.png b/res/vector-icons/24.png index b0ef723eb8f..a3bf9914bbb 100644 Binary files a/res/vector-icons/24.png and b/res/vector-icons/24.png differ diff --git a/res/vector-icons/300.png b/res/vector-icons/300.png index 6cbb21a5689..d28397dda1f 100644 Binary files a/res/vector-icons/300.png and b/res/vector-icons/300.png differ diff --git a/res/vector-icons/44.png b/res/vector-icons/44.png index 171508dde03..c4e7dd58775 100644 Binary files a/res/vector-icons/44.png and b/res/vector-icons/44.png differ diff --git a/res/vector-icons/50.png b/res/vector-icons/50.png index 1d8de2bf06d..b2da2aa85fe 100644 Binary files a/res/vector-icons/50.png and b/res/vector-icons/50.png differ diff --git a/res/vector-icons/620x300.png b/res/vector-icons/620x300.png index f05c32b1c91..0b6c8ad08d0 100644 Binary files a/res/vector-icons/620x300.png and b/res/vector-icons/620x300.png differ diff --git a/res/vector-icons/76.png b/res/vector-icons/76.png index 05af3bb8dd2..d9a21d55dd3 100644 Binary files a/res/vector-icons/76.png and b/res/vector-icons/76.png differ diff --git a/res/vector-icons/88.png b/res/vector-icons/88.png index dec953bcf58..3268223ff2a 100644 Binary files a/res/vector-icons/88.png and b/res/vector-icons/88.png differ diff --git a/res/vector-icons/apple-touch-icon-114.png b/res/vector-icons/apple-touch-icon-114.png index 1ae39a6debf..c1be161ee3b 100644 Binary files a/res/vector-icons/apple-touch-icon-114.png and b/res/vector-icons/apple-touch-icon-114.png differ diff --git a/res/vector-icons/apple-touch-icon-120.png b/res/vector-icons/apple-touch-icon-120.png index 749f941a1e1..067192ef63b 100644 Binary files a/res/vector-icons/apple-touch-icon-120.png and b/res/vector-icons/apple-touch-icon-120.png differ diff --git a/res/vector-icons/apple-touch-icon-144.png b/res/vector-icons/apple-touch-icon-144.png index 0dcc56a8027..0a5981f7a92 100644 Binary files a/res/vector-icons/apple-touch-icon-144.png and b/res/vector-icons/apple-touch-icon-144.png differ diff --git a/res/vector-icons/apple-touch-icon-152.png b/res/vector-icons/apple-touch-icon-152.png index 2ac8c6dce44..7002fb34f3b 100644 Binary files a/res/vector-icons/apple-touch-icon-152.png and b/res/vector-icons/apple-touch-icon-152.png differ diff --git a/res/vector-icons/apple-touch-icon-180.png b/res/vector-icons/apple-touch-icon-180.png index f87d72db939..1934189ef0e 100644 Binary files a/res/vector-icons/apple-touch-icon-180.png and b/res/vector-icons/apple-touch-icon-180.png differ diff --git a/res/vector-icons/apple-touch-icon-57.png b/res/vector-icons/apple-touch-icon-57.png index d80f3859548..6fef2668e52 100644 Binary files a/res/vector-icons/apple-touch-icon-57.png and b/res/vector-icons/apple-touch-icon-57.png differ diff --git a/res/vector-icons/apple-touch-icon-60.png b/res/vector-icons/apple-touch-icon-60.png index d5ec84b0382..c25a535613f 100644 Binary files a/res/vector-icons/apple-touch-icon-60.png and b/res/vector-icons/apple-touch-icon-60.png differ diff --git a/res/vector-icons/apple-touch-icon-72.png b/res/vector-icons/apple-touch-icon-72.png index 85dbe1b82f4..25ab6435528 100644 Binary files a/res/vector-icons/apple-touch-icon-72.png and b/res/vector-icons/apple-touch-icon-72.png differ diff --git a/res/vector-icons/apple-touch-icon-76.png b/res/vector-icons/apple-touch-icon-76.png index f328d1bd612..d9a21d55dd3 100644 Binary files a/res/vector-icons/apple-touch-icon-76.png and b/res/vector-icons/apple-touch-icon-76.png differ diff --git a/res/vector-icons/favicon.ico b/res/vector-icons/favicon.ico index 6ad5fb08651..72d09f14292 100644 Binary files a/res/vector-icons/favicon.ico and b/res/vector-icons/favicon.ico differ diff --git a/res/vector-icons/mstile-150.png b/res/vector-icons/mstile-150.png index 6606d425f29..4a5755ff091 100644 Binary files a/res/vector-icons/mstile-150.png and b/res/vector-icons/mstile-150.png differ diff --git a/res/vector-icons/mstile-310.png b/res/vector-icons/mstile-310.png index 0ce998223b3..d1ef0938ff2 100644 Binary files a/res/vector-icons/mstile-310.png and b/res/vector-icons/mstile-310.png differ diff --git a/res/vector-icons/mstile-310x150.png b/res/vector-icons/mstile-310x150.png index 42efd6a98e1..16a53e2ae9d 100644 Binary files a/res/vector-icons/mstile-310x150.png and b/res/vector-icons/mstile-310x150.png differ diff --git a/res/vector-icons/mstile-70.png b/res/vector-icons/mstile-70.png index 709056bc61a..ce677aec418 100644 Binary files a/res/vector-icons/mstile-70.png and b/res/vector-icons/mstile-70.png differ diff --git a/scripts/ci_package.sh b/scripts/ci_package.sh index d5736420c35..87ccd4fe1f6 100755 --- a/scripts/ci_package.sh +++ b/scripts/ci_package.sh @@ -4,7 +4,7 @@ set -ex -rm dist/element-*.tar.gz || true # rm previous artifacts without failing if it doesn't exist +rm dist/elecord-*.tar.gz || true # rm previous artifacts without failing if it doesn't exist DIST_VERSION=`$(dirname $0)/get-version-from-git.sh` diff --git a/scripts/package.sh b/scripts/package.sh index 9937dd20d3b..590771dadc0 100755 --- a/scripts/package.sh +++ b/scripts/package.sh @@ -15,16 +15,19 @@ VERSION=$version yarn build # `yarn build`, but it's just too painful. cp config.sample.json webapp/ +# Copy any required files for deployment +cp .github/cfp_headers webapp/_headers + mkdir -p dist -cp -r webapp element-$version +cp -r webapp elecord-$version # Just in case you have a local config, remove it before packaging -rm element-$version/config.json || true +# rm elecord-$version/config.json || true # GNU/BSD compatibility workaround tar_perms=(--owner=0 --group=0) && [ "$(uname)" == "Darwin" ] && tar_perms=(--uid=0 --gid=0) -tar "${tar_perms[@]}" -chvzf dist/element-$version.tar.gz element-$version -rm -r element-$version +tar "${tar_perms[@]}" -chvzf dist/elecord-$version.tar.gz elecord-$version +rm -r elecord-$version echo -echo "Packaged dist/element-$version.tar.gz" +echo "Packaged dist/elecord-$version.tar.gz" diff --git a/src/i18n/strings/en_EN.json b/src/i18n/strings/en_EN.json index 66428300a08..f2ad5ce7ac2 100644 --- a/src/i18n/strings/en_EN.json +++ b/src/i18n/strings/en_EN.json @@ -645,7 +645,7 @@ "stop_voice_message": "Stop recording", "voice_message_button": "Voice Message" }, - "console_dev_note": "If you know what you're doing, Element is open-source, be sure to check out our GitHub (https://github.com/vector-im/element-web/) and contribute!", + "console_dev_note": "If you know what you're doing, elecord is open-source, be sure to check out our GitHub (https://github.com/elecordapp/elecord-web/) and contribute!", "console_scam_warning": "If someone told you to copy/paste something here, there is a high likelihood you're being scammed!", "console_wait": "Wait!", "create_room": { @@ -1039,11 +1039,11 @@ "hs_blocked": "This homeserver has been blocked by its administrator.", "invalid_configuration_mixed_server": "Invalid configuration: a default_hs_url can't be specified along with default_server_name or default_server_config", "invalid_configuration_no_server": "Invalid configuration: no default server specified.", - "invalid_json": "Your Element configuration contains invalid JSON. Please correct the problem and reload the page.", + "invalid_json": "Your elecord configuration contains invalid JSON. Please correct the problem and reload the page.", "invalid_json_detail": "The message from the parser is: %(message)s", "invalid_json_generic": "Invalid JSON", "mau": "This homeserver has hit its Monthly Active User limit.", - "misconfigured": "Your Element is misconfigured", + "misconfigured": "Your elecord is misconfigured", "mixed_content": "Can't connect to homeserver via HTTP when an HTTPS URL is in your browser bar. Either use HTTPS or enable unsafe scripts.", "non_urgent_echo_failure_toast": "Your server isn't responding to some requests.", "resource_limits": "This homeserver has exceeded one of its resource limits.", @@ -3978,7 +3978,7 @@ "you_are_presenting": "You are presenting" }, "web_default_device_name": "%(appName)s: %(browserName)s on %(osName)s", - "welcome_to_element": "Welcome to Element", + "welcome_to_element": "Welcome to elecord", "widget": { "added_by": "Widget added by", "capabilities_dialog": { diff --git a/src/vector/index.html b/src/vector/index.html index 0c21a0791b6..a2b80a61324 100644 --- a/src/vector/index.html +++ b/src/vector/index.html @@ -2,7 +2,7 @@ - Element + elecord @@ -16,13 +16,13 @@ - - + + - - + + - +
<%