dart-sass icon indicating copy to clipboard operation
dart-sass copied to clipboard

Null check operator used on a null value error since 1.76.0

Open esb opened this issue 1 year ago • 4 comments

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.

esb avatar May 10 '24 04:05 esb

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?

ntkme avatar May 10 '24 04:05 ntkme

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?

ntkme avatar May 10 '24 04:05 ntkme

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

esb avatar May 10 '24 04:05 esb

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

ntkme avatar May 10 '24 05:05 ntkme

@nex3 Actually the bug is more than just this... In summary the condition is that:

  1. First importer is not cacheable, returning null.
  2. Second importer load path returning null.
  3. Third importer load path resolves.
  4. 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.

ntkme avatar May 10 '24 21:05 ntkme

@esb https://rubygems.org/gems/sass-embedded/versions/1.77.1 has been released. Please give it a try.

ntkme avatar May 10 '24 23:05 ntkme

I have tested 1.77.1 in my environment and can report that the issue appears to have been resolved.

esb avatar May 13 '24 02:05 esb