1010
1111CLEAN . 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
1515file 'protoc.exe' do |t |
1616 fetch ( ENV . fetch ( 'PROTOC_BIN' ) { SassConfig . default_protoc } , t . name )
1717 chmod 'a+x' , t . name
1818end
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
3030end
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+
3242file '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
0 commit comments