code: def build_js() -> None:
      print("\nBuilding BokehJS... ", end="")
      try:
          t0 = time.time()
          proc = subprocess.run(
              ["node", "make", "build"],
              capture_output=True,
              cwd="bokehjs",
          )
          t1 = time.time()
      except OSError as e:
          die(BUILD_EXEC_FAIL_MSG.format(exc=e))
  
      if proc.returncode != 0:
          out = indent(
              proc.stdout.decode("ascii", errors="ignore"), "    "
          )
          err = indent(
              proc.stderr.decode("ascii", errors="ignore"), "    "
          )
          die(BUILD_FAIL_MSG.format(stdout=red(out), stderr=red(err)))
  
      out = proc.stdout.decode("ascii", errors="ignore")
      pat = re.compile(r"(\[.*\]) (.*)", re.DOTALL)
      msg = []
      for line in out.strip().split("\n"):
          if m := pat.match(line):
              stamp, txt = m.groups()
              msg.append(f"   {dim(green(stamp))} {dim(txt)}")
      print(BUILD_SUCCESS_MSG.format(msg="\n".join(msg)))
      print(
          f"\n Build time: {bright(yellow(f'{t1-t0:0.1f} seconds'))}\n"
      )
  
      print("Build artifact sizes:")
      try:
          for fn in JS_FILES:
              size = (BUILD_JS / fn).stat().st_size / 2**10
              print(f"  - {fn:<20} : {size:6.1f} KB")
      except FileNotFoundError as e:
          die(BUILD_SIZE_FAIL_MSG.format(exc=e))
  
imports: from __future__ import annotations
  import os, re, subprocess, sys, time
  from itertools import product
  from pathlib import Path
  from shutil import copy, copytree, rmtree
  from textwrap import indent
  from typing import NoReturn
  from setuptools import setup
  from setuptools.command.build import build
  from setuptools.command.editable_wheel import editable_wheel
  from setuptools.command.sdist import sdist
label_desc: Use image node_id 1 for calling a global function with example usage: build_js() without return types