sprockets 4.0.0.beta5 → 4.0.0.beta6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 8fec40bbdd1b072ed9297eb8a8c4cace3ad4d406
4
- data.tar.gz: 7e75410bb1fb7fce7577c5c7a270795735940d0b
2
+ SHA256:
3
+ metadata.gz: 4d2caeaadba82b93fec24d508ff3dc84fa5f48db942cc968c732d5f2eb0fd0c0
4
+ data.tar.gz: 5cc1d606e6ded78d675802867b00978e45a881642dd7cf3c6fcb8e2e2da8c799
5
5
  SHA512:
6
- metadata.gz: 41dc1ca9ad0acf4423861cc32353eb7e69f438fd01519ee2f0c5f6b543a4701b838132ebd1a55b3c2aedca5b2c2409b7221bc3199a7b094e9724c6165b9c7bbb
7
- data.tar.gz: 2f9d9d7ca8cf7264eb99eb53b02f39d768f3f9472005d20a72655740c99eaf571977ddacd3ae07f8ada481e1390328e11cb2203bc415e29ecf496e93888d587a
6
+ metadata.gz: dbe7fe89fb3d28046ea2ec42bd2f65d955d31752f713adc27f29049d206067dabaa0ed4e8021597cf6a6ef6969d65f9c392abd407091ea9544e53c11cec0fbcd
7
+ data.tar.gz: '08ead7193ee03944662ab0f748282b339a083f04fb77179e1232b06feacdc4565ec9fc7f7d9a6815ac29eaca87c9b40e985fc144798a01dde4ee9a37df3c2c92'
@@ -4,6 +4,11 @@ Get upgrade notes from Sprockets 3.x to 4.x at https://github.com/rails/sprocket
4
4
 
5
5
  ## Master
6
6
 
7
+ ## 4.0.0.beta6
8
+
9
+ - Fix source map line offsets [#515]
10
+ - Return a `400 Bad Request` when the path encoding is invalid. [#514]
11
+
7
12
  ## 4.0.0.beta5
8
13
 
9
14
  - Reduce string allocations
@@ -107,10 +107,6 @@ module Sprockets
107
107
  [SourceMapCommentProcessor]
108
108
  end
109
109
 
110
- require 'sprockets/preprocessors/default_source_map'
111
- register_preprocessor 'text/css', Preprocessors::DefaultSourceMap.new
112
- register_preprocessor 'application/javascript', Preprocessors::DefaultSourceMap.new
113
-
114
110
  require 'sprockets/directive_processor'
115
111
  register_preprocessor 'text/css', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
116
112
  register_preprocessor 'application/javascript', DirectiveProcessor.new(comments: ["//", ["/*", "*/"]])
@@ -123,7 +119,6 @@ module Sprockets
123
119
  register_bundle_metadata_reducer 'application/javascript', :data, proc { String.new("") }, Utils.method(:concat_javascript_sources)
124
120
  register_bundle_metadata_reducer '*/*', :links, :+
125
121
  register_bundle_metadata_reducer '*/*', :sources, proc { [] }, :+
126
- register_bundle_metadata_reducer '*/*', :map, proc { |input| { "version" => 3, "file" => PathUtils.split_subpath(input[:load_path], input[:filename]), "sections" => [] } }, SourceMapUtils.method(:concat_source_maps)
127
122
 
128
123
  require 'sprockets/closure_compressor'
129
124
  require 'sprockets/sass_compressor'
@@ -219,4 +214,11 @@ module Sprockets
219
214
 
220
215
  depend_on 'environment-version'
221
216
  depend_on 'environment-paths'
217
+
218
+ require 'sprockets/preprocessors/default_source_map'
219
+ register_preprocessor 'text/css', Preprocessors::DefaultSourceMap.new
220
+ register_preprocessor 'application/javascript', Preprocessors::DefaultSourceMap.new
221
+
222
+ register_bundle_metadata_reducer 'text/css', :map, proc { |input| { "version" => 3, "file" => PathUtils.split_subpath(input[:load_path], input[:filename]), "sections" => [] } }, SourceMapUtils.method(:concat_source_maps)
223
+ register_bundle_metadata_reducer 'application/javascript', :map, proc { |input| { "version" => 3, "file" => PathUtils.split_subpath(input[:load_path], input[:filename]), "sections" => [] } }, SourceMapUtils.method(:concat_source_maps)
222
224
  end
@@ -51,7 +51,7 @@ module Sprockets
51
51
  # Internal: Cache key version for this class. Rarely should have to change
52
52
  # unless the cache format radically changes. Will be bump on major version
53
53
  # releases though.
54
- VERSION = '4.0'
54
+ VERSION = '4.0.0'
55
55
 
56
56
  def self.default_logger
57
57
  logger = Logger.new($stderr)
@@ -22,6 +22,7 @@ module Sprockets
22
22
  DEFAULT_MAX_SIZE = 25 * 1024 * 1024
23
23
  EXCLUDED_DIRS = ['.', '..'].freeze
24
24
  GITKEEP_FILES = ['.gitkeep', '.keep'].freeze
25
+
25
26
  # Internal: Default standard error fatal logger.
26
27
  #
27
28
  # Returns a Logger.
@@ -34,8 +35,10 @@ module Sprockets
34
35
  # Public: Initialize the cache store.
35
36
  #
36
37
  # root - A String path to a directory to persist cached values to.
37
- # max_size - A Integer of the maximum number of keys the store will hold.
38
- # (default: 1000).
38
+ # max_size - A Integer of the maximum size the store will hold (in bytes).
39
+ # (default: 25MB).
40
+ # logger - The logger to which some info will be printed.
41
+ # (default logger level is FATAL and won't output anything).
39
42
  def initialize(root, max_size = DEFAULT_MAX_SIZE, logger = self.class.default_logger)
40
43
  @root = root
41
44
  @max_size = max_size
@@ -144,7 +144,8 @@ module Sprockets
144
144
  end
145
145
  else
146
146
  args.each do |path|
147
- yield File.binread(File.join(dir, assets[path]))
147
+ asset = assets[path]
148
+ yield File.binread(File.join(dir, asset)) if asset
148
149
  end
149
150
  end
150
151
  end
@@ -13,7 +13,7 @@ module Sprockets
13
13
  map = input[:metadata][:map]
14
14
  filename = input[:filename]
15
15
  load_path = input[:load_path]
16
- lines = input[:data].lines.count
16
+ lines = input[:data].lines.length
17
17
  basename = File.basename(filename)
18
18
  mime_exts = input[:environment].config[:mime_exts]
19
19
  pipeline_exts = input[:environment].config[:pipeline_exts]
@@ -25,10 +25,14 @@ module Sprockets
25
25
  "sources" => [PathUtils.set_pipeline(basename, mime_exts, pipeline_exts, :source)],
26
26
  "names" => []
27
27
  }
28
+ else
29
+ result[:map] = map
28
30
  end
31
+
32
+ result[:map]["x_sprockets_linecount"] = lines
29
33
  return result
30
34
  end
31
-
35
+
32
36
  private
33
37
 
34
38
  def default_mappings(lines)
@@ -37,6 +37,10 @@ module Sprockets
37
37
  # Extract the path from everything after the leading slash
38
38
  path = Rack::Utils.unescape(env['PATH_INFO'].to_s.sub(/^\//, ''))
39
39
 
40
+ unless path.valid_encoding?
41
+ return bad_request_response(env)
42
+ end
43
+
40
44
  # Strip fingerprint
41
45
  if fingerprint = path_fingerprint(path)
42
46
  path = path.sub("-#{fingerprint}", '')
@@ -131,6 +135,15 @@ module Sprockets
131
135
  [ 304, cache_headers(env, etag), [] ]
132
136
  end
133
137
 
138
+ # Returns a 400 Forbidden response tuple
139
+ def bad_request_response(env)
140
+ if head_request?(env)
141
+ [ 400, { "Content-Type" => "text/plain", "Content-Length" => "0" }, [] ]
142
+ else
143
+ [ 400, { "Content-Type" => "text/plain", "Content-Length" => "11" }, [ "Bad Request" ] ]
144
+ end
145
+ end
146
+
134
147
  # Returns a 403 Forbidden response tuple
135
148
  def forbidden_response(env)
136
149
  if head_request?(env)
@@ -29,7 +29,7 @@ module Sprockets
29
29
  path = PathUtils.relative_path_from(PathUtils.split_subpath(input[:load_path], uri), map.digest_path)
30
30
 
31
31
  asset.metadata.merge(
32
- data: asset.source + (comment % path),
32
+ data: asset.source + (comment % path) + "\n",
33
33
  links: asset.links + [asset.uri, map.uri]
34
34
  )
35
35
  end
@@ -6,9 +6,9 @@ module Sprockets
6
6
  def self.original_content_type(source_map_content_type, error_when_not_found: true)
7
7
  case source_map_content_type
8
8
  when "application/js-sourcemap+json"
9
- accept = "application/javascript"
9
+ "application/javascript"
10
10
  when "application/css-sourcemap+json"
11
- accept = "text/css"
11
+ "text/css"
12
12
  else
13
13
  fail(source_map_content_type) if error_when_not_found
14
14
  source_map_content_type
@@ -48,7 +48,7 @@ module Sprockets
48
48
  "sources" => map["sources"].map do |source|
49
49
  source = URIUtils.split_file_uri(source)[2] if source.start_with? "file://"
50
50
  source = PathUtils.join(File.dirname(filename), source) unless PathUtils.absolute_path?(source)
51
- _, source = PathUtils.paths_split(load_paths, source)
51
+ _, source = PathUtils.paths_split(load_paths, source)
52
52
  source = PathUtils.relative_path_from(file, source)
53
53
  PathUtils.set_pipeline(source, mime_exts, pipeline_exts, :source)
54
54
  end,
@@ -72,13 +72,16 @@ module Sprockets
72
72
  # Returns a new source map hash.
73
73
  def concat_source_maps(a, b)
74
74
  return a || b unless a && b
75
- a, b = make_index_map(a), make_index_map(b)
75
+ a = make_index_map(a)
76
+ b = make_index_map(b)
76
77
 
77
- if a["sections"].count == 0 || a["sections"].last["map"]["mappings"].empty?
78
- offset = 0
79
- else
80
- offset = a["sections"].last["map"]["mappings"].count(';') +
81
- a["sections"].last["offset"]["line"] + 1
78
+ offset = 0
79
+ if a["sections"].count != 0 && !a["sections"].last["map"]["mappings"].empty?
80
+ last_line_count = a["sections"].last["map"].delete("x_sprockets_linecount")
81
+ offset += last_line_count
82
+
83
+ last_offset = a["sections"].last["offset"]["line"]
84
+ offset += last_offset
82
85
  end
83
86
 
84
87
  a["sections"] += b["sections"].map do |section|
@@ -68,6 +68,9 @@ module Sprockets
68
68
  end
69
69
  end
70
70
 
71
+ WHITESPACE_ORDINALS = {0x0A => "\n", 0x20 => " ", 0x09 => "\t"}
72
+ private_constant :WHITESPACE_ORDINALS
73
+
71
74
  # Internal: Check if string has a trailing semicolon.
72
75
  #
73
76
  # str - String
@@ -79,14 +82,9 @@ module Sprockets
79
82
  c = str[i].ord
80
83
  i -= 1
81
84
 
82
- # Need to compare against the ordinals because the string can be UTF_8 or UTF_32LE encoded
83
- # 0x0A == "\n"
84
- # 0x20 == " "
85
- # 0x09 == "\t"
86
- # 0x3B == ";"
87
- unless c == 0x0A || c == 0x20 || c == 0x09
88
- return c === 0x3B
89
- end
85
+ next if WHITESPACE_ORDINALS[c]
86
+
87
+ return c === 0x3B
90
88
  end
91
89
 
92
90
  true
@@ -100,18 +98,21 @@ module Sprockets
100
98
  #
101
99
  # Returns buf String.
102
100
  def concat_javascript_sources(buf, source)
103
- if source.bytesize > 0
104
- buf << source
105
-
106
- # If the source contains non-ASCII characters, indexing on it becomes O(N).
107
- # This will lead to O(N^2) performance in string_end_with_semicolon?, so we should use 32 bit encoding to make sure indexing stays O(1)
108
- source = source.encode(Encoding::UTF_32LE) unless source.ascii_only?
109
-
110
- if !string_end_with_semicolon?(source)
111
- buf << ";\n"
112
- elsif source[source.size - 1].ord != 0x0A
113
- buf << "\n"
114
- end
101
+ return buf if source.bytesize <= 0
102
+
103
+ buf << source
104
+ # If the source contains non-ASCII characters, indexing on it becomes O(N).
105
+ # This will lead to O(N^2) performance in string_end_with_semicolon?, so we should use 32 bit encoding to make sure indexing stays O(1)
106
+ source = source.encode(Encoding::UTF_32LE) unless source.ascii_only?
107
+ return buf if string_end_with_semicolon?(source)
108
+
109
+ # If the last character in the string was whitespace,
110
+ # such as a newline, then we want to put the semicolon
111
+ # before the whitespace. Otherwise append a semicolon.
112
+ if whitespace = WHITESPACE_ORDINALS[source[-1].ord]
113
+ buf[-1] = ";#{whitespace}"
114
+ else
115
+ buf << ";"
115
116
  end
116
117
 
117
118
  buf
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module Sprockets
3
- VERSION = "4.0.0.beta5"
3
+ VERSION = "4.0.0.beta6"
4
4
  end
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.0.0.beta5
4
+ version: 4.0.0.beta6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Stephenson
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2017-08-29 00:00:00.000000000 Z
12
+ date: 2017-11-15 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rack
@@ -402,7 +402,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
402
402
  version: 1.3.1
403
403
  requirements: []
404
404
  rubyforge_project: sprockets
405
- rubygems_version: 2.6.13
405
+ rubygems_version: 2.6.14
406
406
  signing_key:
407
407
  specification_version: 4
408
408
  summary: Rack-based asset packaging system