svelte: Application won't compile - "cannot read property 'n' of undefined" since 3.16.1

Describe the bug

Upgrading an existing app to Svelte 3.16.1 causes client compilation to fail with the error Cannot read property 'n' of undefined.

I’m the second person to see this in the discord, it seems. I don’t know where the error comes from or what the causes is (but I do see that the variable n is used a lot in recent Svelte commits - https://github.com/sveltejs/svelte/commit/bb5cf9ada7706fed9bb86467d2ae78c76f88b9d0).

Logs

ant@xeno  ~/Projects/beyonk-dashboard   master ●  npm run dev

beyonk-dashboard@0.3.0 dev /home/ant/Projects/beyonk-dashboard PORT=1233 NODE_CONFIG_ENV=${NODE_ENV} sapper dev

✗ client Cannot read property ‘n’ of undefined

To Reproduce I’m afraid I simply don’t know, at present.

Expected behavior The client should compile as normal.

Information about your Svelte project:

  • Your operating system: Ubuntu 19.04

  • Svelte version 3.16.1

  • Rollup

Severity Blocker. It’s broken, and my app won’t start.

Additional context The app was previously using 3.15, and trying 3.16.0 wouldn’t start either, due to an issue with reduce with no initial value.

About this issue

  • Original URL
  • State: closed
  • Created 5 years ago
  • Reactions: 5
  • Comments: 17 (13 by maintainers)

Commits related to this issue

Most upvoted comments

  • In continuation to what @antony said above, the issue is also caused by a carriage return of an empty component, like so:
<A>

</A>

The error goes away if you write <A></A>

This is what I meant by point #3 above. It’s not the sole cause though. You also need exactly 31 variable declarations.

I took the code from @dimfeld 's repro (thanks!) and took the List.svelte component out and started to trim it back.

This is as minimal as I can get it without making the error disappear:

https://svelte.dev/repl/909f45b7a2234ad2804d3dcecd59a54b?version=3.16.1

It seems to occur when you have exactly 31 variables declared and a component declaration.

Note:

  • The component declaration is essential
  • The number of variables is essential (31)
  • The component must be declared with opening and closing tags on different lines

Here’s a reproduction: https://svelte.dev/repl/5357a38fcfc6441ebcf162fa5d307a12?version=3.16.1

This just imports the svelte-select library. I haven’t reduced this to a minimal test case, but hopefully it helps you figure this out. It appears to be failing on the file List.svelte inside svelte-select.

<script>
	import Select from 'svelte-select';
</script>

This script should try to compile all components in the project and allow the full stack trace and breakpoints using the built-in Node debugger.

Not sure if it needs tweaking for sapper though.

const svelte = require('svelte/compiler');
const fs     = require('fs');
const glob   = require('glob');

function do_compile(err,data) {
    if (err) {
        console.log("Couldn't read file:", err);
        process.exit(-1);
    }

    let result = svelte.compile(data);
}

function call_svelte(err, files) {
    if (err) {
        console.log("Glob error:", err);
        process.exit(-1);
    }

    files.forEach(f => {
        fs.readFile(f, {encoding:"utf8"}, do_compile);
    });
}

glob('src/*.svelte', call_svelte);
glob('src/**/*.svelte', call_svelte);