diff --git a/src/utils/nuxt/versions.ts b/src/utils/nuxt/versions.ts index c793179..2fc8be8 100644 --- a/src/utils/nuxt/versions.ts +++ b/src/utils/nuxt/versions.ts @@ -1,11 +1,11 @@ export const versions = { - 'vuetify': '^3.7.3', + 'vuetify': '^3.8.0', 'typescript': '^5.6.3', 'vue-tsc': '^2.1.6', 'sass-embedded': '^1.80.3', - '@vuetify/loader-shared': '^2.0.3', - 'vite-plugin-vuetify': '^2.0.4', - 'vuetify-nuxt-module': '^0.18.3', + '@vuetify/loader-shared': '^2.1.0', + 'vite-plugin-vuetify': '^2.1.1', + 'vuetify-nuxt-module': '^0.18.6', 'upath': '^2.0.1', '@mdi/font': '^7.4.47', '@nuxt/fonts': '^0.10.0', diff --git a/template/javascript/default/package.json b/template/javascript/default/package.json index 21886cf..d80e0fa 100644 --- a/template/javascript/default/package.json +++ b/template/javascript/default/package.json @@ -10,8 +10,8 @@ "dependencies": { "@mdi/font": "7.4.47", "roboto-fontface": "*", - "vue": "^3.4.31", - "vuetify": "^3.6.14" + "vue": "^3.5.13", + "vuetify": "^3.8.0" }, "devDependencies": { "@vitejs/plugin-vue": "^5.0.5", @@ -19,7 +19,7 @@ "sass-embedded": "^1.77.8", "unplugin-fonts": "^1.1.1", "unplugin-vue-components": "^0.27.2", - "vite-plugin-vuetify": "^2.0.3", + "vite-plugin-vuetify": "^2.1.1", "vite": "^5.4.0" } } diff --git a/template/typescript/default/package.json b/template/typescript/default/package.json index 7c44ac9..8088ce7 100644 --- a/template/typescript/default/package.json +++ b/template/typescript/default/package.json @@ -12,8 +12,8 @@ "dependencies": { "@mdi/font": "7.4.47", "roboto-fontface": "*", - "vue": "^3.4.31", - "vuetify": "^3.6.14" + "vue": "^3.5.13", + "vuetify": "^3.8.0" }, "devDependencies": { "@tsconfig/node22": "^22.0.0", @@ -27,7 +27,7 @@ "typescript": "~5.6.3", "unplugin-fonts": "^1.1.1", "unplugin-vue-components": "^0.27.2", - "vite-plugin-vuetify": "^2.0.3", + "vite-plugin-vuetify": "^2.1.1", "vite": "^5.4.10", "vue-tsc": "^2.1.10" } diff --git a/template/typescript/nuxt/modules/vuetify.ts b/template/typescript/nuxt/modules/vuetify.ts index 6ed35cc..ea4c93a 100644 --- a/template/typescript/nuxt/modules/vuetify.ts +++ b/template/typescript/nuxt/modules/vuetify.ts @@ -4,6 +4,8 @@ import vuetify, { transformAssetUrls } from 'vite-plugin-vuetify' import path from 'upath' import { resolveVuetifyBase, isObject } from '@vuetify/loader-shared' import { pathToFileURL } from 'node:url' +import fs from 'node:fs' +import fsp from 'node:fs/promises' export type { ModuleOptions } @@ -22,6 +24,7 @@ export default defineNuxtModule({ let sassVariables = false const PREFIX = 'vuetify-styles/' const SSR_PREFIX = `/@${PREFIX}` + const resolveCss = resolveCssFactory() nuxt.hook('vite:extendConfig', (viteInlineConfig) => { // add vuetify transformAssetUrls @@ -39,6 +42,8 @@ export default defineNuxtModule({ viteInlineConfig.css.preprocessorOptions ??= {} viteInlineConfig.css.preprocessorOptions.sass ??= {} viteInlineConfig.css.preprocessorOptions.sass.api = 'modern-compiler' + viteInlineConfig.css.preprocessorOptions.scss ??= {} + viteInlineConfig.css.preprocessorOptions.scss.api = 'modern-compiler' viteInlineConfig.plugins.push({ name: 'vuetify:nuxt:styles', @@ -59,7 +64,7 @@ export default defineNuxtModule({ }, async resolveId (source, importer, { custom, ssr }) { if (source.startsWith(PREFIX) || source.startsWith(SSR_PREFIX)) { - if (source.endsWith('.sass')) { + if (source.match(/\.s[ca]ss$/)) { return source } @@ -74,8 +79,7 @@ export default defineNuxtModule({ ) ) { if (options.styles === 'sass') { - const target = source.replace(/\.css$/, '.sass') - return this.resolve(target, importer, { skipSelf: true, custom }) + return this.resolve(await resolveCss(source), importer, { skipSelf: true, custom }) } const resolution = await this.resolve(source, importer, { skipSelf: true, custom }) @@ -83,7 +87,7 @@ export default defineNuxtModule({ if (!resolution) return undefined - const target = resolution.id.replace(/\.css$/, '.sass') + const target = await resolveCss(resolution.id) if (isNone) { noneFiles.add(target) return target @@ -103,8 +107,9 @@ export default defineNuxtModule({ : undefined if (target) { + const suffix = target.match(/\.scss/) ? ';\n' : '\n' return { - code: `@use "${configFile}"\n@use "${pathToFileURL(target).href}"`, + code: `@use "${configFile}"${suffix}@use "${pathToFileURL(target).href}"${suffix}`, map: { mappings: '', }, @@ -119,6 +124,26 @@ export default defineNuxtModule({ } }) +function resolveCssFactory() { + const mappings = new Map() + return async (source: string) => { + let mapping = mappings.get(source) + if (!mapping) { + try { + mapping = source.replace(/\.css$/, '.sass') + await fsp.access(mapping, fs.constants.R_OK) + } + catch (err) { + if (!(err instanceof Error && 'code' in err && err.code === 'ENOENT')) + throw err + mapping = source.replace(/\.css$/, '.scss') + } + mappings.set(source, mapping) + } + return mapping + } +} + function isSubdir (root: string, test: string) { const relative = path.relative(root, test) return relative && !relative.startsWith('..') && !path.isAbsolute(relative)