js_regex 3.3.0 → 3.7.0

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0f418197d1c8fea37bd549b701049f1130bfca486c5a11ba25e56d7d0cf990f8
4
- data.tar.gz: 8679277fb51aca528933f4727cd0e70f1e1204c78acaf4e20da48d6b790ea7be
3
+ metadata.gz: c133491821c27a1ce87f58e59c828e92cef7e1f7f9be99b015e79e55ded6874e
4
+ data.tar.gz: 7ea0268f1e0d8cf48c6a56b635d8189dfb1c2f0ad969902eb0d2a9380d01f03a
5
5
  SHA512:
6
- metadata.gz: ddeadbe690e2928c068d8c2962d80e88c50f5fef46304e46fa98e8dc215c6c57c7790e9ef7ba8b1f640e71c3ca834b7233449c9b7d68466ac76581de73c7ffe3
7
- data.tar.gz: 9c10d4e6a529ec54385ed55b34e4a910d354d7665f0831bc65b65bc20f176f4e46f9aa90cff2b36ea8f1306dfa65f7e42f4a93516ab228f206e74db7d708b779
6
+ metadata.gz: 2f31af53ed6fd3213839df7ece799dc951a0f979cf9858cce47ae8151c167de5a5c5464de3d7355782a8bd56f6d142c5d152d4e381ffed9e26f7f51b13c445b1
7
+ data.tar.gz: 46525b2bb74b11189495f831fa860980291c9be05c5d546e7fc1ed1bee335d4cb29059b6ba1ffb008528c78309c4e75e2f9088570d7691565180821b912ffc96
data/lib/js_regex.rb CHANGED
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  # JsRegex converts ::Regexp instances to JavaScript.
4
2
  #
5
3
  # Usage:
@@ -10,6 +8,7 @@
10
8
  #
11
9
  class JsRegex
12
10
  require_relative File.join('js_regex', 'conversion')
11
+ require_relative File.join('js_regex', 'error')
13
12
  require_relative File.join('js_regex', 'version')
14
13
  require 'json'
15
14
 
@@ -30,4 +29,15 @@ class JsRegex
30
29
  def to_s
31
30
  "/#{source.empty? ? '(?:)' : source}/#{options}"
32
31
  end
32
+
33
+ def self.new!(ruby_regex, options: nil)
34
+ js_regex = new(ruby_regex, options: options)
35
+ if js_regex.warnings.any?
36
+ raise StandardError.new(
37
+ "Could not fully convert the given regex #{ruby_regex.inspect}:\n" +
38
+ js_regex.warnings.join("\n")
39
+ ).extend(JsRegex::Error)
40
+ end
41
+ js_regex
42
+ end
33
43
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  class JsRegex
4
2
  #
5
3
  # This class acts as a facade, passing a regex to the converters.
@@ -9,29 +7,34 @@ class JsRegex
9
7
  class Conversion
10
8
  require 'regexp_parser'
11
9
  require_relative 'converter'
10
+ require_relative 'error'
12
11
  require_relative 'node'
13
12
  require_relative 'second_pass'
14
13
 
15
14
  class << self
16
- def of(ruby_regex, options: nil)
17
- source, warnings = convert_source(ruby_regex)
18
- options_string = convert_options(ruby_regex, options)
15
+ def of(input, options: nil)
16
+ source, warnings = convert_source(input)
17
+ options_string = convert_options(input, options)
19
18
  [source, options_string, warnings]
20
19
  end
21
20
 
22
21
  private
23
22
 
24
- def convert_source(ruby_regex)
25
- tree = Regexp::Parser.parse(ruby_regex)
23
+ def convert_source(input)
24
+ tree = Regexp::Parser.parse(input)
26
25
  context = Converter::Context.new(case_insensitive_root: tree.i?)
27
26
  converted_tree = Converter.convert(tree, context)
28
27
  final_tree = SecondPass.call(converted_tree)
29
28
  [final_tree.to_s, context.warnings]
29
+ rescue Regexp::Parser::Error => e
30
+ raise e.extend(JsRegex::Error)
30
31
  end
31
32
 
32
- def convert_options(ruby_regex, custom_options)
33
+ def convert_options(input, custom_options)
33
34
  options = custom_options.to_s.scan(/[gimuy]/)
34
- options << 'i' if (ruby_regex.options & Regexp::IGNORECASE).nonzero?
35
+ if input.is_a?(Regexp) && (input.options & Regexp::IGNORECASE).nonzero?
36
+ options << 'i'
37
+ end
35
38
  options.uniq.sort.join
36
39
  end
37
40
  end
@@ -1,8 +1,6 @@
1
- # frozen_string_literal: true
2
-
3
1
  class JsRegex
4
2
  module Converter
5
- Dir[File.join(File.dirname(__FILE__), 'converter', '*.rb')].each do |file|
3
+ Dir[File.join(__dir__, 'converter', '*.rb')].sort.each do |file|
6
4
  require file
7
5
  end
8
6
 
@@ -32,18 +30,10 @@ class JsRegex
32
30
  MAP[expression.type].new
33
31
  end
34
32
 
35
- # Limit the number of generated surrogate pairs, else the output might
36
- # get to large for certain applications. The chosen number is somewhat
37
- # arbitrary. 100 pairs make for about 1 KB, uncompressed. The median char
38
- # count of all properties supported by Ruby is 92. 75% are below 300 chars.
39
- #
40
- # Set this to nil if you need full unicode matches and size doesn't matter.
41
- attr_writer :surrogate_pair_limit
42
-
43
- def in_surrogate_pair_limit?(&pair_count)
44
- @surrogate_pair_limit.nil? || @surrogate_pair_limit >= pair_count.call
33
+ # Legacy method. Remove in v4.0.0.
34
+ def surrogate_pair_limit=(_arg)
35
+ warn '#surrogate_pair_limit= is deprecated and has no effect anymore.'
45
36
  end
46
37
  end
47
- self.surrogate_pair_limit = 300
48
38
  end
49
39
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -23,9 +21,8 @@ class JsRegex
23
21
  end
24
22
 
25
23
  def pass_boundary_with_warning(boundary)
26
- warn("The boundary '#{boundary}' at index #{expression.ts} "\
27
- 'is not unicode-aware in JavaScript, '\
28
- 'so it might act differently than in Ruby.')
24
+ warn_of("The anchor '#{boundary}' at index #{expression.ts} "\
25
+ 'only works at ASCII word boundaries in JavaScript.')
29
26
  boundary
30
27
  end
31
28
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
  require_relative 'group_converter'
5
3
 
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  class JsRegex
4
2
  module Converter
5
3
  #
@@ -54,11 +52,11 @@ class JsRegex
54
52
  def warn_of_unsupported_feature(description = nil)
55
53
  description ||= "#{subtype} #{expression.type}".tr('_', ' ')
56
54
  full_desc = "#{description} '#{expression}'"
57
- warn("Dropped unsupported #{full_desc} at index #{expression.ts}")
55
+ warn_of("Dropped unsupported #{full_desc} at index #{expression.ts}")
58
56
  drop
59
57
  end
60
58
 
61
- def warn(text)
59
+ def warn_of(text)
62
60
  context.warnings << text
63
61
  end
64
62
 
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  class JsRegex
4
2
  module Converter
5
3
  #
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
  require_relative 'literal_converter'
5
3
 
@@ -44,7 +42,7 @@ class JsRegex
44
42
  when :control, :meta_sequence
45
43
  unicode_escape_codepoint
46
44
  when :literal
47
- LiteralConverter.convert_data(data)
45
+ LiteralConverter.convert_data(expression.char)
48
46
  when *ESCAPES_SHARED_BY_RUBY_AND_JS
49
47
  pass_through
50
48
  when :bell, :escape
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -15,42 +13,28 @@ class JsRegex
15
13
  if data =~ ASTRAL_PLANE_CODEPOINT_PATTERN
16
14
  convert_astral_data(data)
17
15
  else
18
- convert_bmp_data(data)
16
+ escape_incompatible_bmp_literals(data)
19
17
  end
20
18
  end
21
19
 
22
20
  def convert_astral_data(data)
23
- data.each_char.each_with_object(Node.new) do |chr, node|
24
- if chr =~ ASTRAL_PLANE_CODEPOINT_PATTERN
25
- node << surrogate_pair_for(chr)
21
+ data.each_char.each_with_object(Node.new) do |char, node|
22
+ if char =~ ASTRAL_PLANE_CODEPOINT_PATTERN
23
+ node << surrogate_substitution_for(char)
26
24
  else
27
- node << convert_bmp_data(chr)
25
+ node << escape_incompatible_bmp_literals(char)
28
26
  end
29
27
  end
30
28
  end
31
29
 
32
- def convert_bmp_data(data)
33
- ensure_json_compatibility(
34
- ensure_forward_slashes_are_escaped(data)
35
- )
30
+ def escape_incompatible_bmp_literals(data)
31
+ data.gsub('/', '\\/').gsub(/[\f\n\r\t]/) { |lit| Regexp.escape(lit) }
36
32
  end
37
33
 
38
34
  private
39
35
 
40
- def surrogate_pair_for(astral_char)
41
- base = astral_char.codepoints.first - 65_536
42
- high = ((base / 1024).floor + 55_296).to_s(16)
43
- low = (base % 1024 + 56_320).to_s(16)
44
- "(?:\\u#{high}\\u#{low})"
45
- end
46
-
47
- def ensure_forward_slashes_are_escaped(data)
48
- # literal slashes would signify the pattern end in JsRegex#to_s
49
- data.gsub(%r{\\?/}, '\\/')
50
- end
51
-
52
- def ensure_json_compatibility(data)
53
- data.gsub(%r{\\?([\f\n\r\t])}) { Regexp.escape($1) }
36
+ def surrogate_substitution_for(char)
37
+ CharacterSet::Writer.write_surrogate_ranges([], [char.codepoints])
54
38
  end
55
39
  end
56
40
 
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -8,6 +6,9 @@ class JsRegex
8
6
  # Template class implementation.
9
7
  #
10
8
  class MetaConverter < JsRegex::Converter::Base
9
+ DOT_EXPANSION = '(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\n\uD800-\uDFFF])'
10
+ ML_DOT_EXPANSION = '(?:[\uD800-\uDBFF][\uDC00-\uDFFF]|[^\uD800-\uDFFF])'
11
+
11
12
  private
12
13
 
13
14
  def convert_data
@@ -15,7 +16,7 @@ class JsRegex
15
16
  when :alternation
16
17
  convert_alternatives
17
18
  when :dot
18
- expression.multiline? ? '(?:.|\n)' : '.'
19
+ expression.multiline? ? ML_DOT_EXPANSION : DOT_EXPANSION
19
20
  else
20
21
  warn_of_unsupported_feature
21
22
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
  require 'character_set'
5
3
 
@@ -15,35 +13,15 @@ class JsRegex
15
13
  private
16
14
 
17
15
  def convert_data
18
- content = character_set_of_property
19
-
20
- if expression.negative?
21
- if content.astral_part?
22
- warn_of_unsupported_feature('astral plane negation by property')
23
- end
24
- elsif Converter.in_surrogate_pair_limit? { content.astral_part.size }
25
- return content.to_s_with_surrogate_alternation
26
- else
27
- warn_of_unsupported_feature('large astral plane match of property')
28
- end
16
+ content = CharacterSet.of_expression(expression)
29
17
 
30
- limit_to_bmp_part(content)
31
- end
32
-
33
- def character_set_of_property
34
- character_set = CharacterSet.of_property(subtype)
35
18
  if expression.case_insensitive? && !context.case_insensitive_root
36
- character_set.case_insensitive
37
- else
38
- character_set
19
+ content = content.case_insensitive
20
+ elsif !expression.case_insensitive? && context.case_insensitive_root
21
+ warn_of_unsupported_feature('nested case-sensitive property')
39
22
  end
40
- end
41
-
42
- def limit_to_bmp_part(content)
43
- bmp_part = content.bmp_part
44
- return drop if bmp_part.empty?
45
23
 
46
- "[#{'^' if expression.negative?}#{bmp_part}]"
24
+ content.to_s_with_surrogate_ranges
47
25
  end
48
26
  end
49
27
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
  require_relative 'escape_converter'
5
3
  require_relative 'type_converter'
@@ -28,11 +26,7 @@ class JsRegex
28
26
  warn_of_unsupported_feature('nested case-sensitive set')
29
27
  end
30
28
 
31
- if Converter.in_surrogate_pair_limit? { content.astral_part.size }
32
- content.to_s_with_surrogate_alternation
33
- else
34
- limit_to_bmp_part_with_warning(content)
35
- end
29
+ content.to_s_with_surrogate_ranges
36
30
  end
37
31
 
38
32
  def directly_compatible?
@@ -41,9 +35,7 @@ class JsRegex
41
35
 
42
36
  def all_children_directly_compatible?
43
37
  # note that #each_expression is recursive
44
- expression.each_expression do |exp|
45
- return unless child_directly_compatible?(exp)
46
- end
38
+ expression.each_expression.all? { |ch| child_directly_compatible?(ch) }
47
39
  end
48
40
 
49
41
  def child_directly_compatible?(exp)
@@ -66,13 +58,8 @@ class JsRegex
66
58
  end
67
59
 
68
60
  def pass_through_with_escaping
69
- expression.to_s(:base).gsub(%r{\\?([\f\n\r\t])}) { Regexp.escape($1) }
70
- end
71
-
72
- def limit_to_bmp_part_with_warning(content)
73
- warn_of_unsupported_feature('large astral plane match of set')
74
- bmp_part = content.bmp_part
75
- bmp_part.empty? ? drop : bmp_part.to_s(in_brackets: true)
61
+ string = expression.to_s(:base)
62
+ LiteralConverter.escape_incompatible_bmp_literals(string)
76
63
  end
77
64
  end
78
65
  end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  require_relative 'base'
4
2
 
5
3
  class JsRegex
@@ -0,0 +1,5 @@
1
+ class JsRegex
2
+ # This is mixed into errors, e.g. those thrown by the parser,
3
+ # allowing to `rescue JsRegex::Error`.
4
+ module Error; end
5
+ end
data/lib/js_regex/node.rb CHANGED
@@ -1,11 +1,11 @@
1
- # frozen_string_literal: true
2
-
3
1
  class JsRegex
4
2
  #
5
3
  # Converter#convert result. Represents a branch or leaf node with an optional
6
4
  # quantifier as well as type and reference annotations for SecondPass.
7
5
  #
8
6
  class Node
7
+ require_relative 'error'
8
+
9
9
  attr_reader :children, :quantifier, :reference, :type
10
10
 
11
11
  TYPES = %i[
@@ -49,7 +49,9 @@ class JsRegex
49
49
  when :backref_num, :captured_group, :plain
50
50
  children.join << quantifier.to_s
51
51
  else
52
- raise TypeError, "#{type} must be substituted before stringification"
52
+ raise TypeError.new(
53
+ "#{type} must be substituted before stringification"
54
+ ).extend(JsRegex::Error)
53
55
  end
54
56
  end
55
57
 
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  class JsRegex
4
2
  #
5
3
  # After conversion of a full Regexp::Expression tree, this
@@ -61,7 +59,7 @@ class JsRegex
61
59
 
62
60
  def condition_permutations(conditions)
63
61
  (0..(conditions.length)).inject([]) do |arr, n|
64
- arr += conditions.combination(n).to_a
62
+ arr + conditions.combination(n).to_a
65
63
  end
66
64
  end
67
65
 
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  class JsRegex
4
- VERSION = '3.3.0'
2
+ VERSION = '3.7.0'
5
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: js_regex
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.3.0
4
+ version: 3.7.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Janosch Müller
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-05-26 00:00:00.000000000 Z
11
+ date: 2021-03-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: character_set
@@ -16,37 +16,51 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.3'
19
+ version: '1.4'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.3'
26
+ version: '1.4'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: regexp_parser
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - "~>"
32
32
  - !ruby/object:Gem::Version
33
- version: '1.5'
33
+ version: '2.1'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
- version: '1.5'
40
+ version: '2.1'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: regexp_property_values
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '0.3'
47
+ version: '1.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: mini_racer
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.3'
62
+ type: :development
63
+ prerelease: false
50
64
  version_requirements: !ruby/object:Gem::Requirement
51
65
  requirements:
52
66
  - - "~>"
@@ -58,70 +72,70 @@ dependencies:
58
72
  requirements:
59
73
  - - "~>"
60
74
  - !ruby/object:Gem::Version
61
- version: '12.3'
75
+ version: '13.0'
62
76
  type: :development
63
77
  prerelease: false
64
78
  version_requirements: !ruby/object:Gem::Requirement
65
79
  requirements:
66
80
  - - "~>"
67
81
  - !ruby/object:Gem::Version
68
- version: '12.3'
82
+ version: '13.0'
69
83
  - !ruby/object:Gem::Dependency
70
- name: rspec-core
84
+ name: rspec
71
85
  requirement: !ruby/object:Gem::Requirement
72
86
  requirements:
73
87
  - - "~>"
74
88
  - !ruby/object:Gem::Version
75
- version: '3.8'
89
+ version: '3.10'
76
90
  type: :development
77
91
  prerelease: false
78
92
  version_requirements: !ruby/object:Gem::Requirement
79
93
  requirements:
80
94
  - - "~>"
81
95
  - !ruby/object:Gem::Version
82
- version: '3.8'
96
+ version: '3.10'
83
97
  - !ruby/object:Gem::Dependency
84
- name: rspec-expectations
98
+ name: codecov
85
99
  requirement: !ruby/object:Gem::Requirement
86
100
  requirements:
87
101
  - - "~>"
88
102
  - !ruby/object:Gem::Version
89
- version: '3.8'
103
+ version: 0.2.12
90
104
  type: :development
91
105
  prerelease: false
92
106
  version_requirements: !ruby/object:Gem::Requirement
93
107
  requirements:
94
108
  - - "~>"
95
109
  - !ruby/object:Gem::Version
96
- version: '3.8'
110
+ version: 0.2.12
97
111
  - !ruby/object:Gem::Dependency
98
- name: rspec-mocks
112
+ name: gouteur
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
115
  - - "~>"
102
116
  - !ruby/object:Gem::Version
103
- version: '3.8'
117
+ version: '1.0'
104
118
  type: :development
105
119
  prerelease: false
106
120
  version_requirements: !ruby/object:Gem::Requirement
107
121
  requirements:
108
122
  - - "~>"
109
123
  - !ruby/object:Gem::Version
110
- version: '3.8'
124
+ version: '1.0'
111
125
  - !ruby/object:Gem::Dependency
112
- name: therubyracer
126
+ name: rubocop
113
127
  requirement: !ruby/object:Gem::Requirement
114
128
  requirements:
115
129
  - - "~>"
116
130
  - !ruby/object:Gem::Version
117
- version: '0.12'
131
+ version: '1.8'
118
132
  type: :development
119
133
  prerelease: false
120
134
  version_requirements: !ruby/object:Gem::Requirement
121
135
  requirements:
122
136
  - - "~>"
123
137
  - !ruby/object:Gem::Version
124
- version: '0.12'
138
+ version: '1.8'
125
139
  description: JsRegex converts Ruby's native regular expressions for JavaScript, taking
126
140
  care of various incompatibilities and returning warnings for unsolvable differences.
127
141
  email:
@@ -149,6 +163,7 @@ files:
149
163
  - lib/js_regex/converter/subexpression_converter.rb
150
164
  - lib/js_regex/converter/type_converter.rb
151
165
  - lib/js_regex/converter/unsupported_token_converter.rb
166
+ - lib/js_regex/error.rb
152
167
  - lib/js_regex/node.rb
153
168
  - lib/js_regex/second_pass.rb
154
169
  - lib/js_regex/version.rb
@@ -156,7 +171,7 @@ homepage: https://github.com/jaynetics/js_regex
156
171
  licenses:
157
172
  - MIT
158
173
  metadata: {}
159
- post_install_message:
174
+ post_install_message:
160
175
  rdoc_options: []
161
176
  require_paths:
162
177
  - lib
@@ -171,8 +186,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
171
186
  - !ruby/object:Gem::Version
172
187
  version: '0'
173
188
  requirements: []
174
- rubygems_version: 3.0.3
175
- signing_key:
189
+ rubygems_version: 3.2.3
190
+ signing_key:
176
191
  specification_version: 4
177
192
  summary: Converts Ruby regexes to JavaScript regexes.
178
193
  test_files: []