sass / dart-sass

The reference implementation of Sass, written in Dart.
https://sass-lang.com/dart-sass
MIT License
3.87k stars 350 forks source link

Null check operator used on a null value error since 1.76.0 #2239

Closed esb closed 3 months ago

esb commented 3 months ago

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.

ntkme commented 3 months ago
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 commented 3 months ago

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?

esb commented 3 months ago

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
ntkme commented 3 months ago

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 commented 3 months ago

@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 commented 3 months ago

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

esb commented 3 months ago

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