condenser 1.2 → 1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (51) hide show
  1. checksums.yaml +4 -4
  2. data/lib/condenser/asset.rb +69 -35
  3. data/lib/condenser/build_cache.rb +22 -9
  4. data/lib/condenser/context.rb +9 -25
  5. data/lib/condenser/helpers/parse_helpers.rb +8 -1
  6. data/lib/condenser/manifest.rb +3 -1
  7. data/lib/condenser/pipeline.rb +8 -3
  8. data/lib/condenser/processors/babel_processor.rb +9 -15
  9. data/lib/condenser/processors/css_media_combiner_processor.rb +81 -0
  10. data/lib/condenser/processors/js_analyzer.rb +41 -8
  11. data/lib/condenser/processors/node_processor.rb +1 -0
  12. data/lib/condenser/processors/purgecss_processor.rb +6 -4
  13. data/lib/condenser/processors/rollup_processor.rb +38 -36
  14. data/lib/condenser/resolve.rb +27 -6
  15. data/lib/condenser/templating_engine/ejs.rb +1 -1
  16. data/lib/condenser/transformers/dart_sass_transformer.rb +285 -0
  17. data/lib/condenser/transformers/jst_transformer.rb +67 -17
  18. data/lib/condenser/transformers/sass/functions.rb +133 -0
  19. data/lib/condenser/transformers/sass/importer.rb +48 -0
  20. data/lib/condenser/transformers/sass.rb +4 -0
  21. data/lib/condenser/transformers/sass_transformer.rb +124 -281
  22. data/lib/condenser/transformers/svg_transformer/base.rb +26 -0
  23. data/lib/condenser/transformers/svg_transformer/tag.rb +54 -0
  24. data/lib/condenser/transformers/svg_transformer/template.rb +151 -0
  25. data/lib/condenser/transformers/svg_transformer/template_error.rb +2 -0
  26. data/lib/condenser/transformers/svg_transformer/value.rb +13 -0
  27. data/lib/condenser/transformers/svg_transformer/var_generator.rb +10 -0
  28. data/lib/condenser/transformers/svg_transformer.rb +19 -0
  29. data/lib/condenser/version.rb +1 -1
  30. data/lib/condenser.rb +17 -5
  31. data/test/cache_test.rb +157 -18
  32. data/test/dependency_test.rb +51 -2
  33. data/test/manifest_test.rb +34 -0
  34. data/test/minifiers/terser_minifier_test.rb +0 -1
  35. data/test/minifiers/uglify_minifier_test.rb +0 -1
  36. data/test/postprocessors/css_media_combiner_test.rb +107 -0
  37. data/test/postprocessors/purgecss_test.rb +62 -0
  38. data/test/preprocessor/babel_test.rb +703 -298
  39. data/test/preprocessor/js_analyzer_test.rb +35 -2
  40. data/test/processors/rollup_test.rb +50 -20
  41. data/test/resolve_test.rb +18 -9
  42. data/test/server_test.rb +15 -10
  43. data/test/templates/ejs_test.rb +2 -11
  44. data/test/templates/erb_test.rb +0 -5
  45. data/test/test_helper.rb +8 -3
  46. data/test/transformers/dart_scss_test.rb +139 -0
  47. data/test/transformers/jst_test.rb +165 -21
  48. data/test/transformers/scss_test.rb +14 -0
  49. data/test/transformers/svg_test.rb +40 -0
  50. metadata +23 -6
  51. data/lib/condenser/transformers/sass_transformer/importer.rb +0 -50
@@ -4,8 +4,6 @@ class JSAnalyzerTest < ActiveSupport::TestCase
4
4
 
5
5
  def setup
6
6
  super
7
- @env.unregister_preprocessor 'application/javascript', Condenser::BabelProcessor
8
- @env.register_preprocessor 'application/javascript', Condenser::JSAnalyzer
9
7
  @env.unregister_minifier('application/javascript')
10
8
  end
11
9
 
@@ -250,4 +248,39 @@ class JSAnalyzerTest < ActiveSupport::TestCase
250
248
  assert_equal ['a.js', 'b.js'], asset.export_dependencies.map(&:filename)
251
249
  end
252
250
 
251
+ test "dependency tracking for a export from" do
252
+ file 'c.js', <<~JS
253
+ function c() { return 'ok'; }
254
+
255
+ export {c}
256
+ JS
257
+
258
+ file 'b.js', <<~JS
259
+ export {c} from 'c';
260
+
261
+ JS
262
+
263
+ file 'a.js', <<~JS
264
+ import {c} from 'b'
265
+
266
+ console.log(c());
267
+ JS
268
+
269
+ asset = assert_file 'a.js', 'application/javascript'
270
+ assert_equal ['/a.js', '/b.js', '/c.js'], asset.all_export_dependencies.map { |path| path.delete_prefix(@path) }
271
+ end
272
+
273
+ test 'exporting a nested object' do
274
+ file 't.js', <<~JS
275
+ export default {
276
+ registry: {
277
+ boolean: true,
278
+ integer: 1
279
+ }
280
+ };
281
+ JS
282
+
283
+ asset = assert_file 't.js', 'application/javascript'
284
+ end
285
+
253
286
  end
@@ -31,15 +31,14 @@ class RollupTest < ActiveSupport::TestCase
31
31
  (function () {
32
32
  'use strict';
33
33
 
34
- // This function isn't used anywhere, so
35
-
36
- function cube(x) {
34
+ // This function gets included
35
+ function cube ( x ) {
37
36
  return x * x * x;
38
37
  }
39
38
 
40
- console.log(cube(5)); // 125
39
+ console.log( cube( 5 ) ); // 125
41
40
 
42
- }());
41
+ })();
43
42
  FILE
44
43
  end
45
44
 
@@ -59,13 +58,13 @@ class RollupTest < ActiveSupport::TestCase
59
58
  (function () {
60
59
  'use strict';
61
60
 
62
- function cube(x) {
61
+ function cube ( x ) {
63
62
  return 2 * x * x;
64
63
  }
65
64
 
66
- console.log(cube(5)); // 125
65
+ console.log( cube( 5 ) ); // 125
67
66
 
68
- }());
67
+ })();
69
68
  FILE
70
69
  end
71
70
 
@@ -93,13 +92,13 @@ class RollupTest < ActiveSupport::TestCase
93
92
  (function () {
94
93
  'use strict';
95
94
 
96
- function cube(x) {
95
+ function cube ( x ) {
97
96
  return x * x * x;
98
97
  }
99
98
 
100
- console.log(cube(5)); // 125
99
+ console.log( cube( 5 ) ); // 125
101
100
 
102
- }());
101
+ })();
103
102
  FILE
104
103
  end
105
104
 
@@ -126,17 +125,17 @@ class RollupTest < ActiveSupport::TestCase
126
125
  (function () {
127
126
  'use strict';
128
127
 
129
- window.cube = function (x) {
128
+ window.cube = function ( x ) {
130
129
  return x * x * x;
131
130
  };
132
131
 
133
- window.square = function (x) {
132
+ window.square = function ( x ) {
134
133
  return x * x;
135
134
  };
136
135
 
137
- console.log(square(cube(5)));
136
+ console.log( square(cube( 5 )) );
138
137
 
139
- }());
138
+ })();
140
139
  FILE
141
140
  end
142
141
 
@@ -168,27 +167,58 @@ class RollupTest < ActiveSupport::TestCase
168
167
  (function () {
169
168
  'use strict';
170
169
 
171
- function cube(x) {
170
+ function cube ( x ) {
172
171
  return x * x * x;
173
172
  }
174
173
 
175
- function square(x) {
174
+ function square ( x ) {
176
175
  return x * x;
177
176
  }
178
177
 
179
178
  var maths = [cube, square];
180
179
 
181
180
  var x = 1;
182
-
183
181
  for (var i = 0; i < maths.length; i++) {
184
182
  x = maths[i](x);
185
183
  }
186
-
187
184
  console.log(x);
188
185
 
189
- }());
186
+ })();
190
187
  FILE
191
188
  $d = false
192
189
  end
193
190
 
191
+ test 'import the same file via relative require and full path' do
192
+ file "#{@npm_path}/module/base.js", <<~JS
193
+ export default class Base { };
194
+ JS
195
+
196
+ file "#{@npm_path}/module/base/other.js", <<~JS
197
+ import Base from '../base';
198
+
199
+ export default class Lower extends Base { };
200
+ JS
201
+
202
+ file 'main.js', <<~JS
203
+ import Other from 'module/base/other';
204
+ import Base from 'module/base';
205
+
206
+ console.log( Base, Other );
207
+ JS
208
+
209
+
210
+ assert_exported_file 'main.js', 'application/javascript', <<~FILE
211
+ (function () {
212
+ 'use strict';
213
+
214
+ class Base { }
215
+
216
+ class Lower extends Base { }
217
+
218
+ console.log( Base, Lower );
219
+
220
+ })();
221
+ FILE
222
+ end
223
+
194
224
  end
data/test/resolve_test.rb CHANGED
@@ -35,6 +35,16 @@ class ResolveTest < ActiveSupport::TestCase
35
35
  assert_equal ['test', '*', ['.js'], ['application/javascript']], @env.decompose_path('test/*.js')
36
36
  assert_equal ['test/*', '*', ['.js'], ['application/javascript']], @env.decompose_path('test/*/*.js')
37
37
  assert_equal ['test/**', '*', ['.js'], ['application/javascript']], @env.decompose_path('test/**/*.js')
38
+
39
+ assert_equal ['a', 'test', ['.js'], ['application/javascript']], @env.decompose_path('./test.js', 'a/b.js')
40
+ assert_equal [nil, 'test', ['.js'], ['application/javascript']], @env.decompose_path('./test.js', 'b.js')
41
+ assert_equal ['a/folder', 'test', ['.js'], ['application/javascript']], @env.decompose_path('./folder/test.js', 'a/b.js')
42
+ assert_equal ['folder', 'test', ['.js'], ['application/javascript']], @env.decompose_path('./folder/test.js', 'b.js')
43
+
44
+ assert_equal [nil, 'test', ['.js'], ['application/javascript']], @env.decompose_path('../test.js', 'a/b.js')
45
+ assert_equal ["/", 'test', ['.js'], ['application/javascript']], @env.decompose_path('../test.js', '/a/b.js')
46
+ assert_equal ["folder", 'test', ['.js'], ['application/javascript']], @env.decompose_path('../folder/test.js', 'a/b.js')
47
+ assert_equal ["/folder", 'test', ['.js'], ['application/javascript']], @env.decompose_path('../folder/test.js', '/a/b.js')
38
48
  end
39
49
 
40
50
  test 'resolve' do
@@ -83,7 +93,6 @@ class ResolveTest < ActiveSupport::TestCase
83
93
  @env.append_path File.join(@path, 'b')
84
94
  @env.append_path File.join(@path, 'a')
85
95
 
86
-
87
96
  assert_exported_file('main.js', 'application/javascript', <<~JS)
88
97
  (function () {
89
98
  'use strict';
@@ -94,7 +103,7 @@ class ResolveTest < ActiveSupport::TestCase
94
103
 
95
104
  console.log( cube( 5 ) ); // 125
96
105
 
97
- }());
106
+ })();
98
107
  JS
99
108
  end
100
109
 
@@ -111,15 +120,15 @@ class ResolveTest < ActiveSupport::TestCase
111
120
  end
112
121
 
113
122
  test 'resolve a file.*' do
114
- file 'file.js', 'console.log(1);'
115
- file 'file.scss', 'body { background: red; }'
116
- file 'test/file.scss', 'body { background: green; }'
123
+ file 'foo.js', 'console.log(1);'
124
+ file 'foo.scss', 'body { background: red; }'
125
+ file 'test/foo.scss', 'body { background: green; }'
117
126
 
118
- assert_equal %w(file.js file.scss), @env.resolve('file.*').map(&:filename)
119
- assert_equal %w(file.css file.js), @env.resolve('file.*', accept: ['text/css', 'application/javascript']).map(&:filename)
127
+ assert_equal %w(foo.js foo.scss), @env.resolve('foo.*').map(&:filename)
128
+ assert_equal %w(foo.css foo.js), @env.resolve('foo.*', accept: ['text/css', 'application/javascript']).map(&:filename)
120
129
 
121
- assert_equal %w(file.js file.scss test/file.scss), @env.resolve('**/file.*').map(&:filename)
122
- assert_equal %w(file.css file.js test/file.css), @env.resolve('**/file.*', accept: ['text/css', 'application/javascript']).map(&:filename)
130
+ assert_equal %w(foo.js foo.scss test/foo.scss), @env.resolve('**/foo.*').map(&:filename)
131
+ assert_equal %w(foo.css foo.js test/foo.css), @env.resolve('**/foo.*', accept: ['text/css', 'application/javascript']).map(&:filename)
123
132
  end
124
133
 
125
134
  end
data/test/server_test.rb CHANGED
@@ -27,10 +27,10 @@ class ServerTest < ActiveSupport::TestCase
27
27
  test "serve single source file" do
28
28
  get "/assets/foo.js"
29
29
  assert_equal 200, last_response.status
30
- assert_equal "43", last_response.headers['Content-Length']
30
+ assert_equal "15", last_response.headers['Content-Length']
31
31
  assert_equal "Accept-Encoding", last_response.headers['Vary']
32
32
  assert_equal <<~JS.strip, last_response.body
33
- !function(){"use strict";console.log(1)}();
33
+ console.log(1);
34
34
  JS
35
35
  end
36
36
 
@@ -54,7 +54,7 @@ class ServerTest < ActiveSupport::TestCase
54
54
 
55
55
  get "/assets/main.js"
56
56
  assert_equal <<~JS.strip, last_response.body
57
- !function(){"use strict";var o;console.log((o=5)*o*o)}();
57
+ !function(){var o;console.log((o=5)*o*o)}();
58
58
  JS
59
59
  end
60
60
 
@@ -73,7 +73,7 @@ class ServerTest < ActiveSupport::TestCase
73
73
  test "serve source with etag headers" do
74
74
  get "/assets/foo.js"
75
75
 
76
- digest = '9001f422e9c91516f6e130be56dd77aa313c52bb7dd18e4bb085067162c9fa70'
76
+ digest = '35c146f76e129477c64061bc84511e1090f3d4d8059713e6663dd4b35b1f7642'
77
77
  assert_equal "\"#{digest}\"", last_response.headers['ETag']
78
78
  end
79
79
 
@@ -107,8 +107,8 @@ class ServerTest < ActiveSupport::TestCase
107
107
  'HTTP_IF_NONE_MATCH' => "nope"
108
108
 
109
109
  assert_equal 200, last_response.status
110
- assert_equal '"9001f422e9c91516f6e130be56dd77aa313c52bb7dd18e4bb085067162c9fa70"', last_response.headers['ETag']
111
- assert_equal '43', last_response.headers['Content-Length']
110
+ assert_equal '"35c146f76e129477c64061bc84511e1090f3d4d8059713e6663dd4b35b1f7642"', last_response.headers['ETag']
111
+ assert_equal '15', last_response.headers['Content-Length']
112
112
  end
113
113
 
114
114
  test "not modified partial response with fingerprint and if-none-match etags match" do
@@ -167,8 +167,8 @@ class ServerTest < ActiveSupport::TestCase
167
167
  'HTTP_IF_MATCH' => etag
168
168
 
169
169
  assert_equal 200, last_response.status
170
- assert_equal '"9001f422e9c91516f6e130be56dd77aa313c52bb7dd18e4bb085067162c9fa70"', last_response.headers['ETag']
171
- assert_equal '43', last_response.headers['Content-Length']
170
+ assert_equal '"35c146f76e129477c64061bc84511e1090f3d4d8059713e6663dd4b35b1f7642"', last_response.headers['ETag']
171
+ assert_equal '15', last_response.headers['Content-Length']
172
172
  end
173
173
 
174
174
  test "precondition failed with if-match is a mismatch" do
@@ -224,7 +224,12 @@ class ServerTest < ActiveSupport::TestCase
224
224
  assert_equal "pass", last_response.headers['X-Cascade']
225
225
  end
226
226
 
227
- test "re-throw JS exceptions in the browser" do
227
+ test "re-throw JS exceptions in the browser when using babel" do
228
+ @env.unregister_preprocessor('application/javascript', Condenser::JSAnalyzer)
229
+ @env.register_preprocessor 'application/javascript', Condenser::BabelProcessor.new(@path,
230
+ presets: [ ['@babel/preset-env', { modules: false, targets: { browsers: 'firefox > 41' } }] ]
231
+ )
232
+
228
233
  file 'error.js', "var error = {;"
229
234
 
230
235
  get "/assets/error.js"
@@ -248,7 +253,7 @@ class ServerTest < ActiveSupport::TestCase
248
253
  JS
249
254
  get "/assets/%E6%97%A5%E6%9C%AC%E8%AA%9E.js"
250
255
  assert_equal <<~JS.strip, last_response.body
251
- !function(){"use strict";console.log("日本語")}();
256
+ console.log("日本語");
252
257
  JS
253
258
  end
254
259
 
@@ -4,7 +4,6 @@ class CondenserEJSTest < ActiveSupport::TestCase
4
4
 
5
5
  def setup
6
6
  super
7
- @env.unregister_preprocessor('application/javascript', Condenser::BabelProcessor)
8
7
  @env.unregister_exporter('application/javascript', Condenser::RollupProcessor)
9
8
  end
10
9
 
@@ -15,14 +14,10 @@ class CondenserEJSTest < ActiveSupport::TestCase
15
14
  import { escape } from 'ejs';
16
15
  export default function (locals) {
17
16
  var __output = [],
18
- __append = __output.push.bind(__output);
19
-
17
+ __append = __output.push.bind(__output);
20
18
  __append("1");
21
-
22
19
  __append(escape(1 + 1));
23
-
24
20
  __append("3\\n");
25
-
26
21
  return __output.join("");
27
22
  }
28
23
  JS
@@ -35,14 +30,10 @@ class CondenserEJSTest < ActiveSupport::TestCase
35
30
  import { escape } from 'ejs';
36
31
  export default function (locals) {
37
32
  var __output = [],
38
- __append = __output.push.bind(__output);
39
-
33
+ __append = __output.push.bind(__output);
40
34
  __append("1");
41
-
42
35
  __append(escape(locals.input));
43
-
44
36
  __append("3\\n");
45
-
46
37
  return __output.join("");
47
38
  }
48
39
  JS
@@ -2,11 +2,6 @@ require 'test_helper'
2
2
 
3
3
  class CondenserErubiTest < ActiveSupport::TestCase
4
4
 
5
- def setup
6
- super
7
- @env.unregister_preprocessor('application/javascript', Condenser::BabelProcessor)
8
- end
9
-
10
5
  test 'find' do
11
6
  file 'test.js.erb', "1<%= 1 + 1 %>3\n"
12
7
 
data/test/test_helper.rb CHANGED
@@ -39,6 +39,7 @@ class ActiveSupport::TestCase
39
39
  @env.unregister_writer(Condenser::BrotliWriter)
40
40
  @env.context_class.class_eval do
41
41
  def asset_path(path, options = {})
42
+ path = environment.find!(path, options).path
42
43
  "/assets/#{path}"
43
44
  end
44
45
  end
@@ -52,9 +53,10 @@ class ActiveSupport::TestCase
52
53
  assert_equal json, jbuild(&block)
53
54
  end
54
55
 
55
- def file(name, source)
56
- dir = File.join(@path, File.dirname(name))
57
- path = File.join(@path, name)
56
+ def file(name, source, base: nil)
57
+ base ||= @path
58
+ dir = name.include?('/') ? File.join(base, File.dirname(name)) : base
59
+ path = File.join(base, name)
58
60
 
59
61
  FileUtils.mkdir_p(dir)
60
62
  if File.exist?(path)
@@ -62,6 +64,7 @@ class ActiveSupport::TestCase
62
64
  sleep(1 - stat) if stat < 1
63
65
  end
64
66
  File.write(path, source)
67
+ sleep 0.25 if @env.build_cache.listening
65
68
  end
66
69
 
67
70
  def rm(name)
@@ -76,6 +79,7 @@ class ActiveSupport::TestCase
76
79
  assert_equal path.delete_prefix('/'), asset.filename
77
80
  assert_equal Array(mime_types), asset.content_types
78
81
  assert_equal(source.rstrip, asset.source.rstrip) if !source.nil?
82
+ asset
79
83
  end
80
84
 
81
85
  def assert_exported_file(path, mime_types, source=nil)
@@ -86,6 +90,7 @@ class ActiveSupport::TestCase
86
90
  assert_equal path, asset.filename
87
91
  assert_equal Array(mime_types), asset.content_types
88
92
  assert_equal(source.rstrip, asset.source.rstrip) if !source.nil?
93
+ asset
89
94
  end
90
95
 
91
96
  end
@@ -0,0 +1,139 @@
1
+ require 'test_helper'
2
+
3
+ class CondenserDartSCSSTest < ActiveSupport::TestCase
4
+
5
+ def setup
6
+ super
7
+ @env.clear_pipeline
8
+ @env.register_transformer 'text/scss', 'text/css', Condenser::DartScssTransformer
9
+ end
10
+
11
+ test 'find' do
12
+ file 'test.scss', <<~SCSS
13
+ body {
14
+ background-color: green;
15
+
16
+ &:hover {
17
+ background-color: blue;
18
+ }
19
+ }
20
+ SCSS
21
+
22
+ assert_file 'test.css', 'text/css', <<~CSS
23
+ body {
24
+ background-color: green;
25
+ }
26
+ body:hover {
27
+ background-color: blue;
28
+ }
29
+ CSS
30
+ end
31
+
32
+ test 'scss import globing' do
33
+ file "c/dir/a.scss", "body { color: blue; }"
34
+ file "c/dir/b.scss", "body { color: green; }"
35
+
36
+ file 'c/test.scss', '@import "./dir/*"'
37
+
38
+ assert_file 'c/test.css', 'text/css', <<~CSS
39
+ body {
40
+ color: blue;
41
+ }
42
+
43
+ body {
44
+ color: green;
45
+ }
46
+ CSS
47
+
48
+ file 'c/test2.scss', '@import "c/dir/*"'
49
+
50
+ assert_file 'c/test2.css', 'text/css', <<~CSS
51
+ body {
52
+ color: blue;
53
+ }
54
+
55
+ body {
56
+ color: green;
57
+ }
58
+ CSS
59
+ end
60
+
61
+ test "url functions" do
62
+ file 'a.scss', <<~SCSS
63
+ body {
64
+ color: green; }
65
+ SCSS
66
+
67
+ file 'test.scss', <<~SCSS
68
+ @import 'a';
69
+
70
+ div {
71
+ url: asset-url("foo.svg");
72
+ url: image-url("foo.png");
73
+ url: video-url("foo.mov");
74
+ url: audio-url("foo.mp3");
75
+ url: font-url("foo.woff2");
76
+ url: font-url("foo.woff");
77
+ url: javascript-url("foo.js");
78
+ url: stylesheet-url("foo.css");
79
+ }
80
+ SCSS
81
+
82
+ file 'foo.svg', ''
83
+ file 'foo.png', ''
84
+ file 'foo.mov', ''
85
+ file 'foo.mp3', ''
86
+ file 'foo.woff2', ''
87
+ file 'foo.woff', ''
88
+ file 'foo.js', ''
89
+ file 'foo.css', ''
90
+
91
+ assert_file 'test.css', 'text/css', <<~CSS
92
+ body {
93
+ color: green;
94
+ }
95
+
96
+ div {
97
+ url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.svg);
98
+ url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.png);
99
+ url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.mov);
100
+ url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.mp3);
101
+ url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.woff2);
102
+ url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.woff);
103
+ url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.js);
104
+ url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css);
105
+ }
106
+ CSS
107
+
108
+ asset = @env.find('test.css')
109
+ assert_equal ["a.scss", "foo.svg", "foo.png", "foo.mov", "foo.mp3", "foo.woff2", "foo.woff", "foo.js", "foo.css"], asset.process_dependencies.map(&:filename)
110
+ assert_equal ["a.scss", "foo.svg", "foo.png", "foo.mov", "foo.mp3", "foo.woff2", "foo.woff", "foo.js", "foo.css"], asset.export_dependencies.map(&:filename)
111
+ end
112
+
113
+ test "sass dependencies" do
114
+ file 'd.scss', <<~SCSS
115
+ $secondary-color: #444;
116
+ SCSS
117
+
118
+ file 'a.scss', <<~SCSS
119
+ @import 'd';
120
+ $primary-color: #333;
121
+ SCSS
122
+
123
+ file 'b.scss', <<~SCSS
124
+ body {
125
+ color: $primary-color;
126
+ }
127
+ SCSS
128
+
129
+ file 'c.scss', <<~SCSS
130
+ @import 'a';
131
+ @import 'b';
132
+ SCSS
133
+
134
+ asset = @env.find('c.css')
135
+ assert_equal ["a.scss", "d.scss", "b.scss"], asset.process_dependencies.map(&:filename)
136
+ assert_equal ["a.scss", "d.scss", "b.scss"], asset.export_dependencies.map(&:filename)
137
+ end
138
+
139
+ end