diff --git a/package/__tests__/environment.js b/package/__tests__/environment.js new file mode 100644 index 000000000..83e5b9d58 --- /dev/null +++ b/package/__tests__/environment.js @@ -0,0 +1,77 @@ +/* global test expect, describe */ + +// environment.js expects to find config/webpacker.yml and resolved modules from +// the root of a Rails project +const cwd = process.cwd(); +const chdirApp = () => process.chdir('test/test_app') +const chdirCwd = () => process.chdir(cwd) +chdirApp(); + +const { resolve, join } = require('path') +const { sync } = require('glob') +const assert = require('assert') + +const { ConfigList, ConfigObject } = require('../config_types') + +const Environment = require('../environment') + +describe('Environment', () => { + afterAll(chdirCwd); + + let environment; + + describe('toWebpackConfig', () => { + beforeEach(() => { + environment = new Environment() + }) + + test('should return entry', () => { + const config = environment.toWebpackConfig() + expect(config.entry.application).toEqual(resolve('app', 'javascript', 'packs', 'application.js')) + }) + + test('should return output', () => { + const config = environment.toWebpackConfig() + expect(config.output.filename).toEqual('[name]-[chunkhash].js') + expect(config.output.chunkFilename).toEqual('[name]-[chunkhash].chunk.js') + expect(config.output.path).toEqual(resolve('public', 'packs-test')) + expect(config.output.publicPath).toEqual('/packs-test/') + }) + + test('should return default loader rules for each file in config/loaders', () => { + const config = environment.toWebpackConfig() + const rules = Object.keys(require('../rules')) + const [{ oneOf: configRules }] = config.module.rules; + + expect(rules.length).toBeGreaterThan(1) + expect(configRules.length).toEqual(rules.length) + }) + + test('should return default plugins', () => { + const config = environment.toWebpackConfig() + expect(config.plugins.length).toEqual(4) + }) + + test('should return default resolveLoader', () => { + const config = environment.toWebpackConfig() + expect(config.resolveLoader.modules).toEqual(['node_modules']) + }) + + test('should return default resolve.modules with additions', () => { + const config = environment.toWebpackConfig() + expect(config.resolve.modules).toEqual([ + resolve('app', 'javascript'), + 'node_modules', + 'app/assets', + '/etc/yarn', + ]) + }) + + test('returns plugins property as Array', () => { + const config = environment.toWebpackConfig() + + expect(config.plugins).toBeInstanceOf(Array) + expect(config.plugins).not.toBeInstanceOf(ConfigList) + }) + }) +}) diff --git a/package/utils/__tests__/objectify.js b/package/utils/__tests__/objectify.js index dfe3030bc..2c64c6248 100644 --- a/package/utils/__tests__/objectify.js +++ b/package/utils/__tests__/objectify.js @@ -1,4 +1,5 @@ /* global test expect */ +console.log('objectify test cwd', process.cwd()); const objectify = require('../objectify') diff --git a/test/test_app/app/javascript/packs/application.js b/test/test_app/app/javascript/packs/application.js new file mode 100644 index 000000000..54b106ee0 --- /dev/null +++ b/test/test_app/app/javascript/packs/application.js @@ -0,0 +1,10 @@ +/* eslint no-console:0 */ +// This file is automatically compiled by Webpack, along with any other files +// present in this directory. You're encouraged to place your actual application logic in +// a relevant structure within app/javascript and only use these pack files to reference +// that code so it'll be compiled. +// +// To reference this file, add <%= javascript_pack_tag 'application' %> to the appropriate +// layout file, like app/views/layouts/application.html.erb + +console.log('Hello World from Webpacker') diff --git a/test/test_app/config/webpacker.yml b/test/test_app/config/webpacker.yml new file mode 100644 index 000000000..6ca3e8f3a --- /dev/null +++ b/test/test_app/config/webpacker.yml @@ -0,0 +1,65 @@ +# Note: You must restart bin/webpack-dev-server for changes to take effect + +default: &default + source_path: app/javascript + source_entry_path: packs + public_output_path: packs + cache_path: tmp/cache/webpacker + + # Additional paths webpack should lookup modules + # ['app/assets', 'engine/foo/app/assets'] + resolved_paths: + - app/assets + - /etc/yarn + + # Reload manifest.json on all requests so we reload latest compiled packs + cache_manifest: false + + extensions: + - .coffee + - .erb + - .js + - .jsx + - .ts + - .vue + - .sass + - .scss + - .css + - .png + - .svg + - .gif + - .jpeg + - .jpg + +development: + <<: *default + compile: true + + # Reference: https://webpack.js.org/configuration/dev-server/ + dev_server: + https: false + host: localhost + port: 3035 + public: localhost:3035 + hmr: false + # Inline should be set to true if using HMR + inline: true + overlay: true + disable_host_check: true + use_local_ip: false + +test: + <<: *default + compile: true + + # Compile test packs to a separate directory + public_output_path: packs-test + +production: + <<: *default + + # Production depends on precompilation of packs prior to booting for performance. + compile: false + + # Cache manifest.json for performance + cache_manifest: true diff --git a/yarn.lock b/yarn.lock index 9300558e3..ec6d92774 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1514,7 +1514,13 @@ date-now@^0.1.4: version "0.1.4" resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b" -debug@^2.2.0, debug@^2.6.8: +debug@^2.2.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351" + dependencies: + ms "0.7.2" + +debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -2290,7 +2296,18 @@ glob@^6.0.4: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: +glob@^7.0.0, glob@^7.0.3, glob@^7.0.5: + version "7.1.1" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.2" + once "^1.3.0" + path-is-absolute "^1.0.0" + +glob@^7.1.1, glob@^7.1.2, glob@~7.1.1: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: