Skip to content

Commit

Permalink
fix: provide default baseUrl and correctly parse tsconfig paths (#386)
Browse files Browse the repository at this point in the history
* fix: set baseUrl if none is provided

* test: add failing test for #330

* fix: update import matching pattern to close #330

* fix: add test cases for relative parent
  • Loading branch information
lachieh authored Oct 11, 2024
1 parent a7e1c0c commit dc3cbfe
Show file tree
Hide file tree
Showing 4 changed files with 65 additions and 18 deletions.
8 changes: 7 additions & 1 deletion src/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -288,7 +288,13 @@ export function dtsPlugin(options: PluginOptions = {}): import('vite').Plugin {
: [ensureAbsolute(content?.raw.compilerOptions?.outDir || 'dist', root)]
}

const { baseUrl, paths } = compilerOptions
const {
// Here we are using the default value to set the `baseUrl` to the current directory if no value exists. This is
// the same behavior as the TS Compiler. See TS source:
// https://github.com/microsoft/TypeScript/blob/3386e943215613c40f68ba0b108cda1ddb7faee1/src/compiler/utilities.ts#L6493-L6501
baseUrl = compilerOptions.paths ? process.cwd() : undefined,
paths
} = compilerOptions

if (pathsToAliases && baseUrl && paths) {
aliases.push(
Expand Down
2 changes: 1 addition & 1 deletion src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -421,7 +421,7 @@ export function parseTsAliases(basePath: string, paths: ts.MapLike<string[]>) {

for (const [pathWithAsterisk, replacements] of Object.entries(paths)) {
const find = new RegExp(
`^${pathWithAsterisk.replace(regexpSymbolRE, '\\$1').replace(asteriskRE, '(.+)')}$`
`^${pathWithAsterisk.replace(regexpSymbolRE, '\\$1').replace(asteriskRE, '(?!\\.{1,2}\\/)([^*]+)')}$`
)

let index = 1
Expand Down
52 changes: 48 additions & 4 deletions tests/transform.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -83,10 +83,14 @@ describe('transform tests', () => {

it('test: transformCode (process aliases)', () => {
const aliases: Alias[] = [
{ find: /^@\/(.+)/, replacement: resolve(__dirname, '../$1') },
{ find: /^@components\/(.+)/, replacement: resolve(__dirname, '../src/components/$1') },
{ find: /^@\/(?!\.{1,2}\/)([^*]+)/, replacement: resolve(__dirname, '../$1') },
{
find: /^@components\/(?!\.{1,2}\/)([^*]+)/,
replacement: resolve(__dirname, '../src/components/$1')
},
{ find: /^~\//, replacement: resolve(__dirname, '../src/') },
{ find: '$src', replacement: resolve(__dirname, '../src') }
{ find: '$src', replacement: resolve(__dirname, '../src') },
{ find: /^(?!\.{1,2}\/)([^*]+)/, replacement: resolve(__dirname, '../src/$1') }
]
const filePath = resolve(__dirname, '../src/index.ts')

Expand Down Expand Up @@ -121,6 +125,31 @@ describe('transform tests', () => {
content: 'import("@/components/test").Test;',
output: "import('../components/test').Test;"
},
{
// https://github.com/qmhc/vite-plugin-dts/issues/330
description: 'wildcard alias at root level with relative import',
filePath: './src/components/Sample/index.ts',
content: 'import { Sample } from "./Sample";',
output: "import { Sample } from './Sample';\n"
},
{
description: 'wildcard alias at root level with relative import and dot in name',
filePath: './src/components/Sample/index.ts',
content: 'import { Sample } from "./test.data";',
output: "import { Sample } from './test.data';\n"
},
{
description: 'wildcard alias at root level with relative parent import and dot in name',
filePath: './src/components/Sample/index.ts',
content: 'import { Sample } from "../test.data";',
output: "import { Sample } from '../test.data';\n"
},
{
description: 'wildcard alias at root level with relative import and dot in name',
filePath: './src/components/Sample/index.ts',
content: 'import { Sample } from "utils/test.data";',
output: "import { Sample } from '../../utils/test.data';\n"
},
{
description: 'import inside folder with named alias at subfolder',
content: 'import type { TestBase } from "@/components/test";',
Expand Down Expand Up @@ -170,7 +199,6 @@ describe('transform tests', () => {
},
{
description: 'alias as everything, relative import',
aliases: [{ find: /^(.+)$/, replacement: resolve(__dirname, '../src/$1') }],
content: 'import { TestBase } from "test";',
output: "import { TestBase } from './test';\n"
}
Expand Down Expand Up @@ -212,8 +240,24 @@ describe('transform tests', () => {
)

expect(transformCode(options('import { TestBase } from "./test";')).content).toEqual(
"import { TestBase } from './test';\n"
)

expect(transformCode(options('import { TestBase } from "test";')).content).toEqual(
"import { TestBase } from './utils/test';\n"
)

expect(transformCode(options('import { TestBase } from "test.path";')).content).toEqual(
"import { TestBase } from './utils/test.path';\n"
)

expect(transformCode(options('import { TestBase } from "./test.path";')).content).toEqual(
"import { TestBase } from './test.path';\n"
)

expect(transformCode(options('import { TestBase } from "../test.path";')).content).toEqual(
"import { TestBase } from '../test.path';\n"
)
})

it('test: transformCode (remove pure imports)', () => {
Expand Down
21 changes: 9 additions & 12 deletions tests/utils.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,14 +168,14 @@ describe('utils tests', () => {
})
).toStrictEqual([
{
find: /^@\/(.+)$/,
find: /^@\/(?!\.{1,2}\/)([^*]+)$/,
replacement: expect.stringMatching(maybeWindowsPath('/tmp/fake/project/root/at/$1'))
}
])

expect(parseTsAliases('/tmp/fake/project/root', { '~/*': ['./tilde/*'] })).toStrictEqual([
{
find: /^~\/(.+)$/,
find: /^~\/(?!\.{1,2}\/)([^*]+)$/,
replacement: expect.stringMatching(maybeWindowsPath('/tmp/fake/project/root/tilde/$1'))
}
])
Expand All @@ -184,7 +184,7 @@ describe('utils tests', () => {
parseTsAliases('/tmp/fake/project/root', { '@/no-dot-prefix/*': ['no-dot-prefix/*'] })
).toStrictEqual([
{
find: /^@\/no-dot-prefix\/(.+)$/,
find: /^@\/no-dot-prefix\/(?!\.{1,2}\/)([^*]+)$/,
replacement: expect.stringMatching(
maybeWindowsPath('/tmp/fake/project/root/no-dot-prefix/$1')
)
Expand All @@ -195,7 +195,7 @@ describe('utils tests', () => {
parseTsAliases('/tmp/fake/project/root', { '@/components/*': ['./at/components/*'] })
).toStrictEqual([
{
find: /^@\/components\/(.+)$/,
find: /^@\/components\/(?!\.{1,2}\/)([^*]+)$/,
replacement: expect.stringMatching(
maybeWindowsPath('/tmp/fake/project/root/at/components/$1')
)
Expand All @@ -204,7 +204,7 @@ describe('utils tests', () => {

expect(parseTsAliases('/tmp/fake/project/root', { 'top/*': ['./top/*'] })).toStrictEqual([
{
find: /^top\/(.+)$/,
find: /^top\/(?!\.{1,2}\/)([^*]+)$/,
replacement: expect.stringMatching(maybeWindowsPath('/tmp/fake/project/root/top/$1'))
}
])
Expand All @@ -219,15 +219,15 @@ describe('utils tests', () => {
// https://github.com/qmhc/vite-plugin-dts/issues/330
expect(parseTsAliases('/tmp/fake/project/root', { '*': ['./src/*'] })).toStrictEqual([
{
find: /^(.+)$/,
find: /^(?!\.{1,2}\/)([^*]+)$/,
replacement: expect.stringMatching(maybeWindowsPath('/tmp/fake/project/root/src/$1'))
}
])

// https://github.com/qmhc/vite-plugin-dts/issues/290#issuecomment-1872495764
expect(parseTsAliases('/tmp/fake/project/root', { '#*': ['./hashed/*'] })).toStrictEqual([
{
find: /^#(.+)$/,
find: /^#(?!\.{1,2}\/)([^*]+)$/,
replacement: expect.stringMatching(maybeWindowsPath('/tmp/fake/project/root/hashed/$1'))
}
])
Expand All @@ -248,11 +248,8 @@ describe('utils tests', () => {
})

it('test: getTsLibFolder', () => {
const root = normalizePath(resolve(__dirname, '..'))
const entryRoot = resolve(root, 'src')

expect(getTsLibFolder({ root, entryRoot })).toMatch(/node_modules\/typescript$/)
expect(getTsLibFolder()).toMatch(/node_modules\/typescript$/)

expect(existsSync(getTsLibFolder({ root, entryRoot }) || '')).toBe(true)
expect(existsSync(getTsLibFolder() || '')).toBe(true)
})
})

0 comments on commit dc3cbfe

Please sign in to comment.