condenser 1.3 → 1.5

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.
Files changed (63) hide show
  1. checksums.yaml +4 -4
  2. data/lib/condenser/asset.rb +103 -25
  3. data/lib/condenser/build_cache.rb +23 -8
  4. data/lib/condenser/cache/file_store.rb +1 -0
  5. data/lib/condenser/cache/memory_store.rb +1 -0
  6. data/lib/condenser/cache/null_store.rb +1 -0
  7. data/lib/condenser/cache_store.rb +1 -0
  8. data/lib/condenser/context.rb +1 -0
  9. data/lib/condenser/encoding_utils.rb +2 -0
  10. data/lib/condenser/environment.rb +2 -0
  11. data/lib/condenser/errors.rb +2 -0
  12. data/lib/condenser/export.rb +11 -6
  13. data/lib/condenser/helpers/parse_helpers.rb +23 -1
  14. data/lib/condenser/manifest.rb +3 -1
  15. data/lib/condenser/minifiers/sass_minifier.rb +2 -0
  16. data/lib/condenser/minifiers/terser_minifier.rb +2 -0
  17. data/lib/condenser/minifiers/uglify_minifier.rb +2 -0
  18. data/lib/condenser/pipeline.rb +2 -0
  19. data/lib/condenser/processors/babel_processor.rb +19 -16
  20. data/lib/condenser/processors/css_media_combiner_processor.rb +7 -5
  21. data/lib/condenser/processors/js_analyzer.rb +149 -42
  22. data/lib/condenser/processors/node_processor.rb +3 -0
  23. data/lib/condenser/processors/purgecss_processor.rb +2 -0
  24. data/lib/condenser/processors/rollup_processor.rb +289 -136
  25. data/lib/condenser/resolve.rb +41 -10
  26. data/lib/condenser/server.rb +22 -20
  27. data/lib/condenser/templating_engine/ejs.rb +2 -0
  28. data/lib/condenser/templating_engine/erb.rb +2 -0
  29. data/lib/condenser/transformers/dart_sass_transformer.rb +5 -3
  30. data/lib/condenser/transformers/jst_transformer.rb +2 -0
  31. data/lib/condenser/transformers/sass/functions.rb +2 -0
  32. data/lib/condenser/transformers/sass/importer.rb +2 -0
  33. data/lib/condenser/transformers/sass.rb +2 -0
  34. data/lib/condenser/transformers/sass_transformer.rb +2 -0
  35. data/lib/condenser/transformers/svg_transformer/base.rb +2 -0
  36. data/lib/condenser/transformers/svg_transformer/tag.rb +2 -0
  37. data/lib/condenser/transformers/svg_transformer/template.rb +3 -1
  38. data/lib/condenser/transformers/svg_transformer/template_error.rb +2 -0
  39. data/lib/condenser/transformers/svg_transformer/value.rb +2 -0
  40. data/lib/condenser/transformers/svg_transformer/var_generator.rb +2 -0
  41. data/lib/condenser/transformers/svg_transformer.rb +2 -0
  42. data/lib/condenser/utils.rb +2 -0
  43. data/lib/condenser/version.rb +3 -1
  44. data/lib/condenser/writers/brotli_writer.rb +2 -0
  45. data/lib/condenser/writers/file_writer.rb +2 -0
  46. data/lib/condenser/writers/zlib_writer.rb +2 -0
  47. data/lib/condenser.rb +2 -0
  48. data/lib/rake/condensertask.rb +2 -0
  49. data/test/cache_test.rb +115 -20
  50. data/test/dependency_test.rb +51 -2
  51. data/test/manifest_test.rb +17 -2
  52. data/test/postprocessors/css_media_combiner_test.rb +9 -12
  53. data/test/preprocessor/babel_test.rb +876 -349
  54. data/test/preprocessor/js_analyzer_test.rb +208 -4
  55. data/test/processors/rollup/dynamic_import_test.rb +358 -0
  56. data/test/processors/rollup_test.rb +37 -56
  57. data/test/resolve_test.rb +14 -9
  58. data/test/server_test.rb +10 -9
  59. data/test/test_helper.rb +6 -3
  60. data/test/transformers/dart_scss_test.rb +2 -2
  61. data/test/transformers/scss_test.rb +2 -2
  62. metadata +6 -11
  63. data/lib/condenser/minifiers/package-lock.json +0 -25
@@ -7,6 +7,17 @@ class RollupTest < ActiveSupport::TestCase
7
7
  @env.unregister_minifier('application/javascript')
8
8
  end
9
9
 
10
+ test 'file is exported as module' do
11
+ file 'main.js', <<~JS
12
+ console.log( cube( 5 ) ); // 125
13
+ JS
14
+
15
+ asset = assert_exported_file 'main.js', 'application/javascript', <<~FILE
16
+ console.log( cube( 5 ) ); // 125
17
+ FILE
18
+ assert_equal "module", asset.type
19
+ end
20
+
10
21
  test 'import file' do
11
22
  file 'main.js', <<~JS
12
23
  import { cube } from './math.js';
@@ -28,17 +39,12 @@ class RollupTest < ActiveSupport::TestCase
28
39
  JS
29
40
 
30
41
  assert_exported_file 'main.js', 'application/javascript', <<~FILE
31
- (function () {
32
- 'use strict';
33
-
34
42
  // This function gets included
35
43
  function cube ( x ) {
36
44
  return x * x * x;
37
45
  }
38
46
 
39
47
  console.log( cube( 5 ) ); // 125
40
-
41
- })();
42
48
  FILE
43
49
  end
44
50
 
@@ -55,16 +61,11 @@ class RollupTest < ActiveSupport::TestCase
55
61
  JS
56
62
 
57
63
  assert_exported_file 'main.js', 'application/javascript', <<~FILE
58
- (function () {
59
- 'use strict';
60
-
61
- function cube ( x ) {
62
- return 2 * x * x;
63
- }
64
-
65
- console.log( cube( 5 ) ); // 125
64
+ function cube ( x ) {
65
+ return 2 * x * x;
66
+ }
66
67
 
67
- })();
68
+ console.log( cube( 5 ) ); // 125
68
69
  FILE
69
70
  end
70
71
 
@@ -89,16 +90,11 @@ class RollupTest < ActiveSupport::TestCase
89
90
  @env.append_path File.join(@path, 'a')
90
91
 
91
92
  assert_exported_file 'main.js', 'application/javascript', <<~FILE
92
- (function () {
93
- 'use strict';
94
-
95
93
  function cube ( x ) {
96
94
  return x * x * x;
97
95
  }
98
96
 
99
97
  console.log( cube( 5 ) ); // 125
100
-
101
- })();
102
98
  FILE
103
99
  end
104
100
 
@@ -122,20 +118,15 @@ class RollupTest < ActiveSupport::TestCase
122
118
  JS
123
119
 
124
120
  assert_exported_file 'main.js', 'application/javascript', <<~FILE
125
- (function () {
126
- 'use strict';
127
-
128
- window.cube = function ( x ) {
129
- return x * x * x;
130
- };
131
-
132
- window.square = function ( x ) {
133
- return x * x;
134
- };
121
+ window.cube = function ( x ) {
122
+ return x * x * x;
123
+ };
135
124
 
136
- console.log( square(cube( 5 )) );
125
+ window.square = function ( x ) {
126
+ return x * x;
127
+ };
137
128
 
138
- })();
129
+ console.log( square(cube( 5 )) );
139
130
  FILE
140
131
  end
141
132
 
@@ -164,26 +155,21 @@ class RollupTest < ActiveSupport::TestCase
164
155
  JS
165
156
 
166
157
  assert_exported_file 'main.js', 'application/javascript', <<~FILE
167
- (function () {
168
- 'use strict';
169
-
170
- function cube ( x ) {
171
- return x * x * x;
172
- }
173
-
174
- function square ( x ) {
175
- return x * x;
176
- }
158
+ function cube ( x ) {
159
+ return x * x * x;
160
+ }
177
161
 
178
- var maths = [cube, square];
162
+ function square ( x ) {
163
+ return x * x;
164
+ }
179
165
 
180
- var x = 1;
181
- for (var i = 0; i < maths.length; i++) {
182
- x = maths[i](x);
183
- }
184
- console.log(x);
166
+ const maths = [cube, square];
185
167
 
186
- })();
168
+ var x = 1;
169
+ for (var i = 0; i < maths.length; i++) {
170
+ x = maths[i](x);
171
+ }
172
+ console.log(x);
187
173
  FILE
188
174
  $d = false
189
175
  end
@@ -208,16 +194,11 @@ class RollupTest < ActiveSupport::TestCase
208
194
 
209
195
 
210
196
  assert_exported_file 'main.js', 'application/javascript', <<~FILE
211
- (function () {
212
- 'use strict';
213
-
214
- class Base { }
215
-
216
- class Lower extends Base { }
197
+ class Base { }
217
198
 
218
- console.log( Base, Lower );
199
+ class Lower extends Base { }
219
200
 
220
- })();
201
+ console.log( Base, Lower );
221
202
  FILE
222
203
  end
223
204
 
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
@@ -84,16 +94,11 @@ class ResolveTest < ActiveSupport::TestCase
84
94
  @env.append_path File.join(@path, 'a')
85
95
 
86
96
  assert_exported_file('main.js', 'application/javascript', <<~JS)
87
- (function () {
88
- 'use strict';
89
-
90
- function cube ( x ) {
91
- return x * x * x;
92
- }
93
-
94
- console.log( cube( 5 ) ); // 125
97
+ function cube ( x ) {
98
+ return x * x * x;
99
+ }
95
100
 
96
- })();
101
+ console.log( cube( 5 ) ); // 125
97
102
  JS
98
103
  end
99
104
 
data/test/server_test.rb CHANGED
@@ -1,6 +1,7 @@
1
1
  require 'test_helper'
2
2
  require 'rack/builder'
3
3
  require 'rack/test'
4
+ require 'rack/lint'
4
5
 
5
6
  class ServerTest < ActiveSupport::TestCase
6
7
  include Rack::Test::Methods
@@ -27,10 +28,10 @@ class ServerTest < ActiveSupport::TestCase
27
28
  test "serve single source file" do
28
29
  get "/assets/foo.js"
29
30
  assert_equal 200, last_response.status
30
- assert_equal "43", last_response.headers['Content-Length']
31
+ assert_equal "15", last_response.headers['Content-Length']
31
32
  assert_equal "Accept-Encoding", last_response.headers['Vary']
32
33
  assert_equal <<~JS.strip, last_response.body
33
- !function(){"use strict";console.log(1)}();
34
+ console.log(1);
34
35
  JS
35
36
  end
36
37
 
@@ -54,7 +55,7 @@ class ServerTest < ActiveSupport::TestCase
54
55
 
55
56
  get "/assets/main.js"
56
57
  assert_equal <<~JS.strip, last_response.body
57
- !function(){"use strict";var o;console.log((o=5)*o*o)}();
58
+ function cube(c){return c*c*c}console.log(cube(5));
58
59
  JS
59
60
  end
60
61
 
@@ -73,7 +74,7 @@ class ServerTest < ActiveSupport::TestCase
73
74
  test "serve source with etag headers" do
74
75
  get "/assets/foo.js"
75
76
 
76
- digest = '9001f422e9c91516f6e130be56dd77aa313c52bb7dd18e4bb085067162c9fa70'
77
+ digest = 'b603d946eb2b396ca4ecf65c223daff659dbe6f1cfeac235b7c61d3ba6964cae'
77
78
  assert_equal "\"#{digest}\"", last_response.headers['ETag']
78
79
  end
79
80
 
@@ -107,8 +108,8 @@ class ServerTest < ActiveSupport::TestCase
107
108
  'HTTP_IF_NONE_MATCH' => "nope"
108
109
 
109
110
  assert_equal 200, last_response.status
110
- assert_equal '"9001f422e9c91516f6e130be56dd77aa313c52bb7dd18e4bb085067162c9fa70"', last_response.headers['ETag']
111
- assert_equal '43', last_response.headers['Content-Length']
111
+ assert_equal '"b603d946eb2b396ca4ecf65c223daff659dbe6f1cfeac235b7c61d3ba6964cae"', last_response.headers['ETag']
112
+ assert_equal '15', last_response.headers['Content-Length']
112
113
  end
113
114
 
114
115
  test "not modified partial response with fingerprint and if-none-match etags match" do
@@ -167,8 +168,8 @@ class ServerTest < ActiveSupport::TestCase
167
168
  'HTTP_IF_MATCH' => etag
168
169
 
169
170
  assert_equal 200, last_response.status
170
- assert_equal '"9001f422e9c91516f6e130be56dd77aa313c52bb7dd18e4bb085067162c9fa70"', last_response.headers['ETag']
171
- assert_equal '43', last_response.headers['Content-Length']
171
+ assert_equal '"b603d946eb2b396ca4ecf65c223daff659dbe6f1cfeac235b7c61d3ba6964cae"', last_response.headers['ETag']
172
+ assert_equal '15', last_response.headers['Content-Length']
172
173
  end
173
174
 
174
175
  test "precondition failed with if-match is a mismatch" do
@@ -253,7 +254,7 @@ class ServerTest < ActiveSupport::TestCase
253
254
  JS
254
255
  get "/assets/%E6%97%A5%E6%9C%AC%E8%AA%9E.js"
255
256
  assert_equal <<~JS.strip, last_response.body
256
- !function(){"use strict";console.log("日本語")}();
257
+ var japanese="日本語";console.log(japanese);
257
258
  JS
258
259
  end
259
260
 
data/test/test_helper.rb CHANGED
@@ -53,9 +53,10 @@ class ActiveSupport::TestCase
53
53
  assert_equal json, jbuild(&block)
54
54
  end
55
55
 
56
- def file(name, source)
57
- dir = name.include?('/') ? File.join(@path, File.dirname(name)) : @path
58
- 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)
59
60
 
60
61
  FileUtils.mkdir_p(dir)
61
62
  if File.exist?(path)
@@ -78,6 +79,7 @@ class ActiveSupport::TestCase
78
79
  assert_equal path.delete_prefix('/'), asset.filename
79
80
  assert_equal Array(mime_types), asset.content_types
80
81
  assert_equal(source.rstrip, asset.source.rstrip) if !source.nil?
82
+ asset
81
83
  end
82
84
 
83
85
  def assert_exported_file(path, mime_types, source=nil)
@@ -88,6 +90,7 @@ class ActiveSupport::TestCase
88
90
  assert_equal path, asset.filename
89
91
  assert_equal Array(mime_types), asset.content_types
90
92
  assert_equal(source.rstrip, asset.source.rstrip) if !source.nil?
93
+ asset
91
94
  end
92
95
 
93
96
  end
@@ -132,8 +132,8 @@ class CondenserDartSCSSTest < ActiveSupport::TestCase
132
132
  SCSS
133
133
 
134
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)
135
+ assert_equal ["a.scss", "b.scss", "d.scss"], asset.process_dependencies.map(&:filename)
136
+ assert_equal ["a.scss", "b.scss", "d.scss"], asset.export_dependencies.map(&:filename)
137
137
  end
138
138
 
139
139
  end
@@ -118,8 +118,8 @@ class CondenserSCSSTest < ActiveSupport::TestCase
118
118
  SCSS
119
119
 
120
120
  asset = @env.find('c.css')
121
- assert_equal ["a.scss", "d.scss", "b.scss"], asset.process_dependencies.map(&:filename)
122
- assert_equal ["a.scss", "d.scss", "b.scss"], asset.export_dependencies.map(&:filename)
121
+ assert_equal ["a.scss", "b.scss", "d.scss"], asset.process_dependencies.map(&:filename)
122
+ assert_equal ["a.scss", "b.scss", "d.scss"], asset.export_dependencies.map(&:filename)
123
123
  end
124
124
 
125
125
  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.3'
4
+ version: '1.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jon Bracy
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2023-12-06 00:00:00.000000000 Z
11
+ date: 2025-07-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: erubi
@@ -31,9 +31,6 @@ dependencies:
31
31
  - - ">"
32
32
  - !ruby/object:Gem::Version
33
33
  version: '1'
34
- - - "<"
35
- - !ruby/object:Gem::Version
36
- version: '3'
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
@@ -41,9 +38,6 @@ dependencies:
41
38
  - - ">"
42
39
  - !ruby/object:Gem::Version
43
40
  version: '1'
44
- - - "<"
45
- - !ruby/object:Gem::Version
46
- version: '3'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: listen
49
43
  requirement: !ruby/object:Gem::Requirement
@@ -318,7 +312,6 @@ files:
318
312
  - lib/condenser/minifiers/node_modules/uglify-js/tools/exports.js
319
313
  - lib/condenser/minifiers/node_modules/uglify-js/tools/node.js
320
314
  - lib/condenser/minifiers/node_modules/uglify-js/tools/props.html
321
- - lib/condenser/minifiers/package-lock.json
322
315
  - lib/condenser/minifiers/sass_minifier.rb
323
316
  - lib/condenser/minifiers/terser_minifier.rb
324
317
  - lib/condenser/minifiers/uglify_minifier.rb
@@ -365,6 +358,7 @@ files:
365
358
  - test/postprocessors/purgecss_test.rb
366
359
  - test/preprocessor/babel_test.rb
367
360
  - test/preprocessor/js_analyzer_test.rb
361
+ - test/processors/rollup/dynamic_import_test.rb
368
362
  - test/processors/rollup_test.rb
369
363
  - test/resolve_test.rb
370
364
  - test/server_test.rb
@@ -391,14 +385,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
391
385
  requirements:
392
386
  - - ">="
393
387
  - !ruby/object:Gem::Version
394
- version: 2.4.0
388
+ version: 3.2.0
395
389
  required_rubygems_version: !ruby/object:Gem::Requirement
396
390
  requirements:
397
391
  - - ">="
398
392
  - !ruby/object:Gem::Version
399
393
  version: '0'
400
394
  requirements: []
401
- rubygems_version: 3.4.13
395
+ rubygems_version: 3.5.21
402
396
  signing_key:
403
397
  specification_version: 4
404
398
  summary: A Rack-based asset packaging system
@@ -416,6 +410,7 @@ test_files:
416
410
  - test/postprocessors/purgecss_test.rb
417
411
  - test/preprocessor/babel_test.rb
418
412
  - test/preprocessor/js_analyzer_test.rb
413
+ - test/processors/rollup/dynamic_import_test.rb
419
414
  - test/processors/rollup_test.rb
420
415
  - test/resolve_test.rb
421
416
  - test/server_test.rb
@@ -1,25 +0,0 @@
1
- {
2
- "requires": true,
3
- "lockfileVersion": 1,
4
- "dependencies": {
5
- "commander": {
6
- "version": "2.20.3",
7
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
8
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ=="
9
- },
10
- "source-map": {
11
- "version": "0.6.1",
12
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
13
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
14
- },
15
- "uglify-js": {
16
- "version": "3.7.4",
17
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.7.4.tgz",
18
- "integrity": "sha512-tinYWE8X1QfCHxS1lBS8yiDekyhSXOO6R66yNOCdUJeojxxw+PX2BHAz/BWyW7PQ7pkiWVxJfIEbiDxyLWvUGg==",
19
- "requires": {
20
- "commander": "~2.20.3",
21
- "source-map": "~0.6.1"
22
- }
23
- }
24
- }
25
- }