wooorm / xdm

Just a *really* good MDX compiler. No runtime. With esbuild, Rollup, and webpack plugins
http://wooorm.com/xdm/
MIT License
593 stars 18 forks source link

esbuild errors result in "Cannot read property 'line' of undefined" error #75

Closed kentcdodds closed 3 years ago

kentcdodds commented 3 years ago

Initial checklist

Affected packages and versions: 1.12.2

Steps to reproduce

Still working on figuring out how to reproduce this reliably (for a separate issue I'm working on actually).

Expected behavior

Useful error messages when compiling fails.

Actual behavior

When there's an error in compiling MDX, xdm tries to construct a helpful error message, but ends up erroring out in the process resulting in a very unhelpful error message. Here's what it looks like:

> ../node_modules/esbuild/lib/main.js:869:27: error: [plugin: esbuild-xdm] Cannot read property 'line' of undefined
   869 │               let result = await callback2({
       ╵                            ^
   at onload (file:///Users/kentcdodds/code/remix-kentcdodds/node_modules/xdm/lib/integration/esbuild.js:172:17)
   at processTicksAndRejections (node:internal/process/task_queues:96:5)
   at callback (/Users/kentcdodds/code/remix-kentcdodds/node_modules/esbuild/lib/main.js:869:28)
   at handleRequest (/Users/kentcdodds/code/remix-kentcdodds/node_modules/esbuild/lib/main.js:652:30)
  ../node_modules/esbuild/lib/main.js:736:22: note: This error came from the "onLoad" callback registered here
   736 │         let promise = setup({
       ╵                       ^
   at setup (file:///Users/kentcdodds/code/remix-kentcdodds/node_modules/xdm/lib/integration/esbuild.js:69:11)
   at handlePlugins (/Users/kentcdodds/code/remix-kentcdodds/node_modules/esbuild/lib/main.js:736:23)
   at Object.buildOrServe (/Users/kentcdodds/code/remix-kentcdodds/node_modules/esbuild/lib/main.js:1024:7)
   at /Users/kentcdodds/code/remix-kentcdodds/node_modules/esbuild/lib/main.js:1754:17
   at new Promise (<anonymous>)
   at Object.build (/Users/kentcdodds/code/remix-kentcdodds/node_modules/esbuild/lib/main.js:1753:14)
   at Object.build (/Users/kentcdodds/code/remix-kentcdodds/node_modules/esbuild/lib/main.js:1629:51)
   at bundleMDX (/Users/kentcdodds/code/remix-kentcdodds/node_modules/mdx-bundler/dist/index.js:202:33)
   at processTicksAndRejections (node:internal/process/task_queues:96:5)
   at compileMdx (/Users/kentcdodds/code/remix-kentcdodds/build/index.js:664:18)
   at getFreshValue (/Users/kentcdodds/code/remix-kentcdodds/build/index.js:1234:17)
   at cachified (/Users/kentcdodds/code/remix-kentcdodds/build/index.js:1137:15)
   at getFreshValue (/Users/kentcdodds/code/remix-kentcdodds/build/index.js:1165:10)
   at cachified (/Users/kentcdodds/code/remix-kentcdodds/build/index.js:1137:15)
   at Object.loader18 (/Users/kentcdodds/code/remix-kentcdodds/build/index.js:8457:22)

This is going through mdx-bundler. The line that's erroring out is this one:

https://github.com/wooorm/xdm/blob/6585f00bc929641173b5bddd1a7f07f3ef2161f4/lib/integration/esbuild.js#L172

If I add console.error(error) right here, I get this output:

TypeError: Cannot read property '11' of undefined
    at lineStart (file:///Users/kentcdodds/code/remix-kentcdodds/node_modules/micromark-extension-gfm-table/lib/syntax.js:563:30)
    at go (/Users/kentcdodds/code/remix-kentcdodds/node_modules/micromark/dist/util/create-tokenizer.js:136:13)
    at main (/Users/kentcdodds/code/remix-kentcdodds/node_modules/micromark/dist/util/create-tokenizer.js:127:11)
    at Object.write (/Users/kentcdodds/code/remix-kentcdodds/node_modules/micromark/dist/util/create-tokenizer.js:70:5)
    at continueFlow (/Users/kentcdodds/code/remix-kentcdodds/node_modules/micromark/dist/initialize/document.js:119:15)
    at flowContinue (/Users/kentcdodds/code/remix-kentcdodds/node_modules/micromark/dist/initialize/document.js:97:7)
    at go (/Users/kentcdodds/code/remix-kentcdodds/node_modules/micromark/dist/util/create-tokenizer.js:136:13)
    at main (/Users/kentcdodds/code/remix-kentcdodds/node_modules/micromark/dist/util/create-tokenizer.js:130:9)
    at Object.write (/Users/kentcdodds/code/remix-kentcdodds/node_modules/micromark/dist/util/create-tokenizer.js:70:5)
    at fromMarkdown (/Users/kentcdodds/code/remix-kentcdodds/node_modules/xdm/node_modules/mdast-util-from-markdown/dist/index.js:26:34)
    at parse (/Users/kentcdodds/code/remix-kentcdodds/node_modules/xdm/node_modules/remark-parse/index.js:13:12)
    at Function.parse (/Users/kentcdodds/code/remix-kentcdodds/node_modules/xdm/node_modules/unified/index.js:271:12)
    at pipelineParse (/Users/kentcdodds/code/remix-kentcdodds/node_modules/xdm/node_modules/unified/index.js:23:16)
    at wrapped (/Users/kentcdodds/code/remix-kentcdodds/node_modules/xdm/node_modules/trough/wrap.js:25:19)
    at next (/Users/kentcdodds/code/remix-kentcdodds/node_modules/xdm/node_modules/trough/index.js:57:24)
    at Object.run (/Users/kentcdodds/code/remix-kentcdodds/node_modules/xdm/node_modules/trough/index.js:31:10) {
  fatal: true
}

I wouldn't call that very helpful, but it directs me at least to the source of the error much better 😅

I think the solution is to simply handle errors that lack location information better.

wooorm commented 3 years ago

Applied two fixes:

Hopefully when there are errors not they show up normally (even on current xdm). The second error should now be fixed as well when I release in a minute!

kentcdodds commented 3 years ago

Super! Thank you 👏