opal-sprockets 0.4.8.1.0.3.7 → 1.0.2

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.
@@ -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