From 468a4377ee30d78a3476723eae4636d9fe175b38 Mon Sep 17 00:00:00 2001 From: ttipo Date: Tue, 27 Oct 2026 01:31:59 +0900 Subject: [PATCH] =?UTF-8?q?feat(frontend):=20=EC=A0=84=EC=97=AD=20?= =?UTF-8?q?=EC=85=B8=C2=B7=EB=A1=9C=EA=B7=B8=EC=9D=B8=C2=B7=EC=84=B8?= =?UTF-8?q?=EC=85=98=20=EC=B2=98=EB=A6=AC=EC=99=80=20=EC=9B=B9=EB=A9=94?= =?UTF-8?q?=EC=9D=BC=20=ED=99=94=EB=A9=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 확정된 디자인(docs/design/webmail)을 기준으로 만든 웹메일 화면이다. - 앞으로 붙일 사내 모듈(캘린더·파일·ERP 등)을 위한 전역 앱 레일과 셸, Pretendard 자체 호스팅, 바다 청록 브랜드 토큰과 콘텐츠 열 토큰 - 로그인과 세션 처리: 401 이면 한 번 갱신한 뒤 다시 보내고, 실패하면 세션 만료 대화상자를 띄운다. 로그아웃은 다른 탭에도 알리고, 로그아웃 뒤에 늦게 온 갱신 결과는 버린다 - 메일함(분할·목록 보기), 읽기(외부 HTML 은 sandbox iframe 으로만 그린다), 쓰기(발송 키 규칙, 첨부 형식·크기·합계·개수 사전 검사, 답장·전달 초안 길이 맞춤) - 오류는 코드로만 분기하고, 문구는 생성된 에러 사전에서 가져온다 Co-Authored-By: Claude Opus 5.5 --- frontend/index.html | 4 +- frontend/package-lock.json | 1244 ++++++++--------- frontend/package.json | 8 +- frontend/src/App.vue | 14 +- frontend/src/assets/brand/logo-ara-white.png | Bin 0 -> 12602 bytes .../src/assets/brand/logo-arasystem-white.png | Bin 0 -> 63405 bytes frontend/src/components/AppIcon.vue | 60 + frontend/src/components/BaseButton.vue | 22 +- .../feedback/SessionExpiredDialog.spec.ts | 41 + .../feedback/SessionExpiredDialog.vue | 136 ++ .../src/components/feedback/StateMessage.vue | 105 ++ .../src/components/feedback/ToastHost.vue | 186 +++ .../components/mail/ComposeAttachmentList.vue | 190 +++ .../src/components/mail/ListReadNav.spec.ts | 137 ++ frontend/src/components/mail/ListReadNav.vue | 148 ++ .../src/components/mail/MailBodyFrame.spec.ts | 55 + .../src/components/mail/MailBodyFrame.vue | 124 ++ .../src/components/mail/MailListHeader.vue | 110 ++ .../src/components/mail/MailLoadError.vue | 71 + .../components/mail/MailQuotaMeter.spec.ts | 37 + .../src/components/mail/MailQuotaMeter.vue | 117 ++ .../src/components/mail/MailToolButton.vue | 121 ++ .../components/mail/MailToolbarDivider.vue | 19 + frontend/src/components/mail/MailboxPanel.vue | 258 ++++ .../mail/MessageAttachments.spec.ts | 169 +++ .../components/mail/MessageAttachments.vue | 163 +++ frontend/src/components/mail/MessageList.vue | 148 ++ .../src/components/mail/MessageListItem.vue | 199 +++ .../components/mail/MessageListSkeleton.vue | 77 + .../src/components/mail/MessageReader.spec.ts | 163 +++ .../src/components/mail/MessageReader.vue | 440 ++++++ .../src/components/mail/MessageTable.spec.ts | 176 +++ frontend/src/components/mail/MessageTable.vue | 486 +++++++ .../components/mail/RecipientField.spec.ts | 112 ++ .../src/components/mail/RecipientField.vue | 243 ++++ .../src/components/mail/ViewModeSwitch.vue | 75 + frontend/src/components/shell/AppRail.spec.ts | 41 + frontend/src/components/shell/AppRail.vue | 106 ++ frontend/src/components/shell/AppRailItem.vue | 86 ++ frontend/src/components/shell/AppShell.vue | 73 + frontend/src/components/shell/AppTopBar.vue | 183 +++ frontend/src/composables/useApi.spec.ts | 469 ++++++- frontend/src/composables/useApi.ts | 269 +++- .../composables/useAttachmentUploads.spec.ts | 399 ++++++ .../src/composables/useAttachmentUploads.ts | 232 +++ frontend/src/composables/useAuth.spec.ts | 325 +++++ frontend/src/composables/useAuth.ts | 80 +- .../composables/useLogoutBroadcast.spec.ts | 236 ++++ .../src/composables/useLogoutBroadcast.ts | 86 ++ frontend/src/composables/useMail.ts | 164 +++ frontend/src/composables/useMailNavigation.ts | 43 + frontend/src/composables/useToast.ts | 15 + frontend/src/main.ts | 7 + frontend/src/pages/HomePage.vue | 27 - frontend/src/pages/LoginPage.spec.ts | 125 ++ frontend/src/pages/LoginPage.vue | 324 +++++ frontend/src/pages/mail/ComposePage.spec.ts | 555 ++++++++ frontend/src/pages/mail/ComposePage.vue | 715 ++++++++++ frontend/src/pages/mail/MailLayout.vue | 21 + frontend/src/pages/mail/MailboxPage.spec.ts | 204 +++ frontend/src/pages/mail/MailboxPage.vue | 163 +++ frontend/src/router/index.ts | 65 +- frontend/src/shared/constants/app-modules.ts | 39 + frontend/src/shared/constants/brand.ts | 9 + frontend/src/shared/constants/icons.ts | 136 ++ frontend/src/shared/constants/mail.ts | 135 ++ frontend/src/shared/types/auth.ts | 14 + frontend/src/shared/types/mail.ts | 113 ++ frontend/src/shared/utils/api-url.spec.ts | 23 + frontend/src/shared/utils/api-url.ts | 17 + frontend/src/shared/utils/format.spec.ts | 147 ++ frontend/src/shared/utils/format.ts | 199 +++ .../src/shared/utils/idempotency-key.spec.ts | 74 + frontend/src/shared/utils/idempotency-key.ts | 52 + frontend/src/shared/utils/korean.spec.ts | 15 + frontend/src/shared/utils/korean.ts | 19 + .../src/shared/utils/mail-address.spec.ts | 135 ++ frontend/src/shared/utils/mail-address.ts | 148 ++ .../src/shared/utils/mail-attachment.spec.ts | 94 ++ frontend/src/shared/utils/mail-attachment.ts | 67 + frontend/src/shared/utils/mail-draft.spec.ts | 69 + frontend/src/shared/utils/mail-draft.ts | 38 + .../src/shared/utils/mail-forward.spec.ts | 108 ++ frontend/src/shared/utils/mail-forward.ts | 66 + frontend/src/shared/utils/mail-html.spec.ts | 145 ++ frontend/src/shared/utils/mail-html.ts | 221 +++ frontend/src/shared/utils/mail-reply.spec.ts | 138 ++ frontend/src/shared/utils/mail-reply.ts | 103 ++ frontend/src/shared/utils/mailbox.spec.ts | 90 ++ frontend/src/shared/utils/mailbox.ts | 93 ++ frontend/src/shared/utils/redirect.spec.ts | 25 + frontend/src/shared/utils/redirect.ts | 18 + frontend/src/stores/auth.store.spec.ts | 113 ++ frontend/src/stores/auth.store.ts | 113 +- frontend/src/stores/mail-view.store.spec.ts | 91 ++ frontend/src/stores/mail-view.store.ts | 105 ++ frontend/src/stores/mail.store.spec.ts | 327 +++++ frontend/src/stores/mail.store.ts | 417 ++++++ frontend/src/stores/toast.store.ts | 87 ++ frontend/src/styles/base.css | 72 + frontend/src/styles/tokens.css | 163 +++ frontend/src/test-utils/broadcast.ts | 37 + frontend/src/test-utils/mock-api.ts | 113 ++ frontend/src/test-utils/router.ts | 24 + 104 files changed, 14136 insertions(+), 747 deletions(-) create mode 100644 frontend/src/assets/brand/logo-ara-white.png create mode 100644 frontend/src/assets/brand/logo-arasystem-white.png create mode 100644 frontend/src/components/AppIcon.vue create mode 100644 frontend/src/components/feedback/SessionExpiredDialog.spec.ts create mode 100644 frontend/src/components/feedback/SessionExpiredDialog.vue create mode 100644 frontend/src/components/feedback/StateMessage.vue create mode 100644 frontend/src/components/feedback/ToastHost.vue create mode 100644 frontend/src/components/mail/ComposeAttachmentList.vue create mode 100644 frontend/src/components/mail/ListReadNav.spec.ts create mode 100644 frontend/src/components/mail/ListReadNav.vue create mode 100644 frontend/src/components/mail/MailBodyFrame.spec.ts create mode 100644 frontend/src/components/mail/MailBodyFrame.vue create mode 100644 frontend/src/components/mail/MailListHeader.vue create mode 100644 frontend/src/components/mail/MailLoadError.vue create mode 100644 frontend/src/components/mail/MailQuotaMeter.spec.ts create mode 100644 frontend/src/components/mail/MailQuotaMeter.vue create mode 100644 frontend/src/components/mail/MailToolButton.vue create mode 100644 frontend/src/components/mail/MailToolbarDivider.vue create mode 100644 frontend/src/components/mail/MailboxPanel.vue create mode 100644 frontend/src/components/mail/MessageAttachments.spec.ts create mode 100644 frontend/src/components/mail/MessageAttachments.vue create mode 100644 frontend/src/components/mail/MessageList.vue create mode 100644 frontend/src/components/mail/MessageListItem.vue create mode 100644 frontend/src/components/mail/MessageListSkeleton.vue create mode 100644 frontend/src/components/mail/MessageReader.spec.ts create mode 100644 frontend/src/components/mail/MessageReader.vue create mode 100644 frontend/src/components/mail/MessageTable.spec.ts create mode 100644 frontend/src/components/mail/MessageTable.vue create mode 100644 frontend/src/components/mail/RecipientField.spec.ts create mode 100644 frontend/src/components/mail/RecipientField.vue create mode 100644 frontend/src/components/mail/ViewModeSwitch.vue create mode 100644 frontend/src/components/shell/AppRail.spec.ts create mode 100644 frontend/src/components/shell/AppRail.vue create mode 100644 frontend/src/components/shell/AppRailItem.vue create mode 100644 frontend/src/components/shell/AppShell.vue create mode 100644 frontend/src/components/shell/AppTopBar.vue create mode 100644 frontend/src/composables/useAttachmentUploads.spec.ts create mode 100644 frontend/src/composables/useAttachmentUploads.ts create mode 100644 frontend/src/composables/useAuth.spec.ts create mode 100644 frontend/src/composables/useLogoutBroadcast.spec.ts create mode 100644 frontend/src/composables/useLogoutBroadcast.ts create mode 100644 frontend/src/composables/useMail.ts create mode 100644 frontend/src/composables/useMailNavigation.ts create mode 100644 frontend/src/composables/useToast.ts delete mode 100644 frontend/src/pages/HomePage.vue create mode 100644 frontend/src/pages/LoginPage.spec.ts create mode 100644 frontend/src/pages/LoginPage.vue create mode 100644 frontend/src/pages/mail/ComposePage.spec.ts create mode 100644 frontend/src/pages/mail/ComposePage.vue create mode 100644 frontend/src/pages/mail/MailLayout.vue create mode 100644 frontend/src/pages/mail/MailboxPage.spec.ts create mode 100644 frontend/src/pages/mail/MailboxPage.vue create mode 100644 frontend/src/shared/constants/app-modules.ts create mode 100644 frontend/src/shared/constants/brand.ts create mode 100644 frontend/src/shared/constants/icons.ts create mode 100644 frontend/src/shared/constants/mail.ts create mode 100644 frontend/src/shared/types/auth.ts create mode 100644 frontend/src/shared/types/mail.ts create mode 100644 frontend/src/shared/utils/api-url.spec.ts create mode 100644 frontend/src/shared/utils/api-url.ts create mode 100644 frontend/src/shared/utils/format.spec.ts create mode 100644 frontend/src/shared/utils/idempotency-key.spec.ts create mode 100644 frontend/src/shared/utils/idempotency-key.ts create mode 100644 frontend/src/shared/utils/korean.spec.ts create mode 100644 frontend/src/shared/utils/korean.ts create mode 100644 frontend/src/shared/utils/mail-address.spec.ts create mode 100644 frontend/src/shared/utils/mail-address.ts create mode 100644 frontend/src/shared/utils/mail-attachment.spec.ts create mode 100644 frontend/src/shared/utils/mail-attachment.ts create mode 100644 frontend/src/shared/utils/mail-draft.spec.ts create mode 100644 frontend/src/shared/utils/mail-draft.ts create mode 100644 frontend/src/shared/utils/mail-forward.spec.ts create mode 100644 frontend/src/shared/utils/mail-forward.ts create mode 100644 frontend/src/shared/utils/mail-html.spec.ts create mode 100644 frontend/src/shared/utils/mail-html.ts create mode 100644 frontend/src/shared/utils/mail-reply.spec.ts create mode 100644 frontend/src/shared/utils/mail-reply.ts create mode 100644 frontend/src/shared/utils/mailbox.spec.ts create mode 100644 frontend/src/shared/utils/mailbox.ts create mode 100644 frontend/src/shared/utils/redirect.spec.ts create mode 100644 frontend/src/shared/utils/redirect.ts create mode 100644 frontend/src/stores/auth.store.spec.ts create mode 100644 frontend/src/stores/mail-view.store.spec.ts create mode 100644 frontend/src/stores/mail-view.store.ts create mode 100644 frontend/src/stores/mail.store.spec.ts create mode 100644 frontend/src/stores/mail.store.ts create mode 100644 frontend/src/stores/toast.store.ts create mode 100644 frontend/src/styles/base.css create mode 100644 frontend/src/styles/tokens.css create mode 100644 frontend/src/test-utils/broadcast.ts create mode 100644 frontend/src/test-utils/mock-api.ts create mode 100644 frontend/src/test-utils/router.ts diff --git a/frontend/index.html b/frontend/index.html index 3f0455e..ad388cb 100644 --- a/frontend/index.html +++ b/frontend/index.html @@ -4,8 +4,8 @@ - - Project Base + + ARA SYSTEM
diff --git a/frontend/package-lock.json b/frontend/package-lock.json index ddad179..dc7b623 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -9,8 +9,10 @@ "version": "0.0.0", "dependencies": { "axios": "^1.14.0", + "dompurify": "^3.4.17", "pinia": "^3.0.4", - "vue": "^3.5.31", + "pretendard": "^1.3.9", + "vue": "^3.5.43", "vue-router": "^4.4.5" }, "devDependencies": { @@ -26,9 +28,9 @@ "eslint-plugin-vue": "^9.32.0", "jsdom": "^29.0.1", "npm-run-all2": "^8.0.4", - "oxfmt": "^0.42.0", + "oxfmt": "^0.72.0", "typescript": "~6.0.0", - "vite": "^8.0.3", + "vite": "^8.3.4", "vite-plugin-vue-devtools": "^8.1.1", "vitest": "^4.1.2", "vue-tsc": "^3.2.6" @@ -89,13 +91,13 @@ "license": "MIT" }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -104,9 +106,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", - "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "dev": true, "license": "MIT", "engines": { @@ -114,21 +116,22 @@ } }, "node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -145,14 +148,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.8.tgz", + "integrity": "sha512-gZbepsdh3WDtgZKWL+vTPh71LSBrm/Y4/QDZBVCcYfmeTEEuoOYwlSy+G1StfJg+/Zy550u/3TATbm7qDbbMtg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.8", + "@babel/types": "^7.29.8", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -175,14 +178,14 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -214,9 +217,9 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "dev": true, "license": "MIT", "engines": { @@ -238,29 +241,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -325,27 +328,27 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.11.tgz", + "integrity": "sha512-snZbO7MEDOof+hvNa97EjEY7qD7h2kwvQr5AJC3ZhQudKW5dnej6k3kP9NQV88hJwaS8vDqRLFo9rivLEhle2g==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", - "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "dev": true, "license": "MIT", "engines": { @@ -353,26 +356,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.10.tgz", + "integrity": "sha512-EMCx3AGZ3WfAl6ht7AyQoPm2Lh+BGYEMdc4Q6Hf7uSCDOZFuLq44qNwL+iaim8VlyYhRAo4X43+weadK8ZB4Yg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.3.tgz", - "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.11.tgz", + "integrity": "sha512-OZ6+oaK7GMyg3IfCpj8JOmn8n+w2rJbDT0LLfVDTLb1ZFeKDh3AiNELgCMUw175IJHSkLl74hG0M0VLsvx+gag==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.11" }, "bin": { "parser": "bin/babel-parser.js" @@ -497,33 +500,33 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.10", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.10.tgz", + "integrity": "sha512-B3lYAs2nkKskbgQ1nfy8Ma9ao9Q1rntTAQHrzzyDuj+TSO+X3le6PfWwqDvodsb+OumE10eMFfuMCTQSQ5iuIQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.8", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.9", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.8", "debug": "^4.3.1" }, "engines": { @@ -531,13 +534,13 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.11", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.11.tgz", + "integrity": "sha512-WCsemW40Cpc6gouC1SrY6PBaZ+oLRlEVY9XBvZBI7il/HyUrb2nJ505wE1MHEFyDZNnrWDEuy4jL50WVHfTTSQ==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.11", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -644,6 +647,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" }, @@ -692,44 +696,11 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=20.19.0" } }, - "node_modules/@emnapi/core": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.10.0.tgz", - "integrity": "sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.2.1", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/core/node_modules/@emnapi/wasi-threads": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.2.1.tgz", - "integrity": "sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.10.0.tgz", - "integrity": "sha512-ewvYlk86xUoGI0zQRNq/mC+16R1QeDlKQy21Ki3oSYXNgLb45GV1P6A0M+/s6nyCuNDqe5VpaY84BzXGwVbwFA==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -782,9 +753,9 @@ "license": "MIT" }, "node_modules/@eslint/config-array/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "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": { @@ -863,9 +834,9 @@ "license": "MIT" }, "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "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": { @@ -1074,25 +1045,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-1.1.5.tgz", - "integrity": "sha512-AWPoBRJ9tsnVhor4sjO7rkni+7p+2IAEFj6cx06UgP10jkQHqay/36uRV/bFkgrh18D9vb4cr8Q0Pthskgzy+Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@tybys/wasm-util": "^0.10.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/Brooooooklyn" - }, - "peerDependencies": { - "@emnapi/core": "^1.7.1", - "@emnapi/runtime": "^1.7.1" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -1139,19 +1091,19 @@ "license": "MIT" }, "node_modules/@oxc-project/types": { - "version": "0.127.0", - "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.127.0.tgz", - "integrity": "sha512-aIYXQBo4lCbO4z0R3FHeucQHpF46l2LbMdxRvqvuRuW2OxdnSkcng5B8+K12spgLDj93rtN3+J2Vac/TIO+ciQ==", + "version": "0.155.0", + "resolved": "https://registry.npmjs.org/@oxc-project/types/-/types-0.155.0.tgz", + "integrity": "sha512-SeE8JPwW1xs1tHeNycjUtUBdhorRa8o4jlvjwk49R7/Z291i+4DQa7JJIgOm/TaYQZx+QrPQbVJ/9c8dMIZN8Q==", "dev": true, "license": "MIT", "funding": { - "url": "https://github.com/sponsors/Boshen" + "url": "https://github.com/sponsors/oxc-project" } }, "node_modules/@oxfmt/binding-android-arm-eabi": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.42.0.tgz", - "integrity": "sha512-dsqPTYsozeokRjlrt/b4E7Pj0z3eS3Eg74TWQuuKbjY4VttBmA88rB7d50Xrd+TZ986qdXCNeZRPEzZHAe+jow==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm-eabi/-/binding-android-arm-eabi-0.72.0.tgz", + "integrity": "sha512-u4U1uaDOVBuorGNC/07NLm48nECHOiJJka002YGML16Md2DRvf38RGBt01lH60EOGvNlFVmbLoksQedNBoZHKw==", "cpu": [ "arm" ], @@ -1166,9 +1118,9 @@ } }, "node_modules/@oxfmt/binding-android-arm64": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.42.0.tgz", - "integrity": "sha512-t+aAjHxcr5eOBphFHdg1ouQU9qmZZoRxnX7UOJSaTwSoKsb6TYezNKO0YbWytGXCECObRqNcUxPoPr0KaraAIg==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-android-arm64/-/binding-android-arm64-0.72.0.tgz", + "integrity": "sha512-GCnM+Ae2mWOKC+92y3FOb6eZJeVnBAVz82e3lITUUg+kxukYKzBNAvJ/hhHIfa2A0md55SYYhdWPddSSy3KPVA==", "cpu": [ "arm64" ], @@ -1183,9 +1135,9 @@ } }, "node_modules/@oxfmt/binding-darwin-arm64": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.42.0.tgz", - "integrity": "sha512-ulpSEYMKg61C5bRMZinFHrKJYRoKGVbvMEXA5zM1puX3O9T6Q4XXDbft20yrDijpYWeuG59z3Nabt+npeTsM1A==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-arm64/-/binding-darwin-arm64-0.72.0.tgz", + "integrity": "sha512-LjQ8tlevdtwraFlWC6AnQ1Forzde0clRmnsP3QmK+ydSElDt/J+5Jc+m+//Ly1G97aP7WCNUw110QMIUw2K7xA==", "cpu": [ "arm64" ], @@ -1200,9 +1152,9 @@ } }, "node_modules/@oxfmt/binding-darwin-x64": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.42.0.tgz", - "integrity": "sha512-ttxLKhQYPdFiM8I/Ri37cvqChE4Xa562nNOsZFcv1CKTVLeEozXjKuYClNvxkXmNlcF55nzM80P+CQkdFBu+uQ==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-darwin-x64/-/binding-darwin-x64-0.72.0.tgz", + "integrity": "sha512-+ZbcxhB1C34RQR5IldSyY6Z/yalJIxHXhP36PGE4sEq0f/lgL5jCLmOKoDeVm8dqd9gFGDsd1bNWHSGCAwdSkw==", "cpu": [ "x64" ], @@ -1217,9 +1169,9 @@ } }, "node_modules/@oxfmt/binding-freebsd-x64": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.42.0.tgz", - "integrity": "sha512-Og7QS3yI3tdIKYZ58SXik0rADxIk2jmd+/YvuHRyKULWpG4V2fR5V4hvKm624Mc0cQET35waPXiCQWvjQEjwYQ==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-freebsd-x64/-/binding-freebsd-x64-0.72.0.tgz", + "integrity": "sha512-yGPhA8sePEBFV9iGcprhyOk3Bz3fZshswMH3DpYIPZFLT1DG5LjiZ0j6AJQpSueaL6bUK0av1K+5+fe+ldy5EQ==", "cpu": [ "x64" ], @@ -1234,9 +1186,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-gnueabihf": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.42.0.tgz", - "integrity": "sha512-jwLOw/3CW4H6Vxcry4/buQHk7zm9Ne2YsidzTL1kpiMe4qqrRCwev3dkyWe2YkFmP+iZCQ7zku4KwjcLRoh8ew==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-0.72.0.tgz", + "integrity": "sha512-/g5axuqFMcAtoQrFLR5EJEMDjR5Ea4GuzpdDmMpPWAgrF1DmL4kD1NPNVlpXEOxpFJnD6lPvLKYj1lzdlrfifA==", "cpu": [ "arm" ], @@ -1251,9 +1203,9 @@ } }, "node_modules/@oxfmt/binding-linux-arm-musleabihf": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.42.0.tgz", - "integrity": "sha512-XwXu2vkMtiq2h7tfvN+WA/9/5/1IoGAVCFPiiQUvcAuG3efR97KNcRGM8BetmbYouFotQ2bDal3yyjUx6IPsTg==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm-musleabihf/-/binding-linux-arm-musleabihf-0.72.0.tgz", + "integrity": "sha512-InVitdHbS09PM+w+WinIiyX37rC9R3L7lUP9mKy9uKTEDSUFaLjWsLoreRIxKivnv7Ndqc6Trvi+K+b6ZzhiJg==", "cpu": [ "arm" ], @@ -1268,16 +1220,13 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-gnu": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.42.0.tgz", - "integrity": "sha512-ea7s/XUJoT7ENAtUQDudFe3nkSM3e3Qpz4nJFRdzO2wbgXEcjnchKLEsV3+t4ev3r8nWxIYr9NRjPWtnyIFJVA==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-0.72.0.tgz", + "integrity": "sha512-WKjlyRAxpPjXoqeuwFBim5LscgvY+RNEiZ971C9JlRQZONhJTsXDki/oHFYQE+fzzRpzXh3owZvOdT3kNL2g+g==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1288,16 +1237,13 @@ } }, "node_modules/@oxfmt/binding-linux-arm64-musl": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.42.0.tgz", - "integrity": "sha512-+JA0YMlSdDqmacygGi2REp57c3fN+tzARD8nwsukx9pkCHK+6DkbAA9ojS4lNKsiBjIW8WWa0pBrBWhdZEqfuw==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-arm64-musl/-/binding-linux-arm64-musl-0.72.0.tgz", + "integrity": "sha512-poafnbsPpJhR+5Mbwpf8CscugTyiRAzjTOxRVn8ra3X2jnURs2xL5Du2xl5g2iW85lICMglpmLf8jDjZEbNgzQ==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1308,16 +1254,13 @@ } }, "node_modules/@oxfmt/binding-linux-ppc64-gnu": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.42.0.tgz", - "integrity": "sha512-VfnET0j4Y5mdfCzh5gBt0NK28lgn5DKx+8WgSMLYYeSooHhohdbzwAStLki9pNuGy51y4I7IoW8bqwAaCMiJQg==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-0.72.0.tgz", + "integrity": "sha512-zNUi0gKRsO7S3IfPzsTbnm88OedPuX32hmZFWZRWHvWJlAoZRwVbeO6Nb3hng4vDgL7qUKp4TGqzPz1mhsycYg==", "cpu": [ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1328,16 +1271,13 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-gnu": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.42.0.tgz", - "integrity": "sha512-gVlCbmBkB0fxBWbhBj9rcxezPydsQHf4MFKeHoTSPicOQ+8oGeTQgQ8EeesSybWeiFPVRx3bgdt4IJnH6nOjAA==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-gnu/-/binding-linux-riscv64-gnu-0.72.0.tgz", + "integrity": "sha512-qTY7z/iyF/rWI2HWwWMevXqZW5PZUOofUy2afK7v6rseXnpld3yjgyIk6pCux3DqWQ0lB+f5atvLJNBwzLvFsw==", "cpu": [ "riscv64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1348,16 +1288,13 @@ } }, "node_modules/@oxfmt/binding-linux-riscv64-musl": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.42.0.tgz", - "integrity": "sha512-zN5OfstL0avgt/IgvRu0zjQzVh/EPkcLzs33E9LMAzpqlLWiPWeMDZyMGFlSRGOdDjuNmlZBCgj0pFnK5u32TQ==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-riscv64-musl/-/binding-linux-riscv64-musl-0.72.0.tgz", + "integrity": "sha512-w18qfo8vEMD6EKEHtzTvjc6jH8yCyXIT1Bn7PFWJd0PpZyzH/VQDx4xvjCh0LGz6GRzqiezbisTdG9AoXtpkZQ==", "cpu": [ "riscv64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1368,16 +1305,13 @@ } }, "node_modules/@oxfmt/binding-linux-s390x-gnu": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.42.0.tgz", - "integrity": "sha512-9X6+H2L0qMc2sCAgO9HS03bkGLMKvOFjmEdchaFlany3vNZOjnVui//D8k/xZAtQv2vaCs1reD5KAgPoIU4msA==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-0.72.0.tgz", + "integrity": "sha512-grW8HwEir+vK7fCcq1ZgL3NHQCfZ1PidiERE9Hbf+24xGys+DoDaoqTht4ccfn0PcBwbViLkwkda/KNpJu2KRQ==", "cpu": [ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1388,16 +1322,13 @@ } }, "node_modules/@oxfmt/binding-linux-x64-gnu": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.42.0.tgz", - "integrity": "sha512-BajxJ6KQvMMdpXGPWhBGyjb2Jvx4uec0w+wi6TJZ6Tv7+MzPwe0pO8g5h1U0jyFgoaF7mDl6yKPW3ykWcbUJRw==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-gnu/-/binding-linux-x64-gnu-0.72.0.tgz", + "integrity": "sha512-wQJRQfWBRIn88Pkr449EUViwRayrYUScg7ty+Ihiem21mQ9BUA6S9e/4RAgyNk9lMag0KBouyKskjq61rOC0WQ==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1408,16 +1339,13 @@ } }, "node_modules/@oxfmt/binding-linux-x64-musl": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.42.0.tgz", - "integrity": "sha512-0wV284I6vc5f0AqAhgAbHU2935B4bVpncPoe5n/WzVZY/KnHgqxC8iSFGeSyLWEgstFboIcWkOPck7tqbdHkzA==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-linux-x64-musl/-/binding-linux-x64-musl-0.72.0.tgz", + "integrity": "sha512-T1B0uQzafxuGPjjaPrZJ497nxoi1BiI65JfsYc56nNpmev3msfb/iaTmH2kQuNFqa8PKxpMlf3GhWrWBvBPORQ==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1428,9 +1356,9 @@ } }, "node_modules/@oxfmt/binding-openharmony-arm64": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.42.0.tgz", - "integrity": "sha512-p4BG6HpGnhfgHk1rzZfyR6zcWkE7iLrWxyehHfXUy4Qa5j3e0roglFOdP/Nj5cJJ58MA3isQ5dlfkW2nNEpolw==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-openharmony-arm64/-/binding-openharmony-arm64-0.72.0.tgz", + "integrity": "sha512-OKxxgTurl7+hypVplO8QRAbbQlwEs0j1Y6FZv+ZN2qNbdxQk2muMlzuJNBGTCWwxQ0rkkOD1uK/DW1fvzoUSJA==", "cpu": [ "arm64" ], @@ -1445,9 +1373,9 @@ } }, "node_modules/@oxfmt/binding-win32-arm64-msvc": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.42.0.tgz", - "integrity": "sha512-mn//WV60A+IetORDxYieYGAoQso4KnVRRjORDewMcod4irlRe0OSC7YPhhwaexYNPQz/GCFk+v9iUcZ2W22yxQ==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-0.72.0.tgz", + "integrity": "sha512-L78TKzURqvjuZOCo88ixMbPXf/RP7u31Y0cmjJ/KEmrHmfYhmhEvsDaTYPiyTRne64jUgCbADfY0YeoQk4/Xyw==", "cpu": [ "arm64" ], @@ -1462,9 +1390,9 @@ } }, "node_modules/@oxfmt/binding-win32-ia32-msvc": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.42.0.tgz", - "integrity": "sha512-3gWltUrvuz4LPJXWivoAxZ28Of2O4N7OGuM5/X3ubPXCEV8hmgECLZzjz7UYvSDUS3grfdccQwmjynm+51EFpw==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-ia32-msvc/-/binding-win32-ia32-msvc-0.72.0.tgz", + "integrity": "sha512-gQtFW+Ii8BWgtJTAD17TY/WsdNS5gUfAPov8iI1jeq4r9lRRYImmxPL08UU00/RLaCfBJwh2UgINnDY0iOiZ+A==", "cpu": [ "ia32" ], @@ -1479,9 +1407,9 @@ } }, "node_modules/@oxfmt/binding-win32-x64-msvc": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.42.0.tgz", - "integrity": "sha512-Wg4TMAfQRL9J9AZevJ/ZNy3uyyDztDYQtGr4P8UyyzIhLhFrdSmz1J/9JT+rv0fiCDLaFOBQnj3f3K3+a5PzDQ==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/@oxfmt/binding-win32-x64-msvc/-/binding-win32-x64-msvc-0.72.0.tgz", + "integrity": "sha512-uhooIN+DCzWX5uH7mQkSVCsODqsGluGJ4n3ch4+mITtWKpESMDjUJUSDBAVFuYQDwqY2McPDKdKJbM0oZVW/Qw==", "cpu": [ "x64" ], @@ -1513,10 +1441,27 @@ "dev": true, "license": "MIT" }, + "node_modules/@rolldown/binding-android-arm-eabi": { + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm-eabi/-/binding-android-arm-eabi-1.2.15.tgz", + "integrity": "sha512-aLcgK9gIJ3YRvrrtfSBbRa27F5WrpiTaPulnFpsHPxpUHgFlSgnU4854MHwoRGEBhfRJDWCS2WQ7lIjskE9Olw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": "^20.19.0 || >=22.12.0" + } + }, "node_modules/@rolldown/binding-android-arm64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.0.0-rc.17.tgz", - "integrity": "sha512-s70pVGhw4zqGeFnXWvAzJDlvxhlRollagdCCKRgOsgUOH3N1l0LIxf83AtGzmb5SiVM4Hjl5HyarMRfdfj3DaQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-android-arm64/-/binding-android-arm64-1.2.15.tgz", + "integrity": "sha512-xD7DdZCrbThKuxNg7ooQmvp07ys4J/pnSEMTG3/OdOWl6daC67m/Q4fL78sRHMxTH/N4fGUbYhcPM0MF5WFHkg==", "cpu": [ "arm64" ], @@ -1531,9 +1476,9 @@ } }, "node_modules/@rolldown/binding-darwin-arm64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.0.0-rc.17.tgz", - "integrity": "sha512-4ksWc9n0mhlZpZ9PMZgTGjeOPRu8MB1Z3Tz0Mo02eWfWCHMW1zN82Qz/pL/rC+yQa+8ZnutMF0JjJe7PjwasYw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-arm64/-/binding-darwin-arm64-1.2.15.tgz", + "integrity": "sha512-m2WuQ6r0B4OTYxyPpNLtXaMRbRDUbG8YQV2Q3KTdSSK8Th6KHCnC8jVCJt8bvYeSB5WivkkNbc85mKadaSdOxA==", "cpu": [ "arm64" ], @@ -1548,9 +1493,9 @@ } }, "node_modules/@rolldown/binding-darwin-x64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.0.0-rc.17.tgz", - "integrity": "sha512-SUSDOI6WwUVNcWxd02QEBjLdY1VPHvlEkw6T/8nYG322iYWCTxRb1vzk4E+mWWYehTp7ERibq54LSJGjmouOsw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-darwin-x64/-/binding-darwin-x64-1.2.15.tgz", + "integrity": "sha512-5RtnsHM36nodM9WbMy+zip0LGS/G+y5wro5RHrpOlr4ac24+1zSi9kiV2MP1myZeZ/ifEHfulQcWjnAXzc2C2A==", "cpu": [ "x64" ], @@ -1565,9 +1510,9 @@ } }, "node_modules/@rolldown/binding-freebsd-x64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.0.0-rc.17.tgz", - "integrity": "sha512-hwnz3nw9dbJ05EDO/PvcjaaewqqDy7Y1rn1UO81l8iIK1GjenME75dl16ajbvSSMfv66WXSRCYKIqfgq2KCfxw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-freebsd-x64/-/binding-freebsd-x64-1.2.15.tgz", + "integrity": "sha512-g3l09pyFqhu+135JKkbkwiKGQmwU5hUMUPJ4VdBADvuqR8d33L6H578rh8m7rtxbdp+VmX/+nzI7nvhSZlzpUQ==", "cpu": [ "x64" ], @@ -1582,9 +1527,9 @@ } }, "node_modules/@rolldown/binding-linux-arm-gnueabihf": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.0.0-rc.17.tgz", - "integrity": "sha512-IS+W7epTcwANmFSQFrS1SivEXHtl1JtuQA9wlxrZTcNi6mx+FDOYrakGevvvTwgj2JvWiK8B29/qD9BELZPyXQ==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm-gnueabihf/-/binding-linux-arm-gnueabihf-1.2.15.tgz", + "integrity": "sha512-nIe3VugI97nGQtspPxDqA4sXMUpeiocKIP/CqpY/u/vgbT+alX+cVxu1C/oVBPKg4feNTmYovE91v4DgXvXNwQ==", "cpu": [ "arm" ], @@ -1599,16 +1544,13 @@ } }, "node_modules/@rolldown/binding-linux-arm64-gnu": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.0.0-rc.17.tgz", - "integrity": "sha512-e6usGaHKW5BMNZOymS1UcEYGowQMWcgZ71Z17Sl/h2+ZziNJ1a9n3Zvcz6LdRyIW5572wBCTH/Z+bKuZouGk9Q==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-gnu/-/binding-linux-arm64-gnu-1.2.15.tgz", + "integrity": "sha512-iTBjXx+B5QSvgI89lJfmqh4wTh8NabR1YZIIN3hNx4zSG0EVfVqkOvLulNpG4251pbd6/IAmZ/LefVk1Y4rPhw==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1619,16 +1561,13 @@ } }, "node_modules/@rolldown/binding-linux-arm64-musl": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.0.0-rc.17.tgz", - "integrity": "sha512-b/CgbwAJpmrRLp02RPfhbudf5tZnN9nsPWK82znefso832etkem8H7FSZwxrOI9djcdTP7U6YfNhbRnh7djErg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-arm64-musl/-/binding-linux-arm64-musl-1.2.15.tgz", + "integrity": "sha512-uN26XOnVR7rqQupG3V9oAG2EGGatWjcJHOeDOHUFCh4TBWmP2tHTFoVN13aYbwfm0aHqJAEmcwhAu6sooIjfqQ==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1639,16 +1578,13 @@ } }, "node_modules/@rolldown/binding-linux-ppc64-gnu": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.0.0-rc.17.tgz", - "integrity": "sha512-4EII1iNGRUN5WwGbF/kOh/EIkoDN9HsupgLQoXfY+D1oyJm7/F4t5PYU5n8SWZgG0FEwakyM8pGgwcBYruGTlA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-ppc64-gnu/-/binding-linux-ppc64-gnu-1.2.15.tgz", + "integrity": "sha512-9nWkcdd+H+XhaA3fQIwpHnKIrfx/PQ6rO0pivr78Og07tXlUlctBBJoEYLPfhTmCR/QxEVdn6uPjHV5SymPhdw==", "cpu": [ "ppc64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1659,16 +1595,13 @@ } }, "node_modules/@rolldown/binding-linux-s390x-gnu": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.0.0-rc.17.tgz", - "integrity": "sha512-AH8oq3XqQo4IibpVXvPeLDI5pzkpYn0WiZAfT05kFzoJ6tQNzwRdDYQ45M8I/gslbodRZwW8uxLhbSBbkv96rA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-s390x-gnu/-/binding-linux-s390x-gnu-1.2.15.tgz", + "integrity": "sha512-Ggh0ciFjLwIusLSLz7LZYEaGdxOAUJXI+Qu5JCbhPJJHEt8vP+IjRATTJheiJsdzzTYgUiHUiw3X1Ea3ZpMBdA==", "cpu": [ "s390x" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1679,16 +1612,13 @@ } }, "node_modules/@rolldown/binding-linux-x64-gnu": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.0.0-rc.17.tgz", - "integrity": "sha512-cLnjV3xfo7KslbU41Z7z8BH/E1y5mzUYzAqih1d1MDaIGZRCMqTijqLv76/P7fyHuvUcfGsIpqCdddbxLLK9rA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-gnu/-/binding-linux-x64-gnu-1.2.15.tgz", + "integrity": "sha512-FHg60rS6DBePAYZ9X9F67x+JObFdmgn6tupA1C/a3B+CufFmTD4mX+e8M75tCiAO3foR/6xwVBI0KQiI7sn/rw==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MIT", "optional": true, "os": [ @@ -1699,16 +1629,13 @@ } }, "node_modules/@rolldown/binding-linux-x64-musl": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.0.0-rc.17.tgz", - "integrity": "sha512-0phclDw1spsL7dUB37sIARuis2tAgomCJXAHZlpt8PXZ4Ba0dRP1e+66lsRqrfhISeN9bEGNjQs+T/Fbd7oYGw==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-linux-x64-musl/-/binding-linux-x64-musl-1.2.15.tgz", + "integrity": "sha512-/cvV/7v5VGz/moiz0XKRj2dE8DzsKyhIu1KpOvJGPjRywg3yscON889UGvAe8zfiJLHup7VLjBduoGWi3HusWQ==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MIT", "optional": true, "os": [ @@ -1719,9 +1646,9 @@ } }, "node_modules/@rolldown/binding-openharmony-arm64": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.0.0-rc.17.tgz", - "integrity": "sha512-0ag/hEgXOwgw4t8QyQvUCxvEg+V0KBcA6YuOx9g0r02MprutRF5dyljgm3EmR02O292UX7UeS6HzWHAl6KgyhA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-openharmony-arm64/-/binding-openharmony-arm64-1.2.15.tgz", + "integrity": "sha512-MyzC5Hrv/sm+Z7TSGKP/j8001RO2xQm1zOpCNVL4j0cY/VhBZviludA2YFQ7i4lH6ZAXxQm0lcMdBzM+99mE7w==", "cpu": [ "arm64" ], @@ -1735,29 +1662,10 @@ "node": "^20.19.0 || >=22.12.0" } }, - "node_modules/@rolldown/binding-wasm32-wasi": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-wasm32-wasi/-/binding-wasm32-wasi-1.0.0-rc.17.tgz", - "integrity": "sha512-LEXei6vo0E5wTGwpkJ4KoT3OZJRnglwldt5ziLzOlc6qqb55z4tWNq2A+PFqCJuvWWdP53CVhG1Z9NtToDPJrA==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "1.10.0", - "@emnapi/runtime": "1.10.0", - "@napi-rs/wasm-runtime": "^1.1.4" - }, - "engines": { - "node": "^20.19.0 || >=22.12.0" - } - }, "node_modules/@rolldown/binding-win32-arm64-msvc": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.0.0-rc.17.tgz", - "integrity": "sha512-gUmyzBl3SPMa6hrqFUth9sVfcLBlYsbMzBx5PlexMroZStgzGqlZ26pYG89rBb45Mnia+oil6YAIFeEWGWhoZA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-arm64-msvc/-/binding-win32-arm64-msvc-1.2.15.tgz", + "integrity": "sha512-+PgYiS+AH5omy6L45ZLxybasauJaj3M8buoT83D+nzPmCayXlxUV9hydhciCKVyIg0B/v0BtXPDE1uGqNwCPpg==", "cpu": [ "arm64" ], @@ -1772,9 +1680,9 @@ } }, "node_modules/@rolldown/binding-win32-x64-msvc": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.0.0-rc.17.tgz", - "integrity": "sha512-3hkiolcUAvPB9FLb3UZdfjVVNWherN1f/skkGWJP/fgSQhYUZpSIRr0/I8ZK9TkF3F7kxvJAk0+IcKvPHk9qQg==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/@rolldown/binding-win32-x64-msvc/-/binding-win32-x64-msvc-1.2.15.tgz", + "integrity": "sha512-HFZd2QNQYn1JbIi+Hpd7H+r/lkWxcfIu28nirZ6eCn2LafuvmExMlb/P96Sfx5tf7pPArw39IdhmCF8vmV+NhQ==", "cpu": [ "x64" ], @@ -1809,17 +1717,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.2", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", - "integrity": "sha512-RoBvJ2X0wuKlWFIjrwffGw1IqZHKQqzIchKaadZZfnNpsAYp2mM0h36JtPCjNDAHGgYez/15uMBpfGwchhiMgg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, "node_modules/@types/chai": { "version": "5.2.3", "resolved": "https://registry.npmjs.org/@types/chai/-/chai-5.2.3.tgz", @@ -1889,6 +1786,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/trusted-types": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.7.tgz", + "integrity": "sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==", + "license": "MIT", + "optional": true + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.59.2", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.2.tgz", @@ -1934,6 +1838,7 @@ "integrity": "sha512-plR3pp6D+SSUn1HM7xvSkx12/DhoHInI2YF35KAcVFNZvlC0gtrWqx7Qq1oH2Ssgi0vlFRCTbP+DZc7B9+TtsQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "8.59.2", "@typescript-eslint/types": "8.59.2", @@ -2184,16 +2089,16 @@ } }, "node_modules/@vitest/expect": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.5.tgz", - "integrity": "sha512-PWBaRY5JoKuRnHlUHfpV/KohFylaDZTupcXN1H9vYryNLOnitSw60Mw9IAE2r67NbwwzBw/Cc/8q9BK3kIX8Kw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-4.1.12.tgz", + "integrity": "sha512-vFlTt+YEu9WBpNjdGayNmlMVzrWPi1+sv853/7t2FU7hpO5gAFBKHzQmkCq5Xjpr+evegF2994LQT3hF3mRlqQ==", "dev": true, "license": "MIT", "dependencies": { "@standard-schema/spec": "^1.1.0", "@types/chai": "^5.2.2", - "@vitest/spy": "4.1.5", - "@vitest/utils": "4.1.5", + "@vitest/spy": "4.1.12", + "@vitest/utils": "4.1.12", "chai": "^6.2.2", "tinyrainbow": "^3.1.0" }, @@ -2202,13 +2107,13 @@ } }, "node_modules/@vitest/mocker": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.5.tgz", - "integrity": "sha512-/x2EmFC4mT4NNzqvC3fmesuV97w5FC903KPmey4gsnJiMQ3Be1IlDKVaDaG8iqaLFHqJ2FVEkxZk5VmeLjIItw==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/mocker/-/mocker-4.1.12.tgz", + "integrity": "sha512-fKShNpKZzupWZuY0z7egydvL0sqW4INEZBEExMBMAa6izlENEVHwoXgdaTCaBZ5fwlr4xf2o1wXC83n9RpO+NA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/spy": "4.1.5", + "@vitest/spy": "4.1.12", "estree-walker": "^3.0.3", "magic-string": "^0.30.21" }, @@ -2239,9 +2144,9 @@ } }, "node_modules/@vitest/pretty-format": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.5.tgz", - "integrity": "sha512-7I3q6l5qr03dVfMX2wCo9FxwSJbPdwKjy2uu/YPpU3wfHvIL4QHwVRp57OfGrDFeUJ8/8QdfBKIV12FTtLn00g==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/pretty-format/-/pretty-format-4.1.12.tgz", + "integrity": "sha512-XW9O8+Mxx4VpCtkYdMJLZQQwsVryP9wk7cPKDxtXFfwSak6yRh5+2fep/Y0XF/ElBvJHq8bcYdi6aeuai0opZA==", "dev": true, "license": "MIT", "dependencies": { @@ -2252,13 +2157,13 @@ } }, "node_modules/@vitest/runner": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.5.tgz", - "integrity": "sha512-2D+o7Pr82IEO46YPpoA/YU0neeyr6FTerQb5Ro7BUnBuv6NQtT/kmVnczngiMEBhzgqz2UZYl5gArejsyERDSQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-4.1.12.tgz", + "integrity": "sha512-NKlVKCr5QnCe8jijdMnmkpHHU+WTqiLFR6G0pHji9uRjXK9xJl1k1nTw6F3pOOj2PDcsDt2GKQMI7wIsaT491w==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/utils": "4.1.5", + "@vitest/utils": "4.1.12", "pathe": "^2.0.3" }, "funding": { @@ -2266,14 +2171,14 @@ } }, "node_modules/@vitest/snapshot": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.5.tgz", - "integrity": "sha512-zypXEt4KH/XgKGPUz4eC2AvErYx0My5hfL8oDb1HzGFpEk1P62bxSohdyOmvz+d9UJwanI68MKwr2EquOaOgMQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-4.1.12.tgz", + "integrity": "sha512-ko1y1Qgb/slzQ9mr+b89Cuqud8WG1TKtsPD8r7ZUBdvVOGt85Af2HwCqHujrhwJq95hs/9RM7fcAPg57o1vlzw==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.5", - "@vitest/utils": "4.1.5", + "@vitest/pretty-format": "4.1.12", + "@vitest/utils": "4.1.12", "magic-string": "^0.30.21", "pathe": "^2.0.3" }, @@ -2282,9 +2187,9 @@ } }, "node_modules/@vitest/spy": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.5.tgz", - "integrity": "sha512-2lNOsh6+R2Idnf1TCZqSwYlKN2E/iDlD8sgU59kYVl+OMDmvldO1VDk39smRfpUNwYpNRVn3w4YfuC7KfbBnkQ==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-4.1.12.tgz", + "integrity": "sha512-RGq9x4JNGNTZHEJxvN0oSiJjeSCExm0n2gZKKJZHY9cX5AVA6M7VJILBT3ZJ/tJ/0J9uWT7fETV9/btoi//vSg==", "dev": true, "license": "MIT", "funding": { @@ -2292,13 +2197,13 @@ } }, "node_modules/@vitest/utils": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.5.tgz", - "integrity": "sha512-76wdkrmfXfqGjueGgnb45ITPyUi1ycZ4IHgC2bhPDUfWHklY/q3MdLOAB+TF1e6xfl8NxNY0ZYaPCFNWSsw3Ug==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-4.1.12.tgz", + "integrity": "sha512-Q3awXrwOfEV+qc3WmO5ONyE0yO7Q1gQ9/oyHxGLZ/pl7N3NO/ZztqQwKLuwMkV+CA1JYSIeO3gkHnRDIo4AVaA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/pretty-format": "4.1.5", + "@vitest/pretty-format": "4.1.12", "convert-source-map": "^2.0.0", "tinyrainbow": "^3.1.0" }, @@ -2389,53 +2294,54 @@ } }, "node_modules/@vue/compiler-core": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.34.tgz", - "integrity": "sha512-s9cLyK5mLcvZ4Agva5QgRsQyLKvts9WbU9DB6NqiZkkGEdwmcEiylj5Jbwkp680drF/NNCV8OlAJSe+yMLxaJw==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.43.tgz", + "integrity": "sha512-zdiLhnbe1QQqgDT8xZMpNmyqZ3qlI+/Q/FHQco57Kwl/b05HhCzN6eVGN9QU9rbga4CrS0H5SYY8VGHZCt/1Hg==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/shared": "3.5.34", + "@babel/parser": "^7.29.8", + "@vue/shared": "3.5.43", "entities": "^7.0.1", "estree-walker": "^2.0.2", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-dom": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.34.tgz", - "integrity": "sha512-EbF/T++k0e2MMZlJsBhzK8Sgwt0HcIPOhzn1CTB/lv6sQcyk+OWf8YeiLxZp3ro7MbbLcAfAJ6sEvjFWuNgUCw==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.43.tgz", + "integrity": "sha512-PEZoAk3NQmsn/ejMzSOCyTYqwGqczrWm70PuhBKjjv1+TCoQAaO/zOqNwjV+honlNstT5ILxtc+8r8UUfj+iEQ==", "license": "MIT", + "peer": true, "dependencies": { - "@vue/compiler-core": "3.5.34", - "@vue/shared": "3.5.34" + "@vue/compiler-core": "3.5.43", + "@vue/shared": "3.5.43" } }, "node_modules/@vue/compiler-sfc": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.34.tgz", - "integrity": "sha512-D/ihr6uZeIt6r+pVZf46RWT1fAsLFMbUP7k8G1VkiiWexriED9GrX3echHd4Abbt17zjlfiFJ8z7a3BxZOPNjg==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.43.tgz", + "integrity": "sha512-FCbrG3XNCRl+js3huuKx4IVHBLTvMkJhVepjbxSPu1gn4yWLaYtGNQdjJGZaMytXB6qb76qQDDmDSLy/vkmleQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.3", - "@vue/compiler-core": "3.5.34", - "@vue/compiler-dom": "3.5.34", - "@vue/compiler-ssr": "3.5.34", - "@vue/shared": "3.5.34", + "@babel/parser": "^7.29.8", + "@vue/compiler-core": "3.5.43", + "@vue/compiler-dom": "3.5.43", + "@vue/compiler-ssr": "3.5.43", + "@vue/shared": "3.5.43", "estree-walker": "^2.0.2", "magic-string": "^0.30.21", - "postcss": "^8.5.14", + "postcss": "^8.5.28", "source-map-js": "^1.2.1" } }, "node_modules/@vue/compiler-ssr": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.34.tgz", - "integrity": "sha512-cDtTHKibkThKGHH1SP+WdccquNRYQDFH6rRjQCqT9G2ltFAfoR5pUftpab/z+aM5mW9HLLVQW7hfKKQe/1GBeQ==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.43.tgz", + "integrity": "sha512-GF62orf7KiJX9RqrHNGrYBudsQGD0OhJ5nDs90O8UiDuS40+YMYomiXu6w6EuvtXuRDc3MSNis3EaaSKAVSWpg==", "license": "MIT", "dependencies": { - "@vue/compiler-dom": "3.5.34", - "@vue/shared": "3.5.34" + "@vue/compiler-dom": "3.5.43", + "@vue/shared": "3.5.43" } }, "node_modules/@vue/devtools-api": { @@ -2568,53 +2474,52 @@ } }, "node_modules/@vue/reactivity": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.34.tgz", - "integrity": "sha512-y9XDjCEuBp+98k+UL5dbYkh57AHU4o6cxZedOPXw3bmrZZYLQsVHguGurq7hVrPCSrQtrnz1f9dssyFr+dMXfQ==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.43.tgz", + "integrity": "sha512-G/c9GyOZNI2jVaaS6OX1EF1SSFSv7H0ERqNTl4+DTFMlZmB5eVAB53aLQNam/7NL2NPtaDD7RdVrzf8uJzMuOA==", "license": "MIT", "dependencies": { - "@vue/shared": "3.5.34" + "@vue/shared": "3.5.43" } }, "node_modules/@vue/runtime-core": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.34.tgz", - "integrity": "sha512-mKeBYvu8tcMSLhypAHBmriUFfWXKTCF/23Z4jiCoYK3UtWepkliViNLuR90V9XOyD62mUxs9p1jsrpK3CCGIzw==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.43.tgz", + "integrity": "sha512-hU6U6VnVhBGQDpvlnnDlIB8ZGJBiOcgk2lh/0InltHiz3D8oSkluvuvY+do1G2H3+udeKFsmaBlgVYP7gXQzEw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.34", - "@vue/shared": "3.5.34" + "@vue/reactivity": "3.5.43", + "@vue/shared": "3.5.43" } }, "node_modules/@vue/runtime-dom": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.34.tgz", - "integrity": "sha512-e8kZzERmCwUnBRVsgSQlAfrfU2rGoy0FFKPBXSlfEjc/O3KfA7QP0t1/2ZylrbchjmIKB4dPTd07A6WPr0eOrg==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.43.tgz", + "integrity": "sha512-Bb2Jc0YjjJdMt1SJmb9b2L/IWd3I8lIT9x9eS/xvvP9CiVgna0ffua74xKRmt4/uSJ+0r4iN8ex1jrqkhQGWQw==", "license": "MIT", "dependencies": { - "@vue/reactivity": "3.5.34", - "@vue/runtime-core": "3.5.34", - "@vue/shared": "3.5.34", + "@vue/reactivity": "3.5.43", + "@vue/runtime-core": "3.5.43", + "@vue/shared": "3.5.43", "csstype": "^3.2.3" } }, "node_modules/@vue/server-renderer": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.34.tgz", - "integrity": "sha512-nHxmJoTrKsmrkbILRhkC9gY1G3moZbJTqCzDd7DOOzG5KH9oeJ0Unqrff5f9v0pW//jES05ZkJcNtfE8JjOIew==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.43.tgz", + "integrity": "sha512-l2Ygjv9NehV94PSBxNWsAHC0j/eIIKbn92mBuWXAPGLnn6HfJ6MH5ubsd+Nk0YoZ5FRuxWI1P2VSoh+dbPQhCQ==", "license": "MIT", + "peer": true, "dependencies": { - "@vue/compiler-ssr": "3.5.34", - "@vue/shared": "3.5.34" - }, - "peerDependencies": { - "vue": "3.5.34" + "@vue/compiler-ssr": "3.5.43", + "@vue/runtime-dom": "3.5.43", + "@vue/shared": "3.5.43" } }, "node_modules/@vue/shared": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.34.tgz", - "integrity": "sha512-24uqU4OIiX29ryC3MeWid/Xf2fa2EFRUVLb77nRhk+UrTVrh/XiGtFAFmJBAtBRbjwNdsPRP+jj/OL27Eg1NDA==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.43.tgz", + "integrity": "sha512-uksS7YGMR5NZyr4JNq0Rp+QyLns0ueaz20KwzIPW9R0LH1Vnt4E+XUM29PNseEbf1www2gOuhuDi5AKOIXag9Q==", "license": "MIT" }, "node_modules/@vue/test-utils": { @@ -2673,6 +2578,7 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -2690,6 +2596,18 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.15.0.tgz", @@ -2777,13 +2695,14 @@ "license": "MIT" }, "node_modules/axios": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", - "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.20.0.tgz", + "integrity": "sha512-r8aOh8j9cGKpgQAqpzrUHnSIc6a59Y3Xf/cv8sy1DrHCkZHzQGEuoq1tARk6qSyDdtQGSDgpb9kFlruzPvrgwg==", "license": "MIT", "dependencies": { "follow-redirects": "^1.16.0", - "form-data": "^4.0.5", + "form-data": "^4.0.6", + "https-proxy-agent": "^5.0.1", "proxy-from-env": "^2.1.0" } }, @@ -2798,9 +2717,9 @@ } }, "node_modules/baseline-browser-mapping": { - "version": "2.10.27", - "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.10.27.tgz", - "integrity": "sha512-zEs/ufmZoUd7WftKpKyXaT6RFxpQ5Qm9xytKRHvJfxFV9DFJkZph9RvJ1LcOUi0Z1ZVijMte65JbILeV+8QQEA==", + "version": "2.11.33", + "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.33.tgz", + "integrity": "sha512-yiVKDX+qCMRKBE084lXvq9EcwFUhKZ2nU8TK1EQQuOgPNR/lmbGxXOeDdlGUqC2Zz11Cs9rk1d/8NfgBmlkt0w==", "dev": true, "license": "Apache-2.0", "bin": { @@ -2837,16 +2756,16 @@ "license": "ISC" }, "node_modules/brace-expansion": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.5.tgz", - "integrity": "sha512-VZznLgtwhn+Mact9tfiwx64fA9erHH/MCXEUfB/0bX/6Fz6ny5EGTXYltMocqg4xFAQZtnO3DHWWXi8RiuN7cQ==", + "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": { "balanced-match": "^4.0.2" }, "engines": { - "node": "18 || 20 || >=22" + "node": "20 || >=22" } }, "node_modules/braces": { @@ -2863,9 +2782,9 @@ } }, "node_modules/browserslist": { - "version": "4.28.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.28.2.tgz", - "integrity": "sha512-48xSriZYYg+8qXna9kwqjIVzuQxi+KYWp2+5nCYnYKPTr0LvD89Jqk2Or5ogxz0NUMfIjhh2lIUX/LyX9B4oIg==", + "version": "4.29.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.29.4.tgz", + "integrity": "sha512-2TcbbiwXEq+N0kD36tykpCfyyQigUXmuwNQbnPp4Xk4PX9JOqVIKjJlIDjpH7uY6tmRGoAd+apeT1p60T8wsdA==", "dev": true, "funding": [ { @@ -2882,12 +2801,13 @@ } ], "license": "MIT", + "peer": true, "dependencies": { - "baseline-browser-mapping": "^2.10.12", - "caniuse-lite": "^1.0.30001782", - "electron-to-chromium": "^1.5.328", - "node-releases": "^2.0.36", - "update-browserslist-db": "^1.2.3" + "baseline-browser-mapping": "^2.11.29", + "caniuse-lite": "^1.0.30001816", + "electron-to-chromium": "^1.5.459", + "node-releases": "^2.0.59", + "update-browserslist-db": "^1.3.4" }, "bin": { "browserslist": "cli.js" @@ -2936,9 +2856,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001792", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001792.tgz", - "integrity": "sha512-hVLMUZFgR4JJ6ACt1uEESvQN1/dBVqPAKY0hgrV70eN3391K6juAfTjKZLKvOMsx8PxA7gsY1/tLMMTcfFLLpw==", + "version": "1.0.30001819", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001819.tgz", + "integrity": "sha512-LFUqIIAwpzsIuevnKnsR9qnStBcgzPShTX61lBwN9uFkkf8o8zLiebEjbW8AYtZiF+1YKDWfdt/pWDtMuG8Xwg==", "dev": true, "funding": [ { @@ -2957,9 +2877,9 @@ "license": "CC-BY-4.0" }, "node_modules/chai": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz", - "integrity": "sha512-NUPRluOfOiTKBKvWPtSD4PhFvWCqOi0BGStNWs57X9js7XGTprSmFoz5F0tWhR4WPjNeR9jXqdC7/UpSJTnlRg==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-6.3.0.tgz", + "integrity": "sha512-XWAtwJ6OHO+tj0EKCs0Y2UamnyOxseZWltU4x2U2wh8g4AigdjwvtUjvLP2tqkA/avxHEtzxNaqGq/YGNwckKg==", "dev": true, "license": "MIT", "engines": { @@ -3131,7 +3051,6 @@ "version": "4.4.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -3221,6 +3140,15 @@ "node": ">=8" } }, + "node_modules/dompurify": { + "version": "3.4.17", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-3.4.17.tgz", + "integrity": "sha512-B/pSlYVHQ58kqISD/yDjuJ1yfzI34m1gF4lAod2bwSRhiN4K5Cl3H8Af7hqB2PmTL911tdEudnnXn5FnhRoz0w==", + "license": "(MPL-2.0 OR Apache-2.0)", + "optionalDependencies": { + "@types/trusted-types": "^2.0.7" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3269,9 +3197,9 @@ "license": "MIT" }, "node_modules/editorconfig/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -3308,9 +3236,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.352", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.352.tgz", - "integrity": "sha512-9wHk8x6dyuimoe18EdiDPWKExNdxYqo4fn4FwOVVper6RxT3cmpBwBkWWfSOCYJjQdIco/nPhJhNLmn4Ufg1Yg==", + "version": "1.5.464", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.464.tgz", + "integrity": "sha512-nRa65aFge40viPAKxMKULIY8tcXKwKboJWNn4RoKwyWXJ6SP7BnrDGKUTzc64818jIciH0PK7LSF8QzZes19GA==", "dev": true, "license": "ISC" }, @@ -3369,9 +3297,9 @@ "license": "MIT" }, "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.2.tgz", + "integrity": "sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==", "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -3424,6 +3352,7 @@ "integrity": "sha512-XoMjdBOwe/esVgEvLmNsD3IRHkm7fbKIUGvrleloJXUZgDHig2IPWNniv+GwjyJXzuNqVjlr5+4yVUZjycJwfQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.8.0", "@eslint-community/regexpp": "^4.12.1", @@ -3484,6 +3413,7 @@ "integrity": "sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "globals": "^13.24.0", @@ -3628,9 +3558,9 @@ "license": "MIT" }, "node_modules/eslint/node_modules/brace-expansion": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.14.tgz", - "integrity": "sha512-MWPGfDxnyzKU7rNOW9SP/c50vi3xrmrua/+6hfPbCS2ABNWfx24vPidzvC7krjU/RTo235sV776ymlsMtGKj8g==", + "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": { @@ -3883,9 +3813,9 @@ "license": "ISC" }, "node_modules/follow-redirects": { - "version": "1.16.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.0.tgz", - "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.16.2.tgz", + "integrity": "sha512-/kVP2U8z596Ia0gwFrwyIeo74ta5aVmSeU1FfAUMAmcEP5EP7zydmag3SLiN64NaRKef3lxsq7i/g7ltJQDGow==", "funding": [ { "type": "individual", @@ -3920,16 +3850,16 @@ } }, "node_modules/form-data": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", - "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.6.tgz", + "integrity": "sha512-vKatAh4SlVfgbv+YtmhiRjhEMJsYpsG1Y2rMQtR+SVSbytsSD1YGzDIcrAJmdFec88u/+VoGmxnl+80gL1tRCQ==", "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" + "hasown": "^2.0.4", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -4049,9 +3979,9 @@ "license": "MIT" }, "node_modules/glob/node_modules/brace-expansion": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", - "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.7.tgz", + "integrity": "sha512-uZbew1NqdmPDTMJ8ah1y+b+9QEJrfkXFk3RcTQw3X0jW/xRUvFKsg1CfQdSYGdTbXZWExtU3J3ccxtnfw1Fi0g==", "dev": true, "license": "MIT", "dependencies": { @@ -4137,9 +4067,9 @@ } }, "node_modules/hasown": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", - "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.4.tgz", + "integrity": "sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==", "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -4167,6 +4097,19 @@ "node": "^20.19.0 || ^22.12.0 || >=24.0.0" } }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", @@ -4370,14 +4313,11 @@ } }, "node_modules/js-cookie": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.5.tgz", - "integrity": "sha512-cEiJEAEoIbWfCZYKWhVwFuvPX1gETRYPw6LlaTKoxD3s2AkXzkCjnp6h0V77ozyqj0jakteJ4YqDJT830+lVGw==", + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/js-cookie/-/js-cookie-3.0.8.tgz", + "integrity": "sha512-yeJd4aNAdYZQjaon2bpD/Gb0B/omw7HQOsynXXcOiWVCacbBcPlgn8S/d1X6blFSaHao7ozqtW7NZW19xpCtIw==", "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - } + "license": "MIT" }, "node_modules/js-tokens": { "version": "4.0.0", @@ -4387,10 +4327,20 @@ "license": "MIT" }, "node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.3.2.tgz", + "integrity": "sha512-SFNOvSJ+Dgf/9An904Yx+CgSlIPCkIpao4qo51lpee25TIRejdH3rhR4EZMGoNx3/TP3O+wzWuiTFl4sqbltzA==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -4575,9 +4525,9 @@ } }, "node_modules/lightningcss": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.32.0.tgz", - "integrity": "sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.33.0.tgz", + "integrity": "sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==", "dev": true, "license": "MPL-2.0", "dependencies": { @@ -4591,23 +4541,23 @@ "url": "https://opencollective.com/parcel" }, "optionalDependencies": { - "lightningcss-android-arm64": "1.32.0", - "lightningcss-darwin-arm64": "1.32.0", - "lightningcss-darwin-x64": "1.32.0", - "lightningcss-freebsd-x64": "1.32.0", - "lightningcss-linux-arm-gnueabihf": "1.32.0", - "lightningcss-linux-arm64-gnu": "1.32.0", - "lightningcss-linux-arm64-musl": "1.32.0", - "lightningcss-linux-x64-gnu": "1.32.0", - "lightningcss-linux-x64-musl": "1.32.0", - "lightningcss-win32-arm64-msvc": "1.32.0", - "lightningcss-win32-x64-msvc": "1.32.0" + "lightningcss-android-arm64": "1.33.0", + "lightningcss-darwin-arm64": "1.33.0", + "lightningcss-darwin-x64": "1.33.0", + "lightningcss-freebsd-x64": "1.33.0", + "lightningcss-linux-arm-gnueabihf": "1.33.0", + "lightningcss-linux-arm64-gnu": "1.33.0", + "lightningcss-linux-arm64-musl": "1.33.0", + "lightningcss-linux-x64-gnu": "1.33.0", + "lightningcss-linux-x64-musl": "1.33.0", + "lightningcss-win32-arm64-msvc": "1.33.0", + "lightningcss-win32-x64-msvc": "1.33.0" } }, "node_modules/lightningcss-android-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.32.0.tgz", - "integrity": "sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-android-arm64/-/lightningcss-android-arm64-1.33.0.tgz", + "integrity": "sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==", "cpu": [ "arm64" ], @@ -4626,9 +4576,9 @@ } }, "node_modules/lightningcss-darwin-arm64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.32.0.tgz", - "integrity": "sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.33.0.tgz", + "integrity": "sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==", "cpu": [ "arm64" ], @@ -4647,9 +4597,9 @@ } }, "node_modules/lightningcss-darwin-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.32.0.tgz", - "integrity": "sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.33.0.tgz", + "integrity": "sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==", "cpu": [ "x64" ], @@ -4668,9 +4618,9 @@ } }, "node_modules/lightningcss-freebsd-x64": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.32.0.tgz", - "integrity": "sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.33.0.tgz", + "integrity": "sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==", "cpu": [ "x64" ], @@ -4689,9 +4639,9 @@ } }, "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.32.0.tgz", - "integrity": "sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.33.0.tgz", + "integrity": "sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==", "cpu": [ "arm" ], @@ -4710,16 +4660,13 @@ } }, "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.32.0.tgz", - "integrity": "sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.33.0.tgz", + "integrity": "sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4734,16 +4681,13 @@ } }, "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.32.0.tgz", - "integrity": "sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.33.0.tgz", + "integrity": "sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==", "cpu": [ "arm64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4758,16 +4702,13 @@ } }, "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.32.0.tgz", - "integrity": "sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.33.0.tgz", + "integrity": "sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "glibc" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4782,16 +4723,13 @@ } }, "node_modules/lightningcss-linux-x64-musl": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.32.0.tgz", - "integrity": "sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.33.0.tgz", + "integrity": "sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==", "cpu": [ "x64" ], "dev": true, - "libc": [ - "musl" - ], "license": "MPL-2.0", "optional": true, "os": [ @@ -4806,9 +4744,9 @@ } }, "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.32.0.tgz", - "integrity": "sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.33.0.tgz", + "integrity": "sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==", "cpu": [ "arm64" ], @@ -4827,9 +4765,9 @@ } }, "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.32.0", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.32.0.tgz", - "integrity": "sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==", + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.33.0.tgz", + "integrity": "sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==", "cpu": [ "x64" ], @@ -5012,7 +4950,6 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/muggle-string": { @@ -5023,9 +4960,9 @@ "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.12", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.12.tgz", - "integrity": "sha512-ZB9RH/39qpq5Vu6Y+NmUaFhQR6pp+M2Xt76XBnEwDaGcVAqhlvxrl3B2bKS5D3NH3QR76v3aSrKaF/Kiy7lEtQ==", + "version": "3.3.20", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.20.tgz", + "integrity": "sha512-uKdg2G3GNCKQn9byYOpxbGqrT2fGO5KRt5J/8b3pok8rT6qxGWF6hxMyJiEYtAf+FVyYuD9hRaDqX5uPFYJ4ZQ==", "funding": [ { "type": "github", @@ -5048,11 +4985,14 @@ "license": "MIT" }, "node_modules/node-releases": { - "version": "2.0.38", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.38.tgz", - "integrity": "sha512-3qT/88Y3FbH/Kx4szpQQ4HzUbVrHPKTLVpVocKiLfoYvw9XSGOX2FmD2d6DrXbVYyAQTF2HeF6My8jmzx7/CRw==", + "version": "2.0.60", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.60.tgz", + "integrity": "sha512-OmO8+GM1JUZqXET720VrJCwkjUCXmCMQm0Z3UDDRbfNLHS4NEAvY60j5jiFv0tkKw2PNNlqOLhahVmwJIOLDIQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "engines": { + "node": ">=18" + } }, "node_modules/nopt": { "version": "7.2.1", @@ -5228,13 +5168,13 @@ } }, "node_modules/oxfmt": { - "version": "0.42.0", - "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.42.0.tgz", - "integrity": "sha512-QhejGErLSMReNuZ6vxgFHDyGoPbjTRNi6uGHjy0cvIjOQFqD6xmr/T+3L41ixR3NIgzcNiJ6ylQKpvShTgDfqg==", + "version": "0.72.0", + "resolved": "https://registry.npmjs.org/oxfmt/-/oxfmt-0.72.0.tgz", + "integrity": "sha512-16OQeL0uhPZbfmT9S9WWM0Nv9+BmVi8Ra1uTYaSKj/qSCs6FB30KOhz9JoNYw6thT+K5bVxsk/tSEOu497i34g==", "dev": true, "license": "MIT", "dependencies": { - "tinypool": "2.1.0" + "tinypool": "2.2.0" }, "bin": { "oxfmt": "bin/oxfmt" @@ -5243,28 +5183,40 @@ "node": "^20.19.0 || >=22.12.0" }, "funding": { - "url": "https://github.com/sponsors/Boshen" + "url": "https://github.com/sponsors/oxc-project" }, "optionalDependencies": { - "@oxfmt/binding-android-arm-eabi": "0.42.0", - "@oxfmt/binding-android-arm64": "0.42.0", - "@oxfmt/binding-darwin-arm64": "0.42.0", - "@oxfmt/binding-darwin-x64": "0.42.0", - "@oxfmt/binding-freebsd-x64": "0.42.0", - "@oxfmt/binding-linux-arm-gnueabihf": "0.42.0", - "@oxfmt/binding-linux-arm-musleabihf": "0.42.0", - "@oxfmt/binding-linux-arm64-gnu": "0.42.0", - "@oxfmt/binding-linux-arm64-musl": "0.42.0", - "@oxfmt/binding-linux-ppc64-gnu": "0.42.0", - "@oxfmt/binding-linux-riscv64-gnu": "0.42.0", - "@oxfmt/binding-linux-riscv64-musl": "0.42.0", - "@oxfmt/binding-linux-s390x-gnu": "0.42.0", - "@oxfmt/binding-linux-x64-gnu": "0.42.0", - "@oxfmt/binding-linux-x64-musl": "0.42.0", - "@oxfmt/binding-openharmony-arm64": "0.42.0", - "@oxfmt/binding-win32-arm64-msvc": "0.42.0", - "@oxfmt/binding-win32-ia32-msvc": "0.42.0", - "@oxfmt/binding-win32-x64-msvc": "0.42.0" + "@oxfmt/binding-android-arm-eabi": "0.72.0", + "@oxfmt/binding-android-arm64": "0.72.0", + "@oxfmt/binding-darwin-arm64": "0.72.0", + "@oxfmt/binding-darwin-x64": "0.72.0", + "@oxfmt/binding-freebsd-x64": "0.72.0", + "@oxfmt/binding-linux-arm-gnueabihf": "0.72.0", + "@oxfmt/binding-linux-arm-musleabihf": "0.72.0", + "@oxfmt/binding-linux-arm64-gnu": "0.72.0", + "@oxfmt/binding-linux-arm64-musl": "0.72.0", + "@oxfmt/binding-linux-ppc64-gnu": "0.72.0", + "@oxfmt/binding-linux-riscv64-gnu": "0.72.0", + "@oxfmt/binding-linux-riscv64-musl": "0.72.0", + "@oxfmt/binding-linux-s390x-gnu": "0.72.0", + "@oxfmt/binding-linux-x64-gnu": "0.72.0", + "@oxfmt/binding-linux-x64-musl": "0.72.0", + "@oxfmt/binding-openharmony-arm64": "0.72.0", + "@oxfmt/binding-win32-arm64-msvc": "0.72.0", + "@oxfmt/binding-win32-ia32-msvc": "0.72.0", + "@oxfmt/binding-win32-x64-msvc": "0.72.0" + }, + "peerDependencies": { + "svelte": "^5.0.0", + "vite-plus": "*" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + }, + "vite-plus": { + "optional": true + } } }, "node_modules/p-limit": { @@ -5463,9 +5415,9 @@ } }, "node_modules/postcss": { - "version": "8.5.14", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.14.tgz", - "integrity": "sha512-SoSL4+OSEtR99LHFZQiJLkT59C5B1amGO1NzTwj7TT1qCUgUO6hxOvzkOYxD+vMrXBM3XJIKzokoERdqQq/Zmg==", + "version": "8.5.31", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.31.tgz", + "integrity": "sha512-YUbWYCgErwnMAVkjUnYa+KlMBzGpHwiIt/DE7f0G33AuX2LH9UcTk6KgWxd3zRU+pN3u/C+Xl3EnMLM4Hea7Sg==", "funding": [ { "type": "opencollective", @@ -5482,18 +5434,18 @@ ], "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", + "nanoid": "^3.3.20", "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "source-map-js": "^1.2.2" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-selector-parser": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", - "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "version": "6.1.5", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.5.tgz", + "integrity": "sha512-TEHFzb5KRDKaOgJ4TYE+0jyJtFbjLvkdVOu0fZ2b6MTWzoqZd4Le+61aEppWkvTlYePgOX4ATL1wsAIPMLTw6Q==", "dev": true, "license": "MIT", "dependencies": { @@ -5514,6 +5466,12 @@ "node": ">= 0.8.0" } }, + "node_modules/pretendard": { + "version": "1.3.9", + "resolved": "https://registry.npmjs.org/pretendard/-/pretendard-1.3.9.tgz", + "integrity": "sha512-PaQAADyLY5v4kYFwkpSJHbSSYIkiriY/1xXw75TKoZ9UQQqeU+tvP05yTdZAWibiIYoo8ZKtRv8PM7w0IaywSw==", + "license": "OFL-1.1" + }, "node_modules/proto-list": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", @@ -5613,14 +5571,14 @@ "license": "MIT" }, "node_modules/rolldown": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.0.0-rc.17.tgz", - "integrity": "sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==", + "version": "1.2.15", + "resolved": "https://registry.npmjs.org/rolldown/-/rolldown-1.2.15.tgz", + "integrity": "sha512-6odND+fel5zVw3I4Yc2e69gvguDnX0CAAGiNDZSq4ik5WUcaLrkD2GLuog0XcODbor31hZ5ayEMgVDno+KPV5g==", "dev": true, "license": "MIT", "dependencies": { - "@oxc-project/types": "=0.127.0", - "@rolldown/pluginutils": "1.0.0-rc.17" + "@oxc-project/types": "=0.155.0", + "@rolldown/pluginutils": "^1.0.0" }, "bin": { "rolldown": "bin/cli.mjs" @@ -5629,27 +5587,27 @@ "node": "^20.19.0 || >=22.12.0" }, "optionalDependencies": { - "@rolldown/binding-android-arm64": "1.0.0-rc.17", - "@rolldown/binding-darwin-arm64": "1.0.0-rc.17", - "@rolldown/binding-darwin-x64": "1.0.0-rc.17", - "@rolldown/binding-freebsd-x64": "1.0.0-rc.17", - "@rolldown/binding-linux-arm-gnueabihf": "1.0.0-rc.17", - "@rolldown/binding-linux-arm64-gnu": "1.0.0-rc.17", - "@rolldown/binding-linux-arm64-musl": "1.0.0-rc.17", - "@rolldown/binding-linux-ppc64-gnu": "1.0.0-rc.17", - "@rolldown/binding-linux-s390x-gnu": "1.0.0-rc.17", - "@rolldown/binding-linux-x64-gnu": "1.0.0-rc.17", - "@rolldown/binding-linux-x64-musl": "1.0.0-rc.17", - "@rolldown/binding-openharmony-arm64": "1.0.0-rc.17", - "@rolldown/binding-wasm32-wasi": "1.0.0-rc.17", - "@rolldown/binding-win32-arm64-msvc": "1.0.0-rc.17", - "@rolldown/binding-win32-x64-msvc": "1.0.0-rc.17" + "@rolldown/binding-android-arm-eabi": "1.2.15", + "@rolldown/binding-android-arm64": "1.2.15", + "@rolldown/binding-darwin-arm64": "1.2.15", + "@rolldown/binding-darwin-x64": "1.2.15", + "@rolldown/binding-freebsd-x64": "1.2.15", + "@rolldown/binding-linux-arm-gnueabihf": "1.2.15", + "@rolldown/binding-linux-arm64-gnu": "1.2.15", + "@rolldown/binding-linux-arm64-musl": "1.2.15", + "@rolldown/binding-linux-ppc64-gnu": "1.2.15", + "@rolldown/binding-linux-s390x-gnu": "1.2.15", + "@rolldown/binding-linux-x64-gnu": "1.2.15", + "@rolldown/binding-linux-x64-musl": "1.2.15", + "@rolldown/binding-openharmony-arm64": "1.2.15", + "@rolldown/binding-win32-arm64-msvc": "1.2.15", + "@rolldown/binding-win32-x64-msvc": "1.2.15" } }, "node_modules/rolldown/node_modules/@rolldown/pluginutils": { - "version": "1.0.0-rc.17", - "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.0-rc.17.tgz", - "integrity": "sha512-n8iosDOt6Ig1UhJ2AYqoIhHWh/isz0xpicHTzpKBeotdVsTEcxsSA/i3EVM7gQAj0rU27OLAxCjzlj15IWY7bg==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@rolldown/pluginutils/-/pluginutils-1.0.1.tgz", + "integrity": "sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==", "dev": true, "license": "MIT" }, @@ -5737,9 +5695,9 @@ } }, "node_modules/shell-quote": { - "version": "1.8.3", - "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.3.tgz", - "integrity": "sha512-ObmnIF4hXNg1BqhnHmgbDETF8dLPCggZWBjkQfhZpbszZnYur5DUljTcCHii5LC3J5E0yeO/1LIMyH+UvHQgyw==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.12.0.tgz", + "integrity": "sha512-PcByqNyT/38F2kDNi006HAMRJaULuBzq/FOsw3qdZvX/GA9W/jamDaRskgHjubHiftXK5sIFxLNkvrXUwcof6Q==", "dev": true, "license": "MIT", "engines": { @@ -5785,9 +5743,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" @@ -5983,9 +5941,9 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.16", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.16.tgz", - "integrity": "sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { @@ -6023,6 +5981,7 @@ "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": ">=12" }, @@ -6031,9 +5990,9 @@ } }, "node_modules/tinypool": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.1.0.tgz", - "integrity": "sha512-Pugqs6M0m7Lv1I7FtxN4aoyToKg1C4tu+/381vH35y8oENM/Ai7f7C4StcoK4/+BSw9ebcS8jRiVrORFKCALLw==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-2.2.0.tgz", + "integrity": "sha512-jBrmx4lYmaC9k/mgPbylxs7kBUxHtD8256up+HjLaDFfXScKJQyil+SWXSvhAtT7XHo+yTVlpB81PGmHP8oLSQ==", "dev": true, "license": "MIT", "engines": { @@ -6041,9 +6000,9 @@ } }, "node_modules/tinyrainbow": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.1.0.tgz", - "integrity": "sha512-Bf+ILmBgretUrdJxzXM0SgXLZ3XfiaUuOj/IKQHuTXip+05Xn+uyEYdVg0kYDipTBcLrCVyUzAPz7QmArb0mmw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/tinyrainbow/-/tinyrainbow-3.2.0.tgz", + "integrity": "sha512-LgO3D9yZJjApUiuUfl9iFAwrtaX4+lok3wJIqttGoKCHlWUqHqbQpnxCf82L8FjgKsh4iGo78hqJwgL8F6To2A==", "dev": true, "license": "MIT", "engines": { @@ -6132,14 +6091,6 @@ "typescript": ">=4.8.4" } }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "dev": true, - "license": "0BSD", - "optional": true - }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -6172,6 +6123,7 @@ "integrity": "sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==", "devOptional": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -6205,9 +6157,9 @@ } }, "node_modules/undici": { - "version": "7.25.0", - "resolved": "https://registry.npmjs.org/undici/-/undici-7.25.0.tgz", - "integrity": "sha512-xXnp4kTyor2Zq+J1FfPI6Eq3ew5h6Vl0F/8d9XU5zZQf1tX9s2Su1/3PiMmUANFULpmksxkClamIZcaUqryHsQ==", + "version": "7.30.1", + "resolved": "https://registry.npmjs.org/undici/-/undici-7.30.1.tgz", + "integrity": "sha512-03KrMbjIFDWQR5RNPrSw3bd1r12JpyFQl9/yxjUbJtqkjmllqC5lFjZh6ujeuJCKr8EOQvRW872Oy/az+nLYxg==", "dev": true, "license": "MIT", "engines": { @@ -6252,9 +6204,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.2.3.tgz", - "integrity": "sha512-Js0m9cx+qOgDxo0eMiFGEueWztz+d4+M3rGlmKPT+T4IS/jP4ylw3Nwpu6cpTTP8R1MAC1kF4VbdLt3ARf209w==", + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.4.tgz", + "integrity": "sha512-t8wonIOdQyOjtPd2VktlBu6QjTVTks6v8bSi7kd0r2Vll8TK1JYDZtRRdbmCHOAMphkZgrzK+L+vXK4pyZ8t4A==", "dev": true, "funding": [ { @@ -6300,17 +6252,18 @@ "license": "MIT" }, "node_modules/vite": { - "version": "8.0.10", - "resolved": "https://registry.npmjs.org/vite/-/vite-8.0.10.tgz", - "integrity": "sha512-rZuUu9j6J5uotLDs+cAA4O5H4K1SfPliUlQwqa6YEwSrWDZzP4rhm00oJR5snMewjxF5V/K3D4kctsUTsIU9Mw==", + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/vite/-/vite-8.3.4.tgz", + "integrity": "sha512-IftLE8phJhdNRIGNEV4JCCvfNScoZQVfcXaN8TQropWGJtOHcu+iAB9pHcuGvmEb/kddw0LBe/jS8ztdC6xdiQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { - "lightningcss": "^1.32.0", - "picomatch": "^4.0.4", - "postcss": "^8.5.10", - "rolldown": "1.0.0-rc.17", - "tinyglobby": "^0.2.16" + "lightningcss": "^1.33.0", + "picomatch": "^4.0.7", + "postcss": "^8.5.29", + "rolldown": "~1.2.12", + "tinyglobby": "^0.2.17" }, "bin": { "vite": "bin/vite.js" @@ -6326,7 +6279,7 @@ }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", - "@vitejs/devtools": "^0.1.0", + "@vitejs/devtools": "^0.7.1", "esbuild": "^0.27.0 || ^0.28.0", "jiti": ">=1.21.0", "less": "^4.0.0", @@ -6562,9 +6515,9 @@ } }, "node_modules/vite/node_modules/picomatch": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", - "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz", + "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==", "dev": true, "license": "MIT", "engines": { @@ -6575,19 +6528,19 @@ } }, "node_modules/vitest": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.5.tgz", - "integrity": "sha512-9Xx1v3/ih3m9hN+SbfkUyy0JAs72ap3r7joc87XL6jwF0jGg6mFBvQ1SrwaX+h8BlkX6Hz9shdd1uo6AF+ZGpg==", + "version": "4.1.12", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-4.1.12.tgz", + "integrity": "sha512-5eWdz2yb3ajxWF3C8C4TjkXl7FGm3n2E/VlazALrQHzK7nYMSGFnCZto0bbPNl77AwkOZVLk0YnBAejUu0NiWA==", "dev": true, "license": "MIT", "dependencies": { - "@vitest/expect": "4.1.5", - "@vitest/mocker": "4.1.5", - "@vitest/pretty-format": "4.1.5", - "@vitest/runner": "4.1.5", - "@vitest/snapshot": "4.1.5", - "@vitest/spy": "4.1.5", - "@vitest/utils": "4.1.5", + "@vitest/expect": "4.1.12", + "@vitest/mocker": "4.1.12", + "@vitest/pretty-format": "4.1.12", + "@vitest/runner": "4.1.12", + "@vitest/snapshot": "4.1.12", + "@vitest/spy": "4.1.12", + "@vitest/utils": "4.1.12", "es-module-lexer": "^2.0.0", "expect-type": "^1.3.0", "magic-string": "^0.30.21", @@ -6615,12 +6568,12 @@ "@edge-runtime/vm": "*", "@opentelemetry/api": "^1.9.0", "@types/node": "^20.0.0 || ^22.0.0 || >=24.0.0", - "@vitest/browser-playwright": "4.1.5", - "@vitest/browser-preview": "4.1.5", - "@vitest/browser-webdriverio": "4.1.5", - "@vitest/coverage-istanbul": "4.1.5", - "@vitest/coverage-v8": "4.1.5", - "@vitest/ui": "4.1.5", + "@vitest/browser-playwright": "4.1.12", + "@vitest/browser-preview": "4.1.12", + "@vitest/browser-webdriverio": "^4.1.11", + "@vitest/coverage-istanbul": "4.1.12", + "@vitest/coverage-v8": "4.1.12", + "@vitest/ui": "4.1.12", "happy-dom": "*", "jsdom": "*", "vite": "^6.0.0 || ^7.0.0 || ^8.0.0" @@ -6685,16 +6638,17 @@ "license": "MIT" }, "node_modules/vue": { - "version": "3.5.34", - "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.34.tgz", - "integrity": "sha512-WdLBG9gm02OgJIG9axd5Hpx0TFLdzVgfG2evFFu8Rur5O/IoGc5cMjnjh3tPL6GnRGsYvUhBSKVPYVcxRKpMCA==", + "version": "3.5.43", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.43.tgz", + "integrity": "sha512-o5qZoksdnjIKvW1srZ3ab7pcDNYAerBjRe54D0LBLfRdCYFrSgBHVXokMas35czQc0//lmx4/tuY4ZNQ+Rf2Ng==", "license": "MIT", + "peer": true, "dependencies": { - "@vue/compiler-dom": "3.5.34", - "@vue/compiler-sfc": "3.5.34", - "@vue/runtime-dom": "3.5.34", - "@vue/server-renderer": "3.5.34", - "@vue/shared": "3.5.34" + "@vue/compiler-dom": "3.5.43", + "@vue/compiler-sfc": "3.5.43", + "@vue/runtime-dom": "3.5.43", + "@vue/server-renderer": "3.5.43", + "@vue/shared": "3.5.43" }, "peerDependencies": { "typescript": "*" diff --git a/frontend/package.json b/frontend/package.json index 86100d3..8a982f9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -16,8 +16,10 @@ }, "dependencies": { "axios": "^1.14.0", + "dompurify": "^3.4.17", "pinia": "^3.0.4", - "vue": "^3.5.31", + "pretendard": "^1.3.9", + "vue": "^3.5.43", "vue-router": "^4.4.5" }, "devDependencies": { @@ -33,9 +35,9 @@ "eslint-plugin-vue": "^9.32.0", "jsdom": "^29.0.1", "npm-run-all2": "^8.0.4", - "oxfmt": "^0.42.0", + "oxfmt": "^0.72.0", "typescript": "~6.0.0", - "vite": "^8.0.3", + "vite": "^8.3.4", "vite-plugin-vue-devtools": "^8.1.1", "vitest": "^4.1.2", "vue-tsc": "^3.2.6" diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 5a6a315..34e0e77 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -1,10 +1,18 @@ - - diff --git a/frontend/src/assets/brand/logo-ara-white.png b/frontend/src/assets/brand/logo-ara-white.png new file mode 100644 index 0000000000000000000000000000000000000000..6766d3ac2ff359e36cc2e066fee266e29db3f0d2 GIT binary patch literal 12602 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⁡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 literal 0 HcmV?d00001 diff --git a/frontend/src/components/AppIcon.vue b/frontend/src/components/AppIcon.vue new file mode 100644 index 0000000..84b61b5 --- /dev/null +++ b/frontend/src/components/AppIcon.vue @@ -0,0 +1,60 @@ + + + + + diff --git a/frontend/src/components/BaseButton.vue b/frontend/src/components/BaseButton.vue index 15a31cb..f3920f7 100644 --- a/frontend/src/components/BaseButton.vue +++ b/frontend/src/components/BaseButton.vue @@ -50,12 +50,14 @@ function handleClick(event: MouseEvent) { diff --git a/frontend/src/components/feedback/SessionExpiredDialog.spec.ts b/frontend/src/components/feedback/SessionExpiredDialog.spec.ts new file mode 100644 index 0000000..0e745ee --- /dev/null +++ b/frontend/src/components/feedback/SessionExpiredDialog.spec.ts @@ -0,0 +1,41 @@ +import { beforeEach, describe, expect, it } from 'vitest' +import { mount } from '@vue/test-utils' +import { createPinia, setActivePinia, type Pinia } from 'pinia' + +import { ERROR_CODE_MESSAGES } from '@/shared/constants/error-codes.generated' +import { useAuthStore } from '@/stores/auth.store' +import { flushPromises } from '@/test-utils/mock-api' +import { createTestRouter } from '@/test-utils/router' +import SessionExpiredDialog from './SessionExpiredDialog.vue' + +describe('SessionExpiredDialog', () => { + let pinia: Pinia + + beforeEach(() => { + pinia = createPinia() + setActivePinia(pinia) + }) + + it('세션이 만료되면 사전 문구(AUTH_002)로 열리고, 확인하면 로그인 화면으로 보낸다 (돌아올 주소 포함)', async () => { + const router = createTestRouter() + await router.push('/mail/inbox/m1') + await router.isReady() + const wrapper = mount(SessionExpiredDialog, { global: { plugins: [pinia, router] } }) + const authStore = useAuthStore() + authStore.markAuthenticated({ email: 'ara.kim@arasystem.test', name: '김아라' }) + + authStore.expireSession() + await flushPromises() + + const dialog = wrapper.get('dialog') + expect(dialog.attributes('open')).toBeDefined() + expect(dialog.text()).toContain(ERROR_CODE_MESSAGES.AUTH_002) + + await wrapper.get('button').trigger('click') + await flushPromises() + + expect(authStore.sessionExpired).toBe(false) + expect(router.currentRoute.value.name).toBe('login') + expect(router.currentRoute.value.query.redirect).toBe('/mail/inbox/m1') + }) +}) diff --git a/frontend/src/components/feedback/SessionExpiredDialog.vue b/frontend/src/components/feedback/SessionExpiredDialog.vue new file mode 100644 index 0000000..6dab928 --- /dev/null +++ b/frontend/src/components/feedback/SessionExpiredDialog.vue @@ -0,0 +1,136 @@ + + + + + diff --git a/frontend/src/components/feedback/StateMessage.vue b/frontend/src/components/feedback/StateMessage.vue new file mode 100644 index 0000000..67965a1 --- /dev/null +++ b/frontend/src/components/feedback/StateMessage.vue @@ -0,0 +1,105 @@ + + + + + diff --git a/frontend/src/components/feedback/ToastHost.vue b/frontend/src/components/feedback/ToastHost.vue new file mode 100644 index 0000000..c1e1db7 --- /dev/null +++ b/frontend/src/components/feedback/ToastHost.vue @@ -0,0 +1,186 @@ + + + + + diff --git a/frontend/src/components/mail/ComposeAttachmentList.vue b/frontend/src/components/mail/ComposeAttachmentList.vue new file mode 100644 index 0000000..61882dc --- /dev/null +++ b/frontend/src/components/mail/ComposeAttachmentList.vue @@ -0,0 +1,190 @@ + + + + + diff --git a/frontend/src/components/mail/ListReadNav.spec.ts b/frontend/src/components/mail/ListReadNav.spec.ts new file mode 100644 index 0000000..d38db1c --- /dev/null +++ b/frontend/src/components/mail/ListReadNav.spec.ts @@ -0,0 +1,137 @@ +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest' +import { mount } from '@vue/test-utils' +import { createPinia, setActivePinia, type Pinia } from 'pinia' +import { createRouter, createWebHistory } from 'vue-router' + +import type { MessageSummary } from '@/shared/types/mail' +import { useAuthStore } from '@/stores/auth.store' +import { useMailStore } from '@/stores/mail.store' +import { useMailViewStore } from '@/stores/mail-view.store' +import { useToastStore } from '@/stores/toast.store' +import { flushPromises, installMockApi, ok, restoreApiAdapter } from '@/test-utils/mock-api' +import { createTestRouter } from '@/test-utils/router' +import ListReadNav from './ListReadNav.vue' + +function summary(id: string): MessageSummary { + return { + id, + threadId: `t-${id}`, + mailboxIds: ['inbox'], + from: { name: '이도윤', email: 'doyun.lee@arasystem.test' }, + to: [], + subject: `제목 ${id}`, + preview: '', + receivedAt: '2026-10-26T01:00:00Z', + isRead: true, + isFlagged: false, + hasAttachment: false, + size: 100, + } +} + +describe('ListReadNav (목록 보기에서 연 메일의 이동)', () => { + let pinia: Pinia + + beforeEach(() => { + pinia = createPinia() + setActivePinia(pinia) + useAuthStore().markAuthenticated({ email: 'ara.kim@arasystem.test', name: '김아라' }) + const store = useMailStore() + store.currentMailboxId = 'inbox' + store.messages = [summary('m1'), summary('m2'), summary('m3')] + store.pageInfo = { hasNext: true, nextCursor: 'c2', total: 5 } + store.listStatus = 'ready' + }) + + afterEach(() => { + useToastStore().clear() + restoreApiAdapter() + }) + + async function mountNav(messageId: string) { + const router = createTestRouter() + // 목록에서 메일을 연 것과 같은 기록: /mail/inbox → /mail/inbox/ + await router.push('/mail/inbox') + await router.push(`/mail/inbox/${messageId}`) + await router.isReady() + const wrapper = mount(ListReadNav, { + props: { mailboxId: 'inbox', messageId }, + global: { plugins: [pinia, router] }, + }) + return { wrapper, router } + } + + it('위치를 "n / 전체" 로 보인다 (전체는 서버가 준 total)', async () => { + const { wrapper } = await mountNav('m2') + + expect(wrapper.get('.nav-position').text()).toBe('2 / 5') + }) + + it('첫 메일이면 이전 버튼이 꺼진다', async () => { + const { wrapper } = await mountNav('m1') + + expect(wrapper.get('button[aria-label="이전 메일"]').attributes('disabled')).toBeDefined() + expect(wrapper.get('button[aria-label="다음 메일"]').attributes('disabled')).toBeUndefined() + }) + + it('이전 메일로 넘어가도 기록을 늘리지 않는다 — 뒤로 가기는 목록으로 간다', async () => { + const { wrapper, router } = await mountNav('m2') + + await wrapper.get('button[aria-label="이전 메일"]').trigger('click') + await flushPromises() + expect(router.currentRoute.value.fullPath).toBe('/mail/inbox/m1') + + router.back() + await flushPromises() + expect(router.currentRoute.value.fullPath).toBe('/mail/inbox') + }) + + it('불러온 범위의 끝에서 다음을 누르면 다음 페이지를 불러온 뒤 넘어간다', async () => { + const requests = installMockApi(() => + ok({ items: [summary('m4'), summary('m5')], pageInfo: { hasNext: false, nextCursor: null, total: 5 } }), + ) + const { wrapper, router } = await mountNav('m3') + + await wrapper.get('button[aria-label="다음 메일"]').trigger('click') + await flushPromises() + + expect(requests[0]?.params).toMatchObject({ mailboxId: 'inbox', cursor: 'c2' }) + expect(router.currentRoute.value.fullPath).toBe('/mail/inbox/m4') + }) + + it('마지막 메일이고 서버에도 더 없으면 다음 버튼이 꺼진다', async () => { + useMailStore().pageInfo = { hasNext: false, nextCursor: null, total: 3 } + const { wrapper } = await mountNav('m3') + + expect(wrapper.get('.nav-position').text()).toBe('3 / 3') + expect(wrapper.get('button[aria-label="다음 메일"]').attributes('disabled')).toBeDefined() + }) + + it('목록으로 — 바로 앞 기록이 그 목록이면 뒤로 가기를 쓴다 (브라우저 기록을 쌓지 않는다)', async () => { + // 메모리 history 는 history.state 를 쓰지 않으므로 이 경우만 실제 브라우저 history 로 확인한다 + const router = createRouter({ history: createWebHistory(), routes: createTestRouter().options.routes }) + await router.push('/mail/inbox') + await router.push('/mail/inbox/m2') + await router.isReady() + const wrapper = mount(ListReadNav, { + props: { mailboxId: 'inbox', messageId: 'm2' }, + global: { plugins: [pinia, router] }, + }) + + await wrapper.get('a.tool-button').trigger('click', { button: 0 }) + await vi.waitFor(() => expect(router.currentRoute.value.fullPath).toBe('/mail/inbox')) + + // 뒤로 간 것이라 앞으로 갈 기록(보던 메일)이 남아 있다 — 바꿔 끼웠다면 없다 + expect(router.options.history.state.forward).toBe('/mail/inbox/m2') + }) + + it('목록으로 — 목록으로 돌아가고, 보던 메일로 초점을 돌려주게 한다', async () => { + const { wrapper, router } = await mountNav('m2') + + await wrapper.get('a.tool-button').trigger('click', { button: 0 }) + await flushPromises() + + expect(router.currentRoute.value.fullPath).toBe('/mail/inbox') + expect(useMailViewStore().takeReturnFocus()).toBe('m2') + }) +}) diff --git a/frontend/src/components/mail/ListReadNav.vue b/frontend/src/components/mail/ListReadNav.vue new file mode 100644 index 0000000..87fcacb --- /dev/null +++ b/frontend/src/components/mail/ListReadNav.vue @@ -0,0 +1,148 @@ + + + + + diff --git a/frontend/src/components/mail/MailBodyFrame.spec.ts b/frontend/src/components/mail/MailBodyFrame.spec.ts new file mode 100644 index 0000000..50bab0d --- /dev/null +++ b/frontend/src/components/mail/MailBodyFrame.spec.ts @@ -0,0 +1,55 @@ +import { describe, expect, it } from 'vitest' +import { mount } from '@vue/test-utils' + +import { MAIL_FRAME_CSP } from '@/shared/utils/mail-html' +import MailBodyFrame from './MailBodyFrame.vue' + +// 보안 핵심 — 본문 iframe 의 격리 조건이 바뀌면 이 테스트가 깨져야 한다. +describe('MailBodyFrame', () => { + function frameOf(props: { htmlBody?: string | null; textBody?: string | null }) { + const wrapper = mount(MailBodyFrame, { props }) + return wrapper.get('iframe').element as HTMLIFrameElement + } + + it('sandbox 는 allow-same-origin · allow-popups · allow-popups-to-escape-sandbox 뿐이다', () => { + const frame = frameOf({ htmlBody: '

안녕하세요

' }) + const tokens = (frame.getAttribute('sandbox') ?? '').split(/\s+/).filter(Boolean).sort() + + expect(tokens).toEqual(['allow-popups', 'allow-popups-to-escape-sandbox', 'allow-same-origin']) + // 스크립트·폼은 절대 허용하지 않는다 (allow-same-origin 과 allow-scripts 를 같이 쓰면 격리가 무너진다) + expect(tokens).not.toContain('allow-scripts') + expect(tokens).not.toContain('allow-forms') + expect(tokens).not.toContain('allow-top-navigation') + }) + + it('본문은 srcdoc 으로만 넣고 외부 주소(src)를 쓰지 않는다', () => { + const frame = frameOf({ htmlBody: '

안녕하세요

' }) + + expect(frame.hasAttribute('src')).toBe(false) + expect(frame.getAttribute('srcdoc')).toContain('

안녕하세요

') + }) + + it('srcdoc 문서에 내부 CSP 와 가 들어간다', () => { + const srcdoc = frameOf({ htmlBody: '

본문

' }).getAttribute('srcdoc') ?? '' + + expect(srcdoc).toContain(`content="${MAIL_FRAME_CSP}"`) + expect(srcdoc).toContain('') + }) + + it('서버가 놓친 스크립트도 그리기 전에 지운다', () => { + const srcdoc = + frameOf({ htmlBody: '

본문

' }).getAttribute( + 'srcdoc', + ) ?? '' + + expect(srcdoc).not.toContain('alert(') + expect(srcdoc).not.toContain(' { + const srcdoc = frameOf({ htmlBody: null, textBody: '굵게 아님' }).getAttribute('srcdoc') ?? '' + + expect(srcdoc).toContain('<b>굵게</b> 아님') + expect(srcdoc).not.toContain('') + }) +}) diff --git a/frontend/src/components/mail/MailBodyFrame.vue b/frontend/src/components/mail/MailBodyFrame.vue new file mode 100644 index 0000000..9749143 --- /dev/null +++ b/frontend/src/components/mail/MailBodyFrame.vue @@ -0,0 +1,124 @@ + + +