Skip to content

Commit 7804b0f

Browse files
authored
Support JS version of sass --embedded (#256)
1 parent 1f6a2c7 commit 7804b0f

File tree

3 files changed

+53
-25
lines changed

3 files changed

+53
-25
lines changed

Diff for: ext/sass/.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,7 @@
44
/dart-sass/
55
/embedded_sass.proto
66
/embedded_sass_pb.rb
7+
/package-lock.json
8+
/node_modules/
79
/protoc.exe
810
/ruby/

Diff for: ext/sass/Rakefile

+50-24
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ end
1010

1111
CLEAN.include %w[protoc.exe ruby *.proto *.tar.gz *.zip]
1212

13-
CLOBBER.include %w[dart-sass cli.rb embedded_sass_pb.rb]
13+
CLOBBER.include %w[dart-sass cli.rb embedded_sass_pb.rb node_modules package-lock.json]
1414

1515
file 'protoc.exe' do |t|
1616
fetch(ENV.fetch('PROTOC_BIN') { SassConfig.default_protoc }, t.name)
1717
chmod 'a+x', t.name
1818
end
1919

20-
file 'dart-sass' do |t|
20+
file 'dart-sass/sass' do |t|
2121
raise if ENV.key?('DART_SASS')
2222

2323
gem_install 'sass-embedded', SassConfig.gem_version, SassConfig.gem_platform do |dir|
@@ -29,34 +29,58 @@ rescue StandardError
2929
rm archive
3030
end
3131

32+
file 'node_modules/sass' do
33+
sh 'npm', 'install'
34+
end
35+
36+
task 'dart-sass' do
37+
Rake::Task['dart-sass/sass'].invoke
38+
rescue NotImplementedError
39+
Rake::Task['node_modules/sass'].invoke
40+
end
41+
3242
file 'cli.rb' => %w[dart-sass] do |t|
3343
require_relative '../../lib/sass/elf'
3444

35-
exe = 'dart-sass/sass'
36-
exe = "#{exe}#{['', '.bat', '.exe'].find { |ext| File.exist?("#{exe}#{ext}") }}"
45+
begin
46+
exe = 'dart-sass/sass'
47+
exe = "#{exe}#{['', '.bat', '.exe'].find { |ext| File.exist?("#{exe}#{ext}") }}"
3748

38-
raise "#{exe} not found" unless File.exist?(exe)
49+
raise Errno::ENOENT, exe unless File.exist?(exe)
3950

40-
runtime = 'dart-sass/src/dart'
41-
runtime = "#{runtime}#{['', '.exe'].find { |ext| File.exist?("#{runtime}#{ext}") }}"
42-
snapshot = 'dart-sass/src/sass.snapshot'
51+
runtime = 'dart-sass/src/dart'
52+
runtime = "#{runtime}#{['', '.exe'].find { |ext| File.exist?("#{runtime}#{ext}") }}"
53+
snapshot = 'dart-sass/src/sass.snapshot'
4354

44-
command = if File.exist?(runtime) && File.exist?(snapshot)
45-
[runtime, snapshot]
46-
else
47-
[exe]
48-
end
55+
command = if File.exist?(runtime) && File.exist?(snapshot)
56+
[runtime, snapshot]
57+
else
58+
[exe]
59+
end
4960

50-
interpreter = File.open(command[0], 'rb') do |file|
51-
Sass.const_get(:ELF).new(file).interpreter
52-
rescue ArgumentError
53-
nil
54-
end
61+
interpreter = File.open(command[0], 'rb') do |file|
62+
Sass.const_get(:ELF).new(file).interpreter
63+
rescue ArgumentError
64+
nil
65+
end
66+
67+
command_source = command.map do |argument|
68+
"File.absolute_path('#{argument}', __dir__).freeze"
69+
end.join(',
70+
')
71+
rescue Errno::ENOENT
72+
package = 'node_modules/sass'
73+
74+
script = File.join(package, SassConfig.package_json(package)['bin']['sass'])
5575

56-
command_source = command.map do |argument|
57-
"File.absolute_path('#{argument}', __dir__).freeze"
58-
end.join(',
76+
interpreter = nil
77+
78+
command_source = [
79+
"'node'",
80+
"File.absolute_path('#{script}', __dir__).freeze"
81+
].join(',
5982
')
83+
end
6084

6185
if interpreter.nil?
6286
File.write(t.name, <<~CLI_RB)
@@ -290,12 +314,14 @@ module SassConfig
290314

291315
module_function
292316

293-
def dart_sass_version
317+
def package_json(path = '.')
294318
require 'json'
295319

296-
spec = JSON.parse(File.read(File.absolute_path('package.json', __dir__)))
320+
JSON.parse(File.read(File.absolute_path('package.json', path)))
321+
end
297322

298-
spec['dependencies']['sass']
323+
def dart_sass_version
324+
package_json['dependencies']['sass']
299325
end
300326

301327
def default_dart_sass

Diff for: lib/sass/compiler/host.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ def version_request
116116

117117
case version_response.implementation_name
118118
when 'dart-sass'
119-
info << '[Dart]'
119+
info << (CLI::COMMAND.first == 'node' ? '[JavaScript]' : '[Dart]')
120120
end
121121

122122
info

0 commit comments

Comments
 (0)