hauler 0.2.0 → 0.3.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: 44c97c03d5cd92496e95c6114b6b41b87bbf4d2f
4
- data.tar.gz: ec2bfd1a32429b15d41d61d971e9665cc3604834
3
+ metadata.gz: 95d2666219596dd577163e01feb6471168c7c798
4
+ data.tar.gz: 3ec18ffa805f662b66bac763b851082736060aa4
5
5
  SHA512:
6
- metadata.gz: 36aed3fdde813b4acc9f3d414f04ab227406eec3dc77de06555f80e982f6a3d67ba5ce4a7116b3372a53ede0c88c3b4da234622d84696cd5bca11bd6f566b716
7
- data.tar.gz: 01e66bba70893eef6eae9d74c8611fce337670135e5bd6c7e1776533c509b3a983db4e35547d744681279d1bbdf73a50ad512b6f63c41948f34d51cc7eb21897
6
+ metadata.gz: c3ca47a8f7a010a4a217f8adffeb981010199d0ad6571bade84283591c36b5b1aea6ae354666af38ae3c172214a697042f14a880803a8678a126ef8e5663d299
7
+ data.tar.gz: 488afcfb9a812311313290ef974d7528f406ed6e5f82f4ed74086d39ba6041f0cce9dda279f3c9051da78361f536a603326b506e8b17b9d7aa953934ac43b37a
data/.eslintrc CHANGED
@@ -9,9 +9,9 @@ env:
9
9
  jest: true
10
10
 
11
11
  plugins:
12
- - flow-vars
12
+ - flowtype
13
13
 
14
14
  rules:
15
- flow-vars/define-flow-type: 1
16
- flow-vars/use-flow-type: 1
15
+ flowtype/define-flow-type: 1
16
+ flowtype/use-flow-type: 1
17
17
  max-len: [2, 140, 2]
data/Makefile CHANGED
@@ -2,6 +2,9 @@
2
2
  build_gem:
3
3
  gem build hauler.gemspec
4
4
 
5
+ publish_gem: build_gem
6
+ ls -t *.gem | head | xargs gem push && rm *.gem
7
+
5
8
  publish_npm:
6
9
  npm run build
7
10
  cd dist/
data/hauler.gemspec CHANGED
@@ -34,4 +34,6 @@ TXT
34
34
  spec.add_development_dependency 'bundler', '~> 1.12'
35
35
  spec.add_development_dependency 'rake', '~> 10.0'
36
36
  spec.add_development_dependency 'minitest', '~> 5.0'
37
+
38
+ spec.add_runtime_dependency 'react-rails', '~> 1.8'
37
39
  end
@@ -13,6 +13,11 @@ module Hauler
13
13
  template 'config/hauler.js'
14
14
  end
15
15
 
16
+ def copy_example_assets
17
+ has_file = File.exist?(Rails.root.join('app', 'assets', 'index.js'))
18
+ template 'app/assets/index.js' if !has_file
19
+ end
20
+
16
21
  def copy_eslintrc
17
22
  template 'eslintrc.json', '.eslintrc.json'
18
23
  end
@@ -26,6 +31,16 @@ module Hauler
26
31
  template 'package.json' if !has_package_json
27
32
  end
28
33
 
34
+ def add_node_modules_to_gitignore
35
+ has_gitignore = File.exist?(Rails.root.join('package.json'))
36
+ return if !has_gitignore
37
+
38
+ has_node_modules = IO.read('.gitignore').include? 'node_modules'
39
+ return if has_node_modules
40
+
41
+ inject_into_file '.gitignore', "/node_modules\n", before: /\Z/m
42
+ end
43
+
29
44
  def copy_webpack_config
30
45
  template 'webpack.config.js'
31
46
  end
@@ -6,54 +6,39 @@ module Hauler
6
6
  source_root File.expand_path('../templates', __FILE__)
7
7
 
8
8
  NPM_DEV_DEPENDENCIES = <<-TXT.freeze
9
- babel-core@6.11.4
9
+ babel-core@6.13.2
10
10
  babel-loader@6.2.4
11
11
  babel-plugin-transform-class-properties@6.11.5
12
- babel-preset-es2015@6.9.0
13
- babel-preset-stage-2@6.11.0
12
+ babel-preset-es2015@6.13.2
13
+ babel-preset-react-hmre
14
+ babel-preset-stage-2@6.13.0
14
15
  css-loader@0.23.1
15
- extract-text-webpack-plugin@1.0.1
16
+ extract-text-webpack-plugin@2.0.0-beta.3
16
17
  file-loader@0.9.0
17
- hauler@0.1.1
18
+ hauler@0.3.0
18
19
  image-webpack-loader@2.0.0
19
20
  immutable-devtools@0.0.7
20
21
  style-loader@0.13.1
21
22
  url-loader@0.5.7
22
- webpack@1.13.1
23
- webpack-dev-server@1.14.1
23
+ webpack@2.1.0-beta.20
24
+ webpack-dev-server@2.1.0-beta.0
24
25
  TXT
25
26
 
26
- LINTER_DEV_DEPENDENCES = <<-TXT.freeze
27
- babel-eslint@6.1.2
28
- eslint@2.13.1
29
- eslint-config-airbnb@9.0.1
30
- eslint-import-resolver-webpack@0.4.0
31
- eslint-plugin-flow-vars@0.5.0
32
- eslint-plugin-import@1.12.0
33
- eslint-plugin-jsx-a11y@1.5.5
34
- eslint-plugin-react@5.2.2
35
- sass-lint@1.8.2
36
- TXT
37
-
38
- REACT_NPM_DEV_DEPENDENCIES = <<-TXT.freeze
39
- babel-plugin-transform-react-constant-elements@6.9.1
40
- babel-plugin-transform-react-inline-elements@6.8.0
41
- babel-plugin-transform-react-remove-prop-types@0.2.8
42
- babel-preset-react@6.11.1
43
- react-hot-loader@2.0.0-alpha-4
44
- redux-logger@2.6.1
27
+ NPM_DEPENDENCIES = <<-TXT.freeze
28
+ babel-polyfill@6.13.0
29
+ whatwg-fetch@1.0.0
45
30
  TXT
46
31
 
47
32
  REACT_NPM_DEPENDENCIES = <<-TXT.freeze
48
33
  immutable@3.8.1
49
- react@15.2.1
50
- react-dom@15.2.1
34
+ react@15.3.0
35
+ react-dom@15.3.0
51
36
  react-redux@4.4.5
52
37
  react-router@2.6.1
53
38
  react-router-redux@4.0.5
54
- react-router-scroll@0.2.1
39
+ react-router-scroll@0.3.1
55
40
  redux@3.5.2
56
- redux-immutable@3.0.6
41
+ redux-immutable@3.0.7
57
42
  redux-saga@0.11.0
58
43
  reselect@2.5.3
59
44
  TXT
@@ -63,23 +48,34 @@ module Hauler
63
48
  sass-loader@4.0.0
64
49
  TXT
65
50
 
66
- NPM_DEPENDENCIES = <<-TXT.freeze
67
- babel-polyfill@6.9.1
68
- whatwg-fetch@1.0.0
51
+ LINTER_DEV_DEPENDENCES = <<-TXT.freeze
52
+ babel-eslint@6.1.2
53
+ eslint@3.3.1
54
+ eslint-config-airbnb@10.0.1
55
+ eslint-import-resolver-webpack@0.5.1
56
+ eslint-plugin-flowtype@2.7.1
57
+ eslint-plugin-import@1.13.0
58
+ eslint-plugin-jsx-a11y@2.1.0
59
+ eslint-plugin-react@6.1.1
60
+ sass-lint@1.8.2
69
61
  TXT
70
62
 
71
- def add_scripts_to_package
72
- `./node_modules/hauler/bin/update-scripts.js`
73
- end
63
+ REACT_NPM_DEV_DEPENDENCIES = <<-TXT.freeze
64
+ babel-plugin-transform-react-constant-elements@6.9.1
65
+ babel-plugin-transform-react-inline-elements@6.8.0
66
+ babel-plugin-transform-react-remove-prop-types@0.2.9
67
+ babel-preset-react@6.11.1
68
+ redux-logger@2.6.1
69
+ TXT
74
70
 
75
71
  def install_dev_dependencies
76
72
  puts 'Installing NPM dev dependencies...'
77
73
  install_deps(NPM_DEV_DEPENDENCIES)
78
74
  end
79
75
 
80
- def install_linter_dev_dependencies
81
- puts 'Installing Linter NPM dev dependencies...'
82
- install_deps(LINTER_DEV_DEPENDENCES)
76
+ def install_dependencies
77
+ puts 'Installing NPM dependencies...'
78
+ install_deps(NPM_DEPENDENCIES, dev: false)
83
79
  end
84
80
 
85
81
  def install_react_dependencies
@@ -95,16 +91,20 @@ module Hauler
95
91
  install_deps(SASS_NPM_DEV_DEPENDENCIES)
96
92
  end
97
93
 
98
- def install_dependencies
99
- puts 'Installing NPM dependencies...'
100
- install_deps(NPM_DEPENDENCIES, dev: false)
94
+ def install_linter_dev_dependencies
95
+ puts 'Installing Linter NPM dev dependencies...'
96
+ install_deps(LINTER_DEV_DEPENDENCES)
97
+ end
98
+
99
+ def add_scripts_to_package
100
+ run('hauler-update-scripts')
101
101
  end
102
102
 
103
103
  private
104
104
 
105
105
  def install_deps(list, dev: true)
106
106
  flag = dev ? '--save-dev' : '--save'
107
- `npm install #{flag} #{list.gsub(/\s+/m, ' ')}`
107
+ run("npm install #{flag} #{list.gsub(/\s+/m, ' ')}")
108
108
  end
109
109
  end
110
110
  end
@@ -0,0 +1,2 @@
1
+
2
+ console.log('hello hauler');
@@ -2,7 +2,7 @@
2
2
  function haulerConfigFactory(env) {
3
3
  return {
4
4
  entries: {
5
- application: '~app/assets/my_app/index.js',
5
+ application: '~app/assets/index.js',
6
6
  },
7
7
  };
8
8
  }
@@ -4,11 +4,11 @@
4
4
  ],
5
5
  "parser": "babel-eslint",
6
6
  "plugins": [
7
- "flow-vars"
7
+ "flowtype"
8
8
  ],
9
9
  "rules": {
10
- "flow-vars/define-flow-type": 1,
11
- "flow-vars/use-flow-type": 1,
10
+ "flowtype/define-flow-type": 1,
11
+ "flowtype/use-flow-type": 1,
12
12
  "max-len": [2, 140, 2]
13
13
  },
14
14
  "settings": {
@@ -1,6 +1,7 @@
1
1
 
2
+ const appName = '<%= Rails.application.class.parent_name.underscore %>';
2
3
  const hauler = require('hauler');
3
4
  const env = hauler.getEnvName();
4
5
 
5
- const config = hauler.getCompilerConfig(env, __dirname);
6
+ const config = hauler.getCompilerConfig(env, __dirname, appName);
6
7
  module.exports = config;
@@ -16,7 +16,7 @@ module Hauler
16
16
 
17
17
  def hauler_webpack_config
18
18
  return nil if !hauler_dev_server?
19
- @hauler_webpack_config ||= JSON.parse(`hauler-read-config`)
19
+ @hauler_webpack_config ||= JSON.parse(`hauler-read-config #{Rails.root}`)
20
20
  end
21
21
 
22
22
  def hauler_entries_names
@@ -1,6 +1,6 @@
1
1
  # :nodoc:
2
2
  module Hauler
3
- VERSION = '0.2.0'.freeze
3
+ VERSION = '0.3.0'.freeze
4
4
 
5
5
  def self.version
6
6
  VERSION
data/lib/hauler.rb CHANGED
@@ -2,4 +2,5 @@ require 'active_support'
2
2
  require 'active_support/rails'
3
3
  require 'hauler/version'
4
4
 
5
- require 'hauler/railtie' if defined?(Rails)
5
+ require 'react-rails'
6
+ require 'hauler/railtie'
data/make-package.js CHANGED
@@ -1,23 +1,20 @@
1
1
  #!/usr/bin/env node --use_strict
2
2
 
3
3
  const fs = require('fs');
4
- const path = require('path');
5
4
 
6
- const pkg = Object.assign({}, require('./package.json'));
7
- delete pkg.scripts;
8
- Object.assign(pkg, {
9
- main: 'index.js',
10
- });
11
-
12
- fs.writeFileSync('dist/package.json', JSON.stringify(pkg, null, 2));
13
- fs.writeFileSync('dist/LICENSE.txt', fs.readFileSync('./LICENSE.txt').toString());
14
- fs.writeFileSync('dist/README.md', fs.readFileSync('./README.md').toString());
5
+ fs.mkdir('dist', function () {
6
+ const pkg = Object.assign({}, require('./package.json'));
7
+ delete pkg.scripts;
8
+ Object.assign(pkg, {
9
+ main: 'index.js',
10
+ bin: {
11
+ 'hauler-read-config': 'bin/read-config.js',
12
+ 'hauler-server': 'bin/dev-server.js',
13
+ 'hauler-update-scripts': 'bin/update-scripts.js'
14
+ }
15
+ });
15
16
 
16
- fs.mkdirSync('dist/bin');
17
- Object.keys(pkg.bin).forEach(key => {
18
- const binaryPath = pkg.bin[key];
19
- fs.writeFileSync(
20
- path.join('dist', binaryPath),
21
- fs.readFileSync(binaryPath).toString()
22
- );
17
+ fs.writeFileSync('dist/package.json', JSON.stringify(pkg, null, 2));
18
+ fs.writeFileSync('dist/LICENSE.txt', fs.readFileSync('./LICENSE.txt').toString());
19
+ fs.writeFileSync('dist/README.md', fs.readFileSync('./README.md').toString());
23
20
  });
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "hauler",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "NodeJS binary for the hauler gem",
5
5
  "author": "Arturo Guzman @guzart",
6
6
  "license": "MIT",
@@ -8,26 +8,26 @@
8
8
  "type": "git",
9
9
  "url": "https://github.com/guzart/hauler.git"
10
10
  },
11
- "main": "dist/index.js",
11
+ "main": "src/index.js",
12
12
  "bin": {
13
- "hauler-read-config": "bin/read-config.js",
14
- "hauler-server": "bin/dev-server.js",
15
- "hauler-update-scripts": "bin/update-scripts.js"
13
+ "hauler-read-config": "src/bin/read-config.js",
14
+ "hauler-server": "src/bin/dev-server.js",
15
+ "hauler-update-scripts": "src/bin/update-scripts.js"
16
16
  },
17
17
  "scripts": {
18
- "build": "npm-run-all clean compile generate_package",
18
+ "build": "npm-run-all clean generate_package compile",
19
19
  "clean": "rm -rf ./dist",
20
20
  "compile": "./node_modules/babel-cli/bin/babel.js --out-dir=./dist --ignore=./decls,**/__tests__ ./src",
21
- "dev": "npm-run-all clean watch",
21
+ "dev": "npm-run-all generate_package watch",
22
22
  "generate_package": "node make-package.js",
23
23
  "test": "jest --verbose",
24
24
  "watch": "./node_modules/babel-cli/bin/babel.js --watch=./src --ignore=./decls,**/__tests__ --out-dir=./dist"
25
25
  },
26
26
  "peerDependencies": {
27
- "extract-text-webpack-plugin": "~ 1.0",
28
- "webpack": "~ 1.0",
29
- "webpack-dev-server": "~ 1.0",
30
- "whatwg-fetch": "~ 1.0"
27
+ "extract-text-webpack-plugin": "~2.0",
28
+ "webpack": "~2.1",
29
+ "webpack-dev-server": "~2.1",
30
+ "whatwg-fetch": "~1.0"
31
31
  },
32
32
  "devDependencies": {
33
33
  "babel-cli": "^6.11.4",
@@ -39,14 +39,9 @@
39
39
  "babel-preset-es2015": "^6.9.0",
40
40
  "babel-preset-stage-2": "^6.11.0",
41
41
  "eslint": "^3.2.0",
42
- "eslint-plugin-flow-vars": "^0.5.0",
43
42
  "eslint-plugin-flowtype": "^2.4.0",
44
- "extract-text-webpack-plugin": "^1.0.1",
45
43
  "flow-bin": "^0.30.0",
46
44
  "jest-cli": "^14.1.0",
47
- "npm-run-all": "^2.3.0",
48
- "webpack": "^1.13.1",
49
- "webpack-dev-server": "^1.14.1",
50
- "whatwg-fetch": "^1.0.0"
45
+ "npm-run-all": "^2.3.0"
51
46
  }
52
47
  }
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- const hauler = require('hauler');
3
+ const hauler = require('../index');
4
4
  const webpack = require('webpack');
5
5
  const WebpackDevServer = require('webpack-dev-server');
6
6
 
@@ -4,7 +4,7 @@
4
4
 
5
5
  const railsRoot = process.argv[2];
6
6
 
7
- const hauler = require('hauler');
7
+ const hauler = require('../index');
8
8
  const env = hauler.getEnvName();
9
9
 
10
10
  const devServerConfig = hauler.getDevServerConfig(env, railsRoot);
File without changes
data/src/decls/hauler.js CHANGED
@@ -6,7 +6,8 @@ export type HostInfo = {
6
6
  };
7
7
 
8
8
  export type ProjectConfig = {
9
- entries?: {[name: string]: string | Array<string>},
9
+ appName?: string,
10
+ entries?: WebpackEntry,
10
11
  javascriptLoader?: WebpackLoader,
11
12
  sassLoader?: WebpackLoader,
12
13
  fontLoader?: WebpackLoader,
data/src/decls/webpack.js CHANGED
@@ -92,7 +92,8 @@ export type WebpackOutputConfig = {
92
92
  crossOriginLoading?: false | 'anonymous' | 'use-credentials',
93
93
  };
94
94
 
95
- export type WebpackEntry = string | Array<string> | { [key: string]: WebpackEntry };
95
+ type SimpleWebpackEntry = string | Array<string>;
96
+ export type WebpackEntry = SimpleWebpackEntry | { [key: string]: SimpleWebpackEntry };
96
97
 
97
98
  export type WebpackConfig = {
98
99
  context?: string,
@@ -8,10 +8,11 @@ export default function defaultConfigFactory(env: string): WebpackConfig {
8
8
  chunkFilename: '[name].[chunkhash].chunk.js',
9
9
  },
10
10
  resolve: {
11
- root: [
11
+ modules: [
12
12
  '~app/assets',
13
13
  '~lib/assets',
14
14
  ],
15
+ extensions: ['.js', '.json', '.jsx']
15
16
  },
16
17
  devtool: '',
17
18
  target: 'web',
@@ -7,12 +7,11 @@ export default function defaultConfigFactory() {
7
7
  host: 'localhost',
8
8
  port: 3001,
9
9
  hot: true,
10
- inline: true,
11
10
  headers: { 'AccessControl-Allow-Origin': '*' },
12
11
  stats: {
13
12
  colors: true,
14
13
  chunks: true,
15
- chunkModules: true,
14
+ chunkModules: false,
16
15
  timings: true,
17
16
  },
18
17
  };
@@ -11,15 +11,14 @@ function getPlugins(env: string) {
11
11
  new webpack.ProvidePlugin({ fetch: 'exports?self.fetch!whatwg-fetch' }),
12
12
  new webpack.DefinePlugin({ 'process.env': { NODE_ENV: JSON.stringify(env) } }),
13
13
  new webpack.optimize.CommonsChunkPlugin({
14
- name: 'vendor',
15
14
  children: true,
16
15
  minChunks: 2,
17
- async: true,
18
16
  }),
19
17
  ];
20
18
 
21
19
  if (env === 'development') {
22
20
  plugins = plugins.concat([
21
+ new webpack.HotModuleReplacementPlugin(),
23
22
  new webpack.NoErrorsPlugin(),
24
23
  ]);
25
24
  }
@@ -79,6 +78,8 @@ function configFactory(env: string) {
79
78
  'style',
80
79
  sassLoader.loader.replace('style!', '')
81
80
  );
81
+ } else {
82
+ javascriptLoader.query.presets = javascriptLoader.query.presets.concat(['react-hmre']);
82
83
  }
83
84
 
84
85
  const appendPlugins = [];
data/src/index.js CHANGED
@@ -21,23 +21,33 @@ function getConfigFactory(): ProjectConfigFactory {
21
21
  };
22
22
  }
23
23
 
24
- export function getConfig(env: string, railsRoot?: string) {
25
- if (railsRoot != null) {
26
- utils.setRailsRoot(railsRoot);
27
- }
28
-
24
+ export function getConfig(env: string, railsRoot: string, appName: string) {
25
+ utils.setRailsRoot(railsRoot);
29
26
  const configFactory = getConfigFactory();
30
- return configFactory(env);
27
+ const config = configFactory(env);
28
+ return Object.assign(config, { appName });
31
29
  }
32
30
 
33
- export function getDevServerConfig(env: string, railsRoot?: string): WebpackDevServerConfig {
34
- const config = getConfig(env, railsRoot);
31
+ export function getDevServerConfig(
32
+ env: string, railsRoot: string, appName: string
33
+ ): WebpackDevServerConfig {
34
+ const config = getConfig(env, railsRoot, appName);
35
35
  return utils.extractDevServerConfig(config);
36
36
  }
37
37
 
38
- export function getCompilerConfig(env: string, railsRoot?: string): WebpackConfig {
39
- const config = getConfig(env, railsRoot);
40
- return utils.extractCompilerConfig(config);
38
+ export function getCompilerConfig(
39
+ env: string, railsRoot: string, appName: string
40
+ ): WebpackConfig {
41
+ const config = getConfig(env, railsRoot, appName);
42
+ const compilerConfig = utils.extractCompilerConfig(config);
43
+ if (env !== 'development') {
44
+ return compilerConfig;
45
+ }
46
+
47
+ const devServerConfig = utils.extractDevServerConfig(config);
48
+ return Object.assign(compilerConfig, {
49
+ entry: utils.makeHotReloadableEntries(compilerConfig.entry, devServerConfig.publicPath),
50
+ });
41
51
  }
42
52
 
43
53
  export { getEnvName } from './utils';
@@ -0,0 +1,110 @@
1
+ // https://github.com/reactjs/react-rails/blob/v1.8.2/lib/assets/javascripts/react_ujs_mount.js
2
+
3
+ import React from 'react';
4
+ import ReactDOM from 'react-dom';
5
+
6
+ // jQuery is optional. Use it to support legacy browsers.
7
+ const $ = (typeof global.jQuery !== 'undefined') && global.jQuery;
8
+ const document = global.document;
9
+
10
+ // This attribute holds the name of component which should be mounted
11
+ // example: `data-react-class="MyApp.Items.EditForm"`
12
+ const CLASS_NAME_ATTR = 'data-react-class';
13
+
14
+ // This attribute holds JSON stringified props for initializing the component
15
+ // example: `data-react-props="{\"item\": { \"id\": 1, \"name\": \"My Item\"} }"`
16
+ const PROPS_ATTR = 'data-react-props';
17
+
18
+ // helper method for the mount and unmount methods to find the
19
+ // `data-react-class` DOM elements
20
+ function findDOMNodes(searchSelector) {
21
+ // we will use fully qualified paths as we do not bind the callbacks
22
+ var selector, parent;
23
+
24
+ switch (typeof searchSelector) {
25
+ case 'undefined':
26
+ selector = '[' + CLASS_NAME_ATTR + ']';
27
+ parent = document;
28
+ break;
29
+ case 'object':
30
+ selector = '[' + CLASS_NAME_ATTR + ']';
31
+ parent = searchSelector;
32
+ break;
33
+ case 'string':
34
+ selector = searchSelector + '[' + CLASS_NAME_ATTR + '], ' +
35
+ searchSelector + ' [' + CLASS_NAME_ATTR + ']';
36
+ parent = document;
37
+ break
38
+ default:
39
+ break;
40
+ }
41
+
42
+ if ($) {
43
+ return $(selector, parent);
44
+ } else {
45
+ return parent.querySelectorAll(selector);
46
+ }
47
+ }
48
+
49
+ // Get the constructor for a className
50
+ function getConstructor(className) {
51
+ // Assume className is simple and can be found at top-level (window).
52
+ // Fallback to eval to handle cases like 'My.React.ComponentName'.
53
+ // Also, try to gracefully import Babel 6 style default exports
54
+ //
55
+ var constructor;
56
+
57
+ // Try to access the class globally first
58
+ constructor = global[className];
59
+
60
+ // If that didn't work, try eval
61
+ if (!constructor) {
62
+ constructor = eval.call(global, className);
63
+ }
64
+
65
+ // Lastly, if there is a default attribute try that
66
+ if (constructor && constructor.default) {
67
+ constructor = constructor.default;
68
+ }
69
+
70
+ return constructor;
71
+ }
72
+
73
+ // Within `searchSelector`, find nodes which should have React components
74
+ // inside them, and mount them with their props.
75
+ export function mountComponents(searchSelector) {
76
+ var nodes = findDOMNodes(searchSelector);
77
+
78
+ for (var i = 0; i < nodes.length; ++i) {
79
+ var node = nodes[i];
80
+ var className = node.getAttribute(CLASS_NAME_ATTR);
81
+ var constructor = getConstructor(className);
82
+ var propsJson = node.getAttribute(PROPS_ATTR);
83
+ var props = propsJson && JSON.parse(propsJson);
84
+
85
+ if (typeof(constructor) === "undefined") {
86
+ var message = "Cannot find component: '" + className + "'"
87
+ if (console && console.log) {
88
+ console.log("%c[react-rails] %c" + message + " for element", "font-weight: bold", "", node)
89
+ }
90
+ var error = new Error(message + ". Make sure your component is globally available to render.")
91
+ throw error
92
+ } else {
93
+ ReactDOM.render(React.createElement(constructor, props), node);
94
+ }
95
+ }
96
+ }
97
+
98
+ // Within `searchSelector`, find nodes which have React components
99
+ // inside them, and unmount those components.
100
+ export function unmountComponents(searchSelector) {
101
+ var nodes = findDOMNodes(searchSelector);
102
+
103
+ for (var i = 0; i < nodes.length; ++i) {
104
+ var node = nodes[i];
105
+
106
+ ReactDOM.unmountComponentAtNode(node);
107
+ }
108
+ }
109
+
110
+ export default mountComponents;
@@ -0,0 +1,14 @@
1
+
2
+ export default function provide(namespace: string, value: Object, target = global) {
3
+ const parts = namespace.split('.');
4
+ let cur = target;
5
+ for (let part; parts.length && (part = parts.shift());) {
6
+ if (!parts.length && value !== undefined) {
7
+ cur[part] = value;
8
+ } else if (cur[part]) {
9
+ cur = cur[part];
10
+ } else {
11
+ cur = cur[part] = {};
12
+ }
13
+ }
14
+ }
@@ -22,11 +22,21 @@ function extractLoaders(config: ProjectConfig): Array<WebpackLoader> {
22
22
  return baseLoaders.concat(customLoaders);
23
23
  }
24
24
 
25
+ function extractResolveAlias(config: ProjectConfig): Object {
26
+ const resolveConfig = config.compiler && config.compiler.resolve || {};
27
+ const alias = resolveValuesRailsPath(resolveConfig.alias);
28
+ if (config.appName != null) {
29
+ Object.assign(alias, { [config.appName]: railsPath('~app/assets/') });
30
+ }
31
+
32
+ return alias;
33
+ }
34
+
25
35
  function extractResolve(config: ProjectConfig): WebpackResolveConfig {
26
36
  const resolveConfig = config.compiler && config.compiler.resolve || {};
27
37
  return Object.assign(resolveConfig, {
28
- alias: resolveValuesRailsPath(resolveConfig.alias),
29
- root: railsPath(resolveConfig.root),
38
+ alias: extractResolveAlias(config),
39
+ modules: railsPath(resolveConfig.modules),
30
40
  });
31
41
  }
32
42
 
data/src/utils/index.js CHANGED
@@ -4,3 +4,4 @@ export * from './extract_config';
4
4
  export * from './merge_config';
5
5
  export * from './misc';
6
6
  export * from './path';
7
+ export * from './webpack';
@@ -0,0 +1,29 @@
1
+ import url from 'url';
2
+
3
+ function getHotEntryPoint(publicPath: string): string {
4
+ const uri = url.parse(publicPath);
5
+ uri.pathname = '';
6
+ return `webpack-dev-server/client?${uri.format()}`;
7
+ }
8
+
9
+ export function makeHotReloadableEntries(entries: WebpackEntry, publicPath: string): WebpackEntry {
10
+ if (typeof entries === 'string') {
11
+ return [getHotEntryPoint(publicPath), entries];
12
+ }
13
+
14
+ if (Array.isArray(entries)) {
15
+ return [getHotEntryPoint(publicPath)].concat(entries);
16
+ }
17
+
18
+ if (entries.constructor === Object) {
19
+ const output = {};
20
+ Object.keys(entries).forEach(key => {
21
+ let hotEntry = makeHotReloadableEntries(entries[key], publicPath);
22
+ output[key] = hotEntry;
23
+ });
24
+
25
+ return output;
26
+ }
27
+
28
+ return entries;
29
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hauler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Arturo Guzman
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2016-08-07 00:00:00.000000000 Z
11
+ date: 2016-08-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,6 +52,20 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: react-rails
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.8'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.8'
55
69
  description: 'Railtie to generate the files needed to use webpack as a replacement
56
70
  of sprockets
57
71
 
@@ -75,13 +89,11 @@ files:
75
89
  - README.md
76
90
  - Rakefile
77
91
  - bin/console
78
- - bin/dev-server.js
79
- - bin/read-config.js
80
92
  - bin/setup
81
- - bin/update-scripts.js
82
93
  - hauler.gemspec
83
94
  - lib/generators/hauler/install_generator.rb
84
95
  - lib/generators/hauler/install_npm_generator.rb
96
+ - lib/generators/hauler/templates/app/assets/index.js
85
97
  - lib/generators/hauler/templates/config/hauler.js
86
98
  - lib/generators/hauler/templates/config/initializers/hauler.rb
87
99
  - lib/generators/hauler/templates/eslintrc.json
@@ -94,12 +106,17 @@ files:
94
106
  - lib/hauler/version.rb
95
107
  - make-package.js
96
108
  - package.json
109
+ - src/bin/dev-server.js
110
+ - src/bin/read-config.js
111
+ - src/bin/update-scripts.js
97
112
  - src/decls/hauler.js
98
113
  - src/decls/webpack.js
99
114
  - src/defaults/compiler_config_factory.js
100
115
  - src/defaults/dev_server_config_factory.js
101
116
  - src/defaults/project_config_factory.js
102
117
  - src/index.js
118
+ - src/mount/index.js
119
+ - src/provide/index.js
103
120
  - src/utils/__tests__/extract_config-test.js
104
121
  - src/utils/__tests__/merge_config-test.js
105
122
  - src/utils/__tests__/path-test.js
@@ -108,6 +125,7 @@ files:
108
125
  - src/utils/merge_config.js
109
126
  - src/utils/misc.js
110
127
  - src/utils/path.js
128
+ - src/utils/webpack.js
111
129
  - wallaby.js
112
130
  homepage: https://github.com/guzart/hauler
113
131
  licenses: