opal 0.9.4 → 0.10.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitattributes +1 -0
- data/.gitignore +2 -3
- data/.gitmodules +5 -2
- data/.jshintrc +1 -8
- data/.rspec +1 -1
- data/.travis.yml +15 -23
- data/CHANGELOG.md +511 -326
- data/CODE_OF_CONDUCT.md +13 -15
- data/CONTRIBUTING.md +26 -216
- data/Gemfile +20 -12
- data/Guardfile +2 -2
- data/HACKING.md +230 -0
- data/README.md +6 -7
- data/bin/opal-mspec +1 -1
- data/config.ru +2 -2
- data/docs/faq.md +1 -1
- data/docs/source_maps.md +1 -1
- data/lib/opal.rb +1 -0
- data/lib/opal/builder.rb +1 -1
- data/lib/opal/cli.rb +30 -28
- data/lib/opal/cli_options.rb +3 -0
- data/lib/opal/cli_runners.rb +14 -1
- data/lib/opal/cli_runners/{apple_script.rb → applescript.rb} +3 -3
- data/lib/opal/cli_runners/nashorn.rb +2 -2
- data/lib/opal/cli_runners/nodejs.rb +2 -2
- data/lib/opal/cli_runners/phantom.js +24 -0
- data/lib/opal/cli_runners/phantomjs.rb +10 -10
- data/lib/opal/cli_runners/server.rb +3 -3
- data/lib/opal/compiler.rb +43 -4
- data/lib/opal/config.rb +3 -1
- data/lib/opal/errors.rb +13 -0
- data/lib/opal/fragment.rb +0 -13
- data/lib/opal/nodes.rb +10 -0
- data/lib/opal/nodes/args/initialize_kwargs.rb +28 -0
- data/lib/opal/nodes/args/kwarg.rb +29 -0
- data/lib/opal/nodes/args/kwoptarg.rb +29 -0
- data/lib/opal/nodes/args/kwrestarg.rb +39 -0
- data/lib/opal/nodes/args/mlhsarg.rb +79 -0
- data/lib/opal/nodes/args/normarg.rb +26 -0
- data/lib/opal/nodes/args/optarg.rb +27 -0
- data/lib/opal/nodes/args/post_args.rb +200 -0
- data/lib/opal/nodes/args/post_kwargs.rb +31 -0
- data/lib/opal/nodes/args/restarg.rb +33 -0
- data/lib/opal/nodes/base.rb +12 -0
- data/lib/opal/nodes/call.rb +92 -33
- data/lib/opal/nodes/def.rb +26 -169
- data/lib/opal/nodes/hash.rb +10 -4
- data/lib/opal/nodes/helpers.rb +6 -3
- data/lib/opal/nodes/inline_args.rb +61 -0
- data/lib/opal/nodes/iter.rb +73 -82
- data/lib/opal/nodes/logic.rb +12 -2
- data/lib/opal/nodes/masgn.rb +1 -2
- data/lib/opal/nodes/node_with_args.rb +141 -0
- data/lib/opal/nodes/rescue.rb +121 -43
- data/lib/opal/nodes/scope.rb +24 -5
- data/lib/opal/nodes/super.rb +122 -54
- data/lib/opal/nodes/top.rb +0 -12
- data/lib/opal/nodes/yield.rb +2 -13
- data/lib/opal/parser.rb +67 -39
- data/lib/opal/parser/grammar.rb +3319 -2961
- data/lib/opal/parser/grammar.y +234 -46
- data/lib/opal/parser/lexer.rb +105 -17
- data/lib/opal/parser/sexp.rb +4 -0
- data/lib/opal/paths.rb +4 -0
- data/lib/opal/regexp_anchors.rb +19 -1
- data/lib/opal/sprockets.rb +21 -18
- data/lib/opal/sprockets/environment.rb +0 -8
- data/lib/opal/sprockets/processor.rb +13 -16
- data/lib/opal/sprockets/server.rb +6 -12
- data/lib/opal/version.rb +1 -1
- data/opal.gemspec +1 -0
- data/opal/corelib/array.rb +209 -131
- data/opal/corelib/basic_object.rb +7 -3
- data/opal/corelib/class.rb +11 -17
- data/opal/corelib/constants.rb +2 -2
- data/opal/corelib/enumerable.rb +178 -355
- data/opal/corelib/enumerator.rb +3 -46
- data/opal/corelib/error.rb +2 -2
- data/opal/corelib/file.rb +13 -1
- data/opal/corelib/hash.rb +26 -56
- data/opal/corelib/helpers.rb +10 -0
- data/opal/corelib/kernel.rb +6 -3
- data/opal/corelib/module.rb +62 -31
- data/opal/corelib/number.rb +7 -16
- data/opal/corelib/proc.rb +24 -9
- data/opal/corelib/range.rb +4 -13
- data/opal/corelib/runtime.js +515 -378
- data/opal/corelib/string.rb +21 -49
- data/opal/corelib/struct.rb +50 -35
- data/opal/corelib/unsupported.rb +18 -30
- data/opal/opal.rb +0 -1
- data/opal/opal/mini.rb +1 -0
- data/spec/README.md +6 -4
- data/spec/filters/bugs/array.rb +0 -42
- data/spec/filters/bugs/basicobject.rb +0 -2
- data/spec/filters/bugs/bigdecimal.rb +160 -0
- data/spec/filters/bugs/class.rb +0 -5
- data/spec/filters/bugs/date.rb +1 -48
- data/spec/filters/bugs/enumerable.rb +4 -12
- data/spec/filters/bugs/enumerator.rb +0 -1
- data/spec/filters/bugs/exception.rb +4 -3
- data/spec/filters/bugs/float.rb +4 -2
- data/spec/filters/bugs/kernel.rb +25 -10
- data/spec/filters/bugs/language.rb +119 -68
- data/spec/filters/bugs/method.rb +135 -0
- data/spec/filters/bugs/module.rb +13 -28
- data/spec/filters/bugs/proc.rb +18 -8
- data/spec/filters/bugs/range.rb +0 -3
- data/spec/filters/bugs/rational.rb +4 -0
- data/spec/filters/bugs/regexp.rb +68 -36
- data/spec/filters/bugs/string.rb +1 -1
- data/spec/filters/bugs/struct.rb +0 -12
- data/spec/filters/bugs/time.rb +1 -0
- data/spec/filters/bugs/unboundmethod.rb +2 -1
- data/spec/filters/unsupported/freeze.rb +3 -1
- data/spec/filters/unsupported/language.rb +0 -7
- data/spec/filters/unsupported/privacy.rb +7 -6
- data/spec/filters/unsupported/string.rb +10 -0
- data/spec/filters/unsupported/struct.rb +3 -0
- data/spec/filters/unsupported/symbol.rb +9 -0
- data/spec/filters/unsupported/taint.rb +0 -3
- data/spec/filters/unsupported/thread.rb +1 -0
- data/spec/lib/cli_runners/phantomjs_spec.rb +39 -0
- data/spec/lib/cli_spec.rb +42 -1
- data/spec/lib/compiler/call_spec.rb +700 -0
- data/spec/lib/compiler_spec.rb +46 -28
- data/spec/lib/config_spec.rb +13 -0
- data/spec/lib/parser/call_spec.rb +18 -0
- data/spec/lib/parser/def_spec.rb +29 -0
- data/spec/lib/parser/iter_spec.rb +15 -15
- data/spec/lib/parser/lambda_spec.rb +153 -12
- data/spec/lib/parser/string_spec.rb +5 -0
- data/spec/lib/parser/undef_spec.rb +1 -1
- data/spec/lib/parser/variables_spec.rb +24 -0
- data/spec/lib/paths_spec.rb +12 -5
- data/spec/lib/spec_helper.rb +5 -0
- data/spec/lib/sprockets/processor_spec.rb +6 -5
- data/spec/lib/sprockets_spec.rb +8 -0
- data/spec/mspec-opal/formatters.rb +188 -0
- data/spec/mspec-opal/runner.rb +193 -0
- data/spec/opal/core/enumerator/with_index_spec.rb +6 -0
- data/spec/opal/core/kernel/define_singleton_method_spec.rb +1 -1
- data/spec/opal/core/kernel/instance_variables_spec.rb +14 -0
- data/spec/opal/core/kernel/loop_spec.rb +1 -1
- data/spec/opal/core/kernel/raise_spec.rb +1 -1
- data/spec/opal/core/language/heredoc_spec.rb +42 -0
- data/spec/opal/core/language/rescue_spec.rb +18 -0
- data/spec/opal/core/language_spec.rb +22 -0
- data/spec/opal/core/module/const_defined_spec.rb +1 -2
- data/spec/opal/core/module/name_spec.rb +6 -0
- data/spec/opal/core/runtime/bridged_classes_spec.rb +14 -2
- data/spec/opal/core/runtime/rescue_spec.rb +12 -2
- data/spec/opal/core/runtime/super_spec.rb +1 -0
- data/spec/opal/core/string_spec.rb +21 -0
- data/spec/opal/stdlib/js_spec.rb +1 -1
- data/spec/opal/stdlib/native/hash_spec.rb +7 -0
- data/spec/opal/stdlib/promise/always_spec.rb +24 -5
- data/spec/opal/stdlib/promise/rescue_spec.rb +15 -6
- data/spec/opal/stdlib/promise/then_spec.rb +13 -5
- data/spec/opal/stdlib/promise/trace_spec.rb +5 -6
- data/spec/opal/stdlib/strscan/scan_spec.rb +1 -1
- data/spec/ruby_specs +122 -0
- data/spec/spec_helper.rb +3 -15
- data/stdlib/base64.rb +51 -121
- data/stdlib/bigdecimal.rb +231 -0
- data/stdlib/bigdecimal/bignumber.js.rb +11 -0
- data/stdlib/bigdecimal/kernel.rb +5 -0
- data/stdlib/date.rb +252 -10
- data/stdlib/native.rb +38 -38
- data/stdlib/nodejs/dir.rb +8 -6
- data/stdlib/nodejs/file.rb +28 -3
- data/stdlib/nodejs/node_modules/.bin/js-yaml +1 -0
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esparse +1 -0
- data/stdlib/nodejs/node_modules/js-yaml/node_modules/.bin/esvalidate +1 -0
- data/stdlib/nodejs/require.rb +1 -1
- data/stdlib/nodejs/yaml.rb +3 -2
- data/stdlib/opal-parser.rb +7 -2
- data/stdlib/pathname.rb +23 -1
- data/stdlib/phantomjs.rb +10 -0
- data/stdlib/promise.rb +38 -23
- data/tasks/building.rake +3 -3
- data/tasks/testing.rake +27 -14
- data/tasks/testing/mspec_special_calls.rb +1 -1
- data/tasks/testing/sprockets-phantomjs.js +4 -0
- data/test/opal/test_keyword.rb +110 -110
- data/test/opal/unsupported_and_bugs.rb +30 -0
- data/vendored-minitest/minitest/assertions.rb +1 -1
- metadata +65 -15
- data/.spectator +0 -2
- data/.spectator-mspec +0 -3
- data/opal/corelib/array/inheritance.rb +0 -127
- data/spec/rubyspecs +0 -139
data/lib/opal/parser/lexer.rb
CHANGED
@@ -113,7 +113,9 @@ module Opal
|
|
113
113
|
end
|
114
114
|
|
115
115
|
def cmdarg_push(n)
|
116
|
-
|
116
|
+
unless @lparen_arg_seen
|
117
|
+
@cmdarg = (@cmdarg << 1) | (n & 1)
|
118
|
+
end
|
117
119
|
end
|
118
120
|
|
119
121
|
def cmdarg_pop
|
@@ -263,6 +265,22 @@ module Opal
|
|
263
265
|
scanner[1].to_i(16).chr
|
264
266
|
elsif scan(/u([0-9a-zA-Z]{1,4})/)
|
265
267
|
scanner[1].to_i(16).chr(Encoding::UTF_8)
|
268
|
+
elsif scan(/C-([a-zA-Z])/)
|
269
|
+
# Control character ?\C-z or ?\C-Z
|
270
|
+
# ?\C-a = "\u0001" = 1
|
271
|
+
(scanner[1].downcase.ord - 'a'.ord + '1'.to_i(16)).chr(Encoding::UTF_8)
|
272
|
+
elsif scan(/C-([0-9])/)
|
273
|
+
# Control character ?\C-0
|
274
|
+
# ?\C-0 = "\u0010"
|
275
|
+
(scanner[1].ord - '0'.ord + '10'.to_i(16)).chr(Encoding::UTF_8)
|
276
|
+
elsif scan(/M-\\C-([a-zA-Z])/)
|
277
|
+
# Meta control character ?\M-\C-z or ?\M-\C-Z
|
278
|
+
# ?\M-\C-z = "\x81"
|
279
|
+
(scanner[1].downcase.ord - 'a'.ord + '81'.to_i(16)).chr(Encoding::UTF_8)
|
280
|
+
elsif scan(/M-\\C-([0-9])/)
|
281
|
+
# Meta control character ?\M-\C-0
|
282
|
+
# ?\M-\C-0 = "\x90"
|
283
|
+
(scanner[1].ord - '0'.ord + '90'.to_i(16)).chr(Encoding::UTF_8)
|
266
284
|
else
|
267
285
|
# escaped char doesnt need escaping, so just return it
|
268
286
|
scan(/./)
|
@@ -279,7 +297,7 @@ module Opal
|
|
279
297
|
|
280
298
|
def here_document(str_parse)
|
281
299
|
eos_regx = /[ \t]*#{Regexp.escape(str_parse[:term])}(\r*\n|$)/
|
282
|
-
expand =
|
300
|
+
expand = (str_parse[:func] & STR_FUNC_EXPAND) != 0
|
283
301
|
|
284
302
|
# Don't escape single-quoted heredoc identifiers
|
285
303
|
escape = str_parse[:func] != STR_SQUOTE
|
@@ -327,6 +345,15 @@ module Opal
|
|
327
345
|
complete_str = str_buffer.join ''
|
328
346
|
@line += complete_str.count("\n")
|
329
347
|
|
348
|
+
if str_parse[:squiggly_heredoc]
|
349
|
+
# "squiggly" heredoc should be post-processed.
|
350
|
+
# here we remove the indentation of the least-indented
|
351
|
+
# line from each line of the content
|
352
|
+
lines = complete_str.lines
|
353
|
+
min_indent = lines.map { |line| line.scan(/#{REGEXP_START}\s+/)[0].length }.min
|
354
|
+
complete_str = lines.map { |line| line[min_indent, line.length] }.join
|
355
|
+
end
|
356
|
+
|
330
357
|
self.yylval = complete_str
|
331
358
|
return :tSTRING_CONTENT
|
332
359
|
end
|
@@ -402,6 +429,14 @@ module Opal
|
|
402
429
|
return :tSTRING_DBEG
|
403
430
|
else
|
404
431
|
str_buffer << scanner.matched
|
432
|
+
|
433
|
+
# For qword without interpolation containing its :paren symbols
|
434
|
+
# like %w(()) ow %i{{}} we should mark our str_parse expression
|
435
|
+
# as nesting. As a result, #add_string_content will try to read 1 more
|
436
|
+
# closing ')' or '}' from the string
|
437
|
+
if qwords && scanner.matched.match(Regexp.new(Regexp.escape(str_parse[:paren])))
|
438
|
+
str_parse[:nesting] += 1
|
439
|
+
end
|
405
440
|
end
|
406
441
|
|
407
442
|
# causes error, so we will just collect it later on with other text
|
@@ -514,12 +549,34 @@ module Opal
|
|
514
549
|
end
|
515
550
|
|
516
551
|
def heredoc_identifier
|
517
|
-
|
518
|
-
|
519
|
-
|
552
|
+
starts_with_minus = !!scan(/-/) # optional heredoc beginning
|
553
|
+
|
554
|
+
squiggly_heredoc = !starts_with_minus && !!scan(/~/)
|
555
|
+
|
556
|
+
# Escaping character can be ' or " or can be blank
|
557
|
+
scan(/(['"]?)/)
|
558
|
+
escape_char = @scanner[0]
|
559
|
+
|
560
|
+
if escape_char != ''
|
561
|
+
# When heredoc identified starts with ' or "
|
562
|
+
# we should read until the same closing character appears
|
563
|
+
# again in the source
|
564
|
+
regexp = Regexp.new("([^#{escape_char}]+)")
|
565
|
+
else
|
566
|
+
# Otherwise we read all characters until whitespace found
|
567
|
+
regexp = /\w+/
|
568
|
+
end
|
569
|
+
|
570
|
+
if scan(regexp)
|
571
|
+
escape_method = (escape_char == "'") ? STR_SQUOTE : STR_DQUOTE
|
572
|
+
heredoc = @scanner[0]
|
520
573
|
|
521
574
|
self.strterm = new_strterm(escape_method, heredoc, heredoc)
|
522
575
|
self.strterm[:type] = :heredoc
|
576
|
+
self.strterm[:squiggly_heredoc] = squiggly_heredoc
|
577
|
+
|
578
|
+
# read closing ' or " character
|
579
|
+
scan(Regexp.new(escape_char)) if escape_char
|
523
580
|
|
524
581
|
# if ruby code at end of line after heredoc, we have to store it to
|
525
582
|
# parse after heredoc is finished parsing
|
@@ -629,6 +686,8 @@ module Opal
|
|
629
686
|
@lex_state = :expr_end
|
630
687
|
end
|
631
688
|
|
689
|
+
self.yylval = matched
|
690
|
+
|
632
691
|
return matched =~ /#{REGEXP_START}[A-Z]/ ? :tCONSTANT : :tIDENTIFIER
|
633
692
|
end
|
634
693
|
|
@@ -695,8 +754,13 @@ module Opal
|
|
695
754
|
if scan(/\*\*\=/)
|
696
755
|
return new_op_asgn('**')
|
697
756
|
elsif scan(/\*\*/)
|
698
|
-
|
699
|
-
|
757
|
+
if [:expr_beg, :expr_mid].include? @lex_state
|
758
|
+
# kwsplat like **{ a: 1 }
|
759
|
+
return :tDSTAR
|
760
|
+
else
|
761
|
+
self.set_arg_state
|
762
|
+
return :tPOW
|
763
|
+
end
|
700
764
|
elsif scan(/\*\=/)
|
701
765
|
return new_op_asgn('*')
|
702
766
|
else
|
@@ -835,7 +899,7 @@ module Opal
|
|
835
899
|
self.set_arg_state
|
836
900
|
return :tPIPE
|
837
901
|
|
838
|
-
elsif scan(/\%[
|
902
|
+
elsif scan(/\%[QqWwIixrs]/)
|
839
903
|
str_type = scanner.matched[1, 1]
|
840
904
|
paren = term = scan(/./)
|
841
905
|
|
@@ -844,7 +908,8 @@ module Opal
|
|
844
908
|
when '[' then term = ']'
|
845
909
|
when '{' then term = '}'
|
846
910
|
when '<' then term = '>'
|
847
|
-
else
|
911
|
+
else
|
912
|
+
paren = "\0"
|
848
913
|
end
|
849
914
|
|
850
915
|
token, func = case str_type
|
@@ -852,7 +917,7 @@ module Opal
|
|
852
917
|
[:tSTRING_BEG, STR_DQUOTE]
|
853
918
|
when 'q'
|
854
919
|
[:tSTRING_BEG, STR_SQUOTE]
|
855
|
-
when 'W'
|
920
|
+
when 'W', 'I'
|
856
921
|
skip(/\s*/)
|
857
922
|
[:tWORDS_BEG, STR_DWORD]
|
858
923
|
when 'w', 'i'
|
@@ -893,15 +958,27 @@ module Opal
|
|
893
958
|
return :tDIVIDE
|
894
959
|
|
895
960
|
elsif scan(/\%/)
|
896
|
-
if
|
961
|
+
if check(/\=/) && @lex_state != :expr_beg
|
962
|
+
scan(/\=/)
|
897
963
|
return new_op_asgn('%')
|
898
964
|
elsif check(/[^\s]/)
|
965
|
+
|
899
966
|
if @lex_state == :expr_beg or
|
900
|
-
|
967
|
+
@lex_state == :expr_arg && @space_seen or
|
901
968
|
@lex_state == :expr_mid
|
902
|
-
|
903
|
-
|
904
|
-
|
969
|
+
|
970
|
+
paren = term = scan(/./)
|
971
|
+
|
972
|
+
case term
|
973
|
+
when '(' then term = ')'
|
974
|
+
when '[' then term = ']'
|
975
|
+
when '{' then term = '}'
|
976
|
+
when '<' then term = '>'
|
977
|
+
else
|
978
|
+
paren = "\0"
|
979
|
+
end
|
980
|
+
|
981
|
+
self.strterm = new_strterm2(STR_DQUOTE, term, paren)
|
905
982
|
return :tSTRING_BEG
|
906
983
|
end
|
907
984
|
end
|
@@ -920,9 +997,12 @@ module Opal
|
|
920
997
|
|
921
998
|
elsif scan(/\(/)
|
922
999
|
result = scanner.matched
|
1000
|
+
@lparen_arg_seen = false
|
1001
|
+
|
923
1002
|
if beg?
|
924
1003
|
result = :tLPAREN
|
925
1004
|
elsif @space_seen && arg?
|
1005
|
+
@lparen_arg_seen = true
|
926
1006
|
result = :tLPAREN_ARG
|
927
1007
|
else
|
928
1008
|
result = :tLPAREN2
|
@@ -1185,6 +1265,9 @@ module Opal
|
|
1185
1265
|
elsif scan(/\$\w+/)
|
1186
1266
|
@lex_state = :expr_end
|
1187
1267
|
return :tGVAR
|
1268
|
+
elsif scan(/\$-[0-9a-zA-Z]/)
|
1269
|
+
@lex_state = :expr_end
|
1270
|
+
return :tGVAR
|
1188
1271
|
else
|
1189
1272
|
raise "Bad gvar name: #{scanner.peek(5).inspect}"
|
1190
1273
|
end
|
@@ -1214,7 +1297,12 @@ module Opal
|
|
1214
1297
|
return :tLAMBEG
|
1215
1298
|
|
1216
1299
|
elsif arg? or @lex_state == :expr_end
|
1217
|
-
|
1300
|
+
if @lparen_arg_seen
|
1301
|
+
@lparen_arg_seen = false
|
1302
|
+
result = :tLBRACE_ARG
|
1303
|
+
else
|
1304
|
+
result = :tLCURLY
|
1305
|
+
end
|
1218
1306
|
elsif @lex_state == :expr_endarg
|
1219
1307
|
result = :LBRACE_ARG
|
1220
1308
|
else
|
@@ -1240,7 +1328,7 @@ module Opal
|
|
1240
1328
|
elsif check(/[0-9]/)
|
1241
1329
|
return process_numeric
|
1242
1330
|
|
1243
|
-
elsif scan(
|
1331
|
+
elsif scan(IDENTIFIER_REGEXP)
|
1244
1332
|
return process_identifier scanner.matched, cmd_start
|
1245
1333
|
end
|
1246
1334
|
|
data/lib/opal/parser/sexp.rb
CHANGED
data/lib/opal/paths.rb
CHANGED
@@ -33,6 +33,8 @@ module Opal
|
|
33
33
|
# @param gem_name [String] the name of the gem
|
34
34
|
# @param include_dependencies [Boolean] whether or not to add recursively
|
35
35
|
# the gem's dependencies
|
36
|
+
# @raise [Opal::GemNotFound]
|
37
|
+
# if gem or any of its runtime dependencies not found
|
36
38
|
def use_gem(gem_name, include_dependencies = true)
|
37
39
|
append_paths(*require_paths_for_gem(gem_name, include_dependencies))
|
38
40
|
end
|
@@ -41,7 +43,9 @@ module Opal
|
|
41
43
|
|
42
44
|
def require_paths_for_gem(gem_name, include_dependencies)
|
43
45
|
paths = []
|
46
|
+
|
44
47
|
spec = Gem::Specification.find_by_name(gem_name)
|
48
|
+
raise GemNotFound, gem_name unless spec
|
45
49
|
|
46
50
|
spec.runtime_dependencies.each do |dependency|
|
47
51
|
paths += require_paths_for_gem(dependency.name, include_dependencies)
|
data/lib/opal/regexp_anchors.rb
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
module Opal
|
2
2
|
REGEXP_START = RUBY_ENGINE == 'opal' ? '^' : '\A'.freeze
|
3
|
-
REGEXP_END = RUBY_ENGINE == 'opal' ? '$' : '\z'.freeze
|
3
|
+
REGEXP_END = RUBY_ENGINE == 'opal' ? '$' : '\z'.freeze
|
4
|
+
|
5
|
+
# Unicode characters in ranges
|
6
|
+
# \u0001 - \u0020 (blank unicode characters + space)
|
7
|
+
# \u0022 - \u002F ("#$%&'()*+,-./ chars)
|
8
|
+
# \u003A - \u003E (:;<=> chars)
|
9
|
+
# \u0040 (@ char)
|
10
|
+
# \u005B - \u005E ([\]^ chars)
|
11
|
+
# \u0060 (` char)
|
12
|
+
# \u007B - \u007F ({|}~ chars})
|
13
|
+
# are not allowed to be used in identifier in any form
|
14
|
+
# This regexp contains a common rule for filtering Ruby identifiers
|
15
|
+
FORBIDDEN_IDENTIFIER_CHARS = "\\u0001-\\u0020\\u0022-\\u002F\\u003A-\\u003E\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F"
|
16
|
+
IDENTIFIER_REGEXP = Regexp.new("[^#{FORBIDDEN_IDENTIFIER_CHARS}]+")
|
17
|
+
|
18
|
+
# For constants rules are pretty much the same, but ':' is allowed and '?!' are not.
|
19
|
+
# Plus it may start with a '::' which indicates that the constant comes from toplevel.
|
20
|
+
FORBIDDEN_CONST_NAME_CHARS = "\\u0001-\\u0020\\u0021-\\u002F\\u003B-\\u003F\\u0040\\u005B-\\u005E\\u0060\\u007B-\\u007F"
|
21
|
+
CONST_NAME_REGEXP = Regexp.new("#{REGEXP_START}(::)?[A-Z][^#{FORBIDDEN_CONST_NAME_CHARS}]*#{REGEXP_END}")
|
4
22
|
end
|
5
23
|
|
data/lib/opal/sprockets.rb
CHANGED
@@ -4,25 +4,25 @@ require 'opal/sprockets/server'
|
|
4
4
|
|
5
5
|
module Opal
|
6
6
|
module Sprockets
|
7
|
-
#
|
8
|
-
#
|
7
|
+
# Bootstraps modules loaded by sprockets on `Opal.modules` marking any
|
8
|
+
# non-Opal asset as already loaded.
|
9
9
|
#
|
10
|
-
#
|
11
|
-
# sprockets - A Sprockets::Environment instance
|
12
|
-
#
|
13
|
-
# Example
|
10
|
+
# @example
|
14
11
|
#
|
15
12
|
# Opal::Sprockets.load_asset(Rails.application.assets, 'application')
|
16
13
|
#
|
17
|
-
# Will output the following JavaScript:
|
14
|
+
# @example Will output the following JavaScript:
|
18
15
|
#
|
19
16
|
# if (typeof(Opal) !== 'undefined') {
|
20
|
-
# Opal.
|
21
|
-
# Opal.
|
17
|
+
# Opal.loaded("opal");
|
18
|
+
# Opal.loaded("jquery.self");
|
22
19
|
# Opal.load("application");
|
23
20
|
# }
|
24
21
|
#
|
25
|
-
#
|
22
|
+
# @param name [String] The logical name of the main asset to be loaded (without extension)
|
23
|
+
# @param sprockets [Sprockets::Environment]
|
24
|
+
#
|
25
|
+
# @return [String] JavaScript code
|
26
26
|
def self.load_asset(name, sprockets)
|
27
27
|
asset = sprockets[name.sub(/(\.(js|rb|opal))*#{REGEXP_END}/, '.js')]
|
28
28
|
return '' if asset.nil?
|
@@ -35,7 +35,7 @@ module Opal
|
|
35
35
|
path_extnames = -> path { File.basename(path).scan(/\.[^.]+/) }
|
36
36
|
mark_loaded = -> paths { "Opal.loaded([#{paths.map(&:inspect).join(',')}]);" }
|
37
37
|
processed_by_opal = -> asset { (path_extnames[asset.pathname] & opal_extnames).any? }
|
38
|
-
stubbed_files = ::Opal::
|
38
|
+
stubbed_files = ::Opal::Config.stubbed_files
|
39
39
|
|
40
40
|
non_opal_assets = ([asset]+asset.dependencies)
|
41
41
|
.select { |asset| not(processed_by_opal[asset]) }
|
@@ -54,20 +54,23 @@ module Opal
|
|
54
54
|
"}"
|
55
55
|
end
|
56
56
|
|
57
|
-
#
|
57
|
+
# Generate a `<script>` tag for Opal assets.
|
58
58
|
#
|
59
|
-
# name
|
60
|
-
# options
|
61
|
-
#
|
62
|
-
#
|
63
|
-
#
|
59
|
+
# @param [String] name The logical name of the asset to be loaded (without extension)
|
60
|
+
# @param [Hash] options The options about sprockets
|
61
|
+
# @option options [Sprockets::Environment] :sprockets The sprockets instance
|
62
|
+
# @option options [String] :prefix The prefix String at which is mounted Sprockets, e.g. '/assets'
|
63
|
+
# @option options [Boolean] :debug Wether to enable debug mode along with sourcemaps support
|
64
64
|
#
|
65
|
-
#
|
65
|
+
# @return a string of HTML code containing `<script>` tags.
|
66
66
|
def self.javascript_include_tag(name, options = {})
|
67
67
|
sprockets = options.fetch(:sprockets)
|
68
68
|
prefix = options.fetch(:prefix)
|
69
69
|
debug = options.fetch(:debug)
|
70
70
|
|
71
|
+
# Avoid double slashes
|
72
|
+
prefix = prefix.chop if prefix.end_with? '/'
|
73
|
+
|
71
74
|
asset = sprockets[name]
|
72
75
|
raise "Cannot find asset: #{name}" if asset.nil?
|
73
76
|
scripts = []
|
@@ -3,16 +3,8 @@ require 'opal/sprockets/processor'
|
|
3
3
|
require 'opal/sprockets/erb'
|
4
4
|
|
5
5
|
module Opal
|
6
|
-
# @deprecated
|
7
|
-
def self.process asset
|
8
|
-
Environment.new[asset].to_s
|
9
|
-
end
|
10
|
-
|
11
|
-
# @deprecated
|
12
6
|
class Environment < ::Sprockets::Environment
|
13
7
|
def initialize *args
|
14
|
-
warn "WARNING: Opal::Sprockets::Environment is deprecated. "\
|
15
|
-
"Please use Opal::Server directly or append Opal.paths to the environment manually."
|
16
8
|
super
|
17
9
|
append_opal_paths
|
18
10
|
end
|
@@ -12,13 +12,6 @@ module Opal
|
|
12
12
|
# extensions) available to any sprockets based server. Processor will then
|
13
13
|
# get passed any ruby source file to build.
|
14
14
|
class Processor < TiltTemplate
|
15
|
-
# Deprecated: Support legacy accessors to default options,
|
16
|
-
# now moved to Opal::Config
|
17
|
-
Opal::Config.default_config.keys.each do |config_option|
|
18
|
-
define_singleton_method(config_option) { Opal::Config.config[config_option] }
|
19
|
-
define_singleton_method("#{config_option}=") { |value| Opal::Config.config[config_option] = value }
|
20
|
-
end
|
21
|
-
|
22
15
|
@@cache_key = nil
|
23
16
|
def self.cache_key
|
24
17
|
@@cache_key ||= ['Opal', Opal::VERSION, Opal::Config.config].to_json.freeze
|
@@ -100,7 +93,7 @@ module Opal
|
|
100
93
|
required_tree = dirname.join(file, '..', required_tree)
|
101
94
|
|
102
95
|
unless required_tree.directory?
|
103
|
-
raise ArgumentError, "require_tree argument must be a directory: #{
|
96
|
+
raise ArgumentError, "require_tree argument must be a directory: #{{source: original_required_tree, pathname: required_tree}.inspect}"
|
104
97
|
end
|
105
98
|
|
106
99
|
context.depend_on required_tree.to_s
|
@@ -125,21 +118,25 @@ module Opal
|
|
125
118
|
end
|
126
119
|
end
|
127
120
|
|
128
|
-
#
|
129
|
-
def self.load_asset_code(sprockets, name)
|
130
|
-
::Opal::Sprockets.load_asset(name, sprockets)
|
131
|
-
end
|
132
|
-
|
121
|
+
# @deprecated
|
133
122
|
def self.stubbed_files
|
134
|
-
|
123
|
+
warn "Deprecated: use `::Opal::Config.stubbed_files` instead"
|
124
|
+
puts caller(5)
|
125
|
+
::Opal::Config.stubbed_files
|
135
126
|
end
|
136
127
|
|
128
|
+
# @deprecated
|
137
129
|
def self.stub_file(name)
|
138
|
-
stubbed_files << name.to_s
|
130
|
+
warn "Deprecated: use `::Opal::Config.stubbed_files << #{name.inspect}.to_s` instead"
|
131
|
+
puts caller(5)
|
132
|
+
::Opal::Config.stubbed_files << name.to_s
|
139
133
|
end
|
140
134
|
|
135
|
+
|
136
|
+
private
|
137
|
+
|
141
138
|
def stubbed_files
|
142
|
-
|
139
|
+
::Opal::Config.stubbed_files
|
143
140
|
end
|
144
141
|
end
|
145
142
|
end
|
@@ -13,15 +13,7 @@ module Opal
|
|
13
13
|
attr_accessor :debug, :use_index, :index_path, :main, :public_root,
|
14
14
|
:public_urls, :sprockets, :prefix
|
15
15
|
|
16
|
-
def initialize
|
17
|
-
unless Hash === debug_or_options
|
18
|
-
warn "passing a boolean to control debug is deprecated.\n"+
|
19
|
-
"Please pass an Hash instead: Server.new(debug: true)"
|
20
|
-
options = {:debug => debug_or_options}
|
21
|
-
else
|
22
|
-
options = debug_or_options
|
23
|
-
end
|
24
|
-
|
16
|
+
def initialize options = {}
|
25
17
|
@use_index = true
|
26
18
|
@public_root = nil
|
27
19
|
@public_urls = ['/']
|
@@ -41,11 +33,11 @@ module Opal
|
|
41
33
|
end
|
42
34
|
|
43
35
|
def source_map=(enabled)
|
44
|
-
Opal::
|
36
|
+
Opal::Config.source_map_enabled = enabled
|
45
37
|
end
|
46
38
|
|
47
39
|
def source_map_enabled
|
48
|
-
Opal::
|
40
|
+
Opal::Config.source_map_enabled
|
49
41
|
end
|
50
42
|
|
51
43
|
def append_path path
|
@@ -117,7 +109,9 @@ module Opal
|
|
117
109
|
def javascript_include_tag name
|
118
110
|
sprockets = @server.sprockets
|
119
111
|
prefix = @server.prefix
|
120
|
-
|
112
|
+
debug = @server.debug
|
113
|
+
|
114
|
+
::Opal::Sprockets.javascript_include_tag(name, sprockets: sprockets, prefix: prefix, debug: debug)
|
121
115
|
end
|
122
116
|
|
123
117
|
def source
|