Class: Opal::CliRunners::Compiler
- Inherits:
-
Object
- Object
- Opal::CliRunners::Compiler
- Defined in:
- opal/lib/opal/cli_runners/compiler.rb
Overview
The compiler runner will just output the compiled JavaScript
Class Method Summary collapse
Instance Method Summary collapse
- #compile ⇒ Object
- #compile_noraise ⇒ Object
- #fail_no_listen! ⇒ Object
- #fail_unrewindable! ⇒ Object
- #files_to_directories ⇒ Object
-
#initialize(data) ⇒ Compiler
constructor
A new instance of Compiler.
- #on_code_change(modified) ⇒ Object
- #reexec ⇒ Object
- #rewind_output ⇒ Object
- #start ⇒ Object
- #watch_compile ⇒ Object
- #watch_files ⇒ Object
Constructor Details
#initialize(data) ⇒ Compiler
Returns a new instance of Compiler.
11 12 13 14 15 16 17 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 11 def initialize(data) @options = data[:options] || {} @builder_factory = data.fetch(:builder) @map_file = @options[:map_file] @output = data.fetch(:output) @watch = @options[:watch] end |
Class Method Details
.call(data) ⇒ Object
7 8 9 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 7 def self.call(data) new(data).start end |
Instance Method Details
#compile ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 19 def compile builder = @builder_factory.call compiled_source = builder.to_s compiled_source += "\n" + builder.source_map.to_data_uri_comment unless @options[:no_source_map] rewind_output if @watch @output.puts compiled_source @output.flush File.write(@map_file, builder.source_map.to_json) if @map_file builder end |
#compile_noraise ⇒ Object
34 35 36 37 38 39 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 34 def compile_noraise compile rescue StandardError, Opal::SyntaxError => e $stderr.puts "* Compilation failed: #{e.}" nil end |
#fail_no_listen! ⇒ Object
61 62 63 64 65 66 67 68 69 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 61 def fail_no_listen! abort <<~ERROR --watch mode requires the `listen` gem present. Please try to run: gem install listen Or if you are using bundler, add listen to your Gemfile. ERROR end |
#fail_unrewindable! ⇒ Object
54 55 56 57 58 59 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 54 def fail_unrewindable! abort <<~ERROR You have specified --watch, but for watch to work, you must specify an --output file. ERROR end |
#files_to_directories ⇒ Object
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 118 def files_to_directories directories = @files.map { |file| File.dirname(file) }.uniq previous_dir = nil # Only get the topmost directories directories = directories.sort.map do |dir| if previous_dir && dir.start_with?(previous_dir + '/') nil else previous_dir = dir end end directories.compact end |
#on_code_change(modified) ⇒ Object
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 98 def on_code_change(modified) if !(modified & @opal_deps).empty? $stderr.puts "* Modified core Opal files: #{modified.join(', ')}; reexecuting" reexec elsif !modified.all? { |file| @directories.any? { |dir| file.start_with?(dir + '/') } } $stderr.puts "* New unwatched files: #{modified.join(', ')}; reexecuting" reexec end $stderr.puts "* Modified code: #{modified.join(', ')}; rebuilding" builder = compile_noraise # Ignore the bad compilation if builder code_deps = builder.dependent_files @files = @opal_deps + code_deps end end |
#reexec ⇒ Object
94 95 96 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 94 def reexec Process.kill('USR2', Process.pid) end |
#rewind_output ⇒ Object
41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 41 def rewind_output if !@output.is_a?(File) || @output.tty? fail_unrewindable! else begin @output.rewind @output.truncate(0) rescue Errno::ESPIPE fail_unrewindable! end end end |
#start ⇒ Object
143 144 145 146 147 148 149 150 151 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 143 def start if @watch watch_compile else compile end 0 end |
#watch_compile ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 71 def watch_compile begin require 'listen' rescue LoadError fail_no_listen! end @opal_deps = Opal.dependent_files builder = compile code_deps = builder.dependent_files @files = @opal_deps + code_deps @code_listener = watch_files @code_listener.start $stderr.puts "* Opal v#{Opal::VERSION} successfully compiled your program in --watch mode" sleep rescue Interrupt $stderr.puts '* Stopping watcher...' @code_listener.stop end |
#watch_files ⇒ Object
134 135 136 137 138 139 140 141 |
# File 'opal/lib/opal/cli_runners/compiler.rb', line 134 def watch_files @directories = files_to_directories Listen.to(*@directories, ignore!: []) do |modified, added, removed| our_modified = @files & (modified + added + removed) on_code_change(our_modified) unless our_modified.empty? end end |