code: def digest(self):
      if not os.path.exists(self.deps_folder):
          try:
              os.makedirs(self.deps_folder)
          except OSError:
              logger.exception(
                  "🚨 having issues manipulating %s", self.deps_folder
              )
              sys.exit(1)
  
      payload = {self.name: self.version}
  
      for folder in (self.deps_folder, self.build_folder):
          copies = tuple(
              _
              for _ in os.listdir(folder)
              if os.path.splitext(_)[-1] in {".js", ".map"}
          )
          logger.info("bundles in %s %s", folder, copies)
  
          for copy in copies:
              payload[f"MD5 ({copy})"] = compute_md5(
                  self._concat(folder, copy)
              )
  
      with open(
          self._concat(self.main, "digest.json"), "w", encoding="utf-8"
      ) as fp:
          json.dump(
              payload,
              fp,
              sort_keys=True,
              indent=4,
              separators=(",", ":"),
          )
      logger.info(
          "bundle digest in digest.json:\n%s",
          json.dumps(payload, sort_keys=True, indent=4),
      )
  
imports: import os
  import sys
  import json
  import string
  import shutil
  import logging
  import coloredlogs
  import fire
  import requests
  from .._utils import run_command_with_process, compute_md5, job
label_desc: Use image node_id 9 for calling the BuildProcess obj's underlying member method code with example usage: obj.digest() without return types