Description
Due to the below if
condition, introduced in #694, if options
are passed to register
programmatically (e.g. register({ ...customOptions })
), they will be ignored in favor of either the results from readDefaultTsConfig
or options gathered directly by swc
from a nearby .swcrc
file when process.env.SWCRC = 'true'
.
swc-node/packages/register/register.ts
Lines 108 to 110 in ba8f60d
In cases where SWCRC
is not true
(unset, etc.), the configuration returned from readDefaultTsConfig
is taken even if options
are passed to register
, meaning the passed options
are altogether ignored.
I believe in this specific circumstance, the intuition would be for options
passed to register
to be used && !process.env.SWCRC
.
Unless I am totally off-base here, I think the body of the if
can be changed to (or something similar):
if (!process.env.SWCRC) {
options = Object.keys(options).length ? options : readDefaultTsConfig()
}
Where when process.env.SWCRC
is falsy, we prefer any programmatically specified options before trying to read a tsconfig.json
file. With this, I think the scenario above should be accounted for appropriately, while also not breaking what was fixed in #694.
For anyone running into this currently, using patch-package
with the below diff, I was able to quickly fix this for 1.6.6
diff --git a/node_modules/@swc-node/register/lib/register.js b/node_modules/@swc-node/register/lib/register.js
index 7d4cfd8..1a8eab1 100644
--- a/node_modules/@swc-node/register/lib/register.js
+++ b/node_modules/@swc-node/register/lib/register.js
@@ -88,7 +88,7 @@ function compile(sourcecode, filename, options, async = false) {
exports.compile = compile;
function register(options = {}, hookOpts = {}) {
if (!process.env.SWCRC) {
- options = (0, read_default_tsconfig_1.readDefaultTsConfig)();
+ options = Object.keys(options).length ? options : (0, read_default_tsconfig_1.readDefaultTsConfig)();
}
options.module = ts.ModuleKind.CommonJS;
(0, sourcemap_support_1.installSourceMapSupport)();