webpacker 6.0.0.pre.2 → 6.0.0.rc.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/jest.yml +5 -2
  3. data/.github/workflows/js-lint.yml +5 -2
  4. data/.github/workflows/rubocop.yml +1 -1
  5. data/.github/workflows/ruby.yml +17 -14
  6. data/.node-version +1 -1
  7. data/.rubocop.yml +106 -0
  8. data/CHANGELOG.md +36 -9
  9. data/CONTRIBUTING.md +1 -1
  10. data/Gemfile.lock +93 -90
  11. data/README.md +363 -107
  12. data/config/README.md +3 -0
  13. data/config/webpacker.yml +1 -0
  14. data/docs/deployment.md +9 -29
  15. data/docs/developing_webpacker.md +29 -0
  16. data/docs/troubleshooting.md +57 -25
  17. data/docs/v6_upgrade.md +75 -0
  18. data/gemfiles/Gemfile-rails-edge +1 -1
  19. data/gemfiles/Gemfile-rails.6.1.x +12 -0
  20. data/lib/install/config/webpacker.yml +5 -7
  21. data/lib/install/{javascript/packs → packs/entrypoints}/application.js +4 -3
  22. data/lib/install/template.rb +17 -10
  23. data/lib/tasks/webpacker/binstubs.rake +2 -2
  24. data/lib/tasks/webpacker/check_node.rake +3 -0
  25. data/lib/tasks/webpacker/check_yarn.rake +4 -1
  26. data/lib/tasks/webpacker/clobber.rake +1 -1
  27. data/lib/tasks/webpacker/install.rake +2 -2
  28. data/lib/tasks/webpacker/verify_config.rake +14 -0
  29. data/lib/tasks/webpacker/verify_install.rake +1 -11
  30. data/lib/webpacker.rb +1 -1
  31. data/lib/webpacker/commands.rb +2 -1
  32. data/lib/webpacker/compiler.rb +9 -3
  33. data/lib/webpacker/configuration.rb +19 -8
  34. data/lib/webpacker/dev_server.rb +6 -0
  35. data/lib/webpacker/dev_server_runner.rb +7 -2
  36. data/lib/webpacker/env.rb +5 -1
  37. data/lib/webpacker/helper.rb +26 -50
  38. data/lib/webpacker/instance.rb +4 -0
  39. data/lib/webpacker/manifest.rb +1 -2
  40. data/lib/webpacker/railtie.rb +1 -2
  41. data/lib/webpacker/runner.rb +1 -1
  42. data/lib/webpacker/version.rb +1 -1
  43. data/lib/webpacker/webpack_runner.rb +1 -0
  44. data/package.json +25 -29
  45. data/package/__tests__/development.js +3 -2
  46. data/package/__tests__/env.js +8 -4
  47. data/package/__tests__/index.js +9 -0
  48. data/package/babel/preset.js +24 -14
  49. data/package/env.js +7 -1
  50. data/package/environments/__tests__/base.js +7 -7
  51. data/package/environments/base.js +25 -25
  52. data/package/environments/development.js +7 -8
  53. data/package/environments/production.js +28 -30
  54. data/package/index.js +9 -2
  55. data/package/inliningCss.js +7 -0
  56. data/package/rules/babel.js +1 -1
  57. data/package/rules/coffee.js +5 -5
  58. data/package/rules/erb.js +5 -3
  59. data/package/rules/file.js +5 -3
  60. data/package/rules/index.js +9 -17
  61. data/package/rules/less.js +14 -10
  62. data/package/rules/raw.js +5 -0
  63. data/package/rules/sass.js +12 -9
  64. data/package/rules/stylus.js +26 -0
  65. data/package/utils/get_style_rule.js +28 -30
  66. data/package/utils/helpers.js +25 -0
  67. data/test/configuration_test.rb +3 -3
  68. data/test/dev_server_runner_test.rb +13 -2
  69. data/test/helper_test.rb +59 -60
  70. data/test/manifest_test.rb +16 -0
  71. data/test/mounted_app/test/dummy/config/webpacker.yml +4 -4
  72. data/test/test_app/app/{javascript/packs → packs/entrypoints}/application.js +1 -1
  73. data/test/test_app/app/{javascript/packs → packs/entrypoints}/multi_entry.css +0 -0
  74. data/test/test_app/app/{javascript/packs → packs/entrypoints}/multi_entry.js +0 -0
  75. data/test/test_app/config/webpacker.yml +4 -6
  76. data/test/test_app/config/webpacker_other_location.yml +79 -0
  77. data/test/test_app/public/packs/manifest.json +19 -5
  78. data/test/webpacker_test.rb +17 -0
  79. data/yarn.lock +1567 -1039
  80. metadata +24 -36
  81. data/docs/assets.md +0 -135
  82. data/docs/cloud9.md +0 -310
  83. data/docs/css.md +0 -303
  84. data/docs/docker.md +0 -68
  85. data/docs/engines.md +0 -213
  86. data/docs/env.md +0 -68
  87. data/docs/es6.md +0 -72
  88. data/docs/folder-structure.md +0 -66
  89. data/docs/integrations.md +0 -220
  90. data/docs/misc.md +0 -23
  91. data/docs/props.md +0 -187
  92. data/docs/react.md +0 -183
  93. data/docs/target.md +0 -22
  94. data/docs/testing.md +0 -147
  95. data/docs/typescript.md +0 -190
  96. data/docs/v4-upgrade.md +0 -142
  97. data/docs/webpack-dev-server.md +0 -94
  98. data/docs/webpack.md +0 -315
  99. data/docs/yarn.md +0 -23
  100. data/lib/install/examples/vue3/app.vue +0 -27
  101. data/lib/install/examples/vue3/hello_vue.js +0 -15
  102. data/lib/install/javascript/packs/application.css +0 -9
  103. data/package/babel/preset-react.js +0 -62
  104. data/package/rules/svg.js +0 -23
data/package/index.js CHANGED
@@ -1,13 +1,16 @@
1
1
  /* eslint global-require: 0 */
2
2
  /* eslint import/no-dynamic-require: 0 */
3
3
 
4
+ const webpackMerge = require('webpack-merge')
4
5
  const { resolve } = require('path')
5
6
  const { existsSync } = require('fs')
6
7
  const baseConfig = require('./environments/base')
7
- const loaders = require('./rules')
8
+ const rules = require('./rules')
8
9
  const config = require('./config')
9
10
  const devServer = require('./dev_server')
10
11
  const { nodeEnv } = require('./env')
12
+ const { moduleExists, canProcess } = require('./utils/helpers')
13
+ const inliningCss = require('./inliningCss')
11
14
 
12
15
  const webpackConfig = () => {
13
16
  const path = resolve(__dirname, 'environments', `${nodeEnv}.js`)
@@ -20,5 +23,9 @@ module.exports = {
20
23
  devServer,
21
24
  webpackConfig: webpackConfig(),
22
25
  baseConfig,
23
- loaders
26
+ rules,
27
+ moduleExists,
28
+ canProcess,
29
+ inliningCss,
30
+ ...webpackMerge
24
31
  }
@@ -0,0 +1,7 @@
1
+ const { runningWebpackDevServer } = require('./env')
2
+ const devServer = require('./dev_server')
3
+
4
+ // This logic is tied to lib/webpacker/instance.rb
5
+ const inliningCss = runningWebpackDevServer && devServer.hmr
6
+
7
+ module.exports = inliningCss
@@ -8,7 +8,7 @@ const {
8
8
  const { isProduction } = require('../env')
9
9
 
10
10
  module.exports = {
11
- test: /\.(js|jsx|mjs|ts|tsx)?(\.erb)?$/,
11
+ test: /\.(js|jsx|mjs|ts|tsx|coffee)?(\.erb)?$/,
12
12
  include: [sourcePath, ...additionalPaths].map((p) => {
13
13
  try {
14
14
  return realpathSync(p)
@@ -1,6 +1,6 @@
1
- module.exports = {
1
+ const { canProcess } = require('../utils/helpers')
2
+
3
+ module.exports = canProcess('coffee-loader', (resolvedPath) => ({
2
4
  test: /\.coffee(\.erb)?$/,
3
- use: [
4
- { loader: require.resolve('coffee-loader') }
5
- ]
6
- }
5
+ use: [{ loader: resolvedPath }]
6
+ }))
data/package/rules/erb.js CHANGED
@@ -1,13 +1,15 @@
1
+ const { canProcess } = require('../utils/helpers')
2
+
1
3
  const runner = /^win/.test(process.platform) ? 'ruby ' : ''
2
4
 
3
- module.exports = {
5
+ module.exports = canProcess('rails-erb-loader', (resolvedPath) => ({
4
6
  test: /\.erb$/,
5
7
  enforce: 'pre',
6
8
  exclude: /node_modules/,
7
9
  use: [
8
10
  {
9
- loader: require.resolve('rails-erb-loader'),
11
+ loader: resolvedPath,
10
12
  options: { runner: `${runner}bin/rails runner` }
11
13
  }
12
14
  ]
13
- }
15
+ }))
@@ -13,9 +13,11 @@ module.exports = {
13
13
  /\.ttf$/,
14
14
  /\.woff$/,
15
15
  /\.woff2$/,
16
- /\.html$/,
17
- /\.json$/
16
+ /\.svg$/
18
17
  ],
19
18
  exclude: [/\.(js|mjs|jsx|ts|tsx)$/],
20
- type: 'asset/resource'
19
+ type: 'asset/resource',
20
+ generator: {
21
+ filename: 'static/[hash][ext][query]'
22
+ }
21
23
  }
@@ -1,24 +1,16 @@
1
1
  /* eslint global-require: 0 */
2
2
  /* eslint import/no-dynamic-require: 0 */
3
3
 
4
- const load = (name) => {
5
- try {
6
- return require(`./${name}`)
7
- } catch (e) {
8
- return null
9
- }
10
- }
11
-
12
4
  const rules = {
13
- file: load('file'),
14
- svg: load('svg'),
15
- css: load('css'),
16
- sass: load('sass'),
17
- babel: load('babel'),
18
- erb: load('erb'),
19
- coffee: load('coffee'),
20
- html: load('html'),
21
- less: load('less')
5
+ raw: require('./raw'),
6
+ file: require('./file'),
7
+ css: require('./css'),
8
+ sass: require('./sass'),
9
+ babel: require('./babel'),
10
+ erb: require('./erb'),
11
+ coffee: require('./coffee'),
12
+ less: require('./less'),
13
+ stylus: require('./stylus')
22
14
  }
23
15
 
24
16
  module.exports = Object.keys(rules)
@@ -1,18 +1,22 @@
1
1
  const path = require('path')
2
+ const { canProcess } = require('../utils/helpers')
2
3
  const getStyleRule = require('../utils/get_style_rule')
4
+
3
5
  const {
4
6
  additional_paths: paths,
5
7
  source_path: sourcePath
6
8
  } = require('../config')
7
9
 
8
- module.exports = getStyleRule(/\.(less)(\.erb)?$/i, [
9
- {
10
- loader: require.resolve('less-loader'),
11
- options: {
12
- lessOptions: {
13
- paths: [path.resolve(__dirname, 'node_modules'), sourcePath, ...paths]
14
- },
15
- sourceMap: true
10
+ module.exports = canProcess('less-loader', (resolvedPath) =>
11
+ getStyleRule(/\.(less)(\.erb)?$/i, [
12
+ {
13
+ loader: resolvedPath,
14
+ options: {
15
+ lessOptions: {
16
+ paths: [path.resolve(__dirname, 'node_modules'), sourcePath, ...paths]
17
+ },
18
+ sourceMap: true
19
+ }
16
20
  }
17
- }
18
- ])
21
+ ])
22
+ )
@@ -0,0 +1,5 @@
1
+ module.exports = {
2
+ test: [/\.html$/],
3
+ exclude: [/\.(js|mjs|jsx|ts|tsx)$/],
4
+ type: 'asset/source'
5
+ }
@@ -1,13 +1,16 @@
1
- const sass = require('sass')
1
+ /* eslint global-require: 0 */
2
+
2
3
  const getStyleRule = require('../utils/get_style_rule')
4
+ const { canProcess } = require('../utils/helpers')
3
5
  const { additional_paths: includePaths } = require('../config')
4
6
 
5
- module.exports = getStyleRule(/\.(scss|sass)(\.erb)?$/i, [
6
- {
7
- loader: require.resolve('sass-loader'),
8
- options: {
9
- sassOptions: { includePaths },
10
- implementation: sass
7
+ module.exports = canProcess('sass-loader', (resolvedPath) =>
8
+ getStyleRule(/\.(scss|sass)(\.erb)?$/i, [
9
+ {
10
+ loader: resolvedPath,
11
+ options: {
12
+ sassOptions: { includePaths }
13
+ }
11
14
  }
12
- }
13
- ])
15
+ ])
16
+ )
@@ -0,0 +1,26 @@
1
+ const path = require('path')
2
+ const { canProcess } = require('../utils/helpers')
3
+ const getStyleRule = require('../utils/get_style_rule')
4
+
5
+ const {
6
+ additional_paths: paths,
7
+ source_path: sourcePath
8
+ } = require('../config')
9
+
10
+ module.exports = canProcess('stylus-loader', (resolvedPath) =>
11
+ getStyleRule(/\.(styl(us)?)(\.erb)?$/i, [
12
+ {
13
+ loader: resolvedPath,
14
+ options: {
15
+ stylusOptions: {
16
+ include: [
17
+ path.resolve(__dirname, 'node_modules'),
18
+ sourcePath,
19
+ ...paths
20
+ ]
21
+ },
22
+ sourceMap: true
23
+ }
24
+ }
25
+ ])
26
+ )
@@ -1,39 +1,37 @@
1
- const MiniCssExtractPlugin = require('mini-css-extract-plugin')
1
+ /* eslint global-require: 0 */
2
+ const { canProcess, moduleExists } = require('./helpers')
3
+ const inliningCss = require('../inliningCss')
2
4
 
3
- const tryPostcss = () => {
4
- let postcssLoader = false
5
- try {
6
- if (require.resolve('postcss-loader')) {
7
- postcssLoader = {
8
- loader: require.resolve('postcss-loader'),
5
+ const getStyleRule = (test, preprocessors = []) => {
6
+ if (moduleExists('css-loader')) {
7
+ const tryPostcss = () =>
8
+ canProcess('postcss-loader', (loaderPath) => ({
9
+ loader: loaderPath,
9
10
  options: { sourceMap: true }
10
- }
11
- }
12
- } catch (e) {
13
- /* Work out what to print here */
14
- }
11
+ }))
15
12
 
16
- return postcssLoader
17
- }
13
+ // style-loader is required when using css modules with HMR on the webpack-dev-server
18
14
 
19
- const getStyleRule = (test, preprocessors = []) => {
20
- const use = [
21
- { loader: MiniCssExtractPlugin.loader },
22
- {
23
- loader: require.resolve('css-loader'),
24
- options: {
25
- sourceMap: true,
26
- importLoaders: 2
27
- }
28
- },
29
- tryPostcss(),
30
- ...preprocessors
31
- ].filter(Boolean)
15
+ const use = [
16
+ inliningCss ? 'style-loader' : require('mini-css-extract-plugin').loader,
17
+ {
18
+ loader: require.resolve('css-loader'),
19
+ options: {
20
+ sourceMap: true,
21
+ importLoaders: 2
22
+ }
23
+ },
24
+ tryPostcss(),
25
+ ...preprocessors
26
+ ].filter(Boolean)
32
27
 
33
- return {
34
- test,
35
- use
28
+ return {
29
+ test,
30
+ use
31
+ }
36
32
  }
33
+
34
+ return null
37
35
  }
38
36
 
39
37
  module.exports = getStyleRule
@@ -16,11 +16,36 @@ const resetEnv = () => {
16
16
 
17
17
  const ensureTrailingSlash = (path) => (path.endsWith('/') ? path : `${path}/`)
18
18
 
19
+ const resolvedPath = (packageName) => {
20
+ try {
21
+ return require.resolve(packageName)
22
+ } catch (e) {
23
+ if (e.code !== 'MODULE_NOT_FOUND') {
24
+ throw e
25
+ }
26
+ return null
27
+ }
28
+ }
29
+
30
+ const moduleExists = (packageName) => (!!resolvedPath(packageName))
31
+
32
+ const canProcess = (rule, fn) => {
33
+ const modulePath = resolvedPath(rule)
34
+
35
+ if (modulePath) {
36
+ return fn(modulePath)
37
+ }
38
+
39
+ return null
40
+ }
41
+
19
42
  module.exports = {
20
43
  chdirTestApp,
21
44
  chdirCwd,
22
45
  isArray,
23
46
  isBoolean,
24
47
  ensureTrailingSlash,
48
+ canProcess,
49
+ moduleExists,
25
50
  resetEnv
26
51
  }
@@ -10,12 +10,12 @@ class ConfigurationTest < Webpacker::Test
10
10
  end
11
11
 
12
12
  def test_source_path
13
- source_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/app/javascript").to_s
13
+ source_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/app/packs").to_s
14
14
  assert_equal source_path, @config.source_path.to_s
15
15
  end
16
16
 
17
17
  def test_source_entry_path
18
- source_entry_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/app/javascript", "packs").to_s
18
+ source_entry_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/app/packs", "entrypoints").to_s
19
19
  assert_equal @config.source_entry_path.to_s, source_entry_path
20
20
  end
21
21
 
@@ -44,7 +44,7 @@ class ConfigurationTest < Webpacker::Test
44
44
  end
45
45
 
46
46
  def test_cache_path
47
- cache_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/tmp/cache/webpacker").to_s
47
+ cache_path = File.expand_path File.join(File.dirname(__FILE__), "test_app/tmp/webpacker").to_s
48
48
  assert_equal @config.cache_path.to_s, cache_path
49
49
  end
50
50
 
@@ -5,11 +5,13 @@ class DevServerRunnerTest < Webpacker::Test
5
5
  def setup
6
6
  @original_node_env, ENV["NODE_ENV"] = ENV["NODE_ENV"], "development"
7
7
  @original_rails_env, ENV["RAILS_ENV"] = ENV["RAILS_ENV"], "development"
8
+ @original_webpacker_config = ENV["WEBPACKER_CONFIG"]
8
9
  end
9
10
 
10
11
  def teardown
11
12
  ENV["NODE_ENV"] = @original_node_env
12
13
  ENV["RAILS_ENV"] = @original_rails_env
14
+ ENV["WEBPACKER_CONFIG"] = @original_webpacker_config
13
15
  end
14
16
 
15
17
  def test_run_cmd_via_node_modules
@@ -38,24 +40,33 @@ class DevServerRunnerTest < Webpacker::Test
38
40
  def dev_server.port; "3035"; end
39
41
  def dev_server.pretty?; false; end
40
42
  def dev_server.https?; true; end
43
+ def dev_server.hmr?; false; end
41
44
  Webpacker::DevServer.stub(:new, dev_server) do
42
45
  verify_command(cmd, argv: ["--https"])
43
46
  end
44
47
  end
45
48
 
49
+ def test_environment_variables
50
+ cmd = ["#{test_app_path}/node_modules/.bin/webpack", "serve", "--config", "#{test_app_path}/config/webpack/development.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_DEV_SERVER"] = "true"
54
+ verify_command(cmd, env: env)
55
+ end
56
+
46
57
  private
47
58
  def test_app_path
48
59
  File.expand_path("test_app", __dir__)
49
60
  end
50
61
 
51
- def verify_command(cmd, use_node_modules: true, argv: [])
62
+ def verify_command(cmd, use_node_modules: true, argv: [], env: Webpacker::Compiler.env)
52
63
  cwd = Dir.pwd
53
64
  Dir.chdir(test_app_path)
54
65
 
55
66
  klass = Webpacker::DevServerRunner
56
67
  instance = klass.new(argv)
57
68
  mock = Minitest::Mock.new
58
- mock.expect(:call, nil, [Webpacker::Compiler.env, *cmd])
69
+ mock.expect(:call, nil, [env, *cmd])
59
70
 
60
71
  klass.stub(:new, instance) do
61
72
  instance.stub(:node_modules_bin_exist?, use_node_modules) do
data/test/helper_test.rb CHANGED
@@ -26,18 +26,18 @@ class HelperTest < ActionView::TestCase
26
26
 
27
27
  def test_image_pack_path
28
28
  assert_equal "/packs/application-k344a6d59eef8632c9d1.png", image_pack_path("application.png")
29
- assert_equal "/packs/media/images/image-c38deda30895059837cf.jpg", image_pack_path("image.jpg")
30
- assert_equal "/packs/media/images/image-c38deda30895059837cf.jpg", image_pack_path("media/images/image.jpg")
31
- assert_equal "/packs/media/images/nested/image-c38deda30895059837cf.jpg", image_pack_path("nested/image.jpg")
32
- assert_equal "/packs/media/images/nested/image-c38deda30895059837cf.jpg", image_pack_path("media/images/nested/image.jpg")
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
33
  end
34
34
 
35
35
  def test_image_pack_url
36
36
  assert_equal "https://example.com/packs/application-k344a6d59eef8632c9d1.png", image_pack_url("application.png")
37
- assert_equal "https://example.com/packs/media/images/image-c38deda30895059837cf.jpg", image_pack_url("image.jpg")
38
- assert_equal "https://example.com/packs/media/images/image-c38deda30895059837cf.jpg", image_pack_url("media/images/image.jpg")
39
- assert_equal "https://example.com/packs/media/images/nested/image-c38deda30895059837cf.jpg", image_pack_url("nested/image.jpg")
40
- assert_equal "https://example.com/packs/media/images/nested/image-c38deda30895059837cf.jpg", image_pack_url("media/images/nested/image.jpg")
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
41
  end
42
42
 
43
43
  def test_image_pack_tag
@@ -45,20 +45,20 @@ class HelperTest < ActionView::TestCase
45
45
  "<img alt=\"Edit Entry\" src=\"/packs/application-k344a6d59eef8632c9d1.png\" width=\"16\" height=\"10\" />",
46
46
  image_pack_tag("application.png", size: "16x10", alt: "Edit Entry")
47
47
  assert_equal \
48
- "<img alt=\"Edit Entry\" src=\"/packs/media/images/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
48
+ "<img alt=\"Edit Entry\" src=\"/packs/static/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
49
49
  image_pack_tag("image.jpg", size: "16x10", alt: "Edit Entry")
50
50
  assert_equal \
51
- "<img alt=\"Edit Entry\" src=\"/packs/media/images/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
52
- image_pack_tag("media/images/image.jpg", size: "16x10", alt: "Edit Entry")
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
53
  assert_equal \
54
- "<img alt=\"Edit Entry\" src=\"/packs/media/images/nested/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
54
+ "<img alt=\"Edit Entry\" src=\"/packs/static/nested/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
55
55
  image_pack_tag("nested/image.jpg", size: "16x10", alt: "Edit Entry")
56
56
  assert_equal \
57
- "<img alt=\"Edit Entry\" src=\"/packs/media/images/nested/image-c38deda30895059837cf.jpg\" width=\"16\" height=\"10\" />",
58
- image_pack_tag("media/images/nested/image.jpg", size: "16x10", alt: "Edit Entry")
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
59
  assert_equal \
60
- "<img srcset=\"/packs/media/images/image-2x-7cca48e6cae66ec07b8e.jpg 2x\" src=\"/packs/media/images/image-c38deda30895059837cf.jpg\" />",
61
- image_pack_tag("media/images/image.jpg", srcset: { "media/images/image-2x.jpg" => "2x" })
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
62
  end
63
63
 
64
64
  def test_favicon_pack_tag
@@ -66,86 +66,85 @@ class HelperTest < ActionView::TestCase
66
66
  "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/application-k344a6d59eef8632c9d1.png\" />",
67
67
  favicon_pack_tag("application.png", rel: "apple-touch-icon", type: "image/png")
68
68
  assert_equal \
69
- "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/media/images/mb-icon-c38deda30895059837cf.png\" />",
69
+ "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/mb-icon-c38deda30895059837cf.png\" />",
70
70
  favicon_pack_tag("mb-icon.png", rel: "apple-touch-icon", type: "image/png")
71
71
  assert_equal \
72
- "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/media/images/mb-icon-c38deda30895059837cf.png\" />",
73
- favicon_pack_tag("media/images/mb-icon.png", rel: "apple-touch-icon", type: "image/png")
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
74
  assert_equal \
75
- "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/media/images/nested/mb-icon-c38deda30895059837cf.png\" />",
75
+ "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/static/nested/mb-icon-c38deda30895059837cf.png\" />",
76
76
  favicon_pack_tag("nested/mb-icon.png", rel: "apple-touch-icon", type: "image/png")
77
77
  assert_equal \
78
- "<link rel=\"apple-touch-icon\" type=\"image/png\" href=\"/packs/media/images/nested/mb-icon-c38deda30895059837cf.png\" />",
79
- favicon_pack_tag("media/images/nested/mb-icon.png", rel: "apple-touch-icon", type: "image/png")
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
80
  end
81
81
 
82
- def test_javascript_pack_tag
83
- assert_equal \
84
- %(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js"></script>),
85
- javascript_pack_tag("bootstrap.js")
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
86
96
  end
87
97
 
88
- def test_javascript_pack_tag_symbol
98
+ def test_javascript_pack_tag
89
99
  assert_equal \
90
- %(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js"></script>),
91
- javascript_pack_tag(:bootstrap)
100
+ %(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js"></script>\n) +
101
+ %(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js"></script>\n) +
102
+ %(<script src="/packs/application-k344a6d59eef8632c9d1.js"></script>\n) +
103
+ %(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js"></script>),
104
+ javascript_pack_tag("application", "bootstrap")
92
105
  end
93
106
 
94
107
  def test_javascript_pack_tag_splat
95
108
  assert_equal \
96
- %(<script src="/packs/bootstrap-300631c4f0e0f9c865bc.js" defer="defer"></script>\n) +
109
+ %(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js" defer="defer"></script>\n) +
110
+ %(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js" defer="defer"></script>\n) +
97
111
  %(<script src="/packs/application-k344a6d59eef8632c9d1.js" defer="defer"></script>),
98
- javascript_pack_tag("bootstrap.js", "application.js", defer: true)
112
+ javascript_pack_tag("application", defer: true)
99
113
  end
100
114
 
101
- def test_javascript_pack_tag_split_chunks
115
+ def test_javascript_pack_tag_symbol
102
116
  assert_equal \
103
117
  %(<script src="/packs/vendors~application~bootstrap-c20632e7baf2c81200d3.chunk.js"></script>\n) +
104
118
  %(<script src="/packs/vendors~application-e55f2aae30c07fb6d82a.chunk.js"></script>\n) +
105
119
  %(<script src="/packs/application-k344a6d59eef8632c9d1.js"></script>),
106
- javascript_packs_with_chunks_tag("application")
120
+ javascript_pack_tag(:application)
107
121
  end
108
122
 
109
- def test_preload_pack_asset
110
- if self.class.method_defined?(:preload_link_tag)
111
- assert_equal \
112
- %(<link rel="preload" href="/packs/fonts/fa-regular-400-944fb546bd7018b07190a32244f67dc9.woff2" as="font" type="font/woff2" crossorigin="anonymous">),
113
- preload_pack_asset("fonts/fa-regular-400.woff2")
114
- else
115
- error = assert_raises do
116
- preload_pack_asset("fonts/fa-regular-400.woff2")
117
- end
118
-
119
- assert_equal \
120
- "You need Rails >= 5.2 to use this tag.",
121
- error.message
122
- end
123
+ def application_stylesheet_chunks
124
+ %w[/packs/1-c20632e7baf2c81200d3.chunk.css /packs/application-k344a6d59eef8632c9d1.chunk.css]
123
125
  end
124
126
 
125
- def test_stylesheet_pack_tag_split_chunks
126
- assert_equal \
127
- %(<link rel="stylesheet" media="screen" href="/packs/1-c20632e7baf2c81200d3.chunk.css" />\n) +
128
- %(<link rel="stylesheet" media="screen" href="/packs/application-k344a6d59eef8632c9d1.chunk.css" />\n) +
129
- %(<link rel="stylesheet" media="screen" href="/packs/hello_stimulus-k344a6d59eef8632c9d1.chunk.css" />),
130
- stylesheet_packs_with_chunks_tag("application", "hello_stimulus")
127
+ def hello_stimulus_stylesheet_chunks
128
+ %w[/packs/hello_stimulus-k344a6d59eef8632c9d1.chunk.css]
131
129
  end
132
130
 
133
131
  def test_stylesheet_pack_tag
134
132
  assert_equal \
135
- %(<link rel="stylesheet" media="screen" href="/packs/bootstrap-c38deda30895059837cf.css" />),
136
- stylesheet_pack_tag("bootstrap.css")
133
+ (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
134
+ .map { |chunk| stylesheet_link_tag(chunk) }.join("\n"),
135
+ stylesheet_pack_tag("application", "hello_stimulus")
137
136
  end
138
137
 
139
138
  def test_stylesheet_pack_tag_symbol
140
139
  assert_equal \
141
- %(<link rel="stylesheet" media="screen" href="/packs/bootstrap-c38deda30895059837cf.css" />),
142
- stylesheet_pack_tag(:bootstrap)
140
+ (application_stylesheet_chunks + hello_stimulus_stylesheet_chunks)
141
+ .map { |chunk| stylesheet_link_tag(chunk) }.join("\n"),
142
+ stylesheet_pack_tag(:application, :hello_stimulus)
143
143
  end
144
144
 
145
145
  def test_stylesheet_pack_tag_splat
146
146
  assert_equal \
147
- %(<link rel="stylesheet" media="all" href="/packs/bootstrap-c38deda30895059837cf.css" />\n) +
148
- %(<link rel="stylesheet" media="all" href="/packs/application-dd6b1cd38bfa093df600.css" />),
149
- stylesheet_pack_tag("bootstrap.css", "application.css", media: "all")
147
+ (application_stylesheet_chunks).map { |chunk| stylesheet_link_tag(chunk, media: "all") }.join("\n"),
148
+ stylesheet_pack_tag("application", media: "all")
150
149
  end
151
150
  end