Skip to content

Programmatic options passed to register are always ignored. #716

Closed
@eliellis

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

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions