opal-optimizer 0.1.2 → 0.1.6
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/.github/workflows/build.yml +63 -0
- data/.gitignore +2 -0
- data/CHANGELOG.md +7 -0
- data/Gemfile +12 -6
- data/README.md +7 -4
- data/bin/opal-optimizer +1 -5
- data/exe/opal-optimizer +6 -0
- data/lib/opal/optimizer/step/collapse_stubs.rb +10 -5
- data/lib/opal/optimizer/step/tree_shaking.rb +39 -11
- data/lib/opal/optimizer/version.rb +1 -1
- data/lib/opal/optimizer.rb +8 -3
- metadata +8 -5
- data/Gemfile.lock +0 -85
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6498304a0ea20dac60d150ea41df0876ade32476a48a489daca24396686de528
|
4
|
+
data.tar.gz: e453ead6b82eedb0fd1c03fc38cd2de64a5d1ceda31a55a541e83f50b9ed76d8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bcbf6fb6a5f209e3cea950be73637504ce830c16a9ef8e7402156b64d82e8905c6406a12e0acbc52feb2a1770a4f869ca1c52b78c6f08b590c6c64df94d7c9c7
|
7
|
+
data.tar.gz: 941e429601ce081347bad1179f152f0dd5aa0f3b20374cf683e021ca1c00e5e078cd63e44476af127fcc8d21eb0f34b35c605df5ae9a129c2e28c3917c970a59
|
@@ -0,0 +1,63 @@
|
|
1
|
+
name: build
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches:
|
6
|
+
- master
|
7
|
+
- "*-stable"
|
8
|
+
- "*/ci-check"
|
9
|
+
pull_request: {}
|
10
|
+
|
11
|
+
jobs:
|
12
|
+
rake:
|
13
|
+
name: ${{ matrix.combo.name }}
|
14
|
+
strategy:
|
15
|
+
fail-fast: false
|
16
|
+
matrix:
|
17
|
+
combo:
|
18
|
+
- name: Opal-master
|
19
|
+
opal: master
|
20
|
+
- name: Opal-1.4
|
21
|
+
opal: 1.4
|
22
|
+
- name: Opal-1.3
|
23
|
+
opal: 1.3
|
24
|
+
- name: Opal-1.2
|
25
|
+
opal: 1.2
|
26
|
+
- name: Opal-1.1
|
27
|
+
opal: 1.1
|
28
|
+
- name: Opal-1.0
|
29
|
+
opal: '1.0'
|
30
|
+
- name: Ruby-head
|
31
|
+
ruby: head
|
32
|
+
- name: Windows
|
33
|
+
os: windows-latest
|
34
|
+
- name: macOS
|
35
|
+
os: macos-latest
|
36
|
+
|
37
|
+
runs-on: ${{ matrix.combo.os || 'ubuntu-latest' }}
|
38
|
+
|
39
|
+
steps:
|
40
|
+
- uses: actions/checkout@v2
|
41
|
+
- name: set environment variables
|
42
|
+
run: |
|
43
|
+
echo "OPAL_VERSION=${{ matrix.combo.opal || '1.3' }}" >> $GITHUB_ENV
|
44
|
+
- uses: ruby/setup-ruby@v1
|
45
|
+
with:
|
46
|
+
ruby-version: ${{ matrix.combo.ruby || '3.0' }}
|
47
|
+
- run: bundle lock
|
48
|
+
- uses: actions/cache@v2
|
49
|
+
with:
|
50
|
+
path: ./vendor/bundle
|
51
|
+
key: ${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-${{ matrix.combo.opal || '1.3' }}-${{ github.ref }}-${{ hashFiles('**/Gemfile.lock') }}
|
52
|
+
restore-keys: |
|
53
|
+
${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-${{ matrix.combo.opal || '1.3' }}-${{ github.ref }}
|
54
|
+
${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-${{ matrix.combo.opal || '1.3' }}-master
|
55
|
+
${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-${{ matrix.combo.opal || '1.3' }}-
|
56
|
+
${{ runner.os }}-${{ matrix.combo.ruby || '3.0' }}-gems-
|
57
|
+
- name: bundle install
|
58
|
+
run: |
|
59
|
+
bundle config path $PWD/vendor/bundle
|
60
|
+
bundle install --jobs 4 --retry 3
|
61
|
+
bundle clean
|
62
|
+
- run: bundle exec rake
|
63
|
+
|
data/.gitignore
CHANGED
data/CHANGELOG.md
ADDED
data/Gemfile
CHANGED
@@ -3,14 +3,20 @@ source "https://rubygems.org"
|
|
3
3
|
# Specify your gem's dependencies in opal-optimizer.gemspec
|
4
4
|
gemspec
|
5
5
|
|
6
|
-
gem "rake"
|
7
|
-
gem "rspec"
|
6
|
+
gem "rake"
|
7
|
+
gem "rspec"
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
case ENV['OPAL_VERSION']
|
10
|
+
when nil
|
11
|
+
when /\A[0-9.]+\z/
|
12
|
+
gem 'opal', "~> #{ENV['OPAL_VERSION']}.0a"
|
13
|
+
else
|
14
|
+
gem 'opal', github: 'opal/opal', ref: ENV['OPAL_VERSION']
|
15
|
+
end
|
16
|
+
gem "opal-sprockets"
|
17
|
+
gem "opal-browser"
|
12
18
|
|
13
|
-
gem "rkelly-turbo"
|
19
|
+
gem "rkelly-turbo"
|
14
20
|
|
15
21
|
gem "ruby-prof"
|
16
22
|
gem "pry"
|
data/README.md
CHANGED
@@ -1,8 +1,11 @@
|
|
1
1
|
# Opal::Optimizer
|
2
2
|
|
3
|
-
|
3
|
+
A utility to optimize the JavaScript output from Opal with a help of RKelly-Turbo JavaScript parser.
|
4
4
|
|
5
|
-
|
5
|
+
As of now it contains two steps:
|
6
|
+
|
7
|
+
* Tree shaking for Opal methods - if a named method is not called anywhere in the code, it's removed
|
8
|
+
* Collapsing stubs
|
6
9
|
|
7
10
|
## Installation
|
8
11
|
|
@@ -22,7 +25,7 @@ Or install it yourself as:
|
|
22
25
|
|
23
26
|
## Usage
|
24
27
|
|
25
|
-
|
28
|
+
For Sprockets environments, all you need is to `require "opal/optimizer/sprockets"` in your pipeline.
|
26
29
|
|
27
30
|
## Development
|
28
31
|
|
@@ -32,7 +35,7 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
|
|
32
35
|
|
33
36
|
## Contributing
|
34
37
|
|
35
|
-
Bug reports and pull requests are welcome on GitHub at https://github.com/
|
38
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/hmdne/opal-optimizer.
|
36
39
|
|
37
40
|
|
38
41
|
## License
|
data/bin/opal-optimizer
CHANGED
data/exe/opal-optimizer
ADDED
@@ -11,8 +11,12 @@ class CollapseStubs < Step
|
|
11
11
|
|
12
12
|
nodes = corelib_calls["add_stubs"] || []
|
13
13
|
nodes.each do |node|
|
14
|
-
|
15
|
-
|
14
|
+
if opal_version >= 1.4
|
15
|
+
stubs += node.arguments.value.first.value[1..-2].split(',').map(&"$".method(:+))
|
16
|
+
else
|
17
|
+
stubs += node.arguments.value.first.value.map do |i|
|
18
|
+
i.value.value.gsub(/['"]/, '')
|
19
|
+
end
|
16
20
|
end
|
17
21
|
|
18
22
|
node.destroy! "CollapseStubs"
|
@@ -25,12 +29,13 @@ class CollapseStubs < Step
|
|
25
29
|
|
26
30
|
stubs -= ["$respond_to_missing?"] if opal_version >= 1.1
|
27
31
|
|
28
|
-
|
29
|
-
|
32
|
+
|
33
|
+
new_stub_code = <<~JAVASCRIPT
|
34
|
+
var stubs = '#{stubs.to_a.join(',')}'.split(','), stubs_obj = {};
|
30
35
|
for (var i = 0; i < stubs.length; i++)
|
31
36
|
stubs_obj[stubs[i]] = {value: Opal.stub_for(stubs[i]), enumerable: false, configurable: true, writable: true};
|
32
37
|
Object.defineProperties(Opal.BasicObject.$$prototype, stubs_obj);
|
33
|
-
|
38
|
+
JAVASCRIPT
|
34
39
|
|
35
40
|
new_stub_code = parse_js(new_stub_code)
|
36
41
|
|
@@ -12,9 +12,10 @@ class TreeShaking < Step
|
|
12
12
|
method_defs = corelib_calls["def"] +
|
13
13
|
corelib_calls["defs"] +
|
14
14
|
corelib_calls["defn"] +
|
15
|
+
corelib_calls["udef"] +
|
15
16
|
aliases.keys
|
16
17
|
|
17
|
-
method_calls = Set.new
|
18
|
+
method_calls = Set.new(['$method_missing'])
|
18
19
|
|
19
20
|
method_calls += ( function_calls + exports.function_calls ).map do |i|
|
20
21
|
out = if i.value_path?(DotAccessorNode) && i.value.accessor.start_with?("$")
|
@@ -23,8 +24,12 @@ class TreeShaking < Step
|
|
23
24
|
StringNode === i.value.accessor &&
|
24
25
|
i.value.accessor.value[1] == '$'
|
25
26
|
i.value.accessor.value[1..-2]
|
26
|
-
elsif i.value_path?(ResolveNode,
|
27
|
-
|
27
|
+
elsif i.value_path?(ResolveNode, ->(i) { %w[$send $send2 $refined_send].include? i })
|
28
|
+
if i.value.value == '$send'
|
29
|
+
old = i.arguments.value[1]
|
30
|
+
else
|
31
|
+
old = i.arguments.value[2]
|
32
|
+
end
|
28
33
|
"$" + old.value[1..-2] if StringNode === old
|
29
34
|
end
|
30
35
|
|
@@ -44,16 +49,30 @@ class TreeShaking < Step
|
|
44
49
|
method_calls += aliases.values
|
45
50
|
|
46
51
|
# Protected methods
|
47
|
-
method_calls += [
|
52
|
+
method_calls += []
|
48
53
|
|
49
54
|
removed = Set.new
|
50
55
|
|
51
56
|
method_defs.each do |m|
|
52
57
|
name = m.arguments.value[1]
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
58
|
+
case name
|
59
|
+
when AddNode
|
60
|
+
if StringNode === name.left && StringNode === name.value
|
61
|
+
name = name.left.value[1..-2] + name.value.value[1..-2]
|
62
|
+
else
|
63
|
+
next
|
64
|
+
end
|
65
|
+
when StringNode
|
66
|
+
name = name.value[1..-2]
|
67
|
+
case m.value
|
68
|
+
when ResolveNode
|
69
|
+
name = "$" + name if m.value.value == "$alias"
|
70
|
+
when DotAccessorNode
|
71
|
+
name = "$" + name if m.value.accessor == "alias"
|
72
|
+
end
|
73
|
+
else
|
74
|
+
next
|
75
|
+
end
|
57
76
|
|
58
77
|
next if method_calls.include? name
|
59
78
|
|
@@ -62,8 +81,17 @@ class TreeShaking < Step
|
|
62
81
|
end
|
63
82
|
|
64
83
|
corelib_calls["add_stubs"].each do |stubcall|
|
65
|
-
|
66
|
-
|
84
|
+
if opal_version >= 1.4
|
85
|
+
stubs = stubcall.arguments.value.first.value
|
86
|
+
new_stubs = stubs[1..-2].split(",").reject do |i|
|
87
|
+
removed.include? i[1..-1]
|
88
|
+
end.join(',')
|
89
|
+
new_stubs = "'#{new_stubs}'"
|
90
|
+
stubs.replace(new_stubs)
|
91
|
+
else
|
92
|
+
stubcall.arguments.value.first.value.reject! do |i|
|
93
|
+
removed.include? i.value.value[1..-2]
|
94
|
+
end
|
67
95
|
end
|
68
96
|
end
|
69
97
|
|
@@ -73,7 +101,7 @@ class TreeShaking < Step
|
|
73
101
|
def run
|
74
102
|
loop do
|
75
103
|
removed = shake_methods
|
76
|
-
|
104
|
+
# $stdout.puts removed.inspect
|
77
105
|
reload
|
78
106
|
break if removed.length == 0
|
79
107
|
end
|
data/lib/opal/optimizer.rb
CHANGED
@@ -26,7 +26,11 @@ module Opal
|
|
26
26
|
elsif es.start_with?("(function(global_object) {\n \"use strict\";\n\n // @note\n "\
|
27
27
|
"// A few conventions for the documentation of this file:") &&
|
28
28
|
es.end_with?("TypeError.$$super = Error;\n}).call(this);")
|
29
|
-
|
29
|
+
if es.include? 'function $prop(object,'
|
30
|
+
@opal_version = 1.4
|
31
|
+
else
|
32
|
+
@opal_version = 1.1
|
33
|
+
end
|
30
34
|
end
|
31
35
|
end
|
32
36
|
|
@@ -46,8 +50,9 @@ module Opal
|
|
46
50
|
def reload
|
47
51
|
@function_calls = ast.pointcut(FunctionCallNode).matches
|
48
52
|
@corelib_calls = @function_calls.select do |i|
|
49
|
-
i.value_path?(DotAccessorNode, ResolveNode, "Opal")
|
50
|
-
|
53
|
+
i.value_path?(DotAccessorNode, ResolveNode, "Opal") ||
|
54
|
+
i.value_path?(ResolveNode, /\A\$/)
|
55
|
+
end.group_by { |i| (i.value.value.is_a?(String) ? i.value.value : i.value.accessor).gsub('$', '') }
|
51
56
|
@corelib_calls = Hash.new { [] }.merge(@corelib_calls)
|
52
57
|
end
|
53
58
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opal-optimizer
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- hmdne
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-12-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rkelly-turbo
|
@@ -40,21 +40,24 @@ dependencies:
|
|
40
40
|
version: 1.0.0
|
41
41
|
description:
|
42
42
|
email: []
|
43
|
-
executables:
|
43
|
+
executables:
|
44
|
+
- opal-optimizer
|
44
45
|
extensions: []
|
45
46
|
extra_rdoc_files: []
|
46
47
|
files:
|
48
|
+
- ".github/workflows/build.yml"
|
47
49
|
- ".gitignore"
|
48
50
|
- ".rspec"
|
49
51
|
- ".travis.yml"
|
52
|
+
- CHANGELOG.md
|
50
53
|
- Gemfile
|
51
|
-
- Gemfile.lock
|
52
54
|
- LICENSE.txt
|
53
55
|
- README.md
|
54
56
|
- Rakefile
|
55
57
|
- bin/console
|
56
58
|
- bin/opal-optimizer
|
57
59
|
- bin/setup
|
60
|
+
- exe/opal-optimizer
|
58
61
|
- lib/opal/optimizer.rb
|
59
62
|
- lib/opal/optimizer/helpers.rb
|
60
63
|
- lib/opal/optimizer/sprockets.rb
|
@@ -85,7 +88,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
85
88
|
- !ruby/object:Gem::Version
|
86
89
|
version: '0'
|
87
90
|
requirements: []
|
88
|
-
rubygems_version: 3.2.
|
91
|
+
rubygems_version: 3.2.22
|
89
92
|
signing_key:
|
90
93
|
specification_version: 4
|
91
94
|
summary: Optimize Opal's resulting javascript code
|
data/Gemfile.lock
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: ../opal-browser
|
3
|
-
specs:
|
4
|
-
opal-browser (0.2.0)
|
5
|
-
opal (>= 1.0, < 2.0)
|
6
|
-
paggio
|
7
|
-
|
8
|
-
PATH
|
9
|
-
remote: ../opal-sprockets
|
10
|
-
specs:
|
11
|
-
opal-sprockets (1.0.0)
|
12
|
-
opal (>= 1.0, < 1.2)
|
13
|
-
sprockets (~> 4.0)
|
14
|
-
tilt (>= 1.4)
|
15
|
-
|
16
|
-
PATH
|
17
|
-
remote: ../opal
|
18
|
-
specs:
|
19
|
-
opal (1.1.1)
|
20
|
-
ast (>= 2.3.0)
|
21
|
-
parser (~> 3.0)
|
22
|
-
|
23
|
-
PATH
|
24
|
-
remote: ../rkelly-turbo
|
25
|
-
specs:
|
26
|
-
rkelly-turbo (0.1.1.20210526224136)
|
27
|
-
|
28
|
-
PATH
|
29
|
-
remote: .
|
30
|
-
specs:
|
31
|
-
opal-optimizer (0.1.2)
|
32
|
-
opal (>= 1.0.0)
|
33
|
-
rkelly-turbo
|
34
|
-
|
35
|
-
GEM
|
36
|
-
remote: https://rubygems.org/
|
37
|
-
specs:
|
38
|
-
ast (2.4.2)
|
39
|
-
coderay (1.1.3)
|
40
|
-
concurrent-ruby (1.1.8)
|
41
|
-
diff-lcs (1.4.4)
|
42
|
-
method_source (1.0.0)
|
43
|
-
paggio (0.2.6)
|
44
|
-
parser (3.0.1.1)
|
45
|
-
ast (~> 2.4.1)
|
46
|
-
pry (0.13.1)
|
47
|
-
coderay (~> 1.1)
|
48
|
-
method_source (~> 1.0)
|
49
|
-
rack (2.2.3)
|
50
|
-
rake (12.3.3)
|
51
|
-
rspec (3.9.0)
|
52
|
-
rspec-core (~> 3.9.0)
|
53
|
-
rspec-expectations (~> 3.9.0)
|
54
|
-
rspec-mocks (~> 3.9.0)
|
55
|
-
rspec-core (3.9.2)
|
56
|
-
rspec-support (~> 3.9.3)
|
57
|
-
rspec-expectations (3.9.2)
|
58
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
59
|
-
rspec-support (~> 3.9.0)
|
60
|
-
rspec-mocks (3.9.1)
|
61
|
-
diff-lcs (>= 1.2.0, < 2.0)
|
62
|
-
rspec-support (~> 3.9.0)
|
63
|
-
rspec-support (3.9.3)
|
64
|
-
ruby-prof (1.4.3)
|
65
|
-
sprockets (4.0.2)
|
66
|
-
concurrent-ruby (~> 1.0)
|
67
|
-
rack (> 1, < 3)
|
68
|
-
tilt (2.0.10)
|
69
|
-
|
70
|
-
PLATFORMS
|
71
|
-
ruby
|
72
|
-
|
73
|
-
DEPENDENCIES
|
74
|
-
opal!
|
75
|
-
opal-browser!
|
76
|
-
opal-optimizer!
|
77
|
-
opal-sprockets!
|
78
|
-
pry
|
79
|
-
rake (~> 12.0)
|
80
|
-
rkelly-turbo!
|
81
|
-
rspec (~> 3.0)
|
82
|
-
ruby-prof
|
83
|
-
|
84
|
-
BUNDLED WITH
|
85
|
-
2.1.4
|