sassc-embedded 1.76.0 → 1.77.7

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
2
  SHA256:
3
- metadata.gz: f24ea775d0adc29dba8cf3b768bdf8971291a149b87268c6bd458f8f591c9d5a
4
- data.tar.gz: 77a1ea85d8d417ae42df42b3cea656fef5f565656f36b9a083b08eebf9dde7ec
3
+ metadata.gz: 4a5084e30e04703dd21157b4dd3bf32abee7f789e939056a033bc4ddb4c2b1a2
4
+ data.tar.gz: eb1f8e6e1ce7ea90364fccbd4241fb5ccb677ae29a11ed385ec8c1bec068ae85
5
5
  SHA512:
6
- metadata.gz: 54ab5857d5198e676d6467edd4c65973d0f29b80917f2c79b3a331b3e59551aa990b6b89f2b170576db644d86b3659f1abd98b9ce74dfe357d5738b4ca76e9ca
7
- data.tar.gz: ab2d3db860f54f72c5aed4b5c5271183856ef3831542c13a57304b04ed052896c87c46e6e154b7cb7a521241e8d7eebb3e7a8f6fec1a373d368cca8b301cc54f
6
+ metadata.gz: 0a1bc6dc872c8cb0ebec80c1cc4d7550b62445515a3e6eca3d510094aadc0c48ce8d213ad5b31934501150b3f771efcdc931560befb87b8c827f74a0cb80fe4e
7
+ data.tar.gz: d9012320b9955c2aea7012bd11d0874dbf3b68ff807e6b7b5f395b22e7b8e4bbc75f48c38c9618fd2da669fd093193c61c257afd0eebc1507cba5a2ab792a0a4
@@ -2,6 +2,6 @@
2
2
 
3
3
  module SassC
4
4
  module Embedded
5
- VERSION = '1.76.0'
5
+ VERSION = '1.77.7'
6
6
  end
7
7
  end
@@ -10,6 +10,8 @@ require_relative 'embedded/version'
10
10
 
11
11
  module SassC
12
12
  class Engine
13
+ remove_method(:render) if public_method_defined?(:render, false)
14
+
13
15
  def render
14
16
  return @template.dup if @template.empty?
15
17
 
@@ -46,11 +48,10 @@ module SassC
46
48
  css = result.css
47
49
  css += "\n" unless css.empty?
48
50
  unless @source_map.nil? || omit_source_map_url?
49
- url = URL.parse(output_url || file_url)
50
51
  source_mapping_url = if source_map_embed?
51
52
  "data:application/json;base64,#{[@source_map].pack('m0')}"
52
53
  else
53
- URL.file_urls_to_relative_url(source_map_file_url, url)
54
+ Uri.file_urls_to_relative_url(source_map_file_url, file_url)
54
55
  end
55
56
  css += "\n/*# sourceMappingURL=#{source_mapping_url} */"
56
57
  end
@@ -61,29 +62,30 @@ module SassC
61
62
  line = e.span&.start&.line
62
63
  line += 1 unless line.nil?
63
64
  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
65
+ path = (Uri.file_urls_to_relative_path(url, Uri.path_to_file_url("#{Dir.pwd}/")) if url&.start_with?('file:'))
67
66
  raise SyntaxError.new(e.full_message, filename: path, line:)
68
67
  end
69
68
 
69
+ remove_method(:dependencies) if public_method_defined?(:dependencies, false)
70
+
70
71
  def dependencies
71
72
  raise NotRenderedError unless @loaded_urls
72
73
 
73
74
  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
75
+ Uri.file_url_to_path(url) if url.start_with?('file:') && !url.include?('?') && url != file_url
75
76
  end)
76
77
  end
77
78
 
79
+ remove_method(:source_map) if public_method_defined?(:source_map, false)
80
+
78
81
  def source_map
79
82
  raise NotRenderedError unless @source_map
80
83
 
81
- url = URL.parse(source_map_file_url || file_url)
84
+ url = Uri.parse(source_map_file_url || file_url)
82
85
  data = JSON.parse(@source_map)
83
- data['file'] = URL.file_urls_to_relative_url(output_url, url) if output_url
84
86
  data['sources'].map! do |source|
85
- if source.start_with?(Protocol::FILE)
86
- URL.file_urls_to_relative_url(source, url)
87
+ if source.start_with?('file:')
88
+ Uri.file_urls_to_relative_url(source, url)
87
89
  else
88
90
  source
89
91
  end
@@ -95,35 +97,29 @@ module SassC
95
97
  private
96
98
 
97
99
  def file_url
98
- @file_url ||= URL.path_to_file_url(File.absolute_path(filename || 'stdin'))
99
- end
100
-
101
- def output_path
102
- @output_path ||= @options.fetch(:output_path) do
103
- "#{filename.delete_suffix(File.extname(filename))}.css" if filename
104
- end
105
- end
106
-
107
- def output_url
108
- @output_url ||= (URL.path_to_file_url(File.absolute_path(output_path)) if output_path)
100
+ @file_url ||= Uri.path_to_file_url(File.absolute_path(filename || 'stdin'))
109
101
  end
110
102
 
111
103
  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)
104
+ @source_map_file_url ||= if source_map_file
105
+ Uri.path_to_file_url(File.absolute_path(source_map_file))
106
+ .gsub('%3F', '?') # https://github.com/sass-contrib/sassc-embedded-shim-ruby/pull/69
107
+ end
113
108
  end
114
109
 
110
+ remove_method(:output_style) if private_method_defined?(:output_style, false)
111
+
115
112
  def output_style
116
113
  @output_style ||= begin
117
- style = @options.fetch(:style, :sass_style_nested).to_s
118
- style = "sass_style_#{style}" unless style.start_with?('sass_style_')
119
- raise InvalidStyleError unless OUTPUT_STYLES.include?(style.to_sym)
114
+ style = @options.fetch(:style, :sass_style_nested).to_s.delete_prefix('sass_style_').to_sym
120
115
 
121
- style = style.delete_prefix('sass_style_').to_sym
122
116
  case style
123
- when :nested, :compact
117
+ when :nested, :compact, :expanded
124
118
  :expanded
119
+ when :compressed
120
+ :compressed
125
121
  else
126
- style
122
+ raise InvalidStyleError
127
123
  end
128
124
  end
129
125
  end
@@ -134,12 +130,16 @@ module SassC
134
130
  syntax
135
131
  end
136
132
 
133
+ remove_method(:load_paths) if private_method_defined?(:load_paths, false)
134
+
137
135
  def load_paths
138
136
  @load_paths ||= (@options[:load_paths] || []) + SassC.load_paths
139
137
  end
140
138
  end
141
139
 
142
140
  class FunctionsHandler
141
+ remove_method(:setup) if public_method_defined?(:setup, false)
142
+
143
143
  def setup(_native_options, functions: Script::Functions)
144
144
  @callbacks = {}
145
145
 
@@ -172,6 +172,8 @@ module SassC
172
172
 
173
173
  private
174
174
 
175
+ remove_method(:arguments_from_native_list) if private_method_defined?(:arguments_from_native_list, false)
176
+
175
177
  def arguments_from_native_list(native_argument_list)
176
178
  native_argument_list.filter_map do |native_value|
177
179
  Script::ValueConversion.from_native(native_value, @options)
@@ -190,6 +192,8 @@ module SassC
190
192
  private_constant :NoopImporter
191
193
 
192
194
  class ImportHandler
195
+ remove_method(:setup) if public_method_defined?(:setup, false)
196
+
193
197
  def setup(_native_options)
194
198
  if @importer
195
199
  import_cache = ImportCache.new(@importer)
@@ -227,7 +231,7 @@ module SassC
227
231
 
228
232
  private_constant :FileImporter
229
233
 
230
- class FileSystemImporter
234
+ module FileSystemImporter
231
235
  class << self
232
236
  def resolve_path(path, from_import)
233
237
  ext = File.extname(path)
@@ -304,48 +308,44 @@ module SassC
304
308
  def initialize(importer)
305
309
  @importer = importer
306
310
  @importer_results = {}
311
+ @importer_result = nil
307
312
  @file_url = nil
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
324
+ if containing_url.include?('?')
325
+ canonical_url = Uri.path_to_file_url(File.absolute_path(path, parent_dir))
326
+ unless @importer_results.key?(canonical_url)
327
+ @file_url = resolve_file_url(path, parent_dir, context.from_import)
328
+ return
329
+ end
330
+ else
326
331
  imports = @importer.imports(path, parent_path)
327
332
  imports = [SassC::Importer::Import.new(path)] if imports.nil?
328
333
  imports = [imports] unless imports.is_a?(Array)
329
- canonical_url = imports_to_native(imports, parent_dir, context.from_import, url, context.containing_url)
330
- if @importer_results.key?(canonical_url)
331
- canonical_url
332
- else
334
+ canonical_url = imports_to_native(imports, parent_dir, context.from_import, url, containing_url)
335
+ unless @importer_results.key?(canonical_url)
333
336
  @file_url = canonical_url
334
- nil
335
- end
336
- else
337
- canonical_url = URL.path_to_file_url(File.absolute_path(path, parent_dir))
338
- if @importer_results.key?(canonical_url)
339
- canonical_url
340
- else
341
- @file_url = resolve_file_url(path, parent_dir, context.from_import)
342
- nil
337
+ return
343
338
  end
344
339
  end
340
+
341
+ @importer_result = @importer_results.delete(canonical_url)
342
+ canonical_url
345
343
  end
346
344
 
347
- def load(canonical_url)
348
- @importer_results.delete(canonical_url)
345
+ def load(_canonical_url)
346
+ importer_result = @importer_result
347
+ @importer_result = nil
348
+ importer_result
349
349
  end
350
350
 
351
351
  def find_file_url(_url, context)
@@ -360,7 +360,7 @@ module SassC
360
360
 
361
361
  def resolve_file_url(path, parent_dir, from_import)
362
362
  resolved = FileSystemImporter.resolve_path(File.absolute_path(path, parent_dir), from_import)
363
- URL.path_to_file_url(resolved) unless resolved.nil?
363
+ Uri.path_to_file_url(resolved) unless resolved.nil?
364
364
  end
365
365
 
366
366
  def syntax(path)
@@ -376,7 +376,7 @@ module SassC
376
376
 
377
377
  def import_to_native(import, parent_dir, from_import, canonicalize)
378
378
  if import.source
379
- canonical_url = URL.path_to_file_url(File.absolute_path(import.path, parent_dir))
379
+ canonical_url = Uri.path_to_file_url(File.absolute_path(import.path, parent_dir))
380
380
  @importer_results[canonical_url] = if import.source.is_a?(Hash)
381
381
  {
382
382
  contents: import.source[:contents],
@@ -395,13 +395,13 @@ module SassC
395
395
  return resolve_file_url(import.path, parent_dir, from_import)
396
396
  end
397
397
 
398
- URL.escape(import.path)
398
+ Uri.encode_uri_path_component(import.path)
399
399
  end
400
400
 
401
401
  def imports_to_native(imports, parent_dir, from_import, url, containing_url)
402
402
  return import_to_native(imports.first, parent_dir, from_import, true) if imports.one?
403
403
 
404
- canonical_url = "#{Protocol::GLOB}?#{URL.escape(url)}##{URL.escape(containing_url)}"
404
+ canonical_url = "#{containing_url}?url=#{Uri.encode_uri_query_component(url)}&from_import=#{from_import}"
405
405
  @importer_results[canonical_url] = {
406
406
  contents: imports.flat_map do |import|
407
407
  at_rule = from_import ? '@import' : '@forward'
@@ -419,6 +419,10 @@ module SassC
419
419
  end
420
420
 
421
421
  class Sass2Scss
422
+ class << self
423
+ remove_method(:convert) if public_method_defined?(:convert, false)
424
+ end
425
+
422
426
  def self.convert(sass)
423
427
  {
424
428
  contents: sass,
@@ -430,6 +434,10 @@ module SassC
430
434
  module Script
431
435
  class Value
432
436
  class String
437
+ class << self
438
+ remove_method(:quote) if public_method_defined?(:quote, false)
439
+ end
440
+
433
441
  # Returns the quoted string representation of `contents`.
434
442
  #
435
443
  # @options opts :quote [String]
@@ -442,6 +450,8 @@ module SassC
442
450
  opts[:sass] ? contents.gsub('#', '\#') : contents
443
451
  end
444
452
 
453
+ remove_method(:to_s) if public_method_defined?(:to_s, false)
454
+
445
455
  def to_s(opts = {})
446
456
  opts = { quote: :none }.merge!(opts) if @type == :identifier
447
457
  self.class.quote(@value, opts)
@@ -450,6 +460,10 @@ module SassC
450
460
  end
451
461
 
452
462
  module ValueConversion
463
+ class << self
464
+ remove_method(:from_native) if public_method_defined?(:from_native, false)
465
+ end
466
+
453
467
  def self.from_native(value, options)
454
468
  case value
455
469
  when ::Sass::Value::Null::NULL
@@ -505,6 +519,10 @@ module SassC
505
519
  end
506
520
  end
507
521
 
522
+ class << self
523
+ remove_method(:to_native) if public_method_defined?(:to_native, false)
524
+ end
525
+
508
526
  def self.to_native(value)
509
527
  case value
510
528
  when nil
@@ -565,59 +583,84 @@ module SassC
565
583
  end
566
584
  end
567
585
 
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
-
586
+ module Uri
580
587
  module_function
581
588
 
582
- def join(...)
583
- URI.join(...).to_s
589
+ def parse(...)
590
+ ::URI::RFC3986_PARSER.parse(...)
584
591
  end
585
592
 
586
- def parse(str)
587
- PARSER.parse(str)
588
- end
593
+ encode_uri_hash = {}
594
+ decode_uri_hash = {}
595
+ 256.times do |i|
596
+ c = -[i].pack('C')
597
+ h = c.unpack1('H')
598
+ l = c.unpack1('h')
599
+ pdd = -"%#{h}#{l}"
600
+ pdu = -"%#{h}#{l.upcase}"
601
+ pud = -"%#{h.upcase}#{l}"
602
+ puu = -pdd.upcase
603
+ encode_uri_hash[c] = puu
604
+ decode_uri_hash[pdd] = c
605
+ decode_uri_hash[pdu] = c
606
+ decode_uri_hash[pud] = c
607
+ decode_uri_hash[puu] = c
608
+ end.freeze
609
+ encode_uri_hash.freeze
610
+ decode_uri_hash.freeze
611
+
612
+ {
613
+ uri_path_component: "!$&'()*+,;=:/@",
614
+ uri_query_component: "!$&'()*+,;=:/?@",
615
+ uri_component: nil,
616
+ uri: "!$&'()*+,;=:/?#[]@"
617
+ }
618
+ .each do |symbol, unescaped|
619
+ encode_regexp = Regexp.new("[^0-9A-Za-z#{Regexp.escape("-._~#{unescaped}")}]", Regexp::NOENCODING)
620
+
621
+ define_method(:"encode_#{symbol}") do |str|
622
+ str.b.gsub(encode_regexp, encode_uri_hash).force_encoding(str.encoding)
623
+ end
589
624
 
590
- def escape(str)
591
- PARSER.escape(str)
592
- end
625
+ next if symbol.match?(/_.+_/o)
593
626
 
594
- def unescape(str)
595
- PARSER.unescape(str)
596
- end
627
+ decode_regexp = /%[0-9A-Fa-f]{2}/o
628
+ decode_uri_hash_with_preserve_escaped = if unescaped.nil? || unescaped.empty?
629
+ decode_uri_hash
630
+ else
631
+ decode_uri_hash.to_h do |key, value|
632
+ [key, unescaped.include?(value) ? key : value]
633
+ end.freeze
634
+ end
635
+
636
+ define_method(:"decode_#{symbol}") do |str|
637
+ str.gsub(decode_regexp, decode_uri_hash_with_preserve_escaped).force_encoding(str.encoding)
638
+ end
639
+ end
597
640
 
598
641
  def file_urls_to_relative_url(url, from_url)
599
642
  parse(url).route_from(from_url).to_s
600
643
  end
601
644
 
602
645
  def file_urls_to_relative_path(url, from_url)
603
- unescape(file_urls_to_relative_url(url, from_url))
646
+ decode_uri_component(file_urls_to_relative_url(url, from_url))
604
647
  end
605
648
 
606
649
  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 == ':'
650
+ path = decode_uri_component(parse(url).path)
651
+ if path.start_with?('/')
652
+ windows_path = path[1..]
653
+ path = windows_path if File.absolute_path?(windows_path)
654
+ end
611
655
  path
612
656
  end
613
657
 
614
658
  def path_to_file_url(path)
615
- return if path.nil?
616
-
617
659
  path = "/#{path}" unless path.start_with?('/')
618
- "file://#{escape(path)}"
660
+
661
+ "file://#{encode_uri_path_component(path)}"
619
662
  end
620
663
  end
621
664
 
622
- private_constant :URL
665
+ private_constant :Uri
623
666
  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.7
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-07-07 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.7
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!