From 5b55a329e3328064bea0c2f0d82d57c044b37678 Mon Sep 17 00:00:00 2001 From: Serhii Shramko Date: Sat, 28 Mar 2026 14:05:01 -0400 Subject: [PATCH 1/4] Fix/sentry (#469) * fix: handle unhandled fetch rejections on view counter calls and filter Google Translate proxy errors in Sentry * fix: harden CSP and security headers - Replace connect-src wildcard with explicit allowlist to prevent data exfiltration - Remove unsafe-eval from production script-src (keep for dev HMR only) - Add missing directives: object-src, base-uri, form-action, frame-ancestors, upgrade-insecure-requests - Add google-analytics.com to script-src and img-src for GTM chain-loading and tracking pixels - Drop data: from worker-src to prevent code execution bypass - Set X-XSS-Protection to 0 per OWASP recommendation - Upgrade Referrer-Policy to strict-origin-when-cross-origin - Add Permissions-Policy header to disable unused browser APIs * fix: move commitlint from pre-commit to commit-msg hook The hook was in pre-commit where the commit message doesn't exist yet, causing commitlint to validate previous commits instead of the current one. Also fix argument from $2 to $1 as commit-msg receives the message file path as the first argument. * fix: restore unsafe-eval in CSP for production runtime A bundled dependency uses new Function() during useMemo in blog post rendering, causing EvalError on Vercel preview deployments. * chore: bump prisma, sentry, and pnpm versions * chore: regenerate sitemap --- .git-hooks/commit-msg | 3 + .git-hooks/pre-commit | 3 - instrumentation-client.ts | 2 + next.config.js | 23 +- package.json | 10 +- pages/quizlet-list/index.tsx | 2 +- pages/snippets/[slug].tsx | 2 +- pages/udemy-reset-progress.tsx | 2 +- pnpm-lock.yaml | 591 +++++++++++++++++++-------------- public/sitemap.xml | 198 +++++------ 10 files changed, 467 insertions(+), 369 deletions(-) create mode 100755 .git-hooks/commit-msg delete mode 100755 .git-hooks/pre-commit diff --git a/.git-hooks/commit-msg b/.git-hooks/commit-msg new file mode 100755 index 00000000..b776e35f --- /dev/null +++ b/.git-hooks/commit-msg @@ -0,0 +1,3 @@ +#!/bin/sh + +npx --no -- commitlint --edit "${1}" diff --git a/.git-hooks/pre-commit b/.git-hooks/pre-commit deleted file mode 100755 index 2ad1f261..00000000 --- a/.git-hooks/pre-commit +++ /dev/null @@ -1,3 +0,0 @@ -#!/bin/sh - -npx --no -- commitlint --edit "${2}" diff --git a/instrumentation-client.ts b/instrumentation-client.ts index 61b4b9f0..05187d61 100644 --- a/instrumentation-client.ts +++ b/instrumentation-client.ts @@ -24,6 +24,8 @@ Sentry.init({ /^chrome:\/\//i, /^moz-extension:\/\//i, /^safari-extension:\/\//i, + // Google Translate proxy + /translate\.goog/i, ], }); diff --git a/next.config.js b/next.config.js index b6ec5fd6..1cfb9d39 100644 --- a/next.config.js +++ b/next.config.js @@ -2,13 +2,18 @@ import { withSentryConfig } from '@sentry/nextjs'; const ContentSecurityPolicy = ` default-src 'self'; - script-src 'self' 'unsafe-eval' 'unsafe-inline' https://www.googletagmanager.com https://va.vercel-scripts.com/ https://vercel.live/; + script-src 'self' 'unsafe-eval' 'unsafe-inline' https://www.googletagmanager.com https://www.google-analytics.com https://va.vercel-scripts.com https://vercel.live; style-src 'self' 'unsafe-inline'; - worker-src 'self' blob: data:; - img-src 'self'; - connect-src *; - media-src 'self'; + img-src 'self' https://www.google-analytics.com https://www.googletagmanager.com; + connect-src 'self' https://www.google-analytics.com https://analytics.google.com https://*.google-analytics.com https://*.ingest.sentry.io https://va.vercel-scripts.com https://vitals.vercel-insights.com https://vercel.live; font-src 'self'; + worker-src 'self' blob:; + media-src 'self'; + object-src 'none'; + base-uri 'self'; + form-action 'self'; + frame-ancestors 'none'; + upgrade-insecure-requests; `; const securityHeaders = [ @@ -22,7 +27,7 @@ const securityHeaders = [ }, { key: 'Referrer-Policy', - value: 'origin-when-cross-origin', + value: 'strict-origin-when-cross-origin', }, { key: 'X-Content-Type-Options', @@ -34,12 +39,16 @@ const securityHeaders = [ }, { key: 'X-XSS-Protection', - value: '1; mode=block', + value: '0', }, { key: 'Strict-Transport-Security', value: 'max-age=31536000; includeSubDomains; preload', }, + { + key: 'Permissions-Policy', + value: 'camera=(), microphone=(), geolocation=(), payment=(), usb=(), interest-cohort=()', + }, ]; /** @type {import('next').NextConfig} */ diff --git a/package.json b/package.json index 69cfb7bf..b9411bf9 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "portfolio", "version": "1.0.0", "private": true, - "packageManager": "pnpm@10.32.1", + "packageManager": "pnpm@10.33.0", "type": "module", "scripts": { "article": "node lib/scripts/generate-article-template.js", @@ -23,9 +23,9 @@ "node": "24.x" }, "dependencies": { - "@prisma/adapter-pg": "7.5.0", - "@prisma/client": "7.5.0", - "@sentry/nextjs": "10.45.0", + "@prisma/adapter-pg": "7.6.0", + "@prisma/client": "7.6.0", + "@sentry/nextjs": "10.46.0", "@vercel/analytics": "2.0.1", "@vercel/speed-insights": "2.0.0", "clsx": "2.1.1", @@ -61,7 +61,7 @@ "next-sitemap": "4.2.3", "postcss": "8.5.8", "prettier": "3.8.1", - "prisma": "7.5.0", + "prisma": "7.6.0", "reading-time": "1.5.0", "rehype": "13.0.2", "rehype-autolink-headings": "7.1.0", diff --git a/pages/quizlet-list/index.tsx b/pages/quizlet-list/index.tsx index 7751b811..1141af33 100644 --- a/pages/quizlet-list/index.tsx +++ b/pages/quizlet-list/index.tsx @@ -13,7 +13,7 @@ function QuizletPage() { useEffect(() => { const registerView = () => fetch('/api/views/quizlet-page', { method: 'POST', - }); + }).catch(() => {}); registerView(); }, []); diff --git a/pages/snippets/[slug].tsx b/pages/snippets/[slug].tsx index be8c3022..be9787ea 100644 --- a/pages/snippets/[slug].tsx +++ b/pages/snippets/[slug].tsx @@ -35,7 +35,7 @@ function SnippetPage(props: SnippetPageProps) { const registerView = () => fetch(`/api/views/${slug}`, { method: 'POST', - }); + }).catch(() => {}); registerView(); }, [slug]); diff --git a/pages/udemy-reset-progress.tsx b/pages/udemy-reset-progress.tsx index cf658657..4ce98130 100644 --- a/pages/udemy-reset-progress.tsx +++ b/pages/udemy-reset-progress.tsx @@ -11,7 +11,7 @@ function UdemyResetProgressPage() { const registerView = () => fetch('/api/views/udemy-reset-progress-page', { method: 'POST', - }); + }).catch(() => {}); registerView(); }, []); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 824463ea..70f934a1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,14 +15,14 @@ importers: .: dependencies: '@prisma/adapter-pg': - specifier: 7.5.0 - version: 7.5.0 + specifier: 7.6.0 + version: 7.6.0 '@prisma/client': - specifier: 7.5.0 - version: 7.5.0(prisma@7.5.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) + specifier: 7.6.0 + version: 7.6.0(prisma@7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3) '@sentry/nextjs': - specifier: 10.45.0 - version: 10.45.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.105.2) + specifier: 10.46.0 + version: 10.46.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.105.2) '@vercel/analytics': specifier: 2.0.1 version: 2.0.1(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4) @@ -124,8 +124,8 @@ importers: specifier: 3.8.1 version: 3.8.1 prisma: - specifier: 7.5.0 - version: 7.5.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + specifier: 7.6.0 + version: 7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) reading-time: specifier: 1.5.0 version: 1.5.0 @@ -338,17 +338,11 @@ packages: '@bcoe/v8-coverage@0.2.3': resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} - '@chevrotain/cst-dts-gen@10.5.0': - resolution: {integrity: sha512-lhmC/FyqQ2o7pGK4Om+hzuDrm9rhFYIJ/AXoQBeongmn870Xeb0L6oGEiuR8nohFNL5sMaQEJWCxr1oIVIVXrw==} + '@clack/core@0.5.0': + resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} - '@chevrotain/gast@10.5.0': - resolution: {integrity: sha512-pXdMJ9XeDAbgOWKuD1Fldz4ieCs6+nLNmyVhe2gZVqoO7v8HXuHYs5OV2EzUtbuai37TlOAQHrTDvxMnvMJz3A==} - - '@chevrotain/types@10.5.0': - resolution: {integrity: sha512-f1MAia0x/pAVPWH/T73BJVyO2XU5tI4/iE7cnxb7tqdNTNhQI3Uq3XkqcoteTmD4t1aM0LbHCJOhgIDn07kl2A==} - - '@chevrotain/utils@10.5.0': - resolution: {integrity: sha512-hBzuU5+JjB2cqNZyszkDHZgOSrUUT8V3dhgRl8Q9Gp6dAj/H5+KILGjbhDpc3Iy9qmqlm/akuOI2ut9VUtzJxQ==} + '@clack/prompts@0.11.0': + resolution: {integrity: sha512-pMN5FcrEw9hUkZA4f+zLlzivQSeQf5dRGJjSUbvVYDLvpKCdQx5OaknvKzgbtXOizhP+SJJJjqEbOe55uKKfAw==} '@commitlint/cli@20.5.0': resolution: {integrity: sha512-yNkyN/tuKTJS3wdVfsZ2tXDM4G4Gi7z+jW54Cki8N8tZqwKBltbIvUUrSbT4hz1bhW/h0CdR+5sCSpXD+wMKaQ==} @@ -466,19 +460,19 @@ packages: resolution: {integrity: sha512-Vd/9EVDiu6PPJt9yAh6roZP6El1xHrdvIVGjyBsHR0RYwNHgL7FJPyIIW4fANJNG6FtyZfvlRPpFI4ZM/lubvw==} engines: {node: '>=18'} - '@electric-sql/pglite-socket@0.0.20': - resolution: {integrity: sha512-J5nLGsicnD9wJHnno9r+DGxfcZWh+YJMCe0q/aCgtG6XOm9Z7fKeite8IZSNXgZeGltSigM9U/vAWZQWdgcSFg==} + '@electric-sql/pglite-socket@0.1.1': + resolution: {integrity: sha512-p2hoXw3Z3LQHwTeikdZNsFBOvXGqKY2hk51BBw+8NKND8eoH+8LFOtW9Z8CQKmTJ2qqGYu82ipqiyFZOTTXNfw==} hasBin: true peerDependencies: - '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite': 0.4.1 - '@electric-sql/pglite-tools@0.2.20': - resolution: {integrity: sha512-BK50ZnYa3IG7ztXhtgYf0Q7zijV32Iw1cYS8C+ThdQlwx12V5VZ9KRJ42y82Hyb4PkTxZQklVQA9JHyUlex33A==} + '@electric-sql/pglite-tools@0.3.1': + resolution: {integrity: sha512-C+T3oivmy9bpQvSxVqXA1UDY8cB9Eb9vZHL9zxWwEUfDixbXv4G3r2LjoTdR33LD8aomR3O9ZXEO3XEwr/cUCA==} peerDependencies: - '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite': 0.4.1 - '@electric-sql/pglite@0.3.15': - resolution: {integrity: sha512-Cj++n1Mekf9ETfdc16TlDi+cDDQF0W7EcbyRHYOAeZdsAe8M/FJg18itDTSwyHfar2WIezawM9o0EKaRGVKygQ==} + '@electric-sql/pglite@0.4.1': + resolution: {integrity: sha512-mZ9NzzUSYPOCnxHH1oAHPRzoMFJHY472raDKwXl/+6oPbpdJ7g8LsCN4FSaIIfkiCKHhb3iF/Zqo3NYxaIhU7Q==} '@emnapi/core@1.8.1': resolution: {integrity: sha512-AvT9QFpxK0Zd8J0jopedNm+w/2fIzvtPKPjqyw9jwvBaReTTqPBk9Hixaz7KbjimP+QNz605/XnjFcDAL2pqBg==} @@ -845,6 +839,9 @@ packages: '@jridgewell/trace-mapping@0.3.9': resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + '@kurkle/color@0.3.4': + resolution: {integrity: sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==} + '@mdx-js/mdx@3.1.1': resolution: {integrity: sha512-f6ZO2ifpwAQIpzGWaBQT2TXxPv6z3RBzQKpVftEWN78Vl/YweF1uwussDx8ECAXVtr3Rs89fKyG9YlzUs9DyGQ==} @@ -854,10 +851,6 @@ packages: '@types/react': '>=16' react: '>=16' - '@mrleebo/prisma-ast@0.13.1': - resolution: {integrity: sha512-XyroGQXcHrZdvmrGJvsA9KNeOOgGMg1Vg9OlheUsBOSKznLMDl+YChxbkboRHvtFYJEMRYmlV3uoo/njCw05iw==} - engines: {node: '>=16'} - '@napi-rs/wasm-runtime@0.2.12': resolution: {integrity: sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==} @@ -1150,14 +1143,14 @@ packages: resolution: {integrity: sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==} engines: {node: ^12.20.0 || ^14.18.0 || >=16.0.0} - '@prisma/adapter-pg@7.5.0': - resolution: {integrity: sha512-EJx7OLULahcC3IjJgdx2qRDNCT+ToY2v66UkeETMCLhNOTgqVzRzYvOEphY7Zp0eHyzfkC33Edd/qqeadf9R4A==} + '@prisma/adapter-pg@7.6.0': + resolution: {integrity: sha512-BjHNmJqqa42NqJSDPnXUfwUofWo8LJY7Ui2gqxN4DmAOb+H/gGKv+hln2Xq/1kSJXPW5AXMXuNiPDMpywvyIOw==} - '@prisma/client-runtime-utils@7.5.0': - resolution: {integrity: sha512-KnJ2b4Si/pcWEtK68uM+h0h1oh80CZt2suhLTVuLaSKg4n58Q9jBF/A42Kw6Ma+aThy1yAhfDeTC0JvEmeZnFQ==} + '@prisma/client-runtime-utils@7.6.0': + resolution: {integrity: sha512-fD7jlqubsZvVODKvsp9lOpXVecx2aWGxC2l35Ioz2t+teUJ5CfR0SAMsi7UkU1VvaZmmm+DS6BdujF622nY7tQ==} - '@prisma/client@7.5.0': - resolution: {integrity: sha512-h4hF9ctp+kSRs7ENHGsFQmHAgHcfkOCxbYt6Ti9Xi8x7D+kP4tTi9x51UKmiTH/OqdyJAO+8V+r+JA5AWdav7w==} + '@prisma/client@7.6.0': + resolution: {integrity: sha512-7Pe/1ayh3GgWPEg4mmT4ax77LJ1wC+XlnIFvQ94bLP2DsUnOpnruQQR3Jw7r+Frthk94QqDNxo3FjSg8h9PXeQ==} engines: {node: ^20.19 || ^22.12 || >=24.0} peerDependencies: prisma: '*' @@ -1168,35 +1161,35 @@ packages: typescript: optional: true - '@prisma/config@7.5.0': - resolution: {integrity: sha512-1J/9YEX7A889xM46PYg9e8VAuSL1IUmXJW3tEhMv7XQHDWlfC9YSkIw9sTYRaq5GswGlxZ+GnnyiNsUZ9JJhSQ==} + '@prisma/config@7.6.0': + resolution: {integrity: sha512-MuAz1MK4PeG5/03YzfzX3CnFVHQ6qePGwUpQRzPzX5tT0ffJ3Tzi9zJZbBc+VzEGFCM8ghW/gTVDR85Syjt+Yw==} '@prisma/debug@7.2.0': resolution: {integrity: sha512-YSGTiSlBAVJPzX4ONZmMotL+ozJwQjRmZweQNIq/ER0tQJKJynNkRB3kyvt37eOfsbMCXk3gnLF6J9OJ4QWftw==} - '@prisma/debug@7.5.0': - resolution: {integrity: sha512-163+nffny0JoPEkDhfNco0vcuT3ymIJc9+WX7MHSQhfkeKUmKe9/wqvGk5SjppT93DtBjVwr5HPJYlXbzm6qtg==} + '@prisma/debug@7.6.0': + resolution: {integrity: sha512-LpHr3qos4lQZ6sxwjStf59YBht7m9/QF7NSQsMH6qGENWZu2w3UkQUGn1h5iRkDjnWRj3VHykOu9qFhps4ADvA==} - '@prisma/dev@0.20.0': - resolution: {integrity: sha512-ovlBYwWor0OzG+yH4J3Ot+AneD818BttLA+Ii7wjbcLHUrnC4tbUPVGyNd3c/+71KETPKZfjhkTSpdS15dmXNQ==} + '@prisma/dev@0.24.3': + resolution: {integrity: sha512-ffHlQuKXZiaDt9Go0OnCTdJZrHxK0k7omJKNV86/VjpsXu5EIHZLK0T7JSWgvNlJwh56kW9JFu9v0qJciFzepg==} - '@prisma/driver-adapter-utils@7.5.0': - resolution: {integrity: sha512-B79N/amgV677mFesFDBAdrW0OIaqawap9E0sjgLBtzIz2R3hIMS1QB8mLZuUEiS4q5Y8Oh3I25Kw4SLxMypk9Q==} + '@prisma/driver-adapter-utils@7.6.0': + resolution: {integrity: sha512-D8j3p0RnhLuufMaRLX6QqtGgPC5Ao3l5oFP6Q5AL0rTHi4vna+NzGEipwCsfvcSvaGFCbsH3lsTMbb4WvY+ovA==} - '@prisma/engines-version@7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e': - resolution: {integrity: sha512-E+iRV/vbJLl8iGjVr6g/TEWokA+gjkV/doZkaQN1i/ULVdDwGnPJDfLUIFGS3BVwlG/m6L8T4x1x5isl8hGMxA==} + '@prisma/engines-version@7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711': + resolution: {integrity: sha512-r51DLcJ8bDRSrBEJF3J4cinoWyGA7rfP2mG6lD90VqIbGNOkbfcLcXalSVjq5Y6brQS3vcjrq4GbyUb1Cb7vkw==} - '@prisma/engines@7.5.0': - resolution: {integrity: sha512-ondGRhzoaVpRWvFaQ5wH5zS1BIbhzbKqczKjCn6j3L0Zfe/LInjcEg8+xtB49AuZBX30qyx1ZtGoootUohz2pw==} + '@prisma/engines@7.6.0': + resolution: {integrity: sha512-Sn5edRzhHqgRV2M+A0eIbY442B4mReWWf3pKs/LKreYgW7oa/up8JtK/s4iv/EQA097cyboZ08mmkpbLp+tZ3w==} - '@prisma/fetch-engine@7.5.0': - resolution: {integrity: sha512-kZCl2FV54qnyrVdnII8MI6qvt7HfU6Cbiz8dZ8PXz4f4lbSw45jEB9/gEMK2SGdiNhBKyk/Wv95uthoLhGMLYA==} + '@prisma/fetch-engine@7.6.0': + resolution: {integrity: sha512-N575Ni95c3FkduWY/eKTHqNYgNbceZ1tQaSknVtJjpKmiiBXmniESn/GTxsDvICC4ZeiNrXxioGInzQrCdx16w==} '@prisma/get-platform@7.2.0': resolution: {integrity: sha512-k1V0l0Td1732EHpAfi2eySTezyllok9dXb6UQanajkJQzPUGi3vO2z7jdkz67SypFTdmbnyGYxvEvYZdZsMAVA==} - '@prisma/get-platform@7.5.0': - resolution: {integrity: sha512-7I+2y1nu/gkEKSiHHbcZ1HPe/euGdEqJZxEEMT0246q4De1+hla0ZzlTgvaT9dHcVCgLSuCG8v39db5qUUWNgw==} + '@prisma/get-platform@7.6.0': + resolution: {integrity: sha512-ohZDwXvtmnbzOcutR2D13lDWpZP1wQjmPyztmt0AwXLzQI7q95EE7NYCvS+M6N6SivT+BM0NOqLmTH3wms4L3A==} '@prisma/instrumentation@7.4.2': resolution: {integrity: sha512-r9JfchJF1Ae6yAxcaLu/V1TGqBhAuSDe3mRNOssBfx1rMzfZ4fdNvrgUBwyb/TNTGXFxlH9AZix5P257x07nrg==} @@ -1206,14 +1199,92 @@ packages: '@prisma/query-plan-executor@7.2.0': resolution: {integrity: sha512-EOZmNzcV8uJ0mae3DhTsiHgoNCuu1J9mULQpGCh62zN3PxPTd+qI9tJvk5jOst8WHKQNwJWR3b39t0XvfBB0WQ==} - '@prisma/studio-core@0.21.1': - resolution: {integrity: sha512-bOGqG/eMQtKC0XVvcVLRmhWWzm/I+0QUWqAEhEBtetpuS3k3V4IWqKGUONkAIT223DNXJMxMtZp36b1FmcdPeg==} - engines: {node: ^20.19 || ^22.12 || ^24.0, pnpm: '8'} + '@prisma/streams-local@0.1.2': + resolution: {integrity: sha512-l49yTxKKF2odFxaAXTmwmkBKL3+bVQ1tFOooGifu4xkdb9NMNLxHj27XAhTylWZod8I+ISGM5erU1xcl/oBCtg==} + engines: {bun: '>=1.3.6', node: '>=22.0.0'} + + '@prisma/studio-core@0.27.3': + resolution: {integrity: sha512-AADjNFPdsrglxHQVTmHFqv6DuKQZ5WY4p5/gVFY017twvNrSwpLJ9lqUbYYxEu2W7nbvVxTZA8deJ8LseNALsw==} + engines: {node: ^20.19 || ^22.12 || >=24.0, pnpm: '8'} peerDependencies: '@types/react': ^18.0.0 || ^19.0.0 react: ^18.0.0 || ^19.0.0 react-dom: ^18.0.0 || ^19.0.0 + '@radix-ui/primitive@1.1.3': + resolution: {integrity: sha512-JTF99U/6XIjCBo0wqkU5sK10glYe27MRRsfwoiq5zzOEZLHU3A3KCMa5X/azekYRCJ0HlwI0crAXS/5dEHTzDg==} + + '@radix-ui/react-compose-refs@1.1.2': + resolution: {integrity: sha512-z4eqJvfiNnFMHIIvXP3CY57y2WJs5g2v3X0zm9mEJkrkNv4rDxu+sg9Jh8EkXyeqBkB7SOcboo9dMVqhyrACIg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-primitive@2.1.3': + resolution: {integrity: sha512-m9gTwRkhy2lvCPe6QJp4d3G1TYEUHn/FzJUtq9MjH46an1wJU+GdoGC5VLof8RX8Ft/DlpshApkhswDLZzHIcQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-slot@1.2.3': + resolution: {integrity: sha512-aeNmHnBxbi2St0au6VBVC7JXFlhLlOnvIIlePNniyUNAClzmtAUEY8/pBiK3iHjufOlwA+c20/8jngo7xcrg8A==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-toggle@1.1.10': + resolution: {integrity: sha512-lS1odchhFTeZv3xwHH31YPObmJn8gOg7Lq12inrr0+BH/l3Tsq32VfjqH1oh80ARM3mlkfMic15n0kg4sD1poQ==} + peerDependencies: + '@types/react': '*' + '@types/react-dom': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@types/react-dom': + optional: true + + '@radix-ui/react-use-controllable-state@1.2.2': + resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-effect-event@0.0.2': + resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + + '@radix-ui/react-use-layout-effect@1.1.1': + resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==} + peerDependencies: + '@types/react': '*' + react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + '@rollup/plugin-commonjs@28.0.1': resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -1373,28 +1444,28 @@ packages: '@rtsao/scc@1.1.0': resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==} - '@sentry-internal/browser-utils@10.45.0': - resolution: {integrity: sha512-ZPZpeIarXKScvquGx2AfNKcYiVNDA4wegMmjyGVsTA2JPmP0TrJoO3UybJS6KGDeee8V3I3EfD/ruauMm7jOFQ==} + '@sentry-internal/browser-utils@10.46.0': + resolution: {integrity: sha512-WB1gBT9G13V02ekZ6NpUhoI1aGHV2eNfjEPthkU2bGBvFpQKnstwzjg7waIRGR7cu+YSW2Q6UI6aQLgBeOPD1g==} engines: {node: '>=18'} - '@sentry-internal/feedback@10.45.0': - resolution: {integrity: sha512-vCSurazFVq7RUeYiM5X326jA5gOVrWYD6lYX2fbjBOMcyCEhDnveNxMT62zKkZDyNT/jyD194nz/cjntBUkyWA==} + '@sentry-internal/feedback@10.46.0': + resolution: {integrity: sha512-c4pI/z9nZCQXe9GYEw/hE/YTY9AxGBp8/wgKI+T8zylrN35SGHaXv63szzE1WbI8lacBY8lBF7rstq9bQVCaHw==} engines: {node: '>=18'} - '@sentry-internal/replay-canvas@10.45.0': - resolution: {integrity: sha512-nvq/AocdZTuD7y0KSiWi3gVaY0s5HOFy86mC/v1kDZmT/jsBAzN5LDkk/f1FvsWma1peqQmpUqxvhC+YIW294Q==} + '@sentry-internal/replay-canvas@10.46.0': + resolution: {integrity: sha512-ub314MWUsekVCuoH0/HJbbimlI24SkV745UW2pj9xRbxOAEf1wjkmIzxKrMDbTgJGuEunug02XZVdJFJUzOcDw==} engines: {node: '>=18'} - '@sentry-internal/replay@10.45.0': - resolution: {integrity: sha512-vjosRoGA1bzhVAEO1oce+CsRdd70quzBeo7WvYqpcUnoLe/Rv8qpOMqWX3j26z7XfFHMExWQNQeLxmtYOArvlw==} + '@sentry-internal/replay@10.46.0': + resolution: {integrity: sha512-JBsWeXG6bRbxBFK8GzWymWGOB9QE7Kl57BeF3jzgdHTuHSWZ2mRnAmb1K05T4LU+gVygk6yW0KmdC8Py9Qzg9A==} engines: {node: '>=18'} '@sentry/babel-plugin-component-annotate@5.1.1': resolution: {integrity: sha512-x2wEpBHwsTyTF2rWsLKJlzrRF1TTIGOfX+ngdE+Yd5DBkoS58HwQv824QOviPGQRla4/ypISqAXzjdDPL/zalg==} engines: {node: '>= 18'} - '@sentry/browser@10.45.0': - resolution: {integrity: sha512-e/a8UMiQhqqv706McSIcG6XK+AoQf9INthi2pD+giZfNRTzXTdqHzUT5OIO5hg8Am6eF63nDJc+vrYNPhzs51Q==} + '@sentry/browser@10.46.0': + resolution: {integrity: sha512-80DmGlTk5Z2/OxVOzLNxwolMyouuAYKqG8KUcoyintZqHbF6kO1RulI610HmyUt3OagKeBCqt9S7w0VIfCRL+Q==} engines: {node: '>=18'} '@sentry/bundler-plugin-core@5.1.1': @@ -1453,18 +1524,18 @@ packages: engines: {node: '>= 10'} hasBin: true - '@sentry/core@10.45.0': - resolution: {integrity: sha512-s69UXxvefeQxuZ5nY7/THtTrIEvJxNVCp3ns4kwoCw1qMpgpvn/296WCKVmM7MiwnaAdzEKnAvLAwaxZc2nM7Q==} + '@sentry/core@10.46.0': + resolution: {integrity: sha512-N3fj4zqBQOhXliS1Ne9euqIKuciHCGOJfPGQLwBoW9DNz03jF+NB8+dUKtrJ79YLoftjVgf8nbgwtADK7NR+2Q==} engines: {node: '>=18'} - '@sentry/nextjs@10.45.0': - resolution: {integrity: sha512-4LE+UvnfdOYyG8YEb/9TWaJQzMPuGLlph/iqowvsMdxaW6la+mvADiuzNTXly4QfsjeD3KIb7dKlGTqiVV0Ttw==} + '@sentry/nextjs@10.46.0': + resolution: {integrity: sha512-DVS6vHOhgFuvcos9OXrj1wcLi9iv859bmQ5lVLpbotAmPd63+kX82aQzATk1CBr3ygZrlA2lSYHDbpRzTAvIaA==} engines: {node: '>=18'} peerDependencies: next: ^13.2.0 || ^14.0 || ^15.0.0-rc.0 || ^16.0.0-0 - '@sentry/node-core@10.45.0': - resolution: {integrity: sha512-KQZEvLKM344+EqXiA9HIzWbW5hzq6/9nnFUQ8niaBPoOgR9AiJhrccfIscfgb8vjkriiEtzE03OW/4h1CTgZ3Q==} + '@sentry/node-core@10.46.0': + resolution: {integrity: sha512-gwLGXfkzmiCmUI1VWttyoZBaVp1ItpDKc8AV2mQblWPQGdLSD0c6uKV/FkU291yZA3rXsrLXVwcWoibwnjE2vw==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -1490,12 +1561,12 @@ packages: '@opentelemetry/semantic-conventions': optional: true - '@sentry/node@10.45.0': - resolution: {integrity: sha512-Kpiq9lRGnJc1ex8SwxOBl+FLQNl4Y137BydVooP7AFiAYZ6ftwHsIEF1bcYXaipHMT1YHS2bdhC2UQaaB2jkuQ==} + '@sentry/node@10.46.0': + resolution: {integrity: sha512-vF+7FrUXEtmYWuVcnvBjlWKeyLw/kwHpwnGj9oUmO/a2uKjDmUr53ZVcapggNxCjivavGYr9uHOY64AGdeUyzA==} engines: {node: '>=18'} - '@sentry/opentelemetry@10.45.0': - resolution: {integrity: sha512-PmuGO+p/gC3ZQ8ddOeJ5P9ApnTTm35i12Bpuyb13AckCbNSJFvG2ggZda35JQOmiFU0kKYiwkoFAa8Mvj9od3Q==} + '@sentry/opentelemetry@10.46.0': + resolution: {integrity: sha512-dzzV2ovruGsx9jzusGGr6cNPvMgYRu2BIrF8aMZ3rkQ1OpPJjPStqtA1l1fw0aoxHOxIjFU7ml4emF+xdmMl3g==} engines: {node: '>=18'} peerDependencies: '@opentelemetry/api': ^1.9.0 @@ -1504,14 +1575,14 @@ packages: '@opentelemetry/sdk-trace-base': ^1.30.1 || ^2.1.0 '@opentelemetry/semantic-conventions': ^1.39.0 - '@sentry/react@10.45.0': - resolution: {integrity: sha512-jLezuxi4BUIU3raKyAPR5xMbQG/nhwnWmKo5p11NCbLmWzkS+lxoyDTUB4B8TAKZLfdtdkKLOn1S0tFc8vbUHw==} + '@sentry/react@10.46.0': + resolution: {integrity: sha512-Rb1S+9OuUPVwsz7GWnQ6Kgf3azbsseUymIegg3JZHNcW/fM1nPpaljzTBnuineia113DH0pgMBcdrrZDLaosFQ==} engines: {node: '>=18'} peerDependencies: react: ^16.14.0 || 17.x || 18.x || 19.x - '@sentry/vercel-edge@10.45.0': - resolution: {integrity: sha512-sSF+Ex5NwT60gMinLcP/JNZb3cDaIv0mL1cRjfvN6zN2ZNEw0C9rhdgxa0EdD4G6PCHQ0XnCuAMDsfJ6gnRmfA==} + '@sentry/vercel-edge@10.46.0': + resolution: {integrity: sha512-A50gQM5ZoEwR6V3sKbq4S0RxGeKllpWTZfN+vemXh+XGi+F5U3QpEQufJgd+xHP7cxxbc1BiJIYuLmIjGbxjQA==} engines: {node: '>=18'} '@sentry/webpack-plugin@5.1.1': @@ -1762,12 +1833,12 @@ packages: '@types/pg-pool@2.0.7': resolution: {integrity: sha512-U4CwmGVQcbEuqpyju8/ptOKg6gEC+Tqsvj2xS9o1g71bUh8twxnC6ZL5rZKCsGN0iyH0CwgUyc9VR5owNQF9Ng==} - '@types/pg@8.11.11': - resolution: {integrity: sha512-kGT1qKM8wJQ5qlawUrEkXgvMSXoV213KfMGXcwfDwUIfUHXqXYXOfS1nE1LINRJVVVx5wCm70XnFlMHaIcQAfw==} - '@types/pg@8.15.6': resolution: {integrity: sha512-NoaMtzhxOrubeL/7UZuNTrejB4MPAJ0RpxZqXQf2qXuVlTPuG6Y8p4u9dKRaue4yjmC7ZhzVO2/Yyyn25znrPQ==} + '@types/pg@8.20.0': + resolution: {integrity: sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==} + '@types/prismjs@1.26.6': resolution: {integrity: sha512-vqlvI7qlMvcCBbVe0AKAb4f97//Hy0EBTaiW8AalRnG/xAN5zOiWWyrNqNXeq8+KAuvRewjCVY1+IPxk4RdNYw==} @@ -2276,6 +2347,10 @@ packages: engines: {node: '>=6.0.0'} hasBin: true + better-result@2.7.0: + resolution: {integrity: sha512-7zrmXjAK8u8Z6SOe4R65XObOR5X+Y2I/VVku3t5cPOGQ8/WsBcfFmfnIPiEl5EBMDOzPHRwbiPbMtQBKYdw7RA==} + hasBin: true + brace-expansion@1.1.12: resolution: {integrity: sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==} @@ -2362,8 +2437,9 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} - chevrotain@10.5.0: - resolution: {integrity: sha512-Pkv5rBY3+CsHOYfV5g/Vs5JY9WTHHDEKOlohI2XeygaZhUeqhAlldZ8Hz9cRmxu709bvS08YzxHdTPHhffc13A==} + chart.js@4.5.1: + resolution: {integrity: sha512-GIjfiT9dbmHRiYi6Nl2yFCq7kkwdkp1W/lp2J99rX0yo9tgJGn3lKQATztIjb5tVtevcBtIdICNWqlq5+E8/Pw==} + engines: {pnpm: '>=8'} chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} @@ -2650,6 +2726,10 @@ packages: resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} engines: {node: '>=6'} + env-paths@3.0.0: + resolution: {integrity: sha512-dtJUTepzMW3Lm/NPxRf3wP4642UWhjL2sQxc+ym2YMj1m/H2zDNQOlezafzkHwn6sMstjHTwG6iQQsctDW/b1A==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + error-ex@1.3.4: resolution: {integrity: sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==} @@ -3759,10 +3839,6 @@ packages: resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==} engines: {node: '>= 12.0.0'} - lilconfig@2.1.0: - resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} - engines: {node: '>=10'} - lines-and-columns@1.2.4: resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} @@ -3799,9 +3875,6 @@ packages: lodash.upperfirst@4.3.1: resolution: {integrity: sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==} - lodash@4.17.23: - resolution: {integrity: sha512-LgVTMpQtIopCi79SJeDiP0TfWi5CNEc/L/aRdTh3yIvmZXTnheWpKjSZhnvMl8iXbC1tFg9gdHHDMLoV7CnG+w==} - long@5.3.2: resolution: {integrity: sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==} @@ -4201,9 +4274,6 @@ packages: resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==} engines: {node: '>= 0.4'} - obuf@1.1.2: - resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==} - ohash@2.0.11: resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} @@ -4301,10 +4371,6 @@ packages: resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} engines: {node: '>=4.0.0'} - pg-numeric@1.0.2: - resolution: {integrity: sha512-BM/Thnrw5jm2kKLE5uJkXqqExRUY/toLHda65XgFTBTFYZyopbKjBe29Ii3RbkvlsMoFwD+tHeGaCjjv0gHlyw==} - engines: {node: '>=4'} - pg-pool@3.11.0: resolution: {integrity: sha512-MJYfvHwtGp870aeusDh+hg9apvOe2zmpZJpyt+BMtzUWlVqbhFmMK6bOBXLBUPd7iRtIF9fZplDc7KrPN3PN7w==} peerDependencies: @@ -4317,10 +4383,6 @@ packages: resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} engines: {node: '>=4'} - pg-types@4.1.0: - resolution: {integrity: sha512-o2XFanIMy/3+mThw69O8d4n1E5zsLhdO+OPqswezu7Z5ekP4hYDqlDjlmOpYMbzY2Br0ufCwJLdDIXeNVwcWFg==} - engines: {node: '>=10'} - pg@8.18.0: resolution: {integrity: sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==} engines: {node: '>= 16.0.0'} @@ -4386,29 +4448,14 @@ packages: resolution: {integrity: sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==} engines: {node: '>=0.10.0'} - postgres-bytea@3.0.0: - resolution: {integrity: sha512-CNd4jim9RFPkObHSjVHlVrxoVQXz7quwNFpz7RY1okNNme49+sVyiTvTRobiLV548Hx/hb1BG+iE7h9493WzFw==} - engines: {node: '>= 6'} - postgres-date@1.0.7: resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} engines: {node: '>=0.10.0'} - postgres-date@2.1.0: - resolution: {integrity: sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==} - engines: {node: '>=12'} - postgres-interval@1.2.0: resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} engines: {node: '>=0.10.0'} - postgres-interval@3.0.0: - resolution: {integrity: sha512-BSNDnbyZCXSxgA+1f5UU2GmwhoI0aU5yMxRGO8CdFEcY2BQF9xm/7MqKnYoM1nJDk8nONNWDk9WeSmePFhQdlw==} - engines: {node: '>=12'} - - postgres-range@1.1.4: - resolution: {integrity: sha512-i/hbxIE9803Alj/6ytL7UHQxRvZkI9O4Sy+J3HGc4F4oo/2eQAjTSNJ0bfxyse3bH0nuVesCk+3IRLaMtG3H6w==} - postgres@3.4.7: resolution: {integrity: sha512-Jtc2612XINuBjIl/QTWsV5UvE8UHuNblcO3vVADSrKsrc6RqGX6lOW1cEo3CM2v0XG4Nat8nI+YM7/f26VxXLw==} engines: {node: '>=12'} @@ -4434,8 +4481,8 @@ packages: resolution: {integrity: sha512-oG4T3wCbfeuvljnyAzhBvpN45E8iOTXCU/TD3zXW80HA3dQ4ahdqMkWGiPWZvjpQwlbyHrPTWUAqUzGzv4l1JQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} - prisma@7.5.0: - resolution: {integrity: sha512-n30qZpWehaYQzigLjmuPisyEsvOzHt7bZeRyg8gZ5DvJo9FGjD+gNaY59Ns3hlLD5/jZH5GBeftIss0jDbUoLg==} + prisma@7.6.0: + resolution: {integrity: sha512-OKJIPT81K3+F+AayIkY/Y3mkF2NWoFh7lZApaaqPYy7EHILKdO0VsmGkP+hDKYTySHsFSyLWXm/JgcR1B8fY1Q==} engines: {node: ^20.19 || ^22.12 || >=24.0} hasBin: true peerDependencies: @@ -4529,9 +4576,6 @@ packages: refractor@5.0.0: resolution: {integrity: sha512-QXOrHQF5jOpjjLfiNk5GFnWhRXvxjUVnlFxkeDmewR5sXkr3iM46Zo+CnRR8B+MDVqkULW4EcLVcRBNOPXHosw==} - regexp-to-ast@0.5.0: - resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} - regexp.prototype.flags@1.5.4: resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==} engines: {node: '>= 0.4'} @@ -4724,6 +4768,9 @@ packages: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} + sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -5482,20 +5529,16 @@ snapshots: '@bcoe/v8-coverage@0.2.3': {} - '@chevrotain/cst-dts-gen@10.5.0': + '@clack/core@0.5.0': dependencies: - '@chevrotain/gast': 10.5.0 - '@chevrotain/types': 10.5.0 - lodash: 4.17.23 + picocolors: 1.1.1 + sisteransi: 1.0.5 - '@chevrotain/gast@10.5.0': + '@clack/prompts@0.11.0': dependencies: - '@chevrotain/types': 10.5.0 - lodash: 4.17.23 - - '@chevrotain/types@10.5.0': {} - - '@chevrotain/utils@10.5.0': {} + '@clack/core': 0.5.0 + picocolors: 1.1.1 + sisteransi: 1.0.5 '@commitlint/cli@20.5.0(@types/node@24.12.0)(conventional-commits-parser@6.3.0)(typescript@5.9.3)': dependencies: @@ -5645,15 +5688,15 @@ snapshots: '@csstools/css-tokenizer@3.0.4': {} - '@electric-sql/pglite-socket@0.0.20(@electric-sql/pglite@0.3.15)': + '@electric-sql/pglite-socket@0.1.1(@electric-sql/pglite@0.4.1)': dependencies: - '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite': 0.4.1 - '@electric-sql/pglite-tools@0.2.20(@electric-sql/pglite@0.3.15)': + '@electric-sql/pglite-tools@0.3.1(@electric-sql/pglite@0.4.1)': dependencies: - '@electric-sql/pglite': 0.3.15 + '@electric-sql/pglite': 0.4.1 - '@electric-sql/pglite@0.3.15': {} + '@electric-sql/pglite@0.4.1': {} '@emnapi/core@1.8.1': dependencies: @@ -6091,6 +6134,8 @@ snapshots: '@jridgewell/resolve-uri': 3.1.2 '@jridgewell/sourcemap-codec': 1.5.5 + '@kurkle/color@0.3.4': {} + '@mdx-js/mdx@3.1.1': dependencies: '@types/estree': 1.0.8 @@ -6127,11 +6172,6 @@ snapshots: '@types/react': 19.2.14 react: 19.2.4 - '@mrleebo/prisma-ast@0.13.1': - dependencies: - chevrotain: 10.5.0 - lilconfig: 2.1.0 - '@napi-rs/wasm-runtime@0.2.12': dependencies: '@emnapi/core': 1.8.1 @@ -6453,25 +6493,25 @@ snapshots: '@pkgr/core@0.2.9': {} - '@prisma/adapter-pg@7.5.0': + '@prisma/adapter-pg@7.6.0': dependencies: - '@prisma/driver-adapter-utils': 7.5.0 - '@types/pg': 8.11.11 + '@prisma/driver-adapter-utils': 7.6.0 + '@types/pg': 8.20.0 pg: 8.18.0 postgres-array: 3.0.4 transitivePeerDependencies: - pg-native - '@prisma/client-runtime-utils@7.5.0': {} + '@prisma/client-runtime-utils@7.6.0': {} - '@prisma/client@7.5.0(prisma@7.5.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)': + '@prisma/client@7.6.0(prisma@7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3))(typescript@5.9.3)': dependencies: - '@prisma/client-runtime-utils': 7.5.0 + '@prisma/client-runtime-utils': 7.6.0 optionalDependencies: - prisma: 7.5.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + prisma: 7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3) typescript: 5.9.3 - '@prisma/config@7.5.0': + '@prisma/config@7.6.0': dependencies: c12: 3.1.0 deepmerge-ts: 7.1.5 @@ -6482,17 +6522,17 @@ snapshots: '@prisma/debug@7.2.0': {} - '@prisma/debug@7.5.0': {} + '@prisma/debug@7.6.0': {} - '@prisma/dev@0.20.0(typescript@5.9.3)': + '@prisma/dev@0.24.3(typescript@5.9.3)': dependencies: - '@electric-sql/pglite': 0.3.15 - '@electric-sql/pglite-socket': 0.0.20(@electric-sql/pglite@0.3.15) - '@electric-sql/pglite-tools': 0.2.20(@electric-sql/pglite@0.3.15) + '@electric-sql/pglite': 0.4.1 + '@electric-sql/pglite-socket': 0.1.1(@electric-sql/pglite@0.4.1) + '@electric-sql/pglite-tools': 0.3.1(@electric-sql/pglite@0.4.1) '@hono/node-server': 1.19.11(hono@4.12.8) - '@mrleebo/prisma-ast': 0.13.1 '@prisma/get-platform': 7.2.0 '@prisma/query-plan-executor': 7.2.0 + '@prisma/streams-local': 0.1.2 foreground-child: 3.3.1 get-port-please: 3.2.0 hono: 4.12.8 @@ -6506,32 +6546,32 @@ snapshots: transitivePeerDependencies: - typescript - '@prisma/driver-adapter-utils@7.5.0': + '@prisma/driver-adapter-utils@7.6.0': dependencies: - '@prisma/debug': 7.5.0 + '@prisma/debug': 7.6.0 - '@prisma/engines-version@7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e': {} + '@prisma/engines-version@7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711': {} - '@prisma/engines@7.5.0': + '@prisma/engines@7.6.0': dependencies: - '@prisma/debug': 7.5.0 - '@prisma/engines-version': 7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e - '@prisma/fetch-engine': 7.5.0 - '@prisma/get-platform': 7.5.0 + '@prisma/debug': 7.6.0 + '@prisma/engines-version': 7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711 + '@prisma/fetch-engine': 7.6.0 + '@prisma/get-platform': 7.6.0 - '@prisma/fetch-engine@7.5.0': + '@prisma/fetch-engine@7.6.0': dependencies: - '@prisma/debug': 7.5.0 - '@prisma/engines-version': 7.5.0-15.280c870be64f457428992c43c1f6d557fab6e29e - '@prisma/get-platform': 7.5.0 + '@prisma/debug': 7.6.0 + '@prisma/engines-version': 7.6.0-1.75cbdc1eb7150937890ad5465d861175c6624711 + '@prisma/get-platform': 7.6.0 '@prisma/get-platform@7.2.0': dependencies: '@prisma/debug': 7.2.0 - '@prisma/get-platform@7.5.0': + '@prisma/get-platform@7.6.0': dependencies: - '@prisma/debug': 7.5.0 + '@prisma/debug': 7.6.0 '@prisma/instrumentation@7.4.2(@opentelemetry/api@1.9.0)': dependencies: @@ -6542,11 +6582,78 @@ snapshots: '@prisma/query-plan-executor@7.2.0': {} - '@prisma/studio-core@0.21.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + '@prisma/streams-local@0.1.2': dependencies: + ajv: 8.18.0 + better-result: 2.7.0 + env-paths: 3.0.0 + proper-lockfile: 4.1.2 + + '@prisma/studio-core@0.27.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-toggle': 1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@types/react': 19.2.14 + chart.js: 4.5.1 react: 19.2.4 react-dom: 19.2.4(react@19.2.4) + transitivePeerDependencies: + - '@types/react-dom' + + '@radix-ui/primitive@1.1.3': {} + + '@radix-ui/react-compose-refs@1.1.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-primitive@2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/react-slot': 1.2.3(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-slot@1.2.3(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-compose-refs': 1.1.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-toggle@1.1.10(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': + dependencies: + '@radix-ui/primitive': 1.1.3 + '@radix-ui/react-primitive': 2.1.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@radix-ui/react-use-controllable-state': 1.2.2(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + react-dom: 19.2.4(react@19.2.4) + optionalDependencies: + '@types/react': 19.2.14 + '@types/react-dom': 19.2.3(@types/react@19.2.14) + + '@radix-ui/react-use-controllable-state@1.2.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-effect-event': 0.0.2(@types/react@19.2.14)(react@19.2.4) + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-effect-event@0.0.2(@types/react@19.2.14)(react@19.2.4)': + dependencies: + '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@19.2.14)(react@19.2.4) + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 + + '@radix-ui/react-use-layout-effect@1.1.1(@types/react@19.2.14)(react@19.2.4)': + dependencies: + react: 19.2.4 + optionalDependencies: + '@types/react': 19.2.14 '@rollup/plugin-commonjs@28.0.1(rollup@4.59.1)': dependencies: @@ -6645,33 +6752,33 @@ snapshots: '@rtsao/scc@1.1.0': {} - '@sentry-internal/browser-utils@10.45.0': + '@sentry-internal/browser-utils@10.46.0': dependencies: - '@sentry/core': 10.45.0 + '@sentry/core': 10.46.0 - '@sentry-internal/feedback@10.45.0': + '@sentry-internal/feedback@10.46.0': dependencies: - '@sentry/core': 10.45.0 + '@sentry/core': 10.46.0 - '@sentry-internal/replay-canvas@10.45.0': + '@sentry-internal/replay-canvas@10.46.0': dependencies: - '@sentry-internal/replay': 10.45.0 - '@sentry/core': 10.45.0 + '@sentry-internal/replay': 10.46.0 + '@sentry/core': 10.46.0 - '@sentry-internal/replay@10.45.0': + '@sentry-internal/replay@10.46.0': dependencies: - '@sentry-internal/browser-utils': 10.45.0 - '@sentry/core': 10.45.0 + '@sentry-internal/browser-utils': 10.46.0 + '@sentry/core': 10.46.0 '@sentry/babel-plugin-component-annotate@5.1.1': {} - '@sentry/browser@10.45.0': + '@sentry/browser@10.46.0': dependencies: - '@sentry-internal/browser-utils': 10.45.0 - '@sentry-internal/feedback': 10.45.0 - '@sentry-internal/replay': 10.45.0 - '@sentry-internal/replay-canvas': 10.45.0 - '@sentry/core': 10.45.0 + '@sentry-internal/browser-utils': 10.46.0 + '@sentry-internal/feedback': 10.46.0 + '@sentry-internal/replay': 10.46.0 + '@sentry-internal/replay-canvas': 10.46.0 + '@sentry/core': 10.46.0 '@sentry/bundler-plugin-core@5.1.1': dependencies: @@ -6730,20 +6837,20 @@ snapshots: - encoding - supports-color - '@sentry/core@10.45.0': {} + '@sentry/core@10.46.0': {} - '@sentry/nextjs@10.45.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.105.2)': + '@sentry/nextjs@10.46.0(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(next@16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4))(react@19.2.4)(webpack@5.105.2)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/semantic-conventions': 1.40.0 '@rollup/plugin-commonjs': 28.0.1(rollup@4.59.1) - '@sentry-internal/browser-utils': 10.45.0 + '@sentry-internal/browser-utils': 10.46.0 '@sentry/bundler-plugin-core': 5.1.1 - '@sentry/core': 10.45.0 - '@sentry/node': 10.45.0 - '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/react': 10.45.0(react@19.2.4) - '@sentry/vercel-edge': 10.45.0 + '@sentry/core': 10.46.0 + '@sentry/node': 10.46.0 + '@sentry/opentelemetry': 10.46.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/react': 10.46.0(react@19.2.4) + '@sentry/vercel-edge': 10.46.0 '@sentry/webpack-plugin': 5.1.1(webpack@5.105.2) next: 16.2.1(@babel/core@7.29.0)(@opentelemetry/api@1.9.0)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) rollup: 4.59.1 @@ -6757,10 +6864,10 @@ snapshots: - supports-color - webpack - '@sentry/node-core@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/node-core@10.46.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: - '@sentry/core': 10.45.0 - '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/core': 10.46.0 + '@sentry/opentelemetry': 10.46.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 3.0.0 optionalDependencies: '@opentelemetry/api': 1.9.0 @@ -6771,7 +6878,7 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@sentry/node@10.45.0': + '@sentry/node@10.46.0': dependencies: '@fastify/otel': 0.17.1(@opentelemetry/api@1.9.0) '@opentelemetry/api': 1.9.0 @@ -6804,33 +6911,33 @@ snapshots: '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 '@prisma/instrumentation': 7.4.2(@opentelemetry/api@1.9.0) - '@sentry/core': 10.45.0 - '@sentry/node-core': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) - '@sentry/opentelemetry': 10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/core': 10.46.0 + '@sentry/node-core': 10.46.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/instrumentation@0.213.0(@opentelemetry/api@1.9.0))(@opentelemetry/resources@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) + '@sentry/opentelemetry': 10.46.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0) import-in-the-middle: 3.0.0 transitivePeerDependencies: - supports-color - '@sentry/opentelemetry@10.45.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': + '@sentry/opentelemetry@10.46.0(@opentelemetry/api@1.9.0)(@opentelemetry/context-async-hooks@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/core@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/sdk-trace-base@2.6.0(@opentelemetry/api@1.9.0))(@opentelemetry/semantic-conventions@1.40.0)': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/context-async-hooks': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/core': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/sdk-trace-base': 2.6.0(@opentelemetry/api@1.9.0) '@opentelemetry/semantic-conventions': 1.40.0 - '@sentry/core': 10.45.0 + '@sentry/core': 10.46.0 - '@sentry/react@10.45.0(react@19.2.4)': + '@sentry/react@10.46.0(react@19.2.4)': dependencies: - '@sentry/browser': 10.45.0 - '@sentry/core': 10.45.0 + '@sentry/browser': 10.46.0 + '@sentry/core': 10.46.0 react: 19.2.4 - '@sentry/vercel-edge@10.45.0': + '@sentry/vercel-edge@10.46.0': dependencies: '@opentelemetry/api': 1.9.0 '@opentelemetry/resources': 2.6.0(@opentelemetry/api@1.9.0) - '@sentry/core': 10.45.0 + '@sentry/core': 10.46.0 '@sentry/webpack-plugin@5.1.1(webpack@5.105.2)': dependencies: @@ -7082,13 +7189,13 @@ snapshots: dependencies: '@types/pg': 8.15.6 - '@types/pg@8.11.11': + '@types/pg@8.15.6': dependencies: '@types/node': 24.12.0 pg-protocol: 1.11.0 - pg-types: 4.1.0 + pg-types: 2.2.0 - '@types/pg@8.15.6': + '@types/pg@8.20.0': dependencies: '@types/node': 24.12.0 pg-protocol: 1.11.0 @@ -7602,6 +7709,10 @@ snapshots: baseline-browser-mapping@2.10.0: {} + better-result@2.7.0: + dependencies: + '@clack/prompts': 0.11.0 + brace-expansion@1.1.12: dependencies: balanced-match: 1.0.2 @@ -7692,14 +7803,9 @@ snapshots: character-reference-invalid@2.0.1: {} - chevrotain@10.5.0: + chart.js@4.5.1: dependencies: - '@chevrotain/cst-dts-gen': 10.5.0 - '@chevrotain/gast': 10.5.0 - '@chevrotain/types': 10.5.0 - '@chevrotain/utils': 10.5.0 - lodash: 4.17.23 - regexp-to-ast: 0.5.0 + '@kurkle/color': 0.3.4 chokidar@4.0.3: dependencies: @@ -7934,6 +8040,8 @@ snapshots: env-paths@2.2.1: {} + env-paths@3.0.0: {} + error-ex@1.3.4: dependencies: is-arrayish: 0.2.1 @@ -9496,8 +9604,6 @@ snapshots: lightningcss-win32-arm64-msvc: 1.32.0 lightningcss-win32-x64-msvc: 1.32.0 - lilconfig@2.1.0: {} - lines-and-columns@1.2.4: {} loader-runner@4.3.1: {} @@ -9524,8 +9630,6 @@ snapshots: lodash.upperfirst@4.3.1: {} - lodash@4.17.23: {} - long@5.3.2: {} longest-streak@3.1.0: {} @@ -10187,8 +10291,6 @@ snapshots: define-properties: 1.2.1 es-object-atoms: 1.1.1 - obuf@1.1.2: {} - ohash@2.0.11: {} once@1.4.0: @@ -10290,8 +10392,6 @@ snapshots: pg-int8@1.0.1: {} - pg-numeric@1.0.2: {} - pg-pool@3.11.0(pg@8.18.0): dependencies: pg: 8.18.0 @@ -10306,16 +10406,6 @@ snapshots: postgres-date: 1.0.7 postgres-interval: 1.2.0 - pg-types@4.1.0: - dependencies: - pg-int8: 1.0.1 - pg-numeric: 1.0.2 - postgres-array: 3.0.4 - postgres-bytea: 3.0.0 - postgres-date: 2.1.0 - postgres-interval: 3.0.0 - postgres-range: 1.1.4 - pg@8.18.0: dependencies: pg-connection-string: 2.11.0 @@ -10375,22 +10465,12 @@ snapshots: postgres-bytea@1.0.1: {} - postgres-bytea@3.0.0: - dependencies: - obuf: 1.1.2 - postgres-date@1.0.7: {} - postgres-date@2.1.0: {} - postgres-interval@1.2.0: dependencies: xtend: 4.0.2 - postgres-interval@3.0.0: {} - - postgres-range@1.1.4: {} - postgres@3.4.7: {} prelude-ls@1.2.1: {} @@ -10415,18 +10495,19 @@ snapshots: ansi-styles: 5.2.0 react-is: 18.3.1 - prisma@7.5.0(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): + prisma@7.6.0(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)(typescript@5.9.3): dependencies: - '@prisma/config': 7.5.0 - '@prisma/dev': 0.20.0(typescript@5.9.3) - '@prisma/engines': 7.5.0 - '@prisma/studio-core': 0.21.1(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) + '@prisma/config': 7.6.0 + '@prisma/dev': 0.24.3(typescript@5.9.3) + '@prisma/engines': 7.6.0 + '@prisma/studio-core': 0.27.3(@types/react-dom@19.2.3(@types/react@19.2.14))(@types/react@19.2.14)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) mysql2: 3.15.3 postgres: 3.4.7 optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - '@types/react' + - '@types/react-dom' - magicast - react - react-dom @@ -10531,8 +10612,6 @@ snapshots: hastscript: 9.0.1 parse-entities: 4.0.2 - regexp-to-ast@0.5.0: {} - regexp.prototype.flags@1.5.4: dependencies: call-bind: 1.0.8 @@ -10856,6 +10935,8 @@ snapshots: signal-exit@4.1.0: {} + sisteransi@1.0.5: {} + slash@3.0.0: {} source-map-js@1.2.1: {} diff --git a/public/sitemap.xml b/public/sitemap.xml index 43a4d963..7be8c94d 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -1,99 +1,105 @@ -https://shramko.dev2026-01-29T14:44:34.911Zdaily1 -https://shramko.dev/about2026-01-29T14:44:34.911Zdaily0.9 -https://shramko.dev/blog2026-01-29T14:44:34.911Zdaily0.9 -https://shramko.dev/dashboard2026-01-29T14:44:34.911Zdaily0.9 -https://shramko.dev/gear2026-01-29T14:44:34.911Zdaily0.9 -https://shramko.dev/quizlet-list2026-01-29T14:44:34.911Zdaily0.9 -https://shramko.dev/quizlet-list/privacy-policy2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets2026-01-29T14:44:34.911Zdaily0.9 -https://shramko.dev/udemy-reset-progress2026-01-29T14:44:34.911Zdaily0.9 -https://shramko.dev/blog/category/ai2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/seo2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/productivity2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/tools2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/opinion2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/certifications2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/astro2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/vercel2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/tutorial2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/js2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/ts2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/jamstack2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/css2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/html2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/clean-code2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/project-setup2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/useful-resources2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/node2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/react2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/advanced-react2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/category/habits2026-01-29T14:44:34.911Zdaily0.7 -https://shramko.dev/blog/ai-seo-audit2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/apollo-graphql-certification2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/astro-image-on-vercel2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/astro2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/class-naming-conventions2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/conventional-commits2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/cross-browser-testing2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/difference-between-absolute-and-relative-url2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/dirname-error2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/discriminated-unions2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/dispatch-tables2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/eslint-with-typescript2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/expressions-statements2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/for-in-vs-for-of2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/generic-type-parameters2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/gitignore-is-not-enough2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/how-to-create-ssh-keys2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/introducing-the-new-shramko.dev2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/javascript-naming-conventions2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/js-arrays2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/linktree2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/npm-semantic-versioning2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/nvm2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/phpstorm-allow-network2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/pnpm2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/postgres-connect-url2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/react-elements-children2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/react-flexbox-grid2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/react-hooks-pitfalls2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/react-rerender2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/the-early-return-pattern-in-javascript2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/unsubscribe-immediately2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/blog/useful-articles2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/branded-types2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/check-if-character-is-a-letter-in-javascript2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/common-css-classes2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/compare-dates2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/countries-sql2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/css-selection2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/debounce2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/deep-clone2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/detect-caps-lock2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/distributive-omit2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/environment2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/generate-range2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/how-to-capitalize-first-letter-of-string-in-javascript2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/how-to-check-if-file-exists-node2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/how-to-get-the-current-url-with-javascript2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/how-to-remove-query2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/is-absolute-url2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/is-element-in-viewport2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/is-email-valid-regex2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/lazy-loading-images-with-intersection-observer2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/move-cursor2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/postgres-install-macos2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/random2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/remove-duplicates-array2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/satisfies-operator2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/sleep2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/sort-an-array-of-objects-in-javascript2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/template-literal-types2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/type-predicates2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/use-has-mounted2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/use-toggle-react-hook2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/visually-hidden2026-01-29T14:44:34.911Zdaily0.8 -https://shramko.dev/snippets/window-crypto2026-01-29T14:44:34.911Zdaily0.8 +https://shramko.dev2026-03-28T17:40:06.080Zdaily1 +https://shramko.dev/about2026-03-28T17:40:06.080Zdaily0.9 +https://shramko.dev/blog2026-03-28T17:40:06.080Zdaily0.9 +https://shramko.dev/dashboard2026-03-28T17:40:06.080Zdaily0.9 +https://shramko.dev/gear2026-03-28T17:40:06.080Zdaily0.9 +https://shramko.dev/quizlet-list2026-03-28T17:40:06.080Zdaily0.9 +https://shramko.dev/quizlet-list/privacy-policy2026-03-28T17:40:06.080Zdaily0.8 +https://shramko.dev/snippets2026-03-28T17:40:06.080Zdaily0.9 +https://shramko.dev/udemy-reset-progress2026-03-28T17:40:06.080Zdaily0.9 +https://shramko.dev/blog/ai-seo-audit2026-03-28T17:40:06.080Zdaily0.8 +https://shramko.dev/blog/apollo-graphql-certification2026-03-28T17:40:06.080Zdaily0.8 +https://shramko.dev/blog/astro2026-03-28T17:40:06.080Zdaily0.8 +https://shramko.dev/blog/astro-image-on-vercel2026-03-28T17:40:06.080Zdaily0.8 +https://shramko.dev/blog/category/advanced-react2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/ai2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/astro2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/certifications2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/clean-code2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/css2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/habits2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/html2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/jamstack2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/js2026-03-28T17:40:06.080Zdaily0.7 +https://shramko.dev/blog/category/node2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/opinion2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/productivity2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/project-setup2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/react2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/seo2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/tools2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/ts2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/tutorial2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/useful-resources2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/category/vercel2026-03-28T17:40:06.081Zdaily0.7 +https://shramko.dev/blog/class-naming-conventions2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/conventional-commits2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/cross-browser-testing2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/difference-between-absolute-and-relative-url2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/dirname-error2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/discriminated-unions2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/dispatch-tables2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/eslint-with-typescript2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/expressions-statements2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/for-in-vs-for-of2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/generic-type-parameters2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/gitignore-is-not-enough2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/how-to-create-ssh-keys2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/introducing-the-new-shramko.dev2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/javascript-naming-conventions2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/js-arrays2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/linktree2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/npm-semantic-versioning2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/nvm2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/phpstorm-allow-network2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/pnpm2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/postgres-connect-url2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/react-elements-children2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/react-flexbox-grid2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/react-hooks-pitfalls2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/react-rerender2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/the-early-return-pattern-in-javascript2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/unsubscribe-immediately2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/blog/useful-articles2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/branded-types2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/check-if-character-is-a-letter-in-javascript2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/common-css-classes2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/compare-dates2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/copy-to-clipboard2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/countries-sql2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/css-selection2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/debounce2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/deep-clone2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/detect-caps-lock2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/distributive-omit2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/environment2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/generate-range2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/group-by2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/how-to-capitalize-first-letter-of-string-in-javascript2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/how-to-check-if-file-exists-node2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/how-to-get-the-current-url-with-javascript2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/how-to-remove-query2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/is-absolute-url2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/is-element-in-viewport2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/is-email-valid-regex2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/lazy-loading-images-with-intersection-observer2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/local-storage2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/move-cursor2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/postgres-install-macos2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/random2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/remove-duplicates-array2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/satisfies-operator2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/sleep2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/sort-an-array-of-objects-in-javascript2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/template-literal-types2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/throttle2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/type-predicates2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/use-click-outside2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/use-has-mounted2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/use-media-query2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/use-toggle-react-hook2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/visually-hidden2026-03-28T17:40:06.081Zdaily0.8 +https://shramko.dev/snippets/window-crypto2026-03-28T17:40:06.081Zdaily0.8 \ No newline at end of file From 06bc86274a3aa554a1d343599895c9ca714a1d06 Mon Sep 17 00:00:00 2001 From: Serhii Shramko Date: Sat, 28 Mar 2026 14:19:15 -0400 Subject: [PATCH 2/4] fix: remove deprecated Sentry build options for v10 + Turbopack (#471) --- next.config.js | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/next.config.js b/next.config.js index 1cfb9d39..3e8876e3 100644 --- a/next.config.js +++ b/next.config.js @@ -95,16 +95,8 @@ const nextConfig = { const sentryBuildOptions = { silent: !process.env.CI, - disableServerWebpackPlugin: true, - disableClientWebpackPlugin: true, - hideSourceMaps: true, - webpack: { - autoInstrumentServerFunctions: false, - autoInstrumentMiddleware: false, - automaticVercelMonitors: true, - treeshake: { - removeDebugLogging: true, - }, + bundleSizeOptimizations: { + excludeDebugStatements: true, }, }; From f1be34ffdf0d5a158cc929455f6a18c5030fdb0c Mon Sep 17 00:00:00 2001 From: Serhii Shramko Date: Sat, 28 Mar 2026 14:35:38 -0400 Subject: [PATCH 3/4] chore: approve pnpm 10 build scripts for native dependencies (#472) --- package.json | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index b9411bf9..21b4e464 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,13 @@ "@hono/node-server": ">=1.19.10", "effect": ">=3.20.0", "lodash": ">=4.17.23" - } + }, + "onlyBuiltDependencies": [ + "@prisma/engines", + "@sentry/cli", + "prisma", + "sharp", + "unrs-resolver" + ] } } From c29c959810d9b10c515682c0841d6269f05622cc Mon Sep 17 00:00:00 2001 From: Serhii Shramko Date: Sat, 28 Mar 2026 15:21:04 -0400 Subject: [PATCH 4/4] build: improve lighthouse lcp (#475) --- components/google-analytics/google-analytics.tsx | 4 ++-- next.config.js | 3 +++ pages/_document.tsx | 2 -- pages/index.tsx | 4 ++-- tsconfig.json | 2 +- 5 files changed, 8 insertions(+), 7 deletions(-) diff --git a/components/google-analytics/google-analytics.tsx b/components/google-analytics/google-analytics.tsx index 51284e04..4d84261e 100644 --- a/components/google-analytics/google-analytics.tsx +++ b/components/google-analytics/google-analytics.tsx @@ -4,12 +4,12 @@ export function GoogleAnalytics() { return ( <>