chore(deps): upgrade to typescript 7 bridge and clean up pnpm v11 workspace configs
CI / check (push) Failing after 58s
Deploy / release (push) Skipped
Deploy / deploy (push) Failing after 11s

This commit is contained in:
openhands committed 2026-07-27 23:14:00 +02:00
1 parent 65f118c918
commit dacc4cadfd
12 files changed
+1138 -725

No files matched your search

+1 -1
View File
@@ -1,5 +1,5 @@
{
"$schema": "https://biomejs.dev/schemas/2.5.5/schema.json",
"$schema": "https://biomejs.dev",
"vcs": {
"enabled": true,
"clientKind": "git",
+27 -1
View File
@@ -1,4 +1,7 @@
import js from "@eslint/js";
import nextPlugin from "@next/eslint-plugin-next";
import reactHooks from "eslint-plugin-react-hooks";
import security from "eslint-plugin-security";
import unusedImports from "eslint-plugin-unused-imports";
import tseslint from "typescript-eslint";
@@ -12,9 +15,32 @@ export default tseslint.config(
files: ["src/**/*.{ts,tsx}", "pages/**/*.{ts,tsx}", "app/**/*.{ts,tsx}"],
plugins: {
"unused-imports": unusedImports,
security: security,
"react-hooks": reactHooks,
"@next/next": nextPlugin,
},
rules: {
"unused-imports/no-unused-vars": "error",
// Laad automatisch alle aanbevolen beveiligings- en framework-regels in
...security.configs.recommended.rules,
...reactHooks.configs.recommended.rules,
...nextPlugin.configs.recommended.rules,
// Zorg dat variabelen die beginnen met een underscore (_req) genegeerd worden
"@typescript-eslint/no-unused-vars": [
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
},
],
"unused-imports/no-unused-vars": [
"error",
{
argsIgnorePattern: "^_",
varsIgnorePattern: "^_",
},
],
"no-console": "warn",
},
},
+7 -3
View File
@@ -88,19 +88,23 @@
"@eslint/js": "10.0.1",
"@lhci/cli": "^0.15.1",
"@next/bundle-analyzer": "^16.2.12",
"@next/eslint-plugin-next": "^16.2.12",
"@playwright/test": "1.62.0",
"@tailwindcss/forms": "^0.5.11",
"@tailwindcss/postcss": "^4.3.3",
"@tailwindcss/typography": "^0.5.20",
"@types/bcrypt": "^6.0.0",
"@types/node": "^26.1.2",
"@types/nodemailer": "^7.0.12",
"@types/nodemailer": "^8.0.1",
"@types/react": "^19.2.17",
"@types/react-dom": "^19.2.3",
"@types/sanitize-html": "^2.16.1",
"@vitest/coverage-v8": "4.1.10",
"babel-plugin-react-compiler": "^1.0.0",
"dotenv": "^17.4.2",
"eslint": "10.8.0",
"eslint-plugin-react-hooks": "^7.1.1",
"eslint-plugin-security": "^4.0.1",
"eslint-plugin-unused-imports": "4.4.1",
"husky": "^9.1.7",
"knip": "^6.29.0",
@@ -109,9 +113,9 @@
"prisma": "^7.9.1",
"tailwindcss": "^4.3.3",
"tsx": "^4.23.1",
"typescript": "^5.9.3",
"typescript": "npm:@typescript/typescript6@^6.0.2",
"typescript-eslint": "^8.65.0",
"vite": "8.1.5",
"vitest": "4.1.10"
}
}
}
+977 -645
View File
File diff suppressed because it is too large. Load diff
+25 -10
View File
@@ -1,15 +1,30 @@
onlyBuiltDependencies:
- esbuild
- prisma
- "@prisma/client"
- "@prisma/engines"
- sharp
- "@parcel/watcher"
- "@swc/core"
- "@sentry/cli"
- bcrypt
# pnpm-workspace.yaml
# pnpm v11 vervanger voor onlyBuiltDependencies
allowBuilds:
esbuild: true
prisma: true
"@prisma/client": true
"@prisma/engines": true
sharp: true
"@parcel/watcher": true
"@swc/core": true
"@sentry/cli": true
bcrypt: true
# Al jouw overrides netjes bij elkaar
overrides:
glob: "^10.4.5"
inflight: "npm:lru-cache@^10.2.2"
rimraf: "^5.0.7"
uuid: "^9.0.1"
fast-uri: "^3.1.3"
"@hono/node-server": "^1.19.13"
postcss: "^8.5.19"
# Zorgt voor een schone terminal zonder de Next-Auth / Nodemailer waarschuwing
peerDependencyRules:
allowedVersions:
nodemailer: "9.0.3"
ignoreMissing:
- nodemailer
+40 -43
View File
@@ -1,45 +1,42 @@
{
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": [
"config:recommended",
"helpers:disableTypesNodeMajor"
],
"labels": ["dependencies"],
"rangeStrategy": "bump",
"dependencyDashboard": true,
"dependencyDashboardTitle": "Dependency Dashboard",
"commitMessagePrefix": "chore(deps):",
"commitMessageAction": "update",
"schedule": ["at any time"],
"timezone": "Europe/Amsterdam",
"rebaseWhen": "conflicted",
"prCreation": "immediate",
"prConcurrentLimit": 5,
"packageRules": [
{
"description": "Group all dependency updates into a single PR",
"matchPackagePatterns": ["*"],
"groupName": "All dependencies",
"groupSlug": "all",
"automerge": true
},
{
"description": "Major updates need manual review",
"matchUpdateTypes": ["major"],
"labels": ["dependencies", "major"],
"automerge": false,
"assignees": [],
"reviewers": []
},
{
"description": "Disable updates for engine pins",
"matchPackageNames": ["node", "pnpm"],
"enabled": false
},
{
"description": "Disable server-only (abandoned, pinned at 0.0.1)",
"matchPackageNames": ["server-only"],
"enabled": false
}
]
"$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["config:recommended", "helpers:disableTypesNodeMajor"],
"labels": ["dependencies"],
"rangeStrategy": "bump",
"dependencyDashboard": true,
"dependencyDashboardTitle": "Dependency Dashboard",
"commitMessagePrefix": "chore(deps):",
"commitMessageAction": "update",
"schedule": ["at any time"],
"timezone": "Europe/Amsterdam",
"rebaseWhen": "conflicted",
"prCreation": "immediate",
"prConcurrentLimit": 5,
"packageRules": [
{
"description": "Group all dependency updates into a single PR",
"matchPackagePatterns": ["*"],
"groupName": "All dependencies",
"groupSlug": "all",
"automerge": true
},
{
"description": "Major updates need manual review",
"matchUpdateTypes": ["major"],
"labels": ["dependencies", "major"],
"automerge": false,
"assignees": [],
"reviewers": []
},
{
"description": "Disable updates for engine pins",
"matchPackageNames": ["node", "pnpm"],
"enabled": false
},
{
"description": "Disable server-only (abandoned, pinned at 0.0.1)",
"matchPackageNames": ["server-only"],
"enabled": false
}
]
}
+1 -1
View File
@@ -220,7 +220,7 @@ export function ClientView({
window.removeEventListener("touchmove", onTouchMove);
window.removeEventListener("touchend", onEnd);
};
// biome-ignore lint/correctness/useExhaustiveDependencies: snapPos is a useCallback used intentionally here
// biome-ignore lint/correctness/useExhaustiveDependencies: snapPos is a useCallback used intentionally here
}, [dragging, snapPos]);
return (
@@ -144,7 +144,7 @@ export function InlineEditor({ pageId, onSaved }: InlineEditorProps) {
}
document.addEventListener("keydown", onKeyDown);
return () => document.removeEventListener("keydown", onKeyDown);
// biome-ignore lint/correctness/useExhaustiveDependencies: handleSave is a stable callback from parent
// biome-ignore lint/correctness/useExhaustiveDependencies: handleSave is a stable callback from parent
}, [canEdit, isDirty, saving, page, handleSave]);
const loadPage = useCallback(
+7 -7
View File
@@ -338,13 +338,13 @@ export function RegisterForm({
>
{isPending ? (
<span className="inline-flex items-center justify-center gap-2">
<svg
className="animate-spin h-4 w-4"
viewBox="0 0 24 24"
fill="none"
role="img"
aria-label="Loading"
>
<svg
className="animate-spin h-4 w-4"
viewBox="0 0 24 24"
fill="none"
role="img"
aria-label="Loading"
>
<circle
className="opacity-25"
cx="12"
+5 -1
View File
@@ -4,7 +4,11 @@ import type * as React from "react";
import { cn } from "@/lib/utils";
function Label({ className, htmlFor, ...props }: React.ComponentProps<"label">) {
function Label({
className,
htmlFor,
...props
}: React.ComponentProps<"label">) {
return (
// biome-ignore lint/a11y/noLabelWithoutControl: reusable component, input is associated via htmlFor at usage site
<label
+18 -5
View File
@@ -34,8 +34,12 @@ describe("production deploy workflow", () => {
const chownCmd = `sudo chown -R "${userVar}:${groupVar}"`;
expect(toContainLiteral(workflow, chownCmd)).toBe(true);
const reclaimAt = deployJob.indexOf(chownCmd);
expect(toContainLiteral(deployJob, `git -C "${liveVar}" fetch origin --prune`)).toBe(true);
const fetchAt = deployJob.indexOf(`git -C "${liveVar}" fetch origin --prune`);
expect(
toContainLiteral(deployJob, `git -C "${liveVar}" fetch origin --prune`),
).toBe(true);
const fetchAt = deployJob.indexOf(
`git -C "${liveVar}" fetch origin --prune`,
);
expect(reclaimAt).toBeGreaterThan(-1);
expect(fetchAt).toBeGreaterThan(reclaimAt);
});
@@ -53,8 +57,12 @@ describe("production deploy workflow", () => {
it("swaps a built .next artifact during a short service cutover", () => {
expect(deployJob).toContain("mv .next .next.prev");
expect(toContainLiteral(deployJob, `mv "${stageVar}/.next" .next`)).toBe(true);
expect(toContainLiteral(deployJob, `mv "${stageVar}/node_modules" node_modules`)).toBe(true);
expect(toContainLiteral(deployJob, `mv "${stageVar}/.next" .next`)).toBe(
true,
);
expect(
toContainLiteral(deployJob, `mv "${stageVar}/node_modules" node_modules`),
).toBe(true);
expect(deployJob).toContain("Rolling back .next to previous artifact");
const buildAt = deployJob.indexOf("pnpm build");
const stopAt = deployJob.indexOf("pm2 stop next");
@@ -84,7 +92,12 @@ describe("production deploy workflow", () => {
it("exports APP_VERSION from git for Sentry releases", () => {
const exportCmd = `export APP_VERSION="$(git -C "${liveVar}" rev-parse --short origin/main)"`;
expect(toContainLiteral(workflow, exportCmd)).toBe(true);
expect(toContainLiteral(workflow, `export NEXT_PUBLIC_APP_VERSION="${appVerVar}"`)).toBe(true);
expect(
toContainLiteral(
workflow,
`export NEXT_PUBLIC_APP_VERSION="${appVerVar}"`,
),
).toBe(true);
});
it("runs an HTTP health check before declaring deploy success", () => {
+29 -7
View File
@@ -9,10 +9,23 @@ const mockDb = {} as CurrencyDb;
describe("sendCurrency", () => {
it("returns false for non-positive amount", async () => {
expect(await sendCurrency({ rcon: {} as never, db: mockDb }, 1, "credits", 0)).toBe(false);
expect(await sendCurrency({ rcon: {} as never, db: mockDb }, 1, "credits", -5)).toBe(false);
expect(await sendCurrency({ rcon: {} as never, db: mockDb }, 1, "credits", null)).toBe(false);
expect(await sendCurrency({ rcon: {} as never, db: mockDb }, 1, "credits", undefined)).toBe(false);
expect(
await sendCurrency({ rcon: {} as never, db: mockDb }, 1, "credits", 0),
).toBe(false);
expect(
await sendCurrency({ rcon: {} as never, db: mockDb }, 1, "credits", -5),
).toBe(false);
expect(
await sendCurrency({ rcon: {} as never, db: mockDb }, 1, "credits", null),
).toBe(false);
expect(
await sendCurrency(
{ rcon: {} as never, db: mockDb },
1,
"credits",
undefined,
),
).toBe(false);
});
it("delivers credits via RCON", async () => {
@@ -23,7 +36,10 @@ describe("sendCurrency", () => {
givePointsGotw: vi.fn(),
};
const result = await sendCurrency(
{ rcon, db: { user: { update: vi.fn() }, usersCurrency: { upsert: vi.fn() } } },
{
rcon,
db: { user: { update: vi.fn() }, usersCurrency: { upsert: vi.fn() } },
},
1,
"credits",
100,
@@ -43,7 +59,10 @@ describe("sendCurrency", () => {
const result = await sendCurrency(
{
rcon,
db: { user: { update: userUpdate }, usersCurrency: { upsert: vi.fn() } },
db: {
user: { update: userUpdate },
usersCurrency: { upsert: vi.fn() },
},
},
1,
"credits",
@@ -64,7 +83,10 @@ describe("sendCurrency", () => {
givePointsGotw: vi.fn(),
};
const result = await sendCurrency(
{ rcon, db: { user: { update: vi.fn() }, usersCurrency: { upsert: vi.fn() } } },
{
rcon,
db: { user: { update: vi.fn() }, usersCurrency: { upsert: vi.fn() } },
},
1,
"duckets",
50,