sass-embedded 1.77.5 → 1.78.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.
- checksums.yaml +4 -4
- data/ext/sass/Rakefile +1 -1
- data/ext/sass/package.json +1 -1
- data/lib/sass/compiler/connection.rb +15 -12
- data/lib/sass/compiler.rb +2 -2
- data/lib/sass/elf.rb +103 -157
- data/lib/sass/embedded/version.rb +1 -1
- data/lib/sass/embedded.rb +1 -1
- data/lib/sass/exception.rb +7 -2
- data/lib/sass/value/number.rb +1 -1
- metadata +9 -15
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6140546f1464fb936af0e5d76355e24844d12cb71f29142ca64e1aa5ec1cce56
|
4
|
+
data.tar.gz: 2956e3e5ec0b5860482e4f084159d94a4fc7bb06f67f6ae0820bc04971efd824
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e366ed09f3a7dd7235bb3375b2aa2e0e239bbd66f770ae0432dcaf9e279139957a3aaaf3f76415977d123b37eaace4153eb22bd6709fe8e47be8b4bccf3ebff5
|
7
|
+
data.tar.gz: e6ef849e9d80e3d3f4810c76d4d9c46de4d633d3cf3f1b6e906bae870dd3cae5dc7f21384c24a718dd063e088da69a2ca8198bfda7c03b2f595021ee850248d0
|
data/ext/sass/Rakefile
CHANGED
@@ -138,7 +138,7 @@ module FileUtils
|
|
138
138
|
def fetch(source_uri, dest_path = nil)
|
139
139
|
require 'rubygems/remote_fetcher'
|
140
140
|
|
141
|
-
source_uri = "/#{source_uri}" if
|
141
|
+
source_uri = "/#{source_uri}" if !source_uri.start_with?('/') && File.absolute_path?(source_uri)
|
142
142
|
|
143
143
|
source_uri = begin
|
144
144
|
Gem::Uri.parse!(source_uri)
|
data/ext/sass/package.json
CHANGED
@@ -24,21 +24,24 @@ module Sass
|
|
24
24
|
|
25
25
|
@stdin.binmode
|
26
26
|
|
27
|
-
|
28
|
-
|
27
|
+
# # https://dart.dev/tools/dart-devtools
|
28
|
+
# if 'dart' == File.basename(CLI::COMMAND.first, '.exe') && CLI::COMMAND.include?('--observe')
|
29
|
+
# Kernel.warn(@stdout.readline, uplevel: 0)
|
30
|
+
# Kernel.warn(@stdout.readline, uplevel: 0)
|
31
|
+
# end
|
29
32
|
|
30
|
-
|
31
|
-
Thread.new do
|
32
|
-
Thread.current.name = "sass-embedded-process-stdout-poller-#{@wait_thread.pid}"
|
33
|
+
@stdout.binmode
|
33
34
|
|
34
|
-
|
35
|
-
|
36
|
-
# Kernel.warn(@stdout.readline, uplevel: 0)
|
37
|
-
# Kernel.warn(@stdout.readline, uplevel: 0)
|
38
|
-
# end
|
35
|
+
@wait_thread.name = "sass-embedded-process-waiter-#{id}"
|
36
|
+
end
|
39
37
|
|
40
|
-
|
38
|
+
def id
|
39
|
+
@wait_thread.pid
|
40
|
+
end
|
41
41
|
|
42
|
+
def listen(dispatcher)
|
43
|
+
Thread.new do
|
44
|
+
Thread.current.name = "sass-embedded-process-stdout-poller-#{id}"
|
42
45
|
loop do
|
43
46
|
length = Varint.read(@stdout)
|
44
47
|
id = Varint.read(@stdout)
|
@@ -53,7 +56,7 @@ module Sass
|
|
53
56
|
end
|
54
57
|
|
55
58
|
Thread.new do
|
56
|
-
Thread.current.name = "sass-embedded-process-stderr-poller-#{
|
59
|
+
Thread.current.name = "sass-embedded-process-stderr-poller-#{id}"
|
57
60
|
loop do
|
58
61
|
Kernel.warn(@stderr.readline, uplevel: 0)
|
59
62
|
end
|
data/lib/sass/compiler.rb
CHANGED
@@ -62,7 +62,7 @@ module Sass
|
|
62
62
|
# compilation to avoid deluging users in console noise. If you set verbose to +true+, it will instead print every
|
63
63
|
# deprecation warning it encounters.
|
64
64
|
# @return [CompileResult]
|
65
|
-
# @raise [ArgumentError, CompileError]
|
65
|
+
# @raise [ArgumentError, CompileError, IOError]
|
66
66
|
# @see https://sass-lang.com/documentation/js-api/functions/compile/
|
67
67
|
def compile(path,
|
68
68
|
load_paths: [],
|
@@ -142,7 +142,7 @@ module Sass
|
|
142
142
|
# compilation to avoid deluging users in console noise. If you set verbose to +true+, it will instead print every
|
143
143
|
# deprecation warning it encounters.
|
144
144
|
# @return [CompileResult]
|
145
|
-
# @raise [ArgumentError, CompileError]
|
145
|
+
# @raise [ArgumentError, CompileError, IOError]
|
146
146
|
# @see https://sass-lang.com/documentation/js-api/functions/compilestring/
|
147
147
|
def compile_string(source,
|
148
148
|
importer: nil,
|
data/lib/sass/elf.rb
CHANGED
@@ -7,26 +7,76 @@ module Sass
|
|
7
7
|
# @see https://github.com/torvalds/linux/blob/HEAD/include/uapi/linux/elf.h
|
8
8
|
# @see https://github.com/torvalds/linux/blob/HEAD/kernel/kexec_elf.c
|
9
9
|
class ELF
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
10
|
+
module PackInfo
|
11
|
+
PACK_MAP = {
|
12
|
+
Elf32_Ehdr: 'S<2L<5S<6',
|
13
|
+
Elf64_Ehdr: 'S<2L<Q<3L<S<6',
|
14
|
+
Elf32_Phdr: 'L<8',
|
15
|
+
Elf64_Phdr: 'L<2Q<6'
|
16
|
+
}.freeze
|
17
|
+
|
18
|
+
SIZE_MAP = {
|
19
|
+
Elf32_Ehdr: 36,
|
20
|
+
Elf64_Ehdr: 48,
|
21
|
+
Elf32_Phdr: 32,
|
22
|
+
Elf64_Phdr: 56
|
23
|
+
}.freeze
|
24
|
+
|
25
|
+
STRUCT_MAP = {
|
26
|
+
Elf32_Ehdr: %i[
|
27
|
+
e_type
|
28
|
+
e_machine
|
29
|
+
e_version
|
30
|
+
e_entry
|
31
|
+
e_phoff
|
32
|
+
e_shoff
|
33
|
+
e_flags
|
34
|
+
e_ehsize
|
35
|
+
e_phentsize
|
36
|
+
e_phnum
|
37
|
+
e_shentsize
|
38
|
+
e_shnum
|
39
|
+
e_shstrndx
|
40
|
+
].freeze,
|
41
|
+
Elf64_Ehdr: %i[
|
42
|
+
e_type
|
43
|
+
e_machine
|
44
|
+
e_version
|
45
|
+
e_entry
|
46
|
+
e_phoff
|
47
|
+
e_shoff
|
48
|
+
e_flags
|
49
|
+
e_ehsize
|
50
|
+
e_phentsize
|
51
|
+
e_phnum
|
52
|
+
e_shentsize
|
53
|
+
e_shnum
|
54
|
+
e_shstrndx
|
55
|
+
].freeze,
|
56
|
+
Elf32_Phdr: %i[
|
57
|
+
p_type
|
58
|
+
p_offset
|
59
|
+
p_vaddr
|
60
|
+
p_paddr
|
61
|
+
p_filesz
|
62
|
+
p_memsz
|
63
|
+
p_flags
|
64
|
+
p_align
|
65
|
+
].freeze,
|
66
|
+
Elf64_Phdr: %i[
|
67
|
+
p_type
|
68
|
+
p_flags
|
69
|
+
p_offset
|
70
|
+
p_vaddr
|
71
|
+
p_paddr
|
72
|
+
p_filesz
|
73
|
+
p_memsz
|
74
|
+
p_align
|
75
|
+
].freeze
|
76
|
+
}.freeze
|
77
|
+
end
|
28
78
|
|
29
|
-
|
79
|
+
private_constant :PackInfo
|
30
80
|
|
31
81
|
# These constants are for the segment types stored in the image headers
|
32
82
|
PT_NULL = 0
|
@@ -41,10 +91,6 @@ module Sass
|
|
41
91
|
PT_HIOS = 0x6fffffff
|
42
92
|
PT_LOPROC = 0x70000000
|
43
93
|
PT_HIPROC = 0x7fffffff
|
44
|
-
PT_GNU_EH_FRAME = (PT_LOOS + 0x474e550)
|
45
|
-
PT_GNU_STACK = (PT_LOOS + 0x474e551)
|
46
|
-
PT_GNU_RELRO = (PT_LOOS + 0x474e552)
|
47
|
-
PT_GNU_PROPERTY = (PT_LOOS + 0x474e553)
|
48
94
|
|
49
95
|
# These constants define the different elf file types
|
50
96
|
ET_NONE = 0
|
@@ -57,66 +103,6 @@ module Sass
|
|
57
103
|
|
58
104
|
EI_NIDENT = 16
|
59
105
|
|
60
|
-
# rubocop:disable Naming/ConstantName
|
61
|
-
|
62
|
-
Elf32_Ehdr = [
|
63
|
-
[:unsigned_char, :e_ident, EI_NIDENT],
|
64
|
-
[Elf32_Half, :e_type],
|
65
|
-
[Elf32_Half, :e_machine],
|
66
|
-
[Elf32_Word, :e_version],
|
67
|
-
[Elf32_Addr, :e_entry],
|
68
|
-
[Elf32_Off, :e_phoff],
|
69
|
-
[Elf32_Off, :e_shoff],
|
70
|
-
[Elf32_Word, :e_flags],
|
71
|
-
[Elf32_Half, :e_ehsize],
|
72
|
-
[Elf32_Half, :e_phentsize],
|
73
|
-
[Elf32_Half, :e_phnum],
|
74
|
-
[Elf32_Half, :e_shentsize],
|
75
|
-
[Elf32_Half, :e_shnum],
|
76
|
-
[Elf32_Half, :e_shstrndx]
|
77
|
-
].freeze
|
78
|
-
|
79
|
-
Elf64_Ehdr = [
|
80
|
-
[:unsigned_char, :e_ident, EI_NIDENT],
|
81
|
-
[Elf64_Half, :e_type],
|
82
|
-
[Elf64_Half, :e_machine],
|
83
|
-
[Elf64_Word, :e_version],
|
84
|
-
[Elf64_Addr, :e_entry],
|
85
|
-
[Elf64_Off, :e_phoff],
|
86
|
-
[Elf64_Off, :e_shoff],
|
87
|
-
[Elf64_Word, :e_flags],
|
88
|
-
[Elf64_Half, :e_ehsize],
|
89
|
-
[Elf64_Half, :e_phentsize],
|
90
|
-
[Elf64_Half, :e_phnum],
|
91
|
-
[Elf64_Half, :e_shentsize],
|
92
|
-
[Elf64_Half, :e_shnum],
|
93
|
-
[Elf64_Half, :e_shstrndx]
|
94
|
-
].freeze
|
95
|
-
|
96
|
-
Elf32_Phdr = [
|
97
|
-
[Elf32_Word, :p_type],
|
98
|
-
[Elf32_Off, :p_offset],
|
99
|
-
[Elf32_Addr, :p_vaddr],
|
100
|
-
[Elf32_Addr, :p_paddr],
|
101
|
-
[Elf32_Word, :p_filesz],
|
102
|
-
[Elf32_Word, :p_memsz],
|
103
|
-
[Elf32_Word, :p_flags],
|
104
|
-
[Elf32_Word, :p_align]
|
105
|
-
].freeze
|
106
|
-
|
107
|
-
Elf64_Phdr = [
|
108
|
-
[Elf64_Word, :p_type],
|
109
|
-
[Elf64_Word, :p_flags],
|
110
|
-
[Elf64_Off, :p_offset],
|
111
|
-
[Elf64_Addr, :p_vaddr],
|
112
|
-
[Elf64_Addr, :p_paddr],
|
113
|
-
[Elf64_Xword, :p_filesz],
|
114
|
-
[Elf64_Xword, :p_memsz],
|
115
|
-
[Elf64_Xword, :p_align]
|
116
|
-
].freeze
|
117
|
-
|
118
|
-
# rubocop:enable Naming/ConstantName
|
119
|
-
|
120
106
|
# e_ident[] indexes
|
121
107
|
EI_MAG0 = 0
|
122
108
|
EI_MAG1 = 1
|
@@ -130,9 +116,9 @@ module Sass
|
|
130
116
|
|
131
117
|
# EI_MAG
|
132
118
|
ELFMAG0 = 0x7f
|
133
|
-
ELFMAG1 =
|
134
|
-
ELFMAG2 =
|
135
|
-
ELFMAG3 =
|
119
|
+
ELFMAG1 = 0x45
|
120
|
+
ELFMAG2 = 0x4c
|
121
|
+
ELFMAG3 = 0x46
|
136
122
|
ELFMAG = [ELFMAG0, ELFMAG1, ELFMAG2, ELFMAG3].pack('C*')
|
137
123
|
SELFMAG = 4
|
138
124
|
|
@@ -149,10 +135,35 @@ module Sass
|
|
149
135
|
|
150
136
|
def initialize(buffer)
|
151
137
|
@buffer = buffer
|
152
|
-
|
138
|
+
|
139
|
+
@ehdr = { e_ident: @buffer.read(EI_NIDENT).unpack('C*') }
|
140
|
+
raise ArgumentError unless @ehdr[:e_ident].slice(EI_MAG0, SELFMAG).pack('C*') == ELFMAG
|
141
|
+
|
142
|
+
case @ehdr[:e_ident][EI_CLASS]
|
143
|
+
when ELFCLASS32
|
144
|
+
elf_ehdr = :Elf32_Ehdr
|
145
|
+
elf_phdr = :Elf32_Phdr
|
146
|
+
when ELFCLASS64
|
147
|
+
elf_ehdr = :Elf64_Ehdr
|
148
|
+
elf_phdr = :Elf64_Phdr
|
149
|
+
else
|
150
|
+
raise ArgumentError
|
151
|
+
end
|
152
|
+
|
153
|
+
case @ehdr[:e_ident][EI_DATA]
|
154
|
+
when ELFDATA2LSB
|
155
|
+
little_endian = true
|
156
|
+
when ELFDATA2MSB
|
157
|
+
little_endian = false
|
158
|
+
else
|
159
|
+
raise ArgumentError
|
160
|
+
end
|
161
|
+
|
162
|
+
@ehdr.merge!(read(elf_ehdr, little_endian))
|
163
|
+
|
153
164
|
@buffer.seek(@ehdr[:e_phoff], IO::SEEK_SET)
|
154
165
|
@proghdrs = Array.new(@ehdr[:e_phnum]) do
|
155
|
-
|
166
|
+
read(elf_phdr, little_endian)
|
156
167
|
end
|
157
168
|
end
|
158
169
|
|
@@ -185,75 +196,10 @@ module Sass
|
|
185
196
|
|
186
197
|
private
|
187
198
|
|
188
|
-
def
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
def data_encoding
|
193
|
-
@ehdr[:e_ident][EI_DATA]
|
194
|
-
end
|
195
|
-
|
196
|
-
def read_ehdr
|
197
|
-
@ehdr = { e_ident: @buffer.read(EI_NIDENT).unpack('C*') }
|
198
|
-
raise ArgumentError unless @ehdr[:e_ident].slice(EI_MAG0, SELFMAG).pack('C*') == ELFMAG
|
199
|
-
|
200
|
-
case file_class
|
201
|
-
when ELFCLASS32
|
202
|
-
Elf32_Ehdr
|
203
|
-
when ELFCLASS64
|
204
|
-
Elf64_Ehdr
|
205
|
-
else
|
206
|
-
raise ArgumentError
|
207
|
-
end.drop(1).to_h do |field|
|
208
|
-
[field[1], read1(field[0])]
|
209
|
-
end.merge!(@ehdr)
|
210
|
-
end
|
211
|
-
|
212
|
-
def read_phdr
|
213
|
-
case file_class
|
214
|
-
when ELFCLASS32
|
215
|
-
Elf32_Phdr
|
216
|
-
when ELFCLASS64
|
217
|
-
Elf64_Phdr
|
218
|
-
else
|
219
|
-
raise ArgumentError
|
220
|
-
end.to_h do |field|
|
221
|
-
[field[1], read1(field[0])]
|
222
|
-
end
|
223
|
-
end
|
224
|
-
|
225
|
-
def explicit_endian
|
226
|
-
case data_encoding
|
227
|
-
when ELFDATA2LSB
|
228
|
-
'<'
|
229
|
-
when ELFDATA2MSB
|
230
|
-
'>'
|
231
|
-
else
|
232
|
-
raise ArgumentError
|
233
|
-
end
|
234
|
-
end
|
235
|
-
|
236
|
-
def read1(type)
|
237
|
-
case type
|
238
|
-
when :__u8
|
239
|
-
@buffer.read(1).unpack1('C')
|
240
|
-
when :__u16
|
241
|
-
@buffer.read(2).unpack1("S#{explicit_endian}")
|
242
|
-
when :__u32
|
243
|
-
@buffer.read(4).unpack1("L#{explicit_endian}")
|
244
|
-
when :__u64
|
245
|
-
@buffer.read(8).unpack1("Q#{explicit_endian}")
|
246
|
-
when :__s8
|
247
|
-
@buffer.read(1).unpack1('c')
|
248
|
-
when :__s16
|
249
|
-
@buffer.read(2).unpack1("s#{explicit_endian}")
|
250
|
-
when :__s32
|
251
|
-
@buffer.read(4).unpack1("l#{explicit_endian}")
|
252
|
-
when :__s64
|
253
|
-
@buffer.read(8).unpack1("q#{explicit_endian}")
|
254
|
-
else
|
255
|
-
raise ArgumentError
|
256
|
-
end
|
199
|
+
def read(type, little_endian)
|
200
|
+
size = PackInfo::SIZE_MAP[type]
|
201
|
+
format = little_endian ? PackInfo::PACK_MAP[type] : PackInfo::PACK_MAP[type].tr('<', '>')
|
202
|
+
[PackInfo::STRUCT_MAP[type], @buffer.read(size).unpack(format)].transpose.to_h
|
257
203
|
end
|
258
204
|
|
259
205
|
INTERPRETER = begin
|
data/lib/sass/embedded.rb
CHANGED
@@ -63,7 +63,7 @@ module Sass
|
|
63
63
|
@last_accessed_time = current_time
|
64
64
|
|
65
65
|
Thread.new do
|
66
|
-
Thread.current.name =
|
66
|
+
Thread.current.name = "sass-embedded-connection-reaper-#{@connection.id}"
|
67
67
|
duration = idle_timeout
|
68
68
|
loop do
|
69
69
|
sleep(duration.negative? ? idle_timeout : duration)
|
data/lib/sass/exception.rb
CHANGED
@@ -51,8 +51,12 @@ module Sass
|
|
51
51
|
font-family: monospace, monospace;
|
52
52
|
white-space: pre;
|
53
53
|
content: #{Serializer.serialize_quoted_string(content).gsub(/[^[:ascii:]][\h\t ]?/) do |match|
|
54
|
-
|
55
|
-
replacement
|
54
|
+
ordinal = match.ord
|
55
|
+
replacement = "\\#{ordinal.to_s(16)}"
|
56
|
+
if match.length > 1
|
57
|
+
replacement << ' ' if ordinal < 0x100000
|
58
|
+
replacement << match[1]
|
59
|
+
end
|
56
60
|
replacement
|
57
61
|
end};
|
58
62
|
}
|
@@ -62,6 +66,7 @@ module Sass
|
|
62
66
|
|
63
67
|
# An exception thrown by Sass Script.
|
64
68
|
class ScriptError < StandardError
|
69
|
+
# @!visibility private
|
65
70
|
def initialize(message, name = nil)
|
66
71
|
super(name.nil? ? message : "$#{name}: #{message}")
|
67
72
|
end
|
data/lib/sass/value/number.rb
CHANGED
@@ -290,7 +290,7 @@ module Sass
|
|
290
290
|
|
291
291
|
compatibility_error = lambda {
|
292
292
|
unless other.nil?
|
293
|
-
message =
|
293
|
+
message = "#{self} and"
|
294
294
|
message << " $#{other_name}:" unless other_name.nil?
|
295
295
|
message << " #{other} have incompatible units"
|
296
296
|
message << " (one has units and the other doesn't)" if unitless? || other_unitless
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sass-embedded
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.78.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- なつき
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-
|
11
|
+
date: 2024-09-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -28,22 +28,16 @@ dependencies:
|
|
28
28
|
name: google-protobuf
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- - "
|
32
|
-
- !ruby/object:Gem::Version
|
33
|
-
version: '3.25'
|
34
|
-
- - "<"
|
31
|
+
- - "~>"
|
35
32
|
- !ruby/object:Gem::Version
|
36
|
-
version: '
|
33
|
+
version: '4.27'
|
37
34
|
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
|
-
- - "
|
42
|
-
- !ruby/object:Gem::Version
|
43
|
-
version: '3.25'
|
44
|
-
- - "<"
|
38
|
+
- - "~>"
|
45
39
|
- !ruby/object:Gem::Version
|
46
|
-
version: '
|
40
|
+
version: '4.27'
|
47
41
|
description: A Ruby library that will communicate with Embedded Dart Sass using the
|
48
42
|
Embedded Sass protocol.
|
49
43
|
email:
|
@@ -107,8 +101,8 @@ licenses:
|
|
107
101
|
- MIT
|
108
102
|
metadata:
|
109
103
|
bug_tracker_uri: https://github.com/sass-contrib/sass-embedded-host-ruby/issues
|
110
|
-
documentation_uri: https://rubydoc.info/gems/sass-embedded/1.
|
111
|
-
source_code_uri: https://github.com/sass-contrib/sass-embedded-host-ruby/tree/v1.
|
104
|
+
documentation_uri: https://rubydoc.info/gems/sass-embedded/1.78.0
|
105
|
+
source_code_uri: https://github.com/sass-contrib/sass-embedded-host-ruby/tree/v1.78.0
|
112
106
|
funding_uri: https://github.com/sponsors/ntkme
|
113
107
|
rubygems_mfa_required: 'true'
|
114
108
|
post_install_message:
|
@@ -126,7 +120,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
126
120
|
- !ruby/object:Gem::Version
|
127
121
|
version: '0'
|
128
122
|
requirements: []
|
129
|
-
rubygems_version: 3.5.
|
123
|
+
rubygems_version: 3.5.18
|
130
124
|
signing_key:
|
131
125
|
specification_version: 4
|
132
126
|
summary: Use dart-sass with Ruby!
|