diff --git a/eslint.config.mjs b/eslint.config.mjs index 05e726d..a8a2835 100644 --- a/eslint.config.mjs +++ b/eslint.config.mjs @@ -1,6 +1,6 @@ import { defineConfig, globalIgnores } from "eslint/config"; -import nextVitals from "eslint-config-next/core-web-vitals"; -import nextTs from "eslint-config-next/typescript"; +import nextVitals from "eslint-config-next/core-web-vitals.js"; +import nextTs from "eslint-config-next/typescript.js"; const eslintConfig = defineConfig([ ...nextVitals, diff --git a/package-lock.json b/package-lock.json index cd5ac47..f87c4b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,7 +10,7 @@ "dependencies": { "@emoji-mart/data": "^1.2.1", "@emoji-mart/react": "^1.1.1", - "@hookform/resolvers": "^3.9.1", + "@hookform/resolvers": "^5.4.0", "@radix-ui/react-alert-dialog": "^1.1.6", "@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-checkbox": "^1.1.4", @@ -32,7 +32,6 @@ "bcryptjs": "^3.0.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "devenv": "^1.0.1", "dotenv": "^17.4.2", "framer-motion": "^11.15.0", "jose": "^6.2.3", @@ -53,12 +52,14 @@ "zod": "^3.24.2" }, "devDependencies": { - "@types/node": "^20", - "@types/nodemailer": "^8.0.1", + "@next/swc-win32-x64-msvc": "^15.0.4", + "@types/node": "20.19.43", + "@types/nodemailer": "8.0.1", "@types/pg": "^8.20.0", - "@types/react": "^18", - "@types/react-dom": "^18", + "@types/react": "18.3.31", + "@types/react-dom": "18.3.7", "concurrently": "^10.0.3", + "devenv": "1.0.1", "eslint": "^9", "eslint-config-next": "15.0.4", "maildev": "^2.2.1", @@ -423,11 +424,15 @@ "integrity": "sha512-RiB/yIh78pcIxl6lLMG0CgBXAZ2Y0eVHqMPYugu+9U0AeT6YBeiJpf7lbdJNIugFP5SIjwNRgo4DhR1Qxi26Gg==" }, "node_modules/@hookform/resolvers": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.10.0.tgz", - "integrity": "sha512-79Dv+3mDF7i+2ajj7SkypSKHhl1cbln1OGavqrsF7p6mbUv11xpqpacPsGDCTRvCSjEEIez2ef1NveSVL3b0Ag==", + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-5.4.0.tgz", + "integrity": "sha512-EIsqr/t/qbinPIhGjMdtvutIN1Kk4uwbROE9/UQ93CAVGR7GkA7Y92+fX80OzXi/OB67jVFYwKGO1WzkxmkFZw==", + "license": "MIT", + "dependencies": { + "@standard-schema/utils": "^0.3.0" + }, "peerDependencies": { - "react-hook-form": "^7.0.0" + "react-hook-form": "^7.55.0" } }, "node_modules/@humanfs/core": { @@ -1012,7 +1017,8 @@ "cpu": [ "x64" ], - "optional": true, + "devOptional": true, + "license": "MIT", "os": [ "win32" ], @@ -1997,6 +2003,12 @@ "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==" }, + "node_modules/@standard-schema/utils": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@standard-schema/utils/-/utils-0.3.0.tgz", + "integrity": "sha512-e7Mew686owMaPJVNNLs55PUvgz371nKgwsc4vxE49zsODpJEnxgxRo2y/OKrqueavXgZNMDVj3DdHFlaSAeU8g==", + "license": "MIT" + }, "node_modules/@supabase/auth-js": { "version": "2.108.2", "resolved": "https://registry.npmjs.org/@supabase/auth-js/-/auth-js-2.108.2.tgz", @@ -2235,6 +2247,7 @@ "version": "20.19.43", "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.43.tgz", "integrity": "sha512-6oYBAi5ikg4Pl+kGsoYtawUMBT2zZMCvPNF7pVLnHZfd1zf38DRiWn/gT01RYCdUqkv7Fhr+C9ot4/tb+2sVvA==", + "license": "MIT", "dependencies": { "undici-types": "~6.21.0" } @@ -2244,6 +2257,7 @@ "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-8.0.1.tgz", "integrity": "sha512-PxpaInm8V1JQDd4j0ds5HfvWQk8JupS1C0Picb96QJsrrRDjBH+DlK7L4ZdNSqNULhiZRQHc40nLVShaGxXAMw==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -2270,6 +2284,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.31.tgz", "integrity": "sha512-vfEqpXTvwT91yhmwdfouStN2hSKwTvyRs8qpLfADyrq/kxDw0hZM7Wk9Ug1FELj8hIby+S/+kQCSRFF32nv2Qw==", "devOptional": true, + "license": "MIT", "dependencies": { "@types/prop-types": "*", "csstype": "^3.2.2" @@ -2280,6 +2295,7 @@ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.7.tgz", "integrity": "sha512-MEe3UeoENYVFXzoXEWsvcpg6ZvlrFNlOQ7EOsvhI3CfAXwzPfO8Qwuxd40nepsYKqyyVQnTdEfv68q91yLcKrQ==", "devOptional": true, + "license": "MIT", "peerDependencies": { "@types/react": "^18.0.0" } @@ -4162,7 +4178,9 @@ "node_modules/devenv": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/devenv/-/devenv-1.0.1.tgz", - "integrity": "sha512-rVZiM5jIhjMrnquPZz5TYPRd/GY2bm42Q9zXvfu1pP2HE7chcke5Qt9d1LvfH+TcMXJRa18JoiN2TOTfQeTL9A==" + "integrity": "sha512-rVZiM5jIhjMrnquPZz5TYPRd/GY2bm42Q9zXvfu1pP2HE7chcke5Qt9d1LvfH+TcMXJRa18JoiN2TOTfQeTL9A==", + "dev": true, + "license": "ISC" }, "node_modules/didyoumean": { "version": "1.2.2", @@ -5186,12 +5204,13 @@ } }, "node_modules/framer-motion": { - "version": "11.18.2", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.18.2.tgz", - "integrity": "sha512-5F5Och7wrvtLVElIpclDT0CBzMVg3dL22B64aZwHtsIY8RB4mXICLrkajK4G9R+ieSAGcgrLeae2SeUTg2pr6w==", + "version": "11.15.0", + "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.15.0.tgz", + "integrity": "sha512-MLk8IvZntxOMg7lDBLw2qgTHHv664bYoYmnFTmE0Gm/FW67aOJk0WM3ctMcG+Xhcv+vh5uyyXwxvxhSeJzSe+w==", + "license": "MIT", "dependencies": { - "motion-dom": "^11.18.1", - "motion-utils": "^11.18.1", + "motion-dom": "^11.14.3", + "motion-utils": "^11.14.3", "tslib": "^2.4.0" }, "peerDependencies": { diff --git a/package.json b/package.json index a4777a3..deca650 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "dependencies": { "@emoji-mart/data": "^1.2.1", "@emoji-mart/react": "^1.1.1", - "@hookform/resolvers": "^3.9.1", + "@hookform/resolvers": "^5.4.0", "@radix-ui/react-alert-dialog": "^1.1.6", "@radix-ui/react-avatar": "^1.1.3", "@radix-ui/react-checkbox": "^1.1.4", @@ -48,7 +48,6 @@ "bcryptjs": "^3.0.3", "class-variance-authority": "^0.7.1", "clsx": "^2.1.1", - "devenv": "^1.0.1", "dotenv": "^17.4.2", "framer-motion": "^11.15.0", "jose": "^6.2.3", @@ -69,12 +68,14 @@ "zod": "^3.24.2" }, "devDependencies": { - "@types/node": "^20", - "@types/nodemailer": "^8.0.1", + "@next/swc-win32-x64-msvc": "^15.0.4", + "@types/node": "20.19.43", + "@types/nodemailer": "8.0.1", "@types/pg": "^8.20.0", - "@types/react": "^18", - "@types/react-dom": "^18", + "@types/react": "18.3.31", + "@types/react-dom": "18.3.7", "concurrently": "^10.0.3", + "devenv": "1.0.1", "eslint": "^9", "eslint-config-next": "15.0.4", "maildev": "^2.2.1", diff --git a/scripts/precheck.mjs b/scripts/precheck.mjs index 38943e3..e564f58 100644 --- a/scripts/precheck.mjs +++ b/scripts/precheck.mjs @@ -2,10 +2,9 @@ // Verifies all packages listed in package.json are installed. // Auto-runs npm install if any are missing — zero manual setup steps. -import { readFileSync } from "node:fs" +import { readFileSync, existsSync } from "node:fs" import { resolve, dirname } from "node:path" import { fileURLToPath } from "node:url" -import { createRequire } from "node:module" import { execSync } from "node:child_process" import { platform } from "node:os" @@ -15,10 +14,10 @@ const root = resolve(__dirname, "..") try { const pkg = JSON.parse(readFileSync(resolve(root, "package.json"), "utf8")) const allDeps = { ...pkg.dependencies, ...pkg.devDependencies } - const require = createRequire(import.meta.url) const missing = Object.keys(allDeps).filter(name => { - try { require.resolve(name, { paths: [root] }); return false } catch { return true } + const pkgDir = resolve(root, "node_modules", name) + return !existsSync(resolve(pkgDir, "package.json")) }) if (missing.length > 0) {