Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Closed
esb opened this issue May 10, 2024 · 7 comments · Fixed by #2241
Closed

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

esb opened this issue May 10, 2024 · 7 comments · Fixed by #2241
Labels

Comments

@esb
Copy link

esb commented May 10, 2024

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
Copy link
Contributor

ntkme commented May 10, 2024

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
Copy link
Contributor

ntkme commented May 10, 2024

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:

/// Returns an option that contains the value at [key] if one exists and null
/// otherwise.
Option<V> getOption(K key) => containsKey(key) ? (this[key]!,) : null;

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
Copy link
Author

esb commented May 10, 2024

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
Copy link
Contributor

ntkme commented May 10, 2024

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
Copy link
Contributor

ntkme commented May 10, 2024

@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
Copy link
Contributor

ntkme commented May 10, 2024

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

@esb
Copy link
Author

esb commented May 13, 2024

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
3 participants