1

If I add just the following lines to my config/initializers/assets.rb on Rails 5.1 I get an asset compilation error:

assets = Rails.application.config.assets
assets.version = '1.0'
assets.paths << Rails.root.join('node_modules')

Of course, this file did contain more lines, but I've stripped it right back as part of trying to debug this. I've also emptied the application.coffee and application.scss files of all content.

This is the compilation error with --trace and RAILS_ENV=production

** Execute assets:precompile
I, [2019-07-26T19:58:48.269791 #86008]  INFO -- : Writing /Users/samuelstickland/development/hubbado_core/public/assets/application-f78f0f583e152fa235ca51f99bab70d1aeb59675de57c78bcef18b5a2e8a5a5f.js
I, [2019-07-26T19:58:48.271029 #86008]  INFO -- : Writing /Users/samuelstickland/development/hubbado_core/public/assets/application-f78f0f583e152fa235ca51f99bab70d1aeb59675de57c78bcef18b5a2e8a5a5f.js.gz
rake aborted!
ExecJS::RuntimeError: SyntaxError: Unexpected token: operator (>)
JS_Parse_Error.get ((execjs):3538:621)
(execjs):4060:48
(execjs):1:102
Object.<anonymous> ((execjs):1:120)
Module._compile (internal/modules/cjs/loader.js:689:30)
Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
Module.load (internal/modules/cjs/loader.js:599:32)
tryModuleLoad (internal/modules/cjs/loader.js:538:12)
Function.Module._load (internal/modules/cjs/loader.js:530:3)
Function.Module.runMain (internal/modules/cjs/loader.js:742:12)
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/execjs-2.7.0/lib/execjs/external_runtime.rb:39:in `exec'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/execjs-2.7.0/lib/execjs/external_runtime.rb:21:in `eval'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/execjs-2.7.0/lib/execjs/external_runtime.rb:46:in `call'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/uglifier-3.2.0/lib/uglifier.rb:195:in `run_uglifyjs'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/uglifier-3.2.0/lib/uglifier.rb:157:in `compile'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/uglifier_compressor.rb:53:in `call'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/uglifier_compressor.rb:28:in `call'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/processor_utils.rb:75:in `call_processor'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/processor_utils.rb:57:in `block in call_processors'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/processor_utils.rb:56:in `reverse_each'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/processor_utils.rb:56:in `call_processors'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/loader.rb:134:in `load_from_unloaded'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/loader.rb:60:in `block in load'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/loader.rb:317:in `fetch_asset_from_dependency_cache'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/loader.rb:44:in `load'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/cached_environment.rb:20:in `block in initialize'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/cached_environment.rb:47:in `load'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/base.rb:66:in `find_asset'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/base.rb:73:in `find_all_linked_assets'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/manifest.rb:142:in `block in find'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:114:in `block (2 levels) in logical_paths'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:228:in `block in stat_tree'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:212:in `block in stat_directory'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `each'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `stat_directory'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:227:in `stat_tree'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:231:in `block in stat_tree'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:212:in `block in stat_directory'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `each'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `stat_directory'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:227:in `stat_tree'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:231:in `block in stat_tree'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:212:in `block in stat_directory'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `each'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `stat_directory'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:227:in `stat_tree'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:231:in `block in stat_tree'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:212:in `block in stat_directory'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `each'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:209:in `stat_directory'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/path_utils.rb:227:in `stat_tree'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:105:in `each'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:105:in `block in logical_paths'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:104:in `each'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/legacy.rb:104:in `logical_paths'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/manifest.rb:140:in `find'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/sprockets/manifest.rb:186:in `compile'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:68:in `block (3 levels) in define'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-3.7.2/lib/rake/sprocketstask.rb:147:in `with_logger'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/sprockets-rails-3.2.1/lib/sprockets/rails/task.rb:67:in `block (2 levels) in define'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/task.rb:273:in `block in execute'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/task.rb:273:in `each'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/task.rb:273:in `execute'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/task.rb:214:in `block in invoke_with_call_chain'
/Users/samuelstickland/.rvm/rubies/ruby-2.5.1/lib/ruby/2.5.0/monitor.rb:226:in `mon_synchronize'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/task.rb:194:in `invoke_with_call_chain'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/task.rb:183:in `invoke'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/application.rb:160:in `invoke_task'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/application.rb:116:in `block (2 levels) in top_level'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/application.rb:116:in `each'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/application.rb:116:in `block in top_level'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/application.rb:125:in `run_with_threads'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/application.rb:110:in `top_level'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/application.rb:83:in `block in run'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/application.rb:186:in `standard_exception_handling'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/lib/rake/application.rb:80:in `run'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/gems/rake-12.3.2/exe/rake:27:in `<top (required)>'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/bin/rake:23:in `load'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/bin/rake:23:in `<main>'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/bin/ruby_executable_hooks:24:in `eval'
/Users/samuelstickland/.rvm/gems/ruby-2.5.1/bin/ruby_executable_hooks:24:in `<main>'
Tasks: TOP => assets:precompile

I am completely stumped as to where this error could be coming from given that I wouldn't expect anything to be compiled as a result of the empty application.coffee/scss, except images.

In fact, after running an assets:precompile without the node_modules includes I get only the following JS and CSS files:

$ find ./public/assets/ -name "*.js"
./public/assets//application-f78f0f583e152fa235ca51f99bab70d1aeb59675de57c78bcef18b5a2e8a5a5f.js
./public/assets//active_admin-f78f0f583e152fa235ca51f99bab70d1aeb59675de57c78bcef18b5a2e8a5a5f.js

These are both 'empty', only containing (function(){}).call(this);

$ find ./public/assets/ -name "*.css"
./public/assets//active_admin/print-ef81b6a45bca13d9584a56677a4cc64d9cb053c768465f43ef448caf6f220216.css
./public/assets//active_admin-c1ac2e411944e447bcbf94ec2d97a0f2825ec0153bcbda2925f69da7ea6db226.css
./public/assets//application-e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855.css

Here the application.css asset is completely empty. The active admin files have a lot of CSS in though.

With node_modules in the assets path leads to the syntax error shown above.

Sam Stickland
  • 637
  • 1
  • 6
  • 17
  • I've also tried the suggestion here, and all Uglifier can compile all the JS it finds: https://stackoverflow.com/a/49055824/4075554 – Sam Stickland Jul 26 '19 at 19:29

1 Answers1

0

OK, so it turns out that sprockets will hungrily process any JS it finds in a directory named application!

I found this by changing my uglifier to handle ES6 syntax:

config.assets.js_compressor = Uglifier.new(harmony: true)

And then discovered that the assets compile had produced another JS file:

./public/assets//@schematics/angular/application/index-7cb879a643459c580f46b4127272b2918753e9941c074dcf27faea589ca610de.js
./public/assets//application-f78f0f583e152fa235ca51f99bab70d1aeb59675de57c78bcef18b5a2e8a5a5f.js

The file is coming from here:

$ find ./node_modules/ | grep -E "application/.*.js$"
./node_modules//@schematics/angular/application/index.js
./node_modules//@schematics/angular/application/files/karma.conf.js
./node_modules//@schematics/angular/application/files/protractor.conf.js
Sam Stickland
  • 637
  • 1
  • 6
  • 17