From cc5e0821b3cea420ab011590c540047415e8828d Mon Sep 17 00:00:00 2001 From: Si Hyeong Lee Date: Sat, 17 Oct 2026 17:30:55 -0700 Subject: [PATCH 1/4] feat(portfolio): feature live MingleStage early access --- content/projects.json | 34 ++++++++++++++++++++++++ public/images/projects/minglestage.webp | Bin 0 -> 17168 bytes 2 files changed, 34 insertions(+) create mode 100644 public/images/projects/minglestage.webp diff --git a/content/projects.json b/content/projects.json index df445a3..a385208 100644 --- a/content/projects.json +++ b/content/projects.json @@ -1,5 +1,39 @@ { "projects": [ + { + "name": "MingleStage", + "slug": "minglestage", + "descriptionKo": "친구들이 같은 3D 공간에 모여 영상을 함께 보고 리액션을 나누는 브라우저 기반 워치파티 서비스. 캐릭터·좌석·공개/비공개 방·DJ 재생 제어·다국어 UI를 갖춘 무료 얼리 액세스를 운영 중입니다.", + "descriptionEn": "A browser-based 3D watch-party space where friends sit together, watch permitted video and react in real time. Free early access includes avatars, venues, public/private rooms, DJ playback controls and EN/KO/JA UI.", + "techStack": [ + "TypeScript", + "React", + "Three.js", + "Colyseus", + "WebSockets", + "Docker", + "Playwright", + "Vite" + ], + "status": "launched", + "website": "https://minglestage.app", + "private": true, + "featured": true, + "updatedAt": "2026-10-17", + "screenshot": "/images/projects/minglestage.webp", + "screenshotAltKo": "MingleStage의 실제 Black Box 3D 관람 공간. 여러 캐릭터가 좌석에 앉아 스크린을 함께 바라보고 리액션합니다.", + "screenshotAltEn": "Actual MingleStage Black Box 3D room with characters seated together, facing a shared screen and reacting.", + "caseStudy": { + "problemKo": "단순 동시 재생에서는 친구가 곁에 있는 공간감과 모임 운영 흐름이 약했습니다.", + "problemEn": "Basic watch synchronization lacks a sense of shared place and an intuitive flow for hosting a small screening.", + "decisionKo": "웹 브라우저에 3D 좌석·캐릭터 리액션을 구현하고, 역할별 재생 제어와 방 초대 링크·공개 가입·다국어 안내를 결합했습니다. 운영은 Web/Realtime 분리, 불변 이미지, 사용자 연결 보호와 백업 검증으로 관리합니다.", + "decisionEn": "I combined a browser 3D venue, seats and avatar reactions with role-based playback, room invitations, open signup and multilingual guidance. Deployment separates Web and Realtime with immutable images, connection safeguards and verified backup.", + "evidenceKo": "2026년 10월 17일 최신 Web을 운영에 배포했습니다. 8개 합성 클라이언트의 재생 상태·권한·재접속 테스트, 실제 WebKit 로그인 가독성 검사, CI와 분산 HTTPS 확인을 수행했습니다. 이 증거는 실제 8명이 함께 영상을 본 검증과 구분됩니다.", + "evidenceEn": "The current Web was deployed on October 17, 2026, with isolated eight-synthetic-peer media-state and reconnect checks, real WebKit-engine sign-in contrast QA, CI and distributed HTTPS reachability probes. These tests do not imply eight humans verified audiovisual sync.", + "resultKo": "실제 공개 도메인에서 무료 얼리 액세스를 사용할 수 있고, 새 사용자의 입장·영상 시작·피드백을 중심으로 개선을 이어가는 단계입니다.", + "resultEn": "Free early access is live on the public domain. The next product cycle focuses on real users' entry, first playback and feedback rather than treating synthetic QA as human adoption." + } + }, { "name": "Soursea", "slug": "soursea", diff --git a/public/images/projects/minglestage.webp b/public/images/projects/minglestage.webp new file mode 100644 index 0000000000000000000000000000000000000000..9afa274a16936ae7742d493a8f2cb4f7c063652d GIT binary patch literal 17168 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 Date: Sat, 17 Oct 2026 17:36:28 -0700 Subject: [PATCH 2/4] fix(portfolio): include MingleStage in featured home groups and QA --- src/lib/__tests__/projects.test.ts | 21 ++++++++++++++++----- src/lib/projects.ts | 3 ++- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/src/lib/__tests__/projects.test.ts b/src/lib/__tests__/projects.test.ts index 040aafc..9c3fac9 100644 --- a/src/lib/__tests__/projects.test.ts +++ b/src/lib/__tests__/projects.test.ts @@ -224,17 +224,17 @@ describe('portfolio selection and truthful stats', () => { expect(getPortfolioStats(sample)).toEqual({ builds: 4, public: 3, playStore: 2, featured: 2 }) }) - it('keeps selected work to five complementary projects in editorial order', () => { - expect(SELECTED_WORK).toEqual(['devdeck', 'studios', 'rentrights', 'citefirst', 'juicebar']) - expect(new Set(SELECTED_WORK).size).toBe(5) + it('keeps selected work to six complementary projects in editorial order', () => { + expect(SELECTED_WORK).toEqual(['minglestage', 'devdeck', 'studios', 'rentrights', 'citefirst', 'juicebar']) + expect(new Set(SELECTED_WORK).size).toBe(6) }) }) -describe('JuiceBar ledger refresh', () => { +describe('portfolio ledger and featured product integrity', () => { const ledger = projectsData.projects as Project[] it('keeps JuiceBar in the expanded portfolio ledger', () => { - expect(ledger).toHaveLength(43) + expect(ledger).toHaveLength(44) const juicebar = ledger.find((project) => project.slug === 'juicebar') expect(juicebar).toBeDefined() expect(juicebar?.github).toBe('https://github.com/writingdeveloper/JuiceBar') @@ -242,6 +242,17 @@ describe('JuiceBar ledger refresh', () => { expect(juicebar?.caseStudy?.evidenceEn).toBeTruthy() }) + it('shows the actually launched MingleStage product with a direct public destination', () => { + const minglestage = ledger.find((project) => project.slug === 'minglestage') + expect(minglestage?.name).toBe('MingleStage') + expect(minglestage?.status).toBe('launched') + expect(minglestage?.website).toBe('https://minglestage.app') + expect(minglestage?.private).toBe(true) + expect(minglestage?.featured).toBe(true) + expect(minglestage?.screenshot).toBe('/images/projects/minglestage.webp') + expect(minglestage?.caseStudy?.evidenceEn).toMatch(/synthetic/) + }) + it('uses the selected-work list as the only featured set', () => { expect(new Set(ledger.filter((project) => project.featured).map((project) => project.slug))).toEqual( new Set(SELECTED_WORK) diff --git a/src/lib/projects.ts b/src/lib/projects.ts index 4cb246a..cc358a9 100644 --- a/src/lib/projects.ts +++ b/src/lib/projects.ts @@ -1,6 +1,6 @@ import type { Project } from '@/types/content' -export const SELECTED_WORK = ['devdeck', 'studios', 'rentrights', 'citefirst', 'juicebar'] as const +export const SELECTED_WORK = ['minglestage', 'devdeck', 'studios', 'rentrights', 'citefirst', 'juicebar'] as const export type ProjectCaseStudyKey = 'problem' | 'decision' | 'evidence' | 'result' @@ -176,6 +176,7 @@ export const HIRE_CASE_STUDIES = ['soursea', 'creator-os', 'til-shorts', 'citefi */ export const HOME_GROUPS: Record<'products' | 'games' | 'tools', string[]> = { products: [ + 'minglestage', 'soursea', 'creator-os', 'healframe', From 698fceaf1d77ea9b941f048c6761a7bceacb812d Mon Sep 17 00:00:00 2001 From: Si Hyeong Lee Date: Sun, 18 Oct 2026 12:47:23 -0700 Subject: [PATCH 3/4] fix(security): eliminate critical portfolio advisories for MingleStage PR --- ...26-10-18-minglestage-portfolio-security.md | 24 + package-lock.json | 445 ++++++++---------- package.json | 16 +- 3 files changed, 237 insertions(+), 248 deletions(-) create mode 100644 docs/reviews/2026-10-18-minglestage-portfolio-security.md diff --git a/docs/reviews/2026-10-18-minglestage-portfolio-security.md b/docs/reviews/2026-10-18-minglestage-portfolio-security.md new file mode 100644 index 0000000..2a04339 --- /dev/null +++ b/docs/reviews/2026-10-18-minglestage-portfolio-security.md @@ -0,0 +1,24 @@ +# Portfolio MingleStage featured-card dependency security follow-up + +2026-10-18 PDT. Candidate: writingdeveloper/portfolio PR #38, branch codex/minglestage-portfolio-launch-20261017. + +## Why +MingleStage Early Access case study and genuine optimized 3D venue screenshot are implemented but not public on writingdeveloper.blog. The unrelated existing portfolio build ran every functional step successfully; its pre-existing high/critical npm audit alerts blocked PR #38. Do not represent this as a product runtime issue on minglestage.app. + +## Remediation implemented in this isolated PR worktree +- Upgrade Next.js and eslint-config-next to 16.4.2 (previous lock was 16.3.3, inside the critical advisory range). +- Upgrade sharp to 0.35.5 and source-map-js to >=1.2.2. +- Restrict transitive brace-expansion versions under minimatch 3, 9, and 10 to patched minimums without forcing incompatible major versions. +- Fresh npm install updated lockfile, with subsequent npm ci dry-run matching the lockfile. + +## Local independent checks on patched worktree +- npm run type-check PASS; npm run lint PASS; npm run format:check PASS; npm test 198/198 PASS. +- Next 16.4.2 production build PASS, all 138 static routes/paths generated. This validates app compilation, NOT exposure safety. +- npm audit --audit-level=high **STILL REPORTS 7 HIGH AND 0 CRITICAL** (previous lock: 10 high and 1 critical). The remaining high findings are @keystatic/next -> chokidar 3 -> braces 3.0.3 and eslint-config-next -> fast-glob -> micromatch -> braces 3.0.3. Installed upstream braces 3.0.3 remains flagged by npm audit, with no safe direct published patch available in the observed dependency range. +- This is a real improvement in a review candidate, NOT zero security findings and NOT a production deployment. + +## Follow-up decisions +1. Continue PR #38 security review with the existing Keystatic boundary/retention review on PR #33. A compatibility breaking @keystatic/next downgrade from npm audit fix --force is not acceptable without migration and production QA. +2. Never rewrite or disable the full npm audit gate to make CI pass. A deliberate, documented security-risk exception would be a separate owner decision; no exception is granted by this report. +3. Keep MingleStage marketing's already-published public GitHub profile link and MingleStage landing/guide live while the portfolio PR waits. +4. Do not close PRs #32, #33, #35, #39 or overwrite parallel session worktrees. New integration should reconcile those PRs only after vulnerability and build compatibility review. diff --git a/package-lock.json b/package-lock.json index 5aeb940..28f9d84 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,7 +18,7 @@ "fuse.js": "^7.1.0", "js-yaml": "^4.3.1", "lucide-react": "^0.562.0", - "next": "^16.2.6", + "next": "^16.4.2", "next-intl": "^4.9.2", "next-mdx-remote": "^6.0.0", "react": "19.2.8", @@ -35,10 +35,10 @@ "@types/react-dom": "^19", "@types/three": "^0.183.1", "eslint": "^9", - "eslint-config-next": "^16.2.6", + "eslint-config-next": "^16.4.2", "playwright": "^1.62.0", "prettier": "^3.8.1", - "sharp": "^0.35.3", + "sharp": "^0.35.5", "tailwindcss": "^4", "tsx": "^4.23.1", "typescript": "^5", @@ -422,7 +422,6 @@ "version": "1.11.3", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", - "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1040,9 +1039,9 @@ } }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -1114,9 +1113,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -1364,13 +1363,12 @@ } }, "node_modules/@img/sharp-darwin-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.4.tgz", - "integrity": "sha512-Uhfl4V4lhP2nbUVF9+hyH1+luj86f1gUFeo8ALYxFoULoU+G87D43BfeMP8XHsk9boxAnCY/bf2EHwhA7MuGsA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-arm64/-/sharp-darwin-arm64-0.35.5.tgz", + "integrity": "sha512-QRUlFQ0WxvdWyqqG/WtI3iupfD5rBzmCHXSdPsY91sAtVtTo7Q4cb6zOccZ3gqEqkr0f1As1ehLqmEpDsRf+lg==", "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1383,17 +1381,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-arm64": "1.3.3" + "@img/sharp-libvips-darwin-arm64": "1.3.4" } }, "node_modules/@img/sharp-darwin-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.4.tgz", - "integrity": "sha512-hWniXY3bG5qKpkKrAwPe4y+VTPmf086YQAnkxWh7uA1YrlRouWGa0M0Mxj3ZjnXFkv7/TD1bTy9lGUK26vRvWw==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-darwin-x64/-/sharp-darwin-x64-0.35.5.tgz", + "integrity": "sha512-+BR255RhDlpygUpOc/Jdt1nT6DQ3XG/ERo5wbcdOf5Q320dKtPCKPLR1LJs9VGXRaMa8l1uUa0tkCNOXiAxZUw==", "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1406,21 +1403,20 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-darwin-x64": "1.3.3" + "@img/sharp-libvips-darwin-x64": "1.3.4" } }, "node_modules/@img/sharp-freebsd-wasm32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.4.tgz", - "integrity": "sha512-lIsKw/BU+kjB4eZjxrYrZmwOJYi3Ajrv66iAlBmUPyKc3HpnloevB1g3wxGD9P/5BbQ1brBGl65VRRrCvQDEqA==", - "dev": true, + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", + "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", "license": "Apache-2.0", "optional": true, "os": [ "freebsd" ], "dependencies": { - "@img/sharp-wasm32": "0.35.4" + "@img/sharp-wasm32": "0.35.5" }, "engines": { "node": ">=20.9.0" @@ -1430,13 +1426,12 @@ } }, "node_modules/@img/sharp-libvips-darwin-arm64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.3.tgz", - "integrity": "sha512-suTBPTDGrI9WodccaDdwZItTSaBYASlBk1NSfElSHrUfzu3szG6lvIF58+WiFvnfzuK8ZBFS5zE00PxqxnRiPg==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-arm64/-/sharp-libvips-darwin-arm64-1.3.4.tgz", + "integrity": "sha512-5R89nBYiRdUlSWJxPhO+GVtaXzXSxKnRu/xqMn3KTA3L9EB9Oy/P+Nn2f2vlhPuUdy/Zusb2DarbyTpGCfEDuw==", "cpu": [ "arm64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1447,13 +1442,12 @@ } }, "node_modules/@img/sharp-libvips-darwin-x64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.3.tgz", - "integrity": "sha512-FVJZ5mITMobmXIz/hPDTw0EintTW5H3WfrxwLqEqjiIihlu+hVRyGrFQ60xl0Lxn7Bt3zdpevPaQi0HEzqz9fw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-darwin-x64/-/sharp-libvips-darwin-x64-1.3.4.tgz", + "integrity": "sha512-iR2OKH80yi0U+dUplyh3/xdpFvps6YkCwsXenIJxqxR1v9o+xtKTGbS9H7cps+2Vxjc8B1j96p75NmTGjIhtpQ==", "cpu": [ "x64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1464,13 +1458,12 @@ } }, "node_modules/@img/sharp-libvips-linux-arm": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.3.tgz", - "integrity": "sha512-3rbU4vqXXc3hY/OiXdl52xZvT0F1yEngWfvqudtPJg/KkyiaQw2DRsFrNzpmLvfavbwOq3qXn36GP8obHRULQA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm/-/sharp-libvips-linux-arm-1.3.4.tgz", + "integrity": "sha512-LmRtTsOHuvM2+wlO2Db37dx5MiZhB0FvSunciw48YjdOkZz9KAiRbm8ujeMOA1INqmei5NapFxYEK1D1ZSidmw==", "cpu": [ "arm" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1481,13 +1474,12 @@ } }, "node_modules/@img/sharp-libvips-linux-arm64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.3.tgz", - "integrity": "sha512-0DaL0A6Xu6sQSQFwe4iVCrKWU2cCTItnRsYsCdxAMm9NF6twAA9BKnoqy4hqz4+azQ0JHuA26qiUKsf1XJ/v5A==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-arm64/-/sharp-libvips-linux-arm64-1.3.4.tgz", + "integrity": "sha512-Y3dgX/6lE2QhQb+Gxy0WZxfg9MEm/JBjamZpS2IklP7xIQoKN4hzAm7KcMVGtaVDt3neE9OKBC7vAfonA/Lr1A==", "cpu": [ "arm64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1498,13 +1490,12 @@ } }, "node_modules/@img/sharp-libvips-linux-ppc64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.3.tgz", - "integrity": "sha512-cdn1OvUBwsXhbC0zSzJnNzf5MZ/mTrobawDvNXBTxe8VtqKAm0sRuEY2Evzovb/w9JMk4TvRxqt1mekSuJz64w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-ppc64/-/sharp-libvips-linux-ppc64-1.3.4.tgz", + "integrity": "sha512-Le6boB8Tai0Nis+gIxIpKx68UDVVIqdR8Tin5Yf1z2LJJQLDJvCDRqRu+jC2qCoD+eIomonmOwB4smBRxfVpYQ==", "cpu": [ "ppc64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1515,13 +1506,12 @@ } }, "node_modules/@img/sharp-libvips-linux-riscv64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.3.tgz", - "integrity": "sha512-HjPVx7yKz+0lqdhDlTw1tt90wamBoxhiXpvl1XZpJLiHH4RCJ5yDTqH+VlYPv2fwFs89JFw4c1IexYOcQUi4IQ==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-riscv64/-/sharp-libvips-linux-riscv64-1.3.4.tgz", + "integrity": "sha512-aHkkIEHPRdQEegJN20MLmGtxYD9R2wQr3Cwpddnu5+YKMt6Uzax7S9h5gpZTo8wyrGuZSlfQ63OevL5mTyOC7Q==", "cpu": [ "riscv64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1532,13 +1522,12 @@ } }, "node_modules/@img/sharp-libvips-linux-s390x": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.3.tgz", - "integrity": "sha512-neWLh+3yCNThxnfy3c4BbVBeGgt9aftno+XbT56iK28RgeDs3UOFWviLWlUu0bArYVYJaFDK+RRohbicUNCm8Q==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-s390x/-/sharp-libvips-linux-s390x-1.3.4.tgz", + "integrity": "sha512-ra/mB6MikESDUO7Yg+Mi95bFBb9GsObURuhnOv3OqknjGe9sZrG8tCe9q0xSIGrtLgvgw0gKnFWcK4blSgQOuQ==", "cpu": [ "s390x" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1549,13 +1538,12 @@ } }, "node_modules/@img/sharp-libvips-linux-x64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.3.tgz", - "integrity": "sha512-4vKmvAst9nrowcqquKFAyZJUDolUaIp8uRiN0mWFguJ1IplC9/pitXtlnnlU4aa/eJw3J7i67V+pwUL+wZGdsA==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linux-x64/-/sharp-libvips-linux-x64-1.3.4.tgz", + "integrity": "sha512-GJ//SSXbnwSDes02umB3nDJLFcQzw8a18V8fyhqr6tV515tOEMdImjjxj1AoafMRz56F3PHgftnj1QEKSU1zkw==", "cpu": [ "x64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1566,13 +1554,12 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-arm64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.3.tgz", - "integrity": "sha512-Y9kQaLMuNoB0bPYOOdcZMaseNrFpPodIWWMrx+CZyydf2xn68j9WYc6sWWRrDwNkzCQjKYfc68L7jKjGlHMibw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-arm64/-/sharp-libvips-linuxmusl-arm64-1.3.4.tgz", + "integrity": "sha512-hvulFwtjUcagsis6BBxHwGFwWoNZjgYmULGVrZcyfNbjA8hKILbRxGg15/7w5HDyXHXUos/j6baAWqnCyQ2DWA==", "cpu": [ "arm64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1583,13 +1570,12 @@ } }, "node_modules/@img/sharp-libvips-linuxmusl-x64": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.3.tgz", - "integrity": "sha512-fj8Mv0HHfD1Rr+4I68+3agJynxDWtBFgicTbSOb9Bke6pIwzGcJ+RX/yHjmiEGFMCavY/dxvem7MyNaJF+wDiw==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/@img/sharp-libvips-linuxmusl-x64/-/sharp-libvips-linuxmusl-x64-1.3.4.tgz", + "integrity": "sha512-6zXKeE/p39I1AmA3cJG35eyBGNqNddLnUXjhwBnsGjFPWqf5VKkDBEqaEkPDoTEtkxwi2vv8Tcr2mDyP4So7Fg==", "cpu": [ "x64" ], - "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1600,13 +1586,12 @@ } }, "node_modules/@img/sharp-linux-arm": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.4.tgz", - "integrity": "sha512-7OAS8gI0EReKGVN2HssHlM6umJgxF5VI3xN0p9FA91p/YO+ou5hiNghLdZ5BEHztwaaK5+bLKRf8x/o2L2nk9A==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm/-/sharp-linux-arm-0.35.5.tgz", + "integrity": "sha512-LEaXK2WdXVK5ykcw0buWyPMsmLLL2vpHLD6yrNSW+JGEL3BZPA4tpKN6iaMc4AxTTAoaX/sU1rOL51lcIz48ZQ==", "cpu": [ "arm" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1619,17 +1604,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm": "1.3.3" + "@img/sharp-libvips-linux-arm": "1.3.4" } }, "node_modules/@img/sharp-linux-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.4.tgz", - "integrity": "sha512-De4jpEnAU8Hd5oT0j1G3uL4ZvTuipVMn7YC6vPaJhy6/7EwEae0SVAoBrUMYQbkLGDm85taVWwuPc1a44LTzCQ==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-arm64/-/sharp-linux-arm64-0.35.5.tgz", + "integrity": "sha512-LYVx5JTsOM2CBzmxreh+nl64/3H6Xb09iSLknqH47z2T2DFFxDeFLP5y4dJwe6H7uGQlHPyEEtIqyo3DYsRwdQ==", "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1642,17 +1626,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-arm64": "1.3.3" + "@img/sharp-libvips-linux-arm64": "1.3.4" } }, "node_modules/@img/sharp-linux-ppc64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.4.tgz", - "integrity": "sha512-2oYZJeIl4kCcMGk4ouZVjnkCtFrpQFlNEtJ6GbxzhHQchwH0NH/qEb9ykmOl29dqwMq+JhFdZn+1ak2FKhI9fQ==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-ppc64/-/sharp-linux-ppc64-0.35.5.tgz", + "integrity": "sha512-QVxAAq8evVRI9ia2vqgwrmWucn5Dfv+JdWzj75pD8omHLPSP7f8p20O8jxzjCcuCEQEOtYOZUmX1hkiZ0kdevA==", "cpu": [ "ppc64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1665,17 +1648,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-ppc64": "1.3.3" + "@img/sharp-libvips-linux-ppc64": "1.3.4" } }, "node_modules/@img/sharp-linux-riscv64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.4.tgz", - "integrity": "sha512-cPbNChoRURAWdebDIHSenxRpgEdy7JkPydSnUxRm9VvKD7m0/xVaR/8Fzlu81pk5nHEvHH87UZUA7cTtwnbJSA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-riscv64/-/sharp-linux-riscv64-0.35.5.tgz", + "integrity": "sha512-LtdreXguaavKODPIfzJ4kffx7UNt1omwtK0rch4EBbbSTXPnxWmYSayXdLJw0fJzQ97kHt1gL/yh4tvU+nCyRQ==", "cpu": [ "riscv64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1688,17 +1670,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-riscv64": "1.3.3" + "@img/sharp-libvips-linux-riscv64": "1.3.4" } }, "node_modules/@img/sharp-linux-s390x": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.4.tgz", - "integrity": "sha512-RY0JFY8Fd6RonCBtHz+DvadaPkXDSI1AUn6yWL9TipqkZ1vY8w8evqdgyDFnkm4/K1ve1TvZiaePP5oSd4+WVQ==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-s390x/-/sharp-linux-s390x-0.35.5.tgz", + "integrity": "sha512-UZasTOFiYzotTsGOCu42BfUzP6Tu6Do/947iRm1RsLKvlllxwGcn4RN27LibGWceix4Y+Pmw3jsnTcCQIgWjqA==", "cpu": [ "s390x" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1711,17 +1692,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-s390x": "1.3.3" + "@img/sharp-libvips-linux-s390x": "1.3.4" } }, "node_modules/@img/sharp-linux-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.4.tgz", - "integrity": "sha512-9qvvEAuk8k89TfWUoX2htWjbAMX8p+NxCppjpcg5k6xMsjhBQPTsoIh36h9Qde4WRuGpJeYnOjdosDn/cnv+OA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linux-x64/-/sharp-linux-x64-0.35.5.tgz", + "integrity": "sha512-SxFtLTeJInhAA9Q836kux2vZNeOBQEx658qvbboZScr0wIARym3IcGmW7KpVD5sbVg0Ojy+udFQdayYIZyoNog==", "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1734,17 +1714,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linux-x64": "1.3.3" + "@img/sharp-libvips-linux-x64": "1.3.4" } }, "node_modules/@img/sharp-linuxmusl-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.4.tgz", - "integrity": "sha512-KB5jxpfWQTr0nc3xdHtWChdbifHrBGsd2SM62Eyxrl8afikm+f5qGBU75SJIZBT/S1MC8XyacdlXBMSWq6OURA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-arm64/-/sharp-linuxmusl-arm64-0.35.5.tgz", + "integrity": "sha512-9HbMclmI1zlNkFRs3z9/eBtDjfD0sGlrX1z6b1qwmiFY5ElDLh4BC0LPBdVp7z1DXFiKlIcznf+ZlsuZzLxQqg==", "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1757,17 +1736,16 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-arm64": "1.3.3" + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4" } }, "node_modules/@img/sharp-linuxmusl-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.4.tgz", - "integrity": "sha512-f+eZJZIQNEEd26RPSW+76chwOf1XtA2Y/O+5ocVyLliHkeih3e+jhLVBdNTd2rS3IbNXK8+ug93Vf5ZXtF5Lxg==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-linuxmusl-x64/-/sharp-linuxmusl-x64-0.35.5.tgz", + "integrity": "sha512-4KOphqB035HrVdqLZfCgMzzERrQkkzOwRhl4OAkRO1YCldbaFjySXMaK534Mo0V+LndnlJk+sbUyLeU0ULyD1A==", "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1780,14 +1758,13 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-libvips-linuxmusl-x64": "1.3.3" + "@img/sharp-libvips-linuxmusl-x64": "1.3.4" } }, "node_modules/@img/sharp-wasm32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.4.tgz", - "integrity": "sha512-zQnl4Kwp7Q6NHsENtU2T/00Zi+w3AQNwz3+UaTyVBy2FpXrzXzGjndpK61onhZjRtRpQXxCTeqw19bVyXOh7jA==", - "dev": true, + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", + "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { @@ -1801,17 +1778,16 @@ } }, "node_modules/@img/sharp-webcontainers-wasm32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.4.tgz", - "integrity": "sha512-ESfNkywmCfPNyaZjxooddJQiQ+l/nTpGEOGthxiLnIHXC/CmcBixnfwUleX9mCz9ovrUUvKMap/pm8RYbzfwaA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-webcontainers-wasm32/-/sharp-webcontainers-wasm32-0.35.5.tgz", + "integrity": "sha512-hfhF/FmoQyTUkA0bIKFOtw536BQSeBMe6BF6QyWlrPxT754+TFLaZ7sKKTfvvM0yJgKgaYTwnFCIZ/GuDw5SUA==", "cpu": [ "wasm32" ], - "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { - "@img/sharp-wasm32": "0.35.4" + "@img/sharp-wasm32": "0.35.5" }, "engines": { "node": ">=20.9.0" @@ -1821,13 +1797,12 @@ } }, "node_modules/@img/sharp-win32-arm64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.4.tgz", - "integrity": "sha512-iNdlBX9gLVvqe2I3uIJSIKTq6wckP/DYxZtcqxm09x5Gi24DnFBmPAWZmr60ZyYMG0xlzo6goG3670ar+RXvRw==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-arm64/-/sharp-win32-arm64-0.35.5.tgz", + "integrity": "sha512-X4t7g+7ZA5DKblCBEXGjUqqemj4vczING/5viFwAL8h4N3qYeyjwdCvRLHi4EdOUI+2Z7UFlp1VM+p/AuEtm6Q==", "cpu": [ "arm64" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -1841,13 +1816,12 @@ } }, "node_modules/@img/sharp-win32-ia32": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.4.tgz", - "integrity": "sha512-kqRsbaa5CS6KHlpxnN7WhE6vAAugXyZButpRdvDWetlv6Qv4N9WTcrWzF7tXfB9T7MsoadqdI8hmwLq6UlLvtw==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-ia32/-/sharp-win32-ia32-0.35.5.tgz", + "integrity": "sha512-5Zm82LoBc43nhwNybZlG7Y1KO//Zhsn306fQl29ZOuStHLGTo3BWL83q3cznX0poxSAMuYL1On/BHBxkBeKr6A==", "cpu": [ "ia32" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -1861,13 +1835,12 @@ } }, "node_modules/@img/sharp-win32-x64": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.4.tgz", - "integrity": "sha512-XtmnYhBcrORsJ4XJngyzr/EWP0hRZLAZRFaApdKuviyqF78+ylxh2y06ZmtULAMOnObJ3ucpN0AcwSWnMowTRg==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/@img/sharp-win32-x64/-/sharp-win32-x64-0.35.5.tgz", + "integrity": "sha512-x76eH0vEiHlcMQu8Y8IenntaACtddpT6W0wmXtWrnKcnKI7ME5DdgqhAD6SEWOEl1v2zDvkZDhFA9KnURwpfqg==", "cpu": [ "x64" ], - "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -2303,15 +2276,15 @@ } }, "node_modules/@next/env": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/env/-/env-16.3.3.tgz", - "integrity": "sha512-U2eYQRwXj+dsqxV79zFqExDdatnNY/ZWc2nsJU1p/OgT7fd3dXwlF6OjYaFQCfMoeTA19PWq+wVmYgimVA+V+g==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/env/-/env-16.4.2.tgz", + "integrity": "sha512-nTUTFH7G5/J/fmpkjVLegOkqyKOP0CEsJcMsyO4UCYeN1su+YMW/MfaSErnJskL7XM+UDK6aTvslxsRCyya/sA==", "license": "MIT" }, "node_modules/@next/eslint-plugin-next": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.3.3.tgz", - "integrity": "sha512-pbEh30vvjKpDoTAmo1v3q2uM4JUi8QaEBpbmjWvGfoec2jLghy/WNtvzAT0bk+Ik9oz6etjt4YjXEk4BQnicCw==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/eslint-plugin-next/-/eslint-plugin-next-16.4.2.tgz", + "integrity": "sha512-gCTWlw0e+Y6kajpFyKKgA195jUJCRhlzJE0lV7ufe8a+ghIsANWZ0/FiJwg6DuOG1+OvRbcZDcFBoRh3mNJx0g==", "dev": true, "license": "MIT", "dependencies": { @@ -2352,9 +2325,9 @@ } }, "node_modules/@next/swc-darwin-arm64": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.3.3.tgz", - "integrity": "sha512-8Hiv32QJPwdV6KYJ8meR9SBA061tQqnIKTJDocvOXlEQqib0xMFpzArosuffFUUc0sslbh7QQ8a3Yey1QV8EIw==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-arm64/-/swc-darwin-arm64-16.4.2.tgz", + "integrity": "sha512-ONkhFvZNFWlsEHOM/81AtxdyuJP2KRYKYR0JxPwvcu1AuPMMMgcL+wW2luldJvMtZwKtUxoSkCychW5wIeoYSw==", "cpu": [ "arm64" ], @@ -2368,9 +2341,9 @@ } }, "node_modules/@next/swc-darwin-x64": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.3.3.tgz", - "integrity": "sha512-A1lgKgwVchRYmSe467zdwhxT9040dd8lH+o65sL5Jet8fjB4kegw/rDyPIpYVRb6jAqwXFOJpjIXJLxQKLiE3A==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-darwin-x64/-/swc-darwin-x64-16.4.2.tgz", + "integrity": "sha512-luPCMbOsCoaF+kXJEUjmjmOZg1lC3BflhmUu+ZmW4tBu2vW/4AXak8JBFvePizGkxVmNiAw/r9ra+6UviCWtWQ==", "cpu": [ "x64" ], @@ -2384,9 +2357,9 @@ } }, "node_modules/@next/swc-linux-arm64-gnu": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.3.3.tgz", - "integrity": "sha512-bf0FIssMFueU2dm7vQEWWxk0c8UjKTdW0yzuh0sQsD8pf1+KCLDdaqhYZNMYGmXwEOiHAUzgBKudovIlcvvBjg==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-gnu/-/swc-linux-arm64-gnu-16.4.2.tgz", + "integrity": "sha512-xhwFTAncJyaCNy5KqKKuKaIIdCy1/1ZV1s5S1G0hhT7wGMkDTlfJ6aQbfRFnIG/s3/kDrxQ8aycVe+c5QnP8ow==", "cpu": [ "arm64" ], @@ -2400,9 +2373,9 @@ } }, "node_modules/@next/swc-linux-arm64-musl": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.3.3.tgz", - "integrity": "sha512-W7viwCk9JY/cAkdz/A273rd5bb3RgT/IHwR7Upv90tunjBWNtAAhGhoecHh+teRNRSinuAFmE+l7fwZ4YKkrXg==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-arm64-musl/-/swc-linux-arm64-musl-16.4.2.tgz", + "integrity": "sha512-T1PNmfbPcxr5ndtWUL/3wQtLXsz808lq6sc2GrNT5k2oquF7UyqZddHSuAewHVsWsGXe6nsl9HoN1YNriVjuSg==", "cpu": [ "arm64" ], @@ -2416,9 +2389,9 @@ } }, "node_modules/@next/swc-linux-x64-gnu": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.3.3.tgz", - "integrity": "sha512-0W46zw1N3ODpI6n0GeivHvvob1pooozgZVqy65k0mh4/7vr+FbY9+WpHzNVXjHipJf/A3FDheBG19H1s5A25rA==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-gnu/-/swc-linux-x64-gnu-16.4.2.tgz", + "integrity": "sha512-N9cDUOCGtkJG5PNKDFZUF3xXndrJJcpLp121uAGjIGvO/U2p9tfdNOM9htj7+5f72l0m8rMw/cvYacUJBQoudg==", "cpu": [ "x64" ], @@ -2432,9 +2405,9 @@ } }, "node_modules/@next/swc-linux-x64-musl": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.3.3.tgz", - "integrity": "sha512-H4mBso8ZTMBPtdT0PN0pBx2ayTvQuTuvS6qT13d77yVFJXAPCxkyIhLTmdMaGTJs0krQYI/qpzdHijCeihXhbg==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-linux-x64-musl/-/swc-linux-x64-musl-16.4.2.tgz", + "integrity": "sha512-yY2uh1YhX6ufuYy2FCbw1dqblbhI57GLYAJfCkqD9auTv6pLrH67Uccjc3QMKBeCYAG6lkgu08ExmX1bbjejjQ==", "cpu": [ "x64" ], @@ -2448,9 +2421,9 @@ } }, "node_modules/@next/swc-win32-arm64-msvc": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.3.3.tgz", - "integrity": "sha512-cTMUJpcEGmeywofCUfhR+rSsoE33+rVPnPEYNTNdLNlsOeEg/vktOsKUSTb28vUGqD2jkm4Zaskcwn7OCI6FQg==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-arm64-msvc/-/swc-win32-arm64-msvc-16.4.2.tgz", + "integrity": "sha512-j/ArWRIHpMMB6wYLMhr2puTguBt70lNU/Cmjl9p6dTDE8DGknYJMP9PdwPk2dqpCNL/KIX9yfngDvIesxJPmsg==", "cpu": [ "arm64" ], @@ -2464,9 +2437,9 @@ } }, "node_modules/@next/swc-win32-x64-msvc": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.3.3.tgz", - "integrity": "sha512-2VR4cTBzHXaBjnGsuH6GyJjENzQOmHeAh11uY1iUhjm3j5dEUrVJuUj+VL78jaGi/Dik8xS76zEj18BsFhlVZQ==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/@next/swc-win32-x64-msvc/-/swc-win32-x64-msvc-16.4.2.tgz", + "integrity": "sha512-AA4edyWHDko3NCSo0x6GomsdgFb0oR1J3MXU1b5xt6FRFg4AucrMPW3S0hCe/9onU0O1BbpGQBsqo1r0Gneu1g==", "cpu": [ "x64" ], @@ -5823,9 +5796,9 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { - "version": "5.0.9", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.9.tgz", - "integrity": "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg==", + "version": "5.0.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.12.tgz", + "integrity": "sha512-YovQ3rzhaLMIrDjNDMkNS01tea93qhEhG5xy8f6+R0l+dw3Ki+5sCoIoI942iuLZTHWogWktgwVDhU09iNEimQ==", "dev": true, "license": "MIT", "dependencies": { @@ -6900,9 +6873,9 @@ } }, "node_modules/brace-expansion": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.4.tgz", - "integrity": "sha512-hGfVzPxthbf3+2yjg/RBs60cB0FhqBS/zvdV/4wn4/BmN0bNMMHPc4V/BbFieqf1TKAGGAHnY4eSjajCl0f2Xg==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" @@ -7968,21 +7941,21 @@ } }, "node_modules/eslint-config-next": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.3.3.tgz", - "integrity": "sha512-teqtsR26tnlfXFHfVLTM/4tzEzU8DMu6GS1sddZzhfGzgd2f2ofbgDUcsk6cssSCzX6Tk6fmWifJcdANSdPJrw==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/eslint-config-next/-/eslint-config-next-16.4.2.tgz", + "integrity": "sha512-P33vjcETMXc+qBjpF77TeJHZLzk6cPcTy8KjpxLucYB3mCIFIORMcZ+cBXcAiIYjE5RM7jyknEEOwMNdnx/ADQ==", "dev": true, "license": "MIT", "dependencies": { - "@next/eslint-plugin-next": "16.3.3", + "@next/eslint-plugin-next": "16.4.2", "eslint-import-resolver-node": "^0.3.6", "eslint-import-resolver-typescript": "^3.5.2", "eslint-plugin-import": "^2.32.0", "eslint-plugin-jsx-a11y": "^6.10.0", "eslint-plugin-react": "^7.37.0", - "eslint-plugin-react-hooks": "^7.0.0", + "eslint-plugin-react-hooks": "^7.1.0", "globals": "16.4.0", - "typescript-eslint": "^8.46.0" + "typescript-eslint": "^8.56.0" }, "peerDependencies": { "eslint": ">=9.0.0", @@ -8151,9 +8124,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -8215,9 +8188,9 @@ } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -8292,9 +8265,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -8370,9 +8343,9 @@ } }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.18", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.18.tgz", - "integrity": "sha512-Edep/X9fGqVNmzKBVsDYIOtD+z1tuezV70LBjdCst9Tqu76lsnvRiZ6oTic1n+/BIwX6QDGAO94PN4N2SADvtw==", + "version": "1.1.21", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.21.tgz", + "integrity": "sha512-9zeA+KLZNNzglF2TPKRQEDyx6Yby7daAkuy8MiPzpXPsYDWi/DRM8jmwUDxokQjYqBpv5DgPiwD4h4ZZSy1Ujw==", "dev": true, "license": "MIT", "dependencies": { @@ -8642,9 +8615,9 @@ "license": "MIT" }, "node_modules/fastq": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", - "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.3.tgz", + "integrity": "sha512-XKv5nnLs6nLF71NgiKJLIZFLkPyIEuOselLG7ujZnGrRfQK8HpvY+WqKhAJUAdLomwVHErVS4LfxFlPq0/FTAw==", "dev": true, "license": "ISC", "dependencies": { @@ -11545,12 +11518,12 @@ } }, "node_modules/next": { - "version": "16.3.3", - "resolved": "https://registry.npmjs.org/next/-/next-16.3.3.tgz", - "integrity": "sha512-tuRTx1nQ/yVw83cwJBo9F+njGUgMn3UHQycreWHB8XsStvvAh1AthbI8/4IpKnFaF58F+iSiHejYOlMQ/eq83g==", + "version": "16.4.2", + "resolved": "https://registry.npmjs.org/next/-/next-16.4.2.tgz", + "integrity": "sha512-r+oBJojfefUjOiWkBhXgLS+igxX/7BWyK59uHnyOyplMSLtBZ+QLP3okrdYTbrfrbrmNTVWLBPaHDX9KRaIt3w==", "license": "MIT", "dependencies": { - "@next/env": "16.3.3", + "@next/env": "16.4.2", "@swc/helpers": "0.5.23", "baseline-browser-mapping": "^2.9.19", "caniuse-lite": "^1.0.30001579", @@ -11564,15 +11537,15 @@ "node": ">=20.9.0" }, "optionalDependencies": { - "@next/swc-darwin-arm64": "16.3.3", - "@next/swc-darwin-x64": "16.3.3", - "@next/swc-linux-arm64-gnu": "16.3.3", - "@next/swc-linux-arm64-musl": "16.3.3", - "@next/swc-linux-x64-gnu": "16.3.3", - "@next/swc-linux-x64-musl": "16.3.3", - "@next/swc-win32-arm64-msvc": "16.3.3", - "@next/swc-win32-x64-msvc": "16.3.3", - "sharp": "^0.35.3" + "@next/swc-darwin-arm64": "16.4.2", + "@next/swc-darwin-x64": "16.4.2", + "@next/swc-linux-arm64-gnu": "16.4.2", + "@next/swc-linux-arm64-musl": "16.4.2", + "@next/swc-linux-x64-gnu": "16.4.2", + "@next/swc-linux-x64-musl": "16.4.2", + "@next/swc-win32-arm64-msvc": "16.4.2", + "@next/swc-win32-x64-msvc": "16.4.2", + "sharp": "^0.35.5" }, "peerDependencies": { "@opentelemetry/api": "^1.1.0", @@ -12958,9 +12931,9 @@ } }, "node_modules/sharp": { - "version": "0.35.4", - "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.4.tgz", - "integrity": "sha512-n++8XWcj+jCOr2IOl7h8LbKnGBDY4aPbmprMONBNFdn0ImXqpGVv5zliDs0V9HbmbCQLpbuo2ej9rAoOQTvMDA==", + "version": "0.35.5", + "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.35.5.tgz", + "integrity": "sha512-Ywn4OnzGukp7CDMrp08RQ50YKmuwG47brZgIVPTvBaaAfQlRlygrRqSrxdCiL9M+LlzLBiJ68IR1QqvzHyjC7g==", "devOptional": true, "license": "Apache-2.0", "dependencies": { @@ -12975,31 +12948,31 @@ "url": "https://opencollective.com/libvips" }, "optionalDependencies": { - "@img/sharp-darwin-arm64": "0.35.4", - "@img/sharp-darwin-x64": "0.35.4", - "@img/sharp-freebsd-wasm32": "0.35.4", - "@img/sharp-libvips-darwin-arm64": "1.3.3", - "@img/sharp-libvips-darwin-x64": "1.3.3", - "@img/sharp-libvips-linux-arm": "1.3.3", - "@img/sharp-libvips-linux-arm64": "1.3.3", - "@img/sharp-libvips-linux-ppc64": "1.3.3", - "@img/sharp-libvips-linux-riscv64": "1.3.3", - "@img/sharp-libvips-linux-s390x": "1.3.3", - "@img/sharp-libvips-linux-x64": "1.3.3", - "@img/sharp-libvips-linuxmusl-arm64": "1.3.3", - "@img/sharp-libvips-linuxmusl-x64": "1.3.3", - "@img/sharp-linux-arm": "0.35.4", - "@img/sharp-linux-arm64": "0.35.4", - "@img/sharp-linux-ppc64": "0.35.4", - "@img/sharp-linux-riscv64": "0.35.4", - "@img/sharp-linux-s390x": "0.35.4", - "@img/sharp-linux-x64": "0.35.4", - "@img/sharp-linuxmusl-arm64": "0.35.4", - "@img/sharp-linuxmusl-x64": "0.35.4", - "@img/sharp-webcontainers-wasm32": "0.35.4", - "@img/sharp-win32-arm64": "0.35.4", - "@img/sharp-win32-ia32": "0.35.4", - "@img/sharp-win32-x64": "0.35.4" + "@img/sharp-darwin-arm64": "0.35.5", + "@img/sharp-darwin-x64": "0.35.5", + "@img/sharp-freebsd-wasm32": "0.35.5", + "@img/sharp-libvips-darwin-arm64": "1.3.4", + "@img/sharp-libvips-darwin-x64": "1.3.4", + "@img/sharp-libvips-linux-arm": "1.3.4", + "@img/sharp-libvips-linux-arm64": "1.3.4", + "@img/sharp-libvips-linux-ppc64": "1.3.4", + "@img/sharp-libvips-linux-riscv64": "1.3.4", + "@img/sharp-libvips-linux-s390x": "1.3.4", + "@img/sharp-libvips-linux-x64": "1.3.4", + "@img/sharp-libvips-linuxmusl-arm64": "1.3.4", + "@img/sharp-libvips-linuxmusl-x64": "1.3.4", + "@img/sharp-linux-arm": "0.35.5", + "@img/sharp-linux-arm64": "0.35.5", + "@img/sharp-linux-ppc64": "0.35.5", + "@img/sharp-linux-riscv64": "0.35.5", + "@img/sharp-linux-s390x": "0.35.5", + "@img/sharp-linux-x64": "0.35.5", + "@img/sharp-linuxmusl-arm64": "0.35.5", + "@img/sharp-linuxmusl-x64": "0.35.5", + "@img/sharp-webcontainers-wasm32": "0.35.5", + "@img/sharp-win32-arm64": "0.35.5", + "@img/sharp-win32-ia32": "0.35.5", + "@img/sharp-win32-x64": "0.35.5" }, "peerDependenciesMeta": { "@types/node": { @@ -13216,9 +13189,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz", + "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==", "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" @@ -14810,24 +14783,6 @@ } } }, - "node_modules/vitest/node_modules/yaml": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.0.tgz", - "integrity": "sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true, - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14.6" - }, - "funding": { - "url": "https://github.com/sponsors/eemeli" - } - }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", diff --git a/package.json b/package.json index a1730dc..48b9eb7 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "fuse.js": "^7.1.0", "js-yaml": "^4.3.1", "lucide-react": "^0.562.0", - "next": "^16.2.6", + "next": "^16.4.2", "next-intl": "^4.9.2", "next-mdx-remote": "^6.0.0", "react": "19.2.8", @@ -44,6 +44,16 @@ "js-yaml": "^4.3.1", "@toeverything/y-indexeddb": { "nanoid": "^5.1.16" + }, + "source-map-js": "^1.2.2", + "minimatch@3": { + "brace-expansion": "^1.1.21" + }, + "minimatch@9": { + "brace-expansion": "^2.1.7" + }, + "minimatch@10": { + "brace-expansion": "^5.0.12" } }, "devDependencies": { @@ -54,10 +64,10 @@ "@types/react-dom": "^19", "@types/three": "^0.183.1", "eslint": "^9", - "eslint-config-next": "^16.2.6", + "eslint-config-next": "^16.4.2", "playwright": "^1.62.0", "prettier": "^3.8.1", - "sharp": "^0.35.3", + "sharp": "^0.35.5", "tailwindcss": "^4", "tsx": "^4.23.1", "typescript": "^5", From d2714dd4eff6fbc6d28474fe01e2584d0972e71d Mon Sep 17 00:00:00 2001 From: Si Hyeong Lee Date: Sun, 18 Oct 2026 12:51:24 -0700 Subject: [PATCH 4/4] fix(ci): repair Linux npm lockfile for yaml 2.9.1 --- package-lock.json | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/package-lock.json b/package-lock.json index 28f9d84..2ae29c6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -422,6 +422,7 @@ "version": "1.11.3", "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.11.3.tgz", "integrity": "sha512-Xz4Tpyki7XyrpbUK1jR1AhdAdaXyhhY4lZ3neLodmhpuWfy2PAQN5B46sAiU4liOXGLkHypn/qU+jvfWSCYYLA==", + "dev": true, "license": "MIT", "optional": true, "dependencies": { @@ -1369,6 +1370,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1391,6 +1393,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1410,6 +1413,7 @@ "version": "0.35.5", "resolved": "https://registry.npmjs.org/@img/sharp-freebsd-wasm32/-/sharp-freebsd-wasm32-0.35.5.tgz", "integrity": "sha512-Y/z91nEZ4uIBX5X3nfTovjU9lHNKFYbL2lpHCLVNmXQK03VIZvXBBt0KxbPGp2SdGSF+2mQU4e+hQaWOt86iAw==", + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1432,6 +1436,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1448,6 +1453,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1464,6 +1470,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1480,6 +1487,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1496,6 +1504,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1512,6 +1521,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1528,6 +1538,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1544,6 +1555,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1560,6 +1572,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1576,6 +1589,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "LGPL-3.0-or-later", "optional": true, "os": [ @@ -1592,6 +1606,7 @@ "cpu": [ "arm" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1614,6 +1629,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1636,6 +1652,7 @@ "cpu": [ "ppc64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1658,6 +1675,7 @@ "cpu": [ "riscv64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1680,6 +1698,7 @@ "cpu": [ "s390x" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1702,6 +1721,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1724,6 +1744,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1746,6 +1767,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0", "optional": true, "os": [ @@ -1765,6 +1787,7 @@ "version": "0.35.5", "resolved": "https://registry.npmjs.org/@img/sharp-wasm32/-/sharp-wasm32-0.35.5.tgz", "integrity": "sha512-Ptsga1su4tQx+LLF1ECS9U6nz5kmrXKo6XVbtR48Ke3ZRxxgaWBu7IDtEe1quo8hiupwm6WFqxVlXaSf7IINGQ==", + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later AND MIT", "optional": true, "dependencies": { @@ -1784,6 +1807,7 @@ "cpu": [ "wasm32" ], + "dev": true, "license": "Apache-2.0", "optional": true, "dependencies": { @@ -1803,6 +1827,7 @@ "cpu": [ "arm64" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -1822,6 +1847,7 @@ "cpu": [ "ia32" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -1841,6 +1867,7 @@ "cpu": [ "x64" ], + "dev": true, "license": "Apache-2.0 AND LGPL-3.0-or-later", "optional": true, "os": [ @@ -14783,6 +14810,24 @@ } } }, + "node_modules/vitest/node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "dev": true, + "license": "ISC", + "optional": true, + "peer": true, + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } + }, "node_modules/w3c-keyname": { "version": "2.2.8", "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz",