diff --git a/.husky/pre-commit b/.husky/pre-commit index 1b26a13d..6780d4c7 100644 --- a/.husky/pre-commit +++ b/.husky/pre-commit @@ -3,3 +3,4 @@ task format task typecheck pnpm run lint +pnpm run typecheck diff --git a/.vscode/settings.json b/.vscode/settings.json index ccf15577..246aefe8 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -16,5 +16,5 @@ "**/node_modules/**", "**/dist/**", "*.config.ts" -], + ], } diff --git a/nginx/Dockerfile b/nginx/Dockerfile index e05b6041..b9e523fb 100644 --- a/nginx/Dockerfile +++ b/nginx/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1 -ARG NGINX_VERSION=1.29.6 +ARG NGINX_VERSION=1.29.7 ARG NODE_VERSION=24 ARG SHIB_MOD_VERSION=2.0.2 ARG HEADERS_MORE_VERSION=0.37 diff --git a/nginx/conf.d/app.dev.inc b/nginx/conf.d/app.dev.inc index 6842fb69..28a307f5 100644 --- a/nginx/conf.d/app.dev.inc +++ b/nginx/conf.d/app.dev.inc @@ -1,6 +1,6 @@ # Proxy requests to the application dev server -location ~ "_nuxt" { +location ~ ^/(_nuxt|_fonts)/ { proxy_pass http://app_server; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; diff --git a/nginx/conf.d/app.inc b/nginx/conf.d/app.inc index d4749409..a5c60e01 100644 --- a/nginx/conf.d/app.inc +++ b/nginx/conf.d/app.inc @@ -4,11 +4,13 @@ root /usr/share/nginx/html; index index.html; -location /_nuxt/ { +location ~ ^/(_nuxt|_fonts)/ { access_log off; log_not_found off; - try_files $uri $uri/ /index.html; + add_header Cache-Control "public, immutable"; + + try_files $uri =404; } location / { diff --git a/nuxt.config.ts b/nuxt.config.ts index 3982d426..327b7a68 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -23,7 +23,7 @@ export default defineNuxtConfig({ srcDir: 'src/app/', - compatibilityDate: '2026-03-04', + compatibilityDate: '2026-03-23', vite: { vue: { diff --git a/package.json b/package.json index 1b6fe8cc..aa00ae30 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "jairocloud-groups-manager", "private": true, "type": "module", - "version": "1.0.0-alpha.1", + "version": "1.0.0-alpha.2", "description": "A web client for JAIRO Cloud repository administrators to manage groups in the GakuNin Cloud Gateway.", "license": "MIT", "author": { @@ -24,8 +24,8 @@ "dependencies": { "@iconify-json/lucide": "^1.2.98", "@nuxt/content": "^3.12.0", - "@nuxt/ui": "^4.5.1", - "@nuxtjs/i18n": "^10.2.3", + "@nuxt/ui": "^4.6.0", + "@nuxtjs/i18n": "^10.2.4", "@pinia/nuxt": "^0.11.3", "@vueuse/nuxt": "^14.2.1", "nuxt": "^4.4.2", @@ -42,13 +42,13 @@ "eslint": "^10.1.0", "eslint-plugin-unicorn": "^63.0.0", "husky": "^9.1.7", - "typescript": "^5.9.3", + "typescript": "^6.0.2", "vue-tsc": "^3.2.6" }, "engines": { "node": "^24.14.0", - "pnpm": "^10.32.0", + "pnpm": "^10.33.0", "npm": "please_use_pnpm_instead" }, - "packageManager": "pnpm@10.32.1" + "packageManager": "pnpm@10.33.0" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ec0d5f05..57ceaa74 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -15,30 +15,30 @@ importers: specifier: ^3.12.0 version: 3.12.0(better-sqlite3@12.8.0)(magicast@0.5.2) '@nuxt/ui': - specifier: ^4.5.1 - version: 4.5.1(@nuxt/content@3.12.0(better-sqlite3@12.8.0)(magicast@0.5.2))(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(change-case@5.4.4)(db0@0.3.4(better-sqlite3@12.8.0))(embla-carousel@8.6.0)(ioredis@5.10.0)(magicast@0.5.2)(tailwindcss@4.2.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.28)(zod@3.25.76) + specifier: ^4.6.0 + version: 4.6.0(@nuxt/content@3.12.0(better-sqlite3@12.8.0)(magicast@0.5.2))(@tiptap/extensions@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(change-case@5.4.4)(db0@0.3.4(better-sqlite3@12.8.0))(embla-carousel@8.6.0)(ioredis@5.10.0)(magicast@0.5.2)(tailwindcss@4.2.2)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-router@5.0.4(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2))(yjs@13.6.28)(zod@3.25.76) '@nuxtjs/i18n': - specifier: ^10.2.3 - version: 10.2.3(@vue/compiler-dom@3.5.30)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(magicast@0.5.2)(rollup@4.59.0)(vue@3.5.30(typescript@5.9.3)) + specifier: ^10.2.4 + version: 10.2.4(@vue/compiler-dom@3.5.30)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(magicast@0.5.2)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup@4.59.0)(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)) '@pinia/nuxt': specifier: ^0.11.3 - version: 0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3))) + version: 0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2))) '@vueuse/nuxt': specifier: ^14.2.1 - version: 14.2.1(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + version: 14.2.1(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2)) nuxt: specifier: ^4.4.2 - version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2) + version: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2) pinia: specifier: ^3.0.4 - version: 3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)) + version: 3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)) scule: specifier: ^1.3.0 version: 1.3.0 devDependencies: '@commitlint/cli': specifier: ^20.5.0 - version: 20.5.0(@types/node@25.2.0)(conventional-commits-parser@6.3.0)(typescript@5.9.3) + version: 20.5.0(@types/node@25.2.0)(conventional-commits-parser@6.3.0)(typescript@6.0.2) '@commitlint/config-conventional': specifier: ^20.5.0 version: 20.5.0 @@ -47,10 +47,10 @@ importers: version: 20.5.0 '@nuxt/eslint': specifier: ^1.15.2 - version: 1.15.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(magicast@0.5.2)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 1.15.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(magicast@0.5.2)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) '@nuxt/test-utils': specifier: 4.0.0 - version: 4.0.0(magicast@0.5.2)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + version: 4.0.0(magicast@0.5.2)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) better-sqlite3: specifier: ^12.8.0 version: 12.8.0 @@ -64,11 +64,11 @@ importers: specifier: ^9.1.7 version: 9.1.7 typescript: - specifier: ^5.9.3 - version: 5.9.3 + specifier: ^6.0.2 + version: 6.0.2 vue-tsc: specifier: ^3.2.6 - version: 3.2.6(typescript@5.9.3) + version: 3.2.6(typescript@6.0.2) docs: dependencies: @@ -77,7 +77,7 @@ importers: version: 3.12.0(better-sqlite3@12.6.2)(magicast@0.5.2) '@nuxt/ui': specifier: ^4.5.1 - version: 4.5.1(@nuxt/content@3.12.0(better-sqlite3@12.6.2)(magicast@0.5.2))(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(change-case@5.4.4)(db0@0.3.4(better-sqlite3@12.6.2))(embla-carousel@8.6.0)(ioredis@5.10.0)(magicast@0.5.2)(tailwindcss@4.2.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.28)(zod@3.25.76) + version: 4.5.1(@nuxt/content@3.12.0(better-sqlite3@12.6.2)(magicast@0.5.2))(@tiptap/extensions@3.20.5(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(change-case@5.4.4)(db0@0.3.4(better-sqlite3@12.6.2))(embla-carousel@8.6.0)(ioredis@5.10.0)(magicast@0.5.2)(tailwindcss@4.2.2)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.28)(zod@3.25.76) nuxt: specifier: ^4.3.1 version: 4.3.1(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.6.2)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.6.2))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2) @@ -999,6 +999,10 @@ packages: resolution: {integrity: sha512-8i3uRdAxCGzuHwfmHcVjeLQBtysQB2aXl/ojoagDut5/gY5lvWCQ2+cnl2TiqE/fXj/D8EhWG/SLKA7qz4a3QA==} engines: {node: '>= 18'} + '@intlify/utils@0.14.1': + resolution: {integrity: sha512-/NVDhX6sG87h0PXIwUCTW9DeHbKeqlni6qVV8xzMULQRHE9azIETldBlTKaBji7z6ostyDIH4s6SWI3AAI4uFg==} + engines: {node: '>= 20'} + '@intlify/vue-i18n-extensions@8.0.0': resolution: {integrity: sha512-w0+70CvTmuqbskWfzeYhn0IXxllr6mU+IeM2MU0M+j9OW64jkrvqY+pYFWrUnIIC9bEdij3NICruicwd5EgUuQ==} engines: {node: '>= 18'} @@ -1296,6 +1300,39 @@ packages: zod: optional: true + '@nuxt/ui@4.6.0': + resolution: {integrity: sha512-AcoM3bljDvxd4PGfzDbY4zyyy9Zsajfagr3il1iki7G8Ji3SG6Xsgy+weug+Hyp76YM5919oc6ciJmram5bf6A==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + peerDependencies: + '@inertiajs/vue3': ^2.0.7 + '@nuxt/content': ^3.0.0 + joi: ^18.0.0 + superstruct: ^2.0.0 + tailwindcss: ^4.0.0 + typescript: ^5.6.3 + valibot: ^1.0.0 + vue-router: ^4.5.0 || ^5.0.0 + yup: ^1.7.0 + zod: ^3.24.0 || ^4.0.0 + peerDependenciesMeta: + '@inertiajs/vue3': + optional: true + '@nuxt/content': + optional: true + joi: + optional: true + superstruct: + optional: true + valibot: + optional: true + vue-router: + optional: true + yup: + optional: true + zod: + optional: true + '@nuxt/vite-builder@4.3.1': resolution: {integrity: sha512-LndnxPJzDUDbWAB8q5gZZN1mSOLHEyMOoj4T3pTdPydGf31QZdMR0V1fQ1fdRgtgNtWB3WLP0d1ZfaAOITsUpw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1330,8 +1367,8 @@ packages: '@nuxtjs/color-mode@3.5.2': resolution: {integrity: sha512-cC6RfgZh3guHBMLLjrBB2Uti5eUoGM9KyauOaYS9ETmxNWBMTvpgjvSiSJp1OFljIXPIqVTJ3xtJpSNZiO3ZaA==} - '@nuxtjs/i18n@10.2.3': - resolution: {integrity: sha512-nRAQJbWjbiBvW6XRsG3Q6olYw2EKz7V1J6cDCHLCPbF1EyNhrAH/9aCNQaR5PYcoXPeRLpF86DIPBEnamghyHw==} + '@nuxtjs/i18n@10.2.4': + resolution: {integrity: sha512-T5nN7hT/tbExant+CeXtKXs9GbjWsEWnymCHJyU3Ujxfcw1WQsZZP6tyEtFRhkwjBwy8m4mj7GtU2qUCggUkkg==} engines: {node: '>=20.11.1'} '@nuxtjs/mdc@0.20.2': @@ -1615,12 +1652,6 @@ packages: cpu: [arm64] os: [android] - '@oxc-parser/binding-android-arm64@0.95.0': - resolution: {integrity: sha512-dZyxhhvJigwWL1wgnLlqyEiSeuqO0WdDH9H+if0dPcBM4fKa5fjVkaUcJT1jBMcBTnkjxMwTXYZy5TK60N0fjg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - '@oxc-parser/binding-darwin-arm64@0.112.0': resolution: {integrity: sha512-fh6/KQL/cbH5DukT3VkdCqnULLuvVnszVKySD5IgSE0WZb32YZo/cPsPdEv052kk6w3N4agu+NTiMnZjcvhUIg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1633,12 +1664,6 @@ packages: cpu: [arm64] os: [darwin] - '@oxc-parser/binding-darwin-arm64@0.95.0': - resolution: {integrity: sha512-zun9+V33kyCtNec9oUSWwb0qi3fB8pXwum1yGFECPEr55g/CrWju6/Jv4hwwNBeW2tK9Ch/PRstEtYmOLMhHpg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@oxc-parser/binding-darwin-x64@0.112.0': resolution: {integrity: sha512-vUBOOY1E30vlu/DoTGDoT1UbLlwu5Yv9tqeBabAwRzwNDz8Skho16VKhsBDUiyqddtpsR3//v6vNk38w4c+6IA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1651,12 +1676,6 @@ packages: cpu: [x64] os: [darwin] - '@oxc-parser/binding-darwin-x64@0.95.0': - resolution: {integrity: sha512-9djMQ/t6Ns/UXtziwUe562uVJMbhtuLtCj+Xav+HMVT/rhV9gWO8PQOG7AwDLUBjJanItsrfqrGtqhNxtZ701w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@oxc-parser/binding-freebsd-x64@0.112.0': resolution: {integrity: sha512-hnEtO/9AVnYWzrgnp6L+oPs/6UqlFeteUL6n7magkd2tttgmx1C01hyNNh6nTpZfLzEVJSNJ0S+4NTsK2q2CxA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1669,12 +1688,6 @@ packages: cpu: [x64] os: [freebsd] - '@oxc-parser/binding-freebsd-x64@0.95.0': - resolution: {integrity: sha512-GK6k0PgCVkkeRZtHgcosCYbXIRySpJpuPw/OInfLGFh8f3x9gp2l8Fbcfx+YO+ZOHFBCd2NNedGqw8wMgouxfA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@oxc-parser/binding-linux-arm-gnueabihf@0.112.0': resolution: {integrity: sha512-WxJrUz3pcIc2hp4lvJbvt/sTL33oX9NPvkD3vDDybE6tc0V++rS+hNOJxwXdD2FDIFPkHs/IEn5asEZFVH+VKw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1687,12 +1700,6 @@ packages: cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-gnueabihf@0.95.0': - resolution: {integrity: sha512-+g/lFITtyHHEk69cunOHuiT5cX+mpUTcbGYNe8suguZ7FqgNwai+PnGv0ctCvtgxBPVfckfUK8c3RvFKo+vi/w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.112.0': resolution: {integrity: sha512-jj8A8WWySaJQqM9XKAIG8U2Q3qxhFQKrXPWv98d1oC35at+L1h+C+V4M3l8BAKhpHKCu3dYlloaAbHd5q1Hw6A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1705,12 +1712,6 @@ packages: cpu: [arm] os: [linux] - '@oxc-parser/binding-linux-arm-musleabihf@0.95.0': - resolution: {integrity: sha512-SXNasDtPw8ycNV7VEvFxb4LETmykvWKUhHR7K3us818coXYpDj54P8WEx8hJobP/9skuuiFuKHmtYLdjX8wntA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-parser/binding-linux-arm64-gnu@0.112.0': resolution: {integrity: sha512-G2F8H6FcAExVK5vvhpSh61tqWx5QoaXXUnSsj5FyuDiFT/K7AMMVSQVqnZREDc+YxhrjB0vnKjCcuobXK63kIw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1725,13 +1726,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-arm64-gnu@0.95.0': - resolution: {integrity: sha512-0LzebARTU0ROfD6pDK4h1pFn+09meErCZ0MA2TaW08G72+GNneEsksPufOuI+9AxVSRa+jKE3fu0wavvhZgSkg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@oxc-parser/binding-linux-arm64-musl@0.112.0': resolution: {integrity: sha512-3R0iqjM3xYOZCnwgcxOQXH7hrz64/USDIuLbNTM1kZqQzRqaR4w7SwoWKU934zABo8d0op2oSwOp+CV3hZnM7A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1746,13 +1740,6 @@ packages: os: [linux] libc: [musl] - '@oxc-parser/binding-linux-arm64-musl@0.95.0': - resolution: {integrity: sha512-Pvi1lGe/G+mJZ3hUojMP/aAHAzHA25AEtVr8/iuz7UV72t/15NOgJYr9kELMUMNjPqpr3vKUgXTFmTtAxp11Qw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@oxc-parser/binding-linux-ppc64-gnu@0.112.0': resolution: {integrity: sha512-lAQf8PQxfgy7h0bmcfSVE3hg3qMueshPYULFsCrHM+8KefGZ9W+ZMvRyU33gLrB4w1O3Fz1orR0hmKMCRxXNrQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1781,13 +1768,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-riscv64-gnu@0.95.0': - resolution: {integrity: sha512-pUEVHIOVNDfhk4sTlLhn6mrNENhE4/dAwemxIfqpcSyBlYG0xYZND1F3jjR2yWY6DakXZ6VSuDbtiv1LPNlOLw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@oxc-parser/binding-linux-riscv64-musl@0.112.0': resolution: {integrity: sha512-v06iu0osHszgqJ1dLQRb6leWFU1sjG/UQk4MoVBtE6ZPewgfTkby6G9II1SpEAf2onnAuQceVYxQH9iuU3NJqw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1816,13 +1796,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-s390x-gnu@0.95.0': - resolution: {integrity: sha512-5+olaepHTE3J/+w7g0tr3nocvv5BKilAJnzj4L8tWBCLEZbL6olJcGVoldUO+3cgg1SO1xJywP5BuLhT0mDUDw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.112.0': resolution: {integrity: sha512-jKwO7ZLNkjxwg7FoCLw+fJszooL9yXRZsDN0AQ1AQUTWq1l8GH/2e44k68N3fcP19jl8O8jGpqLAZcQTYk6skA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1837,13 +1810,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-parser/binding-linux-x64-gnu@0.95.0': - resolution: {integrity: sha512-8huzHlK/N98wrnYKxIcYsK8ZGBWomQchu/Mzi6m+CtbhjWOv9DmK0jQ2fUWImtluQVpTwS0uZT06d3g7XIkJrA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@oxc-parser/binding-linux-x64-musl@0.112.0': resolution: {integrity: sha512-TYqnuKV/p3eOc+N61E0961nA7DC+gaCeJ3+V2LcjJdTwFMdikqWL6uVk1jlrpUCBrozHDATVUKDZYH7r4FQYjQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1858,13 +1824,6 @@ packages: os: [linux] libc: [musl] - '@oxc-parser/binding-linux-x64-musl@0.95.0': - resolution: {integrity: sha512-bWnrLfGDcx/fab0+UQnFbVFbiykof/btImbYf+cI2pU/1Egb2x+OKSmM5Qt0nEUiIpM5fgJmYXxTopybSZOKYA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@oxc-parser/binding-openharmony-arm64@0.112.0': resolution: {integrity: sha512-ZhrVmWFifVEFQX4XPwLoVFDHw9tAWH9p9vHsHFH+5uCKdfVR+jje4WxVo6YrokWCboGckoOzHq5KKMOcPZfkRg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1887,11 +1846,6 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-parser/binding-wasm32-wasi@0.95.0': - resolution: {integrity: sha512-0JLyqkZu1HnQIZ4e5LBGOtzqua1QwFEUOoMSycdoerXqayd4LK2b7WMfAx8eCIf+jGm1Uj6f3R00nlsx8g1faQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - '@oxc-parser/binding-win32-arm64-msvc@0.112.0': resolution: {integrity: sha512-t5CDLbU70Ea88bGRhvU/dLJTc/Wcrtf2Jp534E8P3cgjAvHDjdKsfDDqBZrhybJ8Jv9v9vW5ngE40EK51BluDA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1904,12 +1858,6 @@ packages: cpu: [arm64] os: [win32] - '@oxc-parser/binding-win32-arm64-msvc@0.95.0': - resolution: {integrity: sha512-RWvaA6s1SYlBj9CxwHfNn0CRlkPdv9fEUAXfZkGQPdP5e1ppIaO2KYE0sUov/zzp9hPTMMsTMHl4dcIbb+pHCQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@oxc-parser/binding-win32-ia32-msvc@0.112.0': resolution: {integrity: sha512-rZH0JynCCwnhe2HfRoyNOl/Kfd9pudoWxgpC5OZhj7j77pMK0UOAa35hYDfrtSOUk2HLzrikV5dPUOY2DpSBSA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1934,21 +1882,12 @@ packages: cpu: [x64] os: [win32] - '@oxc-parser/binding-win32-x64-msvc@0.95.0': - resolution: {integrity: sha512-BQpgl7rDjFvCIHudmUR0dCwc4ylBYZl4CPVinlD3NhkMif4WD5dADckoo5ES/KOpFyvwcbKZX+grP63cjHi26g==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@oxc-project/types@0.112.0': resolution: {integrity: sha512-m6RebKHIRsax2iCwVpYW2ErQwa4ywHJrE4sCK3/8JK8ZZAWOKXaRJFl/uP51gaVyyXlaS4+chU1nSCdzYf6QqQ==} '@oxc-project/types@0.117.0': resolution: {integrity: sha512-C/kPXBphID44fXdsa2xSOCuzX8fKZiFxPsvucJ6Yfkr6CJlMA+kNLPNKyLoI+l9XlDsNxBrz6h7IIjKU8pB69w==} - '@oxc-project/types@0.95.0': - resolution: {integrity: sha512-vACy7vhpMPhjEJhULNxrdR0D943TkA/MigMpJCHmBHvMXxRStRi/dPtTlfQ3uDwWSzRpT8z+7ImjZVf8JWBocQ==} - '@oxc-transform/binding-android-arm-eabi@0.112.0': resolution: {integrity: sha512-r4LuBaPnOAi0eUOBNi880Fm2tO2omH7N1FRrL6+nyz/AjQ+QPPLtoyZJva0O+sKi1buyN/7IzM5p9m+5ANSDbg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1973,12 +1912,6 @@ packages: cpu: [arm64] os: [android] - '@oxc-transform/binding-android-arm64@0.95.0': - resolution: {integrity: sha512-eW+BCgRWOsMrDiz7FEV7BjAmaF9lGIc2ueGdRUYjRUMq4f5FSGS7gMBTYDxajdoIB3L5Gnksh1CWkIlgg95UVA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [android] - '@oxc-transform/binding-darwin-arm64@0.112.0': resolution: {integrity: sha512-ddbmLU3Tr+i7MOynfwAXxUXud3SjJKlv7XNjaq08qiI8Av/QvhXVGc2bMhXkWQSMSBUeTDoiughKjK+Zsb6y/A==} engines: {node: ^20.19.0 || >=22.12.0} @@ -1991,12 +1924,6 @@ packages: cpu: [arm64] os: [darwin] - '@oxc-transform/binding-darwin-arm64@0.95.0': - resolution: {integrity: sha512-OUUaYZVss8tyDZZ7TGr2vnH3+i3Ouwsx0frQRGkiePNatXxaJJ3NS5+Kwgi9hh3WryXaQz2hWji4AM2RHYE7Cg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [darwin] - '@oxc-transform/binding-darwin-x64@0.112.0': resolution: {integrity: sha512-TKvmNw96jQZPqYb4pRrzLFDailNB3YS14KNn+x2hwRbqc6CqY96S9PYwyOpVpYdxfoRjYO9WgX9SoS+62a1DPA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2009,12 +1936,6 @@ packages: cpu: [x64] os: [darwin] - '@oxc-transform/binding-darwin-x64@0.95.0': - resolution: {integrity: sha512-49UPEgIlgWUndwcP3LH6dvmOewZ92DxCMpFMo11JhUlmNJxA3sjVImEBRB56/tJ+XF+xnya9kB1oCW4yRY+mRw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [darwin] - '@oxc-transform/binding-freebsd-x64@0.112.0': resolution: {integrity: sha512-YPMkSCDaelO8HHYRMYjm+Q+IfkfIbdtQzwPuasItYkq8UUkNeHNPheNh2JkvQa3c+io3E9ePOgHQ2yihpk7o/Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2027,12 +1948,6 @@ packages: cpu: [x64] os: [freebsd] - '@oxc-transform/binding-freebsd-x64@0.95.0': - resolution: {integrity: sha512-lNKrHKaDEm8pbKlVbn0rv2L97O0lbA0Tsrxx4GF/HhmdW+NgwGU1pMzZ4tB2QcylbqgKxOB+v9luebHyh1jfgA==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [freebsd] - '@oxc-transform/binding-linux-arm-gnueabihf@0.112.0': resolution: {integrity: sha512-nA7kzQGNEpuTRknst/IJ3l8hqmDmEda3aun6jkXgp7gKxESjuHeaNH04mKISxvJ7fIacvP2g/wtTSnm4u5jL8Q==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2045,12 +1960,6 @@ packages: cpu: [arm] os: [linux] - '@oxc-transform/binding-linux-arm-gnueabihf@0.95.0': - resolution: {integrity: sha512-+VWcLeeizI8IjU+V+o8AmzPuIMiTrGr0vrmXU3CEsV05MrywCuJU+f6ilPs3JBKno9VIwqvRpHB/z39sQabHWg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-transform/binding-linux-arm-musleabihf@0.112.0': resolution: {integrity: sha512-w8GuLmckKlGc3YujaZKhtbFxziCcosvM2l9GnQjCb/yENWLGDiyQOy0BTAgPGdJwpYTiOeJblEXSuXYvlE1Ong==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2063,12 +1972,6 @@ packages: cpu: [arm] os: [linux] - '@oxc-transform/binding-linux-arm-musleabihf@0.95.0': - resolution: {integrity: sha512-a59xPw84t6VwlvNEGcmuw3feGcKcWOC7uB8oePJ/BVSAV1yayLoB3k6JASwLTZ7N/PNPNUhcw1jDxowgAfBJfg==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm] - os: [linux] - '@oxc-transform/binding-linux-arm64-gnu@0.112.0': resolution: {integrity: sha512-9LwwGnJ8+WT0rXcrI8M0RJtDNt91eMqcDPPEvJxhRFHIMcHTy5D5xT+fOl3Us0yMqKo3HUWkbfUYqAp4GoZ3Jw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2083,13 +1986,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-arm64-gnu@0.95.0': - resolution: {integrity: sha512-NLdrFuEHlmbiC1M1WESFV4luUcB/84GXi+cbnRXhgMjIW/CThRVJ989eTJy59QivkVlLcJSKTiKiKCt0O6TTlQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [glibc] - '@oxc-transform/binding-linux-arm64-musl@0.112.0': resolution: {integrity: sha512-Lg6VOuSd3oXv7J0eGywgqh/086h+qQzIBOD+47pYKMTTJcbDe+f3h/RgGoMKJE5HhiwT5sH1aGEJfIfaYUiVSw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2104,13 +2000,6 @@ packages: os: [linux] libc: [musl] - '@oxc-transform/binding-linux-arm64-musl@0.95.0': - resolution: {integrity: sha512-GL0ffCPW8JlFI0/jeSgCY665yDdojHxA0pbYG+k8oEHOWCYZUZK9AXL+r0oerNEWYJ8CRB+L5Yq87ZtU/YUitw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [linux] - libc: [musl] - '@oxc-transform/binding-linux-ppc64-gnu@0.112.0': resolution: {integrity: sha512-PXzmj82o1moA4IGphYImTRgc2youTi4VRfyFX3CHwLjxPcQ5JtcsgbDt4QUdOzXZ+zC07s5jf2ZzhRapEOlj2w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2139,13 +2028,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-riscv64-gnu@0.95.0': - resolution: {integrity: sha512-tbH7LaClSmN3YFVo1UjMSe7D6gkb5f+CMIbj9i873UUZomVRmAjC4ygioObfzM+sj/tX0WoTXx5L1YOfQkHL6Q==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [riscv64] - os: [linux] - libc: [glibc] - '@oxc-transform/binding-linux-riscv64-musl@0.112.0': resolution: {integrity: sha512-cXWFb7z+2IjFUEcXtRwluq9oEG5qnyFCjiu3SWrgYNcWwPdHusv3I/7K5/CTbbi4StoZ5txbi7/iSfDHNyWuRw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2174,13 +2056,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-s390x-gnu@0.95.0': - resolution: {integrity: sha512-8jMqiURWa0iTiPMg7BWaln89VdhhWzNlPyKM90NaFVVhBIKCr2UEhrQWdpBw/E9C8uWf/4VabBEhfPMK+0yS4w==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [s390x] - os: [linux] - libc: [glibc] - '@oxc-transform/binding-linux-x64-gnu@0.112.0': resolution: {integrity: sha512-ST1MDT+TlOyZ1c5btrGinRSUW2Jf4Pa+0gdKwsyjDSOC3dxy2ZNkN3mosTf4ywc3J+mxfYKqtjs7zSwHz03ILA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2195,13 +2070,6 @@ packages: os: [linux] libc: [glibc] - '@oxc-transform/binding-linux-x64-gnu@0.95.0': - resolution: {integrity: sha512-D5ULJ2uWipsTgfvHIvqmnGkCtB3Fyt2ZN7APRjVO+wLr+HtmnaWddKsLdrRWX/m/6nQ2xQdoQekdJrokYK9LtQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [glibc] - '@oxc-transform/binding-linux-x64-musl@0.112.0': resolution: {integrity: sha512-ISQoA3pD4cyTGpf9sXXeerH6pL2L6EIpdy6oAy2ttkswyVFDyQNVOVIGIdLZDgbpmqGljxZnWqt/J/N68pQaig==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2216,13 +2084,6 @@ packages: os: [linux] libc: [musl] - '@oxc-transform/binding-linux-x64-musl@0.95.0': - resolution: {integrity: sha512-DmCGU+FzRezES5wVAGVimZGzYIjMOapXbWpxuz8M8p3nMrfdBEQ5/tpwBp2vRlIohhABy4vhHJByl4c64ENCGQ==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [linux] - libc: [musl] - '@oxc-transform/binding-openharmony-arm64@0.112.0': resolution: {integrity: sha512-UOGVrGIv7yLJovyEXEyUTADuLq98vd/cbMHFLJweRXD+11I8Tn4jASi4WzdsN8C3BVYGRHrXH2NlSBmhz33a4g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2245,11 +2106,6 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@oxc-transform/binding-wasm32-wasi@0.95.0': - resolution: {integrity: sha512-tSo1EU4Whd1gXyae7cwSDouhppkuz6Jkd5LY8Uch9VKsHVSRhDLDW19Mq6VSwtyPxDPTJnJ2jYJWm+n8SYXiXQ==} - engines: {node: '>=14.0.0'} - cpu: [wasm32] - '@oxc-transform/binding-win32-arm64-msvc@0.112.0': resolution: {integrity: sha512-EgXef9kOne9BNsbYBbuRqxk2hteT0xsAGcx/VbtCBMJYNj8fANFhT271DUSOgfa4DAgrQQmsyt/Kr1aV9mpU9w==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2262,12 +2118,6 @@ packages: cpu: [arm64] os: [win32] - '@oxc-transform/binding-win32-arm64-msvc@0.95.0': - resolution: {integrity: sha512-6eaxlgj+J5n8zgJTSugqdPLBtKGRqvxYLcvHN8b+U9hVhF/2HG/JCOrcSYV/XgWGNPQiaRVzpR3hGhmFro9QTw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [arm64] - os: [win32] - '@oxc-transform/binding-win32-ia32-msvc@0.112.0': resolution: {integrity: sha512-6QaB0qjNaou2YR+blncHdw7j0e26IOwOIjLbhVGDeuf9+4rjJeiqRXJ2hOtCcS4zblnao/MjdgQuZ3fM0nl+Kw==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2292,12 +2142,6 @@ packages: cpu: [x64] os: [win32] - '@oxc-transform/binding-win32-x64-msvc@0.95.0': - resolution: {integrity: sha512-Y8JY79A7fTuBjEXZFu+mHbHzgsV3uJDUuUKeGffpOwI1ayOGCKeBJTiMhksYkiir1xS+DkGLEz73+xse9Is9rw==} - engines: {node: ^20.19.0 || >=22.12.0} - cpu: [x64] - os: [win32] - '@package-json/types@0.0.12': resolution: {integrity: sha512-uu43FGU34B5VM9mCNjXCwLaGHYjXdNincqKLaraaCW+7S2+SmiBg1Nv8bPnmschrIfZmfKNY9f3fC376MRrObw==} @@ -2748,36 +2592,69 @@ packages: '@tailwindcss/node@4.2.1': resolution: {integrity: sha512-jlx6sLk4EOwO6hHe1oCGm1Q4AN/s0rSrTTPBGPM0/RQ6Uylwq17FuU8IeJJKEjtc6K6O07zsvP+gDO6MMWo7pg==} + '@tailwindcss/node@4.2.2': + resolution: {integrity: sha512-pXS+wJ2gZpVXqFaUEjojq7jzMpTGf8rU6ipJz5ovJV6PUGmlJ+jvIwGrzdHdQ80Sg+wmQxUFuoW1UAAwHNEdFA==} + '@tailwindcss/oxide-android-arm64@4.2.1': resolution: {integrity: sha512-eZ7G1Zm5EC8OOKaesIKuw77jw++QJ2lL9N+dDpdQiAB/c/B2wDh0QPFHbkBVrXnwNugvrbJFk1gK2SsVjwWReg==} engines: {node: '>= 20'} cpu: [arm64] os: [android] + '@tailwindcss/oxide-android-arm64@4.2.2': + resolution: {integrity: sha512-dXGR1n+P3B6748jZO/SvHZq7qBOqqzQ+yFrXpoOWWALWndF9MoSKAT3Q0fYgAzYzGhxNYOoysRvYlpixRBBoDg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [android] + '@tailwindcss/oxide-darwin-arm64@4.2.1': resolution: {integrity: sha512-q/LHkOstoJ7pI1J0q6djesLzRvQSIfEto148ppAd+BVQK0JYjQIFSK3JgYZJa+Yzi0DDa52ZsQx2rqytBnf8Hw==} engines: {node: '>= 20'} cpu: [arm64] os: [darwin] + '@tailwindcss/oxide-darwin-arm64@4.2.2': + resolution: {integrity: sha512-iq9Qjr6knfMpZHj55/37ouZeykwbDqF21gPFtfnhCCKGDcPI/21FKC9XdMO/XyBM7qKORx6UIhGgg6jLl7BZlg==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.2.1': resolution: {integrity: sha512-/f/ozlaXGY6QLbpvd/kFTro2l18f7dHKpB+ieXz+Cijl4Mt9AI2rTrpq7V+t04nK+j9XBQHnSMdeQRhbGyt6fw==} engines: {node: '>= 20'} cpu: [x64] os: [darwin] + '@tailwindcss/oxide-darwin-x64@4.2.2': + resolution: {integrity: sha512-BlR+2c3nzc8f2G639LpL89YY4bdcIdUmiOOkv2GQv4/4M0vJlpXEa0JXNHhCHU7VWOKWT/CjqHdTP8aUuDJkuw==} + engines: {node: '>= 20'} + cpu: [x64] + os: [darwin] + '@tailwindcss/oxide-freebsd-x64@4.2.1': resolution: {integrity: sha512-5e/AkgYJT/cpbkys/OU2Ei2jdETCLlifwm7ogMC7/hksI2fC3iiq6OcXwjibcIjPung0kRtR3TxEITkqgn0TcA==} engines: {node: '>= 20'} cpu: [x64] os: [freebsd] + '@tailwindcss/oxide-freebsd-x64@4.2.2': + resolution: {integrity: sha512-YUqUgrGMSu2CDO82hzlQ5qSb5xmx3RUrke/QgnoEx7KvmRJHQuZHZmZTLSuuHwFf0DJPybFMXMYf+WJdxHy/nQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [freebsd] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': resolution: {integrity: sha512-Uny1EcVTTmerCKt/1ZuKTkb0x8ZaiuYucg2/kImO5A5Y/kBz41/+j0gxUZl+hTF3xkWpDmHX+TaWhOtba2Fyuw==} engines: {node: '>= 20'} cpu: [arm] os: [linux] + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + resolution: {integrity: sha512-FPdhvsW6g06T9BWT0qTwiVZYE2WIFo2dY5aCSpjG/S/u1tby+wXoslXS0kl3/KXnULlLr1E3NPRRw0g7t2kgaQ==} + engines: {node: '>= 20'} + cpu: [arm] + os: [linux] + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': resolution: {integrity: sha512-CTrwomI+c7n6aSSQlsPL0roRiNMDQ/YzMD9EjcR+H4f0I1SQ8QqIuPnsVp7QgMkC1Qi8rtkekLkOFjo7OlEFRQ==} engines: {node: '>= 20'} @@ -2785,6 +2662,13 @@ packages: os: [linux] libc: [glibc] + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + resolution: {integrity: sha512-4og1V+ftEPXGttOO7eCmW7VICmzzJWgMx+QXAJRAhjrSjumCwWqMfkDrNu1LXEQzNAwz28NCUpucgQPrR4S2yw==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [glibc] + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': resolution: {integrity: sha512-WZA0CHRL/SP1TRbA5mp9htsppSEkWuQ4KsSUumYQnyl8ZdT39ntwqmz4IUHGN6p4XdSlYfJwM4rRzZLShHsGAQ==} engines: {node: '>= 20'} @@ -2792,6 +2676,13 @@ packages: os: [linux] libc: [musl] + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + resolution: {integrity: sha512-oCfG/mS+/+XRlwNjnsNLVwnMWYH7tn/kYPsNPh+JSOMlnt93mYNCKHYzylRhI51X+TbR+ufNhhKKzm6QkqX8ag==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [linux] + libc: [musl] + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': resolution: {integrity: sha512-qMFzxI2YlBOLW5PhblzuSWlWfwLHaneBE0xHzLrBgNtqN6mWfs+qYbhryGSXQjFYB1Dzf5w+LN5qbUTPhW7Y5g==} engines: {node: '>= 20'} @@ -2799,6 +2690,13 @@ packages: os: [linux] libc: [glibc] + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + resolution: {integrity: sha512-rTAGAkDgqbXHNp/xW0iugLVmX62wOp2PoE39BTCGKjv3Iocf6AFbRP/wZT/kuCxC9QBh9Pu8XPkv/zCZB2mcMg==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [glibc] + '@tailwindcss/oxide-linux-x64-musl@4.2.1': resolution: {integrity: sha512-5r1X2FKnCMUPlXTWRYpHdPYUY6a1Ar/t7P24OuiEdEOmms5lyqjDRvVY1yy9Rmioh+AunQ0rWiOTPE8F9A3v5g==} engines: {node: '>= 20'} @@ -2806,6 +2704,13 @@ packages: os: [linux] libc: [musl] + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + resolution: {integrity: sha512-XW3t3qwbIwiSyRCggeO2zxe3KWaEbM0/kW9e8+0XpBgyKU4ATYzcVSMKteZJ1iukJ3HgHBjbg9P5YPRCVUxlnQ==} + engines: {node: '>= 20'} + cpu: [x64] + os: [linux] + libc: [musl] + '@tailwindcss/oxide-wasm32-wasi@4.2.1': resolution: {integrity: sha512-MGFB5cVPvshR85MTJkEvqDUnuNoysrsRxd6vnk1Lf2tbiqNlXpHYZqkqOQalydienEWOHHFyyuTSYRsLfxFJ2Q==} engines: {node: '>=14.0.0'} @@ -2818,30 +2723,66 @@ packages: - '@emnapi/wasi-threads' - tslib + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + resolution: {integrity: sha512-eKSztKsmEsn1O5lJ4ZAfyn41NfG7vzCg496YiGtMDV86jz1q/irhms5O0VrY6ZwTUkFy/EKG3RfWgxSI3VbZ8Q==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + bundledDependencies: + - '@napi-rs/wasm-runtime' + - '@emnapi/core' + - '@emnapi/runtime' + - '@tybys/wasm-util' + - '@emnapi/wasi-threads' + - tslib + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': resolution: {integrity: sha512-YlUEHRHBGnCMh4Nj4GnqQyBtsshUPdiNroZj8VPkvTZSoHsilRCwXcVKnG9kyi0ZFAS/3u+qKHBdDc81SADTRA==} engines: {node: '>= 20'} cpu: [arm64] os: [win32] + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + resolution: {integrity: sha512-qPmaQM4iKu5mxpsrWZMOZRgZv1tOZpUm+zdhhQP0VhJfyGGO3aUKdbh3gDZc/dPLQwW4eSqWGrrcWNBZWUWaXQ==} + engines: {node: '>= 20'} + cpu: [arm64] + os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': resolution: {integrity: sha512-rbO34G5sMWWyrN/idLeVxAZgAKWrn5LiR3/I90Q9MkA67s6T1oB0xtTe+0heoBvHSpbU9Mk7i6uwJnpo4u21XQ==} engines: {node: '>= 20'} cpu: [x64] os: [win32] + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + resolution: {integrity: sha512-1T/37VvI7WyH66b+vqHj/cLwnCxt7Qt3WFu5Q8hk65aOvlwAhs7rAp1VkulBJw/N4tMirXjVnylTR72uI0HGcA==} + engines: {node: '>= 20'} + cpu: [x64] + os: [win32] + '@tailwindcss/oxide@4.2.1': resolution: {integrity: sha512-yv9jeEFWnjKCI6/T3Oq50yQEOqmpmpfzG1hcZsAOaXFQPfzWprWrlHSdGPEF3WQTi8zu8ohC9Mh9J470nT5pUw==} engines: {node: '>= 20'} + '@tailwindcss/oxide@4.2.2': + resolution: {integrity: sha512-qEUA07+E5kehxYp9BVMpq9E8vnJuBHfJEC0vPC5e7iL/hw7HR61aDKoVoKzrG+QKp56vhNZe4qwkRmMC0zDLvg==} + engines: {node: '>= 20'} + '@tailwindcss/postcss@4.2.1': resolution: {integrity: sha512-OEwGIBnXnj7zJeonOh6ZG9woofIjGrd2BORfvE5p9USYKDCZoQmfqLcfNiRWoJlRWLdNPn2IgVZuWAOM4iTYMw==} + '@tailwindcss/postcss@4.2.2': + resolution: {integrity: sha512-n4goKQbW8RVXIbNKRB/45LzyUqN451deQK0nzIeauVEqjlI49slUlgKYJM2QyUzap/PcpnS7kzSUmPb1sCRvYQ==} + '@tailwindcss/vite@4.2.1': resolution: {integrity: sha512-TBf2sJjYeb28jD2U/OhwdW0bbOsxkWPwQ7SrqGf9sVcoYwZj7rkXljroBO9wKBut9XnmQLXanuDUeqQK0lGg/w==} peerDependencies: vite: ^5.2.0 || ^6 || ^7 + '@tailwindcss/vite@4.2.2': + resolution: {integrity: sha512-mEiF5HO1QqCLXoNEfXVA1Tzo+cYsrqV7w9Juj2wdUFyW07JRenqMG225MvPwr3ZD9N1bFQj46X7r33iHxLUW0w==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 || ^8 + '@tanstack/table-core@8.21.3': resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} engines: {node: '>=12'} @@ -2849,6 +2790,9 @@ packages: '@tanstack/virtual-core@3.13.21': resolution: {integrity: sha512-ww+fmLHyCbPSf7JNbWZP3g7wl6SdNo3ah5Aiw+0e9FDErkVHLKprYUrwTm7dF646FtEkN/KkAKPYezxpmvOjxw==} + '@tanstack/virtual-core@3.13.23': + resolution: {integrity: sha512-zSz2Z2HNyLjCplANTDyl3BcdQJc2k1+yyFoKhNRmCr7V7dY8o8q5m8uFTI1/Pg1kL+Hgrz6u3Xo6eFUB7l66cg==} + '@tanstack/vue-table@8.21.3': resolution: {integrity: sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==} engines: {node: '>=12'} @@ -2860,43 +2804,85 @@ packages: peerDependencies: vue: ^2.7.0 || ^3.0.0 + '@tanstack/vue-virtual@3.13.23': + resolution: {integrity: sha512-b5jPluAR6U3eOq6GWAYSpj3ugnAIZgGR0e6aGAgyRse0Yu6MVQQ0ZWm9SArSXWtageogn6bkVD8D//c4IjW3xQ==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + '@tiptap/core@3.20.1': resolution: {integrity: sha512-SwkPEWIfaDEZjC8SEIi4kZjqIYUbRgLUHUuQezo5GbphUNC8kM1pi3C3EtoOPtxXrEbY6e4pWEzW54Pcrd+rVA==} peerDependencies: '@tiptap/pm': ^3.20.1 + '@tiptap/core@3.20.5': + resolution: {integrity: sha512-Pkjd41UJ4F6Z8cPV+gEvqnt1VhY2g66xMjbpxREs0ECA5jRezCNKSZcc2pueQRTMtmn1SaSzGM9U/ifhVlVYOA==} + peerDependencies: + '@tiptap/pm': ^3.20.5 + '@tiptap/extension-blockquote@3.20.1': resolution: {integrity: sha512-WzNXk/63PQI2fav4Ta6P0GmYRyu8Gap1pV3VUqaVK829iJ6Zt1T21xayATHEHWMK27VT1GLPJkx9Ycr2jfDyQw==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-blockquote@3.20.5': + resolution: {integrity: sha512-0wU6H/MWWes0rGzgSW6MMU6YDs/3ofUDkqmqCqmb+Siu1ZD0bpzOYpBtujgOYDY8moB9+zCE3G9HSYGcmZxHew==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-bold@3.20.1': resolution: {integrity: sha512-fz++Qv6Rk/Hov0IYG/r7TJ1Y4zWkuGONe0UN5g0KY32NIMg3HeOHicbi4xsNWTm9uAOl3eawWDkezEMrleObMw==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-bold@3.20.5': + resolution: {integrity: sha512-hraiiWkF58n8Jy0Wl3OGwjCTrGWwZZxez/IlexrzKQ/nMFdjDpensZucWwu59zhAM9fqZwGSLDtCFuak03WKnA==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-bubble-menu@3.20.1': resolution: {integrity: sha512-XaPvO6aCoWdFnCBus0s88lnj17NR/OopV79i8Qhgz3WMR0vrsL5zsd45l0lZuu9pSvm5VW47SoxakkJiZC1suw==} peerDependencies: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/extension-bubble-menu@3.20.5': + resolution: {integrity: sha512-6FsASu4o32bp3FzBVb5N2ERjrBy83DtJQAGv9/ycYqsgv2kq9DNlhvtNI7GPiTW7a73ZcImjIX+jEWrARbzOlQ==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/extension-bullet-list@3.20.1': resolution: {integrity: sha512-mbrlvOZo5OF3vLhp+3fk9KuL/6J/wsN0QxF6ZFRAHzQ9NkJdtdfARcBeBnkWXGN8inB6YxbTGY1/E4lmBkOpOw==} peerDependencies: '@tiptap/extension-list': ^3.20.1 + '@tiptap/extension-bullet-list@3.20.5': + resolution: {integrity: sha512-MT3321R6F8AoVUEMJ5RiI0PQMenwvtmrSXoO1ehPCWq5TrSJLyXeZMJvZU+1CgfXk4XQU70RN78ib5+Zg+/FCg==} + peerDependencies: + '@tiptap/extension-list': ^3.20.5 + '@tiptap/extension-code-block@3.20.1': resolution: {integrity: sha512-vKejwBq+Nlj4Ybd3qOyDxIQKzYymdNH+8eXkKwGShk2nfLJIxq69DCyGvmuHgipIO1qcYPJ149UNpGN+YGcdmA==} peerDependencies: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/extension-code-block@3.20.5': + resolution: {integrity: sha512-0YZnqfqZ1IjzKBM4aezw8j3LZWJFEfs4+mbizHNlnZSYpKzpESYLeaLWGO5SpqF9Z8tmYmSoCaf0fqi5LwgdIA==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/extension-code@3.20.1': resolution: {integrity: sha512-509DHINIA/Gg+eTG7TEkfsS8RUiPLH5xZNyLRT0A1oaoaJmECKfrV6aAm05IdfTyqDqz6LW5pbnX6DdUC4keug==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-code@3.20.5': + resolution: {integrity: sha512-jBZK/CfdMvg1gkNK/zNAk02IExpBPwUfNLRPiJvGhReL2Q73naKxZGQGp+5Lej9VaeFB70UKuRma/iIzuZbgsA==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-collaboration@3.20.1': resolution: {integrity: sha512-JnwLvyzrutBffHp6YPnf0XyTnhAgqZ9D8JSUKFp0edvai+dxsb+UMlawesBrgAuoQXw3B8YZUo2VFDVdKas1xQ==} peerDependencies: @@ -2905,11 +2891,24 @@ packages: '@tiptap/y-tiptap': ^3.0.2 yjs: ^13 + '@tiptap/extension-collaboration@3.20.5': + resolution: {integrity: sha512-IalIm6BznHds2VzR4+6gMAgi4VXwZAXdYkl28EPZ8/xscBaUn1tCxcTBbCpmN3UhkABaCoJtmmER5TDy+x72Ag==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/y-tiptap': ^3.0.2 + yjs: ^13 + '@tiptap/extension-document@3.20.1': resolution: {integrity: sha512-9vrqdGmRV7bQCSY3NLgu7UhIwgOCDp4sKqMNsoNRX0aZ021QQMTvBQDPkiRkCf7MNsnWrNNnr52PVnULEn3vFQ==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-document@3.20.5': + resolution: {integrity: sha512-BpNGHtOTAjjs/6QbkrafMTlaJqb0gsPngFzd5rB0csxx7rYRE9nIEY+oZ44qMw161+2YB4u20L17SX2mUJANBw==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-drag-handle-vue-3@3.20.1': resolution: {integrity: sha512-FJonOxcj/I7uBpJBSqfEfU+Fqem5aanEj+EsqG5ZQnxhp7cxbUYZkGH0tBBR7jeIIkt2Jk+1LoCAlYzCWbDLcQ==} peerDependencies: @@ -2918,6 +2917,14 @@ packages: '@tiptap/vue-3': ^3.20.1 vue: ^3.0.0 + '@tiptap/extension-drag-handle-vue-3@3.20.5': + resolution: {integrity: sha512-x16hJd9zSREA9nbnX5Jixf2yRUAYGLKaQi1tJWZwL7lDLaqLwAEEyaS6VEBjnn2BBtoiVEOIfGgv4s3i8v+uhQ==} + peerDependencies: + '@tiptap/extension-drag-handle': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/vue-3': ^3.20.5 + vue: ^3.0.0 + '@tiptap/extension-drag-handle@3.20.1': resolution: {integrity: sha512-sIfu5Gt1aZVAagvzr+3Qx+8GE294eU3G6/pYjqNHvf71sDCpdN2gFpeI7WF05foVsCGsH6ieu8x/kTXf5GbNZA==} peerDependencies: @@ -2927,11 +2934,25 @@ packages: '@tiptap/pm': ^3.20.1 '@tiptap/y-tiptap': ^3.0.2 + '@tiptap/extension-drag-handle@3.20.5': + resolution: {integrity: sha512-D2W2fkpmXKRG4i0K0XVfbsTRYQMU9RudQIXBB7HnYZFosyJs3dvsT1cFurDUANKLPCxbI24eiubAKs6b1vzGpA==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-collaboration': ^3.20.5 + '@tiptap/extension-node-range': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/y-tiptap': ^3.0.2 + '@tiptap/extension-dropcursor@3.20.1': resolution: {integrity: sha512-K18L9FX4znn+ViPSIbTLOGcIaXMx/gLNwAPE8wPLwswbHhQqdiY1zzdBw6drgOc1Hicvebo2dIoUlSXOZsOEcw==} peerDependencies: '@tiptap/extensions': ^3.20.1 + '@tiptap/extension-dropcursor@3.20.5': + resolution: {integrity: sha512-/lDG9OjvAv0ynmgFH17mt/GUeGT5bqu0iPW8JMgaRqlKawk+uUIv5SF5WkXS4SwxXih+hXdPEQD3PWZnxlQxAQ==} + peerDependencies: + '@tiptap/extensions': ^3.20.5 + '@tiptap/extension-floating-menu@3.20.1': resolution: {integrity: sha512-BeDC6nfOesIMn5pFuUnkEjOxGv80sOJ8uk1mdt9/3Fkvra8cB9NIYYCVtd6PU8oQFmJ8vFqPrRkUWrG5tbqnOg==} peerDependencies: @@ -2939,59 +2960,119 @@ packages: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/extension-floating-menu@3.20.5': + resolution: {integrity: sha512-mTzBNUeAocinrxa5xV+5hGnnNCQB0pVI1GSBwUTHwdB7jNwBqfKAILmtLZONgmhxKWLmGa6WCA59sk+yDI+N0A==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/extension-gapcursor@3.20.1': resolution: {integrity: sha512-kZOtttV6Ai8VUAgEng3h4WKFbtdSNJ6ps7r0cRPY+FctWhVmgNb/JJwwyC+vSilR7nRENAhrA/Cv/RxVlvLw+g==} peerDependencies: '@tiptap/extensions': ^3.20.1 + '@tiptap/extension-gapcursor@3.20.5': + resolution: {integrity: sha512-H+bRr+mqU/DQq1vfoMlppK1o+RbfSKYBMIcAMHWOez+C96MWfj5bhooVU2HLtl4XGmQxKGr3oEOCKDPdtRNThg==} + peerDependencies: + '@tiptap/extensions': ^3.20.5 + '@tiptap/extension-hard-break@3.20.1': resolution: {integrity: sha512-9sKpmg/IIdlLXimYWUZ3PplIRcehv4Oc7V1miTqlnAthMzjMqigDkjjgte4JZV67RdnDJTQkRw8TklCAU28Emg==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-hard-break@3.20.5': + resolution: {integrity: sha512-+aILNDO7BsXf0IJ4/0BYh570usFK3Q1t/ZQd8zhHuO2ATeWeDVu1x2F+ouFS4X8fmoCcioMzw15aoz93GET6kQ==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-heading@3.20.1': resolution: {integrity: sha512-unudyfQP6FxnyWinxvPqe/51DG91J6AaJm666RnAubgYMCgym+33kBftx4j4A6qf+ddWYbD00thMNKOnVLjAEQ==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-heading@3.20.5': + resolution: {integrity: sha512-zXxuIrCSpzgXzRxgCbRE8DZ/NFuinVaniE3pp/9LYAWgRlsAyko8pI2XrVvzzXmDQqRGi2HrNVkNy1yutUWSWQ==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-horizontal-rule@3.20.1': resolution: {integrity: sha512-rjFKFXNntdl0jay8oIGFvvykHlpyQTLmrH3Ag2fj3i8yh6MVvqhtaDomYQbw5sxECd5hBkL+T4n2d2DRuVw/QQ==} peerDependencies: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/extension-horizontal-rule@3.20.5': + resolution: {integrity: sha512-4UtpUHg8cRzxWjJUGtni5VnXYbhsO7ygf1H1pr4Rv63XMBg9lfYDeSwByIuVy9biEFP7eGEFnezzb5Zlh1btmQ==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/extension-image@3.20.1': resolution: {integrity: sha512-/GPFSLNdYSZQ0E6VBXSAk0UFtDdn98HT1Aa2tO+STELqc5jAdFB42dfFnTC6KQzTvcUOUYkE2S1Q22YC5H2XNQ==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-image@3.20.5': + resolution: {integrity: sha512-qxKupWKhX75Xc9GJ9Uel+KIFL9x6tb8W3RvQM1UolyJX/H7wyBO7sXp9XmKRkHZsDXRgLVbnkYBe+X83o16AIA==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-italic@3.20.1': resolution: {integrity: sha512-ZYRX13Kt8tR8JOzSXirH3pRpi8x30o7LHxZY58uXBdUvr3tFzOkh03qbN523+diidSVeHP/aMd/+IrplHRkQug==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-italic@3.20.5': + resolution: {integrity: sha512-7bZCgdJVTvhR5vSmNgFQbGvgRoC6m26KcUpHqWiKA95kLL5Wk4YlMCIqdiDpvJ1eakeFEvDcGZvFLg5+1NiQ+w==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-link@3.20.1': resolution: {integrity: sha512-oYTTIgsQMqpkSnJAuAc+UtIKMuI4lv9e1y4LfI1iYm6NkEUHhONppU59smhxHLzb3Ww7YpDffbp5IgDTAiJztA==} peerDependencies: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/extension-link@3.20.5': + resolution: {integrity: sha512-0PukrSYnHX2CrGSThlKfQWxpPWmL7QAvdpDUraKknGvVNSH7tUjchTshy5JdLrn/SQAU92REowRCB6zzCNEFjA==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/extension-list-item@3.20.1': resolution: {integrity: sha512-tzgnyTW82lYJkUnadYbatwkI9dLz/OWRSWuFpQPRje/ItmFMWuQ9c9NDD8qLbXPdEYnvrgSAA+ipCD/1G0qA0Q==} peerDependencies: '@tiptap/extension-list': ^3.20.1 + '@tiptap/extension-list-item@3.20.5': + resolution: {integrity: sha512-pFJCGLIDEin1Xn6B3ctbrZvtYyALARE56ya4SmaNfnl+Hww5MfkRR40obbwYD3byA1yOpr+bECy+I2clQqzTDw==} + peerDependencies: + '@tiptap/extension-list': ^3.20.5 + '@tiptap/extension-list-keymap@3.20.1': resolution: {integrity: sha512-Dr0xsQKx0XPOgDg7xqoWwfv7FFwZ3WeF3eOjqh3rDXlNHMj1v+UW5cj1HLphrsAZHTrVTn2C+VWPJkMZrSbpvQ==} peerDependencies: '@tiptap/extension-list': ^3.20.1 + '@tiptap/extension-list-keymap@3.20.5': + resolution: {integrity: sha512-rmrQgOrUb0jKtFzVUfT0UNEST2sGM2Ve4lOl+1luh66RW6TD+gvgMk/qo12/Kffl9PUiqz8oYfk2qXCwFb6Bug==} + peerDependencies: + '@tiptap/extension-list': ^3.20.5 + '@tiptap/extension-list@3.20.1': resolution: {integrity: sha512-euBRAn0mkV7R2VEE+AuOt3R0j9RHEMFXamPFmtvTo8IInxDClusrm6mJoDjS8gCGAXsQCRiAe1SCQBPgGbOOwg==} peerDependencies: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/extension-list@3.20.5': + resolution: {integrity: sha512-s+Y8Q7Orq+WQiwgFB/VPMYZe+6EAR2F69xCpvOynlzTInLO4cF6QpXomuGEYAZxLHe8ZBmeIaR7y8MH/OgjrDw==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/extension-mention@3.20.1': resolution: {integrity: sha512-KOGokj7oH1QpcM8P02V+o6wHsVE0g7XEtdIy2vtq2vlFE3npNNNFkMa8F8VWX6qyC+VeVrNU6SIzS5MFY2TORA==} peerDependencies: @@ -2999,66 +3080,133 @@ packages: '@tiptap/pm': ^3.20.1 '@tiptap/suggestion': ^3.20.1 + '@tiptap/extension-mention@3.20.5': + resolution: {integrity: sha512-SEyIV500gAfzylvbWog2gUK6Z6fJhGYXCuGOHAGj+w2Vy3C262w8HXC9uQ+BrY/vdZp8iSpFY4AbTf5xkqkijA==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/suggestion': ^3.20.5 + '@tiptap/extension-node-range@3.20.1': resolution: {integrity: sha512-+W/mQJxlkXMcwldWUqwdoR0eniJ1S9cVJoAy2Lkis0NhILZDWVNGKl9J4WFoCOXn8Myr17IllIxRYvAXJJ4FHQ==} peerDependencies: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/extension-node-range@3.20.5': + resolution: {integrity: sha512-6CbgZULF+dQ9KTothAORBZAXPdGneWicMWTV3Gyeh9gNySC18QsGQj3D2GxnllpMekmZXydtDbNFSoCiWjKFWQ==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/extension-ordered-list@3.20.1': resolution: {integrity: sha512-Y+3Ad7OwAdagqdYwCnbqf7/to5ypD4NnUNHA0TXRCs7cAHRA8AdgPoIcGFpaaSpV86oosNU3yfeJouYeroffog==} peerDependencies: '@tiptap/extension-list': ^3.20.1 + '@tiptap/extension-ordered-list@3.20.5': + resolution: {integrity: sha512-Y/RIE3AxUNYAFKGMM5FLlTVKxxBvOh4JlLp/qYsOCY2nJdH0Jopl2FpfBYc4xoJwFSk8BELJ4Ow0adcYb15ksg==} + peerDependencies: + '@tiptap/extension-list': ^3.20.5 + '@tiptap/extension-paragraph@3.20.1': resolution: {integrity: sha512-QFrAtXNyv7JSnomMQc1nx5AnG9mMznfbYJAbdOQYVdbLtAzTfiTuNPNbQrufy5ZGtGaHxDCoaygu2QEfzaKG+Q==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-paragraph@3.20.5': + resolution: {integrity: sha512-mwuhwmff67IpGfOViyRvUC14IlkpsOnB+hSExVnq5+hCntjt/Cr2Z8GGOgzHeIM2FIS0UqX9Lv/b6ttUg4+Now==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-placeholder@3.20.1': resolution: {integrity: sha512-k+jfbCugYGuIFBdojukgEopGazIMOgHrw46FnyN2X/6ICOIjQP2rh2ObslrsUOsJYoEevxCsNF9hZl1HvWX66g==} peerDependencies: '@tiptap/extensions': ^3.20.1 + '@tiptap/extension-placeholder@3.20.5': + resolution: {integrity: sha512-PcZJbzJ8j+YcRdYWFjmFFVnOOx3nETA0pzMj9fXADi28vNABnrWLwsHAseh3I5QfLmywKQb9SpTSTU2LxQgBoA==} + peerDependencies: + '@tiptap/extensions': ^3.20.5 + '@tiptap/extension-strike@3.20.1': resolution: {integrity: sha512-EYgyma10lpsY+rwbVQL9u+gA7hBlKLSMFH7Zgd37FSxukOjr+HE8iKPQQ+SwbGejyDsPlLT8Z5Jnuxo5Ng90Pg==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-strike@3.20.5': + resolution: {integrity: sha512-uwhvmfS4ciGYJRLUg0AHbWsprMCwyWVWd2RXOLRm0ZQeWkvzonPXZhJvzIhIgsFkPLj/dsN5t0+LdiK4UQMnyA==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-text@3.20.1': resolution: {integrity: sha512-7PlIbYW8UenV6NPOXHmv8IcmPGlGx6HFq66RmkJAOJRPXPkTLAiX0N8rQtzUJ6jDEHqoJpaHFEHJw0xzW1yF+A==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-text@3.20.5': + resolution: {integrity: sha512-DMa9g5cH2d/Gx1KXtV7txTxaa6FBqgG8glmfug+N93VMb8sEZR1Yu1az++yAep4SGGq9GWIGZCUS3H6W66et6Q==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extension-underline@3.20.1': resolution: {integrity: sha512-fmHvDKzwCgnZUwRreq8tYkb1YyEwgzZ6QQkAQ0CsCRtvRMqzerr3Duz0Als4i8voZTuGDEL3VR6nAJbLAb/wPg==} peerDependencies: '@tiptap/core': ^3.20.1 + '@tiptap/extension-underline@3.20.5': + resolution: {integrity: sha512-HMhr5KIAqZsEhlN8RxKHr/ql1a8OvBa9fLf69IwUVFolBcDExHWUtaEV/axYVRQJvvIy2oKGJxlJWDZ4hkotHQ==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/extensions@3.20.1': resolution: {integrity: sha512-JRc/v+OBH0qLTdvQ7HvHWTxGJH73QOf1MC0R8NhOX2QnAbg2mPFv1h+FjGa2gfLGuCXBdWQomjekWkUKbC4e5A==} peerDependencies: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/extensions@3.20.5': + resolution: {integrity: sha512-c4am6SznqfMnbUNSh4MvufiD7cMLdqL1BArok22uBgSWkS1sB9RVBYe8+x0jrOkk0UPEVlzDHbQ+nU+WmIyS2Q==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/markdown@3.20.1': resolution: {integrity: sha512-dNrtP7kmabDomgjv9G/6+JSFL6WraPaFbmKh1eHSYKdDGvIwBfJnVPTV2VS3bP1OuYJEDJN/2ydtiCHyOTrQsQ==} peerDependencies: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/markdown@3.20.5': + resolution: {integrity: sha512-meSibJEeCrh6kPJbdXUNnwexZEgdxWDRu7YzPml8TCy+Djo+g50YwzOfY5bfTYs7/mwGANJ7Y8OnWcnwT2IbzQ==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/pm@3.20.1': resolution: {integrity: sha512-6kCiGLvpES4AxcEuOhb7HR7/xIeJWMjZlb6J7e8zpiIh5BoQc7NoRdctsnmFEjZvC19bIasccshHQ7H2zchWqw==} + '@tiptap/pm@3.20.5': + resolution: {integrity: sha512-yJhDa7Chx2EqJMX/jlewBv0za7slf1dKHWYve1XaApuVHEkxl0Ul3EDbwnx316vIITkuFW/pWSwkSsAplyBeCw==} + '@tiptap/starter-kit@3.20.1': resolution: {integrity: sha512-opqWxL/4OTEiqmVC0wsU4o3JhAf6LycJ2G/gRIZVAIFLljI9uHfpPMTFGxZ5w9IVVJaP5PJysfwW/635kKqkrw==} + '@tiptap/starter-kit@3.20.5': + resolution: {integrity: sha512-L5E2TCGK0EiwmGIlwMsiwNTW1TLbfPF1Dsji4bSKRJnPbccZIMCB6qdId8v/Z+QGm85NVcBHeruQrDlKDddXBA==} + '@tiptap/suggestion@3.20.1': resolution: {integrity: sha512-ng7olbzgZhWvPJVJygNQK5153CjquR2eJXpkLq7bRjHlahvt4TH4tGFYvGdYZcXuzbe2g9RoqT7NaPGL9CUq9w==} peerDependencies: '@tiptap/core': ^3.20.1 '@tiptap/pm': ^3.20.1 + '@tiptap/suggestion@3.20.5': + resolution: {integrity: sha512-5fqRNgnzYdJ1oDpyLqwrbVsZwvI+5VW/U89LPMvBYM7sFS7Xd0xfyxyAOWcJN4V0zLeTcuElWN3R+IUTLKbU+Q==} + peerDependencies: + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + '@tiptap/vue-3@3.20.1': resolution: {integrity: sha512-06IsNzIkAC0HPHNSdXf4AgtExnr02BHBLXmUiNrjjhgHdxXDKIB0Yq3hEWEfbWNPr3lr7jK6EaFu2IKFMhoUtQ==} peerDependencies: @@ -3067,6 +3215,14 @@ packages: '@tiptap/pm': ^3.20.1 vue: ^3.0.0 + '@tiptap/vue-3@3.20.5': + resolution: {integrity: sha512-5uUK3RAMNvUetZOv56Kz8nurhxHxMH60GgCCrVFgIBZoTc14u3d3v7EpcA6gNgzogutrR8GxvyFU3iIkj4kkHA==} + peerDependencies: + '@floating-ui/dom': ^1.0.0 + '@tiptap/core': ^3.20.5 + '@tiptap/pm': ^3.20.5 + vue: ^3.0.0 + '@tiptap/y-tiptap@3.0.1': resolution: {integrity: sha512-F3hj5X77ckmyIywbCQpKgyX3xKra2/acJPWaV5R9wqp0cUPBmm62FYbkQ6HaqxH1VhCkUhhAZcDSQjbjj7tnWw==} engines: {node: '>=16.0.0', npm: '>=8.0.0'} @@ -4628,6 +4784,20 @@ packages: react-dom: optional: true + framer-motion@12.38.0: + resolution: {integrity: sha512-rFYkY/pigbcswl1XQSb7q424kSTQ8q6eAC+YUsSKooHQYuLdzdHjrt6uxUC+PRAO++q5IS7+TamgIw1AphxR+g==} + peerDependencies: + '@emotion/is-prop-valid': '*' + react: ^18.0.0 || ^19.0.0 + react-dom: ^18.0.0 || ^19.0.0 + peerDependenciesMeta: + '@emotion/is-prop-valid': + optional: true + react: + optional: true + react-dom: + optional: true + fresh@2.0.0: resolution: {integrity: sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==} engines: {node: '>= 0.8'} @@ -4835,6 +5005,9 @@ packages: hookable@6.0.1: resolution: {integrity: sha512-uKGyY8BuzN/a5gvzvA+3FVWo0+wUjgtfSdnmjtrOVwQCZPHpHDH2WRO3VZSOeluYrHoDCiXFffZXs8Dj1ULWtw==} + hookable@6.1.0: + resolution: {integrity: sha512-ZoKZSJgu8voGK2geJS+6YtYjvIzu9AOM/KZXsBxr83uhLL++e9pEv/dlgwgy3dvHg06kTz6JOh1hk3C8Ceiymw==} + html-entities@2.6.0: resolution: {integrity: sha512-kig+rMn/QOVRvr7c86gQ8lWXq+Hkv6CbAH1hLu+RG338StTpE8Z0b44SDVaqVu7HGKf27frdmUYEs9hTUX/cLQ==} @@ -5600,21 +5773,36 @@ packages: mlly@1.8.1: resolution: {integrity: sha512-SnL6sNutTwRWWR/vcmCYHSADjiEesp5TGQQ0pXyLhW5IoeibRlF/CbSLailbB3CNqJUk9cVJ9dUDnbD7GrcHBQ==} + mlly@1.8.2: + resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==} + mocked-exports@0.1.1: resolution: {integrity: sha512-aF7yRQr/Q0O2/4pIXm6PZ5G+jAd7QS4Yu8m+WEeEHGnbo+7mE36CbLSDQiXYV8bVL3NfmdeqPJct0tUlnjVSnA==} motion-dom@12.35.2: resolution: {integrity: sha512-pWXFMTwvGDbx1Fe9YL5HZebv2NhvGBzRtiNUv58aoK7+XrsuaydQ0JGRKK2r+bTKlwgSWwWxHbP5249Qr/BNpg==} + motion-dom@12.38.0: + resolution: {integrity: sha512-pdkHLD8QYRp8VfiNLb8xIBJis1byQ9gPT3Jnh2jqfFtAsWUA3dEepDlsWe/xMpO8McV+VdpKVcp+E+TGJEtOoA==} + motion-utils@12.29.2: resolution: {integrity: sha512-G3kc34H2cX2gI63RqU+cZq+zWRRPSsNIOjpdl9TN4AQwC4sgwYPl/Q/Obf/d53nOm569T0fYK+tcoSV50BWx8A==} + motion-utils@12.36.0: + resolution: {integrity: sha512-eHWisygbiwVvf6PZ1vhaHCLamvkSbPIeAYxWUuL3a2PD/TROgE7FvfHWTIH4vMl798QLfMw15nRqIaRDXTlYRg==} + motion-v@1.10.3: resolution: {integrity: sha512-9Ewo/wwGv7FO3PqYJpllBF/Efc7tbeM1iinVrM73s0RUQrnXHwMZCaRX98u4lu0PQCrZghPPfCsQ14pWKIEbnQ==} peerDependencies: '@vueuse/core': '>=10.0.0' vue: '>=3.0.0' + motion-v@2.2.0: + resolution: {integrity: sha512-8rrUBt9UMwy45MfLMwHer9J7xBY/rL31S+0U3ZUAouqjH3AOVHvS0NGuXwF4mfWfvb22rfZEv59ZsBc2f1epxQ==} + peerDependencies: + '@vueuse/core': '>=10.0.0' + vue: '>=3.0.0' + mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -5819,10 +6007,6 @@ packages: resolution: {integrity: sha512-l3cbgK5wUvWDVNWM/JFU77qDdGZK1wudnLsFcrRyNo/bL1CyU8pC25vDhMHikVY29lbK2InTWsX42RxVSutUdQ==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-parser@0.95.0: - resolution: {integrity: sha512-Te8fE/SmiiKWIrwBwxz5Dod87uYvsbcZ9JAL5ylPg1DevyKgTkxCXnPEaewk1Su2qpfNmry5RHoN+NywWFCG+A==} - engines: {node: ^20.19.0 || >=22.12.0} - oxc-transform@0.112.0: resolution: {integrity: sha512-cIRRvZgrHfsAHrkt8LWdAX4+Do8R0MzQSfeo9yzErzHeYiuyNiP4PCTPbOy/wBXL4MYzt3ebrBa5jt3akQkKAg==} engines: {node: ^20.19.0 || >=22.12.0} @@ -5831,15 +6015,6 @@ packages: resolution: {integrity: sha512-u1Stl2uhDh9bFuOGjGXQIqx46IRUNMyHQkq59LayXNGS2flNv7RpZpRSWs5S5deuNP6jJZ12gtMBze+m4dOhmw==} engines: {node: ^20.19.0 || >=22.12.0} - oxc-transform@0.95.0: - resolution: {integrity: sha512-SmS5aThb5K0SoUZgzGbikNBjrGHfOY4X5TEqBlaZb1uy5YgXbUSbpakpZJ13yW36LNqy8Im5+y+sIk5dlzpZ/w==} - engines: {node: ^20.19.0 || >=22.12.0} - - oxc-walker@0.5.2: - resolution: {integrity: sha512-XYoZqWwApSKUmSDEFeOKdy3Cdh95cOcSU8f7yskFWE4Rl3cfL5uwyY+EV7Brk9mdNLy+t5SseJajd6g7KncvlA==} - peerDependencies: - oxc-parser: '>=0.72.0' - oxc-walker@0.7.0: resolution: {integrity: sha512-54B4KUhrzbzc4sKvKwVYm7E2PgeROpGba0/2nlNZMqfDyca+yOor5IMb4WLGBatGDT0nkzYdYuzylg7n3YfB7A==} peerDependencies: @@ -6361,6 +6536,11 @@ packages: peerDependencies: vue: '>= 3.2.0' + reka-ui@2.9.2: + resolution: {integrity: sha512-/t4e6y1hcG+uDuRfpg6tbMz3uUEvRzNco6NeYTufoJeUghy5Iosxos5YL/p+ieAsid84sdMX9OrgDqpEuCJhBw==} + peerDependencies: + vue: '>= 3.4.0' + remark-emoji@5.0.2: resolution: {integrity: sha512-IyIqGELcyK5AVdLFafoiNww+Eaw/F+rGrNSXoKucjo95uL267zrddgxGM83GN1wFIb68pyDuAsY3m5t2Cav1pQ==} engines: {node: '>=18'} @@ -6719,6 +6899,9 @@ packages: tailwindcss@4.2.1: resolution: {integrity: sha512-/tBrSQ36vCleJkAOsy9kbNTgaxvGbyOamC30PRePTQe/o1MFwEKHQk4Cn7BNGaPtjp+PuUrByJehM1hgxfq4sw==} + tailwindcss@4.2.2: + resolution: {integrity: sha512-KWBIxs1Xb6NoLdMVqhbhgwZf2PGBpPEiwOqgI4pFIYbNTfBXiKYyWoTsXgBQ9WFg/OlhnvHaY+AEpW7wSmFo2Q==} + tapable@2.3.0: resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} engines: {node: '>=6'} @@ -6838,6 +7021,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@6.0.2: + resolution: {integrity: sha512-bGdAIrZ0wiGDo5l8c++HWtbaNCWTS4UTv7RaTH/ThVIgjkveJt83m74bBHMJkuCbslY8ixgLBVZJIOiQlQTjfQ==} + engines: {node: '>=14.17'} + hasBin: true + uc.micro@2.1.0: resolution: {integrity: sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==} @@ -6935,14 +7123,14 @@ packages: '@nuxt/kit': optional: true - unplugin-vue-router@0.16.2: - resolution: {integrity: sha512-lE6ZjnHaXfS2vFI/PSEwdKcdOo5RwAbCKUnPBIN9YwLgSWas3x+qivzQvJa/uxhKzJldE6WK43aDKjGj9Rij9w==} - deprecated: 'Merged into vuejs/router. Migrate: https://router.vuejs.org/guide/migration/v4-to-v5.html' + unplugin-vue-components@31.1.0: + resolution: {integrity: sha512-9EbV5ark21A4BOBt6RJGJXCVD2I1eoxTZL1TAvNgYTokcrFIiuxpufb8owyWn7n+z2x8daz/ltZq6IRRKL3ydQ==} + engines: {node: '>=20.19.0'} peerDependencies: - '@vue/compiler-sfc': ^3.5.17 - vue-router: ^4.6.0 + '@nuxt/kit': ^3.2.2 || ^4.0.0 + vue: ^3.0.0 peerDependenciesMeta: - vue-router: + '@nuxt/kit': optional: true unplugin-vue-router@0.19.2: @@ -7200,6 +7388,9 @@ packages: vue-component-type-helpers@3.2.5: resolution: {integrity: sha512-tkvNr+bU8+xD/onAThIe7CHFvOJ/BO6XCOrxMzeytJq40nTfpGDJuVjyCM8ccGZKfAbGk2YfuZyDMXM56qheZQ==} + vue-component-type-helpers@3.2.6: + resolution: {integrity: sha512-O02tnvIfOQVmnvoWwuSydwRoHjZVt8UEBR+2p4rT35p8GAy5VTlWP8o5qXfJR/GWCN0nVZoYWsVUvx2jwgdBmQ==} + vue-demi@0.14.10: resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} engines: {node: '>=12'} @@ -7246,6 +7437,21 @@ packages: pinia: optional: true + vue-router@5.0.4: + resolution: {integrity: sha512-lCqDLCI2+fKVRl2OzXuzdSWmxXFLQRxQbmHugnRpTMyYiT+hNaycV0faqG5FBHDXoYrZ6MQcX87BvbY8mQ20Bg==} + peerDependencies: + '@pinia/colada': '>=0.21.2' + '@vue/compiler-sfc': ^3.5.17 + pinia: ^3.0.4 + vue: ^3.5.0 + peerDependenciesMeta: + '@pinia/colada': + optional: true + '@vue/compiler-sfc': + optional: true + pinia: + optional: true + vue-tsc@3.2.6: resolution: {integrity: sha512-gYW/kWI0XrwGzd0PKc7tVB/qpdeAkIZLNZb10/InizkQjHjnT8weZ/vBarZoj4kHKbUTZT/bAVgoOr8x4NsQ/Q==} hasBin: true @@ -7629,11 +7835,11 @@ snapshots: '@cloudflare/kv-asset-handler@0.4.2': {} - '@commitlint/cli@20.5.0(@types/node@25.2.0)(conventional-commits-parser@6.3.0)(typescript@5.9.3)': + '@commitlint/cli@20.5.0(@types/node@25.2.0)(conventional-commits-parser@6.3.0)(typescript@6.0.2)': dependencies: '@commitlint/format': 20.5.0 '@commitlint/lint': 20.5.0 - '@commitlint/load': 20.5.0(@types/node@25.2.0)(typescript@5.9.3) + '@commitlint/load': 20.5.0(@types/node@25.2.0)(typescript@6.0.2) '@commitlint/read': 20.5.0(conventional-commits-parser@6.3.0) '@commitlint/types': 20.5.0 tinyexec: 1.0.4 @@ -7682,14 +7888,14 @@ snapshots: '@commitlint/rules': 20.5.0 '@commitlint/types': 20.5.0 - '@commitlint/load@20.5.0(@types/node@25.2.0)(typescript@5.9.3)': + '@commitlint/load@20.5.0(@types/node@25.2.0)(typescript@6.0.2)': dependencies: '@commitlint/config-validator': 20.5.0 '@commitlint/execute-rule': 20.0.0 '@commitlint/resolve-extends': 20.5.0 '@commitlint/types': 20.5.0 - cosmiconfig: 9.0.1(typescript@5.9.3) - cosmiconfig-typescript-loader: 6.2.0(@types/node@25.2.0)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3) + cosmiconfig: 9.0.1(typescript@6.0.2) + cosmiconfig-typescript-loader: 6.2.0(@types/node@25.2.0)(cosmiconfig@9.0.1(typescript@6.0.2))(typescript@6.0.2) is-plain-obj: 4.1.0 lodash.mergewith: 4.6.2 picocolors: 1.1.1 @@ -7761,14 +7967,14 @@ snapshots: transitivePeerDependencies: - magicast - '@dxup/nuxt@0.4.0(magicast@0.5.2)(typescript@5.9.3)': + '@dxup/nuxt@0.4.0(magicast@0.5.2)(typescript@6.0.2)': dependencies: '@dxup/unimport': 0.1.2 '@nuxt/kit': 4.4.2(magicast@0.5.2) chokidar: 5.0.0 pathe: 2.0.3 tinyglobby: 0.2.15 - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - magicast @@ -8123,6 +8329,15 @@ snapshots: - '@vue/composition-api' - vue + '@floating-ui/vue@1.1.11(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/utils': 0.2.11 + vue-demi: 0.14.10(vue@3.5.30(typescript@6.0.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.7': @@ -8155,6 +8370,11 @@ snapshots: '@iconify/types': 2.0.0 vue: 3.5.30(typescript@5.9.3) + '@iconify/vue@5.0.0(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@iconify/types': 2.0.0 + vue: 3.5.30(typescript@6.0.2) + '@internationalized/date@3.12.0': dependencies: '@swc/helpers': 0.5.19 @@ -8163,7 +8383,7 @@ snapshots: dependencies: '@swc/helpers': 0.5.19 - '@intlify/bundle-utils@11.0.7(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))': + '@intlify/bundle-utils@11.0.7(vue-i18n@11.3.0(vue@3.5.30(typescript@6.0.2)))': dependencies: '@intlify/message-compiler': 11.3.0 '@intlify/shared': 11.3.0 @@ -8175,7 +8395,7 @@ snapshots: source-map-js: 1.2.1 yaml-eslint-parser: 1.3.2 optionalDependencies: - vue-i18n: 11.3.0(vue@3.5.30(typescript@5.9.3)) + vue-i18n: 11.3.0(vue@3.5.30(typescript@6.0.2)) '@intlify/core-base@11.3.0': dependencies: @@ -8205,23 +8425,23 @@ snapshots: '@intlify/shared@11.3.0': {} - '@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.30)(eslint@10.1.0(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))': + '@intlify/unplugin-vue-i18n@11.0.7(@vue/compiler-dom@3.5.30)(eslint@10.1.0(jiti@2.6.1))(rollup@4.59.0)(typescript@6.0.2)(vue-i18n@11.3.0(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2))': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) - '@intlify/bundle-utils': 11.0.7(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3))) + '@intlify/bundle-utils': 11.0.7(vue-i18n@11.3.0(vue@3.5.30(typescript@6.0.2))) '@intlify/shared': 11.3.0 - '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.3.0)(@vue/compiler-dom@3.5.30)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) + '@intlify/vue-i18n-extensions': 8.0.0(@intlify/shared@11.3.0)(@vue/compiler-dom@3.5.30)(vue-i18n@11.3.0(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)) '@rollup/pluginutils': 5.3.0(rollup@4.59.0) '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.57.0(typescript@6.0.2) debug: 4.4.3 fast-glob: 3.3.3 pathe: 2.0.3 picocolors: 1.1.1 unplugin: 2.3.11 - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.30(typescript@6.0.2) optionalDependencies: - vue-i18n: 11.3.0(vue@3.5.30(typescript@5.9.3)) + vue-i18n: 11.3.0(vue@3.5.30(typescript@6.0.2)) transitivePeerDependencies: - '@vue/compiler-dom' - eslint @@ -8231,14 +8451,16 @@ snapshots: '@intlify/utils@0.13.0': {} - '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.3.0)(@vue/compiler-dom@3.5.30)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))': + '@intlify/utils@0.14.1': {} + + '@intlify/vue-i18n-extensions@8.0.0(@intlify/shared@11.3.0)(@vue/compiler-dom@3.5.30)(vue-i18n@11.3.0(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2))': dependencies: '@babel/parser': 7.29.0 optionalDependencies: '@intlify/shared': 11.3.0 '@vue/compiler-dom': 3.5.30 - vue: 3.5.30(typescript@5.9.3) - vue-i18n: 11.3.0(vue@3.5.30(typescript@5.9.3)) + vue: 3.5.30(typescript@6.0.2) + vue-i18n: 11.3.0(vue@3.5.30(typescript@6.0.2)) '@ioredis/commands@1.5.1': {} @@ -8598,25 +8820,66 @@ snapshots: - utf-8-validate - vue - '@nuxt/eslint-config@1.15.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@nuxt/devtools@3.2.3(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@nuxt/devtools-kit': 3.2.3(magicast@0.5.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@nuxt/devtools-wizard': 3.2.3 + '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@vue/devtools-core': 8.0.7(vue@3.5.30(typescript@6.0.2)) + '@vue/devtools-kit': 8.0.7 + birpc: 4.0.0 + consola: 3.4.2 + destr: 2.0.5 + error-stack-parser-es: 1.0.5 + execa: 8.0.1 + fast-npm-meta: 1.4.2 + get-port-please: 3.2.0 + hookable: 6.0.1 + image-meta: 0.2.2 + is-installed-globally: 1.0.0 + launch-editor: 2.13.1 + local-pkg: 1.1.2 + magicast: 0.5.2 + nypm: 0.6.5 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.1.0 + pkg-types: 2.3.0 + semver: 7.7.4 + simple-git: 3.33.0 + sirv: 3.0.2 + structured-clone-es: 1.0.0 + tinyglobby: 0.2.15 + vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vite-plugin-inspect: 11.3.3(@nuxt/kit@4.4.2(magicast@0.5.2))(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + vite-plugin-vue-tracer: 1.2.0(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2)) + which: 5.0.0 + ws: 8.19.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + - vue + + '@nuxt/eslint-config@1.15.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 1.1.0 '@eslint/js': 9.39.4 - '@nuxt/eslint-plugin': 1.15.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@nuxt/eslint-plugin': 1.15.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) '@stylistic/eslint-plugin': 5.10.0(eslint@10.1.0(jiti@2.6.1)) - '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/eslint-plugin': 8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/parser': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) eslint: 10.1.0(jiti@2.6.1) eslint-config-flat-gitignore: 2.2.1(eslint@10.1.0(jiti@2.6.1)) eslint-flat-config-utils: 3.0.2 eslint-merge-processors: 2.0.0(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-import-lite: 0.5.2(eslint@10.1.0(jiti@2.6.1)) - eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)) + eslint-plugin-import-x: 4.16.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-jsdoc: 62.8.0(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-regexp: 3.1.0(eslint@10.1.0(jiti@2.6.1)) eslint-plugin-unicorn: 63.0.0(eslint@10.1.0(jiti@2.6.1)) - eslint-plugin-vue: 10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.1.0(jiti@2.6.1)))(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.1.0(jiti@2.6.1))) + eslint-plugin-vue: 10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.1.0(jiti@2.6.1)))(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.1.0(jiti@2.6.1))) eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1)) globals: 17.4.0 local-pkg: 1.1.2 @@ -8629,21 +8892,21 @@ snapshots: - supports-color - typescript - '@nuxt/eslint-plugin@1.15.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@nuxt/eslint-plugin@1.15.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) eslint: 10.1.0(jiti@2.6.1) transitivePeerDependencies: - supports-color - typescript - '@nuxt/eslint@1.15.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(magicast@0.5.2)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@nuxt/eslint@1.15.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(magicast@0.5.2)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@eslint/config-inspector': 1.5.0(eslint@10.1.0(jiti@2.6.1)) '@nuxt/devtools-kit': 3.2.3(magicast@0.5.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) - '@nuxt/eslint-config': 1.15.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@nuxt/eslint-plugin': 1.15.2(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@nuxt/eslint-config': 1.15.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@nuxt/eslint-plugin': 1.15.2(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) '@nuxt/kit': 4.4.2(magicast@0.5.2) chokidar: 5.0.0 eslint: 10.1.0(jiti@2.6.1) @@ -8767,6 +9030,27 @@ snapshots: - vite - vue + '@nuxt/icon@2.2.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@iconify/collections': 1.0.659 + '@iconify/types': 2.0.0 + '@iconify/utils': 3.1.0 + '@iconify/vue': 5.0.0(vue@3.5.30(typescript@6.0.2)) + '@nuxt/devtools-kit': 3.2.3(magicast@0.5.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@nuxt/kit': 4.3.1(magicast@0.5.2) + consola: 3.4.2 + local-pkg: 1.1.2 + mlly: 1.8.1 + ohash: 2.0.11 + pathe: 2.0.3 + picomatch: 4.0.3 + std-env: 3.10.0 + tinyglobby: 0.2.15 + transitivePeerDependencies: + - magicast + - vite + - vue + '@nuxt/kit@3.21.1(magicast@0.5.2)': dependencies: c12: 3.3.3(magicast@0.5.2) @@ -8935,12 +9219,12 @@ snapshots: - uploadthing - xml2js - '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.10.0)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3)': + '@nuxt/nitro-server@4.4.2(@babel/core@7.29.0)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.10.0)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2))(typescript@6.0.2)': dependencies: '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) '@nuxt/devalue': 2.0.2 '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3)) + '@unhead/vue': 2.1.12(vue@3.5.30(typescript@6.0.2)) '@vue/shared': 3.5.30 consola: 3.4.2 defu: 6.1.4 @@ -8954,7 +9238,7 @@ snapshots: klona: 2.0.6 mocked-exports: 0.1.1 nitropack: 2.13.1(better-sqlite3@12.8.0) - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2) nypm: 0.6.5 ohash: 2.0.11 pathe: 2.0.3 @@ -8964,7 +9248,7 @@ snapshots: ufo: 1.6.3 unctx: 2.5.0 unstorage: 1.17.4(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.10.0) - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.30(typescript@6.0.2) vue-bundle-renderer: 2.2.0 vue-devtools-stub: 0.1.0 transitivePeerDependencies: @@ -9038,7 +9322,7 @@ snapshots: rc9: 3.0.0 std-env: 3.10.0 - '@nuxt/test-utils@4.0.0(magicast@0.5.2)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + '@nuxt/test-utils@4.0.0(magicast@0.5.2)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@clack/prompts': 1.0.0 '@nuxt/devtools-kit': 2.7.0(magicast@0.5.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) @@ -9067,15 +9351,15 @@ snapshots: tinyexec: 1.0.4 ufo: 1.6.3 unplugin: 3.0.0 - vitest-environment-nuxt: 1.0.1(magicast@0.5.2)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) - vue: 3.5.30(typescript@5.9.3) + vitest-environment-nuxt: 1.0.1(magicast@0.5.2)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + vue: 3.5.30(typescript@6.0.2) transitivePeerDependencies: - crossws - magicast - typescript - vite - '@nuxt/ui@4.5.1(@nuxt/content@3.12.0(better-sqlite3@12.6.2)(magicast@0.5.2))(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(change-case@5.4.4)(db0@0.3.4(better-sqlite3@12.6.2))(embla-carousel@8.6.0)(ioredis@5.10.0)(magicast@0.5.2)(tailwindcss@4.2.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.28)(zod@3.25.76)': + '@nuxt/ui@4.5.1(@nuxt/content@3.12.0(better-sqlite3@12.6.2)(magicast@0.5.2))(@tiptap/extensions@3.20.5(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(change-case@5.4.4)(db0@0.3.4(better-sqlite3@12.6.2))(embla-carousel@8.6.0)(ioredis@5.10.0)(magicast@0.5.2)(tailwindcss@4.2.2)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.28)(zod@3.25.76)': dependencies: '@floating-ui/dom': 1.7.6 '@iconify/vue': 5.0.0(vue@3.5.30(typescript@5.9.3)) @@ -9102,7 +9386,7 @@ snapshots: '@tiptap/extension-image': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1)) '@tiptap/extension-mention': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/suggestion@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)) '@tiptap/extension-node-range': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) - '@tiptap/extension-placeholder': 3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)) + '@tiptap/extension-placeholder': 3.20.1(@tiptap/extensions@3.20.5(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)) '@tiptap/markdown': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 '@tiptap/starter-kit': 3.20.1 @@ -9133,8 +9417,8 @@ snapshots: reka-ui: 2.8.2(vue@3.5.30(typescript@5.9.3)) scule: 1.3.0 tailwind-merge: 3.5.0 - tailwind-variants: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) - tailwindcss: 4.2.1 + tailwind-variants: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.2) + tailwindcss: 4.2.2 tinyglobby: 0.2.15 typescript: 5.9.3 ufo: 1.6.3 @@ -9189,43 +9473,43 @@ snapshots: - vue - yjs - '@nuxt/ui@4.5.1(@nuxt/content@3.12.0(better-sqlite3@12.8.0)(magicast@0.5.2))(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(change-case@5.4.4)(db0@0.3.4(better-sqlite3@12.8.0))(embla-carousel@8.6.0)(ioredis@5.10.0)(magicast@0.5.2)(tailwindcss@4.2.1)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))(yjs@13.6.28)(zod@3.25.76)': + '@nuxt/ui@4.6.0(@nuxt/content@3.12.0(better-sqlite3@12.8.0)(magicast@0.5.2))(@tiptap/extensions@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(change-case@5.4.4)(db0@0.3.4(better-sqlite3@12.8.0))(embla-carousel@8.6.0)(ioredis@5.10.0)(magicast@0.5.2)(tailwindcss@4.2.2)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-router@5.0.4(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2))(yjs@13.6.28)(zod@3.25.76)': dependencies: '@floating-ui/dom': 1.7.6 - '@iconify/vue': 5.0.0(vue@3.5.30(typescript@5.9.3)) + '@iconify/vue': 5.0.0(vue@3.5.30(typescript@6.0.2)) '@internationalized/date': 3.12.0 '@internationalized/number': 3.6.5 '@nuxt/fonts': 0.14.0(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.10.0)(magicast@0.5.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) - '@nuxt/icon': 2.2.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) - '@nuxt/kit': 4.3.1(magicast@0.5.2) - '@nuxt/schema': 4.3.1 + '@nuxt/icon': 2.2.1(magicast@0.5.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2)) + '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@nuxt/schema': 4.4.2 '@nuxtjs/color-mode': 3.5.2(magicast@0.5.2) '@standard-schema/spec': 1.1.0 - '@tailwindcss/postcss': 4.2.1 - '@tailwindcss/vite': 4.2.1(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) - '@tanstack/vue-table': 8.21.3(vue@3.5.30(typescript@5.9.3)) - '@tanstack/vue-virtual': 3.13.21(vue@3.5.30(typescript@5.9.3)) - '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) - '@tiptap/extension-bubble-menu': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) - '@tiptap/extension-code': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1)) - '@tiptap/extension-collaboration': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28) - '@tiptap/extension-drag-handle': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/extension-collaboration@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)) - '@tiptap/extension-drag-handle-vue-3': 3.20.1(@tiptap/extension-drag-handle@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/extension-collaboration@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)))(@tiptap/pm@3.20.1)(@tiptap/vue-3@3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) - '@tiptap/extension-floating-menu': 3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) - '@tiptap/extension-horizontal-rule': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) - '@tiptap/extension-image': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1)) - '@tiptap/extension-mention': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/suggestion@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)) - '@tiptap/extension-node-range': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) - '@tiptap/extension-placeholder': 3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)) - '@tiptap/markdown': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) - '@tiptap/pm': 3.20.1 - '@tiptap/starter-kit': 3.20.1 - '@tiptap/suggestion': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) - '@tiptap/vue-3': 3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(vue@3.5.30(typescript@5.9.3)) - '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3)) - '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) - '@vueuse/integrations': 14.2.1(change-case@5.4.4)(fuse.js@7.1.0)(vue@3.5.30(typescript@5.9.3)) - '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@5.9.3)) + '@tailwindcss/postcss': 4.2.2 + '@tailwindcss/vite': 4.2.2(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@tanstack/vue-table': 8.21.3(vue@3.5.30(typescript@6.0.2)) + '@tanstack/vue-virtual': 3.13.23(vue@3.5.30(typescript@6.0.2)) + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-bubble-menu': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-code': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-collaboration': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28) + '@tiptap/extension-drag-handle': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/extension-collaboration@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)) + '@tiptap/extension-drag-handle-vue-3': 3.20.5(@tiptap/extension-drag-handle@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/extension-collaboration@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)))(@tiptap/pm@3.20.5)(@tiptap/vue-3@3.20.5(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)) + '@tiptap/extension-floating-menu': 3.20.5(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-horizontal-rule': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-image': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-mention': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/suggestion@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)) + '@tiptap/extension-node-range': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-placeholder': 3.20.5(@tiptap/extensions@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)) + '@tiptap/markdown': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/starter-kit': 3.20.5 + '@tiptap/suggestion': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/vue-3': 3.20.5(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(vue@3.5.30(typescript@6.0.2)) + '@unhead/vue': 2.1.12(vue@3.5.30(typescript@6.0.2)) + '@vueuse/core': 14.2.1(vue@3.5.30(typescript@6.0.2)) + '@vueuse/integrations': 14.2.1(change-case@5.4.4)(fuse.js@7.1.0)(vue@3.5.30(typescript@6.0.2)) + '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@6.0.2)) colortranslator: 5.0.0 consola: 3.4.2 defu: 6.1.4 @@ -9234,32 +9518,32 @@ snapshots: embla-carousel-autoplay: 8.6.0(embla-carousel@8.6.0) embla-carousel-class-names: 8.6.0(embla-carousel@8.6.0) embla-carousel-fade: 8.6.0(embla-carousel@8.6.0) - embla-carousel-vue: 8.6.0(vue@3.5.30(typescript@5.9.3)) + embla-carousel-vue: 8.6.0(vue@3.5.30(typescript@6.0.2)) embla-carousel-wheel-gestures: 8.1.0(embla-carousel@8.6.0) fuse.js: 7.1.0 - hookable: 5.5.3 + hookable: 6.1.0 knitwork: 1.3.0 magic-string: 0.30.21 - mlly: 1.8.1 - motion-v: 1.10.3(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) + mlly: 1.8.2 + motion-v: 2.2.0(@vueuse/core@14.2.1(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)) ohash: 2.0.11 pathe: 2.0.3 - reka-ui: 2.8.2(vue@3.5.30(typescript@5.9.3)) + reka-ui: 2.9.2(vue@3.5.30(typescript@6.0.2)) scule: 1.3.0 tailwind-merge: 3.5.0 - tailwind-variants: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1) - tailwindcss: 4.2.1 + tailwind-variants: 3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.2) + tailwindcss: 4.2.2 tinyglobby: 0.2.15 - typescript: 5.9.3 + typescript: 6.0.2 ufo: 1.6.3 unplugin: 3.0.0 - unplugin-auto-import: 21.0.0(@nuxt/kit@4.3.1(magicast@0.5.2))(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3))) - unplugin-vue-components: 31.0.0(@nuxt/kit@4.3.1(magicast@0.5.2))(vue@3.5.30(typescript@5.9.3)) - vaul-vue: 0.4.1(reka-ui@2.8.2(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) - vue-component-type-helpers: 3.2.5 + unplugin-auto-import: 21.0.0(@nuxt/kit@4.4.2(magicast@0.5.2))(@vueuse/core@14.2.1(vue@3.5.30(typescript@6.0.2))) + unplugin-vue-components: 31.1.0(@nuxt/kit@4.4.2(magicast@0.5.2))(vue@3.5.30(typescript@6.0.2)) + vaul-vue: 0.4.1(reka-ui@2.9.2(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)) + vue-component-type-helpers: 3.2.6 optionalDependencies: '@nuxt/content': 3.12.0(better-sqlite3@12.8.0)(magicast@0.5.2) - vue-router: 4.6.4(vue@3.5.30(typescript@5.9.3)) + vue-router: 5.0.4(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)) zod: 3.25.76 transitivePeerDependencies: - '@azure/app-configuration' @@ -9361,12 +9645,12 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.2.0)(eslint@10.1.0(jiti@2.6.1))(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.30(typescript@5.9.3))(yaml@2.8.2)': + '@nuxt/vite-builder@4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.2.0)(eslint@10.1.0(jiti@2.6.1))(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vue-tsc@3.2.6(typescript@6.0.2))(vue@3.5.30(typescript@6.0.2))(yaml@2.8.2)': dependencies: '@nuxt/kit': 4.4.2(magicast@0.5.2) '@rollup/plugin-replace': 6.0.3(rollup@4.59.0) - '@vitejs/plugin-vue': 6.0.5(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) - '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + '@vitejs/plugin-vue': 6.0.5(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2)) + '@vitejs/plugin-vue-jsx': 5.1.5(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2)) autoprefixer: 10.4.27(postcss@8.5.8) consola: 3.4.2 cssnano: 7.1.3(postcss@8.5.8) @@ -9379,7 +9663,7 @@ snapshots: magic-string: 0.30.21 mlly: 1.8.1 mocked-exports: 0.1.1 - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2) nypm: 0.6.5 pathe: 2.0.3 pkg-types: 2.3.0 @@ -9390,8 +9674,8 @@ snapshots: unenv: 2.0.0-rc.24 vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) vite-node: 5.3.0(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) - vite-plugin-checker: 0.12.0(eslint@10.1.0(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3)) - vue: 3.5.30(typescript@5.9.3) + vite-plugin-checker: 0.12.0(eslint@10.1.0(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2)) + vue: 3.5.30(typescript@6.0.2) vue-bundle-renderer: 2.2.0 optionalDependencies: '@babel/plugin-syntax-jsx': 7.28.6(@babel/core@7.29.0) @@ -9430,13 +9714,13 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxtjs/i18n@10.2.3(@vue/compiler-dom@3.5.30)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(magicast@0.5.2)(rollup@4.59.0)(vue@3.5.30(typescript@5.9.3))': + '@nuxtjs/i18n@10.2.4(@vue/compiler-dom@3.5.30)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(magicast@0.5.2)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup@4.59.0)(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2))': dependencies: '@intlify/core': 11.3.0 '@intlify/h3': 0.7.4 '@intlify/shared': 11.3.0 - '@intlify/unplugin-vue-i18n': 11.0.7(@vue/compiler-dom@3.5.30)(eslint@10.1.0(jiti@2.6.1))(rollup@4.59.0)(typescript@5.9.3)(vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) - '@intlify/utils': 0.13.0 + '@intlify/unplugin-vue-i18n': 11.0.7(@vue/compiler-dom@3.5.30)(eslint@10.1.0(jiti@2.6.1))(rollup@4.59.0)(typescript@6.0.2)(vue-i18n@11.3.0(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)) + '@intlify/utils': 0.14.1 '@miyaneee/rollup-plugin-json5': 1.2.0(rollup@4.59.0) '@nuxt/kit': 4.4.2(magicast@0.5.2) '@rollup/plugin-yaml': 4.1.2(rollup@4.59.0) @@ -9449,17 +9733,16 @@ snapshots: mlly: 1.8.1 nuxt-define: 1.0.0 ohash: 2.0.11 - oxc-parser: 0.95.0 - oxc-transform: 0.95.0 - oxc-walker: 0.5.2(oxc-parser@0.95.0) + oxc-parser: 0.112.0 + oxc-transform: 0.112.0 + oxc-walker: 0.7.0(oxc-parser@0.112.0) pathe: 2.0.3 - typescript: 5.9.3 ufo: 1.6.3 unplugin: 2.3.11 - unplugin-vue-router: 0.16.2(@vue/compiler-sfc@3.5.30)(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) + unrouting: 0.1.7 unstorage: 1.17.4(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.10.0) - vue-i18n: 11.3.0(vue@3.5.30(typescript@5.9.3)) - vue-router: 4.6.4(vue@3.5.30(typescript@5.9.3)) + vue-i18n: 11.3.0(vue@3.5.30(typescript@6.0.2)) + vue-router: 5.0.4(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)) transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -9470,6 +9753,7 @@ snapshots: - '@capacitor/preferences' - '@deno/kv' - '@netlify/blobs' + - '@pinia/colada' - '@planetscale/database' - '@upstash/redis' - '@vercel/blob' @@ -9483,8 +9767,10 @@ snapshots: - ioredis - magicast - petite-vue-i18n + - pinia - rollup - supports-color + - typescript - uploadthing - vue @@ -9673,72 +9959,48 @@ snapshots: '@oxc-parser/binding-android-arm64@0.117.0': optional: true - '@oxc-parser/binding-android-arm64@0.95.0': - optional: true - '@oxc-parser/binding-darwin-arm64@0.112.0': optional: true '@oxc-parser/binding-darwin-arm64@0.117.0': optional: true - '@oxc-parser/binding-darwin-arm64@0.95.0': - optional: true - '@oxc-parser/binding-darwin-x64@0.112.0': optional: true '@oxc-parser/binding-darwin-x64@0.117.0': optional: true - '@oxc-parser/binding-darwin-x64@0.95.0': - optional: true - '@oxc-parser/binding-freebsd-x64@0.112.0': optional: true '@oxc-parser/binding-freebsd-x64@0.117.0': optional: true - '@oxc-parser/binding-freebsd-x64@0.95.0': - optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.112.0': optional: true '@oxc-parser/binding-linux-arm-gnueabihf@0.117.0': optional: true - '@oxc-parser/binding-linux-arm-gnueabihf@0.95.0': - optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.112.0': optional: true '@oxc-parser/binding-linux-arm-musleabihf@0.117.0': optional: true - '@oxc-parser/binding-linux-arm-musleabihf@0.95.0': - optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.112.0': optional: true '@oxc-parser/binding-linux-arm64-gnu@0.117.0': optional: true - '@oxc-parser/binding-linux-arm64-gnu@0.95.0': - optional: true - '@oxc-parser/binding-linux-arm64-musl@0.112.0': optional: true '@oxc-parser/binding-linux-arm64-musl@0.117.0': optional: true - '@oxc-parser/binding-linux-arm64-musl@0.95.0': - optional: true - '@oxc-parser/binding-linux-ppc64-gnu@0.112.0': optional: true @@ -9751,9 +10013,6 @@ snapshots: '@oxc-parser/binding-linux-riscv64-gnu@0.117.0': optional: true - '@oxc-parser/binding-linux-riscv64-gnu@0.95.0': - optional: true - '@oxc-parser/binding-linux-riscv64-musl@0.112.0': optional: true @@ -9766,27 +10025,18 @@ snapshots: '@oxc-parser/binding-linux-s390x-gnu@0.117.0': optional: true - '@oxc-parser/binding-linux-s390x-gnu@0.95.0': - optional: true - '@oxc-parser/binding-linux-x64-gnu@0.112.0': optional: true '@oxc-parser/binding-linux-x64-gnu@0.117.0': optional: true - '@oxc-parser/binding-linux-x64-gnu@0.95.0': - optional: true - '@oxc-parser/binding-linux-x64-musl@0.112.0': optional: true '@oxc-parser/binding-linux-x64-musl@0.117.0': optional: true - '@oxc-parser/binding-linux-x64-musl@0.95.0': - optional: true - '@oxc-parser/binding-openharmony-arm64@0.112.0': optional: true @@ -9803,20 +10053,12 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@oxc-parser/binding-wasm32-wasi@0.95.0': - dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.112.0': optional: true '@oxc-parser/binding-win32-arm64-msvc@0.117.0': optional: true - '@oxc-parser/binding-win32-arm64-msvc@0.95.0': - optional: true - '@oxc-parser/binding-win32-ia32-msvc@0.112.0': optional: true @@ -9829,15 +10071,10 @@ snapshots: '@oxc-parser/binding-win32-x64-msvc@0.117.0': optional: true - '@oxc-parser/binding-win32-x64-msvc@0.95.0': - optional: true - '@oxc-project/types@0.112.0': {} '@oxc-project/types@0.117.0': {} - '@oxc-project/types@0.95.0': {} - '@oxc-transform/binding-android-arm-eabi@0.112.0': optional: true @@ -9850,72 +10087,48 @@ snapshots: '@oxc-transform/binding-android-arm64@0.117.0': optional: true - '@oxc-transform/binding-android-arm64@0.95.0': - optional: true - '@oxc-transform/binding-darwin-arm64@0.112.0': optional: true '@oxc-transform/binding-darwin-arm64@0.117.0': optional: true - '@oxc-transform/binding-darwin-arm64@0.95.0': - optional: true - '@oxc-transform/binding-darwin-x64@0.112.0': optional: true '@oxc-transform/binding-darwin-x64@0.117.0': optional: true - '@oxc-transform/binding-darwin-x64@0.95.0': - optional: true - '@oxc-transform/binding-freebsd-x64@0.112.0': optional: true '@oxc-transform/binding-freebsd-x64@0.117.0': optional: true - '@oxc-transform/binding-freebsd-x64@0.95.0': - optional: true - '@oxc-transform/binding-linux-arm-gnueabihf@0.112.0': optional: true '@oxc-transform/binding-linux-arm-gnueabihf@0.117.0': optional: true - '@oxc-transform/binding-linux-arm-gnueabihf@0.95.0': - optional: true - '@oxc-transform/binding-linux-arm-musleabihf@0.112.0': optional: true '@oxc-transform/binding-linux-arm-musleabihf@0.117.0': optional: true - '@oxc-transform/binding-linux-arm-musleabihf@0.95.0': - optional: true - '@oxc-transform/binding-linux-arm64-gnu@0.112.0': optional: true '@oxc-transform/binding-linux-arm64-gnu@0.117.0': optional: true - '@oxc-transform/binding-linux-arm64-gnu@0.95.0': - optional: true - '@oxc-transform/binding-linux-arm64-musl@0.112.0': optional: true '@oxc-transform/binding-linux-arm64-musl@0.117.0': optional: true - '@oxc-transform/binding-linux-arm64-musl@0.95.0': - optional: true - '@oxc-transform/binding-linux-ppc64-gnu@0.112.0': optional: true @@ -9928,9 +10141,6 @@ snapshots: '@oxc-transform/binding-linux-riscv64-gnu@0.117.0': optional: true - '@oxc-transform/binding-linux-riscv64-gnu@0.95.0': - optional: true - '@oxc-transform/binding-linux-riscv64-musl@0.112.0': optional: true @@ -9943,27 +10153,18 @@ snapshots: '@oxc-transform/binding-linux-s390x-gnu@0.117.0': optional: true - '@oxc-transform/binding-linux-s390x-gnu@0.95.0': - optional: true - '@oxc-transform/binding-linux-x64-gnu@0.112.0': optional: true '@oxc-transform/binding-linux-x64-gnu@0.117.0': optional: true - '@oxc-transform/binding-linux-x64-gnu@0.95.0': - optional: true - '@oxc-transform/binding-linux-x64-musl@0.112.0': optional: true '@oxc-transform/binding-linux-x64-musl@0.117.0': optional: true - '@oxc-transform/binding-linux-x64-musl@0.95.0': - optional: true - '@oxc-transform/binding-openharmony-arm64@0.112.0': optional: true @@ -9980,20 +10181,12 @@ snapshots: '@napi-rs/wasm-runtime': 1.1.1 optional: true - '@oxc-transform/binding-wasm32-wasi@0.95.0': - dependencies: - '@napi-rs/wasm-runtime': 1.1.1 - optional: true - '@oxc-transform/binding-win32-arm64-msvc@0.112.0': optional: true '@oxc-transform/binding-win32-arm64-msvc@0.117.0': optional: true - '@oxc-transform/binding-win32-arm64-msvc@0.95.0': - optional: true - '@oxc-transform/binding-win32-ia32-msvc@0.112.0': optional: true @@ -10006,9 +10199,6 @@ snapshots: '@oxc-transform/binding-win32-x64-msvc@0.117.0': optional: true - '@oxc-transform/binding-win32-x64-msvc@0.95.0': - optional: true - '@package-json/types@0.0.12': {} '@parcel/watcher-android-arm64@2.5.6': @@ -10076,10 +10266,10 @@ snapshots: '@parcel/watcher-win32-ia32': 2.5.6 '@parcel/watcher-win32-x64': 2.5.6 - '@pinia/nuxt@0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))': + '@pinia/nuxt@0.11.3(magicast@0.5.2)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))': dependencies: '@nuxt/kit': 4.4.2(magicast@0.5.2) - pinia: 3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)) + pinia: 3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)) transitivePeerDependencies: - magicast @@ -10376,42 +10566,88 @@ snapshots: source-map-js: 1.2.1 tailwindcss: 4.2.1 + '@tailwindcss/node@4.2.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + enhanced-resolve: 5.20.0 + jiti: 2.6.1 + lightningcss: 1.32.0 + magic-string: 0.30.21 + source-map-js: 1.2.1 + tailwindcss: 4.2.2 + '@tailwindcss/oxide-android-arm64@4.2.1': optional: true + '@tailwindcss/oxide-android-arm64@4.2.2': + optional: true + '@tailwindcss/oxide-darwin-arm64@4.2.1': optional: true + '@tailwindcss/oxide-darwin-arm64@4.2.2': + optional: true + '@tailwindcss/oxide-darwin-x64@4.2.1': optional: true + '@tailwindcss/oxide-darwin-x64@4.2.2': + optional: true + '@tailwindcss/oxide-freebsd-x64@4.2.1': optional: true + '@tailwindcss/oxide-freebsd-x64@4.2.2': + optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.1': optional: true + '@tailwindcss/oxide-linux-arm-gnueabihf@4.2.2': + optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.2.1': optional: true + '@tailwindcss/oxide-linux-arm64-gnu@4.2.2': + optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.2.1': optional: true + '@tailwindcss/oxide-linux-arm64-musl@4.2.2': + optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.2.1': optional: true + '@tailwindcss/oxide-linux-x64-gnu@4.2.2': + optional: true + '@tailwindcss/oxide-linux-x64-musl@4.2.1': optional: true + '@tailwindcss/oxide-linux-x64-musl@4.2.2': + optional: true + '@tailwindcss/oxide-wasm32-wasi@4.2.1': optional: true + '@tailwindcss/oxide-wasm32-wasi@4.2.2': + optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.2.1': optional: true + '@tailwindcss/oxide-win32-arm64-msvc@4.2.2': + optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.2.1': optional: true + '@tailwindcss/oxide-win32-x64-msvc@4.2.2': + optional: true + '@tailwindcss/oxide@4.2.1': optionalDependencies: '@tailwindcss/oxide-android-arm64': 4.2.1 @@ -10427,6 +10663,21 @@ snapshots: '@tailwindcss/oxide-win32-arm64-msvc': 4.2.1 '@tailwindcss/oxide-win32-x64-msvc': 4.2.1 + '@tailwindcss/oxide@4.2.2': + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-arm64': 4.2.2 + '@tailwindcss/oxide-darwin-x64': 4.2.2 + '@tailwindcss/oxide-freebsd-x64': 4.2.2 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.2.2 + '@tailwindcss/oxide-linux-arm64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-arm64-musl': 4.2.2 + '@tailwindcss/oxide-linux-x64-gnu': 4.2.2 + '@tailwindcss/oxide-linux-x64-musl': 4.2.2 + '@tailwindcss/oxide-wasm32-wasi': 4.2.2 + '@tailwindcss/oxide-win32-arm64-msvc': 4.2.2 + '@tailwindcss/oxide-win32-x64-msvc': 4.2.2 + '@tailwindcss/postcss@4.2.1': dependencies: '@alloc/quick-lru': 5.2.0 @@ -10435,6 +10686,14 @@ snapshots: postcss: 8.5.8 tailwindcss: 4.2.1 + '@tailwindcss/postcss@4.2.2': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + postcss: 8.5.8 + tailwindcss: 4.2.2 + '@tailwindcss/vite@4.2.1(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': dependencies: '@tailwindcss/node': 4.2.1 @@ -10442,51 +10701,101 @@ snapshots: tailwindcss: 4.2.1 vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + '@tailwindcss/vite@4.2.2(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))': + dependencies: + '@tailwindcss/node': 4.2.2 + '@tailwindcss/oxide': 4.2.2 + tailwindcss: 4.2.2 + vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + '@tanstack/table-core@8.21.3': {} '@tanstack/virtual-core@3.13.21': {} + '@tanstack/virtual-core@3.13.23': {} + '@tanstack/vue-table@8.21.3(vue@3.5.30(typescript@5.9.3))': dependencies: '@tanstack/table-core': 8.21.3 vue: 3.5.30(typescript@5.9.3) + '@tanstack/vue-table@8.21.3(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@tanstack/table-core': 8.21.3 + vue: 3.5.30(typescript@6.0.2) + '@tanstack/vue-virtual@3.13.21(vue@3.5.30(typescript@5.9.3))': dependencies: '@tanstack/virtual-core': 3.13.21 vue: 3.5.30(typescript@5.9.3) + '@tanstack/vue-virtual@3.13.23(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@tanstack/virtual-core': 3.13.23 + vue: 3.5.30(typescript@6.0.2) + '@tiptap/core@3.20.1(@tiptap/pm@3.20.1)': dependencies: '@tiptap/pm': 3.20.1 + '@tiptap/core@3.20.5(@tiptap/pm@3.20.5)': + dependencies: + '@tiptap/pm': 3.20.5 + '@tiptap/extension-blockquote@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-blockquote@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-bold@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-bold@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-bubble-menu@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@floating-ui/dom': 1.7.6 '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 + '@tiptap/extension-bubble-menu@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@floating-ui/dom': 1.7.6 + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/extension-bullet-list@3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))': dependencies: '@tiptap/extension-list': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + '@tiptap/extension-bullet-list@3.20.5(@tiptap/extension-list@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/extension-list': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-code-block@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 + '@tiptap/extension-code-block@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/extension-code@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-code@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-collaboration@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28)': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) @@ -10494,10 +10803,21 @@ snapshots: '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28) yjs: 13.6.28 + '@tiptap/extension-collaboration@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28)': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28) + yjs: 13.6.28 + '@tiptap/extension-document@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-document@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-drag-handle-vue-3@3.20.1(@tiptap/extension-drag-handle@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/extension-collaboration@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)))(@tiptap/pm@3.20.1)(@tiptap/vue-3@3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3))': dependencies: '@tiptap/extension-drag-handle': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/extension-collaboration@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)) @@ -10505,6 +10825,13 @@ snapshots: '@tiptap/vue-3': 3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(vue@3.5.30(typescript@5.9.3)) vue: 3.5.30(typescript@5.9.3) + '@tiptap/extension-drag-handle-vue-3@3.20.5(@tiptap/extension-drag-handle@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/extension-collaboration@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)))(@tiptap/pm@3.20.5)(@tiptap/vue-3@3.20.5(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@tiptap/extension-drag-handle': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/extension-collaboration@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)) + '@tiptap/pm': 3.20.5 + '@tiptap/vue-3': 3.20.5(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(vue@3.5.30(typescript@6.0.2)) + vue: 3.5.30(typescript@6.0.2) + '@tiptap/extension-drag-handle@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/extension-collaboration@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))': dependencies: '@floating-ui/dom': 1.7.6 @@ -10514,106 +10841,220 @@ snapshots: '@tiptap/pm': 3.20.1 '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28) + '@tiptap/extension-drag-handle@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/extension-collaboration@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28))(@tiptap/extension-node-range@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-collaboration': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28))(yjs@13.6.28) + '@tiptap/extension-node-range': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/y-tiptap': 3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28) + '@tiptap/extension-dropcursor@3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))': dependencies: '@tiptap/extensions': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + '@tiptap/extension-dropcursor@3.20.5(@tiptap/extensions@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/extensions': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-floating-menu@3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@floating-ui/dom': 1.7.6 '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 + '@tiptap/extension-floating-menu@3.20.5(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@floating-ui/dom': 1.7.6 + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/extension-gapcursor@3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))': dependencies: '@tiptap/extensions': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + '@tiptap/extension-gapcursor@3.20.5(@tiptap/extensions@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/extensions': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-hard-break@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-hard-break@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-heading@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-heading@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-horizontal-rule@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 + '@tiptap/extension-horizontal-rule@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/extension-image@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-image@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-italic@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-italic@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-link@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 linkifyjs: 4.3.2 + '@tiptap/extension-link@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + linkifyjs: 4.3.2 + '@tiptap/extension-list-item@3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))': dependencies: '@tiptap/extension-list': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + '@tiptap/extension-list-item@3.20.5(@tiptap/extension-list@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/extension-list': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-list-keymap@3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))': dependencies: '@tiptap/extension-list': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + '@tiptap/extension-list-keymap@3.20.5(@tiptap/extension-list@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/extension-list': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 + '@tiptap/extension-list@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/extension-mention@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(@tiptap/suggestion@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 '@tiptap/suggestion': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + '@tiptap/extension-mention@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(@tiptap/suggestion@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/suggestion': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-node-range@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 + '@tiptap/extension-node-range@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/extension-ordered-list@3.20.1(@tiptap/extension-list@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))': dependencies: '@tiptap/extension-list': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + '@tiptap/extension-ordered-list@3.20.5(@tiptap/extension-list@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/extension-list': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-paragraph@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) - '@tiptap/extension-placeholder@3.20.1(@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))': + '@tiptap/extension-paragraph@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': dependencies: - '@tiptap/extensions': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + + '@tiptap/extension-placeholder@3.20.1(@tiptap/extensions@3.20.5(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1))': + dependencies: + '@tiptap/extensions': 3.20.5(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + + '@tiptap/extension-placeholder@3.20.5(@tiptap/extensions@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/extensions': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) '@tiptap/extension-strike@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-strike@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-text@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-text@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-underline@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/extension-underline@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extensions@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 + '@tiptap/extensions@3.20.5(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': + dependencies: + '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) + '@tiptap/pm': 3.20.1 + + '@tiptap/extensions@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/markdown@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 marked: 17.0.4 + '@tiptap/markdown@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + marked: 17.0.4 + '@tiptap/pm@3.20.1': dependencies: prosemirror-changeset: 2.4.0 @@ -10635,6 +11076,27 @@ snapshots: prosemirror-transform: 1.11.0 prosemirror-view: 1.41.6 + '@tiptap/pm@3.20.5': + dependencies: + prosemirror-changeset: 2.4.0 + prosemirror-collab: 1.3.1 + prosemirror-commands: 1.7.1 + prosemirror-dropcursor: 1.8.2 + prosemirror-gapcursor: 1.4.1 + prosemirror-history: 1.5.0 + prosemirror-inputrules: 1.5.1 + prosemirror-keymap: 1.2.3 + prosemirror-markdown: 1.13.4 + prosemirror-menu: 1.3.0 + prosemirror-model: 1.25.4 + prosemirror-schema-basic: 1.2.4 + prosemirror-schema-list: 1.5.1 + prosemirror-state: 1.4.4 + prosemirror-tables: 1.8.5 + prosemirror-trailing-node: 3.0.0(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6) + prosemirror-transform: 1.11.0 + prosemirror-view: 1.41.6 + '@tiptap/starter-kit@3.20.1': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) @@ -10662,11 +11124,43 @@ snapshots: '@tiptap/extensions': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 + '@tiptap/starter-kit@3.20.5': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/extension-blockquote': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-bold': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-bullet-list': 3.20.5(@tiptap/extension-list@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)) + '@tiptap/extension-code': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-code-block': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-document': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-dropcursor': 3.20.5(@tiptap/extensions@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)) + '@tiptap/extension-gapcursor': 3.20.5(@tiptap/extensions@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)) + '@tiptap/extension-hard-break': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-heading': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-horizontal-rule': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-italic': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-link': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-list': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-list-item': 3.20.5(@tiptap/extension-list@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)) + '@tiptap/extension-list-keymap': 3.20.5(@tiptap/extension-list@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)) + '@tiptap/extension-ordered-list': 3.20.5(@tiptap/extension-list@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)) + '@tiptap/extension-paragraph': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-strike': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-text': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extension-underline': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5)) + '@tiptap/extensions': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/suggestion@3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)': dependencies: '@tiptap/core': 3.20.1(@tiptap/pm@3.20.1) '@tiptap/pm': 3.20.1 + '@tiptap/suggestion@3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)': + dependencies: + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + '@tiptap/vue-3@3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1)(vue@3.5.30(typescript@5.9.3))': dependencies: '@floating-ui/dom': 1.7.6 @@ -10677,6 +11171,16 @@ snapshots: '@tiptap/extension-bubble-menu': 3.20.1(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) '@tiptap/extension-floating-menu': 3.20.1(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.1(@tiptap/pm@3.20.1))(@tiptap/pm@3.20.1) + '@tiptap/vue-3@3.20.5(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5)(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@floating-ui/dom': 1.7.6 + '@tiptap/core': 3.20.5(@tiptap/pm@3.20.5) + '@tiptap/pm': 3.20.5 + vue: 3.5.30(typescript@6.0.2) + optionalDependencies: + '@tiptap/extension-bubble-menu': 3.20.5(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/extension-floating-menu': 3.20.5(@floating-ui/dom@1.7.6)(@tiptap/core@3.20.5(@tiptap/pm@3.20.5))(@tiptap/pm@3.20.5) + '@tiptap/y-tiptap@3.0.1(prosemirror-model@1.25.4)(prosemirror-state@1.4.4)(prosemirror-view@1.41.6)(y-protocols@1.0.7(yjs@13.6.28))(yjs@13.6.28)': dependencies: lib0: 0.2.117 @@ -10740,40 +11244,40 @@ snapshots: '@types/web-bluetooth@0.0.21': {} - '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/eslint-plugin@8.57.0(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/regexpp': 4.12.2 - '@typescript-eslint/parser': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/scope-manager': 8.57.0 - '@typescript-eslint/type-utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/type-utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) + '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) '@typescript-eslint/visitor-keys': 8.57.0 eslint: 10.1.0(jiti@2.6.1) ignore: 7.0.5 natural-compare: 1.4.0 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.4.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@typescript-eslint/scope-manager': 8.57.0 '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.57.0(typescript@6.0.2) '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3 eslint: 10.1.0(jiti@2.6.1) - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/project-service@8.57.0(typescript@5.9.3)': + '@typescript-eslint/project-service@8.57.0(typescript@6.0.2)': dependencies: - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@6.0.2) '@typescript-eslint/types': 8.57.0 debug: 4.4.3 - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -10782,47 +11286,47 @@ snapshots: '@typescript-eslint/types': 8.57.0 '@typescript-eslint/visitor-keys': 8.57.0 - '@typescript-eslint/tsconfig-utils@8.57.0(typescript@5.9.3)': + '@typescript-eslint/tsconfig-utils@8.57.0(typescript@6.0.2)': dependencies: - typescript: 5.9.3 + typescript: 6.0.2 - '@typescript-eslint/type-utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/type-utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) - '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.57.0(typescript@6.0.2) + '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) debug: 4.4.3 eslint: 10.1.0(jiti@2.6.1) - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.4.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.57.0': {} - '@typescript-eslint/typescript-estree@8.57.0(typescript@5.9.3)': + '@typescript-eslint/typescript-estree@8.57.0(typescript@6.0.2)': dependencies: - '@typescript-eslint/project-service': 8.57.0(typescript@5.9.3) - '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@5.9.3) + '@typescript-eslint/project-service': 8.57.0(typescript@6.0.2) + '@typescript-eslint/tsconfig-utils': 8.57.0(typescript@6.0.2) '@typescript-eslint/types': 8.57.0 '@typescript-eslint/visitor-keys': 8.57.0 debug: 4.4.3 minimatch: 10.2.4 semver: 7.7.4 tinyglobby: 0.2.15 - ts-api-utils: 2.4.0(typescript@5.9.3) - typescript: 5.9.3 + ts-api-utils: 2.4.0(typescript@6.0.2) + typescript: 6.0.2 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3)': + '@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2)': dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) '@typescript-eslint/scope-manager': 8.57.0 '@typescript-eslint/types': 8.57.0 - '@typescript-eslint/typescript-estree': 8.57.0(typescript@5.9.3) + '@typescript-eslint/typescript-estree': 8.57.0(typescript@6.0.2) eslint: 10.1.0(jiti@2.6.1) - typescript: 5.9.3 + typescript: 6.0.2 transitivePeerDependencies: - supports-color @@ -10839,6 +11343,12 @@ snapshots: unhead: 2.1.12 vue: 3.5.30(typescript@5.9.3) + '@unhead/vue@2.1.12(vue@3.5.30(typescript@6.0.2))': + dependencies: + hookable: 6.0.1 + unhead: 2.1.12 + vue: 3.5.30(typescript@6.0.2) + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -10929,7 +11439,7 @@ snapshots: transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))': + '@vitejs/plugin-vue-jsx@5.1.5(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2))': dependencies: '@babel/core': 7.29.0 '@babel/plugin-syntax-typescript': 7.28.6(@babel/core@7.29.0) @@ -10937,7 +11447,7 @@ snapshots: '@rolldown/pluginutils': 1.0.0-rc.9 '@vue/babel-plugin-jsx': 2.0.1(@babel/core@7.29.0) vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.30(typescript@6.0.2) transitivePeerDependencies: - supports-color @@ -10947,11 +11457,11 @@ snapshots: vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) vue: 3.5.30(typescript@5.9.3) - '@vitejs/plugin-vue@6.0.5(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))': + '@vitejs/plugin-vue@6.0.5(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2))': dependencies: '@rolldown/pluginutils': 1.0.0-rc.2 vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.30(typescript@6.0.2) '@volar/language-core@2.4.28': dependencies: @@ -10975,6 +11485,16 @@ snapshots: optionalDependencies: vue: 3.5.30(typescript@5.9.3) + '@vue-macros/common@3.1.2(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@vue/compiler-sfc': 3.5.30 + ast-kit: 2.2.0 + local-pkg: 1.1.2 + magic-string-ast: 1.0.3 + unplugin-utils: 0.3.1 + optionalDependencies: + vue: 3.5.30(typescript@6.0.2) + '@vue/babel-helper-vue-transform-on@2.0.1': {} '@vue/babel-plugin-jsx@2.0.1(@babel/core@7.29.0)': @@ -11050,6 +11570,12 @@ snapshots: '@vue/devtools-shared': 8.0.7 vue: 3.5.30(typescript@5.9.3) + '@vue/devtools-core@8.0.7(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@vue/devtools-kit': 8.0.7 + '@vue/devtools-shared': 8.0.7 + vue: 3.5.30(typescript@6.0.2) + '@vue/devtools-kit@7.7.9': dependencies: '@vue/devtools-shared': 7.7.9 @@ -11124,6 +11650,12 @@ snapshots: '@vue/shared': 3.5.30 vue: 3.5.30(typescript@5.9.3) + '@vue/server-renderer@3.5.30(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@vue/compiler-ssr': 3.5.30 + '@vue/shared': 3.5.30 + vue: 3.5.30(typescript@6.0.2) + '@vue/shared@3.5.30': {} '@vueuse/core@10.11.1(vue@3.5.30(typescript@5.9.3))': @@ -11136,6 +11668,16 @@ snapshots: - '@vue/composition-api' - vue + '@vueuse/core@10.11.1(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.30(typescript@6.0.2)) + vue-demi: 0.14.10(vue@3.5.30(typescript@6.0.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3))': dependencies: '@types/web-bluetooth': 0.0.21 @@ -11143,6 +11685,13 @@ snapshots: '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@5.9.3)) vue: 3.5.30(typescript@5.9.3) + '@vueuse/core@14.2.1(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 14.2.1 + '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@6.0.2)) + vue: 3.5.30(typescript@6.0.2) + '@vueuse/integrations@14.2.1(change-case@5.4.4)(fuse.js@7.1.0)(vue@3.5.30(typescript@5.9.3))': dependencies: '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) @@ -11152,18 +11701,27 @@ snapshots: change-case: 5.4.4 fuse.js: 7.1.0 + '@vueuse/integrations@14.2.1(change-case@5.4.4)(fuse.js@7.1.0)(vue@3.5.30(typescript@6.0.2))': + dependencies: + '@vueuse/core': 14.2.1(vue@3.5.30(typescript@6.0.2)) + '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@6.0.2)) + vue: 3.5.30(typescript@6.0.2) + optionalDependencies: + change-case: 5.4.4 + fuse.js: 7.1.0 + '@vueuse/metadata@10.11.1': {} '@vueuse/metadata@14.2.1': {} - '@vueuse/nuxt@14.2.1(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3))': + '@vueuse/nuxt@14.2.1(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2))': dependencies: '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) + '@vueuse/core': 14.2.1(vue@3.5.30(typescript@6.0.2)) '@vueuse/metadata': 14.2.1 local-pkg: 1.1.2 - nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2) - vue: 3.5.30(typescript@5.9.3) + nuxt: 4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2) + vue: 3.5.30(typescript@6.0.2) transitivePeerDependencies: - magicast @@ -11174,10 +11732,21 @@ snapshots: - '@vue/composition-api' - vue + '@vueuse/shared@10.11.1(vue@3.5.30(typescript@6.0.2))': + dependencies: + vue-demi: 0.14.10(vue@3.5.30(typescript@6.0.2)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@vueuse/shared@14.2.1(vue@3.5.30(typescript@5.9.3))': dependencies: vue: 3.5.30(typescript@5.9.3) + '@vueuse/shared@14.2.1(vue@3.5.30(typescript@6.0.2))': + dependencies: + vue: 3.5.30(typescript@6.0.2) + '@webcontainer/env@1.1.1': {} abbrev@3.0.1: {} @@ -11583,21 +12152,21 @@ snapshots: core-util-is@1.0.3: {} - cosmiconfig-typescript-loader@6.2.0(@types/node@25.2.0)(cosmiconfig@9.0.1(typescript@5.9.3))(typescript@5.9.3): + cosmiconfig-typescript-loader@6.2.0(@types/node@25.2.0)(cosmiconfig@9.0.1(typescript@6.0.2))(typescript@6.0.2): dependencies: '@types/node': 25.2.0 - cosmiconfig: 9.0.1(typescript@5.9.3) + cosmiconfig: 9.0.1(typescript@6.0.2) jiti: 2.6.1 - typescript: 5.9.3 + typescript: 6.0.2 - cosmiconfig@9.0.1(typescript@5.9.3): + cosmiconfig@9.0.1(typescript@6.0.2): dependencies: env-paths: 2.2.1 import-fresh: 3.3.1 js-yaml: 4.1.1 parse-json: 5.2.0 optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.2 crc-32@1.2.2: {} @@ -11837,6 +12406,12 @@ snapshots: embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) vue: 3.5.30(typescript@5.9.3) + embla-carousel-vue@8.6.0(vue@3.5.30(typescript@6.0.2)): + dependencies: + embla-carousel: 8.6.0 + embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) + vue: 3.5.30(typescript@6.0.2) + embla-carousel-wheel-gestures@8.1.0(embla-carousel@8.6.0): dependencies: embla-carousel: 8.6.0 @@ -12033,7 +12608,7 @@ snapshots: dependencies: eslint: 10.1.0(jiti@2.6.1) - eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1)): + eslint-plugin-import-x@4.16.2(@typescript-eslint/utils@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1)): dependencies: '@package-json/types': 0.0.12 '@typescript-eslint/types': 8.57.0 @@ -12047,7 +12622,7 @@ snapshots: stable-hash-x: 0.2.0 unrs-resolver: 1.11.1 optionalDependencies: - '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/utils': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) transitivePeerDependencies: - supports-color @@ -12102,7 +12677,7 @@ snapshots: semver: 7.7.4 strip-indent: 4.1.1 - eslint-plugin-vue@10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.1.0(jiti@2.6.1)))(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3))(eslint@10.1.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.1.0(jiti@2.6.1))): + eslint-plugin-vue@10.8.0(@stylistic/eslint-plugin@5.10.0(eslint@10.1.0(jiti@2.6.1)))(@typescript-eslint/parser@8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2))(eslint@10.1.0(jiti@2.6.1))(vue-eslint-parser@10.4.0(eslint@10.1.0(jiti@2.6.1))): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.1.0(jiti@2.6.1)) eslint: 10.1.0(jiti@2.6.1) @@ -12114,7 +12689,7 @@ snapshots: xml-name-validator: 4.0.0 optionalDependencies: '@stylistic/eslint-plugin': 5.10.0(eslint@10.1.0(jiti@2.6.1)) - '@typescript-eslint/parser': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.57.0(eslint@10.1.0(jiti@2.6.1))(typescript@6.0.2) eslint-processor-vue-blocks@2.0.0(@vue/compiler-sfc@3.5.30)(eslint@10.1.0(jiti@2.6.1)): dependencies: @@ -12413,6 +12988,12 @@ snapshots: motion-utils: 12.29.2 tslib: 2.8.1 + framer-motion@12.38.0: + dependencies: + motion-dom: 12.38.0 + motion-utils: 12.36.0 + tslib: 2.8.1 + fresh@2.0.0: {} fs-constants@1.0.0: {} @@ -12715,6 +13296,8 @@ snapshots: hookable@6.0.1: {} + hookable@6.1.0: {} + html-entities@2.6.0: {} html-void-elements@3.0.0: {} @@ -13574,14 +14157,27 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.3 + mlly@1.8.2: + dependencies: + acorn: 8.16.0 + pathe: 2.0.3 + pkg-types: 1.3.1 + ufo: 1.6.3 + mocked-exports@0.1.1: {} motion-dom@12.35.2: dependencies: motion-utils: 12.29.2 + motion-dom@12.38.0: + dependencies: + motion-utils: 12.36.0 + motion-utils@12.29.2: {} + motion-utils@12.36.0: {} + motion-v@1.10.3(@vueuse/core@14.2.1(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)): dependencies: '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) @@ -13594,6 +14190,19 @@ snapshots: - react - react-dom + motion-v@2.2.0(@vueuse/core@14.2.1(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)): + dependencies: + '@vueuse/core': 14.2.1(vue@3.5.30(typescript@6.0.2)) + framer-motion: 12.38.0 + hey-listen: 1.0.8 + motion-dom: 12.38.0 + motion-utils: 12.36.0 + vue: 3.5.30(typescript@6.0.2) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - react + - react-dom + mrmime@2.0.1: {} ms@2.1.3: {} @@ -14003,17 +14612,17 @@ snapshots: - xml2js - yaml - nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2): + nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2): dependencies: - '@dxup/nuxt': 0.4.0(magicast@0.5.2)(typescript@5.9.3) + '@dxup/nuxt': 0.4.0(magicast@0.5.2)(typescript@6.0.2) '@nuxt/cli': 3.34.0(@nuxt/schema@4.4.2)(cac@6.7.14)(magicast@0.5.2) - '@nuxt/devtools': 3.2.3(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@5.9.3)) + '@nuxt/devtools': 3.2.3(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2)) '@nuxt/kit': 4.4.2(magicast@0.5.2) - '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.10.0)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2))(typescript@5.9.3) + '@nuxt/nitro-server': 4.4.2(@babel/core@7.29.0)(better-sqlite3@12.8.0)(db0@0.3.4(better-sqlite3@12.8.0))(ioredis@5.10.0)(magicast@0.5.2)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2))(typescript@6.0.2) '@nuxt/schema': 4.4.2 '@nuxt/telemetry': 2.7.0(@nuxt/kit@4.4.2(magicast@0.5.2)) - '@nuxt/vite-builder': 4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.2.0)(eslint@10.1.0(jiti@2.6.1))(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@5.9.3))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@5.9.3)(vue-tsc@3.2.6(typescript@5.9.3))(vue@3.5.30(typescript@5.9.3))(yaml@2.8.2) - '@unhead/vue': 2.1.12(vue@3.5.30(typescript@5.9.3)) + '@nuxt/vite-builder': 4.4.2(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@types/node@25.2.0)(eslint@10.1.0(jiti@2.6.1))(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(nuxt@4.4.2(@babel/core@7.29.0)(@babel/plugin-syntax-jsx@7.28.6(@babel/core@7.29.0))(@parcel/watcher@2.5.6)(@types/node@25.2.0)(@vue/compiler-sfc@3.5.30)(better-sqlite3@12.8.0)(cac@6.7.14)(db0@0.3.4(better-sqlite3@12.8.0))(eslint@10.1.0(jiti@2.6.1))(ioredis@5.10.0)(lightningcss@1.32.0)(magicast@0.5.2)(meow@13.2.0)(optionator@0.9.4)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2))(yaml@2.8.2))(optionator@0.9.4)(rollup-plugin-visualizer@6.0.11(rollup@4.59.0))(rollup@4.59.0)(terser@5.46.0)(typescript@6.0.2)(vue-tsc@3.2.6(typescript@6.0.2))(vue@3.5.30(typescript@6.0.2))(yaml@2.8.2) + '@unhead/vue': 2.1.12(vue@3.5.30(typescript@6.0.2)) '@vue/shared': 3.5.30 c12: 3.3.3(magicast@0.5.2) chokidar: 5.0.0 @@ -14059,8 +14668,8 @@ snapshots: unplugin: 3.0.0 unrouting: 0.1.7 untyped: 2.0.0 - vue: 3.5.30(typescript@5.9.3) - vue-router: 5.0.3(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)) + vue: 3.5.30(typescript@6.0.2) + vue-router: 5.0.3(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)) optionalDependencies: '@parcel/watcher': 2.5.6 '@types/node': 25.2.0 @@ -14295,26 +14904,6 @@ snapshots: '@oxc-parser/binding-win32-ia32-msvc': 0.117.0 '@oxc-parser/binding-win32-x64-msvc': 0.117.0 - oxc-parser@0.95.0: - dependencies: - '@oxc-project/types': 0.95.0 - optionalDependencies: - '@oxc-parser/binding-android-arm64': 0.95.0 - '@oxc-parser/binding-darwin-arm64': 0.95.0 - '@oxc-parser/binding-darwin-x64': 0.95.0 - '@oxc-parser/binding-freebsd-x64': 0.95.0 - '@oxc-parser/binding-linux-arm-gnueabihf': 0.95.0 - '@oxc-parser/binding-linux-arm-musleabihf': 0.95.0 - '@oxc-parser/binding-linux-arm64-gnu': 0.95.0 - '@oxc-parser/binding-linux-arm64-musl': 0.95.0 - '@oxc-parser/binding-linux-riscv64-gnu': 0.95.0 - '@oxc-parser/binding-linux-s390x-gnu': 0.95.0 - '@oxc-parser/binding-linux-x64-gnu': 0.95.0 - '@oxc-parser/binding-linux-x64-musl': 0.95.0 - '@oxc-parser/binding-wasm32-wasi': 0.95.0 - '@oxc-parser/binding-win32-arm64-msvc': 0.95.0 - '@oxc-parser/binding-win32-x64-msvc': 0.95.0 - oxc-transform@0.112.0: optionalDependencies: '@oxc-transform/binding-android-arm-eabi': 0.112.0 @@ -14361,29 +14950,6 @@ snapshots: '@oxc-transform/binding-win32-ia32-msvc': 0.117.0 '@oxc-transform/binding-win32-x64-msvc': 0.117.0 - oxc-transform@0.95.0: - optionalDependencies: - '@oxc-transform/binding-android-arm64': 0.95.0 - '@oxc-transform/binding-darwin-arm64': 0.95.0 - '@oxc-transform/binding-darwin-x64': 0.95.0 - '@oxc-transform/binding-freebsd-x64': 0.95.0 - '@oxc-transform/binding-linux-arm-gnueabihf': 0.95.0 - '@oxc-transform/binding-linux-arm-musleabihf': 0.95.0 - '@oxc-transform/binding-linux-arm64-gnu': 0.95.0 - '@oxc-transform/binding-linux-arm64-musl': 0.95.0 - '@oxc-transform/binding-linux-riscv64-gnu': 0.95.0 - '@oxc-transform/binding-linux-s390x-gnu': 0.95.0 - '@oxc-transform/binding-linux-x64-gnu': 0.95.0 - '@oxc-transform/binding-linux-x64-musl': 0.95.0 - '@oxc-transform/binding-wasm32-wasi': 0.95.0 - '@oxc-transform/binding-win32-arm64-msvc': 0.95.0 - '@oxc-transform/binding-win32-x64-msvc': 0.95.0 - - oxc-walker@0.5.2(oxc-parser@0.95.0): - dependencies: - magic-regexp: 0.10.0 - oxc-parser: 0.95.0 - oxc-walker@0.7.0(oxc-parser@0.112.0): dependencies: magic-regexp: 0.10.0 @@ -14498,12 +15064,12 @@ snapshots: pify@4.0.1: {} - pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)): + pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)): dependencies: '@vue/devtools-api': 7.7.9 - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.30(typescript@6.0.2) optionalDependencies: - typescript: 5.9.3 + typescript: 6.0.2 pkg-types@1.3.1: dependencies: @@ -14979,6 +15545,22 @@ snapshots: transitivePeerDependencies: - '@vue/composition-api' + reka-ui@2.9.2(vue@3.5.30(typescript@6.0.2)): + dependencies: + '@floating-ui/dom': 1.7.6 + '@floating-ui/vue': 1.1.11(vue@3.5.30(typescript@6.0.2)) + '@internationalized/date': 3.12.0 + '@internationalized/number': 3.6.5 + '@tanstack/vue-virtual': 3.13.23(vue@3.5.30(typescript@6.0.2)) + '@vueuse/core': 14.2.1(vue@3.5.30(typescript@6.0.2)) + '@vueuse/shared': 14.2.1(vue@3.5.30(typescript@6.0.2)) + aria-hidden: 1.2.6 + defu: 6.1.4 + ohash: 2.0.11 + vue: 3.5.30(typescript@6.0.2) + transitivePeerDependencies: + - '@vue/composition-api' + remark-emoji@5.0.2: dependencies: '@types/mdast': 4.0.4 @@ -15394,14 +15976,16 @@ snapshots: tailwind-merge@3.5.0: {} - tailwind-variants@3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.1): + tailwind-variants@3.2.2(tailwind-merge@3.5.0)(tailwindcss@4.2.2): dependencies: - tailwindcss: 4.2.1 + tailwindcss: 4.2.2 optionalDependencies: tailwind-merge: 3.5.0 tailwindcss@4.2.1: {} + tailwindcss@4.2.2: {} + tapable@2.3.0: {} tar-fs@2.1.4: @@ -15502,9 +16086,9 @@ snapshots: trough@2.2.0: {} - ts-api-utils@2.4.0(typescript@5.9.3): + ts-api-utils@2.4.0(typescript@6.0.2): dependencies: - typescript: 5.9.3 + typescript: 6.0.2 tslib@2.8.1: {} @@ -15530,6 +16114,8 @@ snapshots: typescript@5.9.3: {} + typescript@6.0.2: {} + uc.micro@2.1.0: {} ufo@1.6.3: {} @@ -15655,6 +16241,18 @@ snapshots: '@nuxt/kit': 4.3.1(magicast@0.5.2) '@vueuse/core': 14.2.1(vue@3.5.30(typescript@5.9.3)) + unplugin-auto-import@21.0.0(@nuxt/kit@4.4.2(magicast@0.5.2))(@vueuse/core@14.2.1(vue@3.5.30(typescript@6.0.2))): + dependencies: + local-pkg: 1.1.2 + magic-string: 0.30.21 + picomatch: 4.0.3 + unimport: 5.7.0 + unplugin: 2.3.11 + unplugin-utils: 0.3.1 + optionalDependencies: + '@nuxt/kit': 4.4.2(magicast@0.5.2) + '@vueuse/core': 14.2.1(vue@3.5.30(typescript@6.0.2)) + unplugin-utils@0.3.1: dependencies: pathe: 2.0.3 @@ -15675,30 +16273,20 @@ snapshots: optionalDependencies: '@nuxt/kit': 4.3.1(magicast@0.5.2) - unplugin-vue-router@0.16.2(@vue/compiler-sfc@3.5.30)(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)): + unplugin-vue-components@31.1.0(@nuxt/kit@4.4.2(magicast@0.5.2))(vue@3.5.30(typescript@6.0.2)): dependencies: - '@babel/generator': 7.29.1 - '@vue-macros/common': 3.1.2(vue@3.5.30(typescript@5.9.3)) - '@vue/compiler-sfc': 3.5.30 - '@vue/language-core': 3.2.5 - ast-walker-scope: 0.8.3 - chokidar: 4.0.3 - json5: 2.2.3 + chokidar: 5.0.0 local-pkg: 1.1.2 magic-string: 0.30.21 - mlly: 1.8.1 - muggle-string: 0.4.1 - pathe: 2.0.3 + mlly: 1.8.2 + obug: 2.1.1 picomatch: 4.0.3 - scule: 1.3.0 tinyglobby: 0.2.15 unplugin: 2.3.11 unplugin-utils: 0.3.1 - yaml: 2.8.2 + vue: 3.5.30(typescript@6.0.2) optionalDependencies: - vue-router: 4.6.4(vue@3.5.30(typescript@5.9.3)) - transitivePeerDependencies: - - vue + '@nuxt/kit': 4.4.2(magicast@0.5.2) unplugin-vue-router@0.19.2(@vue/compiler-sfc@3.5.30)(vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)): dependencies: @@ -15840,6 +16428,14 @@ snapshots: transitivePeerDependencies: - '@vue/composition-api' + vaul-vue@0.4.1(reka-ui@2.9.2(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)): + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.30(typescript@6.0.2)) + reka-ui: 2.9.2(vue@3.5.30(typescript@6.0.2)) + vue: 3.5.30(typescript@6.0.2) + transitivePeerDependencies: + - '@vue/composition-api' + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -15903,6 +16499,24 @@ snapshots: typescript: 5.9.3 vue-tsc: 3.2.6(typescript@5.9.3) + vite-plugin-checker@0.12.0(eslint@10.1.0(jiti@2.6.1))(meow@13.2.0)(optionator@0.9.4)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue-tsc@3.2.6(typescript@6.0.2)): + dependencies: + '@babel/code-frame': 7.29.0 + chokidar: 4.0.3 + npm-run-path: 6.0.0 + picocolors: 1.1.1 + picomatch: 4.0.3 + tiny-invariant: 1.3.3 + tinyglobby: 0.2.15 + vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vscode-uri: 3.1.0 + optionalDependencies: + eslint: 10.1.0(jiti@2.6.1) + meow: 13.2.0 + optionator: 0.9.4 + typescript: 6.0.2 + vue-tsc: 3.2.6(typescript@6.0.2) + vite-plugin-inspect@11.3.3(@nuxt/kit@4.4.2(magicast@0.5.2))(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)): dependencies: ansis: 4.2.0 @@ -15930,6 +16544,16 @@ snapshots: vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) vue: 3.5.30(typescript@5.9.3) + vite-plugin-vue-tracer@1.2.0(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2))(vue@3.5.30(typescript@6.0.2)): + dependencies: + estree-walker: 3.0.3 + exsolve: 1.0.8 + magic-string: 0.30.21 + pathe: 2.0.3 + source-map-js: 1.2.1 + vite: 7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2) + vue: 3.5.30(typescript@6.0.2) + vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2): dependencies: esbuild: 0.27.3 @@ -15946,9 +16570,9 @@ snapshots: terser: 5.46.0 yaml: 2.8.2 - vitest-environment-nuxt@1.0.1(magicast@0.5.2)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)): + vitest-environment-nuxt@1.0.1(magicast@0.5.2)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)): dependencies: - '@nuxt/test-utils': 4.0.0(magicast@0.5.2)(typescript@5.9.3)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) + '@nuxt/test-utils': 4.0.0(magicast@0.5.2)(typescript@6.0.2)(vite@7.3.1(@types/node@25.2.0)(jiti@2.6.1)(lightningcss@1.32.0)(terser@5.46.0)(yaml@2.8.2)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -15981,10 +16605,16 @@ snapshots: vue-component-type-helpers@3.2.5: {} + vue-component-type-helpers@3.2.6: {} + vue-demi@0.14.10(vue@3.5.30(typescript@5.9.3)): dependencies: vue: 3.5.30(typescript@5.9.3) + vue-demi@0.14.10(vue@3.5.30(typescript@6.0.2)): + dependencies: + vue: 3.5.30(typescript@6.0.2) + vue-devtools-stub@0.1.0: {} vue-eslint-parser@10.4.0(eslint@10.1.0(jiti@2.6.1)): @@ -15999,23 +16629,23 @@ snapshots: transitivePeerDependencies: - supports-color - vue-i18n@11.3.0(vue@3.5.30(typescript@5.9.3)): + vue-i18n@11.3.0(vue@3.5.30(typescript@6.0.2)): dependencies: '@intlify/core-base': 11.3.0 '@intlify/devtools-types': 11.3.0 '@intlify/shared': 11.3.0 '@vue/devtools-api': 6.6.4 - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.30(typescript@6.0.2) vue-router@4.6.4(vue@3.5.30(typescript@5.9.3)): dependencies: '@vue/devtools-api': 6.6.4 vue: 3.5.30(typescript@5.9.3) - vue-router@5.0.3(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)))(vue@3.5.30(typescript@5.9.3)): + vue-router@5.0.3(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)): dependencies: '@babel/generator': 7.29.1 - '@vue-macros/common': 3.1.2(vue@3.5.30(typescript@5.9.3)) + '@vue-macros/common': 3.1.2(vue@3.5.30(typescript@6.0.2)) '@vue/devtools-api': 8.1.0 ast-walker-scope: 0.8.3 chokidar: 5.0.0 @@ -16030,17 +16660,48 @@ snapshots: tinyglobby: 0.2.15 unplugin: 3.0.0 unplugin-utils: 0.3.1 - vue: 3.5.30(typescript@5.9.3) + vue: 3.5.30(typescript@6.0.2) yaml: 2.8.2 optionalDependencies: '@vue/compiler-sfc': 3.5.30 - pinia: 3.0.4(typescript@5.9.3)(vue@3.5.30(typescript@5.9.3)) + pinia: 3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)) + + vue-router@5.0.4(@vue/compiler-sfc@3.5.30)(pinia@3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)))(vue@3.5.30(typescript@6.0.2)): + dependencies: + '@babel/generator': 7.29.1 + '@vue-macros/common': 3.1.2(vue@3.5.30(typescript@6.0.2)) + '@vue/devtools-api': 8.1.0 + ast-walker-scope: 0.8.3 + chokidar: 5.0.0 + json5: 2.2.3 + local-pkg: 1.1.2 + magic-string: 0.30.21 + mlly: 1.8.1 + muggle-string: 0.4.1 + pathe: 2.0.3 + picomatch: 4.0.3 + scule: 1.3.0 + tinyglobby: 0.2.15 + unplugin: 3.0.0 + unplugin-utils: 0.3.1 + vue: 3.5.30(typescript@6.0.2) + yaml: 2.8.2 + optionalDependencies: + '@vue/compiler-sfc': 3.5.30 + pinia: 3.0.4(typescript@6.0.2)(vue@3.5.30(typescript@6.0.2)) vue-tsc@3.2.6(typescript@5.9.3): dependencies: '@volar/typescript': 2.4.28 '@vue/language-core': 3.2.6 typescript: 5.9.3 + optional: true + + vue-tsc@3.2.6(typescript@6.0.2): + dependencies: + '@volar/typescript': 2.4.28 + '@vue/language-core': 3.2.6 + typescript: 6.0.2 vue@3.5.30(typescript@5.9.3): dependencies: @@ -16052,6 +16713,16 @@ snapshots: optionalDependencies: typescript: 5.9.3 + vue@3.5.30(typescript@6.0.2): + dependencies: + '@vue/compiler-dom': 3.5.30 + '@vue/compiler-sfc': 3.5.30 + '@vue/runtime-dom': 3.5.30 + '@vue/server-renderer': 3.5.30(vue@3.5.30(typescript@6.0.2)) + '@vue/shared': 3.5.30 + optionalDependencies: + typescript: 6.0.2 + w3c-keyname@2.2.8: {} web-namespaces@2.0.1: {} diff --git a/pyproject.toml b/pyproject.toml index 63180025..442ba5d9 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "jairocloud-groups-manager" -version = "1.0.0a1" +version = "1.0.0a2" authors = [ {name = "National Institute of Informatics"} ] @@ -9,28 +9,28 @@ readme = "README.md" license = {file = "LICENSE"} requires-python = ">=3.14" dependencies = [ - "celery[redis]>=5.6.2", - "flask>=3.1.3", - "flask-login>=0.6.3", - "flask-pydantic>=0.14.0", - "flask-sqlalchemy>=3.1.1", - "openpyxl>=3.1.5", - "psycopg[binary]>=3.3.3", - "pydantic-settings>=2.13.1", - "pydantic[email]>=2.12.5", - "requests>=2.32.5", - "sqlalchemy-utils>=0.42.1", - "weko-group-cache-db", + "celery[redis]>=5.6.2", + "flask>=3.1.3", + "flask-login>=0.6.3", + "flask-pydantic>=0.14.0", + "flask-sqlalchemy>=3.1.1", + "openpyxl>=3.1.5", + "psycopg[binary]>=3.3.3", + "pydantic-settings>=2.13.1", + "pydantic[email]>=2.12.5", + "requests>=2.32.5", + "sqlalchemy-utils>=0.42.1", + "weko-group-cache-db", ] [dependency-groups] dev = [ - "celery-types>=0.24.0", - "pyright>=1.1.408", - "pytest>=9.0.2", - "pytest-cov>=7.0.0", - "pytest-mock>=3.15.1", - "taskipy>=1.14.1", + "celery-types>=0.24.0", + "pyright>=1.1.408", + "pytest>=9.0.2", + "pytest-cov>=7.0.0", + "pytest-mock>=3.15.1", + "taskipy>=1.14.1", ] [project.scripts] @@ -89,6 +89,16 @@ select = ["ALL"] combine-as-imports = true lines-after-imports = 2 lines-between-types = 1 +known-first-party = ["server"] +sections = { "testing-helpers" = ["tests"] } +section-order = [ + "future", + "standard-library", + "third-party", + "first-party", + "testing-helpers", + "local-folder", +] [tool.ruff.lint.pylint] max-args = 6 diff --git a/src/app/composables/repositories.ts b/src/app/composables/repositories.ts index b7bbd4ca..3bb04320 100644 --- a/src/app/composables/repositories.ts +++ b/src/app/composables/repositories.ts @@ -73,7 +73,7 @@ const useRepositoriesTable = () => { header: () => sortColumns ? sortableHeader('id') : h('span', { class: 'text-xs text-default font-medium' }, columnNames.value.id), - cell: ({ row }) => row.original.spConnectorId, + cell: ({ row }) => row.original.id, enableGlobalFilter: false, }, { diff --git a/src/contrib/messages.py b/src/contrib/messages.py index 8c66bd6b..a59a67c9 100644 --- a/src/contrib/messages.py +++ b/src/contrib/messages.py @@ -11,8 +11,13 @@ from datetime import UTC, datetime -from src.server import messages -from src.server.messages.base import LogMessage + +try: + from src.server import messages + from src.server.messages.base import LogMessage +except ImportError: + from server import messages + from server.messages.base import LogMessage def generate_type_stub() -> None: diff --git a/src/server/api/group_caches.py b/src/server/api/group_caches.py index 2708750e..d0d6342a 100644 --- a/src/server/api/group_caches.py +++ b/src/server/api/group_caches.py @@ -33,7 +33,7 @@ @bp.before_request def init_settings() -> None: """Initialize settings for the request.""" - setup_weko_group_cache_db_config(config.CACHE_DB) + setup_weko_group_cache_db_config(config.for_group_caches) @bp.get("/", strict_slashes=False) diff --git a/src/server/config.py b/src/server/config.py index b5536156..b6b76c92 100644 --- a/src/server/config.py +++ b/src/server/config.py @@ -116,7 +116,7 @@ class RuntimeConfig(BaseSettings): @computed_field @property - def CACHE_DB(self) -> CacheDbSettings: + def for_group_caches(self) -> CacheDbSettings: """Cache database configuration values.""" endpoint = ( self.MAP_CORE.base_url.rstrip("/") diff --git a/src/server/ext.py b/src/server/ext.py index e32bad4e..87deffff 100644 --- a/src/server/ext.py +++ b/src/server/ext.py @@ -84,7 +84,7 @@ def init_config(self, app: Flask) -> None: app.config.from_mapping(self.config.for_flask) app.config.from_prefixed_env() - setup_weko_group_cache_db_config(self.config.CACHE_DB) + setup_weko_group_cache_db_config(self.config.for_group_caches) def init_db_app(self, app: Flask) -> None: # noqa: PLR6301 """Initialize the database for the this extension. diff --git a/tests/helpers.py b/tests/helpers.py index 079cf763..6f563b48 100644 --- a/tests/helpers.py +++ b/tests/helpers.py @@ -1,4 +1,6 @@ +import inspect import json +import typing as t from pathlib import Path from typing import Any @@ -9,5 +11,9 @@ def load_json_data(file_path: str) -> dict[str, Any]: return json.load(file) +def unwrap[T: t.Callable](f: T) -> T: + return inspect.unwrap(f) + + class UnexpectedError(Exception): """Custom exception for unexpected errors in tests.""" diff --git a/tests/unit/api/test_bulk.py b/tests/unit/api/test_bulk.py index cc7c462c..867f53f4 100644 --- a/tests/unit/api/test_bulk.py +++ b/tests/unit/api/test_bulk.py @@ -1,4 +1,3 @@ -import inspect import typing as t from datetime import UTC, datetime @@ -14,13 +13,15 @@ from server.exc import FileNotFound, FileValidationError, RecordNotFound, TaskExecutionError from server.messages import E +from tests.helpers import unwrap + if t.TYPE_CHECKING: from pytest_mock import MockerFixture def test_upload_file(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.upload_file) + test_func = unwrap(bulk.upload_file) repository_id = "repo1" operator_id = "user1" operator_name = "test_user" @@ -51,7 +52,7 @@ def test_upload_file(app, mocker: MockerFixture): def test_upload_file_repository_not_found(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.upload_file) + test_func = unwrap(bulk.upload_file) mocker.patch("server.services.repositories.get_by_id", return_value=None) repository_id = "repo1" form = TargetRepositoryForm(repository_id=repository_id) @@ -63,7 +64,7 @@ def test_upload_file_repository_not_found(app, mocker: MockerFixture): def test_upload_file_repository_forbidden(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.upload_file) + test_func = unwrap(bulk.upload_file) mocker.patch("server.services.repositories.get_by_id", return_value=mocker.Mock()) repository_id = "repo1" form = TargetRepositoryForm(repository_id=repository_id) @@ -78,7 +79,7 @@ def test_upload_file_repository_forbidden(app, mocker: MockerFixture): def test_validate_status(app, mocker: MockerFixture): task_id = "task_id" - test_func = inspect.unwrap(bulk.validate_status) + test_func = unwrap(bulk.validate_status) mocker.patch("server.services.bulks.get_validate_task_result", return_value=mocker.Mock(state="SUCCESS")) expected = BulkBody(status="SUCCESS") with app.test_request_context(): @@ -89,7 +90,7 @@ def test_validate_status(app, mocker: MockerFixture): def test_validate_status_not_found(app, mocker: MockerFixture): task_id = "task_id" - test_func = inspect.unwrap(bulk.validate_status) + test_func = unwrap(bulk.validate_status) expected_message = E.TASK_NOT_FOUND % {"task_id": task_id} mocker.patch("server.services.bulks.get_validate_task_result", side_effect=TaskExecutionError(expected_message)) expected = ErrorResponse(message=expected_message) @@ -102,7 +103,7 @@ def test_validate_status_not_found(app, mocker: MockerFixture): def test_validate_result(app, mocker: MockerFixture): task_id = "task_id" history_id = uuid7() - test_func = inspect.unwrap(bulk.validate_result) + test_func = unwrap(bulk.validate_result) mocker.patch("server.services.bulks.get_validate_task_result", return_value=mocker.Mock(result=history_id)) mocker.patch("server.api.bulk.is_user_logged_in", return_value=True) mocker.patch("server.services.bulks.chack_permission_to_operation", return_value=True) @@ -125,7 +126,7 @@ def test_validate_result(app, mocker: MockerFixture): def test_validate_result_not_permission(app, mocker: MockerFixture): task_id = "task_id" history_id = uuid7() - test_func = inspect.unwrap(bulk.validate_result) + test_func = unwrap(bulk.validate_result) mocker.patch("server.services.bulks.get_validate_task_result", return_value=mocker.Mock(result=history_id)) mocker.patch("server.api.bulk.is_user_logged_in", return_value=False) expected = ErrorResponse(message=E.OPERATION_FORBIDDEN) @@ -137,7 +138,7 @@ def test_validate_result_not_permission(app, mocker: MockerFixture): def test_validate_result_failed(app, mocker: MockerFixture): task_id = "task_id" - test_func = inspect.unwrap(bulk.validate_result) + test_func = unwrap(bulk.validate_result) mocker.patch("server.services.bulks.get_validate_task_result", return_value=mocker.Mock(successful=False)) expected_message = E.UNEXPECTED_SERVER_ERROR with app.test_request_context(): @@ -148,7 +149,7 @@ def test_validate_result_failed(app, mocker: MockerFixture): def test_validate_result_with_exception(app, mocker: MockerFixture): task_id = "task_id" - test_func = inspect.unwrap(bulk.validate_result) + test_func = unwrap(bulk.validate_result) history_id = uuid7() mocker.patch("server.services.bulks.get_validate_task_result", return_value=mocker.Mock(result=history_id)) mocker.patch("server.api.bulk.is_user_logged_in", return_value=True) @@ -165,7 +166,7 @@ def test_validate_result_with_exception(app, mocker: MockerFixture): def test_validate_result_not_found(app, mocker: MockerFixture): task_id = "task_id" - test_func = inspect.unwrap(bulk.validate_result) + test_func = unwrap(bulk.validate_result) expected_message = E.FILE_EXPIRED % {"path": "file_path"} mocker.patch( "server.services.bulks.get_validate_task_result", @@ -179,7 +180,7 @@ def test_validate_result_not_found(app, mocker: MockerFixture): def test_validate_result_file_error(app, mocker: MockerFixture): task_id = "task_id" - test_func = inspect.unwrap(bulk.validate_result) + test_func = unwrap(bulk.validate_result) expected_message = E.INVALID_FILE_STRUCTURE mock_return_value = FileValidationError(expected_message) mocker.patch("server.services.bulks.get_validate_task_result", return_value=mocker.Mock(result=mock_return_value)) @@ -190,7 +191,7 @@ def test_validate_result_file_error(app, mocker: MockerFixture): def test_execute(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.execute) + test_func = unwrap(bulk.execute) temp_id = uuid7() repository_id = "repo1" task_id = "task_id" @@ -221,7 +222,7 @@ def test_execute(app, mocker: MockerFixture): def test_execute_history_not_found(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.execute) + test_func = unwrap(bulk.execute) temp_id = uuid7() body = ExcuteRequest(temp_file_id=temp_id) mocker.patch( @@ -236,7 +237,7 @@ def test_execute_history_not_found(app, mocker: MockerFixture): def test_execute_not_permission(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.execute) + test_func = unwrap(bulk.execute) temp_id = uuid7() repository_id = "repo1" body = ExcuteRequest(temp_file_id=temp_id, repository_id=repository_id) @@ -255,7 +256,7 @@ def test_execute_not_permission(app, mocker: MockerFixture): def test_execute_status(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.execute_status) + test_func = unwrap(bulk.execute_status) task_id = "task_id" mocker.patch("server.services.bulks.update_users.AsyncResult", return_value=mocker.Mock(state="SUCCESS")) expected = BulkBody(status="SUCCESS") @@ -266,7 +267,7 @@ def test_execute_status(app, mocker: MockerFixture): def test_execute_status_not_found(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.execute_status) + test_func = unwrap(bulk.execute_status) task_id = "task_id" expected_message = E.TASK_NOT_FOUND % {"task_id": task_id} mocker.patch("server.services.bulks.get_execute_task_result", side_effect=TaskExecutionError(expected_message)) @@ -277,7 +278,7 @@ def test_execute_status_not_found(app, mocker: MockerFixture): def test_result(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.result) + test_func = unwrap(bulk.result) history_id = uuid7() expected_summary = ExecuteResults( items=[], @@ -303,7 +304,7 @@ def test_result(app, mocker: MockerFixture): def test_result_not_found(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.result) + test_func = unwrap(bulk.result) history_id = uuid7() expected_message = E.UPDATE_HISTORY_RECORD_NOT_FOUND % {"id": history_id} mocker.patch("server.services.bulks.chack_permission_to_view", return_value=True) @@ -318,7 +319,7 @@ def test_result_not_found(app, mocker: MockerFixture): def test_result_not_permission(app, mocker: MockerFixture): - test_func = inspect.unwrap(bulk.result) + test_func = unwrap(bulk.result) history_id = uuid7() expected_message = E.OPERATION_FORBIDDEN mocker.patch("server.services.bulks.chack_permission_to_view", return_value=False) diff --git a/tests/unit/api/test_callback.py b/tests/unit/api/test_callback.py index 360fc662..44b3a369 100644 --- a/tests/unit/api/test_callback.py +++ b/tests/unit/api/test_callback.py @@ -1,10 +1,11 @@ -import inspect import typing as t from server.api.callback import auth_code from server.api.schemas import OAuthTokenQuery from server.exc import CredentialsError, DatabaseError, OAuthTokenError +from tests.helpers import unwrap + if t.TYPE_CHECKING: from pytest_mock import MockerFixture @@ -17,7 +18,7 @@ def test_auth_code_redirect(mocker: MockerFixture): expected_status_code = 200 expected_result = "" - original_func = inspect.unwrap(auth_code) + original_func = unwrap(auth_code) result, status = original_func(query) assert result == expected_result @@ -31,7 +32,7 @@ def test_auth_code_oauth_token_error(mocker: MockerFixture): expected_status_code = 202 expected_result = "" - original_func = inspect.unwrap(auth_code) + original_func = unwrap(auth_code) result, status = original_func(query) assert result == expected_result @@ -46,7 +47,7 @@ def test_auth_code_database_error(mocker: MockerFixture): expected_status_code = 202 expected_result = "" - original_func = inspect.unwrap(auth_code) + original_func = unwrap(auth_code) result, status = original_func(query) assert result == expected_result @@ -61,7 +62,7 @@ def test_auth_code_credentials_error(mocker: MockerFixture): expected_status_code = 202 expected_result = "" - original_func = inspect.unwrap(auth_code) + original_func = unwrap(auth_code) result, status = original_func(query) assert result == expected_result diff --git a/tests/unit/api/test_group_caches.py b/tests/unit/api/test_group_caches.py index 484ebf1f..53d9f5e5 100644 --- a/tests/unit/api/test_group_caches.py +++ b/tests/unit/api/test_group_caches.py @@ -9,12 +9,14 @@ from server.exc import InvalidQueryError from server.messages import E +from tests.helpers import unwrap + if t.TYPE_CHECKING: from pytest_mock import MockerFixture -def test_get(app, mocker: MockerFixture, gen_summaries, cached_data, unwrap): +def test_get(app, mocker: MockerFixture, gen_summaries, cached_data): query = CacheQuery(q=None, p=1, l=20, f=[]) repositories: SearchResult = gen_summaries(20) search_result = SearchResult( @@ -34,7 +36,7 @@ def test_get(app, mocker: MockerFixture, gen_summaries, cached_data, unwrap): mock_get_cache.assert_called_once_with(query) -def test_get_invalid_query(mocker: MockerFixture, unwrap): +def test_get_invalid_query(mocker: MockerFixture): query = CacheQuery(q=None, p=1, l=20, f=[]) messege = "Invalid query" mock_search = mocker.patch("server.api.group_caches.group_caches.get_repository_cache") @@ -49,7 +51,7 @@ def test_get_invalid_query(mocker: MockerFixture, unwrap): mock_search.assert_called_once_with(query) -def test_post(app: Flask, mocker: MockerFixture, unwrap): +def test_post(app: Flask, mocker: MockerFixture): mock_update = mocker.patch("server.api.group_caches.group_caches.update") ids = ["repo1_example_jp", "repo2_example_jp"] operation = "all" @@ -62,7 +64,7 @@ def test_post(app: Flask, mocker: MockerFixture, unwrap): mock_update.assert_called_once_with(operation, ids) -def test_post_conflict(app: Flask, mocker: MockerFixture, unwrap): +def test_post_conflict(app: Flask, mocker: MockerFixture): mock_update = mocker.patch("server.api.group_caches.group_caches.update") mock_update.side_effect = group_caches.RequestConflict(E.GROUP_CACHE_UPDATE_CONFLICT) ids = ["repo1_example_jp", "repo2_example_jp"] @@ -77,7 +79,7 @@ def test_post_conflict(app: Flask, mocker: MockerFixture, unwrap): mock_update.assert_called_once_with(operation, ids) -def test_status(app: Flask, mocker: MockerFixture, unwrap, gen_summaries): +def test_status(app: Flask, mocker: MockerFixture, gen_summaries): repository = gen_summaries(1).resources[0] repository_cache = RepositoryCache( id=repository.id, @@ -104,7 +106,7 @@ def test_status(app: Flask, mocker: MockerFixture, unwrap, gen_summaries): mock_status.assert_called_once_with() -def test_status_no_task(app: Flask, mocker: MockerFixture, unwrap): +def test_status_no_task(app: Flask, mocker: MockerFixture): mock_status = mocker.patch("server.api.group_caches.group_caches.get_task_status") mock_status.return_value = None bad_request = 400 diff --git a/tests/unit/api/test_groups.py b/tests/unit/api/test_groups.py index 771d779a..4f085105 100644 --- a/tests/unit/api/test_groups.py +++ b/tests/unit/api/test_groups.py @@ -1,4 +1,3 @@ -import inspect import types import typing as t @@ -19,7 +18,8 @@ from server.entities.search_request import SearchResult from server.exc import InvalidFormError, InvalidQueryError, RequestConflict, ResourceInvalid, ResourceNotFound from server.messages import E -from tests.helpers import UnexpectedError + +from tests.helpers import UnexpectedError, unwrap if t.TYPE_CHECKING: @@ -44,7 +44,7 @@ def test_get_success(app: Flask, mocker: MockerFixture) -> None: expected_status = 200 search_mock = mocker.patch("server.services.groups.search", return_value=expected_group) - original_func = inspect.unwrap(groups_api.get) + original_func = unwrap(groups_api.get) result, status = original_func(query) assert result == expected_group @@ -56,7 +56,7 @@ def test_get_returns_400_on_invalid_query(mocker): """Tests get returns ErrorResponse and 400 when InvalidQueryError is raised.""" expected_status = 400 mocker.patch("server.services.groups.search", side_effect=InvalidQueryError("invalid query")) - original_func = inspect.unwrap(groups_api.get) + original_func = unwrap(groups_api.get) query = GroupsQuery(q="bad", r=[], u=[], s=0, v=1, k="display_name", d="asc", p=1, l=30) result, status = original_func(query) assert status == expected_status @@ -81,7 +81,7 @@ def test_post_success(app: Flask, gen_group_id, mocker: MockerFixture) -> None: mocker.patch("server.services.groups.create", return_value=expected_group) mocker.patch("server.api.groups.url_for", return_value=url_for_patch) - original_func = inspect.unwrap(groups_api.post) + original_func = unwrap(groups_api.post) result, status, headers = original_func(expected_group) assert result == expected_group @@ -105,7 +105,7 @@ def test_post_returns_403_when_no_permission(app: Flask, mocker: MockerFixture) mocker.patch("server.api.groups.traceback.print_exc") mocker.patch("server.services.groups.create", side_effect=InvalidFormError(E.GROUP_FORBIDDEN_REPOSITORY)) - original_func = inspect.unwrap(groups_api.post) + original_func = unwrap(groups_api.post) result, status = original_func(group) assert status == expected_status @@ -126,7 +126,7 @@ def test_post_failure_returns_error_response_and_400(app: Flask, gen_group_id, m error_detail = "repository id is required" expected_status = 400 mocker.patch("server.services.groups.create", side_effect=InvalidFormError(error_detail)) - original_func = inspect.unwrap(groups_api.post) + original_func = unwrap(groups_api.post) result, status = original_func(expected_group) assert isinstance(result, ErrorResponse) @@ -150,7 +150,7 @@ def test_post_already_exists_returns_error_response_and_409(app: Flask, gen_grou mocker.patch("server.services.groups.create", side_effect=ResourceInvalid(error_detail)) mocker.patch("server.api.groups.url_for", return_value=f"https://host/api/groups/{group.id}") - original_func = inspect.unwrap(groups_api.post) + original_func = unwrap(groups_api.post) result, status = original_func(group) assert isinstance(result, ErrorResponse) assert status == expected_status @@ -171,7 +171,7 @@ def test_post_unexpected_error_returns_exception(app: Flask, gen_group_id, mocke mocker.patch("server.services.groups.create", side_effect=UnexpectedError(error_detail)) mocker.patch("server.api.groups.url_for", return_value=f"https://host/api/groups/{group.id}") - original_func = inspect.unwrap(groups_api.post) + original_func = unwrap(groups_api.post) with pytest.raises(UnexpectedError, match=error_detail): original_func(group) @@ -191,7 +191,7 @@ def test_id_get_success_group_permission(app: Flask, gen_group_id, mocker: Mocke mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.get_by_id", return_value=expected_group) - original_func = inspect.unwrap(groups_api.id_get) + original_func = unwrap(groups_api.id_get) result, status = original_func(group_id) assert result == expected_group @@ -205,7 +205,7 @@ def test_groups_id_get_affiliation_not_detected(app, mocker): expected_status = 404 mocker.patch("server.api.groups.detect_affiliation", return_value=False) mocker.patch("server.api.groups.current_app") - original_func = inspect.unwrap(groups_api.id_get) + original_func = unwrap(groups_api.id_get) result, status = original_func(group_id) assert status == expected_status assert ErrorResponse(code="E204", message="Group resource (id: unknown-group) not found.") == result @@ -226,7 +226,7 @@ def test_id_get_forbidden_no_permission(app: Flask, gen_group_id, mocker: Mocker mocker.patch("server.api.groups.has_permission", return_value=False) mocker.patch("server.services.groups.get_by_id", return_value=group) - original_func = inspect.unwrap(groups_api.id_get) + original_func = unwrap(groups_api.id_get) result, status = original_func(group_id) assert isinstance(result, ErrorResponse) @@ -242,7 +242,7 @@ def test_id_get_not_found(app: Flask, gen_group_id, mocker: MockerFixture) -> No mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.get_by_id", return_value=None) - original_func = inspect.unwrap(groups_api.id_get) + original_func = unwrap(groups_api.id_get) result, status = original_func(group_id) assert isinstance(result, ErrorResponse) assert status == expected_status @@ -257,7 +257,7 @@ def test_id_get_unexpected_error(app: Flask, gen_group_id, mocker: MockerFixture mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.get_by_id", side_effect=UnexpectedError(error_detail)) - original_func = inspect.unwrap(groups_api.id_get) + original_func = unwrap(groups_api.id_get) with pytest.raises(UnexpectedError, match=error_detail): original_func(group_id) @@ -277,7 +277,7 @@ def test_id_put_success_admin(app: Flask, gen_group_id, mocker: MockerFixture) - mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.update", return_value=expected_group) - original_func = inspect.unwrap(groups_api.id_put) + original_func = unwrap(groups_api.id_put) result, status = original_func(group_id, expected_group) assert result == expected_group @@ -292,7 +292,7 @@ def test_id_put_affiliation_not_detected(app, mocker): mocker.patch("server.api.groups.detect_affiliation", return_value=False) mocker.patch("server.api.groups.current_app") dummy = object() - original_func = inspect.unwrap(groups_api.id_put) + original_func = unwrap(groups_api.id_put) result, status = original_func(group_id, dummy) assert status == expected_status assert ErrorResponse(code="E204", message="Group resource (id: unknown-group) not found.") == result @@ -314,7 +314,7 @@ def test_id_put_forbidden_no_permission(app: Flask, gen_group_id, mocker: Mocker mocker.patch("server.api.groups.has_permission", return_value=False) mocker.patch("server.services.groups.update", return_value=group) - original_func = inspect.unwrap(groups_api.id_put) + original_func = unwrap(groups_api.id_put) result, status = original_func(group_id, group) assert isinstance(result, ErrorResponse) @@ -336,7 +336,7 @@ def test_id_put_returns_400_on_invalid_form_error(app: Flask, mocker: MockerFixt repository=Repository(id="r1", service_name="repo1"), type="group", ) - original_func = inspect.unwrap(groups_api.id_put) + original_func = unwrap(groups_api.id_put) result, status = original_func("g1", group) assert status == expected_status assert "invalid form" in result.message @@ -358,7 +358,7 @@ def test_id_put_not_found_returns_404(app: Flask, gen_group_id, mocker: MockerFi mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.update", side_effect=ResourceNotFound(error_detail)) - original_func = inspect.unwrap(groups_api.id_put) + original_func = unwrap(groups_api.id_put) result, status = original_func(group_id, group) assert isinstance(result, ErrorResponse) @@ -381,7 +381,7 @@ def test_id_put_unexpected_error(app: Flask, gen_group_id, mocker: MockerFixture mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.update", side_effect=UnexpectedError(error_detail)) - original_func = inspect.unwrap(groups_api.id_put) + original_func = unwrap(groups_api.id_put) with pytest.raises(UnexpectedError, match=error_detail): original_func(group_id, group) @@ -402,7 +402,7 @@ def test_id_patch_success_admin(app: Flask, gen_group_id, mocker: MockerFixture) mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.update_member", return_value=expected_group) - original_func = inspect.unwrap(groups_api.id_patch) + original_func = unwrap(groups_api.id_patch) result, status = original_func(group_id, patch_body) assert result == expected_group @@ -425,7 +425,7 @@ def test_id_patch_success_group_permission(app: Flask, gen_group_id, mocker: Moc mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.update_member", return_value=expected_group) - original_func = inspect.unwrap(groups_api.id_patch) + original_func = unwrap(groups_api.id_patch) result, status = original_func(group_id, patch_body) assert result == expected_group @@ -439,7 +439,7 @@ def test_groups_id_patch_affiliation_not_detected(app, mocker): mocker.patch("server.api.groups.detect_affiliation", return_value=False) mocker.patch("server.api.groups.current_app") dummy = object() - original_func = inspect.unwrap(groups_api.id_patch) + original_func = unwrap(groups_api.id_patch) result, status = original_func(group_id, dummy) assert status == expected_status assert ErrorResponse(code="E204", message="Group resource (id: unknown-group) not found.") == result @@ -461,7 +461,7 @@ def test_id_patch_forbidden_no_permission(app: Flask, gen_group_id, mocker: Mock mocker.patch("server.api.groups.has_permission", return_value=False) mocker_update_member = mocker.patch("server.services.groups.update_member", return_value=group) - original_func = inspect.unwrap(groups_api.id_patch) + original_func = unwrap(groups_api.id_patch) result, status = original_func(group_id, patch_body) assert isinstance(result, ErrorResponse) @@ -476,7 +476,7 @@ def test_id_patch_fake_op_direct_call(app: Flask, gen_group_id, mocker: MockerFi dummy_body = types.SimpleNamespace(operations=[fake_op]) mocker.patch("server.api.groups.has_permission", return_value=True) update_mock = mocker.patch("server.api.groups.groups.update_member", return_value=None) - original_func = inspect.unwrap(groups_api.id_patch) + original_func = unwrap(groups_api.id_patch) _ = original_func(group_id, dummy_body) called_args = update_mock.call_args.kwargs assert called_args["add"] == set() @@ -493,7 +493,7 @@ def test_id_patch_update_error_returns_409(app: Flask, gen_group_id, mocker: Moc mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.update_member", side_effect=RequestConflict(error_detail)) - original_func = inspect.unwrap(groups_api.id_patch) + original_func = unwrap(groups_api.id_patch) result, status = original_func(group_id, patch_body) assert isinstance(result, ErrorResponse) @@ -511,7 +511,7 @@ def test_id_patch_not_found_returns_404(app: Flask, gen_group_id, mocker: Mocker mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.update_member", side_effect=ResourceNotFound(error_detail)) - original_func = inspect.unwrap(groups_api.id_patch) + original_func = unwrap(groups_api.id_patch) result, status = original_func(group_id, patch_body) assert isinstance(result, ErrorResponse) @@ -528,7 +528,7 @@ def test_id_patch_unexpected_error(app: Flask, gen_group_id, mocker: MockerFixtu mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.update_member", side_effect=UnexpectedError(error_detail)) - original_func = inspect.unwrap(groups_api.id_patch) + original_func = unwrap(groups_api.id_patch) with pytest.raises(UnexpectedError, match=error_detail): original_func(group_id, patch_body) @@ -541,7 +541,7 @@ def test_id_patch_returns_400_on_unsupported_attribute(app: Flask, mocker: Mocke mocker.patch("server.api.groups.detect_affiliation", return_value=True) mocker.patch("server.api.groups.has_permission", return_value=True) patch_body = GroupPatchRequest(operations=[GroupPatchOperation(op="add", path="not_supported", value=["user1"])]) - original_func = inspect.unwrap(groups_api.id_patch) + original_func = unwrap(groups_api.id_patch) result, status = original_func("g1", patch_body) assert status == expected_status assert isinstance(result, ErrorResponse) @@ -554,7 +554,7 @@ def test_id_delete_success_admin(app: Flask, gen_group_id, mocker: MockerFixture expected_status: int = 204 mocker.patch("server.api.groups.has_permission", return_value=True) delete_mock = mocker.patch("server.services.groups.delete_by_id", return_value=None) - original_func = inspect.unwrap(groups_api.id_delete) + original_func = unwrap(groups_api.id_delete) result, status = original_func(group_id) assert not result assert status == expected_status @@ -567,7 +567,7 @@ def test_id_delete_success_group_permission(app: Flask, gen_group_id, mocker: Mo expected_status: int = 204 mocker.patch("server.api.groups.has_permission", return_value=True) delete_mock = mocker.patch("server.services.groups.delete_by_id", return_value=None) - original_func = inspect.unwrap(groups_api.id_delete) + original_func = unwrap(groups_api.id_delete) result, status = original_func(group_id) assert not result assert status == expected_status @@ -581,7 +581,7 @@ def test_groups_id_delete_affiliation_not_detected(app, mocker): expected_status = 404 mocker.patch("server.api.groups.detect_affiliation", return_value=False) mocker.patch("server.api.groups.current_app") - original_func = inspect.unwrap(groups_api.id_delete) + original_func = unwrap(groups_api.id_delete) result, status = original_func(group_id) assert status == expected_status assert ErrorResponse(code="E204", message="Group resource (id: unknown-group) not found.") == result @@ -595,7 +595,7 @@ def test_id_delete_role_type_group_returns_error_and_400(app: Flask, gen_group_i expected_status = 400 mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.api.groups.detect_affiliations", return_value=(rolegroups, [])) - original_func = inspect.unwrap(groups_api.id_delete) + original_func = unwrap(groups_api.id_delete) result, status = original_func(group_id) assert isinstance(result, ErrorResponse) assert status == expected_status @@ -607,7 +607,7 @@ def test_id_delete_forbidden_no_permission(app: Flask, gen_group_id, mocker: Moc group_id: str = gen_group_id("g3") expected_status: int = 403 mocker.patch("server.api.groups.has_permission", return_value=False) - original_func = inspect.unwrap(groups_api.id_delete) + original_func = unwrap(groups_api.id_delete) result, status = original_func(group_id) assert isinstance(result, ErrorResponse) assert status == expected_status @@ -622,7 +622,7 @@ def test_id_delete_not_found_returns_error_and_404(app: Flask, gen_group_id, moc mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.api.groups.detect_affiliations", return_value=(rolegroups, [])) mocker.patch("server.services.groups.delete_by_id", side_effect=ResourceNotFound(error_message)) - original_func = inspect.unwrap(groups_api.id_delete) + original_func = unwrap(groups_api.id_delete) result, status = original_func(group_id) assert isinstance(result, ErrorResponse) assert status == expected_status @@ -635,7 +635,7 @@ def test_id_delete_unexpected_error(app: Flask, gen_group_id, mocker: MockerFixt error_detail: str = "unexpected error in id_delete" mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.delete_by_id", side_effect=UnexpectedError(error_detail)) - original_func = inspect.unwrap(groups_api.id_delete) + original_func = unwrap(groups_api.id_delete) with pytest.raises(UnexpectedError, match=error_detail): original_func(group_id) @@ -648,7 +648,7 @@ def test_delete_post_success_admin(app: Flask, gen_group_id, mocker: MockerFixtu mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.delete_multiple", return_value=None) - original_func = inspect.unwrap(groups_api.delete_post) + original_func = unwrap(groups_api.delete_post) result, status = original_func(body) assert not result @@ -665,7 +665,7 @@ def test_delete_post_partial_failure_admin(app: Flask, gen_group_id, mocker: Moc mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.delete_multiple", return_value=ErrorResponse(code="", message=error_message)) - original_func = inspect.unwrap(groups_api.delete_post) + original_func = unwrap(groups_api.delete_post) result, status = original_func(body) assert isinstance(result, ErrorResponse) @@ -681,7 +681,7 @@ def test_delete_post_role_type_group_returns_error_and_400(app: Flask, gen_group expected_status = 400 mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.api.groups.detect_affiliations", return_value=(rolegroups, [])) - original_func = inspect.unwrap(groups_api.delete_post) + original_func = unwrap(groups_api.delete_post) result, status = original_func(body) assert isinstance(result, ErrorResponse) assert status == expected_status @@ -695,7 +695,7 @@ def test_groups_delete_post_affiliation_not_detected(app, mocker): mocker.patch("server.api.groups.detect_affiliation", side_effect=lambda _: False) mocker.patch("server.api.groups.current_app") dummy = type("Dummy", (), {"group_ids": group_ids})() - original_func = inspect.unwrap(groups_api.delete_post) + original_func = unwrap(groups_api.delete_post) result, status = original_func(dummy) assert status == expected_status expected_msg = ErrorResponse( @@ -715,7 +715,7 @@ def test_delete_post_partial_permission(app: Flask, gen_group_id, mocker: Mocker mocker.patch("server.services.utils.filter_permitted_group_ids", return_value=[group_id1]) mocker.patch("server.api.groups.is_current_user_system_admin", return_value=False) with app.test_request_context(): - original_func = inspect.unwrap(groups_api.delete_post) + original_func = unwrap(groups_api.delete_post) result, status = original_func(body) assert isinstance(result, ErrorResponse) assert status == expected_status @@ -730,7 +730,7 @@ def test_delete_post_unexpected_error(app: Flask, gen_group_id, mocker: MockerFi mocker.patch("server.api.groups.has_permission", return_value=True) mocker.patch("server.services.groups.delete_multiple", side_effect=UnexpectedError(error_detail)) - original_func = inspect.unwrap(groups_api.delete_post) + original_func = unwrap(groups_api.delete_post) with pytest.raises(UnexpectedError, match=error_detail): original_func(body) @@ -744,7 +744,7 @@ def test_filter_options(app: Flask, mocker: MockerFixture) -> None: mocker.patch("server.services.token.get_access_token", return_value="dummy_token") mocker.patch("server.services.repositories.search", return_value=search_result) - original_func = inspect.unwrap(groups_api.filter_options) + original_func = unwrap(groups_api.filter_options) result = original_func() assert isinstance(result, list) diff --git a/tests/unit/api/test_history.py b/tests/unit/api/test_history.py index 22f03521..c6413ef1 100644 --- a/tests/unit/api/test_history.py +++ b/tests/unit/api/test_history.py @@ -1,4 +1,3 @@ -import inspect import typing as t from http import HTTPStatus @@ -14,13 +13,15 @@ from server.exc import InvalidQueryError, RecordNotFound from server.messages import E +from tests.helpers import unwrap + if t.TYPE_CHECKING: from pytest_mock import MockerFixture def test_filter_options(app, mocker: MockerFixture): - test_func = inspect.unwrap(history.filter_options) + test_func = unwrap(history.filter_options) with ( app.test_request_context("/"), ): @@ -42,7 +43,7 @@ def test_filter_options(app, mocker: MockerFixture): def test_filter_options_operators(app, mocker: MockerFixture): - test_func = inspect.unwrap(history.filter_options_operators) + test_func = unwrap(history.filter_options_operators) expected = SearchResult(total=0, page_size=20, offset=1, resources=[]) with ( app.test_request_context(), @@ -58,7 +59,7 @@ def test_filter_options_operators(app, mocker: MockerFixture): def test_filter_options_operators_invalid_query(app, mocker: MockerFixture): - test_func = inspect.unwrap(history.filter_options_operators) + test_func = unwrap(history.filter_options_operators) with ( app.test_request_context(), ): @@ -81,7 +82,7 @@ def test_filter_options_operators_invalid_query(app, mocker: MockerFixture): ], ) def test_get(app, mocker: MockerFixture, tab, expected): - test_func = inspect.unwrap(history.get) + test_func = unwrap(history.get) with ( app.test_request_context(), ): @@ -105,7 +106,7 @@ def test_get(app, mocker: MockerFixture, tab, expected): def test_public_status(app, mocker: MockerFixture): - test_func = inspect.unwrap(history.public_status) + test_func = unwrap(history.public_status) request_body = HistoryPublic(public=True) history_id = "019c794e-0ac6-7380-8cbf-eac8175f9b21" with app.test_request_context(): @@ -123,7 +124,7 @@ def test_public_status(app, mocker: MockerFixture): def test_public_status_record_not_found(app, mocker: MockerFixture): - test_func = inspect.unwrap(history.public_status) + test_func = unwrap(history.public_status) request_body = HistoryPublic(public=True) history_id = "019c794e-b6a7-77eb-bad9-2d1f2a561222" with app.test_request_context(): @@ -141,7 +142,7 @@ def test_public_status_record_not_found(app, mocker: MockerFixture): def test_files(app, mocker: MockerFixture): - test_func = inspect.unwrap(history.files) + test_func = unwrap(history.files) file_id = "019c794e-0cae-7020-b297-16831f57b71b" file_path = __file__ mock_send_file = mocker.patch("server.api.history.send_file", return_value="mocked response") @@ -154,7 +155,7 @@ def test_files(app, mocker: MockerFixture): def test_files_not_found(app, mocker: MockerFixture): - test_func = inspect.unwrap(history.files) + test_func = unwrap(history.files) file_id = "019c794e-b9af-7444-9474-123bcef06dfe" file_path = "/non/existent/file/path" mock_get_file_path = mocker.patch("server.services.history.get_file_path", return_value=file_path) @@ -166,7 +167,7 @@ def test_files_not_found(app, mocker: MockerFixture): def test_files_record_not_found(app, mocker: MockerFixture): - test_func = inspect.unwrap(history.files) + test_func = unwrap(history.files) file_id = "019c794e-b84f-76bf-91af-a07616a7abf1" exception_message = f"{file_id} is not found" mock_get_file_path = mocker.patch( diff --git a/tests/unit/api/test_repositories.py b/tests/unit/api/test_repositories.py index 5a231940..f8170241 100644 --- a/tests/unit/api/test_repositories.py +++ b/tests/unit/api/test_repositories.py @@ -1,4 +1,3 @@ -import inspect import typing as t from pydantic import HttpUrl @@ -8,6 +7,8 @@ from server.entities.repository_detail import RepositoryDetail from server.exc import InvalidFormError, InvalidQueryError, ResourceInvalid, ResourceNotFound +from tests.helpers import unwrap + if t.TYPE_CHECKING: from pytest_mock import MockerFixture @@ -20,7 +21,7 @@ def test_get_success(app, mocker: MockerFixture) -> None: expected = SearchResult(total=1, page_size=1, offset=0, resources=[]) mocker.patch("server.services.repositories.search", return_value=expected) - original_func = inspect.unwrap(repositories.get) + original_func = unwrap(repositories.get) response = original_func(RepositoriesQuery(q=None, i=None, k=None, d=None, p=None)) data, status, *_ = response @@ -38,7 +39,7 @@ def test_get_invalid_query_error(app, mocker: MockerFixture) -> None: mocker.patch("server.services.repositories.search", side_effect=InvalidQueryError("Invalid query")) - original_func = inspect.unwrap(repositories.get) + original_func = unwrap(repositories.get) response = original_func(RepositoriesQuery(q="search", i=["repo1"], k="created", d="desc", p=3, l=20)) data, status, *_ = response @@ -63,7 +64,7 @@ def test_post_success(app, test_config, mocker: MockerFixture) -> None: groups_count=None, ) mocker.patch("server.services.repositories.create", return_value=expected) - original_func = inspect.unwrap(repositories.post) + original_func = unwrap(repositories.post) response = original_func(expected) data, status, *_ = response @@ -89,7 +90,7 @@ def test_post_invalid_form_error(app, test_config, mocker: MockerFixture) -> Non users_count=None, groups_count=None, ) - original_func = inspect.unwrap(repositories.post) + original_func = unwrap(repositories.post) response = original_func(expected) data, status, *_ = response @@ -115,7 +116,7 @@ def test_post_resource_invalid_error(app, test_config, mocker: MockerFixture) -> users_count=None, groups_count=None, ) - original_func = inspect.unwrap(repositories.post) + original_func = unwrap(repositories.post) response = original_func(expected) data, status, *_ = response @@ -142,7 +143,7 @@ def test_id_get_success(app, test_config, mocker: MockerFixture) -> None: ) mocker.patch("server.api.repositories.has_permission", return_value=True) mocker.patch("server.services.repositories.get_by_id", return_value=expected) - original_func = inspect.unwrap(repositories.id_get) + original_func = unwrap(repositories.id_get) response = original_func("repo1") data, status = response assert status == expected_status @@ -156,7 +157,7 @@ def test_id_get_not_found_error(app, mocker: MockerFixture) -> None: expected_status = 404 mocker.patch("server.api.repositories.has_permission", return_value=True) mocker.patch("server.services.repositories.get_by_id", return_value=None) - original_func = inspect.unwrap(repositories.id_get) + original_func = unwrap(repositories.id_get) response = original_func("repo1") data, status = response assert status == expected_status @@ -175,7 +176,7 @@ def test_id_get_permission_error(app, mocker: MockerFixture) -> None: ) mocker.patch("server.services.repositories.get_by_id", return_value=dummy_repo) mocker.patch("server.api.repositories.has_permission", return_value=False) - original_func = inspect.unwrap(repositories.id_get) + original_func = unwrap(repositories.id_get) response = original_func("repo1") data, status = response assert status == expected_status @@ -201,7 +202,7 @@ def test_id_put_success(app, test_config, mocker: MockerFixture) -> None: ) mocker.patch("server.api.repositories.has_permission", return_value=True) mocker.patch("server.services.repositories.update", return_value=expected) - original_func = inspect.unwrap(repositories.id_put) + original_func = unwrap(repositories.id_put) response = original_func("repo1", expected) data, status = response assert status == expected_status @@ -228,7 +229,7 @@ def test_id_put_invalid_form_error(app, test_config, mocker: MockerFixture) -> N ) mocker.patch("server.api.repositories.has_permission", return_value=True) mocker.patch("server.services.repositories.update", side_effect=InvalidFormError("invalid form")) - original_func = inspect.unwrap(repositories.id_put) + original_func = unwrap(repositories.id_put) response = original_func("repo1", expected) data, status = response assert status == expected_status @@ -255,7 +256,7 @@ def test_id_put_not_found_error(app, test_config, mocker: MockerFixture) -> None ) mocker.patch("server.api.repositories.has_permission", return_value=True) mocker.patch("server.services.repositories.update", side_effect=ResourceNotFound("not found")) - original_func = inspect.unwrap(repositories.id_put) + original_func = unwrap(repositories.id_put) response = original_func("repo1", expected) data, status = response assert status == expected_status @@ -269,7 +270,7 @@ def test_id_delete_success(app, mocker: MockerFixture) -> None: expected_status = 204 query = RepositoryDeleteQuery(confirmation="delete") mocker.patch("server.services.repositories.delete_by_id", return_value=None) - original_func = inspect.unwrap(repositories.id_delete) + original_func = unwrap(repositories.id_delete) response = original_func("repo1", query) data, status = response assert status == expected_status @@ -280,7 +281,7 @@ def test_id_delete_invalid_form_error(app, mocker: MockerFixture) -> None: expected_status = 400 query = RepositoryDeleteQuery(confirmation="delete") mocker.patch("server.services.repositories.delete_by_id", side_effect=InvalidFormError("invalid form")) - original_func = inspect.unwrap(repositories.id_delete) + original_func = unwrap(repositories.id_delete) response, status = original_func("repo1", query) assert status == expected_status assert isinstance(response, ErrorResponse) @@ -293,7 +294,7 @@ def test_id_delete_not_found_error(app, mocker: MockerFixture) -> None: expected_status = 404 query = RepositoryDeleteQuery(confirmation="delete") mocker.patch("server.services.repositories.delete_by_id", side_effect=ResourceNotFound("not found")) - original_func = inspect.unwrap(repositories.id_delete) + original_func = unwrap(repositories.id_delete) response = original_func("repo1", query) data, status = response assert status == expected_status @@ -331,7 +332,7 @@ def test_has_permission_not_permitted(mocker: MockerFixture) -> None: def test_filter_options_calls_search_repositories_options(app, mocker: MockerFixture) -> None: dummy = ["dummy_option"] mock = mocker.patch("server.api.repositories.search_repositories_options", return_value=dummy) - original_func = inspect.unwrap(repositories.filter_options) + original_func = unwrap(repositories.filter_options) result = original_func() assert result == dummy mock.assert_called_once_with() diff --git a/tests/unit/api/test_search.py b/tests/unit/api/test_search.py index c098149a..78b8d177 100644 --- a/tests/unit/api/test_search.py +++ b/tests/unit/api/test_search.py @@ -1,5 +1,3 @@ -import inspect - from flask import Flask from pytest_mock import MockerFixture @@ -8,6 +6,8 @@ from server.entities.search_request import SearchResult from server.exc import InvalidQueryError +from tests.helpers import unwrap + def test_get_success(app: Flask, mocker: MockerFixture) -> None: query = GlobalSearchQuery(q="test", l=10) @@ -18,7 +18,7 @@ def test_get_success(app: Flask, mocker: MockerFixture) -> None: mocker.patch("server.services.repositories.search", return_value=result_repo) mocker.patch("server.services.groups.search", return_value=result_group) mocker.patch("server.services.users.search", return_value=result_user) - original_func = inspect.unwrap(search_api.get) + original_func = unwrap(search_api.get) resp, status = original_func(query) assert status == excepted_status assert isinstance(resp, GlobalSearchResult) @@ -33,7 +33,7 @@ def test_get_partial_invalid_query_error(app: Flask, mocker: MockerFixture) -> N mocker.patch("server.services.groups.search", side_effect=InvalidQueryError("fail")) result_user = SearchResult(total=3, page_size=10, offset=0, resources=[]) mocker.patch("server.services.users.search", return_value=result_user) - original_func = inspect.unwrap(search_api.get) + original_func = unwrap(search_api.get) resp, status = original_func(query) assert status == excepted_status assert isinstance(resp, GlobalSearchResult) @@ -45,7 +45,7 @@ def test_get_all_invalid_query_error(app: Flask, mocker: MockerFixture) -> None: mocker.patch("server.services.repositories.search", side_effect=InvalidQueryError("fail")) mocker.patch("server.services.groups.search", side_effect=InvalidQueryError("fail")) mocker.patch("server.services.users.search", side_effect=InvalidQueryError("fail")) - original_func = inspect.unwrap(search_api.get) + original_func = unwrap(search_api.get) resp, status = original_func(query) assert status == excepted_status assert isinstance(resp, ErrorResponse) diff --git a/tests/unit/api/test_users.py b/tests/unit/api/test_users.py index fa5e8adb..82f7eba9 100644 --- a/tests/unit/api/test_users.py +++ b/tests/unit/api/test_users.py @@ -1,4 +1,3 @@ -import inspect import typing as t from flask import Flask @@ -13,6 +12,8 @@ from server.exc import InvalidExportError, InvalidFormError, InvalidQueryError, ResourceInvalid, ResourceNotFound from server.messages import E +from tests.helpers import unwrap + if t.TYPE_CHECKING: from flask import Flask @@ -24,7 +25,7 @@ def test_get_success(app, mocker): query = UsersQuery(q="", r=[], k="display_name", d="asc", p=1, l=30) expected_result = SearchResult(total=1, page_size=10, offset=0, resources=[]) mocke_serch = mocker.patch("server.services.users.search", return_value=expected_result) - original_func = inspect.unwrap(users_api.get) + original_func = unwrap(users_api.get) _, status = original_func(query) assert status == expected_status mocke_serch.assert_called_once_with(query) @@ -36,7 +37,7 @@ def test_get_invalid_query_error(app: Flask, mocker: MockerFixture) -> None: query = mocker.Mock() error_message = "invalid query!" mocker.patch("server.clients.users.search", side_effect=InvalidQueryError(error_message)) - original_func = inspect.unwrap(users_api.get) + original_func = unwrap(users_api.get) result, status = original_func(query) assert isinstance(result, ErrorResponse) assert status == expected_status @@ -58,7 +59,7 @@ def test_post_success(app: Flask, mocker: MockerFixture) -> None: mocker.patch("server.services.users.create", return_value=user) mocker.patch("server.api.users.url_for", return_value=expected_headers["Location"]) - original_func = inspect.unwrap(users_api.post) + original_func = unwrap(users_api.post) result, status, headers = original_func(user) assert result == user assert status == expected_status @@ -78,7 +79,7 @@ def test_post_returns_400_on_invalid_form_error(app, mocker): ) mocker.patch("server.services.users.create", side_effect=InvalidFormError(error_detail)) - original_func = inspect.unwrap(users_api.post) + original_func = unwrap(users_api.post) result, status = original_func(user) assert isinstance(result, ErrorResponse) @@ -101,7 +102,7 @@ def test_post_id_conflict(app: Flask, mocker: MockerFixture) -> None: expected_status = 409 mocker.patch("server.services.users.create", side_effect=ResourceInvalid(error_detail)) - original_func = inspect.unwrap(users_api.post) + original_func = unwrap(users_api.post) result, status = original_func(user) assert isinstance(result, ErrorResponse) @@ -124,7 +125,7 @@ def test_id_get_success(app: Flask, mocker: MockerFixture) -> None: mocker.patch("server.services.users.get_by_id", return_value=user) mocker.patch("server.api.users.has_permission", return_value=True) - original_func = inspect.unwrap(users_api.id_get) + original_func = unwrap(users_api.id_get) result, status = original_func("u10") assert result == user assert status == expected_status @@ -135,7 +136,7 @@ def test_id_get_not_found(app: Flask, mocker: MockerFixture) -> None: expected_status = 404 mocker.patch("server.services.users.get_by_id", return_value=None) - original_func = inspect.unwrap(users_api.id_get) + original_func = unwrap(users_api.id_get) result, status = original_func("u12") assert isinstance(result, ErrorResponse) @@ -158,7 +159,7 @@ def test_id_get_no_permission(app: Flask, mocker: MockerFixture) -> None: mocker.patch("server.services.users.get_by_id", return_value=user) mocker.patch("server.api.users.has_permission", return_value=False) - original_func = inspect.unwrap(users_api.id_get) + original_func = unwrap(users_api.id_get) result, status = original_func("u11") assert isinstance(result, ErrorResponse) @@ -190,7 +191,7 @@ def test_id_put_success(app: Flask, mocker: MockerFixture) -> None: ) mocker.patch("server.api.users.current_user", dummy_user) - original_func = inspect.unwrap(users_api.id_put) + original_func = unwrap(users_api.id_put) result, status = original_func("u20", user) assert result == user assert status == expected_status @@ -221,7 +222,7 @@ def test_id_put_success_self(app: Flask, mocker: MockerFixture) -> None: mocker.patch("server.api.users.logout", return_value=("", 204)) mocker.patch("server.api.users.current_user", dummy_user) - original_func = inspect.unwrap(users_api.id_put) + original_func = unwrap(users_api.id_put) result, status = original_func("u20", user) assert result == user assert status == expected_status @@ -250,7 +251,7 @@ def test_id_put_invalid_form_error_403(app: Flask, mocker: MockerFixture) -> Non session_id="dummy", ) mocker.patch("server.api.users.current_user", dummy_user) - original_func = inspect.unwrap(users_api.id_put) + original_func = unwrap(users_api.id_put) result, status = original_func("u99", user) assert status == expected_status assert result == expected_result @@ -280,7 +281,7 @@ def test_id_put_invalid_form_error_400(app: Flask, mocker: MockerFixture) -> Non session_id="dummy", ) mocker.patch("server.api.users.current_user", dummy_user) - original_func = inspect.unwrap(users_api.id_put) + original_func = unwrap(users_api.id_put) result, status = original_func("u99", user) assert status == expected_status assert result == expected_result @@ -309,7 +310,7 @@ def test_id_put_not_found(app: Flask, mocker: MockerFixture) -> None: mocker.patch("server.api.users.current_user", dummy_user) mocker.patch("server.services.users.update", side_effect=ResourceNotFound("not found")) - original_func = inspect.unwrap(users_api.id_put) + original_func = unwrap(users_api.id_put) result, status = original_func("u24", user) assert isinstance(result, ErrorResponse) @@ -341,7 +342,7 @@ def test_id_put_resource_invalid(app: Flask, mocker: MockerFixture) -> None: ) mocker.patch("server.api.users.current_user", dummy_user) - original_func = inspect.unwrap(users_api.id_put) + original_func = unwrap(users_api.id_put) result, status = original_func("u25", user) assert isinstance(result, ErrorResponse) @@ -372,7 +373,7 @@ def test_id_put_sys_exc_info_branch(app: Flask, mocker: MockerFixture): mocker.patch("server.services.users.update", return_value=user) mocker.patch("sys.exc_info", return_value=(Exception, None, None)) print_exc_mock = mocker.patch("traceback.print_exc") - original_func = inspect.unwrap(users_api.id_put) + original_func = unwrap(users_api.id_put) result, status = original_func("u20", user) assert result == user assert status == expected_status @@ -432,7 +433,7 @@ def test_filter_options_returns_search_users_options_unit(mocker: MockerFixture) """Unit test: filter_options returns the mocked search_users_options result.""" mock_return = [object()] mocker.patch("server.api.users.search_users_options", return_value=mock_return) - original_func = inspect.unwrap(users_api.filter_options) + original_func = unwrap(users_api.filter_options) result = original_func() assert result == mock_return @@ -447,7 +448,7 @@ def test_export_get_success(app, mocker: MockerFixture) -> None: mock_file = object() mocker.patch("server.api.users.users.make_export_file", return_value=mock_file) mock_send_file = mocker.patch("server.api.users.send_file", return_value="sent-file-response") - original_func = inspect.unwrap(users_api.export_get) + original_func = unwrap(users_api.export_get) with app.test_request_context(): resp = original_func(query) mock_send_file.assert_called_once_with(mock_file) @@ -461,7 +462,7 @@ def test_export_get_invalid_export_error(app, mocker: MockerFixture) -> None: mock_current_user.map_id = "mapid" mock_current_user.name = "username" mocker.patch("server.api.users.users.make_export_file", side_effect=InvalidExportError("failmsg")) - original_func = inspect.unwrap(users_api.export_get) + original_func = unwrap(users_api.export_get) with app.test_request_context(): result, state = original_func(query) assert state == excepted_status @@ -476,7 +477,7 @@ def test_export_post_success(app, mocker: MockerFixture) -> None: mock_file = object() mocker.patch("server.api.users.users.make_export_file", return_value=mock_file) mock_send_file = mocker.patch("server.api.users.send_file", return_value="sent-file-response") - original_func = inspect.unwrap(users_api.export_post) + original_func = unwrap(users_api.export_post) with app.test_request_context(): resp = original_func(query) mock_send_file.assert_called_once_with(mock_file) @@ -490,7 +491,7 @@ def test_export_post_invalid_export_error(app, mocker: MockerFixture) -> None: mock_current_user.map_id = "mapid" mock_current_user.name = "username" mocker.patch("server.api.users.users.make_export_file", side_effect=InvalidExportError("failmsg")) - original_func = inspect.unwrap(users_api.export_post) + original_func = unwrap(users_api.export_post) with app.test_request_context(): result, state = original_func(query) assert state == excepted_status diff --git a/tests/unit/clients/test_bulks.py b/tests/unit/clients/test_bulks.py index d0b1f1f3..57d0c2e9 100644 --- a/tests/unit/clients/test_bulks.py +++ b/tests/unit/clients/test_bulks.py @@ -9,6 +9,7 @@ from server.entities.bulk_request import BulkOperation, BulkResponse from server.entities.map_error import MapError from server.entities.map_group import Administrator, MapGroup, MemberUser, Meta, Service + from tests.helpers import load_json_data diff --git a/tests/unit/clients/test_groups.py b/tests/unit/clients/test_groups.py index 1196d989..1925791a 100644 --- a/tests/unit/clients/test_groups.py +++ b/tests/unit/clients/test_groups.py @@ -1,6 +1,5 @@ import hashlib import importlib -import inspect import json import time import typing as t @@ -17,7 +16,8 @@ from server.entities.map_group import MapGroup from server.entities.patch_request import PatchOperation, PatchRequestPayload, ReplaceOperation from server.entities.search_request import SearchRequestParameter, SearchResponse -from tests.helpers import load_json_data + +from tests.helpers import load_json_data, unwrap if t.TYPE_CHECKING: @@ -51,7 +51,7 @@ def test_search_success(app: Flask, mocker: MockerFixture, group_data) -> None: mocker.patch.object(groups, "alias_generator", side_effect=lambda x: x) mock_get.return_value.text = response.model_dump_json() mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(groups.search) + original_func = unwrap(groups.search) result = original_func(query, access_token=access_token, client_secret=client_secret) @@ -104,7 +104,7 @@ def test_search_with_include(app: Flask, mocker: MockerFixture) -> None: mocker.patch.object(groups, "alias_generator", side_effect=lambda x: x) mock_get.return_value.text = json.dumps(response_data) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(groups.search) + original_func = unwrap(groups.search) result = original_func(query, include=include, access_token=access_token, client_secret=client_secret) call_args, called_kwargs = mock_get.call_args @@ -155,7 +155,7 @@ def test_search_with_exclude(app: Flask, mocker: MockerFixture) -> None: mocker.patch.object(groups, "alias_generator", side_effect=lambda x: x) mock_get.return_value.text = json.dumps(response_data) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(groups.search) + original_func = unwrap(groups.search) result = original_func(query, exclude=exclude, access_token=access_token, client_secret=client_secret) @@ -209,7 +209,7 @@ def test_search_groups_with_all_params(app: Flask, mocker: MockerFixture) -> Non mocker.patch.object(groups, "alias_generator", side_effect=lambda x: x) mock_get.return_value.text = json.dumps(response_data) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(groups.search) + original_func = unwrap(groups.search) result = original_func( query, include=include, exclude=exclude, access_token=access_token, client_secret=client_secret @@ -248,7 +248,7 @@ def test_search_status_400_returns_maperror(app: Flask, mocker: MockerFixture, g mock_get = mocker.patch("server.clients.groups.requests.get") mock_get.return_value.text = MapError.model_validate(error_data).model_dump_json() mock_get.return_value.status_code = 400 - original_func = inspect.unwrap(groups.search) + original_func = unwrap(groups.search) result = original_func(query, access_token=access_token, client_secret=client_secret) assert isinstance(result, MapError) @@ -261,7 +261,7 @@ def test_search_http_error(app: Flask, mocker: MockerFixture) -> None: mock_get = mocker.patch("server.clients.groups.requests.get") mock_get.return_value.status_code = 401 mock_get.return_value.raise_for_status.side_effect = Exception("401 Unauthorized") - original_func = inspect.unwrap(groups.search) + original_func = unwrap(groups.search) with pytest.raises(Exception, match="401 Unauthorized"): original_func(query, access_token="token", client_secret="secret") @@ -285,7 +285,7 @@ def test_get_by_id_success(app: Flask, mocker: MockerFixture, group_data) -> Non mock_response.return_value.text = json.dumps(json_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(groups.get_by_id) + original_func = unwrap(groups.get_by_id) result = original_func(group_id, access_token="token", client_secret="secret") mock_response.assert_called_once() @@ -324,7 +324,7 @@ def test_get_by_id_with_include(app: Flask, mocker: MockerFixture, group_data) - mock_response = mocker.patch("server.clients.groups.requests.get") mock_response.return_value.text = json.dumps(response_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(groups.get_by_id) + original_func = unwrap(groups.get_by_id) result = original_func(group_id, include=include, access_token="token", client_secret="secret") expected_params = { @@ -368,7 +368,7 @@ def test_get_by_id_with_exclude(app: Flask, mocker: MockerFixture, group_data) - mock_response.return_value.text = json.dumps(response_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(groups.get_by_id) + original_func = unwrap(groups.get_by_id) result = original_func(group_id, exclude=exclude, access_token="token", client_secret="secret") mock_response.assert_called_once() @@ -415,7 +415,7 @@ def test_get_by_id_with_all_params(app: Flask, mocker: MockerFixture, group_data mock_response.return_value.text = json.dumps(response_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(groups.get_by_id) + original_func = unwrap(groups.get_by_id) result = original_func(group_id, include=include, exclude=exclude, access_token="token", client_secret="secret") expected_params = { @@ -445,7 +445,7 @@ def test_get_by_id_status_400_returns_maperror(app: Flask, mocker: MockerFixture mock_get = mocker.patch("server.clients.groups.requests.get") mock_get.return_value.text = MapError.model_validate(error_data).model_dump_json() mock_get.return_value.status_code = 400 - original_func = inspect.unwrap(groups.get_by_id) + original_func = unwrap(groups.get_by_id) result = original_func(group_id, access_token="token", client_secret="secret") assert isinstance(result, MapError) @@ -460,7 +460,7 @@ def test_get_by_id_http_error(app: Flask, mocker: MockerFixture, group_data) -> mock_response.return_value.text = json.dumps(json_data) mock_response.return_value.raise_for_status.side_effect = HTTPError("401 Unauthorized") mock_response.return_value.status_code = 401 - original_func = inspect.unwrap(groups.get_by_id) + original_func = unwrap(groups.get_by_id) with pytest.raises(HTTPError, match="401 Unauthorized"): original_func(group_id, access_token="token", client_secret="secret") @@ -479,7 +479,7 @@ def test_post_success(app: Flask, mocker: MockerFixture, group_data) -> None: mock_post.return_value.text = json.dumps(json_data) mock_post.return_value.status_code = 200 - original_func = inspect.unwrap(groups.post) + original_func = unwrap(groups.post) result = original_func(group, include=None, exclude=None, access_token="token", client_secret="secret") mock_post.assert_called_once() @@ -517,7 +517,7 @@ def test_post_with_include(app: Flask, mocker: MockerFixture, group_data) -> Non mock_post.return_value.text = json.dumps(response_data) mock_post.return_value.status_code = 200 - original_func = inspect.unwrap(groups.post) + original_func = unwrap(groups.post) result = original_func(group, include=include, exclude=None, access_token="token", client_secret="secret") call_args, called_kwargs = mock_post.call_args @@ -592,7 +592,7 @@ def test_post_with_all_params(app: Flask, mocker: MockerFixture, group_data) -> mock_post.return_value.text = json.dumps(response_data) mock_post.return_value.status_code = 200 - original_func = inspect.unwrap(groups.post) + original_func = unwrap(groups.post) result = original_func(group, include=include, exclude=exclude, access_token="token", client_secret="secret") call_args, called_kwargs = mock_post.call_args @@ -618,7 +618,7 @@ def test_post_status_400_returns_maperror(app: Flask, mocker: MockerFixture, gro mock_post.return_value.text = MapError.model_validate(error_data).model_dump_json() mock_post.return_value.status_code = 400 - original_func = inspect.unwrap(groups.post) + original_func = unwrap(groups.post) result = original_func(group, access_token="token", client_secret="secret") assert isinstance(result, MapError) @@ -652,7 +652,7 @@ def test_put_by_id_success(app: Flask, mocker: MockerFixture, group_data) -> Non mock_put.return_value.text = json.dumps(json_data) mock_put.return_value.status_code = 200 clear_id = mocker.patch("server.clients.groups.get_by_id.clear_cache") - original_func = inspect.unwrap(groups.put_by_id) + original_func = unwrap(groups.put_by_id) result = original_func(group, access_token="token", client_secret="secret") @@ -695,7 +695,7 @@ def test_put_by_id_with_include(app: Flask, mocker: MockerFixture, group_data) - mock_put.return_value.status_code = 200 clear_id = mocker.patch("server.clients.groups.get_by_id.clear_cache") - original_func = inspect.unwrap(groups.put_by_id) + original_func = unwrap(groups.put_by_id) result = original_func(group, include=include, access_token="token", client_secret="secret") call_args, called_kwargs = mock_put.call_args @@ -734,7 +734,7 @@ def test_put_by_id_with_exclude(app: Flask, mocker: MockerFixture, group_data) - mock_put.return_value.status_code = 200 mocker.patch.object(groups, "alias_generator", side_effect=lambda x: x) clear_id = mocker.patch("server.clients.groups.get_by_id.clear_cache") - original_func = inspect.unwrap(groups.put_by_id) + original_func = unwrap(groups.put_by_id) result = original_func(group, exclude=exclude, access_token="token", client_secret="secret") call_args, called_kwargs = mock_put.call_args @@ -775,7 +775,7 @@ def test_put_by_id_with_all_params(app: Flask, mocker: MockerFixture, group_data mock_put.return_value.status_code = 200 clear_id = mocker.patch("server.clients.groups.get_by_id.clear_cache") - original_func = inspect.unwrap(groups.put_by_id) + original_func = unwrap(groups.put_by_id) result = original_func(group, include=include, exclude=exclude, access_token="token", client_secret="secret") call_args, called_kwargs = mock_put.call_args @@ -841,7 +841,7 @@ def test_patch_by_id_success(app: Flask, mocker: MockerFixture, group_data) -> N mock_patch.return_value.status_code = 200 clear_id = mocker.patch("server.clients.groups.get_by_id.clear_cache") - original_func = inspect.unwrap(groups.patch_by_id) + original_func = unwrap(groups.patch_by_id) result = original_func(group_id, operations, access_token="token", client_secret="secret") mock_patch.assert_called_once() @@ -884,7 +884,7 @@ def test_patch_by_id_with_include(app: Flask, mocker: MockerFixture, group_data) mock_patch.return_value.status_code = 200 mocker.patch("server.clients.groups.get_by_id.clear_cache") - original_func = inspect.unwrap(groups.patch_by_id) + original_func = unwrap(groups.patch_by_id) result = original_func(group_id, operations, include=include, access_token="token", client_secret="secret") call_args, called_kwargs = mock_patch.call_args @@ -928,7 +928,7 @@ def test_patch_by_id_with_exclude(app: Flask, mocker: MockerFixture, group_data) mock_patch.return_value.status_code = 200 mocker.patch.object(groups, "alias_generator", side_effect=lambda x: x) - original_func = inspect.unwrap(groups.patch_by_id) + original_func = unwrap(groups.patch_by_id) result = original_func(group_id, operations, exclude=exclude, access_token="token", client_secret="secret") call_args, called_kwargs = mock_patch.call_args @@ -972,7 +972,7 @@ def test_patch_by_id_with_all_params(app: Flask, mocker: MockerFixture, group_da mock_patch.return_value.text = json.dumps(response_data) mock_patch.return_value.status_code = 200 - original_func = inspect.unwrap(groups.patch_by_id) + original_func = unwrap(groups.patch_by_id) result = original_func( group_id, operations, include=include, exclude=exclude, access_token="token", client_secret="secret" ) @@ -999,7 +999,7 @@ def test_patch_by_id_status_400_returns_maperror(app: Flask, mocker: MockerFixtu mock_patch = mocker.patch("server.clients.groups.requests.patch") mock_patch.return_value.text = MapError.model_validate(error_data).model_dump_json() mock_patch.return_value.status_code = 400 - original_func = inspect.unwrap(groups.patch_by_id) + original_func = unwrap(groups.patch_by_id) result = original_func(group_id, operations, access_token="token", client_secret="secret") assert isinstance(result, MapError) @@ -1016,7 +1016,7 @@ def test_patch_by_id_http_error(app: Flask, mocker: MockerFixture, group_data) - mock_patch.return_value.status_code = 401 mocker.patch("server.clients.groups.get_by_id.clear_cache") - original_func = inspect.unwrap(groups.patch_by_id) + original_func = unwrap(groups.patch_by_id) with pytest.raises(HTTPError, match="401 Unauthorized"): original_func(group_id, operations, access_token="token", client_secret="secret") @@ -1066,7 +1066,7 @@ def test_delete_by_id_status_400_returns_maperror(app: Flask, mocker: MockerFixt mock_delete.return_value.status_code = 400 clear_id = mocker.patch("server.clients.groups.get_by_id.clear_cache") - original_func = inspect.unwrap(groups.delete_by_id) + original_func = unwrap(groups.delete_by_id) result = original_func(group_id, access_token="token", client_secret="secret") assert isinstance(result, MapError) @@ -1095,7 +1095,7 @@ def test_handle_group_updated_clears_cache(group_data, mocker): _, group = group_data group: MapGroup = MapGroup(id="group123", display_name="Test Group") - original_func = inspect.unwrap(groups.handle_group_updated) + original_func = unwrap(groups.handle_group_updated) original_func(_sender=None, group_id=group) @@ -1103,7 +1103,7 @@ def test_handle_group_updated_by_id_clears_cache(mocker): """Covers get_by_id.clear_cache(group_id) branch for handle_group_updated_by_id.""" mock_clear = mocker.patch("server.clients.groups.get_by_id.clear_cache") group_id = "group123" - original_func = inspect.unwrap(groups.handle_group_updated_by_id) + original_func = unwrap(groups.handle_group_updated_by_id) original_func(_sender=None, group_id=group_id) mock_clear.assert_called_once_with(group_id) @@ -1113,7 +1113,7 @@ def test_handle_group_updated_by_ids_clears_cache(mocker): mock_clear = mocker.patch("server.clients.groups.get_by_id.clear_cache") group_ids = ["group1", "group2"] - original_func = inspect.unwrap(groups.handle_group_updated_by_ids) + original_func = unwrap(groups.handle_group_updated_by_ids) original_func(_sender=None, group_ids=group_ids) mock_clear.assert_called_once_with(*group_ids) diff --git a/tests/unit/clients/test_services.py b/tests/unit/clients/test_services.py index 6419a0ca..4c7bb267 100644 --- a/tests/unit/clients/test_services.py +++ b/tests/unit/clients/test_services.py @@ -1,6 +1,5 @@ import hashlib import importlib -import inspect import json import time import typing as t @@ -23,7 +22,8 @@ from server.entities.map_service import MapService from server.entities.patch_request import PatchOperation, ReplaceOperation from server.entities.search_request import SearchRequestParameter, SearchResponse -from tests.helpers import load_json_data + +from tests.helpers import load_json_data, unwrap if t.TYPE_CHECKING: @@ -82,7 +82,7 @@ def test_search_success(app: Flask, mocker: MockerFixture) -> None: mock_get = mocker.patch("server.clients.services.requests.get") mock_get.return_value.text = json.dumps(response) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(services.search) + original_func = unwrap(services.search) result = original_func( query, @@ -136,7 +136,7 @@ def test_search_with_include(app: Flask, mocker: MockerFixture) -> None: mock_get = mocker.patch("server.clients.services.requests.get") mock_get.return_value.text = json.dumps(response_data) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(services.search) + original_func = unwrap(services.search) result = original_func( query, @@ -204,7 +204,7 @@ def test_search_with_exclude(app: Flask, mocker: MockerFixture) -> None: mocker.patch.object(services, "alias_generator", side_effect=lambda x: x) mock_get.return_value.text = json.dumps(response_data) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(services.search) + original_func = unwrap(services.search) result = original_func( query, @@ -232,7 +232,7 @@ def test_search_not_found(app: Flask, mocker: MockerFixture) -> None: mock_get.return_value.raise_for_status.side_effect = Exception("Not Found") mock_get.return_value.text = expected_error.model_dump_json() mock_get.return_value.status_code = 404 - original_func = inspect.unwrap(services.search) + original_func = unwrap(services.search) with pytest.raises(Exception, match="Not Found"): original_func(query, access_token=access_token, client_secret=client_secret) @@ -245,7 +245,7 @@ def test_search_http_error(app: Flask, mocker: MockerFixture) -> None: mock_get = mocker.patch("server.clients.services.requests.get") mock_get.return_value.status_code = 401 mock_get.return_value.raise_for_status.side_effect = Exception("401 Unauthorized") - original_func = inspect.unwrap(services.search) + original_func = unwrap(services.search) with pytest.raises(Exception, match="401 Unauthorized"): original_func(query, access_token="token", client_secret="secret") @@ -275,7 +275,7 @@ def test_get_by_id_success(app: Flask, mocker: MockerFixture, service_data) -> N mock_response.return_value.text = json.dumps(json_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(services.get_by_id) + original_func = unwrap(services.get_by_id) result = original_func(service_id, access_token="token", client_secret="secret") mock_response.assert_called_once() @@ -309,7 +309,7 @@ def test_get_by_id_with_include(app: Flask, mocker: MockerFixture, service_data) mock_response.return_value.text = json.dumps(response_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(services.get_by_id) + original_func = unwrap(services.get_by_id) result = original_func(service_id, include=include, access_token="token", client_secret="secret") call_args, called_kwargs = mock_response.call_args @@ -355,7 +355,7 @@ def test_get_by_id_with_exclude(app: Flask, mocker: MockerFixture, service_data) mock_response.return_value.text = json.dumps(response_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(services.get_by_id) + original_func = unwrap(services.get_by_id) result = original_func(service_id, exclude=exclude, access_token="token", client_secret="secret") mock_response.assert_called_once() @@ -373,7 +373,7 @@ def test_get_by_id_not_found(app: Flask, mocker: MockerFixture) -> None: mock_response.return_value.text = expected_error.model_dump_json() mock_response.return_value.status_code = 404 - original_func = inspect.unwrap(services.get_by_id) + original_func = unwrap(services.get_by_id) result = original_func(service_id, access_token="token", client_secret="secret") assert isinstance(result, MapError) @@ -387,7 +387,7 @@ def test_get_by_id_http_error(app: Flask, mocker: MockerFixture, service_data) - mock_response.return_value.text = json.dumps(json_data) mock_response.return_value.raise_for_status.side_effect = HTTPError("401 Unauthorized") mock_response.return_value.status_code = 401 - original_func = inspect.unwrap(services.get_by_id) + original_func = unwrap(services.get_by_id) with pytest.raises(HTTPError, match="401 Unauthorized"): original_func(service_id, access_token="token", client_secret="secret") @@ -417,7 +417,7 @@ def test_post_success(app: Flask, mocker: MockerFixture, service_data) -> None: mock_post.return_value.text = json.dumps(json_data) mock_post.return_value.status_code = 200 - original_func = inspect.unwrap(services.post) + original_func = unwrap(services.post) result = original_func( service_obj, include=None, @@ -460,7 +460,7 @@ def test_post_with_include(app: Flask, mocker: MockerFixture, service_data) -> N mock_post.return_value.text = json.dumps(response_data) mock_post.return_value.status_code = 200 - original_func = inspect.unwrap(services.post) + original_func = unwrap(services.post) result = original_func( service_obj, include=include, @@ -505,7 +505,7 @@ def test_post_with_exclude(app: Flask, mocker: MockerFixture, service_data) -> N mock_post.return_value.text = json.dumps(response_data) mock_post.return_value.status_code = HTTPStatus.CONFLICT - original_func = inspect.unwrap(services.post) + original_func = unwrap(services.post) result = original_func( service_obj, include=None, @@ -542,7 +542,7 @@ def test_post_not_found(app: Flask, mocker: MockerFixture, service_data) -> None _, service = service_data service_obj: MapService = service - original_func = inspect.unwrap(services.post) + original_func = unwrap(services.post) result = original_func( service_obj, include=None, @@ -572,7 +572,7 @@ def test_post_http_error(app: Flask, mocker: MockerFixture, service_data) -> Non json_data, service = service_data service_obj: MapService = service - original_func = inspect.unwrap(services.post) + original_func = unwrap(services.post) with pytest.raises(HTTPError, match="401 Unauthorized"): original_func(service_obj, access_token="token", client_secret="secret") @@ -600,7 +600,7 @@ def test_put_by_id_success(app: Flask, mocker: MockerFixture, service_data) -> N mock_put.return_value.status_code = 200 mocker.patch("server.clients.services.repository_updated") - original_func = inspect.unwrap(services.put_by_id) + original_func = unwrap(services.put_by_id) result = original_func(service_obj, access_token="token", client_secret="secret") mock_put.assert_called_once() @@ -650,7 +650,7 @@ def test_put_by_id_with_include(app: Flask, mocker: MockerFixture, service_data) mock_put.return_value.text = json.dumps(response_data) mock_put.return_value.status_code = HTTPStatus.BAD_REQUEST - original_func = inspect.unwrap(services.put_by_id) + original_func = unwrap(services.put_by_id) result = original_func(service_obj, include=include, access_token="token", client_secret="secret") call_args, called_kwargs = mock_put.call_args @@ -697,7 +697,7 @@ def test_put_by_id_with_exclude(app: Flask, mocker: MockerFixture, service_data) mock_put.return_value.text = json.dumps(response_data) mock_put.return_value.status_code = 200 - original_func = inspect.unwrap(services.put_by_id) + original_func = unwrap(services.put_by_id) result = original_func(service_obj, exclude=exclude, access_token="token", client_secret="secret") call_args, called_kwargs = mock_put.call_args @@ -762,7 +762,7 @@ def test_patch_by_id_success(app: Flask, mocker: MockerFixture, service_data) -> mock_patch.return_value.status_code = 200 mocker.patch("server.clients.services.repository_updated") - original_func = inspect.unwrap(services.patch_by_id) + original_func = unwrap(services.patch_by_id) result = original_func(service_id, operations, access_token="token", client_secret="secret") mock_patch.assert_called_once() @@ -812,7 +812,7 @@ def test_patch_by_id_with_include(app: Flask, mocker: MockerFixture, service_dat mock_patch.return_value.status_code = 200 mocker.patch("server.clients.services.repository_updated") - original_func = inspect.unwrap(services.patch_by_id) + original_func = unwrap(services.patch_by_id) result = original_func( service_id, operations, @@ -865,7 +865,7 @@ def test_patch_by_id_with_exclude(app: Flask, mocker: MockerFixture, service_dat mock_patch.return_value.text = json.dumps(response_data) mock_patch.return_value.status_code = 200 mocker.patch("server.clients.services.repository_updated") - original_func = inspect.unwrap(services.patch_by_id) + original_func = unwrap(services.patch_by_id) result = original_func( service_id, operations, @@ -897,7 +897,7 @@ def test_patch_by_id_not_found(app: Flask, mocker: MockerFixture) -> None: mock_patch.return_value.text = json.dumps(error_data) mock_patch.return_value.status_code = 404 - original_func = inspect.unwrap(services.patch_by_id) + original_func = unwrap(services.patch_by_id) result = original_func(service_id, operations, access_token="token", client_secret="secret") assert isinstance(result, MapError) diff --git a/tests/unit/clients/test_users.py b/tests/unit/clients/test_users.py index 1122722c..588d2c11 100644 --- a/tests/unit/clients/test_users.py +++ b/tests/unit/clients/test_users.py @@ -1,6 +1,5 @@ import hashlib import importlib -import inspect import json import time import typing as t @@ -22,7 +21,8 @@ from server.entities.map_user import MapUser from server.entities.patch_request import AddOperation, PatchOperation, PatchRequestPayload, ReplaceOperation from server.entities.search_request import SearchRequestParameter, SearchResponse -from tests.helpers import load_json_data + +from tests.helpers import load_json_data, unwrap if t.TYPE_CHECKING: @@ -66,7 +66,7 @@ def test_search_success(app: Flask, mocker: MockerFixture) -> None: mock_get.return_value.text = response.model_dump_json() mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(users.search) + original_func = unwrap(users.search) result = original_func( query, @@ -124,7 +124,7 @@ def test_search_with_include(app: Flask, mocker: MockerFixture) -> None: mock_get = mocker.patch("server.clients.users.requests.get") mock_get.return_value.text = json.dumps(response_data) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(users.search) + original_func = unwrap(users.search) result = original_func( query, include=include, @@ -181,7 +181,7 @@ def test_search_with_exclude(app: Flask, mocker: MockerFixture) -> None: mocker.patch.object(users, "alias_generator", side_effect=lambda x: x) mock_get.return_value.text = json.dumps(response_data) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(users.search) + original_func = unwrap(users.search) result = original_func( query, exclude=exclude, @@ -215,7 +215,7 @@ def test_search_status_400_returns_maperror(app: Flask, mocker: MockerFixture) - mock_get = mocker.patch("server.clients.users.requests.get") mock_get.return_value.text = expected_error.model_dump_json() mock_get.return_value.status_code = 400 - original_func = inspect.unwrap(users.search) + original_func = unwrap(users.search) result = original_func(query, access_token=access_token, client_secret=client_secret) assert isinstance(result, MapError) assert "Not Found" in result.detail @@ -228,7 +228,7 @@ def test_search_http_error(app: Flask, mocker: MockerFixture) -> None: mock_get = mocker.patch("server.clients.users.requests.get") mock_get.return_value.status_code = 401 mock_get.return_value.raise_for_status.side_effect = Exception("401 Unauthorized") - original_func = inspect.unwrap(users.search) + original_func = unwrap(users.search) with pytest.raises(Exception, match="401 Unauthorized"): original_func(query, access_token="token", client_secret="secret") @@ -256,7 +256,7 @@ def test_get_by_id_success(app: Flask, mocker: MockerFixture, user_data) -> None mock_response.return_value.text = json.dumps(json_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(users.get_by_id) + original_func = unwrap(users.get_by_id) result = original_func(user_id, access_token="token", client_secret="secret") mock_response.assert_called_once() call_args, called_kwargs = mock_response.call_args @@ -303,7 +303,7 @@ def test_get_by_id_with_include(app: Flask, mocker: MockerFixture, user_data) -> mock_response.return_value.text = json.dumps(response_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(users.get_by_id) + original_func = unwrap(users.get_by_id) result = original_func(user_id, include=include, access_token="token", client_secret="secret") call_args, called_kwargs = mock_response.call_args called_params_attributes = called_kwargs["params"].pop("attributes") @@ -354,7 +354,7 @@ def test_get_by_id_with_exclude(app: Flask, mocker: MockerFixture, user_data) -> mock_response.return_value.text = json.dumps(response_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(users.get_by_id) + original_func = unwrap(users.get_by_id) result = original_func(user_id, exclude=exclude, access_token="token", client_secret="secret") mock_response.assert_called_once() call_args, called_kwargs = mock_response.call_args @@ -381,7 +381,7 @@ def test_get_by_id_not_found(app: Flask, mocker: MockerFixture) -> None: mock_response.return_value.text = expected_error.model_dump_json() mock_response.return_value.status_code = 404 - original_func = inspect.unwrap(users.get_by_id) + original_func = unwrap(users.get_by_id) result = original_func(user_id, access_token="token", client_secret="secret") assert isinstance(result, MapError) @@ -398,7 +398,7 @@ def test_get_by_id_http_error(app: Flask, mocker: MockerFixture, user_data) -> N mock_response.return_value.raise_for_status.side_effect = HTTPError("401 Unauthorized") mock_response.return_value.status_code = 401 - original_func = inspect.unwrap(users.get_by_id) + original_func = unwrap(users.get_by_id) with pytest.raises(HTTPError, match="401 Unauthorized"): original_func(user_id, access_token="token", client_secret="secret") @@ -426,7 +426,7 @@ def test_get_by_eppn_success(app: Flask, mocker: MockerFixture, user_data) -> No mock_response.return_value.text = json.dumps(json_data) mock_response.return_value.status_code = 200 - original_func = inspect.unwrap(users.get_by_eppn) + original_func = unwrap(users.get_by_eppn) result = original_func(eppn, access_token=access_token, client_secret="secret") mock_response.assert_called_once() call_args, called_kwargs = mock_response.call_args @@ -478,7 +478,7 @@ def test_get_by_eppn_with_includ(app: Flask, mocker: MockerFixture, user_data) - mock_get.return_value.text = json.dumps(response_data) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(users.get_by_eppn) + original_func = unwrap(users.get_by_eppn) result = original_func(eppn, include=include, access_token="token", client_secret="secret") call_args, called_kwargs = mock_get.call_args @@ -528,7 +528,7 @@ def test_get_by_eppn_with_exclude(app: Flask, mocker: MockerFixture, user_data) mock_get.return_value.text = json.dumps(response_data) mock_get.return_value.status_code = 200 - original_func = inspect.unwrap(users.get_by_eppn) + original_func = unwrap(users.get_by_eppn) result = original_func(eppn, exclude=exclude, access_token="token", client_secret="secret") call_args, called_kwargs = mock_get.call_args @@ -561,7 +561,7 @@ def test_get_by_eppn_400_returns_maperror(app: Flask, mocker: MockerFixture) -> mock_get.return_value.text = expected_error.model_dump_json() mock_get.return_value.status_code = 400 - original_func = inspect.unwrap(users.get_by_eppn) + original_func = unwrap(users.get_by_eppn) result = original_func(eppn, access_token="token", client_secret="secret") assert isinstance(result, MapError) @@ -578,7 +578,7 @@ def test_get_by_eppn_http_error(app: Flask, mocker: MockerFixture, user_data) -> mock_get.return_value.raise_for_status.side_effect = HTTPError("401 Unauthorized") mock_get.return_value.status_code = 401 - original_func = inspect.unwrap(users.get_by_eppn) + original_func = unwrap(users.get_by_eppn) with pytest.raises(HTTPError, match="401 Unauthorized"): original_func(eppn, access_token="token", client_secret="secret") @@ -601,7 +601,7 @@ def test_post_success(app: Flask, mocker: MockerFixture, user_data) -> None: mock_post.return_value.text = json.dumps(json_data) mock_post.return_value.status_code = 200 - original_func = inspect.unwrap(users.post) + original_func = unwrap(users.post) result = original_func(user, include=None, exclude=None, access_token="token", client_secret="secret") mock_post.assert_called_once() call_args, called_kwargs = mock_post.call_args @@ -654,7 +654,7 @@ def test_post_with_include(app: Flask, mocker: MockerFixture, user_data) -> None mock_post.return_value.text = json.dumps(response_data) mock_post.return_value.status_code = 200 - original_func = inspect.unwrap(users.post) + original_func = unwrap(users.post) result = original_func(user, include=include, exclude=None, access_token="token", client_secret="secret") call_args, called_kwargs = mock_post.call_args called_params_attributes = called_kwargs["params"].pop("attributes") @@ -773,7 +773,7 @@ def test_put_by_id_success(app: Flask, mocker: MockerFixture, user_data) -> None clear_id = mocker.patch("server.clients.users.get_by_id.clear_cache") clear_eppn = mocker.patch("server.clients.users.get_by_eppn.clear_cache") - original_func = inspect.unwrap(users.put_by_id) + original_func = unwrap(users.put_by_id) result: MapUser = original_func(user, access_token="token", client_secret="secret") mock_put.assert_called_once() call_args, called_kwargs = mock_put.call_args @@ -836,7 +836,7 @@ def test_put_by_id_with_include(app: Flask, mocker: MockerFixture, user_data) -> mocker.patch("server.clients.users.get_by_id.clear_cache") mocker.patch("server.clients.users.get_by_eppn.clear_cache") - original_func = inspect.unwrap(users.put_by_id) + original_func = unwrap(users.put_by_id) result: MapUser = original_func(user, include=include, access_token="token", client_secret="secret") call_args, called_kwargs = mock_put.call_args called_params_attributes = called_kwargs["params"].pop("attributes") @@ -887,7 +887,7 @@ def test_put_by_id_with_exclude(app: Flask, mocker: MockerFixture, user_data) -> mocker.patch("server.clients.users.get_by_eppn.clear_cache") mocker.patch("server.clients.users.search.clear_cache") - original_func = inspect.unwrap(users.put_by_id) + original_func = unwrap(users.put_by_id) result: MapUser = original_func(user, exclude=exclude, access_token="token", client_secret="secret") call_args, called_kwargs = mock_put.call_args called_params_attributes = called_kwargs["params"].pop("attributes", None) @@ -986,7 +986,7 @@ def test_patch_by_id_success(app: Flask, mocker: MockerFixture, user_data) -> No clear_id = mocker.patch("server.clients.users.get_by_id.clear_cache") clear_eppn = mocker.patch("server.clients.users.get_by_eppn.clear_cache") - original_func = inspect.unwrap(users.patch_by_id) + original_func = unwrap(users.patch_by_id) result: MapUser = original_func(user_id, operations, access_token="token", client_secret="secret") mock_patch.assert_called_once() call_args, called_kwargs = mock_patch.call_args @@ -1061,7 +1061,7 @@ def test_patch_by_id_with_include(app: Flask, mocker: MockerFixture, user_data) mocker.patch("server.clients.users.get_by_id.clear_cache") mocker.patch("server.clients.users.get_by_eppn.clear_cache") - original_func = inspect.unwrap(users.patch_by_id) + original_func = unwrap(users.patch_by_id) result: MapUser = original_func(user_id, operations, include=include, access_token="token", client_secret="secret") call_args, called_kwargs = mock_patch.call_args called_params_attributes = called_kwargs["params"].pop("attributes") @@ -1127,7 +1127,7 @@ def test_patch_by_id_with_exclude(app: Flask, mocker: MockerFixture, user_data) mocker.patch.object(users, "alias_generator", side_effect=lambda x: x) mocker.patch("server.clients.users.search.clear_cache") - original_func = inspect.unwrap(users.patch_by_id) + original_func = unwrap(users.patch_by_id) result: MapUser = original_func(user_id, operations, exclude=exclude, access_token="token", client_secret="secret") call_args, called_kwargs = mock_patch.call_args called_params_attributes = called_kwargs["params"].pop("attributes", None) @@ -1161,7 +1161,7 @@ def test_patch_by_id_status_400_returns_maperror(app: Flask, mocker: MockerFixtu mock_patch.return_value.text = json.dumps(error_data) mock_patch.return_value.status_code = 400 - original_func = inspect.unwrap(users.patch_by_id) + original_func = unwrap(users.patch_by_id) result = original_func(user_id, operations, access_token="token", client_secret="secret") assert isinstance(result, MapError) @@ -1181,7 +1181,7 @@ def test_patch_by_id_http_error(app: Flask, mocker: MockerFixture, user_data) -> mocker.patch("server.clients.users.get_by_id.clear_cache") mocker.patch("server.clients.users.get_by_eppn.clear_cache") - original_func = inspect.unwrap(users.patch_by_id) + original_func = unwrap(users.patch_by_id) with pytest.raises(HTTPError, match="401 Unauthorized"): original_func(user_id, operations, access_token="token", client_secret="secret") @@ -1198,7 +1198,7 @@ def test_patch_by_id_does_not_clear_cache_on_error(app: Flask, mocker: MockerFix clear_id = mocker.patch("server.clients.users.get_by_id.clear_cache") clear_eppn = mocker.patch("server.clients.users.get_by_eppn.clear_cache") - original_func = inspect.unwrap(users.patch_by_id) + original_func = unwrap(users.patch_by_id) result = original_func(user_id, operations, access_token="token", client_secret="secret") assert isinstance(result, MapError) clear_id.assert_not_called() diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py index 8261678c..e3fe1508 100644 --- a/tests/unit/conftest.py +++ b/tests/unit/conftest.py @@ -1,4 +1,3 @@ -import inspect import typing as t from pathlib import Path @@ -109,27 +108,6 @@ def test_config(): ) -def mock_redis(mocker: MockerFixture): - mock_redis = mocker.patch("server.datastore.Redis") - mock_redis_instance = mock_redis.from_url.return_value - mock_redis_instance.ping.return_value = True - return mock_redis_instance - - -@pytest.fixture -def unwrap(): - def _unwrap(f: t.Callable) -> t.Callable: - return inspect.unwrap(f) - - return _unwrap - - -@pytest.fixture(autouse=True) -def redis_disable(mocker: MockerFixture): - mocker.patch("server.datastore.Redis") - mocker.patch("server.datastore.sentinel") - - @pytest.fixture def datastore(mocker: MockerFixture): app_cache = mocker.MagicMock() @@ -180,14 +158,6 @@ def _data(num: int) -> SearchResult[RepositorySummary]: return _data -@pytest.fixture -def cache_keys(): - def _keys(fqdn_list: list[str]) -> list[bytes]: - return [f"{fqdn.replace('-', '_').replace('.', '_')}_gakunin_groups".encode() for fqdn in fqdn_list] - - return _keys - - @pytest.fixture def cached_data(): def _data( diff --git a/tests/unit/entities/test_map_user.py b/tests/unit/entities/test_map_user.py index debe273f..a55776f1 100644 --- a/tests/unit/entities/test_map_user.py +++ b/tests/unit/entities/test_map_user.py @@ -5,6 +5,7 @@ from pydantic_core import ValidationError from server.entities.map_user import EPPN, Email, Group, MapUser, Meta + from tests.helpers import load_json_data diff --git a/tests/unit/services/test_group_caches.py b/tests/unit/services/test_group_caches.py index 30230601..9b282b5a 100644 --- a/tests/unit/services/test_group_caches.py +++ b/tests/unit/services/test_group_caches.py @@ -27,6 +27,8 @@ update_task, ) +from tests.helpers import unwrap + if t.TYPE_CHECKING: from pytest_mock import MockerFixture @@ -37,6 +39,14 @@ def setup_config(app): setup_wgcd_config(config.CACHE_GROUPS) +@pytest.fixture +def cache_keys(): + def _keys(fqdn_list: list[str]) -> list[bytes]: + return [f"{fqdn.replace('-', '_').replace('.', '_')}_gakunin_groups".encode() for fqdn in fqdn_list] + + return _keys + + def test_get_repository_cache(app, mocker: MockerFixture, gen_summaries, cache_keys, cached_data, datastore): num_repo = 20 query = CacheQuery(l=20, p=1) @@ -440,7 +450,7 @@ def test_update_raises_failed_task_running(app, mocker: MockerFixture, datastore mocker.stopall() -def test_update_task_all(app, mocker: MockerFixture, gen_summaries, unwrap): +def test_update_task_all(app, mocker: MockerFixture, gen_summaries): repositories = gen_summaries(1).resources mock_fetch_all = mocker.patch("server.services.group_caches.wgcd.fetch_all") @@ -499,7 +509,7 @@ def test_is_update_task_running_not_exists(app, datastore): app_cache.hget.assert_called_once_with("jcgroups-test-weko-group-cache-db", "status") -def test_handle_progress(app, mocker: MockerFixture, unwrap, datastore): +def test_handle_progress(app, mocker: MockerFixture, datastore): data = ProgressData(status="in_progress", total=10, done=5, current="example.com") app_cache, _, _ = datastore @@ -509,7 +519,7 @@ def test_handle_progress(app, mocker: MockerFixture, unwrap, datastore): app_cache.hset.assert_called_once_with(cache_key, mapping=data.model_dump(mode="json")) -def test_handle_progress_redis_error(app, mocker: MockerFixture, unwrap, datastore, caplog): +def test_handle_progress_redis_error(app, mocker: MockerFixture, datastore, caplog): data = ProgressData(status="in_progress", total=10, done=5, current="example.com") app_cache, _, _ = datastore app_cache.hset.side_effect = RedisError("Redis error") @@ -522,7 +532,7 @@ def test_handle_progress_redis_error(app, mocker: MockerFixture, unwrap, datasto assert str(W.FAILED_UPDATE_TASK_PROGRESS % {"done": 5, "total": 10}) in caplog.text -def test_handle_excuted(app, mocker: MockerFixture, unwrap, datastore): +def test_handle_excuted(app, mocker: MockerFixture, datastore): data = ExecutedData( fqdn="example.com", status="success", @@ -540,7 +550,7 @@ def test_handle_excuted(app, mocker: MockerFixture, unwrap, datastore): app_cache.hset.assert_called_once_with(cache_key, mapping={field_name: data.model_dump_json()}) -def test_handle_excuted_redis_error(app, mocker: MockerFixture, unwrap, datastore, caplog): +def test_handle_excuted_redis_error(app, mocker: MockerFixture, datastore, caplog): data = ExecutedData( fqdn="example.com", status="success", @@ -564,7 +574,7 @@ def test_handle_excuted_redis_error(app, mocker: MockerFixture, unwrap, datastor ) -def test_get_task_status(app, mocker: MockerFixture, unwrap, datastore): +def test_get_task_status(app, mocker: MockerFixture, datastore): task_data = { b"current": b"example.com", b"status": b"in_progress", @@ -604,7 +614,7 @@ def test_get_task_status(app, mocker: MockerFixture, unwrap, datastore): app_cache.delete.assert_not_called() -def test_get_task_status_not_running(app, unwrap, datastore): +def test_get_task_status_not_running(app, datastore): app_cache, _, _ = datastore app_cache.hgetall.return_value = {} app_cache.hget.return_value = "completed" @@ -614,7 +624,7 @@ def test_get_task_status_not_running(app, unwrap, datastore): assert result is None -def test_get_task_status_no_task(app, unwrap, datastore): +def test_get_task_status_no_task(app, datastore): app_cache, _, _ = datastore app_cache.hgetall.return_value = {} @@ -623,7 +633,7 @@ def test_get_task_status_no_task(app, unwrap, datastore): assert result is None -def test_get_task_status_redis_error(app, unwrap, datastore): +def test_get_task_status_redis_error(app, datastore): app_cache, _, _ = datastore app_cache.hgetall.side_effect = RedisError("Redis error") @@ -631,7 +641,7 @@ def test_get_task_status_redis_error(app, unwrap, datastore): unwrap(get_task_status)() -def test_get_task_status_parse_error(app, unwrap, datastore): +def test_get_task_status_parse_error(app, datastore): app_cache, _, _ = datastore cache_data = { diff --git a/tests/unit/services/test_groups.py b/tests/unit/services/test_groups.py index 673cabdc..5da73885 100644 --- a/tests/unit/services/test_groups.py +++ b/tests/unit/services/test_groups.py @@ -31,6 +31,7 @@ from server.services import groups from server.services.groups import update_put from server.services.utils.search_queries import GroupsCriteria, make_criteria_object + from tests.helpers import UnexpectedError diff --git a/tests/unit/services/test_search_queries.py b/tests/unit/services/test_search_queries.py index 09901406..47847842 100644 --- a/tests/unit/services/test_search_queries.py +++ b/tests/unit/services/test_search_queries.py @@ -1,4 +1,3 @@ -import inspect import typing as t from datetime import date @@ -14,6 +13,8 @@ from server.services.utils import search_queries from server.services.utils.affiliations import Affiliations, _Group +from tests.helpers import unwrap + if t.TYPE_CHECKING: from pytest_mock import MockerFixture @@ -602,7 +603,7 @@ def test__path_generator(app, mocker: MockerFixture, model, expected): def test__get_id_prefix_not_match(app, test_config, mocker: MockerFixture): mocker.patch("server.config.config.REPOSITORIES.id_patterns.sp_connector", "invalid_pattern") - test_func = inspect.unwrap(search_queries._get_id_prefix) # noqa: SLF001 + test_func = unwrap(search_queries._get_id_prefix) # noqa: SLF001 with pytest.raises(ConfigurationError) as exc: test_func() assert str(exc.value) == str(E.INVALID_SERVER_CONFIG) diff --git a/tests/unit/services/test_users.py b/tests/unit/services/test_users.py index 1dc5e3d2..a17c6c82 100644 --- a/tests/unit/services/test_users.py +++ b/tests/unit/services/test_users.py @@ -36,6 +36,7 @@ make_criteria_object, ) from server.services.utils.affiliations import Affiliations, _Group, _RoleGroup + from tests.helpers import load_json_data diff --git a/tests/unit/test_ext.py b/tests/unit/test_ext.py index 5adfbae3..9c47eaae 100644 --- a/tests/unit/test_ext.py +++ b/tests/unit/test_ext.py @@ -19,4 +19,4 @@ def test_init_config(mocker: MockerFixture): ext = JAIROCloudGroupsManager() ext.init_config(mock_app) mock_setup_config.assert_called_once() - mock_cache_db_setup_config.assert_called_once_with(ext.config.CACHE_DB) + mock_cache_db_setup_config.assert_called_once_with(ext.config.for_group_caches) diff --git a/uv.lock b/uv.lock index 7301d16f..4c1e9576 100644 --- a/uv.lock +++ b/uv.lock @@ -364,7 +364,7 @@ wheels = [ [[package]] name = "jairocloud-groups-manager" -version = "1.0.0a1" +version = "1.0.0a2" source = { virtual = "." } dependencies = [ { name = "celery", extra = ["redis"] },