Webpacker (Ruby wrapper to webpack) uses RAILS_ENV-based environments while
the javascript configuration for webpack re-reads this configuration file using
the NODE_ENV environment variable. This means that when RAILS_ENV=test, running
“assets:precompile” compiled the production packs in “public/packs” while
webpacker expects them in “public/packs-test”. This causes Ruby to recompile
them on-the-fly, possibly leading to race conditions in parallel_tests.
This changes:
- Disables on-the-fly compilation in test environment
- Changes the javascript part to read the correct environment
Since 872a0d5bd8, assets URL are absolute and
not relative. Unfortunately, the domain used to build such URLs is the wrong
one: LOCAL_DOMAIN, and not WEB_DOMAIN, where the assets are stored.
* Use PNG images in HTML e-mails
* Make webpack use URLs with host so fonts load inside HTML e-mails
Convert this back to a relative URL in the premailer CSS loader
since local requests are quicker
* Improve responsive design
* Add missing PNG icon
* Configure webpack to poll for changes in development
Vagrant on Linux/macOS hosts shared files via NFS, which doens't
support inotify-based watching of files. This tweak makes webpack
check for changes every second, and rebuild if necessary. This
removes the need to restart Foreman every time a frontend file
changes. Note that rebuilding is still a relatively lengthy
process.
The polling frequency can be changed to taste.
* Only poll in Vagrant
This tests for the presence of the VAGRANT environment variable to
determine whether or not we're in Vagrant. It is set in .env.vagrant,
which is set up to be included in the Vagrantfile.
* Add support for selecting a theme
* Fix codeclimate issues
* Look up site default style if current user is not available due to e.g. not being logged in
* Remove outdated comment in common.js
* Address requested changes in themes PR
* Fix codeclimate issues
* Explicitly check current_account in application controller and only check theme availability if non-nil
* codeclimate
* explicit precedence with &&
* Fix code style in application_controller according to @nightpool's suggestion, use default style in embedded.html.haml
* codeclimate: indentation + return
Webpack seems to fail to import `react-intl/locale-data/*.js` if those
files has been proceed by babel, and this also breaks applying our translation.
Note that this won't be a problem on English locale, because react-intl
includes it as default and works fine without manually added locale-data.
Also this issue seems to only occurs on production build, but I'm not sure
about reason.
This implementation is a bit smaller and still has the following benefits:
* No need of app/javascript/packs/custom.js
For custom stylesheet, it typically has only
"require('../styles/custom.scss')" and is redundant.
* No need to extract vendor stylesheet to another asset
Extracting vendor stylesheet could be forgotten by developers who do not
use custom stylesheet.
* Path should not be constructed manually. Use path.join to ensure compatibility.
* Path should not be constructed manually. Use path.join to ensure compatibility.
* Fix regexp.
* Fix my own stupidity.
I forgot to check outside my test script the regexp...
Because Nanobox doesn't run data components in the same container as the code, there are a few tweaks that need to be made in the configuration to get WebPack to work properly in development mode.
The same differences lead to needing to use `DATABASE_URL` by default in the `.env` file for Rails to work correctly.
Limitations of our `.env` loader for Node.js mean the `.env` file needs to be compiled everywhere in order to work, so we compile it in development, now, too. Also, all the `.env.production` tweaks have been consolidated into a single command.
Finally, since Nanobox actually creates the database when it sets up the database server, using the existence of the database alone to determine whether to migrate or setup is insufficient. So we add a condition to `rake db:migrate:setup` to check whether any migrations have run - if the database doesn't exist yet, `db:setup` will be called; if it does, but no migrations have been run, `db:migrate` and `db:seed` are called instead (the same basic idea as what `db:setup` does, but it skips `db:create`, which will only cause problems with an existing DB); otherwise, only `db:migrate` is called.
None of these changes should affect development, and all are designed not to interfere with existing behaviors in other environments.