sass-embedded 1.77.5 → 1.100.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 (68) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +18 -17
  3. data/README.md +1 -1
  4. data/exe/sass +2 -10
  5. data/ext/sass/Rakefile +162 -385
  6. data/ext/sass/file_utils.rb +75 -0
  7. data/ext/sass/package.json +1 -1
  8. data/ext/sass/platform.rb +44 -0
  9. data/ext/sass/sass-1.100.0.tgz +0 -0
  10. data/ext/sass/sass_config.rb +183 -0
  11. data/ext/sass/utils.rb +39 -0
  12. data/lib/sass/compiler/channel.rb +6 -4
  13. data/lib/sass/compiler/connection.rb +17 -21
  14. data/lib/sass/compiler/dispatcher.rb +27 -1
  15. data/lib/sass/compiler/host/function_registry.rb +6 -6
  16. data/lib/sass/compiler/host/importer_registry.rb +17 -11
  17. data/lib/sass/compiler/host/logger_registry.rb +17 -20
  18. data/lib/sass/compiler/host/protofier.rb +59 -73
  19. data/lib/sass/compiler/host/struct.rb +36 -0
  20. data/lib/sass/compiler/host.rb +2 -2
  21. data/lib/sass/compiler.rb +4 -3
  22. data/lib/sass/elf.rb +282 -172
  23. data/lib/sass/embedded/version.rb +1 -1
  24. data/lib/sass/embedded.rb +2 -41
  25. data/lib/sass/embedded_protocol.rb +1 -1
  26. data/{ext → lib}/sass/embedded_sass_pb.rb +3 -5
  27. data/lib/sass/exception.rb +7 -2
  28. data/lib/sass/fork_tracker.rb +36 -28
  29. data/lib/sass/gem_package_importer.rb +19 -0
  30. data/lib/sass/serializer.rb +5 -11
  31. data/lib/sass/value/argument_list.rb +0 -8
  32. data/lib/sass/value/color/channel.rb +79 -0
  33. data/lib/sass/value/color/conversions.rb +473 -0
  34. data/lib/sass/value/color/gamut_map_method/clip.rb +45 -0
  35. data/lib/sass/value/color/gamut_map_method/local_minde.rb +94 -0
  36. data/lib/sass/value/color/gamut_map_method.rb +45 -0
  37. data/lib/sass/value/color/interpolation_method.rb +51 -0
  38. data/lib/sass/value/color/space/a98_rgb.rb +57 -0
  39. data/lib/sass/value/color/space/display_p3.rb +72 -0
  40. data/lib/sass/value/color/space/display_p3_linear.rb +72 -0
  41. data/lib/sass/value/color/space/hsl.rb +65 -0
  42. data/lib/sass/value/color/space/hwb.rb +70 -0
  43. data/lib/sass/value/color/space/lab.rb +77 -0
  44. data/lib/sass/value/color/space/lch.rb +53 -0
  45. data/lib/sass/value/color/space/lms.rb +129 -0
  46. data/lib/sass/value/color/space/oklab.rb +66 -0
  47. data/lib/sass/value/color/space/oklch.rb +54 -0
  48. data/lib/sass/value/color/space/prophoto_rgb.rb +59 -0
  49. data/lib/sass/value/color/space/rec2020.rb +69 -0
  50. data/lib/sass/value/color/space/rgb.rb +52 -0
  51. data/lib/sass/value/color/space/srgb.rb +140 -0
  52. data/lib/sass/value/color/space/srgb_linear.rb +72 -0
  53. data/lib/sass/value/color/space/utils.rb +86 -0
  54. data/lib/sass/value/color/space/xyz_d50.rb +100 -0
  55. data/lib/sass/value/color/space/xyz_d65.rb +57 -0
  56. data/lib/sass/value/color/space.rb +201 -0
  57. data/lib/sass/value/color.rb +539 -162
  58. data/lib/sass/value/function.rb +9 -6
  59. data/lib/sass/value/fuzzy_math.rb +34 -30
  60. data/lib/sass/value/mixin.rb +5 -2
  61. data/lib/sass/value/null.rb +1 -1
  62. data/lib/sass/value/number/unit.rb +5 -4
  63. data/lib/sass/value/number.rb +15 -17
  64. data/lib/sass/value/string.rb +1 -1
  65. data/lib/sass/value.rb +1 -1
  66. metadata +42 -21
  67. data/ext/sass/expand-archive.ps1 +0 -1
  68. data/lib/sass/compiler/host/structifier.rb +0 -37
@@ -5,46 +5,54 @@ module Sass
5
5
  #
6
6
  # It tracks objects that need to be closed after `Process.fork`.
7
7
  module ForkTracker
8
- HASH = {}.compare_by_identity
8
+ module_function
9
9
 
10
- MUTEX = Mutex.new
10
+ if Process.respond_to?(:_fork)
11
+ # TODO: remove next line once ruby 3.1 support is dropped
12
+ require 'set' unless defined?(::Set)
11
13
 
12
- private_constant :HASH, :MUTEX
14
+ SET = Set.new.compare_by_identity
13
15
 
14
- module_function
16
+ MUTEX = Mutex.new
17
+
18
+ private_constant :SET, :MUTEX
15
19
 
16
- def add(obj)
17
- MUTEX.synchronize do
18
- HASH[obj] = true
20
+ def add(object)
21
+ MUTEX.synchronize do
22
+ SET.add(object)
23
+ end
19
24
  end
20
- end
21
25
 
22
- def delete(obj)
23
- MUTEX.synchronize do
24
- HASH.delete(obj)
26
+ def delete(object)
27
+ MUTEX.synchronize do
28
+ SET.delete(object)
29
+ end
25
30
  end
26
- end
27
31
 
28
- def each(...)
29
- MUTEX.synchronize do
30
- HASH.keys
31
- end.each(...)
32
- end
32
+ def each(&)
33
+ MUTEX.synchronize do
34
+ SET.to_a
35
+ end.each(&)
36
+ end
33
37
 
34
- # The {CoreExt} module.
35
- #
36
- # It closes objects after `Process.fork`.
37
- module CoreExt
38
- def _fork
39
- pid = super
40
- ForkTracker.each(&:close) if pid.zero?
41
- pid
38
+ # The {CoreExt} module.
39
+ #
40
+ # It closes objects after `Process.fork`.
41
+ module CoreExt
42
+ def _fork
43
+ pid = super
44
+ ForkTracker.each(&:close) if pid.zero?
45
+ pid
46
+ end
42
47
  end
43
- end
44
48
 
45
- private_constant :CoreExt
49
+ private_constant :CoreExt
46
50
 
47
- Process.singleton_class.prepend(CoreExt) if Process.respond_to?(:_fork)
51
+ Process.singleton_class.prepend(CoreExt)
52
+ else
53
+ def add(object); end
54
+ def delete(object); end
55
+ end
48
56
  end
49
57
 
50
58
  private_constant :ForkTracker
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ # The built-in RubyGems package importer. This loads pkg: URLs from gems.
5
+ class GemPackageImporter
6
+ # @!visibility private
7
+ def find_file_url(url, _canonicalize_context)
8
+ return unless url.start_with?('pkg:')
9
+
10
+ library, _, path = url[4..].partition(/[#?]/).first.partition('/')
11
+ gem_dir = Gem::Dependency.new(library).to_spec.gem_dir
12
+ gem_dir = "/#{gem_dir}" unless gem_dir.start_with?('/')
13
+
14
+ "file://#{gem_dir.gsub(/[#%?\\]/, { '#' => '%23', '%' => '%25', '?' => '%3F', '\\' => '%5C' })}/#{path}"
15
+ rescue Gem::MissingSpecError
16
+ nil
17
+ end
18
+ end
19
+ end
@@ -5,17 +5,11 @@ module Sass
5
5
  module Serializer
6
6
  module_function
7
7
 
8
- CSS_ESCAPE = {
9
- "\0" => "\uFFFD",
10
- '\\' => '\\\\',
11
- '"' => '\\"',
12
- "'" => "\\'",
13
- **[*"\x01".."\x08", *"\x0A".."\x1F", "\x7F"].product(
14
- [*'0'..'9', *'a'..'f', *'A'..'F', "\t", ' ', nil]
15
- ).to_h do |c, x|
16
- ["#{c}#{x}".freeze, "\\#{c.ord.to_s(16)}#{" #{x}" if x}".freeze]
17
- end
18
- }.freeze
8
+ CSS_ESCAPE = [*"\x01".."\x08", *"\x0A".."\x1F", "\x7F"]
9
+ .product([*'0'..'9', *'a'..'f', *'A'..'F', "\t", ' ', nil])
10
+ .each_with_object({ "\0" => "\uFFFD", '\\' => '\\\\', '"' => '\\"', "'" => "\\'" }) do |(c, x), h|
11
+ h["#{c}#{x}".freeze] = "\\#{c.ord.to_s(16)}#{" #{x}" if x}".freeze
12
+ end.freeze
19
13
 
20
14
  private_constant :CSS_ESCAPE
21
15
 
@@ -15,7 +15,6 @@ module Sass
15
15
  def initialize(contents = [], keywords = {}, separator = ',')
16
16
  super(contents, separator:)
17
17
 
18
- @id = 0
19
18
  @keywords_accessed = false
20
19
  @keywords = keywords.freeze
21
20
  end
@@ -25,13 +24,6 @@ module Sass
25
24
  @keywords_accessed = true
26
25
  @keywords
27
26
  end
28
-
29
- private
30
-
31
- def initialize_dup(orig)
32
- @id = 0
33
- super
34
- end
35
27
  end
36
28
  end
37
29
  end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ class Color
6
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/channel.dart
7
+ class ColorChannel
8
+ # @return [::String]
9
+ attr_reader :name
10
+
11
+ # @return [::Boolean]
12
+ def polar_angle?
13
+ @polar_angle
14
+ end
15
+
16
+ # @return [::String, nil]
17
+ attr_reader :associated_unit
18
+
19
+ # @param name [::String]
20
+ # @param polar_angle [::Boolean]
21
+ # @param associated_unit [::String]
22
+ def initialize(name, polar_angle:, associated_unit: nil)
23
+ @name = name
24
+ @polar_angle = polar_angle
25
+ @associated_unit = associated_unit
26
+ end
27
+
28
+ # @return [::Boolean]
29
+ def analogous?(other)
30
+ case [name, other.name]
31
+ in ['red' | 'x', 'red' | 'x'] |
32
+ ['green' | 'y', 'green' | 'y'] |
33
+ ['blue' | 'z', 'blue' | 'z'] |
34
+ ['chroma' | 'saturation', 'chroma' | 'saturation'] |
35
+ ['lightness', 'lightness'] |
36
+ ['hue', 'hue']
37
+ true
38
+ else
39
+ false
40
+ end
41
+ end
42
+ end
43
+
44
+ private_constant :ColorChannel
45
+
46
+ # @see https://github.com/sass/dart-sass/blob/main/lib/src/value/color/channel.dart
47
+ class LinearChannel < ColorChannel
48
+ # @return [Numeric]
49
+ attr_reader :min, :max
50
+
51
+ # @return [::Boolean]
52
+ attr_reader :requires_percent, :lower_clamped, :upper_clamped
53
+
54
+ # @param name [::String]
55
+ # @param min [Numeric]
56
+ # @param max [Numeric]
57
+ # @param requires_percent [::Boolean]
58
+ # @param lower_clamped [::Boolean]
59
+ # @param upper_clamped [::Boolean]
60
+ # @param conventionally_percent [::Boolean]
61
+ def initialize(name, min, max, requires_percent: false, lower_clamped: false, upper_clamped: false,
62
+ conventionally_percent: nil)
63
+ super(name,
64
+ polar_angle: false,
65
+ associated_unit: if conventionally_percent.nil? ? (min.zero? && max == 100) : conventionally_percent
66
+ '%'
67
+ end)
68
+ @min = min
69
+ @max = max
70
+ @requires_percent = requires_percent
71
+ @lower_clamped = lower_clamped
72
+ @upper_clamped = upper_clamped
73
+ end
74
+ end
75
+
76
+ private_constant :LinearChannel
77
+ end
78
+ end
79
+ end