sprockets-webpack 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/generators/webpack/install/install_generator.rb +36 -0
- data/lib/sprockets/webpack.rb +16 -0
- data/lib/sprockets/webpack/file_guard.rb +17 -0
- data/lib/sprockets/webpack/webpack_directive_processor.rb +72 -0
- data/lib/sprockets/webpack/webpack_driver.rb +58 -0
- data/lib/sprockets/webpack/webpack_error.rb +6 -0
- metadata +92 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 694c7fac7f7516d6377db228c84b0830d3abae0a
|
4
|
+
data.tar.gz: daba8af0d8350e1dbc421c8414f6fb2031ddaed0
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f2ba3589031ce16074b1e121234073cdae3434baf911f91113643e55d8432545ef0756b6da4bfa43cd6a30a2029dfab0bc64cc3de78b88240a883e293557109e
|
7
|
+
data.tar.gz: 441972622d8e6a2fcf0231246fd89a871594a596867a5e22d4e8971c6c6739dd1f7e6405a6dae2c0539e84c507fa7952e4a1d91fca8aead83aa53fdbdb3ec11a
|
@@ -0,0 +1,36 @@
|
|
1
|
+
module Webpack
|
2
|
+
class InstallGenerator < Rails::Generators::Base
|
3
|
+
desc 'This generator creates an initializer file at config/initializers'
|
4
|
+
|
5
|
+
def self.source_root
|
6
|
+
@source_root ||= File.expand_path(File.join(File.dirname(__FILE__), 'templates'))
|
7
|
+
end
|
8
|
+
|
9
|
+
def create_barebone_file
|
10
|
+
template 'config/webpack.config.js'
|
11
|
+
template 'package.json'
|
12
|
+
template '.slugignore'
|
13
|
+
end
|
14
|
+
|
15
|
+
def create_sample_assets
|
16
|
+
template 'app/assets/webpack/index.js'
|
17
|
+
if File.exist?('app/assets/javascripts/application.js')
|
18
|
+
append_to_file 'app/assets/javascripts/application.js' do
|
19
|
+
"\n//= require_webpack_tree ../webpack\n"
|
20
|
+
end
|
21
|
+
else
|
22
|
+
puts "WARNING: remember to add //= require_webpack_tree ../webpack to your application.js"
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def adjust_gitignore
|
27
|
+
if File.exist?('.gitignore')
|
28
|
+
append_to_file '.gitignore', "\n/node_modules\n"
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def add_packages
|
33
|
+
system 'npm install webpack babel-core babel-loader babel-preset-es2015 babel-preset-react --save'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'sprockets'
|
2
|
+
require_relative 'webpack/webpack_directive_processor'
|
3
|
+
|
4
|
+
module Sprockets
|
5
|
+
module Webpack
|
6
|
+
if defined?(::Rails)
|
7
|
+
class Railtie < ::Rails::Railtie
|
8
|
+
config.to_prepare do
|
9
|
+
ENV['NODE_PATH'] ||= String(::Rails.root.join('node_modules'))
|
10
|
+
Sprockets.unregister_processor('application/javascript', Sprockets::DirectiveProcessor)
|
11
|
+
Sprockets.register_processor('application/javascript', WebpackDirectiveProcessor)
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module Sprockets
|
2
|
+
module Webpack
|
3
|
+
class FileGuard
|
4
|
+
def initialize(path)
|
5
|
+
@path = Pathname.new(path)
|
6
|
+
@last_mtime = @path.mtime
|
7
|
+
end
|
8
|
+
|
9
|
+
def detect_change?
|
10
|
+
current_mtime = @path.mtime
|
11
|
+
@last_mtime < current_mtime
|
12
|
+
ensure
|
13
|
+
@last_mtime = current_mtime
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require_relative './webpack_driver'
|
2
|
+
require_relative './webpack_error'
|
3
|
+
|
4
|
+
module Sprockets
|
5
|
+
module Webpack
|
6
|
+
class WebpackDirectiveProcessor < Sprockets::DirectiveProcessor
|
7
|
+
def process_require_webpack_tree_directive(path = '.')
|
8
|
+
absolute_path = expand_relative_dirname(:require_tree, path)
|
9
|
+
entry = entry_from_absolute_path(absolute_path)
|
10
|
+
|
11
|
+
add_path_to_dependencies_list(absolute_path)
|
12
|
+
add_webpack_config_to_dependencies_list
|
13
|
+
|
14
|
+
compiled = driver_for(entry).compile
|
15
|
+
logger.info "WEBPACK: #{compiled.benchmark}"
|
16
|
+
|
17
|
+
assert_no_errors(compiled.errors)
|
18
|
+
|
19
|
+
@webpack_data = compiled.data
|
20
|
+
end
|
21
|
+
|
22
|
+
def _call(_)
|
23
|
+
result = super
|
24
|
+
super.merge(data: result[:data] + "\n\n\n" + @webpack_data)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
def assert_no_errors(errors)
|
30
|
+
fail WebpackError, errors.join("\n") if errors.any?
|
31
|
+
end
|
32
|
+
|
33
|
+
def entry_from_absolute_path(absolute_path)
|
34
|
+
Pathname.new(absolute_path).join('index.js').tap do |entry|
|
35
|
+
fail WebpackError, "#{entry} doesn't exist" unless entry.exist?
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def webpack_config
|
40
|
+
defined?(::Rails) ? ::Rails.root.join('config/webpack.config.js') : 'webpack.config.js'
|
41
|
+
end
|
42
|
+
|
43
|
+
def driver_for(entry)
|
44
|
+
entry = String(entry)
|
45
|
+
$webpack_drivers ||= {}
|
46
|
+
$webpack_drivers[entry] ||= WebpackDriver.new(webpack_config, entry)
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_path_to_dependencies_list(path)
|
50
|
+
require_webpack_paths(*@environment.stat_sorted_tree_with_dependencies(path))
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_webpack_config_to_dependencies_list
|
54
|
+
@dependencies << "file-digest://#{webpack_config}"
|
55
|
+
end
|
56
|
+
|
57
|
+
def require_webpack_paths(paths, deps)
|
58
|
+
# this adds files to "dependencies" list as a side effect
|
59
|
+
resolve_paths(paths, deps, accept: @content_type, pipeline: :self) do |_uri|
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
def logger
|
64
|
+
defined?(::Rails) ? ::Rails.logger : stderr_logger
|
65
|
+
end
|
66
|
+
|
67
|
+
def stderr_logger
|
68
|
+
@stderr_logger ||= Logger.new(STDERR)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'pathname'
|
2
|
+
require 'benchmark'
|
3
|
+
require_relative './file_guard'
|
4
|
+
|
5
|
+
module Sprockets
|
6
|
+
module Webpack
|
7
|
+
class WebpackDriver
|
8
|
+
def initialize(config, entry)
|
9
|
+
@tempfile = Tempfile.new('bundle.XXXXXXXXX.js')
|
10
|
+
@config_guard = FileGuard.new(config)
|
11
|
+
cmd = "node #{compiler_js_path} #{config} #{entry} #{path.dirname} #{path.basename} 2>&1"
|
12
|
+
@io = IO.popen({ 'NODE_ENV' => env }, cmd, 'r+')
|
13
|
+
end
|
14
|
+
|
15
|
+
def compile
|
16
|
+
errors = []
|
17
|
+
|
18
|
+
@io.puts(@config_guard.detect_change? ? 'RELOAD' : '') # starts compilation
|
19
|
+
|
20
|
+
bm = Benchmark.measure do
|
21
|
+
while (line = read_line.strip) != 'WEBPACK::EOF'
|
22
|
+
errors << line
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
OpenStruct.new(errors: errors, data: path.read, benchmark: bm)
|
27
|
+
rescue Errno::EPIPE, IOError
|
28
|
+
errors.unshift '----- NODE BACKTRACE -----'
|
29
|
+
errors.unshift "#{$ERROR_INFO.message}. Please check webpack.conf.js and restart web server"
|
30
|
+
errors.unshift
|
31
|
+
OpenStruct.new(
|
32
|
+
errors: errors,
|
33
|
+
data: 'console.error("Broken pipe. Webpack died.")',
|
34
|
+
benchmark: "<#{@io.pid} died>")
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def read_line
|
40
|
+
@io.gets or fail IOError, 'Webpack died'
|
41
|
+
end
|
42
|
+
|
43
|
+
def env
|
44
|
+
ENV.fetch('NODE_ENV') do
|
45
|
+
defined?(::Rails) ? ::Rails.env : (ENV['RACK_ENV'] || 'development')
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def compiler_js_path
|
50
|
+
Pathname.new(__FILE__).dirname.join('compiler.js')
|
51
|
+
end
|
52
|
+
|
53
|
+
def path
|
54
|
+
@path ||= Pathname.new(@tempfile.path)
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: sprockets-webpack
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Vladimir Yartsev
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-06-01 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: sprockets
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 3.0.0
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 3.0.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: rake
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: minitest
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
description: require_webpack_tree directive for Sprockets
|
56
|
+
email: vovayartsev@gmail.com
|
57
|
+
executables: []
|
58
|
+
extensions: []
|
59
|
+
extra_rdoc_files: []
|
60
|
+
files:
|
61
|
+
- lib/generators/webpack/install/install_generator.rb
|
62
|
+
- lib/sprockets/webpack.rb
|
63
|
+
- lib/sprockets/webpack/file_guard.rb
|
64
|
+
- lib/sprockets/webpack/webpack_directive_processor.rb
|
65
|
+
- lib/sprockets/webpack/webpack_driver.rb
|
66
|
+
- lib/sprockets/webpack/webpack_error.rb
|
67
|
+
homepage: http://rubygems.org/vovayartsev/sprockets/webpack
|
68
|
+
licenses:
|
69
|
+
- MIT
|
70
|
+
metadata: {}
|
71
|
+
post_install_message:
|
72
|
+
rdoc_options: []
|
73
|
+
require_paths:
|
74
|
+
- lib
|
75
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
76
|
+
requirements:
|
77
|
+
- - ">="
|
78
|
+
- !ruby/object:Gem::Version
|
79
|
+
version: '0'
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
requirements:
|
82
|
+
- - ">="
|
83
|
+
- !ruby/object:Gem::Version
|
84
|
+
version: '0'
|
85
|
+
requirements: []
|
86
|
+
rubyforge_project:
|
87
|
+
rubygems_version: 2.5.1
|
88
|
+
signing_key:
|
89
|
+
specification_version: 4
|
90
|
+
summary: Sprockets + Webpack
|
91
|
+
test_files: []
|
92
|
+
has_rdoc:
|