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
@@ -2,23 +2,23 @@ require 'test_helper'
2
2
 
3
3
  class JSTTransformerTest < ActiveSupport::TestCase
4
4
 
5
- test 'jst transoformation' do
5
+ test 'jst transformation' do
6
6
  file 'test.jst', <<~SCSS
7
7
  import {escape} from 'ejs';
8
8
  export default function (locals) {
9
9
  var __output = [], __append = __output.push.bind(__output);
10
10
  __append("<div class=\\"uniformLoader\\n");
11
- if(typeof transparent != "undefined") {
11
+ if(typeof transparent != "undefined") {
12
12
  __append(" -transparent");
13
- }
13
+ }
14
14
  __append("\\n");
15
- if(typeof cover != "undefined") {
15
+ if(typeof cover != "undefined") {
16
16
  __append(" -cover");
17
- }
17
+ }
18
18
  __append("\\n");
19
- if(typeof light != "undefined") {
19
+ if(typeof light != "undefined") {
20
20
  __append(" -light");
21
- }
21
+ }
22
22
  __append(" ");
23
23
  __append( klass );
24
24
  __append("\\">\\n <div class=\\"uniformLoader-container\\">\\n <span></span>\\n <span></span>\\n <span></span>\\n </div>\\n</div>");
@@ -27,41 +27,185 @@ class JSTTransformerTest < ActiveSupport::TestCase
27
27
  SCSS
28
28
 
29
29
  assert_file 'test.js', 'application/javascript', <<~JS
30
- import _bindInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/bind";
31
30
  import { escape } from 'ejs';
32
31
  export default function (locals) {
33
- var _context;
34
-
35
32
  var __output = [],
36
- __append = _bindInstanceProperty(_context = __output.push).call(_context, __output);
37
-
33
+ __append = __output.push.bind(__output);
38
34
  __append("<div class=\\"uniformLoader\\n");
39
-
40
35
  if (typeof locals.transparent != "undefined") {
41
36
  __append(" -transparent");
42
37
  }
43
-
44
38
  __append("\\n");
45
-
46
39
  if (typeof locals.cover != "undefined") {
47
40
  __append(" -cover");
48
41
  }
49
-
50
42
  __append("\\n");
51
-
52
43
  if (typeof locals.light != "undefined") {
53
44
  __append(" -light");
54
45
  }
55
-
56
46
  __append(" ");
57
-
58
47
  __append(locals.klass);
59
-
60
48
  __append("\\">\\n <div class=\\"uniformLoader-container\\">\\n <span></span>\\n <span></span>\\n <span></span>\\n </div>\\n</div>");
61
-
62
49
  return __output.join("");
63
50
  }
64
51
  JS
65
52
  end
66
53
 
54
+ test 'jst transformation with object' do
55
+ file 'test.jst', <<~SCSS
56
+ import {append as __ejx_append} from 'ejx';
57
+ export default function (locals) {
58
+ var __output = [];
59
+ __ejx_append(avatarTemplate({ account: account }), __output);
60
+ return __output;
61
+ }
62
+ SCSS
63
+
64
+ assert_file 'test.js', 'application/javascript', <<~JS
65
+ import { append as __ejx_append } from 'ejx';
66
+ export default function (locals) {
67
+ var __output = [];
68
+ __ejx_append(locals.avatarTemplate({
69
+ account: locals.account
70
+ }), __output);
71
+ return __output;
72
+ }
73
+ JS
74
+ end
75
+
76
+ test 'jst with transformation scope test of a defined function' do
77
+ file 'test.jst', <<~SCSS
78
+ import {append as __ejx_append} from 'ejx';
79
+ export default function (locals) {
80
+ var __output = [];
81
+
82
+ function x(files) {
83
+ return files.test();
84
+ }
85
+
86
+ class B {
87
+ }
88
+
89
+ models.map(m => m.name)
90
+
91
+ __ejx_append(avatarTemplate({ account: x(files), klass: B }), __output);
92
+ return __output;
93
+ }
94
+ SCSS
95
+
96
+ assert_file 'test.js', 'application/javascript', <<~JS
97
+ import { append as __ejx_append } from 'ejx';
98
+ export default function (locals) {
99
+ var __output = [];
100
+ function x(files) {
101
+ return files.test();
102
+ }
103
+ class B {}
104
+ locals.models.map(m => m.name);
105
+ __ejx_append(locals.avatarTemplate({
106
+ account: x(locals.files),
107
+ klass: B
108
+ }), __output);
109
+ return __output;
110
+ }
111
+ JS
112
+ end
113
+
114
+ test 'jst with transformation shadow variable example' do
115
+ file 'test.jst', <<~JS
116
+ import {append as __ejx_append} from 'ejx';
117
+ export default async function (locals) {
118
+ function f (items, template) {
119
+ return items.map((file) => {
120
+ const row = template(file);
121
+ const bar = row.querySelector('.progress-bar');
122
+ file.onprogress = (n) => { row.style.width = "" + n + "%"; }
123
+
124
+ return row;
125
+ });
126
+ }
127
+ __ejx_append(f(items, (f) => { return __v; }));
128
+ return __output;
129
+ }
130
+ JS
131
+
132
+ assert_file 'test.js', 'application/javascript', <<~JS
133
+ import { append as __ejx_append } from 'ejx';
134
+ export default async function (locals) {
135
+ function f(items, template) {
136
+ return items.map(file => {
137
+ const row = template(file);
138
+ const bar = row.querySelector('.progress-bar');
139
+ file.onprogress = n => {
140
+ row.style.width = "" + n + "%";
141
+ };
142
+ return row;
143
+ });
144
+ }
145
+ __ejx_append(f(locals.items, f => {
146
+ return locals.__v;
147
+ }));
148
+ return locals.__output;
149
+ }
150
+ JS
151
+ end
152
+
153
+ test 'try/catch example' do
154
+ file 'test.jst', <<~JS
155
+ import {append as __ejx_append} from 'ejx';
156
+ export default function (locals) {
157
+ var __output = [];
158
+ try {
159
+ __ejx_append(avatarTemplate({ account: account }), __output);
160
+ } catch (e) {
161
+ console.error(e);
162
+ }
163
+
164
+ console.error(e);
165
+
166
+ return __output;
167
+ }
168
+ JS
169
+
170
+ assert_file 'test.js', 'application/javascript', <<~JS
171
+ import { append as __ejx_append } from 'ejx';
172
+ export default function (locals) {
173
+ var __output = [];
174
+ try {
175
+ __ejx_append(locals.avatarTemplate({
176
+ account: locals.account
177
+ }), __output);
178
+ } catch (e) {
179
+ console.error(e);
180
+ }
181
+ console.error(locals.e);
182
+ return __output;
183
+ }
184
+ JS
185
+ end
186
+
187
+ test 'splats' do
188
+ file 'test.jst', <<~JS
189
+ import {append as __ejx_append} from 'ejx';
190
+ export default function (locals) {
191
+ var __output = [];
192
+
193
+ var x = ((...args) => { return y(...args); })(z, y);
194
+
195
+ return __output;
196
+ }
197
+ JS
198
+
199
+ assert_file 'test.js', 'application/javascript', <<~JS
200
+ import { append as __ejx_append } from 'ejx';
201
+ export default function (locals) {
202
+ var __output = [];
203
+ var x = ((...args) => {
204
+ return locals.y(...args);
205
+ })(locals.z, locals.y);
206
+ return __output;
207
+ }
208
+ JS
209
+ end
210
+
67
211
  end
@@ -47,7 +47,14 @@ class CondenserSCSSTest < ActiveSupport::TestCase
47
47
  end
48
48
 
49
49
  test "url functions" do
50
+ file 'a.scss', <<~SCSS
51
+ body {
52
+ color: green; }
53
+ SCSS
54
+
50
55
  file 'test.scss', <<~SCSS
56
+ @import 'a';
57
+
51
58
  div {
52
59
  url: asset-url("foo.svg");
53
60
  url: image-url("foo.png");
@@ -70,6 +77,9 @@ class CondenserSCSSTest < ActiveSupport::TestCase
70
77
  file 'foo.css', ''
71
78
 
72
79
  assert_file 'test.css', 'text/css', <<~CSS
80
+ body {
81
+ color: green; }
82
+
73
83
  div {
74
84
  url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.svg);
75
85
  url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.png);
@@ -80,6 +90,10 @@ class CondenserSCSSTest < ActiveSupport::TestCase
80
90
  url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.js);
81
91
  url: url(/assets/foo-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css); }
82
92
  CSS
93
+
94
+ asset = @env.find('test.css')
95
+ 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)
96
+ 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)
83
97
  end
84
98
 
85
99
  test "sass dependencies" do
@@ -0,0 +1,40 @@
1
+ require 'test_helper'
2
+
3
+ class SVGTransformerTest < ActiveSupport::TestCase
4
+
5
+ test 'svg transoformation' do
6
+ file 'test.svg', <<~SCSS
7
+ <?xml version="1.0" encoding="utf-8"?>
8
+ <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
9
+ <svg version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="612px" height="612px" viewBox="0 0 612 612" xml:space="preserve">
10
+ <path fill="#fff" d="M5.817,606.299c7.729,7.614,20.277,7.614,28.007,0L192.448,450.2c44.267,35.333,100.622,56.586,162.067,56.586c142.211,0,257.487-113.439,257.487-253.393C612.003,113.439,496.727,0,354.516,0S97.028,113.439,97.009,253.393c0,65.424,25.424,124.879,66.802,169.834L5.8,578.714C-1.929,586.328-1.929,598.686,5.817,606.299z"/>
11
+ </svg>
12
+ SCSS
13
+
14
+ assert_file 'test.js', 'application/javascript', <<~JS
15
+ export default function (svgAttributes) {
16
+ var __a = document.createElementNS("http://www.w3.org/2000/svg", "svg");
17
+ __a.setAttribute("version", "1.1");
18
+ __a.setAttribute("xmlns", "http://www.w3.org/2000/svg");
19
+ __a.setAttribute("xmlns:xlink", "http://www.w3.org/1999/xlink");
20
+ __a.setAttribute("width", "612px");
21
+ __a.setAttribute("height", "612px");
22
+ __a.setAttribute("viewBox", "0 0 612 612");
23
+ __a.setAttribute("xml:space", "preserve");
24
+ var __b = document.createElementNS("http://www.w3.org/2000/svg", "path");
25
+ __b.setAttribute("fill", "#fff");
26
+ __b.setAttribute("d", "M5.817,606.299c7.729,7.614,20.277,7.614,28.007,0L192.448,450.2c44.267,35.333,100.622,56.586,162.067,56.586c142.211,0,257.487-113.439,257.487-253.393C612.003,113.439,496.727,0,354.516,0S97.028,113.439,97.009,253.393c0,65.424,25.424,124.879,66.802,169.834L5.8,578.714C-1.929,586.328-1.929,598.686,5.817,606.299z");
27
+ __a.append(__b);
28
+
29
+ if (svgAttributes) {
30
+ Object.keys(svgAttributes).forEach(function (key) {
31
+ __a.setAttribute(key, svgAttributes[key]);
32
+ });
33
+ }
34
+
35
+ return __a;
36
+ }
37
+ JS
38
+ end
39
+
40
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: condenser
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.2'
4
+ version: '1.4'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Bracy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-12-18 00:00:00.000000000 Z
11
+ date: 2024-06-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: erubi
@@ -238,14 +238,14 @@ dependencies:
238
238
  requirements:
239
239
  - - "~>"
240
240
  - !ruby/object:Gem::Version
241
- version: 0.0.7
241
+ version: 0.1.0
242
242
  type: :development
243
243
  prerelease: false
244
244
  version_requirements: !ruby/object:Gem::Requirement
245
245
  requirements:
246
246
  - - "~>"
247
247
  - !ruby/object:Gem::Version
248
- version: 0.0.7
248
+ version: 0.1.0
249
249
  description: Condenser is a Rack-based asset packaging system that concatenates and
250
250
  serves JavaScript, CSS, Sass, and SCSS.
251
251
  email:
@@ -324,6 +324,7 @@ files:
324
324
  - lib/condenser/minifiers/uglify_minifier.rb
325
325
  - lib/condenser/pipeline.rb
326
326
  - lib/condenser/processors/babel_processor.rb
327
+ - lib/condenser/processors/css_media_combiner_processor.rb
327
328
  - lib/condenser/processors/js_analyzer.rb
328
329
  - lib/condenser/processors/node_processor.rb
329
330
  - lib/condenser/processors/purgecss_processor.rb
@@ -332,9 +333,19 @@ files:
332
333
  - lib/condenser/server.rb
333
334
  - lib/condenser/templating_engine/ejs.rb
334
335
  - lib/condenser/templating_engine/erb.rb
336
+ - lib/condenser/transformers/dart_sass_transformer.rb
335
337
  - lib/condenser/transformers/jst_transformer.rb
338
+ - lib/condenser/transformers/sass.rb
339
+ - lib/condenser/transformers/sass/functions.rb
340
+ - lib/condenser/transformers/sass/importer.rb
336
341
  - lib/condenser/transformers/sass_transformer.rb
337
- - lib/condenser/transformers/sass_transformer/importer.rb
342
+ - lib/condenser/transformers/svg_transformer.rb
343
+ - lib/condenser/transformers/svg_transformer/base.rb
344
+ - lib/condenser/transformers/svg_transformer/tag.rb
345
+ - lib/condenser/transformers/svg_transformer/template.rb
346
+ - lib/condenser/transformers/svg_transformer/template_error.rb
347
+ - lib/condenser/transformers/svg_transformer/value.rb
348
+ - lib/condenser/transformers/svg_transformer/var_generator.rb
338
349
  - lib/condenser/utils.rb
339
350
  - lib/condenser/version.rb
340
351
  - lib/condenser/writers/brotli_writer.rb
@@ -350,6 +361,7 @@ files:
350
361
  - test/minifiers/terser_minifier_test.rb
351
362
  - test/minifiers/uglify_minifier_test.rb
352
363
  - test/pipeline_test.rb
364
+ - test/postprocessors/css_media_combiner_test.rb
353
365
  - test/postprocessors/purgecss_test.rb
354
366
  - test/preprocessor/babel_test.rb
355
367
  - test/preprocessor/js_analyzer_test.rb
@@ -359,8 +371,10 @@ files:
359
371
  - test/templates/ejs_test.rb
360
372
  - test/templates/erb_test.rb
361
373
  - test/test_helper.rb
374
+ - test/transformers/dart_scss_test.rb
362
375
  - test/transformers/jst_test.rb
363
376
  - test/transformers/scss_test.rb
377
+ - test/transformers/svg_test.rb
364
378
  - test/writers/brotli_writer_test.rb
365
379
  - test/writers/zlib_writer_test.rb
366
380
  homepage: https://github.com/malomalo/condenser
@@ -384,7 +398,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
384
398
  - !ruby/object:Gem::Version
385
399
  version: '0'
386
400
  requirements: []
387
- rubygems_version: 3.1.4
401
+ rubygems_version: 3.5.4
388
402
  signing_key:
389
403
  specification_version: 4
390
404
  summary: A Rack-based asset packaging system
@@ -398,6 +412,7 @@ test_files:
398
412
  - test/minifiers/terser_minifier_test.rb
399
413
  - test/minifiers/uglify_minifier_test.rb
400
414
  - test/pipeline_test.rb
415
+ - test/postprocessors/css_media_combiner_test.rb
401
416
  - test/postprocessors/purgecss_test.rb
402
417
  - test/preprocessor/babel_test.rb
403
418
  - test/preprocessor/js_analyzer_test.rb
@@ -407,7 +422,9 @@ test_files:
407
422
  - test/templates/ejs_test.rb
408
423
  - test/templates/erb_test.rb
409
424
  - test/test_helper.rb
425
+ - test/transformers/dart_scss_test.rb
410
426
  - test/transformers/jst_test.rb
411
427
  - test/transformers/scss_test.rb
428
+ - test/transformers/svg_test.rb
412
429
  - test/writers/brotli_writer_test.rb
413
430
  - test/writers/zlib_writer_test.rb
@@ -1,50 +0,0 @@
1
- require "sassc"
2
-
3
- class Condenser::SassTransformer
4
- class Importer < SassC::Importer
5
-
6
- def imports(name, base)
7
- name = expand_path(name, base)
8
- env = options[:condenser][:environment]
9
- accept = extensions.keys.map { |x| options[:condenser][:environment].extensions[x] }
10
-
11
- options[:asset][:process_dependencies] << [name, accept.map{ |i| [i] }]
12
-
13
- imports = []
14
- env.resolve(name, accept: accept).sort_by(&:filename).each do |asset|
15
- next if asset.filename == options[:filename]
16
- imports << Import.new(asset.filename, source: asset.source, source_map_path: nil)
17
- end
18
-
19
- if imports.empty? && env.npm_path
20
- package = File.join(env.npm_path, name, 'package.json')
21
- if File.exists?(package)
22
- package = JSON.parse(File.read(package))
23
- if package['style']
24
- imports << Import.new(name, source: File.read(File.join(env.npm_path, name, package['style'])), source_map_path: nil)
25
- end
26
- end
27
- end
28
-
29
- raise Condenser::FileNotFound, "couldn't find file '#{name}'" if imports.empty?
30
-
31
- imports
32
- end
33
-
34
- # Allow .css files to be @imported
35
- def extensions
36
- { '.sass' => :sass, '.scss' => :scss, '.css' => :scss }
37
- end
38
-
39
- private
40
-
41
- def expand_path(path, base=nil)
42
- if path.start_with?('.')
43
- File.expand_path(path, File.dirname(base)).delete_prefix(File.expand_path('.') + '/')
44
- else
45
- File.expand_path(path).delete_prefix(File.expand_path('.') + '/')
46
- end
47
- end
48
-
49
- end
50
- end