thredded_create_app 0.1.28 → 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
  SHA256:
3
- metadata.gz: db282a04338266835a3d22a51412fe231eb8199464d001ba7d1169ce3ef6ee74
4
- data.tar.gz: d2a4a3a9d2004b6501ac35db551f77838612b95e090e6acb2e5b334d275f0640
3
+ metadata.gz: f0232d103e459c18069f055aba4bb87d2d776148151a2519ceeae3450c0ddfd5
4
+ data.tar.gz: 970727679e31aad434d3e5dbe0e0aa1e4b75c668649bd7a60af63d71f3a8af68
5
5
  SHA512:
6
- metadata.gz: ed068b67a37c9133825d4f5ad0a7a6828f86cca729180fb6af257997e95b014f99f4b766f0aac7c76b6cb6e23288e045c9de7b334ab10abc05dd9083a23d05c4
7
- data.tar.gz: 8cce0de75ec5f90b5d0f8cf0ab129531339c12df819af7d94dd2366c2f302f3520d4a4446dda88674643739bf471ba10fb322642e658c6b78c8b422de7baadf3
6
+ metadata.gz: 334b7ec1e5e6edf199f5dc1bb92f7162d7cdce08adf74d390ecf50d4230a4497351e52581fb31ef373be286aaf8c837beff60803ebd21474d7ea65d796535596
7
+ data.tar.gz: 83547babdc8755375d7f5ad6e6e86b29249301f83c745125feb71a6ce692b77bf271a8901d08b7c21c7d3dae4f2487f6d68737f4ee766ce57dc8125f48f797dc
@@ -15,6 +15,7 @@ module ThreddedCreateApp
15
15
  verbose: false,
16
16
  install_gem_bundler_rails: true,
17
17
  start_server: true,
18
+ webpack_js: true,
18
19
  simple_form: true,
19
20
  database: :postgresql,
20
21
  rails_version: nil
@@ -74,7 +75,8 @@ module ThreddedCreateApp
74
75
  end
75
76
  end
76
77
 
77
- # rubocop:disable Metrics/AbcSize,Metrics/MethodLength
78
+ # rubocop:disable Metrics/AbcSize,Metrics/BlockLength,Metrics/MethodLength
79
+
78
80
  def optparse
79
81
  argv = @argv.dup
80
82
  argv << '--help' if argv.empty?
@@ -96,6 +98,9 @@ module ThreddedCreateApp
96
98
  options[:rails_version] = value
97
99
  end
98
100
 
101
+ flags.bool :webpack_js,
102
+ '--[no-]webpack-js',
103
+ 'Use webpack for JavaScript'
99
104
  flags.bool :simple_form, '--[no-]simple-form', 'Use simple_form'
100
105
 
101
106
  op.separator "\nOther options:"
@@ -128,7 +133,7 @@ module ThreddedCreateApp
128
133
  options.update(app_path: argv[0])
129
134
  options
130
135
  end
131
- # rubocop:enable Metrics/AbcSize,Metrics/MethodLength
136
+ # rubocop:enable Metrics/AbcSize,Metrics/BlockLength,Metrics/MethodLength
132
137
 
133
138
  class Flags
134
139
  def initialize(op, options)
@@ -3,7 +3,7 @@
3
3
  require 'thredded_create_app/tasks/base'
4
4
  module ThreddedCreateApp
5
5
  module Tasks
6
- class AddThredded < Base
6
+ class AddThredded < Base # rubocop:disable Metrics/ClassLength
7
7
  def summary
8
8
  'Add and setup Thredded with a User model'
9
9
  end
@@ -68,8 +68,17 @@ module ThreddedCreateApp
68
68
  end
69
69
 
70
70
  def add_thredded_javascripts
71
- copy 'add_thredded/myapp_thredded.js',
72
- "app/assets/javascripts/#{app_name}_thredded.js"
71
+ if webpack_js?
72
+ run 'bundle exec rails webpacker:install:erb'
73
+ copy 'add_thredded/thredded_imports.js.erb',
74
+ 'app/javascript/thredded_imports.js.erb'
75
+ append_to_file 'app/javascript/packs/application.js', <<~JS
76
+ require('thredded_imports.js');
77
+ JS
78
+ else
79
+ copy 'add_thredded/myapp_thredded.js',
80
+ "app/assets/javascripts/#{app_name}_thredded.js"
81
+ end
73
82
  end
74
83
 
75
84
  def add_admin_column_to_users
@@ -0,0 +1,8 @@
1
+ // To add additional timeago locales, uncomment the lines below:
2
+ /*
3
+ <% timeago_root = File.join(Gem.loaded_specs['timeago_js'].full_gem_path, 'assets', 'javascripts') %>
4
+ import "<%= File.join(timeago_root, 'timeago.js') %>";
5
+ <%= %w[de es fr it pl pt_BR ru].map { |locale| %(import "#{File.join(timeago_root, "timeago/locales/#{locale}.js")}";) } * "\n" %>
6
+ */
7
+
8
+ <%= Thredded::WebpackAssets.javascripts %>
@@ -8,13 +8,14 @@ require 'thredded_create_app/command_error'
8
8
  module ThreddedCreateApp
9
9
  module Tasks
10
10
  # @abstract
11
- class Base
11
+ class Base # rubocop:disable Metrics/ClassLength
12
12
  include ThreddedCreateApp::Logging
13
13
 
14
14
  attr_reader :app_name, :app_hostname, :app_path, :gems
15
15
 
16
- def initialize(
17
- app_path:, verbose: false, database:, simple_form: true, **_args
16
+ def initialize( # rubocop:disable Metrics/ParameterLists
17
+ app_path:, verbose: false, database:, webpack_js: true,
18
+ simple_form: true, **_args
18
19
  )
19
20
  @app_path = app_path
20
21
  @app_name = File.basename(File.expand_path(app_path))
@@ -23,6 +24,11 @@ module ThreddedCreateApp
23
24
  @database_adapter_name = database.to_s
24
25
  @gems = []
25
26
  @simple_form = simple_form
27
+ @webpack_js = webpack_js
28
+ end
29
+
30
+ def webpack_js?
31
+ @webpack_js
26
32
  end
27
33
 
28
34
  def devise_form_fields_begin_pattern
@@ -20,7 +20,7 @@ module ThreddedCreateApp
20
20
  " #{rails_database} and rspec"
21
21
  end
22
22
 
23
- def before_bundle
23
+ def before_bundle # rubocop:disable Metrics/AbcSize
24
24
  if @install_gem_bundler_rails
25
25
  run 'gem update --system --no-document --quiet' unless @user_install
26
26
  install_gem 'bundler'
@@ -31,7 +31,8 @@ module ThreddedCreateApp
31
31
  run "rails _#{@rails_version}_ new . --skip-bundle" \
32
32
  " --database=#{rails_database} " \
33
33
  " --skip-test#{verbose? ? ' --verbose' : ' --quiet'}" \
34
- ' --skip-javascript'
34
+ "#{' --skip-javascript' unless webpack_js?}"
35
+ run 'rm', 'Gemfile.lock' if File.exist?('Gemfile.lock')
35
36
  replace 'Gemfile', /gem 'sass-rails'.*$/, "gem 'sassc-rails'"
36
37
  add_gem 'rspec-rails', version: '>= 4.0.0.beta3', groups: %i[test]
37
38
  add_gem 'capybara', groups: %i[test]
@@ -20,9 +20,11 @@ module ThreddedCreateApp
20
20
  end
21
21
 
22
22
  def before_bundle
23
- add_gem 'babel-transpiler'
24
- add_gem 'uglifier'
25
- add_gem 'turbolinks'
23
+ unless webpack_js?
24
+ add_gem 'babel-transpiler'
25
+ add_gem 'uglifier'
26
+ add_gem 'turbolinks'
27
+ end
26
28
  add_gem 'rails-timeago'
27
29
  end
28
30
 
@@ -30,9 +32,13 @@ module ThreddedCreateApp
30
32
  add_config_vars
31
33
  add_i18n
32
34
  add_seeds
33
- configure_assets
35
+ configure_sprockets
34
36
  add_favicon_and_touch_icons
35
- add_javascripts
37
+ if webpack_js?
38
+ add_javascripts_webpack
39
+ else
40
+ add_javascripts_sprockets
41
+ end
36
42
  add_styles
37
43
  add_user_page
38
44
  add_home_page
@@ -61,12 +67,25 @@ module ThreddedCreateApp
61
67
  ERB
62
68
  end
63
69
 
64
- def configure_assets
65
- copy 'setup_app_skeleton/manifest.js',
66
- 'app/assets/config/manifest.js'
70
+ def add_javascripts_webpack
71
+ append_to_file 'app/javascript/packs/application.js', <<~JS
72
+ require('monkey-patch-turbolinks.js');
73
+ require('app');
74
+ JS
75
+ copy 'setup_app_skeleton/javascript_webpack/monkey-patch-turbolinks.js',
76
+ 'app/javascript/monkey-patch-turbolinks.js'
77
+ %w[app index theme time_ago].each do |file|
78
+ copy "setup_app_skeleton/javascript_webpack/app/#{file}.js",
79
+ "app/javascript/app/#{file}.js"
80
+ end
81
+ git_commit 'Add app JavaScript'
82
+ end
67
83
 
84
+ def configure_sprockets
85
+ replace 'app/assets/config/manifest.js',
86
+ "//= link_directory ../stylesheets .css\n",
87
+ ''
68
88
  append_to_file 'config/initializers/assets.rb', <<~RUBY
69
-
70
89
  # Work around https://github.com/rails/sprockets/issues/581
71
90
  Rails.application.config.assets.configure do |env|
72
91
  env.export_concurrent = false
@@ -74,7 +93,7 @@ module ThreddedCreateApp
74
93
  RUBY
75
94
  end
76
95
 
77
- def add_javascripts
96
+ def add_javascripts_sprockets
78
97
  inject_into_file 'config/environments/production.rb',
79
98
  after: " # config.assets.css_compressor = :sass\n",
80
99
  content: <<-RUBY
@@ -158,18 +177,32 @@ module ThreddedCreateApp
158
177
  indent(4, <<~ERB)
159
178
  <%= stylesheet_link_tag current_theme, media: 'all', 'data-turbolinks-track': 'reload' %>
160
179
  ERB
161
- inject_into_file 'app/views/layouts/application.html.erb',
162
- before: %r{\s*</head>},
163
- content: <<-'ERB'
180
+ if webpack_js?
181
+ replace 'app/views/layouts/application.html.erb',
182
+ <<-'ERB',
183
+ <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
184
+ ERB
185
+ <<-'ERB'
186
+ <%= javascript_pack_tag 'application',
187
+ async: true,
188
+ defer: true,
189
+ 'data-turbolinks-track': 'reload' %>
190
+ ERB
191
+ else
192
+ inject_into_file 'app/views/layouts/application.html.erb',
193
+ before: %r{\s*</head>},
194
+ content: <<-'ERB'
164
195
  <%= javascript_include_tag 'application',
165
196
  async: !Rails.application.config.assets.debug,
166
197
  defer: true,
167
198
  'data-turbolinks-track': 'reload' %>
168
- ERB
199
+ ERB
200
+ end
169
201
 
170
202
  inject_into_file 'app/views/layouts/application.html.erb',
171
203
  before: %r{\s*</head>},
172
204
  content: <<-'ERB'
205
+
173
206
  <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
174
207
  ERB
175
208
 
@@ -0,0 +1,55 @@
1
+ let DOMContentLoadedFired = false;
2
+
3
+ const isTurbolinks = 'Turbolinks' in window && window.Turbolinks.supported;
4
+ const isTurbolinks5 = isTurbolinks && 'clearCache' in window.Turbolinks;
5
+
6
+ let onPageLoadFiredOnce = false;
7
+ const pageLoadCallbacks = [];
8
+ const triggerOnPageLoad = () => {
9
+ pageLoadCallbacks.forEach(function(callback) {
10
+ callback();
11
+ });
12
+ onPageLoadFiredOnce = true;
13
+ };
14
+
15
+ // Fires the callback on DOMContentLoaded or a Turbolinks page load.
16
+ // If called from an async script on the first page load, and the DOMContentLoad event
17
+ // has already fired, will execute the callback immediately.
18
+ export function onPageLoad(callback) {
19
+ pageLoadCallbacks.push(callback);
20
+ // With async script loading, a callback may be added after the DOMContentLoaded event has already triggered.
21
+ // This means we will receive neither a DOMContentLoaded event, nor a turbolinks:load event on Turbolinks 5.
22
+ if (!onPageLoadFiredOnce && DOMContentLoadedFired) {
23
+ callback();
24
+ }
25
+ }
26
+
27
+ export function isAppPage() {
28
+ return !!document.getElementById('app-page-container');
29
+ }
30
+
31
+ if (isTurbolinks5) {
32
+ // In Turbolinks 5.0.1, turbolinks:load may have already fired (before DOMContentLoaded).
33
+ // If so, add our own DOMContentLoaded listener:
34
+ // See: https://github.com/turbolinks/turbolinks/commit/69d353ea73d10ee6b25c2866fc5706879ba403e3
35
+ if (window.Turbolinks.controller.lastRenderedLocation) {
36
+ document.addEventListener('DOMContentLoaded', () => {
37
+ triggerOnPageLoad();
38
+ });
39
+ }
40
+ document.addEventListener('turbolinks:load', () => {
41
+ triggerOnPageLoad();
42
+ });
43
+ } else {
44
+ // Turbolinks Classic (with or without jQuery.Turbolinks), or no Turbolinks:
45
+ if (!DOMContentLoadedFired) {
46
+ document.addEventListener('DOMContentLoaded', () => {
47
+ triggerOnPageLoad();
48
+ });
49
+ }
50
+ if (isTurbolinks) {
51
+ document.addEventListener('page:load', () => {
52
+ triggerOnPageLoad();
53
+ });
54
+ }
55
+ }
@@ -0,0 +1,3 @@
1
+ import './app';
2
+ import './theme';
3
+ import './time_ago';
@@ -0,0 +1,14 @@
1
+ import {onPageLoad} from './app';
2
+
3
+ onPageLoad(() => {
4
+ Array.prototype.forEach.call(document.querySelectorAll('.app-nav-theme li button'), (button) => {
5
+ button.addEventListener('click', (evt) => {
6
+ const expiresAt = new Date();
7
+ expiresAt.setMonth(expiresAt.getMonth() + 12);
8
+ document.cookie = 'app-theme=' +
9
+ evt.currentTarget.parentNode.getAttribute('data-theme') +
10
+ ';expires=' + expiresAt + ';path=/';
11
+ document.location.reload();
12
+ });
13
+ });
14
+ });
@@ -0,0 +1,13 @@
1
+ import {isAppPage, onPageLoad} from "./app";
2
+
3
+ onPageLoad(() => {
4
+ if (!isAppPage()) return;
5
+ const COMPONENT_SELECTOR = '[data-time-ago]';
6
+ window.timeago().render(
7
+ document.querySelectorAll(COMPONENT_SELECTOR),
8
+ document.querySelector('#app-page-container')
9
+ .getAttribute('data-locale').replace('-', '_'));
10
+ });
11
+ document.addEventListener('turbolinks:before-cache', () => {
12
+ window.timeago.cancel();
13
+ });
@@ -0,0 +1,30 @@
1
+ const Turbolinks = require('turbolinks');
2
+
3
+ // Monkey patch Turbolinks to render 403, 404 & 500 normally
4
+ // See https://github.com/turbolinks/turbolinks/issues/179
5
+ Turbolinks.HttpRequest.prototype.requestLoaded = function() {
6
+ return this.endRequest(function() {
7
+ var code = this.xhr.status;
8
+ if (200 <= code && code < 300 ||
9
+ code === 403 || code === 404 || code === 500) {
10
+ this.delegate.requestCompletedWithResponse(
11
+ this.xhr.responseText,
12
+ this.xhr.getResponseHeader("Turbolinks-Location"));
13
+ } else {
14
+ this.failed = true;
15
+ this.delegate.requestFailedWithStatusCode(code, this.xhr.responseText);
16
+ }
17
+ }.bind(this));
18
+ };
19
+
20
+ // Turbolinks nonce CSP support.
21
+ // See https://github.com/turbolinks/turbolinks/issues/430
22
+ document.addEventListener('turbolinks:request-start', function(event) {
23
+ var nonceTag = document.querySelector("meta[name='csp-nonce']");
24
+ if (nonceTag) event.data.xhr.setRequestHeader('X-Turbolinks-Nonce', nonceTag.content);
25
+ });
26
+ document.addEventListener('turbolinks:before-cache', function() {
27
+ Array.prototype.forEach.call(document.querySelectorAll('script[nonce]'), function(element) {
28
+ if (element.nonce) element.setAttribute('nonce', element.nonce);
29
+ });
30
+ });
@@ -14,3 +14,15 @@ window.Turbolinks.HttpRequest.prototype.requestLoaded = function() {
14
14
  }
15
15
  }.bind(this));
16
16
  };
17
+
18
+ // Turbolinks nonce CSP support.
19
+ // See https://github.com/turbolinks/turbolinks/issues/430
20
+ document.addEventListener('turbolinks:request-start', function(event) {
21
+ var nonceTag = document.querySelector("meta[name='csp-nonce']");
22
+ if (nonceTag) event.data.xhr.setRequestHeader('X-Turbolinks-Nonce', nonceTag.content);
23
+ });
24
+ document.addEventListener('turbolinks:before-cache', function() {
25
+ Array.prototype.forEach.call(document.querySelectorAll('script[nonce]'), function(element) {
26
+ if (element.nonce) element.setAttribute('nonce', element.nonce);
27
+ });
28
+ });
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ThreddedCreateApp
4
- VERSION = '0.1.28'
4
+ VERSION = '0.2.0'
5
5
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: thredded_create_app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.28
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Gleb Mazovetskiy
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-10-19 00:00:00.000000000 Z
11
+ date: 2019-10-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: highline
@@ -136,6 +136,7 @@ files:
136
136
  - lib/thredded_create_app/tasks/add_thredded/myapp_thredded.js
137
137
  - lib/thredded_create_app/tasks/add_thredded/spec/features/thredded_spec.rb
138
138
  - lib/thredded_create_app/tasks/add_thredded/thredded.en.yml
139
+ - lib/thredded_create_app/tasks/add_thredded/thredded_imports.js.erb
139
140
  - lib/thredded_create_app/tasks/add_thredded/thredded_initializer_controller.rb
140
141
  - lib/thredded_create_app/tasks/base.rb
141
142
  - lib/thredded_create_app/tasks/create_rails_app.rb
@@ -156,12 +157,16 @@ files:
156
157
  - lib/thredded_create_app/tasks/setup_app_skeleton/home_show.html.erb.erb
157
158
  - lib/thredded_create_app/tasks/setup_app_skeleton/images/brightness.svg
158
159
  - lib/thredded_create_app/tasks/setup_app_skeleton/initializers/02_i18n.rb
160
+ - lib/thredded_create_app/tasks/setup_app_skeleton/javascript_webpack/app/app.js
161
+ - lib/thredded_create_app/tasks/setup_app_skeleton/javascript_webpack/app/index.js
162
+ - lib/thredded_create_app/tasks/setup_app_skeleton/javascript_webpack/app/theme.js
163
+ - lib/thredded_create_app/tasks/setup_app_skeleton/javascript_webpack/app/time_ago.js
164
+ - lib/thredded_create_app/tasks/setup_app_skeleton/javascript_webpack/monkey-patch-turbolinks.js
159
165
  - lib/thredded_create_app/tasks/setup_app_skeleton/javascripts/app.js
160
166
  - lib/thredded_create_app/tasks/setup_app_skeleton/javascripts/app/monkey-patch-turbolinks.js
161
167
  - lib/thredded_create_app/tasks/setup_app_skeleton/javascripts/app/theme.js
162
168
  - lib/thredded_create_app/tasks/setup_app_skeleton/javascripts/app/time_ago.js
163
169
  - lib/thredded_create_app/tasks/setup_app_skeleton/javascripts/application.js
164
- - lib/thredded_create_app/tasks/setup_app_skeleton/manifest.js
165
170
  - lib/thredded_create_app/tasks/setup_app_skeleton/seeds.rb.erb
166
171
  - lib/thredded_create_app/tasks/setup_app_skeleton/spec/controllers/users_controller_spec.rb
167
172
  - lib/thredded_create_app/tasks/setup_app_skeleton/spec/features/homepage_spec.rb
@@ -1 +0,0 @@
1
- //= link_tree ../images