Null check operator used on a null value error since 1.76.0
The SASS default handling now throws an exception since release 1.76.0
$white: #fff !default;
This code causes the error
Error: Null check operator used on a null value
This is from the Ruby gem sass-embedded. Reverting to release 1.75.0 solves the problem.
irb(main):001> require 'sass-embedded'
=> true
irb(main):002> puts Sass.info
sass-embedded 1.77.0 (Embedded Host) [Ruby]
dart-sass 1.77.0 (Sass Compiler) [Dart]
=> nil
irb(main):003> puts Sass.compile_string('$white: #fff !default;').css
=> nil
I cannot reproduce your concern. Can you please provide more details on how you're running sass, and if you have more sass files?
Null check operator used on a null value is indeed an error on Dart side, and the only code path changed between 1.75 and 1.77 where I see a null check operator is here:
https://github.com/sass/dart-sass/blob/85f39d5ad7056e0afeab4ad649fc34eaed8c89a5/lib/src/util/map.dart#L22-L24
This code path is used for importer caching. So for us to help you we really need to know how you're invoking Sass. Are you using dartsass-rails or dartsass-sprockets and how do you run sass?
This is part of a massive Rails build using Sprockets and sassc.
The gems being used are
dartsass-sprockets (3.1.0) sass-embedded (1.76.0 x86_64-linux-gnu) sassc (2.4.0) sassc-embedded (1.76.0)
The sass code that's throwing the crash comes from @uppy, so I have the following import statement which causes the crash. This file imports another file with a bunch of variable initializations using the !default syntax.
@import '@uppy/core/src/style.scss';
I'm not sure how to break it down more than that. Everything works at 1.75.0 and then breaks with 1.76.0 and 1.77.0.
Error: Null check operator used on a null value
╷
1 │ @import '@uppy/core/src/_variables.scss';
│ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
╵
/vagrant/node_modules/@uppy/core/src/_utils.scss 1:9 @import
/vagrant/node_modules/@uppy/dashboard/src/style.scss 1:9 @import
/vagrant/app/assets/stylesheets/toolbox.scss.erb 82:9 root stylesheet
Here is a bare minimum reproduction with embedded-host-node:
npm i sass-embedded @uppy/core
const sass = require('sass-embedded')
const input = `
@import '@uppy/core/src/style';
@import '@uppy/core/src/style';
`;
sass.compileString(input, {
importers: [
{
findFileUrl () {
return null
}
}
],
loadPaths: ['does_not_resolve', 'node_modules']
})
Very same reproduction for embedded-host-ruby:
require 'sass-embedded'
input = <<~SCSS
@import '@uppy/core/src/style';
@import '@uppy/core/src/style';
SCSS
begin
Sass.compile_string(
input,
importers: [
{ find_file_url: ->(*) {} }
],
load_paths: ['does_not_resolve', 'node_modules']
)
rescue Sass::CompileError => e
puts e.full_message
end
@nex3 Actually the bug is more than just this... In summary the condition is that:
- First importer is not cacheable, returning null.
- Second importer load path returning null.
- Third importer load path resolves.
- The same file is loaded the second time in the same way, exercising the cache.
In the ruby host we crash in the test case above because I delayed the implementation of tracking access of containing_url, and the first condition met. However, in embedded-host-node, it met the first condition because I forget to setting containingUrlUnused on this line: https://github.com/sass/embedded-host-node/blob/bce32f3e8f29494c0a64dd2b4c23cfdc48ec7880/lib/src/importer-registry.ts#L212
Preparing a PR right now.
@esb https://rubygems.org/gems/sass-embedded/versions/1.77.1 has been released. Please give it a try.
I have tested 1.77.1 in my environment and can report that the issue appears to have been resolved.