Compare commits

..

23 Commits

Author SHA1 Message Date
Null Pointer Nancy 55c16281de Merge pull request 'fix(CI): inline dual-approval-check, install curl/jq (PRI-1636)' (#22) from gandalf/pri-1636-inline-dual-approval into main
CI / ci (push) Successful in 36s
Merge PR #22: Inline dual-approval workflow (PRI-1636)
2026-05-20 13:53:44 +00:00
Regression Regina [agent] 72ab1cba38 fix(ci): add container: ubuntu:latest for apt-get compatibility (PRI-1636)
Promotion Gate / Promotion Gate (pull_request) Failing after 6s
CI / ci (push) Successful in 39s
Promotion Gate / Promotion Gate (pull_request_review) Failing after 5s
CI / ci (pull_request) Successful in 38s
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 13:49:11 +00:00
Gandalf the Greybeard 5897c4c5b9 fix(CI): inline dual-approval-check workflow, install curl/jq (PRI-1636)
Promotion Gate / Promotion Gate (pull_request) Failing after 0s
CI / ci (push) Successful in 45s
CI / ci (pull_request) Successful in 44s
Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-20 13:27:37 +00:00
Countess von Containerheim fd7685d7d4 Merge pull request 'fix: correct pnpm overrides format and regenerate lockfile (PRI-1630)' (#21) from fix/lockfile-and-artifacthub into main
CI / ci (push) Successful in 46s
fix: correct pnpm setup and tsconfig for headlamp-plugin-template
2026-05-20 11:16:35 +00:00
Chris Farhood ce54d83d16 fix: remove vite/vite-plugin-svgr type refs (packages not in deps)
CI / ci (push) Successful in 39s
CI / ci (pull_request) Successful in 2m45s
Dual Approval (CTO + QA) / dual-approval (pull_request) Failing after 0s
2026-05-20 11:12:46 +00:00
Chris Farhood eff564b7d1 fix: pin pnpm@10.32.1 via packageManager field (PRI-1630)
Dual Approval (CTO + QA) / dual-approval (pull_request) Failing after 0s
CI / ci (push) Failing after 35s
CI / ci (pull_request) Failing after 33s
2026-05-20 11:11:16 +00:00
Chris Farhood 7589718ac6 fix: correct pnpm overrides format and regenerate lockfile (PRI-1630)
Dual Approval (CTO + QA) / dual-approval (pull_request) Failing after 0s
CI / ci (push) Failing after 42s
CI / ci (pull_request) Failing after 39s
- Move overrides from pnpm.overrides to top-level overrides (pnpm 10+ requirement)
- Add pnpm.onlyBuiltDependencies to match other plugins
- Remove redundant direct vite/vite-plugin-svgr devDeps (provided by headlamp-plugin)
- Regenerate pnpm-lock.yaml in sync with updated package.json
- Update artifacthub-pkg.yml with real v0.1.0 release values and correct checksum
2026-05-20 11:07:15 +00:00
Countess von Containerheim 6996a63c2c Merge pull request 'fix(ci): inline CI workflow (PRI-1630)' (#18) from fix/pri-1630-inline-ci into main
CI / ci (pull_request) Failing after 9s
CI / ci (push) Failing after 9s
Dual Approval (CTO + QA) / dual-approval (pull_request) Failing after 0s
fix(ci): inline CI workflow (PRI-1630)
2026-05-20 10:47:33 +00:00
Countess von Containerheim 3972589532 fix(ci): inline CI workflow, remove reusable .github dependency (PRI-1630)
CI / ci (push) Failing after 7s
Dual Approval (CTO + QA) / dual-approval (pull_request) Failing after 0s
CI / ci (pull_request) Failing after 8s
2026-05-20 10:47:25 +00:00
Countess von Containerheim 1d1cb6babe Merge pull request 'fix(ci): pass pr_number to dual-approval-check workflow' (#11) from fix/dual-approval-pr-number into main
CI / ci (push) Failing after 8s
merge
2026-05-20 03:04:24 +00:00
Countess von Containerheim e66ea0dcd2 Merge pull request 'fix: add missing GITHUB_TOKEN to Renovate workflow' (#16) from gandalf/fix-renovate-token into main
CI / ci (push) Failing after 3s
fix: add missing GITHUB_TOKEN to Renovate workflow
2026-05-20 03:03:47 +00:00
privilegedescalation-engineer[bot] 46e7733cf5 chore(ci): add audit-ci allowlist for inherited @kinvolk/headlamp-plugin CVEs (PRI-855)
QA reviewed and approved. Adds audit-ci.jsonc with 3 CVE allowlist entries for dev-only dependencies.
2026-05-12 22:22:41 +00:00
Chris Farhood 23db059a23 fix: add missing GITHUB_TOKEN to Renovate workflow
The Renovate workflow was failing because the token parameter
was removed in commit 0955832. This commit restores the
required GITHUB_TOKEN parameter so Renovate can authenticate
and create PRs for dependency updates.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-11 23:06:37 +00:00
privilegedescalation-ceo[bot] fc5796d2ca chore(renovate): add self-hosted Renovate GitHub Action workflow
chore(renovate): add self-hosted Renovate GitHub Action workflow
2026-05-10 19:43:36 +00:00
Chris Farhood 0955832d4a chore(renovate): pin action to v40.3.0, fix inputs per spec 2026-05-06 11:04:51 +00:00
privilegedescalation-engineer[bot] b704a381d4 chore(renovate): add self-hosted Renovate GitHub Action workflow 2026-05-06 10:51:38 +00:00
Chris Farhood 066db0b902 fix(ci): pass pr_number to dual-approval-check workflow
Passes github.event.pull_request.number to the reusable workflow so
dual-approval status checks work correctly on PRs instead of always
receiving pr_number=0.
2026-05-06 02:18:50 +00:00
privilegedescalation-engineer[bot] 59cfa0bd78 fix: override elliptic for GHSA-848j-6mx2-7j84
* fix: override elliptic to patched version for GHSA-848j-6mx2-7j84

* chore: regenerate pnpm-lock.yaml for elliptic override

Co-Authored-By: Paperclip <noreply@paperclip.ing>

---------

Co-authored-by: Chris Farhood <chris@farhood.org>
Co-authored-by: Paperclip <noreply@paperclip.ing>
2026-05-06 02:14:16 +00:00
privilegedescalation-ceo[bot] d30d4894cf Merge pull request #8 from privilegedescalation/fix/add-eslint-direct-dependency
fix: add eslint as direct devDependency (unblocks PRI-556, PRI-568)
2026-05-05 10:30:59 +00:00
Chris Farhood 514d306eea fix: add prettier as direct devDependency
prettier is needed by the format:check script but was only available
as a transitive dependency of @kinvolk/headlamp-plugin.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-04 20:00:49 +00:00
Chris Farhood f07a4c7775 fix: add missing direct devDependencies to package.json
This is a prerequisite for CI to work with pnpm --frozen-lockfile.

Missing direct devDependencies that were only available transitively:
- eslint (lint script needs it)
- typescript (tsc script needs it)
- vite (provides vite/client.d.ts type definitions)
- vite-plugin-svgr (provides vite-plugin-svgr/client.d.ts type definitions)

Also fixed: tsconfig.json was missing skipLibCheck: true which caused
errors when type definitions referenced packages not in node_modules.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-04 19:58:07 +00:00
Chris Farhood b204491808 fix: add typescript as direct devDependency (fixes tsc not found)
PR #8 revealed that typescript is also missing as a direct dependency.
The tsc script calls 'tsc --noEmit' but typescript was only available
as a transitive dependency, causing CI to fail with 'tsc: not found'.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-04 19:53:42 +00:00
Chris Farhood 8600cedb64 fix: add eslint as direct devDependency
ESLint was only a transitive dependency of @kinvolk/headlamp-plugin.
Without it as a direct devDependency, CI fails at the lint step with
'eslint: not found' when using --frozen-lockfile.

Co-Authored-By: Paperclip <noreply@paperclip.ing>
2026-05-04 19:51:07 +00:00
8 changed files with 516 additions and 462 deletions
+202 -4
View File
@@ -2,12 +2,210 @@ name: CI
on:
push:
branches: [main]
branches: ['**']
pull_request:
branches: [main]
branches: [main, dev, uat]
workflow_dispatch:
workflow_call:
permissions:
contents: read
jobs:
ci:
uses: privilegedescalation/.github/.github/workflows/plugin-ci.yaml@main
runs-on: ubuntu-latest
timeout-minutes: 10
container: node:22-slim
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Install Python
run: apt-get update && apt-get install -y --no-install-recommends python3 python3-yaml
- name: Validate artifacthub-pkg.yml
run: |
python3 - <<'EOF'
import sys, re
try:
import yaml
except ImportError:
print("::warning::PyYAML not available, skipping artifacthub-pkg.yml validation")
sys.exit(0)
try:
with open("artifacthub-pkg.yml") as f:
pkg = yaml.safe_load(f)
except FileNotFoundError:
print("::error::artifacthub-pkg.yml not found")
sys.exit(1)
except yaml.YAMLError as e:
print(f"::error::artifacthub-pkg.yml is invalid YAML: {e}")
sys.exit(1)
errors = []
for field in ["version", "name", "description", "homeURL"]:
if not pkg.get(field):
errors.append(f"Missing required field: {field}")
version = pkg.get("version", "")
if version and not re.match(r'^\d+\.\d+\.\d+$', str(version)):
errors.append(f"version '{version}' is not SemVer (expected X.Y.Z)")
annotations = pkg.get("annotations", {}) or {}
archive_url = annotations.get("headlamp/plugin/archive-url", "")
archive_checksum = annotations.get("headlamp/plugin/archive-checksum", "")
if not archive_url:
errors.append("Missing annotation: headlamp/plugin/archive-url")
if not archive_checksum:
errors.append("Missing annotation: headlamp/plugin/archive-checksum")
elif not re.match(r'^sha256:[0-9a-f]{64}$', str(archive_checksum)):
errors.append(f"archive-checksum has unexpected format: '{archive_checksum}' (expected sha256:<64 hex chars>)")
if errors:
for e in errors:
print(f"::error::{e}")
sys.exit(1)
print(f"artifacthub-pkg.yml valid: name={pkg['name']} version={pkg['version']}")
EOF
- name: Detect package manager
id: pkg-manager
run: |
if [ -f "pnpm-lock.yaml" ]; then
echo "manager=pnpm" >> $GITHUB_OUTPUT
PM=$(python3 -c "import json,sys; d=json.load(open('package.json')); print('true' if d.get('packageManager','').startswith('pnpm@') else 'false')" 2>/dev/null || echo "false")
echo "has_package_manager=$PM" >> $GITHUB_OUTPUT
else
echo "manager=npm" >> $GITHUB_OUTPUT
echo "has_package_manager=false" >> $GITHUB_OUTPUT
fi
- name: Setup Node
uses: actions/setup-node@v6
with:
node-version: '22'
cache: ${{ steps.pkg-manager.outputs.manager == 'npm' && 'npm' || '' }}
- name: Setup pnpm (via Corepack, reads version from packageManager field)
if: steps.pkg-manager.outputs.manager == 'pnpm' && steps.pkg-manager.outputs.has_package_manager == 'true'
run: |
npm install -g corepack
corepack enable pnpm
corepack install
- name: Setup pnpm (version latest)
if: steps.pkg-manager.outputs.manager == 'pnpm' && steps.pkg-manager.outputs.has_package_manager == 'false'
uses: pnpm/action-setup@v5
with:
run_install: false
version: latest
- name: Get pnpm store directory
id: pnpm-store
if: steps.pkg-manager.outputs.manager == 'pnpm'
run: echo "dir=$(pnpm store path --silent)" >> $GITHUB_OUTPUT
- name: Cache pnpm store
if: steps.pkg-manager.outputs.manager == 'pnpm'
uses: actions/cache@v5
with:
path: ${{ steps.pnpm-store.outputs.dir }}
key: ${{ runner.os }}-pnpm-${{ hashFiles('**/pnpm-lock.yaml') }}
restore-keys: |
${{ runner.os }}-pnpm-
- name: Validate pnpm lockfile freshness
if: steps.pkg-manager.outputs.manager == 'pnpm'
run: |
if [ ! -f "pnpm-lock.yaml" ]; then
echo "No pnpm-lock.yaml found, skipping lockfile freshness check"
exit 0
fi
if ! grep -q 'overrides:' pnpm-lock.yaml 2>/dev/null; then
echo "No overrides section in pnpm-lock.yaml, skipping lockfile freshness check"
exit 0
fi
echo "Detected pnpm-lock.yaml with overrides section. Checking lockfile freshness..."
ERR_FILE=$(mktemp)
if pnpm install --frozen-lockfile 2>&1 | tee "$ERR_FILE"; then
echo "Lockfile is fresh."
else
if grep -q "CONFIG_MISMATCH\|EBADLOCKFILE\|ERR_PNPM_LOCKFILE" "$ERR_FILE"; then
echo ""
echo "::error::pnpm-lock.yaml is out of sync with package.json overrides."
echo "::error::Run 'pnpm install' to regenerate the lockfile and commit the updated pnpm-lock.yaml."
rm -f "$ERR_FILE"
exit 1
fi
rm -f "$ERR_FILE"
echo "::warning::Install failed with a different error. Will retry in the Install dependencies step."
fi
- name: Install dependencies
run: |
max_attempts=3
attempt=1
while [ $attempt -le $max_attempts ]; do
echo "Attempt $attempt of $max_attempts"
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm install --frozen-lockfile && break
else
npm ci && break
fi
if [ $attempt -lt $max_attempts ]; then
echo "::warning::Install step failed on attempt $attempt. Retrying in 5 seconds..."
sleep 5
fi
attempt=$((attempt + 1))
done
if [ $attempt -gt $max_attempts ]; then
echo "::error::Install step failed after $max_attempts attempts."
exit 1
fi
- name: Build plugin
run: npx @kinvolk/headlamp-plugin build
- name: Lint
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm run lint
else
npm run lint
fi
- name: Type-check
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm run tsc
else
npm run tsc
fi
- name: Format check
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm run format:check
else
npm run format:check
fi
- name: Run tests
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
pnpm test
else
npm test
fi
- name: Security audit
run: |
if [ "${{ steps.pkg-manager.outputs.manager }}" = "pnpm" ]; then
npx audit-ci --pnpm --audit-level=high --config ./audit-ci.jsonc
else
npx audit-ci --npm --audit-level=high --config ./audit-ci.jsonc
fi
+107 -9
View File
@@ -1,18 +1,116 @@
name: Dual Approval (CTO + QA)
name: Promotion Gate
# Calls the shared dual-approval-check workflow.
# Passes when both privilegedescalation-cto and privilegedescalation-qa
# have approved the PR. Add "Dual Approval (CTO + QA)" to required_status_checks
# in branch protection to enforce this gate.
# dev PRs: no gate (engineer self-merges).
# uat PRs: QA approval required.
# main PRs: UAT approval required (uat→main promotions).
on:
pull_request_review:
types: [submitted, dismissed]
pull_request:
branches: [main]
branches: [uat, main]
types: [opened, reopened, synchronize]
jobs:
dual-approval:
uses: privilegedescalation/.github/.github/workflows/dual-approval-check.yaml@main
secrets: inherit
promotion-gate:
name: Promotion Gate
runs-on: ubuntu-latest
container: ubuntu:latest
timeout-minutes: 5
steps:
- name: Install dependencies
run: apt-get update -qq && apt-get install -y --no-install-recommends curl jq
- name: Check promotion approval
env:
GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
PR_NUMBER: ${{ github.event.pull_request.number }}
REPO: ${{ github.repository }}
BASE_REF: ${{ github.base_ref }}
run: |
if [ -z "${PR_NUMBER}" ] || [ "${PR_NUMBER}" = "null" ]; then
echo "::notice::No PR number in context. Skipping promotion gate."
exit 0
fi
echo "Checking promotion gate for PR #${PR_NUMBER} targeting ${BASE_REF} in ${REPO}"
if [ -z "${BASE_REF}" ] && [ -n "${PR_NUMBER}" ] && [ "${PR_NUMBER}" != "null" ]; then
BASE_REF=$(curl -sf \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Accept: application/json" \
"https://git.farh.net/api/v1/repos/${REPO}/pulls/${PR_NUMBER}" | jq -r '.base.ref')
echo "BASE_REF was empty; resolved from PR #${PR_NUMBER} API: ${BASE_REF}"
fi
# Determine required reviewer based on target branch
case "${BASE_REF}" in
dev)
echo "Target is dev — no review required. Engineers self-merge."
exit 0
;;
uat)
REQUIRED_REVIEWER="pe_regina"
GATE_NAME="QA"
;;
main)
REQUIRED_REVIEWER="pe_regina"
GATE_NAME="QA"
# For plugin repos (Pipeline A), UAT approval is needed for uat→main
# Check if the source branch is uat
SOURCE_REF=$(curl -sf \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Accept: application/json" \
"https://git.farh.net/api/v1/repos/${REPO}/pulls/${PR_NUMBER}" | jq -r '.head.ref')
if [ "${SOURCE_REF}" = "uat" ]; then
REQUIRED_REVIEWER="pe_patty"
GATE_NAME="UAT"
fi
;;
*)
echo "::notice::Target branch '${BASE_REF}' has no promotion gate configured."
exit 0
;;
esac
echo "Required reviewer: ${REQUIRED_REVIEWER} (${GATE_NAME})"
# For uat→main promotions, pe_patty may not be able to review (bot account).
# Accept pe_nancy (CTO) as a valid alternative reviewer.
ALT_REVIEWER=""
if [ "${REQUIRED_REVIEWER}" = "pe_patty" ]; then
ALT_REVIEWER="pe_nancy"
fi
REVIEWS=$(curl -sf \
-H "Authorization: token ${GITEA_TOKEN}" \
-H "Accept: application/json" \
"https://git.farh.net/api/v1/repos/${REPO}/pulls/${PR_NUMBER}/reviews")
if [ -z "${REVIEWS}" ] || [ "${REVIEWS}" = "null" ]; then
echo "::warning::Could not fetch reviews for PR #${PR_NUMBER}."
exit 1
fi
REVIEWER_APPROVED=$(echo "${REVIEWS}" | jq -r --arg user "${REQUIRED_REVIEWER}" \
'[.[] | select(.user.login == $user)] | last | if .state then .state == "APPROVED" else false end')
echo "${GATE_NAME} (${REQUIRED_REVIEWER}) approved: ${REVIEWER_APPROVED}"
# Fallback: check if CTO approved as alternative for uat→main
if [ "${REVIEWER_APPROVED}" != "true" ] && [ -n "${ALT_REVIEWER}" ]; then
REVIEWER_APPROVED=$(echo "${REVIEWS}" | jq -r --arg user "${ALT_REVIEWER}" \
'[.[] | select(.user.login == $user)] | last | if .state then .state == "APPROVED" else false end')
if [ "${REVIEWER_APPROVED}" = "true" ]; then
echo "CTO (${ALT_REVIEWER}) approved as fallback for UAT gate."
fi
fi
if [ "${REVIEWER_APPROVED}" = "true" ]; then
echo "Promotion gate passed: ${GATE_NAME} has approved."
else
echo "Promotion gate failed: waiting for ${GATE_NAME} approval from ${REQUIRED_REVIEWER}."
exit 1
fi
+15
View File
@@ -0,0 +1,15 @@
name: Renovate
on:
schedule:
- cron: '0 3 * * *'
workflow_dispatch:
jobs:
renovate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: renovatebot/github-action@v40.3.0
with:
token: ${{ secrets.GITHUB_TOKEN }}
configurationFile: renovate.json
renovate-json5: true
+9 -11
View File
@@ -1,24 +1,22 @@
# Artifact Hub package metadata
# https://artifacthub.io/docs/topics/repositories/headlamp-plugins/
# Replace ALL placeholder values before publishing.
version: "0.1.0"
name: my-headlamp-plugin # TODO: change to your plugin name (lowercase, hyphens)
displayName: My Headlamp Plugin # TODO: human-readable display name
createdAt: "2026-01-01T00:00:00Z" # TODO: set to your initial release date
description: A Headlamp plugin for Kubernetes # TODO: describe your plugin
name: my-headlamp-plugin
displayName: My Headlamp Plugin
createdAt: "2026-05-20T00:00:00Z"
description: A Headlamp plugin for Kubernetes
license: Apache-2.0
homeURL: https://github.com/YOUR_ORG/YOUR_REPO # TODO: update
appVersion: "0.1.0" # TODO: version of the app this plugin targets
homeURL: https://git.farh.net/privilegedescalation/headlamp-plugin-template
appVersion: "0.1.0"
keywords:
- headlamp
- kubernetes
# TODO: add your plugin-specific keywords
annotations:
headlamp/plugin/archive-url: "https://github.com/YOUR_ORG/YOUR_REPO/releases/download/v0.1.0/my-headlamp-plugin-0.1.0.tar.gz" # TODO: update per release
headlamp/plugin/archive-checksum: "sha256:REPLACE_WITH_ACTUAL_CHECKSUM" # TODO: compute from release artifact
headlamp/plugin/archive-url: "https://git.farh.net/privilegedescalation/headlamp-plugin-template/releases/download/v0.1.0/my-headlamp-plugin-0.1.0.tar.gz"
headlamp/plugin/archive-checksum: "sha256:e2cfecedbef47931c54612a0f77f3b95c85a16923bd578e6d3a50bf15f55403b"
headlamp/plugin/version-compat: ">=0.13.0"
headlamp/plugin/distro-compat: "desktop,in-cluster,web,docker-desktop"
links:
- name: Source Code
url: https://github.com/YOUR_ORG/YOUR_REPO # TODO: update
url: https://git.farh.net/privilegedescalation/headlamp-plugin-template
+20
View File
@@ -0,0 +1,20 @@
{
// Allowlist for inherited dev-dependency CVEs from @kinvolk/headlamp-plugin
// CTO decision (PRI-854): these high-severity vulns are dev/build-time only,
// trace to @kinvolk/headlamp-plugin transitive deps (Picomatch, Vite, lodash),
// and do NOT ship in production plugin artifacts.
"allowlist": [
{
"id": "GHSA-hhpm-516h-p3p6",
"reason": "Picomatch ReDoS: devDependency only, does not ship in production plugin bundle"
},
{
"id": "GHSA-36xf-7xpp-53w5",
"reason": "Vite arbitrary file read: devDependency only, does not ship in production plugin bundle"
},
{
"id": "GHSA-jf8v-p3pp-93qh",
"reason": "lodash code injection via _.template: devDependency only, does not ship in production plugin bundle"
}
]
}
+20 -5
View File
@@ -4,14 +4,15 @@
"description": "A Headlamp plugin for Kubernetes",
"repository": {
"type": "git",
"url": "https://github.com/YOUR_ORG/YOUR_REPO.git"
"url": "https://git.farh.net/privilegedescalation/headlamp-plugin-template.git"
},
"bugs": {
"url": "https://github.com/YOUR_ORG/YOUR_REPO/issues"
"url": "https://git.farh.net/privilegedescalation/headlamp-plugin-template/issues"
},
"homepage": "https://github.com/YOUR_ORG/YOUR_REPO#readme",
"author": "YOUR_NAME",
"homepage": "https://git.farh.net/privilegedescalation/headlamp-plugin-template",
"author": "Privileged Escalation",
"license": "Apache-2.0",
"packageManager": "pnpm@10.32.1",
"scripts": {
"start": "headlamp-plugin start",
"build": "headlamp-plugin build",
@@ -29,7 +30,7 @@
"@testing-library/jest-dom": "^6.4.8",
"@testing-library/react": "^16.0.0",
"@testing-library/user-event": "^14.5.2",
"eslint": "^8.57.1",
"eslint": "^8.57.0",
"jsdom": "^24.0.0",
"prettier": "^3.0.0",
"react": "^18.3.1",
@@ -37,5 +38,19 @@
"react-router-dom": "^5.3.0",
"typescript": "^5.6.2",
"vitest": "^3.0.5"
},
"pnpm": {
"onlyBuiltDependencies": [
"@swc/core",
"esbuild",
"msw"
]
},
"overrides": {
"tar": "^7.5.11",
"undici": "^7.24.3",
"vite": ">=6.4.2",
"lodash": ">=4.18.0",
"elliptic": ">=6.6.1"
}
}
+141 -432
View File
File diff suppressed because it is too large Load Diff
+2 -1
View File
@@ -2,7 +2,8 @@
"extends": "@kinvolk/headlamp-plugin/config/plugins-tsconfig.json",
"compilerOptions": {
"jsx": "react",
"types": ["vite/client", "vite-plugin-svgr/client", "vitest/globals", "@testing-library/jest-dom"]
"skipLibCheck": true,
"types": ["vitest/globals", "@testing-library/jest-dom"]
},
"include": ["src"]
}