superglue 0.40.0 → 0.41.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/rails/superglue_generator.rb +20 -3
- data/lib/install/templates/web/actions.js +0 -1
- data/lib/install/templates/web/application.js +2 -41
- data/lib/install/templates/web/application.json.props +2 -1
- data/lib/install/templates/web/reducer.js +1 -29
- data/lib/install/web.rb +26 -33
- data/lib/tasks/install.rake +1 -23
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 20e7f46b274beaffe44eb96b704678e4eb2ebb43c85607a6b4170974525db452
|
4
|
+
data.tar.gz: 4e4280233e4e9ed82664aafb9fde2f176471c605142bba3af3326282431e0278
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ba6cd0dabf868452a22e88533df3b2d76f324078e7d7559917a1b5d5aa181cf3e060ceee6f1ea9271f8a8478fde127636639493914eb38ba6eba583026edeabd
|
7
|
+
data.tar.gz: 7ebb6ade8ba3a240013f9c55f2b6527423773d8655be5292aedab05e01af089884f8e6f7e93bbb0e45f27c785aebd20c4153e20e93796da3c88e3f0804bb775a
|
@@ -1,9 +1,10 @@
|
|
1
1
|
require 'rails/generators/named_base'
|
2
2
|
require 'rails/generators/resource_helpers'
|
3
|
+
require 'rails/version'
|
3
4
|
|
4
5
|
module Rails
|
5
6
|
module Generators
|
6
|
-
class SuperglueGenerator < NamedBase
|
7
|
+
class SuperglueGenerator < NamedBase
|
7
8
|
include Rails::Generators::ResourceHelpers
|
8
9
|
|
9
10
|
source_root File.expand_path('../templates', __FILE__)
|
@@ -42,13 +43,29 @@ module Rails
|
|
42
43
|
|
43
44
|
|
44
45
|
protected
|
46
|
+
def view_path
|
47
|
+
if Rails.version >= "7"
|
48
|
+
"../views"
|
49
|
+
else
|
50
|
+
"../../views"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def app_js_path
|
55
|
+
if Rails.version >= "7"
|
56
|
+
"app/javascript/"
|
57
|
+
else
|
58
|
+
"app/javascript/packs"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
45
62
|
def append_mapping(action)
|
46
|
-
app_js =
|
63
|
+
app_js = "#{app_js_path}/application.js"
|
47
64
|
|
48
65
|
component_name = [plural_table_name, action].map(&:camelcase).join
|
49
66
|
|
50
67
|
inject_into_file app_js, after: "from '@thoughtbot/superglue'" do
|
51
|
-
"\nimport #{component_name} from '
|
68
|
+
"\nimport #{component_name} from '#{view_path}/#{controller_file_path}/#{action}'"
|
52
69
|
end
|
53
70
|
|
54
71
|
inject_into_file app_js, after: 'identifierToComponentMapping = {' do
|
@@ -5,8 +5,6 @@ import thunk from 'redux-thunk';
|
|
5
5
|
import { Provider } from 'react-redux';
|
6
6
|
import { render } from 'react-dom';
|
7
7
|
import { ApplicationBase, fragmentMiddleware } from '@thoughtbot/superglue';
|
8
|
-
import { persistStore, persistReducer } from 'redux-persist';
|
9
|
-
import storage from 'redux-persist/lib/storage';
|
10
8
|
import { applicationRootReducer, applicationPagesReducer } from './reducer';
|
11
9
|
import { buildVisitAndRemote } from './application_visit';
|
12
10
|
|
@@ -58,57 +56,20 @@ export default class Application extends ApplicationBase {
|
|
58
56
|
const composeEnhancers =
|
59
57
|
(this.hasWindow && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
|
60
58
|
compose;
|
61
|
-
const reducer =
|
62
|
-
reduceReducers(
|
59
|
+
const reducer = reduceReducers(
|
63
60
|
combineReducers({
|
64
61
|
superglue: superglueReducer,
|
65
62
|
pages: reduceReducers(pagesReducer, applicationPagesReducer),
|
66
63
|
}),
|
67
64
|
applicationRootReducer
|
68
|
-
)
|
69
65
|
);
|
66
|
+
|
70
67
|
const store = createStore(
|
71
68
|
reducer,
|
72
69
|
initialState,
|
73
70
|
composeEnhancers(applyMiddleware(thunk, fragmentMiddleware))
|
74
71
|
);
|
75
72
|
|
76
|
-
if (this.hasWindow) {
|
77
|
-
// Persist the store using Redux-Persist
|
78
|
-
persistStore(store);
|
79
|
-
}
|
80
|
-
|
81
73
|
return store;
|
82
74
|
}
|
83
|
-
|
84
|
-
wrapWithPersistReducer(reducers) {
|
85
|
-
// Redux Persist settings
|
86
|
-
// The key is set to the stringified JS asset path to remove the need for
|
87
|
-
// migrations when hydrating.
|
88
|
-
if (!this.hasWindow) {
|
89
|
-
return reducers;
|
90
|
-
}
|
91
|
-
const prefix = "superglue";
|
92
|
-
const persistKey =
|
93
|
-
prefix +
|
94
|
-
this.props.initialPage.assets
|
95
|
-
.filter((asset) => asset.endsWith(".js"))
|
96
|
-
.join(",");
|
97
|
-
const persistConfig = {
|
98
|
-
key: persistKey,
|
99
|
-
storage,
|
100
|
-
};
|
101
|
-
|
102
|
-
// Remove older storage items that were used by previous JS assets
|
103
|
-
if (this.hasWindow) {
|
104
|
-
const storedKeys = Object.keys(localStorage);
|
105
|
-
storedKeys.forEach((key) => {
|
106
|
-
if (key.startsWith(`persist:${prefix}`) && key !== persistKey) {
|
107
|
-
localStorage.removeItem(key);
|
108
|
-
}
|
109
|
-
});
|
110
|
-
}
|
111
|
-
|
112
|
-
return persistReducer(persistConfig, reducers);
|
113
|
-
}
|
114
75
|
}
|
@@ -8,7 +8,8 @@ json.component_identifier local_assigns[:virtual_path_of_template]
|
|
8
8
|
json.defers json.deferred!
|
9
9
|
json.fragments json.fragments!
|
10
10
|
json.assets [
|
11
|
-
|
11
|
+
# Uncomment for webpacker support
|
12
|
+
# asset_pack_path('application.js'),
|
12
13
|
asset_path('application.css')
|
13
14
|
]
|
14
15
|
|
@@ -20,9 +20,6 @@
|
|
20
20
|
// }
|
21
21
|
// }
|
22
22
|
|
23
|
-
import {
|
24
|
-
REHYDRATE,
|
25
|
-
} from './actions'
|
26
23
|
|
27
24
|
// The applicationPageReducer is for cross page reducers
|
28
25
|
// Its common to add to this. You'll typically have to pass a pageKey to the
|
@@ -38,34 +35,9 @@ export const applicationPagesReducer = (state = {}, action) => {
|
|
38
35
|
}
|
39
36
|
|
40
37
|
// The applicationRootReducer is for app wide reducers
|
41
|
-
// Its rare to be adding to this.
|
42
|
-
// Redux Persist.
|
43
|
-
//
|
44
|
-
// The REHYDRATE reducer is generated by Superglue and is needed to persist state
|
45
|
-
// on any changes made to the initial state that gets injected into
|
46
|
-
// window.SUPERGLUE_INITIAL_PAGE_STATE.
|
38
|
+
// Its rare to be adding to this.
|
47
39
|
export const applicationRootReducer = (state = {}, action) => {
|
48
40
|
switch(action.type) {
|
49
|
-
case REHYDRATE: {
|
50
|
-
if (action.payload) {
|
51
|
-
const {
|
52
|
-
pages: hydratedPages
|
53
|
-
} = action.payload
|
54
|
-
const { pages } = state
|
55
|
-
const nextPages = { ...pages, ...hydratedPages }
|
56
|
-
|
57
|
-
for (const key in pages) {
|
58
|
-
if (pages[key] && hydratedPages[key] &&
|
59
|
-
pages[key].renderedAt > hydratedPages[key].renderedAt) {
|
60
|
-
nextPages[key] = { ...pages[key] }
|
61
|
-
}
|
62
|
-
}
|
63
|
-
|
64
|
-
return { ...state, pages: nextPages }
|
65
|
-
} else {
|
66
|
-
return state
|
67
|
-
}
|
68
|
-
}
|
69
41
|
default:
|
70
42
|
return state
|
71
43
|
}
|
data/lib/install/web.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require "
|
2
|
-
|
3
|
-
babel_config = Rails.root.join("babel.config.js")
|
1
|
+
require "rails/version"
|
4
2
|
|
5
3
|
def add_member_methods
|
6
4
|
inject_into_file "app/models/application_record.rb", after: "class ApplicationRecord < ActiveRecord::Base\n" do
|
@@ -16,35 +14,28 @@ def add_member_methods
|
|
16
14
|
end
|
17
15
|
end
|
18
16
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
"components": "./app/components",
|
27
|
-
"javascript": "./app/javascript"
|
28
|
-
}
|
29
|
-
}
|
30
|
-
],
|
31
|
-
JAVASCRIPT
|
32
|
-
insert_into_file "babel.config.js", resolver_snippet, after: /plugins: \[\n/
|
17
|
+
def app_js_path
|
18
|
+
if Rails.version >= "7"
|
19
|
+
"app/javascript/"
|
20
|
+
else
|
21
|
+
"app/javascript/packs"
|
22
|
+
end
|
23
|
+
end
|
33
24
|
|
34
|
-
say "Copying application.js file to #{
|
35
|
-
copy_file "#{__dir__}/templates/web/application.js", "#{
|
25
|
+
say "Copying application.js file to #{app_js_path}"
|
26
|
+
copy_file "#{__dir__}/templates/web/application.js", "#{app_js_path}/application.js"
|
36
27
|
|
37
|
-
say "Copying reducer.js file to #{
|
38
|
-
copy_file "#{__dir__}/templates/web/reducer.js", "#{
|
28
|
+
say "Copying reducer.js file to #{app_js_path}"
|
29
|
+
copy_file "#{__dir__}/templates/web/reducer.js", "#{app_js_path}/reducer.js"
|
39
30
|
|
40
|
-
say "Copying action_creators.js file to #{
|
41
|
-
copy_file "#{__dir__}/templates/web/action_creators.js", "#{
|
31
|
+
say "Copying action_creators.js file to #{app_js_path}"
|
32
|
+
copy_file "#{__dir__}/templates/web/action_creators.js", "#{app_js_path}/action_creators.js"
|
42
33
|
|
43
|
-
say "Copying actions.js file to #{
|
44
|
-
copy_file "#{__dir__}/templates/web/actions.js", "#{
|
34
|
+
say "Copying actions.js file to #{app_js_path}"
|
35
|
+
copy_file "#{__dir__}/templates/web/actions.js", "#{app_js_path}/actions.js"
|
45
36
|
|
46
|
-
say "Copying application_visit.js file to #{
|
47
|
-
copy_file "#{__dir__}/templates/web/application_visit.js", "#{
|
37
|
+
say "Copying application_visit.js file to #{app_js_path}"
|
38
|
+
copy_file "#{__dir__}/templates/web/application_visit.js", "#{app_js_path}/application_visit.js"
|
48
39
|
|
49
40
|
say "Copying Superglue initializer"
|
50
41
|
copy_file "#{__dir__}/templates/web/initializer.rb", "config/initializers/superglue.rb"
|
@@ -56,11 +47,13 @@ say "Adding required member methods to ApplicationRecord"
|
|
56
47
|
add_member_methods
|
57
48
|
|
58
49
|
say "Installing React, Redux, and Superglue"
|
59
|
-
run "yarn add
|
50
|
+
run "yarn add history html-react-parser react-redux redux-thunk redux reduce-reducers immer @thoughtbot/superglue --save"
|
60
51
|
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
52
|
+
if Rails.version < "7"
|
53
|
+
# For newer webpacker
|
54
|
+
insert_into_file Webpacker.config.config_path, "'app/views', 'app/components'", after: /additional_paths: \[/
|
55
|
+
# For older webpacker
|
56
|
+
insert_into_file Webpacker.config.config_path, "'app/views', 'app/components'", after: /resolved_paths: \[/
|
57
|
+
end
|
65
58
|
|
66
|
-
say "
|
59
|
+
say "Superglue is Installed! 🎉", :green
|
data/lib/tasks/install.rake
CHANGED
@@ -1,15 +1,4 @@
|
|
1
1
|
namespace :superglue do
|
2
|
-
desc "Verifies if any version of Yarn is installed"
|
3
|
-
task :verify_yarn do
|
4
|
-
begin
|
5
|
-
yarn_version = `yarn --version`
|
6
|
-
raise Errno::ENOENT if yarn_version.blank?
|
7
|
-
rescue Errno::ENOENT
|
8
|
-
$stderr.puts "Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/"
|
9
|
-
$stderr.puts "Exiting!" && exit!
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
2
|
desc "Verifies if any version of react is in package.json"
|
14
3
|
task :verify_react do
|
15
4
|
package_json = JSON.parse(File.read(Rails.root.join("package.json")))
|
@@ -20,20 +9,9 @@ namespace :superglue do
|
|
20
9
|
end
|
21
10
|
end
|
22
11
|
|
23
|
-
desc "Verifies webpacker has been installed"
|
24
|
-
task "verify_webpacker" do
|
25
|
-
begin
|
26
|
-
require "webpacker/configuration"
|
27
|
-
rescue LoadError
|
28
|
-
$stderr.puts "Superglue's web install requires webpacker!"
|
29
|
-
$stderr.puts "https://github.com/rails/webpacker#installation"
|
30
|
-
$stderr.puts "Exiting!" && exit!
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
12
|
namespace :install do
|
35
13
|
desc "Install everything needed for superglue web"
|
36
|
-
task 'web' => ["superglue:
|
14
|
+
task 'web' => ["superglue:verify_react"] do
|
37
15
|
template = File.expand_path("../install/web.rb", __dir__)
|
38
16
|
exec "#{RbConfig.ruby} ./bin/rails app:template LOCATION=#{template}"
|
39
17
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: superglue
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.41.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Johny Ho
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2023-01-14 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|