From 2fada74ad363655890695716f762f89276800a46 Mon Sep 17 00:00:00 2001 From: Hiroki Osame Date: Thu, 1 Aug 2024 18:44:24 +0900 Subject: [PATCH] fix(resolver): directory import nested ".." --- .../module-resolve-filename/resolve-implicit-extensions.ts | 2 +- src/esm/hook/resolve.ts | 2 +- tests/fixtures.ts | 5 ++++- tests/specs/smoke.ts | 1 + 4 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/cjs/api/module-resolve-filename/resolve-implicit-extensions.ts b/src/cjs/api/module-resolve-filename/resolve-implicit-extensions.ts index 8b9b20fd..48cd7540 100644 --- a/src/cjs/api/module-resolve-filename/resolve-implicit-extensions.ts +++ b/src/cjs/api/module-resolve-filename/resolve-implicit-extensions.ts @@ -15,7 +15,7 @@ export const createImplicitResolver = ( ): SimpleResolve => ( request, ) => { - if (request === '.' || request === '..') { + if (request === '.' || request === '..' || request.endsWith('/..')) { request += '/'; } diff --git a/src/esm/hook/resolve.ts b/src/esm/hook/resolve.ts index 67ef263a..0702ea8e 100644 --- a/src/esm/hook/resolve.ts +++ b/src/esm/hook/resolve.ts @@ -141,7 +141,7 @@ const resolveDirectory: ResolveHook = async ( context, nextResolve, ) => { - if (specifier === '.' || specifier === '..') { + if (specifier === '.' || specifier === '..' || specifier.endsWith('/..')) { specifier += '/'; } diff --git a/tests/fixtures.ts b/tests/fixtures.ts index f76f413f..cb048267 100644 --- a/tests/fixtures.ts +++ b/tests/fixtures.ts @@ -212,7 +212,10 @@ export const files = { `, 'period.in.name.ts': 'export { a } from "."', - 'dotdot/index.ts': 'export { a } from ".."', + dotdot: { + 'index.ts': 'export { a } from ".."', + 'dotdot/index.ts': 'export { a } from "../.."', + }, 'index.js': 'throw new Error("should not be loaded")', }, diff --git a/tests/specs/smoke.ts b/tests/specs/smoke.ts index 0bd1fd9d..4d437cfa 100644 --- a/tests/specs/smoke.ts +++ b/tests/specs/smoke.ts @@ -284,6 +284,7 @@ export default testSuite(async ({ describe }, { tsx, supports, version }: NodeAp import './ts/period.in.name'; import '@/ts/period.in.name'; import './ts/dotdot'; + import './ts/dotdot/dotdot'; // .jsx import * as jsx from './jsx/index.jsx';