sprockets-webpack 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
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: