superglue 0.40.0 → 0.50.0.beta1
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 +4 -4
- data/lib/generators/rails/scaffold_controller_generator.rb +3 -3
- data/lib/generators/rails/superglue_generator.rb +52 -46
- data/lib/generators/rails/templates/_form.json.props +3 -10
- data/lib/generators/rails/templates/index.json.props +3 -1
- data/lib/generators/rails/templates/web/edit.js +9 -2
- data/lib/generators/rails/templates/web/index.js +8 -1
- data/lib/generators/rails/templates/web/new.js +9 -2
- data/lib/install/templates/web/actions.js +0 -1
- data/lib/install/templates/web/application.js +28 -73
- data/lib/install/templates/web/application.json.props +1 -4
- data/lib/install/templates/web/initializer.rb +1 -1
- data/lib/install/templates/web/page_to_page_mapping.js +12 -0
- data/lib/install/templates/web/reducer.js +1 -29
- data/lib/install/web.rb +21 -35
- data/lib/superglue/helpers.rb +7 -517
- data/lib/superglue/redirection.rb +1 -2
- data/lib/superglue.rb +6 -6
- data/lib/tasks/install.rake +4 -27
- metadata +15 -22
- data/test/engine_test.rb +0 -7
- data/test/helpers_test.rb +0 -23
- data/test/render_test.rb +0 -81
- data/test/test_helper.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 44a42cb747cff210dd1550dae3f9ddf280e72a2b38ff26b72fa5f2eea2eeadfe
|
4
|
+
data.tar.gz: f52f207c4be16d576a51c09f0e821c08d9af68b8150bf52d5b007f59e912d936
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 57a0e0bbfd2fdcc815af7922f3b97042d016fe6f68be3389a83bcb77a5de2e1e68423a172878482533f25b69464c09d0395a116c4e8179a48ffce1d7a681dcd7
|
7
|
+
data.tar.gz: d8f034124031b598ee70394fd4900e4daab38126458db85f25afb96e9074bb07196d1f01e9975e960768676da469772d7be044ca3ce0915de95f2e129fdc78d7
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "rails/generators"
|
2
|
+
require "rails/generators/rails/scaffold_controller/scaffold_controller_generator"
|
3
3
|
|
4
4
|
module Rails
|
5
5
|
module Generators
|
6
6
|
class ScaffoldControllerGenerator
|
7
|
-
source_paths << File.expand_path(
|
7
|
+
source_paths << File.expand_path("../templates", __FILE__)
|
8
8
|
|
9
9
|
hook_for :superglue, type: :boolean, default: true
|
10
10
|
end
|
@@ -1,92 +1,98 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "rails/generators/named_base"
|
2
|
+
require "rails/generators/resource_helpers"
|
3
3
|
|
4
4
|
module Rails
|
5
5
|
module Generators
|
6
|
-
class SuperglueGenerator < NamedBase
|
6
|
+
class SuperglueGenerator < NamedBase
|
7
7
|
include Rails::Generators::ResourceHelpers
|
8
8
|
|
9
|
-
source_root File.expand_path(
|
9
|
+
source_root File.expand_path("../templates", __FILE__)
|
10
10
|
|
11
|
-
argument :attributes, type: :array, default: [], banner:
|
11
|
+
argument :attributes, type: :array, default: [], banner: "field:type field:type"
|
12
12
|
|
13
13
|
def create_root_folder
|
14
|
-
path = File.join(
|
14
|
+
path = File.join("app/views", controller_file_path)
|
15
15
|
empty_directory path unless File.directory?(path)
|
16
16
|
end
|
17
17
|
|
18
18
|
def copy_view_files
|
19
|
-
%w
|
19
|
+
%w[index show new edit].each do |view|
|
20
20
|
@action_name = view
|
21
21
|
filename = filename_with_extensions(view)
|
22
|
-
template filename, File.join(
|
22
|
+
template filename, File.join("app/views", controller_file_path, filename)
|
23
23
|
end
|
24
|
-
template
|
24
|
+
template "_form.json.props", File.join("app/views", controller_file_path, "_form.json.props")
|
25
25
|
|
26
|
-
%w
|
26
|
+
%w[index show new edit].each do |view|
|
27
27
|
@action_name = view
|
28
28
|
filename = filename_with_js_extensions(view)
|
29
|
-
template
|
29
|
+
template "web/" + filename, File.join("app/views", controller_file_path, filename)
|
30
30
|
end
|
31
31
|
|
32
|
-
%w
|
32
|
+
%w[index show new edit].each do |view|
|
33
33
|
@action_name = view
|
34
34
|
filename = filename_with_html_extensions(view)
|
35
|
-
template
|
35
|
+
template "web/" + filename, File.join("app/views", controller_file_path, filename)
|
36
36
|
end
|
37
37
|
|
38
|
-
%w
|
38
|
+
%w[index show new edit].each do |view|
|
39
39
|
append_mapping(view)
|
40
40
|
end
|
41
41
|
end
|
42
42
|
|
43
|
-
|
44
43
|
protected
|
45
|
-
def append_mapping(action)
|
46
|
-
app_js = 'app/javascript/packs/application.js'
|
47
44
|
|
48
|
-
|
45
|
+
def view_path
|
46
|
+
"../views"
|
47
|
+
end
|
49
48
|
|
50
|
-
|
51
|
-
|
52
|
-
|
49
|
+
def app_js_path
|
50
|
+
"app/javascript/"
|
51
|
+
end
|
53
52
|
|
54
|
-
|
55
|
-
|
56
|
-
end
|
57
|
-
end
|
53
|
+
def append_mapping(action)
|
54
|
+
app_js = "#{app_js_path}/page_to_page_mapping.js"
|
58
55
|
|
59
|
-
|
60
|
-
@action_name
|
61
|
-
end
|
56
|
+
component_name = [plural_table_name, action].map(&:camelcase).join
|
62
57
|
|
63
|
-
|
64
|
-
|
58
|
+
prepend_to_file app_js do
|
59
|
+
"\nimport #{component_name} from '#{view_path}/#{controller_file_path}/#{action}'"
|
65
60
|
end
|
66
61
|
|
67
|
-
|
68
|
-
[
|
62
|
+
inject_into_file app_js, after: "pageIdentifierToPageComponent = {" do
|
63
|
+
"\n '#{[controller_file_path, action].join("/")}': #{component_name},"
|
69
64
|
end
|
65
|
+
end
|
70
66
|
|
71
|
-
|
72
|
-
[name, :js] * '.'
|
73
|
-
end
|
67
|
+
attr_reader :action_name
|
74
68
|
|
75
|
-
|
76
|
-
|
77
|
-
|
69
|
+
def attributes_names
|
70
|
+
[:id] + super
|
71
|
+
end
|
78
72
|
|
79
|
-
|
80
|
-
|
81
|
-
|
73
|
+
def filename_with_extensions(name)
|
74
|
+
[name, :json, :props].join(".")
|
75
|
+
end
|
82
76
|
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
77
|
+
def filename_with_js_extensions(name)
|
78
|
+
[name, :js].join(".")
|
79
|
+
end
|
80
|
+
|
81
|
+
def filename_with_html_extensions(name)
|
82
|
+
[name, :html, :erb].join(".")
|
83
|
+
end
|
87
84
|
|
88
|
-
|
85
|
+
def attributes_list_with_timestamps
|
86
|
+
attributes_list(attributes_names + %w[created_at updated_at])
|
87
|
+
end
|
88
|
+
|
89
|
+
def attributes_list(attributes = attributes_names)
|
90
|
+
if self.attributes.any? { |attr| attr.name == "password" && attr.type == :digest }
|
91
|
+
attributes = attributes.reject { |name| %w[password password_confirmation].include? name }
|
89
92
|
end
|
93
|
+
|
94
|
+
attributes
|
95
|
+
end
|
90
96
|
end
|
91
97
|
end
|
92
98
|
end
|
@@ -1,13 +1,6 @@
|
|
1
|
-
|
2
|
-
inner = "".html_safe
|
3
|
-
|
1
|
+
form_props(model: @<%= model_resource_name %>) do |f|
|
4
2
|
<%- attributes.each do |attr| -%>
|
5
|
-
|
6
|
-
inner << form.<%= attr.field_type %>(:<%= attr.column_name %>)
|
3
|
+
f.<%= attr.field_type %>(:<%= attr.column_name %>)
|
7
4
|
<%- end -%>
|
8
|
-
|
9
|
-
|
10
|
-
inner
|
5
|
+
f.submit
|
11
6
|
end
|
12
|
-
|
13
|
-
json.html html
|
@@ -5,7 +5,9 @@ json.<%= plural_table_name %> do
|
|
5
5
|
<%- end -%>
|
6
6
|
json.edit_<%=singular_table_name%>_path edit_<%=singular_table_name%>_path(<%=singular_table_name%>)
|
7
7
|
json.<%=singular_table_name%>_path <%=singular_table_name%>_path(<%=singular_table_name%>)
|
8
|
-
json.
|
8
|
+
json.delete_form do
|
9
|
+
form_props(model: <%=singular_table_name%>, method: :delete)
|
10
|
+
end
|
9
11
|
end
|
10
12
|
end
|
11
13
|
|
@@ -1,5 +1,4 @@
|
|
1
1
|
import React from 'react'
|
2
|
-
import RailsTag from '@thoughtbot/superglue/components/RailsTag'
|
3
2
|
// import * as actionCreators from 'javascript/packs/action_creators'
|
4
3
|
// import {useDispatch} from 'react-redux'
|
5
4
|
|
@@ -23,7 +22,15 @@ export default function <%= plural_table_name.camelize %>Edit ({
|
|
23
22
|
return (
|
24
23
|
<div>
|
25
24
|
{messagesEl}
|
26
|
-
<
|
25
|
+
<form {...form.props} data-sg-visit={true}>
|
26
|
+
{Object.values(form.extras).map((hiddenProps) => (<input {...hiddenProps} key={hiddenProps.id} type="hidden"/>))}
|
27
|
+
<%- attributes.each do |attr| -%>
|
28
|
+
<input {...form.inputs.<%= attr.column_name %>} type="text"/>
|
29
|
+
<label htmlFor={form.inputs.<%= attr.column_name %>.id}><%= attr.column_name %></label>
|
30
|
+
<%- end -%>
|
31
|
+
<button {...form.inputs.submit} type="submit"> {...form.inputs.submit.text} </button>
|
32
|
+
</form>
|
33
|
+
|
27
34
|
<a href={<%= singular_table_name.camelize(:lower) %>Path} data-sg-visit={true}>Show</a>
|
28
35
|
<a href={<%= plural_table_name.camelize(:lower) %>Path} data-sg-visit={true}>Back</a>
|
29
36
|
</div>
|
@@ -10,6 +10,8 @@ export default function <%= plural_table_name.camelize %>Index({
|
|
10
10
|
<%= plural_table_name.camelize(:lower) %> = [],
|
11
11
|
}) {
|
12
12
|
const <%= singular_table_name.camelize(:lower) %>Items = <%= plural_table_name.camelize(:lower) %>.map((<%= singular_table_name.camelize(:lower) %>, key) => {
|
13
|
+
const deleteForm = <%=singular_table_name.camelize(:lower)%>.deleteForm;
|
14
|
+
|
13
15
|
return (
|
14
16
|
<tr key={<%= singular_table_name.camelize(:lower) %>.id}>
|
15
17
|
<%- attributes_list.select{|attr| attr != :id }.each do |attr| -%>
|
@@ -17,7 +19,12 @@ export default function <%= plural_table_name.camelize %>Index({
|
|
17
19
|
<%- end -%>
|
18
20
|
<td><a href={ <%=singular_table_name%>.<%=singular_table_name.camelize(:lower)%>Path } data-sg-visit={true}>Show</a></td>
|
19
21
|
<td><a href={ <%=singular_table_name%>.edit<%=singular_table_name.camelize%>Path } data-sg-visit={true}>Edit</a></td>
|
20
|
-
<td
|
22
|
+
<td>
|
23
|
+
<form {...deleteForm.props} data-sg-visit={true}>
|
24
|
+
{Object.values(deleteForm.extras).map((hiddenProps) => (<input {...hiddenProps} key={hiddenProps.id} type="hidden"/>))}
|
25
|
+
<button type="submit">Delete</button>
|
26
|
+
</form>
|
27
|
+
</td>
|
21
28
|
</tr>
|
22
29
|
)
|
23
30
|
})
|
@@ -1,5 +1,4 @@
|
|
1
1
|
import React from 'react'
|
2
|
-
import RailsTag from '@thoughtbot/superglue/components/RailsTag'
|
3
2
|
// import * as actionCreators from 'javascript/packs/action_creators'
|
4
3
|
// import { useDispatch } from 'react-redux'
|
5
4
|
|
@@ -22,7 +21,15 @@ export default function <%= plural_table_name.camelize %>New({
|
|
22
21
|
return (
|
23
22
|
<div>
|
24
23
|
{messagesEl}
|
25
|
-
<
|
24
|
+
<form {...form.props} data-sg-visit={true}>
|
25
|
+
{Object.values(form.extras).map((hiddenProps) => (<input {...hiddenProps} key={hiddenProps.id} type="hidden"/>))}
|
26
|
+
<%- attributes.each do |attr| -%>
|
27
|
+
<input {...form.inputs.<%= attr.column_name %>} type="text"/>
|
28
|
+
<label htmlFor={form.inputs.<%= attr.column_name %>.id}><%= attr.column_name %></label>
|
29
|
+
<%- end -%>
|
30
|
+
<button {...form.inputs.submit} type="submit"> {...form.inputs.submit.text} </button>
|
31
|
+
</form>
|
32
|
+
|
26
33
|
<a href={<%= plural_table_name.camelize(:lower) %>Path} data-sg-visit={true}>Back</a>
|
27
34
|
</div>
|
28
35
|
)
|
@@ -5,47 +5,13 @@ 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';
|
10
|
+
import { pageIdentifierToPageComponent } from './page_to_page_mapping';
|
12
11
|
|
13
|
-
|
14
|
-
// to register any new page level component you create. If you are using the
|
15
|
-
// scaffold, it will auto append the identifers for you.
|
16
|
-
//
|
17
|
-
// e.g {'posts/new': PostNew}
|
18
|
-
const identifierToComponentMapping = {
|
19
|
-
};
|
20
|
-
|
21
|
-
if (typeof window !== "undefined") {
|
22
|
-
document.addEventListener("DOMContentLoaded", function () {
|
23
|
-
const appEl = document.getElementById("app");
|
24
|
-
const location = window.location;
|
25
|
-
|
26
|
-
if (appEl) {
|
27
|
-
render(
|
28
|
-
<Application
|
29
|
-
appEl={appEl}
|
30
|
-
// The base url prefixed to all calls made by the `visit`
|
31
|
-
// and `remote` thunks.
|
32
|
-
baseUrl={location.origin}
|
33
|
-
// The global var SUPERGLUE_INITIAL_PAGE_STATE is set by your erb
|
34
|
-
// template, e.g., index.html.erb
|
35
|
-
initialPage={window.SUPERGLUE_INITIAL_PAGE_STATE}
|
36
|
-
// The initial path of the page, e.g., /foobar
|
37
|
-
path={location.pathname + location.search + location.hash}
|
38
|
-
buildVisitAndRemote={buildVisitAndRemote}
|
39
|
-
/>,
|
40
|
-
appEl
|
41
|
-
);
|
42
|
-
}
|
43
|
-
});
|
44
|
-
}
|
45
|
-
|
46
|
-
export default class Application extends ApplicationBase {
|
12
|
+
class Application extends ApplicationBase {
|
47
13
|
mapping() {
|
48
|
-
return
|
14
|
+
return pageIdentifierToPageComponent;
|
49
15
|
}
|
50
16
|
|
51
17
|
visitAndRemote(navRef, store) {
|
@@ -58,57 +24,46 @@ export default class Application extends ApplicationBase {
|
|
58
24
|
const composeEnhancers =
|
59
25
|
(this.hasWindow && window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__) ||
|
60
26
|
compose;
|
61
|
-
const reducer =
|
62
|
-
reduceReducers(
|
27
|
+
const reducer = reduceReducers(
|
63
28
|
combineReducers({
|
64
29
|
superglue: superglueReducer,
|
65
30
|
pages: reduceReducers(pagesReducer, applicationPagesReducer),
|
66
31
|
}),
|
67
32
|
applicationRootReducer
|
68
|
-
)
|
69
33
|
);
|
34
|
+
|
70
35
|
const store = createStore(
|
71
36
|
reducer,
|
72
37
|
initialState,
|
73
38
|
composeEnhancers(applyMiddleware(thunk, fragmentMiddleware))
|
74
39
|
);
|
75
40
|
|
76
|
-
if (this.hasWindow) {
|
77
|
-
// Persist the store using Redux-Persist
|
78
|
-
persistStore(store);
|
79
|
-
}
|
80
|
-
|
81
41
|
return store;
|
82
42
|
}
|
43
|
+
}
|
83
44
|
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
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
|
-
};
|
45
|
+
if (typeof window !== "undefined") {
|
46
|
+
document.addEventListener("DOMContentLoaded", function () {
|
47
|
+
const appEl = document.getElementById("app");
|
48
|
+
const location = window.location;
|
101
49
|
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
50
|
+
if (appEl) {
|
51
|
+
render(
|
52
|
+
<Application
|
53
|
+
appEl={appEl}
|
54
|
+
// The base url prefixed to all calls made by the `visit`
|
55
|
+
// and `remote` thunks.
|
56
|
+
baseUrl={location.origin}
|
57
|
+
// The global var SUPERGLUE_INITIAL_PAGE_STATE is set by your erb
|
58
|
+
// template, e.g., index.html.erb
|
59
|
+
initialPage={window.SUPERGLUE_INITIAL_PAGE_STATE}
|
60
|
+
// The initial path of the page, e.g., /foobar
|
61
|
+
path={location.pathname + location.search + location.hash}
|
62
|
+
buildVisitAndRemote={buildVisitAndRemote}
|
63
|
+
/>,
|
64
|
+
appEl
|
65
|
+
);
|
110
66
|
}
|
111
|
-
|
112
|
-
return persistReducer(persistConfig, reducers);
|
113
|
-
}
|
67
|
+
});
|
114
68
|
}
|
69
|
+
|
@@ -7,10 +7,7 @@ end
|
|
7
7
|
json.component_identifier local_assigns[:virtual_path_of_template]
|
8
8
|
json.defers json.deferred!
|
9
9
|
json.fragments json.fragments!
|
10
|
-
json.assets [
|
11
|
-
asset_pack_path('application.js'),
|
12
|
-
asset_path('application.css')
|
13
|
-
]
|
10
|
+
json.assets [ asset_path('application.js') ]
|
14
11
|
|
15
12
|
if protect_against_forgery?
|
16
13
|
json.csrf_token form_authenticity_token
|
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require "props_template/core_ext"
|
@@ -0,0 +1,12 @@
|
|
1
|
+
// import your page component
|
2
|
+
// e.g import PostsEdit from '../views/posts/edit'
|
3
|
+
|
4
|
+
|
5
|
+
// Mapping between your props template to Component, you must add to this
|
6
|
+
// to register any new page level component you create. If you are using the
|
7
|
+
// scaffold, it will auto append the identifers for you.
|
8
|
+
//
|
9
|
+
// e.g {'posts/new': PostNew}
|
10
|
+
export const pageIdentifierToPageComponent = {
|
11
|
+
};
|
12
|
+
|
@@ -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,7 +1,3 @@
|
|
1
|
-
require "webpacker/configuration"
|
2
|
-
|
3
|
-
babel_config = Rails.root.join("babel.config.js")
|
4
|
-
|
5
1
|
def add_member_methods
|
6
2
|
inject_into_file "app/models/application_record.rb", after: "class ApplicationRecord < ActiveRecord::Base\n" do
|
7
3
|
<<-RUBY
|
@@ -16,35 +12,27 @@ def add_member_methods
|
|
16
12
|
end
|
17
13
|
end
|
18
14
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
"views": "./app/views",
|
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/
|
15
|
+
def app_js_path
|
16
|
+
"app/javascript/"
|
17
|
+
end
|
18
|
+
|
19
|
+
say "Copying application.js file to #{app_js_path}"
|
20
|
+
copy_file "#{__dir__}/templates/web/application.js", "#{app_js_path}/application.js"
|
33
21
|
|
34
|
-
say "Copying
|
35
|
-
copy_file "#{__dir__}/templates/web/
|
22
|
+
say "Copying page_to_page_mapping.js file to #{app_js_path}"
|
23
|
+
copy_file "#{__dir__}/templates/web/page_to_page_mapping.js", "#{app_js_path}/page_to_page_mapping.js"
|
36
24
|
|
37
|
-
say "Copying reducer.js file to #{
|
38
|
-
copy_file "#{__dir__}/templates/web/reducer.js", "#{
|
25
|
+
say "Copying reducer.js file to #{app_js_path}"
|
26
|
+
copy_file "#{__dir__}/templates/web/reducer.js", "#{app_js_path}/reducer.js"
|
39
27
|
|
40
|
-
say "Copying action_creators.js file to #{
|
41
|
-
copy_file "#{__dir__}/templates/web/action_creators.js", "#{
|
28
|
+
say "Copying action_creators.js file to #{app_js_path}"
|
29
|
+
copy_file "#{__dir__}/templates/web/action_creators.js", "#{app_js_path}/action_creators.js"
|
42
30
|
|
43
|
-
say "Copying actions.js file to #{
|
44
|
-
copy_file "#{__dir__}/templates/web/actions.js", "#{
|
31
|
+
say "Copying actions.js file to #{app_js_path}"
|
32
|
+
copy_file "#{__dir__}/templates/web/actions.js", "#{app_js_path}/actions.js"
|
45
33
|
|
46
|
-
say "Copying application_visit.js file to #{
|
47
|
-
copy_file "#{__dir__}/templates/web/application_visit.js", "#{
|
34
|
+
say "Copying application_visit.js file to #{app_js_path}"
|
35
|
+
copy_file "#{__dir__}/templates/web/application_visit.js", "#{app_js_path}/application_visit.js"
|
48
36
|
|
49
37
|
say "Copying Superglue initializer"
|
50
38
|
copy_file "#{__dir__}/templates/web/initializer.rb", "config/initializers/superglue.rb"
|
@@ -55,12 +43,10 @@ copy_file "#{__dir__}/templates/web/application.json.props", "app/views/layouts/
|
|
55
43
|
say "Adding required member methods to ApplicationRecord"
|
56
44
|
add_member_methods
|
57
45
|
|
58
|
-
say "Installing
|
59
|
-
run "
|
46
|
+
say "Installing FormProps"
|
47
|
+
run "bundle add form_props"
|
60
48
|
|
61
|
-
|
62
|
-
|
63
|
-
# For older webpacker
|
64
|
-
insert_into_file Webpacker.config.config_path, "'app/views', 'app/components'", after: /resolved_paths: \[/
|
49
|
+
say "Installing React, Redux, and Superglue"
|
50
|
+
run "yarn add history react-redux redux-thunk redux reduce-reducers immer @thoughtbot/superglue --save"
|
65
51
|
|
66
|
-
say "
|
52
|
+
say "Superglue is Installed! 🎉", :green
|