From 7b983445a8b5ffb6156fb32a8a03b7ac3b0f54d0 Mon Sep 17 00:00:00 2001 From: Kalven Schraut <30308012+kalvenschraut@users.noreply.github.com> Date: Wed, 16 Mar 2022 17:39:38 -0500 Subject: [PATCH] fix(vite-node): normalize relative paths to be from current working directory (#952) --- packages/vite-node/src/client.ts | 1 + packages/vite-node/src/server.ts | 3 +++ test/core/src/relative-import.ts | 3 +++ test/core/test/imports.test.ts | 8 ++++++++ 4 files changed, 15 insertions(+) create mode 100644 test/core/src/relative-import.ts diff --git a/packages/vite-node/src/client.ts b/packages/vite-node/src/client.ts index 0949e062d..f0d845b53 100644 --- a/packages/vite-node/src/client.ts +++ b/packages/vite-node/src/client.ts @@ -59,6 +59,7 @@ export class ViteNodeRunner { const resolvedDep = await this.options.resolveId(dep, id) dep = resolvedDep?.id?.replace(this.root, '') || dep } + if (callstack.includes(dep)) { if (!this.moduleCache.get(dep)?.exports) throw new Error(`[vite-node] Circular dependency detected\nStack:\n${[...callstack, dep].reverse().map(p => `- ${p}`).join('\n')}`) diff --git a/packages/vite-node/src/server.ts b/packages/vite-node/src/server.ts index 667ddc881..a4b9d917d 100644 --- a/packages/vite-node/src/server.ts +++ b/packages/vite-node/src/server.ts @@ -1,3 +1,4 @@ +import { join } from 'pathe' import type { TransformResult, ViteDevServer } from 'vite' import type { FetchResult, RawSourceMap, ViteNodeResolveId, ViteNodeServerOptions } from './types' import { shouldExternalize } from './externalize' @@ -24,6 +25,8 @@ export class ViteNodeServer { } async resolveId(id: string, importer?: string): Promise { + if (importer && !importer.startsWith(this.server.config.root)) + importer = join(this.server.config.root, importer) return this.server.pluginContainer.resolveId(id, importer, { ssr: true }) } diff --git a/test/core/src/relative-import.ts b/test/core/src/relative-import.ts new file mode 100644 index 000000000..53c7740d3 --- /dev/null +++ b/test/core/src/relative-import.ts @@ -0,0 +1,3 @@ +export function dynamicRelativeImport(file: string) { + return import(`./${file}.ts`) +} diff --git a/test/core/test/imports.test.ts b/test/core/test/imports.test.ts index c2aa7b3cb..51137f509 100644 --- a/test/core/test/imports.test.ts +++ b/test/core/test/imports.test.ts @@ -1,4 +1,5 @@ import { expect, test } from 'vitest' +import { dynamicRelativeImport } from '../src/relative-import' test('dynamic relative import works', async() => { const stringTimeoutMod = await import('./../src/timeout') @@ -9,6 +10,13 @@ test('dynamic relative import works', async() => { expect(stringTimeoutMod).toBe(variableTimeoutMod) }) +test('Relative imports in imported modules work', async() => { + const relativeImportFromFile = await dynamicRelativeImport('timeout') + const directImport = await import('./../src/timeout') + + expect(relativeImportFromFile).toBe(directImport) +}) + test('dynamic aliased import works', async() => { const stringTimeoutMod = await import('./../src/timeout') -- 2.51.2