webpacker-jets 3.2.100
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/.gitignore +6 -0
- data/.rubocop.yml +124 -0
- data/.travis.yml +32 -0
- data/CHANGELOG.md +523 -0
- data/Gemfile +13 -0
- data/Gemfile.lock +154 -0
- data/MIT-LICENSE +20 -0
- data/README.md +445 -0
- data/Rakefile +12 -0
- data/docs/assets.md +106 -0
- data/docs/cloud9.md +310 -0
- data/docs/css.md +116 -0
- data/docs/deployment.md +74 -0
- data/docs/docker.md +49 -0
- data/docs/env.md +65 -0
- data/docs/es6.md +53 -0
- data/docs/folder-structure.md +66 -0
- data/docs/misc.md +23 -0
- data/docs/props.md +223 -0
- data/docs/testing.md +128 -0
- data/docs/troubleshooting.md +119 -0
- data/docs/typescript.md +116 -0
- data/docs/webpack-dev-server.md +92 -0
- data/docs/webpack.md +297 -0
- data/docs/yarn.md +12 -0
- data/exe/webpack +8 -0
- data/exe/webpack-dev-server +8 -0
- data/gemfiles/Gemfile-rails-edge +13 -0
- data/gemfiles/Gemfile-rails.4.2.x +10 -0
- data/gemfiles/Gemfile-rails.5.0.x +10 -0
- data/gemfiles/Gemfile-rails.5.1.x +10 -0
- data/lib/install/angular.rb +27 -0
- data/lib/install/coffee.rb +22 -0
- data/lib/install/config/.babelrc +18 -0
- data/lib/install/config/.postcssrc.yml +3 -0
- data/lib/install/config/webpack/development.js +3 -0
- data/lib/install/config/webpack/environment.js +3 -0
- data/lib/install/config/webpack/production.js +3 -0
- data/lib/install/config/webpack/staging.js +3 -0
- data/lib/install/config/webpack/test.js +3 -0
- data/lib/install/config/webpacker.yml +79 -0
- data/lib/install/elm.rb +38 -0
- data/lib/install/erb.rb +22 -0
- data/lib/install/examples/angular/hello_angular.js +7 -0
- data/lib/install/examples/angular/hello_angular/app/app.component.ts +9 -0
- data/lib/install/examples/angular/hello_angular/app/app.module.ts +16 -0
- data/lib/install/examples/angular/hello_angular/index.ts +8 -0
- data/lib/install/examples/angular/hello_angular/polyfills.ts +73 -0
- data/lib/install/examples/angular/tsconfig.json +19 -0
- data/lib/install/examples/coffee/hello_coffee.coffee +4 -0
- data/lib/install/examples/elm/Main.elm +54 -0
- data/lib/install/examples/elm/hello_elm.js +12 -0
- data/lib/install/examples/erb/hello_erb.js.erb +6 -0
- data/lib/install/examples/react/.babelrc +6 -0
- data/lib/install/examples/react/hello_react.jsx +26 -0
- data/lib/install/examples/vue/app.vue +22 -0
- data/lib/install/examples/vue/hello_vue.js +70 -0
- data/lib/install/javascript/packs/application.js +10 -0
- data/lib/install/loaders/coffee.js +6 -0
- data/lib/install/loaders/elm.js +23 -0
- data/lib/install/loaders/erb.js +11 -0
- data/lib/install/loaders/typescript.js +6 -0
- data/lib/install/loaders/vue.js +13 -0
- data/lib/install/react.rb +28 -0
- data/lib/install/template.rb +37 -0
- data/lib/install/vue.rb +26 -0
- data/lib/tasks/installers.rake +24 -0
- data/lib/tasks/webpacker.rake +22 -0
- data/lib/tasks/webpacker/check_binstubs.rake +12 -0
- data/lib/tasks/webpacker/check_node.rake +24 -0
- data/lib/tasks/webpacker/check_yarn.rake +24 -0
- data/lib/tasks/webpacker/clobber.rake +16 -0
- data/lib/tasks/webpacker/compile.rake +41 -0
- data/lib/tasks/webpacker/install.rake +13 -0
- data/lib/tasks/webpacker/verify_install.rake +16 -0
- data/lib/tasks/webpacker/yarn_install.rake +6 -0
- data/lib/webpacker.rb +32 -0
- data/lib/webpacker/commands.rb +23 -0
- data/lib/webpacker/compiler.rb +88 -0
- data/lib/webpacker/configuration.rb +87 -0
- data/lib/webpacker/dev_server.rb +61 -0
- data/lib/webpacker/dev_server_proxy.rb +26 -0
- data/lib/webpacker/dev_server_runner.rb +51 -0
- data/lib/webpacker/helper.rb +66 -0
- data/lib/webpacker/instance.rb +44 -0
- data/lib/webpacker/manifest.rb +75 -0
- data/lib/webpacker/railtie.rb +82 -0
- data/lib/webpacker/rake_tasks.rb +6 -0
- data/lib/webpacker/runner.rb +22 -0
- data/lib/webpacker/version.rb +9 -0
- data/lib/webpacker/webpack_runner.rb +15 -0
- data/package.json +67 -0
- data/package/__tests__/environment.js +74 -0
- data/package/config.js +34 -0
- data/package/config_types/__tests__/config_list.js +123 -0
- data/package/config_types/__tests__/config_object.js +43 -0
- data/package/config_types/config_list.js +85 -0
- data/package/config_types/config_object.js +55 -0
- data/package/config_types/index.js +7 -0
- data/package/environment.js +116 -0
- data/package/environments/development.js +46 -0
- data/package/environments/production.js +37 -0
- data/package/environments/test.js +3 -0
- data/package/index.js +20 -0
- data/package/rules/babel.js +13 -0
- data/package/rules/css.js +39 -0
- data/package/rules/file.js +13 -0
- data/package/rules/index.js +11 -0
- data/package/rules/sass.js +15 -0
- data/package/utils/__tests__/deep_assign.js +11 -0
- data/package/utils/__tests__/deep_merge.js +10 -0
- data/package/utils/__tests__/objectify.js +9 -0
- data/package/utils/deep_assign.js +22 -0
- data/package/utils/deep_merge.js +23 -0
- data/package/utils/helpers.js +32 -0
- data/package/utils/objectify.js +4 -0
- data/test/command_test.rb +27 -0
- data/test/compiler_test.rb +35 -0
- data/test/configuration_test.rb +69 -0
- data/test/dev_server_test.rb +24 -0
- data/test/helper_test.rb +52 -0
- data/test/manifest_test.rb +28 -0
- data/test/rake_tasks_test.rb +29 -0
- data/test/test_app/Rakefile +3 -0
- data/test/test_app/app/javascript/packs/application.js +10 -0
- data/test/test_app/config/application.rb +11 -0
- data/test/test_app/config/environment.rb +4 -0
- data/test/test_app/config/webpacker.yml +65 -0
- data/test/test_app/public/packs/manifest.json +6 -0
- data/test/test_helper.rb +29 -0
- data/webpacker-jets.gemspec +29 -0
- data/yarn.lock +5768 -0
- metadata +250 -0
data/lib/webpacker.rb
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
# webpack relies on rails which uses these core_ext but since
|
2
|
+
# we're not entirely requiring rails we need to require all the core_ext
|
3
|
+
# individually, yeah a bit of a pain
|
4
|
+
require "active_support/core_ext/object"
|
5
|
+
require "active_support/core_ext/hash"
|
6
|
+
require "active_support/core_ext/module/attribute_accessors"
|
7
|
+
require "active_support/logger"
|
8
|
+
require "active_support/tagged_logging"
|
9
|
+
|
10
|
+
module Webpacker
|
11
|
+
extend self
|
12
|
+
|
13
|
+
def instance=(instance)
|
14
|
+
@instance = instance
|
15
|
+
end
|
16
|
+
|
17
|
+
def instance
|
18
|
+
@instance ||= Webpacker::Instance.new
|
19
|
+
end
|
20
|
+
|
21
|
+
delegate :logger, :logger=, :env, to: :instance
|
22
|
+
delegate :config, :compiler, :manifest, :commands, :dev_server, to: :instance
|
23
|
+
delegate :bootstrap, :clobber, :compile, to: :commands
|
24
|
+
end
|
25
|
+
|
26
|
+
require "webpacker/instance"
|
27
|
+
require "webpacker/configuration"
|
28
|
+
require "webpacker/manifest"
|
29
|
+
require "webpacker/compiler"
|
30
|
+
require "webpacker/commands"
|
31
|
+
require "webpacker/dev_server"
|
32
|
+
require "webpacker/rake_tasks"
|
@@ -0,0 +1,23 @@
|
|
1
|
+
class Webpacker::Commands
|
2
|
+
delegate :config, :compiler, :manifest, to: :@webpacker
|
3
|
+
|
4
|
+
def initialize(webpacker)
|
5
|
+
@webpacker = webpacker
|
6
|
+
end
|
7
|
+
|
8
|
+
def clobber
|
9
|
+
config.public_output_path.rmtree if config.public_output_path.exist?
|
10
|
+
config.cache_path.rmtree if config.cache_path.exist?
|
11
|
+
end
|
12
|
+
|
13
|
+
def bootstrap
|
14
|
+
config.refresh
|
15
|
+
manifest.refresh
|
16
|
+
end
|
17
|
+
|
18
|
+
def compile
|
19
|
+
compiler.compile.tap do |success|
|
20
|
+
manifest.refresh if success
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,88 @@
|
|
1
|
+
require "open3"
|
2
|
+
require "digest/sha1"
|
3
|
+
|
4
|
+
class Webpacker::Compiler
|
5
|
+
# Additional paths that test compiler needs to watch
|
6
|
+
# Webpacker::Compiler.watched_paths << 'bower_components'
|
7
|
+
cattr_accessor(:watched_paths) { [] }
|
8
|
+
|
9
|
+
# Additional environment variables that the compiler is being run with
|
10
|
+
# Webpacker::Compiler.env['FRONTEND_API_KEY'] = 'your_secret_key'
|
11
|
+
cattr_accessor(:env) { {} }
|
12
|
+
|
13
|
+
delegate :config, :logger, to: :@webpacker
|
14
|
+
|
15
|
+
def initialize(webpacker)
|
16
|
+
@webpacker = webpacker
|
17
|
+
end
|
18
|
+
|
19
|
+
def compile
|
20
|
+
if stale?
|
21
|
+
record_compilation_digest
|
22
|
+
run_webpack
|
23
|
+
else
|
24
|
+
true
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns true if all the compiled packs are up to date with the underlying asset files.
|
29
|
+
def fresh?
|
30
|
+
watched_files_digest == last_compilation_digest
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns true if the compiled packs are out of date with the underlying asset files.
|
34
|
+
def stale?
|
35
|
+
!fresh?
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
def last_compilation_digest
|
40
|
+
compilation_digest_path.read if compilation_digest_path.exist? && config.public_manifest_path.exist?
|
41
|
+
end
|
42
|
+
|
43
|
+
def watched_files_digest
|
44
|
+
files = Dir[*default_watched_paths, *watched_paths].reject { |f| File.directory?(f) }
|
45
|
+
Digest::SHA1.hexdigest(files.map { |f| "#{File.basename(f)}/#{File.mtime(f).utc.to_i}" }.join("/"))
|
46
|
+
end
|
47
|
+
|
48
|
+
def record_compilation_digest
|
49
|
+
config.cache_path.mkpath
|
50
|
+
compilation_digest_path.write(watched_files_digest)
|
51
|
+
end
|
52
|
+
|
53
|
+
def run_webpack
|
54
|
+
logger.info "Compiling…"
|
55
|
+
|
56
|
+
sterr, stdout, status = Open3.capture3(webpack_env, "bundle exec webpack")
|
57
|
+
|
58
|
+
if status.success?
|
59
|
+
logger.info "Compiled all packs in #{config.public_output_path}"
|
60
|
+
else
|
61
|
+
logger.error "Compilation failed:\n#{sterr}\n#{stdout}"
|
62
|
+
end
|
63
|
+
|
64
|
+
status.success?
|
65
|
+
end
|
66
|
+
|
67
|
+
def default_watched_paths
|
68
|
+
[
|
69
|
+
*config.resolved_paths_globbed,
|
70
|
+
"#{config.source_path.relative_path_from(Jets.root)}/**/*",
|
71
|
+
"yarn.lock", "package.json",
|
72
|
+
"config/webpack/**/*"
|
73
|
+
].freeze
|
74
|
+
end
|
75
|
+
|
76
|
+
def compilation_digest_path
|
77
|
+
config.cache_path.join(".last-compilation-digest-#{Webpacker.env}")
|
78
|
+
end
|
79
|
+
|
80
|
+
def webpack_env
|
81
|
+
begin
|
82
|
+
asset_host = ActionController::Base.helpers.compute_asset_host
|
83
|
+
rescue NameError
|
84
|
+
asset_host = nil
|
85
|
+
end
|
86
|
+
env.merge("NODE_ENV" => @webpacker.env, "WEBPACKER_ASSET_HOST" => asset_host)
|
87
|
+
end
|
88
|
+
end
|
@@ -0,0 +1,87 @@
|
|
1
|
+
class Webpacker::Configuration
|
2
|
+
delegate :root_path, :config_path, :env, to: :@webpacker
|
3
|
+
|
4
|
+
def initialize(webpacker)
|
5
|
+
@webpacker = webpacker
|
6
|
+
end
|
7
|
+
|
8
|
+
def refresh
|
9
|
+
@data = load
|
10
|
+
end
|
11
|
+
|
12
|
+
def dev_server
|
13
|
+
fetch(:dev_server)
|
14
|
+
end
|
15
|
+
|
16
|
+
def compile?
|
17
|
+
fetch(:compile)
|
18
|
+
end
|
19
|
+
|
20
|
+
def source_path
|
21
|
+
root_path.join(fetch(:source_path))
|
22
|
+
end
|
23
|
+
|
24
|
+
def resolved_paths
|
25
|
+
fetch(:resolved_paths)
|
26
|
+
end
|
27
|
+
|
28
|
+
def resolved_paths_globbed
|
29
|
+
resolved_paths.map { |p| "#{p}/**/*" }
|
30
|
+
end
|
31
|
+
|
32
|
+
def source_entry_path
|
33
|
+
source_path.join(fetch(:source_entry_path))
|
34
|
+
end
|
35
|
+
|
36
|
+
def public_path
|
37
|
+
root_path.join("public")
|
38
|
+
end
|
39
|
+
|
40
|
+
def public_output_path
|
41
|
+
public_path.join(fetch(:public_output_path))
|
42
|
+
end
|
43
|
+
|
44
|
+
def public_manifest_path
|
45
|
+
public_output_path.join("manifest.json")
|
46
|
+
end
|
47
|
+
|
48
|
+
def cache_manifest?
|
49
|
+
fetch(:cache_manifest)
|
50
|
+
end
|
51
|
+
|
52
|
+
def cache_path
|
53
|
+
root_path.join(fetch(:cache_path))
|
54
|
+
end
|
55
|
+
|
56
|
+
def extensions
|
57
|
+
fetch(:extensions)
|
58
|
+
end
|
59
|
+
|
60
|
+
private
|
61
|
+
def fetch(key)
|
62
|
+
data.fetch(key, defaults[key])
|
63
|
+
end
|
64
|
+
|
65
|
+
def data
|
66
|
+
@data ||= load
|
67
|
+
end
|
68
|
+
|
69
|
+
def load
|
70
|
+
YAML.load(config_path.read)[env].deep_symbolize_keys
|
71
|
+
|
72
|
+
rescue Errno::ENOENT => e
|
73
|
+
raise "Webpacker configuration file not found #{config_path}. " \
|
74
|
+
"Please run rails webpacker:install " \
|
75
|
+
"Error: #{e.message}"
|
76
|
+
|
77
|
+
rescue Psych::SyntaxError => e
|
78
|
+
raise "YAML syntax error occurred while parsing #{config_path}. " \
|
79
|
+
"Please note that YAML must be consistently indented using spaces. Tabs are not allowed. " \
|
80
|
+
"Error: #{e.message}"
|
81
|
+
end
|
82
|
+
|
83
|
+
def defaults
|
84
|
+
@defaults ||= \
|
85
|
+
HashWithIndifferentAccess.new(YAML.load_file(File.expand_path("../../install/config/webpacker.yml", __FILE__))[env])
|
86
|
+
end
|
87
|
+
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
class Webpacker::DevServer
|
2
|
+
# Configure dev server connection timeout (in seconds), default: 0.01
|
3
|
+
# Webpacker.dev_server.connect_timeout = 1
|
4
|
+
cattr_accessor(:connect_timeout) { 0.01 }
|
5
|
+
|
6
|
+
delegate :config, to: :@webpacker
|
7
|
+
|
8
|
+
def initialize(webpacker)
|
9
|
+
@webpacker = webpacker
|
10
|
+
end
|
11
|
+
|
12
|
+
def running?
|
13
|
+
Socket.tcp(host, port, connect_timeout: connect_timeout).close
|
14
|
+
true
|
15
|
+
rescue
|
16
|
+
false
|
17
|
+
end
|
18
|
+
|
19
|
+
def hot_module_replacing?
|
20
|
+
case fetch(:hmr)
|
21
|
+
when true, "true"
|
22
|
+
true
|
23
|
+
else
|
24
|
+
false
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def host
|
29
|
+
fetch(:host)
|
30
|
+
end
|
31
|
+
|
32
|
+
def port
|
33
|
+
fetch(:port)
|
34
|
+
end
|
35
|
+
|
36
|
+
def https?
|
37
|
+
case fetch(:https)
|
38
|
+
when true, "true"
|
39
|
+
true
|
40
|
+
else
|
41
|
+
false
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def protocol
|
46
|
+
https? ? "https" : "http"
|
47
|
+
end
|
48
|
+
|
49
|
+
def host_with_port
|
50
|
+
"#{host}:#{port}"
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
def fetch(key)
|
55
|
+
ENV["WEBPACKER_DEV_SERVER_#{key.upcase}"] || config.dev_server.fetch(key, defaults[key])
|
56
|
+
end
|
57
|
+
|
58
|
+
def defaults
|
59
|
+
config.send(:defaults)[:dev_server]
|
60
|
+
end
|
61
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require "rack/proxy"
|
2
|
+
|
3
|
+
class Webpacker::DevServerProxy < Rack::Proxy
|
4
|
+
def rewrite_response(response)
|
5
|
+
_status, headers, _body = response
|
6
|
+
headers.delete "transfer-encoding"
|
7
|
+
headers.delete "content-length" if Webpacker.dev_server.running? && Webpacker.dev_server.https?
|
8
|
+
response
|
9
|
+
end
|
10
|
+
|
11
|
+
def perform_request(env)
|
12
|
+
if env["PATH_INFO"].start_with?("/#{public_output_uri_path}") && Webpacker.dev_server.running?
|
13
|
+
env["HTTP_HOST"] = env["HTTP_X_FORWARDED_HOST"] = env["HTTP_X_FORWARDED_SERVER"] = Webpacker.dev_server.host_with_port
|
14
|
+
env["SCRIPT_NAME"] = ""
|
15
|
+
|
16
|
+
super(env)
|
17
|
+
else
|
18
|
+
@app.call(env)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
def public_output_uri_path
|
24
|
+
Webpacker.config.public_output_path.relative_path_from(Webpacker.config.public_path)
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require "shellwords"
|
2
|
+
require "yaml"
|
3
|
+
require "socket"
|
4
|
+
require "webpacker/runner"
|
5
|
+
|
6
|
+
module Webpacker
|
7
|
+
class DevServerRunner < Webpacker::Runner
|
8
|
+
def run
|
9
|
+
load_config
|
10
|
+
detect_port!
|
11
|
+
execute_cmd
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
def load_config
|
16
|
+
@config_file = File.join(@app_path, "config/webpacker.yml")
|
17
|
+
dev_server = YAML.load_file(@config_file)[ENV["JETS_ENV"]]["dev_server"]
|
18
|
+
|
19
|
+
@hostname = dev_server["host"]
|
20
|
+
@port = dev_server["port"]
|
21
|
+
@pretty = dev_server.fetch("pretty", true)
|
22
|
+
|
23
|
+
rescue Errno::ENOENT, NoMethodError
|
24
|
+
$stdout.puts "webpack dev_server configuration not found in #{@config_file}."
|
25
|
+
$stdout.puts "Please run jets webpacker:install to install Webpacker"
|
26
|
+
exit!
|
27
|
+
end
|
28
|
+
|
29
|
+
def detect_port!
|
30
|
+
server = TCPServer.new(@hostname, @port)
|
31
|
+
server.close
|
32
|
+
|
33
|
+
rescue Errno::EADDRINUSE
|
34
|
+
$stdout.puts "Another program is running on port #{@port}. Set a new port in #{@config_file} for dev_server"
|
35
|
+
exit!
|
36
|
+
end
|
37
|
+
|
38
|
+
def execute_cmd
|
39
|
+
env = { "NODE_PATH" => @node_modules_path.shellescape }
|
40
|
+
cmd = [
|
41
|
+
"#{@node_modules_path}/.bin/webpack-dev-server",
|
42
|
+
"--config", @webpack_config
|
43
|
+
]
|
44
|
+
cmd += ["--progress", "--color"] if @pretty
|
45
|
+
|
46
|
+
Dir.chdir(@app_path) do
|
47
|
+
exec env, *cmd
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
module Webpacker::Helper
|
2
|
+
# Computes the relative path for a given Webpacker asset.
|
3
|
+
# Return relative path using manifest.json and passes it to asset_path helper
|
4
|
+
# This will use asset_path internally, so most of their behaviors will be the same.
|
5
|
+
#
|
6
|
+
# Example:
|
7
|
+
#
|
8
|
+
# <%= asset_pack_path 'calendar.css' %> # => "/packs/calendar-1016838bab065ae1e122.css"
|
9
|
+
def asset_pack_path(name, **options)
|
10
|
+
asset_path(Webpacker.manifest.lookup!(name), **options)
|
11
|
+
end
|
12
|
+
|
13
|
+
# Computes the absolute path for a given Webpacker asset.
|
14
|
+
# Return absolute path using manifest.json and passes it to asset_url helper
|
15
|
+
# This will use asset_url internally, so most of their behaviors will be the same.
|
16
|
+
#
|
17
|
+
# Example:
|
18
|
+
#
|
19
|
+
# <%= asset_pack_url 'calendar.css' %> # => "http://example.com/packs/calendar-1016838bab065ae1e122.css"
|
20
|
+
def asset_pack_url(name, **options)
|
21
|
+
asset_url(Webpacker.manifest.lookup!(name), **options)
|
22
|
+
end
|
23
|
+
|
24
|
+
# Creates a script tag that references the named pack file, as compiled by webpack per the entries list
|
25
|
+
# in config/webpack/shared.js. By default, this list is auto-generated to match everything in
|
26
|
+
# app/javascript/packs/*.js. In production mode, the digested reference is automatically looked up.
|
27
|
+
#
|
28
|
+
# Example:
|
29
|
+
#
|
30
|
+
# <%= javascript_pack_tag 'calendar', 'data-turbolinks-track': 'reload' %> # =>
|
31
|
+
# <script src="/packs/calendar-1016838bab065ae1e314.js" data-turbolinks-track="reload"></script>
|
32
|
+
def javascript_pack_tag(*names, **options)
|
33
|
+
javascript_include_tag(*sources_from_pack_manifest(names, type: :javascript), **options)
|
34
|
+
end
|
35
|
+
|
36
|
+
# Creates a link tag that references the named pack file, as compiled by webpack per the entries list
|
37
|
+
# in config/webpack/shared.js. By default, this list is auto-generated to match everything in
|
38
|
+
# app/javascript/packs/*.js. In production mode, the digested reference is automatically looked up.
|
39
|
+
#
|
40
|
+
# Note: If the development server is running and hot module replacement is active, this will return nothing.
|
41
|
+
# In that setup you need to configure your styles to be inlined in your JavaScript for hot reloading.
|
42
|
+
#
|
43
|
+
# Examples:
|
44
|
+
#
|
45
|
+
# # In development mode with hot module replacement:
|
46
|
+
# <%= stylesheet_pack_tag 'calendar', 'data-turbolinks-track': 'reload' %> # =>
|
47
|
+
# nil
|
48
|
+
#
|
49
|
+
# # In production mode:
|
50
|
+
# <%= stylesheet_pack_tag 'calendar', 'data-turbolinks-track': 'reload' %> # =>
|
51
|
+
# <link rel="stylesheet" media="screen" href="/packs/calendar-1016838bab065ae1e122.css" data-turbolinks-track="reload" />
|
52
|
+
def stylesheet_pack_tag(*names, **options)
|
53
|
+
unless Webpacker.dev_server.running? && Webpacker.dev_server.hot_module_replacing?
|
54
|
+
stylesheet_link_tag(*sources_from_pack_manifest(names, type: :stylesheet), **options)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
def sources_from_pack_manifest(names, type:)
|
60
|
+
names.map { |name| Webpacker.manifest.lookup!(pack_name_with_extension(name, type: type)) }
|
61
|
+
end
|
62
|
+
|
63
|
+
def pack_name_with_extension(name, type:)
|
64
|
+
"#{name}#{compute_asset_extname(name, type: type)}"
|
65
|
+
end
|
66
|
+
end
|