Mark Solinski
Mark Solinski

Reputation: 31

Determine if Javascript (NodeJS) code is running in a REPL

I wish to create one NodeJS source file in a Jupyter notebook which is using the IJavascript kernel so that I can quickly debug my code. Once I have it working, I can then use the "Download As..." feature of Jupyter to save the notebook as a NodeJS script file.

I'd like to have the ability to selectively ignore / include code in the notebook source that will not execute when I run the generated NodeJS script file.

I have solved this problem for doing a similar thing for Python Jupyter notebooks because I can determine if the code is running in an interactive session (IPython [REPL]). I accomplished this by using this function in Python:

def is_interactive():
    import __main__ as main
    return not hasattr(main, '__file__')

(Thanks to Tell if Python is in interactive mode)

Is there a way to do a similar thing for NodeJS?

Upvotes: 0

Views: 617

Answers (3)

djanowski
djanowski

Reputation: 5858

This may not help the OP in all cases, but could help others googling for this question. Sometimes it's enough to know if the script is running interactively or not (REPL and any program that is run from a shell).

In that case, you can check for whether standard output is a TTY:

process.stdout.isTTY

Upvotes: 1

Ruby A. Rose
Ruby A. Rose

Reputation: 183

The fastest and most reliable route would just be to query the process arguments. From the NodeJS executable alone, there are two ways to launch the REPL. Either you do something like this without any script following the call to node.

node --experimental-modules ...

Or you force node into the REPL using interactive mode.

node -i ...

The option ending parameter added in v6.11.0 -- will never append arguments into the process.argv array unless it's executing in script mode; via FILE, -p, or -e. Any arguments meant for NodeJS will be filtered into the accompanying process.execArgv variable, so the only thing left in the process.argv array should be process.execPath. Under these circumstances, we can reduce the query to the solution below.

const isREPL = process.execArgv.includes("-i") || process.argv.length === 1;

console.log(isREPL ? "You're in the REPL" : "You're running a script m8");

This isn't the most robust method since any user can otherwise instantiate a REPL from an intiator script which your code could be ran by. For that I'm pretty sure you could use an artificial error to crawl the traceback and look for a REPL entry. Although I haven't the time to implement and ensure that solution at this time.

Upvotes: 1

rbfmh
rbfmh

Reputation: 11

I don't know if this is the correct way but couldn't find anything else basically if you

try {
   const repl = __dirname
} catch (err) {
  //code run if repl
}

it feels a little hacky but works ¯\_(ツ)_/¯

Upvotes: 1

Related Questions