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