uglifier 4.0.2 → 4.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 31b6c34eae2f765af9b53003813f2eb4ae66f65c
4
- data.tar.gz: 73fdb0caf90ddec9c11ddcf3e5f4be3d7d1a6e90
2
+ SHA256:
3
+ metadata.gz: 6eb829d19c603a2d3760e02f0235d9d654f640111734caa9317449378e40fa26
4
+ data.tar.gz: '0774580cb6353b90d72e5febfdc6777bc05c6d6d773b09e4aab3b82178fe8acd'
5
5
  SHA512:
6
- metadata.gz: a5c371d6bc95db7bc8eed1a5d1adbdcce11e0b68f6661ab8ce128d6ef61b38aedd01a2add5cd0a91520fe3e181bc22f2964b88dede7ea7c95448dbd20d187fa4
7
- data.tar.gz: 8d275b12e85a5643b1a7c5d399bc30d286e81ee112bbb9ce697b61284901ce2b4a85ef8149530f18929c77ac9617dd2c29da41cfb56917d5a38eb62a04dadf8e
6
+ metadata.gz: 81f5c10b9dd4b9c84a6fe850dfb45b30bb25e0d9b04fa089ff745683028d1733e6b0b1c92846788af96197ee8774d8a7d105b424bc88f38b0c5abab5971bded0
7
+ data.tar.gz: 3120b0abc086792140a2cdb3a8ecae725327c8c8ea7b55c49d98be196e97de526087583c5bb2b6a0c169e86277474e8ae8a82d6a02cc23cd58cf0276defff03a
@@ -0,0 +1,14 @@
1
+ name: Ruby
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ lint:
7
+ runs-on: ubuntu-latest
8
+
9
+ steps:
10
+ - uses: actions/checkout@v1
11
+ - uses: lautis/rubocop-action@master
12
+ name: Lint
13
+ env:
14
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
data/.rubocop.yml CHANGED
@@ -6,6 +6,9 @@ AllCops:
6
6
  - "vendor/**/*"
7
7
  - "gemfiles/vendor/**/*"
8
8
 
9
+ Metrics/AbcSize:
10
+ Max: 20
11
+
9
12
  Metrics/BlockLength:
10
13
  Enabled: true
11
14
  Exclude:
@@ -46,3 +49,6 @@ Style/Alias:
46
49
 
47
50
  Style/MutableConstant:
48
51
  Enabled: false
52
+
53
+ Style/ExpandPathArguments:
54
+ Enabled: false
data/.travis.yml CHANGED
@@ -5,29 +5,30 @@ rvm:
5
5
  - 1.9.3
6
6
  - 2.0.0
7
7
  - 2.1.10
8
- - 2.2.8
9
- - 2.3.5
10
- - 2.4.2
8
+ - 2.2.10
9
+ - 2.3.8
10
+ - 2.4.5
11
+ - 2.5.3
12
+ - 2.6.0
11
13
  - ruby-head
12
- - jruby-19mode
13
- - jruby-9.1.13.0
14
+ - jruby-9.2.5.0
14
15
  before_install:
15
- - gem install bundler -v 1.15.4
16
+ - gem install bundler -v 1.17.3
16
17
  git:
17
18
  submodules: false
18
19
  gemfile:
19
20
  - Gemfile
20
21
  matrix:
21
22
  include:
22
- - rvm: 2.4.2
23
+ - rvm: 2.5.3
23
24
  gemfile: gemfiles/rubyracer
24
- - rvm: jruby-9.1.13.0
25
+ - rvm: jruby-9.2.5.0
25
26
  gemfile: gemfiles/rubyrhino
26
- - rvm: 2.4.2
27
+ - rvm: 2.5.3
27
28
  gemfile: gemfiles/alaska
28
29
  env: ALASKA=1
29
30
  allow_failures:
30
- - rvm: 2.4.2
31
+ - rvm: 2.5.3
31
32
  gemfile: gemfiles/alaska
32
33
  env: ALASKA=1
33
34
  - rvm: ruby-head
data/CHANGELOG.md CHANGED
@@ -1,4 +1,97 @@
1
- ## 4.0.2
1
+ ## 4.2.0 (25 September 2019)
2
+
3
+ - show code context for error messages (#167)
4
+ - defer initialisation of ExecJS context to fix #165
5
+
6
+ ## 4.1.20 (17 November 2018)
7
+
8
+ - update UglifyJS to [3.4.8](https://github.com/mishoo/UglifyJS2/compare/v3.4.9...v3.4.8)
9
+
10
+ ## 4.1.19 (11 September 2018)
11
+
12
+ - update UglifyJS to [3.4.9](https://github.com/mishoo/UglifyJS2/compare/v3.4.7...v3.4.9)
13
+
14
+ ## 4.1.18 (09 August 2018)
15
+
16
+ - update UglifyJS to [3.4.7](https://github.com/mishoo/UglifyJS2/compare/v3.4.6...v3.4.7)
17
+
18
+ ## 4.1.17 (29 July 2018)
19
+
20
+ - update UglifyJS to [3.4.6](https://github.com/mishoo/UglifyJS2/compare/v3.4.5...v3.4.6)
21
+
22
+ ## 4.1.16 (22 July 2018)
23
+
24
+ - update UglifyJS to [3.4.5](https://github.com/mishoo/UglifyJS2/compare/v3.4.4...v3.4.5)
25
+
26
+ ## 4.1.15 (13 July 2018)
27
+
28
+ - update UglifyJS to [3.4.4](https://github.com/mishoo/UglifyJS2/compare/v3.4.3...v3.4.4)
29
+
30
+ ## 4.1.14 (02 July 2018)
31
+
32
+ - update UglifyJS to [3.4.3](https://github.com/mishoo/UglifyJS2/compare/v3.4.2...v3.4.3)
33
+
34
+ ## 4.1.13 (30 June 2018)
35
+
36
+ - update UglifyJS to [3.4.2](https://github.com/mishoo/UglifyJS2/compare/v3.4.1...v3.4.2)
37
+
38
+ ## 4.1.12 (20 June 2018)
39
+
40
+ - update UglifyJS to [3.4.1](https://github.com/mishoo/UglifyJS2/compare/v3.4.0...v3.4.1)
41
+
42
+ ## 4.1.11 (02 June 2018)
43
+
44
+ - update UglifyJS to [3.3.28](https://github.com/mishoo/UglifyJS2/compare/v3.3.22...v3.3.28)
45
+
46
+ ## 4.1.10 (21 April 2018)
47
+
48
+ - update UglifyJS to [3.3.22](https://github.com/mishoo/UglifyJS2/compare/v3.3.20...v3.3.22)
49
+
50
+ ## 4.1.9 (11 April 2018)
51
+
52
+ - update UglifyJS to [3.3.20](https://github.com/mishoo/UglifyJS2/compare/v3.3.16...v3.3.20)
53
+
54
+ ## 4.1.8 (14 March 2018)
55
+
56
+ - update UglifyJS to [3.3.15](https://github.com/mishoo/UglifyJS2/compare/v3.3.14...v3.3.15)
57
+
58
+ ## 4.1.7 (11 March 2018)
59
+
60
+ - update UglifyJS to [3.3.14](https://github.com/mishoo/UglifyJS2/compare/v3.3.10...v3.3.14)
61
+
62
+ ## 4.1.6 (08 February 2018)
63
+
64
+ - update UglifyJS to [3.3.10](https://github.com/mishoo/UglifyJS2/compare/v3.3.9...v3.3.10)
65
+ - update uglify-es to [3.3.10](https://github.com/mishoo/UglifyJS2/compare/harmony-v3.3.9...harmony-v3.3.10)
66
+
67
+ ## 4.1.5 (28 January 2018)
68
+
69
+ - update UglifyJS to [3.3.9](https://github.com/mishoo/UglifyJS2/compare/v3.3.8...v3.3.9)
70
+ - update uglify-es to [3.3.9](https://github.com/mishoo/UglifyJS2/compare/harmony-v3.3.8...harmony-v3.3.9)
71
+
72
+ ## 4.1.4 (22 January 2018)
73
+
74
+ - update UglifyJS to [3.3.8](https://github.com/mishoo/UglifyJS2/compare/v3.3.5...v3.3.8)
75
+ - update uglify-es to [3.3.8](https://github.com/mishoo/UglifyJS2/compare/harmony-v3.3.5...harmony-v3.3.8)
76
+
77
+ ## 4.1.3 (7 January 2018)
78
+
79
+ - update UglifyJS to 3.3.5
80
+
81
+ ## 4.1.2 (30 December 2017)
82
+
83
+ - update UglifyJS to 3.3.4
84
+
85
+ ## 4.1.1 (29 December 2017)
86
+
87
+ - update UglifyJS to 3.3.3
88
+
89
+ ## 4.1.0 (28 December 2017)
90
+
91
+ - update UglifyJS to 3.3.2
92
+ - `cascade` compress option is merged into `collapse_vars`
93
+
94
+ ## 4.0.2 (10 December 2017)
2
95
 
3
96
  - update UglifyJS to 3.2.2
4
97
  - show harmony suggestion when using for-of loops
data/CONTRIBUTING.md CHANGED
@@ -28,14 +28,19 @@ Then run tests using rake:
28
28
 
29
29
  git submodule update --init
30
30
 
31
- After that, UglifyJS and source-map are checked out under `vendor/uglifyjs` and `vendor/source-map`.
31
+ After that, UglifyJS can be updated to a specific version with rake task.
32
32
 
33
- Use Git commands (e.g. git checkout master) to change the included version. You can even write custom code to yourself. After changing the dependencies, compile new version of the bundled JS file using
33
+ rake uglifyjs:update VERSION=3.3.4
34
34
 
35
- bundle exec rake js
35
+ To compile JS with dependencies, run
36
36
 
37
- After this, the new JS is used in your development version.
37
+ rake uglifyjs:build
38
38
 
39
+ You can even write custom patches to UglifyJS in `vendor/uglifyjs` and `vendor/uglifyjs-harmony` directories and compile the bundles JS using the command above. However, for the changes to be releasable, they should be in UglifyJS repository.
40
+
41
+ To automatically update UglifyJS version and commit changes
42
+
43
+ rake uglifyjs VERSION=3.3.4
39
44
 
40
45
  ## Reporting issues
41
46
 
data/Gemfile CHANGED
@@ -2,4 +2,4 @@ source "https://rubygems.org"
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'rubocop', '~> 0.51.0', :group => [:development] if RUBY_VERSION >= '2.1'
5
+ gem 'rubocop', '~> 0.57.0', :group => [:development] if RUBY_VERSION >= '2.1'
data/README.md CHANGED
@@ -3,16 +3,44 @@
3
3
  Ruby wrapper for [UglifyJS](https://github.com/mishoo/UglifyJS2) JavaScript
4
4
  compressor.
5
5
 
6
- UglifyJS currently is known to work quite well with ES5. Experimental
7
- ES6/Harmony support can be enabled with `:harmony => true` option.
8
- See [UglifyJS2#448](https://github.com/mishoo/UglifyJS2/issues/448) for more
9
- details.
6
+ UglifyJS currently is extensively tested with ES5, but also includes experimental ES6/ES2015+/Harmony support.
10
7
 
11
- Transpiling to ES5 (with e.g. [babel-transpiler](https://github.com/babel/ruby-babel-transpiler)) is
12
- recommended. For directly minifying ES6 code, [Closure Compiler](https://github.com/documentcloud/closure-compiler) is a more suitable option.
8
+ More stable alternatives for working with ES6 code is to first transpile to ES5 with e.g. [babel-transpiler](https://github.com/babel/ruby-babel-transpiler) or using [Closure Compiler](https://github.com/documentcloud/closure-compiler) to directly minify ES6 code.
13
9
 
14
10
  [![Build Status](https://travis-ci.org/lautis/uglifier.svg?branch=master)](https://travis-ci.org/lautis/uglifier)
15
11
 
12
+ ## ES6 / ES2015+ / Harmony mode
13
+
14
+ When using Uglifier with ES6 syntax without any options, an error will be
15
+ thrown.
16
+
17
+ ```
18
+ Uglifier::Error: Unexpected token: punc ((). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).
19
+ ```
20
+
21
+ The experimental ES6 syntax support can be enabled by passing `:harmony => true`
22
+ option to Uglifier.
23
+
24
+ ```ruby
25
+ Uglifier.compile(js, harmony: true)
26
+ ```
27
+
28
+ ### Rails
29
+
30
+ When used in Rails, replace
31
+
32
+ ```ruby
33
+ config.assets.js_compressor = :uglifier
34
+ ```
35
+
36
+ with
37
+
38
+ ```ruby
39
+ config.assets.js_compressor = Uglifier.new(harmony: true)
40
+ ```
41
+
42
+ in `config/environments/production.rb`.
43
+
16
44
  ## Installation
17
45
 
18
46
  Uglifier is available as a ruby gem.
@@ -75,7 +103,7 @@ Available options and their defaults are
75
103
  },
76
104
  :mangle => {
77
105
  :eval => false, # Mangle names when eval of when is used in scope
78
- :except => ["$super"], # Argument names to be excluded from mangling
106
+ :reserved => ["$super"], # Argument names to be excluded from mangling
79
107
  :sort => false, # Assign shorter names to most frequently used variables. Often results in bigger output after gzip.
80
108
  :toplevel => false, # Mangle names declared in the toplevel scope
81
109
  :properties => false, # Mangle property names
@@ -107,7 +135,6 @@ Available options and their defaults are
107
135
  :hoist_vars => false, # Hoist var declarations
108
136
  :if_return => true, # Optimizations for if/return and if/continue
109
137
  :join_vars => true, # Join consecutive var statements
110
- :cascade => true, # Cascade sequences
111
138
  :collapse_vars => false, # Collapse single-use var and const definitions when possible.
112
139
  :reduce_funcs => false, # Inline single-use functions as function expressions. Depends on reduce_vars.
113
140
  :reduce_vars => false, # Collapse variables assigned with and used as constant values.
@@ -141,6 +168,7 @@ Available options and their defaults are
141
168
  :output_filename => nil, # The filename or URL where the minified output can be found
142
169
  :input_source_map => nil # The contents of the source map describing the input
143
170
  },
171
+ :error_context_lines => 8, # How many context lines surrounding the error line. Env var ERROR_CONTEXT_LINES overrides this option
144
172
  :harmony => false # Enable ES6/Harmony mode (experimental). Disabling mangling and compressing is recommended with Harmony mode.
145
173
  }
146
174
  ```
data/Rakefile CHANGED
@@ -7,34 +7,127 @@ RSpec::Core::RakeTask.new(:spec) do |spec|
7
7
  spec.pattern = FileList['spec/**/*_spec.rb']
8
8
  end
9
9
 
10
- desc "Rebuild lib/uglify.js"
11
- task :js do
12
- cd 'vendor/source-map/' do
13
- `npm install --no-package-lock --no-save`
10
+ def version
11
+ ENV.fetch('VERSION')
12
+ end
13
+
14
+ HEADER = "## next"
15
+
16
+ def changelog_tail
17
+ changelog = File.read("CHANGELOG.md")
18
+ if changelog.start_with?(HEADER)
19
+ changelog[HEADER.length + 2..-1]
20
+ else
21
+ "\n" + changelog
14
22
  end
23
+ end
24
+
25
+ def compare_url(from, to)
26
+ "https://github.com/mishoo/UglifyJS2/compare/#{from}...#{to}"
27
+ end
28
+
29
+ def previous_version
30
+ match = File.read("CHANGELOG.md").scan(/- update UglifyJS to \[(.*)\]\(/)
31
+ match ? match[0][0].chomp : nil
32
+ end
33
+
34
+ def git_commit(files, message)
35
+ `git add #{files.join(' ')}`
36
+ `git commit -S -m "#{message.gsub('"', "\\\"")}"`
37
+ end
15
38
 
16
- cd 'vendor/uglifyjs/' do
17
- # required to run ./uglifyjs2 --self; not bundled.
18
- `npm install --no-package-lock --no-save`
39
+ # rubocop:disable Metrics/BlockLength
40
+ namespace :uglifyjs do
41
+ desc "Update UglifyJS source to version specified in VERSION environment variable"
42
+ task :update do
43
+ cd 'vendor/uglifyjs' do
44
+ `git fetch && git checkout v#{version}`
45
+ end
19
46
  end
20
47
 
21
- cd 'vendor/uglifyjs-harmony' do
22
- # required to run ./uglifyjs2 --self; not bundled.
23
- `npm install --no-package-lock --no-save`
48
+ desc "Rebuild lib/uglify*.js"
49
+ task :build do
50
+ cd 'vendor/source-map/' do
51
+ `npm install --no-package-lock --no-save`
52
+ end
53
+
54
+ cd 'vendor/uglifyjs/' do
55
+ # required to run ./uglifyjs2 --self; not bundled.
56
+ `npm install --no-package-lock --no-save`
57
+ end
58
+
59
+ cd 'vendor/uglifyjs-harmony' do
60
+ # required to run ./uglifyjs2 --self; not bundled.
61
+ `npm install --no-package-lock --no-save`
62
+ end
63
+
64
+ FileUtils.cp("vendor/source-map/dist/source-map.js", "lib/source-map.js")
65
+
66
+ source = `./vendor/uglifyjs/bin/uglifyjs --self --comments /Copyright/`
67
+ File.write("lib/uglify.js", source)
68
+
69
+ harmony_source = `./vendor/uglifyjs-harmony/bin/uglifyjs --self --comments /Copyright/`
70
+ File.write("lib/uglify-harmony.js", harmony_source)
71
+
72
+ FileUtils.cp("vendor/split/split.js", "lib/split.js")
73
+ `patch -p1 -i patches/es5-string-split.patch`
24
74
  end
25
75
 
26
- FileUtils.cp("vendor/source-map/dist/source-map.js", "lib/source-map.js")
76
+ desc "Add UglifyJS version bump to changelog"
77
+ task :changelog do
78
+ url = compare_url("v#{previous_version}", "v#{version}")
79
+ item = "- update UglifyJS to [#{version}](#{url})"
80
+ changelog = "#{HEADER}\n\n#{item}\n#{changelog_tail}"
81
+ File.write("CHANGELOG.md", changelog)
82
+ end
27
83
 
28
- source = `./vendor/uglifyjs/bin/uglifyjs --self --comments /Copyright/`
29
- File.write("lib/uglify.js", source)
84
+ desc "Commit changes from UglifyJS version bump"
85
+ task :commit do
86
+ files = [
87
+ 'CHANGELOG.md',
88
+ 'lib/uglify.js',
89
+ 'lib/uglify-harmony.js',
90
+ 'vendor/uglifyjs',
91
+ 'vendor/uglifyjs-harmony'
92
+ ]
93
+ git_commit(files, "Update UglifyJS to #{version}")
94
+ end
95
+ end
96
+ # rubocop:enable Metrics/BlockLength
97
+
98
+ desc "Update UglifyJS to version specified in VERSION environment variable"
99
+ task :uglifyjs => ['uglifyjs:update', 'uglifyjs:build', 'uglifyjs:changelog', 'uglifyjs:commit']
30
100
 
31
- harmony_source = `./vendor/uglifyjs-harmony/bin/uglifyjs --self --comments /Copyright/`
32
- File.write("lib/uglify-harmony.js", harmony_source)
101
+ namespace :version do
102
+ desc "Write version to CHANGELOG.md"
103
+ task :changelog do
104
+ content = File.read("CHANGELOG.md")
105
+ date = Time.now.strftime("%d %B %Y")
106
+ File.write("CHANGELOG.md", content.gsub("## next", "## #{version} (#{date})"))
107
+ end
33
108
 
34
- FileUtils.cp("vendor/split/split.js", "lib/split.js")
35
- `patch -p1 -i patches/es5-string-split.patch`
109
+ desc "Write version to uglifier.rb"
110
+ task :ruby do
111
+ file = "lib/uglifier/version.rb"
112
+ content = File.read("lib/uglifier/version.rb")
113
+ File.write(file, content.gsub(/VERSION = "(.*)"/, "VERSION = \"#{version}\""))
114
+ end
115
+
116
+ desc "Commit changes from Uglifier version bump"
117
+ task :commit do
118
+ files = ["CHANGELOG.md", "lib/uglifier/version.rb"]
119
+ git_commit(files, "Bump version to #{version}")
120
+ end
121
+
122
+ desc "Create git tag for version"
123
+ task :tag do
124
+ `git tag -s -m "Version #{version}" v#{version}`
125
+ end
36
126
  end
37
127
 
128
+ desc "Update Uglifier to version specified in VERSION environment variable"
129
+ task :version => ['version:changelog', 'version:ruby', 'version:commit', 'version:tag']
130
+
38
131
  begin
39
132
  require 'rubocop/rake_task'
40
133
  RuboCop::RakeTask.new(:rubocop)
data/lib/uglifier.rb CHANGED
@@ -72,7 +72,6 @@ class Uglifier
72
72
  :hoist_vars => false, # Hoist var declarations
73
73
  :if_return => true, # Optimizations for if/return and if/continue
74
74
  :join_vars => true, # Join consecutive var statements
75
- :cascade => true, # Cascade sequences
76
75
  :collapse_vars => true, # Collapse single-use var and const definitions when possible.
77
76
  :reduce_funcs => false, # Inline single-use functions as function expressions. Depends on reduce_vars.
78
77
  :reduce_vars => false, # Collapse variables assigned with and used as constant values.
@@ -99,6 +98,7 @@ class Uglifier
99
98
  :toplevel => false,
100
99
  :ie8 => true, # Generate safe code for IE8
101
100
  :source_map => false, # Generate source map
101
+ :error_context_lines => 8, # How many lines surrounding the error line
102
102
  :harmony => false # Enable ES6/Harmony mode (experimental). Disabling mangling and compressing is recommended with Harmony mode.
103
103
  }
104
104
 
@@ -150,9 +150,6 @@ class Uglifier
150
150
  raise ArgumentError, "Invalid option: #{missing}"
151
151
  end
152
152
  @options = options
153
-
154
- source = harmony? ? source_with(HarmonySourcePath) : source_with(SourcePath)
155
- @context = ExecJS.compile(source)
156
153
  end
157
154
 
158
155
  # Minifies JavaScript code
@@ -181,6 +178,13 @@ class Uglifier
181
178
 
182
179
  private
183
180
 
181
+ def context
182
+ @context ||= begin
183
+ source = harmony? ? source_with(HarmonySourcePath) : source_with(SourcePath)
184
+ ExecJS.compile(source)
185
+ end
186
+ end
187
+
184
188
  def source_map_comments
185
189
  return '' unless @options[:source_map].respond_to?(:[])
186
190
 
@@ -189,9 +193,7 @@ class Uglifier
189
193
  suffix += "\n//# sourceMappingURL=" + @options[:source_map][:map_url]
190
194
  end
191
195
 
192
- if @options[:source_map][:url]
193
- suffix += "\n//# sourceURL=" + @options[:source_map][:url]
194
- end
196
+ suffix += "\n//# sourceURL=" + @options[:source_map][:url] if @options[:source_map][:url]
195
197
  suffix
196
198
  end
197
199
 
@@ -216,25 +218,77 @@ class Uglifier
216
218
  :ie8 => ie8?
217
219
  }
218
220
 
219
- parse_result(@context.call("uglifier", options), generate_map)
221
+ parse_result(context.call("uglifier", options), generate_map, options)
220
222
  end
221
223
 
222
224
  def harmony?
223
225
  @options[:harmony]
224
226
  end
225
227
 
226
- def error_message(result)
227
- result['error']['message'] +
228
- if result['error']['message'].start_with?("Unexpected token") && !harmony?
229
- ". To use ES6 syntax, harmony mode must be enabled with " \
230
- "Uglifier.new(:harmony => true)."
228
+ def harmony_error_message(message)
229
+ if message.start_with?("Unexpected token")
230
+ ". To use ES6 syntax, harmony mode must be enabled with " \
231
+ "Uglifier.new(:harmony => true)."
232
+ else
233
+ ""
234
+ end
235
+ end
236
+
237
+ def error_context_lines
238
+ @options.fetch(:error_context_lines, DEFAULTS[:error_context_lines]).to_i
239
+ end
240
+
241
+ def error_context_format_options(low, high, line_index, column)
242
+ line_width = high.to_s.size
243
+ {
244
+ :line_index => line_index,
245
+ :base_index => low,
246
+ :line_width => line_width,
247
+ :line_format => "\e[36m%#{line_width + 1}d\e[0m ", # cyan
248
+ :col => column
249
+ }
250
+ end
251
+
252
+ def format_error_line(line, options)
253
+ # light red
254
+ indicator = ' => '.rjust(options[:line_width] + 2)
255
+ colored_line = "#{line[0...options[:col]]}\e[91m#{line[options[:col]..-1]}"
256
+ "\e[91m#{indicator}\e[0m#{colored_line}\e[0m"
257
+ end
258
+
259
+ def format_lines(lines, options)
260
+ lines.map.with_index do |line, index|
261
+ if options[:base_index] + index == options[:line_index]
262
+ format_error_line(line, options)
231
263
  else
232
- ""
264
+ "#{options[:line_format] % (options[:base_index] + index + 1)}#{line}"
233
265
  end
266
+ end
267
+ end
268
+
269
+ def context_lines_message(source, line_number, column)
270
+ return if line_number.nil?
271
+
272
+ line_index = line_number - 1
273
+ lines = source.split("\n")
274
+
275
+ first_line = [line_index - error_context_lines, 0].max
276
+ last_line = [line_number + error_context_lines, lines.size].min
277
+ options = error_context_format_options(first_line, last_line, line_index, column)
278
+ context_lines = lines[first_line...last_line]
279
+
280
+ "--\n#{format_lines(context_lines, options).join("\n")}\n=="
281
+ end
282
+
283
+ def error_message(result, options)
284
+ err = result['error']
285
+ harmony_msg = harmony? ? '' : harmony_error_message(err['message'].to_s)
286
+ src_ctx = context_lines_message(options[:source], err['line'], err['col'])
287
+ "#{err['message']}#{harmony_msg}\n#{src_ctx}"
234
288
  end
235
289
 
236
- def parse_result(result, generate_map)
237
- raise Error, error_message(result) if result.has_key?('error')
290
+ def parse_result(result, generate_map, options)
291
+ raise Error, error_message(result, options) if result.has_key?('error')
238
292
 
239
293
  if generate_map
240
294
  [result['code'] + source_map_comments, result['map']]
@@ -347,10 +401,16 @@ class Uglifier
347
401
  end
348
402
 
349
403
  def output_options
350
- DEFAULTS[:output].merge(@options[:output] || {}).merge(
351
- :comments => comment_options,
352
- :quote_style => quote_style
353
- )
404
+ migrate_braces(DEFAULTS[:output].merge(@options[:output] || {}))
405
+ .merge(:comments => comment_options, :quote_style => quote_style)
406
+ end
407
+
408
+ def migrate_braces(options)
409
+ if harmony?
410
+ options
411
+ else
412
+ options.merge(:braces => options[:bracketize]).delete_if { |key| key == :bracketize }
413
+ end
354
414
  end
355
415
 
356
416
  def ie8?
@@ -450,9 +510,7 @@ class Uglifier
450
510
  source_map_options = @options[:source_map].is_a?(Hash) ? @options[:source_map] : {}
451
511
  sanitize_map_root(source_map_options.fetch(:input_source_map) do
452
512
  url = extract_source_mapping_url(source)
453
- if url && url.start_with?("data:")
454
- Base64.strict_decode64(url.split(",", 2)[-1])
455
- end
513
+ Base64.strict_decode64(url.split(",", 2)[-1]) if url && url.start_with?("data:")
456
514
  end)
457
515
  rescue ArgumentError, JSON::ParserError
458
516
  nil