uglifier 2.7.2 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -13,7 +13,7 @@ Gem::Specification.new do |spec|
13
13
  spec.description = "Uglifier minifies JavaScript files by wrapping UglifyJS to be accessible in Ruby"
14
14
  spec.license = "MIT"
15
15
 
16
- spec.required_ruby_version = '>= 1.8.7'
16
+ spec.required_ruby_version = '>= 1.9.3'
17
17
 
18
18
  spec.extra_rdoc_files = [
19
19
  "LICENSE.txt",
@@ -21,15 +21,15 @@ Gem::Specification.new do |spec|
21
21
  "CHANGELOG.md",
22
22
  "CONTRIBUTING.md"
23
23
  ]
24
- spec.files = `git ls-files`.split($/)
25
- spec.test_files = spec.files.grep(%r{^spec/})
24
+
25
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
26
+ f.match(%r{^(spec|vendor|gemfiles|patches)/})
27
+ end
26
28
  spec.require_paths = ["lib"]
27
29
 
28
- spec.add_runtime_dependency "execjs", ">= 0.3.0"
29
- spec.add_runtime_dependency "json", ">= 1.8.0"
30
+ spec.add_runtime_dependency "execjs", [">= 0.3.0", "< 3"]
30
31
  spec.add_development_dependency "rspec", "~> 3.0"
31
- spec.add_development_dependency "rake", "~> 10.4"
32
- spec.add_development_dependency "bundler", "~> 1.3"
33
- spec.add_development_dependency "rdoc", ">= 3.11"
34
- spec.add_development_dependency "source_map", ">= 0"
32
+ spec.add_development_dependency "rake", "~> 12.0"
33
+ spec.add_development_dependency "bundler", ">= 1.3"
34
+ spec.add_development_dependency "sourcemap", "~> 0.1.1"
35
35
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: uglifier
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.7.2
4
+ version: 4.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ville Lautanala
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-08-26 00:00:00.000000000 Z
11
+ date: 2019-09-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: execjs
@@ -17,6 +17,9 @@ dependencies:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
19
  version: 0.3.0
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '3'
20
23
  type: :runtime
21
24
  prerelease: false
22
25
  version_requirements: !ruby/object:Gem::Requirement
@@ -24,20 +27,9 @@ dependencies:
24
27
  - - ">="
25
28
  - !ruby/object:Gem::Version
26
29
  version: 0.3.0
27
- - !ruby/object:Gem::Dependency
28
- name: json
29
- requirement: !ruby/object:Gem::Requirement
30
- requirements:
31
- - - ">="
30
+ - - "<"
32
31
  - !ruby/object:Gem::Version
33
- version: 1.8.0
34
- type: :runtime
35
- prerelease: false
36
- version_requirements: !ruby/object:Gem::Requirement
37
- requirements:
38
- - - ">="
39
- - !ruby/object:Gem::Version
40
- version: 1.8.0
32
+ version: '3'
41
33
  - !ruby/object:Gem::Dependency
42
34
  name: rspec
43
35
  requirement: !ruby/object:Gem::Requirement
@@ -58,56 +50,42 @@ dependencies:
58
50
  requirements:
59
51
  - - "~>"
60
52
  - !ruby/object:Gem::Version
61
- version: '10.4'
53
+ version: '12.0'
62
54
  type: :development
63
55
  prerelease: false
64
56
  version_requirements: !ruby/object:Gem::Requirement
65
57
  requirements:
66
58
  - - "~>"
67
59
  - !ruby/object:Gem::Version
68
- version: '10.4'
60
+ version: '12.0'
69
61
  - !ruby/object:Gem::Dependency
70
62
  name: bundler
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - "~>"
74
- - !ruby/object:Gem::Version
75
- version: '1.3'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - "~>"
81
- - !ruby/object:Gem::Version
82
- version: '1.3'
83
- - !ruby/object:Gem::Dependency
84
- name: rdoc
85
63
  requirement: !ruby/object:Gem::Requirement
86
64
  requirements:
87
65
  - - ">="
88
66
  - !ruby/object:Gem::Version
89
- version: '3.11'
67
+ version: '1.3'
90
68
  type: :development
91
69
  prerelease: false
92
70
  version_requirements: !ruby/object:Gem::Requirement
93
71
  requirements:
94
72
  - - ">="
95
73
  - !ruby/object:Gem::Version
96
- version: '3.11'
74
+ version: '1.3'
97
75
  - !ruby/object:Gem::Dependency
98
- name: source_map
76
+ name: sourcemap
99
77
  requirement: !ruby/object:Gem::Requirement
100
78
  requirements:
101
- - - ">="
79
+ - - "~>"
102
80
  - !ruby/object:Gem::Version
103
- version: '0'
81
+ version: 0.1.1
104
82
  type: :development
105
83
  prerelease: false
106
84
  version_requirements: !ruby/object:Gem::Requirement
107
85
  requirements:
108
- - - ">="
86
+ - - "~>"
109
87
  - !ruby/object:Gem::Version
110
- version: '0'
88
+ version: 0.1.1
111
89
  description: Uglifier minifies JavaScript files by wrapping UglifyJS to be accessible
112
90
  in Ruby
113
91
  email:
@@ -121,28 +99,27 @@ extra_rdoc_files:
121
99
  - CONTRIBUTING.md
122
100
  files:
123
101
  - ".document"
102
+ - ".github/workflows/ruby.yml"
124
103
  - ".gitignore"
125
104
  - ".gitmodules"
126
105
  - ".rspec"
127
106
  - ".rubocop.yml"
128
107
  - ".travis.yml"
108
+ - ".yardopts"
129
109
  - CHANGELOG.md
130
110
  - CONTRIBUTING.md
131
111
  - Gemfile
132
112
  - LICENSE.txt
133
113
  - README.md
134
114
  - Rakefile
135
- - gemfiles/alaska
136
- - gemfiles/rubyracer
137
- - gemfiles/rubyrhino
138
115
  - lib/es5.js
116
+ - lib/source-map.js
139
117
  - lib/split.js
118
+ - lib/uglifier.js
140
119
  - lib/uglifier.rb
141
120
  - lib/uglifier/version.rb
121
+ - lib/uglify-harmony.js
142
122
  - lib/uglify.js
143
- - spec/source_map_spec.rb
144
- - spec/spec_helper.rb
145
- - spec/uglifier_spec.rb
146
123
  - uglifier.gemspec
147
124
  homepage: http://github.com/lautis/uglifier
148
125
  licenses:
@@ -156,19 +133,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
156
133
  requirements:
157
134
  - - ">="
158
135
  - !ruby/object:Gem::Version
159
- version: 1.8.7
136
+ version: 1.9.3
160
137
  required_rubygems_version: !ruby/object:Gem::Requirement
161
138
  requirements:
162
139
  - - ">="
163
140
  - !ruby/object:Gem::Version
164
141
  version: '0'
165
142
  requirements: []
166
- rubyforge_project:
167
- rubygems_version: 2.4.5.1
143
+ rubygems_version: 3.0.3
168
144
  signing_key:
169
145
  specification_version: 4
170
146
  summary: Ruby wrapper for UglifyJS JavaScript compressor
171
- test_files:
172
- - spec/source_map_spec.rb
173
- - spec/spec_helper.rb
174
- - spec/uglifier_spec.rb
147
+ test_files: []
@@ -1,4 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec :path=> "../"
4
- gem "alaska", github: "mavenlink/alaska"
@@ -1,4 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec :path=> "../"
4
- gem 'therubyracer'
@@ -1,4 +0,0 @@
1
- source "https://rubygems.org"
2
-
3
- gemspec :path => "../"
4
- gem 'therubyrhino'
@@ -1,110 +0,0 @@
1
- # encoding: UTF-8
2
- require 'stringio'
3
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
4
-
5
- describe "Uglifier" do
6
- let(:source) do
7
- <<-JS
8
- function hello () {
9
- function world () {
10
- return 2;
11
- };
12
-
13
- return world() + world();
14
- };
15
- JS
16
- end
17
-
18
- it "generates source maps" do
19
- source = File.open("lib/uglify.js", "r:UTF-8").read
20
- minified, map = Uglifier.new.compile_with_map(source)
21
- expect(minified.length).to be < source.length
22
- expect(map.length).to be > 0
23
- expect { JSON.parse(map) }.not_to raise_error
24
- end
25
-
26
- it "generates source maps with the correct meta-data" do
27
- _, map = Uglifier.compile_with_map(source,
28
- :source_filename => "ahoy.js",
29
- :output_filename => "ahoy.min.js",
30
- :source_root => "http://localhost/")
31
-
32
- map = SourceMap.from_s(map)
33
- expect(map.file).to eq("ahoy.min.js")
34
- expect(map.sources).to eq(["ahoy.js"])
35
- expect(map.names).to eq(%w(hello world))
36
- expect(map.source_root).to eq("http://localhost/")
37
- expect(map.mappings.first[:generated_line]).to eq(1)
38
- end
39
-
40
- it "should skip copyright lines in source maps" do
41
- source = <<-JS
42
- /* @copyright Conrad Irwin */
43
- function hello () {
44
- function world () {
45
- return 2;
46
- };
47
-
48
- return world() + world();
49
- };
50
- JS
51
-
52
- _, map = Uglifier.compile_with_map(source,
53
- :source_filename => "ahoy.js",
54
- :source_root => "http://localhost/")
55
- map = SourceMap.from_s(map)
56
- expect(map.mappings.first[:generated_line]).to eq(2)
57
- end
58
-
59
- it "should be able to handle an input source map" do
60
- source = <<-JS
61
- function hello () {
62
- function world () {
63
- return 2;
64
- };
65
-
66
- return world() + world();
67
- };
68
- JS
69
-
70
- minified1, map1 = Uglifier.compile_with_map(
71
- source,
72
- :source_filename => "ahoy.js",
73
- :source_root => "http://localhost/",
74
- :mangle => false
75
- )
76
-
77
- _, map2 = Uglifier.compile_with_map(source,
78
- :input_source_map => map1,
79
- :mangle => true)
80
-
81
- expect(minified1.lines.to_a.length).to eq(1)
82
-
83
- map = SourceMap.from_s(map2)
84
- expect(map.sources).to eq(["ahoy.js", "http://localhost/ahoy.js"])
85
- expect(map.mappings.first[:source_line]).to eq(1)
86
- expect(map.mappings.last[:source_line]).to eq(6)
87
- end
88
-
89
- it "appens source map url" do
90
- minified, _ = Uglifier.compile_with_map(
91
- source,
92
- :source_filename => "ahoy.js",
93
- :output_filename => "ahoy.min.js",
94
- :source_root => "http://localhost/",
95
- :source_map_url => "http://example.com/map"
96
- )
97
- expect(minified).to include("\n//# sourceMappingURL=http://example.com/map")
98
- end
99
-
100
- it "appens source url" do
101
- minified, _ = Uglifier.compile_with_map(
102
- source,
103
- :source_filename => "ahoy.js",
104
- :output_filename => "ahoy.min.js",
105
- :source_root => "http://localhost/",
106
- :source_url => "http://example.com/source"
107
- )
108
- expect(minified).to include("\n//# sourceURL=http://example.com/source")
109
- end
110
- end
@@ -1,23 +0,0 @@
1
- # encoding: UTF-8
2
- require 'uglifier'
3
- require 'rspec'
4
- require 'source_map'
5
-
6
- # Requires supporting files with custom matchers and macros, etc,
7
- # in ./support/ and its subdirectories.
8
- Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
9
-
10
- if ENV["ALASKA"]
11
- require 'alaska'
12
- require 'tempfile'
13
- ExecJS.runtime = Alaska::Runtime.new
14
- end
15
-
16
- RSpec.configure do |config|
17
- config.mock_with :rspec do |mock|
18
- mock.syntax = :expect
19
- end
20
- config.expect_with :rspec do |expect|
21
- expect.syntax = :expect
22
- end
23
- end
@@ -1,280 +0,0 @@
1
- # encoding: UTF-8
2
- require 'stringio'
3
- require File.expand_path(File.dirname(__FILE__) + '/spec_helper')
4
-
5
- describe "Uglifier" do
6
- it "minifies JS" do
7
- source = File.open("lib/uglify.js", "r:UTF-8").read
8
- minified = Uglifier.new.compile(source)
9
- expect(minified.length).to be < source.length
10
- expect { Uglifier.new.compile(minified) }.not_to raise_error
11
- end
12
-
13
- it "throws an exception when compilation fails" do
14
- expect { Uglifier.new.compile(")(") }.to raise_error(Uglifier::Error)
15
- end
16
-
17
- it "throws an exception on invalid option" do
18
- expect { Uglifier.new(:foo => true) }.to raise_error(ArgumentError)
19
- end
20
-
21
- it "doesn't omit null character in strings" do
22
- expect(Uglifier.new.compile('var foo="\0bar"')).to include("\\x00bar")
23
- end
24
-
25
- it "adds trailing semicolon to minified source" do
26
- source = "(function id(i) {return i;}());"
27
- expect(Uglifier.new.compile(source)[-1]).to eql(";"[0])
28
- end
29
-
30
- describe "argument name mangling" do
31
- it "doesn't try to mangle $super by default to avoid breaking PrototypeJS" do
32
- expect(Uglifier.compile('function foo($super) {return $super}')).to include("$super")
33
- end
34
-
35
- it "allows variables to be excluded from mangling" do
36
- code = "function bar(foo) {return foo + 'bar'};"
37
- expect(Uglifier.compile(code, :mangle => { :except => ["foo"] })).to include("(foo)")
38
- end
39
-
40
- it "skips mangling when set to false" do
41
- code = "function bar(foo) {return foo + 'bar'};"
42
- expect(Uglifier.compile(code, :mangle => false)).to include("(foo)")
43
- end
44
-
45
- it "mangles argumen names by default" do
46
- code = "function bar(foo) {return foo + 'bar'};"
47
- expect(Uglifier.compile(code, :mangle => true)).not_to include("(foo)")
48
- end
49
-
50
- it "mangles top-level names when explicitly instructed" do
51
- code = "function bar(foo) {return foo + 'bar'};"
52
- expect(Uglifier.compile(code, :mangle => { :toplevel => false })).to include("bar(")
53
- expect(Uglifier.compile(code, :mangle => { :toplevel => true })).not_to include("bar(")
54
- end
55
- end
56
-
57
- describe "comment preservation" do
58
- let(:source) do
59
- <<-EOS
60
- /* @preserve Copyright Notice */
61
- /* (c) 2011 */
62
- // INCLUDED
63
- //! BANG
64
- function identity(p) { return p; }
65
- /* Another Copyright */
66
- /*! Another Bang */
67
- // A comment!
68
- function add(a, b) { return a + b; }
69
- EOS
70
- end
71
-
72
- it "handles copyright option" do
73
- compiled = Uglifier.compile(source, :copyright => false)
74
- expect(compiled).not_to match(/Copyright/)
75
- end
76
-
77
- describe ":copyright" do
78
- subject { Uglifier.compile(source, :comments => :copyright) }
79
-
80
- it "preserves comments with string Copyright" do
81
- expect(subject).to match(/Copyright Notice/)
82
- expect(subject).to match(/Another Copyright/)
83
- end
84
-
85
- it "preserves comments that start with a bang (!)" do
86
- expect(subject).to match(/! BANG/)
87
- expect(subject).to match(/! Another Bang/)
88
- end
89
-
90
- it "ignores other comments" do
91
- expect(subject).not_to match(/INCLUDED/)
92
- expect(subject).not_to match(/A comment!/)
93
- end
94
- end
95
-
96
- describe ":jsdoc" do
97
- subject { Uglifier.compile(source, :output => { :comments => :jsdoc }) }
98
-
99
- it "preserves jsdoc license/preserve blocks" do
100
- expect(subject).to match(/Copyright Notice/)
101
- end
102
-
103
- it "ignores other comments" do
104
- expect(subject).not_to match(/Another Copyright/)
105
- end
106
- end
107
-
108
- describe ":all" do
109
- subject { Uglifier.compile(source, :comments => :all) }
110
-
111
- it "preserves all comments" do
112
- expect(subject).to match(/INCLUDED/)
113
- expect(subject).to match(/2011/)
114
- end
115
- end
116
-
117
- describe ":none" do
118
- subject { Uglifier.compile(source, :comments => :none) }
119
-
120
- it "omits all comments" do
121
- expect(subject).not_to match %r{//}
122
- expect(subject).not_to match(/\/\*/)
123
- end
124
- end
125
-
126
- describe "regular expression" do
127
- subject { Uglifier.compile(source, :comments => /included/i) }
128
-
129
- it "matches comment blocks with regex" do
130
- expect(subject).to match(/INCLUDED/)
131
- end
132
-
133
- it "omits other blocks" do
134
- expect(subject).not_to match(/2011/)
135
- end
136
- end
137
- end
138
-
139
- it "squeezes code only if squeeze is set to true" do
140
- code = "function a(a){if(a) { return 0; } else { return 1; }}"
141
- minified = Uglifier.compile(code, :squeeze => false)
142
- squeezed = Uglifier.compile(code, :squeeze => true)
143
- expect(minified.length).to be > squeezed.length
144
- end
145
-
146
- it "honors max line length" do
147
- code = "var foo = 123;function bar() { return foo; }"
148
- uglifier = Uglifier.new(:output => { :max_line_len => 20 }, :compress => false)
149
- expect(uglifier.compile(code).split("\n").map(&:length)).to all(be < 28)
150
- end
151
-
152
- it "hoists vars to top of the scope" do
153
- code = "function something() { var a = 1; a = 2; var b = 3; return a + b;}"
154
- minified = Uglifier.compile(code, :compress => { :hoist_vars => true })
155
- expect(minified).to match(/var \w,\w/)
156
- end
157
-
158
- it "forwards screw_ie8 option to UglifyJS" do
159
- code = "function something() { return g['switch']; }"
160
- expect(Uglifier.compile(code, :mangle => false, :screw_ie8 => true)).to match(/g\.switch/)
161
- expect(Uglifier.compile(code, :compress => false, :screw_ie8 => true)).to match(/g\.switch/)
162
- end
163
-
164
- it "can be configured to output only ASCII" do
165
- code = "function emoji() { return '\\ud83c\\ude01'; }"
166
- minified = Uglifier.compile(code, :output => { :ascii_only => true })
167
- expect(minified).to include("\\ud83c\\ude01")
168
- end
169
-
170
- it "escapes </script when asked to" do
171
- code = "function test() { return '</script>';}"
172
- minified = Uglifier.compile(code, :output => { :inline_script => true })
173
- expect(minified).not_to include("</script>")
174
- end
175
-
176
- it "quotes keys" do
177
- code = "var a = {foo: 1}"
178
- minified = Uglifier.compile(code, :output => { :quote_keys => true })
179
- expect(minified).to include('"foo"')
180
- end
181
-
182
- it "quotes unsafe keys by default" do
183
- code = 'var code = {"class": "", "\u200c":"A"}'
184
- expect(Uglifier.compile(code)).to include('"class"')
185
- expect(Uglifier.compile(code)).to include('"\u200c"')
186
-
187
- uglifier = Uglifier.new(:output => { :ascii_only => false, :quote_keys => false })
188
- expect(uglifier.compile(code)).to include(["200c".to_i(16)].pack("U*"))
189
- end
190
-
191
- it "handles constant definitions" do
192
- code = "if (BOOL) { var a = STR; var b = NULL; var c = NUM; }"
193
- defines = { "NUM" => 1234, "BOOL" => true, "NULL" => nil, "STR" => "str" }
194
- processed = Uglifier.compile(code, :define => defines)
195
- expect(processed).to include("a=\"str\"")
196
- expect(processed).not_to include("if")
197
- expect(processed).to include("b=null")
198
- expect(processed).to include("c=1234")
199
- end
200
-
201
- it "can disable IIFE negation" do
202
- code = "(function() { console.log('test')})();"
203
- disabled_negation = Uglifier.compile(code, :compress => { :negate_iife => false })
204
- expect(disabled_negation).not_to include("!")
205
- negation = Uglifier.compile(code, :compress => { :negate_iife => true })
206
- expect(negation).to include("!")
207
- end
208
-
209
- it "can drop console logging" do
210
- code = "(function() { console.log('test')})();"
211
- compiled = Uglifier.compile(code, :compress => { :drop_console => true })
212
- expect(compiled).not_to include("console")
213
- end
214
-
215
- it "processes @ngInject annotations" do
216
- code = <<-EOF
217
- /**
218
- * @ngInject
219
- */
220
- var f = function(foo, bar) { return foo + bar};
221
- EOF
222
- with_angular = Uglifier.compile(code, :compress => { :angular => true })
223
- without_angular = Uglifier.compile(code, :compress => { :angular => false })
224
- expect(with_angular).to include("f.$inject")
225
- expect(without_angular).not_to include("f.$inject")
226
- end
227
-
228
- it "keeps unused function arguments when keep_fargs option is set" do
229
- code = <<-EOF
230
- function plus(a, b, c) { return a + b};
231
- plus(1, 2);
232
- EOF
233
-
234
- options = lambda do |keep_fargs|
235
- {
236
- :mangle => false,
237
- :compress => {
238
- :keep_fargs => keep_fargs,
239
- :unsafe => true
240
- }
241
- }
242
- end
243
-
244
- expect(Uglifier.compile(code, options.call(false))).not_to include("c)")
245
- expect(Uglifier.compile(code, options.call(true))).to include("c)")
246
- end
247
-
248
- describe "Input Formats" do
249
- let(:code) { "function hello() { return 'hello world'; }" }
250
-
251
- it "handles strings" do
252
- expect(Uglifier.new.compile(code)).not_to be_empty
253
- end
254
-
255
- it "handles IO objects" do
256
- expect(Uglifier.new.compile(StringIO.new(code))).not_to be_empty
257
- end
258
- end
259
-
260
- describe "enclose" do
261
- let(:code) { "$.foo()" }
262
-
263
- it "encloses code with given arguments" do
264
- minified = Uglifier.compile(code, :enclose => { 'window.jQuery' => '$' })
265
- expect(minified).to match(/window.jQuery/)
266
- end
267
-
268
- it "handles multiple definitions" do
269
- definitions = [%w(lol lulz), %w(foo bar)]
270
- minified = Uglifier.compile(code, :enclose => definitions)
271
- expect(minified).to match(/lol,foo/)
272
- expect(minified).to match(/lulz,bar/)
273
- end
274
-
275
- it "wraps with function when given empty object" do
276
- minified = Uglifier.compile(code, :enclose => {})
277
- expect(minified).to match(/function\(/)
278
- end
279
- end
280
- end