webpacker 1.0 → 1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.eslintrc.js +14 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +124 -0
- data/.travis.yml +24 -0
- data/Gemfile +1 -1
- data/Gemfile.lock +6 -6
- data/README.md +126 -19
- data/lib/install/angular.rb +18 -0
- data/lib/install/bin/webpack-dev-server.tt +23 -12
- data/lib/install/bin/webpack-watcher.tt +3 -0
- data/lib/install/bin/webpack.tt +33 -7
- data/lib/install/config/.postcssrc.yml +4 -0
- data/lib/install/config/loaders/core/assets.js +12 -0
- data/lib/install/config/loaders/core/babel.js +10 -0
- data/lib/install/config/loaders/core/coffee.js +4 -0
- data/lib/install/config/loaders/core/erb.js +9 -0
- data/lib/install/config/loaders/core/sass.js +9 -0
- data/lib/install/config/loaders/installers/angular.js +4 -0
- data/lib/install/config/loaders/installers/react.js +11 -0
- data/lib/install/config/loaders/installers/vue.js +10 -0
- data/lib/install/config/webpack/configuration.js +21 -0
- data/lib/install/config/webpack/development.js +16 -0
- data/lib/install/config/webpack/development.server.js +17 -0
- data/lib/install/config/webpack/development.server.yml +4 -0
- data/lib/install/config/webpack/paths.yml +19 -0
- data/lib/install/config/webpack/production.js +20 -0
- data/lib/install/config/webpack/shared.js +51 -0
- data/lib/install/{angular → examples/angular}/hello_angular.js +1 -1
- data/lib/install/{angular → examples/angular}/hello_angular/app/app.component.ts +0 -0
- data/lib/install/{angular → examples/angular}/hello_angular/app/app.module.ts +0 -0
- data/lib/install/{angular → examples/angular}/hello_angular/index.ts +0 -0
- data/lib/install/{angular → examples/angular}/hello_angular/polyfills.ts +0 -0
- data/lib/install/{angular → examples/angular}/tsconfig.json +0 -0
- data/lib/install/examples/react/.babelrc +3 -0
- data/lib/install/examples/react/hello_react.jsx +25 -0
- data/lib/install/examples/vue/app.vue +22 -0
- data/lib/install/examples/vue/hello_vue.js +19 -0
- data/lib/install/javascript/packs/application.js +1 -0
- data/lib/install/react.rb +15 -0
- data/lib/install/template.rb +20 -14
- data/lib/install/vue.rb +15 -0
- data/lib/tasks/installers.rake +21 -0
- data/lib/tasks/webpacker.rake +14 -107
- data/lib/tasks/webpacker/compile.rake +29 -0
- data/lib/tasks/webpacker/install.rake +12 -0
- data/lib/tasks/webpacker/verify_install.rake +16 -0
- data/lib/tasks/webpacker/yarn_install.rake +6 -0
- data/lib/webpacker.rb +1 -1
- data/lib/webpacker/configuration.rb +42 -0
- data/lib/webpacker/file_loader.rb +24 -0
- data/lib/webpacker/helper.rb +32 -3
- data/lib/webpacker/manifest.rb +29 -0
- data/lib/webpacker/railtie.rb +6 -16
- data/lib/webpacker/version.rb +3 -0
- data/package.json +28 -0
- data/webpacker.gemspec +15 -12
- data/yarn.lock +1014 -0
- metadata +50 -20
- data/lib/install/config/development.js +0 -24
- data/lib/install/config/production.js +0 -16
- data/lib/install/config/shared.js +0 -70
- data/lib/install/react/.babelrc +0 -3
- data/lib/install/react/hello_react.js +0 -16
- data/lib/webpacker/digests.rb +0 -42
- data/lib/webpacker/source.rb +0 -38
@@ -1,3 +1,4 @@
|
|
1
|
+
/* eslint no-console:0 */
|
1
2
|
// This file is automatically compiled by Webpack, along with any other files
|
2
3
|
// present in this directory. You're encouraged to place your actual application logic in
|
3
4
|
// a relevant structure within app/javascript and only use these pack files to reference
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require "webpacker/configuration"
|
2
|
+
|
3
|
+
puts "Copying react loader to #{Webpacker::Configuration.config_path}/loaders"
|
4
|
+
copy_file "#{__dir__}/config/loaders/installers/react.js", "config/webpack/loaders/react.js"
|
5
|
+
|
6
|
+
puts "Copying .babelrc to app root directory"
|
7
|
+
copy_file "#{__dir__}/examples/react/.babelrc", ".babelrc"
|
8
|
+
|
9
|
+
puts "Copying react example entry file to #{Webpacker::Configuration.entry_path}"
|
10
|
+
copy_file "#{__dir__}/examples/react/hello_react.jsx", "#{Webpacker::Configuration.entry_path}/hello_react.jsx"
|
11
|
+
|
12
|
+
puts "Installing all react dependencies"
|
13
|
+
run "./bin/yarn add react react-dom babel-preset-react"
|
14
|
+
|
15
|
+
puts "Webpacker now supports react.js 🎉"
|
data/lib/install/template.rb
CHANGED
@@ -1,23 +1,29 @@
|
|
1
|
-
|
1
|
+
# Install webpacker
|
2
|
+
puts "Creating javascript app source directory"
|
3
|
+
directory "#{__dir__}/javascript", "app/javascript"
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
+
puts "Copying binstubs"
|
6
|
+
directory "#{__dir__}/bin", "bin"
|
7
|
+
chmod "bin", 0755 & ~File.umask, verbose: false
|
5
8
|
|
6
|
-
|
9
|
+
puts "Copying webpack core config and loaders"
|
10
|
+
directory "#{__dir__}/config/webpack", "config/webpack"
|
11
|
+
directory "#{__dir__}/config/loaders/core", "config/webpack/loaders"
|
12
|
+
copy_file "#{__dir__}/config/.postcssrc.yml", ".postcssrc.yml"
|
7
13
|
|
8
|
-
append_to_file
|
14
|
+
append_to_file ".gitignore", <<-EOS
|
9
15
|
/public/packs
|
10
16
|
/node_modules
|
11
17
|
EOS
|
12
18
|
|
13
|
-
|
19
|
+
puts "Installing all JavaScript dependencies"
|
20
|
+
run "./bin/yarn add webpack webpack-merge js-yaml path-complete-extname " \
|
21
|
+
"webpack-manifest-plugin babel-loader coffee-loader coffee-script " \
|
22
|
+
"babel-core babel-preset-env compression-webpack-plugin rails-erb-loader glob " \
|
23
|
+
"extract-text-webpack-plugin node-sass file-loader sass-loader css-loader style-loader " \
|
24
|
+
"postcss-loader autoprefixer postcss-smart-import precss"
|
14
25
|
|
15
|
-
|
16
|
-
|
17
|
-
" config.x.webpacker[:digesting] = true\n",
|
18
|
-
env: 'production'
|
26
|
+
puts "Installing dev server for live reloading"
|
27
|
+
run "./bin/yarn add --dev webpack-dev-server"
|
19
28
|
|
20
|
-
|
21
|
-
"# Make javascript_pack_tag load assets from webpack-dev-server.\n" +
|
22
|
-
" # config.x.webpacker[:dev_server_host] = \"http://localhost:8080\"\n",
|
23
|
-
env: 'development'
|
29
|
+
puts "Webpacker successfully installed 🎉 🍰"
|
data/lib/install/vue.rb
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
require "webpacker/configuration"
|
2
|
+
|
3
|
+
puts "Copying vue loader to #{Webpacker::Configuration.config_path}/loaders"
|
4
|
+
copy_file "#{__dir__}/config/loaders/installers/vue.js", "config/webpack/loaders/vue.js"
|
5
|
+
|
6
|
+
puts "Copying the example entry file to #{Webpacker::Configuration.entry_path}"
|
7
|
+
copy_file "#{__dir__}/examples/vue/hello_vue.js", "#{Webpacker::Configuration.entry_path}/hello_vue.js"
|
8
|
+
|
9
|
+
puts "Copying vue app file to #{Webpacker::Configuration.entry_path}"
|
10
|
+
copy_file "#{__dir__}/examples/vue/app.vue", "#{Webpacker::Configuration.entry_path}/app.vue"
|
11
|
+
|
12
|
+
puts "Installing all vue dependencies"
|
13
|
+
run "./bin/yarn add vue vue-loader vue-template-compiler sass-loader node-sass css-loader"
|
14
|
+
|
15
|
+
puts "Webpacker now supports vue.js 🎉"
|
@@ -0,0 +1,21 @@
|
|
1
|
+
INSTALLERS = {
|
2
|
+
"Angular": :angular,
|
3
|
+
"React": :react,
|
4
|
+
"Vue": :vue
|
5
|
+
}.freeze
|
6
|
+
|
7
|
+
namespace :webpacker do
|
8
|
+
namespace :install do
|
9
|
+
INSTALLERS.each do |name, task_name|
|
10
|
+
desc "Install everything needed for #{name}"
|
11
|
+
task task_name => ["webpacker:verify_install"] do
|
12
|
+
template = File.expand_path("../install/#{task_name}.rb", __dir__)
|
13
|
+
if Rails::VERSION::MAJOR >= 5
|
14
|
+
exec "./bin/rails app:template LOCATION=#{template}"
|
15
|
+
else
|
16
|
+
exec "./bin/rake rails:template LOCATION=#{template}"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
data/lib/tasks/webpacker.rake
CHANGED
@@ -1,108 +1,15 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
digests_path = Rails.application.config.x.webpacker[:digests_path]
|
17
|
-
packs_path = Rails.root.join('public', dist_dir) || File.dirname(digests_path)
|
18
|
-
packs_digests_path = digests_path || Rails.root.join(packs_path, 'digests.json')
|
19
|
-
|
20
|
-
FileUtils.mkdir_p(packs_path)
|
21
|
-
File.open(packs_digests_path, 'w+') { |file| file.write webpack_digests }
|
22
|
-
|
23
|
-
puts "Compiled digests for all packs in #{packs_digests_path}: "
|
24
|
-
puts webpack_digests
|
25
|
-
end
|
26
|
-
|
27
|
-
desc "Install webpacker in this application"
|
28
|
-
task :install do
|
29
|
-
exec "./bin/rails app:template LOCATION=#{WEBPACKER_APP_TEMPLATE_PATH}"
|
30
|
-
end
|
31
|
-
|
32
|
-
namespace :install do
|
33
|
-
desc "Install everything needed for react"
|
34
|
-
task :react do
|
35
|
-
config_path = Rails.root.join('config/webpack/shared.js')
|
36
|
-
config = File.read(config_path)
|
37
|
-
|
38
|
-
if config =~ /presets:\s*\[\s*\[\s*'latest'/
|
39
|
-
puts "Replacing loader presets to include react in #{config_path}"
|
40
|
-
config.gsub!(/presets:(\s*\[)(\s*)\[(\s)*'latest'/, "presets:\\1\\2'react',\\2[\\3'latest'")
|
41
|
-
else
|
42
|
-
puts "Couldn't automatically update loader presets in #{config_path}. Please set presets: [ 'react', [ 'latest', { 'es2015': { 'modules': false } } ] ]."
|
43
|
-
end
|
44
|
-
|
45
|
-
if config.include?("test: /\\.js(.erb)?$/")
|
46
|
-
puts "Replacing loader test to include react in #{config_path}"
|
47
|
-
config.gsub!("test: /\\.js(.erb)?$/", "test: /\\.jsx?(.erb)?$/")
|
48
|
-
else
|
49
|
-
puts "Couldn't automatically update loader test in #{config_path}. Please set test: /\.jsx?(.erb)?$/."
|
50
|
-
end
|
51
|
-
|
52
|
-
File.write config_path, config
|
53
|
-
|
54
|
-
puts "Copying .babelrc to project directory"
|
55
|
-
FileUtils.copy File.expand_path('../install/react/.babelrc', __dir__),
|
56
|
-
Rails.root
|
57
|
-
|
58
|
-
puts "Copying react example to app/javascript/packs/hello_react.js"
|
59
|
-
FileUtils.copy File.expand_path('../install/react/hello_react.js', __dir__),
|
60
|
-
Rails.root.join('app/javascript/packs/hello_react.js')
|
61
|
-
|
62
|
-
exec './bin/yarn add --dev babel-preset-react && ./bin/yarn add react react-dom'
|
63
|
-
end
|
64
|
-
|
65
|
-
desc "Install everything needed for Angular"
|
66
|
-
task :angular do
|
67
|
-
config_path = Rails.root.join('config/webpack/shared.js')
|
68
|
-
config = File.read(config_path)
|
69
|
-
|
70
|
-
if config.include?('ts-loader')
|
71
|
-
puts "The configuration file already has a reference to ts-loader, skipping the test rule..."
|
72
|
-
else
|
73
|
-
puts "Adding a loader rule to include ts-loader for .ts files in #{config_path}..."
|
74
|
-
config.gsub!(/rules:(\s*\[)(\s*\{)/, "rules:\\1\\2 test: /\.ts$/, loader: 'ts-loader' },\\2")
|
75
|
-
end
|
76
|
-
|
77
|
-
if config =~ /["'].ts["']/
|
78
|
-
puts "The configuration file already has a reference to .ts extension, skipping the addition of this extension to the list..."
|
79
|
-
else
|
80
|
-
puts "Adding '.ts' in loader extensions in #{config_path}..."
|
81
|
-
config.gsub!(/extensions:(.*')(\s*\])/, "extensions:\\1, '.ts'\\2")
|
82
|
-
end
|
83
|
-
|
84
|
-
File.write config_path, config
|
85
|
-
|
86
|
-
puts "Copying Angular example to app/javascript/packs/hello_angular.js"
|
87
|
-
FileUtils.copy File.expand_path('../install/angular/hello_angular.js', __dir__),
|
88
|
-
Rails.root.join('app/javascript/packs/hello_angular.js')
|
89
|
-
|
90
|
-
puts "Copying Angular Hello app to app/javascript/hello_angular"
|
91
|
-
FileUtils.copy_entry File.expand_path('../install/angular/hello_angular', __dir__),
|
92
|
-
Rails.root.join('app/javascript/hello_angular')
|
93
|
-
|
94
|
-
puts "Copying tsconfig.json to the Rails root directory"
|
95
|
-
FileUtils.copy File.expand_path('../install/angular/tsconfig.json', __dir__),
|
96
|
-
Rails.root.join('tsconfig.json')
|
97
|
-
|
98
|
-
exec './bin/yarn add --dev typescript ts-loader && ./bin/yarn add "core-js zone.js rxjs @angular/core @angular/common @angular/compiler @angular/platform-browser @angular/platform-browser-dynamic"'
|
99
|
-
end
|
100
|
-
end
|
101
|
-
end
|
102
|
-
|
103
|
-
# Compile packs after we've compiled all other assets during precompilation
|
104
|
-
if Rake::Task.task_defined?('assets:precompile')
|
105
|
-
Rake::Task['assets:precompile'].enhance do
|
106
|
-
Rake::Task['webpacker:compile'].invoke
|
107
|
-
end
|
1
|
+
tasks = {
|
2
|
+
"webpacker:install" => "Installs and setup webpack with yarn",
|
3
|
+
"webpacker:compile" => "Compiles webpack bundles based on environment",
|
4
|
+
"webpacker:verify_install" => "Verifies if webpacker is installed",
|
5
|
+
"webpacker:yarn_install" => "Support for older Rails versions. Install all JavaScript dependencies as specified via Yarn",
|
6
|
+
"webpacker:install:react" => "Installs and setup example react component",
|
7
|
+
"webpacker:install:vue" => "Installs and setup example vue component",
|
8
|
+
"webpacker:install:angular" => "Installs and setup example angular2 component"
|
9
|
+
}.freeze
|
10
|
+
|
11
|
+
desc "Lists all available tasks in webpacker"
|
12
|
+
task :webpacker do
|
13
|
+
puts "Available webpacker tasks are:"
|
14
|
+
tasks.each { |task, message| puts task.ljust(30) + message }
|
108
15
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require "webpacker/configuration"
|
2
|
+
REGEX_MAP = /\A.*\.map\z/
|
3
|
+
|
4
|
+
namespace :webpacker do
|
5
|
+
desc "Compile javascript packs using webpack for production with digests"
|
6
|
+
task compile: ["webpacker:verify_install", :environment] do
|
7
|
+
puts "Compiling webpacker assets 🎉"
|
8
|
+
result = `NODE_ENV=production ./bin/webpack`
|
9
|
+
|
10
|
+
unless $?.success?
|
11
|
+
puts JSON.parse(result)["errors"]
|
12
|
+
exit! $?.exitstatus
|
13
|
+
end
|
14
|
+
|
15
|
+
puts "Compiled digests for all packs in #{Webpacker::Configuration.output_path}: "
|
16
|
+
puts JSON.parse(File.read(Webpacker::Configuration.manifest_path))
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
# Compile packs after we've compiled all other assets during precompilation
|
21
|
+
if Rake::Task.task_defined?("assets:precompile")
|
22
|
+
Rake::Task["assets:precompile"].enhance do
|
23
|
+
unless Rake::Task.task_defined?("yarn:install")
|
24
|
+
# For Rails < 5.1
|
25
|
+
Rake::Task["webpacker:yarn_install"].invoke
|
26
|
+
end
|
27
|
+
Rake::Task["webpacker:compile"].invoke
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
WEBPACKER_APP_TEMPLATE_PATH = File.expand_path("../../install/template.rb", __dir__)
|
2
|
+
|
3
|
+
namespace :webpacker do
|
4
|
+
desc "Install webpacker in this application"
|
5
|
+
task :install do
|
6
|
+
if Rails::VERSION::MAJOR >= 5
|
7
|
+
exec "./bin/rails app:template LOCATION=#{WEBPACKER_APP_TEMPLATE_PATH}"
|
8
|
+
else
|
9
|
+
exec "./bin/rake rails:template LOCATION=#{WEBPACKER_APP_TEMPLATE_PATH}"
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require "webpacker/configuration"
|
2
|
+
|
3
|
+
namespace :webpacker do
|
4
|
+
desc "Verifies if webpacker is installed"
|
5
|
+
task :verify_install do
|
6
|
+
if File.exist?(Webpacker::Configuration.file_path)
|
7
|
+
puts "Webpacker is installed 🎉 🍰"
|
8
|
+
puts "Using #{Webpacker::Configuration.file_path} file for setting up webpack paths"
|
9
|
+
else
|
10
|
+
puts "Configuration config/webpack/paths.yml file not found. \n"\
|
11
|
+
"Make sure webpacker:install is run successfully before " \
|
12
|
+
"running dependent tasks"
|
13
|
+
exit!
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/webpacker.rb
CHANGED
@@ -0,0 +1,42 @@
|
|
1
|
+
# Loads webpacker configuration from config/webpack/paths.yml
|
2
|
+
require "webpacker/file_loader"
|
3
|
+
|
4
|
+
class Webpacker::Configuration < Webpacker::FileLoader
|
5
|
+
class << self
|
6
|
+
def config_path
|
7
|
+
Rails.root.join(paths.fetch(:config, "config/webpack"))
|
8
|
+
end
|
9
|
+
|
10
|
+
def entry_path
|
11
|
+
Rails.root.join(source_path, paths.fetch(:entry, "packs"))
|
12
|
+
end
|
13
|
+
|
14
|
+
def file_path
|
15
|
+
Rails.root.join("config", "webpack", "paths.yml")
|
16
|
+
end
|
17
|
+
|
18
|
+
def manifest_path
|
19
|
+
Rails.root.join(output_path, "manifest.json")
|
20
|
+
end
|
21
|
+
|
22
|
+
def output_path
|
23
|
+
Rails.root.join(paths.fetch(:output, "public"), paths.fetch(:entry, "packs"))
|
24
|
+
end
|
25
|
+
|
26
|
+
def paths
|
27
|
+
load if Rails.env.development?
|
28
|
+
raise Webpacker::FileLoader::FileLoaderError.new("Webpacker::Configuration.load must be called first") unless instance
|
29
|
+
instance.data
|
30
|
+
end
|
31
|
+
|
32
|
+
def source_path
|
33
|
+
Rails.root.join(paths.fetch(:source, "app/javascript"))
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
def load
|
39
|
+
return super unless File.exist?(@path)
|
40
|
+
HashWithIndifferentAccess.new(YAML.load(File.read(@path)))
|
41
|
+
end
|
42
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# Provides a base singleton-configuration pattern for loading a file, given a path
|
2
|
+
class Webpacker::FileLoader
|
3
|
+
class NotFoundError < StandardError; end
|
4
|
+
class FileLoaderError < StandardError; end
|
5
|
+
|
6
|
+
class_attribute :instance
|
7
|
+
attr_accessor :data
|
8
|
+
|
9
|
+
class << self
|
10
|
+
def load(path = file_path)
|
11
|
+
self.instance = new(path)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
def initialize(path)
|
17
|
+
@path = path
|
18
|
+
@data = load
|
19
|
+
end
|
20
|
+
|
21
|
+
def load
|
22
|
+
{}.freeze
|
23
|
+
end
|
24
|
+
end
|
data/lib/webpacker/helper.rb
CHANGED
@@ -1,8 +1,20 @@
|
|
1
|
-
require
|
1
|
+
require "webpacker/manifest"
|
2
2
|
|
3
3
|
module Webpacker::Helper
|
4
|
+
# Computes the full path for a given webpacker asset.
|
5
|
+
# Return relative path using manifest.json and passes it to asset_url helper
|
6
|
+
# This will use asset_path internally, so most of their behaviors will be the same.
|
7
|
+
# Examples:
|
8
|
+
#
|
9
|
+
# In development mode:
|
10
|
+
# <%= asset_pack_path 'calendar.js' %> # => "/packs/calendar.js"
|
11
|
+
# In production mode:
|
12
|
+
# <%= asset_pack_path 'calendar.css' %> # => "/packs/calendar-1016838bab065ae1e122.css"
|
13
|
+
def asset_pack_path(name, **options)
|
14
|
+
asset_path(Webpacker::Manifest.lookup(name), **options)
|
15
|
+
end
|
4
16
|
# Creates a script tag that references the named pack file, as compiled by Webpack per the entries list
|
5
|
-
# in config/webpack/shared.js. By default, this list is auto-generated to match everything in
|
17
|
+
# in config/webpack/shared.js. By default, this list is auto-generated to match everything in
|
6
18
|
# app/javascript/packs/*.js. In production mode, the digested reference is automatically looked up.
|
7
19
|
#
|
8
20
|
# Examples:
|
@@ -15,6 +27,23 @@ module Webpacker::Helper
|
|
15
27
|
# <%= javascript_pack_tag 'calendar', 'data-turbolinks-track': 'reload' %> # =>
|
16
28
|
# <script src="/packs/calendar-1016838bab065ae1e314.js" data-turbolinks-track="reload"></script>
|
17
29
|
def javascript_pack_tag(name, **options)
|
18
|
-
javascript_include_tag(Webpacker::
|
30
|
+
javascript_include_tag(Webpacker::Manifest.lookup("#{name}#{compute_asset_extname(name, type: :javascript)}"), **options)
|
31
|
+
end
|
32
|
+
|
33
|
+
# Creates a link tag that references the named pack file, as compiled by Webpack per the entries list
|
34
|
+
# in config/webpack/shared.js. By default, this list is auto-generated to match everything in
|
35
|
+
# app/javascript/packs/*.js. In production mode, the digested reference is automatically looked up.
|
36
|
+
#
|
37
|
+
# Examples:
|
38
|
+
#
|
39
|
+
# # In development mode:
|
40
|
+
# <%= stylesheet_pack_tag 'calendar', 'data-turbolinks-track': 'reload' %> # =>
|
41
|
+
# <link rel="stylesheet" media="screen" href="/packs/calendar.css" data-turbolinks-track="reload" />
|
42
|
+
#
|
43
|
+
# # In production mode:
|
44
|
+
# <%= stylesheet_pack_tag 'calendar', 'data-turbolinks-track': 'reload' %> # =>
|
45
|
+
# <link rel="stylesheet" media="screen" href="/packs/calendar-1016838bab065ae1e122.css" data-turbolinks-track="reload" />
|
46
|
+
def stylesheet_pack_tag(name, **options)
|
47
|
+
stylesheet_link_tag(Webpacker::Manifest.lookup("#{name}#{compute_asset_extname(name, type: :stylesheet)}"), **options)
|
19
48
|
end
|
20
49
|
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# Singleton registry for accessing the packs path using generated manifest.
|
2
|
+
# This allows javascript_pack_tag, stylesheet_pack_tag, asset_pack_path to take a reference to,
|
3
|
+
# say, "calendar.js" or "calendar.css" and turn it into "/packs/calendar.js" or
|
4
|
+
# "/packs/calendar.css" in development. In production mode, it returns compiles
|
5
|
+
# files, # "/packs/calendar-1016838bab065ae1e314.js" and
|
6
|
+
# "/packs/calendar-1016838bab065ae1e314.css" for long-term caching
|
7
|
+
|
8
|
+
require "webpacker/file_loader"
|
9
|
+
require "webpacker/configuration"
|
10
|
+
|
11
|
+
class Webpacker::Manifest < Webpacker::FileLoader
|
12
|
+
class << self
|
13
|
+
def file_path
|
14
|
+
Webpacker::Configuration.manifest_path
|
15
|
+
end
|
16
|
+
|
17
|
+
def lookup(name)
|
18
|
+
load if Rails.env.development?
|
19
|
+
raise Webpacker::FileLoader::FileLoaderError.new("Webpacker::Manifest.load must be called first") unless instance
|
20
|
+
instance.data[name.to_s] || raise(Webpacker::FileLoader::NotFoundError.new("Can't find #{name} in #{file_path}. Is webpack still compiling?"))
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
def load
|
26
|
+
return super unless File.exist?(@path)
|
27
|
+
JSON.parse(File.read(@path))
|
28
|
+
end
|
29
|
+
end
|