opal 0.10.6 → 0.11.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 (450) hide show
  1. checksums.yaml +5 -5
  2. data/.codeclimate.yml +19 -0
  3. data/.gitmodules +1 -1
  4. data/.jshintrc +1 -2
  5. data/.travis.yml +26 -18
  6. data/CHANGELOG.md +89 -23
  7. data/{CODE_OF_CONDUCT.md → CONDUCT.md} +0 -0
  8. data/Gemfile +19 -21
  9. data/HACKING.md +2 -0
  10. data/README.md +7 -6
  11. data/Rakefile +1 -1
  12. data/appveyor.yml +21 -4
  13. data/benchmark-ips/bm_case.rb +33 -0
  14. data/benchmark-ips/bm_constants_lookup.rb +13 -0
  15. data/benchmark-ips/bm_is_number.rb +29 -0
  16. data/benchmark-ips/bm_symbol_to_proc.rb +19 -0
  17. data/benchmark/bm_constant_lookup_big.rb +799 -0
  18. data/benchmark/bm_constant_lookup_small.rb +59 -0
  19. data/benchmark/bm_module_definition_big.rb +400 -0
  20. data/benchmark/bm_module_definition_small.rb +30 -0
  21. data/bin/opal-repl +23 -1
  22. data/docs/compiled_ruby.md +16 -14
  23. data/docs/faq.md +3 -3
  24. data/docs/rspec.md +2 -1
  25. data/docs/unsupported_features.md +6 -4
  26. data/examples/rack/Gemfile +1 -0
  27. data/examples/rack/app/application.rb +14 -3
  28. data/examples/rack/app/user.rb +2 -0
  29. data/examples/rack/config.ru +1 -1
  30. data/examples/rack/index.html.erb +1 -0
  31. data/lib/opal.rb +6 -1
  32. data/lib/opal/ast/builder.rb +17 -0
  33. data/lib/opal/ast/node.rb +30 -0
  34. data/lib/opal/builder.rb +14 -3
  35. data/lib/opal/builder_processors.rb +1 -0
  36. data/lib/opal/cli.rb +45 -59
  37. data/lib/opal/cli_options.rb +11 -7
  38. data/lib/opal/cli_runners.rb +1 -0
  39. data/lib/opal/cli_runners/applescript.rb +3 -3
  40. data/lib/opal/cli_runners/nashorn.rb +1 -0
  41. data/lib/opal/cli_runners/nodejs.rb +4 -1
  42. data/lib/opal/cli_runners/phantom.js +1 -2
  43. data/lib/opal/cli_runners/phantomjs.rb +3 -2
  44. data/lib/opal/cli_runners/server.rb +1 -0
  45. data/lib/opal/compiler.rb +145 -94
  46. data/lib/opal/config.rb +1 -0
  47. data/lib/opal/deprecations.rb +18 -0
  48. data/lib/opal/erb.rb +1 -0
  49. data/lib/opal/errors.rb +1 -0
  50. data/lib/opal/fragment.rb +1 -0
  51. data/lib/opal/hike_path_finder.rb +1 -0
  52. data/lib/opal/nodes.rb +3 -0
  53. data/lib/opal/nodes/arglist.rb +2 -1
  54. data/lib/opal/nodes/args/initialize_kwargs.rb +1 -0
  55. data/lib/opal/nodes/args/kwarg.rb +7 -7
  56. data/lib/opal/nodes/args/kwoptarg.rb +6 -7
  57. data/lib/opal/nodes/args/kwrestarg.rb +5 -5
  58. data/lib/opal/nodes/args/mlhsarg.rb +3 -2
  59. data/lib/opal/nodes/args/normarg.rb +6 -7
  60. data/lib/opal/nodes/args/optarg.rb +5 -7
  61. data/lib/opal/nodes/args/post_args.rb +6 -5
  62. data/lib/opal/nodes/args/post_kwargs.rb +1 -0
  63. data/lib/opal/nodes/args/restarg.rb +7 -7
  64. data/lib/opal/nodes/array.rb +1 -0
  65. data/lib/opal/nodes/base.rb +24 -3
  66. data/lib/opal/nodes/call.rb +167 -155
  67. data/lib/opal/nodes/call_special.rb +31 -217
  68. data/lib/opal/nodes/case.rb +36 -22
  69. data/lib/opal/nodes/class.rb +4 -3
  70. data/lib/opal/nodes/constants.rb +28 -48
  71. data/lib/opal/nodes/csend.rb +25 -0
  72. data/lib/opal/nodes/def.rb +49 -16
  73. data/lib/opal/nodes/defined.rb +170 -60
  74. data/lib/opal/nodes/definitions.rb +40 -133
  75. data/lib/opal/nodes/defs.rb +29 -0
  76. data/lib/opal/nodes/for.rb +52 -25
  77. data/lib/opal/nodes/hash.rb +12 -35
  78. data/lib/opal/nodes/helpers.rb +27 -54
  79. data/lib/opal/nodes/if.rb +21 -32
  80. data/lib/opal/nodes/inline_args.rb +12 -13
  81. data/lib/opal/nodes/iter.rb +61 -36
  82. data/lib/opal/nodes/literal.rb +189 -116
  83. data/lib/opal/nodes/logic.rb +20 -25
  84. data/lib/opal/nodes/masgn.rb +20 -18
  85. data/lib/opal/nodes/module.rb +10 -11
  86. data/lib/opal/nodes/node_with_args.rb +14 -17
  87. data/lib/opal/nodes/rescue.rb +37 -70
  88. data/lib/opal/nodes/runtime_helpers.rb +8 -3
  89. data/lib/opal/nodes/scope.rb +9 -5
  90. data/lib/opal/nodes/singleton_class.rb +4 -3
  91. data/lib/opal/nodes/super.rb +115 -87
  92. data/lib/opal/nodes/top.rb +7 -2
  93. data/lib/opal/nodes/variables.rb +46 -35
  94. data/lib/opal/nodes/while.rb +11 -1
  95. data/lib/opal/nodes/yield.rb +1 -17
  96. data/lib/opal/parser.rb +28 -770
  97. data/lib/opal/path_reader.rb +5 -1
  98. data/lib/opal/paths.rb +10 -4
  99. data/lib/opal/regexp_anchors.rb +1 -0
  100. data/lib/opal/rewriter.rb +60 -0
  101. data/lib/opal/rewriters/base.rb +60 -0
  102. data/lib/opal/rewriters/binary_operator_assignment.rb +144 -0
  103. data/lib/opal/rewriters/block_to_iter.rb +17 -0
  104. data/lib/opal/rewriters/break_finder.rb +34 -0
  105. data/lib/opal/rewriters/dot_js_syntax.rb +60 -0
  106. data/lib/opal/rewriters/explicit_writer_return.rb +58 -0
  107. data/lib/opal/rewriters/js_reserved_words.rb +111 -0
  108. data/lib/opal/rewriters/logical_operator_assignment.rb +155 -0
  109. data/lib/opal/rewriters/opal_engine_check.rb +42 -0
  110. data/lib/opal/rewriters/rubyspec/filters_rewriter.rb +67 -0
  111. data/lib/opal/server.rb +4 -0
  112. data/lib/opal/simple_server.rb +100 -0
  113. data/lib/opal/source_map.rb +1 -1
  114. data/lib/opal/util.rb +5 -5
  115. data/lib/opal/version.rb +2 -1
  116. data/lib/tilt/opal.rb +1 -0
  117. data/opal.gemspec +8 -7
  118. data/opal/README.md +1 -1
  119. data/opal/corelib/array.rb +137 -83
  120. data/opal/corelib/basic_object.rb +6 -6
  121. data/opal/corelib/class.rb +14 -11
  122. data/opal/corelib/complex.rb +5 -1
  123. data/opal/corelib/constants.rb +3 -3
  124. data/opal/corelib/enumerable.rb +129 -11
  125. data/opal/corelib/error.rb +35 -17
  126. data/opal/corelib/file.rb +65 -170
  127. data/opal/corelib/hash.rb +128 -13
  128. data/opal/corelib/helpers.rb +12 -15
  129. data/opal/corelib/io.rb +1 -0
  130. data/opal/corelib/kernel.rb +40 -21
  131. data/opal/corelib/marshal/read_buffer.rb +1 -1
  132. data/opal/corelib/method.rb +33 -13
  133. data/opal/corelib/module.rb +133 -81
  134. data/opal/corelib/number.rb +141 -25
  135. data/opal/corelib/numeric.rb +0 -8
  136. data/opal/corelib/process.rb +44 -4
  137. data/opal/corelib/random.rb +117 -0
  138. data/opal/corelib/random/seedrandom.js.rb +15 -0
  139. data/opal/corelib/range.rb +133 -10
  140. data/opal/corelib/regexp.rb +37 -9
  141. data/opal/corelib/runtime.js +601 -390
  142. data/opal/corelib/string.rb +39 -8
  143. data/opal/corelib/string/encoding.rb +51 -7
  144. data/opal/corelib/struct.rb +20 -0
  145. data/opal/corelib/time.rb +3 -3
  146. data/opal/corelib/variables.rb +1 -1
  147. data/opal/opal.rb +1 -0
  148. data/spec/filters/bugs/array.rb +5 -1
  149. data/spec/filters/bugs/basicobject.rb +2 -5
  150. data/spec/filters/bugs/bigdecimal.rb +8 -22
  151. data/spec/filters/bugs/class.rb +2 -1
  152. data/spec/filters/bugs/comparable.rb +5 -0
  153. data/spec/filters/bugs/date.rb +3 -3
  154. data/spec/filters/bugs/enumerable.rb +4 -11
  155. data/spec/filters/bugs/enumerator.rb +2 -4
  156. data/spec/filters/bugs/exception.rb +16 -2
  157. data/spec/filters/bugs/file.rb +8 -0
  158. data/spec/filters/bugs/float.rb +7 -1
  159. data/spec/filters/bugs/hash.rb +6 -2
  160. data/spec/filters/bugs/integer.rb +2 -0
  161. data/spec/filters/bugs/io.rb +8 -0
  162. data/spec/filters/bugs/kernel.rb +9 -138
  163. data/spec/filters/bugs/language.rb +89 -174
  164. data/spec/filters/bugs/marshal.rb +33 -35
  165. data/spec/filters/bugs/method.rb +0 -24
  166. data/spec/filters/bugs/module.rb +19 -55
  167. data/spec/filters/bugs/numeric.rb +0 -119
  168. data/spec/filters/bugs/pathname.rb +2 -0
  169. data/spec/filters/bugs/proc.rb +5 -4
  170. data/spec/filters/bugs/random.rb +7 -0
  171. data/spec/filters/bugs/range.rb +12 -120
  172. data/spec/filters/bugs/rational.rb +1 -1
  173. data/spec/filters/bugs/regexp.rb +2 -40
  174. data/spec/filters/bugs/set.rb +0 -1
  175. data/spec/filters/bugs/string.rb +5 -8
  176. data/spec/filters/bugs/stringscanner.rb +11 -19
  177. data/spec/filters/bugs/time.rb +7 -1
  178. data/spec/filters/bugs/unboundmethod.rb +1 -11
  179. data/spec/filters/unsupported/array.rb +5 -1
  180. data/spec/filters/unsupported/basicobject.rb +1 -1
  181. data/spec/filters/unsupported/bignum.rb +4 -1
  182. data/spec/filters/unsupported/class.rb +1 -1
  183. data/spec/filters/unsupported/delegator.rb +1 -1
  184. data/spec/filters/unsupported/enumerable.rb +1 -1
  185. data/spec/filters/unsupported/enumerator.rb +1 -1
  186. data/spec/filters/unsupported/file.rb +4 -0
  187. data/spec/filters/unsupported/fixnum.rb +1 -1
  188. data/spec/filters/unsupported/float.rb +4 -1
  189. data/spec/filters/unsupported/freeze.rb +27 -5
  190. data/spec/filters/unsupported/hash.rb +7 -15
  191. data/spec/filters/unsupported/integer.rb +1 -1
  192. data/spec/filters/unsupported/kernel.rb +2 -1
  193. data/spec/filters/unsupported/language.rb +6 -1
  194. data/spec/filters/unsupported/marshal.rb +1 -1
  195. data/spec/filters/unsupported/matchdata.rb +4 -1
  196. data/spec/filters/unsupported/math.rb +1 -1
  197. data/spec/filters/unsupported/pathname.rb +1 -1
  198. data/spec/filters/unsupported/privacy.rb +141 -9
  199. data/spec/filters/unsupported/proc.rb +1 -1
  200. data/spec/filters/unsupported/random.rb +4 -0
  201. data/spec/filters/unsupported/range.rb +7 -0
  202. data/spec/filters/unsupported/regexp.rb +25 -15
  203. data/spec/filters/unsupported/set.rb +1 -1
  204. data/spec/filters/unsupported/singleton.rb +1 -1
  205. data/spec/filters/unsupported/string.rb +110 -101
  206. data/spec/filters/unsupported/struct.rb +1 -1
  207. data/spec/filters/unsupported/symbol.rb +2 -1
  208. data/spec/filters/unsupported/taint.rb +22 -7
  209. data/spec/filters/unsupported/thread.rb +1 -1
  210. data/spec/filters/unsupported/time.rb +1 -1
  211. data/spec/lib/builder_spec.rb +17 -0
  212. data/spec/lib/cli_spec.rb +37 -8
  213. data/spec/lib/compiler/call_spec.rb +98 -66
  214. data/spec/lib/compiler_spec.rb +39 -30
  215. data/spec/lib/dependency_resolver_spec.rb +2 -2
  216. data/spec/lib/deprecations_spec.rb +16 -0
  217. data/spec/lib/fixtures/source_location_test.rb +7 -0
  218. data/spec/lib/rewriters/binary_operator_assignment_spec.rb +151 -0
  219. data/spec/lib/rewriters/block_to_iter_spec.rb +28 -0
  220. data/spec/lib/rewriters/dot_js_syntax_spec.rb +108 -0
  221. data/spec/lib/rewriters/explicit_writer_return_spec.rb +186 -0
  222. data/spec/lib/rewriters/js_reserved_words_spec.rb +116 -0
  223. data/spec/lib/rewriters/logical_operator_assignment_spec.rb +202 -0
  224. data/spec/lib/rewriters/opal_engine_check_spec.rb +82 -0
  225. data/spec/lib/rewriters/rubyspec/filters_rewriter_spec.rb +53 -0
  226. data/spec/lib/simple_server_spec.rb +54 -0
  227. data/spec/mspec-opal/formatters.rb +65 -17
  228. data/spec/mspec-opal/runner.rb +47 -67
  229. data/spec/opal/core/date_spec.rb +14 -0
  230. data/spec/opal/core/exception_spec.rb +10 -0
  231. data/spec/opal/core/hash/internals_spec.rb +10 -10
  232. data/spec/opal/core/kernel/rand_spec.rb +0 -4
  233. data/spec/opal/core/kernel/respond_to_spec.rb +5 -2
  234. data/spec/opal/core/language/constant_lookup_spec.rb +38 -0
  235. data/spec/opal/core/language/predefined_spec.rb +1 -1
  236. data/spec/opal/core/language/safe_navigator_spec.rb +7 -0
  237. data/spec/opal/core/language/send_spec.rb +1 -9
  238. data/spec/opal/core/language/string_spec.rb +8 -8
  239. data/spec/opal/core/language/versions/def_2_0_spec.rb +0 -4
  240. data/spec/opal/core/language_spec.rb +32 -0
  241. data/spec/opal/core/module/const_get_spec.rb +1 -1
  242. data/spec/opal/core/runtime/is_a_spec.rb +36 -0
  243. data/spec/opal/core/runtime/rescue_spec.rb +35 -0
  244. data/spec/opal/core/runtime_spec.rb +4 -4
  245. data/spec/opal/core/string_spec.rb +8 -8
  246. data/spec/opal/core/time_spec.rb +26 -17
  247. data/spec/opal/stdlib/erb/quoted.opalerb +1 -1
  248. data/spec/opal/stdlib/json/parse_spec.rb +4 -0
  249. data/spec/opal/stdlib/native/hash_spec.rb +16 -0
  250. data/spec/ruby_specs +2 -1
  251. data/spec/spec_helper.rb +1 -0
  252. data/spec/support/rewriters_helper.rb +24 -0
  253. data/stdlib/base64.rb +4 -2
  254. data/stdlib/bigdecimal/bignumber.js.rb +1 -1
  255. data/stdlib/date.rb +18 -19
  256. data/stdlib/json.rb +16 -4
  257. data/stdlib/nashorn/file.rb +15 -0
  258. data/stdlib/native.rb +21 -12
  259. data/stdlib/nodejs/dir.rb +1 -1
  260. data/stdlib/nodejs/file.rb +49 -20
  261. data/stdlib/nodejs/io.rb +22 -1
  262. data/stdlib/nodejs/{node_modules/js-yaml/dist/js-yaml.js → js-yaml-3-6-1.js} +815 -626
  263. data/stdlib/nodejs/kernel.rb +3 -1
  264. data/stdlib/nodejs/package.json +0 -1
  265. data/stdlib/nodejs/stacktrace.rb +163 -0
  266. data/stdlib/nodejs/yaml.rb +2 -1
  267. data/stdlib/opal-platform.rb +15 -0
  268. data/stdlib/opal/platform.rb +5 -13
  269. data/stdlib/pathname.rb +1 -1
  270. data/stdlib/strscan.rb +15 -1
  271. data/stdlib/yaml.rb +1 -1
  272. data/tasks/benchmarking.rake +9 -0
  273. data/tasks/building.rake +24 -20
  274. data/tasks/linting.rake +24 -13
  275. data/tasks/testing.rake +322 -205
  276. data/tasks/testing/mspec_special_calls.rb +44 -15
  277. data/tasks/testing/opal_rspec_smoketest.Gemfile +13 -0
  278. data/test/nodejs/fixtures/hello.rb +1 -0
  279. data/test/nodejs/test_file.rb +57 -0
  280. data/test/nodejs/test_io.rb +18 -0
  281. data/test/nodejs/test_opal_builder.rb +12 -0
  282. data/test/opal/unsupported_and_bugs.rb +9 -0
  283. metadata +127 -240
  284. data/lib/opal/parser/grammar.rb +0 -6157
  285. data/lib/opal/parser/grammar.y +0 -2011
  286. data/lib/opal/parser/keywords.rb +0 -66
  287. data/lib/opal/parser/lexer.rb +0 -1352
  288. data/lib/opal/parser/parser_scope.rb +0 -28
  289. data/lib/opal/parser/sexp.rb +0 -90
  290. data/lib/opal/sprockets.rb +0 -77
  291. data/lib/opal/sprockets/environment.rb +0 -23
  292. data/lib/opal/sprockets/erb.rb +0 -28
  293. data/lib/opal/sprockets/path_reader.rb +0 -36
  294. data/lib/opal/sprockets/processor.rb +0 -173
  295. data/lib/opal/sprockets/server.rb +0 -133
  296. data/lib/opal/sprockets/source_map_header_patch.rb +0 -41
  297. data/lib/opal/sprockets/source_map_server.rb +0 -117
  298. data/spec/filters/bugs/compiler_opal.rb +0 -5
  299. data/spec/filters/bugs/language_opal.rb +0 -88
  300. data/spec/filters/unsupported/module.rb +0 -8
  301. data/spec/lib/compiler/pre_processed_conditionals_spec.rb +0 -87
  302. data/spec/lib/lexer_spec.rb +0 -110
  303. data/spec/lib/parser/alias_spec.rb +0 -26
  304. data/spec/lib/parser/and_spec.rb +0 -13
  305. data/spec/lib/parser/aref_spec.rb +0 -10
  306. data/spec/lib/parser/attrasgn_spec.rb +0 -28
  307. data/spec/lib/parser/begin_spec.rb +0 -42
  308. data/spec/lib/parser/block_spec.rb +0 -12
  309. data/spec/lib/parser/break_spec.rb +0 -17
  310. data/spec/lib/parser/call_spec.rb +0 -201
  311. data/spec/lib/parser/class_spec.rb +0 -35
  312. data/spec/lib/parser/comments_spec.rb +0 -11
  313. data/spec/lib/parser/def_spec.rb +0 -109
  314. data/spec/lib/parser/if_spec.rb +0 -26
  315. data/spec/lib/parser/iter_spec.rb +0 -59
  316. data/spec/lib/parser/lambda_spec.rb +0 -219
  317. data/spec/lib/parser/literal_spec.rb +0 -118
  318. data/spec/lib/parser/masgn_spec.rb +0 -37
  319. data/spec/lib/parser/module_spec.rb +0 -27
  320. data/spec/lib/parser/not_spec.rb +0 -21
  321. data/spec/lib/parser/op_asgn1_spec.rb +0 -23
  322. data/spec/lib/parser/op_asgn2_spec.rb +0 -23
  323. data/spec/lib/parser/op_asgn_spec.rb +0 -17
  324. data/spec/lib/parser/or_spec.rb +0 -13
  325. data/spec/lib/parser/return_spec.rb +0 -22
  326. data/spec/lib/parser/sclass_spec.rb +0 -21
  327. data/spec/lib/parser/string_spec.rb +0 -286
  328. data/spec/lib/parser/super_spec.rb +0 -20
  329. data/spec/lib/parser/unary_spec.rb +0 -52
  330. data/spec/lib/parser/undef_spec.rb +0 -19
  331. data/spec/lib/parser/unless_spec.rb +0 -13
  332. data/spec/lib/parser/variables_spec.rb +0 -112
  333. data/spec/lib/parser/while_spec.rb +0 -15
  334. data/spec/lib/parser/yield_spec.rb +0 -20
  335. data/spec/lib/sprockets/erb_spec.rb +0 -38
  336. data/spec/lib/sprockets/path_reader_spec.rb +0 -41
  337. data/spec/lib/sprockets/processor_spec.rb +0 -79
  338. data/spec/lib/sprockets/server_spec.rb +0 -102
  339. data/spec/lib/sprockets_spec.rb +0 -39
  340. data/spec/lib/tilt/opal_spec.rb +0 -37
  341. data/spec/opal/core/language/block_spec.rb +0 -538
  342. data/spec/opal/core/language/proc_spec.rb +0 -263
  343. data/spec/opal/core/language/variables_spec.rb +0 -1366
  344. data/spec/opal/core/runtime/block_send_spec.rb +0 -28
  345. data/spec/opal/core/runtime/send_spec.rb +0 -34
  346. data/spec/support/parser_helpers.rb +0 -37
  347. data/stdlib/nodejs/node_modules/js-yaml/HISTORY.md +0 -277
  348. data/stdlib/nodejs/node_modules/js-yaml/LICENSE +0 -21
  349. data/stdlib/nodejs/node_modules/js-yaml/README.md +0 -288
  350. data/stdlib/nodejs/node_modules/js-yaml/bin/js-yaml.js +0 -140
  351. data/stdlib/nodejs/node_modules/js-yaml/bower.json +0 -23
  352. data/stdlib/nodejs/node_modules/js-yaml/dist/js-yaml.min.js +0 -3
  353. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.js +0 -102
  354. data/stdlib/nodejs/node_modules/js-yaml/examples/custom_types.yml +0 -18
  355. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.js +0 -31
  356. data/stdlib/nodejs/node_modules/js-yaml/examples/dumper.json +0 -22
  357. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.js +0 -18
  358. data/stdlib/nodejs/node_modules/js-yaml/examples/sample_document.yml +0 -197
  359. data/stdlib/nodejs/node_modules/js-yaml/index.js +0 -7
  360. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml.js +0 -39
  361. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/common.js +0 -62
  362. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/dumper.js +0 -554
  363. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/exception.js +0 -25
  364. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/loader.js +0 -1581
  365. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/mark.js +0 -78
  366. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema.js +0 -103
  367. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/core.js +0 -18
  368. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_full.js +0 -25
  369. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/default_safe.js +0 -28
  370. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/failsafe.js +0 -17
  371. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/schema/json.js +0 -25
  372. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type.js +0 -61
  373. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/binary.js +0 -133
  374. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/bool.js +0 -37
  375. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/float.js +0 -110
  376. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/int.js +0 -183
  377. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/function.js +0 -85
  378. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/regexp.js +0 -84
  379. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/js/undefined.js +0 -27
  380. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/map.js +0 -8
  381. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/merge.js +0 -12
  382. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/null.js +0 -36
  383. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/omap.js +0 -56
  384. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/pairs.js +0 -61
  385. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/seq.js +0 -8
  386. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/set.js +0 -33
  387. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/str.js +0 -8
  388. data/stdlib/nodejs/node_modules/js-yaml/lib/js-yaml/type/timestamp.js +0 -98
  389. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/HISTORY.md +0 -115
  390. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/LICENSE +0 -21
  391. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/README.md +0 -239
  392. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/arguments.js +0 -36
  393. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/choice.js +0 -22
  394. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/constants.js +0 -59
  395. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/help.js +0 -13
  396. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/nargs.js +0 -33
  397. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/parents.js +0 -28
  398. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/prefix_chars.js +0 -23
  399. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sub_commands.js +0 -49
  400. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/sum.js +0 -35
  401. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/examples/testformatters.js +0 -270
  402. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/index.js +0 -1
  403. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action.js +0 -146
  404. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append.js +0 -55
  405. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/append/constant.js +0 -47
  406. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/count.js +0 -40
  407. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/help.js +0 -48
  408. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store.js +0 -50
  409. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/constant.js +0 -43
  410. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/false.js +0 -27
  411. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/store/true.js +0 -26
  412. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/subparsers.js +0 -148
  413. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action/version.js +0 -50
  414. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/action_container.js +0 -481
  415. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argparse.js +0 -14
  416. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/error.js +0 -50
  417. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/exclusive.js +0 -54
  418. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument/group.js +0 -75
  419. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/argument_parser.js +0 -1168
  420. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/const.js +0 -18
  421. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/added_formatters.js +0 -88
  422. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/help/formatter.js +0 -798
  423. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/lib/namespace.js +0 -77
  424. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.npmignore +0 -2
  425. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/.travis.yml +0 -8
  426. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/README.markdown +0 -825
  427. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/bower.json +0 -33
  428. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/component.json +0 -11
  429. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/foo.js +0 -10
  430. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/gulpfile.js +0 -26
  431. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/lib/underscore.string.js +0 -673
  432. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/libpeerconnection.log +0 -0
  433. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore.string/package.json +0 -107
  434. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/LICENSE +0 -23
  435. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/README.md +0 -22
  436. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/package.json +0 -69
  437. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore-min.js +0 -6
  438. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/node_modules/underscore/underscore.js +0 -1415
  439. data/stdlib/nodejs/node_modules/js-yaml/node_modules/argparse/package.json +0 -62
  440. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/README.md +0 -73
  441. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esparse.js +0 -117
  442. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/bin/esvalidate.js +0 -177
  443. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/esprima.js +0 -3908
  444. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/package.json +0 -69
  445. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/compat.js +0 -239
  446. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/reflect.js +0 -422
  447. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/run.js +0 -66
  448. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/runner.js +0 -387
  449. data/stdlib/nodejs/node_modules/js-yaml/node_modules/esprima/test/test.js +0 -20238
  450. data/stdlib/nodejs/node_modules/js-yaml/package.json +0 -83
@@ -0,0 +1,30 @@
1
+ module Scope0
2
+ module Scope1
3
+ module Scope2
4
+ module Scope3
5
+ module Scope4
6
+ module Scope5
7
+ module Scope6
8
+ module Scope7
9
+ module Scope8
10
+ module Scope9
11
+ module Scope10
12
+ module Scope11
13
+ module Scope12
14
+ module Scope13
15
+ module Scope14
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
@@ -6,6 +6,8 @@ module Opal
6
6
  class V8Context
7
7
  def initialize
8
8
  @builder = Opal::Builder.new
9
+ @history_path = File.expand_path('~/.opal-repl-history')
10
+ @history = File.exist?(@history_path)
9
11
  end
10
12
 
11
13
  def run(filename = nil)
@@ -17,6 +19,13 @@ module Opal
17
19
  abort 'opal-repl depends on therubyracer gem, which is not currently installed'
18
20
  end
19
21
 
22
+ # Patch V8::Object#respond_to? to avoid MRI warning
23
+ V8::Object.class_eval do
24
+ def respond_to?(method, private = false)
25
+ super or self[method] != nil
26
+ end
27
+ end
28
+
20
29
  @v8 = V8::Context.new
21
30
  @v8['console'] = self
22
31
  @v8.eval Opal::Builder.new.build('opal').to_s
@@ -38,6 +47,7 @@ module Opal
38
47
 
39
48
  def run_repl
40
49
  require 'readline'
50
+ load_history
41
51
 
42
52
  loop do
43
53
  # on SIGINT lets just return from the loop..
@@ -59,11 +69,23 @@ module Opal
59
69
  code = Opal::Builder.new.build_str(str, '(irb)', :irb => true, :const_missing => true)
60
70
  code.processed[0...-1].each { |c| @v8.eval(c.to_s) }
61
71
  @v8.eval "var $_result = #{code.processed.last.to_s} ($_result == null ? 'nil' : $_result.$inspect());"
62
- rescue => e
72
+ rescue Exception => e
63
73
  puts "#{e.message}\n\t#{e.backtrace.join("\n\t")}"
64
74
  end
65
75
 
76
+ def load_history
77
+ return unless @history
78
+ File.read(@history_path).lines.each { |line| Readline::HISTORY.push line.strip }
79
+ end
80
+
81
+ def dump_history
82
+ return unless @history
83
+ length = (Readline::HISTORY.size > 1000) ? 1000 : Readline::HISTORY.size
84
+ File.write(@history_path, Readline::HISTORY.to_a[-length..-1].join("\n"))
85
+ end
86
+
66
87
  def finish
88
+ dump_history
67
89
  @v8 = nil
68
90
  end
69
91
  end
@@ -38,7 +38,7 @@ and `FalseClass` classes from ruby.
38
38
  ```ruby
39
39
  "hello world!" # => "hello world!"
40
40
  :foo # => "foo"
41
- <<-EOS # => "\nHello there.\n"
41
+ <<-EOS # => "Hello there.\n"
42
42
  Hello there.
43
43
  EOS
44
44
  ```
@@ -119,11 +119,12 @@ end
119
119
  This would be compiled into:
120
120
 
121
121
  ```javascript
122
- var val = 42;
123
-
124
- if (val !== false && val !== nil) {
125
- return 3.142;
126
- }
122
+ val = 42;
123
+ if (val !== false && val !== nil && val != null) {
124
+ return 3.142
125
+ } else {
126
+ return nil
127
+ };
127
128
  ```
128
129
 
129
130
  This makes the generated truthy tests (`if` statements, `and` checks and
@@ -162,9 +163,9 @@ of JavaScript code that is wrapped inside an anonymous function. This
162
163
  looks similar to the following:
163
164
 
164
165
  ```javascript
165
- (function($opal) {
166
- var $klass = $opal.klass, self = $opal.top;
167
- // generated code
166
+ (function(Opal) {
167
+ // some setup code code
168
+ return self.$puts("foo")
168
169
  })(Opal);
169
170
  ```
170
171
 
@@ -177,14 +178,15 @@ puts "foo"
177
178
  This would compile directly into:
178
179
 
179
180
  ```javascript
180
- (function($opal) {
181
- var $klass = $opal.klass, self = $opal.top;
182
- self.$puts("foo");
181
+ (function(Opal) {
182
+ var self = Opal.top, $nesting = [], nil = Opal.nil, $breaker = Opal.breaker, $slice = Opal.slice;
183
+
184
+ Opal.add_stubs(['$puts']);
185
+ return self.$puts("foo")
183
186
  })(Opal);
184
187
  ```
185
188
 
186
- Most of the helpers are no longer present as they are not used in this
187
- example.
189
+ **TIP:** you can see the compiled code with this command: `opal --compile --no-exit --no-opal --eval 'puts "foo"'`
188
190
 
189
191
  ### Using compiled sources
190
192
 
@@ -2,11 +2,11 @@
2
2
 
3
3
  ### Why does Opal exist?
4
4
 
5
- To try and keep ruby relevant in a world where client-side apps are making javascript the primary development platform.
5
+ To try and keep ruby relevant in a world where client-side applications are making javascript the primary development platform.
6
6
 
7
7
  ### How compatible is Opal?
8
8
 
9
- We run opal against the [ruby spec](https://github.com/ruby/spec) as our primary testing setup. We try to make Opal as compatible as possible, whilst also taking into account restrictions of JavaScript when applicable. Opal supports the majority of ruby syntax features, as well as a very large part of the corelib implementation. We support method\_missing, modules, classes, instance\_exec, blocks, procs and lots lots more. Opal can compile and run Rspec unmodified, as well as self hosting the compiler at runtime.
9
+ We run opal against the [ruby spec](https://github.com/ruby/spec) as our primary testing setup. We try to make Opal as compatible as possible, whilst also taking into account restrictions of JavaScript when applicable. Opal supports the majority of ruby syntax features, as well as a very large part of the corelib implementation. We support method\_missing, modules, classes, instance\_exec, blocks, procs and lots lots more. Opal can compile and run RSpec unmodified, as well as self hosting the compiler at runtime.
10
10
 
11
11
  ### What version of ruby does Opal target?
12
12
 
@@ -14,4 +14,4 @@ We are running tests under ruby 2.0.0 conditions, but are mostly compatible with
14
14
 
15
15
  ### Why doesn't Opal support mutable strings?
16
16
 
17
- All strings in Opal are immutable because ruby strings just get compiled direclty into javascript strings, which are immutable. Wrapping ruby strings as a custom JavaScript object would add a lot of overhead as well as making interaction between ruby and javascript libraries more difficult.
17
+ All strings in Opal are immutable because ruby strings just get compiled directly into javascript strings, which are immutable. Wrapping ruby strings as a custom JavaScript object would add a lot of overhead as well as making interaction between ruby and javascript libraries more difficult.
@@ -51,7 +51,8 @@ $ bundle exec rake
51
51
  require 'bundler'
52
52
  Bundler.require
53
53
 
54
- run Opal::Server.new { |s|
54
+ sprockets_env = Opal::RSpec::SprocketsEnvironment.new
55
+ run Opal::Server.new(sprockets: sprockets_env) { |s|
55
56
  s.main = 'opal/rspec/sprockets_runner'
56
57
  s.append_path 'spec'
57
58
  s.debug = false
@@ -6,6 +6,12 @@ Opal does not support some language/runtime features of ruby. These are document
6
6
 
7
7
  For performance and ease of runtime features, all strings in Opal are immutable, i.e. `#<<`, `#gsub!`, etc. do not exist. Also, symbols are just strings. There is no class, runtime or feature difference between Symbols and Strings. Their syntaxes can be used interchangeably.
8
8
 
9
+ #### Integer / Float difference ####
10
+
11
+ In Opal, both integers and floats belong to same class `Number` (using JavaScript native numbers). So `1 / 4` is `0.25` (not `0`) and `4.0 / 2` is `2` (not `2.0`).
12
+
13
+ `Number` is a subclass of `Numeric`, like `Complex` and `Rational`.
14
+
9
15
  #### Encodings ####
10
16
 
11
17
  Encodings only have a very small implementation inside Opal.
@@ -18,10 +24,6 @@ JavaScript does not have a native `Thread` implementation, so they are not prese
18
24
 
19
25
  Opal does not currently support frozen objects, but has placeholder methods to prevent other libraries breaking when expecting these methods. Opal could support frozen objects in the future once a similar implementation becomes available across JavaScript runtimes.
20
26
 
21
- #### `method_added` and `method_removed` hooks ####
22
-
23
- These are not *currently* supported by Opal, but this is considered a bug and will be implemented soon.
24
-
25
27
  #### Private, Public and Protected methods ####
26
28
 
27
29
  All methods in Opal are defined as `public` to avoid additional runtime overhead. `Module#private` and `Module#protected` exist as just placeholder methods and are no-op methods.
@@ -1,3 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
+ gem 'rack'
3
4
  gem 'opal', :path => '../../'
@@ -1,13 +1,24 @@
1
1
  require 'opal'
2
2
  require 'user'
3
+ require 'opal/platform'
3
4
 
4
5
  module MyApp
5
6
  class Application
6
7
  def initialize
7
- @user = User.new('Bill')
8
- @user.authenticated?
8
+ @user = User.new('Bob')
9
+ end
10
+
11
+ def title
12
+ "#{@user.name} is #{:not unless @user.authenticated?} authenticated"
9
13
  end
10
14
  end
11
15
  end
12
16
 
13
- MyApp::Application.new
17
+ $app = MyApp::Application.new
18
+
19
+ require 'native'
20
+
21
+ $$[:document][:title] = "#{$app.title}"
22
+
23
+ bill = User.new('Bill')
24
+ bill.authenticated?
@@ -4,6 +4,8 @@ class User
4
4
  @name = name
5
5
  end
6
6
 
7
+ attr_reader :name
8
+
7
9
  def authenticated?
8
10
  if admin? or special_permission?
9
11
  true
@@ -10,7 +10,7 @@ Bundler.require
10
10
 
11
11
  # with gems like opal-jquery or opal-browser you could manipulate the dom directly
12
12
 
13
- run Opal::Server.new { |s|
13
+ run Opal::SimpleServer.new { |s|
14
14
  # the name of the ruby file to load. To use more files they must be required from here (see app)
15
15
  s.main = 'application'
16
16
  # the directory where the code is (add to opal load path )
@@ -1,6 +1,7 @@
1
1
  <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
+ <meta charset="utf-8">
4
5
  <title>opal-sprockets demo</title>
5
6
 
6
7
  <%= javascript_include_tag 'application' %>
@@ -1,12 +1,17 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/config'
1
3
  require 'opal/compiler'
2
4
  require 'opal/builder'
3
5
  require 'opal/erb'
4
- require 'opal/sprockets'
5
6
  require 'opal/paths'
6
7
  require 'opal/version'
7
8
  require 'opal/errors'
9
+ require 'opal/source_map'
10
+ require 'opal/deprecations'
8
11
 
9
12
  # Opal is a ruby to javascript compiler, with a runtime for running
10
13
  # in any JavaScript environment.
11
14
  module Opal
15
+ autoload :Server, 'opal/server'
16
+ autoload :SimpleServer, 'opal/simple_server'
12
17
  end
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+ require 'opal/ast/node'
3
+ require 'parser/ruby23'
4
+
5
+ module Opal
6
+ module AST
7
+ class Builder < ::Parser::Builders::Default
8
+ def string_value(token)
9
+ token[0]
10
+ end
11
+
12
+ def n(type, children, location)
13
+ ::Opal::AST::Node.new(type, children, location: location)
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+ require 'ast'
3
+ require 'parser/ast/node'
4
+
5
+ module Opal
6
+ module AST
7
+ class Node < ::Parser::AST::Node
8
+ attr_reader :meta
9
+
10
+ def assign_properties(properties)
11
+ if meta = properties[:meta]
12
+ meta = meta.dup if meta.frozen?
13
+ @meta.merge!(meta)
14
+ else
15
+ @meta ||= {}
16
+ end
17
+
18
+ super
19
+ end
20
+
21
+ def line
22
+ loc.line if loc
23
+ end
24
+
25
+ def column
26
+ loc.column if loc
27
+ end
28
+ end
29
+ end
30
+ end
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/path_reader'
2
3
  require 'opal/builder_processors'
3
4
  require 'opal/paths'
5
+ require 'opal/config'
4
6
  require 'set'
5
7
 
6
8
  module Opal
@@ -20,7 +22,7 @@ module Opal
20
22
  @processors ||= DEFAULT_PROCESSORS
21
23
  @path_reader ||= PathReader.new
22
24
  @prerequired ||= []
23
- @compiler_options ||= {}
25
+ @compiler_options ||= Opal::Config.compiler_options
24
26
  @default_processor ||= RubyProcessor
25
27
 
26
28
  @processed = []
@@ -114,8 +116,17 @@ module Opal
114
116
  end
115
117
 
116
118
  def read(path)
117
- path_reader.read(path) or
118
- raise MissingRequire, "can't find file: #{path.inspect} in #{path_reader.paths.inspect}"
119
+ path_reader.read(path) or begin
120
+ message = "can't find file: #{path.inspect} in #{path_reader.paths.inspect}"
121
+
122
+ case compiler_options[:dynamic_require_severity]
123
+ when :raise then raise MissingRequire, message
124
+ when :warning then warn message
125
+ else # noop
126
+ end
127
+
128
+ return "raise LoadError, #{message.inspect}"
129
+ end
119
130
  end
120
131
 
121
132
  def process_require(filename, options)
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal/compiler'
2
3
  require 'opal/erb'
3
4
  require 'source_map'
@@ -1,5 +1,5 @@
1
+ # frozen_string_literal: true
1
2
  require 'opal'
2
- require 'rack'
3
3
  require 'opal/builder'
4
4
  require 'opal/cli_runners'
5
5
 
@@ -9,18 +9,6 @@ module Opal
9
9
  :output, :requires, :gems, :stubs, :verbose, :port, :preload,
10
10
  :filename, :debug, :no_exit, :lib_only
11
11
 
12
- def compile?
13
- @compile
14
- end
15
-
16
- def sexp?
17
- @sexp
18
- end
19
-
20
- def skip_opal_require?
21
- @skip_opal_require
22
- end
23
-
24
12
  class << self
25
13
  attr_accessor :stdout
26
14
  end
@@ -29,8 +17,8 @@ module Opal
29
17
  options ||= {}
30
18
 
31
19
  # Runner
32
- @runner_type = options.delete(:runner) || :nodejs
33
- @port = options.delete(:port) || 3000
20
+ @runner_type = options.delete(:runner) || :nodejs
21
+ @port = options.delete(:port) || 3000
34
22
 
35
23
  @options = options
36
24
  @compile = !!options.delete(:compile)
@@ -41,7 +29,6 @@ module Opal
41
29
  @lib_only = options.delete(:lib_only)
42
30
  @argv = options.delete(:argv) || []
43
31
  @evals = options.delete(:evals) || []
44
- @requires = options.delete(:requires) || []
45
32
  @load_paths = options.delete(:load_paths) || []
46
33
  @gems = options.delete(:gems) || []
47
34
  @stubs = options.delete(:stubs) || []
@@ -50,7 +37,10 @@ module Opal
50
37
  @verbose = options.fetch(:verbose, false); options.delete(:verbose)
51
38
  @debug = options.fetch(:debug, false); options.delete(:debug)
52
39
  @filename = options.fetch(:filename) { @file && @file.path }; options.delete(:filename)
53
- @skip_opal_require = options.delete(:skip_opal_require)
40
+
41
+ @requires = options.delete(:requires) || []
42
+ @requires.unshift('opal') unless options.delete(:skip_opal_require)
43
+
54
44
  @compiler_options = Hash[
55
45
  *compiler_option_names.map do |option|
56
46
  key = option.to_sym
@@ -60,18 +50,23 @@ module Opal
60
50
  end.compact.flatten
61
51
  ]
62
52
 
53
+ raise ArgumentError, "no libraries to compile" if @lib_only and @requires.length == 0
63
54
  raise ArgumentError, "no runnable code provided (evals or file)" if @evals.empty? and @file.nil? and not(@lib_only)
64
55
  raise ArgumentError, "can't accept evals or file in `library only` mode" if (@evals.any? or @file) and @lib_only
65
56
  raise ArgumentError, "unknown options: #{options.inspect}" unless @options.empty?
66
57
  end
67
58
 
68
59
  def run
69
- case
70
- when @map; show_source_map
71
- when sexp?; show_sexp
72
- when compile?; show_compiled_source
73
- else run_code
74
- end
60
+ return show_sexp if @sexp
61
+
62
+ compiled_source = builder.to_s
63
+
64
+ File.write @map, builder.source_map if @map
65
+
66
+ return puts compiled_source if @compile
67
+
68
+ runner.run(compiled_source, argv)
69
+ @exit_status = runner.exit_status
75
70
  end
76
71
 
77
72
  def runner
@@ -83,65 +78,51 @@ module Opal
83
78
  end
84
79
  end
85
80
 
86
- def run_code
87
- runner.run(compiled_source, argv)
88
- @exit_status = runner.exit_status
89
- end
90
-
91
81
  attr_reader :exit_status
92
82
 
93
- def build
83
+ def builder
84
+ @builder ||= create_builder
85
+ end
86
+
87
+ def create_builder
94
88
  builder = Opal::Builder.new stubs: stubs, compiler_options: compiler_options
89
+
90
+ # --include
95
91
  builder.append_paths(*load_paths)
92
+
93
+ # --gem
96
94
  gems.each { |gem_name| builder.use_gem gem_name }
97
95
 
98
- builder.build 'opal' unless skip_opal_require?
96
+ # --require
97
+ requires.each { |required| builder.build(required) }
99
98
 
99
+ # --preload
100
100
  preload.each { |path| builder.build_require(path) }
101
101
 
102
- # FLAGS
102
+ # --verbose
103
103
  builder.build_str '$VERBOSE = true', '(flags)' if verbose
104
- builder.build_str '$DEBUG = true', '(flags)' if debug
105
104
 
106
- # REQUIRES: -r
107
- requires.each do |local_require|
108
- builder.build(local_require)
109
- end
105
+ # --debug
106
+ builder.build_str '$DEBUG = true', '(flags)' if debug
110
107
 
111
- unless lib_only
112
- evals_or_file do |contents, filename|
113
- builder.build_str(contents, filename)
114
- end
115
- end
108
+ # --eval / stdin / file
109
+ evals_or_file { |source, filename| builder.build_str(source, filename) }
116
110
 
111
+ # --no-exit
117
112
  builder.build_str 'Kernel.exit', '(exit)' unless no_exit
118
113
 
119
114
  builder
120
115
  end
121
116
 
122
- def compiled_source
123
- build.to_s
124
- end
125
-
126
- def show_compiled_source
127
- puts compiled_source
128
- end
129
-
130
117
  def show_sexp
131
118
  evals_or_file do |contents, filename|
132
- sexp = Opal::Parser.new.parse(contents, filename)
119
+ buffer = ::Parser::Source::Buffer.new(filename)
120
+ buffer.source = contents
121
+ sexp = Opal::Parser.default_parser.parse(buffer)
133
122
  puts sexp.inspect
134
123
  end
135
124
  end
136
125
 
137
- def show_source_map
138
- evals_or_file do |contents, filename|
139
- compiler = Opal::Compiler.new(contents, options.merge(file: filename))
140
- compiler.compile
141
- puts compiler.source_map.to_json
142
- end
143
- end
144
-
145
126
  def compiler_option_names
146
127
  %w[
147
128
  method_missing
@@ -150,12 +131,17 @@ module Opal
150
131
  source_map_enabled
151
132
  irb_enabled
152
133
  inline_operators
134
+ enable_source_location
135
+ parse_comments
153
136
  ]
154
137
  end
155
138
 
156
- # Internal: Yelds a string of source code and the proper filename for either
139
+ # Internal: Yields a string of source code and the proper filename for either
157
140
  # evals, stdin or a filepath.
158
141
  def evals_or_file
142
+ # --library
143
+ return if lib_only
144
+
159
145
  if evals.any?
160
146
  yield evals.join("\n"), '-e'
161
147
  else