Skip to content

fix: resolve tsconfig paths correctly when baseUrl is absent / baseUrl未指定時のtsconfig pathsの解決を修正 - #198

Open
kota-shidara wants to merge 1 commit into
knowledge-work:mainfrom
kota-shidara:fix/resolve-paths-without-baseurl
Open

fix: resolve tsconfig paths correctly when baseUrl is absent / baseUrl未指定時のtsconfig pathsの解決を修正#198
kota-shidara wants to merge 1 commit into
knowledge-work:mainfrom
kota-shidara:fix/resolve-paths-without-baseurl

Conversation

@kota-shidara

@kota-shidara kota-shidara commented Aug 5, 2026

Copy link
Copy Markdown

TypeScript 7以降に対応するための提案になります。よろしくお願いします!

背景

  • tsconfigにおいて、TypeScript 6.0 で baseUrl が非推奨化され、TypeScript 7.0 では完全に廃止されるため、pathsbaseUrl なしで書く必要があります。
  • resolveImportPath.js の現状の実装では、解決後のエイリアスに ./ が残ります。例: @/domains/foo./src/domains/foo
  • .eslintrcmodule 設定では ./ 無しで書くため、./ で解決されたものとマッチせず、該当エイリアスを使うimportに対してルールが機能しなくなっていました。

具体的な再現例:

// tsconfig.json
{
  "compilerOptions": {
    "paths": { "@/*": ["./src/*"] }
  }
}
// .eslintrc: src/domains/payment 配下からしかimportを許可しない設定
"strict-dependencies/strict-dependencies": ["error",
  [{ "module": "src/domains/payment", "allowReferenceFrom": ["src/domains/payment"] }]
]
// 本来は違反として検出されるべきimport
// src/pages/checkout.tsx
import { chargeCard } from '@/domains/payment/chargeCard'

paths の値に付いた ./ のせいで、このimportは ./src/domains/payment/chargeCard と解決されます。
moduleisMatchstartsWith で判定しますが、"./src/...""src/domains/payment" で始まらないため false となり、違反として報告されませんでした。

対応

  • baseUrl 未指定時のデフォルトを "." とし、値が必ず path.join を通るようにしました。
path.join('.', './src/*')  // → 'src/*'   ./ が正規化され、module 設定とマッチするようになる
path.join('.', 'src/*')    // → 'src/*'   ./ を持たない既存の値は変化しない

./ は path.join が落とすため、解決結果が module 設定と同じ形式に揃います。./ のない既存の設定は結果が変わりません。

テスト

baseUrl なしで paths の値に ./ が付くケースを追加しました。

相談

コメントとして相談を記載しております!ご確認よろしくお願いします。
#198 (comment)

TypeScript 7 removes baseUrl, so `paths` values become relative to
tsconfig.json's directory instead (e.g. `"src/*": ["./src/*"]`).
Previously the alias was used as-is in that case, leaving a leading
`./` that broke matching against eslintrc module patterns. Now baseUrl
defaults to "." and is always passed through path.join.
Comment on lines 35 to 39
describe('should resolve tsconfig paths', () => {
[
['@/components/', 'components/', 'components/aaa/bbb'],
['@/components', 'components', 'components/aaa/bbb'],
['@/components/*', 'components/*', 'components/aaa/bbb'],

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[相談]
このテストに関して、消すべきかを迷いました。存在しても害ではないのですが、TypeScriptの仕様としてありえないものとなっているため、削除したほうがテストケースとしてはよさそうに思います。

pathに関するドキュメントで、baseUrlが存在しない場合は、tsconfigを起点とする相対pathを指すと書かれています。
また、baseUrlが存在しない状態で、このテストのように相対pathではない形で書くと、error TS5090: Non-relative paths are not allowed when 'baseUrl' is not set. Did you forget a leading './'?のエラーが発生します。

よってこのテストの状態は現実的に起こり得ないと思っており、削除した方がよいのではないかと考えています。

このPRの中で行うのでもよいですし、別の方が良ければ(既存のテストが全て壊れていない安心感等もあったりすると思うので)、このままにしておこうと思います。

@kota-shidara
kota-shidara marked this pull request as ready for review August 5, 2026 06:07
@yoshiko-pg
yoshiko-pg requested a review from otofu-square August 6, 2026 00:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant