sprockets 4.1.1 → 4.2.1
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/CHANGELOG.md +17 -1
- data/README.md +3 -3
- data/lib/sprockets/asset.rb +1 -1
- data/lib/sprockets/cache/memory_store.rb +20 -11
- data/lib/sprockets/cached_environment.rb +10 -10
- data/lib/sprockets/exporting.rb +2 -2
- data/lib/sprockets/loader.rb +3 -1
- data/lib/sprockets/server.rb +29 -19
- data/lib/sprockets/uri_utils.rb +1 -1
- data/lib/sprockets/utils.rb +22 -17
- data/lib/sprockets/version.rb +1 -1
- data/lib/sprockets.rb +1 -1
- metadata +11 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 543299a5bdbb4620f7e14c346728230740474c835519d22f1c31f76110588912
|
4
|
+
data.tar.gz: d22cfead2059a729f6e67c990d7fa606f9cf56f9060941bea1ed977bf7fe59f3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e0b291f575acdf547fa11e803858f561e38ce57ef76734ce04cc2fce6cfca6516fa2f7b8c5d2390f1ff5400e1e72885c7741b4dc7f28f0956b4aad3a617eec2
|
7
|
+
data.tar.gz: 53e8bab09fdc3dcbd113fa33c4d29bf764ca7d1b11b176ed83d6818d6c7a822cca848f18d5ad7d1dea51e5d015a4cc53bd00e456506a8060f7ad2dbd7fd10af9
|
data/CHANGELOG.md
CHANGED
@@ -2,7 +2,23 @@
|
|
2
2
|
|
3
3
|
Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprockets/blob/master/UPGRADING.md
|
4
4
|
|
5
|
-
|
5
|
+
## 4.2.1
|
6
|
+
|
7
|
+
- Fix for precompile issues when multiple extensions map to the same MIME type (eg. `.jpeg` / `.jpg`). [#781](https://github.com/rails/sprockets/pull/781)
|
8
|
+
- Fix `application/css-sourcemap+json` charset [#764](https://github.com/rails/sprockets/pull/764)
|
9
|
+
- Fix compatibility with Rack 2 applications. [#790](https://github.com/rails/sprockets/pull/790)
|
10
|
+
|
11
|
+
## 4.2.0
|
12
|
+
|
13
|
+
- Rack 3 compatibility. [#758](https://github.com/rails/sprockets/pull/758)
|
14
|
+
- Fix thread safety of `Sprockets::CachedEnvironment` and `Sprockets::Cache::MemoryStore`. [#771](https://github.com/rails/sprockets/pull/771)
|
15
|
+
- Add support for Rack 3.0. Headers set by sprockets will now be lower case. [#758](https://github.com/rails/sprockets/pull/758)
|
16
|
+
- Make `Sprockets::Utils.module_include` thread safe on JRuby. [#759](https://github.com/rails/sprockets/pull/759)
|
17
|
+
- Fix typo in `asset.rb` file. [#768](https://github.com/rails/sprockets/pull/768)
|
18
|
+
|
19
|
+
## 4.1.1
|
20
|
+
|
21
|
+
- Fix `Sprockets::Server` to return response headers to be compatible with Rack::Lint 2.0.
|
6
22
|
|
7
23
|
## 4.1.0
|
8
24
|
|
data/README.md
CHANGED
@@ -385,10 +385,10 @@ the current file won't work, it must be a logical path.
|
|
385
385
|
`link` can also be used to include manifest files from mounted Rails engines:
|
386
386
|
|
387
387
|
```
|
388
|
-
//= link
|
388
|
+
//= link my_engine_manifest
|
389
389
|
```
|
390
390
|
|
391
|
-
This would find a manifest file at `my_engine/app/assets/config/
|
391
|
+
This would find a manifest file at `my_engine/app/assets/config/my_engine_manifest.js` and include its directives.
|
392
392
|
|
393
393
|
### link_directory
|
394
394
|
|
@@ -525,7 +525,7 @@ Generated files are cached. If you're using an `ENV` var then
|
|
525
525
|
when you change then ENV var the asset will be forced to
|
526
526
|
recompile. This behavior is only true for environment variables,
|
527
527
|
if you are pulling a value from somewhere else, such as a database,
|
528
|
-
must manually invalidate the cache to see the change.
|
528
|
+
you must manually invalidate the cache to see the change.
|
529
529
|
|
530
530
|
If you're using Rails, there are helpers you can use such as `asset_url`
|
531
531
|
that will cause a recompile if the value changes.
|
data/lib/sprockets/asset.rb
CHANGED
@@ -22,6 +22,7 @@ module Sprockets
|
|
22
22
|
def initialize(max_size = DEFAULT_MAX_SIZE)
|
23
23
|
@max_size = max_size
|
24
24
|
@cache = {}
|
25
|
+
@mutex = Mutex.new
|
25
26
|
end
|
26
27
|
|
27
28
|
# Public: Retrieve value from cache.
|
@@ -32,12 +33,14 @@ module Sprockets
|
|
32
33
|
#
|
33
34
|
# Returns Object or nil or the value is not set.
|
34
35
|
def get(key)
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
@mutex.synchronize do
|
37
|
+
exists = true
|
38
|
+
value = @cache.delete(key) { exists = false }
|
39
|
+
if exists
|
40
|
+
@cache[key] = value
|
41
|
+
else
|
42
|
+
nil
|
43
|
+
end
|
41
44
|
end
|
42
45
|
end
|
43
46
|
|
@@ -50,9 +53,11 @@ module Sprockets
|
|
50
53
|
#
|
51
54
|
# Returns Object value.
|
52
55
|
def set(key, value)
|
53
|
-
@
|
54
|
-
|
55
|
-
|
56
|
+
@mutex.synchronize do
|
57
|
+
@cache.delete(key)
|
58
|
+
@cache[key] = value
|
59
|
+
@cache.shift if @cache.size > @max_size
|
60
|
+
end
|
56
61
|
value
|
57
62
|
end
|
58
63
|
|
@@ -60,14 +65,18 @@ module Sprockets
|
|
60
65
|
#
|
61
66
|
# Returns String.
|
62
67
|
def inspect
|
63
|
-
|
68
|
+
@mutex.synchronize do
|
69
|
+
"#<#{self.class} size=#{@cache.size}/#{@max_size}>"
|
70
|
+
end
|
64
71
|
end
|
65
72
|
|
66
73
|
# Public: Clear the cache
|
67
74
|
#
|
68
75
|
# Returns true
|
69
76
|
def clear(options=nil)
|
70
|
-
@
|
77
|
+
@mutex.synchronize do
|
78
|
+
@cache.clear
|
79
|
+
end
|
71
80
|
true
|
72
81
|
end
|
73
82
|
end
|
@@ -16,11 +16,11 @@ module Sprockets
|
|
16
16
|
initialize_configuration(environment)
|
17
17
|
|
18
18
|
@cache = environment.cache
|
19
|
-
@stats =
|
20
|
-
@entries =
|
21
|
-
@uris =
|
22
|
-
@processor_cache_keys =
|
23
|
-
@resolved_dependencies =
|
19
|
+
@stats = Concurrent::Map.new
|
20
|
+
@entries = Concurrent::Map.new
|
21
|
+
@uris = Concurrent::Map.new
|
22
|
+
@processor_cache_keys = Concurrent::Map.new
|
23
|
+
@resolved_dependencies = Concurrent::Map.new
|
24
24
|
end
|
25
25
|
|
26
26
|
# No-op return self as cached environment.
|
@@ -31,27 +31,27 @@ module Sprockets
|
|
31
31
|
|
32
32
|
# Internal: Cache Environment#entries
|
33
33
|
def entries(path)
|
34
|
-
@entries.
|
34
|
+
@entries.fetch_or_store(path) { super(path) }
|
35
35
|
end
|
36
36
|
|
37
37
|
# Internal: Cache Environment#stat
|
38
38
|
def stat(path)
|
39
|
-
@stats.
|
39
|
+
@stats.fetch_or_store(path) { super(path) }
|
40
40
|
end
|
41
41
|
|
42
42
|
# Internal: Cache Environment#load
|
43
43
|
def load(uri)
|
44
|
-
@uris.
|
44
|
+
@uris.fetch_or_store(uri) { super(uri) }
|
45
45
|
end
|
46
46
|
|
47
47
|
# Internal: Cache Environment#processor_cache_key
|
48
48
|
def processor_cache_key(str)
|
49
|
-
@processor_cache_keys.
|
49
|
+
@processor_cache_keys.fetch_or_store(str) { super(str) }
|
50
50
|
end
|
51
51
|
|
52
52
|
# Internal: Cache Environment#resolve_dependency
|
53
53
|
def resolve_dependency(str)
|
54
|
-
@resolved_dependencies.
|
54
|
+
@resolved_dependencies.fetch_or_store(str) { super(str) }
|
55
55
|
end
|
56
56
|
|
57
57
|
private
|
data/lib/sprockets/exporting.rb
CHANGED
@@ -28,11 +28,11 @@ module Sprockets
|
|
28
28
|
|
29
29
|
# Public: Remove Exporting processor `klass` for `mime_type`.
|
30
30
|
#
|
31
|
-
# environment.unregister_exporter '*/*', Sprockets::Exporters::
|
31
|
+
# environment.unregister_exporter '*/*', Sprockets::Exporters::ZlibExporter
|
32
32
|
#
|
33
33
|
# Can be called without a mime type
|
34
34
|
#
|
35
|
-
# environment.unregister_exporter Sprockets::Exporters::
|
35
|
+
# environment.unregister_exporter Sprockets::Exporters::ZlibExporter
|
36
36
|
#
|
37
37
|
# Does not remove any exporters that depend on `klass`.
|
38
38
|
def unregister_exporter(mime_types, exporter = nil)
|
data/lib/sprockets/loader.rb
CHANGED
@@ -165,7 +165,9 @@ module Sprockets
|
|
165
165
|
end
|
166
166
|
|
167
167
|
if type = unloaded.params[:type]
|
168
|
-
|
168
|
+
extensions = config[:mime_types][type][:extensions]
|
169
|
+
extension = extensions.include?(extname) ? extname : extensions.first
|
170
|
+
logical_path += extension
|
169
171
|
end
|
170
172
|
|
171
173
|
if type != file_type && !config[:transformers][file_type][type]
|
data/lib/sprockets/server.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require 'set'
|
3
3
|
require 'time'
|
4
|
-
require 'rack
|
4
|
+
require 'rack'
|
5
5
|
|
6
6
|
module Sprockets
|
7
7
|
# `Server` is a concern mixed into `Environment` and
|
@@ -11,6 +11,16 @@ module Sprockets
|
|
11
11
|
# Supported HTTP request methods.
|
12
12
|
ALLOWED_REQUEST_METHODS = ['GET', 'HEAD'].to_set.freeze
|
13
13
|
|
14
|
+
# :stopdoc:
|
15
|
+
if Gem::Version.new(Rack::RELEASE) < Gem::Version.new("3")
|
16
|
+
X_CASCADE = "X-Cascade"
|
17
|
+
VARY = "Vary"
|
18
|
+
else
|
19
|
+
X_CASCADE = "x-cascade"
|
20
|
+
VARY = "vary"
|
21
|
+
end
|
22
|
+
# :startdoc:
|
23
|
+
|
14
24
|
# `call` implements the Rack 1.x specification which accepts an
|
15
25
|
# `env` Hash and returns a three item tuple with the status code,
|
16
26
|
# headers, and body.
|
@@ -148,39 +158,39 @@ module Sprockets
|
|
148
158
|
# Returns a 400 Forbidden response tuple
|
149
159
|
def bad_request_response(env)
|
150
160
|
if head_request?(env)
|
151
|
-
[ 400, {
|
161
|
+
[ 400, { Rack::CONTENT_TYPE => "text/plain", Rack::CONTENT_LENGTH => "0" }, [] ]
|
152
162
|
else
|
153
|
-
[ 400, {
|
163
|
+
[ 400, { Rack::CONTENT_TYPE => "text/plain", Rack::CONTENT_LENGTH => "11" }, [ "Bad Request" ] ]
|
154
164
|
end
|
155
165
|
end
|
156
166
|
|
157
167
|
# Returns a 403 Forbidden response tuple
|
158
168
|
def forbidden_response(env)
|
159
169
|
if head_request?(env)
|
160
|
-
[ 403, {
|
170
|
+
[ 403, { Rack::CONTENT_TYPE => "text/plain", Rack::CONTENT_LENGTH => "0" }, [] ]
|
161
171
|
else
|
162
|
-
[ 403, {
|
172
|
+
[ 403, { Rack::CONTENT_TYPE => "text/plain", Rack::CONTENT_LENGTH => "9" }, [ "Forbidden" ] ]
|
163
173
|
end
|
164
174
|
end
|
165
175
|
|
166
176
|
# Returns a 404 Not Found response tuple
|
167
177
|
def not_found_response(env)
|
168
178
|
if head_request?(env)
|
169
|
-
[ 404, {
|
179
|
+
[ 404, { Rack::CONTENT_TYPE => "text/plain", Rack::CONTENT_LENGTH => "0", X_CASCADE => "pass" }, [] ]
|
170
180
|
else
|
171
|
-
[ 404, {
|
181
|
+
[ 404, { Rack::CONTENT_TYPE => "text/plain", Rack::CONTENT_LENGTH => "9", X_CASCADE => "pass" }, [ "Not found" ] ]
|
172
182
|
end
|
173
183
|
end
|
174
184
|
|
175
185
|
def method_not_allowed_response
|
176
|
-
[ 405, {
|
186
|
+
[ 405, { Rack::CONTENT_TYPE => "text/plain", Rack::CONTENT_LENGTH => "18" }, [ "Method Not Allowed" ] ]
|
177
187
|
end
|
178
188
|
|
179
189
|
def precondition_failed_response(env)
|
180
190
|
if head_request?(env)
|
181
|
-
[ 412, {
|
191
|
+
[ 412, { Rack::CONTENT_TYPE => "text/plain", Rack::CONTENT_LENGTH => "0", X_CASCADE => "pass" }, [] ]
|
182
192
|
else
|
183
|
-
[ 412, {
|
193
|
+
[ 412, { Rack::CONTENT_TYPE => "text/plain", Rack::CONTENT_LENGTH => "19", X_CASCADE => "pass" }, [ "Precondition Failed" ] ]
|
184
194
|
end
|
185
195
|
end
|
186
196
|
|
@@ -189,7 +199,7 @@ module Sprockets
|
|
189
199
|
def javascript_exception_response(exception)
|
190
200
|
err = "#{exception.class.name}: #{exception.message}\n (in #{exception.backtrace[0]})"
|
191
201
|
body = "throw Error(#{err.inspect})"
|
192
|
-
[ 200, {
|
202
|
+
[ 200, { Rack::CONTENT_TYPE => "application/javascript", Rack::CONTENT_LENGTH => body.bytesize.to_s }, [ body ] ]
|
193
203
|
end
|
194
204
|
|
195
205
|
# Returns a CSS response that hides all elements on the page and
|
@@ -242,7 +252,7 @@ module Sprockets
|
|
242
252
|
}
|
243
253
|
CSS
|
244
254
|
|
245
|
-
[ 200, {
|
255
|
+
[ 200, { Rack::CONTENT_TYPE => "text/css; charset=utf-8", Rack::CONTENT_LENGTH => body.bytesize.to_s }, [ body ] ]
|
246
256
|
end
|
247
257
|
|
248
258
|
# Escape special characters for use inside a CSS content("...") string
|
@@ -258,18 +268,18 @@ module Sprockets
|
|
258
268
|
headers = {}
|
259
269
|
|
260
270
|
# Set caching headers
|
261
|
-
headers[
|
262
|
-
headers[
|
271
|
+
headers[Rack::CACHE_CONTROL] = +"public"
|
272
|
+
headers[Rack::ETAG] = %("#{etag}")
|
263
273
|
|
264
274
|
# If the request url contains a fingerprint, set a long
|
265
275
|
# expires on the response
|
266
276
|
if path_fingerprint(env["PATH_INFO"])
|
267
|
-
headers[
|
277
|
+
headers[Rack::CACHE_CONTROL] << ", max-age=31536000, immutable"
|
268
278
|
|
269
279
|
# Otherwise set `must-revalidate` since the asset could be modified.
|
270
280
|
else
|
271
|
-
headers[
|
272
|
-
headers[
|
281
|
+
headers[Rack::CACHE_CONTROL] << ", must-revalidate"
|
282
|
+
headers[VARY] = "Accept-Encoding"
|
273
283
|
end
|
274
284
|
|
275
285
|
headers
|
@@ -279,7 +289,7 @@ module Sprockets
|
|
279
289
|
headers = {}
|
280
290
|
|
281
291
|
# Set content length header
|
282
|
-
headers[
|
292
|
+
headers[Rack::CONTENT_LENGTH] = length.to_s
|
283
293
|
|
284
294
|
# Set content type header
|
285
295
|
if type = asset.content_type
|
@@ -287,7 +297,7 @@ module Sprockets
|
|
287
297
|
if type.start_with?("text/") && asset.charset
|
288
298
|
type += "; charset=#{asset.charset}"
|
289
299
|
end
|
290
|
-
headers[
|
300
|
+
headers[Rack::CONTENT_TYPE] = type
|
291
301
|
end
|
292
302
|
|
293
303
|
headers.merge(cache_headers(env, asset.etag))
|
data/lib/sprockets/uri_utils.rb
CHANGED
data/lib/sprockets/utils.rb
CHANGED
@@ -118,33 +118,38 @@ module Sprockets
|
|
118
118
|
buf
|
119
119
|
end
|
120
120
|
|
121
|
+
MODULE_INCLUDE_MUTEX = Mutex.new
|
122
|
+
private_constant :MODULE_INCLUDE_MUTEX
|
123
|
+
|
121
124
|
# Internal: Inject into target module for the duration of the block.
|
122
125
|
#
|
123
126
|
# mod - Module
|
124
127
|
#
|
125
128
|
# Returns result of block.
|
126
129
|
def module_include(base, mod)
|
127
|
-
|
130
|
+
MODULE_INCLUDE_MUTEX.synchronize do
|
131
|
+
old_methods = {}
|
128
132
|
|
129
|
-
|
130
|
-
|
131
|
-
|
133
|
+
mod.instance_methods.each do |sym|
|
134
|
+
old_methods[sym] = base.instance_method(sym) if base.method_defined?(sym)
|
135
|
+
end
|
132
136
|
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
+
mod.instance_methods.each do |sym|
|
138
|
+
method = mod.instance_method(sym)
|
139
|
+
if base.method_defined?(sym)
|
140
|
+
base.send(:alias_method, sym, sym)
|
141
|
+
end
|
142
|
+
base.send(:define_method, sym, method)
|
137
143
|
end
|
138
|
-
base.send(:define_method, sym, method)
|
139
|
-
end
|
140
144
|
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
145
|
+
yield
|
146
|
+
ensure
|
147
|
+
mod.instance_methods.each do |sym|
|
148
|
+
base.send(:undef_method, sym) if base.method_defined?(sym)
|
149
|
+
end
|
150
|
+
old_methods.each do |sym, method|
|
151
|
+
base.send(:define_method, sym, method)
|
152
|
+
end
|
148
153
|
end
|
149
154
|
end
|
150
155
|
|
data/lib/sprockets/version.rb
CHANGED
data/lib/sprockets.rb
CHANGED
@@ -91,7 +91,7 @@ module Sprockets
|
|
91
91
|
|
92
92
|
require 'sprockets/source_map_processor'
|
93
93
|
register_mime_type 'application/js-sourcemap+json', extensions: ['.js.map'], charset: :unicode
|
94
|
-
register_mime_type 'application/css-sourcemap+json', extensions: ['.css.map']
|
94
|
+
register_mime_type 'application/css-sourcemap+json', extensions: ['.css.map'], charset: :unicode
|
95
95
|
register_transformer 'application/javascript', 'application/js-sourcemap+json', SourceMapProcessor
|
96
96
|
register_transformer 'text/css', 'application/css-sourcemap+json', SourceMapProcessor
|
97
97
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sprockets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 4.
|
4
|
+
version: 4.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Sam Stephenson
|
@@ -9,28 +9,28 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date:
|
12
|
+
date: 2023-09-05 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: rack
|
16
16
|
requirement: !ruby/object:Gem::Requirement
|
17
17
|
requirements:
|
18
|
-
- - "
|
18
|
+
- - ">="
|
19
19
|
- !ruby/object:Gem::Version
|
20
|
-
version:
|
20
|
+
version: 2.2.4
|
21
21
|
- - "<"
|
22
22
|
- !ruby/object:Gem::Version
|
23
|
-
version: '
|
23
|
+
version: '4'
|
24
24
|
type: :runtime
|
25
25
|
prerelease: false
|
26
26
|
version_requirements: !ruby/object:Gem::Requirement
|
27
27
|
requirements:
|
28
|
-
- - "
|
28
|
+
- - ">="
|
29
29
|
- !ruby/object:Gem::Version
|
30
|
-
version:
|
30
|
+
version: 2.2.4
|
31
31
|
- - "<"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
33
|
+
version: '4'
|
34
34
|
- !ruby/object:Gem::Dependency
|
35
35
|
name: concurrent-ruby
|
36
36
|
requirement: !ruby/object:Gem::Requirement
|
@@ -219,14 +219,14 @@ dependencies:
|
|
219
219
|
requirements:
|
220
220
|
- - "~>"
|
221
221
|
- !ruby/object:Gem::Version
|
222
|
-
version:
|
222
|
+
version: 2.0.0
|
223
223
|
type: :development
|
224
224
|
prerelease: false
|
225
225
|
version_requirements: !ruby/object:Gem::Requirement
|
226
226
|
requirements:
|
227
227
|
- - "~>"
|
228
228
|
- !ruby/object:Gem::Version
|
229
|
-
version:
|
229
|
+
version: 2.0.0
|
230
230
|
- !ruby/object:Gem::Dependency
|
231
231
|
name: rake
|
232
232
|
requirement: !ruby/object:Gem::Requirement
|
@@ -438,7 +438,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
438
438
|
- !ruby/object:Gem::Version
|
439
439
|
version: '0'
|
440
440
|
requirements: []
|
441
|
-
rubygems_version: 3.
|
441
|
+
rubygems_version: 3.4.10
|
442
442
|
signing_key:
|
443
443
|
specification_version: 4
|
444
444
|
summary: Rack-based asset packaging system
|