sass-embedded 1.58.3-x86-linux-android
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 +7 -0
- data/LICENSE +20 -0
- data/README.md +42 -0
- data/ext/sass/embedded.rb +12 -0
- data/ext/sass/embedded_sass_pb.rb +349 -0
- data/ext/sass/sass_embedded/dart-sass-embedded +20 -0
- data/ext/sass/sass_embedded/src/LICENSE +1434 -0
- data/ext/sass/sass_embedded/src/dart +0 -0
- data/ext/sass/sass_embedded/src/dart-sass-embedded.snapshot +0 -0
- data/lib/sass/compile_error.rb +28 -0
- data/lib/sass/compile_result.rb +23 -0
- data/lib/sass/embedded/async.rb +58 -0
- data/lib/sass/embedded/channel.rb +61 -0
- data/lib/sass/embedded/compiler.rb +60 -0
- data/lib/sass/embedded/dispatcher.rb +98 -0
- data/lib/sass/embedded/host/function_registry.rb +89 -0
- data/lib/sass/embedded/host/importer_registry.rb +104 -0
- data/lib/sass/embedded/host/logger_registry.rb +50 -0
- data/lib/sass/embedded/host/value_protofier.rb +241 -0
- data/lib/sass/embedded/host.rb +141 -0
- data/lib/sass/embedded/protofier.rb +78 -0
- data/lib/sass/embedded/structifier.rb +39 -0
- data/lib/sass/embedded/varint.rb +35 -0
- data/lib/sass/embedded/version.rb +7 -0
- data/lib/sass/embedded.rb +251 -0
- data/lib/sass/logger/silent.rb +26 -0
- data/lib/sass/logger/source_location.rb +21 -0
- data/lib/sass/logger/source_span.rb +27 -0
- data/lib/sass/script_error.rb +10 -0
- data/lib/sass/value/argument_list.rb +37 -0
- data/lib/sass/value/boolean.rb +52 -0
- data/lib/sass/value/color.rb +253 -0
- data/lib/sass/value/function.rb +54 -0
- data/lib/sass/value/fuzzy_math.rb +80 -0
- data/lib/sass/value/list.rb +79 -0
- data/lib/sass/value/map.rb +71 -0
- data/lib/sass/value/null.rb +48 -0
- data/lib/sass/value/number/unit.rb +186 -0
- data/lib/sass/value/number.rb +365 -0
- data/lib/sass/value/string.rb +55 -0
- data/lib/sass/value.rb +128 -0
- data/lib/sass-embedded.rb +4 -0
- metadata +186 -0
@@ -0,0 +1,241 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
class Embedded
|
5
|
+
class Host
|
6
|
+
# The {ValueProtofier} class.
|
7
|
+
#
|
8
|
+
# It converts Pure Ruby types and Protobuf Ruby types.
|
9
|
+
class ValueProtofier
|
10
|
+
def initialize(function_registry)
|
11
|
+
@function_registry = function_registry
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_proto(obj)
|
15
|
+
case obj
|
16
|
+
when Sass::Value::String
|
17
|
+
Sass::EmbeddedProtocol::Value.new(
|
18
|
+
string: Sass::EmbeddedProtocol::Value::String.new(
|
19
|
+
text: obj.text,
|
20
|
+
quoted: obj.quoted?
|
21
|
+
)
|
22
|
+
)
|
23
|
+
when Sass::Value::Number
|
24
|
+
Sass::EmbeddedProtocol::Value.new(
|
25
|
+
number: Sass::EmbeddedProtocol::Value::Number.new(
|
26
|
+
value: obj.value.to_f,
|
27
|
+
numerators: obj.numerator_units,
|
28
|
+
denominators: obj.denominator_units
|
29
|
+
)
|
30
|
+
)
|
31
|
+
when Sass::Value::Color
|
32
|
+
if obj.instance_eval { !defined?(@hue) }
|
33
|
+
Sass::EmbeddedProtocol::Value.new(
|
34
|
+
rgb_color: Sass::EmbeddedProtocol::Value::RgbColor.new(
|
35
|
+
red: obj.red,
|
36
|
+
green: obj.green,
|
37
|
+
blue: obj.blue,
|
38
|
+
alpha: obj.alpha.to_f
|
39
|
+
)
|
40
|
+
)
|
41
|
+
elsif obj.instance_eval { !defined?(@saturation) }
|
42
|
+
Sass::EmbeddedProtocol::Value.new(
|
43
|
+
hwb_color: Sass::EmbeddedProtocol::Value::HwbColor.new(
|
44
|
+
hue: obj.hue.to_f,
|
45
|
+
whiteness: obj.whiteness.to_f,
|
46
|
+
blackness: obj.blackness.to_f,
|
47
|
+
alpha: obj.alpha.to_f
|
48
|
+
)
|
49
|
+
)
|
50
|
+
else
|
51
|
+
Sass::EmbeddedProtocol::Value.new(
|
52
|
+
hsl_color: Sass::EmbeddedProtocol::Value::HslColor.new(
|
53
|
+
hue: obj.hue.to_f,
|
54
|
+
saturation: obj.saturation.to_f,
|
55
|
+
lightness: obj.lightness.to_f,
|
56
|
+
alpha: obj.alpha.to_f
|
57
|
+
)
|
58
|
+
)
|
59
|
+
end
|
60
|
+
when Sass::Value::ArgumentList
|
61
|
+
Sass::EmbeddedProtocol::Value.new(
|
62
|
+
argument_list: Sass::EmbeddedProtocol::Value::ArgumentList.new(
|
63
|
+
id: obj.instance_eval { @id },
|
64
|
+
contents: obj.contents.map { |element| to_proto(element) },
|
65
|
+
keywords: obj.keywords.transform_values { |value| to_proto(value) },
|
66
|
+
separator: ListSeparator.to_proto(obj.separator)
|
67
|
+
)
|
68
|
+
)
|
69
|
+
when Sass::Value::List
|
70
|
+
Sass::EmbeddedProtocol::Value.new(
|
71
|
+
list: Sass::EmbeddedProtocol::Value::List.new(
|
72
|
+
contents: obj.contents.map { |element| to_proto(element) },
|
73
|
+
separator: ListSeparator.to_proto(obj.separator),
|
74
|
+
has_brackets: obj.bracketed?
|
75
|
+
)
|
76
|
+
)
|
77
|
+
when Sass::Value::Map
|
78
|
+
Sass::EmbeddedProtocol::Value.new(
|
79
|
+
map: Sass::EmbeddedProtocol::Value::Map.new(
|
80
|
+
entries: obj.contents.map do |key, value|
|
81
|
+
Sass::EmbeddedProtocol::Value::Map::Entry.new(
|
82
|
+
key: to_proto(key),
|
83
|
+
value: to_proto(value)
|
84
|
+
)
|
85
|
+
end
|
86
|
+
)
|
87
|
+
)
|
88
|
+
when Sass::Value::Function
|
89
|
+
if obj.id
|
90
|
+
Sass::EmbeddedProtocol::Value.new(
|
91
|
+
compiler_function: Sass::EmbeddedProtocol::Value::CompilerFunction.new(
|
92
|
+
id: obj.id
|
93
|
+
)
|
94
|
+
)
|
95
|
+
else
|
96
|
+
Sass::EmbeddedProtocol::Value.new(
|
97
|
+
host_function: Sass::EmbeddedProtocol::Value::HostFunction.new(
|
98
|
+
id: @function_registry.register(obj.callback),
|
99
|
+
signature: obj.signature
|
100
|
+
)
|
101
|
+
)
|
102
|
+
end
|
103
|
+
when Sass::Value::Boolean
|
104
|
+
Sass::EmbeddedProtocol::Value.new(
|
105
|
+
singleton: obj.value ? :TRUE : :FALSE
|
106
|
+
)
|
107
|
+
when Sass::Value::Null
|
108
|
+
Sass::EmbeddedProtocol::Value.new(
|
109
|
+
singleton: :NULL
|
110
|
+
)
|
111
|
+
else
|
112
|
+
raise Sass::ScriptError, "Unknown Sass::Value #{obj}"
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
def from_proto(proto)
|
117
|
+
oneof = proto.value
|
118
|
+
obj = proto.public_send(oneof)
|
119
|
+
case oneof
|
120
|
+
when :string
|
121
|
+
Sass::Value::String.new(
|
122
|
+
obj.text,
|
123
|
+
quoted: obj.quoted
|
124
|
+
)
|
125
|
+
when :number
|
126
|
+
Sass::Value::Number.new(
|
127
|
+
obj.value, {
|
128
|
+
numerator_units: obj.numerators.to_a,
|
129
|
+
denominator_units: obj.denominators.to_a
|
130
|
+
}
|
131
|
+
)
|
132
|
+
when :rgb_color
|
133
|
+
Sass::Value::Color.new(
|
134
|
+
red: obj.red,
|
135
|
+
green: obj.green,
|
136
|
+
blue: obj.blue,
|
137
|
+
alpha: obj.alpha
|
138
|
+
)
|
139
|
+
when :hsl_color
|
140
|
+
Sass::Value::Color.new(
|
141
|
+
hue: obj.hue,
|
142
|
+
saturation: obj.saturation,
|
143
|
+
lightness: obj.lightness,
|
144
|
+
alpha: obj.alpha
|
145
|
+
)
|
146
|
+
when :hwb_color
|
147
|
+
Sass::Value::Color.new(
|
148
|
+
hue: obj.hue,
|
149
|
+
whiteness: obj.whiteness,
|
150
|
+
blackness: obj.blackness,
|
151
|
+
alpha: obj.alpha
|
152
|
+
)
|
153
|
+
when :argument_list
|
154
|
+
Sass::Value::ArgumentList.new(
|
155
|
+
obj.contents.map do |element|
|
156
|
+
from_proto(element)
|
157
|
+
end,
|
158
|
+
obj.keywords.entries.to_h.transform_values! do |value|
|
159
|
+
from_proto(value)
|
160
|
+
end,
|
161
|
+
ListSeparator.from_proto(obj.separator)
|
162
|
+
).instance_eval do
|
163
|
+
@id = obj.id
|
164
|
+
self
|
165
|
+
end
|
166
|
+
when :list
|
167
|
+
Sass::Value::List.new(
|
168
|
+
obj.contents.map do |element|
|
169
|
+
from_proto(element)
|
170
|
+
end,
|
171
|
+
separator: ListSeparator.from_proto(obj.separator),
|
172
|
+
bracketed: obj.has_brackets
|
173
|
+
)
|
174
|
+
when :map
|
175
|
+
Sass::Value::Map.new(
|
176
|
+
obj.entries.to_h do |entry|
|
177
|
+
[from_proto(entry.key), from_proto(entry.value)]
|
178
|
+
end
|
179
|
+
)
|
180
|
+
when :compiler_function
|
181
|
+
Sass::Value::Function.new(obj.id)
|
182
|
+
when :host_function
|
183
|
+
raise Sass::ScriptError, 'The compiler may not send Value.host_function to host'
|
184
|
+
when :singleton
|
185
|
+
case obj
|
186
|
+
when :TRUE
|
187
|
+
Sass::Value::Boolean::TRUE
|
188
|
+
when :FALSE
|
189
|
+
Sass::Value::Boolean::FALSE
|
190
|
+
when :NULL
|
191
|
+
Sass::Value::Null::NULL
|
192
|
+
else
|
193
|
+
raise Sass::ScriptError, "Unknown Value.singleton #{obj}"
|
194
|
+
end
|
195
|
+
else
|
196
|
+
raise Sass::ScriptError, "Unknown Value.value #{obj}"
|
197
|
+
end
|
198
|
+
end
|
199
|
+
|
200
|
+
# The {ListSeparator} Protofier.
|
201
|
+
module ListSeparator
|
202
|
+
module_function
|
203
|
+
|
204
|
+
def to_proto(separator)
|
205
|
+
case separator
|
206
|
+
when ','
|
207
|
+
:COMMA
|
208
|
+
when ' '
|
209
|
+
:SPACE
|
210
|
+
when '/'
|
211
|
+
:SLASH
|
212
|
+
when nil
|
213
|
+
:UNDECIDED
|
214
|
+
else
|
215
|
+
raise Sass::ScriptError, "Unknown ListSeparator #{separator}"
|
216
|
+
end
|
217
|
+
end
|
218
|
+
|
219
|
+
def from_proto(separator)
|
220
|
+
case separator
|
221
|
+
when :COMMA
|
222
|
+
','
|
223
|
+
when :SPACE
|
224
|
+
' '
|
225
|
+
when :SLASH
|
226
|
+
'/'
|
227
|
+
when :UNDECIDED
|
228
|
+
nil
|
229
|
+
else
|
230
|
+
raise Sass::ScriptError, "Unknown ListSeparator #{separator}"
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
private_constant :ListSeparator
|
236
|
+
end
|
237
|
+
|
238
|
+
private_constant :ValueProtofier
|
239
|
+
end
|
240
|
+
end
|
241
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'host/function_registry'
|
4
|
+
require_relative 'host/importer_registry'
|
5
|
+
require_relative 'host/logger_registry'
|
6
|
+
require_relative 'host/value_protofier'
|
7
|
+
|
8
|
+
module Sass
|
9
|
+
class Embedded
|
10
|
+
# The {Host} class.
|
11
|
+
#
|
12
|
+
# It communicates with {Dispatcher} and handles the host logic.
|
13
|
+
class Host
|
14
|
+
def initialize(channel)
|
15
|
+
@channel = channel
|
16
|
+
end
|
17
|
+
|
18
|
+
def compile_request(path:,
|
19
|
+
source:,
|
20
|
+
importer:,
|
21
|
+
load_paths:,
|
22
|
+
syntax:,
|
23
|
+
url:,
|
24
|
+
charset:,
|
25
|
+
source_map:,
|
26
|
+
source_map_include_sources:,
|
27
|
+
style:,
|
28
|
+
functions:,
|
29
|
+
importers:,
|
30
|
+
alert_ascii:,
|
31
|
+
alert_color:,
|
32
|
+
logger:,
|
33
|
+
quiet_deps:,
|
34
|
+
verbose:)
|
35
|
+
compile_response = await do
|
36
|
+
alert_color = $stderr.tty? if alert_color.nil?
|
37
|
+
|
38
|
+
@function_registry = FunctionRegistry.new(functions, alert_color: alert_color)
|
39
|
+
@importer_registry = ImporterRegistry.new(importers, load_paths, alert_color: alert_color)
|
40
|
+
@logger_registry = LoggerRegistry.new(logger)
|
41
|
+
|
42
|
+
send_message(compile_request: EmbeddedProtocol::InboundMessage::CompileRequest.new(
|
43
|
+
id: id,
|
44
|
+
string: unless source.nil?
|
45
|
+
EmbeddedProtocol::InboundMessage::CompileRequest::StringInput.new(
|
46
|
+
source: source,
|
47
|
+
url: url&.to_s,
|
48
|
+
syntax: Protofier.to_proto_syntax(syntax),
|
49
|
+
importer: (@importer_registry.register(importer) unless importer.nil?)
|
50
|
+
)
|
51
|
+
end,
|
52
|
+
path: (File.absolute_path(path) unless path.nil?),
|
53
|
+
style: Protofier.to_proto_output_style(style),
|
54
|
+
charset: charset,
|
55
|
+
source_map: source_map,
|
56
|
+
source_map_include_sources: source_map_include_sources,
|
57
|
+
importers: @importer_registry.importers,
|
58
|
+
global_functions: @function_registry.global_functions,
|
59
|
+
alert_ascii: alert_ascii,
|
60
|
+
alert_color: alert_color,
|
61
|
+
quiet_deps: quiet_deps,
|
62
|
+
verbose: verbose
|
63
|
+
))
|
64
|
+
end
|
65
|
+
|
66
|
+
Protofier.from_proto_compile_response(compile_response)
|
67
|
+
end
|
68
|
+
|
69
|
+
def version_request
|
70
|
+
version_response = await do
|
71
|
+
send_message(version_request: EmbeddedProtocol::InboundMessage::VersionRequest.new(
|
72
|
+
id: id
|
73
|
+
))
|
74
|
+
end
|
75
|
+
|
76
|
+
"sass-embedded\t#{version_response.implementation_version}"
|
77
|
+
end
|
78
|
+
|
79
|
+
def log_event(message)
|
80
|
+
@logger_registry.log(message)
|
81
|
+
end
|
82
|
+
|
83
|
+
def compile_response(message)
|
84
|
+
resolve(message)
|
85
|
+
end
|
86
|
+
|
87
|
+
def version_response(message)
|
88
|
+
resolve(message)
|
89
|
+
end
|
90
|
+
|
91
|
+
def canonicalize_request(message)
|
92
|
+
send_message(canonicalize_response: @importer_registry.canonicalize(message))
|
93
|
+
end
|
94
|
+
|
95
|
+
def import_request(message)
|
96
|
+
send_message(import_response: @importer_registry.import(message))
|
97
|
+
end
|
98
|
+
|
99
|
+
def file_import_request(message)
|
100
|
+
send_message(file_import_response: @importer_registry.file_import(message))
|
101
|
+
end
|
102
|
+
|
103
|
+
def function_call_request(message)
|
104
|
+
send_message(function_call_response: @function_registry.function_call(message))
|
105
|
+
end
|
106
|
+
|
107
|
+
def error(message)
|
108
|
+
reject(CompileError.new(message.message, nil, nil, nil))
|
109
|
+
end
|
110
|
+
|
111
|
+
private
|
112
|
+
|
113
|
+
def await
|
114
|
+
@connection = @channel.connect(self)
|
115
|
+
@async = Async.new
|
116
|
+
yield
|
117
|
+
@async.await
|
118
|
+
ensure
|
119
|
+
@connection&.disconnect
|
120
|
+
end
|
121
|
+
|
122
|
+
def resolve(value)
|
123
|
+
@async.resolve(value)
|
124
|
+
end
|
125
|
+
|
126
|
+
def reject(reason)
|
127
|
+
@async.reject(reason)
|
128
|
+
end
|
129
|
+
|
130
|
+
def id
|
131
|
+
@connection.id
|
132
|
+
end
|
133
|
+
|
134
|
+
def send_message(**kwargs)
|
135
|
+
@connection.send_message(**kwargs)
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
private_constant :Host
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,78 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
class Embedded
|
5
|
+
# The {Protofier} module.
|
6
|
+
#
|
7
|
+
# It converts Pure Ruby types and Protobuf Ruby types.
|
8
|
+
module Protofier
|
9
|
+
module_function
|
10
|
+
|
11
|
+
def from_proto_compile_response(compile_response)
|
12
|
+
oneof = compile_response.result
|
13
|
+
result = compile_response.public_send(oneof)
|
14
|
+
case oneof
|
15
|
+
when :failure
|
16
|
+
raise CompileError.new(
|
17
|
+
result.message,
|
18
|
+
result.formatted,
|
19
|
+
result.stack_trace,
|
20
|
+
from_proto_source_span(result.span)
|
21
|
+
)
|
22
|
+
when :success
|
23
|
+
CompileResult.new(
|
24
|
+
result.css,
|
25
|
+
result.source_map,
|
26
|
+
result.loaded_urls
|
27
|
+
)
|
28
|
+
else
|
29
|
+
raise ArgumentError, "Unknown CompileResponse.result #{result}"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def from_proto_source_span(source_span)
|
34
|
+
return if source_span.nil?
|
35
|
+
|
36
|
+
Logger::SourceSpan.new(from_proto_source_location(source_span.start),
|
37
|
+
from_proto_source_location(source_span.end),
|
38
|
+
source_span.text,
|
39
|
+
source_span.url,
|
40
|
+
source_span.context)
|
41
|
+
end
|
42
|
+
|
43
|
+
def from_proto_source_location(source_location)
|
44
|
+
return if source_location.nil?
|
45
|
+
|
46
|
+
Logger::SourceLocation.new(source_location.offset,
|
47
|
+
source_location.line,
|
48
|
+
source_location.column)
|
49
|
+
end
|
50
|
+
|
51
|
+
def to_proto_syntax(syntax)
|
52
|
+
case syntax&.to_sym
|
53
|
+
when :scss
|
54
|
+
EmbeddedProtocol::Syntax::SCSS
|
55
|
+
when :indented
|
56
|
+
EmbeddedProtocol::Syntax::INDENTED
|
57
|
+
when :css
|
58
|
+
EmbeddedProtocol::Syntax::CSS
|
59
|
+
else
|
60
|
+
raise ArgumentError, 'syntax must be one of :scss, :indented, :css'
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
def to_proto_output_style(style)
|
65
|
+
case style&.to_sym
|
66
|
+
when :expanded
|
67
|
+
EmbeddedProtocol::OutputStyle::EXPANDED
|
68
|
+
when :compressed
|
69
|
+
EmbeddedProtocol::OutputStyle::COMPRESSED
|
70
|
+
else
|
71
|
+
raise ArgumentError, 'style must be one of :expanded, :compressed'
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private_constant :Protofier
|
77
|
+
end
|
78
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
class Embedded
|
5
|
+
# The {Structifier} module.
|
6
|
+
#
|
7
|
+
# It converts {::Hash} to {Struct}-like objects.
|
8
|
+
module Structifier
|
9
|
+
module_function
|
10
|
+
|
11
|
+
def to_struct(obj, *symbols)
|
12
|
+
return obj unless obj.is_a? Hash
|
13
|
+
|
14
|
+
struct = Object.new
|
15
|
+
symbols.each do |key|
|
16
|
+
next unless obj.key?(key)
|
17
|
+
|
18
|
+
value = obj[key]
|
19
|
+
if value.respond_to? :call
|
20
|
+
struct.define_singleton_method key do |*args, **kwargs|
|
21
|
+
if kwargs.empty?
|
22
|
+
value.call(*args)
|
23
|
+
else
|
24
|
+
value.call(*args, **kwargs)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
else
|
28
|
+
struct.define_singleton_method key do
|
29
|
+
value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
struct
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private_constant :Structifier
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Sass
|
4
|
+
class Embedded
|
5
|
+
# The {Varint} module.
|
6
|
+
#
|
7
|
+
# It reads and writes varints.
|
8
|
+
module Varint
|
9
|
+
module_function
|
10
|
+
|
11
|
+
def read(readable)
|
12
|
+
value = bits = 0
|
13
|
+
loop do
|
14
|
+
byte = readable.readbyte
|
15
|
+
value |= (byte & 0x7f) << bits
|
16
|
+
bits += 7
|
17
|
+
break if byte < 0x80
|
18
|
+
end
|
19
|
+
value
|
20
|
+
end
|
21
|
+
|
22
|
+
def write(writeable, value)
|
23
|
+
bytes = []
|
24
|
+
until value < 0x80
|
25
|
+
bytes << ((value & 0x7f) | 0x80)
|
26
|
+
value >>= 7
|
27
|
+
end
|
28
|
+
bytes << value
|
29
|
+
writeable.write bytes.pack('C*')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
private_constant :Varint
|
34
|
+
end
|
35
|
+
end
|