class JadePug::SystemCompiler

Abstraction layer for system engine compiler.

Public Class Methods

new(engine) click to toggle source

@param engine [Jade, Pug]

Calls superclass method JadePug::Compiler::new
# File lib/jade-pug/system-compiler.rb, line 14
def initialize(engine)
  super(engine, nil)

  check_node_runtime!
  check_npm_package!

  engine.echo "Resolved system #{ engine.name } to #{ version }."
end

Public Instance Methods

compile(source, options = {}) click to toggle source

Compiles the template.

@param source [String, read] @param options [hash] @return [String]

# File lib/jade-pug/system-compiler.rb, line 29
def compile(source, options = {})
  source  = prepare_source(source)
  options = prepare_options(options)
  command = ["node", "--eval"]
  command.push compilation_snippet \
    method:    "compile#{ "Client" if options[:client] }",
    arguments: [source, options],
    locals:    options.fetch(:locals, {}),
    options:   options
  stdout, stderr, exit_status = Open3.capture3(*command)
  raise engine::CompilationError, stderr unless exit_status.success?
  process_result(source, stdout, options)
end
version() click to toggle source

Returns version of engine installed system-wide.

@return [String]

# File lib/jade-pug/system-compiler.rb, line 47
def version
  stdout, exit_status = Open3.capture2 "node", "--eval", \
    "console.log(require(#{ JSON.dump(File.join(npm_package_path, "package.json")) }).version)"

  if exit_status.success?
    stdout.strip
  else
    raise engine::CompilerError, \
      %{Failed to get #{ engine.name } version. Perhaps, the problem with Node.js runtime.}
  end
end

Protected Instance Methods

check_node_runtime!() click to toggle source

Checks if Node.js runtime exists in $PATH and is accessible.

@raise {JadePug::CompilerError}

If Node.js runtime doesn't exist in system.

@return [nil]

# File lib/jade-pug/system-compiler.rb, line 108
def check_node_runtime!
  stdout, exit_status = Open3.capture2("node", "--version")

  if exit_status.success?
    @node_version = stdout.strip.gsub(/\Av/, "")
    engine.echo "Using Node.js runtime #{ @node_version }."
  else
    raise engine::CompilerError, %{No Node.js runtime has been found in your system.}
  end
  nil
end
check_npm_package!() click to toggle source

Checks if engine NPM package is installed.

@raise {JadePug::CompilerError}

If engine NPM package is not installed.

@return [nil]

# File lib/jade-pug/system-compiler.rb, line 127
def check_npm_package!
  exit_status = Open3.capture2("node", "--eval", npm_package_require_snippet)[1]

  unless exit_status.success?
    raise engine::CompilerError, \
      %{No #{ engine.name } NPM package has been found in your system. } +
      %{Have you forgotten to "npm install --global #{ npm_package_name }"?}
  end
  nil
end
npm_package_name() click to toggle source

Return the name of engine NPM package.

@return [String]

# File lib/jade-pug/system-compiler.rb, line 66
def npm_package_name
  engine.name.downcase
end
npm_package_path() click to toggle source

Returns the path of globally installed engine NPM package.

@return [String]

# File lib/jade-pug/system-compiler.rb, line 74
def npm_package_path
  File.join(npm_packages_root, engine.name.downcase)
end
npm_package_require_snippet() click to toggle source

Returns the JavaScript code used to require engine NPM package.

@return [String]

# File lib/jade-pug/system-compiler.rb, line 82
def npm_package_require_snippet
  "require(#{ JSON.dump(npm_package_path) })"
end
npm_packages_root() click to toggle source

Returns the root directory of globally installed NPM packages.

@return [String]

# File lib/jade-pug/system-compiler.rb, line 90
def npm_packages_root
  stdout, exit_status = Open3.capture2("npm", "root", "--global")

  if exit_status.success?
    stdout.strip
  else
    raise engine::CompilerError, \
      %{Unable to get NPM packages root. Perhaps, the problem with Node.js runtime.}
  end
end