shakapacker 6.0.0.rc.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.eslintignore +4 -0
- data/.eslintrc.js +14 -0
- data/.github/ISSUE_TEMPLATE/bug_report.md +20 -0
- data/.github/ISSUE_TEMPLATE/feature-request.md +18 -0
- data/.github/workflows/jest.yml +30 -0
- data/.github/workflows/js-lint.yml +31 -0
- data/.github/workflows/rubocop.yml +39 -0
- data/.github/workflows/ruby.yml +48 -0
- data/.gitignore +13 -0
- data/.node-version +1 -0
- data/.rubocop.yml +229 -0
- data/CHANGELOG.md +32 -0
- data/CONTRIBUTING.md +62 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +183 -0
- data/MIT-LICENSE +20 -0
- data/README.md +666 -0
- data/Rakefile +11 -0
- data/config/README.md +3 -0
- data/config/webpacker.yml +1 -0
- data/docs/customizing_babel_config.md +59 -0
- data/docs/deployment.md +116 -0
- data/docs/developing_webpacker.md +29 -0
- data/docs/troubleshooting.md +212 -0
- data/docs/v6_upgrade.md +158 -0
- data/gemfiles/Gemfile-rails-edge +12 -0
- data/gemfiles/Gemfile-rails.5.2.x +9 -0
- data/gemfiles/Gemfile-rails.6.0.x +9 -0
- data/gemfiles/Gemfile-rails.6.1.x +12 -0
- data/lib/install/application.js +15 -0
- data/lib/install/bin/webpacker +15 -0
- data/lib/install/bin/webpacker-dev-server +18 -0
- data/lib/install/bin/yarn +18 -0
- data/lib/install/binstubs.rb +4 -0
- data/lib/install/config/webpack/webpack.config.js +5 -0
- data/lib/install/config/webpacker.yml +64 -0
- data/lib/install/package.json +15 -0
- data/lib/install/template.rb +100 -0
- data/lib/shakapacker/utils/git_utils.rb +23 -0
- data/lib/shakapacker/utils/version_syntax_converter.rb +24 -0
- data/lib/tasks/webpacker/binstubs.rake +15 -0
- data/lib/tasks/webpacker/check_binstubs.rake +12 -0
- data/lib/tasks/webpacker/check_node.rake +31 -0
- data/lib/tasks/webpacker/check_yarn.rake +33 -0
- data/lib/tasks/webpacker/clean.rake +25 -0
- data/lib/tasks/webpacker/clobber.rake +20 -0
- data/lib/tasks/webpacker/compile.rake +45 -0
- data/lib/tasks/webpacker/info.rake +21 -0
- data/lib/tasks/webpacker/install.rake +17 -0
- data/lib/tasks/webpacker/verify_config.rake +14 -0
- data/lib/tasks/webpacker/verify_install.rake +4 -0
- data/lib/tasks/webpacker/yarn_install.rake +18 -0
- data/lib/tasks/webpacker.rake +19 -0
- data/lib/tasks/yarn.rake +38 -0
- data/lib/webpacker/commands.rb +79 -0
- data/lib/webpacker/compiler.rb +130 -0
- data/lib/webpacker/configuration.rb +111 -0
- data/lib/webpacker/dev_server.rb +72 -0
- data/lib/webpacker/dev_server_proxy.rb +33 -0
- data/lib/webpacker/dev_server_runner.rb +96 -0
- data/lib/webpacker/env.rb +43 -0
- data/lib/webpacker/helper.rb +161 -0
- data/lib/webpacker/instance.rb +41 -0
- data/lib/webpacker/manifest.rb +120 -0
- data/lib/webpacker/railtie.rb +63 -0
- data/lib/webpacker/runner.rb +23 -0
- data/lib/webpacker/version.rb +4 -0
- data/lib/webpacker/webpack_runner.rb +58 -0
- data/lib/webpacker.rb +46 -0
- data/package/__tests__/config.js +34 -0
- data/package/__tests__/dev_server.js +45 -0
- data/package/__tests__/development.js +35 -0
- data/package/__tests__/env.js +58 -0
- data/package/__tests__/index.js +9 -0
- data/package/__tests__/production.js +29 -0
- data/package/__tests__/staging.js +30 -0
- data/package/__tests__/test.js +25 -0
- data/package/babel/preset.js +41 -0
- data/package/config.js +32 -0
- data/package/configPath.js +3 -0
- data/package/dev_server.js +20 -0
- data/package/env.js +27 -0
- data/package/environments/__tests__/base.js +69 -0
- data/package/environments/base.js +116 -0
- data/package/environments/development.js +55 -0
- data/package/environments/production.js +79 -0
- data/package/environments/test.js +3 -0
- data/package/index.js +33 -0
- data/package/inliningCss.js +7 -0
- data/package/rules/babel.js +30 -0
- data/package/rules/coffee.js +6 -0
- data/package/rules/css.js +3 -0
- data/package/rules/erb.js +15 -0
- data/package/rules/file.js +23 -0
- data/package/rules/index.js +18 -0
- data/package/rules/less.js +22 -0
- data/package/rules/raw.js +5 -0
- data/package/rules/sass.js +16 -0
- data/package/rules/stylus.js +26 -0
- data/package/utils/get_style_rule.js +37 -0
- data/package/utils/helpers.js +51 -0
- data/package.json +71 -0
- data/rakelib/release.rake +57 -0
- data/test/command_test.rb +109 -0
- data/test/compiler_test.rb +68 -0
- data/test/configuration_test.rb +78 -0
- data/test/dev_server_runner_test.rb +81 -0
- data/test/dev_server_test.rb +47 -0
- data/test/engine_rake_tasks_test.rb +39 -0
- data/test/env_test.rb +23 -0
- data/test/helper_test.rb +159 -0
- data/test/manifest_test.rb +89 -0
- data/test/mounted_app/Rakefile +4 -0
- data/test/mounted_app/test/dummy/Rakefile +3 -0
- data/test/mounted_app/test/dummy/bin/rails +3 -0
- data/test/mounted_app/test/dummy/bin/rake +3 -0
- data/test/mounted_app/test/dummy/config/application.rb +10 -0
- data/test/mounted_app/test/dummy/config/environment.rb +3 -0
- data/test/mounted_app/test/dummy/config/webpacker.yml +75 -0
- data/test/mounted_app/test/dummy/config.ru +5 -0
- data/test/mounted_app/test/dummy/package.json +7 -0
- data/test/rake_tasks_test.rb +71 -0
- data/test/test_app/Rakefile +3 -0
- data/test/test_app/app/packs/entrypoints/application.js +10 -0
- data/test/test_app/app/packs/entrypoints/multi_entry.css +4 -0
- data/test/test_app/app/packs/entrypoints/multi_entry.js +4 -0
- data/test/test_app/bin/webpacker +14 -0
- data/test/test_app/bin/webpacker-dev-server +14 -0
- data/test/test_app/config/application.rb +11 -0
- data/test/test_app/config/environment.rb +4 -0
- data/test/test_app/config/initializers/inspect_autoload_paths.rb +1 -0
- data/test/test_app/config/webpack/webpack.config.js +0 -0
- data/test/test_app/config/webpacker.yml +77 -0
- data/test/test_app/config/webpacker_other_location.yml +79 -0
- data/test/test_app/config/webpacker_public_root.yml +18 -0
- data/test/test_app/config.ru +5 -0
- data/test/test_app/package.json +13 -0
- data/test/test_app/public/packs/manifest.json +50 -0
- data/test/test_app/some.config.js +0 -0
- data/test/test_app/yarn.lock +11 -0
- data/test/test_helper.rb +33 -0
- data/test/webpack_runner_test.rb +57 -0
- data/test/webpacker_test.rb +34 -0
- data/webpacker.gemspec +31 -0
- data/yarn.lock +4029 -0
- metadata +331 -0
@@ -0,0 +1,81 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
require "webpacker/dev_server_runner"
|
3
|
+
|
4
|
+
class DevServerRunnerTest < Webpacker::Test
|
5
|
+
def setup
|
6
|
+
@original_node_env, ENV["NODE_ENV"] = ENV["NODE_ENV"], "development"
|
7
|
+
@original_rails_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "development"
|
8
|
+
@original_webpacker_config = ENV["WEBPACKER_CONFIG"]
|
9
|
+
end
|
10
|
+
|
11
|
+
def teardown
|
12
|
+
ENV["NODE_ENV"] = @original_node_env
|
13
|
+
ENV["RAILS_ENV"] = @original_rails_env
|
14
|
+
ENV["WEBPACKER_CONFIG"] = @original_webpacker_config
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_run_cmd_via_node_modules
|
18
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
|
19
|
+
|
20
|
+
verify_command(cmd, use_node_modules: true)
|
21
|
+
end
|
22
|
+
|
23
|
+
def test_run_cmd_via_yarn
|
24
|
+
cmd = ["yarn", "webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
|
25
|
+
|
26
|
+
verify_command(cmd, use_node_modules: false)
|
27
|
+
end
|
28
|
+
|
29
|
+
def test_run_cmd_argv
|
30
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js", "--quiet"]
|
31
|
+
|
32
|
+
verify_command(cmd, argv: ["--quiet"])
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_run_cmd_argv_with_https
|
36
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js", "--https"]
|
37
|
+
|
38
|
+
dev_server = Webpacker::DevServer.new({})
|
39
|
+
def dev_server.host; "localhost"; end
|
40
|
+
def dev_server.port; "3035"; end
|
41
|
+
def dev_server.pretty?; false; end
|
42
|
+
def dev_server.https?; true; end
|
43
|
+
def dev_server.hmr?; false; end
|
44
|
+
Webpacker::DevServer.stub(:new, dev_server) do
|
45
|
+
verify_command(cmd, argv: ["--https"])
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def test_environment_variables
|
50
|
+
cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/webpack.config.js"]
|
51
|
+
env = Webpacker::Compiler.env.dup
|
52
|
+
ENV["WEBPACKER_CONFIG"] = env["WEBPACKER_CONFIG"] = "#{test_app_path}/config/webpacker_other_location.yml"
|
53
|
+
env["WEBPACK_SERVE"] = "true"
|
54
|
+
verify_command(cmd, env: env)
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def test_app_path
|
59
|
+
File.expand_path("test_app", __dir__)
|
60
|
+
end
|
61
|
+
|
62
|
+
def verify_command(cmd, use_node_modules: true, argv: [], env: Webpacker::Compiler.env)
|
63
|
+
cwd = Dir.pwd
|
64
|
+
Dir.chdir(test_app_path)
|
65
|
+
|
66
|
+
klass = Webpacker::DevServerRunner
|
67
|
+
instance = klass.new(argv)
|
68
|
+
mock = Minitest::Mock.new
|
69
|
+
mock.expect(:call, nil, [env, *cmd])
|
70
|
+
|
71
|
+
klass.stub(:new, instance) do
|
72
|
+
instance.stub(:node_modules_bin_exist?, use_node_modules) do
|
73
|
+
Kernel.stub(:exec, mock) { klass.run(argv) }
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
mock.verify
|
78
|
+
ensure
|
79
|
+
Dir.chdir(cwd)
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class DevServerTest < Webpacker::Test
|
4
|
+
def test_running?
|
5
|
+
refute Webpacker.dev_server.running?
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_host
|
9
|
+
with_rails_env("development") do
|
10
|
+
assert_equal Webpacker.dev_server.host, "localhost"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_port
|
15
|
+
with_rails_env("development") do
|
16
|
+
assert_equal Webpacker.dev_server.port, 3035
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_https?
|
21
|
+
with_rails_env("development") do
|
22
|
+
assert_equal Webpacker.dev_server.https?, false
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def test_protocol
|
27
|
+
with_rails_env("development") do
|
28
|
+
assert_equal Webpacker.dev_server.protocol, "http"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_host_with_port
|
33
|
+
with_rails_env("development") do
|
34
|
+
assert_equal Webpacker.dev_server.host_with_port, "localhost:3035"
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def test_pretty?
|
39
|
+
with_rails_env("development") do
|
40
|
+
refute Webpacker.dev_server.pretty?
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_default_env_prefix
|
45
|
+
assert_equal Webpacker::DevServer::DEFAULT_ENV_PREFIX, "WEBPACKER_DEV_SERVER"
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class EngineRakeTasksTest < Minitest::Test
|
4
|
+
def setup
|
5
|
+
remove_webpack_binstubs
|
6
|
+
end
|
7
|
+
|
8
|
+
def teardown
|
9
|
+
remove_webpack_binstubs
|
10
|
+
end
|
11
|
+
|
12
|
+
def test_task_mounted
|
13
|
+
output = Dir.chdir(mounted_app_path) { `rake -T` }
|
14
|
+
assert_includes output, "app:webpacker"
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_binstubs
|
18
|
+
Dir.chdir(mounted_app_path) { `bundle exec rake app:webpacker:binstubs` }
|
19
|
+
webpack_binstub_paths.each { |path| assert File.exist?(path) }
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def mounted_app_path
|
24
|
+
File.expand_path("mounted_app", __dir__)
|
25
|
+
end
|
26
|
+
|
27
|
+
def webpack_binstub_paths
|
28
|
+
[
|
29
|
+
"#{mounted_app_path}/test/dummy/bin/webpacker",
|
30
|
+
"#{mounted_app_path}/test/dummy/bin/webpacker-dev-server",
|
31
|
+
]
|
32
|
+
end
|
33
|
+
|
34
|
+
def remove_webpack_binstubs
|
35
|
+
webpack_binstub_paths.each do |path|
|
36
|
+
File.delete(path) if File.exist?(path)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/test/env_test.rb
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class EnvTest < Webpacker::Test
|
4
|
+
def test_current
|
5
|
+
assert_equal Webpacker.env, Rails.env
|
6
|
+
end
|
7
|
+
|
8
|
+
def test_custom_without_config
|
9
|
+
with_rails_env("foo") do
|
10
|
+
assert_equal Webpacker.env, "production"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_custom_with_config
|
15
|
+
with_rails_env("staging") do
|
16
|
+
assert_equal Webpacker.env, "staging"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_default
|
21
|
+
assert_equal Webpacker::Env::DEFAULT, "production"
|
22
|
+
end
|
23
|
+
end
|
data/test/helper_test.rb
ADDED
@@ -0,0 +1,159 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class HelperTest < ActionView::TestCase
|
4
|
+
tests Webpacker::Helper
|
5
|
+
|
6
|
+
attr_reader :request
|
7
|
+
|
8
|
+
def setup
|
9
|
+
@request = Class.new do
|
10
|
+
def send_early_hints(links) end
|
11
|
+
def base_url
|
12
|
+
"https://example.com"
|
13
|
+
end
|
14
|
+
end.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_asset_pack_path
|
18
|
+
assert_equal "/packs/bootstrap-300631c4f0e0f9c865bc.js", asset_pack_path("bootstrap.js")
|
19
|
+
assert_equal "/packs/bootstrap-c38deda30895059837cf.css", asset_pack_path("bootstrap.css")
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_asset_pack_url
|
23
|
+
assert_equal "https://example.com/packs/bootstrap-300631c4f0e0f9c865bc.js", asset_pack_url("bootstrap.js")
|
24
|
+
assert_equal "https://example.com/packs/bootstrap-c38deda30895059837cf.css", asset_pack_url("bootstrap.css")
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_image_pack_path
|
28
|
+
assert_equal "/packs/application-k344a6d59eef8632c9d1.png", image_pack_path("application.png")
|
29
|
+
assert_equal "/packs/static/image-c38deda30895059837cf.jpg", image_pack_path("image.jpg")
|
30
|
+
assert_equal "/packs/static/image-c38deda30895059837cf.jpg", image_pack_path("static/image.jpg")
|
31
|
+
assert_equal "/packs/static/nested/image-c38deda30895059837cf.jpg", image_pack_path("nested/image.jpg")
|
32
|
+
assert_equal "/packs/static/nested/image-c38deda30895059837cf.jpg", image_pack_path("static/nested/image.jpg")
|
33
|
+
end
|
34
|
+
|
35
|
+
def test_image_pack_url
|
36
|
+
assert_equal "https://example.com/packs/application-k344a6d59eef8632c9d1.png", image_pack_url("application.png")
|
37
|
+
assert_equal "https://example.com/packs/static/image-c38deda30895059837cf.jpg", image_pack_url("image.jpg")
|
38
|
+
assert_equal "https://example.com/packs/static/image-c38deda30895059837cf.jpg", image_pack_url("static/image.jpg")
|
39
|
+
assert_equal "https://example.com/packs/static/nested/image-c38deda30895059837cf.jpg", image_pack_url("nested/image.jpg")
|
40
|
+
assert_equal "https://example.com/packs/static/nested/image-c38deda30895059837cf.jpg", image_pack_url("static/nested/image.jpg")
|
41
|
+
end
|
42
|
+
|
43
|
+
def test_image_pack_tag
|
44
|
+
assert_equal \
|
45
|
+
"<img alt=\"Edit Entry\" src=\"/packs/application-k344a6d59eef8632c9d1.png\" width=\"16\" height=\"10\" />",
|
46
|
+
image_pack_tag("application.png", size: "16x10", alt: "Edit Entry")
|
47
|
+
assert_equal \
|
48
|
+
"<img alt=\"Edit Entry\" src=\"/packs/static/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
|
49
|
+
image_pack_tag("image.jpg", size: "16x10", alt: "Edit Entry")
|
50
|
+
assert_equal \
|
51
|
+
"<img alt=\"Edit Entry\" src=\"/packs/static/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
|
52
|
+
image_pack_tag("static/image.jpg", size: "16x10", alt: "Edit Entry")
|
53
|
+
assert_equal \
|
54
|
+
"<img alt=\"Edit Entry\" src=\"/packs/static/nested/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
|
55
|
+
image_pack_tag("nested/image.jpg", size: "16x10", alt: "Edit Entry")
|
56
|
+
assert_equal \
|
57
|
+
"<img alt=\"Edit Entry\" src=\"/packs/static/nested/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
|
58
|
+
image_pack_tag("static/nested/image.jpg", size: "16x10", alt: "Edit Entry")
|
59
|
+
assert_equal \
|
60
|
+
"<img srcset=\"/packs/static/image-2x-7cca48e6cae66ec07b8e.jpg 2x\" src=\"/packs/static/image-c38deda30895059837cf.jpg\" />",
|
61
|
+
image_pack_tag("static/image.jpg", srcset: { "static/image-2x.jpg" => "2x" })
|
62
|
+
end
|
63
|
+
|
64
|
+
def test_favicon_pack_tag
|
65
|
+
assert_equal \
|
66
|
+
"<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/application-k344a6d59eef8632c9d1.png\" />",
|
67
|
+
favicon_pack_tag("application.png", rel: "apple-touch-icon", type: "image/png")
|
68
|
+
assert_equal \
|
69
|
+
"<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/mb-icon-c38deda30895059837cf.png\" />",
|
70
|
+
favicon_pack_tag("mb-icon.png", rel: "apple-touch-icon", type: "image/png")
|
71
|
+
assert_equal \
|
72
|
+
"<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/mb-icon-c38deda30895059837cf.png\" />",
|
73
|
+
favicon_pack_tag("static/mb-icon.png", rel: "apple-touch-icon", type: "image/png")
|
74
|
+
assert_equal \
|
75
|
+
"<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/nested/mb-icon-c38deda30895059837cf.png\" />",
|
76
|
+
favicon_pack_tag("nested/mb-icon.png", rel: "apple-touch-icon", type: "image/png")
|
77
|
+
assert_equal \
|
78
|
+
"<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/nested/mb-icon-c38deda30895059837cf.png\" />",
|
79
|
+
favicon_pack_tag("static/nested/mb-icon.png", rel: "apple-touch-icon", type: "image/png")
|
80
|
+
end
|
81
|
+
|
82
|
+
def test_preload_pack_asset
|
83
|
+
if self.class.method_defined?(:preload_link_tag)
|
84
|
+
assert_equal \
|
85
|
+
%(<link rel="preload" href="/packs/fonts/fa-regular-400-944fb546bd7018b07190a32244f67dc9.woff2" as="font" type="font/woff2" crossorigin="anonymous">),
|
86
|
+
preload_pack_asset("fonts/fa-regular-400.woff2")
|
87
|
+
else
|
88
|
+
error = assert_raises do
|
89
|
+
preload_pack_asset("fonts/fa-regular-400.woff2")
|
90
|
+
end
|
91
|
+
|
92
|
+
assert_equal \
|
93
|
+
"You need Rails >= 5.2 to use this tag.",
|
94
|
+
error.message
|
95
|
+
end
|
96
|
+
end
|
97
|
+
|
98
|
+
def test_javascript_pack_tag
|
99
|
+
assert_equal \
|
100
|
+
%(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>\n) +
|
101
|
+
%(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>\n) +
|
102
|
+
%(<script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>\n) +
|
103
|
+
%(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js" defer="defer"></script>),
|
104
|
+
javascript_pack_tag("application", "bootstrap")
|
105
|
+
end
|
106
|
+
|
107
|
+
def test_javascript_pack_with_no_defer_tag
|
108
|
+
assert_equal \
|
109
|
+
%(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js"></script>\n) +
|
110
|
+
%(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js"></script>\n) +
|
111
|
+
%(<script src="/packs/application-k344a6d59eef8632c9d1.js"></script>\n) +
|
112
|
+
%(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js"></script>),
|
113
|
+
javascript_pack_tag("application", "bootstrap", defer: false)
|
114
|
+
end
|
115
|
+
|
116
|
+
def test_javascript_pack_tag_splat
|
117
|
+
assert_equal \
|
118
|
+
%(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>\n) +
|
119
|
+
%(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>\n) +
|
120
|
+
%(<script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>),
|
121
|
+
javascript_pack_tag("application", defer: true)
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_javascript_pack_tag_symbol
|
125
|
+
assert_equal \
|
126
|
+
%(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>\n) +
|
127
|
+
%(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>\n) +
|
128
|
+
%(<script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>),
|
129
|
+
javascript_pack_tag(:application)
|
130
|
+
end
|
131
|
+
|
132
|
+
def application_stylesheet_chunks
|
133
|
+
%w[/packs/1-c20632e7baf2c81200d3.chunk.css /packs/application-k344a6d59eef8632c9d1.chunk.css]
|
134
|
+
end
|
135
|
+
|
136
|
+
def hello_stimulus_stylesheet_chunks
|
137
|
+
%w[/packs/hello_stimulus-k344a6d59eef8632c9d1.chunk.css]
|
138
|
+
end
|
139
|
+
|
140
|
+
def test_stylesheet_pack_tag
|
141
|
+
assert_equal \
|
142
|
+
(application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
|
143
|
+
.map { |chunk| stylesheet_link_tag(chunk) }.join("\n"),
|
144
|
+
stylesheet_pack_tag("application", "hello_stimulus")
|
145
|
+
end
|
146
|
+
|
147
|
+
def test_stylesheet_pack_tag_symbol
|
148
|
+
assert_equal \
|
149
|
+
(application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
|
150
|
+
.map { |chunk| stylesheet_link_tag(chunk) }.join("\n"),
|
151
|
+
stylesheet_pack_tag(:application, :hello_stimulus)
|
152
|
+
end
|
153
|
+
|
154
|
+
def test_stylesheet_pack_tag_splat
|
155
|
+
assert_equal \
|
156
|
+
(application_stylesheet_chunks).map { |chunk| stylesheet_link_tag(chunk, media: "all") }.join("\n"),
|
157
|
+
stylesheet_pack_tag("application", media: "all")
|
158
|
+
end
|
159
|
+
end
|
@@ -0,0 +1,89 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class ManifestTest < Minitest::Test
|
4
|
+
def test_lookup_exception!
|
5
|
+
asset_file = "calendar.js"
|
6
|
+
|
7
|
+
error = assert_raises_manifest_missing_entry_error do
|
8
|
+
Webpacker.manifest.lookup!(asset_file)
|
9
|
+
end
|
10
|
+
|
11
|
+
assert_match "Webpacker can't find #{asset_file} in #{manifest_path}", error.message
|
12
|
+
end
|
13
|
+
|
14
|
+
def test_lookup_with_type_exception!
|
15
|
+
asset_file = "calendar"
|
16
|
+
|
17
|
+
error = assert_raises_manifest_missing_entry_error do
|
18
|
+
Webpacker.manifest.lookup!(asset_file, type: :javascript)
|
19
|
+
end
|
20
|
+
|
21
|
+
assert_match "Webpacker can't find #{asset_file}.js in #{manifest_path}", error.message
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_lookup_success!
|
25
|
+
assert_equal Webpacker.manifest.lookup!("bootstrap.js"), "/packs/bootstrap-300631c4f0e0f9c865bc.js"
|
26
|
+
end
|
27
|
+
|
28
|
+
def test_lookup_with_chunks_without_extension_success!
|
29
|
+
assert_equal ["/packs/bootstrap-300631c4f0e0f9c865bc.js"], Webpacker.manifest.lookup_pack_with_chunks!("bootstrap", type: :javascript)
|
30
|
+
end
|
31
|
+
|
32
|
+
def test_lookup_with_chunks_with_extension_success!
|
33
|
+
assert_equal ["/packs/bootstrap-300631c4f0e0f9c865bc.js"], Webpacker.manifest.lookup_pack_with_chunks!("bootstrap.js", type: :javascript)
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_lookup_with_chunks_without_extension_subdir_success!
|
37
|
+
assert_equal ["/packs/print/application-983b6c164a47f7ed49cd.css"], Webpacker.manifest.lookup_pack_with_chunks!("print/application", type: :css)
|
38
|
+
end
|
39
|
+
|
40
|
+
def test_lookup_with_chunks_with_extension_subdir_success!
|
41
|
+
assert_equal ["/packs/print/application-983b6c164a47f7ed49cd.css"], Webpacker.manifest.lookup_pack_with_chunks!("print/application.css", type: :css)
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_lookup_nil
|
45
|
+
assert_nil Webpacker.manifest.lookup("foo.js")
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_lookup_chunks_nil
|
49
|
+
assert_nil Webpacker.manifest.lookup_pack_with_chunks("foo.js")
|
50
|
+
end
|
51
|
+
|
52
|
+
def test_lookup_success
|
53
|
+
assert_equal Webpacker.manifest.lookup("bootstrap.js"), "/packs/bootstrap-300631c4f0e0f9c865bc.js"
|
54
|
+
end
|
55
|
+
|
56
|
+
def test_lookup_entrypoint_exception!
|
57
|
+
asset_file = "calendar"
|
58
|
+
|
59
|
+
error = assert_raises_manifest_missing_entry_error do
|
60
|
+
Webpacker.manifest.lookup_pack_with_chunks!(asset_file, type: :javascript)
|
61
|
+
end
|
62
|
+
|
63
|
+
assert_match "Webpacker can't find #{asset_file}.js in #{manifest_path}", error.message
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_lookup_entrypoint
|
67
|
+
application_entrypoints = [
|
68
|
+
"/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js",
|
69
|
+
"/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js",
|
70
|
+
"/packs/application-k344a6d59eef8632c9d1.js"
|
71
|
+
]
|
72
|
+
|
73
|
+
assert_equal Webpacker.manifest.lookup_pack_with_chunks!("application", type: :javascript), application_entrypoints
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def assert_raises_manifest_missing_entry_error(&block)
|
79
|
+
error = nil
|
80
|
+
Webpacker.config.stub :compile?, false do
|
81
|
+
error = assert_raises Webpacker::Manifest::MissingEntryError, &block
|
82
|
+
end
|
83
|
+
error
|
84
|
+
end
|
85
|
+
|
86
|
+
def manifest_path
|
87
|
+
File.expand_path File.join(File.dirname(__FILE__), "test_app/public/packs", "manifest.json").to_s
|
88
|
+
end
|
89
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
# Note: You must restart bin/webpacker-dev-server for changes to take effect
|
2
|
+
|
3
|
+
default: &default
|
4
|
+
source_path: app/packs
|
5
|
+
source_entry_path: entrypoints
|
6
|
+
public_output_path: packs
|
7
|
+
cache_path: tmp/webpacker
|
8
|
+
|
9
|
+
# Additional paths webpack should look up modules
|
10
|
+
# ['app/assets', 'engine/foo/app/assets']
|
11
|
+
additional_paths:
|
12
|
+
- app/assets
|
13
|
+
- /etc/yarn
|
14
|
+
|
15
|
+
# Reload manifest.json on all requests so we reload latest compiled packs
|
16
|
+
cache_manifest: false
|
17
|
+
|
18
|
+
extensions:
|
19
|
+
- .js
|
20
|
+
- .sass
|
21
|
+
- .scss
|
22
|
+
- .css
|
23
|
+
- .module.sass
|
24
|
+
- .module.scss
|
25
|
+
- .module.css
|
26
|
+
- .png
|
27
|
+
- .svg
|
28
|
+
- .gif
|
29
|
+
- .jpeg
|
30
|
+
- .jpg
|
31
|
+
|
32
|
+
development:
|
33
|
+
<<: *default
|
34
|
+
compile: true
|
35
|
+
|
36
|
+
# Reference: https://webpack.js.org/configuration/dev-server/
|
37
|
+
dev_server:
|
38
|
+
https: false
|
39
|
+
host: localhost
|
40
|
+
port: 3035
|
41
|
+
public: localhost:3035
|
42
|
+
hmr: false
|
43
|
+
# Inline should be set to true if using HMR
|
44
|
+
inline: true
|
45
|
+
overlay: true
|
46
|
+
disable_host_check: true
|
47
|
+
use_local_ip: false
|
48
|
+
|
49
|
+
test:
|
50
|
+
<<: *default
|
51
|
+
compile: true
|
52
|
+
|
53
|
+
# Compile test packs to a separate directory
|
54
|
+
public_output_path: packs-test
|
55
|
+
|
56
|
+
production:
|
57
|
+
<<: *default
|
58
|
+
|
59
|
+
# Production depends on precompilation of packs prior to booting for performance.
|
60
|
+
compile: false
|
61
|
+
|
62
|
+
# Cache manifest.json for performance
|
63
|
+
cache_manifest: true
|
64
|
+
|
65
|
+
staging:
|
66
|
+
<<: *default
|
67
|
+
|
68
|
+
# Production depends on precompilation of packs prior to booting for performance.
|
69
|
+
compile: false
|
70
|
+
|
71
|
+
# Cache manifest.json for performance
|
72
|
+
cache_manifest: true
|
73
|
+
|
74
|
+
# Compile staging packs to a separate directory
|
75
|
+
public_output_path: packs-staging
|
@@ -0,0 +1,71 @@
|
|
1
|
+
require "test_helper"
|
2
|
+
|
3
|
+
class RakeTasksTest < Minitest::Test
|
4
|
+
def test_rake_tasks
|
5
|
+
output = Dir.chdir(test_app_path) { `rake -T` }
|
6
|
+
assert_includes output, "webpacker"
|
7
|
+
assert_includes output, "webpacker:check_binstubs"
|
8
|
+
assert_includes output, "webpacker:check_node"
|
9
|
+
assert_includes output, "webpacker:check_yarn"
|
10
|
+
assert_includes output, "webpacker:clean"
|
11
|
+
assert_includes output, "webpacker:clobber"
|
12
|
+
assert_includes output, "webpacker:compile"
|
13
|
+
assert_includes output, "webpacker:install"
|
14
|
+
assert_includes output, "webpacker:verify_install"
|
15
|
+
end
|
16
|
+
|
17
|
+
def test_rake_task_webpacker_check_binstubs
|
18
|
+
output = Dir.chdir(test_app_path) { `rake webpacker:check_binstubs 2>&1` }
|
19
|
+
refute_includes output, "webpack binstub not found."
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_check_node_version
|
23
|
+
output = Dir.chdir(test_app_path) { `rake webpacker:check_node 2>&1` }
|
24
|
+
refute_includes output, "Webpacker requires Node.js"
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_check_yarn_version
|
28
|
+
output = Dir.chdir(test_app_path) { `rake webpacker:check_yarn 2>&1` }
|
29
|
+
refute_includes output, "Yarn not installed"
|
30
|
+
refute_includes output, "Webpacker requires Yarn"
|
31
|
+
end
|
32
|
+
|
33
|
+
def test_rake_webpacker_yarn_install_in_non_production_environments
|
34
|
+
assert_includes test_app_dev_dependencies, "right-pad"
|
35
|
+
|
36
|
+
Webpacker.with_node_env("test") do
|
37
|
+
Dir.chdir(test_app_path) do
|
38
|
+
`bundle exec rake webpacker:yarn_install`
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
assert_includes installed_node_module_names, "right-pad",
|
43
|
+
"Expected dev dependencies to be installed"
|
44
|
+
end
|
45
|
+
|
46
|
+
def test_rake_webpacker_yarn_install_in_production_environment
|
47
|
+
Webpacker.with_node_env("production") do
|
48
|
+
Dir.chdir(test_app_path) do
|
49
|
+
`bundle exec rake webpacker:yarn_install`
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
refute_includes installed_node_module_names, "right-pad",
|
54
|
+
"Expected only production dependencies to be installed"
|
55
|
+
end
|
56
|
+
|
57
|
+
private
|
58
|
+
def test_app_path
|
59
|
+
File.expand_path("test_app", __dir__)
|
60
|
+
end
|
61
|
+
|
62
|
+
def test_app_dev_dependencies
|
63
|
+
package_json = File.expand_path("package.json", test_app_path)
|
64
|
+
JSON.parse(File.read(package_json))["devDependencies"]
|
65
|
+
end
|
66
|
+
|
67
|
+
def installed_node_module_names
|
68
|
+
node_modules_path = File.expand_path("node_modules", test_app_path)
|
69
|
+
Dir.chdir(node_modules_path) { Dir.glob("*") }
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,10 @@
|
|
1
|
+
/* eslint no-console:0 */
|
2
|
+
// This file is automatically compiled by Webpack, along with any other files
|
3
|
+
// present in this directory. You're encouraged to place your actual application logic in
|
4
|
+
// a relevant structure within app/packs and only use these pack files to reference
|
5
|
+
// that code so it'll be compiled.
|
6
|
+
//
|
7
|
+
// To reference this file, add <%= javascript_pack_tag 'application' %> to the appropriate
|
8
|
+
// layout file, like app/views/layouts/application.html.erb
|
9
|
+
|
10
|
+
console.log('Hello World from Webpacker')
|