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.
- checksums.yaml +4 -4
- data/lib/condenser/asset.rb +103 -25
- data/lib/condenser/build_cache.rb +23 -8
- data/lib/condenser/cache/file_store.rb +1 -0
- data/lib/condenser/cache/memory_store.rb +1 -0
- data/lib/condenser/cache/null_store.rb +1 -0
- data/lib/condenser/cache_store.rb +1 -0
- data/lib/condenser/context.rb +1 -0
- data/lib/condenser/encoding_utils.rb +2 -0
- data/lib/condenser/environment.rb +2 -0
- data/lib/condenser/errors.rb +2 -0
- data/lib/condenser/export.rb +11 -6
- data/lib/condenser/helpers/parse_helpers.rb +23 -1
- data/lib/condenser/manifest.rb +3 -1
- data/lib/condenser/minifiers/sass_minifier.rb +2 -0
- data/lib/condenser/minifiers/terser_minifier.rb +2 -0
- data/lib/condenser/minifiers/uglify_minifier.rb +2 -0
- data/lib/condenser/pipeline.rb +2 -0
- data/lib/condenser/processors/babel_processor.rb +19 -16
- data/lib/condenser/processors/css_media_combiner_processor.rb +7 -5
- data/lib/condenser/processors/js_analyzer.rb +149 -42
- data/lib/condenser/processors/node_processor.rb +3 -0
- data/lib/condenser/processors/purgecss_processor.rb +2 -0
- data/lib/condenser/processors/rollup_processor.rb +289 -136
- data/lib/condenser/resolve.rb +41 -10
- data/lib/condenser/server.rb +22 -20
- data/lib/condenser/templating_engine/ejs.rb +2 -0
- data/lib/condenser/templating_engine/erb.rb +2 -0
- data/lib/condenser/transformers/dart_sass_transformer.rb +5 -3
- data/lib/condenser/transformers/jst_transformer.rb +2 -0
- data/lib/condenser/transformers/sass/functions.rb +2 -0
- data/lib/condenser/transformers/sass/importer.rb +2 -0
- data/lib/condenser/transformers/sass.rb +2 -0
- data/lib/condenser/transformers/sass_transformer.rb +2 -0
- data/lib/condenser/transformers/svg_transformer/base.rb +2 -0
- data/lib/condenser/transformers/svg_transformer/tag.rb +2 -0
- data/lib/condenser/transformers/svg_transformer/template.rb +3 -1
- data/lib/condenser/transformers/svg_transformer/template_error.rb +2 -0
- data/lib/condenser/transformers/svg_transformer/value.rb +2 -0
- data/lib/condenser/transformers/svg_transformer/var_generator.rb +2 -0
- data/lib/condenser/transformers/svg_transformer.rb +2 -0
- data/lib/condenser/utils.rb +2 -0
- data/lib/condenser/version.rb +3 -1
- data/lib/condenser/writers/brotli_writer.rb +2 -0
- data/lib/condenser/writers/file_writer.rb +2 -0
- data/lib/condenser/writers/zlib_writer.rb +2 -0
- data/lib/condenser.rb +2 -0
- data/lib/rake/condensertask.rb +2 -0
- data/test/cache_test.rb +115 -20
- data/test/dependency_test.rb +51 -2
- data/test/manifest_test.rb +17 -2
- data/test/postprocessors/css_media_combiner_test.rb +9 -12
- data/test/preprocessor/babel_test.rb +876 -349
- data/test/preprocessor/js_analyzer_test.rb +208 -4
- data/test/processors/rollup/dynamic_import_test.rb +358 -0
- data/test/processors/rollup_test.rb +37 -56
- data/test/resolve_test.rb +14 -9
- data/test/server_test.rb +10 -9
- data/test/test_helper.rb +6 -3
- data/test/transformers/dart_scss_test.rb +2 -2
- data/test/transformers/scss_test.rb +2 -2
- metadata +6 -11
- 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
|
-
|
59
|
-
|
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
|
-
|
126
|
-
|
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
|
-
|
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
|
-
|
168
|
-
|
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
|
-
|
162
|
+
function square ( x ) {
|
163
|
+
return x * x;
|
164
|
+
}
|
179
165
|
|
180
|
-
|
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
|
-
|
212
|
-
'use strict';
|
213
|
-
|
214
|
-
class Base { }
|
215
|
-
|
216
|
-
class Lower extends Base { }
|
197
|
+
class Base { }
|
217
198
|
|
218
|
-
|
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
|
-
|
88
|
-
|
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 "
|
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
|
-
|
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
|
-
|
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 = '
|
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 '"
|
111
|
-
assert_equal '
|
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 '"
|
171
|
-
assert_equal '
|
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
|
-
|
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
|
-
|
58
|
-
|
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", "
|
136
|
-
assert_equal ["a.scss", "
|
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", "
|
122
|
-
assert_equal ["a.scss", "
|
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.
|
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:
|
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.
|
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.
|
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
|
-
}
|