diff --git a/.github/actions/npm-setup/action.yml b/.github/actions/npm-setup/action.yml new file mode 100644 index 00000000..f94aa5da --- /dev/null +++ b/.github/actions/npm-setup/action.yml @@ -0,0 +1,27 @@ +name: npm setup +description: Sets up NodeJS with npm caching and dependencies installed + +inputs: + node-version: + description: NodeJS version + required: false + default: 24 + install-command: + description: Dependency installation command + required: false + default: npm clean-install + +runs: + using: composite + steps: + - name: Install node ${{ inputs.node-version }} + uses: actions/setup-node@v7.1.0 + with: + node-version: ${{ inputs.node-version }} + cache: 'npm' + + - name: Install dependencies + shell: bash + env: + INSTALL_COMMAND: ${{ inputs.install-command }} + run: $INSTALL_COMMAND diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 21a69666..2b1e198a 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -1,6 +1,8 @@ version: 2 updates: - package-ecosystem: 'npm' + cooldown: + default-days: 7 directory: '/' schedule: interval: 'weekly' @@ -31,6 +33,8 @@ updates: - 'version-update:semver-major' - package-ecosystem: 'github-actions' + cooldown: + default-days: 7 directory: '/' schedule: interval: 'weekly' diff --git a/.github/workflows/_build.yml b/.github/workflows/_build.yml new file mode 100644 index 00000000..e8a43c0b --- /dev/null +++ b/.github/workflows/_build.yml @@ -0,0 +1,21 @@ +name: Build +on: + workflow_call: + +permissions: + contents: read + +jobs: + build: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: npm Setup + uses: $/.github/actions/npm-setup + + - name: Build UI + run: npm run build diff --git a/.github/workflows/_dependency-review.yml b/.github/workflows/_dependency-review.yml new file mode 100644 index 00000000..c3e58c24 --- /dev/null +++ b/.github/workflows/_dependency-review.yml @@ -0,0 +1,20 @@ +name: Dependency Review +on: + workflow_call: + +permissions: + contents: read + +jobs: + dependency-review: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: Dependency Review + uses: actions/dependency-review-action@v5.0.0 + with: + fail-on-severity: high diff --git a/.github/workflows/_lint.yml b/.github/workflows/_lint.yml new file mode 100644 index 00000000..6125b6f3 --- /dev/null +++ b/.github/workflows/_lint.yml @@ -0,0 +1,34 @@ +name: Lint +on: + workflow_call: + +permissions: + contents: read + +jobs: + lint: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: npm Setup + uses: $/.github/actions/npm-setup + with: + install-command: 'npm install' + + - name: 'Fail if npm install changed package-lock.json' + run: git diff --exit-code package-lock.json + + - name: Install python 3.13 + uses: actions/setup-python@v7.1.0 + with: + python-version: '3.13' + + - name: Install lint dependencies + run: npm run lint-setup + + - name: Run lint + run: npm run lint diff --git a/.github/workflows/_security-scans.yml b/.github/workflows/_security-scans.yml new file mode 100644 index 00000000..4f5e7aa5 --- /dev/null +++ b/.github/workflows/_security-scans.yml @@ -0,0 +1,83 @@ +name: Security Scans +on: + workflow_call: + +permissions: + contents: read + actions: read + +jobs: + # TODO(#398): Currently blocked by pulp organisation actions allow-list - gitleaks-action isn't permitted. + # secret-scanning: + # runs-on: ubuntu-latest + # steps: + # - name: Checkout pulp-ui (${{ github.ref }}) + # uses: actions/checkout@v7.0.1 + # with: + # persist-credentials: false + # fetch-depth: 0 + + # - name: Run Gitleaks + # uses: gitleaks/gitleaks-action@v3.0.0 + # env: + # GITHUB_TOKEN: ${{ github.token }} + + software-composition-analysis: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: Run OSV-Scanner + uses: google/osv-scanner-action/osv-scanner-action@v2.7.0 + with: + scan-args: |- + --lockfile=package-lock.json + --format=sarif + --output-file=osv-results.sarif + + - name: Upload SARIF artifact + if: always() + uses: actions/upload-artifact@v7.0.2 + with: + name: osv-results + path: osv-results.sarif + retention-days: 1 + + codeql: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: npm Setup + uses: $/.github/actions/npm-setup + + - name: Initialize CodeQL + uses: github/codeql-action/init@v4.39.1 + with: + languages: javascript-typescript + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v4.39.1 + with: + upload: never + output: sarif-results + + - name: Fail on findings + run: | + count=$(jq -s '[.[] | .runs[].results[]] | length' sarif-results/*.sarif) + echo "CodeQL found $count issue(s)" + [ "$count" -eq 0 ] + + - name: Upload SARIF artifact + if: always() + uses: actions/upload-artifact@v7.0.2 + with: + name: codeql-results + path: sarif-results + retention-days: 1 diff --git a/.github/workflows/_test.yml b/.github/workflows/_test.yml new file mode 100644 index 00000000..111a612f --- /dev/null +++ b/.github/workflows/_test.yml @@ -0,0 +1,35 @@ +name: Test +on: + workflow_call: + +permissions: + contents: read + +jobs: + integration-tests: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: npm Setup + uses: $/.github/actions/npm-setup + + - name: Run tests + run: npm run test:integration + + unit-tests: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: npm Setup + uses: $/.github/actions/npm-setup + + - name: Run tests + run: npm run test:unit diff --git a/.github/workflows/_workflow-lint.yml b/.github/workflows/_workflow-lint.yml new file mode 100644 index 00000000..bcec44de --- /dev/null +++ b/.github/workflows/_workflow-lint.yml @@ -0,0 +1,55 @@ +name: Workflow lint +on: + workflow_call: + +permissions: + contents: read + +jobs: + zizmor: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: Install uv + uses: astral-sh/setup-uv@v10.3.3 + + - name: Run zizmor + env: + GH_TOKEN: ${{ github.token }} + run: uvx zizmor@1.31.1 --format=sarif . > zizmor-results.sarif + + - name: Fail on findings + run: | + count=$(jq '[.runs[].results[]] | length' zizmor-results.sarif) + echo "zizmor found $count issue(s)" + [ "$count" -eq 0 ] + + - name: Upload SARIF artifact + if: always() + uses: actions/upload-artifact@v7.0.2 + with: + name: zizmor-results + path: zizmor-results.sarif + retention-days: 1 + + actions-lock: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + + - name: Install gh-actions-lock extension + env: + GH_TOKEN: ${{ github.token }} + run: gh extension install github/gh-actions-lock --pin v0.4.0 + + - name: Verify actions.lock is up to date + env: + GH_TOKEN: ${{ github.token }} + run: gh actions-lock --verify diff --git a/.github/workflows/actions.lock b/.github/workflows/actions.lock new file mode 100644 index 00000000..8a706e20 --- /dev/null +++ b/.github/workflows/actions.lock @@ -0,0 +1,101 @@ +# This file is machine-generated by `gh actions-lock`. +# Do not edit by hand; run `gh actions-lock` to update. +# Docs: https://gh.io/actions-lockfile +version: 'v0.0.3' +workflows: + '.github/workflows/_build.yml': + - 'actions/checkout@v7.0.1' + - 'actions/setup-node@v7.1.0' + '.github/workflows/_dependency-review.yml': + - 'actions/checkout@v7.0.1' + - 'actions/dependency-review-action@v5.0.0' + '.github/workflows/_lint.yml': + - 'actions/checkout@v7.0.1' + - 'actions/setup-node@v7.1.0' + - 'actions/setup-python@v7.1.0' + '.github/workflows/_security-scans.yml': + - 'actions/checkout@v7.0.1' + - 'actions/setup-node@v7.1.0' + - 'actions/upload-artifact@v7.0.2' + - 'github/codeql-action@v4.39.1' + - 'google/osv-scanner-action@v2.7.0' + '.github/workflows/_test.yml': + - 'actions/checkout@v7.0.1' + - 'actions/setup-node@v7.1.0' + '.github/workflows/_workflow-lint.yml': + - 'actions/checkout@v7.0.1' + - 'actions/upload-artifact@v7.0.2' + - 'astral-sh/setup-uv@v10.3.3' + '.github/workflows/cron-release.yml': + - 'actions/checkout@v7.0.1' + - 'actions/setup-node@v7.1.0' + - 'actions/setup-python@v7.1.0' + '.github/workflows/cypress.yml': + - 'actions/cache@v6.1.0' + - 'actions/checkout@v7.0.1' + - 'actions/setup-node@v7.1.0' + - 'actions/setup-python@v7.1.0' + - 'actions/upload-artifact@v7.0.2' + '.github/workflows/pull-request.yml': + - 'actions/checkout@v7.0.1' + '.github/workflows/sarif-upload.yml': + - 'actions/download-artifact@v8.0.2' + - 'github/codeql-action@v4.39.1' + '.github/workflows/stale.yml': + - 'actions/stale@v11.0.0' +dependencies: + 'actions/cache@v6.1.0': + ref: 'v6.1.0' + commit: 'sha1-55cc8345863c7cc4c66a329aec7e433d2d1c52a9' + owner_id: 44036562 + repo_id: 215566462 + 'actions/checkout@v7.0.1': + ref: 'v7.0.1' + commit: 'sha1-3d3c42e5aac5ba805825da76410c181273ba90b1' + owner_id: 44036562 + repo_id: 197814629 + 'actions/dependency-review-action@v5.0.0': + ref: 'v5.0.0' + commit: 'sha1-a1d282b36b6f3519aa1f3fc636f609c47dddb294' + owner_id: 44036562 + repo_id: 476372928 + 'actions/download-artifact@v8.0.2': + ref: 'v8.0.2' + commit: 'sha1-9000827ccba6bdab643e8b6fd33ac0654aef8333' + owner_id: 44036562 + repo_id: 192626254 + 'actions/setup-node@v7.1.0': + ref: 'v7.1.0' + commit: 'sha1-949feb2413d6458794dcd2491c4babbbce0c15c1' + owner_id: 44036562 + repo_id: 189476904 + 'actions/setup-python@v7.1.0': + ref: 'v7.1.0' + commit: 'sha1-6d4fd22b20465ccc0f7354476588e8df7c9ca0e0' + owner_id: 44036562 + repo_id: 192625525 + 'actions/stale@v11.0.0': + ref: 'v11.0.0' + commit: 'sha1-4391f3da665fdf50b6810c1a66712fb9ba21aa93' + owner_id: 44036562 + repo_id: 200437066 + 'actions/upload-artifact@v7.0.2': + ref: 'v7.0.2' + commit: 'sha1-cf430e030ddbb5b0abf93d22962f4752f3646cd9' + owner_id: 44036562 + repo_id: 192625955 + 'astral-sh/setup-uv@v10.3.3': + ref: 'v10.3.3' + commit: 'sha1-68559e99cc807c1eb7e9238fd43a15bba460eec2' + owner_id: 115962839 + repo_id: 846733598 + 'github/codeql-action@v4.39.1': + ref: 'v4.39.1' + commit: 'sha1-9b3254085494b55a0f7c4c2b3d2d52cc712ce370' + owner_id: 9919 + repo_id: 259445878 + 'google/osv-scanner-action@v2.7.0': + ref: 'v2.7.0' + commit: 'sha1-b1d267aea5211fa648d9d442fa64b90dbdcbdd36' + owner_id: 1342004 + repo_id: 736073144 diff --git a/.github/workflows/cron-release.yml b/.github/workflows/cron-release.yml index c6039009..baf00e87 100644 --- a/.github/workflows/cron-release.yml +++ b/.github/workflows/cron-release.yml @@ -13,8 +13,8 @@ jobs: permissions: contents: write steps: - - name: 'Checkout pulp-ui (main)' - uses: actions/checkout@v7 + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 with: ref: 'main' fetch-depth: 128 @@ -30,14 +30,14 @@ jobs: - name: 'Install node 24' if: ${{ env.SKIP == 'no' }} - uses: actions/setup-node@v7 + uses: actions/setup-node@v7.1.0 with: node-version: '24' cache: 'npm' - name: 'Install python 3.13' if: ${{ env.SKIP == 'no' }} - uses: actions/setup-python@v7 + uses: actions/setup-python@v7.1.0 with: python-version: '3.13' diff --git a/.github/workflows/cypress.yml b/.github/workflows/cypress.yml index 56563ca1..6218ee91 100644 --- a/.github/workflows/cypress.yml +++ b/.github/workflows/cypress.yml @@ -13,16 +13,17 @@ concurrency: group: cypress-${{ github.ref }} cancel-in-progress: true +permissions: + contents: read + jobs: cypress: runs-on: ubuntu-latest - - strategy: - fail-fast: false - steps: - - name: 'Checkout pulp-ui (${{ github.ref }})' - uses: actions/checkout@v7 + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false - name: 'backend setup' run: | @@ -42,17 +43,17 @@ jobs: docker.io/pulp/pulp - name: 'Install node 24' - uses: actions/setup-node@v7 + uses: actions/setup-node@v7.1.0 with: node-version: '24' - name: 'Install python 3.13' - uses: actions/setup-python@v7 + uses: actions/setup-python@v7.1.0 with: python-version: '3.13' - name: 'Cache ~/.npm & ~/.cache/Cypress' - uses: actions/cache@v6 + uses: actions/cache@v6.1.0 with: path: | ~/.npm @@ -126,7 +127,7 @@ jobs: run: | npm run cypress:chrome - - uses: actions/upload-artifact@v7 + - uses: actions/upload-artifact@v7.0.2 if: failure() with: name: screenshots_and_videos diff --git a/.github/workflows/pr-checks.yml b/.github/workflows/pr-checks.yml deleted file mode 100644 index af64769d..00000000 --- a/.github/workflows/pr-checks.yml +++ /dev/null @@ -1,76 +0,0 @@ -name: 'PR checks' - -on: - pull_request: - branches: ['main'] - -jobs: - docs: - # The workflow tag and the pulpdocs_ref must match. - uses: 'pulp/pulp-docs/.github/workflows/docs-ci.yml@main' - with: - pulpdocs_ref: 'main' - - pr-checks: - runs-on: ubuntu-latest - steps: - - name: 'Checkout pulp-ui (${{ github.ref }})' - uses: actions/checkout@v7 - - - name: 'Install node 24' - uses: actions/setup-node@v7 - with: - node-version: '24' - cache: 'npm' - - - name: 'Install python 3.13' - uses: actions/setup-python@v7 - with: - python-version: '3.13' - - - name: 'Checks' - run: | - # fail if npm install had to change package-lock.json - npm install - git diff --exit-code package-lock.json - - # dependencies - npm run lint-setup - - # run linters - npm run lint - - # uses `this` but not `class` - sudo apt install -y ripgrep - rg '\bclass\b' src/ | cut -d: -f1 | sort -u > src.class - rg '\bthis[\.,)\]}]\b' src/ | cut -d: -f1 | sort -u > src.this - if [ `comm -13 src.class src.this | wc -l` -ne 0 ]; then - echo - echo "Files using this but not class:" - echo - comm -13 src.class src.this - echo - rg '\bthis[\.,)\]}]\b' `comm -13 src.class src.this` - echo - exit 1 - fi - - merge-commits: - runs-on: ubuntu-latest - steps: - # need to checkout out head, the merge commit won't have any merges in history - # also need more than 1 commit, assuming no PR will have more than 128 - - name: 'Checkout pulp-ui HEAD' - uses: actions/checkout@v7 - with: - fetch-depth: 128 - ref: ${{ github.event.pull_request.head.sha }} - - - name: 'Ensure no merge commits' - run: | - # fail on merge commits in the PR - # since squash&merge doesn't create merge commits, - # and the last non-squash merges were in Jul 2019, - # we can just look for any merge commits since 2020 - count=`git log --min-parents=2 --since 2020-01-01 | tee /dev/stderr | wc -l` - [ "$count" = 0 ] diff --git a/.github/workflows/pull-request.yml b/.github/workflows/pull-request.yml new file mode 100644 index 00000000..857d0621 --- /dev/null +++ b/.github/workflows/pull-request.yml @@ -0,0 +1,56 @@ +name: Pull Request +on: + pull_request: + branches: ['main'] + +concurrency: + group: pr-${{ github.ref }} + cancel-in-progress: true + +permissions: + contents: read + actions: read + +jobs: + docs: + # NOTE: The workflow tag and the pulpdocs_ref must match. + uses: 'pulp/pulp-docs/.github/workflows/docs-ci.yml@main' + with: + pulpdocs_ref: 'main' + + workflow-lint: + uses: $/.github/workflows/_workflow-lint.yml + + linting: + uses: $/.github/workflows/_lint.yml + + dependency-review: + uses: $/.github/workflows/_dependency-review.yml + + security-scans: + uses: $/.github/workflows/_security-scans.yml + + build: + uses: $/.github/workflows/_build.yml + + test: + uses: $/.github/workflows/_test.yml + + merge-commits: + runs-on: ubuntu-latest + steps: + - name: Checkout pulp-ui (${{ github.ref }}) + uses: actions/checkout@v7.0.1 + with: + persist-credentials: false + fetch-depth: 128 + ref: ${{ github.event.pull_request.head.sha }} + + - name: Fail on merge commits + run: | + # fail on merge commits in the PR + # since squash&merge doesn't create merge commits, + # and the last non-squash merges were in Jul 2019, + # we can just look for any merge commits since 2020 + count=`git log --min-parents=2 --since 2020-01-01 | tee /dev/stderr | wc -l` + [ "$count" = 0 ] diff --git a/.github/workflows/sarif-upload.yml b/.github/workflows/sarif-upload.yml new file mode 100644 index 00000000..da726165 --- /dev/null +++ b/.github/workflows/sarif-upload.yml @@ -0,0 +1,51 @@ +name: Upload SARIF results +on: + workflow_run: + workflows: ['Pull Request'] + types: [completed] + +permissions: + contents: read + actions: read + security-events: write + +jobs: + upload-sarif: + if: ${{ !github.event.workflow_run.head_repository.fork }} + runs-on: ubuntu-latest + steps: + - name: Download CodeQL SARIF + uses: actions/download-artifact@v8.0.2 + with: + name: codeql-results + path: ./sarif-input + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ github.token }} + + - name: Download zizmor SARIF + uses: actions/download-artifact@v8.0.2 + with: + name: zizmor-results + path: ./sarif-input + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ github.token }} + + - name: Download osv SARIF + uses: actions/download-artifact@v8.0.2 + with: + name: osv-results + path: ./sarif-input + run-id: ${{ github.event.workflow_run.id }} + github-token: ${{ github.token }} + + - name: Validate downloaded SARIF files + run: | + for f in ./sarif-input/*.sarif; do + echo "Validating $f" + jq -e '.version and .runs' "$f" > /dev/null || { echo "::error::$f is not valid SARIF"; exit 1; } + done + + - name: Upload all SARIF results + uses: github/codeql-action/upload-sarif@v4.39.1 + with: + sarif_file: ./sarif-input diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index f7c9253e..73301e3b 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -11,7 +11,7 @@ jobs: issues: write pull-requests: write steps: - - uses: actions/stale@v11 + - uses: actions/stale@v11.0.0 with: days-before-issue-stale: 384 days-before-pr-stale: 192 diff --git a/.github/zizmor.yml b/.github/zizmor.yml new file mode 100644 index 00000000..86184f32 --- /dev/null +++ b/.github/zizmor.yml @@ -0,0 +1,14 @@ +rules: + unpinned-uses: + config: + policies: + '*': ref-pin + dangerous-triggers: + ignore: + - sarif-upload.yml:3 + artipacked: + ignore: + - cron-release.yml:16 + adhoc-packages: + ignore: + - cypress.yml:86 diff --git a/osv-scanner.toml b/osv-scanner.toml new file mode 100644 index 00000000..7c2747da --- /dev/null +++ b/osv-scanner.toml @@ -0,0 +1,4 @@ +[[IgnoredVulns]] +id = "CVE-2026-93753" +ignoreUntil = 2027-01-30 +reason = "deepmerge: no fixed version available (https://github.com/TehShrike/deepmerge/issues/285)" diff --git a/package-lock.json b/package-lock.json index 5123d004..f1f38f96 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,8 +29,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^10.1.0", - "react-router": "^7.18.2", - "zod": "4.6.5" + "react-router": "^7.18.2" }, "devDependencies": { "@babel/core": "^7.29.6", @@ -45,8 +44,10 @@ "@trivago/prettier-plugin-sort-imports": "^6.0.0", "@types/react": "^18.3.2", "@vitest/coverage-v8": "5.0.1", + "@vitest/mocker": "5.0.5", "ajv": "8.20.0", "babel-loader": "^10.0.0", + "body-parser": "2.4.0", "clean-webpack-plugin": "^4.0.0", "commander": "15.0.0", "copy-webpack-plugin": "^14.0.0", @@ -59,7 +60,7 @@ "eslint-plugin-react": "^7.37.5", "fork-ts-checker-webpack-plugin": "^9.1.0", "globals": "^16.5.0", - "happy-dom": "20.14.5", + "happy-dom": "21.0.4", "html-webpack-plugin": "^5.6.5", "mini-css-extract-plugin": "^2.9.4", "msw": "2.15.0", @@ -73,15 +74,16 @@ "stylelint": "^16.26.1", "stylelint-config-recommended-scss": "^16.0.2", "stylelint-scss": "^6.14.0", + "systeminformation": "5.33.16", "typescript": "^5.9.3", "typescript-eslint": "^8.71.1", "url-join": "^5.0.0", "vite": "8.3.4", - "vitest": "5.0.1", + "vitest": "5.0.5", "webpack": "5.110.3", "webpack-cli": "7.2.3", "webpack-dev-server": "6.0.0", - "zod": "4.6.5" + "zod": "4.6.7" }, "engines": { "node": ">=22.32.2", @@ -6269,22 +6271,22 @@ } }, "node_modules/@vitest/mocker": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.1.tgz", - "integrity": "sha512-6K1DoBNAPGvuOcSsGA4D6x+5zEEff/KmOOP3uetT2TrGpVfI+HRHRnJJfKi5ib/g1vx8IYHQD8s0pbJz8WQI7Q==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-5.0.5.tgz", + "integrity": "sha512-xLL3lkDegJZw+MGoGaCCsFayDZthGgpAtr3Vziyfc4p7xH89K7KRPcRBBh/kEYm0Aqkt5DtTmkYpBtRV/FrHZg==", "dev": true, "license": "MIT", "dependencies": { "@jridgewell/trace-mapping": "0.3.31", - "@vitest/spy": "5.0.1", + "@vitest/spy": "5.0.5", "estree-walker": "^3.0.3", - "magic-string": "^1.2.3" + "magic-string": "^1.4.3" }, "funding": { "url": "https://opencollective.com/vitest" }, "peerDependencies": { - "msw": "^2.4.9", + "msw": "^2.4.9 || ^3.0.0", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" }, "peerDependenciesMeta": { @@ -6297,9 +6299,9 @@ } }, "node_modules/@vitest/spy": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.1.tgz", - "integrity": "sha512-rbto/mF/SGERxEgYOek7Xm6B9b+y+mVoo+f4b2LymYO8zM1b7uB5nHuhVMTP2hxdzgxvGiZYGxGIaMvL5y180Q==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-5.0.5.tgz", + "integrity": "sha512-lwJRExuH417257Q5wv9QYugN9IMJkoxcrKrYxGPQkBzl7wlNpTUxD/5yNX4ESKVUIShKPgkGchYPFMWOOk0wzw==", "dev": true, "license": "MIT", "funding": { @@ -7128,19 +7130,19 @@ "dev": true }, "node_modules/body-parser": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.3.0.tgz", - "integrity": "sha512-2cGmJupaNgg+QUwVLAucDuWuoMZ6EX9iHDRswZ5lsNYEmwPaRknMPCLZz07yTzVq/83p4o/wzbDZbBrTvGGTIw==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.4.0.tgz", + "integrity": "sha512-Ifk1KcLrxaGt1occQagQNFNNOqRt1LFuehEnHHzB8Z6cRgIxRU1TBaiIsUiCdA+gy5PL7Y1IX31DNKkRmxtXjQ==", "dev": true, "license": "MIT", "dependencies": { "bytes": "^3.1.2", - "content-type": "^2.0.0", + "content-type": "^2.1.0", "debug": "^4.4.3", "http-errors": "^2.0.1", - "iconv-lite": "^0.7.2", + "iconv-lite": "^0.7.3", "on-finished": "^2.4.1", - "qs": "^6.15.2", + "qs": "^6.16.1", "raw-body": "^3.0.2", "type-is": "^2.1.0" }, @@ -7460,9 +7462,9 @@ } }, "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", + "integrity": "sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==", "dev": true, "license": "MIT", "engines": { @@ -10846,9 +10848,9 @@ } }, "node_modules/happy-dom": { - "version": "20.14.5", - "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-20.14.5.tgz", - "integrity": "sha512-x/RzkpWO40bTjIoT30iQtt64FLLmH/iRcUCN2X//bLx7H3ifkdfPXyqsro/OYtqzIAhiLMMA7mmiOR9C3NOKjQ==", + "version": "21.0.4", + "resolved": "https://registry.npmjs.org/happy-dom/-/happy-dom-21.0.4.tgz", + "integrity": "sha512-tFm+GaLBgo6o0awHnvHaNoraVo27qJ+2tZEtZ+cIa08hXbeitrxAJajLI05hsUy/2/YTKcUjQYzHe5mCcraLBw==", "dev": true, "license": "MIT", "dependencies": { @@ -13265,9 +13267,9 @@ } }, "node_modules/magic-string": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.1.tgz", - "integrity": "sha512-8lyCu36ErXR0J9uaGKlKQoiLZKmtI63YGLE8G2o9jyRPdr4X47LusSOwgOJOzcVtp81fTAAjxR7BwKz682Jhow==", + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-1.4.5.tgz", + "integrity": "sha512-oLLC2+YvQUfAa+vxoufE/yc1icb87M9iXIRqAoR/2EhE/8cb3SF/+Gi0c2By1B+5Vz2e2vQtUvHiu1+63Znh+w==", "dev": true, "license": "MIT", "dependencies": { @@ -17071,13 +17073,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/siginfo": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/siginfo/-/siginfo-2.0.0.tgz", - "integrity": "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==", - "dev": true, - "license": "ISC" - }, "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -17281,13 +17276,6 @@ "node": ">=0.10.0" } }, - "node_modules/stackback": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/stackback/-/stackback-0.0.2.tgz", - "integrity": "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw==", - "dev": true, - "license": "MIT" - }, "node_modules/statuses": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", @@ -17299,9 +17287,9 @@ } }, "node_modules/std-env": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.2.0.tgz", - "integrity": "sha512-oCUKSupKTHX53EyjDtuZQ64pjLJ6yYCtpmEw0goYxtjG9KpbRe8KAsl2tBUGU9DyMcJ0RwJ8GqJAFzMXcXW1Rw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-4.3.0.tgz", + "integrity": "sha512-OtU/EgQ1kIm5KwqQpBC6ZEMXrZRui11w8zgfTWp8cdO9B8OaPsbA8bTHO2P+HNo1VlUTGMVBwPhydu6poeXiag==", "dev": true, "license": "MIT" }, @@ -17848,9 +17836,9 @@ "dev": true }, "node_modules/systeminformation": { - "version": "5.33.1", - "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.1.tgz", - "integrity": "sha512-DEN6ICHk3Tk0Uf/hrAHh7xlt7iL5CJFBtPZinA0H62DrGG/KPKqq/Nzj6lCXPS4Ay/sf/14zNnk9LpqKzBIc+w==", + "version": "5.33.16", + "resolved": "https://registry.npmjs.org/systeminformation/-/systeminformation-5.33.16.tgz", + "integrity": "sha512-R+Lh69IJXfJj6bfyH1In5cIR9FTr4hBS39YvlZHZjsK1p9cuELPq7hplZZIb56ZESMMb+DzdKqqE6Iomi01Mvg==", "dev": true, "license": "MIT", "os": [ @@ -17982,9 +17970,9 @@ "license": "MIT" }, "node_modules/tinybench": { - "version": "6.1.4", - "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.1.4.tgz", - "integrity": "sha512-9APumHG7r4yOk4X4WlkmE71aZcv1gvin1czO3OQ1U9iJcFA5Ja/ygyb0vPOVHTthFozUYs8CLoLUlM8grb2lTQ==", + "version": "6.2.2", + "resolved": "https://registry.npmjs.org/tinybench/-/tinybench-6.2.2.tgz", + "integrity": "sha512-nIZ2N2dFpjBsg2hgitKu7mA+FvsIJuGJOwysRngmVRRmWgR/UyPjwJj8c/fT/dhm8EkHnF5EOogRf+0Z2qrimA==", "dev": true, "license": "MIT", "engines": { @@ -17992,9 +17980,9 @@ } }, "node_modules/tinyexec": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.0.tgz", - "integrity": "sha512-QKAl9m8gWWGHV8jZcPeym6j+XULi6tOf1mT83WYJ4Lk2ytW/uwAWkrP0uFsdoYMdueVJ0qs26wZ+23xeB4ibNQ==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/tinyexec/-/tinyexec-1.3.1.tgz", + "integrity": "sha512-GCvB3aoys96IuDFBMcTB46JOR6mdMtAToqwiW8JlWhsoh1mhHi/xn9ss/Dg7N555GiJyEt2qzoG/NHCwM6h1EA==", "dev": true, "license": "MIT", "engines": { @@ -18875,25 +18863,25 @@ } }, "node_modules/vitest": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.1.tgz", - "integrity": "sha512-iA95lQbKEkvrtTkdAgnWbXfbipWiiWe/hDl2P5tMi6WFwD76G0NxXAGp/M9EOcYupeGJRr6wppMc7CoA41TQjg==", + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-5.0.5.tgz", + "integrity": "sha512-cPODOMF8YnkiiYtDdHo6n4wWmBrOBBbOIYH2d33M4l3CdNn72h+qMmO6uXffUN6A5AZFXNND/d+krS9mgkXRfg==", "dev": true, "license": "MIT", "dependencies": { "@types/chai": "^5.2.2", - "@vitest/mocker": "5.0.1", - "chai": "^6.2.2", + "@vitest/mocker": "5.0.5", + "chai": "^6.3.0", "es-module-lexer": "^2.3.2", "expect-type": "^1.4.0", - "magic-string": "^1.2.3", - "obug": "^2.1.4", + "magic-string": "^1.4.3", + "obug": "^3.0.0", "picomatch": "^4.0.7", - "std-env": "^4.2.0", - "tinybench": "6.1.4", - "tinyexec": "1.3.0", + "std-env": "^4.3.0", + "tinybench": "^6.2.2", + "tinyexec": "^1.3.1", "tinyglobby": "^0.2.17", - "why-is-node-running": "^2.3.0" + "why-is-node-running": "3.2.1" }, "bin": { "vitest": "vitest.mjs" @@ -18908,12 +18896,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "5.0.1", - "@vitest/browser-preview": "5.0.1", + "@vitest/browser-playwright": "5.0.5", + "@vitest/browser-preview": "5.0.5", "@vitest/browser-webdriverio": "^5.0.0-beta.5 || >=5.0.0", - "@vitest/coverage-istanbul": "5.0.1", - "@vitest/coverage-v8": "5.0.1", - "@vitest/ui": "5.0.1", + "@vitest/coverage-istanbul": "5.0.5", + "@vitest/coverage-v8": "5.0.5", + "@vitest/ui": "5.0.5", "happy-dom": "*", "jsdom": "*", "vite": "^6.4.0 || ^7.0.0 || ^8.0.0" @@ -18957,6 +18945,20 @@ } } }, + "node_modules/vitest/node_modules/obug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/obug/-/obug-3.0.0.tgz", + "integrity": "sha512-5vvB5+W7ePv+p3uqxi+RcW1XAzLW0/hxt3/4X4Lc4qHudzOhmBiBwOY6DRob4WnanAEGvNcLjF+KNOufrUoEQw==", + "dev": true, + "funding": [ + "https://github.com/sponsors/sxzz", + "https://opencollective.com/debug" + ], + "license": "MIT", + "engines": { + "node": ">=12.20.0" + } + }, "node_modules/vitest/node_modules/picomatch": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", @@ -19375,20 +19377,16 @@ } }, "node_modules/why-is-node-running": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-2.3.0.tgz", - "integrity": "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/why-is-node-running/-/why-is-node-running-3.2.1.tgz", + "integrity": "sha512-Tb2FUhB4vUsGQlfSquQLYkApkuPAFQXGFzxWKHHumVz2dK+X1RUm/HnID4+TfIGYJ1kTcwOaCk/buYCEJr6YjQ==", "dev": true, "license": "MIT", - "dependencies": { - "siginfo": "^2.0.0", - "stackback": "0.0.2" - }, "bin": { "why-is-node-running": "cli.js" }, "engines": { - "node": ">=8" + "node": ">=20.11" } }, "node_modules/wildcard": { @@ -19644,9 +19642,9 @@ } }, "node_modules/zod": { - "version": "4.6.5", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.5.tgz", - "integrity": "sha512-v5l/aFXZQeai4awLbOpSoHecE9UiMrnfx75tEXLjNonXVARxQ5mOeipTjROUchszUNCqnE+hqAMujRsRHsut2Q==", + "version": "4.6.7", + "resolved": "https://registry.npmjs.org/zod/-/zod-4.6.7.tgz", + "integrity": "sha512-g8W2D2kU6a8untc053fX1uVBKzM7yqAxW/3zwk83+6RyF2+SKOuV+c0wBDhUwzV1PaGapmZH+rmcUzPf+3CGwg==", "dev": true, "license": "MIT", "funding": { @@ -19669,10 +19667,10 @@ "devDependencies": { "orval": "8.35.0", "typescript": "7.0.2", - "zod": "4.6.5" + "zod": "4.6.7" }, "peerDependencies": { - "zod": "^4.6.5" + "zod": "^4.6.7" } }, "packages/sdk/node_modules/typescript": { diff --git a/package.json b/package.json index e98df306..039ce672 100644 --- a/package.json +++ b/package.json @@ -11,8 +11,8 @@ "@patternfly/patternfly": "^5.4.2", "@patternfly/react-core": "^5.4.14", "@patternfly/react-table": "^5.4.16", - "axios": "^1.20.0", "@pulp-ui/sdk": "0.0.1", + "axios": "^1.20.0", "classnames": "^2.5.1", "compare-versions": "^6.1.1", "file-saver": "^2.0.5", @@ -22,8 +22,7 @@ "react": "^18.3.1", "react-dom": "^18.3.1", "react-markdown": "^10.1.0", - "react-router": "^7.18.2", - "zod": "4.6.5" + "react-router": "^7.18.2" }, "devDependencies": { "@babel/core": "^7.29.6", @@ -37,8 +36,12 @@ "@ls-lint/ls-lint": "^2.3.1", "@trivago/prettier-plugin-sort-imports": "^6.0.0", "@types/react": "^18.3.2", + "@vitest/coverage-v8": "5.0.1", + "ajv": "8.20.0", "babel-loader": "^10.0.0", + "body-parser": "2.4.0", "clean-webpack-plugin": "^4.0.0", + "commander": "15.0.0", "copy-webpack-plugin": "^14.0.0", "css-loader": "^7.1.2", "cypress": "16.0.0", @@ -49,8 +52,10 @@ "eslint-plugin-react": "^7.37.5", "fork-ts-checker-webpack-plugin": "^9.1.0", "globals": "^16.5.0", + "happy-dom": "21.0.4", "html-webpack-plugin": "^5.6.5", "mini-css-extract-plugin": "^2.9.4", + "msw": "2.15.0", "npm-run-all": "^4.1.5", "postcss": "^8.5.26", "prettier": "^3.9.10", @@ -61,20 +66,17 @@ "stylelint": "^16.26.1", "stylelint-config-recommended-scss": "^16.0.2", "stylelint-scss": "^6.14.0", + "systeminformation": "5.33.16", "typescript": "^5.9.3", "typescript-eslint": "^8.71.1", "url-join": "^5.0.0", + "vite": "8.3.4", + "vitest": "5.0.5", + "@vitest/mocker": "5.0.5", "webpack": "5.110.3", "webpack-cli": "7.2.3", "webpack-dev-server": "6.0.0", - "ajv": "8.20.0", - "commander": "15.0.0", - "vite": "8.3.4", - "zod": "4.6.5", - "msw": "2.15.0", - "vitest": "5.0.1", - "@vitest/coverage-v8": "5.0.1", - "happy-dom": "20.14.5" + "zod": "4.6.7" }, "scripts": { "prepare": "npm run build -w @pulp-ui/sdk", diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 9af01777..809a6cf1 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -18,10 +18,10 @@ "devDependencies": { "orval": "8.35.0", "typescript": "7.0.2", - "zod": "4.6.5" + "zod": "4.6.7" }, "peerDependencies": { - "zod": "^4.6.5" + "zod": "^4.6.7" }, "exports": { "./core/*": {