sass-embedded 1.6.2 → 1.83.1
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/README.md +9 -3
- data/exe/sass +13 -0
- data/ext/sass/Rakefile +352 -76
- data/ext/sass/embedded_sass_pb.rb +61 -0
- data/ext/sass/expand-archive.ps1 +1 -0
- data/ext/sass/package.json +1 -1
- data/lib/sass/calculation_value/calculation_operation.rb +49 -0
- data/lib/sass/calculation_value.rb +22 -0
- data/lib/sass/canonicalize_context.rb +25 -0
- data/lib/sass/compile_result.rb +3 -2
- data/lib/sass/compiler/channel.rb +68 -0
- data/lib/sass/compiler/connection.rb +89 -0
- data/lib/sass/compiler/dispatcher.rb +116 -0
- data/lib/sass/{embedded → compiler}/host/function_registry.rb +31 -34
- data/lib/sass/compiler/host/importer_registry.rb +141 -0
- data/lib/sass/compiler/host/logger_registry.rb +80 -0
- data/lib/sass/compiler/host/protofier.rb +360 -0
- data/lib/sass/compiler/host/structifier.rb +37 -0
- data/lib/sass/compiler/host.rb +226 -0
- data/lib/sass/{embedded → compiler}/varint.rb +9 -5
- data/lib/sass/compiler.rb +212 -0
- data/lib/sass/elf.rb +222 -0
- data/lib/sass/embedded/version.rb +2 -2
- data/lib/sass/embedded.rb +76 -204
- data/lib/sass/embedded_protocol.rb +10 -0
- data/lib/sass/exception.rb +74 -0
- data/lib/sass/fork_tracker.rb +51 -0
- data/lib/sass/logger/silent.rb +5 -3
- data/lib/sass/logger/source_location.rb +6 -5
- data/lib/sass/logger/source_span.rb +8 -7
- data/lib/sass/node_package_importer.rb +17 -0
- data/lib/sass/serializer.rb +30 -0
- data/lib/sass/value/argument_list.rb +13 -6
- data/lib/sass/value/boolean.rb +1 -1
- data/lib/sass/value/calculation.rb +90 -0
- data/lib/sass/value/color/channel.rb +79 -0
- data/lib/sass/value/color/conversions.rb +473 -0
- data/lib/sass/value/color/gamut_map_method/clip.rb +45 -0
- data/lib/sass/value/color/gamut_map_method/local_minde.rb +94 -0
- data/lib/sass/value/color/gamut_map_method.rb +45 -0
- data/lib/sass/value/color/interpolation_method.rb +51 -0
- data/lib/sass/value/color/space/a98_rgb.rb +57 -0
- data/lib/sass/value/color/space/display_p3.rb +57 -0
- data/lib/sass/value/color/space/hsl.rb +65 -0
- data/lib/sass/value/color/space/hwb.rb +70 -0
- data/lib/sass/value/color/space/lab.rb +77 -0
- data/lib/sass/value/color/space/lch.rb +53 -0
- data/lib/sass/value/color/space/lms.rb +129 -0
- data/lib/sass/value/color/space/oklab.rb +66 -0
- data/lib/sass/value/color/space/oklch.rb +54 -0
- data/lib/sass/value/color/space/prophoto_rgb.rb +59 -0
- data/lib/sass/value/color/space/rec2020.rb +69 -0
- data/lib/sass/value/color/space/rgb.rb +52 -0
- data/lib/sass/value/color/space/srgb.rb +140 -0
- data/lib/sass/value/color/space/srgb_linear.rb +72 -0
- data/lib/sass/value/color/space/utils.rb +86 -0
- data/lib/sass/value/color/space/xyz_d50.rb +100 -0
- data/lib/sass/value/color/space/xyz_d65.rb +57 -0
- data/lib/sass/value/color/space.rb +198 -0
- data/lib/sass/value/color.rb +538 -163
- data/lib/sass/value/function.rb +11 -16
- data/lib/sass/value/fuzzy_math.rb +24 -21
- data/lib/sass/value/list.rb +7 -7
- data/lib/sass/value/map.rb +6 -6
- data/lib/sass/value/mixin.rb +34 -0
- data/lib/sass/value/null.rb +1 -1
- data/lib/sass/value/number/unit.rb +7 -6
- data/lib/sass/value/number.rb +34 -26
- data/lib/sass/value/string.rb +9 -3
- data/lib/sass/value.rb +20 -16
- metadata +67 -103
- data/ext/sass/unzip.vbs +0 -13
- data/lib/sass/compile_error.rb +0 -28
- data/lib/sass/embedded/async.rb +0 -65
- data/lib/sass/embedded/channel.rb +0 -61
- data/lib/sass/embedded/compiler.rb +0 -60
- data/lib/sass/embedded/dispatcher.rb +0 -90
- data/lib/sass/embedded/host/importer_registry.rb +0 -107
- data/lib/sass/embedded/host/logger_registry.rb +0 -50
- data/lib/sass/embedded/host/value_protofier.rb +0 -241
- data/lib/sass/embedded/host.rb +0 -139
- data/lib/sass/embedded/protofier.rb +0 -78
- data/lib/sass/embedded/structifier.rb +0 -36
- data/lib/sass/script_error.rb +0 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e195e5414c096b69ed749c06fa18abceb7183b9210589eac6ecbe4567e6ca062
|
4
|
+
data.tar.gz: 7db43c7cde6beac01612d5c0cb06e08ed7e3df66054319a6f327a0e3ce8de608
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 60933b74969f9fc1237b22531bf0f46690564f0556bfbfe26519402970e45c68e1fbd8be03217206ea7b1f833c8563b65078b3d44e28743375bd2798c619c049
|
7
|
+
data.tar.gz: bcc7c53bf5452b3130d119fe0950450d329522c48cafabef5aa1aecb8732e232c5975739a161445fe0a3aa396120b0b1764fbba72a6518f644b5a40efa7ba801
|
data/README.md
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
# Embedded Sass Host for Ruby
|
2
2
|
|
3
|
-
[](https://github.com/sass-contrib/sass-embedded-host-ruby/actions/workflows/build.yml)
|
4
4
|
[](https://rubygems.org/gems/sass-embedded)
|
5
5
|
|
6
|
-
This is a Ruby library that implements the host side of the [Embedded Sass protocol](https://github.com/sass/sass
|
6
|
+
This is a Ruby library that implements the host side of the [Embedded Sass protocol](https://github.com/sass/sass/blob/HEAD/spec/embedded-protocol.md).
|
7
7
|
|
8
8
|
It exposes a Ruby API for Sass that's backed by a native [Dart Sass](https://sass-lang.com/dart-sass) executable.
|
9
9
|
|
@@ -24,6 +24,9 @@ require 'sass-embedded'
|
|
24
24
|
|
25
25
|
result = Sass.compile('style.scss')
|
26
26
|
puts result.css
|
27
|
+
|
28
|
+
compressed = Sass.compile('style.scss', style: :compressed)
|
29
|
+
puts compressed.css
|
27
30
|
```
|
28
31
|
|
29
32
|
- `Sass.compile_string` takes a string that represents the contents of a Sass file and return the result of compiling that file to CSS.
|
@@ -33,9 +36,12 @@ require 'sass-embedded'
|
|
33
36
|
|
34
37
|
result = Sass.compile_string('h1 { font-size: 40px; }')
|
35
38
|
puts result.css
|
39
|
+
|
40
|
+
compressed = Sass.compile_string('h1 { font-size: 40px; }', style: :compressed)
|
41
|
+
puts compressed.css
|
36
42
|
```
|
37
43
|
|
38
|
-
See [rubydoc.info/gems/sass-embedded](https://rubydoc.info/gems/sass-embedded) for full API documentation.
|
44
|
+
See [rubydoc.info/gems/sass-embedded/Sass](https://rubydoc.info/gems/sass-embedded/Sass) for full API documentation.
|
39
45
|
|
40
46
|
---
|
41
47
|
|
data/exe/sass
ADDED
data/ext/sass/Rakefile
CHANGED
@@ -4,44 +4,154 @@ require 'rake/clean'
|
|
4
4
|
|
5
5
|
task default: %i[install clean]
|
6
6
|
|
7
|
-
task install: %w[
|
8
|
-
|
9
|
-
|
7
|
+
task install: %w[cli.rb] do
|
8
|
+
Rake::Task['embedded_sass_pb.rb'].invoke unless File.exist?('embedded_sass_pb.rb')
|
9
|
+
end
|
10
10
|
|
11
|
-
|
11
|
+
CLEAN.include %w[
|
12
|
+
protoc.exe
|
13
|
+
ruby
|
14
|
+
*.proto
|
15
|
+
*.tar.gz
|
16
|
+
*.zip
|
17
|
+
]
|
18
|
+
|
19
|
+
CLOBBER.include %w[
|
20
|
+
dart-sass
|
21
|
+
cli.rb
|
22
|
+
embedded_sass_pb.rb
|
23
|
+
node_modules
|
24
|
+
bun.lockb
|
25
|
+
package-lock.json
|
26
|
+
pnpm-lock.yaml
|
27
|
+
yarn.lock
|
28
|
+
]
|
12
29
|
|
13
30
|
file 'protoc.exe' do |t|
|
14
|
-
fetch(
|
31
|
+
fetch(SassConfig.protoc, t.name)
|
32
|
+
chmod 'a+x', t.name
|
33
|
+
rescue NotImplementedError
|
34
|
+
File.write(t.name, <<~PROTOC_EXE)
|
35
|
+
#!#{RbConfig.ruby}
|
36
|
+
# frozen_string_literal: true
|
37
|
+
Kernel.exec('protoc', *ARGV)
|
38
|
+
PROTOC_EXE
|
15
39
|
chmod 'a+x', t.name
|
16
40
|
end
|
17
41
|
|
18
|
-
file '
|
19
|
-
|
42
|
+
file 'dart-sass/sass' do |t|
|
43
|
+
gem_install 'sass-embedded', SassConfig.gem_version, SassConfig.gem_platform do |dir|
|
44
|
+
mv File.absolute_path("ext/sass/#{t.name}", dir), t.name
|
45
|
+
end
|
46
|
+
rescue StandardError
|
47
|
+
archive = fetch(SassConfig.dart_sass)
|
20
48
|
unarchive archive
|
21
49
|
rm archive
|
22
50
|
end
|
23
51
|
|
24
|
-
file '
|
25
|
-
|
26
|
-
|
52
|
+
file 'node_modules/sass' do
|
53
|
+
sh 'npm', 'install'
|
54
|
+
rescue StandardError
|
55
|
+
begin
|
56
|
+
sh 'yarn', 'install'
|
57
|
+
rescue StandardError
|
58
|
+
begin
|
59
|
+
sh 'pnpm', 'install'
|
60
|
+
rescue StandardError
|
61
|
+
sh 'bun', 'install'
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
27
65
|
|
28
|
-
|
66
|
+
task 'dart-sass' do
|
67
|
+
Rake::Task['dart-sass/sass'].invoke
|
68
|
+
rescue NotImplementedError
|
69
|
+
Rake::Task['node_modules/sass'].invoke
|
70
|
+
end
|
29
71
|
|
30
|
-
|
31
|
-
|
72
|
+
file 'cli.rb' => %w[dart-sass] do |t|
|
73
|
+
require_relative '../../lib/sass/elf'
|
74
|
+
|
75
|
+
begin
|
76
|
+
exe = 'dart-sass/sass'
|
77
|
+
exe = "#{exe}#{['', '.bat', '.exe'].find { |ext| File.exist?("#{exe}#{ext}") }}"
|
78
|
+
|
79
|
+
raise Errno::ENOENT, exe unless File.exist?(exe)
|
80
|
+
|
81
|
+
runtime = 'dart-sass/src/dart'
|
82
|
+
runtime = "#{runtime}#{['', '.exe'].find { |ext| File.exist?("#{runtime}#{ext}") }}"
|
83
|
+
snapshot = 'dart-sass/src/sass.snapshot'
|
32
84
|
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
85
|
+
command = if File.exist?(runtime) && File.exist?(snapshot)
|
86
|
+
[runtime, snapshot]
|
87
|
+
else
|
88
|
+
[exe]
|
89
|
+
end
|
90
|
+
|
91
|
+
interpreter = File.open(command[0], 'rb') do |file|
|
92
|
+
Sass.const_get(:ELF).new(file).interpreter
|
93
|
+
rescue ArgumentError
|
94
|
+
nil
|
95
|
+
end
|
96
|
+
|
97
|
+
command_source = command.map do |argument|
|
98
|
+
"File.absolute_path('#{argument}', __dir__).freeze"
|
99
|
+
end.join(',
|
100
|
+
')
|
101
|
+
rescue Errno::ENOENT
|
102
|
+
package = 'node_modules/sass'
|
103
|
+
|
104
|
+
script = File.join(package, SassConfig.package_json(package)['bin']['sass'])
|
105
|
+
|
106
|
+
interpreter = nil
|
107
|
+
|
108
|
+
command_source = [
|
109
|
+
"'node'",
|
110
|
+
"File.absolute_path('#{script}', __dir__).freeze"
|
111
|
+
].join(',
|
112
|
+
')
|
113
|
+
end
|
114
|
+
|
115
|
+
if interpreter.nil?
|
116
|
+
File.write(t.name, <<~CLI_RB)
|
117
|
+
# frozen_string_literal: true
|
118
|
+
|
119
|
+
module Sass
|
120
|
+
module CLI
|
121
|
+
COMMAND = [
|
122
|
+
#{command_source}
|
123
|
+
].freeze
|
37
124
|
end
|
125
|
+
|
126
|
+
private_constant :CLI
|
38
127
|
end
|
39
|
-
|
40
|
-
|
128
|
+
CLI_RB
|
129
|
+
else
|
130
|
+
File.write(t.name, <<~CLI_RB)
|
131
|
+
# frozen_string_literal: true
|
132
|
+
|
133
|
+
require_relative '../../lib/sass/elf'
|
134
|
+
|
135
|
+
module Sass
|
136
|
+
module CLI
|
137
|
+
INTERPRETER = '#{interpreter}'
|
138
|
+
|
139
|
+
INTERPRETER_SUFFIX = '/#{File.basename(interpreter)}'
|
140
|
+
|
141
|
+
COMMAND = [
|
142
|
+
*(ELF::INTERPRETER if ELF::INTERPRETER != INTERPRETER && ELF::INTERPRETER&.end_with?(INTERPRETER_SUFFIX)),
|
143
|
+
#{command_source}
|
144
|
+
].freeze
|
145
|
+
end
|
146
|
+
|
147
|
+
private_constant :CLI
|
148
|
+
end
|
149
|
+
CLI_RB
|
150
|
+
end
|
41
151
|
end
|
42
152
|
|
43
|
-
file 'embedded_sass.proto' => %w[
|
44
|
-
fetch(
|
153
|
+
file 'embedded_sass.proto' => %w[cli.rb] do |t|
|
154
|
+
fetch(SassConfig.embedded_sass_protocol, t.name)
|
45
155
|
end
|
46
156
|
|
47
157
|
rule '_pb.rb' => %w[.proto protoc.exe] do |t|
|
@@ -51,14 +161,59 @@ end
|
|
51
161
|
# This is a FileUtils extension that defines several additional commands to be
|
52
162
|
# added to the FileUtils utility functions.
|
53
163
|
module FileUtils
|
164
|
+
# PowerShell quirks:
|
165
|
+
# - `powershell -Command -`:
|
166
|
+
# Arguments must be part of command, thus cannot pass arguments safely without escaping.
|
167
|
+
# - `powershell -Command <script-block> [-args <arg-array>]`:
|
168
|
+
# This only works when invoking powershell subshell in powershell.
|
169
|
+
# - `powershell -Command <string> [<CommandParameters>]`:
|
170
|
+
# CommandParameters are joined with command and then parsed, thus cannot pass arguments safely without escaping.
|
171
|
+
# - `powershell -File -`:
|
172
|
+
# Arguments must be part of file, thus cannot pass arguments safely without escaping.
|
173
|
+
# - `powershell -File <filePath> <args>`:
|
174
|
+
# This is the only way to pass arguments safely without escaping.
|
175
|
+
def powershell(file, *args)
|
176
|
+
sh 'powershell', '-NoLogo', '-NoProfile', '-NonInteractive', '-ExecutionPolicy', 'Bypass', '-File', file, *args
|
177
|
+
end
|
178
|
+
|
179
|
+
def junzip(archive, dest = '.')
|
180
|
+
require 'java'
|
181
|
+
|
182
|
+
Rake.rake_output_message "Archive: #{archive}" if Rake::FileUtilsExt.verbose_flag
|
183
|
+
|
184
|
+
current_directory = java.nio.file.Paths.get(org.jruby.Ruby.getGlobalRuntime.getCurrentDirectory)
|
185
|
+
zip_file = java.util.zip.ZipFile.new(current_directory.resolve(archive).toFile)
|
186
|
+
dest_path = current_directory.resolve(dest).normalize
|
187
|
+
entries = zip_file.entries
|
188
|
+
while entries.hasMoreElements
|
189
|
+
entry = entries.nextElement
|
190
|
+
name = entry.getName
|
191
|
+
path = dest_path.resolve(name).normalize
|
192
|
+
raise SecurityError unless path.startsWith(dest_path)
|
193
|
+
|
194
|
+
Rake.rake_output_message " inflating: #{name}" if Rake::FileUtilsExt.verbose_flag
|
195
|
+
|
196
|
+
if entry.isDirectory
|
197
|
+
java.nio.file.Files.createDirectories(path)
|
198
|
+
else
|
199
|
+
java.nio.file.Files.createDirectories(path.getParent)
|
200
|
+
java.nio.file.Files.copy(zip_file.getInputStream(entry), path)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
ensure
|
204
|
+
zip_file&.close
|
205
|
+
end
|
206
|
+
|
54
207
|
def unarchive(archive, dest = '.')
|
55
208
|
case archive.downcase
|
56
209
|
when ->(name) { name.include?('.tar.') || name.end_with?('.tar') }
|
57
210
|
mkdir_p dest
|
58
|
-
sh 'tar', '-vxC', dest, '-f', archive
|
211
|
+
sh 'tar', '-vxC', dest, '-f', archive, '--no-same-owner', '--no-same-permissions'
|
59
212
|
when ->(name) { name.end_with?('.zip') }
|
60
|
-
if
|
61
|
-
|
213
|
+
if RUBY_PLATFORM == 'java'
|
214
|
+
junzip archive, dest
|
215
|
+
elsif Gem.win_platform?
|
216
|
+
powershell 'expand-archive.ps1', '-Force', '-LiteralPath', archive, '-DestinationPath', dest
|
62
217
|
else
|
63
218
|
sh 'unzip', '-od', dest, archive
|
64
219
|
end
|
@@ -70,58 +225,95 @@ module FileUtils
|
|
70
225
|
def fetch(source_uri, dest_path = nil)
|
71
226
|
require 'rubygems/remote_fetcher'
|
72
227
|
|
73
|
-
|
228
|
+
source_uri = "/#{source_uri}" if !source_uri.start_with?('/') && File.absolute_path?(source_uri)
|
229
|
+
|
230
|
+
source_uri = begin
|
231
|
+
Gem::Uri.parse!(source_uri)
|
232
|
+
rescue NoMethodError
|
74
233
|
begin
|
75
|
-
|
234
|
+
URI.parse(source_uri)
|
76
235
|
rescue StandardError
|
77
|
-
|
236
|
+
URI.parse(URI::DEFAULT_PARSER.escape(source_uri.to_s))
|
78
237
|
end
|
79
238
|
end
|
80
239
|
|
81
240
|
scheme = source_uri.scheme
|
82
|
-
source_path =
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
end
|
241
|
+
source_path = begin
|
242
|
+
Gem::URI::DEFAULT_PARSER
|
243
|
+
rescue NameError
|
244
|
+
URI::DEFAULT_PARSER
|
245
|
+
end.unescape(source_uri.path)
|
88
246
|
|
89
247
|
dest_path = File.basename(source_path) if dest_path.nil?
|
90
248
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
source_path = source_path[1..]
|
95
|
-
end
|
96
|
-
cp source_path, dest_path
|
97
|
-
else
|
98
|
-
fetcher = Gem::RemoteFetcher.fetcher
|
99
|
-
symbol = "fetch_#{scheme}".to_sym
|
100
|
-
raise ArgumentError, "Unsupported URI scheme #{scheme}" unless fetcher.respond_to?(symbol)
|
249
|
+
fetcher = Gem::RemoteFetcher.fetcher
|
250
|
+
symbol = :"fetch_#{scheme.nil? ? 'file' : scheme}"
|
251
|
+
raise ArgumentError, "Unsupported URI scheme #{scheme}" unless fetcher.respond_to?(symbol)
|
101
252
|
|
102
|
-
|
103
|
-
redacted_uri = Gem::RemoteFetcher::FetchError.new('', source_uri).uri
|
104
|
-
Rake.rake_output_message "fetch #{redacted_uri}"
|
105
|
-
end
|
253
|
+
Rake.rake_output_message "fetch #{Gem::Uri.new(source_uri).redacted}" if Rake::FileUtilsExt.verbose_flag
|
106
254
|
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
end
|
255
|
+
unless Rake::FileUtilsExt.nowrite_flag
|
256
|
+
data = fetcher.public_send(symbol, source_uri)
|
257
|
+
Gem.write_binary(dest_path, data)
|
111
258
|
end
|
112
259
|
|
113
260
|
dest_path
|
114
261
|
end
|
262
|
+
|
263
|
+
def gem_install(name, version, platform)
|
264
|
+
require 'rubygems/remote_fetcher'
|
265
|
+
|
266
|
+
install_dir = File.absolute_path('ruby')
|
267
|
+
|
268
|
+
if Rake::FileUtilsExt.verbose_flag
|
269
|
+
Rake.rake_output_message [
|
270
|
+
'gem', 'install',
|
271
|
+
'--force',
|
272
|
+
'--install-dir', install_dir,
|
273
|
+
'--no-document', '--ignore-dependencies',
|
274
|
+
'--platform', platform,
|
275
|
+
'--version', version,
|
276
|
+
'sass-embedded'
|
277
|
+
].join(' ')
|
278
|
+
end
|
279
|
+
|
280
|
+
dependency = Gem::Dependency.new(name, version)
|
281
|
+
|
282
|
+
dependency_request = Gem::Resolver::DependencyRequest.new(dependency, nil)
|
283
|
+
|
284
|
+
resolver_spec = Gem::Resolver::BestSet.new.find_all(dependency_request).find do |s|
|
285
|
+
s.platform == platform
|
286
|
+
end
|
287
|
+
|
288
|
+
raise Gem::UnsatisfiableDependencyError, dependency_request if resolver_spec.nil?
|
289
|
+
|
290
|
+
options = { force: true, install_dir: }
|
291
|
+
if Rake::FileUtilsExt.nowrite_flag
|
292
|
+
installer = Gem::Installer.for_spec(resolver_spec.spec, options)
|
293
|
+
else
|
294
|
+
path = resolver_spec.download(options)
|
295
|
+
installer = Gem::Installer.at(path, options)
|
296
|
+
installer.install
|
297
|
+
end
|
298
|
+
|
299
|
+
yield installer.dir
|
300
|
+
ensure
|
301
|
+
rm_rf install_dir unless Rake::FileUtilsExt.nowrite_flag
|
302
|
+
end
|
115
303
|
end
|
116
304
|
|
117
|
-
# The {
|
118
|
-
module
|
305
|
+
# The {SassConfig} module.
|
306
|
+
module SassConfig
|
119
307
|
module Platform
|
120
308
|
OS = case RbConfig::CONFIG['host_os'].downcase
|
121
309
|
when /darwin/
|
122
310
|
'darwin'
|
311
|
+
when /linux-android/
|
312
|
+
'linux-android'
|
123
313
|
when /linux-musl/
|
124
314
|
'linux-musl'
|
315
|
+
when /linux-uclibc/
|
316
|
+
'linux-uclibc'
|
125
317
|
when /linux/
|
126
318
|
'linux'
|
127
319
|
when *Gem::WIN_PATTERNS
|
@@ -134,43 +326,53 @@ module Configuration
|
|
134
326
|
when /amd64|x86_64|x64/
|
135
327
|
'x86_64'
|
136
328
|
when /i\d86|x86|i86pc/
|
137
|
-
'
|
329
|
+
'x86'
|
138
330
|
when /arm64|aarch64/
|
139
331
|
'aarch64'
|
140
332
|
when /arm/
|
141
|
-
|
142
|
-
OS == 'darwin' ? 'aarch64' : 'arm'
|
333
|
+
'arm'
|
143
334
|
when /ppc64le|powerpc64le/
|
144
335
|
'powerpc64le'
|
145
|
-
when /s390x/
|
146
|
-
's390x'
|
147
336
|
else
|
148
337
|
RbConfig::CONFIG['host_cpu']
|
149
338
|
end
|
150
339
|
|
151
|
-
ARCH = "#{CPU}-#{OS}"
|
340
|
+
ARCH = "#{CPU}-#{OS}".freeze
|
152
341
|
end
|
153
342
|
|
154
343
|
private_constant :Platform
|
155
344
|
|
156
345
|
module_function
|
157
346
|
|
158
|
-
def
|
347
|
+
def package_json(path = '.')
|
159
348
|
require 'json'
|
160
349
|
|
161
|
-
|
350
|
+
JSON.parse(File.read(File.absolute_path('package.json', path)))
|
351
|
+
end
|
352
|
+
|
353
|
+
def dart_sass_version
|
354
|
+
package_json['dependencies']['sass']
|
355
|
+
end
|
356
|
+
|
357
|
+
def dart_sass
|
358
|
+
repo = 'https://github.com/sass/dart-sass'
|
162
359
|
|
163
|
-
|
360
|
+
tag_name = dart_sass_version
|
164
361
|
|
165
|
-
|
362
|
+
message = "dart-sass for #{Platform::ARCH} not available at #{repo}/releases/tag/#{tag_name}"
|
166
363
|
|
167
|
-
|
364
|
+
env = ''
|
168
365
|
|
169
366
|
os = case Platform::OS
|
170
367
|
when 'darwin'
|
171
368
|
'macos'
|
172
369
|
when 'linux'
|
173
370
|
'linux'
|
371
|
+
when 'linux-android'
|
372
|
+
'android'
|
373
|
+
when 'linux-musl'
|
374
|
+
env = '-musl'
|
375
|
+
'linux'
|
174
376
|
when 'windows'
|
175
377
|
'windows'
|
176
378
|
else
|
@@ -178,32 +380,42 @@ module Configuration
|
|
178
380
|
end
|
179
381
|
|
180
382
|
cpu = case Platform::CPU
|
181
|
-
when '
|
383
|
+
when 'x86'
|
182
384
|
'ia32'
|
183
385
|
when 'x86_64'
|
184
386
|
'x64'
|
185
387
|
when 'aarch64'
|
186
388
|
'arm64'
|
389
|
+
when 'arm'
|
390
|
+
'arm'
|
391
|
+
when 'riscv64'
|
392
|
+
'riscv64'
|
187
393
|
else
|
188
394
|
raise NotImplementedError, message
|
189
395
|
end
|
190
396
|
|
191
|
-
ext =
|
397
|
+
ext = Platform::OS == 'windows' ? 'zip' : 'tar.gz'
|
192
398
|
|
193
|
-
"#{repo}/releases/download/#{tag_name}/
|
399
|
+
"#{repo}/releases/download/#{tag_name}/dart-sass-#{tag_name}-#{os}-#{cpu}#{env}.#{ext}"
|
194
400
|
end
|
195
401
|
|
196
|
-
def
|
402
|
+
def protoc
|
403
|
+
require 'rubygems/remote_fetcher'
|
404
|
+
|
197
405
|
repo = 'https://repo.maven.apache.org/maven2/com/google/protobuf/protoc'
|
198
406
|
|
199
|
-
|
407
|
+
dependency = Gem::Dependency.new('google-protobuf')
|
408
|
+
|
409
|
+
spec = dependency.to_spec
|
410
|
+
|
411
|
+
version = spec.version
|
200
412
|
|
201
413
|
message = "protoc for #{Platform::ARCH} not available at #{repo}/#{version}"
|
202
414
|
|
203
415
|
os = case Platform::OS
|
204
416
|
when 'darwin'
|
205
417
|
'osx'
|
206
|
-
when 'linux'
|
418
|
+
when 'linux', 'linux-android', 'linux-musl', 'linux-uclibc'
|
207
419
|
'linux'
|
208
420
|
when 'windows'
|
209
421
|
'windows'
|
@@ -212,7 +424,7 @@ module Configuration
|
|
212
424
|
end
|
213
425
|
|
214
426
|
cpu = case Platform::CPU
|
215
|
-
when '
|
427
|
+
when 'x86'
|
216
428
|
'x86_32'
|
217
429
|
when 'x86_64'
|
218
430
|
'x86_64'
|
@@ -226,20 +438,84 @@ module Configuration
|
|
226
438
|
raise NotImplementedError, message
|
227
439
|
end
|
228
440
|
|
229
|
-
"#{repo}/#{version}/protoc-#{version}-#{os}-#{cpu}.exe"
|
441
|
+
uri = "#{repo}/#{version}/protoc-#{version}-#{os}-#{cpu}.exe"
|
442
|
+
|
443
|
+
Gem::RemoteFetcher.fetcher.fetch_https(Gem::Uri.new("#{uri}.sha1"))
|
444
|
+
|
445
|
+
uri
|
446
|
+
rescue Gem::RemoteFetcher::FetchError
|
447
|
+
dependency_request = Gem::Resolver::DependencyRequest.new(dependency, nil)
|
448
|
+
|
449
|
+
versions = Gem::Resolver::BestSet.new.find_all(dependency_request).filter_map do |s|
|
450
|
+
s.version if s.platform == Gem::Platform::RUBY
|
451
|
+
end
|
452
|
+
|
453
|
+
versions.sort.reverse_each do |v|
|
454
|
+
uri = "#{repo}/#{v}/protoc-#{v}-#{os}-#{cpu}.exe"
|
455
|
+
|
456
|
+
Gem::RemoteFetcher.fetcher.fetch_https(Gem::Uri.new("#{uri}.sha1"))
|
457
|
+
|
458
|
+
return uri
|
459
|
+
rescue Gem::RemoteFetcher::FetchError
|
460
|
+
next
|
461
|
+
end
|
462
|
+
|
463
|
+
raise NotImplementedError, message
|
230
464
|
end
|
231
465
|
|
232
|
-
def
|
466
|
+
def embedded_sass_protocol
|
233
467
|
require 'json'
|
234
468
|
require 'open3'
|
235
|
-
require_relative 'embedded'
|
236
469
|
|
237
|
-
stdout, stderr, status = Open3.capture3(
|
470
|
+
stdout, stderr, status = Open3.capture3(RbConfig.ruby,
|
471
|
+
File.absolute_path('../../exe/sass', __dir__),
|
472
|
+
'--embedded',
|
473
|
+
'--version')
|
238
474
|
|
239
475
|
raise stderr unless status.success?
|
240
476
|
|
241
477
|
tag_name = JSON.parse(stdout)['protocolVersion']
|
242
478
|
|
243
|
-
"https://github.com/sass/embedded-protocol
|
479
|
+
"https://github.com/sass/sass/raw/embedded-protocol-#{tag_name}/spec/embedded_sass.proto"
|
480
|
+
rescue StandardError # TODO: remove after https://github.com/sass/dart-sass/pull/2413
|
481
|
+
'https://github.com/sass/sass/raw/HEAD/spec/embedded_sass.proto'
|
482
|
+
end
|
483
|
+
|
484
|
+
def development?
|
485
|
+
File.exist?('../../Gemfile')
|
486
|
+
end
|
487
|
+
|
488
|
+
def gem_version
|
489
|
+
require_relative '../../lib/sass/embedded/version'
|
490
|
+
|
491
|
+
development? ? dart_sass_version : Sass::Embedded::VERSION
|
492
|
+
end
|
493
|
+
|
494
|
+
def gem_platform
|
495
|
+
platform = Gem::Platform.new("#{Platform::CPU}-#{RbConfig::CONFIG['host_os']}")
|
496
|
+
case Platform::OS
|
497
|
+
when 'darwin'
|
498
|
+
case platform.cpu
|
499
|
+
when 'aarch64'
|
500
|
+
Gem::Platform.new(['arm64', platform.os])
|
501
|
+
else
|
502
|
+
platform
|
503
|
+
end
|
504
|
+
when 'linux'
|
505
|
+
if platform.version&.start_with?('gnu')
|
506
|
+
platform
|
507
|
+
else
|
508
|
+
Gem::Platform.new([platform.cpu, platform.os, "gnu#{platform.version}"])
|
509
|
+
end
|
510
|
+
when 'windows'
|
511
|
+
case platform.cpu
|
512
|
+
when 'x86_64'
|
513
|
+
Gem::Platform.new('x64-mingw-ucrt')
|
514
|
+
else
|
515
|
+
Gem::Platform.new([platform.cpu, 'mingw', 'ucrt'])
|
516
|
+
end
|
517
|
+
else
|
518
|
+
platform
|
519
|
+
end
|
244
520
|
end
|
245
521
|
end
|