sprockets 2.6.0 → 4.2.2

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 (100) hide show
  1. checksums.yaml +7 -0
  2. data/CHANGELOG.md +118 -0
  3. data/{LICENSE → MIT-LICENSE} +2 -2
  4. data/README.md +541 -289
  5. data/bin/sprockets +20 -7
  6. data/lib/rake/sprocketstask.rb +34 -17
  7. data/lib/sprockets/add_source_map_comment_to_asset_processor.rb +60 -0
  8. data/lib/sprockets/asset.rb +158 -210
  9. data/lib/sprockets/autoload/babel.rb +8 -0
  10. data/lib/sprockets/autoload/closure.rb +8 -0
  11. data/lib/sprockets/autoload/coffee_script.rb +8 -0
  12. data/lib/sprockets/autoload/eco.rb +8 -0
  13. data/lib/sprockets/autoload/ejs.rb +8 -0
  14. data/lib/sprockets/autoload/jsminc.rb +8 -0
  15. data/lib/sprockets/autoload/sass.rb +8 -0
  16. data/lib/sprockets/autoload/sassc.rb +8 -0
  17. data/lib/sprockets/autoload/uglifier.rb +8 -0
  18. data/lib/sprockets/autoload/yui.rb +8 -0
  19. data/lib/sprockets/autoload/zopfli.rb +7 -0
  20. data/lib/sprockets/autoload.rb +16 -0
  21. data/lib/sprockets/babel_processor.rb +66 -0
  22. data/lib/sprockets/base.rb +89 -378
  23. data/lib/sprockets/bower.rb +61 -0
  24. data/lib/sprockets/bundle.rb +105 -0
  25. data/lib/sprockets/cache/file_store.rb +190 -14
  26. data/lib/sprockets/cache/memory_store.rb +84 -0
  27. data/lib/sprockets/cache/null_store.rb +54 -0
  28. data/lib/sprockets/cache.rb +271 -0
  29. data/lib/sprockets/cached_environment.rb +64 -0
  30. data/lib/sprockets/closure_compressor.rb +48 -0
  31. data/lib/sprockets/coffee_script_processor.rb +39 -0
  32. data/lib/sprockets/compressing.rb +134 -0
  33. data/lib/sprockets/configuration.rb +79 -0
  34. data/lib/sprockets/context.rb +166 -150
  35. data/lib/sprockets/dependencies.rb +74 -0
  36. data/lib/sprockets/digest_utils.rb +197 -0
  37. data/lib/sprockets/directive_processor.rb +241 -215
  38. data/lib/sprockets/eco_processor.rb +33 -0
  39. data/lib/sprockets/ejs_processor.rb +32 -0
  40. data/lib/sprockets/encoding_utils.rb +261 -0
  41. data/lib/sprockets/environment.rb +23 -64
  42. data/lib/sprockets/erb_processor.rb +43 -0
  43. data/lib/sprockets/errors.rb +5 -13
  44. data/lib/sprockets/exporters/base.rb +71 -0
  45. data/lib/sprockets/exporters/file_exporter.rb +24 -0
  46. data/lib/sprockets/exporters/zlib_exporter.rb +33 -0
  47. data/lib/sprockets/exporters/zopfli_exporter.rb +14 -0
  48. data/lib/sprockets/exporting.rb +73 -0
  49. data/lib/sprockets/file_reader.rb +16 -0
  50. data/lib/sprockets/http_utils.rb +135 -0
  51. data/lib/sprockets/jsminc_compressor.rb +32 -0
  52. data/lib/sprockets/jst_processor.rb +36 -19
  53. data/lib/sprockets/loader.rb +347 -0
  54. data/lib/sprockets/manifest.rb +228 -112
  55. data/lib/sprockets/manifest_utils.rb +48 -0
  56. data/lib/sprockets/mime.rb +78 -31
  57. data/lib/sprockets/npm.rb +52 -0
  58. data/lib/sprockets/path_dependency_utils.rb +77 -0
  59. data/lib/sprockets/path_digest_utils.rb +48 -0
  60. data/lib/sprockets/path_utils.rb +367 -0
  61. data/lib/sprockets/paths.rb +43 -19
  62. data/lib/sprockets/preprocessors/default_source_map.rb +49 -0
  63. data/lib/sprockets/processing.rb +146 -164
  64. data/lib/sprockets/processor_utils.rb +170 -0
  65. data/lib/sprockets/resolve.rb +295 -0
  66. data/lib/sprockets/sass_cache_store.rb +20 -15
  67. data/lib/sprockets/sass_compressor.rb +55 -10
  68. data/lib/sprockets/sass_functions.rb +3 -70
  69. data/lib/sprockets/sass_importer.rb +3 -29
  70. data/lib/sprockets/sass_processor.rb +313 -0
  71. data/lib/sprockets/sassc_compressor.rb +56 -0
  72. data/lib/sprockets/sassc_processor.rb +297 -0
  73. data/lib/sprockets/server.rb +159 -91
  74. data/lib/sprockets/source_map_processor.rb +66 -0
  75. data/lib/sprockets/source_map_utils.rb +483 -0
  76. data/lib/sprockets/transformers.rb +173 -0
  77. data/lib/sprockets/uglifier_compressor.rb +66 -0
  78. data/lib/sprockets/unloaded_asset.rb +139 -0
  79. data/lib/sprockets/uri_tar.rb +99 -0
  80. data/lib/sprockets/uri_utils.rb +194 -0
  81. data/lib/sprockets/utils/gzip.rb +99 -0
  82. data/lib/sprockets/utils.rb +193 -52
  83. data/lib/sprockets/version.rb +2 -1
  84. data/lib/sprockets/yui_compressor.rb +56 -0
  85. data/lib/sprockets.rb +217 -75
  86. metadata +272 -117
  87. data/lib/sprockets/asset_attributes.rb +0 -131
  88. data/lib/sprockets/bundled_asset.rb +0 -80
  89. data/lib/sprockets/caching.rb +0 -96
  90. data/lib/sprockets/charset_normalizer.rb +0 -41
  91. data/lib/sprockets/eco_template.rb +0 -38
  92. data/lib/sprockets/ejs_template.rb +0 -37
  93. data/lib/sprockets/engines.rb +0 -74
  94. data/lib/sprockets/index.rb +0 -99
  95. data/lib/sprockets/processed_asset.rb +0 -152
  96. data/lib/sprockets/processor.rb +0 -32
  97. data/lib/sprockets/safety_colons.rb +0 -28
  98. data/lib/sprockets/sass_template.rb +0 -60
  99. data/lib/sprockets/scss_template.rb +0 -13
  100. data/lib/sprockets/static_asset.rb +0 -58
@@ -0,0 +1,197 @@
1
+ # frozen_string_literal: true
2
+ require 'digest/sha1'
3
+ require 'digest/sha2'
4
+ require 'set'
5
+
6
+ module Sprockets
7
+ # Internal: Hash functions and digest related utilities. Mixed into
8
+ # Environment.
9
+ module DigestUtils
10
+ extend self
11
+
12
+ # Internal: Default digest class.
13
+ #
14
+ # Returns a Digest::Base subclass.
15
+ def digest_class
16
+ Digest::SHA256
17
+ end
18
+
19
+ # Internal: Maps digest bytesize to the digest class.
20
+ DIGEST_SIZES = {
21
+ 20 => Digest::SHA1,
22
+ 32 => Digest::SHA256,
23
+ 48 => Digest::SHA384,
24
+ 64 => Digest::SHA512
25
+ }
26
+
27
+ # Internal: Detect digest class hash algorithm for digest bytes.
28
+ #
29
+ # While not elegant, all the supported digests have a unique bytesize.
30
+ #
31
+ # Returns Digest::Base or nil.
32
+ def detect_digest_class(bytes)
33
+ DIGEST_SIZES[bytes.bytesize]
34
+ end
35
+
36
+ ADD_VALUE_TO_DIGEST = {
37
+ String => ->(val, digest) { digest << val },
38
+ FalseClass => ->(val, digest) { digest << 'FalseClass'.freeze },
39
+ TrueClass => ->(val, digest) { digest << 'TrueClass'.freeze },
40
+ NilClass => ->(val, digest) { digest << 'NilClass'.freeze },
41
+
42
+ Symbol => ->(val, digest) {
43
+ digest << 'Symbol'.freeze
44
+ digest << val.to_s
45
+ },
46
+ Integer => ->(val, digest) {
47
+ digest << 'Integer'.freeze
48
+ digest << val.to_s
49
+ },
50
+ Array => ->(val, digest) {
51
+ digest << 'Array'.freeze
52
+ val.each do |element|
53
+ ADD_VALUE_TO_DIGEST[element.class].call(element, digest)
54
+ end
55
+ },
56
+ Hash => ->(val, digest) {
57
+ digest << 'Hash'.freeze
58
+ val.sort.each do |array|
59
+ ADD_VALUE_TO_DIGEST[Array].call(array, digest)
60
+ end
61
+ },
62
+ Set => ->(val, digest) {
63
+ digest << 'Set'.freeze
64
+ ADD_VALUE_TO_DIGEST[Array].call(val, digest)
65
+ },
66
+ Encoding => ->(val, digest) {
67
+ digest << 'Encoding'.freeze
68
+ digest << val.name
69
+ }
70
+ }
71
+
72
+ ADD_VALUE_TO_DIGEST.compare_by_identity.rehash
73
+
74
+ ADD_VALUE_TO_DIGEST.default_proc = ->(_, val) {
75
+ raise TypeError, "couldn't digest #{ val }"
76
+ }
77
+ private_constant :ADD_VALUE_TO_DIGEST
78
+
79
+ # Internal: Generate a hexdigest for a nested JSON serializable object.
80
+ #
81
+ # This is used for generating cache keys, so its pretty important its
82
+ # wicked fast. Microbenchmarks away!
83
+ #
84
+ # obj - A JSON serializable object.
85
+ #
86
+ # Returns a String digest of the object.
87
+ def digest(obj)
88
+ build_digest(obj).digest
89
+ end
90
+
91
+ # Internal: Generate a hexdigest for a nested JSON serializable object.
92
+ #
93
+ # The same as `pack_hexdigest(digest(obj))`.
94
+ #
95
+ # obj - A JSON serializable object.
96
+ #
97
+ # Returns a String digest of the object.
98
+ def hexdigest(obj)
99
+ build_digest(obj).hexdigest!
100
+ end
101
+
102
+ # Internal: Pack a binary digest to a hex encoded string.
103
+ #
104
+ # bin - String bytes
105
+ #
106
+ # Returns hex String.
107
+ def pack_hexdigest(bin)
108
+ bin.unpack('H*'.freeze).first
109
+ end
110
+
111
+ # Internal: Unpack a hex encoded digest string into binary bytes.
112
+ #
113
+ # hex - String hex
114
+ #
115
+ # Returns binary String.
116
+ def unpack_hexdigest(hex)
117
+ [hex].pack('H*')
118
+ end
119
+
120
+ # Internal: Pack a binary digest to a base64 encoded string.
121
+ #
122
+ # bin - String bytes
123
+ #
124
+ # Returns base64 String.
125
+ def pack_base64digest(bin)
126
+ [bin].pack('m0')
127
+ end
128
+
129
+ # Internal: Pack a binary digest to a urlsafe base64 encoded string.
130
+ #
131
+ # bin - String bytes
132
+ #
133
+ # Returns urlsafe base64 String.
134
+ def pack_urlsafe_base64digest(bin)
135
+ str = pack_base64digest(bin)
136
+ str.tr!('+/'.freeze, '-_'.freeze)
137
+ str.tr!('='.freeze, ''.freeze)
138
+ str
139
+ end
140
+
141
+ # Internal: Maps digest class to the CSP hash algorithm name.
142
+ HASH_ALGORITHMS = {
143
+ Digest::SHA256 => 'sha256'.freeze,
144
+ Digest::SHA384 => 'sha384'.freeze,
145
+ Digest::SHA512 => 'sha512'.freeze
146
+ }
147
+
148
+ # Public: Generate hash for use in the `integrity` attribute of an asset tag
149
+ # as per the subresource integrity specification.
150
+ #
151
+ # digest - The String byte digest of the asset content.
152
+ #
153
+ # Returns a String or nil if hash algorithm is incompatible.
154
+ def integrity_uri(digest)
155
+ case digest
156
+ when Digest::Base
157
+ digest_class = digest.class
158
+ digest = digest.digest
159
+ when String
160
+ digest_class = DIGEST_SIZES[digest.bytesize]
161
+ else
162
+ raise TypeError, "unknown digest: #{digest.inspect}"
163
+ end
164
+
165
+ if hash_name = HASH_ALGORITHMS[digest_class]
166
+ "#{hash_name}-#{pack_base64digest(digest)}"
167
+ end
168
+ end
169
+
170
+ # Public: Generate hash for use in the `integrity` attribute of an asset tag
171
+ # as per the subresource integrity specification.
172
+ #
173
+ # digest - The String hexbyte digest of the asset content.
174
+ #
175
+ # Returns a String or nil if hash algorithm is incompatible.
176
+ def hexdigest_integrity_uri(hexdigest)
177
+ integrity_uri(unpack_hexdigest(hexdigest))
178
+ end
179
+
180
+ # Internal: Checks an asset name for a valid digest
181
+ #
182
+ # name - The name of the asset
183
+ #
184
+ # Returns true if the name contains a digest like string and .digested before the extension
185
+ def already_digested?(name)
186
+ return name =~ /-([0-9a-zA-Z]{7,128})\.digested/
187
+ end
188
+
189
+ private
190
+ def build_digest(obj)
191
+ digest = digest_class.new
192
+
193
+ ADD_VALUE_TO_DIGEST[obj.class].call(obj, digest)
194
+ digest
195
+ end
196
+ end
197
+ end