diff --git a/configuration.d.ts b/configuration.d.ts deleted file mode 100644 index 3826149..0000000 --- a/configuration.d.ts +++ /dev/null @@ -1,27 +0,0 @@ -declare module '#build/vuetify/configuration.mjs' { - import type { VuetifyOptions } from 'vuetify' - - export type { VuetifyOptions } - export function vuetifyConfiguration(): VuetifyOptions -} - -declare module '#build/vuetify/ssr-client-hints-configuration.mjs' { - export interface SSRClientHintsConfiguration { - reloadOnFirstRequest: boolean - viewportSize: boolean - prefersColorScheme: boolean - prefersReducedMotion: boolean - clientWidth?: number - clientHeight?: number - prefersColorSchemeOptions?: { - baseUrl: string - defaultTheme: string - themeNames: string[] - cookieName: string - darkThemeName: string - lightThemeName: string - useBrowserThemeOnly: boolean - } - } - export const ssrClientHintsConfiguration: SSRClientHintsConfiguration -} diff --git a/labs-rules-configuration.d.ts b/labs-rules-configuration.d.ts deleted file mode 100644 index c150e0f..0000000 --- a/labs-rules-configuration.d.ts +++ /dev/null @@ -1,7 +0,0 @@ -declare module '#build/vuetify/labs-rules-configuration.mjs' { - import type { RulesOptions } from 'vuetify/labs/rules' - - export type { RulesOptions } - - export const rulesOptions: RulesOptions -} diff --git a/package.json b/package.json index a18d18d..5c3a677 100644 --- a/package.json +++ b/package.json @@ -10,13 +10,7 @@ "types": "./dist/types.d.mts", "import": "./dist/module.mjs" }, - "./configuration": { - "types": "./configuration.d.ts" - }, "./custom-configuration": "./custom-configuration.js", - "./labs-rules-configuration": { - "types": "./labs-rules-configuration.d.ts" - }, "./custom-labs-rules-configuration": "./custom-labs-rules-configuration.js" }, "main": "./dist/module.mjs", @@ -29,10 +23,8 @@ }, "files": [ "dist", - "configuration.d.ts", "custom-configuration.js", "custom-configuration.d.ts", - "labs-rules-configuration.d.ts", "custom-labs-rules-configuration.js", "custom-labs-rules-configuration.d.ts" ], @@ -40,19 +32,25 @@ "prepack": "nuxt-module-build build", "dev": "pnpm dev:prepare && cd playground && pnpm dev", "dev:build": "cd playground && pnpm build", + "dev:run:node": "cd playground && node .output/server/index.mjs", "dev:prepare": "nuxt-module-build build --stub && nuxt-module-build prepare && cd playground && pnpm prepare", "release": "pnpm lint && pnpm test && pnpm prepack && changelogen --release && npm publish && git push --follow-tags", "lint": "eslint .", "test": "vitest run", "test:watch": "vitest watch", - "test:types": "vue-tsc --noEmit && cd playground && vue-tsc --noEmit" + "test:types": "vue-tsc --noEmit && cd playground && vue-tsc --noEmit", + "node-test": "node ./test.ts" }, "peerDependencies": { - "@unvuetify/nuxt-i18n-utils": "^1.0.0" + "@unvuetify/nuxt-i18n-utils": "^1.0.0", + "tsdown": "^0.15.6" }, "peerDependenciesMeta": { "@unvuetify/nuxt-i18n-utils": { "optional": true + }, + "tsdown": { + "optional": true } }, "dependencies": { @@ -63,12 +61,14 @@ "vuetify": "^3.9.0" }, "devDependencies": { + "@iconify-json/mdi": "^1.2.3", "@nuxt/devtools": "^2.6.3", "@nuxt/eslint-config": "^1.9.0", "@nuxt/module-builder": "^1.0.2", "@nuxt/schema": "^4.1.2", "@nuxt/test-utils": "^3.19.2", "@types/node": "latest", + "@unocss/nuxt": "^66.5.2", "changelogen": "^0.6.2", "eslint": "^9.35.0", "nuxt": "^4.1.2", @@ -89,6 +89,7 @@ "resolutions": { "@unvuetify/nuxt-i18n-utils": "https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008", "@unvuetify/nuxt-utils": "https://pkg.pr.new/@unvuetify/nuxt-utils@a348008", - "vuetify": "^3.10.2" + "tsdown": "^0.15.6", + "vuetify": "file:vuetify-3.10.4.tgz" } } diff --git a/playground/layers/rules1/vuetify.rules.ts b/playground/layers/rules1/vuetify.rules.ts index a75cdab..7a8fee2 100644 --- a/playground/layers/rules1/vuetify.rules.ts +++ b/playground/layers/rules1/vuetify.rules.ts @@ -1,14 +1,17 @@ // import type { ExternalLabsRulesOptions } from 'vuetify-nuxt-module/custom-labs-rules-configuration' import { defineVuetifyLabsRulesConfiguration } from 'vuetify-nuxt-module/custom-labs-rules-configuration' -// import type { ValidationRuleBuilderWithoutOptions } from 'vuetify/labs/rules' +import type { ValidationRuleBuilderWithoutOptions } from 'vuetify/labs/rules' import { pinCode2 } from './vuetify-rules' -// export const pinCode: ValidationRuleBuilderWithoutOptions = (err) => { -// return v => (/^\d{4}$/.test(v)) || err || 'Field must contain a 4-digit PIN' -// } +const pinCode: ValidationRuleBuilderWithoutOptions = (err) => { + return v => (/^\d{4}$/.test(v)) || err || 'Field must contain a 4-digit PIN' +} +// const pinCode3 = { x: 2 } satisfies { x: number } +// const pinCode4 = { x: 2 } as const export default defineVuetifyLabsRulesConfiguration({ config: true, aliases: { + pinCode, pinCode2, }, }) diff --git a/playground/modules/rules1/index.ts b/playground/modules/rules1/index.ts deleted file mode 100644 index 640ce79..0000000 --- a/playground/modules/rules1/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { defineNuxtModule } from '@nuxt/kit' - -export default defineNuxtModule({ - setup() { - }, -}) diff --git a/playground/modules/rules1/vuetify.rules.ts b/playground/modules/rules1/vuetify.rules.ts deleted file mode 100644 index 2a5cb6e..0000000 --- a/playground/modules/rules1/vuetify.rules.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { ExternalLabsRulesOptions } from 'vuetify-nuxt-module/custom-labs-rules-configuration' -// import { defineVuetifyLabsRulesConfiguration } from 'vuetify-nuxt-module/custom-labs-rules-configuration' -import type { ValidationRuleBuilderWithoutOptions } from 'vuetify/labs/rules' - -export const pinCode: ValidationRuleBuilderWithoutOptions = (err) => { - return v => (/^\d{4}$/.test(v)) || err || 'Field must contain a 4-digit PIN' -} - -export default { - config: true, - aliases: { - pinCode, - }, -} satisfies ExternalLabsRulesOptions diff --git a/playground/nuxt.config.ts b/playground/nuxt.config.ts index 0f2073d..1dcda73 100644 --- a/playground/nuxt.config.ts +++ b/playground/nuxt.config.ts @@ -2,7 +2,7 @@ import { VuetifyComposables } from '@unvuetify/unimport-presets' export default defineNuxtConfig({ // extends: ['./layers/rules1'], - modules: ['@nuxtjs/i18n', '../src/module'], + modules: ['@unocss/nuxt', '@nuxtjs/i18n', '../src/module'], ssr: true, imports: { imports: [VuetifyComposables({})], @@ -17,6 +17,7 @@ export default defineNuxtConfig({ features: { devLogs: true, }, + compatibilityDate: '2025-10-04', nitro: { esbuild: { options: { @@ -58,6 +59,9 @@ export default defineNuxtConfig({ }, viewportSize: true, }, + experimental: { + tsdown: true, + }, }, enableVuetifyRules: true, }, diff --git a/playground/package.json b/playground/package.json index c0892e4..8e71a49 100644 --- a/playground/package.json +++ b/playground/package.json @@ -10,10 +10,15 @@ }, "dependencies": { "@nuxtjs/i18n": "^10.1.0", + "@unocss/nuxt": "^66.5.2", "@unvuetify/nuxt-i18n-utils": "https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008", "@unvuetify/nuxt-utils": "https://pkg.pr.new/@unvuetify/nuxt-utils@a348008", "nuxt": "^4.1.2", "vuetify": "^3.10.2", "vuetify-nuxt-module": "workspace:*" + }, + "devDependencies": { + "@iconify-json/mdi": "^1.2.3", + "typescript": "~5.9.2" } } diff --git a/playground/plugins/vuetify.ts b/playground/plugins/vuetify.ts index 05b4f7d..61723e1 100644 --- a/playground/plugins/vuetify.ts +++ b/playground/plugins/vuetify.ts @@ -1,3 +1,5 @@ +import { vuetifyConfiguration } from '#build/vuetify/configuration.mjs' + export default defineNuxtPlugin((nuxtApp) => { nuxtApp.hook('vuetify:before-create', ({ vuetifyOptions }) => { console.log('vuetify:before-create', vuetifyOptions.theme) diff --git a/playground/unocss.config.ts b/playground/unocss.config.ts new file mode 100644 index 0000000..3a81948 --- /dev/null +++ b/playground/unocss.config.ts @@ -0,0 +1,10 @@ +import { defineConfig, presetIcons, presetWind3 } from 'unocss' + +export default defineConfig({ + presets: [ + presetWind3(), + presetIcons({ + scale: 1.2, + }), + ], +}) diff --git a/playground/vuetify.config.ts b/playground/vuetify.config.ts index 5a3c59a..0489f2d 100644 --- a/playground/vuetify.config.ts +++ b/playground/vuetify.config.ts @@ -1,4 +1,5 @@ -// import { aliases, defaultSet, unocss } from '#build/vuetify/iconsets/unocss' +import { aliases, defaultSet, unocss } from '#build/vuetify/iconsets/unocss.mjs' +import { aliases as mdiAliases, mdi } from 'vuetify/iconsets/mdi' // import LuxonAdapter from '@date-io/luxon' import { defineVuetifyConfiguration } from 'vuetify-nuxt-module/custom-configuration' // import * as bp from 'vuetify/blueprints' @@ -22,11 +23,17 @@ export default defineVuetifyConfiguration({ // date: { // adapter: LuxonAdapter, // }, - // icons: { - // defaultSet, - // sets: { unocss }, - // aliases, - // }, + icons: { + defaultSet, + sets: { unocss }, + aliases, + }, + /* icons: { + defaultSet: 'mdi', + sets: { mdi }, + aliases: mdiAliases, + }, + fontIcons: [['mdi']], */ blueprint: /* bp. */md3, theme, /* theme: { diff --git a/playground/vuetify.ts b/playground/vuetify.ts index 265db93..55c5b9c 100644 --- a/playground/vuetify.ts +++ b/playground/vuetify.ts @@ -10,6 +10,7 @@ const theme: VuetifyOptions['theme'] = { dark: true, }, }, + variations: false, } export { theme } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ffcda27..ef34919 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,7 +7,8 @@ settings: overrides: '@unvuetify/nuxt-i18n-utils': https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008 '@unvuetify/nuxt-utils': https://pkg.pr.new/@unvuetify/nuxt-utils@a348008 - vuetify: ^3.10.2 + tsdown: ^0.15.6 + vuetify: file:vuetify-3.10.4.tgz importers: @@ -18,20 +19,26 @@ importers: version: 4.1.2(magicast@0.3.5) '@unvuetify/nuxt-i18n-utils': specifier: https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008 - version: https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008(@nuxt/schema@4.1.2)(@nuxtjs/i18n@10.1.0(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2)))(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + version: https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008(@nuxt/schema@4.1.2)(@nuxtjs/i18n@10.1.0(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2)))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) '@unvuetify/nuxt-utils': specifier: https://pkg.pr.new/@unvuetify/nuxt-utils@a348008 - version: https://pkg.pr.new/@unvuetify/nuxt-utils@a348008(unimport@5.3.0)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + version: https://pkg.pr.new/@unvuetify/nuxt-utils@a348008(unimport@5.3.0)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) local-pkg: specifier: ^1.1.2 version: 1.1.2 magicast: specifier: ^0.3.5 version: 0.3.5 + tsdown: + specifier: ^0.15.6 + version: 0.15.6(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2)) vuetify: - specifier: ^3.10.2 - version: 3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + specifier: file:vuetify-3.10.4.tgz + version: file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) devDependencies: + '@iconify-json/mdi': + specifier: ^1.2.3 + version: 1.2.3 '@nuxt/devtools': specifier: ^2.6.3 version: 2.6.5(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) @@ -50,6 +57,9 @@ importers: '@types/node': specifier: latest version: 24.5.2 + '@unocss/nuxt': + specifier: ^66.5.2 + version: 66.5.2(magicast@0.3.5)(postcss@8.5.6)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.102.0(esbuild@0.25.10)) changelogen: specifier: ^0.6.2 version: 0.6.2(magicast@0.3.5) @@ -58,7 +68,7 @@ importers: version: 9.36.0(jiti@2.5.1) nuxt: specifier: ^4.1.2 - version: 4.1.2(@parcel/watcher@2.5.1)(@types/node@24.5.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2))(yaml@2.8.1) + version: 4.1.2(@parcel/watcher@2.5.1)(@types/node@24.5.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.41)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2))(yaml@2.8.1) typescript: specifier: ~5.9.2 version: 5.9.2 @@ -74,27 +84,40 @@ importers: '@nuxtjs/i18n': specifier: ^10.1.0 version: 10.1.0(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2)) + '@unocss/nuxt': + specifier: ^66.5.2 + version: 66.5.2(magicast@0.3.5)(postcss@8.5.6)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.102.0(esbuild@0.25.10)) '@unvuetify/nuxt-i18n-utils': specifier: https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008 - version: https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008(@nuxt/schema@4.1.2)(@nuxtjs/i18n@10.1.0(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2)))(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + version: https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008(@nuxt/schema@4.1.2)(@nuxtjs/i18n@10.1.0(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2)))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) '@unvuetify/nuxt-utils': specifier: https://pkg.pr.new/@unvuetify/nuxt-utils@a348008 - version: https://pkg.pr.new/@unvuetify/nuxt-utils@a348008(unimport@5.3.0)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + version: https://pkg.pr.new/@unvuetify/nuxt-utils@a348008(unimport@5.3.0)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) nuxt: specifier: ^4.1.2 - version: 4.1.2(@parcel/watcher@2.5.1)(@types/node@24.5.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2))(yaml@2.8.1) + version: 4.1.2(@parcel/watcher@2.5.1)(@types/node@24.6.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.41)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2))(yaml@2.8.1) vuetify: - specifier: ^3.10.2 - version: 3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + specifier: file:../vuetify-3.10.4.tgz + version: file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) vuetify-nuxt-module: specifier: workspace:* version: link:.. + devDependencies: + '@iconify-json/mdi': + specifier: ^1.2.3 + version: 1.2.3 + typescript: + specifier: ~5.9.2 + version: 5.9.2 packages: '@antfu/install-pkg@1.1.0': resolution: {integrity: sha512-MGQsmw10ZyI+EJo45CdSER4zEb+p31LpDAFp2Z3gkSd1yqVZGi0Ebx++YTEMonJy4oChEMLsxZ64j8FH6sSqtQ==} + '@antfu/utils@9.2.1': + resolution: {integrity: sha512-TMilPqXyii1AsiEii6l6ubRzbo76p6oshUSYPaKsmXDavyMLqjzVDkcp3pHp5ELMUNJHATcEOGxKTTsX9yYhGg==} + '@babel/code-frame@7.27.1': resolution: {integrity: sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==} engines: {node: '>=6.9.0'} @@ -177,6 +200,11 @@ packages: resolution: {integrity: sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w==} engines: {node: '>=6.9.0'} + '@babel/parser@7.27.7': + resolution: {integrity: sha512-qnzXzDXdr/po3bOTbTIQZ7+TxNKxpkN5IifVLXS+r7qwynkZfPyjZfE7hCXbo7IoO9TNcSyibgONsf2HauUd3Q==} + engines: {node: '>=6.0.0'} + hasBin: true + '@babel/parser@7.28.4': resolution: {integrity: sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==} engines: {node: '>=6.0.0'} @@ -204,6 +232,10 @@ packages: resolution: {integrity: sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==} engines: {node: '>=6.9.0'} + '@babel/traverse@7.27.7': + resolution: {integrity: sha512-X6ZlfR/O/s5EQ/SnUSLzr+6kGnkg8HXGMzpgsMsrJVcfDtH1vIp6ctCN4eZ1LS5c0+te5Cb6Y514fASjMRJ1nw==} + engines: {node: '>=6.9.0'} + '@babel/traverse@7.28.4': resolution: {integrity: sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ==} engines: {node: '>=6.9.0'} @@ -454,6 +486,15 @@ packages: resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} engines: {node: '>=18.18'} + '@iconify-json/mdi@1.2.3': + resolution: {integrity: sha512-O3cLwbDOK7NNDf2ihaQOH5F9JglnulNDFV7WprU2dSoZu3h3cWH//h74uQAB87brHmvFVxIOkuBX2sZSzYhScg==} + + '@iconify/types@2.0.0': + resolution: {integrity: sha512-+wluvCrRhXrhyOmRDJ3q8mux9JkKy5SJ/v8ol2tu4FVjyYvtEzkc/3pK15ET6RKg4b4w4BmTk1+gsCUhf21Ykg==} + + '@iconify/utils@3.0.2': + resolution: {integrity: sha512-EfJS0rLfVuRuJRn4psJHtK2A9TqVnkxPpHY6lYHiB9+8eSuudsxbwMiavocG45ujOo6FJ+CIRlRnlOGinzkaGQ==} + '@intlify/bundle-utils@11.0.1': resolution: {integrity: sha512-5l10G5wE2cQRsZMS9y0oSFMOLW5IG/SgbkIUltqnwF1EMRrRbUAHFiPabXdGTHeexCsMTcxj/1w9i0rzjJU9IQ==} engines: {node: '>= 20'} @@ -974,6 +1015,9 @@ packages: '@oxc-project/types@0.87.0': resolution: {integrity: sha512-ipZFWVGE9fADBVXXWJWY/cxpysc41Gt5upKDeb32F6WMgFyO7XETUMVq8UuREKCih+Km5E6p2VhEvf6Fuhey6g==} + '@oxc-project/types@0.93.0': + resolution: {integrity: sha512-yNtwmWZIBtJsMr5TEfoZFDxIWV6OdScOpza/f5YxbqUMJk+j6QX3Cf3jgZShGEFYWQJ5j9mJ6jM0tZHu2J9Yrg==} + '@oxc-transform/binding-android-arm64@0.81.0': resolution: {integrity: sha512-Lli18mT/TaUsQSXL7Q08xatbOySqKhruNpI/mGvSbIHXX7TfznNbQ/zbzNftKa4tvbJnDUXz7SV9JO1wXOoYSw==} engines: {node: '>=14.0.0'} @@ -1256,11 +1300,97 @@ packages: '@poppinss/exception@1.2.2': resolution: {integrity: sha512-m7bpKCD4QMlFCjA/nKTs23fuvoVFoA83brRKmObCUNmi/9tVu8Ve3w4YQAnJu4q3Tjf5fr685HYIC/IA2zHRSg==} + '@quansync/fs@0.1.5': + resolution: {integrity: sha512-lNS9hL2aS2NZgNW7BBj+6EBl4rOf8l+tQ0eRY6JWCI8jI2kc53gSoqbjojU0OnAWhzoXiOjFyGsHcDGePB3lhA==} + + '@rolldown/binding-android-arm64@1.0.0-beta.41': + resolution: {integrity: sha512-Edflndd9lU7JVhVIvJlZhdCj5DkhYDJPIRn4Dx0RUdfc8asP9xHOI5gMd8MesDDx+BJpdIT/uAmVTearteU/mQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [android] + + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': + resolution: {integrity: sha512-XGCzqfjdk7550PlyZRTBKbypXrB7ATtXhw/+bjtxnklLQs0mKP/XkQVOKyn9qGKSlvH8I56JLYryVxl0PCvSNw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [darwin] + + '@rolldown/binding-darwin-x64@1.0.0-beta.41': + resolution: {integrity: sha512-Ho6lIwGJed98zub7n0xcRKuEtnZgbxevAmO4x3zn3C3N4GVXZD5xvCvTVxSMoeBJwTcIYzkVDRTIhylQNsTgLQ==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [darwin] + + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': + resolution: {integrity: sha512-ijAZETywvL+gACjbT4zBnCp5ez1JhTRs6OxRN4J+D6AzDRbU2zb01Esl51RP5/8ZOlvB37xxsRQ3X4YRVyYb3g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [freebsd] + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': + resolution: {integrity: sha512-EgIOZt7UildXKFEFvaiLNBXm+4ggQyGe3E5Z1QP9uRcJJs9omihOnm897FwOBQdCuMvI49iBgjFrkhH+wMJ2MA==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm] + os: [linux] + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': + resolution: {integrity: sha512-F8bUwJq8v/JAU8HSwgF4dztoqJ+FjdyjuvX4//3+Fbe2we9UktFeZ27U4lRMXF1vxWtdV4ey6oCSqI7yUrSEeg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': + resolution: {integrity: sha512-MioXcCIX/wB1pBnBoJx8q4OGucUAfC1+/X1ilKFsjDK05VwbLZGRgOVD5OJJpUQPK86DhQciNBrfOKDiatxNmg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [linux] + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': + resolution: {integrity: sha512-m66M61fizvRCwt5pOEiZQMiwBL9/y0bwU/+Kc4Ce/Pef6YfoEkR28y+DzN9rMdjo8Z28NXjsDPq9nH4mXnAP0g==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': + resolution: {integrity: sha512-yRxlSfBvWnnfrdtJfvi9lg8xfG5mPuyoSHm0X01oiE8ArmLRvoJGHUTJydCYz+wbK2esbq5J4B4Tq9WAsOlP1Q==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [linux] + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': + resolution: {integrity: sha512-PHVxYhBpi8UViS3/hcvQQb9RFqCtvFmFU1PvUoTRiUdBtgHA6fONNHU4x796lgzNlVSD3DO/MZNk1s5/ozSMQg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [openharmony] + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': + resolution: {integrity: sha512-OAfcO37ME6GGWmj9qTaDT7jY4rM0T2z0/8ujdQIJQ2x2nl+ztO32EIwURfmXOK0U1tzkyuaKYvE34Pug/ucXlQ==} + engines: {node: '>=14.0.0'} + cpu: [wasm32] + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': + resolution: {integrity: sha512-NIYGuCcuXaq5BC4Q3upbiMBvmZsTsEPG9k/8QKQdmrch+ocSy5Jv9tdpdmXJyighKqm182nh/zBt+tSJkYoNlg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [arm64] + os: [win32] + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': + resolution: {integrity: sha512-kANdsDbE5FkEOb5NrCGBJBCaZ2Sabp3D7d4PRqMYJqyLljwh9mDyYyYSv5+QNvdAmifj+f3lviNEUUuUZPEFPw==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [ia32] + os: [win32] + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': + resolution: {integrity: sha512-UlpxKmFdik0Y2VjZrgUCgoYArZJiZllXgIipdBRV1hw6uK45UbQabSTW6Kp6enuOu7vouYWftwhuxfpE8J2JAg==} + engines: {node: ^20.19.0 || >=22.12.0} + cpu: [x64] + os: [win32] + '@rolldown/pluginutils@1.0.0-beta.29': resolution: {integrity: sha512-NIJgOsMjbxAXvoGq/X0gD7VPMQ8j9g0BiDaNjVNVjvl+iKXxL3Jre0v31RmBYeLEmkbj2s02v8vFTbUXi5XS2Q==} - '@rolldown/pluginutils@1.0.0-beta.38': - resolution: {integrity: sha512-N/ICGKleNhA5nc9XXQG/kkKHJ7S55u0x0XUJbbkmdCnFuoRkM1Il12q9q0eX19+M7KKUEPw/daUPIRnxhcxAIw==} + '@rolldown/pluginutils@1.0.0-beta.41': + resolution: {integrity: sha512-ycMEPrS3StOIeb87BT3/+bu+blEtyvwQ4zmo2IcJQy0Rd1DAAhKksA0iUZ3MYSpJtjlPhg0Eo6mvVS6ggPhRbw==} '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -1479,6 +1609,12 @@ packages: '@types/deep-eql@4.0.2': resolution: {integrity: sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw==} + '@types/eslint-scope@3.7.7': + resolution: {integrity: sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==} + + '@types/eslint@9.6.1': + resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==} + '@types/estree@1.0.8': resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==} @@ -1488,6 +1624,9 @@ packages: '@types/node@24.5.2': resolution: {integrity: sha512-FYxk1I7wPv3K2XBaoyH2cTnocQEu8AOZ60hPbsyukMPLv5/5qr7V1i8PLHdl6Zf87I+xZXFvPCXYjiTFq+YSDQ==} + '@types/node@24.6.2': + resolution: {integrity: sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==} + '@types/parse-path@7.1.0': resolution: {integrity: sha512-EULJ8LApcVEPbrfND0cRQqutIOdiIgJ1Mgrhpy755r14xMohPTEpkV/k28SJvuOs9bHRFW8x+KeDAEPiGQPB9Q==} deprecated: This is a stub types definition. parse-path provides its own type definitions, so you do not need this installed. @@ -1559,6 +1698,100 @@ packages: peerDependencies: vue: '>=3.5.18' + '@unocss/astro@66.5.2': + resolution: {integrity: sha512-JUiJL4wkDTCFgReQ+c1Nqb47EfryJvGiSp9MxXclCUbp5hegqq7yMg3BMpJ4QzHmf5EeDFO38eRBKV57hd0Iew==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + peerDependenciesMeta: + vite: + optional: true + + '@unocss/cli@66.5.2': + resolution: {integrity: sha512-WFj3fd5LqPX2/NvG/kX4vxML14F5yU6e0yPezO+7fjrJ9V31m1AFQWfiT2p8HbNUcQd9jZ9lcoWLm3Q1FsdPDA==} + engines: {node: '>=14'} + hasBin: true + + '@unocss/config@66.5.2': + resolution: {integrity: sha512-rREBBt2a6aZJ21TCeKG3/wjHfTNPbIwdrJtIVrN7hLcljW2vnWuyYabZ1yASK8+lnNsMoBoU5mbakgrPF0MItA==} + engines: {node: '>=14'} + + '@unocss/core@66.5.2': + resolution: {integrity: sha512-POSEpwj2FJtrDgzSq6nVhAJbnGIYPqtEMTpzQXfeFqPDMidAXjaH/xZUeTdHDbI9Jg700smrRXJtFJrJFXkmiQ==} + + '@unocss/extractor-arbitrary-variants@66.5.2': + resolution: {integrity: sha512-MNHzhA4RKJJVo6D5Uc+SkPfeugO1KXDt0GFg0FkOUKTTnahxyXNvd9BG9HHYlKSiaYCgUhFmysNhv04Gza+CNg==} + + '@unocss/inspector@66.5.2': + resolution: {integrity: sha512-8PuM01lrsOuyas3K+5LqeoeiujIGk72ivvJsP4/T8h03XQWzpS7NPJU6JVJQUcYZAE+WtqFcPJ8wcg0ERKNPdA==} + + '@unocss/nuxt@66.5.2': + resolution: {integrity: sha512-rFfDap+EUPk8od7UOiJiKsTp5eWocbgZHP6M0LgQXbEgkok16UsoX5fF6PkAbvP9JCmou+sYkz82Ae3aqmCUCg==} + + '@unocss/postcss@66.5.2': + resolution: {integrity: sha512-tZrWVcGm1cJghYqRFgiCb/HCnWehdJ3/6lUlXN5Ogfu4agCa3f8QES43+6TMpuTKdqkjXvMI3jZFKNMgN+/wlg==} + engines: {node: '>=14'} + peerDependencies: + postcss: ^8.4.21 + + '@unocss/preset-attributify@66.5.2': + resolution: {integrity: sha512-/FigYbT1uA5DLy5dVV2QuTizvSge8jZZZu3uGAu25p59m/h/6ZjvkCoiKcTkvmNUuZfj/ZPZmAE8GoSn1uR++A==} + + '@unocss/preset-icons@66.5.2': + resolution: {integrity: sha512-vjSwttkZrU8FfIo4TCkSOAIba0xbWE6N3/xEdK3tjq+FSgClzs9SmO06KLJHSntJ/N5JYA0wpkPS5mLYxGMwqw==} + + '@unocss/preset-mini@66.5.2': + resolution: {integrity: sha512-YLOuYq7GNoWNgF3P41AtcvnOodSP49x0RNM4PR/ntGddl0BfsFaKeCGzt8DpbvavhQpBn0+kt4GP3RajKooAIQ==} + + '@unocss/preset-tagify@66.5.2': + resolution: {integrity: sha512-6AusDr1rD+HK22F4kwPLWqOImV3W+0nyPMsUwLVHQeaZktpSFSqaIQCI6aIVWyftvW/paST1Xc4HEHb7rKBF/w==} + + '@unocss/preset-typography@66.5.2': + resolution: {integrity: sha512-Ez3VWrNlJVa9cywsI/IwUdZ4OUeeUvf04pZmf+bwSU3CHqfonRT8K3+ndHQfuTJYbIb1k3few+cc1P1W7NP7Xw==} + + '@unocss/preset-uno@66.5.2': + resolution: {integrity: sha512-+raFp6uRwvQVIS7y8JoQI+5PPodl+uNsHxL9uH/JkelB5++ACrcP/ShN8RrDD97K+wtSP+3kr9SsK6dk0f2Mpg==} + + '@unocss/preset-web-fonts@66.5.2': + resolution: {integrity: sha512-xMFUE8Bhe2X/VlUBtdXTnDrrZL+WE99RaiBNLS1F1Na5r4Fc5Ck0p8a+SnMB7GDx5gtwf1ekKwi0pAP8+vIJnQ==} + + '@unocss/preset-wind3@66.5.2': + resolution: {integrity: sha512-qgzLiPd6CkepLLssBod7ejQ4sKKqAvCOyjqpp0eFmHVUKGBEGPzOI1/WnbrAzvTHDonbSc52kB/XEWlgWmDhhA==} + + '@unocss/preset-wind4@66.5.2': + resolution: {integrity: sha512-493Vb1do+05+3tdE0kU+SUKAPG9Spd+hItKfc09OL276T1DMj7AZzIq5q+rj9e+bOAjWAAutjw94RPNjKlU3fA==} + + '@unocss/preset-wind@66.5.2': + resolution: {integrity: sha512-jJN7kLXNAn/6VpYWTrIJGsXAhziPlPhK7bdnilbVnrlTSOluG6peCE6gdUyjdlLDyYELzz8qZ7ZvOo77IsBkPQ==} + + '@unocss/reset@66.5.2': + resolution: {integrity: sha512-DirXdqrkSp3fThRGOz0s0ehsYBpLb72Vh4QlPfMFuwHHFC9P9IDTLMUj5kD51A9fdy07Wrmhs7T5CQ//DlfOdQ==} + + '@unocss/rule-utils@66.5.2': + resolution: {integrity: sha512-2eR5TBTO+cmPY9ahFjyEu8qP/NFPI02dVpI0rgGKdyDMv/PnO9+yS/9rKgrmXsN3nPYHjOrLutRXkF/xxm/t3w==} + engines: {node: '>=14'} + + '@unocss/transformer-attributify-jsx@66.5.2': + resolution: {integrity: sha512-mTa+fMKVz96He21E6FYCJyd0QbL6Xr5JjdqZEEFZiwt9N884g89pHZOlEURmrkQBrWc5NwSfzNB7lCkhuUOIFQ==} + + '@unocss/transformer-compile-class@66.5.2': + resolution: {integrity: sha512-50UTeKH6zycAzF44+6eCW13uPy5bw3W3Z8miEAIj0cNaKHTul0QYQFhLT3R804cnkAdX/Cp6IE/HSivxeP5ueQ==} + + '@unocss/transformer-directives@66.5.2': + resolution: {integrity: sha512-hwbAdV1Vr001ojaXR8rVt4jJvPnrAjl9h2SQWjaqyGkLntnKvFB8JSTS9CT0cyv1GrwiBAwdnVIdioLAQ3GPbg==} + + '@unocss/transformer-variant-group@66.5.2': + resolution: {integrity: sha512-ZgH4hgoIbbh92pszsT2M93e/DcEmN+s9yjYPPCa0qxvTQb6aANM02Z6T7OE0ltQ0NShELfIS4oSGUKY6ezHwug==} + + '@unocss/vite@66.5.2': + resolution: {integrity: sha512-0OcvZHV7ag8ml9z1pG0T92b81CP8nOv21o9vZnQUJN4Uw+8fnVA9xCh1X68IfDNr5Q8nS5zz/Fjr/pC89Cb+og==} + peerDependencies: + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + + '@unocss/webpack@66.5.2': + resolution: {integrity: sha512-E7O+1IynMSZlgypHgc7SxnxGxhpfpVTEjpfw203cYLWjzTtjdbHFvEuINxM3FwNP8E+lN3k6cbjWTh9zA1sXUg==} + peerDependencies: + webpack: ^4 || ^5 + '@unrs/resolver-binding-android-arm-eabi@1.11.1': resolution: {integrity: sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==} cpu: [arm] @@ -1660,7 +1893,7 @@ packages: peerDependencies: '@nuxt/schema': '>=3.9.0' '@nuxtjs/i18n': ^8.0.0 || ^9.0.0 || ^10.0.0-0 - vuetify: ^3.10.2 + vuetify: ^3.0.0 '@unvuetify/nuxt-utils@https://pkg.pr.new/@unvuetify/nuxt-utils@a348008': resolution: {tarball: https://pkg.pr.new/@unvuetify/nuxt-utils@a348008} @@ -1670,7 +1903,7 @@ packages: resolution: {tarball: https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008} version: 1.1.0 peerDependencies: - vuetify: ^3.10.2 + vuetify: ^3.0.0 '@unvuetify/unimport-presets@https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/unimport-presets@a348008': resolution: {tarball: https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/unimport-presets@a348008} @@ -1683,7 +1916,7 @@ packages: version: 1.1.0 peerDependencies: vite: ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 - vuetify: ^3.10.2 + vuetify: ^3.0.0 '@vercel/nft@0.30.1': resolution: {integrity: sha512-2mgJZv4AYBFkD/nJ4QmiX5Ymxi+AisPLPcS/KPXVqniyQNqKXX+wjieAbDXQP3HcogfEbpHoRMs49Cd4pfkk8g==} @@ -1838,6 +2071,57 @@ packages: '@vue/shared@3.5.21': resolution: {integrity: sha512-+2k1EQpnYuVuu3N7atWyG3/xoFWIVJZq4Mz8XNOdScFI0etES75fbny/oU4lKWk/577P1zmg0ioYvpGEDZ3DLw==} + '@webassemblyjs/ast@1.14.1': + resolution: {integrity: sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==} + + '@webassemblyjs/floating-point-hex-parser@1.13.2': + resolution: {integrity: sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==} + + '@webassemblyjs/helper-api-error@1.13.2': + resolution: {integrity: sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==} + + '@webassemblyjs/helper-buffer@1.14.1': + resolution: {integrity: sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==} + + '@webassemblyjs/helper-numbers@1.13.2': + resolution: {integrity: sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==} + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': + resolution: {integrity: sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==} + + '@webassemblyjs/helper-wasm-section@1.14.1': + resolution: {integrity: sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==} + + '@webassemblyjs/ieee754@1.13.2': + resolution: {integrity: sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==} + + '@webassemblyjs/leb128@1.13.2': + resolution: {integrity: sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==} + + '@webassemblyjs/utf8@1.13.2': + resolution: {integrity: sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==} + + '@webassemblyjs/wasm-edit@1.14.1': + resolution: {integrity: sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==} + + '@webassemblyjs/wasm-gen@1.14.1': + resolution: {integrity: sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==} + + '@webassemblyjs/wasm-opt@1.14.1': + resolution: {integrity: sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==} + + '@webassemblyjs/wasm-parser@1.14.1': + resolution: {integrity: sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==} + + '@webassemblyjs/wast-printer@1.14.1': + resolution: {integrity: sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==} + + '@xtuc/ieee754@1.2.0': + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + '@xtuc/long@4.2.2': + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + abbrev@3.0.1: resolution: {integrity: sha512-AO2ac6pjRB3SJmGJo+v5/aK6Omggp6fsLrs6wN9bd35ulu4cCwaAU9+7ZhXjeqHVkaHThLuzH0nZr0YpCDhygg==} engines: {node: ^18.17.0 || >=20.5.0} @@ -1851,6 +2135,12 @@ packages: peerDependencies: acorn: ^8 + acorn-import-phases@1.0.4: + resolution: {integrity: sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==} + engines: {node: '>=10.13.0'} + peerDependencies: + acorn: ^8.14.0 + acorn-jsx@5.3.2: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -1865,9 +2155,25 @@ packages: resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==} engines: {node: '>= 14'} + ajv-formats@2.1.1: + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + + ajv-keywords@5.1.0: + resolution: {integrity: sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==} + peerDependencies: + ajv: ^8.8.2 + ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + ajv@8.17.1: + resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + alien-signals@2.0.7: resolution: {integrity: sha512-wE7y3jmYeb0+h6mr5BOovuqhFv22O/MV9j5p0ndJsa7z1zJNPGQ4ph5pQk/kTTCWRC3xsA4SmtwmkzQO+7NCNg==} @@ -1891,6 +2197,10 @@ packages: resolution: {integrity: sha512-BGcItUBWSMRgOCe+SVZJ+S7yTRG0eGt9cXAHev72yuGcY23hnLA7Bky5L/xLyPINoSN95geovfBkqoTlNZYa7w==} engines: {node: '>=14'} + ansis@4.2.0: + resolution: {integrity: sha512-HqZ5rWlFjGiV0tDm3UxxgNRqsOTniqoKZu0pIAfh7TZQMGuZK+hH0drySty0si0QXj1ieop4+SkSfPZBPPkHig==} + engines: {node: '>=14'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -1956,12 +2266,19 @@ packages: resolution: {integrity: sha512-wrH5NNqren/QMtKUEEJf7z86YjfqW/2uw3IL3/xpqZUC95SSVIFXYQeeGjL6FT/X68IROu6RMehZQS5foy2BXw==} hasBin: true + 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==} birpc@2.5.0: resolution: {integrity: sha512-VSWO/W6nNQdyP520F1mhf+Lc2f8pjGQOtoHHm7Ze8Go1kX7akpVIrtTa0fn+HB0QJEDVacl6aO08YE0PgXfdnQ==} + birpc@2.6.1: + resolution: {integrity: sha512-LPnFhlDpdSH6FJhJyn4M0kFO7vtQ5iPw24FnG0y21q09xC7e8+1LeR31S1MAIrDAHp4m7aas4bEkTDTvMAtebQ==} + boolbase@1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} @@ -2039,6 +2356,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'} @@ -2047,6 +2368,10 @@ packages: resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} engines: {node: '>=18'} + chrome-trace-event@1.0.4: + resolution: {integrity: sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==} + engines: {node: '>=6.0'} + ci-info@4.3.0: resolution: {integrity: sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==} engines: {node: '>=8'} @@ -2080,6 +2405,9 @@ packages: colord@2.9.3: resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + colorette@2.0.20: + resolution: {integrity: sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==} + commander@11.1.0: resolution: {integrity: sha512-yPVavfyCcRhmorC7rWlkHn15b4wDVgVmBA7kV4QVBsF7kv/9TKJAbAXVTxvTnwP8HHKjRCJDClKbciiYS7p0DQ==} engines: {node: '>=16'} @@ -2328,6 +2656,15 @@ packages: resolution: {integrity: sha512-Sf2LSQP+bOlhKWWyhFsn0UsfdK/kCWRv1iuA2gXAwt3dyNabr6QSj00I2V10pidqz69soatm9ZwZvpQMTIOd5Q==} engines: {node: '>=12'} + dts-resolver@2.1.2: + resolution: {integrity: sha512-xeXHBQkn2ISSXxbJWD828PFjtyg+/UrMDo7W4Ffcs7+YWCquxU8YjV1KoxuiL+eJ5pg3ll+bC6flVv61L3LKZg==} + engines: {node: '>=20.18.0'} + peerDependencies: + oxc-resolver: '>=11.0.0' + peerDependenciesMeta: + oxc-resolver: + optional: true + duplexer@0.1.2: resolution: {integrity: sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==} @@ -2346,10 +2683,18 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + empathic@2.0.0: + resolution: {integrity: sha512-i6UzDscO/XfAcNYD75CfICkmfLedpyPDdozrLMmQc5ORaQcdMoc21OnlEylMIqI7U8eniKrPMxxtj8k0vhmJhA==} + engines: {node: '>=14'} + encodeurl@2.0.0: resolution: {integrity: sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==} engines: {node: '>= 0.8'} + enhanced-resolve@5.18.3: + resolution: {integrity: sha512-d4lC8xfavMeBjzGr2vECC3fsGXziXZQyJxD868h2M/mBI3PwAuODxAkLkq5HYuvrPYcUtiLzsTo8U3PgX3Ocww==} + engines: {node: '>=10.13.0'} + entities@4.5.0: resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} engines: {node: '>=0.12'} @@ -2472,6 +2817,10 @@ packages: '@vue/compiler-sfc': ^3.3.0 eslint: '>=9.0.0' + eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + eslint-scope@8.4.0: resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2515,6 +2864,10 @@ packages: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} + estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + estraverse@5.3.0: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} @@ -2575,6 +2928,9 @@ packages: fast-npm-meta@0.4.6: resolution: {integrity: sha512-zbBBOAOlzxfrU4WSnbCHk/nR6Vf32lSEPxDEvNOR08Z5DSZ/A6qJu0rqrHVcexBTd1hc2gim998xnqF/R1PuEw==} + fast-uri@3.1.0: + resolution: {integrity: sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==} + fastq@1.19.1: resolution: {integrity: sha512-GwLTyxkCXjXbxqIhTsMI2Nui8huMPtnxg7krajPJAjnEG/iiOS7i+zCtWGZR9G0NBKbXKh6X9m9UIsYX/N6vvQ==} @@ -2675,6 +3031,9 @@ packages: resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} engines: {node: '>=10.13.0'} + glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} hasBin: true @@ -2683,10 +3042,18 @@ packages: resolution: {integrity: sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==} engines: {node: '>=18'} + globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} + globals@15.15.0: + resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} + engines: {node: '>=18'} + globals@16.4.0: resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} engines: {node: '>=18'} @@ -2701,6 +3068,10 @@ packages: graphemer@1.4.0: resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + gzip-size@6.0.0: + resolution: {integrity: sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==} + engines: {node: '>=10'} + gzip-size@7.0.0: resolution: {integrity: sha512-O1Ld7Dr+nqPnmGpdhzLmMTQ4vAsD+rHwMm1NLUmoUFFymBOMKxCCrtDxqdBRYXdeEPEi3SyoR4TizJLQrnKBNA==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} @@ -2785,6 +3156,10 @@ packages: iron-webcrypto@1.2.1: resolution: {integrity: sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==} + is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + is-builtin-module@5.0.0: resolution: {integrity: sha512-f4RqJKBUe5rQkJ2eJEJBXSticB3hGbN9j0yxxMQFqIW89Jp9WYFtzfTcRlstDKVUTRzSOTLKRfO9vIztenwtxA==} engines: {node: '>=18.20'} @@ -2878,6 +3253,10 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + jiti@1.21.7: resolution: {integrity: sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==} hasBin: true @@ -2917,9 +3296,15 @@ packages: json-buffer@3.0.1: resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + json-schema-traverse@0.4.1: resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} @@ -2950,6 +3335,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==} + launch-editor@2.11.1: resolution: {integrity: sha512-SEET7oNfgSaB6Ym0jufAdCeo3meJVeCaaDyzRygy0xsp2BFKCprcfHljTq4QkzTLUxEKkFK6OK4811YM2oSrRg==} @@ -2969,6 +3357,10 @@ packages: resolution: {integrity: sha512-I8oW2+QL5KJo8zXNWX046M134WchxsXC7SawLPvRQpogCbkyQIaFxPE89A2HiwR7vAK2Dm2ERBAmyjTYGYEpBg==} hasBin: true + loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + local-pkg@1.1.2: resolution: {integrity: sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==} engines: {node: '>=14'} @@ -3034,10 +3426,18 @@ packages: resolution: {integrity: sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==} engines: {node: '>=8.6'} + mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + mime-db@1.54.0: resolution: {integrity: sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==} engines: {node: '>= 0.6'} + mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + mime-types@3.0.1: resolution: {integrity: sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==} engines: {node: '>= 0.6'} @@ -3149,6 +3549,9 @@ packages: natural-compare@1.4.0: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + nitropack@2.12.6: resolution: {integrity: sha512-DEq31s0SP4/Z5DIoVBRo9DbWFPWwIoYD4cQMEz7eE+iJMiAP+1k9A3B9kcc6Ihc0jDJmfUcHYyh6h2XlynCx6g==} engines: {node: ^20.19.0 || >=22.12.0} @@ -3629,6 +4032,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'} @@ -3661,6 +4068,10 @@ packages: resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} engines: {node: '>=0.10.0'} + require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + resolve-from@4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} engines: {node: '>=4'} @@ -3684,6 +4095,30 @@ packages: rfdc@1.4.1: resolution: {integrity: sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==} + rolldown-plugin-dts@0.16.11: + resolution: {integrity: sha512-9IQDaPvPqTx3RjG2eQCK5GYZITo203BxKunGI80AGYicu1ySFTUyugicAaTZWRzFWh9DSnzkgNeMNbDWBbSs0w==} + engines: {node: '>=20.18.0'} + peerDependencies: + '@ts-macro/tsc': ^0.3.6 + '@typescript/native-preview': '>=7.0.0-dev.20250601.1' + rolldown: ^1.0.0-beta.9 + typescript: ^5.0.0 + vue-tsc: ~3.1.0 + peerDependenciesMeta: + '@ts-macro/tsc': + optional: true + '@typescript/native-preview': + optional: true + typescript: + optional: true + vue-tsc: + optional: true + + rolldown@1.0.0-beta.41: + resolution: {integrity: sha512-U+NPR0Bkg3wm61dteD2L4nAM1U9dtaqVrpDXwC36IKRHpEO/Ubpid4Nijpa2imPchcVNHfxVFwSSMJdwdGFUbg==} + engines: {node: ^20.19.0 || >=22.12.0} + hasBin: true + rollup-plugin-dts@6.2.3: resolution: {integrity: sha512-UgnEsfciXSPpASuOelix7m4DrmyQgiaWBnvI0TM4GxuDh5FkqW8E5hu57bCxXB90VvR1WNfLV80yEDN18UogSA==} engines: {node: '>=16'} @@ -3725,6 +4160,10 @@ packages: sax@1.4.1: resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==} + schema-utils@4.3.3: + resolution: {integrity: sha512-eflK8wEtyOE6+hsaRVPxvUKYCpRgzLqDTb8krvAsRIwOGlHoSgYLgBXoubGgLd2fT41/OUYdb48v4k4WWHQurA==} + engines: {node: '>= 10.13.0'} + scslre@0.3.0: resolution: {integrity: sha512-3A6sD0WYP7+QrjbfNA2FN3FsOaGGFoekCVgTyypy53gPxhbkCIjtO6YWgdrfM+n/8sI8JeXZOIxsHjMTNxQ4nQ==} engines: {node: ^14.0.0 || >=16.0.0} @@ -3904,6 +4343,10 @@ packages: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} + supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + supports-preserve-symlinks-flag@1.0.0: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} @@ -3917,6 +4360,10 @@ packages: resolution: {integrity: sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==} engines: {node: '>=18'} + tapable@2.3.0: + resolution: {integrity: sha512-g9ljZiwki/LfxmQADO3dEY1CbpmXT5Hm2fJ+QaGKwSXUylMybePR7/67YW7jOrrvjEgL1Fmz5kzyAjWVWLlucg==} + engines: {node: '>=6'} + tar-stream@3.1.7: resolution: {integrity: sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==} @@ -3924,6 +4371,22 @@ packages: resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} engines: {node: '>=18'} + terser-webpack-plugin@5.3.14: + resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + terser@5.44.0: resolution: {integrity: sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w==} engines: {node: '>=10'} @@ -3979,6 +4442,10 @@ packages: tr46@0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + ts-api-utils@2.1.0: resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} @@ -3995,6 +4462,28 @@ packages: typescript: optional: true + tsdown@0.15.6: + resolution: {integrity: sha512-W6++O3JeV9gm3JY6P/vLiC7zzTcJbZhQxXb+p3AvRMpDOPBIg82yXULyZCcwjsihY/bFG+Qw37HkezZbP7fzUg==} + engines: {node: '>=20.19.0'} + hasBin: true + peerDependencies: + '@arethetypeswrong/core': ^0.18.1 + publint: ^0.3.0 + typescript: ^5.0.0 + unplugin-lightningcss: ^0.4.0 + unplugin-unused: ^0.5.0 + peerDependenciesMeta: + '@arethetypeswrong/core': + optional: true + publint: + optional: true + typescript: + optional: true + unplugin-lightningcss: + optional: true + unplugin-unused: + optional: true + tslib@2.8.1: resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==} @@ -4029,6 +4518,9 @@ packages: typescript: optional: true + unconfig@7.3.3: + resolution: {integrity: sha512-QCkQoOnJF8L107gxfHL0uavn7WD9b3dpBcFX6HtfQYmjw2YzWxGuFQ0N0J6tE9oguCBJn9KOvfqYDCMPHIZrBA==} + uncrypto@0.1.3: resolution: {integrity: sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==} @@ -4038,6 +4530,9 @@ packages: undici-types@7.12.0: resolution: {integrity: sha512-goOacqME2GYyOZZfb5Lgtu+1IDmAlAEu5xnD3+xTzS10hT0vzpf0SPjkXwAw9Jm+4n/mQGDP3LO8CPbYROeBfQ==} + undici-types@7.13.0: + resolution: {integrity: sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==} + unenv@2.0.0-rc.21: resolution: {integrity: sha512-Wj7/AMtE9MRnAXa6Su3Lk0LNCfqDYgfwVjwRFVum9U7wsto1imuHqk4kTm7Jni+5A0Hn7dttL6O/zjvUvoo+8A==} @@ -4052,6 +4547,18 @@ packages: resolution: {integrity: sha512-cty7t1DESgm0OPfCy9oyn5u9B5t0tMW6tH6bXTjAGIO3SkJsbg/DXYHjrPrUKqultqbAAoltAfYsuu/FEDocjg==} engines: {node: '>=18.12.0'} + unocss@66.5.2: + resolution: {integrity: sha512-GCFq6ilalDE33dbjZKgeBHgKGLL/t87XM5sS0aqhD0RgzHhbT2f6Jtsmmg2Q3GASlk5uvJLxh9ifUvPQ13BdyQ==} + engines: {node: '>=14'} + peerDependencies: + '@unocss/webpack': 66.5.2 + vite: ^2.9.0 || ^3.0.0-0 || ^4.0.0 || ^5.0.0-0 || ^6.0.0-0 || ^7.0.0-0 + peerDependenciesMeta: + '@unocss/webpack': + optional: true + vite: + optional: true + unplugin-utils@0.2.5: resolution: {integrity: sha512-gwXJnPRewT4rT7sBi/IvxKTjsms7jX7QIDLOClApuZwR49SXbrB1z2NLUZ+vDHyqCj/n58OzRRqaW+B8OZi8vg==} engines: {node: '>=18.12.0'} @@ -4328,6 +4835,9 @@ packages: peerDependencies: eslint: ^8.57.0 || ^9.0.0 + vue-flow-layout@0.2.0: + resolution: {integrity: sha512-zKgsWWkXq0xrus7H4Mc+uFs1ESrmdTXlO0YNbR6wMdPaFvosL3fMB8N7uTV308UhGy9UvTrGhIY7mVz9eN+L0Q==} + vue-i18n@11.1.12: resolution: {integrity: sha512-BnstPj3KLHLrsqbVU2UOrPmr0+Mv11bsUZG0PyCOzsawCivk8W00GMXHeVUWIDOgNaScCuZah47CZFE+Wnl8mw==} engines: {node: '>= 16'} @@ -4361,8 +4871,9 @@ packages: typescript: optional: true - vuetify@3.10.2: - resolution: {integrity: sha512-uuAm+uj170ZWdS0aiomhgtdYOR3/I2yzynskBfYyFB1Fn/HKvlvPDaU3ISZnf0GHIJQENdj7eLg/wTChrIwEQw==} + vuetify@file:vuetify-3.10.4.tgz: + resolution: {integrity: sha512-qpQcg8bcUSMrUi3QjjkWp0SjLZyekHixdVeGBrCwxHIyksUsrptqrGzrEpmHmnYLmvMrevcnlVhGjhYW1TpQxg==, tarball: file:vuetify-3.10.4.tgz} + version: 3.10.4 peerDependencies: typescript: '>=4.7' vite-plugin-vuetify: '>=2.1.0' @@ -4376,12 +4887,30 @@ packages: webpack-plugin-vuetify: optional: true + watchpack@2.4.4: + resolution: {integrity: sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==} + engines: {node: '>=10.13.0'} + webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + webpack-sources@3.3.3: + resolution: {integrity: sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==} + engines: {node: '>=10.13.0'} + webpack-virtual-modules@0.6.2: resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==} + webpack@5.102.0: + resolution: {integrity: sha512-hUtqAR3ZLVEYDEABdBioQCIqSoguHbFn1K7WlPPWSuXmx0031BD73PSE35jKyftdSh4YLDoQNgK4pqBt5Q82MA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} @@ -4481,6 +5010,8 @@ snapshots: package-manager-detector: 1.3.0 tinyexec: 1.0.1 + '@antfu/utils@9.2.1': {} + '@babel/code-frame@7.27.1': dependencies: '@babel/helper-validator-identifier': 7.27.1 @@ -4600,6 +5131,10 @@ snapshots: '@babel/template': 7.27.2 '@babel/types': 7.28.4 + '@babel/parser@7.27.7': + dependencies: + '@babel/types': 7.28.4 + '@babel/parser@7.28.4': dependencies: '@babel/types': 7.28.4 @@ -4631,24 +5166,36 @@ snapshots: '@babel/parser': 7.28.4 '@babel/types': 7.28.4 - '@babel/traverse@7.28.4': + '@babel/traverse@7.27.7': dependencies: '@babel/code-frame': 7.27.1 '@babel/generator': 7.28.3 - '@babel/helper-globals': 7.28.0 '@babel/parser': 7.28.4 '@babel/template': 7.27.2 '@babel/types': 7.28.4 debug: 4.4.3 + globals: 11.12.0 transitivePeerDependencies: - supports-color - '@babel/types@7.28.4': - dependencies: - '@babel/helper-string-parser': 7.27.1 - '@babel/helper-validator-identifier': 7.27.1 - - '@clack/core@0.5.0': + '@babel/traverse@7.28.4': + dependencies: + '@babel/code-frame': 7.27.1 + '@babel/generator': 7.28.3 + '@babel/helper-globals': 7.28.0 + '@babel/parser': 7.28.4 + '@babel/template': 7.27.2 + '@babel/types': 7.28.4 + debug: 4.4.3 + transitivePeerDependencies: + - supports-color + + '@babel/types@7.28.4': + dependencies: + '@babel/helper-string-parser': 7.27.1 + '@babel/helper-validator-identifier': 7.27.1 + + '@clack/core@0.5.0': dependencies: picocolors: 1.1.1 sisteransi: 1.0.5 @@ -4824,6 +5371,25 @@ snapshots: '@humanwhocodes/retry@0.4.3': {} + '@iconify-json/mdi@1.2.3': + dependencies: + '@iconify/types': 2.0.0 + + '@iconify/types@2.0.0': {} + + '@iconify/utils@3.0.2': + dependencies: + '@antfu/install-pkg': 1.1.0 + '@antfu/utils': 9.2.1 + '@iconify/types': 2.0.0 + debug: 4.4.3 + globals: 15.15.0 + kolorist: 1.8.0 + local-pkg: 1.1.2 + mlly: 1.8.0 + transitivePeerDependencies: + - supports-color + '@intlify/bundle-utils@11.0.1(vue-i18n@11.1.12(vue@3.5.21(typescript@5.9.2)))': dependencies: '@intlify/message-compiler': 11.1.12 @@ -5034,6 +5600,14 @@ snapshots: transitivePeerDependencies: - magicast + '@nuxt/devtools-kit@2.6.5(magicast@0.3.5)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@nuxt/kit': 3.19.2(magicast@0.3.5) + execa: 8.0.1 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + transitivePeerDependencies: + - magicast + '@nuxt/devtools-wizard@2.6.5': dependencies: consola: 3.4.2 @@ -5086,6 +5660,47 @@ snapshots: - utf-8-validate - vue + '@nuxt/devtools@2.6.5(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': + dependencies: + '@nuxt/devtools-kit': 2.6.5(magicast@0.3.5)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + '@nuxt/devtools-wizard': 2.6.5 + '@nuxt/kit': 3.19.2(magicast@0.3.5) + '@vue/devtools-core': 7.7.7(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@vue/devtools-kit': 7.7.7 + birpc: 2.5.0 + consola: 3.4.2 + destr: 2.0.5 + error-stack-parser-es: 1.0.5 + execa: 8.0.1 + fast-npm-meta: 0.4.6 + get-port-please: 3.2.0 + hookable: 5.5.3 + image-meta: 0.2.1 + is-installed-globally: 1.0.0 + launch-editor: 2.11.1 + local-pkg: 1.1.2 + magicast: 0.3.5 + nypm: 0.6.2 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + pkg-types: 2.3.0 + semver: 7.7.2 + simple-git: 3.28.0 + sirv: 3.0.2 + structured-clone-es: 1.0.0 + tinyglobby: 0.2.15 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-inspect: 11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + vite-plugin-vue-tracer: 1.0.0(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + which: 5.0.0 + ws: 8.18.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + - vue + '@nuxt/eslint-config@1.9.0(@typescript-eslint/utils@8.44.0(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2))(@vue/compiler-sfc@3.5.21)(eslint@9.36.0(jiti@2.5.1))(typescript@5.9.2)': dependencies: '@antfu/install-pkg': 1.1.0 @@ -5263,7 +5878,7 @@ snapshots: - magicast - typescript - '@nuxt/vite-builder@4.1.2(@types/node@24.5.2)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2))(vue@3.5.21(typescript@5.9.2))(yaml@2.8.1)': + '@nuxt/vite-builder@4.1.2(@types/node@24.5.2)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.41)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2))(vue@3.5.21(typescript@5.9.2))(yaml@2.8.1)': dependencies: '@nuxt/kit': 4.1.2(magicast@0.3.5) '@rollup/plugin-replace': 6.0.2(rollup@4.52.0) @@ -5286,7 +5901,7 @@ snapshots: pathe: 2.0.3 pkg-types: 2.3.0 postcss: 8.5.6 - rollup-plugin-visualizer: 6.0.3(rollup@4.52.0) + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.41)(rollup@4.52.0) std-env: 3.9.0 ufo: 1.6.1 unenv: 2.0.0-rc.21 @@ -5320,6 +5935,63 @@ snapshots: - vue-tsc - yaml + '@nuxt/vite-builder@4.1.2(@types/node@24.6.2)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.41)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2))(vue@3.5.21(typescript@5.9.2))(yaml@2.8.1)': + dependencies: + '@nuxt/kit': 4.1.2(magicast@0.3.5) + '@rollup/plugin-replace': 6.0.2(rollup@4.52.0) + '@vitejs/plugin-vue': 6.0.1(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@vitejs/plugin-vue-jsx': 5.1.1(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + autoprefixer: 10.4.21(postcss@8.5.6) + consola: 3.4.2 + cssnano: 7.1.1(postcss@8.5.6) + defu: 6.1.4 + esbuild: 0.25.10 + escape-string-regexp: 5.0.0 + exsolve: 1.0.7 + get-port-please: 3.2.0 + h3: 1.15.4 + jiti: 2.5.1 + knitwork: 1.2.0 + magic-string: 0.30.19 + mlly: 1.8.0 + mocked-exports: 0.1.1 + pathe: 2.0.3 + pkg-types: 2.3.0 + postcss: 8.5.6 + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.41)(rollup@4.52.0) + std-env: 3.9.0 + ufo: 1.6.1 + unenv: 2.0.0-rc.21 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vite-node: 3.2.4(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vite-plugin-checker: 0.10.3(eslint@9.36.0(jiti@2.5.1))(optionator@0.9.4)(typescript@5.9.2)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2)) + vue: 3.5.21(typescript@5.9.2) + vue-bundle-renderer: 2.1.2 + transitivePeerDependencies: + - '@biomejs/biome' + - '@types/node' + - eslint + - less + - lightningcss + - magicast + - meow + - optionator + - rolldown + - rollup + - sass + - sass-embedded + - stylelint + - stylus + - sugarss + - supports-color + - terser + - tsx + - typescript + - vls + - vti + - vue-tsc + - yaml + '@nuxtjs/i18n@10.1.0(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2))': dependencies: '@intlify/core': 11.1.12 @@ -5524,6 +6196,8 @@ snapshots: '@oxc-project/types@0.87.0': {} + '@oxc-project/types@0.93.0': {} + '@oxc-transform/binding-android-arm64@0.81.0': optional: true @@ -5700,9 +6374,57 @@ snapshots: '@poppinss/exception@1.2.2': {} + '@quansync/fs@0.1.5': + dependencies: + quansync: 0.2.11 + + '@rolldown/binding-android-arm64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-darwin-arm64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-darwin-x64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-freebsd-x64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.41': + optional: true + + '@rolldown/binding-linux-x64-musl@1.0.0-beta.41': + optional: true + + '@rolldown/binding-openharmony-arm64@1.0.0-beta.41': + optional: true + + '@rolldown/binding-wasm32-wasi@1.0.0-beta.41': + dependencies: + '@napi-rs/wasm-runtime': 1.0.5 + optional: true + + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.41': + optional: true + + '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.41': + optional: true + + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.41': + optional: true + '@rolldown/pluginutils@1.0.0-beta.29': {} - '@rolldown/pluginutils@1.0.0-beta.38': {} + '@rolldown/pluginutils@1.0.0-beta.41': {} '@rollup/plugin-alias@5.1.1(rollup@4.52.0)': optionalDependencies: @@ -5868,6 +6590,16 @@ snapshots: '@types/deep-eql@4.0.2': {} + '@types/eslint-scope@3.7.7': + dependencies: + '@types/eslint': 9.6.1 + '@types/estree': 1.0.8 + + '@types/eslint@9.6.1': + dependencies: + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@types/estree@1.0.8': {} '@types/json-schema@7.0.15': {} @@ -5876,6 +6608,10 @@ snapshots: dependencies: undici-types: 7.12.0 + '@types/node@24.6.2': + dependencies: + undici-types: 7.13.0 + '@types/parse-path@7.1.0': dependencies: parse-path: 7.1.0 @@ -5981,6 +6717,236 @@ snapshots: unhead: 2.0.17 vue: 3.5.21(typescript@5.9.2) + '@unocss/astro@66.5.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/reset': 66.5.2 + '@unocss/vite': 66.5.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + optionalDependencies: + vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + + '@unocss/astro@66.5.2(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/reset': 66.5.2 + '@unocss/vite': 66.5.2(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + optionalDependencies: + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + + '@unocss/cli@66.5.2': + dependencies: + '@jridgewell/remapping': 2.3.5 + '@unocss/config': 66.5.2 + '@unocss/core': 66.5.2 + '@unocss/preset-uno': 66.5.2 + cac: 6.7.14 + chokidar: 3.6.0 + colorette: 2.0.20 + consola: 3.4.2 + magic-string: 0.30.19 + pathe: 2.0.3 + perfect-debounce: 1.0.0 + tinyglobby: 0.2.15 + unplugin-utils: 0.3.0 + + '@unocss/config@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + unconfig: 7.3.3 + + '@unocss/core@66.5.2': {} + + '@unocss/extractor-arbitrary-variants@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + + '@unocss/inspector@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/rule-utils': 66.5.2 + colorette: 2.0.20 + gzip-size: 6.0.0 + sirv: 3.0.2 + vue-flow-layout: 0.2.0 + + '@unocss/nuxt@66.5.2(magicast@0.3.5)(postcss@8.5.6)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.102.0(esbuild@0.25.10))': + dependencies: + '@nuxt/kit': 4.1.2(magicast@0.3.5) + '@unocss/config': 66.5.2 + '@unocss/core': 66.5.2 + '@unocss/preset-attributify': 66.5.2 + '@unocss/preset-icons': 66.5.2 + '@unocss/preset-tagify': 66.5.2 + '@unocss/preset-typography': 66.5.2 + '@unocss/preset-web-fonts': 66.5.2 + '@unocss/preset-wind3': 66.5.2 + '@unocss/preset-wind4': 66.5.2 + '@unocss/reset': 66.5.2 + '@unocss/vite': 66.5.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + '@unocss/webpack': 66.5.2(webpack@5.102.0(esbuild@0.25.10)) + unocss: 66.5.2(@unocss/webpack@66.5.2(webpack@5.102.0(esbuild@0.25.10)))(postcss@8.5.6)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + transitivePeerDependencies: + - magicast + - postcss + - supports-color + - vite + - webpack + + '@unocss/nuxt@66.5.2(magicast@0.3.5)(postcss@8.5.6)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.102.0(esbuild@0.25.10))': + dependencies: + '@nuxt/kit': 4.1.2(magicast@0.3.5) + '@unocss/config': 66.5.2 + '@unocss/core': 66.5.2 + '@unocss/preset-attributify': 66.5.2 + '@unocss/preset-icons': 66.5.2 + '@unocss/preset-tagify': 66.5.2 + '@unocss/preset-typography': 66.5.2 + '@unocss/preset-web-fonts': 66.5.2 + '@unocss/preset-wind3': 66.5.2 + '@unocss/preset-wind4': 66.5.2 + '@unocss/reset': 66.5.2 + '@unocss/vite': 66.5.2(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + '@unocss/webpack': 66.5.2(webpack@5.102.0(esbuild@0.25.10)) + unocss: 66.5.2(@unocss/webpack@66.5.2(webpack@5.102.0(esbuild@0.25.10)))(postcss@8.5.6)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + transitivePeerDependencies: + - magicast + - postcss + - supports-color + - vite + - webpack + + '@unocss/postcss@66.5.2(postcss@8.5.6)': + dependencies: + '@unocss/config': 66.5.2 + '@unocss/core': 66.5.2 + '@unocss/rule-utils': 66.5.2 + css-tree: 3.1.0 + postcss: 8.5.6 + tinyglobby: 0.2.15 + + '@unocss/preset-attributify@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + + '@unocss/preset-icons@66.5.2': + dependencies: + '@iconify/utils': 3.0.2 + '@unocss/core': 66.5.2 + ofetch: 1.4.1 + transitivePeerDependencies: + - supports-color + + '@unocss/preset-mini@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/extractor-arbitrary-variants': 66.5.2 + '@unocss/rule-utils': 66.5.2 + + '@unocss/preset-tagify@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + + '@unocss/preset-typography@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/rule-utils': 66.5.2 + + '@unocss/preset-uno@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/preset-wind3': 66.5.2 + + '@unocss/preset-web-fonts@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + ofetch: 1.4.1 + + '@unocss/preset-wind3@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/preset-mini': 66.5.2 + '@unocss/rule-utils': 66.5.2 + + '@unocss/preset-wind4@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/extractor-arbitrary-variants': 66.5.2 + '@unocss/rule-utils': 66.5.2 + + '@unocss/preset-wind@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/preset-wind3': 66.5.2 + + '@unocss/reset@66.5.2': {} + + '@unocss/rule-utils@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + magic-string: 0.30.19 + + '@unocss/transformer-attributify-jsx@66.5.2': + dependencies: + '@babel/parser': 7.27.7 + '@babel/traverse': 7.27.7 + '@unocss/core': 66.5.2 + transitivePeerDependencies: + - supports-color + + '@unocss/transformer-compile-class@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + + '@unocss/transformer-directives@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + '@unocss/rule-utils': 66.5.2 + css-tree: 3.1.0 + + '@unocss/transformer-variant-group@66.5.2': + dependencies: + '@unocss/core': 66.5.2 + + '@unocss/vite@66.5.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@jridgewell/remapping': 2.3.5 + '@unocss/config': 66.5.2 + '@unocss/core': 66.5.2 + '@unocss/inspector': 66.5.2 + chokidar: 3.6.0 + magic-string: 0.30.19 + pathe: 2.0.3 + tinyglobby: 0.2.15 + unplugin-utils: 0.3.0 + vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + + '@unocss/vite@66.5.2(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))': + dependencies: + '@jridgewell/remapping': 2.3.5 + '@unocss/config': 66.5.2 + '@unocss/core': 66.5.2 + '@unocss/inspector': 66.5.2 + chokidar: 3.6.0 + magic-string: 0.30.19 + pathe: 2.0.3 + tinyglobby: 0.2.15 + unplugin-utils: 0.3.0 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + + '@unocss/webpack@66.5.2(webpack@5.102.0(esbuild@0.25.10))': + dependencies: + '@jridgewell/remapping': 2.3.5 + '@unocss/config': 66.5.2 + '@unocss/core': 66.5.2 + chokidar: 3.6.0 + magic-string: 0.30.19 + pathe: 2.0.3 + tinyglobby: 0.2.15 + unplugin: 2.3.10 + unplugin-utils: 0.3.0 + webpack: 5.102.0(esbuild@0.25.10) + webpack-sources: 3.3.3 + '@unrs/resolver-binding-android-arm-eabi@1.11.1': optional: true @@ -6040,41 +7006,59 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@unvuetify/nuxt-i18n-utils@https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008(@nuxt/schema@4.1.2)(@nuxtjs/i18n@10.1.0(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2)))(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': + '@unvuetify/nuxt-i18n-utils@https://pkg.pr.new/@unvuetify/nuxt-i18n-utils@a348008(@nuxt/schema@4.1.2)(@nuxtjs/i18n@10.1.0(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2)))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': dependencies: '@nuxt/schema': 4.1.2 '@nuxtjs/i18n': 10.1.0(@vue/compiler-dom@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(rollup@4.52.0)(vue@3.5.21(typescript@5.9.2)) - vuetify: 3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + vuetify: file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + + '@unvuetify/nuxt-utils@https://pkg.pr.new/@unvuetify/nuxt-utils@a348008(unimport@5.3.0)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': + dependencies: + '@unvuetify/shared': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + '@unvuetify/unimport-presets': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/unimport-presets@a348008(unimport@5.3.0)(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + '@unvuetify/vite-styles-plugin': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/vite-styles-plugin@a348008(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + transitivePeerDependencies: + - unimport + - vite + - vuetify - '@unvuetify/nuxt-utils@https://pkg.pr.new/@unvuetify/nuxt-utils@a348008(unimport@5.3.0)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': + '@unvuetify/nuxt-utils@https://pkg.pr.new/@unvuetify/nuxt-utils@a348008(unimport@5.3.0)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': dependencies: - '@unvuetify/shared': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) - '@unvuetify/unimport-presets': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/unimport-presets@a348008(unimport@5.3.0)(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) - '@unvuetify/vite-styles-plugin': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/vite-styles-plugin@a348008(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + '@unvuetify/shared': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + '@unvuetify/unimport-presets': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/unimport-presets@a348008(unimport@5.3.0)(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + '@unvuetify/vite-styles-plugin': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/vite-styles-plugin@a348008(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) transitivePeerDependencies: - unimport - vite - vuetify - '@unvuetify/shared@https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': + '@unvuetify/shared@https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': dependencies: upath: 2.0.1 - vuetify: 3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + vuetify: file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) - '@unvuetify/unimport-presets@https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/unimport-presets@a348008(unimport@5.3.0)(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': + '@unvuetify/unimport-presets@https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/unimport-presets@a348008(unimport@5.3.0)(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': dependencies: - '@unvuetify/shared': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + '@unvuetify/shared': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) unimport: 5.3.0 transitivePeerDependencies: - vuetify - '@unvuetify/vite-styles-plugin@https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/vite-styles-plugin@a348008(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': + '@unvuetify/vite-styles-plugin@https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/vite-styles-plugin@a348008(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': dependencies: - '@unvuetify/shared': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + '@unvuetify/shared': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) pathe: 2.0.3 upath: 2.0.1 vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) - vuetify: 3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + vuetify: file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) + + '@unvuetify/vite-styles-plugin@https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/vite-styles-plugin@a348008(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)))': + dependencies: + '@unvuetify/shared': https://pkg.pr.new/userquin/unvuetify-monorepo/@unvuetify/shared@a348008(vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2))) + pathe: 2.0.3 + upath: 2.0.1 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vuetify: file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)) '@vercel/nft@0.30.1(rollup@4.52.0)': dependencies: @@ -6100,19 +7084,37 @@ snapshots: '@babel/core': 7.28.4 '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) - '@rolldown/pluginutils': 1.0.0-beta.38 + '@rolldown/pluginutils': 1.0.0-beta.41 '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4) vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) vue: 3.5.21(typescript@5.9.2) transitivePeerDependencies: - supports-color + '@vitejs/plugin-vue-jsx@5.1.1(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': + dependencies: + '@babel/core': 7.28.4 + '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.4) + '@babel/plugin-transform-typescript': 7.28.0(@babel/core@7.28.4) + '@rolldown/pluginutils': 1.0.0-beta.41 + '@vue/babel-plugin-jsx': 1.5.0(@babel/core@7.28.4) + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vue: 3.5.21(typescript@5.9.2) + transitivePeerDependencies: + - supports-color + '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.29 vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) vue: 3.5.21(typescript@5.9.2) + '@vitejs/plugin-vue@6.0.1(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': + dependencies: + '@rolldown/pluginutils': 1.0.0-beta.29 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vue: 3.5.21(typescript@5.9.2) + '@vitest/expect@3.2.4': dependencies: '@types/chai': 5.2.2 @@ -6265,6 +7267,18 @@ snapshots: transitivePeerDependencies: - vite + '@vue/devtools-core@7.7.7(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2))': + 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.1.0(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + vue: 3.5.21(typescript@5.9.2) + transitivePeerDependencies: + - vite + '@vue/devtools-kit@7.7.7': dependencies: '@vue/devtools-shared': 7.7.7 @@ -6329,6 +7343,86 @@ snapshots: '@vue/shared@3.5.21': {} + '@webassemblyjs/ast@1.14.1': + dependencies: + '@webassemblyjs/helper-numbers': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + + '@webassemblyjs/floating-point-hex-parser@1.13.2': {} + + '@webassemblyjs/helper-api-error@1.13.2': {} + + '@webassemblyjs/helper-buffer@1.14.1': {} + + '@webassemblyjs/helper-numbers@1.13.2': + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.13.2 + '@webassemblyjs/helper-api-error': 1.13.2 + '@xtuc/long': 4.2.2 + + '@webassemblyjs/helper-wasm-bytecode@1.13.2': {} + + '@webassemblyjs/helper-wasm-section@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/wasm-gen': 1.14.1 + + '@webassemblyjs/ieee754@1.13.2': + dependencies: + '@xtuc/ieee754': 1.2.0 + + '@webassemblyjs/leb128@1.13.2': + dependencies: + '@xtuc/long': 4.2.2 + + '@webassemblyjs/utf8@1.13.2': {} + + '@webassemblyjs/wasm-edit@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/helper-wasm-section': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-opt': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + '@webassemblyjs/wast-printer': 1.14.1 + + '@webassemblyjs/wasm-gen@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wasm-opt@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-buffer': 1.14.1 + '@webassemblyjs/wasm-gen': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + + '@webassemblyjs/wasm-parser@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/helper-api-error': 1.13.2 + '@webassemblyjs/helper-wasm-bytecode': 1.13.2 + '@webassemblyjs/ieee754': 1.13.2 + '@webassemblyjs/leb128': 1.13.2 + '@webassemblyjs/utf8': 1.13.2 + + '@webassemblyjs/wast-printer@1.14.1': + dependencies: + '@webassemblyjs/ast': 1.14.1 + '@xtuc/long': 4.2.2 + + '@xtuc/ieee754@1.2.0': {} + + '@xtuc/long@4.2.2': {} + abbrev@3.0.1: {} abort-controller@3.0.0: @@ -6339,6 +7433,10 @@ snapshots: dependencies: acorn: 8.15.0 + acorn-import-phases@1.0.4(acorn@8.15.0): + dependencies: + acorn: 8.15.0 + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: acorn: 8.15.0 @@ -6347,6 +7445,15 @@ snapshots: agent-base@7.1.4: {} + ajv-formats@2.1.1(ajv@8.17.1): + optionalDependencies: + ajv: 8.17.1 + + ajv-keywords@5.1.0(ajv@8.17.1): + dependencies: + ajv: 8.17.1 + fast-deep-equal: 3.1.3 + ajv@6.12.6: dependencies: fast-deep-equal: 3.1.3 @@ -6354,6 +7461,13 @@ snapshots: json-schema-traverse: 0.4.1 uri-js: 4.4.1 + ajv@8.17.1: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + alien-signals@2.0.7: {} ansi-regex@5.0.1: {} @@ -6368,6 +7482,8 @@ snapshots: ansis@4.1.0: {} + ansis@4.2.0: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -6436,12 +7552,16 @@ snapshots: baseline-browser-mapping@2.8.6: {} + binary-extensions@2.3.0: {} + bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 birpc@2.5.0: {} + birpc@2.6.1: {} + boolbase@1.0.0: {} brace-expansion@1.1.12: @@ -6545,12 +7665,26 @@ 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 chownr@3.0.0: {} + chrome-trace-event@1.0.4: {} + ci-info@4.3.0: {} citty@0.1.6: @@ -6583,6 +7717,8 @@ snapshots: colord@2.9.3: {} + colorette@2.0.20: {} + commander@11.1.0: {} commander@2.20.3: {} @@ -6791,6 +7927,8 @@ snapshots: dotenv@17.2.2: {} + dts-resolver@2.1.2: {} + duplexer@0.1.2: {} eastasianwidth@0.2.0: {} @@ -6803,8 +7941,15 @@ snapshots: emoji-regex@9.2.2: {} + empathic@2.0.0: {} + encodeurl@2.0.0: {} + enhanced-resolve@5.18.3: + dependencies: + graceful-fs: 4.2.11 + tapable: 2.3.0 + entities@4.5.0: {} error-stack-parser-es@1.0.5: {} @@ -6972,6 +8117,11 @@ snapshots: '@vue/compiler-sfc': 3.5.21 eslint: 9.36.0(jiti@2.5.1) + eslint-scope@5.1.1: + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 @@ -7045,6 +8195,8 @@ snapshots: dependencies: estraverse: 5.3.0 + estraverse@4.3.0: {} + estraverse@5.3.0: {} estree-walker@2.0.2: {} @@ -7097,6 +8249,8 @@ snapshots: fast-npm-meta@0.4.6: {} + fast-uri@3.1.0: {} + fastq@1.19.1: dependencies: reusify: 1.1.0 @@ -7189,6 +8343,8 @@ snapshots: dependencies: is-glob: 4.0.3 + glob-to-regexp@0.4.1: {} + glob@10.4.5: dependencies: foreground-child: 3.3.1 @@ -7202,8 +8358,12 @@ snapshots: dependencies: ini: 4.1.1 + globals@11.12.0: {} + globals@14.0.0: {} + globals@15.15.0: {} + globals@16.4.0: {} globby@14.1.0: @@ -7219,6 +8379,10 @@ snapshots: graphemer@1.4.0: {} + gzip-size@6.0.0: + dependencies: + duplexer: 0.1.2 + gzip-size@7.0.0: dependencies: duplexer: 0.1.2 @@ -7311,6 +8475,10 @@ snapshots: iron-webcrypto@1.2.1: {} + is-binary-path@2.1.0: + dependencies: + binary-extensions: 2.3.0 + is-builtin-module@5.0.0: dependencies: builtin-modules: 5.0.0 @@ -7384,6 +8552,12 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 + jest-worker@27.5.1: + dependencies: + '@types/node': 24.6.2 + merge-stream: 2.0.0 + supports-color: 8.1.1 + jiti@1.21.7: {} jiti@2.5.1: {} @@ -7406,8 +8580,12 @@ snapshots: json-buffer@3.0.1: {} + json-parse-even-better-errors@2.3.1: {} + json-schema-traverse@0.4.1: {} + json-schema-traverse@1.0.0: {} + json-stable-stringify-without-jsonify@1.0.1: {} json5@2.2.3: {} @@ -7431,6 +8609,8 @@ snapshots: knitwork@1.2.0: {} + kolorist@1.8.0: {} + launch-editor@2.11.1: dependencies: picocolors: 1.1.1 @@ -7468,6 +8648,8 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 + loader-runner@4.3.0: {} + local-pkg@1.1.2: dependencies: mlly: 1.8.0 @@ -7535,8 +8717,14 @@ snapshots: braces: 3.0.3 picomatch: 2.3.1 + mime-db@1.52.0: {} + mime-db@1.54.0: {} + mime-types@2.1.35: + dependencies: + mime-db: 1.52.0 + mime-types@3.0.1: dependencies: mime-db: 1.54.0 @@ -7621,7 +8809,9 @@ snapshots: natural-compare@1.4.0: {} - nitropack@2.12.6: + neo-async@2.6.2: {} + + nitropack@2.12.6(rolldown@1.0.0-beta.41): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@rollup/plugin-alias': 5.1.1(rollup@4.52.0) @@ -7664,35 +8854,171 @@ snapshots: magicast: 0.3.5 mime: 4.1.0 mlly: 1.8.0 - node-fetch-native: 1.6.7 - node-mock-http: 1.0.3 + node-fetch-native: 1.6.7 + node-mock-http: 1.0.3 + ofetch: 1.4.1 + ohash: 2.0.11 + pathe: 2.0.3 + perfect-debounce: 2.0.0 + pkg-types: 2.3.0 + pretty-bytes: 7.1.0 + radix3: 1.1.2 + rollup: 4.52.0 + rollup-plugin-visualizer: 6.0.3(rolldown@1.0.0-beta.41)(rollup@4.52.0) + scule: 1.3.0 + semver: 7.7.2 + serve-placeholder: 2.0.2 + serve-static: 2.2.0 + source-map: 0.7.6 + std-env: 3.9.0 + ufo: 1.6.1 + ultrahtml: 1.6.0 + uncrypto: 0.1.3 + unctx: 2.4.1 + unenv: 2.0.0-rc.21 + unimport: 5.3.0 + unplugin-utils: 0.3.0 + unstorage: 1.17.1(db0@0.3.2)(ioredis@5.7.0) + untyped: 2.0.0 + unwasm: 0.3.11 + youch: 4.1.0-beta.11 + youch-core: 0.3.3 + transitivePeerDependencies: + - '@azure/app-configuration' + - '@azure/cosmos' + - '@azure/data-tables' + - '@azure/identity' + - '@azure/keyvault-secrets' + - '@azure/storage-blob' + - '@capacitor/preferences' + - '@deno/kv' + - '@electric-sql/pglite' + - '@libsql/client' + - '@netlify/blobs' + - '@planetscale/database' + - '@upstash/redis' + - '@vercel/blob' + - '@vercel/functions' + - '@vercel/kv' + - aws4fetch + - better-sqlite3 + - drizzle-orm + - encoding + - idb-keyval + - mysql2 + - react-native-b4a + - rolldown + - sqlite3 + - supports-color + - uploadthing + + node-addon-api@7.1.1: {} + + node-fetch-native@1.6.7: {} + + node-fetch@2.7.0: + dependencies: + whatwg-url: 5.0.0 + + node-forge@1.3.1: {} + + node-gyp-build@4.8.4: {} + + node-mock-http@1.0.3: {} + + node-releases@2.0.21: {} + + nopt@8.1.0: + dependencies: + abbrev: 3.0.1 + + normalize-path@3.0.0: {} + + normalize-range@0.1.2: {} + + npm-run-path@5.3.0: + dependencies: + path-key: 4.0.0 + + npm-run-path@6.0.0: + dependencies: + path-key: 4.0.0 + unicorn-magic: 0.3.0 + + nth-check@2.1.1: + dependencies: + boolbase: 1.0.0 + + nuxt-define@1.0.0: {} + + nuxt@4.1.2(@parcel/watcher@2.5.1)(@types/node@24.5.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.41)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2))(yaml@2.8.1): + dependencies: + '@nuxt/cli': 3.28.0(magicast@0.3.5) + '@nuxt/devalue': 2.0.2 + '@nuxt/devtools': 2.6.5(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@nuxt/kit': 4.1.2(magicast@0.3.5) + '@nuxt/schema': 4.1.2 + '@nuxt/telemetry': 2.6.6(magicast@0.3.5) + '@nuxt/vite-builder': 4.1.2(@types/node@24.5.2)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.41)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2))(vue@3.5.21(typescript@5.9.2))(yaml@2.8.1) + '@unhead/vue': 2.0.17(vue@3.5.21(typescript@5.9.2)) + '@vue/shared': 3.5.21 + c12: 3.3.0(magicast@0.3.5) + chokidar: 4.0.3 + compatx: 0.2.0 + consola: 3.4.2 + cookie-es: 2.0.0 + defu: 6.1.4 + destr: 2.0.5 + devalue: 5.3.2 + errx: 0.1.0 + esbuild: 0.25.10 + escape-string-regexp: 5.0.0 + estree-walker: 3.0.3 + exsolve: 1.0.7 + h3: 1.15.4 + hookable: 5.5.3 + ignore: 7.0.5 + impound: 1.0.0 + jiti: 2.5.1 + klona: 2.0.6 + knitwork: 1.2.0 + magic-string: 0.30.19 + mlly: 1.8.0 + mocked-exports: 0.1.1 + nanotar: 0.2.0 + nitropack: 2.12.6(rolldown@1.0.0-beta.41) + nypm: 0.6.2 ofetch: 1.4.1 ohash: 2.0.11 + on-change: 5.0.1 + oxc-minify: 0.87.0 + oxc-parser: 0.87.0 + oxc-transform: 0.87.0 + oxc-walker: 0.5.2(oxc-parser@0.87.0) pathe: 2.0.3 perfect-debounce: 2.0.0 pkg-types: 2.3.0 - pretty-bytes: 7.1.0 radix3: 1.1.2 - rollup: 4.52.0 - rollup-plugin-visualizer: 6.0.3(rollup@4.52.0) scule: 1.3.0 semver: 7.7.2 - serve-placeholder: 2.0.2 - serve-static: 2.2.0 - source-map: 0.7.6 std-env: 3.9.0 + tinyglobby: 0.2.15 ufo: 1.6.1 ultrahtml: 1.6.0 uncrypto: 0.1.3 unctx: 2.4.1 - unenv: 2.0.0-rc.21 unimport: 5.3.0 - unplugin-utils: 0.3.0 + unplugin: 2.3.10 + unplugin-vue-router: 0.15.0(@vue/compiler-sfc@3.5.21)(typescript@5.9.2)(vue-router@4.5.1(vue@3.5.21(typescript@5.9.2)))(vue@3.5.21(typescript@5.9.2)) unstorage: 1.17.1(db0@0.3.2)(ioredis@5.7.0) untyped: 2.0.0 - unwasm: 0.3.11 - youch: 4.1.0-beta.11 - youch-core: 0.3.3 + vue: 3.5.21(typescript@5.9.2) + vue-bundle-renderer: 2.1.2 + vue-devtools-stub: 0.1.0 + vue-router: 4.5.1(vue@3.5.21(typescript@5.9.2)) + optionalDependencies: + '@parcel/watcher': 2.5.1 + '@types/node': 24.5.2 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -7700,6 +9026,7 @@ snapshots: - '@azure/identity' - '@azure/keyvault-secrets' - '@azure/storage-blob' + - '@biomejs/biome' - '@capacitor/preferences' - '@deno/kv' - '@electric-sql/pglite' @@ -7710,66 +9037,53 @@ snapshots: - '@vercel/blob' - '@vercel/functions' - '@vercel/kv' + - '@vue/compiler-sfc' - aws4fetch - better-sqlite3 + - bufferutil + - db0 - drizzle-orm - encoding + - eslint - idb-keyval + - ioredis + - less + - lightningcss + - magicast + - meow - mysql2 + - optionator - react-native-b4a - rolldown + - rollup + - sass + - sass-embedded - sqlite3 + - stylelint + - stylus + - sugarss - supports-color + - terser + - tsx + - typescript - uploadthing + - utf-8-validate + - vite + - vls + - vti + - vue-tsc + - xml2js + - yaml - node-addon-api@7.1.1: {} - - node-fetch-native@1.6.7: {} - - node-fetch@2.7.0: - dependencies: - whatwg-url: 5.0.0 - - node-forge@1.3.1: {} - - node-gyp-build@4.8.4: {} - - node-mock-http@1.0.3: {} - - node-releases@2.0.21: {} - - nopt@8.1.0: - dependencies: - abbrev: 3.0.1 - - normalize-path@3.0.0: {} - - normalize-range@0.1.2: {} - - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - - npm-run-path@6.0.0: - dependencies: - path-key: 4.0.0 - unicorn-magic: 0.3.0 - - nth-check@2.1.1: - dependencies: - boolbase: 1.0.0 - - nuxt-define@1.0.0: {} - - nuxt@4.1.2(@parcel/watcher@2.5.1)(@types/node@24.5.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2))(yaml@2.8.1): + nuxt@4.1.2(@parcel/watcher@2.5.1)(@types/node@24.6.2)(@vue/compiler-sfc@3.5.21)(db0@0.3.2)(eslint@9.36.0(jiti@2.5.1))(ioredis@5.7.0)(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.41)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2))(yaml@2.8.1): dependencies: '@nuxt/cli': 3.28.0(magicast@0.3.5) '@nuxt/devalue': 2.0.2 - '@nuxt/devtools': 2.6.5(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) + '@nuxt/devtools': 2.6.5(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)) '@nuxt/kit': 4.1.2(magicast@0.3.5) '@nuxt/schema': 4.1.2 '@nuxt/telemetry': 2.6.6(magicast@0.3.5) - '@nuxt/vite-builder': 4.1.2(@types/node@24.5.2)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(optionator@0.9.4)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2))(vue@3.5.21(typescript@5.9.2))(yaml@2.8.1) + '@nuxt/vite-builder': 4.1.2(@types/node@24.6.2)(eslint@9.36.0(jiti@2.5.1))(magicast@0.3.5)(optionator@0.9.4)(rolldown@1.0.0-beta.41)(rollup@4.52.0)(terser@5.44.0)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2))(vue@3.5.21(typescript@5.9.2))(yaml@2.8.1) '@unhead/vue': 2.0.17(vue@3.5.21(typescript@5.9.2)) '@vue/shared': 3.5.21 c12: 3.3.0(magicast@0.3.5) @@ -7796,7 +9110,7 @@ snapshots: mlly: 1.8.0 mocked-exports: 0.1.1 nanotar: 0.2.0 - nitropack: 2.12.6 + nitropack: 2.12.6(rolldown@1.0.0-beta.41) nypm: 0.6.2 ofetch: 1.4.1 ohash: 2.0.11 @@ -7828,7 +9142,7 @@ snapshots: vue-router: 4.5.1(vue@3.5.21(typescript@5.9.2)) optionalDependencies: '@parcel/watcher': 2.5.1 - '@types/node': 24.5.2 + '@types/node': 24.6.2 transitivePeerDependencies: - '@azure/app-configuration' - '@azure/cosmos' @@ -8346,6 +9660,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: {} @@ -8371,6 +9689,8 @@ snapshots: require-directory@2.1.1: {} + require-from-string@2.0.2: {} + resolve-from@4.0.0: {} resolve-from@5.0.0: {} @@ -8387,6 +9707,46 @@ snapshots: rfdc@1.4.1: {} + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.41)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2)): + dependencies: + '@babel/generator': 7.28.3 + '@babel/parser': 7.28.4 + '@babel/types': 7.28.4 + ast-kit: 2.1.2 + birpc: 2.6.1 + debug: 4.4.3 + dts-resolver: 2.1.2 + get-tsconfig: 4.10.1 + magic-string: 0.30.19 + rolldown: 1.0.0-beta.41 + optionalDependencies: + typescript: 5.9.2 + vue-tsc: 3.0.8(typescript@5.9.2) + transitivePeerDependencies: + - oxc-resolver + - supports-color + + rolldown@1.0.0-beta.41: + dependencies: + '@oxc-project/types': 0.93.0 + '@rolldown/pluginutils': 1.0.0-beta.41 + ansis: 4.2.0 + optionalDependencies: + '@rolldown/binding-android-arm64': 1.0.0-beta.41 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.41 + '@rolldown/binding-darwin-x64': 1.0.0-beta.41 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.41 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.41 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.41 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.41 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.41 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.41 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.41 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.41 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.41 + '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.41 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.41 + rollup-plugin-dts@6.2.3(rollup@4.52.0)(typescript@5.9.2): dependencies: magic-string: 0.30.19 @@ -8395,13 +9755,14 @@ snapshots: optionalDependencies: '@babel/code-frame': 7.27.1 - rollup-plugin-visualizer@6.0.3(rollup@4.52.0): + rollup-plugin-visualizer@6.0.3(rolldown@1.0.0-beta.41)(rollup@4.52.0): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: + rolldown: 1.0.0-beta.41 rollup: 4.52.0 rollup@4.52.0: @@ -8444,6 +9805,13 @@ snapshots: sax@1.4.1: {} + schema-utils@4.3.3: + dependencies: + '@types/json-schema': 7.0.15 + ajv: 8.17.1 + ajv-formats: 2.1.1(ajv@8.17.1) + ajv-keywords: 5.1.0(ajv@8.17.1) + scslre@0.3.0: dependencies: '@eslint-community/regexpp': 4.12.1 @@ -8622,6 +9990,10 @@ snapshots: dependencies: has-flag: 4.0.0 + supports-color@8.1.1: + dependencies: + has-flag: 4.0.0 + supports-preserve-symlinks-flag@1.0.0: {} svgo@4.0.0: @@ -8636,6 +10008,8 @@ snapshots: system-architecture@0.1.0: {} + tapable@2.3.0: {} + tar-stream@3.1.7: dependencies: b4a: 1.7.1 @@ -8653,6 +10027,17 @@ snapshots: mkdirp: 3.0.1 yallist: 5.0.0 + terser-webpack-plugin@5.3.14(esbuild@0.25.10)(webpack@5.102.0(esbuild@0.25.10)): + dependencies: + '@jridgewell/trace-mapping': 0.3.31 + jest-worker: 27.5.1 + schema-utils: 4.3.3 + serialize-javascript: 6.0.2 + terser: 5.44.0 + webpack: 5.102.0(esbuild@0.25.10) + optionalDependencies: + esbuild: 0.25.10 + terser@5.44.0: dependencies: '@jridgewell/source-map': 0.3.11 @@ -8697,6 +10082,8 @@ snapshots: tr46@0.0.3: {} + tree-kill@1.2.2: {} + ts-api-utils@2.1.0(typescript@5.9.2): dependencies: typescript: 5.9.2 @@ -8705,6 +10092,31 @@ snapshots: optionalDependencies: typescript: 5.9.2 + tsdown@0.15.6(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2)): + dependencies: + ansis: 4.1.0 + cac: 6.7.14 + chokidar: 4.0.3 + debug: 4.4.3 + diff: 8.0.2 + empathic: 2.0.0 + hookable: 5.5.3 + rolldown: 1.0.0-beta.41 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.41)(typescript@5.9.2)(vue-tsc@3.0.8(typescript@5.9.2)) + semver: 7.7.2 + tinyexec: 1.0.1 + tinyglobby: 0.2.15 + tree-kill: 1.2.2 + unconfig: 7.3.3 + optionalDependencies: + typescript: 5.9.2 + transitivePeerDependencies: + - '@ts-macro/tsc' + - '@typescript/native-preview' + - oxc-resolver + - supports-color + - vue-tsc + tslib@2.8.1: optional: true @@ -8756,6 +10168,13 @@ snapshots: - vue-sfc-transformer - vue-tsc + unconfig@7.3.3: + dependencies: + '@quansync/fs': 0.1.5 + defu: 6.1.4 + jiti: 2.5.1 + quansync: 0.2.11 + uncrypto@0.1.3: {} unctx@2.4.1: @@ -8767,6 +10186,8 @@ snapshots: undici-types@7.12.0: {} + undici-types@7.13.0: {} + unenv@2.0.0-rc.21: dependencies: defu: 6.1.4 @@ -8798,6 +10219,62 @@ snapshots: unplugin: 2.3.10 unplugin-utils: 0.3.0 + unocss@66.5.2(@unocss/webpack@66.5.2(webpack@5.102.0(esbuild@0.25.10)))(postcss@8.5.6)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)): + dependencies: + '@unocss/astro': 66.5.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + '@unocss/cli': 66.5.2 + '@unocss/core': 66.5.2 + '@unocss/postcss': 66.5.2(postcss@8.5.6) + '@unocss/preset-attributify': 66.5.2 + '@unocss/preset-icons': 66.5.2 + '@unocss/preset-mini': 66.5.2 + '@unocss/preset-tagify': 66.5.2 + '@unocss/preset-typography': 66.5.2 + '@unocss/preset-uno': 66.5.2 + '@unocss/preset-web-fonts': 66.5.2 + '@unocss/preset-wind': 66.5.2 + '@unocss/preset-wind3': 66.5.2 + '@unocss/preset-wind4': 66.5.2 + '@unocss/transformer-attributify-jsx': 66.5.2 + '@unocss/transformer-compile-class': 66.5.2 + '@unocss/transformer-directives': 66.5.2 + '@unocss/transformer-variant-group': 66.5.2 + '@unocss/vite': 66.5.2(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + optionalDependencies: + '@unocss/webpack': 66.5.2(webpack@5.102.0(esbuild@0.25.10)) + vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + transitivePeerDependencies: + - postcss + - supports-color + + unocss@66.5.2(@unocss/webpack@66.5.2(webpack@5.102.0(esbuild@0.25.10)))(postcss@8.5.6)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)): + dependencies: + '@unocss/astro': 66.5.2(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + '@unocss/cli': 66.5.2 + '@unocss/core': 66.5.2 + '@unocss/postcss': 66.5.2(postcss@8.5.6) + '@unocss/preset-attributify': 66.5.2 + '@unocss/preset-icons': 66.5.2 + '@unocss/preset-mini': 66.5.2 + '@unocss/preset-tagify': 66.5.2 + '@unocss/preset-typography': 66.5.2 + '@unocss/preset-uno': 66.5.2 + '@unocss/preset-web-fonts': 66.5.2 + '@unocss/preset-wind': 66.5.2 + '@unocss/preset-wind3': 66.5.2 + '@unocss/preset-wind4': 66.5.2 + '@unocss/transformer-attributify-jsx': 66.5.2 + '@unocss/transformer-compile-class': 66.5.2 + '@unocss/transformer-directives': 66.5.2 + '@unocss/transformer-variant-group': 66.5.2 + '@unocss/vite': 66.5.2(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + optionalDependencies: + '@unocss/webpack': 66.5.2(webpack@5.102.0(esbuild@0.25.10)) + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + transitivePeerDependencies: + - postcss + - supports-color + unplugin-utils@0.2.5: dependencies: pathe: 2.0.3 @@ -8945,10 +10422,20 @@ snapshots: vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) vite-hot-client: 2.1.0(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + vite-dev-rpc@1.1.0(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)): + dependencies: + birpc: 2.5.0 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vite-hot-client: 2.1.0(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + vite-hot-client@2.1.0(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vite-hot-client@2.1.0(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)): + dependencies: + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vite-node@3.2.4(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1): dependencies: cac: 6.7.14 @@ -8970,6 +10457,27 @@ snapshots: - tsx - yaml + vite-node@3.2.4(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1): + dependencies: + cac: 6.7.14 + debug: 4.4.3 + es-module-lexer: 1.7.0 + pathe: 2.0.3 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + transitivePeerDependencies: + - '@types/node' + - jiti + - less + - lightningcss + - sass + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + vite-plugin-checker@0.10.3(eslint@9.36.0(jiti@2.5.1))(optionator@0.9.4)(typescript@5.9.2)(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2)): dependencies: '@babel/code-frame': 7.27.1 @@ -8988,6 +10496,24 @@ snapshots: typescript: 5.9.2 vue-tsc: 3.0.8(typescript@5.9.2) + vite-plugin-checker@0.10.3(eslint@9.36.0(jiti@2.5.1))(optionator@0.9.4)(typescript@5.9.2)(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue-tsc@3.0.8(typescript@5.9.2)): + dependencies: + '@babel/code-frame': 7.27.1 + chokidar: 4.0.3 + npm-run-path: 6.0.0 + picocolors: 1.1.1 + picomatch: 4.0.3 + strip-ansi: 7.1.2 + tiny-invariant: 1.3.3 + tinyglobby: 0.2.15 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vscode-uri: 3.1.0 + optionalDependencies: + eslint: 9.36.0(jiti@2.5.1) + optionator: 0.9.4 + typescript: 5.9.2 + vue-tsc: 3.0.8(typescript@5.9.2) + vite-plugin-inspect@11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: ansis: 4.1.0 @@ -9005,6 +10531,23 @@ snapshots: transitivePeerDependencies: - supports-color + vite-plugin-inspect@11.3.3(@nuxt/kit@3.19.2(magicast@0.3.5))(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)): + dependencies: + ansis: 4.1.0 + debug: 4.4.3 + error-stack-parser-es: 1.0.5 + ohash: 2.0.11 + open: 10.2.0 + perfect-debounce: 2.0.0 + sirv: 3.0.2 + unplugin-utils: 0.3.0 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vite-dev-rpc: 1.1.0(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) + optionalDependencies: + '@nuxt/kit': 3.19.2(magicast@0.3.5) + transitivePeerDependencies: + - supports-color + vite-plugin-vue-tracer@1.0.0(vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)): dependencies: estree-walker: 3.0.3 @@ -9015,6 +10558,16 @@ snapshots: vite: 7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) vue: 3.5.21(typescript@5.9.2) + vite-plugin-vue-tracer@1.0.0(vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1))(vue@3.5.21(typescript@5.9.2)): + dependencies: + estree-walker: 3.0.3 + exsolve: 1.0.7 + magic-string: 0.30.19 + pathe: 2.0.3 + source-map-js: 1.2.1 + vite: 7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1) + vue: 3.5.21(typescript@5.9.2) + vite@7.1.6(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1): dependencies: esbuild: 0.25.10 @@ -9030,6 +10583,21 @@ snapshots: terser: 5.44.0 yaml: 2.8.1 + vite@7.1.6(@types/node@24.6.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1): + dependencies: + esbuild: 0.25.10 + fdir: 6.5.0(picomatch@4.0.3) + picomatch: 4.0.3 + postcss: 8.5.6 + rollup: 4.52.0 + tinyglobby: 0.2.15 + optionalDependencies: + '@types/node': 24.6.2 + fsevents: 2.3.3 + jiti: 2.5.1 + terser: 5.44.0 + yaml: 2.8.1 + vitest-environment-nuxt@1.0.1(magicast@0.3.5)(typescript@5.9.2)(vitest@3.2.4(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)): dependencies: '@nuxt/test-utils': 3.19.2(magicast@0.3.5)(typescript@5.9.2)(vitest@3.2.4(@types/node@24.5.2)(jiti@2.5.1)(terser@5.44.0)(yaml@2.8.1)) @@ -9108,6 +10676,8 @@ snapshots: transitivePeerDependencies: - supports-color + vue-flow-layout@0.2.0: {} + vue-i18n@11.1.12(vue@3.5.21(typescript@5.9.2)): dependencies: '@intlify/core-base': 11.1.12 @@ -9143,16 +10713,55 @@ snapshots: optionalDependencies: typescript: 5.9.2 - vuetify@3.10.2(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)): + vuetify@file:vuetify-3.10.4.tgz(typescript@5.9.2)(vue@3.5.21(typescript@5.9.2)): dependencies: vue: 3.5.21(typescript@5.9.2) optionalDependencies: typescript: 5.9.2 + watchpack@2.4.4: + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + webidl-conversions@3.0.1: {} + webpack-sources@3.3.3: {} + webpack-virtual-modules@0.6.2: {} + webpack@5.102.0(esbuild@0.25.10): + dependencies: + '@types/eslint-scope': 3.7.7 + '@types/estree': 1.0.8 + '@types/json-schema': 7.0.15 + '@webassemblyjs/ast': 1.14.1 + '@webassemblyjs/wasm-edit': 1.14.1 + '@webassemblyjs/wasm-parser': 1.14.1 + acorn: 8.15.0 + acorn-import-phases: 1.0.4(acorn@8.15.0) + browserslist: 4.26.2 + chrome-trace-event: 1.0.4 + enhanced-resolve: 5.18.3 + es-module-lexer: 1.7.0 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 4.3.3 + tapable: 2.3.0 + terser-webpack-plugin: 5.3.14(esbuild@0.25.10)(webpack@5.102.0(esbuild@0.25.10)) + watchpack: 2.4.4 + webpack-sources: 3.3.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + whatwg-url@5.0.0: dependencies: tr46: 0.0.3 diff --git a/src/context.ts b/src/context.ts index 1d35687..dd40dae 100644 --- a/src/context.ts +++ b/src/context.ts @@ -1,32 +1,15 @@ import type { Resolver } from '@nuxt/kit' import type { Nuxt } from '@nuxt/schema' import type { ProxifiedModule, ProxifiedObject } from 'magicast' -import type { VuetifyOptions } from 'vuetify' -import type { ResolvedIcons } from './icons/types' +import type { ResolvedIcons } from './icons' import type { ResolvedClientHints } from './ssr-client-hints' -import type { MOptions, VuetifyModuleOptions } from './types' +import type { ExtendedNuxtVuetifyOptions, MOptions, VuetifyModuleOptions } from './types' import { normalize } from 'pathe' -// import { prepareConfiguration } from './prepare-configuration' -// import { prepareRulesConfiguration } from './prepare-rules-configuration' -// import { generateCode } from 'magicast' import { loadConfiguration } from './load-configuration' +import type { Import } from './load-configuration' export const CONFIG_KEY = 'vuetify' -export interface Import { - from: string - local: string - imported: string -} - -export interface VuetifyOptionsInfo { - path?: string - mode: 'default' | 'inline' | 'external' - vuetifyOptions: ProxifiedObject - module: ProxifiedModule - importsMap: Map -} - export interface VuetifyRules { aliases?: { [name: string]: unknown } } @@ -43,8 +26,7 @@ export interface VuetifyNuxtContext { resolver: Resolver logger: ReturnType moduleOptions: MOptions - vuetifyOptions: VuetifyOptionsInfo - vuetifyOptionsModules: VuetifyOptionsInfo[] + vuetifyOptions: ProxifiedObject imports: Map configurationImports: string enableRules: boolean @@ -52,7 +34,6 @@ export interface VuetifyNuxtContext { fromLabs: boolean rulesImports: Map imports: string - externalRules: VuetifyRulesInfo[] rulesOptions: ProxifiedObject } vuetifyFilesToWatch: string[] @@ -62,8 +43,28 @@ export interface VuetifyNuxtContext { isNuxtGenerate: boolean sources: [rootDir: string, isFile: boolean, sources: string[]][] unocss: boolean + unocssInstalled: boolean icons: ResolvedIcons ssrClientHints: ResolvedClientHints + tsdownEnabled: boolean + virtualModules: { + options: { + js: string + dts: string + } + rules: { + js: string + dts: string + } + ssr: { + js: string + dts: string + } + unocss: { + js: string + dts: string + } + } } export async function load( @@ -72,7 +73,6 @@ export async function load( ctx: VuetifyNuxtContext, ) { ctx.imports.clear() - ctx.vuetifyOptionsModules = [] ctx.vuetifyFilesToWatch = [] ctx.configurationImports = '' ctx.rulesConfiguration.rulesImports.clear() diff --git a/src/icons.ts b/src/icons.ts new file mode 100644 index 0000000..5e7e424 --- /dev/null +++ b/src/icons.ts @@ -0,0 +1,293 @@ +import type { Nuxt } from '@nuxt/schema' +import type { IconFontNameType, UnoCSSMdiIconSet } from './types' +import type { VuetifyNuxtContext } from './context' +import { IconFontName } from './types' +import { isPackageExists } from 'local-pkg' +import { generateCode } from 'magicast' + +export interface ResolvedIcons { + unocss?: { + prefix: string + collection: string + icons?: UnoCSSMdiIconSet + additionalIcons?: Record + } + fontIcons: Map + local: Map + autoInstallLocalFontIcons: boolean +} + +export async function prepareIconsOptions( + ctx: VuetifyNuxtContext, +) { + ctx.icons = { + fontIcons: new Map(), + local: new Map(), + autoInstallLocalFontIcons: ctx.vuetifyOptions.autoInstallLocalFontIcons === true, + } + + for await (const [name, css, local] of checkLocalIconFonts(ctx)) { + if (local) { + ctx.icons.local.set(name, css) + } + else { + ctx.icons.fontIcons.set(name, css) + } + } + + delete ctx.vuetifyOptions.fontIcons + delete ctx.vuetifyOptions.localFontIcons + delete ctx.vuetifyOptions.autoInstallLocalFontIcons + + ctx.unocss = ctx.unocssInstalled && ( + !!ctx.vuetifyOptions.unocss + || Array.from(ctx.imports.values()).some(({ from }) => from === '#build/vuetify/iconsets/unocss.mjs') + ) + + if (ctx.unocss) { + if (ctx.vuetifyOptions.unocss) { + const icons = ctx.vuetifyOptions.unocss.icons + const additionalIcons = ctx.vuetifyOptions.unocss.additionalIcons + ctx.icons.unocss = { + prefix: ctx.vuetifyOptions.unocss.prefix || 'i-', + collection: ctx.vuetifyOptions.unocss.collection || 'mdi', + icons: icons ? JSON.parse(generateCode(icons).code) : undefined, + additionalIcons: additionalIcons ? JSON.parse(generateCode(additionalIcons).code) : undefined, + } + } + else { + ctx.icons.unocss = { + prefix: 'i-', + collection: 'mdi', + } + } + } + + delete ctx.vuetifyOptions.unocss +} + +const iconsPackageNames: Record = { + mdi: { name: '@mdi/font', css: '@mdi/font/css/materialdesignicons.css' }, + md: { name: 'material-design-icons-iconfont', css: '@mdi/font/css/materialdesignicons.css' }, + fa: { name: '@fortawesome/fontawesome-free', css: '@fortawesome/fontawesome-free/css/all.css' }, + fa4: { name: 'font-awesome@4.7.0', css: 'font-awesome/css/font-awesome.min.css' }, +} + +const IconsPackagesNames = new Set(Object.values(iconsPackageNames).map(value => value.name)) + +const iconsCDN: Record = { + mdi: 'https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css', + md: 'https://fonts.googleapis.com/css?family=Material+Icons', + fa: 'https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@latest/css/all.min.css', + fa4: 'https://cdn.jsdelivr.net/npm/font-awesome@4.x/css/font-awesome.min.css', +} + +async function* checkLocalIconFonts( + ctx: VuetifyNuxtContext, +): AsyncGenerator<[ + name: IconFontNameType, + css: string, + local: boolean, +], undefined, void> { + const css = new Set(IconFontName) + + // first local defined fonts + if (ctx.vuetifyOptions.localFontIcons) { + for (const name of ctx.vuetifyOptions.localFontIcons) { + if (name in iconsPackageNames) { + const entry = iconsPackageNames[name as IconFontNameType].css + css.delete(name) + if (isPackageExists(entry)) { + yield [name as IconFontNameType, entry, true] + } + else { + ctx.logger.warn(`Missing local font at "localFontIcons" ${name}, ignoring the font css`) + } + } + } + } + + // next auto detect local fonts + if (ctx.vuetifyOptions.autoInstallLocalFontIcons && css.size > 0) { + for (const name of css) { + const entry = iconsPackageNames[name].css + if (isPackageExists(entry)) { + css.delete(name) + yield [name, entry, true] + } + } + } + + // last ones the CDN links + if (ctx.vuetifyOptions.fontIcons && css.size > 0) { + for (const [name, cdn] of ctx.vuetifyOptions.fontIcons) { + if (css.has(name)) { + css.delete(name) + yield [name, cdn || iconsCDN[name], false] + } + } + } +} + +export function resolveUnoCSSIcons( + options: ResolvedIcons, +) { + const { + prefix, + collection, + icons, + additionalIcons, + } = options.unocss! + + const usePrefix = `${prefix.endsWith('-') ? prefix : `${prefix}-`}${collection}` + + const useIcons: import('vuetify/framework').IconAliases = { + ...additionalIcons, + collapse: `${usePrefix}:chevron-up`, + complete: `${usePrefix}:check`, + cancel: `${usePrefix}:close-circle`, + close: `${usePrefix}:close`, + // delete (e.g. v-chip close) + delete: `${usePrefix}:close-circle`, + clear: `${usePrefix}:close-circle`, + success: `${usePrefix}:check-circle`, + info: `${usePrefix}:information`, + warning: `${usePrefix}:alert-circle`, + error: `${usePrefix}:close-circle`, + prev: `${usePrefix}:chevron-left`, + next: `${usePrefix}:chevron-right`, + checkboxOn: `${usePrefix}:checkbox-marked`, + checkboxOff: `${usePrefix}:checkbox-blank-outline`, + checkboxIndeterminate: `${usePrefix}:minus-box`, + delimiter: `${usePrefix}:circle`, + // for carousel + sortAsc: `${usePrefix}:arrow-up`, + sortDesc: `${usePrefix}:arrow-down`, + expand: `${usePrefix}:chevron-down`, + menu: `${usePrefix}:menu`, + subgroup: `${usePrefix}:menu-down`, + dropdown: `${usePrefix}:menu-down`, + radioOn: `${usePrefix}:radiobox-marked`, + radioOff: `${usePrefix}:radiobox-blank`, + edit: `${usePrefix}:pencil`, + ratingEmpty: `${usePrefix}:star-outline`, + ratingFull: `${usePrefix}:star`, + ratingHalf: `${usePrefix}:star-half-full`, + loading: `${usePrefix}:cached`, + first: `${usePrefix}:page-first`, + last: `${usePrefix}:page-last`, + unfold: `${usePrefix}:unfold-more-horizontal`, + file: `${usePrefix}:paperclip`, + plus: `${usePrefix}:plus`, + minus: `${usePrefix}:minus`, + calendar: `${usePrefix}:calendar`, + treeviewCollapse: `${usePrefix}:menu-down`, + treeviewExpand: `${usePrefix}:menu-right`, + tableGroupCollapse: `${usePrefix}:chevron-down`, + tableGroupExpand: `${usePrefix}:chevron-right`, + eyeDropper: `${usePrefix}:eyedropper`, + upload: `${usePrefix}:cloud-upload`, + color: `${usePrefix}:palette`, + command: `${usePrefix}:apple-keyboard-command`, + ctrl: `${usePrefix}:apple-keyboard-control`, + space: `${usePrefix}:keyboard-space`, + shift: `${usePrefix}:apple-keyboard-shift`, + alt: `${usePrefix}:apple-keyboard-option`, + enter: `${usePrefix}:keyboard-return`, + arrowup: `${usePrefix}:arrow-up`, + arrowdown: `${usePrefix}:arrow-down`, + arrowleft: `${usePrefix}:arrow-left`, + arrowright: `${usePrefix}:arrow-right`, + backspace: `${usePrefix}:backspace`, + play: `${usePrefix}:play`, + pause: `${usePrefix}:pause`, + fullscreen: `${usePrefix}:fullscreen`, + fullscreenExit: `${usePrefix}:fullscreen-exit`, + volumeHigh: `${usePrefix}:volume-high`, + volumeMedium: `${usePrefix}:volume-medium`, + volumeLow: `${usePrefix}:volume-low`, + volumeOff: `${usePrefix}:volume-variant-off`, + } + + if (icons) { + for (const [key, value] of Object.entries(icons)) { + if (!(key in useIcons)) + continue + let icon = value.startsWith(usePrefix) ? value.slice(usePrefix.length) : value + if (icon[0] === '-' || icon[0] === ':') { + icon = icon.slice(1) + } + useIcons[key as keyof typeof useIcons] = `${usePrefix}:${icon}` + } + } + + return useIcons +} + +export function registerIconFonts( + nuxt: Nuxt, + options: ResolvedIcons, +) { + /* + // clear olf stuff: review this, I guess it is not required anymore => Nuxt will be restarted + const oldCdnIcons = oldOptions?.cdn + const oldHead = nuxt.options.app.head?.link + if (oldCdnIcons && oldHead && oldHead.length > 0) { + nuxt.options.app.head.link = oldHead.filter(link => !link.key || !oldCdnIcons.some(([key]) => link.key === key)) + } + const oldLocalIcons = oldOptions?.local + const oldCss = nuxt.options.css + if (oldLocalIcons && oldCss && oldCss.length > 0) { + nuxt.options.css = oldCss.filter(css => !oldLocalIcons.includes(css)) + } + */ + // handle old stuff + let links = nuxt.options.app.head?.link + if (links) { + const oldLinks = [...links] + const newLinks: typeof links = [] + for (const link of oldLinks) { + if (link.key) { + const entry = link.key.match(/^vuetify-(.+)-icon-font$/) + if (entry && iconsCDN[entry[1] as IconFontNameType]) { + continue + } + } + newLinks.push(link) + } + nuxt.options.app.head.link = newLinks + } + let css = nuxt.options.css + if (css) { + const oldCss = [...css] + const newCss: typeof css = [] + for (const entry of oldCss) { + if (IconsPackagesNames.has(entry)) { + continue + } + newCss.push(entry) + } + nuxt.options.css = newCss + } + + // handle new stuff + if (options.fontIcons.size > 0) { + nuxt.options.app.head ??= { link: [] } + links = nuxt.options.app.head.link = nuxt.options.app.head.link ?? [] + for (const [key, href] of options.fontIcons) { + links.push({ + key: `vuetify-${key}-icon-font`, + rel: 'stylesheet', + href, + type: 'text/css', + crossorigin: 'anonymous', + }) + } + } + if (options.local.size > 0) { + css = nuxt.options.css = nuxt.options.css ?? [] + for (const url of options.local.values()) { + css.push(url) + } + } +} diff --git a/src/icons/font.ts b/src/icons/font.ts deleted file mode 100644 index 9d66fcf..0000000 --- a/src/icons/font.ts +++ /dev/null @@ -1,41 +0,0 @@ -import type { Nuxt } from '@nuxt/schema' -import type { ResolvedIcons } from './types' - -export function registerIconFonts( - nuxt: Nuxt, - options: ResolvedIcons, - oldOptions?: ResolvedIcons, -) { - // clear olf stuff: review this, I guess it is not required anymore => Nuxt will be restarted - const oldCdnIcons = oldOptions?.cdn - const oldHead = nuxt.options.app.head?.link - if (oldCdnIcons && oldHead && oldHead.length > 0) { - nuxt.options.app.head.link = oldHead.filter(link => !link.key || !oldCdnIcons.some(([key]) => link.key === key)) - } - const oldLocalIcons = oldOptions?.local - const oldCss = nuxt.options.css - if (oldLocalIcons && oldCss && oldCss.length > 0) { - nuxt.options.css = oldCss.filter(css => !oldLocalIcons.includes(css)) - } - - // handle new stuff - if (options.cdn.length > 0) { - nuxt.options.app.head ??= { link: [] } - const links = nuxt.options.app.head.link = nuxt.options.app.head.link ?? [] - for (const [key, href] of Object.values(options.cdn)) { - links.push({ - key, - rel: 'stylesheet', - href, - type: 'text/css', - crossorigin: 'anonymous', - }) - } - } - if (options.local.length > 0) { - const css = nuxt.options.css = nuxt.options.css ?? [] - for (const url of Object.values(options.local)) { - css.push(url) - } - } -} diff --git a/src/icons/prepare-icons-runtime.ts b/src/icons/prepare-icons-runtime.ts deleted file mode 100644 index 84060a6..0000000 --- a/src/icons/prepare-icons-runtime.ts +++ /dev/null @@ -1,59 +0,0 @@ -import type { Nuxt } from '@nuxt/schema' -import type { VuetifyNuxtContext } from '../context' -import type { IconsOptions } from '../types' -import { addPluginTemplate } from '@nuxt/kit' -import { registerIconFonts } from './font' -import { prepareUnoCSSIconSet } from './unocss' -import { prepareIcons } from './utils' - -export function prepareIconsRuntime( - nuxt: Nuxt, - ctx: VuetifyNuxtContext, -) { - const { icons } = ctx.moduleOptions - if (icons === false) - return - - // use vuetify defaults => mdi icon font from cdn - const options: IconsOptions = icons === true - ? { - sets: ['mdi'], - defaultSet: 'mdi', - } - : icons ?? { - sets: ['mdi'], - defaultSet: 'mdi', - } - - const resolvedOptions = prepareIcons(ctx.unocss, ctx.logger, options) - if (resolvedOptions.enabled) { - // UnoCSS support - prepareUnoCSSIconSet(resolvedOptions) - // CDN and local icon fonts support - registerIconFonts(nuxt, resolvedOptions/* , ctx.icons */) - - resolvedOptions.registerIconsPlugin = !!ctx.vuetifyOptions.vuetifyOptions.icons?.$ast - if (resolvedOptions.registerIconsPlugin) { - addPluginTemplate({ - write: true, - filename: 'vuetify/plugins/icons.mjs', - getContents: () => { - return `// Generated by vuetify-nuxt-module -import { defineNuxtPlugin } from '#imports' - -export default defineNuxtPlugin({ - name: 'vuetify:icons:plugin', - parallel: true, - setup(nuxtApp) { - nuxtApp.hook('vuetify:before-create', ({ vuetifyOptions }) => { - }) - } -}) -` - }, - }) - } - } - - ctx.icons = resolvedOptions -} diff --git a/src/icons/types.ts b/src/icons/types.ts deleted file mode 100644 index 27de4d7..0000000 --- a/src/icons/types.ts +++ /dev/null @@ -1,23 +0,0 @@ -import type { IconSetNameType, UnoCSSMdiIconSet } from '../types' - -export interface ResolvedIcons { - enabled: boolean - registerIconsPlugin: boolean - unocss: boolean - unocssAliases: boolean - unocssIconPrefix: string - unocssIconCollection: string - unocssIcons: UnoCSSMdiIconSet - unocssAdditionalIcons: Record - defaultSet?: IconSetNameType - sets: string[] - cdn: [key: string, cdn: string][] - local: string[] - aliases: string[] - aliasesImportPresent: boolean - imports: string[] - svg: { - mdi?: boolean - fa?: string[] - } -} diff --git a/src/icons/unocss.ts b/src/icons/unocss.ts deleted file mode 100644 index c80f9d0..0000000 --- a/src/icons/unocss.ts +++ /dev/null @@ -1,140 +0,0 @@ -import type { ResolvedIcons } from './types' -import { addTemplate, addTypeTemplate } from '@nuxt/kit' - -export function prepareUnoCSSIconSet( - options: ResolvedIcons, -) { - if (!options.enabled) { - return - } - - const icons = resolveIcons(options) - - addTypeTemplate({ - write: true, - filename: 'vuetify/iconsets/unocss.d.ts', - getContents: () => `// Generated by vuetify-nuxt-module -import type { IconAliases } from "vuetify/framework"; -declare const aliases: IconAliases; -declare const defaultSet: string; -declare const unocss: IconSet; - -export { aliases, defaultSet, unocss }; -`, - }) - - addTemplate({ - write: true, - filename: 'vuetify/iconsets/unocss.js', - getContents: () => `// @unocss-include -// Generated by vuetify-nuxt-module -import { VClassIcon } from 'vuetify/lib/composables/icons'; -import { h } from '#imports'; - -const aliases = ${JSON.stringify(icons, null, 2)}; -const defaultSet = 'unocss'; -const unocss = { - component: props => h(VClassIcon, { - ...props, - class: 'mdi' - }) -}; -export { aliases, defaultSet, unocss }; -`, - }) -} - -function resolveIcons( - options: ResolvedIcons, -) { - const { - unocssIconPrefix: prefix, - unocssIconCollection: collection, - unocssIcons: icons, - unocssAdditionalIcons: additionalIcons, - } = options - - const usePrefix = `${prefix.endsWith('-') ? prefix : `${prefix}-`}${collection}` - - const useIcons: import('vuetify/framework').IconAliases = { - ...additionalIcons, - collapse: `${usePrefix}:chevron-up`, - complete: `${usePrefix}:check`, - cancel: `${usePrefix}:close-circle`, - close: `${usePrefix}:close`, - // delete (e.g. v-chip close) - delete: `${usePrefix}:close-circle`, - clear: `${usePrefix}:close-circle`, - success: `${usePrefix}:check-circle`, - info: `${usePrefix}:information`, - warning: `${usePrefix}:alert-circle`, - error: `${usePrefix}:close-circle`, - prev: `${usePrefix}:chevron-left`, - next: `${usePrefix}:chevron-right`, - checkboxOn: `${usePrefix}:checkbox-marked`, - checkboxOff: `${usePrefix}:checkbox-blank-outline`, - checkboxIndeterminate: `${usePrefix}:minus-box`, - delimiter: `${usePrefix}:circle`, - // for carousel - sortAsc: `${usePrefix}:arrow-up`, - sortDesc: `${usePrefix}:arrow-down`, - expand: `${usePrefix}:chevron-down`, - menu: `${usePrefix}:menu`, - subgroup: `${usePrefix}:menu-down`, - dropdown: `${usePrefix}:menu-down`, - radioOn: `${usePrefix}:radiobox-marked`, - radioOff: `${usePrefix}:radiobox-blank`, - edit: `${usePrefix}:pencil`, - ratingEmpty: `${usePrefix}:star-outline`, - ratingFull: `${usePrefix}:star`, - ratingHalf: `${usePrefix}:star-half-full`, - loading: `${usePrefix}:cached`, - first: `${usePrefix}:page-first`, - last: `${usePrefix}:page-last`, - unfold: `${usePrefix}:unfold-more-horizontal`, - file: `${usePrefix}:paperclip`, - plus: `${usePrefix}:plus`, - minus: `${usePrefix}:minus`, - calendar: `${usePrefix}:calendar`, - treeviewCollapse: `${usePrefix}:menu-down`, - treeviewExpand: `${usePrefix}:menu-right`, - tableGroupCollapse: `${usePrefix}:chevron-down`, - tableGroupExpand: `${usePrefix}:chevron-right`, - eyeDropper: `${usePrefix}:eyedropper`, - upload: `${usePrefix}:cloud-upload`, - color: `${usePrefix}:palette`, - command: `${usePrefix}:apple-keyboard-command`, - ctrl: `${usePrefix}:apple-keyboard-control`, - space: `${usePrefix}:keyboard-space`, - shift: `${usePrefix}:apple-keyboard-shift`, - alt: `${usePrefix}:apple-keyboard-option`, - enter: `${usePrefix}:keyboard-return`, - arrowup: `${usePrefix}:arrow-up`, - arrowdown: `${usePrefix}:arrow-down`, - arrowleft: `${usePrefix}:arrow-left`, - arrowright: `${usePrefix}:arrow-right`, - backspace: `${usePrefix}:backspace`, - play: `${usePrefix}:play`, - pause: `${usePrefix}:pause`, - fullscreen: `${usePrefix}:fullscreen`, - fullscreenExit: `${usePrefix}:fullscreen-exit`, - volumeHigh: `${usePrefix}:volume-high`, - volumeMedium: `${usePrefix}:volume-medium`, - volumeLow: `${usePrefix}:volume-low`, - volumeOff: `${usePrefix}:volume-variant-off`, - } - - if (icons) { - for (const [key, value] of Object.entries(icons)) { - if (!(key in useIcons)) - continue - let icon = value.startsWith(usePrefix) ? value.slice(usePrefix.length) : value - if (icon[0] === '-' || icon[0] === ':') { - icon = icon.slice(1) - } - useIcons[key as keyof typeof useIcons] = `${usePrefix}:${icon}` - } - } - - return useIcons -} diff --git a/src/icons/utils.ts b/src/icons/utils.ts deleted file mode 100644 index 5ba814c..0000000 --- a/src/icons/utils.ts +++ /dev/null @@ -1,192 +0,0 @@ -import type { FontIconSet, IconFontNameType, IconsOptions } from '../types' -import type { ResolvedIcons } from './types' -import { isPackageExists } from 'local-pkg' -import { IconFontName } from '../types' - -const disabledResolvedIcons: ResolvedIcons = Object.freeze({ - enabled: false, - registerIconsPlugin: false, - unocss: false, - unocssAliases: false, - unocssIconPrefix: 'i-', - unocssIconCollection: 'mdi', - unocssIcons: {}, - unocssAdditionalIcons: {}, - imports: [], - aliases: [], - aliasesImportPresent: false, - sets: [], - cdn: [], - local: [], - svg: {}, -}) - -const iconsPackageNames: Record = { - mdi: { name: '@mdi/font', css: '@mdi/font/css/materialdesignicons.css' }, - md: { name: 'material-design-icons-iconfont', css: '@mdi/font/css/materialdesignicons.css' }, - fa: { name: '@fortawesome/fontawesome-free', css: '@fortawesome/fontawesome-free/css/all.css' }, - fa4: { name: 'font-awesome@4.7.0', css: 'font-awesome/css/font-awesome.min.css' }, -} - -const iconsCDN: Record = { - mdi: 'https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css', - md: 'https://fonts.googleapis.com/css?family=Material+Icons', - fa: 'https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@latest/css/all.min.css', - fa4: 'https://cdn.jsdelivr.net/npm/font-awesome@4.x/css/font-awesome.min.css', -} - -export function prepareIcons( - unocssPresent: boolean, - logger: ReturnType, - icons: IconsOptions, -): ResolvedIcons { - let { defaultSet = 'mdi', sets } = icons - - if (!defaultSet) - defaultSet = icons.defaultSet = 'mdi' - - sets = sets ? convertFontSetsToObjectNotation(sets) : [] - - const resolvedIcons: ResolvedIcons = { - enabled: true, - registerIconsPlugin: false, - unocss: unocssPresent && defaultSet === 'unocss', - unocssAliases: defaultSet === 'unocss', - unocssIconPrefix: icons.unocss?.prefix ?? 'i-', - unocssIconCollection: icons.unocss?.collection ?? 'mdi', - unocssIcons: icons.unocss?.icons ?? {}, - unocssAdditionalIcons: icons.unocss?.additionalIcons ?? {}, - defaultSet, - sets: [], - aliases: [], - aliasesImportPresent: false, - imports: [], - cdn: [], - local: [], - svg: { - mdi: false, - }, - } - - if (sets.length > 0) { - sets.filter(s => IconFontName.includes(s.name)).forEach(({ name, cdn }) => { - resolvedIcons.aliasesImportPresent ||= (name === defaultSet) - resolvedIcons.imports.push(`import {${name === defaultSet ? 'aliases,' : ''}${name}} from \'vuetify/iconsets/${name}\'`) - resolvedIcons.sets.push(name) - if (isPackageExists(iconsPackageNames[name].name)) - resolvedIcons.local.push(iconsPackageNames[name].css) - else - resolvedIcons.cdn.push([name, cdn ?? iconsCDN[name]]) - }) - if (resolvedIcons.unocss && defaultSet === 'unocss') { - if (!resolvedIcons.sets.includes('mdi')) { - resolvedIcons.sets.push('mdi') - resolvedIcons.imports.push('import {mdi} from \'vuetify/iconsets/mdi\'') - } - - resolvedIcons.defaultSet = 'mdi' - } - } - - let faSvg = icons.svg?.fa - if (defaultSet === 'fa-svg' || faSvg) { - if (!faSvg) - faSvg = {} - - let faSvgExists = isPackageExists('@fortawesome/fontawesome-svg-core') - if (!faSvgExists) - logger.warn('Missing @fortawesome/fontawesome-svg-core dependency, install it!') - - faSvgExists = isPackageExists('@fortawesome/vue-fontawesome') - if (faSvgExists) { - if (!faSvg.libraries?.length) - faSvg.libraries = [[false, 'fas', '@fortawesome/free-solid-svg-icons']] - - for (const p in faSvg.libraries) { - const [_defaultExport, _name, library] = faSvg.libraries[p]! - if (!isPackageExists(library)) { - faSvgExists = false - logger.warn(`Missing library ${library} dependency, install it!`) - } - } - } - else { - logger.warn('Missing @fortawesome/vue-fontawesome dependency, install it!') - } - - if (faSvgExists) { - resolvedIcons.aliasesImportPresent ||= defaultSet === 'fa-svg' - resolvedIcons.imports.push(`import {${defaultSet === 'fa-svg' ? 'aliases,' : ''}fa} from 'vuetify/iconsets/fa-svg'`) - resolvedIcons.imports.push('import { library } from \'@fortawesome/fontawesome-svg-core\'') - resolvedIcons.imports.push('import { FontAwesomeIcon } from \'@fortawesome/vue-fontawesome\'') - resolvedIcons.imports.push('import { useNuxtApp } from \'#imports\'') - resolvedIcons.svg.fa = ['useNuxtApp().vueApp.component(\'font-awesome-icon\', FontAwesomeIcon)'] - faSvg.libraries!.forEach(([defaultExport, name, library]) => { - resolvedIcons.imports.push(`import ${defaultExport ? name : `{${name}}`} from '${library}'`) - resolvedIcons.svg.fa!.push(`library.add(${name})`) - }) - resolvedIcons.sets.push('fa') - if (defaultSet === 'fa-svg') - resolvedIcons.defaultSet = 'fa' - } - } - - let mdiSvg = icons.svg?.mdi - if (defaultSet === 'mdi-svg' || mdiSvg) { - if (!mdiSvg) - mdiSvg = {} - - const mdiSvgExists = isPackageExists('@mdi/js') - if (mdiSvgExists) { - resolvedIcons.svg.mdi = true - resolvedIcons.aliasesImportPresent ||= defaultSet === 'mdi-svg' - resolvedIcons.imports.push(`import {${defaultSet === 'mdi-svg' ? 'aliases,' : ''}mdi} from 'vuetify/iconsets/mdi-svg'`) - if (mdiSvg && mdiSvg.aliases) { - resolvedIcons.imports.push(`import {${Object.values(mdiSvg.aliases).join(',')}} from '@mdi/js'`) - Object.entries(mdiSvg.aliases).forEach(([alias, icon]) => { - resolvedIcons.aliases.push(`${alias}: ${icon}`) - }) - } - resolvedIcons.sets.push('mdi') - if (defaultSet === 'mdi-svg') - resolvedIcons.defaultSet = 'mdi' - } - else { - resolvedIcons.svg!.mdi = false - logger.warn('Missing @mdi/js dependency, install it!') - } - } - - if (defaultSet !== 'custom' && !resolvedIcons.unocss && !resolvedIcons.local?.length && !resolvedIcons.cdn?.length && !resolvedIcons.svg?.mdi && !resolvedIcons.svg?.fa?.length) { - logger.warn('No icons found, icons disabled!') - return disabledResolvedIcons - } - - if (resolvedIcons.unocss) { - if (resolvedIcons.defaultSet === 'unocss') { - resolvedIcons.imports.push('import {aliases as unocssAliases,defaultSet,unocss} from \'#build/vuetify-icons/unocss\'') - } - else { - resolvedIcons.imports.push('import {aliases as unocssAliases, unocss} from \'#build/vuetify-icons/unocss\'') - } - } - - return resolvedIcons -} - -function convertFontSetsToObjectNotation(sets: IconFontNameType | IconFontNameType[] | FontIconSet[]) { - const result: FontIconSet[] = [] - if (typeof sets === 'string') { - result.push({ name: sets }) - } - else { - for (const set of sets) { - if (typeof set === 'string') - result.push({ name: set }) - else - result.push(set) - } - } - - return result -} diff --git a/src/load-configuration.ts b/src/load-configuration.ts index e62e576..2452cec 100644 --- a/src/load-configuration.ts +++ b/src/load-configuration.ts @@ -8,6 +8,16 @@ import fsp from 'node:fs/promises' import fs from 'node:fs' import defu from 'defu' import { dirname, normalize, relative as relativePath, resolve } from 'pathe' +import { prepareIconsOptions } from './icons' + +export interface Import { + from: string + local: string + imported: string + relative: boolean + filePathWithExtension?: string + relativePath?: string +} interface VuetifyRules { aliases?: { [name: string]: unknown } @@ -17,13 +27,6 @@ interface ExternalVuetifyRules extends VuetifyRules { config: boolean } -interface Import { - from: string - local: string - imported: string - relative: boolean -} - interface VuetifyOptionsConfiguration { configuration: ProxifiedObject importsMap: Map @@ -50,12 +53,10 @@ export async function loadConfiguration( // vuetify options const rootVuetifyOptionsModule = parseModule('export default {}') const rootVuetifyOptions = getDefaultExportOptions(rootVuetifyOptionsModule) - const rootVuetifyOptionsImportsMap = new Map() let firstVuetifyOptionsImportsMap: Map | undefined // vuetify rules options const rootVuetifyRulesModule = parseModule('export default { aliases: {} }') const rootVuetifyRules = getDefaultExportOptions(rootVuetifyRulesModule) - const rootVuetifyRulesImportsMap = new Map() let firstVuetifyRulesImportsMap: Map | undefined const inlineModules: MOptions[] = [] let moduleOptions: MOptions = {} @@ -69,13 +70,14 @@ export async function loadConfiguration( ctx, options, inlineModules, + vuetifyConfigurationFilesToWatch, ) ) { // vuetify options if (vuetifyOptions.length > 0) { for (const { configuration, importsMap } of vuetifyOptions) { mergeConfiguration( - (imp, impl) => rootVuetifyOptionsImportsMap.set(imp, impl), + (imp, impl) => ctx.imports.set(imp, impl), rootVuetifyOptions, firstVuetifyOptionsImportsMap ?? new Map(), configuration, @@ -87,7 +89,7 @@ export async function loadConfiguration( // vuetify rules options if (rulesOptions) { mergeConfiguration( - (imp, impl) => rootVuetifyRulesImportsMap.set(imp, impl), + (imp, impl) => ctx.rulesConfiguration.rulesImports.set(imp, impl), rootVuetifyRules, firstVuetifyRulesImportsMap ?? new Map(), rulesOptions.configuration, @@ -102,31 +104,32 @@ export async function loadConfiguration( } ctx.moduleOptions = defu(options.moduleOptions, moduleOptions) - ctx.vuetifyOptions = { - mode: undefined!, - importsMap: undefined!, - module: undefined!, - vuetifyOptions: rootVuetifyOptions, - } + ctx.vuetifyOptions = rootVuetifyOptions ctx.rulesConfiguration.rulesOptions = rootVuetifyRules + const vuetifyBuildDir = resolve(nuxt.options.buildDir, 'vuetify') + const [configurationImports, rulesConfigurationImports] = await Promise.all([ collectImports( + vuetifyBuildDir, nuxt, ctx, - rootVuetifyOptionsImportsMap, + ctx.imports, vuetifyConfigurationFilesToWatch, ), collectImports( + vuetifyBuildDir, nuxt, ctx, - rootVuetifyRulesImportsMap, + ctx.rulesConfiguration.rulesImports, vuetifyConfigurationFilesToWatch, ), ]) ctx.configurationImports = configurationImports ctx.rulesConfiguration.imports = rulesConfigurationImports + + await prepareIconsOptions(ctx) } async function* checkModules( @@ -146,6 +149,7 @@ async function* checkModules( } async function collectImports( + vuetifyBuildDir: string, nuxt: Nuxt, ctx: VuetifyNuxtContext, globalImportMaps: Map, @@ -153,12 +157,15 @@ async function collectImports( ) { const imports = new Map() - for (const { local, imported, from, relative } of globalImportMaps.values()) { + for (const globalImport of globalImportMaps.values()) { + const { local, imported, from, relative } = globalImport let useFrom = from if (relative) { - useFrom = relativePath(resolve(nuxt.options.buildDir, 'vuetify'), from).replace(/\\/g, '/') + useFrom = relativePath(vuetifyBuildDir, from).replace(/\\/g, '/') + globalImport.relativePath = useFrom for await (const file of checkModules(from)) { vuetifyConfigurationFilesToWatch.add(file) + globalImport.filePathWithExtension = file } } let list = imports.get(useFrom) @@ -451,6 +458,7 @@ async function* readConfiguration( ctx: VuetifyNuxtContext, options: VuetifyModuleOptions, inlineModules: MOptions[], + vuetifyConfigurationFilesToWatch: Set, ): AsyncGenerator { let configuration: VuetifyConfiguration const layers = nuxt.options._layers.length @@ -471,6 +479,10 @@ async function* readConfiguration( true, ) if (vuetifyOptionsConfiguration) { + const path = vuetifyOptionsConfiguration.path + if (path) { + vuetifyConfigurationFilesToWatch.add(path) + } configuration.vuetifyOptions.push(vuetifyOptionsConfiguration) } } @@ -484,6 +496,10 @@ async function* readConfiguration( false, ) if (vuetifyOptionsConfiguration) { + const path = vuetifyOptionsConfiguration.path + if (path) { + vuetifyConfigurationFilesToWatch.add(path) + } configuration.vuetifyOptions.unshift(vuetifyOptionsConfiguration) } } @@ -492,9 +508,14 @@ async function* readConfiguration( nuxt, resolve(layer.config.rootDir, 'vuetify.rules'), ) + const path = configuration.rulesOptions?.path + if (path) { + vuetifyConfigurationFilesToWatch.add(path) + } } yield configuration } + configuration = { vuetifyOptions: [] } const { vuetifyOptions } = options if (typeof vuetifyOptions === 'object') { @@ -504,6 +525,10 @@ async function* readConfiguration( true, ) if (vuetifyOptionsConfiguration) { + const path = vuetifyOptionsConfiguration.path + if (path) { + vuetifyConfigurationFilesToWatch.add(path) + } configuration.vuetifyOptions.push(vuetifyOptionsConfiguration) } } @@ -517,6 +542,10 @@ async function* readConfiguration( false, ) if (vuetifyOptionsConfiguration) { + const path = vuetifyOptionsConfiguration.path + if (path) { + vuetifyConfigurationFilesToWatch.add(path) + } configuration.vuetifyOptions.unshift(vuetifyOptionsConfiguration) } } @@ -526,6 +555,10 @@ async function* readConfiguration( nuxt, resolve(nuxt.options.rootDir, 'vuetify.rules'), ) + const path = configuration.rulesOptions?.path + if (path) { + ctx.vuetifyFilesToWatch.push(path) + } } yield configuration diff --git a/src/module.ts b/src/module.ts index 09e988b..6605644 100644 --- a/src/module.ts +++ b/src/module.ts @@ -21,6 +21,7 @@ import { prepareNuxtRuntime } from './nuxt-runtime' import { addVuetifyNuxtTemplates } from './nuxt-templates' import { prepareSSRClientHints } from './ssr-client-hints' import { registerWatcher } from './watcher' +import { isPackageExists } from 'local-pkg' export type * from './types' @@ -73,12 +74,14 @@ export default defineNuxtModule({ if (isNuxtMajorVersion(2, nuxt)) logger.error(`This module doesn't support nuxt version: ${getNuxtVersion(nuxt)}`) + const tsdownEnabled = options.moduleOptions?.experimental?.tsdown === true && isPackageExists('tsdown') + const unocssInstalled = hasNuxtModule('@unocss/nuxt') + const ctx: VuetifyNuxtContext = { resolver: createResolver(import.meta.url), logger, moduleOptions: undefined!, vuetifyOptions: undefined!, - vuetifyOptionsModules: [], imports: new Map(), configurationImports: '', enableRules: options.enableVuetifyRules === true, @@ -86,7 +89,6 @@ export default defineNuxtModule({ fromLabs: true, rulesImports: new Map(), imports: '', - externalRules: [], rulesOptions: undefined!, }, vuetifyFilesToWatch: [], @@ -94,10 +96,30 @@ export default defineNuxtModule({ i18n: hasNuxtModule('@nuxtjs/i18n', nuxt), isSSR: nuxt.options.ssr, isNuxtGenerate: !!nuxt.options.nitro.static, - unocss: hasNuxtModule('@unocss/nuxt', nuxt), + unocss: unocssInstalled, + unocssInstalled, icons: undefined!, ssrClientHints: undefined!, sources: [], + tsdownEnabled, + virtualModules: { + options: { + js: '', + dts: '', + }, + rules: { + js: '', + dts: '', + }, + ssr: { + js: '', + dts: '', + }, + unocss: { + js: '', + dts: '', + }, + }, } // configure Vuetify: @@ -122,11 +144,6 @@ export default defineNuxtModule({ // configure HTTP Client Hints prepareSSRClientHints(nuxt, ctx) - // prepare Nuxt configuration templates - // - HTTP Client Hints configuration - // - Vuetify configuration - addVuetifyNuxtTemplates(nuxt, ctx) - // prepare Nuxt runtime // - inline styles // - add types @@ -136,9 +153,13 @@ export default defineNuxtModule({ // register watcher to avoid Nuxt restarts registerWatcher(options, nuxt, ctx) - /* + + // when all modules are ready nuxt.hook('modules:done', async () => { + // prepare Nuxt configuration templates + // - HTTP Client Hints configuration + // - Vuetify configuration + await addVuetifyNuxtTemplates(nuxt, ctx) }) -*/ }, }) diff --git a/src/nuxt-runtime.ts b/src/nuxt-runtime.ts index 5f9a7f2..da2009c 100644 --- a/src/nuxt-runtime.ts +++ b/src/nuxt-runtime.ts @@ -2,7 +2,7 @@ import type { Nuxt } from '@nuxt/schema' import type { VuetifyNuxtContext } from './context' import { addPlugin, addPluginTemplate } from '@nuxt/kit' import { CONFIG_KEY } from './context' -import { prepareIconsRuntime } from './icons/prepare-icons-runtime' +import { registerIconFonts } from './icons' export async function prepareNuxtRuntime( nuxt: Nuxt, @@ -18,10 +18,7 @@ export async function prepareNuxtRuntime( // transpile always vuetify and runtime folder nuxt.options.build.transpile.push(CONFIG_KEY) nuxt.options.build.transpile.push(runtimeDir) - nuxt.options.build.transpile.push('#build/vuetify/configuration.mjs') - if (ctx.enableRules) { - nuxt.options.build.transpile.push(`'#build/vuetify/${ctx.rulesConfiguration.fromLabs ? 'labs-' : ''}rules-configuration.mjs'`) - } + nuxt.options.build.transpile.push(/^#build\/vuetify\//) if (typeof ctx.moduleOptions.styles?.mode === 'undefined' || ctx.moduleOptions.styles.mode === true) { nuxt.options.css ??= [] @@ -29,17 +26,16 @@ export async function prepareNuxtRuntime( nuxt.options.css.unshift('vuetify/styles') } + registerIconFonts(nuxt, ctx.icons) + nuxt.hook('prepare:types', ({ nodeReferences, references }) => { nodeReferences.push({ types: 'vuetify-nuxt-module/custom-configuration' }) if (ctx.enableRules) { nodeReferences.push({ types: `vuetify-nuxt-module/custom-${ctx.rulesConfiguration.fromLabs ? 'labs-' : ''}rules-configuration` }) } - references.push({ types: 'vuetify-nuxt-module/configuration' }) references.push({ path: ctx.resolver.resolve(runtimeDir, 'plugins/types') }) }) - prepareIconsRuntime(nuxt, ctx) - if (ctx.i18n) { addPlugin({ src: ctx.resolver.resolve(runtimeDir, 'plugins/vuetify-i18n'), @@ -76,10 +72,6 @@ function addVuetifyNuxtPlugin( mode, getContents() { const dependsOn = [] as import('#app').NuxtAppLiterals['pluginName'][] - if (ctx.icons.registerIconsPlugin) { - // @ts-expect-error missing at build time - dependsOn.push('vuetify:icons:plugin') - } if (ctx.i18n) { // @ts-expect-error missing at build time dependsOn.push('vuetify:i18n:plugin') @@ -102,7 +94,7 @@ function addVuetifyNuxtPlugin( if (mode === 'client' && ctx.enableRules) { rulesImports = [ '', - `import { rulesOptions } from '#build/vuetify/${ctx.rulesConfiguration.fromLabs ? 'labs-' : ''}rules-configuration.mjs'`, + `import { rulesOptions } from '#build/vuetify/rules-configuration.mjs'`, `import { createRulesPlugin } from 'vuetify/${ctx.rulesConfiguration.fromLabs ? 'labs/' : ''}rules'`, ].join('\n') rulesPlugin = [ diff --git a/src/nuxt-templates.ts b/src/nuxt-templates.ts index c854055..693e8b5 100644 --- a/src/nuxt-templates.ts +++ b/src/nuxt-templates.ts @@ -1,33 +1,120 @@ import type { Nuxt } from '@nuxt/schema' import type { VuetifyNuxtContext } from './context' -import { addTemplate } from '@nuxt/kit' +import { addTemplate, addTypeTemplate } from '@nuxt/kit' import { generateCode } from 'magicast' +import { buildVuetifyClientHintsConfiguration, SSRClientHintsConfigurationDefinition } from './ssr-client-hints' +import { resolveUnoCSSIcons } from './icons' -export function addVuetifyNuxtTemplates( +export async function addVuetifyNuxtTemplates( nuxt: Nuxt, ctx: VuetifyNuxtContext, + fromWatcher = false, ) { + if (ctx.tsdownEnabled) { + await import('./nuxt-tsdown-templates').then(({ generateTSDownNuxtTemplates }) => generateTSDownNuxtTemplates(nuxt, ctx, fromWatcher)) + } + else { + registerTemplates(ctx) + } +} + +function registerTemplates(ctx: VuetifyNuxtContext) { + addTypeTemplate({ + filename: 'vuetify/configuration.d.ts', + write: true, + getContents: () => { + return `// Generated by vuetify-nuxt-module +declare module '#vuetify/configuration.mjs' { + import type { VuetifyOptions } from 'vuetify' + + export type { VuetifyOptions } + export function vuetifyConfiguration(): VuetifyOptions +} +` + }, + }, { shared: true }) addTemplate({ filename: 'vuetify/configuration.mjs', write: true, getContents: () => generateVuetifyConfiguration(ctx), }) - if (ctx.ssrClientHints.enabled) { + addTypeTemplate({ + filename: 'vuetify/ssr-client-hints-configuration.d.ts', + write: true, + getContents: () => `// Generated by vuetify-nuxt-module +declare module '#vuetify/ssr-client-hints-configuration.mjs' { + ${SSRClientHintsConfigurationDefinition} + + export const ssrClientHintsConfiguration: SSRClientHintsConfiguration +} +`, + }, { shared: true }) addTemplate({ filename: 'vuetify/ssr-client-hints-configuration.mjs', write: true, getContents: () => generateVuetifyClientHintsConfiguration(ctx), }) } - if (ctx.enableRules) { + const fromLabs = ctx.rulesConfiguration.fromLabs + addTypeTemplate({ + filename: `vuetify/rules-configuration.d.ts`, + write: true, + getContents: () => `// Generated by vuetify-nuxt-module +declare module '#vuetify/rules-configuration.mjs' { + import type { RulesOptions } from 'vuetify/${fromLabs ? 'labs/' : ''}rules' + + export type { RulesOptions } + + export const rulesOptions: RulesOptions +} +`, + }) addTemplate({ - filename: `vuetify/${ctx.rulesConfiguration.fromLabs ? 'labs-' : ''}rules-configuration.mjs`, + filename: `vuetify/rules-configuration.mjs`, write: true, getContents: () => generateRulesConfiguration(ctx), }) } + const unocss = ctx.icons.unocss + if (unocss) { + const icons = resolveUnoCSSIcons(ctx.icons) + addTypeTemplate({ + write: true, + filename: 'vuetify/iconsets/unocss.d.ts', + getContents: () => `// Generated by vuetify-nuxt-module +declare module '#build/vuetify/iconsets/unocss.mjs' { + import type { IconAliases } from "vuetify/framework"; + declare const aliases: IconAliases; + declare const defaultSet: string; + declare const unocss: IconSet; + + export { aliases, defaultSet, unocss }; +} +`, + }, { shared: true }) + + addTemplate({ + write: true, + filename: 'vuetify/iconsets/unocss.mjs', + getContents: () => `// @unocss-include +// Generated by vuetify-nuxt-module +import { VClassIcon } from 'vuetify/lib/composables/icons'; +import { h } from '#imports'; + +const aliases = ${JSON.stringify(icons, null, 2)}; +const defaultSet = 'unocss'; +const unocss = { + component: props => h(VClassIcon, { + ...props, + class: 'mdi' + }) +}; +export { aliases, defaultSet, unocss }; +`, + }) + } } function generateRulesConfiguration(ctx: VuetifyNuxtContext) { @@ -39,25 +126,11 @@ export const rulesOptions = ${generateCode(ctx.rulesConfiguration.rulesOptions). function generateVuetifyConfiguration(ctx: VuetifyNuxtContext) { return `${ctx.configurationImports} export function vuetifyConfiguration() { - return ${generateCode(ctx.vuetifyOptions.vuetifyOptions).code} + return ${generateCode(ctx.vuetifyOptions).code} } ` } function generateVuetifyClientHintsConfiguration(ctx: VuetifyNuxtContext) { - const ssr = ctx.vuetifyOptions.vuetifyOptions.ssr - const clientWidth = typeof ssr === 'boolean' ? undefined : ssr?.clientWidth - const clientHeight = typeof ssr === 'boolean' ? undefined : ssr?.clientHeight - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const data: Record = { - reloadOnFirstRequest: ctx.ssrClientHints.reloadOnFirstRequest, - viewportSize: ctx.ssrClientHints.viewportSize, - prefersColorScheme: ctx.ssrClientHints.prefersColorScheme, - prefersReducedMotion: ctx.ssrClientHints.prefersReducedMotion, - clientWidth, - clientHeight, - prefersColorSchemeOptions: ctx.ssrClientHints.prefersColorSchemeOptions, - } - - return `export const ssrClientHintsConfiguration = JSON.parse('${JSON.stringify(data)}');` + return `export const ssrClientHintsConfiguration = JSON.parse('${JSON.stringify(buildVuetifyClientHintsConfiguration(ctx))}');` } diff --git a/src/nuxt-tsdown-templates.ts b/src/nuxt-tsdown-templates.ts new file mode 100644 index 0000000..da339a0 --- /dev/null +++ b/src/nuxt-tsdown-templates.ts @@ -0,0 +1,280 @@ +import { build } from 'tsdown' +import { dirname, resolve } from 'pathe' +import type { Nuxt } from '@nuxt/schema' +import PluginAlias from '@rollup/plugin-alias' +import type { Alias } from '@rollup/plugin-alias' +import type { VuetifyNuxtContext } from './context' +import * as fsPromises from 'node:fs/promises' +import { generateCode } from 'magicast' +import { buildVuetifyClientHintsConfiguration, SSRClientHintsConfigurationDefinition } from './ssr-client-hints' +import { addTemplate, addTypeTemplate } from '@nuxt/kit' +import { resolveUnoCSSIcons } from './icons' + +export async function generateTSDownNuxtTemplates( + nuxt: Nuxt, + ctx: VuetifyNuxtContext, + fromWatcher: boolean, +): Promise { + const cwd = nuxt.options.buildDir + const buildDir = resolve(cwd, 'vuetify') + const vuetifyOptionsFile = resolve(buildDir, `${TEMPLATE_NAMES.options[2]}temp-vuetify-options.ts`) + const vuetifyRulesFile = resolve(buildDir, `${TEMPLATE_NAMES.rules[2]}temp-vuetify-rules.ts`) + const vuetifySSRFile = resolve(buildDir, `${TEMPLATE_NAMES.ssr[2]}temp-vuetify-ssr.ts`) + const vuetifyUnoCSSFile = resolve(buildDir, `${TEMPLATE_NAMES.unocss[2]}temp-vuetify-unocss.ts`) + const entry = [ + // set first unocss so its types are available when building options + ctx.icons.unocss ? vuetifyUnoCSSFile : undefined, + vuetifyOptionsFile, + ctx.enableRules ? vuetifyRulesFile : undefined, + ctx.ssrClientHints.enabled ? vuetifySSRFile : undefined, + ].filter(Boolean) as string[] + + await fsPromises.mkdir(buildDir, { recursive: true }) + + await Promise.all([ + generateTempVuetifyOptions(vuetifyOptionsFile, ctx), + generateTempVuetifyRules(vuetifyRulesFile, ctx), + generateTempVuetifySSR(vuetifySSRFile, ctx), + generateTempVuetifyUnoCSS(vuetifyUnoCSSFile, ctx), + ]) + + const entries = [...collectPluginEntries(ctx)] + + console.time('vuetify:tsdown') + await build({ + cwd, + tsconfig: resolve(nuxt.options.build ? cwd : nuxt.options.rootDir, 'tsconfig.json'), + outDir: buildDir, + format: 'esm', + platform: 'neutral', + clean: false, + entry, + dts: { + compilerOptions: { + paths: { + '#build/vuetify/iconsets/unocss.mjs': [resolve(buildDir, `${TEMPLATE_NAMES.unocss[2]}/unocss.d.ts`)], + }, + }, + }, + banner: `// Generated by vuetify-nuxt-module`, + external: [ + /.*/, // everything is external + ], + plugins: [ + PluginAlias({ + entries: entries.map(e => e[0]).concat({ + find: '#build/vuetify/iconsets/unocss.mjs', + replacement: resolve(buildDir, `${TEMPLATE_NAMES.unocss[2]}/unocss.mjs`), + }), + }), + ], + hooks: { + 'build:done': async () => { + await Promise.all([ + prepareVuetifyTemplates(ctx, 'options', true, !fromWatcher, buildDir), + prepareVuetifyTemplates(ctx, 'rules', ctx.enableRules, !fromWatcher, buildDir), + prepareVuetifyTemplates(ctx, 'ssr', ctx.ssrClientHints.enabled, !fromWatcher, buildDir), + prepareVuetifyTemplates(ctx, 'unocss', !!ctx.icons.unocss, !fromWatcher, buildDir), + ]) + console.timeEnd('vuetify:tsdown') + }, + }, + }) +} + +function* collectPluginEntries(ctx: VuetifyNuxtContext): Generator<[ + alias: Alias, + external: string | RegExp, +], undefined, void> { + for (const { local, relative, filePathWithExtension, relativePath } of ctx.imports.values()) { + if (relative && filePathWithExtension) { + yield [{ + find: local, + replacement: filePathWithExtension, + }, relativePath!] as const + } + } + if (ctx.enableRules) { + for (const { local, relative, filePathWithExtension, relativePath } of ctx.rulesConfiguration.rulesImports.values()) { + if (relative && filePathWithExtension) { + yield [{ + find: local, + replacement: filePathWithExtension, + }, relativePath!] as const + } + } + } +} + +type TemplateContext = { + nitro?: boolean + nuxt?: boolean + node?: boolean + shared?: boolean +} +const TEMPLATE_NAMES = { + unocss: ['unocss.mjs', 'unocss.d.ts', 'iconsets/', { shared: true } as TemplateContext], + options: ['configuration.mjs', 'configuration.d.ts', '', { shared: true } as TemplateContext], + rules: ['rules-configuration.mjs', 'rules-configuration.d.ts', '', { nuxt: true } as TemplateContext], + ssr: ['ssr-client-hints-configuration.mjs', 'ssr-client-hints-configuration.d.ts', '', { shared: true } as TemplateContext], +} as const + +async function prepareVuetifyTemplates( + ctx: VuetifyNuxtContext, + templateName: 'options' | 'rules' | 'ssr' | 'unocss', + isEnabled: boolean, + registerTemplate: boolean, + vuetifyDir: string, +) { + if (!isEnabled) { + if (ctx.virtualModules[templateName]) { + ctx.virtualModules[templateName] = { js: '', dts: '' } + } + return + } + + const prefix = TEMPLATE_NAMES[templateName][2] + + const files = [ + resolve(vuetifyDir, `${prefix}temp-vuetify-${templateName}.js`), + resolve(vuetifyDir, `${prefix}temp-vuetify-${templateName}.d.ts`), + ] + + const [js, dts] = await Promise.all(files.map(file => fsPromises.readFile(file, 'utf-8'))) + + ctx.virtualModules[templateName] = { + js: js!.replace(new RegExp(`//#region .*${templateName}.ts`), '').replace('//#endregion', ''), + dts: dts!.replace(new RegExp(`//#region .*${templateName}.d.ts`), '').replace('//#endregion', ''), + } + + if (registerTemplate) { + addTypeTemplate({ + filename: `vuetify/${prefix}${TEMPLATE_NAMES[templateName][1]}`, + write: true, + getContents: () => ctx.virtualModules[templateName].dts, + }, TEMPLATE_NAMES[templateName][3]) + addTemplate({ + filename: `vuetify/${prefix}${TEMPLATE_NAMES[templateName][0]}`, + write: true, + getContents: () => { + const content = ctx.virtualModules[templateName].js + return templateName === 'unocss' + ? `// @unocss-include\n${content}` + : content + }, + }) + } + else { + const dts = ctx.virtualModules[templateName]['dts'] + const js = ctx.virtualModules[templateName]['js'] + const files = [TEMPLATE_NAMES[templateName][0], TEMPLATE_NAMES[templateName][1]] + await Promise.all(files.map(async (file) => { + await fsPromises.mkdir(dirname(file), { recursive: true }) + let content + if (file.endsWith('.d.ts')) { + content = dts + } + else { + content = js + if (templateName === 'unocss' && !content.startsWith('// @unocss-include')) { + content = `// @unocss-include\n${content}` + } + } + await fsPromises.writeFile( + resolve(vuetifyDir, `${prefix}${file}`), + content, + { encoding: 'utf-8' }, + ) + })) + } + + await Promise.all([ + ...files, + resolve( + vuetifyDir, + `${prefix}temp-vuetify-${templateName}.ts`, + ), + ].map(file => fsPromises.rm(file, { force: true }))) +} + +async function generateTempVuetifyOptions( + path: string, + ctx: VuetifyNuxtContext, +) { + await fsPromises.writeFile( + path, + `${ctx.configurationImports} + +const vuetifyOptions = ${generateCode(ctx.vuetifyOptions).code} as const +export function vuetifyConfiguration() { + return vuetifyOptions +} +`, { encoding: 'utf-8' }, + ) +} + +async function generateTempVuetifyRules( + path: string, + ctx: VuetifyNuxtContext, +) { + if (!ctx.enableRules) { + await fsPromises.rm(path, { force: true }) + return + } + + await fsPromises.writeFile( + path, + `${ctx.rulesConfiguration.imports} +const rulesOptions = ${generateCode(ctx.rulesConfiguration.rulesOptions).code} as const +export { rulesOptions } +`, { encoding: 'utf-8' }, + ) +} + +async function generateTempVuetifySSR( + path: string, + ctx: VuetifyNuxtContext, +) { + if (!ctx.ssrClientHints.enabled) { + await fsPromises.rm(path, { force: true }) + return + } + + await fsPromises.writeFile( + path, + `${SSRClientHintsConfigurationDefinition} +export const ssrClientHintsConfiguration = ${JSON.stringify(buildVuetifyClientHintsConfiguration(ctx))} as const +`, { encoding: 'utf-8' }, + ) +} + +async function generateTempVuetifyUnoCSS( + path: string, + ctx: VuetifyNuxtContext, +) { + const unocss = ctx.icons.unocss + if (!unocss) { + await fsPromises.rm(path, { force: true }) + return + } + await fsPromises.mkdir(dirname(path), { recursive: true }) + await fsPromises.writeFile( + path, + `// Generated by vuetify-nuxt-module +import type { IconSet } from 'vuetify' +import { VClassIcon } from 'vuetify/lib/composables/icons' +import { h } from '#imports' + +const aliases = ${JSON.stringify(resolveUnoCSSIcons(ctx.icons), null, 2)} as const +const defaultSet = 'unocss' as const +const unocss: IconSet = { + component: props => h(VClassIcon, { + ...props, + class: 'mdi' + }) +} +export { aliases, defaultSet, unocss } +`, + { encoding: 'utf-8' }, + ) +} diff --git a/src/prepare-configuration.ts b/src/prepare-configuration.ts deleted file mode 100644 index ba10bd8..0000000 --- a/src/prepare-configuration.ts +++ /dev/null @@ -1,270 +0,0 @@ -import type { Nuxt, NuxtConfigLayer } from '@nuxt/schema' -import type { ProxifiedObject } from 'magicast' -import type { VuetifyOptions } from 'vuetify/framework' -import type { VuetifyNuxtContext, VuetifyOptionsInfo } from './context' -import type { ExternalVuetifyOptions, MOptions, VuetifyModuleOptions } from './types' -import fsp from 'node:fs/promises' -import { resolve } from 'pathe' -import defu from 'defu' -import { parseModule } from 'magicast' -import { getDefaultExportOptions } from 'magicast/helpers' -import { createImportMap, extractImports, mergeConfiguration, readConfigurationFile } from './utils' - -export async function prepareConfiguration( - nuxt: Nuxt, - ctx: VuetifyNuxtContext, - vuetifyConfigurationFilesToWatch: Set, - options: VuetifyModuleOptions, -) { - const root = await loadRootLayer( - nuxt, - ctx, - vuetifyConfigurationFilesToWatch, - options, - ) - - let moduleOptions: MOptions = {} - const layers = nuxt.options._layers.length - - if (layers === 1) { - extractImports( - (imp, impl) => ctx.imports.set(imp, impl), - root.vuetifyOptions, - root.importsMap, - ) - ctx.moduleOptions = defu(options.moduleOptions ?? {}, moduleOptions) - ctx.vuetifyOptions = root - return - } - - const inlineModules: MOptions[] = [] - let lastLayer: VuetifyOptionsInfo | undefined - for (let i = layers - 1; i > 0; i--) { - const layer = nuxt.options._layers[i]! - const config = layer.config - if (hasLayerVuetifyConfiguration(config)) { - const mOptions = config.vuetify?.moduleOptions - if (mOptions) { - inlineModules.unshift(mOptions) - } - } - const nextLayer = await loadLayer( - nuxt, - ctx, - layer, - vuetifyConfigurationFilesToWatch, - ) - if (lastLayer) { - if (nextLayer) { - mergeConfiguration( - (imp, impl) => ctx.imports.set(imp, impl), - lastLayer.vuetifyOptions, - nextLayer.vuetifyOptions, - nextLayer.importsMap, - ) - } - } - else { - lastLayer = nextLayer - } - } - - if (lastLayer) { - mergeConfiguration( - (imp, impl) => ctx.imports.set(imp, impl), - lastLayer.vuetifyOptions, - root.vuetifyOptions, - root.importsMap, - ) - root.vuetifyOptions = lastLayer.vuetifyOptions - } - else { - extractImports( - (imp, impl) => ctx.imports.set(imp, impl), - root.vuetifyOptions, - root.importsMap, - ) - } - - for (const mod of inlineModules.reverse()) { - moduleOptions = defu(mod, moduleOptions) - } - - ctx.moduleOptions = defu(options.moduleOptions, moduleOptions) - ctx.vuetifyOptions = root -} - -function hasLayerVuetifyConfiguration( - config: NuxtConfigLayer['config'], -): config is NuxtConfigLayer['config'] & { vuetify?: VuetifyModuleOptions } { - return 'vuetify' in config -} - -function generateDefaultVuetifyOptions(): VuetifyOptionsInfo { - const module = parseModule(`export default {}`) - return { - mode: 'default', - vuetifyOptions: getDefaultExportOptions(module), - module, - importsMap: new Map(), - } -} - -async function loadExternalVuetifyConfiguration( - nuxt: Nuxt, - path: string, -): Promise> { - const content = await fsp.readFile(path, 'utf-8') - const module = parseModule(content) - return { - path, - mode: 'external', - vuetifyOptions: getDefaultExportOptions(module), - module, - importsMap: createImportMap(nuxt, path, module), - } -} - -async function detectExternalVuetifyConfiguration( - nuxt: Nuxt, - root: string, -): Promise | undefined> { - const content = await readConfigurationFile(resolve(root, 'vuetify.config')) - if (!content) - return undefined - - const module = parseModule(content[1]) - return { - path: content[0], - mode: 'external', - vuetifyOptions: getDefaultExportOptions(module), - module, - importsMap: createImportMap(nuxt, content[0], module), - } -} - -async function loadNuxtVuetifyConfiguration( - nuxt: Nuxt, - root: string, -): Promise | undefined> { - const content = await readConfigurationFile(resolve(root, 'nuxt.config')) - if (!content) { - return generateDefaultVuetifyOptions() - } - - let module = parseModule(content[1]) - const config = getDefaultExportOptions( - module, - ) as ProxifiedObject<{ - vuetify?: { vuetifyOptions?: VuetifyOptions } - }> - - let vuetifyOptions = config.vuetify?.vuetifyOptions - if (!vuetifyOptions) { - ({ module, vuetifyOptions } = generateDefaultVuetifyOptions()) - } - - return { - path: vuetifyOptions ? content[0] : undefined, - mode: 'inline', - module, - vuetifyOptions, - importsMap: vuetifyOptions ? createImportMap(nuxt, content[0], module) : new Map(), - } -} - -function mergeExternalOptions(external: VuetifyOptionsInfo | undefined) { - if (!external) - return false - - const config = external.vuetifyOptions.config - delete external.vuetifyOptions.config - return config !== false -} - -async function loadLayerConfiguration( - nuxt: Nuxt, - root: string, - ctx: VuetifyNuxtContext, - vuetifyConfigurationFilesToWatch: Set, - vuetifyOptions?: string | VuetifyOptions, -): Promise> { - let external: VuetifyOptionsInfo | undefined - if (typeof vuetifyOptions === 'string') { - external = await loadExternalVuetifyConfiguration(nuxt, vuetifyOptions) - if (external) { - vuetifyConfigurationFilesToWatch.add(vuetifyOptions) - } - } - else { - external = await detectExternalVuetifyConfiguration(nuxt, root) - if (external?.path) { - vuetifyConfigurationFilesToWatch.add(external.path) - } - } - - if (!vuetifyOptions && !external) { - return generateDefaultVuetifyOptions() - } - - // load inline configuration from the nuxt.config file - const inline = vuetifyOptions - ? await loadNuxtVuetifyConfiguration(nuxt, root) - : undefined - - if (!inline) { - if (external) { - ctx.vuetifyOptionsModules.push(external) - } - return mergeExternalOptions(external) - ? external! - : generateDefaultVuetifyOptions() - } - - ctx.vuetifyOptionsModules.push(inline) - - if (mergeExternalOptions(external)) { - ctx.vuetifyOptionsModules.push(external!) - mergeConfiguration( - (imp, impl) => ctx.imports.set(imp, impl), - inline.vuetifyOptions, - external!.vuetifyOptions, - external!.importsMap, - ) - } - - return inline -} - -async function loadRootLayer( - nuxt: Nuxt, - ctx: VuetifyNuxtContext, - vuetifyConfigurationFilesToWatch: Set, - { vuetifyOptions }: VuetifyModuleOptions, -) { - return await loadLayerConfiguration( - nuxt, - nuxt.options.rootDir, - ctx, - vuetifyConfigurationFilesToWatch, - vuetifyOptions, - ) -} - -async function loadLayer( - nuxt: Nuxt, - ctx: VuetifyNuxtContext, - layer: NuxtConfigLayer, - vuetifyConfigurationFilesToWatch: Set, -) { - const config = layer.config - return await loadLayerConfiguration( - nuxt, - config.rootDir, - ctx, - vuetifyConfigurationFilesToWatch, - hasLayerVuetifyConfiguration(config) - ? config.vuetify?.vuetifyOptions - : undefined, - ) -} diff --git a/src/prepare-rules-configuration.ts b/src/prepare-rules-configuration.ts deleted file mode 100644 index aa43056..0000000 --- a/src/prepare-rules-configuration.ts +++ /dev/null @@ -1,155 +0,0 @@ -import type { Nuxt, NuxtConfigLayer } from '@nuxt/schema' -import type { VuetifyNuxtContext, VuetifyRules, VuetifyRulesInfo } from './context' -import { createImportMap, extractImports, mergeConfiguration, readConfigurationFile } from './utils' -import { resolve } from 'pathe' -import { parseModule } from 'magicast' -import { getDefaultExportOptions } from 'magicast/helpers' - -export interface ExternalVuetifyRules extends VuetifyRules { - config?: boolean -} - -export async function prepareRulesConfiguration( - nuxt: Nuxt, - ctx: VuetifyNuxtContext, - vuetifyConfigurationFilesToWatch: Set, -) { - if (!ctx.enableRules) { - return - } - - // detect here package import: transpile, node types and configuration imports - // use vuetify version or local-pkg => isPackageExists (vuetify/labs/rules or vuetify/rules) - - const defRules = generateDefaultRulesOptions() - const root = await loadRootLayer( - nuxt, - ctx, - vuetifyConfigurationFilesToWatch, - ) - - const layers = nuxt.options._layers.length - - if (layers === 1) { - extractImports( - (imp, impl) => ctx.rulesConfiguration.rulesImports.set(imp, impl), - root.rulesOptions, - root.importsMap, - ) - ctx.rulesConfiguration.rulesOptions = root.rulesOptions - return - } - - const lastLayer: VuetifyRulesInfo = defRules - for (let i = layers - 1; i > 0; i--) { - const layer = nuxt.options._layers[i]! - const nextLayer = await loadLayer( - nuxt, - layer, - ctx, - vuetifyConfigurationFilesToWatch, - ) - if (nextLayer) { - mergeConfiguration( - (imp, impl) => ctx.rulesConfiguration.rulesImports.set(imp, impl), - lastLayer.rulesOptions, - nextLayer.rulesOptions, - nextLayer.importsMap, - ) - } - } - - if (lastLayer) { - mergeConfiguration( - (imp, impl) => ctx.rulesConfiguration.rulesImports.set(imp, impl), - lastLayer.rulesOptions, - root.rulesOptions, - root.importsMap, - ) - } - ctx.rulesConfiguration.rulesOptions = root.rulesOptions -} - -function generateDefaultRulesOptions(): VuetifyRulesInfo { - const module = parseModule(`export default { ruleOptions: {} }`) - return { - mode: 'default', - rulesOptions: getDefaultExportOptions(module), - module, - importsMap: new Map(), - } -} - -async function loadLayerConfiguration( - nuxt: Nuxt, - root: string, - ctx: VuetifyNuxtContext, - vuetifyConfigurationFilesToWatch: Set, -): Promise { - const external = await detectExternalRulesConfiguration(nuxt, root) - if (external?.path) { - vuetifyConfigurationFilesToWatch.add(external.path) - } - - if (external?.mode === 'external') { - ctx.rulesConfiguration.externalRules.push(external) - } - - return external -} - -async function loadLayer( - nuxt: Nuxt, - layer: NuxtConfigLayer, - ctx: VuetifyNuxtContext, - vuetifyConfigurationFilesToWatch: Set, -): Promise { - return await loadLayerConfiguration( - nuxt, - layer.config.rootDir, - ctx, - vuetifyConfigurationFilesToWatch, - ) -} - -async function loadRootLayer( - nuxt: Nuxt, - ctx: VuetifyNuxtContext, - vuetifyConfigurationFilesToWatch: Set, -): Promise { - return await loadLayerConfiguration( - nuxt, - nuxt.options.rootDir, - ctx, - vuetifyConfigurationFilesToWatch, - ) -} - -async function detectExternalRulesConfiguration( - nuxt: Nuxt, - root: string, -): Promise { - const content = await readConfigurationFile(resolve(root, 'vuetify.rules')) - if (!content) { - return generateDefaultRulesOptions() - } - - const module = parseModule(content[1], { - sourceFileName: content[0], - }) - - const rulesOptions = getDefaultExportOptions(module) - if (!rulesOptions.config) { - return generateDefaultRulesOptions() - } - - delete rulesOptions.config - - return { - mode: 'external', - path: content[0], - rulesOptions, - module, - importsMap: createImportMap(nuxt, content[0], module), - } -} diff --git a/src/ssr-client-hints.ts b/src/ssr-client-hints.ts index 0e2619d..797ca4e 100644 --- a/src/ssr-client-hints.ts +++ b/src/ssr-client-hints.ts @@ -27,6 +27,25 @@ const disabledClientHints: ResolvedClientHints = Object.freeze({ prefersReducedMotion: false, }) +export const SSRClientHintsConfigurationDefinition = `export interface SSRClientHintsConfiguration { + reloadOnFirstRequest: boolean + viewportSize: boolean + prefersColorScheme: boolean + prefersReducedMotion: boolean + clientWidth?: number + clientHeight?: number + prefersColorSchemeOptions?: { + baseUrl: string + defaultTheme: string + themeNames: string[] + cookieName: string + darkThemeName: string + lightThemeName: string + useBrowserThemeOnly: boolean + } +} +` + export function prepareSSRClientHints( nuxt: Nuxt, ctx: VuetifyNuxtContext, @@ -91,8 +110,26 @@ export function prepareSSRClientHints( ctx.ssrClientHints = clientHints } +export function buildVuetifyClientHintsConfiguration(ctx: VuetifyNuxtContext) { + const ssr = ctx.vuetifyOptions.ssr + const clientWidth = typeof ssr === 'boolean' ? undefined : ssr?.clientWidth + const clientHeight = typeof ssr === 'boolean' ? undefined : ssr?.clientHeight + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const data: Record = { + reloadOnFirstRequest: ctx.ssrClientHints.reloadOnFirstRequest, + viewportSize: ctx.ssrClientHints.viewportSize, + prefersColorScheme: ctx.ssrClientHints.prefersColorScheme, + prefersReducedMotion: ctx.ssrClientHints.prefersReducedMotion, + clientWidth, + clientHeight, + prefersColorSchemeOptions: ctx.ssrClientHints.prefersColorSchemeOptions, + } + + return data +} + function prepareTheme(ctx: VuetifyNuxtContext): VuetifyOptions['theme'] { - const theme = ctx.vuetifyOptions.vuetifyOptions.theme + const theme = ctx.vuetifyOptions.theme if (!theme) { throw new Error('Vuetify theme is disabled') } diff --git a/src/types.ts b/src/types.ts index b7218b5..5e8852f 100644 --- a/src/types.ts +++ b/src/types.ts @@ -51,27 +51,10 @@ export interface SSRClientHintsConfiguration { } } -export const IconSetName = ['mdi', 'fa', 'fa4', 'md', 'mdi-svg', 'fa-svg', 'unocss', 'custom'] as const export const IconFontName = ['mdi', 'fa', 'fa4', 'md'] as const -export type IconSetNameType = typeof IconSetName[number] export type IconFontNameType = typeof IconFontName[number] -export interface FontIconSet { - name: IconFontNameType - /** - * Use CDN? - * - * - mdi: https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css - * - md: https://fonts.googleapis.com/css?family=Material+Icons - * - fa: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@latest/css/all.min.css - * - fa4: https://cdn.jsdelivr.net/npm/font-awesome@4.x/css/font-awesome.min.css - * - * @default the corresponding CDN for the icon set - */ - cdn?: string -} - export interface UnoCSSMdiIconSet { collapse?: string complete?: string @@ -128,25 +111,6 @@ export interface UnoCSSMdiIconSet { backspace?: string } -export interface JSSVGIconSet { - aliases?: Record -} - -export interface FontAwesomeSvgIconSet { - /** - * The libraries to import and register with the corresponding name. - * - * For example, to import free svg icons, `libraries` should be (the default): - * `libraries: [[false, 'fas', '@fortawesome/free-solid-svg-icons']] - * - * Following with the example, the resulting import will be: - * `import { fas } from '@fortawesome/free-solid-svg-icons'` - * - * @default [[false, 'fas', '@fortawesome/free-solid-svg-icons']] - */ - libraries?: [defaultExport: boolean, name: string, library: string][] -} - export interface UnoCSSIcons { /** * The prefix for UnoCSS Preset Icons. @@ -174,54 +138,39 @@ export interface UnoCSSIcons { } export interface IconsOptions { - /** - * @default 'mdi' - */ - defaultSet: IconSetNameType /** * UnoCSS options. */ unocss?: UnoCSSIcons /** - * The icon sets to use. + * CSS Icon Fonts. + * + * By default, the module will add the corresponding CDN link to Nuxt `css` entry: + * - mdi: https://cdn.jsdelivr.net/npm/@mdi/font@5.x/css/materialdesignicons.min.css + * - md: https://fonts.googleapis.com/css?family=Material+Icons + * - fa: https://cdn.jsdelivr.net/npm/@fortawesome/fontawesome-free@latest/css/all.min.css + * - fa4: https://cdn.jsdelivr.net/npm/font-awesome@4.x/css/font-awesome.min.css + * + * You can specify a custom CDN link. + */ + fontIcons?: [name: IconFontNameType, cdn?: string][] + /** + * Local Icon Fonts to use. */ - sets?: IconFontNameType | IconFontNameType[] | FontIconSet[] + localFontIcons?: IconFontNameType[] /** - * The SVG icon sets to use. + * Enabling this option will check for local installed icon fonts and will add them to Nuxt `css` entry: + * - mdi: will check for `@mdi/font`, if present will add `@mdi/font/css/materialdesignicons.css` + * - md: will check for `material-design-icons-iconfont`, if present will add `@mdi/font/css/materialdesignicons.css` + * - fa: will check for `@fortawesome/fontawesome-free`, if present will add `@fortawesome/fontawesome-free/css/all.css` + * - fa4: will check for `font-awesome@4.7.0`, if present will add `font-awesome/css/font-awesome.min.css` + * + * @default false */ - svg?: { - mdi?: JSSVGIconSet - fa?: FontAwesomeSvgIconSet - } + autoInstallLocalFontIcons?: boolean } export interface MOptions extends VuetifyNuxtOptions { - /** - * The icon sets to use. - * - * By default, the module will check for the following icon sets: - * - `mdi` (Material Design Icons) - * - `fa` (Font Awesome) - * - `fa4` (Font Awesome 4) - * - `md` (Material Design Font Icons) - * - `mdi-svg` (Material Design SVG Icons) - * - `fa-svg` (Font Awesome SVG) - * - `unocss` (UnoCSS Icons, Material Design Icons by default) - * - * If you want to provide your own configuration, set this option to `false`. - * - * This module will export the icon sets using `#build/vuetify/iconsets/icons.js` virtual module, - * including all the icon sets with a custom component: the module will omit the last step if - * `defaultSet` is set to `custom`, or if the `icons` option is found in the Vuetify configuration - * file. - * - * You can also provide your own configuration letting this module generate the icon sets for you, - * then use `custom` in the `defaultSet` icons option, all the icon sets can be imported via - * the corresponding virtual module; `#build/vuetify-icons/`. - * - * @default true - */ - icons?: boolean | IconsOptions /** * Vuetify SSR client hints. * @@ -300,6 +249,67 @@ export interface MOptions extends VuetifyNuxtOptions { */ prefersReducedMotion?: boolean } + + experimental?: { + tsdown?: boolean + } +} + +/** + * Nuxt extension for Vuetify options. + * + * If you are using [font icons](https://vuetifyjs.com/en/features/icon-fonts/): + * - make sure to configure the `icons` option in the Vuetify configuration file + * - use the `fontIcons`, `localFontIcons` or `autoInstallLocalFontIcons` options to add the corresponding css file to the Nuxt `css` entry + * - don't import the css file in the configuration file, let the module handle it for you + * + * ```ts + * // vuetify.config.ts + * import { aliases, mdi } from 'vuetify/iconsets/mdi' + * import { defineVuetifyConfiguration } from 'vuetify-nuxt-module/custom-configuration' + * + * export default defineVuetifyConfiguration({ + * config: true, + * icons: { + * defaultSet: 'mdi', + * sets: { mdi }, + * aliases + * }, + * fontIcons: [['mdi']] // <== using the default CDN link for mdi + * }) + * ``` + * + * If you are using [SVG icons](https://vuetifyjs.com/en/features/icon-fonts/#svg-icons), add the logic in your Vuetify configuration file. + * + * If you are using UnoCSS icon set: + * - you can import the `unocss` icon set from `#build/vuetify/iconsets/unocss.mjs` + * - use it in the `icons` option in your Vuetify configuration file + * + * You can customize the icons using the `unocss` option in the Vuetify configuration file: + * - `unocss.prefix`: The prefix for UnoCSS Preset Icons. Default is `i-` + * - `unocss.collection`: The collection name for UnoCSS Preset Icons. Default is `mdi` + * - `unocss.icons`: Override the default mdi icons. + * - `unocss.additionalIcons`: Additional icons to be added to the set. + * + * ```ts + * // vuetify.config.ts + * import { aliases, defaultSet, unocss } from '#build/vuetify/iconsets/unocss.mjs' + * import { defineVuetifyConfiguration } from 'vuetify-nuxt-module/custom-configuration' + * + * export default defineVuetifyConfiguration({ + * config: true, + * icons: { + * defaultSet, + * sets: { unocss }, + * aliases + * } + * }) + * ``` + * + * @see https://vuetifyjs.com/en/features/icon-fonts/ + * @see https://vuetifyjs.com/en/features/icon-fonts/#svg-icons + */ +export interface ExtendedNuxtVuetifyOptions extends VuetifyOptions, IconsOptions { } export interface VuetifyModuleOptions { @@ -312,7 +322,7 @@ export interface VuetifyModuleOptions { * * The path should be relative to the root folder. */ - vuetifyOptions?: string | VuetifyOptions + vuetifyOptions?: string | ExtendedNuxtVuetifyOptions /** * Vuetify Rules options. @@ -330,7 +340,7 @@ export interface VuetifyModuleOptions { enableVuetifyRules?: boolean } -export interface ExternalVuetifyOptions extends VuetifyOptions { +export interface ExternalVuetifyOptions extends ExtendedNuxtVuetifyOptions { /** * Should this configuration file be merged with the existing configuration? * diff --git a/src/utils.ts b/src/utils.ts deleted file mode 100644 index 0623cd4..0000000 --- a/src/utils.ts +++ /dev/null @@ -1,150 +0,0 @@ -import fs from 'node:fs' -import fsp from 'node:fs/promises' -import type { Nuxt } from '@nuxt/schema' -import type { ProxifiedModule, ProxifiedObject } from 'magicast' -import { dirname, relative, resolve } from 'pathe' -import type { Import } from './context' - -export async function readConfigurationFile( - path: string, - extensions = ['mts', 'ts', 'mjs', 'js'], -): Promise<[path: string, content: string, type: 'js' | 'ts'] | undefined> { - for (const ext of extensions) { - const filePath = `${path}.${ext}` - try { - await fsp.access(filePath, fs.constants.R_OK) - return [ - filePath, - await fsp.readFile(filePath, 'utf-8'), - ext === 'js' || ext === 'mjs' ? 'js' : 'ts', - ] - } - catch { - // just ignore - } - } - - return undefined -} - -export function createImportMap( - nuxt: Nuxt, - path: string, - module: ProxifiedModule, -) { - const importsMap = new Map() - for (const { from, imported, local } of Object.values(module.imports)) { - let useFrom = from - if (from[0] === '.') { - useFrom = relative(resolve(nuxt.options.buildDir, 'vuetify'), resolve(dirname(path), from)).replace(/\\/g, '/') - } - importsMap.set(local, { from: useFrom, imported, local }) - } - return importsMap -} - -export function mergeConfiguration( - addImport: (imp: string, impl: Import) => void, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - first: ProxifiedObject, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - last: ProxifiedObject, - imports: Map, -) { - const seen = new Set() - for (const [key, value] of Object.entries(last)) { - seen.add(key) - if (!value.$ast?.type) { - first[key] = value - continue - } - // import specifier => blueprint or date adapter for example - if (value.$ast.type === 'Identifier') { - // add the specifier to the imports - addImport(value.$ast.name, imports.get(value.$ast.name)!) - first[key] = value - continue - } - if (value.$ast.type === 'MemberExpression') { - if (value.$ast.object.type === 'Identifier' && value.$ast.property.type === 'Identifier') { - addImport(value.$ast.object.name, imports.get(value.$ast.object.name)!) - first[key] = value - continue - } - } - // we need to merge data only when both are objects - if (value.$ast.type === 'ObjectExpression') { - if (first[key]) { - if (first[key].$ast.type === 'ObjectExpression') { - // merge the child object - mergeConfiguration(addImport, first[key], value, imports) - } - else { - if (value.$ast) { - extractImports(addImport, value, imports) - } - first[key] = value - } - } - else { - extractImports(addImport, value, imports) - first[key] = value - } - continue - } - // todo: handle arrays => icons can be a pain - // in any other case we just replace the value - first[key] = value - } - - // we need to traverse the first object to find any missing imports - for (const key of Object.keys(first)) { - if (seen.has(key)) - continue - - const value = first[key] - if (!value.$ast?.type) { - continue - } - - if (value.$ast.type === 'Identifier') { - addImport(value.$ast.name, imports.get(value.$ast.name)!) - continue - } - if (value.$ast.type === 'MemberExpression') { - if (value.$ast.object.type === 'Identifier' && value.$ast.property.type === 'Identifier') { - addImport(value.$ast.object.name, imports.get(value.$ast.object.name)!) - continue - } - } - if (value.$ast.type === 'ObjectExpression') { - extractImports(addImport, value, imports) - } - } -} - -export function extractImports( - addImport: (imp: string, impl: Import) => void, - // eslint-disable-next-line @typescript-eslint/no-explicit-any - obj: ProxifiedObject, - imports: Map, -) { - for (const [_, value] of Object.entries(obj)) { - if (!value.$ast?.type) - continue - - if (value.$ast.type === 'Identifier') { - addImport(value.$ast.name, imports.get(value.$ast.name)!) - continue - } - if (value.$ast.type === 'MemberExpression') { - if (value.$ast.object.type === 'Identifier' && value.$ast.property.type === 'Identifier') { - addImport(value.$ast.object.name, imports.get(value.$ast.object.name)!) - continue - } - } - if (value.$ast.type === 'ObjectExpression') { - extractImports(addImport, value, imports) - } - } -} diff --git a/src/watcher.ts b/src/watcher.ts index ee5f22f..f5dffde 100644 --- a/src/watcher.ts +++ b/src/watcher.ts @@ -1,12 +1,48 @@ import type { Nuxt } from '@nuxt/schema' import type { VuetifyNuxtContext } from './context' import type { VuetifyModuleOptions } from './types' -import { normalize, resolve } from 'pathe' -import { addVitePlugin, isIgnored } from '@nuxt/kit' -import { watch as chokidarWatch } from 'chokidar' +import { addVitePlugin, updateTemplates } from '@nuxt/kit' import { debounce } from 'perfect-debounce' import { load } from './context' +import { addVuetifyNuxtTemplates } from './nuxt-templates' +export function registerWatcher( + options: VuetifyModuleOptions, + nuxt: Nuxt, + ctx: VuetifyNuxtContext, +) { + if (ctx.isDev && ctx.vuetifyFilesToWatch.length > 0) { + let isReloading = false + const debouncedReload = debounce(async () => { + if (isReloading) { + return + } + isReloading = true + try { + await load(options, nuxt, ctx) + await addVuetifyNuxtTemplates(nuxt, ctx, true) + await updateTemplates({ + filter: template => template.filename.startsWith('vuetify/'), + }) + } + finally { + isReloading = false + } + }, 150) + + addVitePlugin({ + name: 'vuetify:configuration:watch', + enforce: 'pre', + handleHotUpdate({ file }) { + if (ctx.vuetifyFilesToWatch.includes(file)) { + debouncedReload() + } + }, + }) + } +} + +/* interface HmrLoader { reload: () => Promise client?: (() => Promise) | undefined @@ -19,18 +55,6 @@ export function registerWatcher( ctx: VuetifyNuxtContext, ) { if (ctx.isDev && ctx.vuetifyFilesToWatch.length > 0) { - /* nuxt.hooks.hook('builder:watch', async (_event, path) => { - path = resolve(nuxt.options.srcDir, path) - console.log(path) - console.log(ctx.vuetifyFilesToWatch.includes(path)) - /!* if (ctx.vuetifyFilesToWatch.includes(path)) { - return await hmrReload.reload() - } *!/ - }) - - if (true) { - return - } */ const hmrReload: HmrLoader = { async reload() { if (!this.client && !this.server) @@ -44,92 +68,27 @@ export function registerWatcher( return await this.client?.() }, } - if (false/* nuxt.options.future?.compatibilityVersion === 4 */) { - const watcher = chokidarWatch( - ctx.vuetifyFilesToWatch.map(f => normalize(resolve(nuxt.options.srcDir, f))), - { - awaitWriteFinish: true, - ignoreInitial: true, - ignored: [isIgnored, 'node_modules'], - }, - ) - watcher.on('all', (event, path) => { - if (event === 'all' || event === 'ready' || event === 'error' || event === 'raw') { - return - } - nuxt.callHook('builder:watch', event, normalize(path)) - }) - nuxt.hook('close', () => watcher?.close()) - nuxt.hooks.hook('builder:watch', async (_event, path) => { - path = normalize(resolve(nuxt.options.srcDir, path)) - if (ctx.vuetifyFilesToWatch.includes(path)) { - return await hmrReload.reload() - } - }) - } - else { - /* nuxt.hooks.hook('builder:watch', async (_event, path) => { - path = resolve(nuxt.options.srcDir, path) - console.log(path) - console.log(ctx.vuetifyFilesToWatch.includes(path)) - if (ctx.vuetifyFilesToWatch.includes(path)) { + addVitePlugin({ + name: 'vuetify:configuration:watch', + enforce: 'pre', + async handleHotUpdate({ file }) { + if (hmrReload && ctx.vuetifyFilesToWatch.includes(file)) { return await hmrReload.reload() } - }) */ - addVitePlugin({ - name: 'vuetify:configuration:watch', - enforce: 'pre', - async handleHotUpdate({ file, modules, server }) { - console.log(modules.map(m => [m.id, m.file] as const)) - /* if (ctx.vuetifyFilesToWatch.includes(file)) { - for (const mod of modules) { - server.moduleGraph.invalidateModule(mod) - await server.reloadModule(mod) - } - server.ws.send({ type: 'full-reload' }) - return [] - } - return [] */ - if (hmrReload && ctx.vuetifyFilesToWatch.includes(file)) { - return await hmrReload.reload() - } - }, - }) - } + }, + }) - nuxt.hook('vite:serverCreated', (server, { isClient, isServer }) => { + nuxt.hook('vite:serverCreated', (server, { isClient }) => { const key = isClient ? 'client' : 'server' hmrReload[key] = debounce(async () => { - // reload configuration only on ssr or if not ssr app - // if (isServer || !nuxt.options.ssr) { - // if (isClient) { await load(options, nuxt, ctx) - // } - // } - /* const moduleGraph = server./!* environments[isClient ? 'client' : 'ssr']. *!/moduleGraph - const modules = Array.from( - moduleGraph.idToModuleMap.entries(), - ).filter(m => m[0]?.startsWith('virtual:nuxt:') && ( - m[0]?.endsWith('vuetify/configuration.mjs') - || m[0]?.endsWith('vuetify/labs-rules-configuration.mjs') - || m[0]?.endsWith('vuetify/rules-configuration.mjs') - || m[0]?.endsWith('vuetify/ssr-client-hints-configuration.mjs') - )) - console.log(modules?.map(m => m[1])) */ - if (/* modules && */server.ws) { - // for (const mod of modules) { - // moduleGraph.invalidateModule(mod[1]) - // } - // remove this event when vuetify can reload configuration - // add import.meta.hot back in the nuxt plugins at nuxt-templates.ts module - server.ws.send({ type: 'full-reload' }) - return [] - } - else { - return await nuxt.callHook('restart') - } + await addVuetifyNuxtTemplates(nuxt, ctx, true) + await updateTemplates({ + filter: template => template.filename.startsWith('vuetify/'), + }) }, isClient ? 150 : 50, { trailing: false }) }) } } +*/ diff --git a/test.ts b/test.ts index 9ca8fb1..8591a20 100644 --- a/test.ts +++ b/test.ts @@ -1,10 +1,13 @@ -import type { ProxifiedModule, ProxifiedObject } from 'magicast' -import { generateCode, parseModule } from 'magicast' +import { parseExpression, type Proxified, type ProxifiedModule, type ProxifiedObject } from 'magicast' +import { generateCode, parseModule, loadFile } from 'magicast' import { getDefaultExportOptions } from 'magicast/helpers' import fsp from 'node:fs/promises' import fs from 'node:fs' import type { Nuxt } from '@nuxt/schema' import { dirname, relative as relativePath, resolve } from 'pathe' +import { build } from 'tsdown' +import PluginAlias from '@rollup/plugin-alias' +import type { Program, VariableDeclarator } from '@babel/types' interface Import { from: string @@ -35,11 +38,80 @@ async function readConfigurationFile( return undefined } -function createImportMap( +// eslint-disable-next-line +function configFromNode(node: Proxified): ProxifiedObject { + if (node.$type === 'function-call') { + return node.$args[0] + } + return node +} + +export function getConfigFromVariableDeclaration( + // eslint-disable-next-line + magicast: ProxifiedModule, +): { + declaration: VariableDeclarator + // eslint-disable-next-line + config: ProxifiedObject | undefined +} { + // if (magicast.exports.default.$type !== 'identifier') { + // throw new Error( + // `Not supported: Cannot modify this kind of default export (${magicast.exports.default.$type})`, + // ) + // } + + // const configDecalarationId = magicast.exports.default.$name + + for (const node of (magicast.$ast as Program).body) { + console.log(node.type) + if (node.type === 'VariableDeclaration') { + for (const declaration of node.declarations) { + if ( + declaration.id.type === 'Identifier' + // && declaration.id.name === configDecalarationId + && declaration.init + ) { + const init + = declaration.init.type === 'TSSatisfiesExpression' + ? declaration.init.expression + : declaration.init + + const code = generateCode(init).code + const configExpression = parseExpression(code) + + try { + console.log({ + declaration, + config: configFromNode(configExpression), + }) + } + catch { + // just ignore + } + + /* return { + declaration, + config: configFromNode(configExpression), + } */ + } + } + } + } + // throw new Error('Couldn\'t find config declaration') +} + +async function createImportMap( nuxt: Nuxt, path: string, module: ProxifiedModule, ) { + console.log('Loading module info: ', path) + try { + console.log(getConfigFromVariableDeclaration(module)) + } + catch (e) { + console.error('WTF', e) + } const importsMap = new Map() for (const { from, imported, local } of Object.values(module.imports)) { let useFrom = from @@ -47,6 +119,13 @@ function createImportMap( if (from[0] === '.') { relative = true useFrom = resolve(dirname(path), from).replace(/\\/g, '/') + console.log('Loading relative import: ', useFrom) + try { + console.log(getConfigFromVariableDeclaration(await loadFile(`${useFrom}.ts`))) + } + catch (e) { + console.error('WTF', e) + } } importsMap.set(local, { from: useFrom, imported, local, relative }) } @@ -185,7 +264,7 @@ async function* test( const include = rulesOptions.config === true const moduleImportMaps = include - ? createImportMap( + ? await createImportMap( nuxt, content![0], module, @@ -257,6 +336,7 @@ async function runTest() { ) { console.log(`Imports for ${path}:`, rulesOptions.config === true, moduleImportMaps) if (rulesOptions.config === true) { + console.log(path) delete rulesOptions.config mergeConfiguration( (imp, impl) => globalImportMaps.set(imp, impl), @@ -273,6 +353,82 @@ async function runTest() { console.log(`${collectImports(nuxt, globalImportMaps, vuetifyConfigurationFilesToWatch)} ${generateCode(rootModule).code}`) console.log(vuetifyConfigurationFilesToWatch) + + console.time('tsdown:build') + await build({ + entry: [ + resolve('./playground/.nuxt/vuetify/temp-configuration.ts'), + resolve('./playground/.nuxt/vuetify/temp-labs-rules-configuration.ts'), + ], + /* inputOptions: { + input: resolve('./playground/.nuxt/vuetify/labs-rules-configuration.ts'), + cwd: resolve('./playground/.nuxt'), + tsconfig: resolve('./tsconfig.json'), + platform: 'neutral', + resolve: { + alias: { + '../../layers/rules1/vuetify-rules': resolve('./playground/layers/rules1/vuetify-rules.ts'), + '../../vuetify-rules': resolve('./playground/vuetify-rules.ts'), + }, + }, + plugins: [PluginAlias({ + entries: [ + { find: '../../layers/rules1/vuetify-rules', replacement: resolve('./playground/layers/rules1/vuetify-rules.ts') }, + { find: '../../vuetify-rules', replacement: resolve('./playground/vuetify-rules.ts') }, + ], + })], + }, */ + // https://github.com/rolldown/rolldown/issues/3615 + plugins: [PluginAlias({ + entries: [ + { find: '../../layers/rules1/vuetify-rules', replacement: resolve('./playground/layers/rules1/vuetify-rules.ts') }, + { find: '../../vuetify-rules', replacement: resolve('./playground/vuetify-rules.ts') }, + { find: '../../vuetify', replacement: resolve('./playground/vuetify.ts') }, + ], + })], + cwd: resolve('./playground/.nuxt'), + /* outputOptions: { + name: 'labs-rules-configuration.d.mts', + dir: resolve('./playground/.nuxt/vuetify'), + }, */ + tsconfig: resolve('./tsconfig.json'), + dts: { + // cwd: resolve('./playground/.nuxt'), + // tsconfig: resolve('./tsconfig.json'), + // emitDtsOnly: true, + // emitJs: true, + // dtsInput: true, + // build: true, + vue: true, + }, + // unbundle: true, + outDir: resolve('./playground/.nuxt/vuetify/'), + format: 'es', + clean: false, + /* alias: { + '../../layers/rules1/vuetify-rules': resolve('./playground/layers/rules1/vuetify-rules.ts'), + '../../vuetify-rules': resolve('./playground/vuetify-rules.ts'), + }, */ + /* noExternal: [ + '../../layers/rules1/vuetify-rules', + '../../vuetify-rules', + '../../vuetify', + ], */ + external: [ + 'defu', + 'local-pkg', + 'chokidar', + 'pathe', + 'perfect-debounce', + 'readdirp', + 'vuetify', + /^vuetify\//, + 'vue', + // '../../layers/rules1/vuetify-rules', + // '../../vuetify-rules', + ], + }) + console.timeEnd('tsdown:build') } runTest() diff --git a/vuetify-3.10.4.tgz b/vuetify-3.10.4.tgz new file mode 100644 index 0000000..c4c7f4d Binary files /dev/null and b/vuetify-3.10.4.tgz differ