diff --git a/src/analyze.ts b/src/analyze.ts index bb78456..980692c 100644 --- a/src/analyze.ts +++ b/src/analyze.ts @@ -154,8 +154,21 @@ export async function resolveModuleExportNames (id: string, opts?: ResolveOption const url = await resolvePath(id, opts) const code = await loadURL(url) const exports = findExports(code) - // TODO: Support recursive for start exports - return exports.flatMap(exp => exp.names).filter(Boolean) + + // Explicit named exports + const exportNames = new Set(exports.flatMap(exp => exp.names).filter(Boolean)) + + // Recursive * exports + for (const exp of exports) { + if (exp.type === 'star') { + const subExports = await resolveModuleExportNames(exp.specifier, { ...opts, url }) + for (const subExport of subExports) { + exportNames.add(subExport) + } + } + } + + return Array.from(exportNames) } // --- Internal --- diff --git a/test/exports.test.ts b/test/exports.test.ts index c3750d2..ef1a864 100644 --- a/test/exports.test.ts +++ b/test/exports.test.ts @@ -1,3 +1,4 @@ +import { join } from 'path' import { describe, it, expect } from 'vitest' import { ESMExport, findExports, findExportNames, resolveModuleExportNames } from '../src' @@ -136,7 +137,7 @@ describe('fineExportNames', () => { }) describe('resolveModuleExportNames', () => { - it('resolveModuleExportNames', async () => { + it('direct exports', async () => { expect(await resolveModuleExportNames('pathe')).toMatchInlineSnapshot(` [ "basename", @@ -156,4 +157,27 @@ describe('resolveModuleExportNames', () => { ] `) }) + + it('star exports', async () => { + expect(await resolveModuleExportNames(new URL('./fixture/exports.mjs', import.meta.url).toString())).toMatchInlineSnapshot(` + [ + "foo", + "_resolve", + "basename", + "delimiter", + "dirname", + "extname", + "format", + "isAbsolute", + "join", + "normalize", + "normalizeString", + "parse", + "relative", + "resolve", + "sep", + "toNamespacedPath", + ] + `) + }) }) diff --git a/test/fixture/exports.mjs b/test/fixture/exports.mjs new file mode 100644 index 0000000..6477063 --- /dev/null +++ b/test/fixture/exports.mjs @@ -0,0 +1,5 @@ +export * from 'pathe' + +export { resolve as _resolve } from 'pathe' + +export const foo = 'bar'