opal 1.2.0 → 1.3.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.await.js +6 -0
  3. data/.eslintrc.js +34 -0
  4. data/.github/workflows/build.yml +8 -0
  5. data/.rubocop.yml +9 -0
  6. data/CHANGELOG.md +4 -0
  7. data/README.md +1 -1
  8. data/Rakefile +1 -0
  9. data/UNRELEASED.md +64 -38
  10. data/docs/async.md +109 -0
  11. data/docs/roda-sprockets.md +0 -2
  12. data/exe/opal +2 -0
  13. data/exe/opal-repl +2 -2
  14. data/lib/opal/builder.rb +5 -1
  15. data/lib/opal/builder_processors.rb +7 -2
  16. data/lib/opal/cache/file_cache.rb +119 -0
  17. data/lib/opal/cache.rb +71 -0
  18. data/lib/opal/cli.rb +35 -1
  19. data/lib/opal/cli_options.rb +21 -0
  20. data/lib/opal/cli_runners/chrome.rb +21 -14
  21. data/lib/opal/cli_runners/chrome_cdp_interface.js +30285 -0
  22. data/lib/opal/cli_runners/{chrome.js → chrome_cdp_interface.rb} +27 -6
  23. data/lib/opal/cli_runners/compiler.rb +2 -1
  24. data/lib/opal/cli_runners/gjs.rb +27 -0
  25. data/lib/opal/cli_runners/mini_racer.rb +36 -0
  26. data/lib/opal/cli_runners/source-map-support-browser.js +276 -91
  27. data/lib/opal/cli_runners/source-map-support-node.js +276 -91
  28. data/lib/opal/cli_runners/source-map-support.js +60 -18
  29. data/lib/opal/cli_runners.rb +2 -0
  30. data/lib/opal/compiler.rb +99 -10
  31. data/lib/opal/fragment.rb +77 -14
  32. data/lib/opal/nodes/args/extract_kwrestarg.rb +6 -4
  33. data/lib/opal/nodes/args/extract_restarg.rb +10 -12
  34. data/lib/opal/nodes/args.rb +28 -0
  35. data/lib/opal/nodes/base.rb +29 -5
  36. data/lib/opal/nodes/call.rb +123 -2
  37. data/lib/opal/nodes/case.rb +7 -1
  38. data/lib/opal/nodes/class.rb +12 -2
  39. data/lib/opal/nodes/def.rb +3 -23
  40. data/lib/opal/nodes/definitions.rb +21 -4
  41. data/lib/opal/nodes/helpers.rb +2 -2
  42. data/lib/opal/nodes/if.rb +39 -9
  43. data/lib/opal/nodes/iter.rb +15 -3
  44. data/lib/opal/nodes/lambda.rb +3 -1
  45. data/lib/opal/nodes/literal.rb +13 -7
  46. data/lib/opal/nodes/logic.rb +2 -2
  47. data/lib/opal/nodes/module.rb +12 -2
  48. data/lib/opal/nodes/rescue.rb +59 -34
  49. data/lib/opal/nodes/scope.rb +88 -6
  50. data/lib/opal/nodes/super.rb +52 -25
  51. data/lib/opal/nodes/top.rb +13 -7
  52. data/lib/opal/nodes/while.rb +7 -1
  53. data/lib/opal/parser/patch.rb +2 -1
  54. data/lib/opal/repl.rb +137 -49
  55. data/lib/opal/rewriters/binary_operator_assignment.rb +10 -10
  56. data/lib/opal/rewriters/block_to_iter.rb +3 -3
  57. data/lib/opal/rewriters/for_rewriter.rb +7 -7
  58. data/lib/opal/rewriters/js_reserved_words.rb +5 -3
  59. data/lib/opal/source_map/file.rb +7 -4
  60. data/lib/opal/source_map/map.rb +17 -3
  61. data/lib/opal/version.rb +1 -1
  62. data/opal/corelib/array.rb +2 -2
  63. data/opal/corelib/binding.rb +46 -0
  64. data/opal/corelib/boolean.rb +54 -4
  65. data/opal/corelib/class.rb +2 -0
  66. data/opal/corelib/constants.rb +2 -2
  67. data/opal/corelib/error.rb +98 -12
  68. data/opal/corelib/io.rb +250 -38
  69. data/opal/corelib/kernel/format.rb +5 -2
  70. data/opal/corelib/kernel.rb +44 -23
  71. data/opal/corelib/main.rb +5 -0
  72. data/opal/corelib/method.rb +1 -0
  73. data/opal/corelib/module.rb +28 -0
  74. data/opal/corelib/number.rb +12 -1
  75. data/opal/corelib/random/seedrandom.js.rb +2 -2
  76. data/opal/corelib/regexp.rb +47 -3
  77. data/opal/corelib/runtime.js +152 -12
  78. data/opal/corelib/string/encoding.rb +17 -17
  79. data/opal/corelib/string.rb +2 -0
  80. data/opal/corelib/struct.rb +10 -3
  81. data/opal/corelib/trace_point.rb +57 -0
  82. data/opal/opal/full.rb +2 -0
  83. data/package.json +3 -2
  84. data/spec/filters/bugs/array.rb +0 -1
  85. data/spec/filters/bugs/basicobject.rb +0 -1
  86. data/spec/filters/bugs/binding.rb +27 -0
  87. data/spec/filters/bugs/enumerator.rb +132 -0
  88. data/spec/filters/bugs/exception.rb +70 -93
  89. data/spec/filters/bugs/float.rb +0 -1
  90. data/spec/filters/bugs/kernel.rb +3 -9
  91. data/spec/filters/bugs/language.rb +15 -58
  92. data/spec/filters/bugs/main.rb +16 -0
  93. data/spec/filters/bugs/matrix.rb +39 -0
  94. data/spec/filters/bugs/method.rb +0 -2
  95. data/spec/filters/bugs/module.rb +36 -79
  96. data/spec/filters/bugs/proc.rb +0 -1
  97. data/spec/filters/bugs/regexp.rb +0 -16
  98. data/spec/filters/bugs/trace_point.rb +12 -0
  99. data/spec/filters/bugs/warnings.rb +0 -4
  100. data/spec/filters/unsupported/freeze.rb +2 -0
  101. data/spec/filters/unsupported/privacy.rb +4 -0
  102. data/spec/lib/compiler_spec.rb +7 -1
  103. data/spec/lib/repl_spec.rb +4 -2
  104. data/spec/lib/source_map/file_spec.rb +1 -1
  105. data/spec/mspec-opal/formatters.rb +18 -4
  106. data/spec/mspec-opal/runner.rb +2 -2
  107. data/spec/opal/core/boolean_spec.rb +44 -0
  108. data/spec/opal/core/hash_spec.rb +8 -0
  109. data/spec/opal/core/number/to_s_spec.rb +11 -0
  110. data/spec/opal/stdlib/json/ext_spec.rb +3 -3
  111. data/spec/opal/stdlib/logger/logger_spec.rb +10 -1
  112. data/spec/ruby_specs +18 -0
  113. data/stdlib/await.rb +83 -0
  114. data/stdlib/base64.rb +4 -4
  115. data/stdlib/bigdecimal/bignumber.js.rb +4 -2
  116. data/stdlib/bigdecimal.rb +1 -0
  117. data/stdlib/gjs/io.rb +33 -0
  118. data/stdlib/gjs/kernel.rb +5 -0
  119. data/stdlib/gjs.rb +2 -0
  120. data/stdlib/js.rb +4 -0
  121. data/stdlib/json.rb +3 -3
  122. data/stdlib/logger.rb +1 -1
  123. data/stdlib/nashorn/file.rb +2 -0
  124. data/stdlib/nodejs/env.rb +7 -0
  125. data/stdlib/nodejs/file.rb +6 -41
  126. data/stdlib/nodejs/io.rb +21 -5
  127. data/stdlib/nodejs/js-yaml-3-6-1.js +2 -2
  128. data/stdlib/opal/miniracer.rb +6 -0
  129. data/stdlib/opal/platform.rb +4 -0
  130. data/stdlib/opal/repl_js.rb +5 -0
  131. data/stdlib/opal/replutils.rb +271 -0
  132. data/stdlib/opal-parser.rb +24 -11
  133. data/stdlib/opal-platform.rb +8 -0
  134. data/stdlib/promise/v2.rb +16 -4
  135. data/stdlib/promise.rb +14 -0
  136. data/stdlib/stringio.rb +13 -110
  137. data/stdlib/thread.rb +29 -0
  138. data/tasks/building.rake +10 -4
  139. data/tasks/linting-parse-eslint-results.js +39 -0
  140. data/tasks/linting.rake +38 -28
  141. data/tasks/performance/asciidoctor_test.rb.erb +6 -0
  142. data/tasks/performance/optimization_status.rb +77 -0
  143. data/tasks/performance.rake +149 -0
  144. data/tasks/testing.rake +9 -1
  145. data/test/nodejs/test_await.rb +169 -0
  146. data/test/opal/promisev2/test_error.rb +9 -3
  147. data/test/opal/unsupported_and_bugs.rb +5 -0
  148. data/vendored-minitest/minitest/benchmark.rb +9 -7
  149. data/vendored-minitest/minitest/test.rb +14 -12
  150. data/vendored-minitest/minitest.rb +19 -16
  151. data/yarn.lock +686 -117
  152. metadata +60 -23
  153. data/.jshintrc +0 -41
  154. data/spec/filters/unsupported/refinements.rb +0 -8
  155. data/vendored-minitest/minitest/hell.rb +0 -11
  156. data/vendored-minitest/minitest/parallel.rb +0 -65
  157. data/vendored-minitest/minitest/pride.rb +0 -4
  158. data/vendored-minitest/minitest/pride_plugin.rb +0 -142
  159. data/vendored-minitest/minitest/unit.rb +0 -45
@@ -1,13 +1,20 @@
1
+ # frozen_string_literal: true
2
+
3
+ # This script I converted into Opal, so that I don't have to write
4
+ # buffer handling again. We have gets, Node has nothing close to it,
5
+ # even async.
6
+
7
+ require 'opal/platform'
8
+
9
+ %x{
1
10
  var CDP = require("chrome-remote-interface");
2
11
  var fs = require("fs");
3
12
 
4
- // NOTE: the code above doesn't work on Windows
5
- // and it doesn't support interactive stdin input (which is ok for our scenario)
6
- var dir = fs.readFileSync("/dev/stdin").toString();
13
+ var dir = #{ARGV[0]}
7
14
 
8
15
  var options = {
9
- host: process.env.CHROME_HOST || 'localhost',
10
- port: process.env.CHROME_PORT || 9222
16
+ host: #{ENV['CHROME_HOST'] || 'localhost'},
17
+ port: #{ENV['CHROME_PORT'] || 9222}
11
18
  };
12
19
 
13
20
  CDP(options, function(client) {
@@ -88,7 +95,20 @@ CDP(options, function(client) {
88
95
  console.log(stack);
89
96
 
90
97
  process.exit(1);
91
- })
98
+ });
99
+
100
+ Page.javascriptDialogOpening((dialog) => {
101
+ #{
102
+ if `dialog.type` == 'prompt'
103
+ message = gets&.chomp
104
+ if message
105
+ `Page.handleJavaScriptDialog({accept: true, promptText: #{message}})`
106
+ else
107
+ `Page.handleJavaScriptDialog({accept: false})`
108
+ end
109
+ end
110
+ }
111
+ });
92
112
 
93
113
  Page.loadEventFired(() => {
94
114
  Runtime.evaluate({ expression: "window.OPAL_EXIT_CODE" }).then(function(output) {
@@ -105,3 +125,4 @@ CDP(options, function(client) {
105
125
  Page.navigate({ url: "file://"+dir+"/index.html" })
106
126
  });
107
127
  });
128
+ }
@@ -9,7 +9,8 @@ Opal::CliRunners::Compiler = ->(data) {
9
9
  map_file = options[:map_file]
10
10
  output = data.fetch(:output)
11
11
 
12
- compiled_source = builder.to_s + "\n" + builder.source_map.to_data_uri_comment
12
+ compiled_source = builder.to_s
13
+ compiled_source += "\n" + builder.source_map.to_data_uri_comment unless options[:no_source_map]
13
14
  output.puts compiled_source
14
15
  File.write(map_file, builder.source_map.to_json) if map_file
15
16
 
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'opal/paths'
4
+ require 'opal/cli_runners/system_runner'
5
+ require 'shellwords'
6
+
7
+ module Opal
8
+ module CliRunners
9
+ # Gjs is GNOME's JavaScript runtime based on Mozilla SpiderMonkey
10
+ class Gjs
11
+ def self.call(data)
12
+ exe = ENV['GJS_PATH'] || 'gjs'
13
+
14
+ opts = Shellwords.shellwords(ENV['GJS_OPTS'] || '')
15
+
16
+ SystemRunner.call(data) do |tempfile|
17
+ [exe, *opts, tempfile.path, *data[:argv]]
18
+ end
19
+ rescue Errno::ENOENT
20
+ raise MissingGjs, 'Please install Gjs to be able to run Opal scripts.'
21
+ end
22
+
23
+ class MissingGjs < RunnerError
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mini_racer'
4
+ require 'opal/paths'
5
+
6
+ module Opal
7
+ module CliRunners
8
+ class MiniRacer
9
+ def self.call(data)
10
+ ::MiniRacer::Platform.set_flags! :harmony
11
+
12
+ builder = data.fetch(:builder)
13
+ output = data.fetch(:output)
14
+ # TODO: pass it
15
+ argv = data.fetch(:argv)
16
+
17
+ v8 = ::MiniRacer::Context.new
18
+ v8.attach('prompt', ->(_msg = '') { $stdin.gets&.chomp })
19
+ v8.attach('console.log', ->(i) { output.print(i); output.flush })
20
+ v8.attach('console.warn', ->(i) { $stderr.print(i); $stderr.flush })
21
+ v8.attach('crypto.randomBytes', method(:random_bytes).to_proc)
22
+ v8.attach('opalminiracer.exit', ->(status) { Kernel.exit(status) })
23
+ v8.attach('opalminiracer.argv', argv)
24
+
25
+ code = builder.to_s + "\n" + builder.source_map.to_data_uri_comment
26
+
27
+ v8.eval(code)
28
+ end
29
+
30
+ # A polyfill so that SecureRandom works in repl correctly.
31
+ def self.random_bytes(bytes)
32
+ ::SecureRandom.bytes(bytes).split('').map(&:ord)
33
+ end
34
+ end
35
+ end
36
+ end