systemjs / builder

SystemJS build tool
MIT License
465 stars 122 forks source link

Builder fails silently once typescript is updated to 2.3.1+ #828

Open jamesbrobb opened 7 years ago

jamesbrobb commented 7 years ago

Versions

systemjs-builder: 0.16.9 (also tested and confirmed with 0.15.34) typescript: 2.3.1+ (the issue does not exist with 2.3.0)

Issue

Yesterday i updated a project to typescript 2.4.2 (from 2.2.2) and my gulp build script started to fail silently. I've recreated a bare bones, minimal recreation of the issue here:

https://github.com/jamesbrobb/systemjs-builder-typescript-2.3.1--issue

So far i've managed to trace it to this point:

https://github.com/systemjs/builder/blob/master/lib/trace.js#L509

But i'm struggling to work out which bit of code actually gets called by loader.translate to determine where the actual failure occurs? I'll continue to see if i can debug it further to work out the source of the issue.

jamesbrobb commented 7 years ago

I've tracked the issue down to here (as this verion of systemjs-builder currently uses systemjs 0.19.47):

https://github.com/systemjs/systemjs/blob/0.19.47/dist/system.src.js#L3544

It looks like something has changed in typescript 2.3.1 which means that it's now detected as esm by the esmRegEx. So the if block on line 3544 gets run, which in turn causes the builder to silently fail.

I've forced the typescript source to not be detected as esm in my local version and everything works correctly and the build completes and outputs the file. But i'm afraid fixing the regex (or what's expected from it) is a bit beyond me.

Took a while to work out, but at least this made me smile ;)

good enough ES6 module detection regex - format detections not designed to be accurate, but to handle the 99% use case

aluanhaddad commented 7 years ago

Use package or meta configuration to target typescript and specify format: "cjs". The better solution though is to use plugin-typescript.

jamesbrobb commented 7 years ago

@aluanhaddad thanks for the quick response.

Unfortunately setting the format to cjs (in either packages or meta) results in the following error:

{ Error on translate for main at file:///Users/blah/blah/project/src/main.ts
        (SystemJS) ENOENT: no such file or directory, open '/Users/blah/blah/project/src/fs'
        Error: ENOENT: no such file or directory, open '/Users/blah/blah/project/src/fs'
            at Error (native)
        Error loading /Users/blah/blah/project/src/fs as "fs" from /Users/blah/blah/project/node_modules/typescript/lib/typescript.js
        Unable to load transpiler to transpile /Users/blah/blah/project/src/main.ts
  originalErr: 
   { Error: ENOENT: no such file or directory, open '/Users/blah/blah/project/src/fs'
       at Error (native)
     errno: -2,
     code: 'ENOENT',
     syscall: 'open',
     path: '/Users/blah/blah/project/src/fs' } }
jamesbrobb commented 7 years ago

Installing and configuring plugin-typescript fixed the issue, thanks

aluanhaddad commented 7 years ago

Yeah I forgot all of the other configuration that you need to add in addition to format.

plugin-typescript helps handle that.

I'm glad you got it working and I hope others find this discussion useful.