@ayaseaki/swc-plugin-monorepo-relative-path-resolve
v0.1.4
Published
Resolve relative paths from source code of sub-packages in a monorepo.
Readme
@ayaseaki/swc-plugin-monorepo-relative-path-resolve
A SWC plugin to handle resolving relative import paths like @/* and @common/* of sub-packages in a monorepo.
Note: if you are building a new monorepo with path alias requirements, it is recommended to use Node.js Subpath Imports instead of this plugin.
Why
For monorepo scene, we often have the need to directly import the source code of sub-packages to get a better bundle speed.
However, when a sub-package in a monorepo has its own path alias defined in its tsconfig.json, the bundle of base app may not respect the alias config, which results in a failure of resolution:
// sub-package/src/index.ts
import { foo } from '@/common/constants';
export { foo };
// sub-package/src/common/constants.ts
export const foo = 'foo';// base/index.ts
import { foo } from 'sub-package';
console.log(foo);
// while compiling base/index.ts `Can't resolve @/common/constants` will be thrownThis plugin aims to resolve a subset of this issue: if your alias is just a relative of src path, you can use this swc plugin to dynamically replace the import alias during compile-time.
Usage
pnpm i -D @ayaseaki/swc-plugin-monorepo-relative-path-resolveThis plugin can handle the import source matching {prefix}{subpath}?/. For example:
@/*@common/*~common/*
Usage with rspack:
// in rspack.config.js (ts):
{
test: /\.(jsx?|tsx?)$/,
use: [
{
loader: "builtin:swc-loader",
options: {
jsc: {
// ...
// add the following config:
experimental: {
plugins: [
[
"@ayaseaki/swc-plugin-monorepo-relative-path-resolve",
{
prefix: "@",
allowedPathnames: ["common"],
},
],
],
},
},
},
},
],
},See example for detail.
Configration
prefix
- type:
string - description: specify the import prefix of your code.
- default:
@
allowedPathnames
- type:
string[] - description: specify the allowed pathnames after prefix, for example if you have a relative path
@common/and@components/, then you setallowedPathnamesto['common', 'components'.] - default:
[]
