You can clone with
HTTPS or Subversion.
Currently the map is generated but mentions compiled .js file as "sources". AFAIK it should go for a set of original filenames.
The main problem here is that --join mashes together the CoffeeScript input before running a compile on the whole thing. To fix this you'd have to perform the compilation separately, which breaks things, or record the line offsets for where each file begins, and special-case this in the source map generation.
+1 (yes, I'm affected by this one as well)
I believe @jwalton has plans to address this sometime in the medium-near future. I'll defer to him on the wisest implementation.
Well, it's certainly something I've been thinking about, but I'm not sure I know how to solve it.
What should happen, from a source-map standards perspective, is that "sources" should be a list of .coffee files, and then some of these mappings should be of the five-field variety as we go from file to file.
I like @mintplant 's suggestion of recoding line offsets where each file begins. What I'm thinking is we pass in a list of (lineOffset, filename) pairs to coffee-script.coffee#compile(). I think we'd also change SourceMap.addMapping() to accept an extra "filename" parameter. So, as we build the source map, we figure out which file we're in based on the current line number from the joined code, subtract the lineOffset for that file, and use the resulting line number as the source line when we call addMapping().
@jwalton: it sounds like the way that --concat has been written forces you to do the whole thing backwards. Maybe it would be easier to fix or hook into the concat code?
I have an example of a single CommonJS module from many CoffeeScripts files debuggable in the browser and WebStorm using rebased map files. I can't reliably make Chrome stop at breakpoints.
The logic is here
This is something I will hopefully have a chance to look at soonish. Someone on my team just pulled in snockets and started using it to join together coffee files, so I suspect we need it now, too. :)
@jwalton I've taken over dev of snockets pthrasher/snockets and I've added srcmap support. I rewired a lot of how the internals work, but it will compile coffee, gen src maps, uglify all the other js and coffee srcs, and then concatenate the source maps and the js.
I'm still working out some kinks, and it's not yet up on NPM (just on github) but it's a solid start. The goal is to get this working 100%. Though, the project desperately needs more (read: thorough and complete) tests, and some optimizations.
Definitely take a look and let me know what you think. I have a working example of using it with grunt for one of my own projects if you'd like me to post that grunt task.
@pthrasher Definitely sounds interesting! @undashes (one of my co-workers) is probably interested in this, too.
@jwalton Cool, I've got a target date for snockets 2.0 of the end of the month. Keep an eye out, and if you would like any functionality added, let me know.
Just adding my to this feature request — it would be super helpful to be able to --join multiple coffeescript files into a single sourcemap with appropriate references to the individual source files.
Adding a to the "Affects me" stack.
+1 and @jwalton any new news?
When I added source map support to autoprefixer, which can also concatenate CSS, I solved the source map problem of joining files this way:
(Actually, I developed the Climap module to help with the above.)
The key was to join the AST:s, not the source strings.
I hope any of this helps.
I've had to deal with this too.
My solution was to use Cake to watch the 5 files being joined, concatenate the files into a single .coffee file when any one changed, then compile the concatenated files via the coffee command, with the map flag. It works quite well.
I've just looked into how other libraries accomplish this, sass for example adds an offset when you @include a file.
Why does --join exist at all?
In the end I don't have a combined file, but several single files that load each other by means of require.js. So I don't have tons of script-tags (only a single one) in the html-code and the SourceMaps work too.
@lydell --join places the compilation result of all the source files under the same function wrapper, so you don't have to export internal names. This can be achieved by compiling every source file with --bare, concatenating the results, and adding the function() wrapper yourself, but --join is more convenient.
He's not asking what this does, he's asking why coffee is doing it. And indeed, this should be in your build tool, not in the compiler.
The thing is, if I don't use join, my classes can't communicate, and if I don't use map, debugging is really not convenient, as the js file gets very long.
if I don't use join, my classes can't communicate
if I don't use join, my classes can't communicate
Don't naively concatenate your files together to share scope. That is so 1996. Today, we use ES6 modules or CommonJS requires and compile them to a single file if that's what we need. I recommend commonjs-everywhere.
All these issues can now be closed, yay!!
coffee -j deprecated so I use cat to join sources
related discussion: jashkenas/coffeescript#2779
the deprecated patch: jashkenas/coffeescript#3477