sprockets 2.2.3 → 4.0.0

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 (99) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +68 -0
  3. data/README.md +482 -255
  4. data/bin/sprockets +20 -7
  5. data/lib/rake/sprocketstask.rb +28 -15
  6. data/lib/sprockets/add_source_map_comment_to_asset_processor.rb +60 -0
  7. data/lib/sprockets/asset.rb +142 -207
  8. data/lib/sprockets/autoload/babel.rb +8 -0
  9. data/lib/sprockets/autoload/closure.rb +8 -0
  10. data/lib/sprockets/autoload/coffee_script.rb +8 -0
  11. data/lib/sprockets/autoload/eco.rb +8 -0
  12. data/lib/sprockets/autoload/ejs.rb +8 -0
  13. data/lib/sprockets/autoload/jsminc.rb +8 -0
  14. data/lib/sprockets/autoload/sass.rb +8 -0
  15. data/lib/sprockets/autoload/sassc.rb +8 -0
  16. data/lib/sprockets/autoload/uglifier.rb +8 -0
  17. data/lib/sprockets/autoload/yui.rb +8 -0
  18. data/lib/sprockets/autoload/zopfli.rb +7 -0
  19. data/lib/sprockets/autoload.rb +16 -0
  20. data/lib/sprockets/babel_processor.rb +66 -0
  21. data/lib/sprockets/base.rb +89 -249
  22. data/lib/sprockets/bower.rb +61 -0
  23. data/lib/sprockets/bundle.rb +105 -0
  24. data/lib/sprockets/cache/file_store.rb +190 -14
  25. data/lib/sprockets/cache/memory_store.rb +75 -0
  26. data/lib/sprockets/cache/null_store.rb +54 -0
  27. data/lib/sprockets/cache.rb +271 -0
  28. data/lib/sprockets/cached_environment.rb +64 -0
  29. data/lib/sprockets/closure_compressor.rb +48 -0
  30. data/lib/sprockets/coffee_script_processor.rb +39 -0
  31. data/lib/sprockets/compressing.rb +134 -0
  32. data/lib/sprockets/configuration.rb +79 -0
  33. data/lib/sprockets/context.rb +204 -135
  34. data/lib/sprockets/dependencies.rb +74 -0
  35. data/lib/sprockets/digest_utils.rb +200 -0
  36. data/lib/sprockets/directive_processor.rb +224 -216
  37. data/lib/sprockets/eco_processor.rb +33 -0
  38. data/lib/sprockets/ejs_processor.rb +32 -0
  39. data/lib/sprockets/encoding_utils.rb +262 -0
  40. data/lib/sprockets/environment.rb +23 -68
  41. data/lib/sprockets/erb_processor.rb +37 -0
  42. data/lib/sprockets/errors.rb +6 -13
  43. data/lib/sprockets/exporters/base.rb +72 -0
  44. data/lib/sprockets/exporters/file_exporter.rb +24 -0
  45. data/lib/sprockets/exporters/zlib_exporter.rb +33 -0
  46. data/lib/sprockets/exporters/zopfli_exporter.rb +14 -0
  47. data/lib/sprockets/exporting.rb +73 -0
  48. data/lib/sprockets/file_reader.rb +16 -0
  49. data/lib/sprockets/http_utils.rb +135 -0
  50. data/lib/sprockets/jsminc_compressor.rb +32 -0
  51. data/lib/sprockets/jst_processor.rb +36 -19
  52. data/lib/sprockets/loader.rb +343 -0
  53. data/lib/sprockets/manifest.rb +231 -96
  54. data/lib/sprockets/manifest_utils.rb +48 -0
  55. data/lib/sprockets/mime.rb +80 -32
  56. data/lib/sprockets/npm.rb +52 -0
  57. data/lib/sprockets/path_dependency_utils.rb +77 -0
  58. data/lib/sprockets/path_digest_utils.rb +48 -0
  59. data/lib/sprockets/path_utils.rb +367 -0
  60. data/lib/sprockets/paths.rb +82 -0
  61. data/lib/sprockets/preprocessors/default_source_map.rb +49 -0
  62. data/lib/sprockets/processing.rb +140 -192
  63. data/lib/sprockets/processor_utils.rb +169 -0
  64. data/lib/sprockets/resolve.rb +295 -0
  65. data/lib/sprockets/sass_cache_store.rb +30 -0
  66. data/lib/sprockets/sass_compressor.rb +63 -0
  67. data/lib/sprockets/sass_functions.rb +3 -0
  68. data/lib/sprockets/sass_importer.rb +3 -0
  69. data/lib/sprockets/sass_processor.rb +313 -0
  70. data/lib/sprockets/sassc_compressor.rb +56 -0
  71. data/lib/sprockets/sassc_processor.rb +297 -0
  72. data/lib/sprockets/server.rb +138 -90
  73. data/lib/sprockets/source_map_processor.rb +66 -0
  74. data/lib/sprockets/source_map_utils.rb +483 -0
  75. data/lib/sprockets/transformers.rb +173 -0
  76. data/lib/sprockets/uglifier_compressor.rb +66 -0
  77. data/lib/sprockets/unloaded_asset.rb +139 -0
  78. data/lib/sprockets/uri_tar.rb +99 -0
  79. data/lib/sprockets/uri_utils.rb +191 -0
  80. data/lib/sprockets/utils/gzip.rb +99 -0
  81. data/lib/sprockets/utils.rb +186 -53
  82. data/lib/sprockets/version.rb +2 -1
  83. data/lib/sprockets/yui_compressor.rb +56 -0
  84. data/lib/sprockets.rb +217 -52
  85. metadata +250 -59
  86. data/LICENSE +0 -21
  87. data/lib/sprockets/asset_attributes.rb +0 -126
  88. data/lib/sprockets/bundled_asset.rb +0 -79
  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/static_asset.rb +0 -57
  99. data/lib/sprockets/trail.rb +0 -90
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ require 'sprockets/autoload'
3
+ require 'sprockets/digest_utils'
4
+
5
+ module Sprockets
6
+ # Public: Closure Compiler minifier.
7
+ #
8
+ # To accept the default options
9
+ #
10
+ # environment.register_bundle_processor 'application/javascript',
11
+ # Sprockets::ClosureCompressor
12
+ #
13
+ # Or to pass options to the Closure::Compiler class.
14
+ #
15
+ # environment.register_bundle_processor 'application/javascript',
16
+ # Sprockets::ClosureCompressor.new({ ... })
17
+ #
18
+ class ClosureCompressor
19
+ VERSION = '1'
20
+
21
+ # Public: Return singleton instance with default options.
22
+ #
23
+ # Returns ClosureCompressor object.
24
+ def self.instance
25
+ @instance ||= new
26
+ end
27
+
28
+ def self.call(input)
29
+ instance.call(input)
30
+ end
31
+
32
+ def self.cache_key
33
+ instance.cache_key
34
+ end
35
+
36
+ attr_reader :cache_key
37
+
38
+ def initialize(options = {})
39
+ @options = options
40
+ @cache_key = "#{self.class.name}:#{Autoload::Closure::VERSION}:#{Autoload::Closure::COMPILER_VERSION}:#{VERSION}:#{DigestUtils.digest(options)}".freeze
41
+ end
42
+
43
+ def call(input)
44
+ @compiler ||= Autoload::Closure::Compiler.new(@options)
45
+ @compiler.compile(input[:data])
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+ require 'sprockets/autoload'
3
+ require 'sprockets/source_map_utils'
4
+
5
+ module Sprockets
6
+ # Processor engine class for the CoffeeScript compiler.
7
+ # Depends on the `coffee-script` and `coffee-script-source` gems.
8
+ #
9
+ # For more infomation see:
10
+ #
11
+ # https://github.com/rails/ruby-coffee-script
12
+ #
13
+ module CoffeeScriptProcessor
14
+ VERSION = '2'
15
+
16
+ def self.cache_key
17
+ @cache_key ||= "#{name}:#{Autoload::CoffeeScript::Source.version}:#{VERSION}".freeze
18
+ end
19
+
20
+ def self.call(input)
21
+ data = input[:data]
22
+
23
+ js, map = input[:cache].fetch([self.cache_key, data]) do
24
+ result = Autoload::CoffeeScript.compile(
25
+ data,
26
+ sourceMap: "v3",
27
+ sourceFiles: [File.basename(input[:filename])],
28
+ generatedFile: input[:filename]
29
+ )
30
+ [result['js'], JSON.parse(result['v3SourceMap'])]
31
+ end
32
+
33
+ map = SourceMapUtils.format_source_map(map, input)
34
+ map = SourceMapUtils.combine_source_maps(input[:metadata][:map], map)
35
+
36
+ { data: js, map: map }
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,134 @@
1
+ # frozen_string_literal: true
2
+ require 'sprockets/utils'
3
+
4
+ module Sprockets
5
+ # `Compressing` is an internal mixin whose public methods are exposed on
6
+ # the `Environment` and `CachedEnvironment` classes.
7
+ module Compressing
8
+ include Utils
9
+
10
+ def compressors
11
+ config[:compressors]
12
+ end
13
+
14
+ # Public: Register a new compressor `klass` at `sym` for `mime_type`.
15
+ #
16
+ # Registering a processor allows it to be looked up by `sym` later when
17
+ # assigning a JavaScript or CSS compressor.
18
+ #
19
+ # Compressors only operate on JavaScript and CSS. If you want to compress a
20
+ # different type of asset, use a processor instead.
21
+ #
22
+ # Examples
23
+ #
24
+ # register_compressor 'text/css', :my_sass, MySassCompressor
25
+ # css_compressor = :my_sass
26
+ #
27
+ # mime_type - String MIME Type (one of: 'test/css' or 'application/javascript').
28
+ # sym - Symbol registration address.
29
+ # klass - The compressor class.
30
+ #
31
+ # Returns nothing.
32
+ def register_compressor(mime_type, sym, klass)
33
+ self.config = hash_reassoc(config, :compressors, mime_type) do |compressors|
34
+ compressors[sym] = klass
35
+ compressors
36
+ end
37
+ end
38
+
39
+ # Return CSS compressor or nil if none is set
40
+ def css_compressor
41
+ if defined? @css_compressor
42
+ @css_compressor
43
+ end
44
+ end
45
+
46
+ # Assign a compressor to run on `text/css` assets.
47
+ #
48
+ # The compressor object must respond to `compress`.
49
+ def css_compressor=(compressor)
50
+ unregister_bundle_processor 'text/css', @css_compressor if defined? @css_compressor
51
+ @css_compressor = nil
52
+ return unless compressor
53
+
54
+ if compressor.is_a?(Symbol)
55
+ @css_compressor = klass = config[:compressors]['text/css'][compressor] || raise(Error, "unknown compressor: #{compressor}")
56
+ elsif compressor.respond_to?(:compress)
57
+ klass = proc { |input| compressor.compress(input[:data]) }
58
+ @css_compressor = :css_compressor
59
+ else
60
+ @css_compressor = klass = compressor
61
+ end
62
+
63
+ register_bundle_processor 'text/css', klass
64
+ end
65
+
66
+ # Return JS compressor or nil if none is set
67
+ def js_compressor
68
+ if defined? @js_compressor
69
+ @js_compressor
70
+ end
71
+ end
72
+
73
+ # Assign a compressor to run on `application/javascript` assets.
74
+ #
75
+ # The compressor object must respond to `compress`.
76
+ def js_compressor=(compressor)
77
+ unregister_bundle_processor 'application/javascript', @js_compressor if defined? @js_compressor
78
+ @js_compressor = nil
79
+ return unless compressor
80
+
81
+ if compressor.is_a?(Symbol)
82
+ @js_compressor = klass = config[:compressors]['application/javascript'][compressor] || raise(Error, "unknown compressor: #{compressor}")
83
+ elsif compressor.respond_to?(:compress)
84
+ klass = proc { |input| compressor.compress(input[:data]) }
85
+ @js_compressor = :js_compressor
86
+ else
87
+ @js_compressor = klass = compressor
88
+ end
89
+
90
+ register_bundle_processor 'application/javascript', klass
91
+ end
92
+
93
+ # Public: Checks if Gzip is enabled.
94
+ def gzip?
95
+ config[:gzip_enabled]
96
+ end
97
+
98
+ # Public: Checks if Gzip is disabled.
99
+ def skip_gzip?
100
+ !gzip?
101
+ end
102
+
103
+ # Public: Enable or disable the creation of Gzip files.
104
+ #
105
+ # To disable gzip generation set to a falsey value:
106
+ #
107
+ # environment.gzip = false
108
+ #
109
+ # To enable set to a truthy value. By default zlib wil
110
+ # be used to gzip assets. If you have the Zopfli gem
111
+ # installed you can specify the zopfli algorithm to be used
112
+ # instead:
113
+ #
114
+ # environment.gzip = :zopfli
115
+ #
116
+ def gzip=(gzip)
117
+ self.config = config.merge(gzip_enabled: gzip).freeze
118
+
119
+ case gzip
120
+ when false, nil
121
+ self.unregister_exporter Exporters::ZlibExporter
122
+ self.unregister_exporter Exporters::ZopfliExporter
123
+ when :zopfli
124
+ self.unregister_exporter Exporters::ZlibExporter
125
+ self.register_exporter '*/*', Exporters::ZopfliExporter
126
+ else
127
+ self.unregister_exporter Exporters::ZopfliExporter
128
+ self.register_exporter '*/*', Exporters::ZlibExporter
129
+ end
130
+
131
+ gzip
132
+ end
133
+ end
134
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+ require 'sprockets/compressing'
3
+ require 'sprockets/dependencies'
4
+ require 'sprockets/mime'
5
+ require 'sprockets/paths'
6
+ require 'sprockets/processing'
7
+ require 'sprockets/exporting'
8
+ require 'sprockets/transformers'
9
+ require 'sprockets/utils'
10
+
11
+ module Sprockets
12
+ module Configuration
13
+ include Paths, Mime, Transformers, Processing, Exporting, Compressing, Dependencies, Utils
14
+
15
+ def initialize_configuration(parent)
16
+ @config = parent.config
17
+ @logger = parent.logger
18
+ @context_class = Class.new(parent.context_class)
19
+ end
20
+
21
+ attr_reader :config
22
+
23
+ def config=(config)
24
+ raise TypeError, "can't assign mutable config" unless config.frozen?
25
+ @config = config
26
+ end
27
+
28
+ # Get and set `Logger` instance.
29
+ attr_accessor :logger
30
+
31
+ # The `Environment#version` is a custom value used for manually
32
+ # expiring all asset caches.
33
+ #
34
+ # Sprockets is able to track most file and directory changes and
35
+ # will take care of expiring the cache for you. However, its
36
+ # impossible to know when any custom helpers change that you mix
37
+ # into the `Context`.
38
+ #
39
+ # It would be wise to increment this value anytime you make a
40
+ # configuration change to the `Environment` object.
41
+ def version
42
+ config[:version]
43
+ end
44
+
45
+ # Assign an environment version.
46
+ #
47
+ # environment.version = '2.0'
48
+ #
49
+ def version=(version)
50
+ self.config = hash_reassoc(config, :version) { version.dup }
51
+ end
52
+
53
+ # Public: Returns a `Digest` implementation class.
54
+ #
55
+ # Defaults to `Digest::SHA256`.
56
+ def digest_class
57
+ config[:digest_class]
58
+ end
59
+
60
+ # Deprecated: Assign a `Digest` implementation class. This maybe any Ruby
61
+ # `Digest::` implementation such as `Digest::SHA256` or
62
+ # `Digest::MD5`.
63
+ #
64
+ # environment.digest_class = Digest::MD5
65
+ #
66
+ def digest_class=(klass)
67
+ self.config = config.merge(digest_class: klass).freeze
68
+ end
69
+
70
+ # This class maybe mutated and mixed in with custom helpers.
71
+ #
72
+ # environment.context_class.instance_eval do
73
+ # include MyHelpers
74
+ # def asset_url; end
75
+ # end
76
+ #
77
+ attr_reader :context_class
78
+ end
79
+ end