require "execjs"
module JadePug
class ShippedCompiler < Compiler
def initialize(engine, version)
super
@execjs = compile_compiler_source(read_compiler_source(path_to_compiler_source))
end
def compile(source, options = {})
source = prepare_source(source)
options = prepare_options(options)
snippet = compilation_snippet \
method: "compile#{ "Client" if options[:client] }",
arguments: [source, options],
locals: options.fetch(:locals, {}),
options: options
result = @execjs.eval(snippet)
process_result(source, result, options)
rescue ExecJS::ProgramError => e
raise engine::CompilationError, e.message
end
protected
def path_to_compiler_source
File.expand_path("../../../vendor/#{ engine.name.downcase }-#{ version }.min.js", __FILE__)
end
def read_compiler_source(path)
unless File.readable?(path)
raise engine::CompilerError, "Couldn't read compiler source: #{ path }"
end
File.read(path)
end
def compile_compiler_source(source)
ExecJS.compile(source).tap do |compiler|
raise engine::CompilerError, "Failed to compile #{ engine.name } compiler" unless compiler
end
end
def npm_package_require_snippet
engine.name.downcase
end
end
end