Skip to content

Programmatic options passed to register are always ignored. #716

Description

@eliellis

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'.

if (!process.env.SWCRC) {
options = readDefaultTsConfig()
}

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 $iif$ they were given && !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)();

A more detailed and interactive reproduction can be seen here.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions