sass-embedded 1.69.7-x86_64-linux-musl → 1.70.0-x86_64-linux-musl

Sign up to get free protection for your applications and to get access to all the features.
@@ -3,83 +3,385 @@
3
3
  module Sass
4
4
  class Compiler
5
5
  class Host
6
- # The {Protofier} module.
6
+ # The {Protofier} class.
7
7
  #
8
8
  # It converts Pure Ruby types and Protobuf Ruby types.
9
- module Protofier
10
- module_function
11
-
12
- def from_proto_canonicalize_context(canonicalize_request)
13
- CanonicalizeContext.new(
14
- canonicalize_request.containing_url == '' ? nil : canonicalize_request.containing_url,
15
- canonicalize_request.from_import
16
- )
9
+ class Protofier
10
+ def initialize(function_registry)
11
+ @function_registry = function_registry
17
12
  end
18
13
 
19
- def from_proto_compile_response(compile_response)
20
- oneof = compile_response.result
21
- result = compile_response.public_send(oneof)
14
+ def to_proto(obj)
15
+ case obj
16
+ when Sass::Value::String
17
+ EmbeddedProtocol::Value.new(
18
+ string: EmbeddedProtocol::Value::String.new(
19
+ text: obj.text.to_str,
20
+ quoted: obj.quoted?
21
+ )
22
+ )
23
+ when Sass::Value::Number
24
+ EmbeddedProtocol::Value.new(
25
+ number: Number.to_proto(obj)
26
+ )
27
+ when Sass::Value::Color
28
+ if obj.instance_eval { !defined?(@hue) }
29
+ EmbeddedProtocol::Value.new(
30
+ rgb_color: EmbeddedProtocol::Value::RgbColor.new(
31
+ red: obj.red,
32
+ green: obj.green,
33
+ blue: obj.blue,
34
+ alpha: obj.alpha.to_f
35
+ )
36
+ )
37
+ elsif obj.instance_eval { !defined?(@saturation) }
38
+ EmbeddedProtocol::Value.new(
39
+ hwb_color: EmbeddedProtocol::Value::HwbColor.new(
40
+ hue: obj.hue.to_f,
41
+ whiteness: obj.whiteness.to_f,
42
+ blackness: obj.blackness.to_f,
43
+ alpha: obj.alpha.to_f
44
+ )
45
+ )
46
+ else
47
+ EmbeddedProtocol::Value.new(
48
+ hsl_color: EmbeddedProtocol::Value::HslColor.new(
49
+ hue: obj.hue.to_f,
50
+ saturation: obj.saturation.to_f,
51
+ lightness: obj.lightness.to_f,
52
+ alpha: obj.alpha.to_f
53
+ )
54
+ )
55
+ end
56
+ when Sass::Value::ArgumentList
57
+ EmbeddedProtocol::Value.new(
58
+ argument_list: EmbeddedProtocol::Value::ArgumentList.new(
59
+ id: obj.instance_eval { @id },
60
+ contents: obj.to_a.map { |element| to_proto(element) },
61
+ keywords: obj.keywords.to_h { |key, value| [key.to_s, to_proto(value)] },
62
+ separator: ListSeparator.to_proto(obj.separator)
63
+ )
64
+ )
65
+ when Sass::Value::List
66
+ EmbeddedProtocol::Value.new(
67
+ list: EmbeddedProtocol::Value::List.new(
68
+ contents: obj.to_a.map { |element| to_proto(element) },
69
+ separator: ListSeparator.to_proto(obj.separator),
70
+ has_brackets: obj.bracketed?
71
+ )
72
+ )
73
+ when Sass::Value::Map
74
+ EmbeddedProtocol::Value.new(
75
+ map: EmbeddedProtocol::Value::Map.new(
76
+ entries: obj.contents.map do |key, value|
77
+ EmbeddedProtocol::Value::Map::Entry.new(
78
+ key: to_proto(key),
79
+ value: to_proto(value)
80
+ )
81
+ end
82
+ )
83
+ )
84
+ when Sass::Value::Function
85
+ if obj.instance_eval { @id }
86
+ EmbeddedProtocol::Value.new(
87
+ compiler_function: EmbeddedProtocol::Value::CompilerFunction.new(
88
+ id: obj.instance_eval { @id }
89
+ )
90
+ )
91
+ else
92
+ EmbeddedProtocol::Value.new(
93
+ host_function: EmbeddedProtocol::Value::HostFunction.new(
94
+ id: @function_registry.register(obj.callback),
95
+ signature: obj.signature
96
+ )
97
+ )
98
+ end
99
+ when Sass::Value::Mixin
100
+ EmbeddedProtocol::Value.new(
101
+ compiler_mixin: EmbeddedProtocol::Value::CompilerMixin.new(
102
+ id: obj.instance_eval { @id }
103
+ )
104
+ )
105
+ when Sass::Value::Calculation
106
+ EmbeddedProtocol::Value.new(
107
+ calculation: Calculation.to_proto(obj)
108
+ )
109
+ when Sass::Value::Boolean
110
+ EmbeddedProtocol::Value.new(
111
+ singleton: obj.value ? :TRUE : :FALSE
112
+ )
113
+ when Sass::Value::Null
114
+ EmbeddedProtocol::Value.new(
115
+ singleton: :NULL
116
+ )
117
+ else
118
+ raise Sass::ScriptError, "Unknown Sass::Value #{obj}"
119
+ end
120
+ end
121
+
122
+ def from_proto(proto)
123
+ oneof = proto.value
124
+ obj = proto.public_send(oneof)
22
125
  case oneof
23
- when :failure
24
- raise CompileError.new(
25
- result.message,
26
- result.formatted == '' ? nil : result.formatted,
27
- result.stack_trace == '' ? nil : result.stack_trace,
28
- from_proto_source_span(result.span),
29
- compile_response.loaded_urls
30
- )
31
- when :success
32
- CompileResult.new(
33
- result.css,
34
- result.source_map == '' ? nil : result.source_map,
35
- compile_response.loaded_urls
126
+ when :string
127
+ Sass::Value::String.new(
128
+ obj.text,
129
+ quoted: obj.quoted
130
+ )
131
+ when :number
132
+ Number.from_proto(obj)
133
+ when :rgb_color
134
+ Sass::Value::Color.new(
135
+ red: obj.red,
136
+ green: obj.green,
137
+ blue: obj.blue,
138
+ alpha: obj.alpha
139
+ )
140
+ when :hsl_color
141
+ Sass::Value::Color.new(
142
+ hue: obj.hue,
143
+ saturation: obj.saturation,
144
+ lightness: obj.lightness,
145
+ alpha: obj.alpha
146
+ )
147
+ when :hwb_color
148
+ Sass::Value::Color.new(
149
+ hue: obj.hue,
150
+ whiteness: obj.whiteness,
151
+ blackness: obj.blackness,
152
+ alpha: obj.alpha
153
+ )
154
+ when :argument_list
155
+ Sass::Value::ArgumentList.new(
156
+ obj.contents.map do |element|
157
+ from_proto(element)
158
+ end,
159
+ obj.keywords.entries.to_h do |key, value|
160
+ [key.to_sym, from_proto(value)]
161
+ end,
162
+ ListSeparator.from_proto(obj.separator)
163
+ ).instance_eval do
164
+ @id = obj.id
165
+ self
166
+ end
167
+ when :list
168
+ Sass::Value::List.new(
169
+ obj.contents.map do |element|
170
+ from_proto(element)
171
+ end,
172
+ separator: ListSeparator.from_proto(obj.separator),
173
+ bracketed: obj.has_brackets
174
+ )
175
+ when :map
176
+ Sass::Value::Map.new(
177
+ obj.entries.to_h do |entry|
178
+ [from_proto(entry.key), from_proto(entry.value)]
179
+ end
36
180
  )
181
+ when :compiler_function
182
+ Sass::Value::Function.new(nil).instance_eval do
183
+ @id = obj.id
184
+ self
185
+ end
186
+ when :host_function
187
+ raise Sass::ScriptError, 'The compiler may not send Value.host_function to host'
188
+ when :compiler_mixin
189
+ Sass::Value::Mixin.send(:new).instance_eval do
190
+ @id = obj.id
191
+ self
192
+ end
193
+ when :calculation
194
+ Calculation.from_proto(obj)
195
+ when :singleton
196
+ case obj
197
+ when :TRUE
198
+ Sass::Value::Boolean::TRUE
199
+ when :FALSE
200
+ Sass::Value::Boolean::FALSE
201
+ when :NULL
202
+ Sass::Value::Null::NULL
203
+ else
204
+ raise Sass::ScriptError, "Unknown Value.singleton #{obj}"
205
+ end
37
206
  else
38
- raise ArgumentError, "Unknown CompileResponse.result #{result}"
207
+ raise Sass::ScriptError, "Unknown Value.value #{obj}"
39
208
  end
40
209
  end
41
210
 
42
- def from_proto_source_span(source_span)
43
- return if source_span.nil?
211
+ # The {Number} Protofier.
212
+ module Number
213
+ module_function
44
214
 
45
- Logger::SourceSpan.new(from_proto_source_location(source_span.start),
46
- from_proto_source_location(source_span.end),
47
- source_span.text,
48
- source_span.url == '' ? nil : source_span.url,
49
- source_span.context == '' ? nil : source_span.context)
215
+ def to_proto(obj)
216
+ EmbeddedProtocol::Value::Number.new(
217
+ value: obj.value.to_f,
218
+ numerators: obj.numerator_units,
219
+ denominators: obj.denominator_units
220
+ )
221
+ end
222
+
223
+ def from_proto(obj)
224
+ Sass::Value::Number.new(
225
+ obj.value, {
226
+ numerator_units: obj.numerators.to_a,
227
+ denominator_units: obj.denominators.to_a
228
+ }
229
+ )
230
+ end
50
231
  end
51
232
 
52
- def from_proto_source_location(source_location)
53
- return if source_location.nil?
233
+ private_constant :Number
234
+
235
+ # The {Calculation} Protofier.
236
+ module Calculation
237
+ module_function
54
238
 
55
- Logger::SourceLocation.new(source_location.offset,
56
- source_location.line,
57
- source_location.column)
239
+ def to_proto(obj)
240
+ EmbeddedProtocol::Value::Calculation.new(
241
+ name: obj.name,
242
+ arguments: obj.arguments.map { |argument| CalculationValue.to_proto(argument) }
243
+ )
244
+ end
245
+
246
+ def from_proto(obj)
247
+ Sass::Value::Calculation.send(
248
+ :new,
249
+ obj.name,
250
+ obj.arguments.map { |argument| CalculationValue.from_proto(argument) }
251
+ )
252
+ end
58
253
  end
59
254
 
60
- def to_proto_syntax(syntax)
61
- case syntax&.to_sym
62
- when :scss
63
- EmbeddedProtocol::Syntax::SCSS
64
- when :indented
65
- EmbeddedProtocol::Syntax::INDENTED
66
- when :css
67
- EmbeddedProtocol::Syntax::CSS
68
- else
69
- raise ArgumentError, 'syntax must be one of :scss, :indented, :css'
255
+ private_constant :Calculation
256
+
257
+ # The {CalculationValue} Protofier.
258
+ module CalculationValue
259
+ module_function
260
+
261
+ def to_proto(value)
262
+ case value
263
+ when Sass::Value::Number
264
+ EmbeddedProtocol::Value::Calculation::CalculationValue.new(
265
+ number: Number.to_proto(value)
266
+ )
267
+ when Sass::Value::Calculation
268
+ EmbeddedProtocol::Value::Calculation::CalculationValue.new(
269
+ calculation: Calculation.to_proto(value)
270
+ )
271
+ when Sass::Value::String
272
+ EmbeddedProtocol::Value::Calculation::CalculationValue.new(
273
+ string: value.text
274
+ )
275
+ when Sass::CalculationValue::CalculationOperation
276
+ EmbeddedProtocol::Value::Calculation::CalculationValue.new(
277
+ operation: EmbeddedProtocol::Value::Calculation::CalculationOperation.new(
278
+ operator: CalculationOperator.to_proto(value.operator),
279
+ left: to_proto(value.left),
280
+ right: to_proto(value.right)
281
+ )
282
+ )
283
+ else
284
+ raise Sass::ScriptError, "Unknown CalculationValue #{value}"
285
+ end
286
+ end
287
+
288
+ def from_proto(value)
289
+ oneof = value.value
290
+ obj = value.public_send(oneof)
291
+ case oneof
292
+ when :number
293
+ Number.from_proto(obj)
294
+ when :calculation
295
+ Calculation.from_proto(obj)
296
+ when :string
297
+ Sass::Value::String.new(obj, quoted: false)
298
+ when :operation
299
+ Sass::CalculationValue::CalculationOperation.new(
300
+ CalculationOperator.from_proto(obj.operator),
301
+ from_proto(obj.left),
302
+ from_proto(obj.right)
303
+ )
304
+ else
305
+ raise Sass::ScriptError, "Unknown CalculationValue #{value}"
306
+ end
70
307
  end
71
308
  end
72
309
 
73
- def to_proto_output_style(style)
74
- case style&.to_sym
75
- when :expanded
76
- EmbeddedProtocol::OutputStyle::EXPANDED
77
- when :compressed
78
- EmbeddedProtocol::OutputStyle::COMPRESSED
79
- else
80
- raise ArgumentError, 'style must be one of :expanded, :compressed'
310
+ private_constant :CalculationValue
311
+
312
+ # The {CalculationOperator} Protofier.
313
+ module CalculationOperator
314
+ module_function
315
+
316
+ def to_proto(operator)
317
+ case operator
318
+ when '+'
319
+ :PLUS
320
+ when '-'
321
+ :MINUS
322
+ when '*'
323
+ :TIMES
324
+ when '/'
325
+ :DIVIDE
326
+ else
327
+ raise Sass::ScriptError, "Unknown CalculationOperator #{separator}"
328
+ end
329
+ end
330
+
331
+ def from_proto(operator)
332
+ case operator
333
+ when :PLUS
334
+ '+'
335
+ when :MINUS
336
+ '-'
337
+ when :TIMES
338
+ '*'
339
+ when :DIVIDE
340
+ '/'
341
+ else
342
+ raise Sass::ScriptError, "Unknown CalculationOperator #{separator}"
343
+ end
81
344
  end
82
345
  end
346
+
347
+ private_constant :CalculationOperator
348
+
349
+ # The {ListSeparator} Protofier.
350
+ module ListSeparator
351
+ module_function
352
+
353
+ def to_proto(separator)
354
+ case separator
355
+ when ','
356
+ :COMMA
357
+ when ' '
358
+ :SPACE
359
+ when '/'
360
+ :SLASH
361
+ when nil
362
+ :UNDECIDED
363
+ else
364
+ raise Sass::ScriptError, "Unknown ListSeparator #{separator}"
365
+ end
366
+ end
367
+
368
+ def from_proto(separator)
369
+ case separator
370
+ when :COMMA
371
+ ','
372
+ when :SPACE
373
+ ' '
374
+ when :SLASH
375
+ '/'
376
+ when :UNDECIDED
377
+ nil
378
+ else
379
+ raise Sass::ScriptError, "Unknown ListSeparator #{separator}"
380
+ end
381
+ end
382
+ end
383
+
384
+ private_constant :ListSeparator
83
385
  end
84
386
 
85
387
  private_constant :Protofier
@@ -5,7 +5,6 @@ require_relative 'host/importer_registry'
5
5
  require_relative 'host/logger_registry'
6
6
  require_relative 'host/protofier'
7
7
  require_relative 'host/structifier'
8
- require_relative 'host/value_protofier'
9
8
 
10
9
  module Sass
11
10
  class Compiler
@@ -46,12 +45,19 @@ module Sass
46
45
  EmbeddedProtocol::InboundMessage::CompileRequest::StringInput.new(
47
46
  source: source.to_str,
48
47
  url: url&.to_s,
49
- syntax: Protofier.to_proto_syntax(syntax),
48
+ syntax: @importer_registry.syntax_to_proto(syntax),
50
49
  importer: (@importer_registry.register(importer) unless importer.nil?)
51
50
  )
52
51
  end,
53
52
  path: (File.absolute_path(path) unless path.nil?),
54
- style: Protofier.to_proto_output_style(style),
53
+ style: case style&.to_sym
54
+ when :expanded
55
+ EmbeddedProtocol::OutputStyle::EXPANDED
56
+ when :compressed
57
+ EmbeddedProtocol::OutputStyle::COMPRESSED
58
+ else
59
+ raise ArgumentError, 'style must be one of :expanded, :compressed'
60
+ end,
55
61
  charset:,
56
62
  source_map:,
57
63
  source_map_include_sources:,
@@ -60,11 +66,31 @@ module Sass
60
66
  alert_ascii:,
61
67
  alert_color:,
62
68
  quiet_deps:,
69
+ silent: logger == Logger.silent,
63
70
  verbose:
64
71
  ))
65
72
  end
66
73
 
67
- Protofier.from_proto_compile_response(compile_response)
74
+ oneof = compile_response.result
75
+ result = compile_response.public_send(oneof)
76
+ case oneof
77
+ when :failure
78
+ raise CompileError.new(
79
+ result.message,
80
+ result.formatted == '' ? nil : result.formatted,
81
+ result.stack_trace == '' ? nil : result.stack_trace,
82
+ result.span.nil? ? nil : Logger::SourceSpan.new(result.span),
83
+ compile_response.loaded_urls
84
+ )
85
+ when :success
86
+ CompileResult.new(
87
+ result.css,
88
+ result.source_map == '' ? nil : result.source_map,
89
+ compile_response.loaded_urls
90
+ )
91
+ else
92
+ raise ArgumentError, "Unknown CompileResponse.result #{result}"
93
+ end
68
94
  end
69
95
 
70
96
  def version_request
@@ -74,14 +100,18 @@ module Sass
74
100
  ))
75
101
  end
76
102
 
77
- lang = case version_response.implementation_name
78
- when /\bdart\b/i
79
- '[Dart]'
80
- else
81
- '[?]'
82
- end
103
+ info = [
104
+ version_response.implementation_name,
105
+ version_response.implementation_version,
106
+ '(Sass Compiler)'
107
+ ]
108
+
109
+ case version_response.implementation_name
110
+ when 'dart-sass'
111
+ info << '[Dart]'
112
+ end
83
113
 
84
- "#{version_response.implementation_name}\t#{version_response.implementation_version}\t(Sass Compiler)\t#{lang}"
114
+ info
85
115
  end
86
116
 
87
117
  def compile_response(message)
data/lib/sass/compiler.rb CHANGED
@@ -7,6 +7,7 @@ require_relative 'compiler/dispatcher'
7
7
  require_relative 'compiler/dispatcher_manager'
8
8
  require_relative 'compiler/host'
9
9
  require_relative 'compiler/varint'
10
+ require_relative 'embedded/version'
10
11
  require_relative 'embedded_protocol'
11
12
  require_relative 'exception'
12
13
  require_relative 'fork_tracker'
@@ -174,10 +175,10 @@ module Sass
174
175
  # @return [String] Information about the Sass implementation.
175
176
  # @see https://sass-lang.com/documentation/js-api/variables/info/
176
177
  def info
177
- @info ||= <<~INFO.freeze
178
- sass-embedded\t#{Embedded::VERSION}\t(Embedded Host)\t[Ruby]
179
- #{Host.new(@dispatcher).version_request}
180
- INFO
178
+ @info ||= [
179
+ ['sass-embedded', Embedded::VERSION, '(Embedded Host)', '[Ruby]'].join("\t"),
180
+ Host.new(@dispatcher).version_request.join("\t")
181
+ ].join("\n").freeze
181
182
  end
182
183
 
183
184
  def close
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Sass
4
4
  module Embedded
5
- VERSION = '1.69.7'
5
+ VERSION = '1.70.0'
6
6
  end
7
7
  end
data/lib/sass/embedded.rb CHANGED
@@ -1,7 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative 'compiler'
4
- require_relative 'embedded/version'
5
4
 
6
5
  # The Sass module.
7
6
  #
@@ -28,7 +28,7 @@ module Sass
28
28
 
29
29
  highlight = Exception.respond_to?(:to_tty?) && Exception.to_tty? if highlight.nil?
30
30
  if highlight
31
- +@full_message
31
+ @full_message.dup
32
32
  else
33
33
  @full_message.gsub(/\e\[[0-9;]*m/, '')
34
34
  end
@@ -38,7 +38,7 @@ module Sass
38
38
  def to_css
39
39
  content = full_message(highlight: false, order: :top)
40
40
 
41
- <<~CSS
41
+ <<~CSS.freeze
42
42
  /* #{content.gsub('*/', "*\u2060/").gsub("\r\n", "\n").split("\n").join("\n * ")} */
43
43
 
44
44
  body::before {
@@ -50,7 +50,11 @@ module Sass
50
50
  border-bottom-style: solid;
51
51
  font-family: monospace, monospace;
52
52
  white-space: pre;
53
- content: #{Serializer.serialize_quoted_string(content, ascii_only: true)};
53
+ content: #{Serializer.serialize_quoted_string(content).gsub(/[^[:ascii:]][\h\t ]?/) do |match|
54
+ replacement = "\\#{match.ord.to_s(16)}"
55
+ replacement << " #{match[1]}" if match.length > 1
56
+ replacement
57
+ end};
54
58
  }
55
59
  CSS
56
60
  end
@@ -12,10 +12,10 @@ module Sass
12
12
  attr_reader :offset, :line, :column
13
13
 
14
14
  # @!visibility private
15
- def initialize(offset, line, column)
16
- @offset = offset
17
- @line = line
18
- @column = column
15
+ def initialize(source_location)
16
+ @offset = source_location.offset
17
+ @line = source_location.line
18
+ @column = source_location.column
19
19
  end
20
20
  end
21
21
  end
@@ -16,12 +16,12 @@ module Sass
16
16
  attr_reader :url, :context
17
17
 
18
18
  # @!visibility private
19
- def initialize(start, end_, text, url, context)
20
- @start = start
21
- @end = end_
22
- @text = text
23
- @url = url
24
- @context = context
19
+ def initialize(source_span)
20
+ @start = source_span.start.nil? ? nil : Logger::SourceLocation.new(source_span.start)
21
+ @end = source_span.end.nil? ? nil : Logger::SourceLocation.new(source_span.end)
22
+ @text = source_span.text
23
+ @url = source_span.url == '' ? nil : source_span.url
24
+ @context = source_span.context == '' ? nil : source_span.context
25
25
  end
26
26
  end
27
27
  end