Skip to content

Commit

Permalink
fix: correctly process cleaning .vue paths
Browse files Browse the repository at this point in the history
fix #325
  • Loading branch information
qmhc committed May 5, 2024
1 parent 7a0c372 commit 0a3ad73
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 34 deletions.
5 changes: 2 additions & 3 deletions src/plugin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -538,7 +538,6 @@ export function dtsPlugin(options: PluginOptions = {}): import('vite').Plugin {
bundleDebug('emit output patch')

const currentDir = host.getCurrentDirectory()
const vuePathRE = /['"](.+)\.vue['"]/g

await runParallel(
cpus().length,
Expand All @@ -554,7 +553,8 @@ export function dtsPlugin(options: PluginOptions = {}): import('vite').Plugin {
aliases,
aliasesExclude,
staticImport,
clearPureImport
clearPureImport,
cleanVueFileName
})

content = result.content
Expand All @@ -568,7 +568,6 @@ export function dtsPlugin(options: PluginOptions = {}): import('vite').Plugin {
cleanVueFileName ? filePath.replace('.vue.d.ts', '.d.ts') : filePath
)
)
content = cleanVueFileName ? content.replace(vuePathRE, '"$1"') : content

if (isMapFile) {
try {
Expand Down
51 changes: 23 additions & 28 deletions src/transform.ts
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,8 @@ export function transformCode(options: {
aliases: Alias[],
aliasesExclude: (string | RegExp)[],
staticImport: boolean,
clearPureImport: boolean
clearPureImport: boolean,
cleanVueFileName: boolean
}) {
const s = new MagicString(options.content)
const ast = ts.createSourceFile('a.ts', options.content, ts.ScriptTarget.Latest)
Expand All @@ -97,6 +98,12 @@ export function transformCode(options: {
const usedDefault = new Map<string, string>()
const declareModules: string[] = []

const toLibName = (origin: string) => {
const name = transformAlias(origin, dir, options.aliases, options.aliasesExclude)

return options.cleanVueFileName ? name.replace(/\.vue$/, '') : name
}

let indexCount = 0

walkSourceFile(ast, (node, parent) => {
Expand All @@ -108,12 +115,7 @@ export function transformCode(options: {
(node.importClause.name ||
(node.importClause.namedBindings && ts.isNamedImports(node.importClause.namedBindings)))
) {
const libName = transformAlias(
node.moduleSpecifier.text,
dir,
options.aliases,
options.aliasesExclude
)
const libName = toLibName(node.moduleSpecifier.text)
const importSet =
importMap.get(libName) ?? importMap.set(libName, new Set<string>()).get(libName)!

Expand Down Expand Up @@ -147,12 +149,7 @@ export function transformCode(options: {
ts.isIdentifier(node.qualifier) &&
ts.isStringLiteral(node.argument.literal)
) {
const libName = transformAlias(
node.argument.literal.text,
dir,
options.aliases,
options.aliasesExclude
)
const libName = toLibName(node.argument.literal.text)

if (!options.staticImport) {
s.update(node.argument.literal.pos, node.argument.literal.end, `'${libName}'`)
Expand Down Expand Up @@ -191,15 +188,12 @@ export function transformCode(options: {
node.expression.kind === ts.SyntaxKind.ImportKeyword &&
ts.isStringLiteral(node.arguments[0])
) {
const libName = transformAlias(
node.arguments[0].text,
dir,
options.aliases,
options.aliasesExclude
s.update(
node.arguments[0].pos,
node.arguments[0].end,
`'${toLibName(node.arguments[0].text)}'`
)

s.update(node.arguments[0].pos, node.arguments[0].end, `'${libName}'`)

return false
}

Expand All @@ -208,15 +202,12 @@ export function transformCode(options: {
node.moduleSpecifier &&
ts.isStringLiteral(node.moduleSpecifier)
) {
const libName = transformAlias(
node.moduleSpecifier.text,
dir,
options.aliases,
options.aliasesExclude
s.update(
node.moduleSpecifier.pos,
node.moduleSpecifier.end,
` '${toLibName(node.moduleSpecifier.text)}'`
)

s.update(node.moduleSpecifier.pos, node.moduleSpecifier.end, ` '${libName}'`)

return false
}

Expand All @@ -235,10 +226,14 @@ export function transformCode(options: {
}
})

let prependImports = ''

importMap.forEach((importSet, libName) => {
s.prepend(`import { ${Array.from(importSet).join(', ')} } from '${libName}';\n`)
prependImports += `import { ${Array.from(importSet).join(', ')} } from '${libName}';\n`
})

s.prepend(prependImports)

return {
content: s.toString(),
declareModules
Expand Down
40 changes: 37 additions & 3 deletions tests/transform.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,8 @@ describe('transform tests', () => {
aliases: [],
aliasesExclude: [],
staticImport: true,
clearPureImport: false
clearPureImport: false,
cleanVueFileName: false
})

expect(
Expand Down Expand Up @@ -93,7 +94,8 @@ describe('transform tests', () => {
aliases,
aliasesExclude: [],
staticImport: false,
clearPureImport: false
clearPureImport: false,
cleanVueFileName: false
})

expect(transformCode(options('import type { TestBase } from "@/src/test";')).content).toEqual(
Expand Down Expand Up @@ -145,7 +147,8 @@ describe('transform tests', () => {
aliases: [],
aliasesExclude: [],
staticImport: false,
clearPureImport: true
clearPureImport: true,
cleanVueFileName: false
})

expect(transformCode(options('import "@/themes/common.scss";')).content).toEqual('')
Expand All @@ -158,6 +161,37 @@ describe('transform tests', () => {
).toEqual("{ 'database-import': import('vue').FunctionalComponent }")
})

it('test: transformCode (clean .vue)', () => {
const options = (content: string) => ({
content,
filePath: '',
aliases: [],
aliasesExclude: [],
staticImport: false,
clearPureImport: false,
cleanVueFileName: true
})

expect(transformCode(options('import { App } from "./App.vue";')).content).toEqual(
"import { App } from './App';\n"
)
console.log(
transformCode(options('import { App } "./App.vue";\nimport { foo } from "./foo.vue";'))
.content
)
expect(
transformCode(options('import { App } "./App.vue";\nimport { foo } from "./foo.vue";'))
.content
).toEqual("import { App } from './App';\nimport { foo } from './foo';\n")
expect(transformCode(options("export * from './abc.vue'")).content).toEqual(
"export * from './abc'"
)
expect(
transformCode(options("const foo: import('./foo.vue').Foo<import('./baz.vue').Baz[]>"))
.content
).toEqual("const foo: import('./foo').Foo<import('./baz').Baz[]>")
})

it('test: hasExportDefault', () => {
expect(hasExportDefault("export { sdk as default } from './sdk'")).toBe(true)
expect(hasExportDefault("export { foo, sdk as default } from './sdk'")).toBe(true)
Expand Down

0 comments on commit 0a3ad73

Please sign in to comment.