opal-sprockets 0.4.8.1.0.3.7 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,79 +1,75 @@
1
1
  require 'spec_helper'
2
2
  require 'opal/sprockets/processor'
3
3
 
4
- describe Opal::Processor do
4
+ describe Opal::Sprockets::Processor do
5
5
  let(:pathname) { Pathname("/Code/app/mylib/opal/foo.#{ext}") }
6
- let(:environment) { double(Sprockets::Environment,
7
- cache: nil,
8
- :[] => nil,
9
- resolve: pathname.expand_path.to_s,
10
- engines: double(keys: %w[.rb .js .opal]),
11
- ) }
12
- let(:sprockets_context) { double(Sprockets::Context,
13
- logical_path: "foo.#{ext}",
14
- environment: environment,
15
- pathname: pathname,
6
+ let(:data) { "foo" }
7
+ let(:input) { {
8
+ environment: Opal::Sprockets::Environment.new.tap {|e| e.append_path "/Code/app/mylib/opal"},
9
+ data: data,
16
10
  filename: pathname.to_s,
17
- root_path: '/Code/app/mylib',
18
- is_a?: true,
19
- ) }
11
+ load_path: "/Code/app/mylib/opal",
12
+ metadata: {},
13
+ cache: Sprockets::Cache.new
14
+ } }
15
+
16
+ before do
17
+ allow(Sprockets::SourceMapUtils).to receive(:format_source_map)
18
+ allow(Sprockets::SourceMapUtils).to receive(:combine_source_maps)
19
+ end
20
20
 
21
21
  %w[.rb .opal].each do |ext|
22
- let(:ext) { ext }
22
+ describe %{with extension "#{ext}"} do
23
+ let(:ext) { ext }
23
24
 
24
- describe %Q{with extension "#{ext}"} do
25
25
  it "is registered for '#{ext}' files" do
26
- expect(Sprockets.engines[ext]).to eq(described_class)
26
+ mime_type = Sprockets.mime_types.find { |_,v| v[:extensions].include? ".rb" }.first
27
+ transformers = Sprockets.transformers[mime_type]
28
+ transformer = transformers["application/javascript"]
29
+ expect(transformer.processors).to include(described_class)
27
30
  end
28
31
 
29
- it "compiles and evaluates the template on #render" do
30
- template = described_class.new { |t| "puts 'Hello, World!'\n" }
31
- expect(template.render(sprockets_context)).to include('"Hello, World!"')
32
+ it "compiles the code" do
33
+ result = described_class.call(input.merge data: "puts 'Hello, World!'\n")
34
+
35
+ expect(result[:data]).to include('"Hello, World!"')
32
36
  end
33
- end
34
- end
35
37
 
36
- describe '.stubbed_files' do
37
- around do |e|
38
- config.stubbed_files.clear
39
- e.run
40
- config.stubbed_files.clear
41
- end
38
+ describe '.stubbed_files' do
39
+ it 'requires non-stubbed files' do
40
+ result = described_class.call(input.merge(data: 'require "set"'))
42
41
 
43
- let(:stubbed_file) { 'foo' }
44
- let(:template) { described_class.new { |t| "require #{stubbed_file.inspect}" } }
45
- let(:config) { Opal::Config }
42
+ expect(result[:required].first).to include("stdlib/set.rb")
43
+ end
46
44
 
47
- it 'usually require files' do
48
- expect(sprockets_context).to receive(:require_asset).with(stubbed_file)
49
- template.render(sprockets_context)
50
- end
45
+ it 'skips require of stubbed file' do
46
+ Opal::Config.stubbed_files << 'set'
47
+ result = described_class.call(input.merge(data: "require 'set'"))
51
48
 
52
- it 'skips require of stubbed file' do
53
- config.stubbed_files << stubbed_file.to_s
54
- expect(sprockets_context).not_to receive(:require_asset).with(stubbed_file)
55
- template.render(sprockets_context)
56
- end
49
+ expect(result[:required]).not_to include("set.rb")
50
+ end
57
51
 
58
- it 'marks a stubbed file as loaded' do
59
- config.stubbed_files << stubbed_file.to_s
60
- asset = double(dependencies: [], pathname: Pathname('bar'), logical_path: 'bar')
61
- allow(environment).to receive(:[]).with('bar.js') { asset }
62
- allow(environment).to receive(:engines) { {'.rb' => described_class, '.opal' => described_class} }
52
+ it 'marks a stubbed file as loaded' do
53
+ Opal::Config.stubbed_files << 'set'
54
+ result = described_class.call(input.merge(data: "require 'set'"))
63
55
 
64
- code = ::Opal::Sprockets.load_asset('bar')
65
- expect(code).to match(stubbed_file)
66
- end
67
- end
56
+ expect(result[:data]).not_to include(::Opal::Sprockets.load_asset('set'))
57
+ end
58
+ end
68
59
 
69
- describe '.cache_key' do
70
- it 'can be reset' do
71
- Opal::Config.arity_check_enabled = true
72
- old_cache_key = described_class.cache_key
73
- Opal::Config.arity_check_enabled = false
74
- expect(described_class.cache_key).to eq(old_cache_key)
75
- described_class.reset_cache_key!
76
- expect(described_class.cache_key).not_to eq(old_cache_key)
60
+ describe '.cache_key' do
61
+ it 'can be reset' do
62
+ old_cache_key = described_class.cache_key
63
+ Opal::Config.arity_check_enabled = !Opal::Config.arity_check_enabled
64
+ stale_cache_key = described_class.cache_key
65
+
66
+ described_class.reset_cache_key!
67
+ reset_cache_key = described_class.cache_key
68
+
69
+ expect(stale_cache_key).to eq(old_cache_key)
70
+ expect(reset_cache_key).not_to eq(old_cache_key)
71
+ end
72
+ end
77
73
  end
78
74
  end
79
75
  end
@@ -20,60 +20,130 @@ describe Opal::Sprockets::Server do
20
20
  end
21
21
 
22
22
  it 'serves assets with complex sprockets requires' do
23
- asset = app.sprockets['complex_sprockets']
23
+ asset = app.sprockets['complex_sprockets', accept: "application/javascript"]
24
24
  expect(asset).to be_truthy
25
25
 
26
- assets = asset.to_a.map do |sub_asset|
27
- sub_asset.logical_path.gsub(/\.self\.js$/, '.js')
26
+ assets = asset.metadata[:included].map do |sub_asset|
27
+ URI.parse(sub_asset).path.split(%r'/fixtures/|/stdlib/').last
28
28
  end
29
29
 
30
30
  %w[
31
- base64.js
32
- no_requires.js
33
- jst_file.js
34
- required_tree_test/required_file1.js
35
- required_tree_test/required_file2.js
31
+ base64.rb
32
+ no_requires.rb
33
+ jst_file.jst.ejs
34
+ required_tree_test/required_file1.rb
35
+ required_tree_test/required_file2.rb
36
36
  file_with_directives.js
37
37
  ].each do |logical_path|
38
38
  expect(assets).to include(logical_path)
39
39
  end
40
40
  end
41
41
 
42
+ it 'recompiles the asset when its dependencies change' do
43
+ does_include = proc do |it, what, what_not=[], what_else=nil, what_else_not=nil|
44
+ expect(it).to include what_else if what_else
45
+ expect(it).not_to include what_else_not if what_else_not
46
+ what.each { |i| expect(it).to include %{modules["required_tree_test/required_file#{i}"]} }
47
+ what_not.each { |i| expect(it).not_to include %{modules["required_tree_test/required_file#{i}"]} }
48
+ end
49
+
50
+ ["default", "debug"].each do |pipeline|
51
+ asset = app.sprockets['require_tree_test', pipeline: pipeline, accept: "application/javascript"]
52
+ expect(asset).to be_truthy
53
+ does_include.(asset.to_s, [1,2], [3], nil, "UNIQUESTRING")
54
+ get "/assets/require_tree_test.#{pipeline}.js"
55
+ does_include.(last_response.body, [1,2], [3], nil, "UNIQUESTRING")
56
+
57
+ sleep 1 # Make sure to modify mtime
58
+
59
+ File.write(__dir__+"/../fixtures/required_tree_test/required_file2.rb", "p 'UNIQUESTRING1'")
60
+
61
+ asset = app.sprockets['require_tree_test', pipeline: pipeline, accept: "application/javascript"]
62
+ expect(asset).to be_truthy
63
+ does_include.(asset.to_s, [1,2], [3], "UNIQUESTRING1")
64
+ get "/assets/require_tree_test.#{pipeline}.js"
65
+ does_include.(last_response.body, [1,2], [3], "UNIQUESTRING1")
66
+
67
+ sleep 1 # Make sure to modify mtime
68
+
69
+ File.write(__dir__+"/../fixtures/required_tree_test/required_file2.rb", "p 'UNIQUESTRING2'")
70
+
71
+ asset = app.sprockets['require_tree_test', pipeline: pipeline, accept: "application/javascript"]
72
+ expect(asset).to be_truthy
73
+ does_include.(asset.to_s, [1,2], [3], "UNIQUESTRING2")
74
+ get "/assets/require_tree_test.#{pipeline}.js"
75
+ does_include.(last_response.body, [1,2], [3], "UNIQUESTRING2")
76
+
77
+ sleep 1 # Make sure to modify mtime
78
+
79
+ File.write(__dir__+"/../fixtures/required_tree_test/required_file2.rb", "p 'UNIQUESTRING3'")
80
+ File.write(__dir__+"/../fixtures/required_tree_test/required_file3.rb", "p 3")
81
+
82
+ asset = app.sprockets['require_tree_test', pipeline: pipeline, accept: "application/javascript"]
83
+ expect(asset).to be_truthy
84
+ does_include.(asset.to_s, [1,2,3], [], "UNIQUESTRING3")
85
+ get "/assets/require_tree_test.#{pipeline}.js"
86
+ does_include.(last_response.body, [1,2], [], "UNIQUESTRING3") # fails with 3 - it doesn't get new files
87
+
88
+ sleep 1 # Make sure to modify mtime
89
+ ensure
90
+ File.write(__dir__+"/../fixtures/required_tree_test/required_file2.rb", "p 2\n")
91
+ File.unlink(__dir__+"/../fixtures/required_tree_test/required_file3.rb") rescue nil
92
+ end
93
+ end
94
+
42
95
  describe 'source maps' do
43
- RSpec::Matchers.define :include_inline_source_map do
96
+ RSpec::Matchers.define :include_source_map do
44
97
  match do |actual_response|
45
98
  actual_response.ok? &&
46
- actual_response.body.lines.last.start_with?('//# sourceMappingURL=data:application/json;base64,')
99
+ actual_response.body.lines.last.start_with?('//# sourceMappingURL=')
47
100
  end
48
101
  end
49
102
 
50
- def extract_inline_map(response)
103
+ def extract_map(path, response)
51
104
  last_line = response.body.lines.last
52
- b64_encoded = last_line.split('//# sourceMappingURL=data:application/json;base64,', 2)[1]
53
- json_string = Base64.decode64(b64_encoded)
105
+ if last_line.start_with? "//# sourceMappingURL=data:application/json;base64,"
106
+ b64_encoded = last_line.split('//# sourceMappingURL=data:application/json;base64,', 2)[1]
107
+ json_string = Base64.decode64(b64_encoded)
108
+ else
109
+ map_file = last_line.split('//# sourceMappingURL=', 2)[1].chomp
110
+ map_file = relative_path(path, map_file)
111
+ map_file = get map_file
112
+ json_string = map_file.body
113
+ end
54
114
  JSON.parse(json_string, symbolize_names: true)
55
115
  end
56
116
 
117
+ def relative_path(path, file)
118
+ URI.join("http://example.com/", path, file).path
119
+ end
120
+
57
121
  it 'serves map for a top level file' do
58
- get '/assets/opal_file.js'
59
- expect(last_response).to include_inline_source_map
122
+ path = '/assets/opal_file.debug.js'
123
+ get path
124
+ expect(last_response).to include_source_map
60
125
 
61
- map = extract_inline_map(last_response)
126
+ map = extract_map(path, last_response)
62
127
 
63
- expect(map[:sources]).to eq(['opal_file.rb']).or eq(['opal_file'])
64
- expect(map[:sourcesContent]).to eq(["require 'opal'\nputs 'hi from opal!'\n"])
128
+ expect(map[:file]).to eq('opal_file.rb')
129
+ expect(map[:sections].last[:map][:sources]).to eq(['opal_file.source.rb'])
130
+
131
+ expect(get(relative_path(path, map[:sections].last[:map][:sources][0])).body.chomp)
132
+ .to eq("require 'opal'\nputs 'hi from opal!'")
65
133
  end
66
134
 
67
135
  it 'serves map for a subfolder file' do
68
- get '/assets/source_map/subfolder/other_file.self.js'
69
- expect(last_response).to include_inline_source_map
136
+ path = '/assets/source_map/subfolder/other_file.debug.js'
137
+ get path
138
+ expect(last_response).to include_source_map
139
+
140
+ map = extract_map(path, last_response)
70
141
 
71
- map = extract_inline_map(last_response)
142
+ expect(map[:file]).to eq('source_map/subfolder/other_file.rb')
143
+ expect(map[:sections].first[:map][:sources]).to eq(['other_file.source.rb'])
72
144
 
73
- expect(map[:sources])
74
- .to eq(['source_map/subfolder/other_file.rb'])
75
- .or eq(['source_map/subfolder/other_file'])
76
- expect(map[:sourcesContent]).to eq(["puts 'other!'\n"])
145
+ expect(get(relative_path(path, map[:sections][0][:map][:sources][0])).body.chomp)
146
+ .to eq("puts 'other!'")
77
147
  end
78
148
  end
79
149
  end
@@ -15,7 +15,7 @@ describe Opal::Sprockets do
15
15
  allow(Opal::Config).to receive(:stubbed_files) { %w[foo bar] }
16
16
 
17
17
  code = described_class.load_asset('baz')
18
- expect(code).to include('Opal.loaded(["foo","bar"].concat(OpalLoaded || []));')
18
+ expect(code).to include(%{Opal.loaded(["foo","bar"].concat(typeof(OpalLoaded) === "undefined" ? [] : OpalLoaded));})
19
19
  expect(code).to include('Opal.require("baz");')
20
20
  end
21
21
 
@@ -42,7 +42,7 @@ describe Opal::Sprockets do
42
42
  it 'detects deprecated env with multiple names' do
43
43
  code = described_class.load_asset('foo', 'bar', env)
44
44
  expect(code).to eq([
45
- 'Opal.loaded(OpalLoaded || []);',
45
+ 'Opal.loaded(typeof(OpalLoaded) === "undefined" ? [] : OpalLoaded);',
46
46
  'Opal.require("foo");',
47
47
  'Opal.require("bar");',
48
48
  ].join("\n"))
@@ -5,7 +5,7 @@ describe Opal::TiltTemplate do
5
5
  %w[rb js.rb opal js.opal].each do |ext|
6
6
  let(:ext) { ext }
7
7
 
8
- describe %Q{with extension ".#{ext}"} do
8
+ describe %{with extension ".#{ext}"} do
9
9
  it "is registered for '.#{ext}' files" do
10
10
  expect(Tilt["test.#{ext}"]).to be <= described_class
11
11
  end
metadata CHANGED
@@ -1,15 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: opal-sprockets
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.8.1.0.3.7
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Elia Schito
8
8
  - Adam Beynon
9
- autorequire:
10
- bindir: bin
9
+ autorequire:
10
+ bindir: exe
11
11
  cert_chain: []
12
- date: 2019-09-14 00:00:00.000000000 Z
12
+ date: 2021-08-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sprockets
@@ -17,28 +17,34 @@ dependencies:
17
17
  requirements:
18
18
  - - "~>"
19
19
  - !ruby/object:Gem::Version
20
- version: '3.7'
20
+ version: '4.0'
21
21
  type: :runtime
22
22
  prerelease: false
23
23
  version_requirements: !ruby/object:Gem::Requirement
24
24
  requirements:
25
25
  - - "~>"
26
26
  - !ruby/object:Gem::Version
27
- version: '3.7'
27
+ version: '4.0'
28
28
  - !ruby/object:Gem::Dependency
29
29
  name: opal
30
30
  requirement: !ruby/object:Gem::Requirement
31
31
  requirements:
32
- - - "~>"
32
+ - - ">="
33
+ - !ruby/object:Gem::Version
34
+ version: '1.0'
35
+ - - "<"
33
36
  - !ruby/object:Gem::Version
34
- version: 1.0.0
37
+ version: '2.0'
35
38
  type: :runtime
36
39
  prerelease: false
37
40
  version_requirements: !ruby/object:Gem::Requirement
38
41
  requirements:
39
- - - "~>"
42
+ - - ">="
40
43
  - !ruby/object:Gem::Version
41
- version: 1.0.0
44
+ version: '1.0'
45
+ - - "<"
46
+ - !ruby/object:Gem::Version
47
+ version: '2.0'
42
48
  - !ruby/object:Gem::Dependency
43
49
  name: tilt
44
50
  requirement: !ruby/object:Gem::Requirement
@@ -109,19 +115,51 @@ dependencies:
109
115
  - - ">="
110
116
  - !ruby/object:Gem::Version
111
117
  version: '0'
112
- description: Sprockets support for Opal.
118
+ - !ruby/object:Gem::Dependency
119
+ name: ejs
120
+ requirement: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ type: :development
126
+ prerelease: false
127
+ version_requirements: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ - !ruby/object:Gem::Dependency
133
+ name: pry
134
+ requirement: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ type: :development
140
+ prerelease: false
141
+ version_requirements: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ description:
113
147
  email: elia@schito.me
114
148
  executables: []
115
149
  extensions: []
116
150
  extra_rdoc_files: []
117
151
  files:
152
+ - ".github/workflows/build.yml"
118
153
  - ".gitignore"
119
154
  - ".rspec"
120
- - ".travis.yml"
121
155
  - CHANGELOG.md
122
156
  - Gemfile
123
157
  - README.md
124
158
  - Rakefile
159
+ - bin/console
160
+ - bin/rake
161
+ - bin/rspec
162
+ - bin/setup
125
163
  - example/Gemfile
126
164
  - example/Gemfile.lock
127
165
  - example/app/application.rb
@@ -129,17 +167,20 @@ files:
129
167
  - example/config.ru
130
168
  - example/index.html.erb
131
169
  - lib/opal-sprockets.rb
170
+ - lib/opal/environment.rb
171
+ - lib/opal/processor.rb
132
172
  - lib/opal/sprockets.rb
173
+ - lib/opal/sprockets/assets_helper.rb
133
174
  - lib/opal/sprockets/environment.rb
134
175
  - lib/opal/sprockets/erb.rb
135
- - lib/opal/sprockets/path_reader.rb
176
+ - lib/opal/sprockets/mime_types.rb
136
177
  - lib/opal/sprockets/processor.rb
137
178
  - lib/opal/sprockets/server.rb
138
179
  - lib/opal/sprockets/version.rb
139
180
  - opal-sprockets.gemspec
140
181
  - spec/fixtures/complex_sprockets.js.rb.erb
141
182
  - spec/fixtures/file_with_directives.js
142
- - spec/fixtures/jst_file.js.jst
183
+ - spec/fixtures/jst_file.jst.ejs
143
184
  - spec/fixtures/no_requires.rb
144
185
  - spec/fixtures/opal_file.rb
145
186
  - spec/fixtures/require_tree_test.rb
@@ -150,19 +191,20 @@ files:
150
191
  - spec/fixtures/source_map/subfolder/other_file.rb
151
192
  - spec/fixtures/sprockets_file.js.rb
152
193
  - spec/fixtures/sprockets_require_tree_test.rb
153
- - spec/shared/path_finder_shared.rb
154
- - spec/shared/path_reader_shared.rb
155
194
  - spec/spec_helper.rb
156
195
  - spec/sprockets/erb_spec.rb
157
- - spec/sprockets/path_reader_spec.rb
158
196
  - spec/sprockets/processor_spec.rb
159
197
  - spec/sprockets/server_spec.rb
160
198
  - spec/sprockets_spec.rb
161
199
  - spec/tilt/opal_spec.rb
162
200
  homepage: https://github.com/opal/opal-sprockets#readme
163
- licenses: []
164
- metadata: {}
165
- post_install_message:
201
+ licenses:
202
+ - MIT
203
+ metadata:
204
+ homepage_uri: https://github.com/opal/opal-sprockets#readme
205
+ source_code_uri: https://github.com/opal/opal-sprockets
206
+ changelog_uri: https://github.com/opal/opal-sprockets/blob/master/CHANGELOG.md
207
+ post_install_message:
166
208
  rdoc_options: []
167
209
  require_paths:
168
210
  - lib
@@ -170,21 +212,24 @@ required_ruby_version: !ruby/object:Gem::Requirement
170
212
  requirements:
171
213
  - - ">="
172
214
  - !ruby/object:Gem::Version
173
- version: '0'
215
+ version: '2.5'
216
+ - - "<"
217
+ - !ruby/object:Gem::Version
218
+ version: '3.1'
174
219
  required_rubygems_version: !ruby/object:Gem::Requirement
175
220
  requirements:
176
221
  - - ">="
177
222
  - !ruby/object:Gem::Version
178
223
  version: '0'
179
224
  requirements: []
180
- rubygems_version: 3.0.3
181
- signing_key:
225
+ rubygems_version: 3.2.15
226
+ signing_key:
182
227
  specification_version: 4
183
228
  summary: Sprockets support for Opal.
184
229
  test_files:
185
230
  - spec/fixtures/complex_sprockets.js.rb.erb
186
231
  - spec/fixtures/file_with_directives.js
187
- - spec/fixtures/jst_file.js.jst
232
+ - spec/fixtures/jst_file.jst.ejs
188
233
  - spec/fixtures/no_requires.rb
189
234
  - spec/fixtures/opal_file.rb
190
235
  - spec/fixtures/require_tree_test.rb
@@ -195,11 +240,8 @@ test_files:
195
240
  - spec/fixtures/source_map/subfolder/other_file.rb
196
241
  - spec/fixtures/sprockets_file.js.rb
197
242
  - spec/fixtures/sprockets_require_tree_test.rb
198
- - spec/shared/path_finder_shared.rb
199
- - spec/shared/path_reader_shared.rb
200
243
  - spec/spec_helper.rb
201
244
  - spec/sprockets/erb_spec.rb
202
- - spec/sprockets/path_reader_spec.rb
203
245
  - spec/sprockets/processor_spec.rb
204
246
  - spec/sprockets/server_spec.rb
205
247
  - spec/sprockets_spec.rb