Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions src/utils/nuxt/versions.ts
Original file line number Diff line number Diff line change
@@ -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',
Expand Down
6 changes: 3 additions & 3 deletions template/javascript/default/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,16 +10,16 @@
"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",
"sass": "1.77.8",
"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"
}
}
6 changes: 3 additions & 3 deletions template/typescript/default/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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"
}
Expand Down
35 changes: 30 additions & 5 deletions template/typescript/nuxt/modules/vuetify.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 }

Expand All @@ -22,6 +24,7 @@ export default defineNuxtModule<ModuleOptions>({
let sassVariables = false
const PREFIX = 'vuetify-styles/'
const SSR_PREFIX = `/@${PREFIX}`
const resolveCss = resolveCssFactory()

nuxt.hook('vite:extendConfig', (viteInlineConfig) => {
// add vuetify transformAssetUrls
Expand All @@ -39,6 +42,8 @@ export default defineNuxtModule<ModuleOptions>({
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',
Expand All @@ -59,7 +64,7 @@ export default defineNuxtModule<ModuleOptions>({
},
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
}

Expand All @@ -74,16 +79,15 @@ export default defineNuxtModule<ModuleOptions>({
)
) {
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 })

if (!resolution)
return undefined

const target = resolution.id.replace(/\.css$/, '.sass')
const target = await resolveCss(resolution.id)
if (isNone) {
noneFiles.add(target)
return target
Expand All @@ -103,8 +107,9 @@ export default defineNuxtModule<ModuleOptions>({
: 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: '',
},
Expand All @@ -119,6 +124,26 @@ export default defineNuxtModule<ModuleOptions>({
}
})

function resolveCssFactory() {
const mappings = new Map<string, string>()
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)
Expand Down