webpack_driver 0.1.1 → 0.2.0

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 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