sass-embedded 1.74.1-x86-mswin32

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 (52) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +20 -0
  3. data/README.md +48 -0
  4. data/exe/sass +21 -0
  5. data/ext/sass/cli.rb +12 -0
  6. data/ext/sass/dart-sass/sass.bat +7 -0
  7. data/ext/sass/dart-sass/src/LICENSE +1687 -0
  8. data/ext/sass/dart-sass/src/dart.exe +0 -0
  9. data/ext/sass/dart-sass/src/sass.snapshot +0 -0
  10. data/ext/sass/embedded_sass_pb.rb +63 -0
  11. data/lib/sass/calculation_value/calculation_operation.rb +49 -0
  12. data/lib/sass/calculation_value.rb +22 -0
  13. data/lib/sass/canonicalize_context.rb +21 -0
  14. data/lib/sass/compile_result.rb +24 -0
  15. data/lib/sass/compiler/channel.rb +68 -0
  16. data/lib/sass/compiler/connection.rb +92 -0
  17. data/lib/sass/compiler/dispatcher.rb +115 -0
  18. data/lib/sass/compiler/host/function_registry.rb +87 -0
  19. data/lib/sass/compiler/host/importer_registry.rb +137 -0
  20. data/lib/sass/compiler/host/logger_registry.rb +55 -0
  21. data/lib/sass/compiler/host/protofier.rb +390 -0
  22. data/lib/sass/compiler/host/structifier.rb +37 -0
  23. data/lib/sass/compiler/host.rb +226 -0
  24. data/lib/sass/compiler/varint.rb +39 -0
  25. data/lib/sass/compiler.rb +212 -0
  26. data/lib/sass/elf.rb +276 -0
  27. data/lib/sass/embedded/version.rb +7 -0
  28. data/lib/sass/embedded.rb +107 -0
  29. data/lib/sass/embedded_protocol.rb +10 -0
  30. data/lib/sass/exception.rb +69 -0
  31. data/lib/sass/fork_tracker.rb +51 -0
  32. data/lib/sass/logger/silent.rb +28 -0
  33. data/lib/sass/logger/source_location.rb +22 -0
  34. data/lib/sass/logger/source_span.rb +28 -0
  35. data/lib/sass/node_package_importer.rb +17 -0
  36. data/lib/sass/serializer.rb +36 -0
  37. data/lib/sass/value/argument_list.rb +37 -0
  38. data/lib/sass/value/boolean.rb +52 -0
  39. data/lib/sass/value/calculation.rb +90 -0
  40. data/lib/sass/value/color.rb +253 -0
  41. data/lib/sass/value/function.rb +51 -0
  42. data/lib/sass/value/fuzzy_math.rb +80 -0
  43. data/lib/sass/value/list.rb +79 -0
  44. data/lib/sass/value/map.rb +71 -0
  45. data/lib/sass/value/mixin.rb +36 -0
  46. data/lib/sass/value/null.rb +48 -0
  47. data/lib/sass/value/number/unit.rb +186 -0
  48. data/lib/sass/value/number.rb +366 -0
  49. data/lib/sass/value/string.rb +61 -0
  50. data/lib/sass/value.rb +136 -0
  51. data/lib/sass-embedded.rb +4 -0
  52. metadata +120 -0
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ # Sass's boolean type.
6
+ #
7
+ # @see https://sass-lang.com/documentation/js-api/classes/sassboolean/
8
+ class Boolean
9
+ include Value
10
+
11
+ # @param value [::Boolean]
12
+ def initialize(value)
13
+ @value = value
14
+ end
15
+
16
+ # @return [::Boolean]
17
+ attr_reader :value
18
+
19
+ # @return [Boolean]
20
+ def !
21
+ value ? Boolean::FALSE : Boolean::TRUE
22
+ end
23
+
24
+ # @return [::Boolean]
25
+ def ==(other)
26
+ other.is_a?(Sass::Value::Boolean) && other.value == value
27
+ end
28
+
29
+ # @return [Integer]
30
+ def hash
31
+ @hash ||= value.hash
32
+ end
33
+
34
+ alias to_bool value
35
+
36
+ # @return [Boolean]
37
+ def assert_boolean(_name = nil)
38
+ self
39
+ end
40
+
41
+ # Sass's true value.
42
+ TRUE = Boolean.new(true)
43
+
44
+ # Sass's false value.
45
+ FALSE = Boolean.new(false)
46
+
47
+ def self.new(value)
48
+ value ? Boolean::TRUE : Boolean::FALSE
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,90 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ # Sass's calculation type.
6
+ #
7
+ # @see https://sass-lang.com/documentation/js-api/classes/sasscalculation/
8
+ class Calculation
9
+ include Value
10
+ include CalculationValue
11
+
12
+ class << self
13
+ private :new
14
+
15
+ # @param argument [CalculationValue]
16
+ # @return [Calculation]
17
+ def calc(argument)
18
+ new('calc', [argument])
19
+ end
20
+
21
+ # @param arguments [Array<CalculationValue>]
22
+ # @return [Calculation]
23
+ def min(arguments)
24
+ new('min', arguments)
25
+ end
26
+
27
+ # @param arguments [Array<CalculationValue>]
28
+ # @return [Calculation]
29
+ def max(arguments)
30
+ new('max', arguments)
31
+ end
32
+
33
+ # @param min [CalculationValue]
34
+ # @param value [CalculationValue]
35
+ # @param max [CalculationValue]
36
+ # @return [Calculation]
37
+ def clamp(min, value = nil, max = nil)
38
+ if (value.nil? && !valid_clamp_arg?(min)) ||
39
+ (max.nil? && [min, value].none? { |x| x && valid_clamp_arg?(x) })
40
+ raise Sass::ScriptError, 'Argument must be an unquoted SassString.'
41
+ end
42
+
43
+ new('clamp', [min, value, max].compact)
44
+ end
45
+
46
+ private
47
+
48
+ def valid_clamp_arg?(value)
49
+ value.is_a?(Sass::Value::String) && !value.quoted?
50
+ end
51
+ end
52
+
53
+ private
54
+
55
+ def initialize(name, arguments)
56
+ arguments.each do |value|
57
+ assert_calculation_value(value)
58
+ end
59
+
60
+ @name = name.freeze
61
+ @arguments = arguments.freeze
62
+ end
63
+
64
+ public
65
+
66
+ # @return [::String]
67
+ attr_reader :name
68
+
69
+ # @return [Array<CalculationValue>]
70
+ attr_reader :arguments
71
+
72
+ # @return [Calculation]
73
+ def assert_calculation(_name = nil)
74
+ self
75
+ end
76
+
77
+ # @return [::Boolean]
78
+ def ==(other)
79
+ other.is_a?(Sass::Value::Calculation) &&
80
+ other.name == name &&
81
+ other.arguments == arguments
82
+ end
83
+
84
+ # @return [Integer]
85
+ def hash
86
+ @hash ||= [name, *arguments].hash
87
+ end
88
+ end
89
+ end
90
+ end
@@ -0,0 +1,253 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ # Sass's color type.
6
+ #
7
+ # No matter what representation was originally used to create this color, all of its channels are accessible.
8
+ #
9
+ # @see https://sass-lang.com/documentation/js-api/classes/sasscolor/
10
+ class Color
11
+ include Value
12
+
13
+ # @param red [Numeric]
14
+ # @param green [Numeric]
15
+ # @param blue [Numeric]
16
+ # @param hue [Numeric]
17
+ # @param saturation [Numeric]
18
+ # @param lightness [Numeric]
19
+ # @param whiteness [Numeric]
20
+ # @param blackness [Numeric]
21
+ # @param alpha [Numeric]
22
+ def initialize(red: nil,
23
+ green: nil,
24
+ blue: nil,
25
+ hue: nil,
26
+ saturation: nil,
27
+ lightness: nil,
28
+ whiteness: nil,
29
+ blackness: nil,
30
+ alpha: 1)
31
+ @alpha = alpha.nil? ? 1 : FuzzyMath.assert_between(alpha, 0, 1, 'alpha')
32
+ if red && green && blue
33
+ @red = FuzzyMath.assert_between(FuzzyMath.round(red), 0, 255, 'red')
34
+ @green = FuzzyMath.assert_between(FuzzyMath.round(green), 0, 255, 'green')
35
+ @blue = FuzzyMath.assert_between(FuzzyMath.round(blue), 0, 255, 'blue')
36
+ elsif hue && saturation && lightness
37
+ @hue = hue % 360
38
+ @saturation = FuzzyMath.assert_between(saturation, 0, 100, 'saturation')
39
+ @lightness = FuzzyMath.assert_between(lightness, 0, 100, 'lightness')
40
+ elsif hue && whiteness && blackness
41
+ @hue = hue % 360
42
+ @whiteness = FuzzyMath.assert_between(whiteness, 0, 100, 'whiteness')
43
+ @blackness = FuzzyMath.assert_between(blackness, 0, 100, 'blackness')
44
+ hwb_to_rgb
45
+ @whiteness = @blackness = nil
46
+ else
47
+ raise Sass::ScriptError, 'Invalid Color'
48
+ end
49
+ end
50
+
51
+ # @return [Integer]
52
+ def red
53
+ hsl_to_rgb unless defined?(@red)
54
+
55
+ @red
56
+ end
57
+
58
+ # @return [Integer]
59
+ def green
60
+ hsl_to_rgb unless defined?(@green)
61
+
62
+ @green
63
+ end
64
+
65
+ # @return [Integer]
66
+ def blue
67
+ hsl_to_rgb unless defined?(@blue)
68
+
69
+ @blue
70
+ end
71
+
72
+ # @return [Numeric]
73
+ def hue
74
+ rgb_to_hsl unless defined?(@hue)
75
+
76
+ @hue
77
+ end
78
+
79
+ # @return [Numeric]
80
+ def saturation
81
+ rgb_to_hsl unless defined?(@saturation)
82
+
83
+ @saturation
84
+ end
85
+
86
+ # @return [Numeric]
87
+ def lightness
88
+ rgb_to_hsl unless defined?(@lightness)
89
+
90
+ @lightness
91
+ end
92
+
93
+ # @return [Numeric]
94
+ def whiteness
95
+ @whiteness ||= Rational([red, green, blue].min, 255) * 100
96
+ end
97
+
98
+ # @return [Numeric]
99
+ def blackness
100
+ @blackness ||= 100 - (Rational([red, green, blue].max, 255) * 100)
101
+ end
102
+
103
+ # @return [Numeric]
104
+ attr_reader :alpha
105
+
106
+ # @param red [Numeric]
107
+ # @param green [Numeric]
108
+ # @param blue [Numeric]
109
+ # @param hue [Numeric]
110
+ # @param saturation [Numeric]
111
+ # @param lightness [Numeric]
112
+ # @param whiteness [Numeric]
113
+ # @param blackness [Numeric]
114
+ # @param alpha [Numeric]
115
+ # @return [Color]
116
+ def change(red: nil,
117
+ green: nil,
118
+ blue: nil,
119
+ hue: nil,
120
+ saturation: nil,
121
+ lightness: nil,
122
+ whiteness: nil,
123
+ blackness: nil,
124
+ alpha: nil)
125
+ if whiteness || blackness
126
+ Sass::Value::Color.new(hue: hue || self.hue,
127
+ whiteness: whiteness || self.whiteness,
128
+ blackness: blackness || self.blackness,
129
+ alpha: alpha || self.alpha)
130
+ elsif hue || saturation || lightness
131
+ Sass::Value::Color.new(hue: hue || self.hue,
132
+ saturation: saturation || self.saturation,
133
+ lightness: lightness || self.lightness,
134
+ alpha: alpha || self.alpha)
135
+ elsif red || green || blue
136
+ Sass::Value::Color.new(red: red ? FuzzyMath.round(red) : self.red,
137
+ green: green ? FuzzyMath.round(green) : self.green,
138
+ blue: blue ? FuzzyMath.round(blue) : self.blue,
139
+ alpha: alpha || self.alpha)
140
+ else
141
+ dup.instance_eval do
142
+ @alpha = FuzzyMath.assert_between(alpha, 0, 1, 'alpha')
143
+ self
144
+ end
145
+ end
146
+ end
147
+
148
+ # @return [::Boolean]
149
+ def ==(other)
150
+ other.is_a?(Sass::Value::Color) &&
151
+ other.red == red &&
152
+ other.green == green &&
153
+ other.blue == blue &&
154
+ other.alpha == alpha
155
+ end
156
+
157
+ # @return [Integer]
158
+ def hash
159
+ @hash ||= [red, green, blue, alpha].hash
160
+ end
161
+
162
+ # @return [Color]
163
+ def assert_color(_name = nil)
164
+ self
165
+ end
166
+
167
+ private
168
+
169
+ def rgb_to_hsl
170
+ scaled_red = Rational(red, 255)
171
+ scaled_green = Rational(green, 255)
172
+ scaled_blue = Rational(blue, 255)
173
+
174
+ max = [scaled_red, scaled_green, scaled_blue].max
175
+ min = [scaled_red, scaled_green, scaled_blue].min
176
+ delta = max - min
177
+
178
+ if max == min
179
+ @hue = 0
180
+ elsif max == scaled_red
181
+ @hue = ((scaled_green - scaled_blue) * 60 / delta) % 360
182
+ elsif max == scaled_green
183
+ @hue = (((scaled_blue - scaled_red) * 60 / delta) + 120) % 360
184
+ elsif max == scaled_blue
185
+ @hue = (((scaled_red - scaled_green) * 60 / delta) + 240) % 360
186
+ end
187
+
188
+ lightness = @lightness = (max + min) * 50
189
+
190
+ @saturation = if max == min
191
+ 0
192
+ elsif lightness < 50
193
+ delta * 100 / (max + min)
194
+ else
195
+ delta * 100 / (2 - max - min)
196
+ end
197
+ end
198
+
199
+ def hsl_to_rgb
200
+ scaled_hue = Rational(hue, 360)
201
+ scaled_saturation = Rational(saturation, 100)
202
+ scaled_lightness = Rational(lightness, 100)
203
+
204
+ tmp2 = if scaled_lightness <= 0.5
205
+ scaled_lightness * (scaled_saturation + 1)
206
+ else
207
+ scaled_lightness + scaled_saturation - (scaled_lightness * scaled_saturation)
208
+ end
209
+ tmp1 = (scaled_lightness * 2) - tmp2
210
+ @red = FuzzyMath.round(hsl_hue_to_rgb(tmp1, tmp2, scaled_hue + Rational(1, 3)) * 255)
211
+ @green = FuzzyMath.round(hsl_hue_to_rgb(tmp1, tmp2, scaled_hue) * 255)
212
+ @blue = FuzzyMath.round(hsl_hue_to_rgb(tmp1, tmp2, scaled_hue - Rational(1, 3)) * 255)
213
+ end
214
+
215
+ def hsl_hue_to_rgb(tmp1, tmp2, hue)
216
+ hue += 1 if hue.negative?
217
+ hue -= 1 if hue > 1
218
+
219
+ if hue < Rational(1, 6)
220
+ tmp1 + ((tmp2 - tmp1) * hue * 6)
221
+ elsif hue < Rational(1, 2)
222
+ tmp2
223
+ elsif hue < Rational(2, 3)
224
+ tmp1 + ((tmp2 - tmp1) * (Rational(2, 3) - hue) * 6)
225
+ else
226
+ tmp1
227
+ end
228
+ end
229
+
230
+ def hwb_to_rgb
231
+ scaled_hue = Rational(hue, 360)
232
+ scaled_whiteness = Rational(whiteness, 100)
233
+ scaled_blackness = Rational(blackness, 100)
234
+
235
+ sum = scaled_whiteness + scaled_blackness
236
+ if sum > 1
237
+ scaled_whiteness /= sum
238
+ scaled_blackness /= sum
239
+ end
240
+
241
+ factor = 1 - scaled_whiteness - scaled_blackness
242
+ @red = hwb_hue_to_rgb(factor, scaled_whiteness, scaled_hue + Rational(1, 3))
243
+ @green = hwb_hue_to_rgb(factor, scaled_whiteness, scaled_hue)
244
+ @blue = hwb_hue_to_rgb(factor, scaled_whiteness, scaled_hue - Rational(1, 3))
245
+ end
246
+
247
+ def hwb_hue_to_rgb(factor, scaled_whiteness, scaled_hue)
248
+ channel = (hsl_hue_to_rgb(0, 1, scaled_hue) * factor) + scaled_whiteness
249
+ FuzzyMath.round(channel * 255)
250
+ end
251
+ end
252
+ end
253
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ # Sass's function type.
6
+ #
7
+ # @see https://sass-lang.com/documentation/js-api/classes/sassfunction/
8
+ class Function
9
+ include Value
10
+
11
+ # @param signature [::String]
12
+ # @param callback [Proc]
13
+ def initialize(signature, &callback)
14
+ raise Sass::ScriptError, 'no block given' unless signature.nil? || callback
15
+
16
+ @signature = signature.freeze
17
+ @callback = callback.freeze
18
+ end
19
+
20
+ # @return [Integer, nil]
21
+ attr_reader :id
22
+
23
+ protected :id
24
+
25
+ # @return [::String, nil]
26
+ attr_reader :signature
27
+
28
+ # @return [Proc, nil]
29
+ attr_reader :callback
30
+
31
+ # @return [::Boolean]
32
+ def ==(other)
33
+ if id.nil?
34
+ other.equal?(self)
35
+ else
36
+ other.is_a?(Sass::Value::Function) && other.id == id
37
+ end
38
+ end
39
+
40
+ # @return [Integer]
41
+ def hash
42
+ @hash ||= id.nil? ? signature.hash : id.hash
43
+ end
44
+
45
+ # @return [Function]
46
+ def assert_function(_name = nil)
47
+ self
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,80 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ # Sass's {FuzzyMath} module.
6
+ module FuzzyMath
7
+ PRECISION = 10
8
+
9
+ EPSILON = 10.pow(-PRECISION - 1)
10
+
11
+ INVERSE_EPSILON = 1 / EPSILON
12
+
13
+ module_function
14
+
15
+ def equals(number1, number2)
16
+ (number1 - number2).abs < EPSILON
17
+ end
18
+
19
+ def less_than(number1, number2)
20
+ number1 < number2 && !equals(number1, number2)
21
+ end
22
+
23
+ def less_than_or_equals(number1, number2)
24
+ number1 < number2 || equals(number1, number2)
25
+ end
26
+
27
+ def greater_than(number1, number2)
28
+ number1 > number2 && !equals(number1, number2)
29
+ end
30
+
31
+ def greater_than_or_equals(number1, number2)
32
+ number1 > number2 || equals(number1, number2)
33
+ end
34
+
35
+ def integer?(number)
36
+ return false unless number.finite?
37
+ return true if number.integer?
38
+
39
+ equals((number - 0.5).abs % 1, 0.5)
40
+ end
41
+
42
+ def to_i(number)
43
+ integer?(number) ? number.round : nil
44
+ end
45
+
46
+ def round(number)
47
+ if number.positive?
48
+ less_than(number % 1, 0.5) ? number.floor : number.ceil
49
+ else
50
+ less_than_or_equals(number % 1, 0.5) ? number.floor : number.ceil
51
+ end
52
+ end
53
+
54
+ def between(number, min, max)
55
+ return min if equals(number, min)
56
+ return max if equals(number, max)
57
+ return number if number > min && number < max
58
+
59
+ nil
60
+ end
61
+
62
+ def assert_between(number, min, max, name)
63
+ result = between(number, min, max)
64
+ return result unless result.nil?
65
+
66
+ raise Sass::ScriptError.new("#{number} must be between #{min} and #{max}.", name)
67
+ end
68
+
69
+ def hash(number)
70
+ if number.finite?
71
+ (number * INVERSE_EPSILON).round.hash
72
+ else
73
+ number.hash
74
+ end
75
+ end
76
+ end
77
+
78
+ private_constant :FuzzyMath
79
+ end
80
+ end
@@ -0,0 +1,79 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ # Sass's list type.
6
+ #
7
+ # @see https://sass-lang.com/documentation/js-api/classes/sasslist/
8
+ class List
9
+ include Value
10
+
11
+ # @param contents [Array<Value>]
12
+ # @param separator [::String]
13
+ # @param bracketed [::Boolean]
14
+ def initialize(contents = [], separator: ',', bracketed: false)
15
+ if separator.nil? && contents.length > 1
16
+ raise Sass::ScriptError, 'A list with more than one element must have an explicit separator'
17
+ end
18
+
19
+ @contents = contents.freeze
20
+ @separator = separator.freeze
21
+ @bracketed = bracketed.freeze
22
+ end
23
+
24
+ # @return [::String, nil]
25
+ attr_reader :separator
26
+
27
+ # @return [::Boolean]
28
+ def bracketed?
29
+ @bracketed
30
+ end
31
+
32
+ # @return [::Boolean]
33
+ def ==(other)
34
+ (other.is_a?(Sass::Value::List) &&
35
+ other.to_a == to_a &&
36
+ other.separator == separator &&
37
+ other.bracketed? == bracketed?) ||
38
+ (to_a.empty? && other.is_a?(Sass::Value::Map) && other.to_a.empty?)
39
+ end
40
+
41
+ # @param index [Numeric]
42
+ # @return [Value]
43
+ def at(index)
44
+ index = index.floor
45
+ index = to_a.length + index if index.negative?
46
+ return nil if index.negative? || index >= to_a.length
47
+
48
+ to_a[index]
49
+ end
50
+
51
+ # @return [Integer]
52
+ def hash
53
+ @hash ||= contents.hash
54
+ end
55
+
56
+ # @return [Array<Value>]
57
+ def to_a
58
+ @contents
59
+ end
60
+
61
+ # @return [Map, nil]
62
+ def to_map
63
+ to_a.empty? ? Sass::Value::Map.new({}) : nil
64
+ end
65
+
66
+ # @return [Map]
67
+ # @raise [ScriptError]
68
+ def assert_map(name = nil)
69
+ to_a.empty? ? Sass::Value::Map.new({}) : super.assert_map(name)
70
+ end
71
+
72
+ private
73
+
74
+ def to_a_length
75
+ to_a.length
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,71 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ # Sass's map type.
6
+ #
7
+ # @see https://sass-lang.com/documentation/js-api/classes/sassmap/
8
+ class Map
9
+ include Value
10
+
11
+ # @param contents [Hash<Value, Value>]
12
+ def initialize(contents = {})
13
+ @contents = contents.freeze
14
+ end
15
+
16
+ # @return [Hash<Value, Value>]
17
+ attr_reader :contents
18
+
19
+ # @return [::String, nil]
20
+ def separator
21
+ contents.empty? ? nil : ','
22
+ end
23
+
24
+ # @return [::Boolean]
25
+ def ==(other)
26
+ (other.is_a?(Sass::Value::Map) && other.contents == contents) ||
27
+ (contents.empty? && other.is_a?(Sass::Value::List) && other.to_a.empty?)
28
+ end
29
+
30
+ # @param index [Numeric, Value]
31
+ # @return [List<(Value, Value)>, Value]
32
+ def at(index)
33
+ if index.is_a?(Numeric)
34
+ index = index.floor
35
+ index = to_a_length + index if index.negative?
36
+ return nil if index.negative? || index >= to_a_length
37
+
38
+ Sass::Value::List.new(contents.to_a[index], separator: ' ')
39
+ else
40
+ contents[index]
41
+ end
42
+ end
43
+
44
+ # @return [Integer]
45
+ def hash
46
+ @hash ||= contents.hash
47
+ end
48
+
49
+ # @return [Array<List<(Value, Value)>>]
50
+ def to_a
51
+ contents.map { |key, value| Sass::Value::List.new([key, value], separator: ' ') }
52
+ end
53
+
54
+ # @return [Map]
55
+ def to_map
56
+ self
57
+ end
58
+
59
+ # @return [Map]
60
+ def assert_map(_name = nil)
61
+ self
62
+ end
63
+
64
+ private
65
+
66
+ def to_a_length
67
+ contents.length
68
+ end
69
+ end
70
+ end
71
+ end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Sass
4
+ module Value
5
+ # Sass's mixin type.
6
+ #
7
+ # @see https://sass-lang.com/documentation/js-api/classes/sassmixin/
8
+ class Mixin
9
+ include Value
10
+
11
+ class << self
12
+ private :new
13
+ end
14
+
15
+ # @return [Integer]
16
+ attr_reader :id
17
+
18
+ protected :id
19
+
20
+ # @return [::Boolean]
21
+ def ==(other)
22
+ other.is_a?(Sass::Value::Mixin) && other.id == id
23
+ end
24
+
25
+ # @return [Integer]
26
+ def hash
27
+ @hash ||= id.hash
28
+ end
29
+
30
+ # @return [Mixin]
31
+ def assert_mixin(_name = nil)
32
+ self
33
+ end
34
+ end
35
+ end
36
+ end