sassc-embedded 1.76.0 → 1.77.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f24ea775d0adc29dba8cf3b768bdf8971291a149b87268c6bd458f8f591c9d5a
4
- data.tar.gz: 77a1ea85d8d417ae42df42b3cea656fef5f565656f36b9a083b08eebf9dde7ec
3
+ metadata.gz: a4b63d6cb7265fce189ee1c9dd5a5e6c06a2ae5d0d0ccf2fe88bf9ea15a0b4f2
4
+ data.tar.gz: 9742024209ffbcd80ec482028500370fb12343af829e814b3e4daf9d15e3a7f0
5
5
  SHA512:
6
- metadata.gz: 54ab5857d5198e676d6467edd4c65973d0f29b80917f2c79b3a331b3e59551aa990b6b89f2b170576db644d86b3659f1abd98b9ce74dfe357d5738b4ca76e9ca
7
- data.tar.gz: ab2d3db860f54f72c5aed4b5c5271183856ef3831542c13a57304b04ed052896c87c46e6e154b7cb7a521241e8d7eebb3e7a8f6fec1a373d368cca8b301cc54f
6
+ metadata.gz: d332ab05fee496aa0bcd14aad0d623a4309ef9244cf30125f191fc5542bc79c7cf2effe8e0ec2069a59384c621467097977b70c030e465c798f5b46860159ecb
7
+ data.tar.gz: e14c9ffb2dc052809527cc30619fa28224457523780237fd44004f953de09e867fb0ea2b1933a23cece2cb6cb3c8cb8ce2264096848c8cb86acd8876d55cec7a
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SassC
4
4
  module Embedded
5
- VERSION = '1.76.0'
5
+ VERSION = '1.77.1'
6
6
  end
7
7
  end
@@ -46,11 +46,11 @@ module SassC
46
46
  css = result.css
47
47
  css += "\n" unless css.empty?
48
48
  unless @source_map.nil? || omit_source_map_url?
49
- url = URL.parse(output_url || file_url)
49
+ url = Uri.parse(output_url || file_url)
50
50
  source_mapping_url = if source_map_embed?
51
51
  "data:application/json;base64,#{[@source_map].pack('m0')}"
52
52
  else
53
- URL.file_urls_to_relative_url(source_map_file_url, url)
53
+ Uri.file_urls_to_relative_url(source_map_file_url, url)
54
54
  end
55
55
  css += "\n/*# sourceMappingURL=#{source_mapping_url} */"
56
56
  end
@@ -61,9 +61,7 @@ module SassC
61
61
  line = e.span&.start&.line
62
62
  line += 1 unless line.nil?
63
63
  url = e.span&.url
64
- path = if url&.start_with?(Protocol::FILE)
65
- URL.file_urls_to_relative_path(url, URL.path_to_file_url("#{Dir.pwd}/"))
66
- end
64
+ path = (Uri.file_urls_to_relative_path(url, Uri.path_to_file_url("#{Dir.pwd}/")) if url&.start_with?('file:'))
67
65
  raise SyntaxError.new(e.full_message, filename: path, line:)
68
66
  end
69
67
 
@@ -71,19 +69,19 @@ module SassC
71
69
  raise NotRenderedError unless @loaded_urls
72
70
 
73
71
  Dependency.from_filenames(@loaded_urls.filter_map do |url|
74
- URL.file_url_to_path(url) if url.start_with?(Protocol::FILE) && url != file_url
72
+ Uri.file_url_to_path(url) if url.start_with?('file:') && !url.include?('?') && url != file_url
75
73
  end)
76
74
  end
77
75
 
78
76
  def source_map
79
77
  raise NotRenderedError unless @source_map
80
78
 
81
- url = URL.parse(source_map_file_url || file_url)
79
+ url = Uri.parse(source_map_file_url || file_url)
82
80
  data = JSON.parse(@source_map)
83
- data['file'] = URL.file_urls_to_relative_url(output_url, url) if output_url
81
+ data['file'] = Uri.file_urls_to_relative_url(output_url, url) if output_url
84
82
  data['sources'].map! do |source|
85
- if source.start_with?(Protocol::FILE)
86
- URL.file_urls_to_relative_url(source, url)
83
+ if source.start_with?('file:')
84
+ Uri.file_urls_to_relative_url(source, url)
87
85
  else
88
86
  source
89
87
  end
@@ -95,7 +93,7 @@ module SassC
95
93
  private
96
94
 
97
95
  def file_url
98
- @file_url ||= URL.path_to_file_url(File.absolute_path(filename || 'stdin'))
96
+ @file_url ||= Uri.path_to_file_url(File.absolute_path(filename || 'stdin'))
99
97
  end
100
98
 
101
99
  def output_path
@@ -105,11 +103,18 @@ module SassC
105
103
  end
106
104
 
107
105
  def output_url
108
- @output_url ||= (URL.path_to_file_url(File.absolute_path(output_path)) if output_path)
106
+ @output_url ||= (Uri.path_to_file_url(File.absolute_path(output_path)) if output_path)
109
107
  end
110
108
 
111
109
  def source_map_file_url
112
- @source_map_file_url ||= (URL.path_to_file_url(File.absolute_path(source_map_file)) if source_map_file)
110
+ @source_map_file_url ||= if source_map_file
111
+ # https://github.com/sass-contrib/sassc-embedded-shim-ruby/pull/69
112
+ # SassC does not encode path as uri for sourceMappingURL, which is technically wrong.
113
+ # However, this behavior has been abused to append query string to sourceMappingURL.
114
+ components = source_map_file.split('?', 2)
115
+ components[0] = Uri.path_to_file_url(File.absolute_path(components[0]))
116
+ components.join('?')
117
+ end
113
118
  end
114
119
 
115
120
  def output_style
@@ -308,37 +313,31 @@ module SassC
308
313
  end
309
314
 
310
315
  def canonicalize(url, context)
311
- return if context.containing_url.nil?
316
+ return unless context.containing_url&.start_with?('file:')
312
317
 
313
- containing_url = if context.containing_url.start_with?(Protocol::GLOB)
314
- URL.unescape(URL.parse(context.containing_url).fragment)
315
- else
316
- context.containing_url
317
- end
318
+ containing_url = context.containing_url
318
319
 
319
- return unless containing_url.start_with?(Protocol::FILE)
320
-
321
- path = URL.unescape(url)
322
- parent_path = URL.file_url_to_path(containing_url)
320
+ path = Uri.decode_uri_component(url)
321
+ parent_path = Uri.file_url_to_path(containing_url)
323
322
  parent_dir = File.dirname(parent_path)
324
323
 
325
- if containing_url == context.containing_url
326
- imports = @importer.imports(path, parent_path)
327
- imports = [SassC::Importer::Import.new(path)] if imports.nil?
328
- imports = [imports] unless imports.is_a?(Array)
329
- canonical_url = imports_to_native(imports, parent_dir, context.from_import, url, context.containing_url)
324
+ if containing_url.include?('?')
325
+ canonical_url = Uri.path_to_file_url(File.absolute_path(path, parent_dir))
330
326
  if @importer_results.key?(canonical_url)
331
327
  canonical_url
332
328
  else
333
- @file_url = canonical_url
329
+ @file_url = resolve_file_url(path, parent_dir, context.from_import)
334
330
  nil
335
331
  end
336
332
  else
337
- canonical_url = URL.path_to_file_url(File.absolute_path(path, parent_dir))
333
+ imports = @importer.imports(path, parent_path)
334
+ imports = [SassC::Importer::Import.new(path)] if imports.nil?
335
+ imports = [imports] unless imports.is_a?(Array)
336
+ canonical_url = imports_to_native(imports, parent_dir, context.from_import, url, containing_url)
338
337
  if @importer_results.key?(canonical_url)
339
338
  canonical_url
340
339
  else
341
- @file_url = resolve_file_url(path, parent_dir, context.from_import)
340
+ @file_url = canonical_url
342
341
  nil
343
342
  end
344
343
  end
@@ -360,7 +359,7 @@ module SassC
360
359
 
361
360
  def resolve_file_url(path, parent_dir, from_import)
362
361
  resolved = FileSystemImporter.resolve_path(File.absolute_path(path, parent_dir), from_import)
363
- URL.path_to_file_url(resolved) unless resolved.nil?
362
+ Uri.path_to_file_url(resolved) unless resolved.nil?
364
363
  end
365
364
 
366
365
  def syntax(path)
@@ -376,7 +375,7 @@ module SassC
376
375
 
377
376
  def import_to_native(import, parent_dir, from_import, canonicalize)
378
377
  if import.source
379
- canonical_url = URL.path_to_file_url(File.absolute_path(import.path, parent_dir))
378
+ canonical_url = Uri.path_to_file_url(File.absolute_path(import.path, parent_dir))
380
379
  @importer_results[canonical_url] = if import.source.is_a?(Hash)
381
380
  {
382
381
  contents: import.source[:contents],
@@ -395,13 +394,13 @@ module SassC
395
394
  return resolve_file_url(import.path, parent_dir, from_import)
396
395
  end
397
396
 
398
- URL.escape(import.path)
397
+ Uri.encode_uri_path_component(import.path)
399
398
  end
400
399
 
401
400
  def imports_to_native(imports, parent_dir, from_import, url, containing_url)
402
401
  return import_to_native(imports.first, parent_dir, from_import, true) if imports.one?
403
402
 
404
- canonical_url = "#{Protocol::GLOB}?#{URL.escape(url)}##{URL.escape(containing_url)}"
403
+ canonical_url = "#{containing_url}?url=#{Uri.encode_uri_query_component(url)}&from_import=#{from_import}"
405
404
  @importer_results[canonical_url] = {
406
405
  contents: imports.flat_map do |import|
407
406
  at_rule = from_import ? '@import' : '@forward'
@@ -565,34 +564,35 @@ module SassC
565
564
  end
566
565
  end
567
566
 
568
- module Protocol
569
- FILE = 'file:'
570
- GLOB = 'sassc-embedded-glob:'
571
- end
572
-
573
- private_constant :Protocol
574
-
575
- module URL
576
- PARSER = URI::Parser.new({ RESERVED: ';/?:@&=+$,' })
577
-
578
- private_constant :PARSER
579
-
567
+ module Uri
580
568
  module_function
581
569
 
582
- def join(...)
583
- URI.join(...).to_s
570
+ def parse(...)
571
+ ::URI.parse(...)
584
572
  end
585
573
 
586
- def parse(str)
587
- PARSER.parse(str)
574
+ def encode_uri_path_component(str)
575
+ str.b.gsub(%r{[^0-9A-Za-z\-._~!$&'()*+,;=:@/]}n) do |match|
576
+ format('%%%02X', match.unpack1('C'))
577
+ end.force_encoding(str.encoding)
588
578
  end
589
579
 
590
- def escape(str)
591
- PARSER.escape(str)
580
+ def encode_uri_query_component(str)
581
+ str.b.gsub(%r{[^0-9A-Za-z\-._~!$&'()*+,;=:@/?]}n) do |match|
582
+ format('%%%02X', match.unpack1('C'))
583
+ end.force_encoding(str.encoding)
592
584
  end
593
585
 
594
- def unescape(str)
595
- PARSER.unescape(str)
586
+ def encode_uri_component(str)
587
+ str.b.gsub(/[^0-9A-Za-z\-._~]/n) do |match|
588
+ format('%%%02X', match.unpack1('C'))
589
+ end.force_encoding(str.encoding)
590
+ end
591
+
592
+ def decode_uri_component(str)
593
+ str.gsub(/%[0-9A-Fa-f]{2}/) do |match|
594
+ [match[1, 2]].pack('H2')
595
+ end
596
596
  end
597
597
 
598
598
  def file_urls_to_relative_url(url, from_url)
@@ -600,24 +600,24 @@ module SassC
600
600
  end
601
601
 
602
602
  def file_urls_to_relative_path(url, from_url)
603
- unescape(file_urls_to_relative_url(url, from_url))
603
+ decode_uri_component(file_urls_to_relative_url(url, from_url))
604
604
  end
605
605
 
606
606
  def file_url_to_path(url)
607
- return if url.nil?
608
-
609
- path = unescape(parse(url).path)
610
- path = path[1..] if Gem.win_platform? && path[0].chr == '/' && path[1].chr =~ /[a-z]/i && path[2].chr == ':'
607
+ path = decode_uri_component(parse(url).path)
608
+ if path.start_with?('/')
609
+ windows_path = path[1..]
610
+ path = windows_path if File.absolute_path?(windows_path)
611
+ end
611
612
  path
612
613
  end
613
614
 
614
615
  def path_to_file_url(path)
615
- return if path.nil?
616
-
617
616
  path = "/#{path}" unless path.start_with?('/')
618
- "file://#{escape(path)}"
617
+
618
+ "file://#{encode_uri_path_component(path)}"
619
619
  end
620
620
  end
621
621
 
622
- private_constant :URL
622
+ private_constant :Uri
623
623
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: sassc-embedded
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.76.0
4
+ version: 1.77.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - なつき
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-05-01 00:00:00.000000000 Z
11
+ date: 2024-06-29 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: sass-embedded
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.76'
19
+ version: '1.77'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.76'
26
+ version: '1.77'
27
27
  description: An embedded sass shim for SassC.
28
28
  email:
29
29
  - i@ntk.me
@@ -79,7 +79,7 @@ licenses:
79
79
  metadata:
80
80
  bug_tracker_uri: https://github.com/sass-contrib/sassc-embedded-shim-ruby/issues
81
81
  documentation_uri: https://rubydoc.info/gems/sassc
82
- source_code_uri: https://github.com/sass-contrib/sassc-embedded-shim-ruby/tree/v1.76.0
82
+ source_code_uri: https://github.com/sass-contrib/sassc-embedded-shim-ruby/tree/v1.77.1
83
83
  funding_uri: https://github.com/sponsors/ntkme
84
84
  rubygems_mfa_required: 'true'
85
85
  post_install_message:
@@ -91,14 +91,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
91
  requirements:
92
92
  - - ">="
93
93
  - !ruby/object:Gem::Version
94
- version: 3.1.0
94
+ version: '3.1'
95
95
  required_rubygems_version: !ruby/object:Gem::Requirement
96
96
  requirements:
97
97
  - - ">="
98
98
  - !ruby/object:Gem::Version
99
99
  version: '0'
100
100
  requirements: []
101
- rubygems_version: 3.5.9
101
+ rubygems_version: 3.5.11
102
102
  signing_key:
103
103
  specification_version: 4
104
104
  summary: Use dart-sass with SassC!