Skip to content

7.0.0 - resolve.alias replaces scss @use with invalid path #20292

@markbrockhoff

Description

@markbrockhoff

Describe the bug

Hi, we just tried updating to vite 7.0.0 today and ran into the following issue:

We're using resolve aliases for imports / "@use" statements inside scss (the style tag of vue components to be specific, but I also tested it using pure.scss files where the issue is reproducable as well).
As config we're matching imports starting with @/ using a regex and replace them with the path of our src folder:

resolve: {
      alias: [
        {
          find: /@\/(.*)/,
          replacement: fileURLToPath(new URL('./src/', import.meta.url)) + '$1',
        },
      ],
    },

Up until v7 this worked, but now it looks like the behavior for replacing the path changed. Looking at the warning logged by sass it looks like the path is not fully replaced but appended to the path of the current file:

Image

This is especially problematic as the new behavior seems to differ from the way aliases are resolved for regular TS imports as those continue to work as expected in v7 but break if I try to update the replacement so scss would work.

Reproduction

https://github.com/markbrockhoff/vite-7-scss-resolve-alias-bug-repro/blob/main/vite.config.ts

Steps to reproduce

  1. Check out the repo
  2. Install dependencies using pnpm
  3. Try to build the app by running pnpm build
  4. You should see the error that the import @use "@/test.scss" could not be resolved
  5. (optional) Downgrade vite to the latest version of v6 and run the build, it now works as expected

System Info

System:
    OS: macOS 15.5
    CPU: (14) arm64 Apple M4 Max
    Memory: 697.67 MB / 36.00 GB
    Shell: 5.9 - /bin/zsh
  Binaries:
    Node: 22.16.0 - ~/.local/state/fnm_multishells/71999_1750844782509/bin/node
    Yarn: 1.22.22 - ~/.local/state/fnm_multishells/71999_1750844782509/bin/yarn
    npm: 10.9.2 - ~/.local/state/fnm_multishells/71999_1750844782509/bin/npm
    pnpm: 10.12.2 - ~/.local/state/fnm_multishells/71999_1750844782509/bin/pnpm
  Browsers:
    Brave Browser: 137.1.79.126
    Chrome: 137.0.7151.120
    Edge: 137.0.3296.93
    Safari: 18.5
  npmPackages:
    @vitejs/plugin-vue: ^6.0.0 => 6.0.0 
    vite: ^7.0.0 => 7.0.0

Used Package Manager

pnpm

Logs

Click to expand!
 vite:config config file loaded in 251.19ms +0ms
/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/$1
  vite:env loading env files: [
  vite:env   '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/.env',
  vite:env   '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/.env.local',
  vite:env   '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/.env.production',
  vite:env   '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/.env.production.local'
  vite:env ] +0ms
  vite:env env files loaded in 0.23ms +1ms
  vite:env using resolved env: {} +0ms
  vite:config using resolved config: {
  vite:config   plugins: [
  vite:config     'vite:build-metadata',
  vite:config     'vite:watch-package-data',
  vite:config     'alias',
  vite:config     'vite:modulepreload-polyfill',
  vite:config     'vite:resolve',
  vite:config     'vite:html-inline-proxy',
  vite:config     'vite:css',
  vite:config     'vite:esbuild',
  vite:config     'vite:json',
  vite:config     'vite:wasm-helper',
  vite:config     'vite:worker',
  vite:config     'vite:asset',
  vite:config     'vite:vue',
  vite:config     'vite:wasm-fallback',
  vite:config     'vite:define',
  vite:config     'vite:css-post',
  vite:config     'vite:build-html',
  vite:config     'vite:worker-import-meta-url',
  vite:config     'vite:asset-import-meta-url',
  vite:config     'vite:force-systemjs-wrap-complete',
  vite:config     'commonjs',
  vite:config     'vite:data-uri',
  vite:config     'vite:rollup-options-plugins',
  vite:config     'vite:dynamic-import-vars',
  vite:config     'vite:import-glob',
  vite:config     'vite:build-import-analysis',
  vite:config     'vite:esbuild-transpile',
  vite:config     'vite:terser',
  vite:config     'vite:manifest',
  vite:config     'vite:ssr-manifest',
  vite:config     'vite:reporter',
  vite:config     'vite:load-fallback'
  vite:config   ],
  vite:config   resolve: {
  vite:config     externalConditions: [ 'node' ],
  vite:config     extensions: [
  vite:config       '.mjs',  '.js',
  vite:config       '.mts',  '.ts',
  vite:config       '.jsx',  '.tsx',
  vite:config       '.json'
  vite:config     ],
  vite:config     dedupe: [ 'vue' ],
  vite:config     noExternal: [],
  vite:config     external: [],
  vite:config     preserveSymlinks: false,
  vite:config     alias: [
  vite:config       {
  vite:config         find: /@\/(.*)/,
  vite:config         replacement: '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/$1'
  vite:config       },
  vite:config       {
  vite:config         find: /^\/?@vite\/env/,
  vite:config         replacement: '/@fs/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/client/env.mjs'
  vite:config       },
  vite:config       {
  vite:config         find: /^\/?@vite\/client/,
  vite:config         replacement: '/@fs/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/client/client.mjs'
  vite:config       }
  vite:config     ],
  vite:config     mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
  vite:config     conditions: [ 'module', 'browser', 'development|production' ],
  vite:config     builtins: []
  vite:config   },
  vite:config   build: {
  vite:config     target: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
  vite:config     polyfillModulePreload: true,
  vite:config     modulePreload: { polyfill: true },
  vite:config     outDir: 'dist',
  vite:config     assetsDir: 'assets',
  vite:config     assetsInlineLimit: 4096,
  vite:config     sourcemap: false,
  vite:config     terserOptions: {},
  vite:config     rollupOptions: {},
  vite:config     commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
  vite:config     dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
  vite:config     write: true,
  vite:config     emptyOutDir: null,
  vite:config     copyPublicDir: true,
  vite:config     manifest: false,
  vite:config     lib: false,
  vite:config     ssrManifest: false,
  vite:config     ssrEmitAssets: false,
  vite:config     reportCompressedSize: true,
  vite:config     chunkSizeWarningLimit: 500,
  vite:config     watch: null,
  vite:config     cssCodeSplit: true,
  vite:config     minify: 'esbuild',
  vite:config     ssr: false,
  vite:config     emitAssets: true,
  vite:config     createEnvironment: [Function: createEnvironment],
  vite:config     cssTarget: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
  vite:config     cssMinify: true
  vite:config   },
  vite:config   define: {
  vite:config     __VUE_OPTIONS_API__: true,
  vite:config     __VUE_PROD_DEVTOOLS__: false,
  vite:config     __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false
  vite:config   },
  vite:config   ssr: {
  vite:config     target: 'node',
  vite:config     optimizeDeps: {
  vite:config       esbuildOptions: { preserveSymlinks: false },
  vite:config       include: [],
  vite:config       exclude: [],
  vite:config       needsInterop: [],
  vite:config       extensions: [],
  vite:config       holdUntilCrawlEnd: true,
  vite:config       force: false,
  vite:config       noDiscovery: true
  vite:config     },
  vite:config     external: [],
  vite:config     noExternal: [],
  vite:config     resolve: {
  vite:config       conditions: [ 'module', 'node', 'development|production' ],
  vite:config       externalConditions: [ 'node' ]
  vite:config     }
  vite:config   },
  vite:config   environments: {
  vite:config     client: {
  vite:config       define: {
  vite:config         __VUE_OPTIONS_API__: true,
  vite:config         __VUE_PROD_DEVTOOLS__: false,
  vite:config         __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false
  vite:config       },
  vite:config       resolve: {
  vite:config         externalConditions: [ 'node' ],
  vite:config         extensions: [
  vite:config           '.mjs',  '.js',
  vite:config           '.mts',  '.ts',
  vite:config           '.jsx',  '.tsx',
  vite:config           '.json'
  vite:config         ],
  vite:config         dedupe: [ 'vue' ],
  vite:config         noExternal: [],
  vite:config         external: [],
  vite:config         preserveSymlinks: false,
  vite:config         alias: [
  vite:config           {
  vite:config             find: /@\/(.*)/,
  vite:config             replacement: '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/$1'
  vite:config           },
  vite:config           {
  vite:config             find: /^\/?@vite\/env/,
  vite:config             replacement: '/@fs/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/client/env.mjs'
  vite:config           },
  vite:config           {
  vite:config             find: /^\/?@vite\/client/,
  vite:config             replacement: '/@fs/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/client/client.mjs'
  vite:config           }
  vite:config         ],
  vite:config         mainFields: [ 'browser', 'module', 'jsnext:main', 'jsnext' ],
  vite:config         conditions: [ 'module', 'browser', 'development|production' ],
  vite:config         builtins: []
  vite:config       },
  vite:config       keepProcessEnv: false,
  vite:config       consumer: 'client',
  vite:config       optimizeDeps: {
  vite:config         include: [],
  vite:config         exclude: [],
  vite:config         needsInterop: [],
  vite:config         extensions: [],
  vite:config         disabled: undefined,
  vite:config         holdUntilCrawlEnd: true,
  vite:config         force: false,
  vite:config         noDiscovery: false,
  vite:config         esbuildOptions: { preserveSymlinks: false }
  vite:config       },
  vite:config       dev: {
  vite:config         warmup: [],
  vite:config         sourcemap: { js: true },
  vite:config         sourcemapIgnoreList: [Function: isInNodeModules],
  vite:config         preTransformRequests: true,
  vite:config         createEnvironment: [Function: defaultCreateClientDevEnvironment],
  vite:config         recoverable: true,
  vite:config         moduleRunnerTransform: false
  vite:config       },
  vite:config       build: {
  vite:config         target: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
  vite:config         polyfillModulePreload: true,
  vite:config         modulePreload: { polyfill: true },
  vite:config         outDir: 'dist',
  vite:config         assetsDir: 'assets',
  vite:config         assetsInlineLimit: 4096,
  vite:config         sourcemap: false,
  vite:config         terserOptions: {},
  vite:config         rollupOptions: {},
  vite:config         commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
  vite:config         dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
  vite:config         write: true,
  vite:config         emptyOutDir: null,
  vite:config         copyPublicDir: true,
  vite:config         manifest: false,
  vite:config         lib: false,
  vite:config         ssrManifest: false,
  vite:config         ssrEmitAssets: false,
  vite:config         reportCompressedSize: true,
  vite:config         chunkSizeWarningLimit: 500,
  vite:config         watch: null,
  vite:config         cssCodeSplit: true,
  vite:config         minify: 'esbuild',
  vite:config         ssr: false,
  vite:config         emitAssets: true,
  vite:config         createEnvironment: [Function: createEnvironment],
  vite:config         cssTarget: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
  vite:config         cssMinify: true
  vite:config       },
  vite:config       plugins: [
  vite:config         {
  vite:config           name: 'vite:build-metadata',
  vite:config           renderChunk: [AsyncFunction: renderChunk]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:watch-package-data',
  vite:config           buildStart: [Function: buildStart],
  vite:config           buildEnd: [Function: buildEnd],
  vite:config           watchChange: [Function: watchChange]
  vite:config         },
  vite:config         {
  vite:config           name: 'alias',
  vite:config           buildStart: [AsyncFunction: buildStart],
  vite:config           resolveId: [Function: resolveId]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:modulepreload-polyfill',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:resolve',
  vite:config           resolveId: [AsyncFunction: resolveId],
  vite:config           load: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:html-inline-proxy',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:css',
  vite:config           buildStart: [Function: buildStart],
  vite:config           buildEnd: [Function: buildEnd],
  vite:config           load: { handler: [AsyncFunction: handler] },
  vite:config           transform: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:esbuild',
  vite:config           configureServer: [Function: configureServer],
  vite:config           transform: [AsyncFunction: transform]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:json',
  vite:config           transform: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:wasm-helper',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:worker',
  vite:config           buildStart: [Function: buildStart],
  vite:config           load: { handler: [AsyncFunction: handler] },
  vite:config           shouldTransformCachedModule: [Function: shouldTransformCachedModule],
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           renderChunk: [Function: renderChunk],
  vite:config           generateBundle: [Function: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:asset',
  vite:config           perEnvironmentStartEndDuringDev: true,
  vite:config           buildStart: [Function: buildStart],
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [AsyncFunction: handler] },
  vite:config           renderChunk: [Function: renderChunk],
  vite:config           generateBundle: [Function: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:vue',
  vite:config           api: {
  vite:config             options: [Getter/Setter],
  vite:config             include: [Getter/Setter],
  vite:config             exclude: [Getter/Setter],
  vite:config             version: '6.0.0'
  vite:config           },
  vite:config           handleHotUpdate: [Function: handleHotUpdate],
  vite:config           config: [Function: config],
  vite:config           configResolved: [Function: configResolved],
  vite:config           options: [Function: options],
  vite:config           shouldTransformCachedModule: [Function: shouldTransformCachedModule],
  vite:config           configureServer: [Function: configureServer],
  vite:config           buildStart: [Function: buildStart],
  vite:config           resolveId: {
  vite:config             filter: { id: [ /^plugin\-vue:export\-helper$/, /[?&]vue\b/ ] },
  vite:config             handler: [Function: handler]
  vite:config           },
  vite:config           load: {
  vite:config             filter: { id: [ /^plugin\-vue:export\-helper$/, /[?&]vue\b/ ] },
  vite:config             handler: [Function: handler]
  vite:config           },
  vite:config           transform: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:wasm-fallback',
  vite:config           load: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:define',
  vite:config           transform: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:css-post',
  vite:config           renderStart: [Function: renderStart],
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           renderChunk: [AsyncFunction: renderChunk],
  vite:config           augmentChunkHash: [Function: augmentChunkHash],
  vite:config           generateBundle: [AsyncFunction: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:build-html',
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           generateBundle: [AsyncFunction: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:worker-import-meta-url',
  vite:config           applyToEnvironment: [Function: applyToEnvironment],
  vite:config           shouldTransformCachedModule: [Function: shouldTransformCachedModule],
  vite:config           transform: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:asset-import-meta-url',
  vite:config           applyToEnvironment: [Function: applyToEnvironment],
  vite:config           transform: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:force-systemjs-wrap-complete',
  vite:config           renderChunk: [Function: renderChunk]
  vite:config         },
  vite:config         {
  vite:config           name: 'commonjs',
  vite:config           version: '28.0.6',
  vite:config           options: [Function: options],
  vite:config           buildStart: [Function: buildStart],
  vite:config           buildEnd: [Function: buildEnd],
  vite:config           load: [AsyncFunction: load],
  vite:config           shouldTransformCachedModule: [Function: shouldTransformCachedModule],
  vite:config           transform: [Function: transform]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:data-uri',
  vite:config           buildStart: [Function: buildStart],
  vite:config           resolveId: [Function: resolveId],
  vite:config           load: [Function: load]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:dynamic-import-vars',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [Function: handler] },
  vite:config           transform: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:import-glob',
  vite:config           buildStart: [Function: buildStart],
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           hotUpdate: [Function: hotUpdate]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:build-import-analysis',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [Function: handler] },
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           renderChunk: [Function: renderChunk],
  vite:config           generateBundle: [Function: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:esbuild-transpile',
  vite:config           applyToEnvironment: [Function: applyToEnvironment],
  vite:config           renderChunk: [AsyncFunction: renderChunk]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:terser',
  vite:config           applyToEnvironment: [Function: applyToEnvironment],
  vite:config           renderChunk: [AsyncFunction: renderChunk],
  vite:config           closeBundle: [Function: closeBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:reporter',
  vite:config           sharedDuringBuild: true,
  vite:config           perEnvironmentStartEndDuringDev: true,
  vite:config           transform: [Function: transform],
  vite:config           buildStart: [Function: buildStart],
  vite:config           buildEnd: [Function: buildEnd],
  vite:config           renderStart: [Function: renderStart],
  vite:config           renderChunk: [Function: renderChunk],
  vite:config           generateBundle: [Function: generateBundle],
  vite:config           writeBundle: [AsyncFunction: writeBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:load-fallback',
  vite:config           load: { handler: [AsyncFunction: handler] }
  vite:config         }
  vite:config       ]
  vite:config     },
  vite:config     ssr: {
  vite:config       define: {
  vite:config         __VUE_OPTIONS_API__: true,
  vite:config         __VUE_PROD_DEVTOOLS__: false,
  vite:config         __VUE_PROD_HYDRATION_MISMATCH_DETAILS__: false
  vite:config       },
  vite:config       resolve: {
  vite:config         externalConditions: [ 'node' ],
  vite:config         extensions: [
  vite:config           '.mjs',  '.js',
  vite:config           '.mts',  '.ts',
  vite:config           '.jsx',  '.tsx',
  vite:config           '.json'
  vite:config         ],
  vite:config         dedupe: [ 'vue' ],
  vite:config         noExternal: [],
  vite:config         external: [],
  vite:config         preserveSymlinks: false,
  vite:config         alias: [
  vite:config           {
  vite:config             find: /@\/(.*)/,
  vite:config             replacement: '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/$1'
  vite:config           },
  vite:config           {
  vite:config             find: /^\/?@vite\/env/,
  vite:config             replacement: '/@fs/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/client/env.mjs'
  vite:config           },
  vite:config           {
  vite:config             find: /^\/?@vite\/client/,
  vite:config             replacement: '/@fs/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/client/client.mjs'
  vite:config           }
  vite:config         ],
  vite:config         mainFields: [ 'module', 'jsnext:main', 'jsnext' ],
  vite:config         conditions: [ 'module', 'node', 'development|production' ],
  vite:config         builtins: [
  vite:config           '_http_agent',         '_http_client',        '_http_common',
  vite:config           '_http_incoming',      '_http_outgoing',      '_http_server',
  vite:config           '_stream_duplex',      '_stream_passthrough', '_stream_readable',
  vite:config           '_stream_transform',   '_stream_wrap',        '_stream_writable',
  vite:config           '_tls_common',         '_tls_wrap',           'assert',
  vite:config           'assert/strict',       'async_hooks',         'buffer',
  vite:config           'child_process',       'cluster',             'console',
  vite:config           'constants',           'crypto',              'dgram',
  vite:config           'diagnostics_channel', 'dns',                 'dns/promises',
  vite:config           'domain',              'events',              'fs',
  vite:config           'fs/promises',         'http',                'http2',
  vite:config           'https',               'inspector',           'inspector/promises',
  vite:config           'module',              'net',                 'os',
  vite:config           'path',                'path/posix',          'path/win32',
  vite:config           'perf_hooks',          'process',             'punycode',
  vite:config           'querystring',         'readline',            'readline/promises',
  vite:config           'repl',                'stream',              'stream/consumers',
  vite:config           'stream/promises',     'stream/web',          'string_decoder',
  vite:config           'sys',                 'timers',              'timers/promises',
  vite:config           'tls',                 'trace_events',        'tty',
  vite:config           'url',                 'util',                'util/types',
  vite:config           'v8',                  'vm',                  'wasi',
  vite:config           'worker_threads',      'zlib',                /^node:/,
  vite:config           /^npm:/,               /^bun:/
  vite:config         ]
  vite:config       },
  vite:config       keepProcessEnv: true,
  vite:config       consumer: 'server',
  vite:config       optimizeDeps: {
  vite:config         include: [],
  vite:config         exclude: [],
  vite:config         needsInterop: [],
  vite:config         extensions: [],
  vite:config         disabled: undefined,
  vite:config         holdUntilCrawlEnd: true,
  vite:config         force: false,
  vite:config         noDiscovery: true,
  vite:config         esbuildOptions: { preserveSymlinks: false }
  vite:config       },
  vite:config       dev: {
  vite:config         warmup: [],
  vite:config         sourcemap: { js: true },
  vite:config         sourcemapIgnoreList: [Function: isInNodeModules],
  vite:config         preTransformRequests: false,
  vite:config         createEnvironment: [Function: defaultCreateDevEnvironment],
  vite:config         recoverable: false,
  vite:config         moduleRunnerTransform: true
  vite:config       },
  vite:config       build: {
  vite:config         target: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
  vite:config         polyfillModulePreload: true,
  vite:config         modulePreload: { polyfill: true },
  vite:config         outDir: 'dist',
  vite:config         assetsDir: 'assets',
  vite:config         assetsInlineLimit: 4096,
  vite:config         sourcemap: false,
  vite:config         terserOptions: {},
  vite:config         rollupOptions: {},
  vite:config         commonjsOptions: { include: [ /node_modules/ ], extensions: [ '.js', '.cjs' ] },
  vite:config         dynamicImportVarsOptions: { warnOnError: true, exclude: [ /node_modules/ ] },
  vite:config         write: true,
  vite:config         emptyOutDir: null,
  vite:config         copyPublicDir: true,
  vite:config         manifest: false,
  vite:config         lib: false,
  vite:config         ssrManifest: false,
  vite:config         ssrEmitAssets: false,
  vite:config         reportCompressedSize: true,
  vite:config         chunkSizeWarningLimit: 500,
  vite:config         watch: null,
  vite:config         cssCodeSplit: true,
  vite:config         minify: false,
  vite:config         ssr: true,
  vite:config         emitAssets: true,
  vite:config         createEnvironment: [Function: createEnvironment],
  vite:config         cssTarget: [ 'chrome107', 'edge107', 'firefox104', 'safari16' ],
  vite:config         cssMinify: 'esbuild'
  vite:config       },
  vite:config       plugins: [
  vite:config         {
  vite:config           name: 'vite:build-metadata',
  vite:config           renderChunk: [AsyncFunction: renderChunk]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:watch-package-data',
  vite:config           buildStart: [Function: buildStart],
  vite:config           buildEnd: [Function: buildEnd],
  vite:config           watchChange: [Function: watchChange]
  vite:config         },
  vite:config         {
  vite:config           name: 'alias',
  vite:config           buildStart: [AsyncFunction: buildStart],
  vite:config           resolveId: [Function: resolveId]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:modulepreload-polyfill',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:resolve',
  vite:config           resolveId: [AsyncFunction: resolveId],
  vite:config           load: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:html-inline-proxy',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:css',
  vite:config           buildStart: [Function: buildStart],
  vite:config           buildEnd: [Function: buildEnd],
  vite:config           load: { handler: [AsyncFunction: handler] },
  vite:config           transform: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:esbuild',
  vite:config           configureServer: [Function: configureServer],
  vite:config           transform: [AsyncFunction: transform]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:json',
  vite:config           transform: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:wasm-helper',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:worker',
  vite:config           buildStart: [Function: buildStart],
  vite:config           load: { handler: [AsyncFunction: handler] },
  vite:config           shouldTransformCachedModule: [Function: shouldTransformCachedModule],
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           renderChunk: [Function: renderChunk],
  vite:config           generateBundle: [Function: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:asset',
  vite:config           perEnvironmentStartEndDuringDev: true,
  vite:config           buildStart: [Function: buildStart],
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [AsyncFunction: handler] },
  vite:config           renderChunk: [Function: renderChunk],
  vite:config           generateBundle: [Function: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:vue',
  vite:config           api: {
  vite:config             options: [Getter/Setter],
  vite:config             include: [Getter/Setter],
  vite:config             exclude: [Getter/Setter],
  vite:config             version: '6.0.0'
  vite:config           },
  vite:config           handleHotUpdate: [Function: handleHotUpdate],
  vite:config           config: [Function: config],
  vite:config           configResolved: [Function: configResolved],
  vite:config           options: [Function: options],
  vite:config           shouldTransformCachedModule: [Function: shouldTransformCachedModule],
  vite:config           configureServer: [Function: configureServer],
  vite:config           buildStart: [Function: buildStart],
  vite:config           resolveId: {
  vite:config             filter: { id: [ /^plugin\-vue:export\-helper$/, /[?&]vue\b/ ] },
  vite:config             handler: [Function: handler]
  vite:config           },
  vite:config           load: {
  vite:config             filter: { id: [ /^plugin\-vue:export\-helper$/, /[?&]vue\b/ ] },
  vite:config             handler: [Function: handler]
  vite:config           },
  vite:config           transform: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:wasm-fallback',
  vite:config           load: { handler: [Function: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:define',
  vite:config           transform: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:css-post',
  vite:config           renderStart: [Function: renderStart],
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           renderChunk: [AsyncFunction: renderChunk],
  vite:config           augmentChunkHash: [Function: augmentChunkHash],
  vite:config           generateBundle: [AsyncFunction: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:build-html',
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           generateBundle: [AsyncFunction: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:force-systemjs-wrap-complete',
  vite:config           renderChunk: [Function: renderChunk]
  vite:config         },
  vite:config         {
  vite:config           name: 'commonjs',
  vite:config           version: '28.0.6',
  vite:config           options: [Function: options],
  vite:config           buildStart: [Function: buildStart],
  vite:config           buildEnd: [Function: buildEnd],
  vite:config           load: [AsyncFunction: load],
  vite:config           shouldTransformCachedModule: [Function: shouldTransformCachedModule],
  vite:config           transform: [Function: transform]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:data-uri',
  vite:config           buildStart: [Function: buildStart],
  vite:config           resolveId: [Function: resolveId],
  vite:config           load: [Function: load]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:dynamic-import-vars',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [Function: handler] },
  vite:config           transform: { handler: [AsyncFunction: handler] }
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:import-glob',
  vite:config           buildStart: [Function: buildStart],
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           hotUpdate: [Function: hotUpdate]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:build-import-analysis',
  vite:config           resolveId: { handler: [Function: handler] },
  vite:config           load: { handler: [Function: handler] },
  vite:config           transform: { handler: [AsyncFunction: handler] },
  vite:config           renderChunk: [Function: renderChunk],
  vite:config           generateBundle: [Function: generateBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:esbuild-transpile',
  vite:config           applyToEnvironment: [Function: applyToEnvironment],
  vite:config           renderChunk: [AsyncFunction: renderChunk]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:reporter',
  vite:config           sharedDuringBuild: true,
  vite:config           perEnvironmentStartEndDuringDev: true,
  vite:config           transform: [Function: transform],
  vite:config           buildStart: [Function: buildStart],
  vite:config           buildEnd: [Function: buildEnd],
  vite:config           renderStart: [Function: renderStart],
  vite:config           renderChunk: [Function: renderChunk],
  vite:config           generateBundle: [Function: generateBundle],
  vite:config           writeBundle: [AsyncFunction: writeBundle]
  vite:config         },
  vite:config         {
  vite:config           name: 'vite:load-fallback',
  vite:config           load: { handler: [AsyncFunction: handler] }
  vite:config         }
  vite:config       ]
  vite:config     }
  vite:config   },
  vite:config   configFile: '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/vite.config.ts',
  vite:config   configFileDependencies: [
  vite:config     '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/vite.config.ts'
  vite:config   ],
  vite:config   inlineConfig: {
  vite:config     root: undefined,
  vite:config     base: undefined,
  vite:config     mode: undefined,
  vite:config     configFile: undefined,
  vite:config     configLoader: undefined,
  vite:config     logLevel: undefined,
  vite:config     clearScreen: undefined,
  vite:config     build: {}
  vite:config   },
  vite:config   root: '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro',
  vite:config   base: '/',
  vite:config   decodedBase: '/',
  vite:config   rawBase: '/',
  vite:config   publicDir: '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/public',
  vite:config   cacheDir: '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.vite',
  vite:config   command: 'build',
  vite:config   mode: 'production',
  vite:config   isWorker: false,
  vite:config   mainConfig: null,
  vite:config   bundleChain: [],
  vite:config   isProduction: true,
  vite:config   css: {
  vite:config     transformer: 'postcss',
  vite:config     preprocessorMaxWorkers: true,
  vite:config     devSourcemap: false
  vite:config   },
  vite:config   json: { namedExports: true, stringify: 'auto' },
  vite:config   esbuild: { jsxDev: false },
  vite:config   server: {
  vite:config     port: 5173,
  vite:config     strictPort: false,
  vite:config     host: undefined,
  vite:config     allowedHosts: [],
  vite:config     https: undefined,
  vite:config     open: false,
  vite:config     proxy: undefined,
  vite:config     cors: {
  vite:config       origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
  vite:config     },
  vite:config     headers: {},
  vite:config     warmup: { clientFiles: [], ssrFiles: [] },
  vite:config     middlewareMode: false,
  vite:config     fs: {
  vite:config       strict: true,
  vite:config       deny: [ '.env', '.env.*', '*.{crt,pem}', '**/.git/**' ],
  vite:config       allow: [
  vite:config         '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro'
  vite:config       ]
  vite:config     },
  vite:config     preTransformRequests: true,
  vite:config     perEnvironmentStartEndDuringDev: false,
  vite:config     sourcemapIgnoreList: [Function: isInNodeModules]
  vite:config   },
  vite:config   builder: undefined,
  vite:config   preview: {
  vite:config     port: 4173,
  vite:config     strictPort: false,
  vite:config     host: undefined,
  vite:config     allowedHosts: [],
  vite:config     https: undefined,
  vite:config     open: false,
  vite:config     proxy: undefined,
  vite:config     cors: {
  vite:config       origin: /^https?:\/\/(?:(?:[^:]+\.)?localhost|127\.0\.0\.1|\[::1\])(?::\d+)?$/
  vite:config     },
  vite:config     headers: {}
  vite:config   },
  vite:config   envDir: '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro',
  vite:config   env: { BASE_URL: '/', MODE: 'production', DEV: false, PROD: true },
  vite:config   assetsInclude: [Function: assetsInclude],
  vite:config   logger: {
  vite:config     hasWarned: false,
  vite:config     info: [Function: info],
  vite:config     warn: [Function (anonymous)],
  vite:config     warnOnce: [Function: warnOnce],
  vite:config     error: [Function: error],
  vite:config     clearScreen: [Function: clearScreen],
  vite:config     hasErrorLogged: [Function: hasErrorLogged]
  vite:config   },
  vite:config   packageCache: Map(1) {
  vite:config     'fnpd_/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro' => {
  vite:config       dir: '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro',
  vite:config       data: {
  vite:config         name: 'vite-7-scss-alias-bug-repro',
  vite:config         version: '0.0.0',
  vite:config         private: true,
  vite:config         type: 'module',
  vite:config         scripts: {
  vite:config           dev: 'vite',
  vite:config           build: 'run-p type-check "build-only {@}" --',
  vite:config           preview: 'vite preview',
  vite:config           'build-only': 'vite build',
  vite:config           'type-check': 'vue-tsc --build'
  vite:config         },
  vite:config         dependencies: { vue: '^3.5.17' },
  vite:config         devDependencies: {
  vite:config           '@tsconfig/node22': '^22.0.2',
  vite:config           '@types/node': '^22.15.32',
  vite:config           '@vitejs/plugin-vue': '^6.0.0',
  vite:config           '@vue/tsconfig': '^0.7.0',
  vite:config           'npm-run-all2': '^8.0.4',
  vite:config           'sass-embedded': '^1.89.2',
  vite:config           typescript: '~5.8.0',
  vite:config           vite: '^7.0.0',
  vite:config           'vite-plugin-vue-devtools': '^7.7.7',
  vite:config           'vue-tsc': '^2.2.10'
  vite:config         }
  vite:config       },
  vite:config       hasSideEffects: [Function: hasSideEffects],
  vite:config       setResolvedCache: [Function: setResolvedCache],
  vite:config       getResolvedCache: [Function: getResolvedCache]
  vite:config     },
  vite:config     set: [Function (anonymous)]
  vite:config   },
  vite:config   worker: { format: 'iife', plugins: '() => plugins', rollupOptions: {} },
  vite:config   appType: 'spa',
  vite:config   experimental: {
  vite:config     importGlobRestoreExtension: false,
  vite:config     renderBuiltUrl: undefined,
  vite:config     hmrPartialAccept: false
  vite:config   },
  vite:config   future: undefined,
  vite:config   optimizeDeps: {
  vite:config     include: [],
  vite:config     exclude: [],
  vite:config     needsInterop: [],
  vite:config     extensions: [],
  vite:config     disabled: undefined,
  vite:config     holdUntilCrawlEnd: true,
  vite:config     force: false,
  vite:config     noDiscovery: false,
  vite:config     esbuildOptions: { preserveSymlinks: false }
  vite:config   },
  vite:config   dev: {
  vite:config     warmup: [],
  vite:config     sourcemap: { js: true },
  vite:config     sourcemapIgnoreList: [Function: isInNodeModules],
  vite:config     preTransformRequests: false,
  vite:config     createEnvironment: [Function: defaultCreateDevEnvironment],
  vite:config     recoverable: false,
  vite:config     moduleRunnerTransform: false
  vite:config   },
  vite:config   webSocketToken: 'xB56DQ_xw1DL',
  vite:config   getSortedPlugins: [Function: getSortedPlugins],
  vite:config   getSortedPluginHooks: [Function: getSortedPluginHooks],
  vite:config   createResolver: [Function: createResolver],
  vite:config   fsDenyGlob: [Function: arrayMatcher],
  vite:config   safeModulePaths: Set(0) {},
  vite:config   [Symbol(vite:resolved-config)]: true
  vite:config } +15ms
vite v7.0.0 building for production...
transforming (1) src/main.ts  vite:resolve 0.13ms ./base.css -> /Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/assets/base.css +0ms
transforming (9) node_modules/.pnpm/@vue+runtime-dom@3.5.17/node_modules/@vue/runtime-dom/dist/runtime-dom.esm-bundler.js  vite:resolve 0.06ms /Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src//Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/test.scss -> null +26ms
  vite:resolve 0.21ms /Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/@/test.scss -> /Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src//Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/test.scss +0ms
✓ 15 modules transformed.
✗ Build failed in 243ms
error during build:
[vite:css] [sass] Error: Error: ENOENT: no such file or directory, open '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/test.scss'
  ╷
2 │ @use '@/test.scss';
  │ ^^^^^^^^^^^^^^^^^^
  ╵
  ../../../../../../../src/App.vue 2:1  root stylesheet
file: /Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/App.vue?vue&type=style&index=0&scoped=9df6a930&lang.scss

[sass] Error: Error: ENOENT: no such file or directory, open '/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/src/test.scss'
  ╷
2 │ @use '@/test.scss';
  │ ^^^^^^^^^^^^^^^^^^
  ╵
  ../../../../../../../src/App.vue 2:1  root stylesheet

    at handleCompileResponse (/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/sass-embedded@1.89.2/node_modules/sass-embedded/dist/lib/src/compiler/utils.js:155:15)
    at AsyncCompiler.compileRequestAsync (/Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/sass-embedded@1.89.2/node_modules/sass-embedded/dist/lib/src/compiler/async.js:100:54)
    at process.processTicksAndRejections (node:internal/process/task_queues:105:5)
    at async Object.run (file:///Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:32810:19)
    at async process (file:///Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:32839:20)
    at async compileCSSPreprocessors (file:///Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:32259:27)
    at async compileCSS (file:///Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:32287:30)
    at async Object.handler (file:///Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/vite@7.0.0_@types+node@22.15.33_sass-embedded@1.89.2/node_modules/vite/dist/node/chunks/dep-Bsx9IwL8.js:31832:53)
    at async transform (file:///Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/rollup@4.44.0/node_modules/rollup/dist/es/shared/node-entry.js:21001:16)
    at async ModuleLoader.addModuleSource (file:///Users/brockhoff/Documents/git/test/vite-7-scss-alias-bug-repro/node_modules/.pnpm/rollup@4.44.0/node_modules/rollup/dist/es/shared/node-entry.js:21214:36)
 ELIFECYCLE  Command failed with exit code 1.
 ELIFECYCLE  Command failed.
ERROR: "build-only --debug" exited with 1.
 ELIFECYCLE  Command failed with exit code 1.

Validations

Metadata

Metadata

Assignees

Labels

feat: cssp3-minor-bugAn edge case that only affects very specific usage (priority)regressionThe issue only appears after a new release

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions