code: def run(self):
      if skip_npm:
          log.info("Skipping npm-installation")
          return
  
      has_npm = self.has_npm()
      if not has_npm:
          log.error(
              "`npm` unavailable.  If you're running this command using sudo, make sure `npm` is available to sudo"
          )
  
      env = os.environ.copy()
      env["PATH"] = npm_path
  
      if self.should_run_npm_install():
          log.info(
              "Installing build dependencies with npm.  This may take a while..."
          )
          npmName = self.get_npm_name()
          check_call(
              [npmName, "install"],
              cwd=node_root,
              stdout=sys.stdout,
              stderr=sys.stderr,
          )
          check_call(
              [npmName, "run", "build:prod"],
              cwd=node_root,
              stdout=sys.stdout,
              stderr=sys.stderr,
          )
          os.utime(self.node_modules, None)
  
      for t in self.targets:
          if not os.path.exists(t):
              msg = "Missing file: %s" % t
              if not has_npm:
                  msg += "\nnpm is required to build a development version of jupyterlab-plotly"
              raise ValueError(msg)
  
      # update package data in case this created new files
      update_package_data(self.distribution)
  
imports: import os
  import sys
  import platform
  import json
  from setuptools import setup, Command
  from setuptools.command.egg_info import egg_info
  from subprocess import check_call
  from distutils import log
  import versioneer
label_desc: Use image node_id 6 for calling the NPM obj's underlying member method code with example usage: obj.run() without return types