From 31bfaba0f597145929f03eebc0b613c1e741d575 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Wed, 9 Jul 2025 10:39:26 +0200 Subject: [PATCH 1/5] feat: component parser and props validator utility --- package.json | 27 +- playground/app.vue | 38 +- playground/assets/css/main.css | 2 + playground/components/CodeEditor.vue | 37 + playground/components/TestComponent.vue | 29 +- playground/components/test.vue | 72 + playground/nuxt.config.ts | 3 + playground/package.json | 5 + playground/pages/index.vue | 37 + playground/pages/props.vue | 68 + playground/server/api/validate.post.ts | 39 + playground/server/utils/format.ts | 14 + pnpm-lock.yaml | 2000 +++++++++++++++++++--- src/module.ts | 18 +- src/parser/index.ts | 50 + src/{parser.ts => parser/meta-parser.ts} | 132 +- src/parser/utils.ts | 108 ++ src/types/index.ts | 3 + src/{options.ts => types/module.ts} | 2 +- src/{types.d.ts => types/parser.ts} | 10 +- src/types/schema.ts | 9 + src/utils/index.ts | 1 + src/{ => utils}/loader.ts | 2 +- src/utils/schema.ts | 234 +++ src/{ => utils}/unplugin.ts | 4 +- test/parser.test.ts | 139 ++ 26 files changed, 2653 insertions(+), 430 deletions(-) create mode 100644 playground/assets/css/main.css create mode 100644 playground/components/CodeEditor.vue create mode 100644 playground/components/test.vue create mode 100644 playground/pages/index.vue create mode 100644 playground/pages/props.vue create mode 100644 playground/server/api/validate.post.ts create mode 100644 playground/server/utils/format.ts create mode 100644 src/parser/index.ts rename src/{parser.ts => parser/meta-parser.ts} (61%) create mode 100644 src/parser/utils.ts create mode 100644 src/types/index.ts rename src/{options.ts => types/module.ts} (98%) rename src/{types.d.ts => types/parser.ts} (67%) create mode 100644 src/types/schema.ts create mode 100644 src/utils/index.ts rename src/{ => utils}/loader.ts (95%) create mode 100644 src/utils/schema.ts rename src/{ => utils}/unplugin.ts (89%) create mode 100644 test/parser.test.ts diff --git a/package.json b/package.json index 9cd03af..ba239ff 100644 --- a/package.json +++ b/package.json @@ -14,6 +14,14 @@ ".": { "import": "./dist/module.mjs", "types": "./dist/types.d.mts" + }, + "./utils": { + "import": "./dist/utils.mjs", + "types": "./dist/utils.d.mts" + }, + "./parser": { + "import": "./dist/parser.mjs", + "types": "./dist/parser.d.mts" } }, "main": "./dist/module.mjs", @@ -41,21 +49,22 @@ "dependencies": { "@nuxt/kit": "^3.17.6", "citty": "^0.1.6", + "json-schema-to-zod": "^2.6.1", "mlly": "^1.7.4", "ohash": "^2.0.11", "scule": "^1.3.0", "typescript": "^5.8.3", "ufo": "^1.6.1", - "vue-component-meta": "^3.0.0" + "vue-component-meta": "^3.0.1" }, "devDependencies": { "@iconify/vue": "^5.0.0", - "@nuxt/content": "^3.6.1", - "@nuxt/eslint-config": "^1.5.0", + "@nuxt/content": "^3.6.3", + "@nuxt/eslint-config": "^1.5.2", "@nuxt/module-builder": "^1.0.1", "@nuxt/test-utils": "^3.19.2", "@nuxtjs/eslint-config-typescript": "^12.1.0", - "changelogen": "^0.6.1", + "changelogen": "^0.6.2", "eslint": "^9.30.1", "jiti": "^2.4.2", "nuxt": "^3.17.6", @@ -66,7 +75,11 @@ "build": { "entries": [ { - "input": "./src/parser.ts", + "input": "./src/utils/index.ts", + "name": "utils" + }, + { + "input": "./src/parser/index.ts", "name": "parser" }, { @@ -93,7 +106,9 @@ ] }, "onlyBuiltDependencies": [ - "esbuild" + "@tailwindcss/oxide", + "esbuild", + "vue-demi" ] }, "packageManager": "pnpm@10.12.4", diff --git a/playground/app.vue b/playground/app.vue index c143894..16d886a 100644 --- a/playground/app.vue +++ b/playground/app.vue @@ -1,37 +1,3 @@ - - - - + + \ No newline at end of file diff --git a/playground/assets/css/main.css b/playground/assets/css/main.css new file mode 100644 index 0000000..e16c58c --- /dev/null +++ b/playground/assets/css/main.css @@ -0,0 +1,2 @@ +@import 'tailwindcss'; +@import '@nuxt/ui-pro'; \ No newline at end of file diff --git a/playground/components/CodeEditor.vue b/playground/components/CodeEditor.vue new file mode 100644 index 0000000..2afecb7 --- /dev/null +++ b/playground/components/CodeEditor.vue @@ -0,0 +1,37 @@ + + + diff --git a/playground/components/TestComponent.vue b/playground/components/TestComponent.vue index 715595a..ca9896f 100644 --- a/playground/components/TestComponent.vue +++ b/playground/components/TestComponent.vue @@ -8,8 +8,19 @@ - diff --git a/playground/nuxt.config.ts b/playground/nuxt.config.ts index d53ab1d..34fa2b4 100644 --- a/playground/nuxt.config.ts +++ b/playground/nuxt.config.ts @@ -1,6 +1,8 @@ import nuxtMetaModule from '../src/module' export default defineNuxtConfig({ + css: ['~/assets/css/main.css'], + components: { dirs: [ { @@ -14,6 +16,7 @@ export default defineNuxtConfig({ modules: [ '@nuxt/content', + '@nuxt/ui-pro', nuxtMetaModule as any ], diff --git a/playground/package.json b/playground/package.json index b788e93..0dfa5fa 100644 --- a/playground/package.json +++ b/playground/package.json @@ -3,6 +3,7 @@ "name": "nuxt-component-meta-playground", "devDependencies": { "@nuxt/content": "^3.6.1", + "@nuxt/ui-pro": "^3.2.0", "nuxt": "^3.17.6", "nuxt-component-meta": "link:.." }, @@ -10,5 +11,9 @@ "dev": "nuxi dev", "build": "nuxi build", "generate": "nuxi generate" + }, + "dependencies": { + "@amoayun/monaco-editor-vue3": "^1.0.20", + "monaco-editor": "^0.52.2" } } diff --git a/playground/pages/index.vue b/playground/pages/index.vue new file mode 100644 index 0000000..0a8f53e --- /dev/null +++ b/playground/pages/index.vue @@ -0,0 +1,37 @@ + + + + + diff --git a/playground/pages/props.vue b/playground/pages/props.vue new file mode 100644 index 0000000..6a25d68 --- /dev/null +++ b/playground/pages/props.vue @@ -0,0 +1,68 @@ + + + diff --git a/playground/server/api/validate.post.ts b/playground/server/api/validate.post.ts new file mode 100644 index 0000000..af85d6b --- /dev/null +++ b/playground/server/api/validate.post.ts @@ -0,0 +1,39 @@ +import { writeFile } from "fs/promises" + +import { getComponentMeta } from "../../../src/parser" +import { propsToJsonSchema } from "../../../src/utils" +import { jsonSchemaToZod } from "json-schema-to-zod" +import { formatJS } from "../utils/format" + +export default eventHandler(async (event) => { + const { component, data, strict } = await readBody(event) + const rootDir = process.cwd() + + await writeFile(`node_modules/test.vue`, component) + const meta = getComponentMeta('node_modules/test.vue') + const jsonSchema = propsToJsonSchema(meta.props) + let zodString = jsonSchemaToZod(jsonSchema, { module: "esm", withJsdocs: true }).trim() + if (strict) { + zodString = zodString + '.strict()' + } + zodString = await formatJS(zodString) + + + await writeFile(`node_modules/test.zod.mjs`, zodString) + const zod = await import(`${rootDir}/node_modules/test.zod.mjs?time=${Date.now()}`) + + try { + const validation = zod.default.safeParse(data) + return { + success: true, + validation, + zodString + } + } catch (error) { + return { + success: false, + error, + zodString + } + } +}) diff --git a/playground/server/utils/format.ts b/playground/server/utils/format.ts new file mode 100644 index 0000000..f04d79a --- /dev/null +++ b/playground/server/utils/format.ts @@ -0,0 +1,14 @@ +import prettier from 'prettier/standalone'; +import parserBabel from 'prettier/plugins/babel'; +import pluginEstree from 'prettier/plugins/estree'; + +export function formatJS(code: string) { + return prettier.format(code, { + parser: 'babel', + plugins: [parserBabel, pluginEstree], + semi: true, + singleQuote: true, + tabWidth: 2, + + }); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f921c22..fcd4076 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -14,6 +14,9 @@ importers: citty: specifier: ^0.1.6 version: 0.1.6 + json-schema-to-zod: + specifier: ^2.6.1 + version: 2.6.1 mlly: specifier: ^1.7.4 version: 1.7.4 @@ -30,30 +33,30 @@ importers: specifier: ^1.6.1 version: 1.6.1 vue-component-meta: - specifier: ^3.0.0 - version: 3.0.0(typescript@5.8.3)(vue-component-type-helpers@2.2.10) + specifier: ^3.0.1 + version: 3.0.1(typescript@5.8.3)(vue-component-type-helpers@2.2.10) devDependencies: '@iconify/vue': specifier: ^5.0.0 version: 5.0.0(vue@3.5.17(typescript@5.8.3)) '@nuxt/content': - specifier: ^3.6.1 - version: 3.6.1(better-sqlite3@11.9.1)(magicast@0.3.5) + specifier: ^3.6.3 + version: 3.6.3(better-sqlite3@11.9.1)(magicast@0.3.5)(vue-component-type-helpers@2.2.10) '@nuxt/eslint-config': - specifier: ^1.5.0 - version: 1.5.0(@vue/compiler-sfc@3.5.17)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + specifier: ^1.5.2 + version: 1.5.2(@vue/compiler-sfc@3.5.17)(eslint-plugin-import-x@4.10.6(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@nuxt/module-builder': specifier: ^1.0.1 version: 1.0.1(@nuxt/cli@3.25.1(magicast@0.3.5))(@vue/compiler-core@3.5.17)(esbuild@0.25.5)(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)) '@nuxt/test-utils': specifier: ^3.19.2 - version: 3.19.2(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + version: 3.19.2(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) '@nuxtjs/eslint-config-typescript': specifier: ^12.1.0 version: 12.1.0(eslint-plugin-import-x@4.10.6(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) changelogen: - specifier: ^0.6.1 - version: 0.6.1(magicast@0.3.5) + specifier: ^0.6.2 + version: 0.6.2(magicast@0.3.5) eslint: specifier: ^9.30.1 version: 9.30.1(jiti@2.4.2) @@ -62,25 +65,35 @@ importers: version: 2.4.2 nuxt: specifier: ^3.17.6 - version: 3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.0)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0) + version: 3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.0)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0) release-it: specifier: ^19.0.3 version: 19.0.3(@types/node@22.14.1)(magicast@0.3.5) vitest: specifier: ^3.2.4 - version: 3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + version: 3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) vue: specifier: ^3.5.17 version: 3.5.17(typescript@5.8.3) playground: + dependencies: + '@amoayun/monaco-editor-vue3': + specifier: ^1.0.20 + version: 1.0.20(typescript@5.8.3) + monaco-editor: + specifier: ^0.52.2 + version: 0.52.2 devDependencies: '@nuxt/content': specifier: ^3.6.1 version: 3.6.1(better-sqlite3@11.9.1)(magicast@0.3.5) + '@nuxt/ui-pro': + specifier: ^3.2.0 + version: 3.2.0(@babel/parser@7.28.0)(@netlify/blobs@8.2.0)(db0@0.3.2(better-sqlite3@11.9.1))(embla-carousel@8.6.0)(ioredis@5.6.1)(jwt-decode@4.0.0)(magicast@0.3.5)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))(zod@3.25.67) nuxt: specifier: ^3.17.6 - version: 3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0) + version: 3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0) nuxt-component-meta: specifier: link:.. version: link:.. @@ -89,13 +102,45 @@ importers: devDependencies: nuxt: specifier: ^3.17.6 - version: 3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0) + version: 3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0) nuxt-component-meta: specifier: '*' version: 0.10.1(magicast@0.3.5) packages: + '@ai-sdk/provider-utils@2.2.8': + resolution: {integrity: sha512-fqhG+4sCVv8x7nFzYnFo19ryhAa3w096Kmc3hWxMQfW/TubPOmt3A6tYZhl4mUfQWWQMsuSkLrtjlWuXBVSGQA==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/provider@1.1.3': + resolution: {integrity: sha512-qZMxYJ0qqX/RfnuIaab+zp8UAeJn/ygXXAffR5I4N0n1IrvA6qBsjc8hXLmBiMV2zoXlifkacF7sEFnYnjBcqg==} + engines: {node: '>=18'} + + '@ai-sdk/ui-utils@1.2.11': + resolution: {integrity: sha512-3zcwCc8ezzFlwp3ZD15wAPjf2Au4s3vAbKsXQVyhxODHcmu0iyPO2Eua6D/vicq/AUm/BAo60r97O6HU+EI0+w==} + engines: {node: '>=18'} + peerDependencies: + zod: ^3.23.8 + + '@ai-sdk/vue@1.2.12': + resolution: {integrity: sha512-uJJ4w6vlj3mmWzjwg+1dqKtyQSVmavO//189eh3D6bUC/G17OWQdV47b67FaOiNkdlDIxormmbUOjlYDQv0TtA==} + engines: {node: '>=18'} + peerDependencies: + vue: ^3.3.4 + peerDependenciesMeta: + vue: + optional: true + + '@alloc/quick-lru@5.2.0': + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + + '@amoayun/monaco-editor-vue3@1.0.20': + resolution: {integrity: sha512-PZCfzRHzE146O9Y2oWgXQsn9ruwthbs383xDBngkRwcv6EZG1nRnSJEEA9B/mC7Son95BU374RyRnvSRAE2AmA==} + '@ampproject/remapping@2.3.0': resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} @@ -103,6 +148,9 @@ packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@antfu/utils@8.1.1': + resolution: {integrity: sha512-Mex9nXf9vR6AhcXmMrlz/HVgYYZpVGJ6YlPgwl7UnaFpnshXs6EK/oa5Gpf3CzENMjkvEx2tQtntGnb7UtSTOQ==} + '@apidevtools/json-schema-ref-parser@11.9.3': resolution: {integrity: sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==} engines: {node: '>= 16'} @@ -269,6 +317,12 @@ packages: resolution: {integrity: sha512-jYnje+JyZG5YThjHiF28oT4SIZLnYOcSBb6+SDaFIyzDVSkXQmQQYclJ2R+YxcdmK0AX6x1E5OQNtuh3jHDrUg==} engines: {node: '>=6.9.0'} + '@capsizecss/metrics@3.5.0': + resolution: {integrity: sha512-Ju2I/Qn3c1OaU8FgeW4Tc22D4C9NwyVfKzNmzst59bvxBjPoLYNZMqFYn+HvCtn4MpXwiaDtCE8fNuQLpdi9yA==} + + '@capsizecss/unpack@2.4.0': + resolution: {integrity: sha512-GrSU71meACqcmIUxPYOJvGKF0yryjN/L1aCuE9DViCTJI7bfkjgYDPD1zbNDcINJwSSP6UaBZY9GAbYDO7re0Q==} + '@clack/core@0.5.0': resolution: {integrity: sha512-p3y0FIOwaYRUPRcMO7+dlmLh8PSRcrjuTndsiA0WAFbWES0mLZlrjVoBRZ9DzkPFJZG6KGkJmoEAY0ZcVWTkow==} @@ -671,6 +725,18 @@ packages: '@fastify/busboy@3.1.1': resolution: {integrity: sha512-5DGmA8FTdB2XbDeEwc/5ZXBl6UbBAyBOOLlPuBnZ/N1SwdH9Ii+cOX3tBROlDgcTXxjOYnLMVoKk9+FXAw0CJw==} + '@floating-ui/core@1.7.2': + resolution: {integrity: sha512-wNB5ooIKHQc+Kui96jE/n69rHFWAVoxn5CAzL1Xdd8FG03cgY3MLO+GF9U3W737fYDSgPWA6MReKhBQBop6Pcw==} + + '@floating-ui/dom@1.7.2': + resolution: {integrity: sha512-7cfaOQuCS27HD7DX+6ib2OrnW+b4ZBwDNnCcT0uTyidcmyWb03FnQqJybDBoCnpdxwBSfA94UAYlRCt7mV+TbA==} + + '@floating-ui/utils@0.2.10': + resolution: {integrity: sha512-aGTxbpbg8/b5JfU1HXSrbH3wXZuLPJcNEcZQFMxLs3oSzgtVu6nFPkbbGGUvBcUjKV2YyB9Wxxabo+HEH9tcRQ==} + + '@floating-ui/vue@1.1.7': + resolution: {integrity: sha512-idmAtbAIigGXN2SI5gItiXYBYtNfDTP9yIiObxgu13dgtG7ARCHlNfnR29GxP4LI4o13oiwsJ8wVgghj1lNqcw==} + '@humanfs/core@0.19.1': resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} engines: {node: '>=18.18.0'} @@ -691,9 +757,15 @@ packages: resolution: {integrity: sha512-xeO57FpIu4p1Ri3Jq/EXq4ClRm86dVF2z/+kvFnyqVYRavTZmaFaUBbWCOuuTh0o/g7DSsk6kc2vrS4Vl5oPOQ==} engines: {node: '>=18.18'} + '@iconify/collections@1.0.565': + resolution: {integrity: sha512-L3st2gtlsO1U7oLv5Z+yIe4wnFju5OLCG+y2wWmkQU9zULDskItSLBo/7KcjB3msHxRlKYom3oNCYLahT6ckUg==} + '@iconify/types@2.0.0': resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + '@iconify/utils@2.3.0': + resolution: {integrity: sha512-GmQ78prtwYW6EtzXRU1rY+KwOKfz32PD7iJh6Iyqw68GiKuoZ2A6pRtzWONz5VQJbp50mEjXh/7NkumtrAgRKA==} + '@iconify/vue@5.0.0': resolution: {integrity: sha512-C+KuEWIF5nSBrobFJhT//JS87OZ++QDORB6f2q2Wm6fl2mueSTpFBeBsveK0KW9hWiZ4mNiPjsh6Zs4jjdROSg==} peerDependencies: @@ -820,9 +892,23 @@ packages: '@types/node': optional: true + '@internationalized/date@3.8.2': + resolution: {integrity: sha512-/wENk7CbvLbkUvX1tu0mwq49CVkkWpkXubGel6birjRPyo6uQ4nQpnq5xZu823zRCwwn82zgHrvgF1vZyvmVgA==} + + '@internationalized/number@3.6.3': + resolution: {integrity: sha512-p+Zh1sb6EfrfVaS86jlHGQ9HA66fJhV9x5LiE5vCbZtXEHAuhcmUZUdZ4WrFpUBfNalr2OkAJI5AcKEQF+Lebw==} + '@ioredis/commands@1.2.0': resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} + '@isaacs/balanced-match@4.0.1': + resolution: {integrity: sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==} + engines: {node: 20 || >=22} + + '@isaacs/brace-expansion@5.0.0': + resolution: {integrity: sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==} + engines: {node: 20 || >=22} + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -959,6 +1045,23 @@ packages: sqlite3: optional: true + '@nuxt/content@3.6.3': + resolution: {integrity: sha512-AF9/h5YWLXqQi8m1T40lEQLw7zeV98+LdcHRVrrYsWnFKiScRzJhtn+4uzYqUCKx7KPuXK1GszOvUrY3Ke0Q2w==} + peerDependencies: + '@electric-sql/pglite': '*' + '@libsql/client': '*' + better-sqlite3: ^12.0.0 + sqlite3: '*' + peerDependenciesMeta: + '@electric-sql/pglite': + optional: true + '@libsql/client': + optional: true + better-sqlite3: + optional: true + sqlite3: + optional: true + '@nuxt/devalue@2.0.2': resolution: {integrity: sha512-GBzP8zOc7CGWyFQS6dv1lQz8VVpz5C2yRszbXufwG/9zhStTIH50EtD87NmWbTMwXDvZLNg8GIpb1UFdH93JCA==} @@ -977,20 +1080,29 @@ packages: peerDependencies: vite: '>=6.0' - '@nuxt/eslint-config@1.5.0': - resolution: {integrity: sha512-8eGLiDwrOkJfcQVfZVNg6NL7Lf8vqMj2KZiuY0GF3b5cWDjWOFlf8qvieeJ1ug0sfSpRJktJrSAhhP5U+FzQOg==} + '@nuxt/eslint-config@1.5.2': + resolution: {integrity: sha512-oHAwVi11Chsnsi3RPsQa9lrIdrNeqlIJLMLD0tqigSXePsgN4zObTZfHL9zcnqBlOw7sD0k8RUbitzIk7dNEqA==} peerDependencies: eslint: ^9.0.0 eslint-plugin-format: '*' + eslint-plugin-import-x: '*' peerDependenciesMeta: eslint-plugin-format: optional: true + eslint-plugin-import-x: + optional: true - '@nuxt/eslint-plugin@1.5.0': - resolution: {integrity: sha512-MgFgv2e6doITEaPqM0K/AiH5Gc1M8xwVqhT7X279zcDX0V0aNkwf2heGeHKJL2ZjWEW/6oPykHfhHNJi5VABVA==} + '@nuxt/eslint-plugin@1.5.2': + resolution: {integrity: sha512-tTejIcjd2eAlQjcT8CXA/200rAHZp24NjutEzAvvYoBOhkOdHZhGrBCxwkq0KVnct6jCnzmyscEOESd4o8VNsQ==} peerDependencies: eslint: ^9.0.0 + '@nuxt/fonts@0.11.4': + resolution: {integrity: sha512-GbLavsC+9FejVwY+KU4/wonJsKhcwOZx/eo4EuV57C4osnF/AtEmev8xqI0DNlebMEhEGZbu1MGwDDDYbeR7Bw==} + + '@nuxt/icon@1.15.0': + resolution: {integrity: sha512-kA0rxqr1B601zNJNcOXera8CyYcxUCEcT7dXEC7rwAz71PRCN5emf7G656eKEQgtqrD4JSj6NQqWDgrmFcf/GQ==} + '@nuxt/kit@3.16.2': resolution: {integrity: sha512-K1SAUo2vweTfudKZzjKsZ5YJoxPLTspR5qz5+G61xtZreLpsdpDYfBseqsIAl5VFLJuszeRpWQ01jP9LfQ6Ksw==} engines: {node: '>=18.12.0'} @@ -1052,12 +1164,64 @@ packages: vitest: optional: true + '@nuxt/ui-pro@3.2.0': + resolution: {integrity: sha512-1FnRMgXAdWAkzIawJJUqRWphEXtyUgvLSbZmMDLGgYl0G3oGAO2dNJet6BXMgb7hzmDdX2m7U3lu26o87J8t2w==} + peerDependencies: + joi: ^17.13.0 + superstruct: ^2.0.0 + typescript: ^5.6.3 + valibot: ^1.0.0 + yup: ^1.6.0 + zod: ^3.24.0 + peerDependenciesMeta: + joi: + optional: true + superstruct: + optional: true + valibot: + optional: true + yup: + optional: true + zod: + optional: true + + '@nuxt/ui@3.2.0': + resolution: {integrity: sha512-4xK3MM6DZwrPzptDWakKKLa7iS6eVAilxs0YZy6HTEiDsoCuq2JQWJKI0hniNQdY8pcH6AjpkQDx8NJlqBvp/Q==} + hasBin: true + peerDependencies: + '@inertiajs/vue3': ^2.0.7 + joi: ^17.13.0 + superstruct: ^2.0.0 + typescript: ^5.6.3 + valibot: ^1.0.0 + vue-router: ^4.5.0 + yup: ^1.6.0 + zod: ^3.24.0 + peerDependenciesMeta: + '@inertiajs/vue3': + optional: true + joi: + optional: true + superstruct: + optional: true + valibot: + optional: true + vue-router: + optional: true + yup: + optional: true + zod: + optional: true + '@nuxt/vite-builder@3.17.6': resolution: {integrity: sha512-D7bf0BE2nDFj23ryKuSakQFDETt5rpnMTlaoDsRElrApFRvMNzF7pYHuHjvPELsi0UmaqCb8sZn6ki0GALEu2A==} engines: {node: ^18.12.0 || ^20.9.0 || >=22.0.0} peerDependencies: vue: ^3.3.4 + '@nuxtjs/color-mode@3.5.2': + resolution: {integrity: sha512-cC6RfgZh3guHBMLLjrBB2Uti5eUoGM9KyauOaYS9ETmxNWBMTvpgjvSiSJp1OFljIXPIqVTJ3xtJpSNZiO3ZaA==} + '@nuxtjs/eslint-config-typescript@12.1.0': resolution: {integrity: sha512-l2fLouDYwdAvCZEEw7wGxOBj+i8TQcHFu3zMPTLqKuv1qu6WcZIr0uztkbaa8ND1uKZ9YPqKx6UlSOjM4Le69Q==} peerDependencies: @@ -1637,9 +1801,6 @@ packages: '@shikijs/langs@3.7.0': resolution: {integrity: sha512-1zYtdfXLr9xDKLTGy5kb7O0zDQsxXiIsw1iIBcNOO8Yi5/Y1qDbJ+0VsFoqTlzdmneO8Ij35g7QKF8kcLyznCQ==} - '@shikijs/themes@3.3.0': - resolution: {integrity: sha512-tXeCvLXBnqq34B0YZUEaAD1lD4lmN6TOHAhnHacj4Owh7Ptb/rf5XCDeROZt2rEOk5yuka3OOW2zLqClV7/SOg==} - '@shikijs/themes@3.7.0': resolution: {integrity: sha512-VJx8497iZPy5zLiiCTSIaOChIcKQwR0FebwE9S3rcN0+J/GTWwQ1v/bqhTbpbY3zybPKeO8wdammqkpXc4NVjQ==} @@ -1677,12 +1838,129 @@ packages: resolution: {integrity: sha512-yH4M/SHN98NibniIwTVk6rwTJjy7n39l7zwWY3u+qsfZBGTi4lC1uEl2NDvIlkzsFtfCBvHBJJFJ1iuU3UzzEQ==} hasBin: true + '@standard-schema/spec@1.0.0': + resolution: {integrity: sha512-m2bOd0f2RT9k8QJx1JN85cZYyH1RqFBdlwtkSlf4tBDYLCiiZnv1fIIwacK6cqwXavOydf0NPToMQgpKq+dVlA==} + '@stylistic/eslint-plugin@5.1.0': resolution: {integrity: sha512-TJRJul4u/lmry5N/kyCU+7RWWOk0wyXN+BncRlDYBqpLFnzXkd7QGVfN7KewarFIXv0IX0jSF/Ksu7aHWEDeuw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=9.0.0' + '@swc/helpers@0.5.17': + resolution: {integrity: sha512-5IKx/Y13RsYd+sauPb2x+U/xZikHjolzfuDgTAl/Tdf3Q8rslRvC19NKDLgAJQ6wsqADk10ntlv08nPFw/gO/A==} + + '@tailwindcss/node@4.1.11': + resolution: {integrity: sha512-yzhzuGRmv5QyU9qLNg4GTlYI6STedBWRE7NjxP45CsFYYq9taI0zJXZBMqIC/c8fViNLhmrbpSFS57EoxUmD6Q==} + + '@tailwindcss/oxide-android-arm64@4.1.11': + resolution: {integrity: sha512-3IfFuATVRUMZZprEIx9OGDjG3Ou3jG4xQzNTvjDoKmU9JdmoCohQJ83MYd0GPnQIu89YoJqvMM0G3uqLRFtetg==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [android] + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + resolution: {integrity: sha512-ESgStEOEsyg8J5YcMb1xl8WFOXfeBmrhAwGsFxxB2CxY9evy63+AtpbDLAyRkJnxLy2WsD1qF13E97uQyP1lfQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [darwin] + + '@tailwindcss/oxide-darwin-x64@4.1.11': + resolution: {integrity: sha512-EgnK8kRchgmgzG6jE10UQNaH9Mwi2n+yw1jWmof9Vyg2lpKNX2ioe7CJdf9M5f8V9uaQxInenZkOxnTVL3fhAw==} + engines: {node: '>= 10'} + cpu: [x64] + os: [darwin] + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + resolution: {integrity: sha512-xdqKtbpHs7pQhIKmqVpxStnY1skuNh4CtbcyOHeX1YBE0hArj2romsFGb6yUmzkq/6M24nkxDqU8GYrKrz+UcA==} + engines: {node: '>= 10'} + cpu: [x64] + os: [freebsd] + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + resolution: {integrity: sha512-ryHQK2eyDYYMwB5wZL46uoxz2zzDZsFBwfjssgB7pzytAeCCa6glsiJGjhTEddq/4OsIjsLNMAiMlHNYnkEEeg==} + engines: {node: '>= 10'} + cpu: [arm] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + resolution: {integrity: sha512-mYwqheq4BXF83j/w75ewkPJmPZIqqP1nhoghS9D57CLjsh3Nfq0m4ftTotRYtGnZd3eCztgbSPJ9QhfC91gDZQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + resolution: {integrity: sha512-m/NVRFNGlEHJrNVk3O6I9ggVuNjXHIPoD6bqay/pubtYC9QIdAMpS+cswZQPBLvVvEF6GtSNONbDkZrjWZXYNQ==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + resolution: {integrity: sha512-YW6sblI7xukSD2TdbbaeQVDysIm/UPJtObHJHKxDEcW2exAtY47j52f8jZXkqE1krdnkhCMGqP3dbniu1Te2Fg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + resolution: {integrity: sha512-e3C/RRhGunWYNC3aSF7exsQkdXzQ/M+aYuZHKnw4U7KQwTJotnWsGOIVih0s2qQzmEzOFIJ3+xt7iq67K/p56Q==} + engines: {node: '>= 10'} + cpu: [x64] + os: [linux] + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + resolution: {integrity: sha512-Xo1+/GU0JEN/C/dvcammKHzeM6NqKovG+6921MR6oadee5XPBaKOumrJCXvopJ/Qb5TH7LX/UAywbqrP4lax0g==} + 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.1.11': + resolution: {integrity: sha512-UgKYx5PwEKrac3GPNPf6HVMNhUIGuUh4wlDFR2jYYdkX6pL/rn73zTq/4pzUm8fOjAn5L8zDeHp9iXmUGOXZ+w==} + engines: {node: '>= 10'} + cpu: [arm64] + os: [win32] + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + resolution: {integrity: sha512-YfHoggn1j0LK7wR82TOucWc5LDCguHnoS879idHekmmiR7g9HUtMw9MI0NHatS28u/Xlkfi9w5RJWgz2Dl+5Qg==} + engines: {node: '>= 10'} + cpu: [x64] + os: [win32] + + '@tailwindcss/oxide@4.1.11': + resolution: {integrity: sha512-Q69XzrtAhuyfHo+5/HMgr1lAiPP/G40OMFAnws7xcFEYqcypZmdW8eGXaOUIeOl1dzPJBPENXgbjsOyhg2nkrg==} + engines: {node: '>= 10'} + + '@tailwindcss/postcss@4.1.11': + resolution: {integrity: sha512-q/EAIIpF6WpLhKEuQSEVMZNMIY8KhWoAemZ9eylNAih9jxMGAYPPWBn3I9QL/2jZ+e7OEz/tZkX5HwbBR4HohA==} + + '@tailwindcss/vite@4.1.11': + resolution: {integrity: sha512-RHYhrR3hku0MJFRV+fN2gNbDNEh3dwKvY8XJvTxCSXeMOsCRSr+uKvDWQcbizrHgjML6ZmTE5OwMrl5wKcujCw==} + peerDependencies: + vite: ^5.2.0 || ^6 || ^7 + + '@tanstack/table-core@8.21.3': + resolution: {integrity: sha512-ldZXEhOBb8Is7xLs01fR3YEc3DERiz5silj8tnGkFZytt1abEvl/GhUmCE0PMLaMPTa3Jk4HbKmRlHmu+gCftg==} + engines: {node: '>=12'} + + '@tanstack/virtual-core@3.13.12': + resolution: {integrity: sha512-1YBOJfRHV4sXUmWsFSf5rQor4Ss82G8dQWLRbnk3GA4jeP8hQt1hxXh0tmflpC0dz3VgEv/1+qwPyLeWkQuPFA==} + + '@tanstack/vue-table@8.21.3': + resolution: {integrity: sha512-rusRyd77c5tDPloPskctMyPLFEQUeBzxdQ+2Eow4F7gDPlPOB1UnnhzfpdvqZ8ZyX2rRNGmqNnQWm87OI2OQPw==} + engines: {node: '>=12'} + peerDependencies: + vue: '>=3.2' + + '@tanstack/vue-virtual@3.13.12': + resolution: {integrity: sha512-vhF7kEU9EXWXh+HdAwKJ2m3xaOnTTmgcdXcF2pim8g4GvI7eRrk2YRuV5nUlZnd/NbCIX4/Ja2OZu5EjJL06Ww==} + peerDependencies: + vue: ^2.7.0 || ^3.0.0 + '@tootallnate/quickjs-emscripten@0.23.0': resolution: {integrity: sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==} @@ -1753,6 +2031,12 @@ packages: '@types/unist@3.0.3': resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==} + '@types/web-bluetooth@0.0.20': + resolution: {integrity: sha512-g9gZnnXVq7gM7v3tJCWV/qw7w+KeOlSHAhgF9RytFyifW6AF61hdT2ucrYhPq9hLs5JIryeupHV3qGk95dH9ow==} + + '@types/web-bluetooth@0.0.21': + resolution: {integrity: sha512-oIQLCGWtcFZy2JW77j9k8nHzAOpqMHLQejDA48XXMWH6tjCQHz5RCFz1bzsmROyL6PUm+LLnUiI4BCn221inxA==} + '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} @@ -2026,20 +2310,20 @@ packages: '@volar/language-core@2.4.12': resolution: {integrity: sha512-RLrFdXEaQBWfSnYGVxvR2WrO6Bub0unkdHYIdC31HzIEqATIuuhRRzYu76iGPZ6OtA4Au1SnW0ZwIqPP217YhA==} - '@volar/language-core@2.4.16': - resolution: {integrity: sha512-mcoAFkYVQV4iiLYjTlbolbsm9hhDLtz4D4wTG+rwzSCUbEnxEec+KBlneLMlfdVNjkVEh8lUUSsCGNEQR+hFdA==} + '@volar/language-core@2.4.17': + resolution: {integrity: sha512-chmRZMbKmcGpKMoO7Reb70uiLrzo0KWC2CkFttKUuKvrE+VYgi+fL9vWMJ07Fv5ulX0V1TAyyacN9q3nc5/ecA==} '@volar/source-map@2.4.12': resolution: {integrity: sha512-bUFIKvn2U0AWojOaqf63ER0N/iHIBYZPpNGogfLPQ68F5Eet6FnLlyho7BS0y2HJ1jFhSif7AcuTx1TqsCzRzw==} - '@volar/source-map@2.4.16': - resolution: {integrity: sha512-4rBiAhOw4MfFTpkvweDnjbDkixpmWNgBws95rpu2oFdMprkTtqFEb8pUOxQ/ruru8/zXSYLwRNXNozznjW9Vtw==} + '@volar/source-map@2.4.17': + resolution: {integrity: sha512-QDybtQyO3Ms/NjFqNHTC5tbDN2oK5VH7ZaKrcubtfHBDj63n2pizHC3wlMQ+iT55kQXZUUAbmBX5L1C8CHFeBw==} '@volar/typescript@2.4.12': resolution: {integrity: sha512-HJB73OTJDgPc80K30wxi3if4fSsZZAOScbj2fcicMuOPoOkcf9NNAINb33o+DzhBdF9xTKC1gnPmIRDous5S0g==} - '@volar/typescript@2.4.16': - resolution: {integrity: sha512-CrRuG20euPerYc4H0kvDWSSLTBo6qgSI1/0BjXL9ogjm5j6l0gIffvNzEvfmVjr8TAuoMPD0NxuEkteIapfZQQ==} + '@volar/typescript@2.4.17': + resolution: {integrity: sha512-3paEFNh4P5DkgNUB2YkTRrfUekN4brAXxd3Ow1syMqdIPtCZHbUy4AW99S5RO/7mzyTWPMdDSo3mqTpB/LPObQ==} '@vue-macros/common@3.0.0-beta.15': resolution: {integrity: sha512-DMgq/rIh1H20WYNWU7krIbEfJRYDDhy7ix64GlT4AVUJZZWCZ5pxiYVJR3A3GmWQPkn7Pg7i3oIiGqu4JGC65w==} @@ -2115,8 +2399,8 @@ packages: typescript: optional: true - '@vue/language-core@3.0.0': - resolution: {integrity: sha512-V+bSGOIuE59SAVNwzpoyk3VoytmqKPd3RBaHb0ROmK5SNOe9+774t4zmWxzztZGAg3FOGQnb1ZhXECyXLPzWZA==} + '@vue/language-core@3.0.1': + resolution: {integrity: sha512-sq+/Mc1IqIexWEQ+Q2XPiDb5SxSvY5JPqHnMOl/PlF5BekslzduX8dglSkpC17VeiAQB6dpS+4aiwNLJRduCNw==} peerDependencies: typescript: '*' peerDependenciesMeta: @@ -2143,6 +2427,79 @@ packages: '@vue/shared@3.5.17': resolution: {integrity: sha512-CabR+UN630VnsJO/jHWYBC1YVXyMq94KKp6iF5MQgZJs5I8cmjw6oVMO1oDbtBkENSHSSn/UadWlW/OAgdmKrg==} + '@vueuse/core@10.11.1': + resolution: {integrity: sha512-guoy26JQktXPcz+0n3GukWIy/JDNKti9v6VEMu6kV2sYBsWuGiTU8OWdg+ADfUbHg3/3DlqySDe7JmdHrktiww==} + + '@vueuse/core@12.8.2': + resolution: {integrity: sha512-HbvCmZdzAu3VGi/pWYm5Ut+Kd9mn1ZHnn4L5G8kOQTPs/IwIAmJoBrmYk2ckLArgMXZj0AW3n5CAejLUO+PhdQ==} + + '@vueuse/core@13.5.0': + resolution: {integrity: sha512-wV7z0eUpifKmvmN78UBZX8T7lMW53Nrk6JP5+6hbzrB9+cJ3jr//hUlhl9TZO/03bUkMK6gGkQpqOPWoabr72g==} + peerDependencies: + vue: ^3.5.0 + + '@vueuse/integrations@13.5.0': + resolution: {integrity: sha512-7RACJySnlpl0MkSzxbtadioNGSX4TL5/Wl2cUy4nDq/XkeHwPYvVM880HJUSiap/FXhVEup9VKTM9y/n5UspAw==} + peerDependencies: + async-validator: ^4 + axios: ^1 + change-case: ^5 + drauu: ^0.4 + focus-trap: ^7 + fuse.js: ^7 + idb-keyval: ^6 + jwt-decode: ^4 + nprogress: ^0.2 + qrcode: ^1.5 + sortablejs: ^1 + universal-cookie: ^7 || ^8 + vue: ^3.5.0 + peerDependenciesMeta: + async-validator: + optional: true + axios: + optional: true + change-case: + optional: true + drauu: + optional: true + focus-trap: + optional: true + fuse.js: + optional: true + idb-keyval: + optional: true + jwt-decode: + optional: true + nprogress: + optional: true + qrcode: + optional: true + sortablejs: + optional: true + universal-cookie: + optional: true + + '@vueuse/metadata@10.11.1': + resolution: {integrity: sha512-IGa5FXd003Ug1qAZmyE8wF3sJ81xGLSqTqtQ6jaVfkeZ4i5kS2mwQF61yhVqojRnenVew5PldLyRgvdl4YYuSw==} + + '@vueuse/metadata@12.8.2': + resolution: {integrity: sha512-rAyLGEuoBJ/Il5AmFHiziCPdQzRt88VxR+Y/A/QhJ1EWtWqPBBAxTAFaSkviwEuOEZNtW8pvkPgoCZQ+HxqW1A==} + + '@vueuse/metadata@13.5.0': + resolution: {integrity: sha512-euhItU3b0SqXxSy8u1XHxUCdQ8M++bsRs+TYhOLDU/OykS7KvJnyIFfep0XM5WjIFry9uAPlVSjmVHiqeshmkw==} + + '@vueuse/shared@10.11.1': + resolution: {integrity: sha512-LHpC8711VFZlDaYUXEBbFBCQ7GS3dVU9mjOhhMhXP6txTV4EhYQg/KGnQuvt/sPAtoUKq7VVUnL6mVtFoL42sA==} + + '@vueuse/shared@12.8.2': + resolution: {integrity: sha512-dznP38YzxZoNloI0qpEfpkms8knDtaoQ6Y/sfS0L7Yki4zh40LFHEhur0odJC6xTHG5dxWVPiUWBXn+wCG2s5w==} + + '@vueuse/shared@13.5.0': + resolution: {integrity: sha512-K7GrQIxJ/ANtucxIXbQlUHdB0TPA8c+q5i+zbrjxuhJCnJ9GtBg75sBSnvmLSxHKPg2Yo8w62PWksl9kwH0Q8g==} + peerDependencies: + vue: ^3.5.0 + '@webcontainer/env@1.1.1': resolution: {integrity: sha512-6aN99yL695Hi9SuIk1oC88l9o0gmxL1nGWWQ/kNy81HigJ0FoaoTXpytCj6ItzgyCEwA9kF1wixsTuv5cjsgng==} @@ -2250,6 +2607,10 @@ packages: argparse@2.0.1: resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + aria-hidden@1.2.6: + resolution: {integrity: sha512-ik3ZgC9dY/lYVVM++OISsaYDeg1tb0VtP5uL3ouh1koGOaUMDPpbFIei4JkFimWUFPn90sbMNMXQAIVOlnYKJA==} + engines: {node: '>=10'} + array-buffer-byte-length@1.0.2: resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==} engines: {node: '>= 0.4'} @@ -2347,6 +2708,10 @@ packages: better-sqlite3@11.9.1: resolution: {integrity: sha512-Ba0KR+Fzxh2jDRhdg6TSH0SJGzb8C0aBY4hR8w8madIdIzzC6Y1+kx5qR6eS1Z+Gy20h6ZU28aeyg0z1VIrShQ==} + binary-extensions@2.3.0: + resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} + engines: {node: '>=8'} + bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} @@ -2356,6 +2721,9 @@ packages: bl@4.1.0: resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + blob-to-buffer@1.2.9: + resolution: {integrity: sha512-BF033y5fN6OCofD3vgHmNtwZWRcq9NLyyxyILx9hfMy1sXYy4ojFl765hJ2lP0YaN2fuxPaLO2Vzzoxy0FLFFA==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2369,6 +2737,9 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} + brotli@1.3.3: + resolution: {integrity: sha512-oTKjJdShmDuGW94SyyaoQvAjf30dZaHnjJ8uAF+u2/vGJkJbJPJAT1gDiOJP5v1Zb6f9KEyW/1HpuaWIXtGHPg==} + browserslist@4.24.4: resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==} engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} @@ -2473,8 +2844,8 @@ packages: resolution: {integrity: sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==} engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} - changelogen@0.6.1: - resolution: {integrity: sha512-rTw2bZgiEHMgyYzWFMH+qTMFOSpCf4qwmd8LyxLDUKCtL4T/7O7978tPPtKYpjiFbPoHG64y4ugdF0Mt/l+lQg==} + changelogen@0.6.2: + resolution: {integrity: sha512-QtC7+r9BxoUm+XDAwhLbz3CgU134J1ytfE3iCpLpA4KFzX2P1e6s21RrWDwUBzfx66b1Rv+6lOA2nS2btprd+A==} hasBin: true char-regex@1.0.2: @@ -2500,6 +2871,10 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} + chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + chokidar@4.0.3: resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} @@ -2546,6 +2921,10 @@ packages: resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} engines: {node: '>=12'} + clone@2.1.2: + resolution: {integrity: sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==} + engines: {node: '>=0.8'} + cluster-key-slot@1.1.2: resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==} engines: {node: '>=0.10.0'} @@ -2575,6 +2954,9 @@ packages: colorspace@1.1.4: resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + colortranslator@5.0.0: + resolution: {integrity: sha512-Z3UPUKasUVDFCDYAjP2fmlVRf1jFHJv1izAmPjiOa0OCIw1W7iC8PZ2GsoDa8uZv+mKyWopxxStT9q05+27h7w==} + comma-separated-tokens@2.0.3: resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} @@ -2670,6 +3052,9 @@ packages: resolution: {integrity: sha512-p9nwwR4qyT5W996vBZhdvBCnMhicY5ytZkR4D1Xj0wuTDEiMnjwR57Q3RXYY/s0EpX6Ay3vgIcfaR+ewGHsi+g==} engines: {node: '>=18.0'} + cross-fetch@3.2.0: + resolution: {integrity: sha512-Q+xVJLoGOeIMXZmbUK4HYk+69cQH6LudR0Vu/pRm2YlU/hDV9CiS0gKUMaWY5f2NeUH9C1nV3bsTlCo0FsTV1Q==} + cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2697,6 +3082,10 @@ packages: resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-tree@3.1.0: + resolution: {integrity: sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + css-what@6.1.0: resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} engines: {node: '>= 6'} @@ -2962,6 +3351,9 @@ packages: devlop@1.1.0: resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dfa@1.2.0: + resolution: {integrity: sha512-ED3jP8saaweFTjeGX8HQPjeC1YYyZs98jGNZx6IiBvxW7JG5v492kamAQB3m2wop07CvU/RQmzcKr6bgcC5D/Q==} + diff@8.0.2: resolution: {integrity: sha512-sSuxWU5j5SR9QQji/o2qMvqRNYRDOcBTgsJ/DeCf4iSN4gW+gNMXM7wFIP+fdXZxoNiAnHUTGjCr+TSWXdRDKg==} engines: {node: '>=0.3.1'} @@ -3018,6 +3410,50 @@ packages: electron-to-chromium@1.5.178: resolution: {integrity: sha512-wObbz/ar3Bc6e4X5vf0iO8xTN8YAjN/tgiAOJLr7yjYFtP9wAjq8Mb5h0yn6kResir+VYx2DXBj9NNobs0ETSA==} + embla-carousel-auto-height@8.6.0: + resolution: {integrity: sha512-/HrJQOEM6aol/oF33gd2QlINcXy3e19fJWvHDuHWp2bpyTa+2dm9tVVJak30m2Qy6QyQ6Fc8DkImtv7pxWOJUQ==} + peerDependencies: + embla-carousel: 8.6.0 + + embla-carousel-auto-scroll@8.6.0: + resolution: {integrity: sha512-WT9fWhNXFpbQ6kP+aS07oF5IHYLZ1Dx4DkwgCY8Hv2ZyYd2KMCPfMV1q/cA3wFGuLO7GMgKiySLX90/pQkcOdQ==} + peerDependencies: + embla-carousel: 8.6.0 + + embla-carousel-autoplay@8.6.0: + resolution: {integrity: sha512-OBu5G3nwaSXkZCo1A6LTaFMZ8EpkYbwIaH+bPqdBnDGQ2fh4+NbzjXjs2SktoPNKCtflfVMc75njaDHOYXcrsA==} + peerDependencies: + embla-carousel: 8.6.0 + + embla-carousel-class-names@8.6.0: + resolution: {integrity: sha512-l1hm1+7GxQ+zwdU2sea/LhD946on7XO2qk3Xq2XWSwBaWfdgchXdK567yzLtYSHn4sWYdiX+x4nnaj+saKnJkw==} + peerDependencies: + embla-carousel: 8.6.0 + + embla-carousel-fade@8.6.0: + resolution: {integrity: sha512-qaYsx5mwCz72ZrjlsXgs1nKejSrW+UhkbOMwLgfRT7w2LtdEB03nPRI06GHuHv5ac2USvbEiX2/nAHctcDwvpg==} + peerDependencies: + embla-carousel: 8.6.0 + + embla-carousel-reactive-utils@8.6.0: + resolution: {integrity: sha512-fMVUDUEx0/uIEDM0Mz3dHznDhfX+znCCDCeIophYb1QGVM7YThSWX+wz11zlYwWFOr74b4QLGg0hrGPJeG2s4A==} + peerDependencies: + embla-carousel: 8.6.0 + + embla-carousel-vue@8.6.0: + resolution: {integrity: sha512-v8UO5UsyLocZnu/LbfQA7Dn2QHuZKurJY93VUmZYP//QRWoCWOsionmvLLAlibkET3pGPs7++03VhJKbWD7vhQ==} + peerDependencies: + vue: ^3.2.37 + + embla-carousel-wheel-gestures@8.0.2: + resolution: {integrity: sha512-gtE8xHRwMGsfsMAgco/QoYhvcxNoMLmFF0DaWH7FXJJWk8RlEZyiZHZRZL6TZVCgooo9/hKyYWITLaSZLIvkbQ==} + engines: {node: '>=10'} + peerDependencies: + embla-carousel: ^8.0.0 || ~8.0.0-rc03 + + embla-carousel@8.6.0: + resolution: {integrity: sha512-SjWyZBHJPbqxHOzckOfo8lHisEaJWmwd23XppYFYVh10bU66/Pn5tkVkbkCMZVdbUE5eTCI2nD8OyIP4Z+uwkA==} + emoji-regex@10.4.0: resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==} @@ -3237,8 +3673,8 @@ packages: '@typescript-eslint/parser': optional: true - eslint-plugin-jsdoc@51.3.2: - resolution: {integrity: sha512-sBmS2MoxbUuKE1wMn/jeHitlCwdk3jAkkpdo3TNA5qGADjiow9D5z/zJ3XScScDsNI2fzZJsmCyf5rc12oRbUA==} + eslint-plugin-jsdoc@51.3.4: + resolution: {integrity: sha512-maz6qa95+sAjMr9m5oRyfejc+mnyQWsWSe9oyv9371bh4/T0kWOMryJNO4h8rEd97wo/9lbzwi3OOX4rDhnAzg==} engines: {node: '>=20.11.0'} peerDependencies: eslint: ^7.0.0 || ^8.0.0 || ^9.0.0 @@ -3279,12 +3715,16 @@ packages: peerDependencies: eslint: '>=9.22.0' - eslint-plugin-vue@10.2.0: - resolution: {integrity: sha512-tl9s+KN3z0hN2b8fV2xSs5ytGl7Esk1oSCxULLwFcdaElhZ8btYYZFrWxvh4En+czrSDtuLCeCOGa8HhEZuBdQ==} + eslint-plugin-vue@10.3.0: + resolution: {integrity: sha512-A0u9snqjCfYaPnqqOaH6MBLVWDUIN4trXn8J3x67uDcXvR7X6Ut8p16N+nYhMCQ9Y7edg2BIRGzfyZsY0IdqoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: + '@typescript-eslint/parser': ^7.0.0 || ^8.0.0 eslint: ^8.57.0 || ^9.0.0 vue-eslint-parser: ^10.0.0 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true eslint-plugin-vue@9.33.0: resolution: {integrity: sha512-174lJKuNsuDIlLpjeXc5E2Tss8P44uIimAfGD0b90k0NoirJqpG7stLuU9Vp/9ioTOrQdWVREc4mRd1BD+CvGw==} @@ -3302,10 +3742,6 @@ packages: resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-scope@8.3.0: - resolution: {integrity: sha512-pUNxi75F8MJ/GdeKtVLSbYg4ZI34J6C0C7sbL4YOp2exGwen7ZsuBqKzUhXd0qMQ362yET3z+uPwKeg/0C2XCQ==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3350,10 +3786,6 @@ packages: jiti: optional: true - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@10.4.0: resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -3534,6 +3966,12 @@ packages: fn.name@1.1.0: resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + fontaine@0.6.0: + resolution: {integrity: sha512-cfKqzB62GmztJhwJ0YXtzNsmpqKAcFzTqsakJ//5COTzbou90LU7So18U+4D8z+lDXr4uztaAUZBonSoPDcj1w==} + + fontkit@2.0.4: + resolution: {integrity: sha512-syetQadaUEDNdxdugga9CpEYVaQIxOwk7GlwZWWZ19//qW4zE5bknOKeMBDYAASwnpaSHKJITRLMF9m1fp3s6g==} + for-each@0.3.5: resolution: {integrity: sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==} engines: {node: '>= 0.4'} @@ -3549,6 +3987,20 @@ packages: fraction.js@4.3.7: resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + framer-motion@12.22.0: + resolution: {integrity: sha512-qG07rR8/mboCNU34nORbrIbBXbJzP4aDqBdr67TAIVlMryDEOwh7LXjylWovlnPCMg78ExoY0Gn2F1fV+3DNIw==} + 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'} @@ -3665,6 +4117,10 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + globals@16.3.0: resolution: {integrity: sha512-bqWEnJ1Nt3neqx2q5SFfGS8r/ahumIakg3HcwtNlrVlwXIeNumWn/c7Pn/wKzGhf6SaW6H6uWXLqC30STCMchQ==} engines: {node: '>=18'} @@ -3791,6 +4247,9 @@ packages: resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} hasBin: true + hey-listen@1.0.8: + resolution: {integrity: sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q==} + hookable@5.5.3: resolution: {integrity: sha512-Yc+BQe8SvoXH1643Qez1zqLRmbA5rCL+sSmk6TVos0LWVfNIB7PGncdlId77WzLGSIB5KaWgTaNTs2lNVEI6VQ==} @@ -3937,6 +4396,10 @@ packages: resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==} engines: {node: '>= 0.4'} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-boolean-object@1.2.2: resolution: {integrity: sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==} engines: {node: '>= 0.4'} @@ -4195,9 +4658,16 @@ packages: engines: {node: '>=16.0.0'} hasBin: true + json-schema-to-zod@2.6.1: + resolution: {integrity: sha512-uiHmWH21h9FjKJkRBntfVGTLpYlCZ1n98D0izIlByqQLqpmkQpNTBtfbdP04Na6+43lgsvrShFh2uWLkQDKJuQ==} + hasBin: true + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema@0.4.0: + resolution: {integrity: sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -4236,6 +4706,9 @@ packages: knitwork@1.2.0: resolution: {integrity: sha512-xYSH7AvuQ6nXkq42x0v5S8/Iry+cfulBz/DJQzhIyESdLD7425jXsPy4vn5cCXU+HhRN2kVw51Vd1K6/By4BQg==} + kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} @@ -4255,26 +4728,90 @@ packages: resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} engines: {node: '>= 0.8.0'} - lilconfig@3.1.3: - resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} - engines: {node: '>=14'} - - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + lightningcss-darwin-arm64@1.30.1: + resolution: {integrity: sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] - listhen@1.9.0: - resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} - hasBin: true + lightningcss-darwin-x64@1.30.1: + resolution: {integrity: sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] - local-pkg@0.4.3: - resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} - engines: {node: '>=14'} + lightningcss-freebsd-x64@1.30.1: + resolution: {integrity: sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] - local-pkg@1.1.1: - resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} - engines: {node: '>=14'} + lightningcss-linux-arm-gnueabihf@1.30.1: + resolution: {integrity: sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] - locate-path@5.0.0: + lightningcss-linux-arm64-gnu@1.30.1: + resolution: {integrity: sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-arm64-musl@1.30.1: + resolution: {integrity: sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + + lightningcss-linux-x64-gnu@1.30.1: + resolution: {integrity: sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-linux-x64-musl@1.30.1: + resolution: {integrity: sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + + lightningcss-win32-arm64-msvc@1.30.1: + resolution: {integrity: sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [win32] + + lightningcss-win32-x64-msvc@1.30.1: + resolution: {integrity: sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + + lightningcss@1.30.1: + resolution: {integrity: sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==} + engines: {node: '>= 12.0.0'} + + lilconfig@3.1.3: + resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==} + engines: {node: '>=14'} + + lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + listhen@1.9.0: + resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} + hasBin: true + + local-pkg@0.4.3: + resolution: {integrity: sha512-SFppqq5p42fe2qcZQqqEOiVRXl+WCP1MdT6k7BDEW1j++sp5fIY+/fdRQitvKgB5BrBcmrs5m/L0v2FrU5MY1g==} + engines: {node: '>=14'} + + local-pkg@1.1.1: + resolution: {integrity: sha512-WunYko2W1NcdfAFpuLUoucsgULmgDBRkdxHxWQ7mK0cQqwPiy8E1enjuRBrhLtZkB5iScJ1XIPdhVEFK8aOLSg==} + engines: {node: '>=14'} + + locate-path@5.0.0: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} @@ -4364,6 +4901,9 @@ packages: resolution: {integrity: sha512-tPJQ1HeyiU2vRruNGhZ+VleWuMQRro8iFtJxYgnS4NQe+EukKF6aGiIT+7flZhISAt2iaXBCfFGvAyif7/f8nQ==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + magic-regexp@0.10.0: + resolution: {integrity: sha512-Uly1Bu4lO1hwHUW0CQeSWuRtzCMNO00CmXtS8N6fyvB3B979GOEEeAkiTUDsmbYLAbvpUS/Kt5c4ibosAzVyVg==} + magic-regexp@0.8.0: resolution: {integrity: sha512-lOSLWdE156csDYwCTIGiAymOLN7Epu/TU5e/oAnISZfU6qP+pgjkE+xbVjVn3yLPKN8n1G2yIAYTAM5KRk6/ow==} @@ -4426,6 +4966,9 @@ packages: mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + mdn-data@2.12.2: + resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} + merge-options@3.0.4: resolution: {integrity: sha512-2Sug1+knBjkaMsMgf1ctR1Ujx+Ayku4EdJN4Z+C2+JzoeF7A3OZ9KM2GY0CpQS51NR61LTurMJrRKPhSs3ZRTQ==} engines: {node: '>=10'} @@ -4569,6 +5112,10 @@ packages: resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} engines: {node: 20 || >=22} + minimatch@10.0.3: + resolution: {integrity: sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -4638,6 +5185,20 @@ packages: engines: {node: '>=18'} hasBin: true + monaco-editor@0.52.2: + resolution: {integrity: sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==} + + motion-dom@12.22.0: + resolution: {integrity: sha512-ooH7+/BPw9gOsL9VtPhEJHE2m4ltnhMlcGMhEqA0YGNhKof7jdaszvsyThXI6LVIKshJUZ9/CP6HNqQhJfV7kw==} + + motion-utils@12.19.0: + resolution: {integrity: sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==} + + motion-v@1.4.0: + resolution: {integrity: sha512-/kLBC6fJgsaL/M7/SRLVMEXU1f1ATEfLymzXFL3iT4zzCZfallVQxIuMgveb+WuBOdQfoxWZANBuK79uBQ+56g==} + peerDependencies: + vue: '>=3.0.0' + mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -4798,6 +5359,10 @@ packages: resolution: {integrity: sha512-tF+BUToseiljrQXEg/zbqDZvr/2RyEGKzj2PzVF0pR9iHTQPEkQ+8Yt91Qo3mU3crttxTP39GJEgN5npeFZ+1w==} hasBin: true + nuxt-component-meta@0.12.1: + resolution: {integrity: sha512-w0ZgRCE9wGZLbmAnCUV2F4/Gjwy1J6L9FejrpTHSHM8Igrf2THwe809QOXbdV8g4+Elkz2MeC/34ZFyt05tKCg==} + hasBin: true + nuxt@3.17.6: resolution: {integrity: sha512-kOsoJk7YvlcUChJXhCrVP18zRWKquUdrZSoJX8bCcQ54OhFOr4s2VhsxnbJVP7AtCiBSLbKuQt6ZBO7lE159Aw==} engines: {node: ^20.9.0 || >=22.0.0} @@ -4874,10 +5439,6 @@ packages: oniguruma-to-es@4.3.3: resolution: {integrity: sha512-rPiZhzC3wXwE59YQMRDodUwwT9FZ9nNBwQQfsd1wfdtlKEyCdRV0avrTcSZ5xlIvGRVPd/cx6ZN45ECmS39xvg==} - open@10.1.1: - resolution: {integrity: sha512-zy1wx4+P3PfhXSEPJNtZmJXfhkkIaxU1VauWIrDZw1O7uJRDRJtKr9n3Ic4NgbA16KyOxOXO2ng9gYwCdXuSXA==} - engines: {node: '>=18'} - open@10.1.2: resolution: {integrity: sha512-cxN6aIDPz6rm8hbebcP7vrQNhvRcveZoJU72Y7vskh4oIm+BZwBECnx5nTmrlres1Qapvx27Qo1Auukpf8PKXw==} engines: {node: '>=18'} @@ -4971,6 +5532,9 @@ packages: package-manager-detector@1.3.0: resolution: {integrity: sha512-ZsEbbZORsyHuO00lY1kV3/t72yp6Ysay6Pd17ZAlNGuGwmWDLCJxFpRs0IzfXfj1o4icJOkUEioexFHzyPurSQ==} + pako@0.2.9: + resolution: {integrity: sha512-NUcwaKxUxWrZLpDG+z/xZaCgQITkA/Dv4V/T6bw7VON6l1Xz/VnrBqrYjZQ12TamKHzITTfOEIYUj48y2KXImA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -5554,6 +6118,10 @@ packages: readdir-glob@1.1.3: resolution: {integrity: sha512-v05I2k7xN8zXvPD9N+z/uhXPaj0sUFCe2rcWZIpBsqxfP7xXFQ0tipAd/wjj1YxWyWtUS5IDJpOG82JKt2EAVA==} + readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + readdirp@4.1.2: resolution: {integrity: sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==} engines: {node: '>= 14.18.0'} @@ -5624,6 +6192,11 @@ packages: rehype-sort-attributes@5.0.1: resolution: {integrity: sha512-Bxo+AKUIELcnnAZwJDt5zUDDRpt4uzhfz9d0PVGhcxYWsbFj5Cv35xuWxu5r1LeYNFNhgGqsr9Q2QiIOM/Qctg==} + reka-ui@2.3.1: + resolution: {integrity: sha512-2SjGeybd7jvD8EQUkzjgg7GdOQdf4cTwdVMq/lDNTMqneUFNnryGO43dg8WaM/jaG9QpSCZBvstfBFWlDdb2Zg==} + peerDependencies: + vue: '>= 3.2.0' + release-it@19.0.3: resolution: {integrity: sha512-lEXp7w9BZZ4r51toFtE3KnR67doEsyRSUzSONW1mMvinMNjBjKKySEBQxPcSQK9nKV1cpwHI0ONhr66M/gSYIw==} engines: {node: ^20.12.0 || >=22.0.0} @@ -5682,6 +6255,9 @@ packages: resolution: {integrity: sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA==} engines: {node: '>=18'} + restructure@3.0.2: + resolution: {integrity: sha512-gSfoiOEA0VPE6Tukkrr7I0RBdE0s7H1eFCDBk05l1KIQT1UIKNc5JZy6jdyW6eYH3aR3g5b3PuL77rq0hvwtAw==} + retry@0.13.1: resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} engines: {node: '>= 4'} @@ -5772,6 +6348,9 @@ packages: scule@1.3.0: resolution: {integrity: sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==} + secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + semver@5.7.2: resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} hasBin: true @@ -6085,10 +6664,27 @@ packages: engines: {node: '>=14.0.0'} hasBin: true + swrv@1.1.0: + resolution: {integrity: sha512-pjllRDr2s0iTwiE5Isvip51dZGR7GjLH1gCSVyE8bQnbAx6xackXsFdojau+1O5u98yHF5V73HQGOFxKUXO9gQ==} + peerDependencies: + vue: '>=3.2.26 < 4' + system-architecture@0.1.0: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} + tailwind-merge@3.0.2: + resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==} + + tailwind-variants@1.0.0: + resolution: {integrity: sha512-2WSbv4ulEEyuBKomOunut65D8UZwxrHoRfYnxGcQNnHqlSCp2+B7Yz2W+yrNDrxRodOXtGD/1oCcKGNBnUqMqA==} + engines: {node: '>=16.x', pnpm: '>=7.x'} + peerDependencies: + tailwindcss: '*' + + tailwindcss@4.1.11: + resolution: {integrity: sha512-2E9TBm6MDD/xKYe+dvJZAmg3yxIEDNRc0jwlNyDg/4Fil2QcSLjFKGVff0lAf1jjeaArlG/M75Ey/EYr/OJtBA==} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -6118,6 +6714,9 @@ packages: text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + tiny-inflate@1.0.3: + resolution: {integrity: sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==} + tiny-invariant@1.3.3: resolution: {integrity: sha512-+FbBPE1o9QAYvviau/qC5SE3caw21q3xkvWKBtja5vgqOWIHHJ3ioaq1VPfn/Szqctz2bU/oYeKd9/z5BL+PVg==} @@ -6130,10 +6729,6 @@ packages: tinyexec@1.0.1: resolution: {integrity: sha512-5uC6DDlmeqiOwCPmK9jMSdOuZTh8bU39Ys6yidB+UTt5hfZUPGAypSgFRiEp+jbi9qH40BLDvy85jIU88wKSqw==} - tinyglobby@0.2.12: - resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} - engines: {node: '>=12.0.0'} - tinyglobby@0.2.13: resolution: {integrity: sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==} engines: {node: '>=12.0.0'} @@ -6321,6 +6916,12 @@ packages: resolution: {integrity: sha512-yLSH4py7oFH3oG/9K+XWrz1pSi3dfUrWEnInbxMfArOfc1+33BlGPQtLsOYwvdMy11AwUBetYuaRxSPqgkq+8g==} engines: {node: '>=4'} + unicode-properties@1.4.1: + resolution: {integrity: sha512-CLjCCLQ6UuMxWnbIylkisbRj31qxHPAurvena/0iwSVbQ2G1VY5/HjV0IRabOEbDHlzZlRdCrD4NhB0JtU40Pg==} + + unicode-trie@2.0.0: + resolution: {integrity: sha512-x7bc76x0bm4prf1VLg79uhAzKw8DVboClSN5VxJuQ+LKDOVEW9CdH+VY7SP+vX7xCYQqzzgQpFqz15zeLvAtZQ==} + unicorn-magic@0.1.0: resolution: {integrity: sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==} engines: {node: '>=18'} @@ -6332,6 +6933,9 @@ packages: unified@11.0.5: resolution: {integrity: sha512-xKvGhPWw3k84Qjh8bI3ZeJjqnyadK+GEFtazSfZv/rKeTkTjOJho6mFqh2SM96iIcZokxiOpg78GazTSg8+KHA==} + unifont@0.4.1: + resolution: {integrity: sha512-zKSY9qO8svWYns+FGKjyVdLvpGPwqmsCjeJLN1xndMiqxHWBAhoWDMYMG960MxeV48clBmG+fDP59dHY1VoZvg==} + unimport@4.2.0: resolution: {integrity: sha512-mYVtA0nmzrysnYnyb3ALMbByJ+Maosee2+WyE0puXl+Xm2bUwPorPaaeZt0ETfuroPOtG8jj1g/qeFZ6buFnag==} engines: {node: '>=18.12.0'} @@ -6368,10 +6972,35 @@ packages: resolution: {integrity: sha512-6bc58dPYhCMHHuwxldQxO3RRNZ4eCogZ/st++0+fcC1nr0jiGUtAdBJ2qzmLQWSxbtz42pWt4QQMiZ9HvZf5cg==} engines: {node: '>=0.10.0'} + unplugin-auto-import@19.3.0: + resolution: {integrity: sha512-iIi0u4Gq2uGkAOGqlPJOAMI8vocvjh1clGTfSK4SOrJKrt+tirrixo/FjgBwXQNNdS7ofcr7OxzmOb/RjWxeEQ==} + engines: {node: '>=14'} + peerDependencies: + '@nuxt/kit': ^3.2.2 + '@vueuse/core': '*' + peerDependenciesMeta: + '@nuxt/kit': + optional: true + '@vueuse/core': + optional: true + unplugin-utils@0.2.4: resolution: {integrity: sha512-8U/MtpkPkkk3Atewj1+RcKIjb5WBimZ/WSLhhR3w6SsIj8XJuKTacSP8g+2JhfSGw0Cb125Y+2zA/IzJZDVbhA==} engines: {node: '>=18.12.0'} + unplugin-vue-components@28.8.0: + resolution: {integrity: sha512-2Q6ZongpoQzuXDK0ZsVzMoshH0MWZQ1pzVL538G7oIDKRTVzHjppBDS8aB99SADGHN3lpGU7frraCG6yWNoL5Q==} + engines: {node: '>=14'} + peerDependencies: + '@babel/parser': ^7.15.8 + '@nuxt/kit': ^3.2.2 || ^4.0.0 + vue: 2 || 3 + peerDependenciesMeta: + '@babel/parser': + optional: true + '@nuxt/kit': + optional: true + unplugin-vue-router@0.14.0: resolution: {integrity: sha512-ipjunvS5e2aFHBAUFuLbHl2aHKbXXXBhTxGT9wZx66fNVPdEQzVVitF8nODr1plANhTTa3UZ+DQu9uyLngMzoQ==} peerDependencies: @@ -6498,6 +7127,12 @@ packages: validate-npm-package-license@3.0.4: resolution: {integrity: sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==} + vaul-vue@0.4.1: + resolution: {integrity: sha512-A6jOWOZX5yvyo1qMn7IveoWN91mJI5L3BUKsIwkg6qrTGgHs1Sb1JF/vyLJgnbN1rH4OOOxFbtqL9A46bOyGUQ==} + peerDependencies: + reka-ui: ^2.0.0 + vue: ^3.3.0 + vfile-location@5.0.3: resolution: {integrity: sha512-5yXvWDEgqeiYiBe1lbxYF7UMAIm/IcopxMHrMQDq3nvKcjPKIhZklUKL+AE7J7uApI4kwe2snsK+eI6UTj9EHg==} @@ -6702,8 +7337,8 @@ packages: typescript: optional: true - vue-component-meta@3.0.0: - resolution: {integrity: sha512-yvLHhCNSNPyaIaJsXPoqJ1aJEf9UMM93rCed652j18XwgMak0L2BXYoXnjhEoIBDInzQGH9/85sYF0SvN1dUMw==} + vue-component-meta@3.0.1: + resolution: {integrity: sha512-5hCl0L3K96WjJ5I9s19OKK0k+hD/miATs5Q2lP0+n0HAiUNnrV4mAdaQtkTSLDmoT+KefgCB6UglEYZuet3NdA==} peerDependencies: typescript: '*' vue-component-type-helpers: 3.0.0-alpha.10 @@ -6711,6 +7346,17 @@ packages: vue-component-type-helpers@2.2.10: resolution: {integrity: sha512-iDUO7uQK+Sab2tYuiP9D1oLujCWlhHELHMgV/cB13cuGbG4qwkLHvtfWb6FzvxrIOPDnU0oHsz2MlQjhYDeaHA==} + vue-demi@0.14.10: + resolution: {integrity: sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==} + engines: {node: '>=12'} + hasBin: true + peerDependencies: + '@vue/composition-api': ^1.0.0-rc.1 + vue: ^3.0.0-0 || ^2.6.0 + peerDependenciesMeta: + '@vue/composition-api': + optional: true + vue-devtools-stub@0.1.0: resolution: {integrity: sha512-RutnB7X8c5hjq39NceArgXg28WZtZpGc3+J16ljMiYnFhKvd8hITxSWQSQ5bvldxMDU6gG5mkxl1MTQLXckVSQ==} @@ -6763,6 +7409,10 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + wheel-gestures@2.2.48: + resolution: {integrity: sha512-f+Gy33Oa5Z14XY9679Zze+7VFhbsQfBFXodnU2x589l4kxGM9L5Y8zETTmcMR5pWOPQyRv4Z0lNax6xCO0NSlA==} + engines: {node: '>=18'} + which-boxed-primitive@1.1.1: resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==} engines: {node: '>= 0.4'} @@ -6924,22 +7574,58 @@ packages: resolution: {integrity: sha512-zK7YHHz4ZXpW89AHXUPbQVGKI7uvkd3hzusTdotCg1UxyaVtg0zFJSTfW/Dq5f7OBBVnq6cZIaC8Ti4hb6dtCA==} engines: {node: '>= 14'} - zod-to-json-schema@3.24.5: - resolution: {integrity: sha512-/AuWwMP+YqiPbsJx5D6TfgRTc4kTLjsh5SOcd4bLsfUg2RcEXrFMJl1DGgdHy2aCfsIA/cr/1JM0xcB2GZji8g==} + zod-to-json-schema@3.24.6: + resolution: {integrity: sha512-h/z3PKvcTcTetyjl1fkj79MHNEjm+HpD6NXheWjzOekY7kV+lwDYnHw+ivHkijnCSMz1yJaWBD9vu/Fcmk+vEg==} peerDependencies: zod: ^3.24.1 - zod@3.24.3: - resolution: {integrity: sha512-HhY1oqzWCQWuUqvBFnsyrtZRhyPeR7SUGv+C4+MsisMuVfSPx8HpwWqH8tRahSlt6M3PiFAcoeFhZAqIXTxoSg==} - zod@3.25.67: resolution: {integrity: sha512-idA2YXwpCdqUSKRCACDE6ItZD9TZzy3OZMtpfLoh6oPR47lipysRrJfjzMqFxQ3uJuUPyUeWe1r9vLH33xO/Qw==} + zod@3.25.76: + resolution: {integrity: sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==} + zwitch@2.0.4: resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} snapshots: + '@ai-sdk/provider-utils@2.2.8(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 1.1.3 + nanoid: 3.3.11 + secure-json-parse: 2.7.0 + zod: 3.25.67 + + '@ai-sdk/provider@1.1.3': + dependencies: + json-schema: 0.4.0 + + '@ai-sdk/ui-utils@1.2.11(zod@3.25.67)': + dependencies: + '@ai-sdk/provider': 1.1.3 + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.67) + zod: 3.25.67 + zod-to-json-schema: 3.24.6(zod@3.25.67) + + '@ai-sdk/vue@1.2.12(vue@3.5.17(typescript@5.8.3))(zod@3.25.67)': + dependencies: + '@ai-sdk/provider-utils': 2.2.8(zod@3.25.67) + '@ai-sdk/ui-utils': 1.2.11(zod@3.25.67) + swrv: 1.1.0(vue@3.5.17(typescript@5.8.3)) + optionalDependencies: + vue: 3.5.17(typescript@5.8.3) + transitivePeerDependencies: + - zod + + '@alloc/quick-lru@5.2.0': {} + + '@amoayun/monaco-editor-vue3@1.0.20(typescript@5.8.3)': + dependencies: + vue: 3.5.17(typescript@5.8.3) + transitivePeerDependencies: + - typescript + '@ampproject/remapping@2.3.0': dependencies: '@jridgewell/gen-mapping': 0.3.8 @@ -6950,6 +7636,8 @@ snapshots: package-manager-detector: 1.3.0 tinyexec: 1.0.1 + '@antfu/utils@8.1.1': {} + '@apidevtools/json-schema-ref-parser@11.9.3': dependencies: '@jsdevtools/ono': 7.1.3 @@ -6983,7 +7671,7 @@ snapshots: '@babel/traverse': 7.28.0 '@babel/types': 7.28.0 convert-source-map: 2.0.0 - debug: 4.4.0 + debug: 4.4.1 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -7150,7 +7838,7 @@ snapshots: '@babel/parser': 7.27.0 '@babel/template': 7.27.0 '@babel/types': 7.27.0 - debug: 4.4.0 + debug: 4.4.1 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -7163,7 +7851,7 @@ snapshots: '@babel/parser': 7.28.0 '@babel/template': 7.27.2 '@babel/types': 7.28.0 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -7182,6 +7870,16 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 + '@capsizecss/metrics@3.5.0': {} + + '@capsizecss/unpack@2.4.0': + dependencies: + blob-to-buffer: 1.2.9 + cross-fetch: 3.2.0 + fontkit: 2.0.4 + transitivePeerDependencies: + - encoding + '@clack/core@0.5.0': dependencies: picocolors: 1.1.1 @@ -7452,6 +8150,26 @@ snapshots: '@fastify/busboy@3.1.1': {} + '@floating-ui/core@1.7.2': + dependencies: + '@floating-ui/utils': 0.2.10 + + '@floating-ui/dom@1.7.2': + dependencies: + '@floating-ui/core': 1.7.2 + '@floating-ui/utils': 0.2.10 + + '@floating-ui/utils@0.2.10': {} + + '@floating-ui/vue@1.1.7(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@floating-ui/dom': 1.7.2 + '@floating-ui/utils': 0.2.10 + vue-demi: 0.14.10(vue@3.5.17(typescript@5.8.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + '@humanfs/core@0.19.1': {} '@humanfs/node@0.16.6': @@ -7465,8 +8183,25 @@ snapshots: '@humanwhocodes/retry@0.4.2': {} + '@iconify/collections@1.0.565': + dependencies: + '@iconify/types': 2.0.0 + '@iconify/types@2.0.0': {} + '@iconify/utils@2.3.0': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 8.1.1 + '@iconify/types': 2.0.0 + debug: 4.4.1 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.1 + mlly: 1.7.4 + transitivePeerDependencies: + - supports-color + '@iconify/vue@5.0.0(vue@3.5.17(typescript@5.8.3))': dependencies: '@iconify/types': 2.0.0 @@ -7588,8 +8323,22 @@ snapshots: optionalDependencies: '@types/node': 22.14.1 + '@internationalized/date@3.8.2': + dependencies: + '@swc/helpers': 0.5.17 + + '@internationalized/number@3.6.3': + dependencies: + '@swc/helpers': 0.5.17 + '@ioredis/commands@1.2.0': {} + '@isaacs/balanced-match@4.0.1': {} + + '@isaacs/brace-expansion@5.0.0': + dependencies: + '@isaacs/balanced-match': 4.0.1 + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -7639,7 +8388,7 @@ snapshots: '@kwsites/file-exists@1.1.1': dependencies: - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -7757,7 +8506,7 @@ snapshots: unixify: 1.0.0 urlpattern-polyfill: 8.0.2 yargs: 17.7.2 - zod: 3.24.3 + zod: 3.25.67 transitivePeerDependencies: - encoding - rollup @@ -7856,7 +8605,7 @@ snapshots: unist-util-visit: 5.0.0 ws: 8.18.3 zod: 3.25.67 - zod-to-json-schema: 3.24.5(zod@3.25.67) + zod-to-json-schema: 3.24.6(zod@3.25.67) optionalDependencies: better-sqlite3: 11.9.1 transitivePeerDependencies: @@ -7867,21 +8616,79 @@ snapshots: - supports-color - utf-8-validate + '@nuxt/content@3.6.3(better-sqlite3@11.9.1)(magicast@0.3.5)(vue-component-type-helpers@2.2.10)': + dependencies: + '@nuxt/kit': 3.17.6(magicast@0.3.5) + '@nuxtjs/mdc': 0.17.0(magicast@0.3.5) + '@shikijs/langs': 3.7.0 + '@sqlite.org/sqlite-wasm': 3.50.1-build1 + '@webcontainer/env': 1.1.1 + c12: 3.0.4(magicast@0.3.5) + chokidar: 4.0.3 + consola: 3.4.2 + db0: 0.3.2(better-sqlite3@11.9.1) + defu: 6.1.4 + destr: 2.0.5 + git-url-parse: 16.1.0 + jiti: 2.4.2 + json-schema-to-typescript: 15.0.4 + knitwork: 1.2.0 + listhen: 1.9.0 + mdast-util-to-hast: 13.2.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.2 + micromark-util-character: 2.1.1 + micromark-util-chunked: 2.0.1 + micromark-util-resolve-all: 2.0.1 + micromark-util-sanitize-uri: 2.0.1 + micromatch: 4.0.8 + minimark: 0.2.0 + minimatch: 10.0.3 + nuxt-component-meta: 0.12.1(magicast@0.3.5)(vue-component-type-helpers@2.2.10) + nypm: 0.6.0 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.2.0 + remark-mdc: 3.6.0 + scule: 1.3.0 + shiki: 3.7.0 + slugify: 1.6.6 + socket.io-client: 4.8.1 + tar: 7.4.3 + tinyglobby: 0.2.14 + ufo: 1.6.1 + unified: 11.0.5 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + ws: 8.18.3 + zod: 3.25.76 + zod-to-json-schema: 3.24.6(zod@3.25.76) + optionalDependencies: + better-sqlite3: 11.9.1 + transitivePeerDependencies: + - bufferutil + - drizzle-orm + - magicast + - mysql2 + - supports-color + - utf-8-validate + - vue-component-type-helpers + '@nuxt/devalue@2.0.2': {} - '@nuxt/devtools-kit@2.6.2(magicast@0.3.5)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))': + '@nuxt/devtools-kit@2.6.2(magicast@0.3.5)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))': dependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) execa: 8.0.1 - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) transitivePeerDependencies: - magicast - '@nuxt/devtools-kit@2.6.2(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))': + '@nuxt/devtools-kit@2.6.2(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))': dependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) execa: 8.0.1 - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) transitivePeerDependencies: - magicast @@ -7896,12 +8703,12 @@ snapshots: prompts: 2.4.2 semver: 7.7.2 - '@nuxt/devtools@2.6.2(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': + '@nuxt/devtools@2.6.2(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': dependencies: - '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) '@nuxt/devtools-wizard': 2.6.2 '@nuxt/kit': 3.17.6(magicast@0.3.5) - '@vue/devtools-core': 7.7.7(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + '@vue/devtools-core': 7.7.7(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) '@vue/devtools-kit': 7.7.7 birpc: 2.4.0 consola: 3.4.2 @@ -7926,9 +8733,9 @@ snapshots: sirv: 3.0.1 structured-clone-es: 1.0.0 tinyglobby: 0.2.14 - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-plugin-inspect: 11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) - vite-plugin-vue-tracer: 1.0.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-plugin-inspect: 11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) + vite-plugin-vue-tracer: 1.0.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) which: 5.0.0 ws: 8.18.3 transitivePeerDependencies: @@ -7937,12 +8744,12 @@ snapshots: - utf-8-validate - vue - '@nuxt/devtools@2.6.2(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': + '@nuxt/devtools@2.6.2(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': dependencies: - '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) '@nuxt/devtools-wizard': 2.6.2 '@nuxt/kit': 3.17.6(magicast@0.3.5) - '@vue/devtools-core': 7.7.7(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + '@vue/devtools-core': 7.7.7(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) '@vue/devtools-kit': 7.7.7 birpc: 2.4.0 consola: 3.4.2 @@ -7967,9 +8774,9 @@ snapshots: sirv: 3.0.1 structured-clone-es: 1.0.0 tinyglobby: 0.2.14 - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-plugin-inspect: 11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) - vite-plugin-vue-tracer: 1.0.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-plugin-inspect: 11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) + vite-plugin-vue-tracer: 1.0.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) which: 5.0.0 ws: 8.18.3 transitivePeerDependencies: @@ -7978,12 +8785,12 @@ snapshots: - utf-8-validate - vue - '@nuxt/eslint-config@1.5.0(@vue/compiler-sfc@3.5.17)(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@nuxt/eslint-config@1.5.2(@vue/compiler-sfc@3.5.17)(eslint-plugin-import-x@4.10.6(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@antfu/install-pkg': 1.1.0 '@clack/prompts': 0.11.0 '@eslint/js': 9.30.1 - '@nuxt/eslint-plugin': 1.5.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) + '@nuxt/eslint-plugin': 1.5.2(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@stylistic/eslint-plugin': 5.1.0(eslint@9.30.1(jiti@2.4.2)) '@typescript-eslint/eslint-plugin': 8.35.1(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) @@ -7992,21 +8799,23 @@ snapshots: eslint-flat-config-utils: 2.1.0 eslint-merge-processors: 2.0.0(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-import-lite: 0.3.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - eslint-plugin-jsdoc: 51.3.2(eslint@9.30.1(jiti@2.4.2)) + eslint-plugin-jsdoc: 51.3.4(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-regexp: 2.9.0(eslint@9.30.1(jiti@2.4.2)) eslint-plugin-unicorn: 59.0.1(eslint@9.30.1(jiti@2.4.2)) - eslint-plugin-vue: 10.2.0(eslint@9.30.1(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.30.1(jiti@2.4.2))) + eslint-plugin-vue: 10.3.0(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.30.1(jiti@2.4.2))) eslint-processor-vue-blocks: 2.0.0(@vue/compiler-sfc@3.5.17)(eslint@9.30.1(jiti@2.4.2)) globals: 16.3.0 local-pkg: 1.1.1 pathe: 2.0.3 vue-eslint-parser: 10.2.0(eslint@9.30.1(jiti@2.4.2)) + optionalDependencies: + eslint-plugin-import-x: 4.10.6(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) transitivePeerDependencies: - '@vue/compiler-sfc' - supports-color - typescript - '@nuxt/eslint-plugin@1.5.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': + '@nuxt/eslint-plugin@1.5.2(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@typescript-eslint/types': 8.35.1 '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) @@ -8015,6 +8824,73 @@ snapshots: - supports-color - typescript + '@nuxt/fonts@0.11.4(@netlify/blobs@8.2.0)(db0@0.3.2(better-sqlite3@11.9.1))(ioredis@5.6.1)(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))': + dependencies: + '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) + '@nuxt/kit': 3.17.6(magicast@0.3.5) + consola: 3.4.2 + css-tree: 3.1.0 + defu: 6.1.4 + esbuild: 0.25.5 + fontaine: 0.6.0 + h3: 1.15.3 + jiti: 2.4.2 + magic-regexp: 0.10.0 + magic-string: 0.30.17 + node-fetch-native: 1.6.6 + ohash: 2.0.11 + pathe: 2.0.3 + sirv: 3.0.1 + tinyglobby: 0.2.14 + ufo: 1.6.1 + unifont: 0.4.1 + unplugin: 2.3.5 + unstorage: 1.16.0(@netlify/blobs@8.2.0)(db0@0.3.2(better-sqlite3@11.9.1))(ioredis@5.6.1) + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - aws4fetch + - db0 + - encoding + - idb-keyval + - ioredis + - magicast + - uploadthing + - vite + + '@nuxt/icon@1.15.0(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@iconify/collections': 1.0.565 + '@iconify/types': 2.0.0 + '@iconify/utils': 2.3.0 + '@iconify/vue': 5.0.0(vue@3.5.17(typescript@5.8.3)) + '@nuxt/devtools-kit': 2.6.2(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) + '@nuxt/kit': 3.17.6(magicast@0.3.5) + consola: 3.4.2 + local-pkg: 1.1.1 + mlly: 1.7.4 + ohash: 2.0.11 + pathe: 2.0.3 + picomatch: 4.0.2 + std-env: 3.9.0 + tinyglobby: 0.2.14 + transitivePeerDependencies: + - magicast + - supports-color + - vite + - vue + '@nuxt/kit@3.16.2(magicast@0.3.5)': dependencies: c12: 3.0.3(magicast@0.3.5) @@ -8117,7 +8993,7 @@ snapshots: transitivePeerDependencies: - magicast - '@nuxt/test-utils@3.19.2(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))': + '@nuxt/test-utils@3.19.2(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))': dependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) c12: 3.0.4(magicast@0.3.5) @@ -8141,20 +9017,174 @@ snapshots: tinyexec: 1.0.1 ufo: 1.6.1 unplugin: 2.3.5 - vitest-environment-nuxt: 1.0.1(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + vitest-environment-nuxt: 1.0.1(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) vue: 3.5.17(typescript@5.8.3) optionalDependencies: - vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vitest: 3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) transitivePeerDependencies: - magicast - typescript - '@nuxt/vite-builder@3.17.6(@types/node@22.14.1)(eslint@9.30.1(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.0)(terser@5.39.0)(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))(yaml@2.8.0)': + '@nuxt/ui-pro@3.2.0(@babel/parser@7.28.0)(@netlify/blobs@8.2.0)(db0@0.3.2(better-sqlite3@11.9.1))(embla-carousel@8.6.0)(ioredis@5.6.1)(jwt-decode@4.0.0)(magicast@0.3.5)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))(zod@3.25.67)': + dependencies: + '@ai-sdk/vue': 1.2.12(vue@3.5.17(typescript@5.8.3))(zod@3.25.67) + '@nuxt/kit': 3.17.6(magicast@0.3.5) + '@nuxt/schema': 3.17.6 + '@nuxt/ui': 3.2.0(@babel/parser@7.28.0)(@netlify/blobs@8.2.0)(db0@0.3.2(better-sqlite3@11.9.1))(embla-carousel@8.6.0)(ioredis@5.6.1)(jwt-decode@4.0.0)(magicast@0.3.5)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))(zod@3.25.67) + '@standard-schema/spec': 1.0.0 + '@vueuse/core': 13.5.0(vue@3.5.17(typescript@5.8.3)) + consola: 3.4.2 + defu: 6.1.4 + dotenv: 16.5.0 + git-url-parse: 16.1.0 + motion-v: 1.4.0(vue@3.5.17(typescript@5.8.3)) + ofetch: 1.4.1 + ohash: 2.0.11 + pathe: 2.0.3 + pkg-types: 2.2.0 + scule: 1.3.0 + tinyglobby: 0.2.14 + typescript: 5.8.3 + unplugin: 2.3.5 + unplugin-auto-import: 19.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3))) + unplugin-vue-components: 28.8.0(@babel/parser@7.28.0)(@nuxt/kit@3.17.6(magicast@0.3.5))(vue@3.5.17(typescript@5.8.3)) + optionalDependencies: + zod: 3.25.67 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/parser' + - '@capacitor/preferences' + - '@deno/kv' + - '@emotion/is-prop-valid' + - '@inertiajs/vue3' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - '@vue/composition-api' + - async-validator + - aws4fetch + - axios + - change-case + - db0 + - drauu + - embla-carousel + - encoding + - focus-trap + - idb-keyval + - ioredis + - jwt-decode + - magicast + - nprogress + - qrcode + - react + - react-dom + - sortablejs + - supports-color + - universal-cookie + - uploadthing + - vite + - vue + - vue-router + + '@nuxt/ui@3.2.0(@babel/parser@7.28.0)(@netlify/blobs@8.2.0)(db0@0.3.2(better-sqlite3@11.9.1))(embla-carousel@8.6.0)(ioredis@5.6.1)(jwt-decode@4.0.0)(magicast@0.3.5)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3))(zod@3.25.67)': + dependencies: + '@iconify/vue': 5.0.0(vue@3.5.17(typescript@5.8.3)) + '@internationalized/date': 3.8.2 + '@internationalized/number': 3.6.3 + '@nuxt/fonts': 0.11.4(@netlify/blobs@8.2.0)(db0@0.3.2(better-sqlite3@11.9.1))(ioredis@5.6.1)(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) + '@nuxt/icon': 1.15.0(magicast@0.3.5)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + '@nuxt/kit': 3.17.6(magicast@0.3.5) + '@nuxt/schema': 3.17.6 + '@nuxtjs/color-mode': 3.5.2(magicast@0.3.5) + '@standard-schema/spec': 1.0.0 + '@tailwindcss/postcss': 4.1.11 + '@tailwindcss/vite': 4.1.11(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) + '@tanstack/vue-table': 8.21.3(vue@3.5.17(typescript@5.8.3)) + '@unhead/vue': 2.0.11(vue@3.5.17(typescript@5.8.3)) + '@vueuse/core': 13.5.0(vue@3.5.17(typescript@5.8.3)) + '@vueuse/integrations': 13.5.0(fuse.js@7.1.0)(jwt-decode@4.0.0)(vue@3.5.17(typescript@5.8.3)) + colortranslator: 5.0.0 + consola: 3.4.2 + defu: 6.1.4 + embla-carousel-auto-height: 8.6.0(embla-carousel@8.6.0) + embla-carousel-auto-scroll: 8.6.0(embla-carousel@8.6.0) + 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.17(typescript@5.8.3)) + embla-carousel-wheel-gestures: 8.0.2(embla-carousel@8.6.0) + fuse.js: 7.1.0 + hookable: 5.5.3 + knitwork: 1.2.0 + magic-string: 0.30.17 + mlly: 1.7.4 + ohash: 2.0.11 + pathe: 2.0.3 + reka-ui: 2.3.1(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)) + scule: 1.3.0 + tailwind-variants: 1.0.0(tailwindcss@4.1.11) + tailwindcss: 4.1.11 + tinyglobby: 0.2.14 + typescript: 5.8.3 + unplugin: 2.3.5 + unplugin-auto-import: 19.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3))) + unplugin-vue-components: 28.8.0(@babel/parser@7.28.0)(@nuxt/kit@3.17.6(magicast@0.3.5))(vue@3.5.17(typescript@5.8.3)) + vaul-vue: 0.4.1(reka-ui@2.3.1(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3)) + vue-component-type-helpers: 2.2.10 + optionalDependencies: + vue-router: 4.5.1(vue@3.5.17(typescript@5.8.3)) + zod: 3.25.67 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@babel/parser' + - '@capacitor/preferences' + - '@deno/kv' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/kv' + - '@vue/composition-api' + - async-validator + - aws4fetch + - axios + - change-case + - db0 + - drauu + - embla-carousel + - encoding + - focus-trap + - idb-keyval + - ioredis + - jwt-decode + - magicast + - nprogress + - qrcode + - sortablejs + - supports-color + - universal-cookie + - uploadthing + - vite + - vue + + '@nuxt/vite-builder@3.17.6(@types/node@22.14.1)(eslint@9.30.1(jiti@2.4.2))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.0)(terser@5.39.0)(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))(yaml@2.8.0)': dependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) '@rollup/plugin-replace': 6.0.2(rollup@4.40.0) - '@vitejs/plugin-vue': 5.2.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) - '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + '@vitejs/plugin-vue': 5.2.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) autoprefixer: 10.4.21(postcss@8.5.6) consola: 3.4.2 cssnano: 7.0.7(postcss@8.5.6) @@ -8179,9 +9209,9 @@ snapshots: std-env: 3.9.0 ufo: 1.6.1 unenv: 2.0.0-rc.18 - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-plugin-checker: 0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-plugin-checker: 0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) vue: 3.5.17(typescript@5.8.3) vue-bundle-renderer: 2.1.1 transitivePeerDependencies: @@ -8209,12 +9239,12 @@ snapshots: - vue-tsc - yaml - '@nuxt/vite-builder@3.17.6(@types/node@22.14.1)(eslint@9.30.1(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))(yaml@2.8.0)': + '@nuxt/vite-builder@3.17.6(@types/node@22.14.1)(eslint@9.30.1(jiti@2.4.2))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))(yaml@2.8.0)': dependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) '@rollup/plugin-replace': 6.0.2(rollup@4.44.1) - '@vitejs/plugin-vue': 5.2.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) - '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + '@vitejs/plugin-vue': 5.2.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + '@vitejs/plugin-vue-jsx': 4.2.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) autoprefixer: 10.4.21(postcss@8.5.6) consola: 3.4.2 cssnano: 7.0.7(postcss@8.5.6) @@ -8239,9 +9269,9 @@ snapshots: std-env: 3.9.0 ufo: 1.6.1 unenv: 2.0.0-rc.18 - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-plugin-checker: 0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-plugin-checker: 0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) vue: 3.5.17(typescript@5.8.3) vue-bundle-renderer: 2.1.1 transitivePeerDependencies: @@ -8269,6 +9299,15 @@ snapshots: - vue-tsc - yaml + '@nuxtjs/color-mode@3.5.2(magicast@0.3.5)': + dependencies: + '@nuxt/kit': 3.17.6(magicast@0.3.5) + pathe: 1.1.2 + pkg-types: 1.3.1 + semver: 7.7.2 + transitivePeerDependencies: + - magicast + '@nuxtjs/eslint-config-typescript@12.1.0(eslint-plugin-import-x@4.10.6(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3)': dependencies: '@nuxtjs/eslint-config': 12.0.0(@typescript-eslint/parser@6.21.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import-x@4.10.6(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint-plugin-import@2.31.0(@typescript-eslint/parser@6.21.0(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)))(eslint@9.30.1(jiti@2.4.2)) @@ -8305,11 +9344,11 @@ snapshots: dependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) '@shikijs/langs': 3.7.0 - '@shikijs/themes': 3.3.0 + '@shikijs/themes': 3.7.0 '@shikijs/transformers': 3.3.0 '@types/hast': 3.0.4 '@types/mdast': 4.0.4 - '@vue/compiler-core': 3.5.13 + '@vue/compiler-core': 3.5.17 consola: 3.4.2 debug: 4.4.0 defu: 6.1.4 @@ -8816,10 +9855,6 @@ snapshots: dependencies: '@shikijs/types': 3.7.0 - '@shikijs/themes@3.3.0': - dependencies: - '@shikijs/types': 3.3.0 - '@shikijs/themes@3.7.0': dependencies: '@shikijs/types': 3.7.0 @@ -8853,6 +9888,8 @@ snapshots: '@sqlite.org/sqlite-wasm@3.50.1-build1': {} + '@standard-schema/spec@1.0.0': {} + '@stylistic/eslint-plugin@5.1.0(eslint@9.30.1(jiti@2.4.2))': dependencies: '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) @@ -8863,6 +9900,103 @@ snapshots: estraverse: 5.3.0 picomatch: 4.0.2 + '@swc/helpers@0.5.17': + dependencies: + tslib: 2.8.1 + + '@tailwindcss/node@4.1.11': + dependencies: + '@ampproject/remapping': 2.3.0 + enhanced-resolve: 5.18.1 + jiti: 2.4.2 + lightningcss: 1.30.1 + magic-string: 0.30.17 + source-map-js: 1.2.1 + tailwindcss: 4.1.11 + + '@tailwindcss/oxide-android-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-arm64@4.1.11': + optional: true + + '@tailwindcss/oxide-darwin-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-freebsd-x64@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm-gnueabihf@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-arm64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-gnu@4.1.11': + optional: true + + '@tailwindcss/oxide-linux-x64-musl@4.1.11': + optional: true + + '@tailwindcss/oxide-wasm32-wasi@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-arm64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide-win32-x64-msvc@4.1.11': + optional: true + + '@tailwindcss/oxide@4.1.11': + dependencies: + detect-libc: 2.0.4 + tar: 7.4.3 + optionalDependencies: + '@tailwindcss/oxide-android-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-arm64': 4.1.11 + '@tailwindcss/oxide-darwin-x64': 4.1.11 + '@tailwindcss/oxide-freebsd-x64': 4.1.11 + '@tailwindcss/oxide-linux-arm-gnueabihf': 4.1.11 + '@tailwindcss/oxide-linux-arm64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-arm64-musl': 4.1.11 + '@tailwindcss/oxide-linux-x64-gnu': 4.1.11 + '@tailwindcss/oxide-linux-x64-musl': 4.1.11 + '@tailwindcss/oxide-wasm32-wasi': 4.1.11 + '@tailwindcss/oxide-win32-arm64-msvc': 4.1.11 + '@tailwindcss/oxide-win32-x64-msvc': 4.1.11 + + '@tailwindcss/postcss@4.1.11': + dependencies: + '@alloc/quick-lru': 5.2.0 + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 + postcss: 8.5.6 + tailwindcss: 4.1.11 + + '@tailwindcss/vite@4.1.11(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))': + dependencies: + '@tailwindcss/node': 4.1.11 + '@tailwindcss/oxide': 4.1.11 + tailwindcss: 4.1.11 + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + + '@tanstack/table-core@8.21.3': {} + + '@tanstack/virtual-core@3.13.12': {} + + '@tanstack/vue-table@8.21.3(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@tanstack/table-core': 8.21.3 + vue: 3.5.17(typescript@5.8.3) + + '@tanstack/vue-virtual@3.13.12(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@tanstack/virtual-core': 3.13.12 + vue: 3.5.17(typescript@5.8.3) + '@tootallnate/quickjs-emscripten@0.23.0': {} '@trysound/sax@0.2.0': {} @@ -8924,6 +10058,10 @@ snapshots: '@types/unist@3.0.3': {} + '@types/web-bluetooth@0.0.20': {} + + '@types/web-bluetooth@0.0.21': {} + '@types/yauzl@2.10.3': dependencies: '@types/node': 22.14.1 @@ -8959,7 +10097,7 @@ snapshots: '@typescript-eslint/visitor-keys': 8.35.1 eslint: 9.30.1(jiti@2.4.2) graphemer: 1.4.0 - ignore: 7.0.3 + ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -8985,7 +10123,7 @@ snapshots: '@typescript-eslint/types': 8.35.1 '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) '@typescript-eslint/visitor-keys': 8.35.1 - debug: 4.4.0 + debug: 4.4.1 eslint: 9.30.1(jiti@2.4.2) typescript: 5.8.3 transitivePeerDependencies: @@ -8995,7 +10133,7 @@ snapshots: dependencies: '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) '@typescript-eslint/types': 8.35.1 - debug: 4.4.0 + debug: 4.4.1 typescript: 5.8.3 transitivePeerDependencies: - supports-color @@ -9030,7 +10168,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.35.1(typescript@5.8.3) '@typescript-eslint/utils': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) - debug: 4.4.0 + debug: 4.4.1 eslint: 9.30.1(jiti@2.4.2) ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 @@ -9062,7 +10200,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.31.0 '@typescript-eslint/visitor-keys': 8.31.0 - debug: 4.4.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 @@ -9078,11 +10216,11 @@ snapshots: '@typescript-eslint/tsconfig-utils': 8.35.1(typescript@5.8.3) '@typescript-eslint/types': 8.35.1 '@typescript-eslint/visitor-keys': 8.35.1 - debug: 4.4.0 + debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 - semver: 7.7.1 + semver: 7.7.2 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: @@ -9205,20 +10343,20 @@ snapshots: - rollup - supports-color - '@vitejs/plugin-vue-jsx@4.2.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': + '@vitejs/plugin-vue-jsx@4.2.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': dependencies: '@babel/core': 7.28.0 '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.0) '@rolldown/pluginutils': 1.0.0-beta.23 '@vue/babel-plugin-jsx': 1.4.0(@babel/core@7.28.0) - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) vue: 3.5.17(typescript@5.8.3) transitivePeerDependencies: - supports-color - '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': + '@vitejs/plugin-vue@5.2.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': dependencies: - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) vue: 3.5.17(typescript@5.8.3) '@vitest/expect@3.2.4': @@ -9229,13 +10367,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.2.4(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))': + '@vitest/mocker@3.2.4(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))': dependencies: '@vitest/spy': 3.2.4 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) '@vitest/pretty-format@3.2.4': dependencies: @@ -9267,13 +10405,13 @@ snapshots: dependencies: '@volar/source-map': 2.4.12 - '@volar/language-core@2.4.16': + '@volar/language-core@2.4.17': dependencies: - '@volar/source-map': 2.4.16 + '@volar/source-map': 2.4.17 '@volar/source-map@2.4.12': {} - '@volar/source-map@2.4.16': {} + '@volar/source-map@2.4.17': {} '@volar/typescript@2.4.12': dependencies: @@ -9281,9 +10419,9 @@ snapshots: path-browserify: 1.0.1 vscode-uri: 3.1.0 - '@volar/typescript@2.4.16': + '@volar/typescript@2.4.17': dependencies: - '@volar/language-core': 2.4.16 + '@volar/language-core': 2.4.17 path-browserify: 1.0.1 vscode-uri: 3.1.0 @@ -9393,26 +10531,26 @@ snapshots: '@vue/devtools-api@6.6.4': {} - '@vue/devtools-core@7.7.7(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': + '@vue/devtools-core@7.7.7(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': dependencies: '@vue/devtools-kit': 7.7.7 '@vue/devtools-shared': 7.7.7 mitt: 3.0.1 nanoid: 5.1.5 pathe: 2.0.3 - vite-hot-client: 2.0.4(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + vite-hot-client: 2.0.4(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) vue: 3.5.17(typescript@5.8.3) transitivePeerDependencies: - vite - '@vue/devtools-core@7.7.7(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': + '@vue/devtools-core@7.7.7(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3))': dependencies: '@vue/devtools-kit': 7.7.7 '@vue/devtools-shared': 7.7.7 mitt: 3.0.1 nanoid: 5.1.5 pathe: 2.0.3 - vite-hot-client: 2.0.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + vite-hot-client: 2.0.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) vue: 3.5.17(typescript@5.8.3) transitivePeerDependencies: - vite @@ -9444,12 +10582,12 @@ snapshots: optionalDependencies: typescript: 5.8.3 - '@vue/language-core@3.0.0(typescript@5.8.3)': + '@vue/language-core@3.0.1(typescript@5.8.3)': dependencies: - '@volar/language-core': 2.4.16 - '@vue/compiler-dom': 3.5.13 + '@volar/language-core': 2.4.17 + '@vue/compiler-dom': 3.5.17 '@vue/compiler-vue2': 2.7.16 - '@vue/shared': 3.5.13 + '@vue/shared': 3.5.17 alien-signals: 2.0.5 minimatch: 10.0.1 muggle-string: 0.4.1 @@ -9483,6 +10621,64 @@ snapshots: '@vue/shared@3.5.17': {} + '@vueuse/core@10.11.1(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@types/web-bluetooth': 0.0.20 + '@vueuse/metadata': 10.11.1 + '@vueuse/shared': 10.11.1(vue@3.5.17(typescript@5.8.3)) + vue-demi: 0.14.10(vue@3.5.17(typescript@5.8.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/core@12.8.2(typescript@5.8.3)': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 12.8.2 + '@vueuse/shared': 12.8.2(typescript@5.8.3) + vue: 3.5.17(typescript@5.8.3) + transitivePeerDependencies: + - typescript + + '@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@types/web-bluetooth': 0.0.21 + '@vueuse/metadata': 13.5.0 + '@vueuse/shared': 13.5.0(vue@3.5.17(typescript@5.8.3)) + vue: 3.5.17(typescript@5.8.3) + + '@vueuse/integrations@13.5.0(fuse.js@7.1.0)(jwt-decode@4.0.0)(vue@3.5.17(typescript@5.8.3))': + dependencies: + '@vueuse/core': 13.5.0(vue@3.5.17(typescript@5.8.3)) + '@vueuse/shared': 13.5.0(vue@3.5.17(typescript@5.8.3)) + vue: 3.5.17(typescript@5.8.3) + optionalDependencies: + fuse.js: 7.1.0 + jwt-decode: 4.0.0 + + '@vueuse/metadata@10.11.1': {} + + '@vueuse/metadata@12.8.2': {} + + '@vueuse/metadata@13.5.0': {} + + '@vueuse/shared@10.11.1(vue@3.5.17(typescript@5.8.3))': + dependencies: + vue-demi: 0.14.10(vue@3.5.17(typescript@5.8.3)) + transitivePeerDependencies: + - '@vue/composition-api' + - vue + + '@vueuse/shared@12.8.2(typescript@5.8.3)': + dependencies: + vue: 3.5.17(typescript@5.8.3) + transitivePeerDependencies: + - typescript + + '@vueuse/shared@13.5.0(vue@3.5.17(typescript@5.8.3))': + dependencies: + vue: 3.5.17(typescript@5.8.3) + '@webcontainer/env@1.1.1': {} '@whatwg-node/disposablestack@0.0.6': @@ -9523,10 +10719,6 @@ snapshots: dependencies: acorn: 8.14.1 - acorn-jsx@5.3.2(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -9593,6 +10785,10 @@ snapshots: argparse@2.0.1: {} + aria-hidden@1.2.6: + dependencies: + tslib: 2.8.1 + array-buffer-byte-length@1.0.2: dependencies: call-bound: 1.0.4 @@ -9716,6 +10912,8 @@ snapshots: prebuild-install: 7.1.3 optional: true + binary-extensions@2.3.0: {} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -9729,6 +10927,8 @@ snapshots: readable-stream: 3.6.2 optional: true + blob-to-buffer@1.2.9: {} + boolbase@1.0.0: {} brace-expansion@1.1.11: @@ -9744,6 +10944,10 @@ snapshots: dependencies: fill-range: 7.1.1 + brotli@1.3.3: + dependencies: + base64-js: 1.5.1 + browserslist@4.24.4: dependencies: caniuse-lite: 1.0.30001715 @@ -9781,7 +10985,7 @@ snapshots: builtins@5.1.0: dependencies: - semver: 7.7.1 + semver: 7.7.2 bundle-name@4.1.0: dependencies: @@ -9872,20 +11076,20 @@ snapshots: chalk@5.4.1: {} - changelogen@0.6.1(magicast@0.3.5): + changelogen@0.6.2(magicast@0.3.5): dependencies: - c12: 3.0.3(magicast@0.3.5) + c12: 3.0.4(magicast@0.3.5) confbox: 0.2.2 consola: 3.4.2 convert-gitmoji: 0.1.5 mri: 1.2.0 node-fetch-native: 1.6.6 ofetch: 1.4.1 - open: 10.1.1 + open: 10.1.2 pathe: 2.0.3 - pkg-types: 2.1.0 + pkg-types: 2.2.0 scule: 1.3.0 - semver: 7.7.1 + semver: 7.7.2 std-env: 3.9.0 transitivePeerDependencies: - magicast @@ -9904,6 +11108,18 @@ snapshots: check-error@2.1.1: {} + chokidar@3.6.0: + dependencies: + anymatch: 3.1.3 + braces: 3.0.3 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + chokidar@4.0.3: dependencies: readdirp: 4.1.2 @@ -9945,6 +11161,8 @@ snapshots: strip-ansi: 6.0.1 wrap-ansi: 7.0.0 + clone@2.1.2: {} + cluster-key-slot@1.1.2: {} color-convert@1.9.3: @@ -9976,6 +11194,8 @@ snapshots: color: 3.2.1 text-hex: 1.0.0 + colortranslator@5.0.0: {} + comma-separated-tokens@2.0.3: {} commander@10.0.1: {} @@ -10031,7 +11251,7 @@ snapshots: core-js-compat@3.41.0: dependencies: - browserslist: 4.24.4 + browserslist: 4.25.1 core-util-is@1.0.3: {} @@ -10048,6 +11268,12 @@ snapshots: croner@9.1.0: {} + cross-fetch@3.2.0: + dependencies: + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -10088,6 +11314,11 @@ snapshots: mdn-data: 2.0.30 source-map-js: 1.2.1 + css-tree@3.1.0: + dependencies: + mdn-data: 2.12.2 + source-map-js: 1.2.1 + css-what@6.1.0: {} cssesc@3.0.0: {} @@ -10359,6 +11590,8 @@ snapshots: dependencies: dequal: 2.0.3 + dfa@1.2.0: {} + diff@8.0.2: {} dir-glob@3.0.1: @@ -10414,6 +11647,43 @@ snapshots: electron-to-chromium@1.5.178: {} + embla-carousel-auto-height@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + + embla-carousel-auto-scroll@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + + embla-carousel-autoplay@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + + embla-carousel-class-names@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + + embla-carousel-fade@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + + embla-carousel-reactive-utils@8.6.0(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + + embla-carousel-vue@8.6.0(vue@3.5.17(typescript@5.8.3)): + dependencies: + embla-carousel: 8.6.0 + embla-carousel-reactive-utils: 8.6.0(embla-carousel@8.6.0) + vue: 3.5.17(typescript@5.8.3) + + embla-carousel-wheel-gestures@8.0.2(embla-carousel@8.6.0): + dependencies: + embla-carousel: 8.6.0 + wheel-gestures: 2.2.48 + + embla-carousel@8.6.0: {} + emoji-regex@10.4.0: {} emoji-regex@8.0.0: {} @@ -10706,7 +11976,7 @@ snapshots: eslint-import-resolver-node: 0.3.9 get-tsconfig: 4.10.0 is-glob: 4.0.3 - minimatch: 10.0.1 + minimatch: 10.0.3 semver: 7.7.2 stable-hash: 0.0.5 tslib: 2.8.1 @@ -10745,7 +12015,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-jsdoc@51.3.2(eslint@9.30.1(jiti@2.4.2)): + eslint-plugin-jsdoc@51.3.4(eslint@9.30.1(jiti@2.4.2)): dependencies: '@es-joy/jsdoccomment': 0.52.0 are-docs-informative: 0.0.2 @@ -10789,7 +12059,7 @@ snapshots: eslint-plugin-regexp@2.9.0(eslint@9.30.1(jiti@2.4.2)): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) '@eslint-community/regexpp': 4.12.1 comment-parser: 1.4.1 eslint: 9.30.1(jiti@2.4.2) @@ -10818,8 +12088,8 @@ snapshots: eslint-plugin-unicorn@59.0.1(eslint@9.30.1(jiti@2.4.2)): dependencies: - '@babel/helper-validator-identifier': 7.25.9 - '@eslint-community/eslint-utils': 4.6.1(eslint@9.30.1(jiti@2.4.2)) + '@babel/helper-validator-identifier': 7.27.1 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) '@eslint/plugin-kit': 0.2.8 ci-info: 4.2.0 clean-regexp: 1.0.0 @@ -10834,19 +12104,21 @@ snapshots: pluralize: 8.0.0 regexp-tree: 0.1.27 regjsparser: 0.12.0 - semver: 7.7.1 + semver: 7.7.2 strip-indent: 4.0.0 - eslint-plugin-vue@10.2.0(eslint@9.30.1(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.30.1(jiti@2.4.2))): + eslint-plugin-vue@10.3.0(@typescript-eslint/parser@8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3))(eslint@9.30.1(jiti@2.4.2))(vue-eslint-parser@10.2.0(eslint@9.30.1(jiti@2.4.2))): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.30.1(jiti@2.4.2)) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.30.1(jiti@2.4.2)) eslint: 9.30.1(jiti@2.4.2) natural-compare: 1.4.0 nth-check: 2.1.1 postcss-selector-parser: 6.1.2 - semver: 7.7.1 + semver: 7.7.2 vue-eslint-parser: 10.2.0(eslint@9.30.1(jiti@2.4.2)) xml-name-validator: 4.0.0 + optionalDependencies: + '@typescript-eslint/parser': 8.35.1(eslint@9.30.1(jiti@2.4.2))(typescript@5.8.3) eslint-plugin-vue@9.33.0(eslint@9.30.1(jiti@2.4.2)): dependencies: @@ -10872,11 +12144,6 @@ snapshots: esrecurse: 4.3.0 estraverse: 5.3.0 - eslint-scope@8.3.0: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -10943,12 +12210,6 @@ snapshots: transitivePeerDependencies: - supports-color - espree@10.3.0: - dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 - espree@10.4.0: dependencies: acorn: 8.15.0 @@ -10957,8 +12218,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -11027,7 +12288,7 @@ snapshots: extract-zip@2.0.1: dependencies: - debug: 4.4.0 + debug: 4.4.1 get-stream: 5.2.0 yauzl: 2.10.0 optionalDependencies: @@ -11123,6 +12384,31 @@ snapshots: fn.name@1.1.0: {} + fontaine@0.6.0: + dependencies: + '@capsizecss/metrics': 3.5.0 + '@capsizecss/unpack': 2.4.0 + css-tree: 3.1.0 + magic-regexp: 0.10.0 + magic-string: 0.30.17 + pathe: 2.0.3 + ufo: 1.6.1 + unplugin: 2.3.5 + transitivePeerDependencies: + - encoding + + fontkit@2.0.4: + dependencies: + '@swc/helpers': 0.5.17 + brotli: 1.3.3 + clone: 2.1.2 + dfa: 1.2.0 + fast-deep-equal: 3.1.3 + restructure: 3.0.2 + tiny-inflate: 1.0.3 + unicode-properties: 1.4.1 + unicode-trie: 2.0.0 + for-each@0.3.5: dependencies: is-callable: 1.2.7 @@ -11138,6 +12424,12 @@ snapshots: fraction.js@4.3.7: {} + framer-motion@12.22.0: + dependencies: + motion-dom: 12.22.0 + motion-utils: 12.19.0 + tslib: 2.8.1 + fresh@2.0.0: {} fs-constants@1.0.0: @@ -11212,7 +12504,7 @@ snapshots: dependencies: basic-ftp: 5.0.5 data-uri-to-buffer: 6.0.2 - debug: 4.4.0 + debug: 4.4.1 transitivePeerDependencies: - supports-color @@ -11268,6 +12560,8 @@ snapshots: globals@14.0.0: {} + globals@15.15.0: {} + globals@16.3.0: {} globalthis@1.0.4: @@ -11497,6 +12791,8 @@ snapshots: he@1.2.0: {} + hey-listen@1.0.8: {} + hookable@5.5.3: {} hosted-git-info@2.8.9: {} @@ -11649,6 +12945,10 @@ snapshots: dependencies: has-bigints: 1.1.0 + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-boolean-object@1.2.2: dependencies: call-bound: 1.0.4 @@ -11871,8 +13171,12 @@ snapshots: prettier: 3.6.2 tinyglobby: 0.2.14 + json-schema-to-zod@2.6.1: {} + json-schema-traverse@0.4.1: {} + json-schema@0.4.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@1.0.2: @@ -11897,6 +13201,8 @@ snapshots: knitwork@1.2.0: {} + kolorist@1.8.0: {} + kuler@2.0.0: {} lambda-local@2.2.0: @@ -11919,6 +13225,51 @@ snapshots: prelude-ls: 1.2.1 type-check: 0.4.0 + lightningcss-darwin-arm64@1.30.1: + optional: true + + lightningcss-darwin-x64@1.30.1: + optional: true + + lightningcss-freebsd-x64@1.30.1: + optional: true + + lightningcss-linux-arm-gnueabihf@1.30.1: + optional: true + + lightningcss-linux-arm64-gnu@1.30.1: + optional: true + + lightningcss-linux-arm64-musl@1.30.1: + optional: true + + lightningcss-linux-x64-gnu@1.30.1: + optional: true + + lightningcss-linux-x64-musl@1.30.1: + optional: true + + lightningcss-win32-arm64-msvc@1.30.1: + optional: true + + lightningcss-win32-x64-msvc@1.30.1: + optional: true + + lightningcss@1.30.1: + dependencies: + detect-libc: 2.0.4 + optionalDependencies: + lightningcss-darwin-arm64: 1.30.1 + lightningcss-darwin-x64: 1.30.1 + lightningcss-freebsd-x64: 1.30.1 + lightningcss-linux-arm-gnueabihf: 1.30.1 + lightningcss-linux-arm64-gnu: 1.30.1 + lightningcss-linux-arm64-musl: 1.30.1 + lightningcss-linux-x64-gnu: 1.30.1 + lightningcss-linux-x64-musl: 1.30.1 + lightningcss-win32-arm64-msvc: 1.30.1 + lightningcss-win32-x64-msvc: 1.30.1 + lilconfig@3.1.3: {} lines-and-columns@1.2.4: {} @@ -12024,6 +13375,16 @@ snapshots: macos-release@3.3.0: {} + magic-regexp@0.10.0: + dependencies: + estree-walker: 3.0.3 + magic-string: 0.30.17 + mlly: 1.7.4 + regexp-tree: 0.1.27 + type-level-regexp: 0.1.17 + ufo: 1.6.1 + unplugin: 2.3.5 + magic-regexp@0.8.0: dependencies: estree-walker: 3.0.3 @@ -12170,6 +13531,8 @@ snapshots: mdn-data@2.0.30: {} + mdn-data@2.12.2: {} + merge-options@3.0.4: dependencies: is-plain-obj: 2.1.0 @@ -12401,6 +13764,10 @@ snapshots: dependencies: brace-expansion: 2.0.1 + minimatch@10.0.3: + dependencies: + '@isaacs/brace-expansion': 5.0.0 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -12466,6 +13833,27 @@ snapshots: ast-module-types: 6.0.1 node-source-walk: 7.0.1 + monaco-editor@0.52.2: {} + + motion-dom@12.22.0: + dependencies: + motion-utils: 12.19.0 + + motion-utils@12.19.0: {} + + motion-v@1.4.0(vue@3.5.17(typescript@5.8.3)): + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.17(typescript@5.8.3)) + framer-motion: 12.22.0 + hey-listen: 1.0.8 + motion-dom: 12.22.0 + vue: 3.5.17(typescript@5.8.3) + transitivePeerDependencies: + - '@emotion/is-prop-valid' + - '@vue/composition-api' + - react + - react-dom + mri@1.2.0: {} mrmime@2.0.1: {} @@ -12709,15 +14097,29 @@ snapshots: transitivePeerDependencies: - magicast - nuxt@3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.0)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0): + nuxt-component-meta@0.12.1(magicast@0.3.5)(vue-component-type-helpers@2.2.10): + dependencies: + '@nuxt/kit': 3.17.6(magicast@0.3.5) + citty: 0.1.6 + mlly: 1.7.4 + ohash: 2.0.11 + scule: 1.3.0 + typescript: 5.8.3 + ufo: 1.6.1 + vue-component-meta: 3.0.1(typescript@5.8.3)(vue-component-type-helpers@2.2.10) + transitivePeerDependencies: + - magicast + - vue-component-type-helpers + + nuxt@3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.0)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0): dependencies: '@nuxt/cli': 3.25.1(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.6.2(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + '@nuxt/devtools': 2.6.2(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) '@nuxt/kit': 3.17.6(magicast@0.3.5) '@nuxt/schema': 3.17.6 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 3.17.6(@types/node@22.14.1)(eslint@9.30.1(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.0)(terser@5.39.0)(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))(yaml@2.8.0) + '@nuxt/vite-builder': 3.17.6(@types/node@22.14.1)(eslint@9.30.1(jiti@2.4.2))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.40.0)(terser@5.39.0)(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))(yaml@2.8.0) '@unhead/vue': 2.0.11(vue@3.5.17(typescript@5.8.3)) '@vue/shared': 3.5.17 c12: 3.0.4(magicast@0.3.5) @@ -12829,15 +14231,15 @@ snapshots: - xml2js - yaml - nuxt@3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0): + nuxt@3.17.6(@netlify/blobs@8.2.0)(@parcel/watcher@2.5.1)(@types/node@22.14.1)(@vue/compiler-sfc@3.5.17)(better-sqlite3@11.9.1)(db0@0.3.2(better-sqlite3@11.9.1))(eslint@9.30.1(jiti@2.4.2))(ioredis@5.6.1)(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(yaml@2.8.0): dependencies: '@nuxt/cli': 3.25.1(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.6.2(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) + '@nuxt/devtools': 2.6.2(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)) '@nuxt/kit': 3.17.6(magicast@0.3.5) '@nuxt/schema': 3.17.6 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 3.17.6(@types/node@22.14.1)(eslint@9.30.1(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))(yaml@2.8.0) + '@nuxt/vite-builder': 3.17.6(@types/node@22.14.1)(eslint@9.30.1(jiti@2.4.2))(lightningcss@1.30.1)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.44.1)(terser@5.39.0)(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3))(yaml@2.8.0) '@unhead/vue': 2.0.11(vue@3.5.17(typescript@5.8.3)) '@vue/shared': 3.5.17 c12: 3.0.4(magicast@0.3.5) @@ -13028,13 +14430,6 @@ snapshots: regex: 6.0.1 regex-recursion: 6.0.2 - open@10.1.1: - dependencies: - default-browser: 5.2.1 - define-lazy-prop: 3.0.0 - is-inside-container: 1.0.0 - is-wsl: 3.1.0 - open@10.1.2: dependencies: default-browser: 5.2.1 @@ -13164,6 +14559,8 @@ snapshots: package-manager-detector@1.3.0: {} + pako@0.2.9: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -13772,6 +15169,10 @@ snapshots: dependencies: minimatch: 5.1.6 + readdirp@3.6.0: + dependencies: + picomatch: 2.3.1 + readdirp@4.1.2: {} redis-errors@1.2.0: {} @@ -13874,6 +15275,23 @@ snapshots: '@types/hast': 3.0.4 unist-util-visit: 5.0.0 + reka-ui@2.3.1(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)): + dependencies: + '@floating-ui/dom': 1.7.2 + '@floating-ui/vue': 1.1.7(vue@3.5.17(typescript@5.8.3)) + '@internationalized/date': 3.8.2 + '@internationalized/number': 3.6.3 + '@tanstack/vue-virtual': 3.13.12(vue@3.5.17(typescript@5.8.3)) + '@vueuse/core': 12.8.2(typescript@5.8.3) + '@vueuse/shared': 12.8.2(typescript@5.8.3) + aria-hidden: 1.2.6 + defu: 6.1.4 + ohash: 2.0.11 + vue: 3.5.17(typescript@5.8.3) + transitivePeerDependencies: + - '@vue/composition-api' + - typescript + release-it@19.0.3(@types/node@22.14.1)(magicast@0.3.5): dependencies: '@nodeutils/defaults-deep': 1.1.0 @@ -13999,6 +15417,8 @@ snapshots: onetime: 7.0.0 signal-exit: 4.1.0 + restructure@3.0.2: {} + retry@0.13.1: {} reusify@1.1.0: {} @@ -14134,6 +15554,8 @@ snapshots: scule@1.3.0: {} + secure-json-parse@2.7.0: {} + semver@5.7.2: {} semver@6.3.1: {} @@ -14144,7 +15566,7 @@ snapshots: send@1.2.0: dependencies: - debug: 4.4.0 + debug: 4.4.1 encodeurl: 2.0.0 escape-html: 1.0.3 etag: 1.8.1 @@ -14501,8 +15923,21 @@ snapshots: csso: 5.0.5 picocolors: 1.1.1 + swrv@1.1.0(vue@3.5.17(typescript@5.8.3)): + dependencies: + vue: 3.5.17(typescript@5.8.3) + system-architecture@0.1.0: {} + tailwind-merge@3.0.2: {} + + tailwind-variants@1.0.0(tailwindcss@4.1.11): + dependencies: + tailwind-merge: 3.0.2 + tailwindcss: 4.1.11 + + tailwindcss@4.1.11: {} + tapable@2.2.1: {} tar-fs@2.1.2: @@ -14540,7 +15975,7 @@ snapshots: terser@5.39.0: dependencies: '@jridgewell/source-map': 0.3.6 - acorn: 8.14.1 + acorn: 8.15.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -14550,6 +15985,8 @@ snapshots: text-hex@1.0.0: {} + tiny-inflate@1.0.3: {} + tiny-invariant@1.3.3: {} tinybench@2.9.0: {} @@ -14558,11 +15995,6 @@ snapshots: tinyexec@1.0.1: {} - tinyglobby@0.2.12: - dependencies: - fdir: 6.4.4(picomatch@4.0.2) - picomatch: 4.0.2 - tinyglobby@0.2.13: dependencies: fdir: 6.4.4(picomatch@4.0.2) @@ -14761,6 +16193,16 @@ snapshots: unicode-emoji-modifier-base@1.0.0: {} + unicode-properties@1.4.1: + dependencies: + base64-js: 1.5.1 + unicode-trie: 2.0.0 + + unicode-trie@2.0.0: + dependencies: + pako: 0.2.9 + tiny-inflate: 1.0.3 + unicorn-magic@0.1.0: {} unicorn-magic@0.3.0: {} @@ -14775,6 +16217,11 @@ snapshots: trough: 2.2.0 vfile: 6.0.3 + unifont@0.4.1: + dependencies: + css-tree: 3.1.0 + ohash: 2.0.11 + unimport@4.2.0: dependencies: acorn: 8.14.1 @@ -14785,11 +16232,11 @@ snapshots: mlly: 1.7.4 pathe: 2.0.3 picomatch: 4.0.2 - pkg-types: 2.1.0 + pkg-types: 2.2.0 scule: 1.3.0 strip-literal: 3.0.0 - tinyglobby: 0.2.12 - unplugin: 2.3.2 + tinyglobby: 0.2.14 + unplugin: 2.3.5 unplugin-utils: 0.2.4 unimport@5.1.0: @@ -14847,11 +16294,40 @@ snapshots: dependencies: normalize-path: 2.1.1 + unplugin-auto-import@19.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(@vueuse/core@13.5.0(vue@3.5.17(typescript@5.8.3))): + dependencies: + local-pkg: 1.1.1 + magic-string: 0.30.17 + picomatch: 4.0.2 + unimport: 4.2.0 + unplugin: 2.3.5 + unplugin-utils: 0.2.4 + optionalDependencies: + '@nuxt/kit': 3.17.6(magicast@0.3.5) + '@vueuse/core': 13.5.0(vue@3.5.17(typescript@5.8.3)) + unplugin-utils@0.2.4: dependencies: pathe: 2.0.3 picomatch: 4.0.2 + unplugin-vue-components@28.8.0(@babel/parser@7.28.0)(@nuxt/kit@3.17.6(magicast@0.3.5))(vue@3.5.17(typescript@5.8.3)): + dependencies: + chokidar: 3.6.0 + debug: 4.4.1 + local-pkg: 1.1.1 + magic-string: 0.30.17 + mlly: 1.7.4 + tinyglobby: 0.2.14 + unplugin: 2.3.5 + unplugin-utils: 0.2.4 + vue: 3.5.17(typescript@5.8.3) + optionalDependencies: + '@babel/parser': 7.28.0 + '@nuxt/kit': 3.17.6(magicast@0.3.5) + transitivePeerDependencies: + - supports-color + unplugin-vue-router@0.14.0(@vue/compiler-sfc@3.5.17)(vue-router@4.5.1(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3)): dependencies: '@vue-macros/common': 3.0.0-beta.15(vue@3.5.17(typescript@5.8.3)) @@ -14887,7 +16363,7 @@ snapshots: unplugin@2.3.5: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 picomatch: 4.0.2 webpack-virtual-modules: 0.6.2 @@ -14983,6 +16459,14 @@ snapshots: spdx-correct: 3.2.0 spdx-expression-parse: 3.0.1 + vaul-vue@0.4.1(reka-ui@2.3.1(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)))(vue@3.5.17(typescript@5.8.3)): + dependencies: + '@vueuse/core': 10.11.1(vue@3.5.17(typescript@5.8.3)) + reka-ui: 2.3.1(typescript@5.8.3)(vue@3.5.17(typescript@5.8.3)) + vue: 3.5.17(typescript@5.8.3) + transitivePeerDependencies: + - '@vue/composition-api' + vfile-location@5.0.3: dependencies: '@types/unist': 3.0.3 @@ -14998,41 +16482,41 @@ snapshots: '@types/unist': 3.0.3 vfile-message: 4.0.2 - vite-dev-rpc@1.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vite-dev-rpc@1.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: birpc: 2.4.0 - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-hot-client: 2.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-hot-client: 2.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) - vite-dev-rpc@1.1.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vite-dev-rpc@1.1.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: birpc: 2.4.0 - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-hot-client: 2.1.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-hot-client: 2.1.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) - vite-hot-client@2.0.4(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vite-hot-client@2.0.4(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) - vite-hot-client@2.0.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vite-hot-client@2.0.4(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) - vite-hot-client@2.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vite-hot-client@2.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) - vite-hot-client@2.1.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vite-hot-client@2.1.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) - vite-node@3.2.4(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0): + vite-node@3.2.4(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0): dependencies: cac: 6.7.14 debug: 4.4.1 es-module-lexer: 1.7.0 pathe: 2.0.3 - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) transitivePeerDependencies: - '@types/node' - jiti @@ -15047,7 +16531,7 @@ snapshots: - tsx - yaml - vite-plugin-checker@0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vite-plugin-checker@0.9.3(eslint@9.30.1(jiti@2.4.2))(optionator@0.9.4)(typescript@5.8.3)(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: '@babel/code-frame': 7.27.1 chokidar: 4.0.3 @@ -15057,14 +16541,14 @@ snapshots: strip-ansi: 7.1.0 tiny-invariant: 1.3.3 tinyglobby: 0.2.14 - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) vscode-uri: 3.1.0 optionalDependencies: eslint: 9.30.1(jiti@2.4.2) optionator: 0.9.4 typescript: 5.8.3 - vite-plugin-inspect@11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vite-plugin-inspect@11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: ansis: 4.1.0 debug: 4.4.1 @@ -15074,14 +16558,14 @@ snapshots: perfect-debounce: 1.0.0 sirv: 3.0.1 unplugin-utils: 0.2.4 - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-dev-rpc: 1.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-dev-rpc: 1.1.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) optionalDependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) transitivePeerDependencies: - supports-color - vite-plugin-inspect@11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vite-plugin-inspect@11.3.0(@nuxt/kit@3.17.6(magicast@0.3.5))(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: ansis: 4.1.0 debug: 4.4.1 @@ -15091,34 +16575,34 @@ snapshots: perfect-debounce: 1.0.0 sirv: 3.0.1 unplugin-utils: 0.2.4 - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-dev-rpc: 1.1.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-dev-rpc: 1.1.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) optionalDependencies: '@nuxt/kit': 3.17.6(magicast@0.3.5) transitivePeerDependencies: - supports-color - vite-plugin-vue-tracer@1.0.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)): + vite-plugin-vue-tracer@1.0.0(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.7 magic-string: 0.30.17 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) vue: 3.5.17(typescript@5.8.3) - vite-plugin-vue-tracer@1.0.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)): + vite-plugin-vue-tracer@1.0.0(vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0))(vue@3.5.17(typescript@5.8.3)): dependencies: estree-walker: 3.0.3 exsolve: 1.0.7 magic-string: 0.30.17 pathe: 2.0.3 source-map-js: 1.2.1 - vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) vue: 3.5.17(typescript@5.8.3) - vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0): + vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0): dependencies: esbuild: 0.25.3 fdir: 6.4.4(picomatch@4.0.2) @@ -15130,10 +16614,11 @@ snapshots: '@types/node': 22.14.1 fsevents: 2.3.3 jiti: 2.4.2 + lightningcss: 1.30.1 terser: 5.39.0 yaml: 2.8.0 - vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0): + vite@6.3.5(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0): dependencies: esbuild: 0.25.5 fdir: 6.4.4(picomatch@4.0.2) @@ -15145,12 +16630,13 @@ snapshots: '@types/node': 22.14.1 fsevents: 2.3.3 jiti: 2.4.2 + lightningcss: 1.30.1 terser: 5.39.0 yaml: 2.8.0 - vitest-environment-nuxt@1.0.1(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)): + vitest-environment-nuxt@1.0.1(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)): dependencies: - '@nuxt/test-utils': 3.19.2(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + '@nuxt/test-utils': 3.19.2(magicast@0.3.5)(typescript@5.8.3)(vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) transitivePeerDependencies: - '@cucumber/cucumber' - '@jest/globals' @@ -15165,11 +16651,11 @@ snapshots: - typescript - vitest - vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0): + vitest@3.2.4(@types/debug@4.1.12)(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0): dependencies: '@types/chai': 5.2.2 '@vitest/expect': 3.2.4 - '@vitest/mocker': 3.2.4(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0)) + '@vitest/mocker': 3.2.4(vite@6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0)) '@vitest/pretty-format': 3.2.4 '@vitest/runner': 3.2.4 '@vitest/snapshot': 3.2.4 @@ -15187,8 +16673,8 @@ snapshots: tinyglobby: 0.2.14 tinypool: 1.1.1 tinyrainbow: 2.0.0 - vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) - vite-node: 3.2.4(@types/node@22.14.1)(jiti@2.4.2)(terser@5.39.0)(yaml@2.8.0) + vite: 6.3.2(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) + vite-node: 3.2.4(@types/node@22.14.1)(jiti@2.4.2)(lightningcss@1.30.1)(terser@5.39.0)(yaml@2.8.0) why-is-node-running: 2.3.0 optionalDependencies: '@types/debug': 4.1.12 @@ -15222,27 +16708,31 @@ snapshots: optionalDependencies: typescript: 5.8.3 - vue-component-meta@3.0.0(typescript@5.8.3)(vue-component-type-helpers@2.2.10): + vue-component-meta@3.0.1(typescript@5.8.3)(vue-component-type-helpers@2.2.10): dependencies: - '@volar/typescript': 2.4.16 - '@vue/language-core': 3.0.0(typescript@5.8.3) + '@volar/typescript': 2.4.17 + '@vue/language-core': 3.0.1(typescript@5.8.3) path-browserify: 1.0.1 typescript: 5.8.3 vue-component-type-helpers: 2.2.10 vue-component-type-helpers@2.2.10: {} + vue-demi@0.14.10(vue@3.5.17(typescript@5.8.3)): + dependencies: + vue: 3.5.17(typescript@5.8.3) + vue-devtools-stub@0.1.0: {} vue-eslint-parser@10.2.0(eslint@9.30.1(jiti@2.4.2)): dependencies: - debug: 4.4.0 + debug: 4.4.1 eslint: 9.30.1(jiti@2.4.2) - eslint-scope: 8.3.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.6.0 - semver: 7.7.1 + semver: 7.7.2 transitivePeerDependencies: - supports-color @@ -15294,6 +16784,8 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 + wheel-gestures@2.2.48: {} + which-boxed-primitive@1.1.1: dependencies: is-bigint: 1.1.0 @@ -15468,12 +16960,16 @@ snapshots: compress-commons: 6.0.2 readable-stream: 4.7.0 - zod-to-json-schema@3.24.5(zod@3.25.67): + zod-to-json-schema@3.24.6(zod@3.25.67): dependencies: zod: 3.25.67 - zod@3.24.3: {} + zod-to-json-schema@3.24.6(zod@3.25.76): + dependencies: + zod: 3.25.76 zod@3.25.67: {} + zod@3.25.76: {} + zwitch@2.0.4: {} diff --git a/src/module.ts b/src/module.ts index 3dbb61b..dc1caaa 100644 --- a/src/module.ts +++ b/src/module.ts @@ -9,15 +9,14 @@ import { } from '@nuxt/kit' import { join } from 'pathe' import type { ComponentsDir, Component } from '@nuxt/schema' -import { metaPlugin } from './unplugin' -import type { ModuleOptions } from './options' -import { useComponentMetaParser } from './parser' -import type {ComponentMetaParser, ComponentMetaParserOptions} from './parser'; -import { loadExternalSources } from './loader' -import type { NuxtComponentMeta } from './types' +import { metaPlugin } from './utils/unplugin' +import { useComponentMetaParser } from './parser/meta-parser' +import type { ComponentMetaParser } from './parser/meta-parser'; +import { loadExternalSources } from './utils/loader' +import type { NuxtComponentMeta, ComponentMetaParserOptions, ModuleOptions } from './types/index' -export * from './options' -export type * from './types.d' +export * from './types/module' +export type * from './types/index' const slotReplacer = (_: unknown, _before: string, slotName: string, _rest: unknown) => `({ const isComponentIncluded = (component: any) => { if (!options?.globalsOnly) { return true } - if (component.global) { return true } return (options.include || []).find((excludeRule) => { @@ -146,7 +144,7 @@ export default defineNuxtModule({ let components: Component[] = [] let metaSources: NuxtComponentMeta = {} - const uiTemplatesPath = await tryResolveModule('@nuxt/ui-templates') + const uiTemplatesPath = await tryResolveModule('@nuxt/ui-templates', import.meta.url) nuxt.hook('components:dirs', (dirs) => { componentDirs = [ ...componentDirs, diff --git a/src/parser/index.ts b/src/parser/index.ts new file mode 100644 index 0000000..d0c36cc --- /dev/null +++ b/src/parser/index.ts @@ -0,0 +1,50 @@ +import { createCheckerByJson } from "vue-component-meta" +import type { ComponentMeta } from 'vue-component-meta' +import { refineMeta } from "./utils" +import { join } from "pathe" +import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs' + +export interface Options { + rootDir: string + cache?: boolean + cacheDir?: string +} + +export function getComponentMeta(component: string, options?: Options): ComponentMeta { + const rootDir = options?.rootDir ?? process.cwd() + const opts = { + cache: false, + rootDir, + cacheDir: join(rootDir, ".data/cache"), + ...options + } + const fullPath = join(opts.rootDir, component) + const cachePath = join(opts.cacheDir, `${component}.json`) + + if (opts.cache && existsSync(cachePath)) { + return JSON.parse(readFileSync(cachePath, { encoding: 'utf8', flag: 'r' })) as ComponentMeta + } + + const checker = createCheckerByJson( + opts.rootDir, + { + extends: `${opts.rootDir}/tsconfig.json`, + skipLibCheck: true, + include: [fullPath], + exclude: [] + }, + ) + + const meta = checker.getComponentMeta(component) + const refinedMeta = refineMeta(meta) + + if (opts.cache) { + const cache = JSON.stringify(refinedMeta, null, 2) + if (!existsSync(opts.cacheDir)) { + mkdirSync(opts.cacheDir, { recursive: true }) + } + writeFileSync(cachePath, cache, { encoding: 'utf8', flag: 'w' }) + } + + return refinedMeta +} diff --git a/src/parser.ts b/src/parser/meta-parser.ts similarity index 61% rename from src/parser.ts rename to src/parser/meta-parser.ts index 99de269..b975ea5 100644 --- a/src/parser.ts +++ b/src/parser/meta-parser.ts @@ -3,18 +3,12 @@ import fs, { existsSync } from 'fs' import { dirname, join, relative } from 'pathe' import { logger } from '@nuxt/kit' import { createCheckerByJson } from 'vue-component-meta' -import type { Component } from '@nuxt/schema' import { resolvePathSync } from 'mlly' import { hash } from 'ohash' -import type { ModuleOptions } from './options' -import type { NuxtComponentMeta } from './types' +import type { ComponentMetaParserOptions, NuxtComponentMeta } from '../types/parser' import { defu } from 'defu' -import { camelCase } from 'scule' +import { refineMeta } from './utils' -export type ComponentMetaParserOptions = Omit & { - components: Component[] - metaSources?: NuxtComponentMeta -} export function useComponentMetaParser ( { @@ -30,8 +24,6 @@ export function useComponentMetaParser ( metaSources = {} }: ComponentMetaParserOptions ) { - // const logger = consola.withScope('nuxt-component-meta') - /** * Initialize component data object from components */ @@ -138,9 +130,9 @@ export function useComponentMetaParser ( /** * Stub output file */ - const stubOutput = async () => { + const stubOutput = () => { if (existsSync(outputPath + '.mjs')) { return } - await updateOutput('export default {}') + updateOutput('export default {}') } /** @@ -199,49 +191,20 @@ export function useComponentMetaParser ( checker.updateFile(component.fullPath, code) } + const meta = checker.getComponentMeta(component.fullPath) - const { type, props, slots, events, exposed } = checker.getComponentMeta(component.fullPath) - - component.meta.hash = codeHash - component.meta.type = metaFields.type ? type : 0 - component.meta.slots = metaFields.slots ? slots : [] - component.meta.events = metaFields.events ? events : [] - component.meta.exposed = metaFields.exposed ? exposed : [] - - const eventProps = new Set(events.map(event => camelCase(`on_${event.name}`))) - component.meta.props = (metaFields.props ? props : []) - .filter((prop: any) => !prop.global && !eventProps.has(prop.name as string)) - .sort((a: { type: string, required: boolean }, b: { type: string, required: boolean }) => { - // sort required properties first - if (!a.required && b.required) { - return 1 - } - if (a.required && !b.required) { - return -1 - } - // then ensure boolean properties are sorted last - if (a.type === 'boolean' && b.type !== 'boolean') { - return 1 - } - if (a.type !== 'boolean' && b.type === 'boolean') { - return -1 - } - - return 0 - }) - - component.meta.props = component.meta.props.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true)) - component.meta.slots = component.meta.slots.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true)) - component.meta.exposed = component.meta.exposed.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true)) - component.meta.events = component.meta.events.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true)) + Object.assign( + component.meta, + refineMeta(meta, metaFields), + { + hash: codeHash + } + ) const extendComponentMetaMatch = code.match(/extendComponentMeta\((\{[\s\S]*?\})\)/); const extendedComponentMeta = extendComponentMetaMatch?.length ? eval(`(${extendComponentMetaMatch[1]})`) : null component.meta = defu(component.meta, extendedComponentMeta) - // Remove descriptional fileds to reduce chunk size - removeFields(component.meta, ['declarations']) - components[component.pascalName] = component } catch { if (debug) { @@ -250,6 +213,8 @@ export function useComponentMetaParser ( } const endTime = performance.now() if (debug === 2) { logger.success(`${component?.pascalName || component?.filePath || 'a component'} metas parsed in ${(endTime - startTime).toFixed(2)}ms`) } + + return components[component.pascalName] } /** @@ -286,73 +251,4 @@ export function useComponentMetaParser ( } } -function removeFields(obj: Record, fieldsToRemove: string[]): any { - // Check if the obj is an object or array, otherwise return it as-is - if (obj && typeof obj === 'object') { - // Handle the object and its children recursively - for (const key in obj) { - // If the key is in fieldsToRemove, delete it - if (fieldsToRemove.includes(key)) { - // eslint-disable-next-line @typescript-eslint/no-dynamic-delete - delete obj[key]; - } else if (typeof obj[key] === 'object') { - // If the value is an object (or array), recurse into it - removeFields(obj[key], fieldsToRemove); - } - } - } - return obj; -} - -function stripeTypeScriptInternalTypesSchema (type: any, topLevel: boolean = true): any { - if (!type) { - return type - } - - if (!topLevel && type.declarations && type.declarations.find((d: any) => d.file.includes('node_modules/typescript') || d.file.includes('@vue/runtime-core'))) { - return false - } - - if (Array.isArray(type)) { - return type.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, false)).filter(r => r !== false) - } - - if (Array.isArray(type.schema)) { - return { - ...type, - declarations: undefined, - schema: type.schema.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, false)).filter((r: any) => r !== false) - } - } - - if (!type.schema || typeof type.schema !== 'object') { - return typeof type === 'object' ? { ...type, declarations: undefined } : type - } - - const schema: any = {} - Object.keys(type.schema).forEach((sch) => { - if (sch === 'schema' && type.schema[sch]) { - schema[sch] = schema[sch] || {} - Object.keys(type.schema[sch]).forEach((sch2) => { - const res = stripeTypeScriptInternalTypesSchema(type.schema[sch][sch2], false) - if (res !== false) { - schema[sch][sch2] = res - } - }) - return - } - const res = stripeTypeScriptInternalTypesSchema(type.schema[sch], false) - - if (res !== false) { - schema[sch] = res - } - }) - - return { - ...type, - declarations: undefined, - schema - } -} - export type ComponentMetaParser = ReturnType diff --git a/src/parser/utils.ts b/src/parser/utils.ts new file mode 100644 index 0000000..b6700b3 --- /dev/null +++ b/src/parser/utils.ts @@ -0,0 +1,108 @@ +import { camelCase } from "scule" +import type { ComponentMeta } from 'vue-component-meta' + +export function refineMeta(meta: ComponentMeta, fields: Record = { type: true, props: true, slots: true, events: true, exposed: true }): ComponentMeta { + const eventProps = new Set(meta.events.map((event :any) => camelCase(`on_${event.name}`))) + const props = (fields.props ? meta.props : []) + .filter((prop: any) => !prop.global && !eventProps.has(prop.name as string)) + .sort((a: { type: string, required: boolean }, b: { type: string, required: boolean }) => { + // sort required properties first + if (!a.required && b.required) { + return 1 + } + if (a.required && !b.required) { + return -1 + } + // then ensure boolean properties are sorted last + if (a.type === 'boolean' && b.type !== 'boolean') { + return 1 + } + if (a.type !== 'boolean' && b.type === 'boolean') { + return -1 + } + + return 0 + }) + + const refinedMeta = { + type: meta.type, + props: props.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true)), + slots: (fields.slots ? meta.slots : []).map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true)), + exposed: (fields.exposed ? meta.exposed : []).map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true)), + events: (fields.events ? meta.events : []).map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, true)), + } + + // Remove descriptional fileds to reduce chunk size + removeFields(refinedMeta, ['declarations']) + + return refinedMeta +} + +function stripeTypeScriptInternalTypesSchema (type: any, topLevel: boolean = true): any { + if (!type) { + return type + } + + if (!topLevel && type.declarations && type.declarations.find((d: any) => d.file.includes('node_modules/typescript') || d.file.includes('@vue/runtime-core'))) { + return false + } + + if (Array.isArray(type)) { + return type.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, false)).filter(r => r !== false) + } + + if (Array.isArray(type.schema)) { + return { + ...type, + declarations: undefined, + schema: type.schema.map((sch: any) => stripeTypeScriptInternalTypesSchema(sch, false)).filter((r: any) => r !== false) + } + } + + if (!type.schema || typeof type.schema !== 'object') { + return typeof type === 'object' ? { ...type, declarations: undefined } : type + } + + const schema: any = {} + Object.keys(type.schema).forEach((sch) => { + if (sch === 'schema' && type.schema[sch]) { + schema[sch] = schema[sch] || {} + Object.keys(type.schema[sch]).forEach((sch2) => { + const res = stripeTypeScriptInternalTypesSchema(type.schema[sch][sch2], false) + if (res !== false) { + schema[sch][sch2] = res + } + }) + return + } + const res = stripeTypeScriptInternalTypesSchema(type.schema[sch], false) + + if (res !== false) { + schema[sch] = res + } + }) + + return { + ...type, + declarations: undefined, + schema + } +} + +function removeFields(obj: Record, fieldsToRemove: string[]): any { + // Check if the obj is an object or array, otherwise return it as-is + if (obj && typeof obj === 'object') { + // Handle the object and its children recursively + for (const key in obj) { + // If the key is in fieldsToRemove, delete it + if (fieldsToRemove.includes(key)) { + // eslint-disable-next-line @typescript-eslint/no-dynamic-delete + delete obj[key]; + } else if (typeof obj[key] === 'object') { + // If the value is an object (or array), recurse into it + removeFields(obj[key], fieldsToRemove); + } + } + } + return obj; +} diff --git a/src/types/index.ts b/src/types/index.ts new file mode 100644 index 0000000..c6d1bb6 --- /dev/null +++ b/src/types/index.ts @@ -0,0 +1,3 @@ +export * from './module' +export * from './parser' +export * from './schema' diff --git a/src/options.ts b/src/types/module.ts similarity index 98% rename from src/options.ts rename to src/types/module.ts index d06ad83..e41e181 100644 --- a/src/options.ts +++ b/src/types/module.ts @@ -1,6 +1,6 @@ import type { MetaCheckerOptions } from 'vue-component-meta' import type { ComponentsDir, ComponentsOptions } from '@nuxt/schema' -import type { TransformersHookData, ExtendHookData, NuxtComponentMeta } from './types' +import type { TransformersHookData, ExtendHookData, NuxtComponentMeta } from '.' export interface ModuleOptions { /** diff --git a/src/types.d.ts b/src/types/parser.ts similarity index 67% rename from src/types.d.ts rename to src/types/parser.ts index 2c8d260..87d1618 100644 --- a/src/types.d.ts +++ b/src/types/parser.ts @@ -1,8 +1,12 @@ import type { Component } from '@nuxt/schema' import type { ComponentMeta } from 'vue-component-meta' -import type { ComponentMetaParserOptions } from './parser' +import type { ModuleOptions } from './module' -export type ComponentData = Omit & { +export type ComponentMetaParserOptions = Omit & { + components: Component[] + metaSources?: NuxtComponentMeta +} +export type ComponentData = Omit & { meta: ComponentMeta fullPath?: string filePath?: string, @@ -22,4 +26,4 @@ export type ExtendHookData = ComponentMetaParserOptions /** * @deprecated Use TransformersHookData instead */ -export type HookData = TransformersHookData \ No newline at end of file +export type HookData = TransformersHookData diff --git a/src/types/schema.ts b/src/types/schema.ts new file mode 100644 index 0000000..1395306 --- /dev/null +++ b/src/types/schema.ts @@ -0,0 +1,9 @@ + +export interface JsonSchema { + type?: string + properties?: Record + required?: string[] + description?: string + default?: any + anyOf?: any[] +} \ No newline at end of file diff --git a/src/utils/index.ts b/src/utils/index.ts new file mode 100644 index 0000000..c79fffd --- /dev/null +++ b/src/utils/index.ts @@ -0,0 +1 @@ +export { propsToJsonSchema } from './schema' diff --git a/src/loader.ts b/src/utils/loader.ts similarity index 95% rename from src/loader.ts rename to src/utils/loader.ts index 6d5d70a..846c2a6 100644 --- a/src/loader.ts +++ b/src/utils/loader.ts @@ -3,7 +3,7 @@ import { createResolver, logger } from '@nuxt/kit' -import type { NuxtComponentMeta } from './types' +import type { NuxtComponentMeta } from '../types' // Resolve external components definitions export async function loadExternalSources (sources: (string | Partial)[] = []) { diff --git a/src/utils/schema.ts b/src/utils/schema.ts new file mode 100644 index 0000000..fcab19d --- /dev/null +++ b/src/utils/schema.ts @@ -0,0 +1,234 @@ +import type { ComponentMeta } from 'vue-component-meta' +import type { JsonSchema } from '../types/schema' + +/** + * Converts Vue component props metadata to JSON Schema format + * @param props Array of Vue component prop metadata + * @returns JSON Schema object + */ +export function propsToJsonSchema(props: ComponentMeta['props']): JsonSchema { + const schema: JsonSchema = { + type: 'object', + properties: {}, + required: [] + } + + for (const prop of props) { + const propSchema: any = {} + + // Add description (only if non-empty) + if (prop.description) { + propSchema.description = prop.description + } + + // Convert Vue prop type to JSON Schema type + const propType = convertVueTypeToJsonSchema(prop.type, prop.schema as any) + Object.assign(propSchema, propType) + + // Add default value if available and not already present, only for primitive types or for object with '{}' + if (prop.default !== undefined && propSchema.default === undefined) { + propSchema.default = parseDefaultValue(prop.default) + } + + // Add the property to the schema + schema.properties![prop.name] = propSchema + + // Add to required array if the prop is required + if (prop.required) { + schema.required!.push(prop.name) + } + } + + // Remove required array if empty + if (schema.required!.length === 0) { + delete schema.required + } + + return schema +} + +function convertVueTypeToJsonSchema(vueType: string, vueSchema: any): any { + // Handle 'any' type + if (vueType === 'any') { + return {} // JSON Schema allows any type when no type is specified + } + + // Handle union types (e.g., "string | undefined" or "{ foo: string } | undefined") + if (vueType.includes(' | ')) { + const types = vueType.split(' | ').map(t => t.trim()) + // Remove undefined and null from the union + const nonNullableTypes = types.filter(t => t !== 'undefined' && t !== 'null') + + if (nonNullableTypes.length === 1) { + // If only one non-nullable type, use it directly + // Special handling: if schema is an enum with numeric keys, extract the schema for the non-undefined type + if ( + vueSchema && + vueSchema.kind === 'enum' && + (vueSchema as any).schema && + typeof (vueSchema as any).schema === 'object' && + Object.keys((vueSchema as any).schema).every(k => !isNaN(Number(k))) + ) { + // Find the schema for the non-undefined type + const matching = Object.values((vueSchema as any).schema).find((s: any) => s.type === nonNullableTypes[0]) + if (matching) { + return convertVueTypeToJsonSchema(nonNullableTypes[0], matching.schema[0] || matching.schema) + } + } + return convertVueTypeToJsonSchema(nonNullableTypes[0], vueSchema) + } else if (nonNullableTypes.length > 1) { + // If multiple non-nullable types, use anyOf + return { + anyOf: nonNullableTypes.map(t => { + if ((t.toLowerCase() === 'object' || t.match(/^{.*}$/))) { + if (vueSchema && vueSchema.kind === 'enum' && (vueSchema as any).schema && typeof (vueSchema as any).schema === 'object') { + const matching = Object.values((vueSchema as any).schema).find((s: any) => s.type === t) + if (matching) { + return convertVueTypeToJsonSchema(t, matching.schema as any) + } + } + } + return convertVueTypeToJsonSchema(t, vueSchema as any) + }) + } + } + } + + // Handle object with nested schema + if ((vueType.toLowerCase() === 'object' || vueType.match(/^{.*}$/))) { + // Try to extract nested schema from various possible shapes + let nested: Record | undefined = undefined + const vs: any = vueSchema + if ( + vs && + typeof vs === 'object' && + !Array.isArray(vs) && + Object.prototype.hasOwnProperty.call(vs, 'schema') && +// @ts-ignore + vs['schema'] && + typeof vs['schema'] === 'object' + ) { +// @ts-ignore + nested = vs['schema'] as Record + } else if (vs && typeof vs === 'object' && !Array.isArray(vs)) { + nested = vs + } + if (nested) { + return { + type: 'object', + properties: convertNestedSchemaToJsonSchemaProperties(nested as Record), + additionalProperties: false + } + } + // Fallback to generic object + return { type: 'object' } + } + + // Handle array with nested object schema + if (vueType.endsWith('[]')) { + if (typeof vueSchema === 'string') { + return { + type: 'array', + items: convertSimpleType(vueSchema) + } + } + const itemProperties = convertNestedSchemaToJsonSchemaProperties(vueSchema.schema) + return { + type: 'array', + items: { + type: 'object', + properties: itemProperties, + required: Object.keys(itemProperties), + additionalProperties: false + } + } + } + + // Handle simple types + return convertSimpleType(vueType) +} + +function convertNestedSchemaToJsonSchemaProperties(nestedSchema: any): Record { + const properties: Record = {} + for (const key in nestedSchema) { + const prop = nestedSchema[key] + // Try to extract type and schema for each nested property + let type = 'any', schema = undefined, description = '', def = undefined + if (prop && typeof prop === 'object') { + type = prop.type || 'any' + schema = prop.schema || undefined + description = prop.description || '' + def = prop.default + } else if (typeof prop === 'string') { + type = prop + } + properties[key] = convertVueTypeToJsonSchema(type, schema) + // Only add description if non-empty + if (description) { + properties[key].description = description + } + // Only add default if not the default value for the type, except for object with def = {} + if (def !== undefined) { + if ( + (type === 'object' && typeof def === 'object' && !Array.isArray(def) && Object.keys(def).length === 0) || + (!(type === 'string' && def === '') && + !(type === 'number' && def === 0) && + !(type === 'boolean' && def === false) && + !(type === 'array' && Array.isArray(def) && def.length === 0)) + ) { + properties[key].default = def + } + } + } + return properties +} + +function convertSimpleType(type: string): any { + switch (type.toLowerCase()) { + case 'string': + return { type: 'string' } + case 'number': + return { type: 'number' } + case 'boolean': + return { type: 'boolean' } + case 'object': + return { type: 'object' } + case 'array': + return { type: 'array' } + case 'null': + return { type: 'null' } + default: + // For complex types, return object type as fallback + if (type.includes('{}') || type.includes('Object')) { + return { type: 'object' } + } + return {} // unknown types + } +} + +function parseDefaultValue(defaultValue: string): any { + try { + // Remove quotes if it's a string literal + if (defaultValue.startsWith('"') && defaultValue.endsWith('"')) { + return defaultValue.slice(1, -1) + } + + // Handle boolean literals + if (defaultValue === 'true') return true + if (defaultValue === 'false') return false + + // Handle numbers + if (/^-?\d+(\.\d+)?$/.test(defaultValue)) { + return parseFloat(defaultValue) + } + + // Handle objects and arrays + if (defaultValue.startsWith('{') || defaultValue.startsWith('[')) { + return JSON.parse(defaultValue) + } + + return defaultValue + } catch { + return defaultValue + } +} diff --git a/src/unplugin.ts b/src/utils/unplugin.ts similarity index 89% rename from src/unplugin.ts rename to src/utils/unplugin.ts index e2b81d6..3b1f2b7 100644 --- a/src/unplugin.ts +++ b/src/utils/unplugin.ts @@ -1,6 +1,6 @@ import { createUnplugin } from 'unplugin' -import { useComponentMetaParser } from './parser' -import type {ComponentMetaParser, ComponentMetaParserOptions} from './parser'; +import { useComponentMetaParser } from '../parser/meta-parser' +import type { ComponentMetaParser, ComponentMetaParserOptions } from '../parser/meta-parser'; type ComponentMetaUnpluginOptions = { parser?: ComponentMetaParser, parserOptions: ComponentMetaParserOptions } diff --git a/test/parser.test.ts b/test/parser.test.ts new file mode 100644 index 0000000..2470c9c --- /dev/null +++ b/test/parser.test.ts @@ -0,0 +1,139 @@ +import { describe, test, expect } from 'vitest' +import { getComponentMeta } from '../src/parser' +import { propsToJsonSchema } from '../src/utils' +import { jsonSchemaToZod } from 'json-schema-to-zod' + +describe('ComponentMetaParser', () => { + test('should be able to fetch component meta', async () => { + const meta = getComponentMeta('playground/components/TestComponent.vue') + + expect(meta).toBeDefined() + expect(meta.props).toBeDefined() + + const propsNames = meta.props.map(prop => prop.name) + expect(propsNames).toContain('foo') + expect(propsNames).toContain('hello') + expect(propsNames).toContain('booleanProp') + expect(propsNames).toContain('numberProp') + }) + + test('whole', async () => { + const meta = getComponentMeta('playground/components/TestComponent.vue') + const jsonSchema = propsToJsonSchema(meta.props) + const zod = jsonSchemaToZod(jsonSchema, { module: "cjs" }) + + const data = [ + { + match: true, + data: { + name: 'nuxt-component-meta', + foo: 'bar', + hello: 'world', + booleanProp: true, + numberProp: 42, + data: { + gello: "Gello" + } + } + }, + { + match: false, + data: { + name: 'nuxt-component-meta', + foo: 12, + hello: 'world', + booleanProp: true, + numberProp: 42, + data: { + gello: "Gello" + } + } + } + ] + + for (const item of data) { + const schema = eval(zod) + if (item.match) { + schema.parse(item.data) + } else { + expect(() => schema.parse(data)).toThrow() + } + } + }) + + test('propsToJsonSchema should convert props to JSON Schema format', async () => { + const meta = getComponentMeta('playground/components/TestComponent.vue') + const jsonSchema = propsToJsonSchema(meta.props) + expect(jsonSchema).toBeDefined() + expect(jsonSchema.type).toBe('object') + expect(jsonSchema.properties).toBeDefined() + + // Check that properties are correctly converted + expect(jsonSchema.properties?.foo).toEqual({ + type: 'string', + description: 'The foo property.', + default: 'Hello' + }) + + expect(jsonSchema.properties?.booleanProp).toEqual({ + type: 'boolean', + default: false + }) + + expect(jsonSchema.properties?.numberProp).toEqual({ + type: 'number', + default: 1.3 + }) + + expect(jsonSchema.properties?.data).toEqual({ + "type": "object", + "properties": { + "gello": { + "type": "string" + } + }, + "additionalProperties": false, + "default": {} + }) + + expect(jsonSchema.properties?.array).toEqual({ + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "age": { + "type": "number" + } + }, + "required": [ + "name", + "age" + ], + "additionalProperties": false + }, + "default": [] + }) + + expect(jsonSchema.properties?.stringArray).toEqual({ + "type": "array", + "items": { + "type": "string" + }, + "default": [] + }) + + expect(jsonSchema.properties?.numberArray).toEqual({ + "type": "array", + "items": { + "type": "number" + }, + "default": [] + }) + + // Since no props are required, the required array should not exist + expect(jsonSchema.required).toEqual(['name']) + }) +}) From a26a6af13c4f611654d880f2c18e5d9fe2e633ac Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Wed, 9 Jul 2025 11:52:27 +0200 Subject: [PATCH 2/5] use full path to fetch component --- src/parser/index.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/parser/index.ts b/src/parser/index.ts index d0c36cc..600abd0 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -3,6 +3,7 @@ import type { ComponentMeta } from 'vue-component-meta' import { refineMeta } from "./utils" import { join } from "pathe" import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs' +import { withBase } from "ufo" export interface Options { rootDir: string @@ -18,7 +19,7 @@ export function getComponentMeta(component: string, options?: Options): Componen cacheDir: join(rootDir, ".data/cache"), ...options } - const fullPath = join(opts.rootDir, component) + const fullPath = withBase(component, opts.rootDir) const cachePath = join(opts.cacheDir, `${component}.json`) if (opts.cache && existsSync(cachePath)) { @@ -35,7 +36,7 @@ export function getComponentMeta(component: string, options?: Options): Componen }, ) - const meta = checker.getComponentMeta(component) + const meta = checker.getComponentMeta(fullPath) const refinedMeta = refineMeta(meta) if (opts.cache) { From ff0edad98a9a10b9f4d4bc2d5f42edf358a52ac8 Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Thu, 10 Jul 2025 14:16:28 +0200 Subject: [PATCH 3/5] fix: props with type --- playground/components/TestD.vue | 19 +++ src/parser/index.ts | 4 +- src/utils/schema.ts | 208 ++++++++++++++++++++++---------- test/parser.test.ts | 28 ++++- 4 files changed, 188 insertions(+), 71 deletions(-) create mode 100644 playground/components/TestD.vue diff --git a/playground/components/TestD.vue b/playground/components/TestD.vue new file mode 100644 index 0000000..46cf5d8 --- /dev/null +++ b/playground/components/TestD.vue @@ -0,0 +1,19 @@ + + + diff --git a/src/parser/index.ts b/src/parser/index.ts index 600abd0..0a5acc2 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -1,7 +1,7 @@ import { createCheckerByJson } from "vue-component-meta" import type { ComponentMeta } from 'vue-component-meta' import { refineMeta } from "./utils" -import { join } from "pathe" +import { isAbsolute, join } from "pathe" import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs' import { withBase } from "ufo" @@ -19,7 +19,7 @@ export function getComponentMeta(component: string, options?: Options): Componen cacheDir: join(rootDir, ".data/cache"), ...options } - const fullPath = withBase(component, opts.rootDir) + const fullPath = isAbsolute(component) ? component : withBase(component, opts.rootDir) const cachePath = join(opts.cacheDir, `${component}.json`) if (opts.cache && existsSync(cachePath)) { diff --git a/src/utils/schema.ts b/src/utils/schema.ts index fcab19d..e8c9757 100644 --- a/src/utils/schema.ts +++ b/src/utils/schema.ts @@ -1,4 +1,4 @@ -import type { ComponentMeta } from 'vue-component-meta' +import type { ComponentMeta, PropertyMetaSchema } from 'vue-component-meta' import type { JsonSchema } from '../types/schema' /** @@ -47,105 +47,115 @@ export function propsToJsonSchema(props: ComponentMeta['props']): JsonSchema { return schema } -function convertVueTypeToJsonSchema(vueType: string, vueSchema: any): any { - // Handle 'any' type - if (vueType === 'any') { - return {} // JSON Schema allows any type when no type is specified +function convertVueTypeToJsonSchema(vueType: string, vueSchema: PropertyMetaSchema): any { + // Unwrap enums for optionals/unions + const { type: unwrappedType, schema: unwrappedSchema, enumValues } = unwrapEnumSchema(vueType, vueSchema) + if (enumValues && unwrappedType === 'boolean') { + return { type: 'boolean', enum: enumValues } } + // Handle array with nested object schema FIRST to avoid union logic for array types + if (unwrappedType.endsWith('[]')) { + const itemType = unwrappedType.replace(/\[\]$/, '').trim() + // If the schema is an object with kind: 'array' and schema is an array, use the first element as the item schema + // Example: { kind: 'array', type: 'string[]', schema: [ 'string' ] } + if ( + unwrappedSchema && + typeof unwrappedSchema === 'object' && + unwrappedSchema.kind === 'array' && + Array.isArray(unwrappedSchema.schema) && + unwrappedSchema.schema.length > 0 + ) { + const itemSchema = unwrappedSchema.schema[0] + return { + type: 'array', + items: convertVueTypeToJsonSchema(itemSchema.type || itemType, itemSchema) + } + } - // Handle union types (e.g., "string | undefined" or "{ foo: string } | undefined") - if (vueType.includes(' | ')) { - const types = vueType.split(' | ').map(t => t.trim()) - // Remove undefined and null from the union - const nonNullableTypes = types.filter(t => t !== 'undefined' && t !== 'null') - - if (nonNullableTypes.length === 1) { - // If only one non-nullable type, use it directly - // Special handling: if schema is an enum with numeric keys, extract the schema for the non-undefined type - if ( - vueSchema && - vueSchema.kind === 'enum' && - (vueSchema as any).schema && - typeof (vueSchema as any).schema === 'object' && - Object.keys((vueSchema as any).schema).every(k => !isNaN(Number(k))) - ) { - // Find the schema for the non-undefined type - const matching = Object.values((vueSchema as any).schema).find((s: any) => s.type === nonNullableTypes[0]) - if (matching) { - return convertVueTypeToJsonSchema(nonNullableTypes[0], matching.schema[0] || matching.schema) + // If the schema is an object with only key '0', treat its value as the item type/schema + // Example: { kind: 'array', type: 'string[]', schema: { '0': 'string' } } + if ( + unwrappedSchema && + typeof unwrappedSchema === 'object' && + 'schema' in unwrappedSchema && + (unwrappedSchema as any)['schema'] && + typeof (unwrappedSchema as any)['schema'] === 'object' && + !Array.isArray((unwrappedSchema as any)['schema']) && + Object.keys((unwrappedSchema as any)['schema']).length === 1 && + Object.keys((unwrappedSchema as any)['schema'])[0] === '0' + ) { + const itemSchema = (unwrappedSchema as any)['schema']['0'] + // If itemSchema is a string, treat as primitive + if (typeof itemSchema === 'string') { + return { + type: 'array', + items: convertSimpleType(itemSchema) } } - return convertVueTypeToJsonSchema(nonNullableTypes[0], vueSchema) - } else if (nonNullableTypes.length > 1) { - // If multiple non-nullable types, use anyOf - return { - anyOf: nonNullableTypes.map(t => { - if ((t.toLowerCase() === 'object' || t.match(/^{.*}$/))) { - if (vueSchema && vueSchema.kind === 'enum' && (vueSchema as any).schema && typeof (vueSchema as any).schema === 'object') { - const matching = Object.values((vueSchema as any).schema).find((s: any) => s.type === t) - if (matching) { - return convertVueTypeToJsonSchema(t, matching.schema as any) - } - } + // If itemSchema is an enum (for union types) + if (itemSchema && typeof itemSchema === 'object' && itemSchema.kind === 'enum' && Array.isArray((itemSchema as any)['schema'])) { + return { + type: 'array', + items: { + type: (itemSchema as any)['schema'].map((t: any) => typeof t === 'string' ? t : t.type) } - return convertVueTypeToJsonSchema(t, vueSchema as any) - }) + } + } + // Otherwise, recursively convert + return { + type: 'array', + items: convertVueTypeToJsonSchema(itemType, itemSchema) } } + // Fallback: treat as primitive + return { + type: 'array', + items: convertSimpleType(itemType) + } } // Handle object with nested schema - if ((vueType.toLowerCase() === 'object' || vueType.match(/^{.*}$/))) { + if ( + unwrappedType.toLowerCase() === 'object' || + unwrappedType.match(/^{.*}$/) || + (unwrappedSchema && typeof unwrappedSchema === 'object' && unwrappedSchema.kind === 'object') + ) { // Try to extract nested schema from various possible shapes let nested: Record | undefined = undefined - const vs: any = vueSchema + const vs: any = unwrappedSchema if ( vs && typeof vs === 'object' && !Array.isArray(vs) && Object.prototype.hasOwnProperty.call(vs, 'schema') && -// @ts-ignore vs['schema'] && typeof vs['schema'] === 'object' ) { -// @ts-ignore nested = vs['schema'] as Record } else if (vs && typeof vs === 'object' && !Array.isArray(vs)) { nested = vs } if (nested) { - return { + const properties = convertNestedSchemaToJsonSchemaProperties(nested as Record) + // Collect required fields + const required = Object.entries(nested) + .filter(([_, v]) => v && typeof v === 'object' && v.required) + .map(([k]) => k) + const schemaObj: any = { type: 'object', - properties: convertNestedSchemaToJsonSchemaProperties(nested as Record), + properties, additionalProperties: false } + if (required.length > 0) { + schemaObj.required = required + } + return schemaObj } // Fallback to generic object return { type: 'object' } } - - // Handle array with nested object schema - if (vueType.endsWith('[]')) { - if (typeof vueSchema === 'string') { - return { - type: 'array', - items: convertSimpleType(vueSchema) - } - } - const itemProperties = convertNestedSchemaToJsonSchemaProperties(vueSchema.schema) - return { - type: 'array', - items: { - type: 'object', - properties: itemProperties, - required: Object.keys(itemProperties), - additionalProperties: false - } - } - } - // Handle simple types - return convertSimpleType(vueType) + return convertSimpleType(unwrappedType) } function convertNestedSchemaToJsonSchemaProperties(nestedSchema: any): Record { @@ -232,3 +242,67 @@ function parseDefaultValue(defaultValue: string): any { return defaultValue } } + +/** + * Here are some examples of vueSchema: + * + * ``` + * { + * kind: 'enum', + * type: 'string | undefined', // <-- vueType + * schema: { '0': 'undefined', '1': 'string' } + * } + * ``` + * ``` + * { + * kind: 'enum', + * type: '{ hello: string; } | undefined', // <-- vueType + * schema: { + * '0': 'undefined', + * '1': { kind: 'object', type: '{ hello: string; }', schema: [...] } + * } + * } + * ``` + * + * + */ +function unwrapEnumSchema(vueType: string, vueSchema: PropertyMetaSchema): { type: string, schema: any, enumValues?: any[] } { + // If schema is an enum with undefined, unwrap to the defined type + if ( + typeof vueSchema === 'object' && + vueSchema?.kind === 'enum' && + vueSchema?.schema && typeof vueSchema?.schema === 'object' + ) { + // Collect all non-undefined values + const values = Object.values(vueSchema.schema).filter(v => v !== 'undefined') + // Special handling for boolean enums + if (values.every(v => v === 'true' || v === 'false')) { + // If both true and false, it's a boolean + if (values.length === 2) { + return { type: 'boolean', schema: undefined } + } else if (values.length === 1) { + // Only one value, still boolean but with enum + return { type: 'boolean', schema: undefined, enumValues: [values[0] === 'true'] } + } + } + // If only one non-undefined value, unwrap it + if (values.length === 1) { + const s = values[0] + let t = vueType + if (typeof s === 'object' && s.type) t = s.type + else if (typeof s === 'string') t = s + return { type: t, schema: s } + } + // Otherwise, fallback to first non-undefined + for (const s of values) { + if (s !== 'undefined') { + let t = vueType + if (typeof s === 'object' && s.type) t = s.type + else if (typeof s === 'string') t = s + return { type: t, schema: s } + } + } + } + + return { type: vueType, schema: vueSchema } +} \ No newline at end of file diff --git a/test/parser.test.ts b/test/parser.test.ts index 2470c9c..5d3644c 100644 --- a/test/parser.test.ts +++ b/test/parser.test.ts @@ -1,6 +1,6 @@ import { describe, test, expect } from 'vitest' import { getComponentMeta } from '../src/parser' -import { propsToJsonSchema } from '../src/utils' +import { propsToJsonSchema } from '../src/utils/schema' import { jsonSchemaToZod } from 'json-schema-to-zod' describe('ComponentMetaParser', () => { @@ -93,7 +93,8 @@ describe('ComponentMetaParser', () => { } }, "additionalProperties": false, - "default": {} + "default": {}, + "required": ["gello"] }) expect(jsonSchema.properties?.array).toEqual({ @@ -136,4 +137,27 @@ describe('ComponentMetaParser', () => { // Since no props are required, the required array should not exist expect(jsonSchema.required).toEqual(['name']) }) + + test('manual', () => { + const meta = getComponentMeta('playground/components/TestD.vue') + const result = propsToJsonSchema(meta.props) + + expect(result.properties?.foo).toEqual({ + description: "FOOOOOO", + "type": "array", + "items": { + "type": "string" + } + }) + + expect(result.properties?.bar).toEqual({ + "type": "array", + "items": { + "type": [ + "string", + "number" + ] + } + }) + }) }) From 24bf91d3ae3564ec0f7b9140e31dbad443df430a Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Fri, 11 Jul 2025 13:21:58 +0200 Subject: [PATCH 4/5] fix: cache --- src/parser/index.ts | 23 ++++++++++++++---- test/get-component-meta.test.ts | 41 +++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 5 deletions(-) create mode 100644 test/get-component-meta.test.ts diff --git a/src/parser/index.ts b/src/parser/index.ts index 0a5acc2..143b102 100644 --- a/src/parser/index.ts +++ b/src/parser/index.ts @@ -4,6 +4,7 @@ import { refineMeta } from "./utils" import { isAbsolute, join } from "pathe" import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'fs' import { withBase } from "ufo" +import { hash } from "crypto" export interface Options { rootDir: string @@ -16,14 +17,23 @@ export function getComponentMeta(component: string, options?: Options): Componen const opts = { cache: false, rootDir, - cacheDir: join(rootDir, ".data/cache"), + cacheDir: join(rootDir, ".data/nuxt-component-meta"), ...options } const fullPath = isAbsolute(component) ? component : withBase(component, opts.rootDir) - const cachePath = join(opts.cacheDir, `${component}.json`) + let cachePath = join(opts.cacheDir, `${component}.json`) + if (opts.cache) { + try { + const content = readFileSync(fullPath, { encoding: 'utf8', flag: 'r' }) + const cacheId = component.split('/').pop()?.replace(/\./g, '_') + '-' + hash('sha1', content).slice(0, 12) + cachePath = join(opts.cacheDir, `${cacheId}.json`) + } catch (error) { + throw new Error(`Error reading file ${fullPath}: ${error}`) + } - if (opts.cache && existsSync(cachePath)) { - return JSON.parse(readFileSync(cachePath, { encoding: 'utf8', flag: 'r' })) as ComponentMeta + if (existsSync(cachePath)) { + return JSON.parse(readFileSync(cachePath, { encoding: 'utf8', flag: 'r' })) as ComponentMeta + } } const checker = createCheckerByJson( @@ -40,7 +50,10 @@ export function getComponentMeta(component: string, options?: Options): Componen const refinedMeta = refineMeta(meta) if (opts.cache) { - const cache = JSON.stringify(refinedMeta, null, 2) + const cache = JSON.stringify({ + cachedAt: Date.now(), + ...refinedMeta, + }) if (!existsSync(opts.cacheDir)) { mkdirSync(opts.cacheDir, { recursive: true }) } diff --git a/test/get-component-meta.test.ts b/test/get-component-meta.test.ts new file mode 100644 index 0000000..61b0d7b --- /dev/null +++ b/test/get-component-meta.test.ts @@ -0,0 +1,41 @@ +import { beforeAll, describe, expect, test } from "vitest"; +import { getComponentMeta } from "../src/parser"; +import { join } from "path"; +import { rmSync } from "fs"; + +describe("get-component-meta", () => { + const rootDir = join(__dirname, "./fixtures/basic") + beforeAll(() => { + try { + rmSync(join(rootDir, '.data/nuxt-component-meta'), { recursive: true }) + } catch { + // Ignore + } + }) + + test("parse NormalScript fresh parse", () => { + const meta = getComponentMeta("components/NormalScript.vue", { + rootDir, + }) + expect(meta.props.length).toEqual(4); + expect((meta as unknown as Record).cachedAt).toBeUndefined(); + }); + + test("parse NormalScript fresh parse (cache enabled)", () => { + const meta = getComponentMeta("components/NormalScript.vue", { + rootDir, + cache: true + }) + expect(meta.props.length).toEqual(4); + expect((meta as unknown as Record).cachedAt).toBeUndefined(); + }); + + test("parse NormalScript cached", () => { + const meta = getComponentMeta("components/NormalScript.vue", { + rootDir, + cache: true + }) + expect(meta.props.length).toEqual(4); + expect((meta as unknown as Record).cachedAt).toBeDefined(); + }); +}); From 51c492edd8456685c01e1f5d9b2ba9cb5c8bebfe Mon Sep 17 00:00:00 2001 From: Farnabaz Date: Fri, 11 Jul 2025 13:39:20 +0200 Subject: [PATCH 5/5] test: increase timeout --- test/get-component-meta.test.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/test/get-component-meta.test.ts b/test/get-component-meta.test.ts index 61b0d7b..053a6ae 100644 --- a/test/get-component-meta.test.ts +++ b/test/get-component-meta.test.ts @@ -13,7 +13,7 @@ describe("get-component-meta", () => { } }) - test("parse NormalScript fresh parse", () => { + test("parse NormalScript fresh parse", { timeout: 10000 }, () => { const meta = getComponentMeta("components/NormalScript.vue", { rootDir, }) @@ -21,7 +21,7 @@ describe("get-component-meta", () => { expect((meta as unknown as Record).cachedAt).toBeUndefined(); }); - test("parse NormalScript fresh parse (cache enabled)", () => { + test("parse NormalScript fresh parse (cache enabled)", { timeout: 10000 }, () => { const meta = getComponentMeta("components/NormalScript.vue", { rootDir, cache: true @@ -30,7 +30,7 @@ describe("get-component-meta", () => { expect((meta as unknown as Record).cachedAt).toBeUndefined(); }); - test("parse NormalScript cached", () => { + test("parse NormalScript cached", { timeout: 10000 }, () => { const meta = getComponentMeta("components/NormalScript.vue", { rootDir, cache: true