webpack_driver 0.1.1 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 6d7a3afee77099a6ef19d926eaadc31999071f6e
4
- data.tar.gz: 14c9d043282e752f1bb0fb517df7bb6e4c4b9448
3
+ metadata.gz: 2f323c56cf0e293177fec824035df08310a3ee7c
4
+ data.tar.gz: d4c5a165ca89887ee598ff1d7cf30fe299e7c94b
5
5
  SHA512:
6
- metadata.gz: a579d61d73775944319200da678cbdd9a0bd0ff668c9c736f3a8e8f4b38a0aa20f8e54b729b8f27eab21ab1cef7f14f932d224286d49e4a8d287786398f0ac83
7
- data.tar.gz: df3cc01ef4950b7d48e27edd87df7471e386a84f98b60e3b7d42184bef3699ebcf7f4f874c6613fb2d9238693e1ce1f3a4ffae77120ecbe39128fd1e0f04bbdf
6
+ metadata.gz: 9b08b2724c2db81e8c84a88d8389951be28d6dfb7b60e090a40ec70339a813f9070f3495cc2ace7827ffcfa643c924c82deaeaad4340a22490795115089d7a54
7
+ data.tar.gz: fe31afa752611b232bf55b1ea5cbd49cc8ec1a1703ac60e0a409b50c6b9b1600cb2b6858182d1619f998f7b2a8d1e7169e30f5daad32eab079d9bf2596178d3d
data/.gitignore CHANGED
@@ -1,3 +1,7 @@
1
+ index.js
2
+ node_modules
3
+ package.json
4
+ yarn.lock
1
5
  /.bundle/
2
6
  /.yardoc
3
7
  /Gemfile.lock
data/README.md CHANGED
@@ -13,7 +13,7 @@ It runs the dev server in the background using the `childprocess` gem and monito
13
13
  Add this line to your application's Gemfile:
14
14
 
15
15
  ```ruby
16
- gem 'ruby_pack'
16
+ gem 'webpack_driver'
17
17
  ```
18
18
 
19
19
  And then execute:
@@ -22,17 +22,18 @@ And then execute:
22
22
 
23
23
  Or install it yourself as:
24
24
 
25
- $ gem install ruby_pack
25
+ $ gem install webpack_driver
26
26
 
27
27
  ## Usage
28
28
 
29
- Initialization, will create a `package.json`, `yarn.lock`, a bare-bones `webpack.config.js` and then run yarn install (via the [Knitter](https://github.com/nathanstitt/knitter) gem).
29
+ Initialization will create a `package.json`, `yarn.lock`, a bare-bones `webpack.config.js` and then run yarn install (via the [Knitter](https://github.com/nathanstitt/knitter) gem).
30
30
 
31
31
  ```ruby
32
- WebpackDriver.config do | config |
33
- config.directory = '/tmp/test'
34
- end
35
- WebpackDriver::Configuration.generate
32
+
33
+ config = WebpackDriver::Configuration.new(
34
+ WebpackDriver::Configuration.new('/path/to/my/webpack.config.js')
35
+ )
36
+ config.generate!
36
37
  ```
37
38
 
38
39
  Production compilation (TODO):
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+
3
+ var webpack = require("webpack");
4
+
5
+ function WebpackDriverStatusPlugin(options) {
6
+ this.options = options;
7
+ }
8
+
9
+ function log(type, value) {
10
+ console.log('STATUS:', JSON.stringify({type, value}));
11
+ }
12
+
13
+ WebpackDriverStatusPlugin.prototype.apply = function(compiler) {
14
+ var timer;
15
+
16
+ if ( compiler.options.devServer ) {
17
+ let {port, host, outputPath} = compiler.options.devServer;
18
+ log("dev-server", { port, host, outputPath });
19
+ }
20
+
21
+ // compiler.apply(new webpack.ProgressPlugin(function (percent, msg) {
22
+ // log("compile", {
23
+ // "progress": percent,
24
+ // "operation": msg,
25
+ // "ms": Date.now() - timer
26
+ // });
27
+ // }));
28
+
29
+ compiler.plugin("compile", function() {
30
+ timer = Date.now();
31
+ log("compile", {
32
+ "progress": 0,
33
+ "operation": "idle"
34
+ })
35
+ });
36
+
37
+ compiler.plugin("invalid", function() {
38
+ log("status", "invalid");
39
+ });
40
+
41
+ compiler.plugin("failed-module", function(module) {
42
+ log("failed-module", module);
43
+ });
44
+ compiler.plugin("done", function(stats) {
45
+ if (stats.compilation.errors && stats.compilation.errors.length){
46
+ log("status", "invalid");
47
+ for(var i = 0; i < stats.compilation.errors.length; i++){
48
+ var err = stats.compilation.errors[i];
49
+ log("error", {
50
+ name: err.name, message: err.message,
51
+ resource: err.module ? err.module.resource : ''
52
+ });
53
+ }
54
+ } else {
55
+ log("status", "success");
56
+ }
57
+ });
58
+
59
+ compiler.plugin("failed", function() {
60
+ log("status", "failed");
61
+ });
62
+
63
+ compiler.plugin("valid", function() {
64
+ log("status", "valid");
65
+ });
66
+
67
+ compiler.plugin("after-emit", function(compilation, callback) {
68
+ for (var k in compilation.assets){
69
+ if(!compilation.assets[k].parents){
70
+ log("asset", {name: k, size: compilation.assets[k].size()});
71
+ }
72
+ }
73
+ callback();
74
+ });
75
+
76
+ }
77
+
78
+ module.exports = WebpackDriverStatusPlugin;
@@ -2,8 +2,9 @@ module WebpackDriver
2
2
 
3
3
  class Compile < Process
4
4
 
5
- def initialize(*flags)
6
- super(WebpackDriver.config.compile_script, *flags)
5
+ def initialize(config)
6
+ config.environment ||= { NODE_ENV: 'production' }
7
+ super('webpack', config)
7
8
  end
8
9
 
9
10
  def valid?
@@ -3,23 +3,28 @@ require 'knitter'
3
3
 
4
4
  module WebpackDriver
5
5
 
6
- module Configuration
6
+ class Configuration
7
7
 
8
- class Base < Thor::Group
8
+ class Example < Thor::Group
9
9
  include Thor::Actions
10
10
 
11
+ class_option :config
12
+
13
+ attr_reader :yarn
14
+
11
15
  def self.source_root
12
- Pathname.new(__FILE__).dirname.join("..","..","..","templates")
16
+ Pathname.new(__FILE__)
17
+ .dirname.join('..', '..', '..', 'templates')
13
18
  end
14
19
 
15
20
  def set_destination_root
16
- self.destination_root = WebpackDriver.config.directory
21
+ self.destination_root = options[:config].file.dirname
22
+ @yarn = Knitter::Yarn.new(destination_root)
17
23
  end
18
24
 
19
25
  def install_using_yarn
20
- yarn = Knitter::Yarn.new(WebpackDriver.config.directory)
21
26
  yarn.init unless yarn.valid?
22
- %w{webpack webpack-dev-server}.each do | package |
27
+ %w(webpack webpack-dev-server).each do |package|
23
28
  package = Knitter::Package.new(package, yarn: yarn)
24
29
  unless package.installed?
25
30
  package.dependency_type = :development
@@ -30,11 +35,8 @@ module WebpackDriver
30
35
 
31
36
  def generate
32
37
  template("webpack.config.js", verbose: false)
33
- template("status-plugin.js", verbose: false, force: true)
34
38
  template("index.js", verbose: false, force: true)
35
39
  end
36
40
  end
37
-
38
41
  end
39
-
40
42
  end
@@ -0,0 +1,22 @@
1
+ require "thor"
2
+
3
+ module WebpackDriver
4
+
5
+ class Configuration
6
+
7
+ class Generated < Thor::Group
8
+ include Thor::Actions
9
+
10
+ class_option :config
11
+
12
+ def self.source_root
13
+ Pathname.new(__FILE__).dirname.join("..","..","..","templates")
14
+ end
15
+
16
+ def output
17
+ template("generated.config.js", options[:config].path, verbose: false, force: true)
18
+ end
19
+
20
+ end
21
+ end
22
+ end
@@ -1,15 +1,60 @@
1
- require_relative 'configuration/base'
1
+ require_relative 'configuration/generated'
2
+ require_relative 'configuration/example'
2
3
 
3
4
  module WebpackDriver
4
5
 
5
- module Configuration
6
+ class Configuration
6
7
 
7
- class << self
8
+ attr_accessor :port
9
+ attr_accessor :logger
10
+ attr_accessor :compile_script
11
+ attr_accessor :directory
12
+ attr_accessor :cmd_line_flags
13
+ attr_writer :environment
8
14
 
9
- def generate
10
- Base.start
11
- end
15
+ attr_reader :file
16
+ attr_reader :generated
17
+ attr_accessor :logger
12
18
 
19
+ ROOT = Pathname.new(__FILE__).dirname.join('..', '..')
20
+
21
+ def initialize(file = './webpack.config.js', options = {})
22
+ options.each { |k, v| send("#{k}=", v) }
23
+ @directory ||= '.'
24
+ @file = Pathname.new(file)
25
+ @generated = Tempfile.new(['webpack.config', '.js'])
26
+ Generated.new([], config: self).invoke_all
27
+ end
28
+
29
+ def generate!
30
+ Example.new([], config: self).invoke_all
31
+ end
32
+
33
+ def present?
34
+ file.exist?
35
+ end
36
+
37
+ def path
38
+ @generated.path
39
+ end
40
+
41
+ def gem_root
42
+ ROOT
43
+ end
44
+
45
+ def environment
46
+ @environment ||= { NODE_ENV: 'development' }
47
+ end
48
+
49
+ def flags
50
+ opts = ['--config', path]
51
+ opts += ['--port', port] if port
52
+ opts += cmd_line_flags if cmd_line_flags
53
+ opts
54
+ end
55
+
56
+ def logger
57
+ @logger ||= Logger.new(STDOUT)
13
58
  end
14
59
 
15
60
  end
@@ -1,35 +1,18 @@
1
1
  module WebpackDriver
2
2
 
3
-
3
+ # A wrapper around an instance of `webpak-dev-server`
4
4
  class DevServer < Process
5
5
 
6
6
  attr_reader :port, :host, :path
7
7
 
8
- # URL = /(https?:\/\/)([\da-z\.-]+)\:(\d+)\/([\da-z\.-]+\/)?/
9
-
10
- def initialize(*flags)
11
-
12
- config = WebpackDriver.config
13
- flags = ['--port', config.port] if config.port
14
- super(config.dev_server_script, *flags)
8
+ def initialize(config)
9
+ super('webpack-dev-server', config)
15
10
  end
16
11
 
17
-
18
12
  def valid?
19
13
  alive? && super
20
14
  end
21
15
 
22
- # def detected_url
23
- # match = URL.match(output)
24
- # match ? match[0] : nil
25
- # end
26
-
27
- # def detected_port
28
-
29
- # match = URL.match(output)
30
- # match ? match[3].to_i : nil
31
- # end
32
-
33
16
  private
34
17
 
35
18
  def record_message(msg)
@@ -41,5 +24,4 @@ module WebpackDriver
41
24
  super
42
25
  end
43
26
  end
44
-
45
27
  end
@@ -10,18 +10,24 @@ module WebpackDriver
10
10
 
11
11
  extend Forwardable
12
12
 
13
- attr_reader :assets, :buffer
13
+ def_delegators :@proc, :alive?, :environment, :wait
14
14
 
15
- def initialize(*flags)
15
+ attr_reader :assets, :messages
16
+ attr_reader :config
17
+
18
+ def initialize(script, config)
16
19
  self.reset!
17
- args = ["node"] + flags
20
+ @config = config
21
+ args = ["./node_modules/.bin/#{script}"] + config.flags
22
+
18
23
  @proc = ::ChildProcess.build(*args)
19
- @proc.environment['NODE_ENV'] = WebpackDriver.config.environment
20
- @proc.cwd = WebpackDriver.config.directory
21
- end
22
24
 
23
- def alive?
24
- @proc.alive?
25
+ @proc.environment.merge!(
26
+ config.environment
27
+ )
28
+ puts "ENV"
29
+ p config.environment
30
+ @proc.cwd = config.directory
25
31
  end
26
32
 
27
33
  def start
@@ -34,8 +40,8 @@ module WebpackDriver
34
40
  end
35
41
 
36
42
  def stop
37
- @output.close unless @output.closed?
38
43
  @proc.stop
44
+ @output.close unless @output.closed?
39
45
  @listener.join
40
46
  end
41
47
 
@@ -47,28 +53,44 @@ module WebpackDriver
47
53
 
48
54
  def reset!
49
55
  @assets = Concurrent::Map.new
50
- @buffer = Concurrent::Array.new
56
+ @messages = Concurrent::Array.new
51
57
  end
52
58
 
53
59
  def last_compilation_message
54
- msg = @buffer.reverse_each.detect{ |l| l['type'] == 'compile' }
60
+ msg = @messages.reverse_each.detect{ |l| l['type'] == 'compile' }
55
61
  msg ? msg['value'] : {}
56
62
  end
57
63
 
64
+ def record_error(error)
65
+ config.logger.error(
66
+ "#{error['name']}: #{error['resource']}\n#{error['message']}"
67
+ )
68
+ end
69
+
58
70
  def record_message(msg)
59
- if msg['type'] == 'asset'
71
+ case msg['type']
72
+ when 'asset'
60
73
  name = msg['value']['name']
61
74
  @assets[name] = Asset.new(name, msg['value']['size'])
75
+ when 'error'
76
+ record_error(msg['value'])
77
+ else
78
+ config.logger.debug(msg)
62
79
  end
63
- @buffer << msg
80
+ @messages << msg
64
81
  end
65
82
 
66
83
 
67
84
  def listen_for_status_updates
68
85
  Thread.new do
69
86
  @output.each_line do | l |
70
- match = l.match(/STATUS: (.*)/)
71
- record_message(JSON.parse(match[1])) if match
87
+ match = l.match(/^STATUS: (.*)/)
88
+ if match
89
+ record_message(JSON.parse(match[1]))
90
+ config.logger.debug(l.chomp)
91
+ else
92
+ config.logger.info(l.chomp)
93
+ end
72
94
  end
73
95
  end
74
96
  end
@@ -1,3 +1,3 @@
1
1
  module WebpackDriver
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.0"
3
3
  end
@@ -1,21 +1,7 @@
1
1
  require_relative "webpack_driver/version"
2
- require_relative "webpack_driver/config_options"
3
2
  require_relative "webpack_driver/configuration"
4
3
  require_relative "webpack_driver/asset"
5
4
  require_relative 'webpack_driver/process'
6
5
  require_relative "webpack_driver/dev_server"
7
6
  require_relative "webpack_driver/compile"
8
7
  require_relative "webpack_driver/errors"
9
-
10
- module WebpackDriver
11
-
12
- def self.config
13
- @config ||= WebpackDriver::ConfigOptions.new
14
- if block_given?
15
- yield @config
16
- @config.after_configuration
17
- end
18
- @config
19
- end
20
-
21
- end
@@ -0,0 +1,10 @@
1
+ var config = require('<%= options[:config].file %>');
2
+ var WebpackDriverStatusPlugin = require('<%= options[:config].gem_root %>/lib/status-plugin.js');
3
+
4
+ config.plugins = (config.plugins || []);
5
+
6
+ config.plugins.push(
7
+ new WebpackDriverStatusPlugin()
8
+ );
9
+
10
+ module.exports = config;
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: webpack_driver
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nathan Stitt
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-01-14 00:00:00.000000000 Z
11
+ date: 2017-02-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: knitter
@@ -141,16 +141,18 @@ files:
141
141
  - bin/console
142
142
  - bin/setup
143
143
  - lib/config.rb
144
+ - lib/status-plugin.js
144
145
  - lib/webpack_driver.rb
145
146
  - lib/webpack_driver/asset.rb
146
147
  - lib/webpack_driver/compile.rb
147
- - lib/webpack_driver/config_options.rb
148
148
  - lib/webpack_driver/configuration.rb
149
- - lib/webpack_driver/configuration/base.rb
149
+ - lib/webpack_driver/configuration/example.rb
150
+ - lib/webpack_driver/configuration/generated.rb
150
151
  - lib/webpack_driver/dev_server.rb
151
152
  - lib/webpack_driver/errors.rb
152
153
  - lib/webpack_driver/process.rb
153
154
  - lib/webpack_driver/version.rb
155
+ - templates/generated.config.js.tt
154
156
  - templates/index.js.tt
155
157
  - templates/status-plugin.js.tt
156
158
  - templates/webpack.config.js.tt
@@ -176,7 +178,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
176
178
  version: '0'
177
179
  requirements: []
178
180
  rubyforge_project:
179
- rubygems_version: 2.6.8
181
+ rubygems_version: 2.5.1
180
182
  signing_key:
181
183
  specification_version: 4
182
184
  summary: Run webpack-dev-server in a sub process
@@ -1,23 +0,0 @@
1
- module WebpackDriver
2
-
3
- class ConfigOptions
4
-
5
- attr_accessor :port
6
- attr_accessor :directory
7
- attr_accessor :environment
8
- attr_accessor :compile_script
9
- attr_accessor :dev_server_script
10
-
11
- def initialize
12
- @directory = Pathname.new(Dir.pwd)
13
- @environment = 'development'
14
- @compile_script = 'node_modules/webpack/bin/webpack.js'
15
- @dev_server_script = 'node_modules/webpack-dev-server/bin/webpack-dev-server.js' end
16
-
17
- def after_configuration
18
- @directory = Pathname.new(@directory)
19
- end
20
-
21
- end
22
-
23
- end