opal 1.0.1 → 1.1.0.rc1

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 (406) hide show
  1. checksums.yaml +4 -4
  2. data/.codeclimate.yml +14 -12
  3. data/.gitattributes +1 -1
  4. data/.github/FUNDING.yml +1 -0
  5. data/.github/workflows/build.yml +90 -0
  6. data/.jshintrc +1 -1
  7. data/.overcommit.yml +35 -0
  8. data/.rubocop.yml +44 -7
  9. data/{.rubocop_todo.yml → .rubocop/todo.yml} +4 -5
  10. data/CHANGELOG.md +129 -7
  11. data/Gemfile +2 -3
  12. data/HACKING.md +2 -9
  13. data/README.md +20 -17
  14. data/UNRELEASED.md +106 -7
  15. data/benchmark-ips/bm_array_pop_1.rb +8 -0
  16. data/benchmark-ips/bm_array_shift.rb +7 -0
  17. data/benchmark-ips/class_shovel_vs_singleton_class.rb +16 -0
  18. data/bin/build-browser-source-map-support +5 -0
  19. data/bin/format-filters +54 -0
  20. data/bin/git-submodule-fast-install +49 -0
  21. data/bin/remove-filters +39 -0
  22. data/bin/setup +4 -0
  23. data/bin/yarn +11 -0
  24. data/docs/releasing.md +18 -0
  25. data/docs/roda-sprockets.md +86 -0
  26. data/docs/sinatra.md +5 -12
  27. data/examples/rack/Gemfile +1 -0
  28. data/examples/rack/app/application.rb +3 -0
  29. data/examples/rack/config.ru +5 -4
  30. data/exe/opal-repl +2 -83
  31. data/lib/opal/ast/builder.rb +1 -1
  32. data/lib/opal/builder.rb +2 -10
  33. data/lib/opal/builder_processors.rb +1 -1
  34. data/lib/opal/cli.rb +4 -1
  35. data/lib/opal/cli_options.rb +11 -3
  36. data/lib/opal/cli_runners.rb +27 -37
  37. data/lib/opal/cli_runners/applescript.rb +5 -44
  38. data/lib/opal/cli_runners/chrome.js +7 -35
  39. data/lib/opal/cli_runners/chrome.rb +77 -19
  40. data/lib/opal/cli_runners/compiler.rb +17 -0
  41. data/lib/opal/cli_runners/nashorn.rb +9 -43
  42. data/lib/opal/cli_runners/nodejs.rb +18 -47
  43. data/lib/opal/cli_runners/server.rb +18 -6
  44. data/lib/opal/cli_runners/source-map-support-browser.js +6445 -0
  45. data/lib/opal/cli_runners/source-map-support.js +639 -0
  46. data/lib/opal/cli_runners/system_runner.rb +45 -0
  47. data/lib/opal/compiler.rb +57 -29
  48. data/lib/opal/config.rb +0 -5
  49. data/lib/opal/erb.rb +1 -1
  50. data/lib/opal/magic_comments.rb +34 -0
  51. data/lib/opal/nodes/args/arity_check.rb +2 -1
  52. data/lib/opal/nodes/base.rb +1 -1
  53. data/lib/opal/nodes/call.rb +1 -4
  54. data/lib/opal/nodes/def.rb +2 -0
  55. data/lib/opal/nodes/iter.rb +1 -1
  56. data/lib/opal/nodes/literal.rb +19 -14
  57. data/lib/opal/nodes/logic.rb +5 -80
  58. data/lib/opal/nodes/masgn.rb +2 -0
  59. data/lib/opal/nodes/rescue.rb +1 -1
  60. data/lib/opal/nodes/super.rb +24 -10
  61. data/lib/opal/nodes/top.rb +5 -4
  62. data/lib/opal/parser/patch.rb +15 -0
  63. data/lib/opal/parser/with_c_lexer.rb +2 -1
  64. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  65. data/lib/opal/path_reader.rb +2 -2
  66. data/lib/opal/paths.rb +8 -5
  67. data/lib/opal/repl.rb +103 -0
  68. data/lib/opal/rewriter.rb +4 -0
  69. data/lib/opal/rewriters/for_rewriter.rb +1 -1
  70. data/lib/opal/rewriters/js_reserved_words.rb +7 -7
  71. data/lib/opal/rewriters/numblocks.rb +31 -0
  72. data/lib/opal/rewriters/returnable_logic.rb +33 -0
  73. data/lib/opal/util.rb +11 -48
  74. data/lib/opal/version.rb +1 -1
  75. data/opal.gemspec +25 -25
  76. data/opal/corelib/array.rb +160 -118
  77. data/opal/corelib/array/pack.rb +5 -3
  78. data/opal/corelib/basic_object.rb +4 -4
  79. data/opal/corelib/class.rb +2 -1
  80. data/opal/corelib/comparable.rb +49 -31
  81. data/opal/corelib/constants.rb +5 -5
  82. data/opal/corelib/enumerable.rb +108 -46
  83. data/opal/corelib/enumerator.rb +27 -12
  84. data/opal/corelib/file.rb +3 -1
  85. data/opal/corelib/hash.rb +6 -1
  86. data/opal/corelib/helpers.rb +8 -28
  87. data/opal/corelib/io.rb +12 -7
  88. data/opal/corelib/kernel.rb +45 -14
  89. data/opal/corelib/kernel/format.rb +3 -1
  90. data/opal/corelib/math.rb +8 -6
  91. data/opal/corelib/method.rb +8 -0
  92. data/opal/corelib/module.rb +17 -2
  93. data/opal/corelib/number.rb +3 -12
  94. data/opal/corelib/proc.rb +16 -0
  95. data/opal/corelib/random/mersenne_twister.rb +147 -0
  96. data/opal/corelib/range.rb +3 -13
  97. data/opal/corelib/regexp.rb +10 -6
  98. data/opal/corelib/runtime.js +208 -81
  99. data/opal/corelib/string.rb +55 -49
  100. data/opal/corelib/string/encoding.rb +109 -32
  101. data/opal/corelib/string/unpack.rb +2 -17
  102. data/opal/corelib/struct.rb +14 -1
  103. data/opal/corelib/time.rb +4 -0
  104. data/opal/opal.rb +1 -1
  105. data/opal/opal/mini.rb +1 -1
  106. data/package.json +16 -0
  107. data/spec/README.md +10 -0
  108. data/spec/filters/bugs/array.rb +76 -0
  109. data/spec/filters/bugs/base64.rb +10 -0
  110. data/spec/filters/bugs/basicobject.rb +12 -0
  111. data/spec/filters/bugs/bigdecimal.rb +248 -0
  112. data/spec/filters/bugs/class.rb +12 -0
  113. data/spec/filters/bugs/complex.rb +7 -0
  114. data/spec/filters/bugs/date.rb +104 -0
  115. data/spec/filters/bugs/encoding.rb +259 -0
  116. data/spec/filters/bugs/enumerable.rb +26 -0
  117. data/spec/filters/bugs/enumerator.rb +48 -0
  118. data/spec/filters/bugs/exception.rb +120 -0
  119. data/spec/filters/bugs/file.rb +48 -0
  120. data/spec/filters/bugs/float.rb +74 -0
  121. data/spec/filters/bugs/hash.rb +60 -0
  122. data/spec/filters/bugs/integer.rb +78 -0
  123. data/spec/filters/bugs/io.rb +9 -0
  124. data/spec/filters/bugs/kernel.rb +401 -0
  125. data/spec/filters/bugs/language.rb +451 -0
  126. data/spec/filters/bugs/marshal.rb +50 -0
  127. data/spec/filters/bugs/math.rb +4 -0
  128. data/spec/filters/bugs/method.rb +79 -0
  129. data/spec/filters/bugs/module.rb +281 -0
  130. data/spec/filters/bugs/nilclass.rb +4 -0
  131. data/spec/filters/bugs/numeric.rb +27 -0
  132. data/spec/filters/bugs/openstruct.rb +8 -0
  133. data/spec/filters/bugs/pack_unpack.rb +138 -0
  134. data/spec/filters/bugs/pathname.rb +9 -0
  135. data/spec/filters/bugs/proc.rb +80 -0
  136. data/spec/filters/bugs/random.rb +20 -0
  137. data/spec/filters/bugs/range.rb +139 -0
  138. data/spec/filters/bugs/rational.rb +12 -0
  139. data/spec/filters/bugs/regexp.rb +91 -0
  140. data/spec/filters/bugs/set.rb +51 -0
  141. data/spec/filters/bugs/singleton.rb +7 -0
  142. data/spec/filters/bugs/string.rb +341 -0
  143. data/spec/filters/bugs/stringscanner.rb +78 -0
  144. data/spec/filters/bugs/struct.rb +26 -0
  145. data/spec/filters/bugs/symbol.rb +7 -0
  146. data/spec/filters/bugs/time.rb +109 -0
  147. data/spec/filters/bugs/unboundmethod.rb +33 -0
  148. data/spec/filters/bugs/warnings.rb +30 -0
  149. data/spec/filters/unsupported/array.rb +168 -0
  150. data/spec/filters/unsupported/basicobject.rb +15 -0
  151. data/spec/filters/unsupported/bignum.rb +55 -0
  152. data/spec/filters/unsupported/class.rb +5 -0
  153. data/spec/filters/unsupported/delegator.rb +6 -0
  154. data/spec/filters/unsupported/enumerable.rb +12 -0
  155. data/spec/filters/unsupported/enumerator.rb +14 -0
  156. data/spec/filters/unsupported/file.rb +4 -0
  157. data/spec/filters/unsupported/fixnum.rb +15 -0
  158. data/spec/filters/unsupported/float.rb +47 -0
  159. data/spec/filters/unsupported/freeze.rb +259 -0
  160. data/spec/filters/unsupported/hash.rb +44 -0
  161. data/spec/filters/unsupported/integer.rb +101 -0
  162. data/spec/filters/unsupported/kernel.rb +35 -0
  163. data/spec/filters/unsupported/language.rb +25 -0
  164. data/spec/filters/unsupported/marshal.rb +44 -0
  165. data/spec/filters/unsupported/matchdata.rb +63 -0
  166. data/spec/filters/unsupported/math.rb +4 -0
  167. data/spec/filters/unsupported/pathname.rb +4 -0
  168. data/spec/filters/unsupported/privacy.rb +287 -0
  169. data/spec/filters/unsupported/proc.rb +4 -0
  170. data/spec/filters/unsupported/random.rb +5 -0
  171. data/spec/filters/unsupported/range.rb +8 -0
  172. data/spec/filters/unsupported/regexp.rb +70 -0
  173. data/spec/filters/unsupported/set.rb +5 -0
  174. data/spec/filters/unsupported/singleton.rb +7 -0
  175. data/spec/filters/unsupported/string.rb +687 -0
  176. data/spec/filters/unsupported/struct.rb +7 -0
  177. data/spec/filters/unsupported/symbol.rb +21 -0
  178. data/spec/filters/unsupported/taint.rb +162 -0
  179. data/spec/filters/unsupported/thread.rb +10 -0
  180. data/spec/filters/unsupported/time.rb +204 -0
  181. data/spec/filters/unsupported/usage_of_files.rb +262 -0
  182. data/spec/lib/builder_processors_spec.rb +44 -0
  183. data/spec/lib/builder_spec.rb +133 -0
  184. data/spec/lib/cli_runners/server_spec.rb +25 -0
  185. data/spec/lib/cli_runners_spec.rb +16 -0
  186. data/spec/lib/cli_spec.rb +256 -0
  187. data/spec/lib/compiler_spec.rb +693 -0
  188. data/spec/lib/config_spec.rb +112 -0
  189. data/spec/lib/dependency_resolver_spec.rb +43 -0
  190. data/spec/lib/deprecations_spec.rb +17 -0
  191. data/spec/lib/fixtures/complex_sprockets.js.rb.erb +4 -0
  192. data/spec/lib/fixtures/file_with_directives.js +2 -0
  193. data/spec/lib/fixtures/jst_file.js.jst +1 -0
  194. data/spec/lib/fixtures/no_requires.rb +1 -0
  195. data/spec/lib/fixtures/opal_file.rb +2 -0
  196. data/spec/lib/fixtures/require_tree_test.rb +3 -0
  197. data/spec/lib/fixtures/required_file.js +1 -0
  198. data/spec/lib/fixtures/required_tree_test/required_file1.rb +1 -0
  199. data/spec/lib/fixtures/required_tree_test/required_file2.rb +1 -0
  200. data/spec/lib/fixtures/requires.rb +7 -0
  201. data/spec/lib/fixtures/source_location_test.rb +7 -0
  202. data/spec/lib/fixtures/source_map.rb +1 -0
  203. data/spec/lib/fixtures/source_map/subfolder/other_file.rb +1 -0
  204. data/spec/lib/fixtures/sprockets_file.js.rb +3 -0
  205. data/spec/lib/fixtures/sprockets_require_tree_test.rb +3 -0
  206. data/spec/lib/path_reader_spec.rb +47 -0
  207. data/spec/lib/paths_spec.rb +18 -0
  208. data/spec/lib/repl_spec.rb +28 -0
  209. data/spec/lib/rewriters/base_spec.rb +68 -0
  210. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +153 -0
  211. data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
  212. data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
  213. data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
  214. data/spec/lib/rewriters/for_rewriter_spec.rb +92 -0
  215. data/spec/lib/rewriters/hashes/key_duplicates_rewriter_spec.rb +47 -0
  216. data/spec/lib/rewriters/js_reserved_words_spec.rb +119 -0
  217. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
  218. data/spec/lib/rewriters/opal_engine_check_spec.rb +84 -0
  219. data/spec/lib/rewriters/returnable_logic_spec.rb +52 -0
  220. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +59 -0
  221. data/spec/lib/simple_server_spec.rb +56 -0
  222. data/spec/lib/source_map/file_spec.rb +67 -0
  223. data/spec/lib/source_map/index_spec.rb +80 -0
  224. data/spec/lib/spec_helper.rb +105 -0
  225. data/spec/mspec-opal/formatters.rb +197 -0
  226. data/spec/mspec-opal/runner.rb +172 -0
  227. data/spec/opal/compiler/irb_spec.rb +44 -0
  228. data/spec/opal/compiler/unicode_spec.rb +10 -0
  229. data/spec/opal/core/array/dup_spec.rb +23 -0
  230. data/spec/opal/core/array/intersection_spec.rb +38 -0
  231. data/spec/opal/core/array/minus_spec.rb +38 -0
  232. data/spec/opal/core/array/union_spec.rb +38 -0
  233. data/spec/opal/core/array/uniq_spec.rb +49 -0
  234. data/spec/opal/core/class/inherited_spec.rb +18 -0
  235. data/spec/opal/core/enumerable/all_break_spec.rb +5 -0
  236. data/spec/opal/core/enumerable/any_break_spec.rb +5 -0
  237. data/spec/opal/core/enumerable/collect_break_spec.rb +13 -0
  238. data/spec/opal/core/enumerable/count_break_spec.rb +5 -0
  239. data/spec/opal/core/enumerable/detect_break_spec.rb +5 -0
  240. data/spec/opal/core/enumerable/drop_while_break_spec.rb +5 -0
  241. data/spec/opal/core/enumerable/each_slice_break_spec.rb +6 -0
  242. data/spec/opal/core/enumerable/each_with_index_break_spec.rb +5 -0
  243. data/spec/opal/core/enumerable/each_with_object_break_spec.rb +5 -0
  244. data/spec/opal/core/enumerable/find_all_break_spec.rb +5 -0
  245. data/spec/opal/core/enumerable/find_index_break_spec.rb +5 -0
  246. data/spec/opal/core/enumerable/grep_break_spec.rb +5 -0
  247. data/spec/opal/core/enumerable/max_break_spec.rb +5 -0
  248. data/spec/opal/core/enumerable/max_by_break_spec.rb +5 -0
  249. data/spec/opal/core/enumerable/min_break_spec.rb +5 -0
  250. data/spec/opal/core/enumerable/min_by_break_spec.rb +5 -0
  251. data/spec/opal/core/enumerable/none_break_spec.rb +5 -0
  252. data/spec/opal/core/enumerable/one_break_spec.rb +5 -0
  253. data/spec/opal/core/enumerable/reduce_break_spec.rb +5 -0
  254. data/spec/opal/core/enumerable/take_while_break_spec.rb +5 -0
  255. data/spec/opal/core/enumerator/with_index_spec.rb +6 -0
  256. data/spec/opal/core/exception_spec.rb +8 -0
  257. data/spec/opal/core/fixtures/require_tree_files/file 1.rb +1 -0
  258. data/spec/opal/core/fixtures/require_tree_files/file 2.rb +1 -0
  259. data/spec/opal/core/fixtures/require_tree_files/file 3.rb +1 -0
  260. data/spec/opal/core/fixtures/require_tree_files/file 4.rb +1 -0
  261. data/spec/opal/core/fixtures/require_tree_files/file 5.rb +1 -0
  262. data/spec/opal/core/fixtures/require_tree_files/nested/nested 1.rb +1 -0
  263. data/spec/opal/core/fixtures/require_tree_files/nested/nested 2.rb +1 -0
  264. data/spec/opal/core/fixtures/require_tree_files/other/other 1.rb +1 -0
  265. data/spec/opal/core/fixtures/require_tree_with_dot/file 1.rb +1 -0
  266. data/spec/opal/core/fixtures/require_tree_with_dot/file 2.rb +1 -0
  267. data/spec/opal/core/fixtures/require_tree_with_dot/file 3.rb +1 -0
  268. data/spec/opal/core/fixtures/require_tree_with_dot/index.rb +3 -0
  269. data/spec/opal/core/hash/internals_spec.rb +339 -0
  270. data/spec/opal/core/helpers_spec.rb +14 -0
  271. data/spec/opal/core/iterable_props_spec.rb +53 -0
  272. data/spec/opal/core/kernel/at_exit_spec.rb +70 -0
  273. data/spec/opal/core/kernel/freeze_spec.rb +15 -0
  274. data/spec/opal/core/kernel/instance_variables_spec.rb +110 -0
  275. data/spec/opal/core/kernel/methods_spec.rb +25 -0
  276. data/spec/opal/core/kernel/public_methods_spec.rb +25 -0
  277. data/spec/opal/core/kernel/require_tree_spec.rb +18 -0
  278. data/spec/opal/core/kernel/respond_to_spec.rb +15 -0
  279. data/spec/opal/core/language/DATA/characters_support_spec.rb +9 -0
  280. data/spec/opal/core/language/DATA/empty___END___spec.rb +7 -0
  281. data/spec/opal/core/language/DATA/multiple___END___spec.rb +10 -0
  282. data/spec/opal/core/language/arguments/mlhs_arg_spec.rb +18 -0
  283. data/spec/opal/core/language/keyword_arguments_spec.rb +9 -0
  284. data/spec/opal/core/language/numblocks_spec.rb +16 -0
  285. data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
  286. data/spec/opal/core/language/while_spec.rb +31 -0
  287. data/spec/opal/core/language_spec.rb +29 -0
  288. data/spec/opal/core/marshal/dump_spec.rb +81 -0
  289. data/spec/opal/core/marshal/load_spec.rb +13 -0
  290. data/spec/opal/core/module_spec.rb +27 -0
  291. data/spec/opal/core/object_id_spec.rb +56 -0
  292. data/spec/opal/core/regexp/interpolation_spec.rb +40 -0
  293. data/spec/opal/core/regexp/match_spec.rb +78 -0
  294. data/spec/opal/core/runtime/bridged_classes_spec.rb +123 -0
  295. data/spec/opal/core/runtime/constants_spec.rb +16 -0
  296. data/spec/opal/core/runtime/eval_spec.rb +5 -0
  297. data/spec/opal/core/runtime/exit_spec.rb +29 -0
  298. data/spec/opal/core/runtime/is_a_spec.rb +48 -0
  299. data/spec/opal/core/runtime/loaded_spec.rb +20 -0
  300. data/spec/opal/core/runtime/main_methods_spec.rb +39 -0
  301. data/spec/opal/core/runtime/method_missing_spec.rb +68 -0
  302. data/spec/opal/core/runtime/rescue_spec.rb +37 -0
  303. data/spec/opal/core/runtime/string_spec.rb +25 -0
  304. data/spec/opal/core/runtime/truthy_spec.rb +61 -0
  305. data/spec/opal/core/runtime_spec.rb +58 -0
  306. data/spec/opal/core/string/each_byte_spec.rb +19 -0
  307. data/spec/opal/core/string/gsub_spec.rb +35 -0
  308. data/spec/opal/core/string/to_sym_spec.rb +9 -0
  309. data/spec/opal/core/string_spec.rb +28 -0
  310. data/spec/opal/core/struct/dup_spec.rb +11 -0
  311. data/spec/opal/core/time_spec.rb +68 -0
  312. data/spec/opal/stdlib/erb/erb_spec.rb +30 -0
  313. data/spec/opal/stdlib/erb/inline_block.opalerb +3 -0
  314. data/spec/opal/stdlib/erb/quoted.opalerb +1 -0
  315. data/spec/opal/stdlib/erb/simple.opalerb +1 -0
  316. data/spec/opal/stdlib/js_spec.rb +72 -0
  317. data/spec/opal/stdlib/json/ext_spec.rb +55 -0
  318. data/spec/opal/stdlib/json/parse_spec.rb +37 -0
  319. data/spec/opal/stdlib/logger/logger_spec.rb +308 -0
  320. data/spec/opal/stdlib/native/alias_native_spec.rb +27 -0
  321. data/spec/opal/stdlib/native/array_spec.rb +11 -0
  322. data/spec/opal/stdlib/native/date_spec.rb +12 -0
  323. data/spec/opal/stdlib/native/deprecated_include_spec.rb +8 -0
  324. data/spec/opal/stdlib/native/each_spec.rb +13 -0
  325. data/spec/opal/stdlib/native/element_reference_spec.rb +16 -0
  326. data/spec/opal/stdlib/native/exposure_spec.rb +33 -0
  327. data/spec/opal/stdlib/native/ext_spec.rb +19 -0
  328. data/spec/opal/stdlib/native/hash_spec.rb +67 -0
  329. data/spec/opal/stdlib/native/initialize_spec.rb +17 -0
  330. data/spec/opal/stdlib/native/method_missing_spec.rb +51 -0
  331. data/spec/opal/stdlib/native/native_alias_spec.rb +26 -0
  332. data/spec/opal/stdlib/native/native_class_spec.rb +18 -0
  333. data/spec/opal/stdlib/native/native_module_spec.rb +13 -0
  334. data/spec/opal/stdlib/native/native_reader_spec.rb +22 -0
  335. data/spec/opal/stdlib/native/native_writer_spec.rb +30 -0
  336. data/spec/opal/stdlib/native/new_spec.rb +92 -0
  337. data/spec/opal/stdlib/native/struct_spec.rb +12 -0
  338. data/spec/opal/stdlib/pp_spec.rb +5 -0
  339. data/spec/opal/stdlib/promise/always_spec.rb +49 -0
  340. data/spec/opal/stdlib/promise/error_spec.rb +15 -0
  341. data/spec/opal/stdlib/promise/rescue_spec.rb +53 -0
  342. data/spec/opal/stdlib/promise/then_spec.rb +79 -0
  343. data/spec/opal/stdlib/promise/trace_spec.rb +51 -0
  344. data/spec/opal/stdlib/promise/value_spec.rb +15 -0
  345. data/spec/opal/stdlib/promise/when_spec.rb +34 -0
  346. data/spec/opal/stdlib/source_map_spec.rb +8 -0
  347. data/spec/opal/stdlib/strscan/scan_spec.rb +11 -0
  348. data/spec/opal/stdlib/template/paths_spec.rb +10 -0
  349. data/spec/opal/stdlib/thread/mutex_spec.rb +40 -0
  350. data/spec/opal/stdlib/thread/thread_queue_spec.rb +32 -0
  351. data/spec/opal/stdlib/thread/thread_spec.rb +60 -0
  352. data/spec/ruby_specs +183 -0
  353. data/spec/spec_helper.rb +31 -0
  354. data/spec/support/guard_platform.rb +4 -0
  355. data/spec/support/match_helpers.rb +57 -0
  356. data/spec/support/mspec_rspec_adapter.rb +33 -0
  357. data/spec/support/rewriters_helper.rb +54 -0
  358. data/spec/support/source_map_helper.rb +190 -0
  359. data/stdlib/base64.rb +2 -2
  360. data/stdlib/bigdecimal.rb +15 -3
  361. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  362. data/stdlib/bigdecimal/util.rb +148 -0
  363. data/stdlib/delegate.rb +8 -0
  364. data/stdlib/nodejs/fileutils.rb +1 -1
  365. data/stdlib/nodejs/kernel.rb +0 -13
  366. data/stdlib/nodejs/stacktrace.rb +4 -179
  367. data/stdlib/ostruct.rb +5 -0
  368. data/stdlib/pp.rb +586 -19
  369. data/stdlib/prettyprint.rb +556 -0
  370. data/stdlib/rbconfig/sizeof.rb +2 -0
  371. data/stdlib/securerandom.rb +32 -0
  372. data/stdlib/set.rb +36 -0
  373. data/stdlib/strscan.rb +15 -0
  374. data/tasks/benchmarking.rake +1 -1
  375. data/tasks/linting.rake +3 -5
  376. data/tasks/releasing.rake +2 -5
  377. data/tasks/testing.rake +16 -11
  378. data/tasks/testing/mspec_special_calls.rb +1 -19
  379. data/test/nodejs/fixtures/cat.png +0 -0
  380. data/test/nodejs/fixtures/hello.rb +1 -0
  381. data/test/nodejs/fixtures/iso88591.txt +1 -0
  382. data/test/nodejs/fixtures/utf8.txt +1 -0
  383. data/test/nodejs/fixtures/win1258.txt +1 -0
  384. data/test/nodejs/test_dir.rb +39 -0
  385. data/test/nodejs/test_env.rb +62 -0
  386. data/test/nodejs/test_error.rb +29 -0
  387. data/test/nodejs/test_file.rb +206 -0
  388. data/test/nodejs/test_file_encoding.rb +20 -0
  389. data/test/nodejs/test_io.rb +18 -0
  390. data/test/nodejs/test_opal_builder.rb +12 -0
  391. data/test/nodejs/test_pathname.rb +16 -0
  392. data/test/opal/cat.png +0 -0
  393. data/test/opal/http_server.rb +52 -0
  394. data/test/opal/test_base64.rb +115 -0
  395. data/test/opal/test_keyword.rb +590 -0
  396. data/test/opal/test_matrix.rb +661 -0
  397. data/test/opal/test_openuri.rb +53 -0
  398. data/test/opal/unsupported_and_bugs.rb +39 -0
  399. data/yarn.lock +1355 -0
  400. metadata +899 -36
  401. data/.travis.yml +0 -109
  402. data/appveyor.yml +0 -35
  403. data/lib/opal/nodes/runtime_helpers.rb +0 -51
  404. data/opal/corelib/random/MersenneTwister.js +0 -137
  405. data/opal/corelib/random/mersenne_twister.js.rb +0 -13
  406. data/stdlib/bigdecimal/kernel.rb +0 -5
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env ruby
2
+ APP_ROOT = File.expand_path('..', __dir__)
3
+ Dir.chdir(APP_ROOT) do
4
+ begin
5
+ exec "yarnpkg", *ARGV
6
+ rescue Errno::ENOENT
7
+ $stderr.puts "Yarn executable was not detected in the system."
8
+ $stderr.puts "Download Yarn at https://yarnpkg.com/en/docs/install"
9
+ exit 1
10
+ end
11
+ end
@@ -0,0 +1,18 @@
1
+ # Releasing
2
+
3
+ _This guide is a work-in-progress._
4
+
5
+ ## Updating the version
6
+
7
+ - Update `lib/opal/version.rb`
8
+ - Update `opal/corelib/constants.rb` with the same version number along with release dates
9
+
10
+ ## Updating the changelog
11
+
12
+ - Ensure all the unreleased changes are documented in UNRELEASED.md
13
+ - Run `bin/rake changelog VERSION=v1.2.3` specifying the version number you're about to release
14
+
15
+ ## The commit
16
+
17
+ - Commit the updated changelog along with the version bump using this commmit message:
18
+ "Release v1.2.3"
@@ -0,0 +1,86 @@
1
+ # Using Opal with Roda and Sprockets
2
+
3
+ Add Opal-Sprockets and Roda-Sprockets to your Gemfile (or install using `gem`):
4
+
5
+ ```ruby
6
+ # Gemfile
7
+ gem "opal-sprockets"
8
+ gem "roda-sprockets"
9
+ gem "puma"
10
+ ```
11
+
12
+ Roda-Sprockets uses `sprockets` as its default build system, so the asset-pipeline
13
+ from rails can be mimicked here to map all ruby assets in the `/assets`
14
+ path to be compiled using opal.
15
+
16
+ ## Basic Application
17
+
18
+ ```ruby
19
+ # config.ru
20
+ require 'roda'
21
+
22
+ class App < Roda
23
+ plugin :sprockets, precompile: %w(application.js),
24
+ prefix: %w(app/),
25
+ root: __dir__,
26
+ public_path: 'public/',
27
+ opal: true,
28
+ debug: ENV['RACK_ENV'] != 'production'
29
+ plugin :public
30
+
31
+ route do |r|
32
+ r.public
33
+ r.sprockets
34
+
35
+ r.root do
36
+ <<~END
37
+ <!doctype html>
38
+ <html>
39
+ <head>
40
+ #{ javascript_tag 'application' }
41
+ #{ opal_require 'application' }
42
+ </head>
43
+ </html>
44
+ END
45
+ end
46
+ end
47
+ end
48
+
49
+ run App.app
50
+
51
+ ```
52
+
53
+ This creates a sprockets instance under the `/assets` path, serving Opal assets
54
+ from `app/` with all the custom opal paths added automatically.
55
+
56
+ This `env` object includes all the opal corelib and stdlib paths. To add
57
+ any custom application directories, you must add them to the load path using
58
+ `Opal.append_path` or adding them to the `prefix` parameter. You can now add
59
+ an `app/application.rb` file into this added path with some basic content:
60
+
61
+ ```ruby
62
+ # app/application.rb
63
+ require 'opal'
64
+
65
+ puts "wow, running ruby!"
66
+ ```
67
+
68
+ It is necessary to require the opal corelib (seen in the `require` call) above.
69
+ This just makes the Opal runtime and corelib available. Then it is possible to
70
+ use all the corelib methods and classes, e.g. `Kernel#puts` as seen above.
71
+
72
+ ### Running Application
73
+
74
+ As this is just a simple Roda application, you can run it:
75
+
76
+ ```sh
77
+ $ bundle exec rackup
78
+ ```
79
+
80
+ And point your browser towards `http://localhost:9292/` and view the browser
81
+ debug console. You should see this message printed.
82
+
83
+ ### Extending the integration
84
+
85
+ It's possible to extend this integration, for that please look into the
86
+ [roda-sprockets documentation](https://github.com/hmdne/roda-sprockets)
@@ -4,8 +4,11 @@ Add Opal-Sprockets to your Gemfile (or install using `gem`):
4
4
 
5
5
  ```ruby
6
6
  # Gemfile
7
+ source 'https://rubygems.org'
8
+
7
9
  gem 'sinatra'
8
10
  gem 'opal-sprockets'
11
+ gem 'puma'
9
12
  ```
10
13
 
11
14
  Opal-Sprockets uses `sprockets` as its default build system, so the asset-pipeline
@@ -22,17 +25,9 @@ require 'sinatra'
22
25
  opal = Opal::Sprockets::Server.new {|s|
23
26
  s.append_path 'app'
24
27
  s.main = 'application'
28
+ s.debug = ENV['RACK_ENV'] != 'production'
25
29
  }
26
30
 
27
- maps_prefix = Opal::Sprockets::Server::SOURCE_MAPS_PREFIX_PATH
28
- maps_app = Opal::SourceMapServer.new(opal.sprockets, maps_prefix)
29
-
30
- map maps_prefix do
31
- use Rack::ConditionalGet
32
- use Rack::ETag
33
- run maps_app
34
- end
35
-
36
31
  map '/assets' do
37
32
  run opal.sprockets
38
33
  end
@@ -42,9 +37,7 @@ get '/' do
42
37
  <!doctype html>
43
38
  <html>
44
39
  <head>
45
- <script src="/assets/opal.js"></script>
46
- <script src="/assets/application.self.js"></script>
47
- <script type="text/javascript">Opal.load("application")</script>
40
+ #{ Opal::Sprockets.javascript_include_tag('application', debug: opal.debug, sprockets: opal.sprockets, prefix: 'assets/' ) }
48
41
  </head>
49
42
  </html>
50
43
  HTML
@@ -2,3 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gem 'rack'
4
4
  gem 'opal', :path => '../../'
5
+ gem 'c_lexer'
@@ -21,4 +21,7 @@ require 'native'
21
21
  $$[:document][:title] = "#{$app.title}"
22
22
 
23
23
  bill = User.new('Bill')
24
+
25
+ $$.alert "The user is named #{bill.name}."
26
+
24
27
  bill.authenticated?
@@ -2,19 +2,20 @@ require 'bundler'
2
2
  Bundler.require
3
3
 
4
4
  # Instructions: bundle in this directory
5
- # then run bundle exec rackup to start the server
6
- # and browse to localhost:9292
5
+ # then run `bundle exec rackup` to start the server
6
+ # and browse to http://localhost:9292
7
7
 
8
8
  # a very small application that just tries to authenticate a user and fails
9
9
  # it just writes to the console in the browser (no visible html)
10
10
 
11
11
  # with gems like opal-jquery or opal-browser you could manipulate the dom directly
12
12
 
13
+ # the directory where the code is (add to opal load path )
14
+ Opal.append_path 'app'
15
+
13
16
  run Opal::SimpleServer.new { |s|
14
17
  # the name of the ruby file to load. To use more files they must be required from here (see app)
15
18
  s.main = 'application'
16
- # the directory where the code is (add to opal load path )
17
- s.append_path 'app'
18
19
  # need to set the index explicitly for opal server to pick it up
19
20
  s.index_path = 'index.html.erb'
20
21
  }
@@ -1,86 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require 'opal'
3
+ require 'opal/repl'
4
4
 
5
- module Opal
6
- class V8Context
7
- def initialize
8
- @builder = Opal::Builder.new
9
- @history_path = File.expand_path('~/.opal-repl-history')
10
- @history = File.exist?(@history_path)
11
- end
12
-
13
- def run(filename = nil)
14
- return if @v8
15
-
16
- begin
17
- require 'mini_racer'
18
- rescue LoadError
19
- abort 'opal-repl depends on mini_racer gem, which is not currently installed'
20
- end
21
-
22
- @v8 = MiniRacer::Context.new
23
- @v8.eval Opal::Builder.new.build('opal').to_s
24
-
25
- if filename
26
- if File.exist? filename
27
- eval_ruby File.read(filename)
28
- else
29
- fail "file does not exist: #{filename}"
30
- end
31
- end
32
-
33
- run_repl
34
- end
35
-
36
- def log(*str)
37
- puts(*str)
38
- end
39
-
40
- def run_repl
41
- require 'readline'
42
- load_history
43
-
44
- loop do
45
- # on SIGINT lets just return from the loop..
46
- trap('SIGINT') { finish; return }
47
- line = Readline.readline '>> ', true
48
-
49
- # if we type exit, then we need to close down context
50
- if line == 'exit' or line.nil?
51
- break
52
- end
53
-
54
- puts "=> #{eval_ruby line}"
55
- end
56
-
57
- finish
58
- end
59
-
60
- def eval_ruby(str)
61
- code = Opal::Builder.new.build_str(str, '(irb)', :irb => true, :const_missing => true)
62
- code.processed[0...-1].each { |c| @v8.eval(c.to_s) }
63
- @v8.eval "var $_result = #{code.processed.last.to_s} ($_result == null ? 'nil' : $_result.$inspect());"
64
- rescue Exception => e
65
- puts "#{e.message}\n\t#{e.backtrace.join("\n\t")}"
66
- end
67
-
68
- def load_history
69
- return unless @history
70
- File.read(@history_path).lines.each { |line| Readline::HISTORY.push line.strip }
71
- end
72
-
73
- def dump_history
74
- return unless @history
75
- length = (Readline::HISTORY.size > 1000) ? 1000 : Readline::HISTORY.size
76
- File.write(@history_path, Readline::HISTORY.to_a[-length..-1].join("\n"))
77
- end
78
-
79
- def finish
80
- dump_history
81
- @v8 = nil
82
- end
83
- end
84
- end
85
-
86
- Opal::V8Context.new.run ARGV.first
5
+ repl = Opal::REPL.new.run ARGV.first
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'opal/ast/node'
4
- require 'parser/ruby25'
4
+ require 'parser/ruby30'
5
5
 
6
6
  module Opal
7
7
  module AST
@@ -195,16 +195,8 @@ module Opal
195
195
 
196
196
  source = stub?(rel_path) ? '' : read(rel_path)
197
197
 
198
- if source.nil?
199
- message = "can't find file: #{rel_path.inspect}"
200
- case missing_require_severity
201
- when :error then raise LoadError, message
202
- when :warning then warn "can't find file: #{rel_path.inspect}"
203
- when :ignore then # noop
204
- end
205
-
206
- return # the handling is delegated to the runtime
207
- end
198
+ # The handling is delegated to the runtime
199
+ return if source.nil?
208
200
 
209
201
  abs_path = expand_path(rel_path)
210
202
  rel_path = expand_ext(rel_path)
@@ -24,7 +24,7 @@ module Opal
24
24
  def handles(*extensions)
25
25
  @extensions = extensions
26
26
  matches = extensions.join('|')
27
- matches = "(#{matches})" if extensions.size == 1
27
+ matches = "(#{matches})" unless extensions.size == 1
28
28
  @match_regexp = Regexp.new "\\.#{matches}#{REGEXP_END}"
29
29
 
30
30
  ::Opal::Builder.register_processor(self, extensions)
@@ -7,7 +7,7 @@ require 'opal/cli_runners'
7
7
  module Opal
8
8
  class CLI
9
9
  attr_reader :options, :file, :compiler_options, :evals, :load_paths, :argv,
10
- :output, :requires, :gems, :stubs, :verbose, :runner_options,
10
+ :output, :requires, :rbrequires, :gems, :stubs, :verbose, :runner_options,
11
11
  :preload, :filename, :debug, :no_exit, :lib_only, :missing_require_severity
12
12
 
13
13
  class << self
@@ -37,6 +37,7 @@ module Opal
37
37
  @debug = options.delete(:debug) { false }
38
38
  @filename = options.delete(:filename) { @file && @file.path }
39
39
  @requires = options.delete(:requires) { [] }
40
+ @rbrequires = options.delete(:rbrequires) { [] }
40
41
 
41
42
  @missing_require_severity = options.delete(:missing_require_severity) { Opal::Config.missing_require_severity }
42
43
 
@@ -79,6 +80,8 @@ module Opal
79
80
  end
80
81
 
81
82
  def create_builder
83
+ rbrequires.each(&Kernel.method(:require))
84
+
82
85
  builder = Opal::Builder.new(
83
86
  stubs: stubs,
84
87
  compiler_options: compiler_options,
@@ -58,6 +58,13 @@ module Opal
58
58
  options[:requires] << library
59
59
  end
60
60
 
61
+ on('-q', '--rbrequire LIBRARY', String,
62
+ 'Require the library in Ruby context before compiling'
63
+ ) do |library|
64
+ options[:rbrequires] ||= []
65
+ options[:rbrequires] << library
66
+ end
67
+
61
68
  on('-s', '--stub FILE', String, 'Stubbed files will be compiled as empty files') do |stub|
62
69
  options[:stubs] ||= []
63
70
  options[:stubs] << stub
@@ -105,11 +112,11 @@ module Opal
105
112
 
106
113
  section 'Compilation Options:'
107
114
 
108
- on('-M', '--no-method-missing', 'Enable/Disable method missing') do
115
+ on('-M', '--no-method-missing', 'Disable method missing') do
109
116
  options[:method_missing] = false
110
117
  end
111
118
 
112
- on('-O', '--no-opal', 'Enable/Disable implicit `require "opal"`') do
119
+ on('-O', '--no-opal', 'Disable implicit `require "opal"`') do
113
120
  options[:skip_opal_require] = true
114
121
  end
115
122
 
@@ -137,7 +144,8 @@ module Opal
137
144
  options[:missing_require_severity] = level.to_sym
138
145
  end
139
146
 
140
- on('-P', '--map FILE', 'Enable/Disable source map') do |file|
147
+ on('-P', '--map FILE', 'Output path to FILE') do |file|
148
+ options[:runner_options] ||= {}
141
149
  options[:runner_options][:map_file] = file
142
150
  end
143
151
 
@@ -24,10 +24,13 @@ module Opal
24
24
  @register[name.to_sym]
25
25
  end
26
26
 
27
+ # @private
27
28
  def self.[]=(name, runner)
28
29
  warn "Overwriting Opal CLI runner: #{name}" if @register.key? name.to_sym
30
+
29
31
  @register[name.to_sym] = runner
30
32
  end
33
+ private_class_method :[]=
31
34
 
32
35
  def self.to_h
33
36
  @register
@@ -35,49 +38,36 @@ module Opal
35
38
 
36
39
  # @param name [Symbol] the name at which the runner can be reached
37
40
  # @param runner [#call] a callable object that will act as the "runner"
38
- def self.register_runner(name, runner)
39
- self[name] = runner
40
- nil
41
- end
42
-
43
- # The compiler runner will just output the compiled JavaScript
44
- register_runner :compiler, ->(data) {
45
- options = data[:options] || {}
46
- builder = data.fetch(:builder)
47
- map_file = options[:map_file]
48
- output = data.fetch(:output)
41
+ # @param runner [Symbol] a constant name that once autoloaded will point to
42
+ # a callable.
43
+ # @param path [nil,String] a path for setting up autoload on the constant
44
+ def self.register_runner(name, runner, path = nil)
45
+ autoload runner, path if path
49
46
 
50
- compiled_source = builder.to_s + "\n" + builder.source_map.to_data_uri_comment
51
- output.puts compiled_source
52
- File.write(map_file, builder.source_map.to_json) if map_file
47
+ if runner.respond_to?(:call)
48
+ self[name] = runner
49
+ else
50
+ self[name] = ->(data) { const_get(runner).call(data) }
51
+ end
53
52
 
54
- 0
55
- }
53
+ nil
54
+ end
56
55
 
57
- # Legacy runners
56
+ # Alias a runner name
57
+ def self.alias_runner(new_name, old_name)
58
+ self[new_name.to_sym] = self[old_name.to_sym]
58
59
 
59
- def self.register_legacy_runner(klass_name, *names)
60
- runner = ->(data) {
61
- klass = const_get(klass_name)
62
- runner = klass.new((data[:options] || {}).merge(output: data[:output]))
63
- builder = data[:builder]
64
- compiled_source = builder.to_s + "\n" + builder.source_map.to_data_uri_comment
65
- runner.run(compiled_source, data[:argv])
66
- runner.exit_status
67
- }
68
- names.each { |name| self[name] = runner }
60
+ nil
69
61
  end
70
62
 
71
- autoload :Applescript, 'opal/cli_runners/applescript'
72
- autoload :Chrome, 'opal/cli_runners/chrome'
73
- autoload :Nashorn, 'opal/cli_runners/nashorn'
74
- autoload :Nodejs, 'opal/cli_runners/nodejs'
75
- autoload :Server, 'opal/cli_runners/server'
63
+ register_runner :applescript, :Applescript, 'opal/cli_runners/applescript'
64
+ register_runner :chrome, :Chrome, 'opal/cli_runners/chrome'
65
+ register_runner :compiler, :Compiler, 'opal/cli_runners/compiler'
66
+ register_runner :nashorn, :Nashorn, 'opal/cli_runners/nashorn'
67
+ register_runner :nodejs, :Nodejs, 'opal/cli_runners/nodejs'
68
+ register_runner :server, :Server, 'opal/cli_runners/server'
76
69
 
77
- register_legacy_runner :Applescript, :applescript, :osascript
78
- register_legacy_runner :Chrome, :chrome
79
- register_legacy_runner :Nashorn, :nashorn
80
- register_legacy_runner :Nodejs, :nodejs, :node
81
- register_legacy_runner :Server, :server
70
+ alias_runner :osascript, :applescript
71
+ alias_runner :node, :nodejs
82
72
  end
83
73
  end