sprockets-webpack 0.0.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 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
@@ -0,0 +1,6 @@
1
+ module Sprockets
2
+ module Webpack
3
+ class WebpackError < RuntimeError
4
+ end
5
+ end
6
+ 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: