The moduleSuffixes feature of TypeScript is now being used for module resolution in ESBuild, but for a bundle this should be set once per whole bundle, and not locally per package.
React Native has Platform Specific Extensions, which is used by its Metro Bundler to allow JavaScript modules to be forked per platform. So for example a Button module could have a Button.ios.jsx implementation for iOS and a Button.android.jsx for Android. The right fork (for example ios) is selected per bundle, so you choose the current platform for your bundle globally.
In TypeScript this is now supported via the moduleSuffixes configuration. You can then set the moduleSuffixes in a shared package's tsconfig.json, and TypeScript will then type-check that package using the platform extensions in the order of the moduleSuffixes list. This is though not shared outside that package. The order is only used as one arbitrary way to test a set of resolutions. If you want to type check for multiple platforms you would have to have multiple configuration files with its own moduleSuffixes list and run TypeScript once per the platform you want to test.
The problem is that ESBuild is using the per package moduleSuffixes when resolving module paths for the bundle. The correct way would be to ignore moduleSuffixes for bundling, and rather let the user set the resolution order with the per bundle ESBuild resolveExtensions setting. For example resolveExtensions: [ ".ios.tsx", ".tsx", ".ios", ".ts", ".js", ".jsx" ],.
I'm not sure I can see a use for ESBuild to support moduleSuffixes at all, but at least it should be configurable as the usual way to set the resolution is once for all the code in your bundle.
The
moduleSuffixesfeature of TypeScript is now being used for module resolution in ESBuild, but for a bundle this should be set once per whole bundle, and not locally per package.React Native has Platform Specific Extensions, which is used by its Metro Bundler to allow JavaScript modules to be forked per platform. So for example a
Buttonmodule could have aButton.ios.jsximplementation for iOS and aButton.android.jsxfor Android. The right fork (for exampleios) is selected per bundle, so you choose the current platform for your bundle globally.In TypeScript this is now supported via the
moduleSuffixesconfiguration. You can then set themoduleSuffixesin a shared package'stsconfig.json, and TypeScript will then type-check that package using the platform extensions in the order of themoduleSuffixeslist. This is though not shared outside that package. The order is only used as one arbitrary way to test a set of resolutions. If you want to type check for multiple platforms you would have to have multiple configuration files with its ownmoduleSuffixeslist and run TypeScript once per the platform you want to test.The problem is that ESBuild is using the per package
moduleSuffixeswhen resolving module paths for the bundle. The correct way would be to ignoremoduleSuffixesfor bundling, and rather let the user set the resolution order with the per bundle ESBuildresolveExtensionssetting. For exampleresolveExtensions: [ ".ios.tsx", ".tsx", ".ios", ".ts", ".js", ".jsx" ],.I'm not sure I can see a use for ESBuild to support
moduleSuffixesat all, but at least it should be configurable as the usual way to set the resolution is once for all the code in your bundle.