Htmx migration #7232
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # =============================================================== | |
| # 🕸️ Web Lint & Static Analysis - Frontend Code Quality Gate | |
| # =============================================================== | |
| # Authors: Mihai Criveti | |
| # - runs each web linter in its own matrix job for visibility | |
| # - mirrors the actual CLI commands used locally (no `make`) | |
| # - ensures fast-failure isolation: one failure doesn't hide others | |
| # - installs tools per-job without package.json | |
| # - logs are grouped and plain-text for readability | |
| # --------------------------------------------------------------- | |
| name: Web Lint & Static Analysis | |
| on: | |
| push: | |
| branches: ["main"] | |
| paths: | |
| - "mcpgateway/static/**" | |
| - "mcpgateway/templates/**" | |
| - ".github/workflows/lint-web.yml" | |
| pull_request: | |
| types: [opened, synchronize, ready_for_review] | |
| branches: ["main"] | |
| paths: | |
| - "mcpgateway/static/**" | |
| - "mcpgateway/templates/**" | |
| - ".github/workflows/lint-web.yml" | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: true | |
| permissions: | |
| contents: read | |
| jobs: | |
| lint-web: | |
| if: github.event_name != 'pull_request' || !github.event.pull_request.draft | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| # ------------------------------------------------------- | |
| # 🧼 HTML/CSS/JS Linters & Validators | |
| # ------------------------------------------------------- | |
| - id: htmlhint | |
| cmd: | | |
| npm install --no-save --legacy-peer-deps htmlhint | |
| npx htmlhint "mcpgateway/templates/*.html" | |
| - id: stylelint | |
| cmd: | | |
| npm install --no-save --legacy-peer-deps stylelint stylelint-config-standard @stylistic/stylelint-config stylelint-order | |
| npx stylelint "mcpgateway/static/*.css" | |
| - id: eslint | |
| cmd: | | |
| npm install --no-save eslint neostandard eslint-config-prettier eslint-plugin-prettier prettier | |
| npx eslint "mcpgateway/static/*.js" | |
| # ------------------------------------------------------- | |
| # 🔒 Security Scanners | |
| # ------------------------------------------------------- | |
| - id: retire | |
| cmd: | | |
| npm install --no-save --legacy-peer-deps retire | |
| npx retire --path mcpgateway/static | |
| - id: npm-audit | |
| cmd: | | |
| if [ ! -f package.json ]; then | |
| npm init -y >/dev/null | |
| fi | |
| npm audit --audit-level=high || true | |
| # ------------------------------------------------------- | |
| # 🔍 Additional Code Quality Tools | |
| # ------------------------------------------------------- | |
| - id: jshint | |
| cmd: | | |
| npm install --no-save --legacy-peer-deps jshint | |
| if [ -f .jshintrc ]; then | |
| npx jshint --config .jshintrc "mcpgateway/static/*.js" | |
| else | |
| npx jshint --esversion=11 "mcpgateway/static/*.js" | |
| fi | |
| - id: jscpd | |
| cmd: | | |
| npm install --no-save --legacy-peer-deps jscpd | |
| npx jscpd "mcpgateway/static/" "mcpgateway/templates/" | |
| # - id: markuplint | |
| # cmd: | | |
| # npm install --no-save --legacy-peer-deps markuplint | |
| # npx markuplint mcpgateway/templates/* | |
| name: ${{ matrix.id }} | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| steps: | |
| # ----------------------------------------------------------- | |
| # 0️⃣ Checkout | |
| # ----------------------------------------------------------- | |
| - name: ⬇️ Checkout source | |
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 | |
| with: | |
| persist-credentials: false | |
| fetch-depth: 1 | |
| # ----------------------------------------------------------- | |
| # 1️⃣ Node.js Setup | |
| # ----------------------------------------------------------- | |
| - name: 📦 Install Node.js 20 | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y ca-certificates curl gnupg | |
| sudo mkdir -p /etc/apt/keyrings | |
| curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key \ | |
| | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg | |
| echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" \ | |
| | sudo tee /etc/apt/sources.list.d/nodesource.list > /dev/null | |
| sudo apt-get update | |
| sudo apt-get install -y nodejs | |
| node --version | |
| npm --version | |
| # ----------------------------------------------------------- | |
| # 🔧 Configure npm | |
| # ----------------------------------------------------------- | |
| - name: 🔧 Upgrade npm to minimum required version | |
| run: sudo npm install -g npm@^11.10.0 | |
| - name: 🔧 Configure npm registry | |
| run: npm config set registry https://registry.npmjs.org/ | |
| # ----------------------------------------------------------- | |
| # 2️⃣ Run Linter (install and execute in one step) | |
| # ----------------------------------------------------------- | |
| - name: 🔍 Run ${{ matrix.id }} | |
| run: ${{ matrix.cmd }} | |
| # ------------------------------------------------------- | |
| # 🐍 Python-based JS Security Scanner (separate job) | |
| # ------------------------------------------------------- | |
| nodejsscan: | |
| if: github.event_name != 'pull_request' || !github.event.pull_request.draft | |
| name: nodejsscan | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 20 | |
| steps: | |
| # ----------------------------------------------------------- | |
| # 0️⃣ Checkout | |
| # ----------------------------------------------------------- | |
| - name: ⬇️ Checkout source | |
| uses: actions/checkout@93cb6efe18208431cddfb8368fd83d5badbf9bfd # v5 | |
| with: | |
| persist-credentials: false | |
| fetch-depth: 1 | |
| # ----------------------------------------------------------- | |
| # 1️⃣ Python Setup | |
| # ----------------------------------------------------------- | |
| - name: 🐍 Set up Python | |
| uses: actions/setup-python@a309ff8b426b58ec0e2a45f0f869d46889d02405 # v6 | |
| with: | |
| python-version: "3.12" | |
| cache: pip | |
| # ----------------------------------------------------------- | |
| # 2️⃣ Install nodejsscan | |
| # ----------------------------------------------------------- | |
| - name: 🔧 Install nodejsscan | |
| run: | | |
| python3 -m pip install --upgrade pip | |
| pip install nodejsscan | |
| # ----------------------------------------------------------- | |
| # 3️⃣ Run nodejsscan | |
| # ----------------------------------------------------------- | |
| - name: 🔒 Run nodejsscan | |
| run: | | |
| nodejsscan --directory ./mcpgateway/static |