thredded_create_app 0.1.28 → 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
  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