webpacker-for-component 1.0.0 → 1.1.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.
Files changed (98) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +14 -0
  3. data/.gitignore +6 -0
  4. data/.rubocop.yml +124 -0
  5. data/.travis.yml +22 -0
  6. data/Gemfile +13 -0
  7. data/MIT-LICENSE +20 -0
  8. data/README.md +325 -0
  9. data/Rakefile +12 -0
  10. data/docs/assets.md +106 -0
  11. data/docs/css.md +82 -0
  12. data/docs/deployment.md +39 -0
  13. data/docs/env.md +65 -0
  14. data/docs/es6.md +53 -0
  15. data/docs/folder-structure.md +66 -0
  16. data/docs/misc.md +23 -0
  17. data/docs/props.md +105 -0
  18. data/docs/testing.md +45 -0
  19. data/docs/troubleshooting.md +65 -0
  20. data/docs/typescript.md +116 -0
  21. data/docs/webpack-dev-server.md +32 -0
  22. data/docs/webpack.md +156 -0
  23. data/docs/yarn.md +12 -0
  24. data/lib/install/angular.rb +15 -0
  25. data/lib/install/bin/webpack-dev-server.tt +68 -0
  26. data/lib/install/bin/webpack.tt +30 -0
  27. data/lib/install/config/.babelrc +18 -0
  28. data/lib/install/config/.postcssrc.yml +3 -0
  29. data/lib/install/config/webpack/development.js +3 -0
  30. data/lib/install/config/webpack/environment.js +3 -0
  31. data/lib/install/config/webpack/production.js +3 -0
  32. data/lib/install/config/webpack/test.js +3 -0
  33. data/lib/install/config/webpacker.yml +56 -0
  34. data/lib/install/elm.rb +24 -0
  35. data/lib/install/examples/angular/hello_angular.js +7 -0
  36. data/lib/install/examples/angular/hello_angular/app/app.component.ts +9 -0
  37. data/lib/install/examples/angular/hello_angular/app/app.module.ts +16 -0
  38. data/lib/install/examples/angular/hello_angular/index.ts +8 -0
  39. data/lib/install/examples/angular/hello_angular/polyfills.ts +73 -0
  40. data/lib/install/examples/angular/tsconfig.json +19 -0
  41. data/lib/install/examples/elm/Main.elm +54 -0
  42. data/lib/install/examples/elm/hello_elm.js +11 -0
  43. data/lib/install/examples/react/.babelrc +6 -0
  44. data/lib/install/examples/react/hello_react.jsx +26 -0
  45. data/lib/install/examples/vue/app.vue +22 -0
  46. data/lib/install/examples/vue/hello_vue.js +44 -0
  47. data/lib/install/javascript/packs/application.js +10 -0
  48. data/lib/install/react.rb +28 -0
  49. data/lib/install/template.rb +35 -0
  50. data/lib/install/vue.rb +12 -0
  51. data/lib/tasks/installers.rake +22 -0
  52. data/lib/tasks/webpacker-for-component/check_binstubs.rake +12 -0
  53. data/lib/tasks/webpacker-for-component/check_node.rake +25 -0
  54. data/lib/tasks/webpacker-for-component/check_yarn.rake +24 -0
  55. data/lib/tasks/webpacker-for-component/clobber.rake +16 -0
  56. data/lib/tasks/webpacker-for-component/compile.rake +34 -0
  57. data/lib/tasks/webpacker-for-component/install.rake +13 -0
  58. data/lib/tasks/webpacker-for-component/verify_install.rake +16 -0
  59. data/lib/tasks/webpacker-for-component/yarn_install.rake +6 -0
  60. data/lib/tasks/webpacker.rake +19 -0
  61. data/lib/webpacker-for-component.rb +28 -0
  62. data/lib/webpacker-for-component/commands.rb +23 -0
  63. data/lib/webpacker-for-component/compiler.rb +78 -0
  64. data/lib/webpacker-for-component/configuration.rb +88 -0
  65. data/lib/webpacker-for-component/dev_server.rb +51 -0
  66. data/lib/webpacker-for-component/dev_server_proxy.rb +25 -0
  67. data/lib/webpacker-for-component/helper.rb +65 -0
  68. data/lib/webpacker-for-component/instance.rb +44 -0
  69. data/lib/webpacker-for-component/manifest.rb +79 -0
  70. data/lib/webpacker-for-component/railtie.rb +41 -0
  71. data/lib/webpacker-for-component/version.rb +4 -0
  72. data/package.json +62 -0
  73. data/package/asset_host.js +21 -0
  74. data/package/config.js +8 -0
  75. data/package/environment.js +95 -0
  76. data/package/environments/development.js +46 -0
  77. data/package/environments/production.js +34 -0
  78. data/package/environments/test.js +3 -0
  79. data/package/index.js +16 -0
  80. data/package/loaders/babel.js +11 -0
  81. data/package/loaders/coffee.js +4 -0
  82. data/package/loaders/elm.js +19 -0
  83. data/package/loaders/erb.js +9 -0
  84. data/package/loaders/file.js +15 -0
  85. data/package/loaders/style.js +31 -0
  86. data/package/loaders/typescript.js +4 -0
  87. data/package/loaders/vue.js +12 -0
  88. data/test/command_test.rb +27 -0
  89. data/test/compiler_test.rb +20 -0
  90. data/test/configuration_test.rb +56 -0
  91. data/test/dev_server_test.rb +24 -0
  92. data/test/helper_test.rb +39 -0
  93. data/test/manifest_test.rb +20 -0
  94. data/test/test_app/config/secrets.yml +5 -0
  95. data/test/webpacker_test_helper.rb +40 -0
  96. data/webpacker-for-component.gemspec +23 -0
  97. data/yarn.lock +5162 -0
  98. metadata +111 -7
data/docs/yarn.md ADDED
@@ -0,0 +1,12 @@
1
+ # Yarn
2
+
3
+ Webpacker by default uses `yarn` as package manager for node modules
4
+
5
+
6
+ ## Add a new npm module
7
+
8
+ To add any new JS module you can use `yarn`:
9
+
10
+ ```bash
11
+ yarn add bootstrap material-ui
12
+ ```
@@ -0,0 +1,15 @@
1
+ require "webpacker-for-component/configuration"
2
+
3
+ puts "Copying angular example entry file to #{Webpacker.config.source_entry_path}"
4
+ copy_file "#{__dir__}/examples/angular/hello_angular.js", "#{Webpacker.config.source_entry_path}/hello_angular.js"
5
+
6
+ puts "Copying hello_angular app to #{Webpacker.config.source_path}"
7
+ directory "#{__dir__}/examples/angular/hello_angular", "#{Webpacker.config.source_path}/hello_angular"
8
+
9
+ puts "Copying tsconfig.json to the Rails root directory for typescript"
10
+ copy_file "#{__dir__}/examples/angular/tsconfig.json", "tsconfig.json"
11
+
12
+ puts "Installing all angular dependencies"
13
+ run "yarn add typescript ts-loader core-js zone.js rxjs @angular/core @angular/common @angular/compiler @angular/platform-browser @angular/platform-browser-dynamic"
14
+
15
+ puts "Webpacker now supports angular and typescript 🎉"
@@ -0,0 +1,68 @@
1
+ <%= shebang %>
2
+ $stdout.sync = true
3
+
4
+ require "shellwords"
5
+ require "yaml"
6
+ require "socket"
7
+
8
+ ENV["RAILS_ENV"] ||= "development"
9
+ RAILS_ENV = ENV["RAILS_ENV"]
10
+
11
+ ENV["NODE_ENV"] ||= RAILS_ENV
12
+ NODE_ENV = ENV["NODE_ENV"]
13
+
14
+ APP_PATH = File.expand_path("../", __dir__)
15
+ CONFIG_FILE = File.join(APP_PATH, "config/webpacker.yml")
16
+ NODE_MODULES_PATH = File.join(APP_PATH, "node_modules")
17
+ WEBPACK_CONFIG = File.join(APP_PATH, "config/webpack/#{NODE_ENV}.js")
18
+
19
+ DEFAULT_LISTEN_HOST_ADDR = NODE_ENV == 'development' ? 'localhost' : '0.0.0.0'
20
+
21
+ def args(key)
22
+ index = ARGV.index(key)
23
+ index ? ARGV[index + 1] : nil
24
+ end
25
+
26
+ begin
27
+ dev_server = YAML.load_file(CONFIG_FILE)[RAILS_ENV]["dev_server"]
28
+
29
+ HOSTNAME = args('--host') || dev_server["host"]
30
+ PORT = args('--port') || dev_server["port"]
31
+ HTTPS = ARGV.include?('--https') || dev_server["https"]
32
+ DEV_SERVER_ADDR = "http#{"s" if HTTPS}://#{HOSTNAME}:#{PORT}"
33
+ LISTEN_HOST_ADDR = args('--listen-host') || DEFAULT_LISTEN_HOST_ADDR
34
+
35
+ rescue Errno::ENOENT, NoMethodError
36
+ $stdout.puts "Webpack dev_server configuration not found in #{CONFIG_FILE}."
37
+ $stdout.puts "Please run bundle exec rails webpacker:install to install webpacker"
38
+ exit!
39
+ end
40
+
41
+ begin
42
+ server = TCPServer.new(LISTEN_HOST_ADDR, PORT)
43
+ server.close
44
+
45
+ rescue Errno::EADDRINUSE
46
+ $stdout.puts "Another program is running on port #{PORT}. Set a new port in #{CONFIG_FILE} for dev_server"
47
+ exit!
48
+ end
49
+
50
+ # Delete supplied host, port and listen-host CLI arguments
51
+ ["--host", "--port", "--listen-host"].each do |arg|
52
+ ARGV.delete(args(arg))
53
+ ARGV.delete(arg)
54
+ end
55
+
56
+ env = { "NODE_PATH" => NODE_MODULES_PATH.shellescape }
57
+
58
+ cmd = [
59
+ "#{NODE_MODULES_PATH}/.bin/webpack-dev-server", "--progress", "--color",
60
+ "--config", WEBPACK_CONFIG,
61
+ "--host", LISTEN_HOST_ADDR,
62
+ "--public", "#{HOSTNAME}:#{PORT}",
63
+ "--port", PORT.to_s
64
+ ] + ARGV
65
+
66
+ Dir.chdir(APP_PATH) do
67
+ system env, *cmd
68
+ end
@@ -0,0 +1,30 @@
1
+ <%= shebang %>
2
+ $stdout.sync = true
3
+
4
+ require "shellwords"
5
+
6
+ ENV["RAILS_ENV"] ||= "development"
7
+ RAILS_ENV = ENV["RAILS_ENV"]
8
+
9
+ ENV["NODE_ENV"] ||= RAILS_ENV
10
+ NODE_ENV = ENV["NODE_ENV"]
11
+
12
+ APP_PATH = File.expand_path("../", __dir__)
13
+ NODE_MODULES_PATH = File.join(APP_PATH, "node_modules")
14
+ WEBPACK_CONFIG = File.join(APP_PATH, "config/webpack/#{NODE_ENV}.js")
15
+
16
+ unless File.exist?(WEBPACK_CONFIG)
17
+ puts "Webpack configuration not found."
18
+ puts "Please run bundle exec rails webpacker:install to install webpacker"
19
+ exit!
20
+ end
21
+
22
+ env = { "NODE_PATH" => NODE_MODULES_PATH.shellescape }
23
+ cmd = [ "#{NODE_MODULES_PATH}/.bin/webpack", "--config", WEBPACK_CONFIG ] + ARGV
24
+
25
+ Dir.chdir(APP_PATH) do
26
+ system env, *cmd
27
+ end
28
+
29
+ require 'fileutils'
30
+ FileUtils.cp_r 'public/packs/', '../../public/.'
@@ -0,0 +1,18 @@
1
+ {
2
+ "presets": [
3
+ ["env", {
4
+ "modules": false,
5
+ "targets": {
6
+ "browsers": "> 1%",
7
+ "uglify": true
8
+ },
9
+ "useBuiltIns": true
10
+ }]
11
+ ],
12
+
13
+ "plugins": [
14
+ "syntax-dynamic-import",
15
+ "transform-object-rest-spread",
16
+ ["transform-class-properties", { "spec": true }]
17
+ ]
18
+ }
@@ -0,0 +1,3 @@
1
+ plugins:
2
+ postcss-smart-import: {}
3
+ postcss-cssnext: {}
@@ -0,0 +1,3 @@
1
+ const environment = require('./environment')
2
+
3
+ module.exports = environment.toWebpackConfig()
@@ -0,0 +1,3 @@
1
+ const { environment } = require('webpacker-for-component')
2
+
3
+ module.exports = environment
@@ -0,0 +1,3 @@
1
+ const environment = require('./environment')
2
+
3
+ module.exports = environment.toWebpackConfig()
@@ -0,0 +1,3 @@
1
+ const environment = require('./environment')
2
+
3
+ module.exports = environment.toWebpackConfig()
@@ -0,0 +1,56 @@
1
+ # Note: You must restart bin/webpack-dev-server for changes to take effect
2
+
3
+ default: &default
4
+ source_path: app/javascript
5
+ source_entry_path: packs
6
+ public_output_path: packs/angular
7
+ cache_path: tmp/cache/webpacker
8
+
9
+ # Additional paths webpack should lookup modules
10
+ # ['app/assets', 'engine/foo/app/assets']
11
+ resolved_paths: []
12
+
13
+ # Reload manifest.json on all requests so we reload latest compiled packs
14
+ cache_manifest: false
15
+
16
+ extensions:
17
+ - .coffee
18
+ - .erb
19
+ - .js
20
+ - .jsx
21
+ - .ts
22
+ - .vue
23
+ - .sass
24
+ - .scss
25
+ - .css
26
+ - .png
27
+ - .svg
28
+ - .gif
29
+ - .jpeg
30
+ - .jpg
31
+
32
+ development:
33
+ <<: *default
34
+ compile: true
35
+
36
+ dev_server:
37
+ host: localhost
38
+ port: 3035
39
+ hmr: false
40
+ https: false
41
+
42
+ test:
43
+ <<: *default
44
+ compile: true
45
+
46
+ # Compile test packs to a separate directory
47
+ public_output_path: packs-test
48
+
49
+ production:
50
+ <<: *default
51
+
52
+ # Production depends on precompilation of packs prior to booting for performance.
53
+ compile: false
54
+
55
+ # Cache manifest.json for performance
56
+ cache_manifest: true
@@ -0,0 +1,24 @@
1
+ require "webpacker-for-component/configuration"
2
+
3
+ puts "Copying elm example entry file to #{Webpacker.config.source_entry_path}"
4
+ copy_file "#{__dir__}/examples/elm/Main.elm", "#{Webpacker.config.source_entry_path}/Main.elm"
5
+
6
+ puts "Copying elm app file to #{Webpacker.config.source_entry_path}"
7
+ copy_file "#{__dir__}/examples/elm/hello_elm.js",
8
+ "#{Webpacker.config.source_entry_path}/hello_elm.js"
9
+
10
+ puts "Installing all elm dependencies"
11
+ run "yarn add elm elm-webpack-loader"
12
+ run "yarn add --dev elm-hot-loader"
13
+ run "yarn run elm package install -- --yes"
14
+
15
+ puts "Updating Webpack paths to include Elm file extension"
16
+ insert_into_file Webpacker.config.config_path, " - .elm\n", after: /extensions:\n/
17
+
18
+ puts "Updating elm source location"
19
+ gsub_file "elm-package.json", /\"\.\"\n/, %("#{Webpacker.config.source_entry_path}"\n)
20
+
21
+ puts "Updating .gitignore to include elm-stuff folder"
22
+ insert_into_file ".gitignore", "/elm-stuff\n", before: "/node_modules\n"
23
+
24
+ puts "Webpacker now supports elm 🎉"
@@ -0,0 +1,7 @@
1
+ // Run this Angular example by adding the following HTML markup to your view:
2
+ //
3
+ // <hello-angular>Loading...</hello-angular>
4
+ //
5
+ // <%= javascript_pack_tag 'hello_angular' %>
6
+
7
+ require('../hello_angular')
@@ -0,0 +1,9 @@
1
+ import { Component } from '@angular/core';
2
+
3
+ @Component({
4
+ selector: 'hello-angular',
5
+ template: `<h1>Hello {{name}}</h1>`
6
+ })
7
+ export class AppComponent {
8
+ name = 'Angular!';
9
+ }
@@ -0,0 +1,16 @@
1
+ import { BrowserModule } from '@angular/platform-browser';
2
+ import { NgModule } from '@angular/core';
3
+
4
+ import { AppComponent } from './app.component';
5
+
6
+ @NgModule({
7
+ declarations: [
8
+ AppComponent
9
+ ],
10
+ imports: [
11
+ BrowserModule
12
+ ],
13
+ providers: [],
14
+ bootstrap: [AppComponent]
15
+ })
16
+ export class AppModule { }
@@ -0,0 +1,8 @@
1
+ import './polyfills.ts';
2
+
3
+ import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
4
+ import { AppModule } from './app/app.module';
5
+
6
+ document.addEventListener('DOMContentLoaded', () => {
7
+ platformBrowserDynamic().bootstrapModule(AppModule);
8
+ });
@@ -0,0 +1,73 @@
1
+ /**
2
+ * This file includes polyfills needed by Angular and is loaded before the app.
3
+ * You can add your own extra polyfills to this file.
4
+ *
5
+ * This file is divided into 2 sections:
6
+ * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers.
7
+ * 2. Application imports. Files imported after ZoneJS that should be loaded before your main
8
+ * file.
9
+ *
10
+ * The current setup is for so-called "evergreen" browsers; the last versions of browsers that
11
+ * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera),
12
+ * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile.
13
+ *
14
+ * Learn more in https://angular.io/docs/ts/latest/guide/browser-support.html
15
+ */
16
+
17
+ /***************************************************************************************************
18
+ * BROWSER POLYFILLS
19
+ */
20
+
21
+ /** IE9, IE10 and IE11 requires all of the following polyfills. **/
22
+ // import 'core-js/es6/symbol';
23
+ // import 'core-js/es6/object';
24
+ // import 'core-js/es6/function';
25
+ // import 'core-js/es6/parse-int';
26
+ // import 'core-js/es6/parse-float';
27
+ // import 'core-js/es6/number';
28
+ // import 'core-js/es6/math';
29
+ // import 'core-js/es6/string';
30
+ // import 'core-js/es6/date';
31
+ // import 'core-js/es6/array';
32
+ // import 'core-js/es6/regexp';
33
+ // import 'core-js/es6/map';
34
+ // import 'core-js/es6/weak-map';
35
+ // import 'core-js/es6/set';
36
+
37
+ /** IE10 and IE11 requires the following for NgClass support on SVG elements */
38
+ // import 'classlist.js'; // Run `npm install --save classlist.js`.
39
+
40
+ /** Evergreen browsers require these. **/
41
+ import 'core-js/es6/reflect';
42
+ import 'core-js/es7/reflect';
43
+
44
+
45
+ /**
46
+ * Required to support Web Animations `@angular/animation`.
47
+ * Needed for: All but Chrome, Firefox and Opera. http://caniuse.com/#feat=web-animation
48
+ **/
49
+ // import 'web-animations-js'; // Run `npm install --save web-animations-js`.
50
+
51
+
52
+
53
+ /***************************************************************************************************
54
+ * Zone JS is required by Angular itself.
55
+ */
56
+ import 'zone.js/dist/zone';
57
+ // import 'zone.js/dist/long-stack-trace-zone' // async stack traces with zone.js
58
+
59
+
60
+
61
+ /***************************************************************************************************
62
+ * APPLICATION IMPORTS
63
+ */
64
+
65
+ /**
66
+ * Date, currency, decimal and percent pipes.
67
+ * Needed for: All but Chrome, Firefox, Edge, IE11 and Safari 10
68
+ */
69
+ // import 'intl'; // Run `npm install --save intl`.
70
+ /**
71
+ * Need to import at least one locale-data with intl.
72
+ */
73
+ // import 'intl/locale-data/jsonp/en';
@@ -0,0 +1,19 @@
1
+ {
2
+ "compilerOptions": {
3
+ "declaration": false,
4
+ "emitDecoratorMetadata": true,
5
+ "experimentalDecorators": true,
6
+ "lib": ["es6", "dom"],
7
+ "module": "es6",
8
+ "moduleResolution": "node",
9
+ "sourceMap": true,
10
+ "target": "es5"
11
+ },
12
+ "exclude": [
13
+ "**/*.spec.ts",
14
+ "node_modules",
15
+ "vendor",
16
+ "public"
17
+ ],
18
+ "compileOnSave": false
19
+ }
@@ -0,0 +1,54 @@
1
+ module Main exposing (..)
2
+
3
+ import Html exposing (Html, h1, text)
4
+ import Html.Attributes exposing (style)
5
+
6
+ -- MODEL
7
+
8
+ type alias Model =
9
+ {
10
+ }
11
+
12
+ -- INIT
13
+
14
+ init : (Model, Cmd Message)
15
+ init =
16
+ (Model, Cmd.none)
17
+
18
+ -- VIEW
19
+
20
+ view : Model -> Html Message
21
+ view model =
22
+ -- The inline style is being used for example purposes in order to keep this example simple and
23
+ -- avoid loading additional resources. Use a proper stylesheet when building your own app.
24
+ h1 [style [("display", "flex"), ("justify-content", "center")]]
25
+ [text "Hello Elm!"]
26
+
27
+ -- MESSAGE
28
+
29
+ type Message
30
+ = None
31
+
32
+ -- UPDATE
33
+
34
+ update : Message -> Model -> (Model, Cmd Message)
35
+ update message model =
36
+ (model, Cmd.none)
37
+
38
+ -- SUBSCRIPTIONS
39
+
40
+ subscriptions : Model -> Sub Message
41
+ subscriptions model =
42
+ Sub.none
43
+
44
+ -- MAIN
45
+
46
+ main : Program Never Model Message
47
+ main =
48
+ Html.program
49
+ {
50
+ init = init,
51
+ view = view,
52
+ update = update,
53
+ subscriptions = subscriptions
54
+ }