Class: JsxRosetta::NodeBridge

Inherits:
Object
  • Object
show all
Defined in:
lib/jsx_rosetta/node_bridge.rb

Overview

Spawns the Node sidecar (‘node/parse.js`) as a one-shot subprocess per parse request. A long-lived worker is a future optimization.

Defined Under Namespace

Classes: MissingDependencies, MissingNode

Constant Summary collapse

SIDECAR_DIR =
File.expand_path("../../node", __dir__)
SIDECAR_SCRIPT =
File.join(SIDECAR_DIR, "parse.js")
NODE_MODULES_DIR =
File.join(SIDECAR_DIR, "node_modules")

Instance Method Summary collapse

Instance Method Details

#parse(source, typescript: false, source_filename: nil) ⇒ Object



17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/jsx_rosetta/node_bridge.rb', line 17

def parse(source, typescript: false, source_filename: nil)
  ensure_dependencies_installed!

  request = JSON.generate(
    source: source,
    typescript: typescript,
    source_filename: source_filename
  )
  stdout, stderr, status = Open3.capture3(node_executable, SIDECAR_SCRIPT, stdin_data: request)

  raise Error, "jsx_rosetta sidecar exited with status #{status.exitstatus}: #{stderr.strip}" unless status.success?

  JSON.parse(stdout)
rescue Errno::ENOENT
  raise MissingNode, missing_node_message
end