jekyll-minify-js 0.1.1 → 0.2.1
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 +4 -4
- data/lib/color.rb +5 -0
- data/lib/jekyll-minify-js.rb +67 -75
- data/lib/version.rb +7 -0
- metadata +4 -30
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: c041f8521ebee7c8566cf323651ccc353420efeef273f8fc3bdfd02663e2b113
|
|
4
|
+
data.tar.gz: '09726cc6fa6a01c886401c88598e31d51ba8f484a769d90e2123bb54e14cb4a5'
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 23b0a1eba4256d7ebeda0a84438c5726ad7bd3c116458215835e2b3e2f96e480ba9b269f345ddf45eb88713620379d9e899341db7c90224a9686e72090824372
|
|
7
|
+
data.tar.gz: 4951af9f563429564fd604263d3c183d9185c61d21df851080519ab84425d4387f6c33821d22768dd75a1ff6193aee0351ad6781ed8274148a71387108496866
|
data/lib/color.rb
ADDED
data/lib/jekyll-minify-js.rb
CHANGED
|
@@ -2,63 +2,70 @@
|
|
|
2
2
|
|
|
3
3
|
require 'jekyll'
|
|
4
4
|
require 'fileutils'
|
|
5
|
-
require '
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
# terser gem not available; plugin will fallback to external CLI or copy
|
|
10
|
-
end
|
|
11
|
-
require 'pathname'
|
|
5
|
+
require 'terser'
|
|
6
|
+
|
|
7
|
+
require_relative 'version'
|
|
8
|
+
require_relative 'color'
|
|
12
9
|
|
|
13
10
|
# module Jekyll
|
|
14
11
|
module Jekyll
|
|
15
|
-
#
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
12
|
+
# module Jekyll::MinifyJs
|
|
13
|
+
module MinifyJs
|
|
14
|
+
# class Jekyll::MinifyJs:TerserGenerator
|
|
15
|
+
class TerserGenerator < Jekyll::Generator
|
|
16
|
+
safe true
|
|
17
|
+
priority :low
|
|
18
|
+
|
|
19
|
+
def generate(_site)
|
|
20
|
+
# Work is done in the :post_write hook to avoid Jekyll overwriting outputs.
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def self.run(site) # rubocop:disable Metrics/AbcSize,Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity
|
|
24
|
+
config = site.config['minify_js'] || {}
|
|
25
|
+
# disable to skip minification
|
|
26
|
+
return if config['enable'] && config['enable'] == false
|
|
27
|
+
|
|
28
|
+
started_at = Process.clock_gettime(Process::CLOCK_MONOTONIC)
|
|
29
|
+
# Build options from config
|
|
30
|
+
compress_opt = config['compress'] || true
|
|
31
|
+
mangle_opt = config['mangle'] || true
|
|
32
|
+
source_map_enabled = config['source_map'] || true
|
|
33
|
+
|
|
34
|
+
Jekyll.logger.info ''
|
|
35
|
+
Jekyll.logger.info set_color(96, "Running Jekyll MinifyJs v#{Jekyll::MinifyJs::VERSION}", 1)
|
|
36
|
+
|
|
37
|
+
entry_dir = config['entry_dir'] || 'js'
|
|
38
|
+
out_dir = config['output_dir'] || 'js'
|
|
39
|
+
|
|
40
|
+
if config['entry_dir']
|
|
41
|
+
Jekyll.logger.info "Entry : #{File.join(site.source, config['entry_dir'])}"
|
|
42
|
+
else
|
|
43
|
+
Jekyll.logger.info "Entry : No entry_dir found, look in #{File.join(site.source, 'js')}"
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if config['output_dir']
|
|
47
|
+
Jekyll.logger.info "Output : #{File.join(site.dest, config['output_dir'])}"
|
|
48
|
+
else
|
|
49
|
+
Jekyll.logger.info "Output : No output_dir found, write to #{File.join(site.dest, 'js')}"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
entry_dir_full = File.join(site.source, entry_dir)
|
|
53
|
+
out_dir_full = File.join(site.dest, out_dir)
|
|
54
|
+
js_files = Dir.glob(File.join(entry_dir_full, '**', '*.js'))
|
|
55
|
+
|
|
56
|
+
Jekyll.logger.warn 'MinifyJs:', "Entry directory not found: #{entry_dir_full}" unless Dir.exist?(entry_dir_full)
|
|
57
|
+
if Dir.exist?(entry_dir_full) && js_files.empty?
|
|
58
|
+
Jekyll.logger.info 'MinifyJs:',
|
|
59
|
+
"No JavaScript files found in #{entry_dir_full}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
FileUtils.mkdir_p(out_dir_full)
|
|
63
|
+
|
|
64
|
+
js_files.each do |src|
|
|
65
|
+
rel = src.sub(/\A#{Regexp.escape(entry_dir_full + File::SEPARATOR)}/, '')
|
|
66
|
+
out = File.join(out_dir_full, rel)
|
|
67
|
+
map_name = "#{File.basename(out)}.map"
|
|
25
68
|
|
|
26
|
-
def self.run(site) # rubocop:disable Metrics/AbcSize,Metrics/MethodLength,Metrics/CyclomaticComplexity,Metrics/PerceivedComplexity
|
|
27
|
-
# Support both repository-root layout and app/ layout.
|
|
28
|
-
candidates = [
|
|
29
|
-
File.join(site.source, 'assets', 'js'),
|
|
30
|
-
File.join(site.source, 'app', 'assets', 'js')
|
|
31
|
-
]
|
|
32
|
-
src_dir = candidates.find { |p| Dir.exist?(p) }
|
|
33
|
-
return unless src_dir
|
|
34
|
-
|
|
35
|
-
# Read configuration from _config.yml under `minify_js:` key
|
|
36
|
-
cfg = site.config.fetch('minify_js', {})
|
|
37
|
-
return if cfg.key?('enabled') && cfg['enabled'] == false
|
|
38
|
-
|
|
39
|
-
dest_dir = File.join(site.dest, cfg.fetch('output_dir', 'assets/js'))
|
|
40
|
-
FileUtils.mkdir_p(dest_dir)
|
|
41
|
-
|
|
42
|
-
terser_available = defined?(Terser)
|
|
43
|
-
|
|
44
|
-
# Build options from config
|
|
45
|
-
compress_opt = cfg.fetch('compress', true)
|
|
46
|
-
mangle_opt = cfg.fetch('mangle', true)
|
|
47
|
-
source_map_enabled = cfg.fetch('source_map', true)
|
|
48
|
-
exclude_patterns = cfg.fetch('exclude', ['**/*.min.js'])
|
|
49
|
-
|
|
50
|
-
Dir.glob(File.join(src_dir, '**', '*.js')).each do |src| # rubocop:disable Metrics/BlockLength
|
|
51
|
-
rel = Pathname.new(src).relative_path_from(Pathname.new(src_dir)).to_s
|
|
52
|
-
out = File.join(dest_dir, rel)
|
|
53
|
-
out_dir = File.dirname(out)
|
|
54
|
-
FileUtils.mkdir_p(out_dir)
|
|
55
|
-
map_name = "#{File.basename(out)}.map"
|
|
56
|
-
|
|
57
|
-
# Skip excluded files
|
|
58
|
-
next if exclude_patterns.any? { |pat| File.fnmatch(pat, rel) }
|
|
59
|
-
|
|
60
|
-
if terser_available
|
|
61
|
-
Jekyll.logger.info 'Terser:', "minifying #{rel} via terser Ruby gem"
|
|
62
69
|
begin
|
|
63
70
|
src_content = File.open(src, 'r:BOM|UTF-8', &:read)
|
|
64
71
|
options = {}
|
|
@@ -80,30 +87,15 @@ module Jekyll
|
|
|
80
87
|
Jekyll.logger.warn 'Terser:', "ruby terser failed for #{rel}: #{e.message}; copying original"
|
|
81
88
|
FileUtils.cp(src, out)
|
|
82
89
|
end
|
|
83
|
-
else
|
|
84
|
-
terser_cmd = new.detect_terser_cmd
|
|
85
|
-
if terser_cmd
|
|
86
|
-
cmd = %(#{terser_cmd} #{Shellwords.escape(src)} --compress --mangle -o #{Shellwords.escape(out)} --source-map "url='#{map_name}',includeSources") # rubocop:disable Layout/LineLength
|
|
87
|
-
Jekyll.logger.info 'Terser:', "minifying #{rel} via external terser"
|
|
88
|
-
success = system(cmd)
|
|
89
|
-
unless success && File.exist?(out)
|
|
90
|
-
Jekyll.logger.warn 'Terser:', "minify failed for #{rel}; copying original"
|
|
91
|
-
FileUtils.cp(src, out)
|
|
92
|
-
end
|
|
93
|
-
else
|
|
94
|
-
Jekyll.logger.warn 'Terser:', 'no terser available — copying original JS'
|
|
95
|
-
FileUtils.cp(src, out)
|
|
96
|
-
end
|
|
97
90
|
end
|
|
98
|
-
end
|
|
99
|
-
end
|
|
100
|
-
|
|
101
|
-
def detect_terser_cmd
|
|
102
|
-
# Prefer the bundler-installed terser (from the `terser` gem) via `bundle exec terser`.
|
|
103
|
-
return 'bundle exec terser' if system('bundle exec terser --version > /dev/null 2>&1')
|
|
104
|
-
return 'terser' if system('terser --version > /dev/null 2>&1')
|
|
105
91
|
|
|
106
|
-
|
|
92
|
+
elapsed = Process.clock_gettime(Process::CLOCK_MONOTONIC) - started_at
|
|
93
|
+
Jekyll.logger.info set_color(92, format('Done in %.2fs', elapsed), 1)
|
|
94
|
+
end
|
|
107
95
|
end
|
|
108
96
|
end
|
|
109
97
|
end
|
|
98
|
+
|
|
99
|
+
Jekyll::Hooks.register :site, :post_write do |site|
|
|
100
|
+
Jekyll::MinifyJs::TerserGenerator.run(site)
|
|
101
|
+
end
|
data/lib/version.rb
ADDED
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: jekyll-minify-js
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.2.1
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Pho Thin Maung
|
|
@@ -37,34 +37,6 @@ dependencies:
|
|
|
37
37
|
- - "~>"
|
|
38
38
|
- !ruby/object:Gem::Version
|
|
39
39
|
version: '4.4'
|
|
40
|
-
- !ruby/object:Gem::Dependency
|
|
41
|
-
name: pathname
|
|
42
|
-
requirement: !ruby/object:Gem::Requirement
|
|
43
|
-
requirements:
|
|
44
|
-
- - "~>"
|
|
45
|
-
- !ruby/object:Gem::Version
|
|
46
|
-
version: 0.4.0
|
|
47
|
-
type: :runtime
|
|
48
|
-
prerelease: false
|
|
49
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
-
requirements:
|
|
51
|
-
- - "~>"
|
|
52
|
-
- !ruby/object:Gem::Version
|
|
53
|
-
version: 0.4.0
|
|
54
|
-
- !ruby/object:Gem::Dependency
|
|
55
|
-
name: shellwords
|
|
56
|
-
requirement: !ruby/object:Gem::Requirement
|
|
57
|
-
requirements:
|
|
58
|
-
- - "~>"
|
|
59
|
-
- !ruby/object:Gem::Version
|
|
60
|
-
version: 0.2.2
|
|
61
|
-
type: :runtime
|
|
62
|
-
prerelease: false
|
|
63
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
-
requirements:
|
|
65
|
-
- - "~>"
|
|
66
|
-
- !ruby/object:Gem::Version
|
|
67
|
-
version: 0.2.2
|
|
68
40
|
- !ruby/object:Gem::Dependency
|
|
69
41
|
name: terser
|
|
70
42
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -85,8 +57,10 @@ extensions: []
|
|
|
85
57
|
extra_rdoc_files: []
|
|
86
58
|
files:
|
|
87
59
|
- LICENSE.txt
|
|
60
|
+
- lib/color.rb
|
|
88
61
|
- lib/jekyll-minify-js.rb
|
|
89
|
-
|
|
62
|
+
- lib/version.rb
|
|
63
|
+
homepage: https://github.com/phothinmg/jekyll-minify-js
|
|
90
64
|
licenses:
|
|
91
65
|
- MIT
|
|
92
66
|
metadata:
|