Skip to content
This repository was archived by the owner on Mar 19, 2026. It is now read-only.
Merged
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
13 changes: 13 additions & 0 deletions packages/vite/src/node/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -681,6 +681,7 @@ export const configDefaults = Object.freeze({
noExternal: [],
external: [],
preserveSymlinks: false,
tsconfigPaths: false,
alias: [],
},

Expand Down Expand Up @@ -1934,6 +1935,17 @@ assetFileNames isn't equal for every build.rollupOptions.output. A single patter
)
}

if (
resolved.resolve.tsconfigPaths &&
resolved.experimental.enableNativePlugin === false
) {
resolved.logger.warn(
colors.yellow(`
(!) resolve.tsconfigPaths is set to true, but native plugins are disabled. To use resolve.tsconfigPaths, please enable native plugins via experimental.enableNativePlugin.
`),
)
}

return resolved
}

Expand Down Expand Up @@ -2177,6 +2189,7 @@ async function bundleConfigFile(
dedupe: [],
extensions: configDefaults.resolve.extensions,
preserveSymlinks: false,
tsconfigPaths: false,
packageCache,
isRequire,
builtins: nodeLikeBuiltins,
Expand Down
11 changes: 10 additions & 1 deletion packages/vite/src/node/plugins/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -114,6 +114,15 @@ export interface ResolveOptions extends EnvironmentResolveOptions {
* @default false
*/
preserveSymlinks?: boolean
/**
* Enable tsconfig paths resolution
*
* This option does not have any effect if `experimental.enableNativePlugin` is set to `false`.
*
* @default false
* @experimental
*/
tsconfigPaths?: boolean
}

interface ResolvePluginOptions {
Expand Down Expand Up @@ -266,7 +275,7 @@ export function oxcResolvePlugin(
tryIndex: options.tryIndex ?? true,
tryPrefix: options.tryPrefix,
preserveSymlinks: options.preserveSymlinks,
tsconfigPaths: false,
tsconfigPaths: options.tsconfigPaths,
},
environmentConsumer: partialEnv.config.consumer,
environmentName: partialEnv.name,
Expand Down
1 change: 1 addition & 0 deletions packages/vite/src/node/ssr/fetchModule.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ export async function fetchModule(
extensions: ['.js', '.cjs', '.json'],
dedupe,
preserveSymlinks,
tsconfigPaths: false,
isBuild: false,
isProduction,
root,
Expand Down
14 changes: 14 additions & 0 deletions playground/resolve-tsconfig-paths/__tests__/resolve.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
import { expect, test } from 'vitest'
import { page } from '~utils'

test('import from .ts', async () => {
await expect.poll(() => page.textContent('.ts')).toMatch('[success]')
})

test('import from .js', async () => {
await expect.poll(() => page.textContent('.js')).toMatch('[success]')
})

test('fallback works', async () => {
await expect.poll(() => page.textContent('.fallback')).toMatch('[success]')
})
1 change: 1 addition & 0 deletions playground/resolve-tsconfig-paths/fallback/fallback.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default '[success] imported from fallback'
25 changes: 25 additions & 0 deletions playground/resolve-tsconfig-paths/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
<h1>Resolve: tsconfig paths</h1>

<h2>Import from .ts</h2>
<p class="ts"></p>

<h2>Import from .js</h2>
<p class="js"></p>

<h2>Fallback works</h2>
<p class="fallback"></p>

<script type="module">
function text(selector, text) {
document.querySelector(selector).textContent = text
}

import ts from './src/ts.ts'
text('.ts', ts)

import js from './src/js.js'
text('.js', js)

import fallback from '@fallback/fallback'
text('.fallback', fallback)
</script>
12 changes: 12 additions & 0 deletions playground/resolve-tsconfig-paths/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"name": "@vitejs/test-resolve-tsconfig-paths",
"private": true,
"version": "0.0.0",
"type": "module",
"scripts": {
"dev": "vite",
"build": "vite build",
"debug": "node --inspect-brk ../../packages/vite/bin/vite",
"preview": "vite preview"
}
}
1 change: 1 addition & 0 deletions playground/resolve-tsconfig-paths/src/imported.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export default '[success] imported'
1 change: 1 addition & 0 deletions playground/resolve-tsconfig-paths/src/js.js
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '@/imported'
1 change: 1 addition & 0 deletions playground/resolve-tsconfig-paths/src/ts.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
export { default } from '@/imported'
11 changes: 11 additions & 0 deletions playground/resolve-tsconfig-paths/tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
{
"compilerOptions": {
"allowJs": true,
"noEmit": true,
"paths": {
"@/*": ["./src/*"],
"@fallback/*": ["./src/*", "./fallback/*"]
}
},
"exclude": ["./__tests__"]
}
10 changes: 10 additions & 0 deletions playground/resolve-tsconfig-paths/vite.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import { defineConfig } from 'vite'

export default defineConfig({
resolve: {
tsconfigPaths: true,
},
experimental: {
enableNativePlugin: 'resolver',
},
})
2 changes: 1 addition & 1 deletion playground/tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"include": ["**/vite*config*", "**/*.ts"],
"exclude": ["**/dist/**", "./legacy/**"],
"exclude": ["**/dist/**", "./legacy/**", "./resolve-tsconfig-paths/**"],
"compilerOptions": {
"checkJs": true,
"target": "ES2023",
Expand Down
2 changes: 2 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.