potassium 6.7.0 → 7.0.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 +4 -4
- data/CHANGELOG.md +23 -0
- data/README.md +8 -1
- data/lib/potassium/assets/.circleci/config.yml.erb +14 -8
- data/lib/potassium/assets/.eslintrc.json +13 -7
- data/lib/potassium/assets/.rubocop.yml +62 -1
- data/lib/potassium/assets/README.yml +3 -9
- data/lib/potassium/assets/app/frontend/active_admin/jquery.js +2 -0
- data/lib/potassium/assets/app/frontend/api/__mocks__/index.mock.ts +3 -0
- data/lib/potassium/assets/app/frontend/api/index.ts +63 -0
- data/lib/potassium/assets/app/frontend/css/application.css +3 -0
- data/lib/potassium/assets/app/frontend/entrypoints/active_admin.js +7 -0
- data/lib/potassium/assets/app/frontend/entrypoints/active_admin.scss +38 -0
- data/lib/potassium/assets/app/frontend/entrypoints/application.js +12 -0
- data/lib/potassium/assets/app/{javascript → frontend}/types/vue.d.ts +1 -0
- data/lib/potassium/assets/app/{javascript → frontend}/utils/case-converter.ts +2 -2
- data/lib/potassium/assets/app/frontend/utils/csrf-token.ts +9 -0
- data/lib/potassium/assets/bin/setup.erb +1 -1
- data/lib/potassium/assets/bin/update.erb +1 -1
- data/lib/potassium/assets/config/sentry.rb.erb +2 -10
- data/lib/potassium/assets/lib/dotenv_monkeypatch.rb +19 -0
- data/lib/potassium/assets/package.json +7 -0
- data/lib/potassium/assets/tailwind.config.js +14 -0
- data/lib/potassium/assets/testing/simplecov_config.rb +9 -1
- data/lib/potassium/assets/tsconfig.config.json +8 -0
- data/lib/potassium/assets/tsconfig.json +11 -27
- data/lib/potassium/assets/vite.config.ts +46 -0
- data/lib/potassium/cli_options.rb +6 -4
- data/lib/potassium/platanus_config.rb +1 -1
- data/lib/potassium/recipes/admin.rb +42 -72
- data/lib/potassium/recipes/background_processor.rb +1 -1
- data/lib/potassium/recipes/bullet.rb +41 -0
- data/lib/potassium/recipes/ci.rb +1 -0
- data/lib/potassium/recipes/cleanup.rb +0 -1
- data/lib/potassium/recipes/coverage.rb +4 -27
- data/lib/potassium/recipes/database_container.rb +1 -1
- data/lib/potassium/recipes/error_reporting.rb +2 -2
- data/lib/potassium/recipes/front_end_vite.rb +153 -0
- data/lib/potassium/recipes/google_tag_manager.rb +19 -23
- data/lib/potassium/recipes/mjml.rb +1 -1
- data/lib/potassium/recipes/node.rb +1 -1
- data/lib/potassium/recipes/style.rb +3 -5
- data/lib/potassium/recipes/vue_admin.rb +7 -13
- data/lib/potassium/recipes/yarn.rb +1 -1
- data/lib/potassium/templates/application.rb +4 -8
- data/lib/potassium/version.rb +6 -6
- data/spec/features/api_spec.rb +2 -2
- data/spec/features/background_processor_spec.rb +2 -2
- data/spec/features/bullet_spec.rb +29 -0
- data/spec/features/ci_spec.rb +10 -4
- data/spec/features/coverage_spec.rb +7 -6
- data/spec/features/database_container_spec.rb +1 -1
- data/spec/features/database_spec.rb +1 -1
- data/spec/features/draper_spec.rb +1 -1
- data/spec/features/error_reporting_spec.rb +2 -2
- data/spec/features/file_storage_spec.rb +4 -4
- data/spec/features/google_tag_manager_spec.rb +1 -1
- data/spec/features/i18n_spec.rb +1 -1
- data/spec/features/mailer_spec.rb +1 -0
- data/spec/features/new_project_spec.rb +1 -1
- data/spec/features/power_types_spec.rb +1 -1
- data/spec/features/pundit_spec.rb +1 -1
- data/spec/features/schedule_spec.rb +1 -1
- data/spec/features/testing_spec.rb +0 -1
- data/spec/features/vue_admin_spec.rb +1 -1
- data/spec/front_end_vite_spec.rb +81 -0
- metadata +26 -18
- data/lib/potassium/assets/app/javascript/api/index.ts +0 -55
- data/lib/potassium/assets/config/webpack/rules/css.js +0 -5
- data/lib/potassium/assets/config/webpack/rules/index.js +0 -11
- data/lib/potassium/assets/config/webpack/rules/jquery.js +0 -11
- data/lib/potassium/assets/config/webpack/rules/typescript.js +0 -32
- data/lib/potassium/assets/config/webpack/rules/vue.js +0 -19
- data/lib/potassium/assets/config/webpack/webpack.config.js +0 -4
- data/lib/potassium/recipes/front_end.rb +0 -270
- data/spec/features/front_end_spec.rb +0 -76
- /data/lib/potassium/assets/app/{javascript → frontend}/components/app.spec.ts +0 -0
- /data/lib/potassium/assets/app/{javascript → frontend}/components/app.vue +0 -0
|
@@ -10,7 +10,7 @@ module Potassium
|
|
|
10
10
|
'db': 'postgresql', 'locale': 'es-CL', 'email_service': 'sendgrid', 'devise': true,
|
|
11
11
|
'devise-user-model': true, 'admin': true, 'vue_admin': true, 'pundit': true,
|
|
12
12
|
'api': true, 'storage': 'shrine', 'heroku': true, 'background_processor': true,
|
|
13
|
-
'draper': true, 'schedule': true, 'sentry': true, '
|
|
13
|
+
'draper': true, 'schedule': true, 'sentry': true, 'front_end_vite': true,
|
|
14
14
|
'google_tag_manager': true, 'test': true, 'spring': true
|
|
15
15
|
}
|
|
16
16
|
default_options = default_options.filter { |key, _| @option_key_names.include?(key) }
|
|
@@ -29,15 +29,14 @@ class Recipes::Admin < Rails::AppBuilder
|
|
|
29
29
|
gem_exists?(/activeadmin/)
|
|
30
30
|
end
|
|
31
31
|
|
|
32
|
-
private
|
|
33
|
-
|
|
34
32
|
def add_active_admin
|
|
33
|
+
recipe = self
|
|
35
34
|
gather_gem 'activeadmin', '~> 2.9'
|
|
36
|
-
gather_gem 'activeadmin_addons'
|
|
35
|
+
gather_gem 'activeadmin_addons', '~> 2.0.0.beta.0'
|
|
37
36
|
add_readme_section :internal_dependencies, :active_admin
|
|
38
37
|
after(:gem_install, wrap_in_action: :admin_install) do
|
|
39
38
|
generate "active_admin:install --use_webpacker"
|
|
40
|
-
run '
|
|
39
|
+
run 'yarn add @activeadmin/activeadmin'
|
|
41
40
|
line = "ActiveAdmin.setup do |config|"
|
|
42
41
|
initializer = "config/initializers/active_admin.rb"
|
|
43
42
|
gsub_file initializer, /(#{Regexp.escape(line)})/mi do |_match|
|
|
@@ -58,77 +57,48 @@ class Recipes::Admin < Rails::AppBuilder
|
|
|
58
57
|
|
|
59
58
|
generate "activeadmin_addons:install"
|
|
60
59
|
|
|
61
|
-
run "
|
|
62
|
-
|
|
63
|
-
aa_style = "app/javascript/stylesheets/active_admin.scss"
|
|
64
|
-
|
|
65
|
-
gsub_file(
|
|
66
|
-
aa_style,
|
|
67
|
-
"@import \"~@activeadmin/activeadmin/src/scss/mixins\";\n" +
|
|
68
|
-
"@import \"~@activeadmin/activeadmin/src/scss/base\";",
|
|
69
|
-
<<~HERE
|
|
70
|
-
@import '~arctic_admin/src/scss/main';
|
|
71
|
-
|
|
72
|
-
// Fix for sidebar when there are too many filters
|
|
73
|
-
#sidebar {
|
|
74
|
-
height: 100vh;
|
|
75
|
-
top: 0;
|
|
76
|
-
z-index: 10;
|
|
77
|
-
}
|
|
78
|
-
|
|
79
|
-
#sidebar::before {
|
|
80
|
-
top: 200px !important;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
#filters_sidebar_section {
|
|
84
|
-
height: 100vh;
|
|
85
|
-
overflow: auto;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
// Fix for invisible datepicker calendar
|
|
89
|
-
#ui-datepicker-div {
|
|
90
|
-
z-index: 11 !important;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Fix for backwards date range input
|
|
94
|
-
#sidebar .sidebar_section .filter_date_range input:nth-child(2) {
|
|
95
|
-
float: none;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
#sidebar .sidebar_section .filter_date_range {
|
|
99
|
-
display: flex;
|
|
100
|
-
flex-flow: row wrap;
|
|
101
|
-
justify-content: space-between
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
#sidebar .sidebar_section .filter_date_range label {
|
|
105
|
-
width: 100%;
|
|
106
|
-
}
|
|
107
|
-
HERE
|
|
108
|
-
)
|
|
109
|
-
|
|
110
|
-
aa_js = "app/javascript/packs/active_admin.js"
|
|
111
|
-
js_line = "import \"@activeadmin/activeadmin\";\n"
|
|
112
|
-
|
|
113
|
-
gsub_file(
|
|
114
|
-
aa_js,
|
|
115
|
-
js_line,
|
|
116
|
-
<<~HERE
|
|
117
|
-
#{js_line}
|
|
118
|
-
import '@fortawesome/fontawesome-free/css/all.css';
|
|
119
|
-
import 'arctic_admin';
|
|
120
|
-
HERE
|
|
121
|
-
)
|
|
122
|
-
|
|
123
|
-
run "mv app/javascript/packs/active_admin.js app/javascript/active_admin.js"
|
|
124
|
-
gsub_file(
|
|
125
|
-
"app/javascript/active_admin.js",
|
|
126
|
-
'import "../stylesheets/active_admin";',
|
|
127
|
-
'import "./stylesheets/active_admin.scss";'
|
|
128
|
-
)
|
|
60
|
+
run "yarn add arctic_admin @fortawesome/fontawesome-free"
|
|
129
61
|
|
|
130
62
|
run 'rm -rf config/webpack/plugins'
|
|
63
|
+
run 'rm app/javascript/packs/active_admin.js'
|
|
131
64
|
run 'rm -rf app/javascript/packs/active_admin'
|
|
65
|
+
run 'rm app/javascript/stylesheets/active_admin.scss'
|
|
66
|
+
run 'rmdir app/javascript/packs'
|
|
67
|
+
run 'rmdir app/javascript/stylesheets'
|
|
68
|
+
run 'rmdir app/javascript'
|
|
69
|
+
|
|
70
|
+
recipe.copy_frontend_files
|
|
71
|
+
recipe.insert_vite_monkeypatch
|
|
132
72
|
end
|
|
133
73
|
end
|
|
74
|
+
|
|
75
|
+
def copy_frontend_files
|
|
76
|
+
copy_file '../assets/app/frontend/entrypoints/active_admin.js',
|
|
77
|
+
'app/frontend/entrypoints/active_admin.js'
|
|
78
|
+
copy_file '../assets/app/frontend/entrypoints/active_admin.scss',
|
|
79
|
+
'app/frontend/entrypoints/active_admin.scss'
|
|
80
|
+
copy_file '../assets/app/frontend/active_admin/jquery.js', 'app/frontend/active_admin/jquery.js'
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def insert_vite_monkeypatch
|
|
84
|
+
monkeypatch =
|
|
85
|
+
<<~HERE
|
|
86
|
+
module ActiveAdminViteJS
|
|
87
|
+
def stylesheet_pack_tag(style, **options)
|
|
88
|
+
style = 'active_admin.scss' if style == 'active_admin.css'
|
|
89
|
+
vite_stylesheet_tag(style, **options)
|
|
90
|
+
end
|
|
91
|
+
|
|
92
|
+
def javascript_pack_tag(script, **options)
|
|
93
|
+
vite_javascript_tag(script, **options)
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
ActiveAdmin::Views::Pages::Base.include ActiveAdminViteJS
|
|
98
|
+
ActiveSupport.on_load(:action_view) { include ActiveAdminViteJS }
|
|
99
|
+
|
|
100
|
+
HERE
|
|
101
|
+
insert_into_file "config/initializers/active_admin.rb", monkeypatch,
|
|
102
|
+
before: "ActiveAdmin.setup do |config|"
|
|
103
|
+
end
|
|
134
104
|
end
|
|
@@ -89,7 +89,7 @@ class Recipes::BackgroundProcessor < Rails::AppBuilder
|
|
|
89
89
|
'.env.development',
|
|
90
90
|
<<~TEXT
|
|
91
91
|
REDIS_HOST=127.0.0.1
|
|
92
|
-
REDIS_PORT
|
|
92
|
+
REDIS_PORT=COMMAND_EXPAND(make services-port SERVICE=redis PORT=6379)
|
|
93
93
|
REDIS_URL=redis://${REDIS_HOST}:${REDIS_PORT}/1
|
|
94
94
|
TEXT
|
|
95
95
|
)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
class Recipes::Bullet < Rails::AppBuilder
|
|
2
|
+
def create
|
|
3
|
+
gather_gem 'bullet'
|
|
4
|
+
recipe = self
|
|
5
|
+
after(:gem_install) do
|
|
6
|
+
recipe.bullet_config
|
|
7
|
+
end
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def installed?
|
|
11
|
+
gem_exists?(/bullet/)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def install
|
|
15
|
+
create
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def bullet_config
|
|
19
|
+
application bullet_after_initialize, env: "development"
|
|
20
|
+
insert_into_file "app/jobs/application_job.rb", bullet_application_job_config, before: "end"
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
def bullet_after_initialize
|
|
26
|
+
<<~RUBY
|
|
27
|
+
config.after_initialize do
|
|
28
|
+
Bullet.enable = true
|
|
29
|
+
Bullet.alert = true
|
|
30
|
+
Bullet.bullet_logger = true
|
|
31
|
+
Bullet.console = true
|
|
32
|
+
Bullet.rails_logger = true
|
|
33
|
+
Bullet.add_footer = true
|
|
34
|
+
end
|
|
35
|
+
RUBY
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def bullet_application_job_config
|
|
39
|
+
" include Bullet::ActiveJob if Rails.env.development?\n"
|
|
40
|
+
end
|
|
41
|
+
end
|
data/lib/potassium/recipes/ci.rb
CHANGED
|
@@ -4,6 +4,5 @@ class Recipes::Cleanup < Rails::AppBuilder
|
|
|
4
4
|
erase_comments "config/environments/production.rb"
|
|
5
5
|
erase_comments "config/environments/test.rb"
|
|
6
6
|
erase_comments "config/environments/development.rb"
|
|
7
|
-
cut_comments "config/initializers/backtrace_silencers.rb", limit: 100
|
|
8
7
|
end
|
|
9
8
|
end
|
|
@@ -4,9 +4,8 @@ class Recipes::Coverage < Rails::AppBuilder
|
|
|
4
4
|
configure_rails_helper
|
|
5
5
|
append_to_file('.gitignore', "/coverage/*\n")
|
|
6
6
|
recipe = self
|
|
7
|
-
after(:
|
|
8
|
-
recipe.
|
|
9
|
-
recipe.setup_jest_text_formatter
|
|
7
|
+
after(:vite_install) do
|
|
8
|
+
recipe.setup_coverage_dependencies
|
|
10
9
|
end
|
|
11
10
|
end
|
|
12
11
|
|
|
@@ -18,16 +17,8 @@ class Recipes::Coverage < Rails::AppBuilder
|
|
|
18
17
|
create
|
|
19
18
|
end
|
|
20
19
|
|
|
21
|
-
def
|
|
22
|
-
|
|
23
|
-
js_package = JSON.parse(json_file)
|
|
24
|
-
js_package = add_coverage_config(js_package)
|
|
25
|
-
json_string = JSON.pretty_generate(js_package)
|
|
26
|
-
create_file 'package.json', json_string, force: true
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def setup_jest_text_formatter
|
|
30
|
-
run "bin/yarn add jest-text-formatter@1.0.2 --dev"
|
|
20
|
+
def setup_coverage_dependencies
|
|
21
|
+
run "yarn add jest-text-formatter@1.0.2 c8 --dev"
|
|
31
22
|
end
|
|
32
23
|
|
|
33
24
|
private
|
|
@@ -49,18 +40,4 @@ class Recipes::Coverage < Rails::AppBuilder
|
|
|
49
40
|
end
|
|
50
41
|
end
|
|
51
42
|
end
|
|
52
|
-
|
|
53
|
-
def add_coverage_config(js_package)
|
|
54
|
-
js_package['scripts']['test:changes'] = 'jest --changedSince=master'
|
|
55
|
-
js_package['jest'] = js_package['jest'].merge(coverage_defaults)
|
|
56
|
-
js_package
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def coverage_defaults
|
|
60
|
-
{
|
|
61
|
-
collectCoverage: true,
|
|
62
|
-
collectCoverageFrom: ['**/*.{js,ts,vue}', '!**/node_modules/**'],
|
|
63
|
-
coverageReporters: ['text']
|
|
64
|
-
}
|
|
65
|
-
end
|
|
66
43
|
end
|
|
@@ -81,7 +81,7 @@ class Recipes::DatabaseContainer < Rails::AppBuilder
|
|
|
81
81
|
|
|
82
82
|
# Database
|
|
83
83
|
DB_HOST=127.0.0.1
|
|
84
|
-
DB_PORT
|
|
84
|
+
DB_PORT=COMMAND_EXPAND(make services-port SERVICE=#{_service_name} PORT=#{_port})
|
|
85
85
|
DB_USER=#{_user}
|
|
86
86
|
|
|
87
87
|
TEXT
|
|
@@ -8,7 +8,7 @@ class Recipes::ErrorReporting < Rails::AppBuilder
|
|
|
8
8
|
|
|
9
9
|
def create
|
|
10
10
|
if selected?(:report_error)
|
|
11
|
-
gather_gem 'sentry-
|
|
11
|
+
gather_gem 'sentry-rails'
|
|
12
12
|
template '../assets/config/sentry.rb.erb', 'config/initializers/sentry.rb'
|
|
13
13
|
append_to_file '.env.development', "SENTRY_DSN=\n"
|
|
14
14
|
add_readme_section :internal_dependencies, :sentry
|
|
@@ -21,6 +21,6 @@ class Recipes::ErrorReporting < Rails::AppBuilder
|
|
|
21
21
|
end
|
|
22
22
|
|
|
23
23
|
def installed?
|
|
24
|
-
gem_exists?(/sentry-
|
|
24
|
+
gem_exists?(/sentry-rails/) && file_exist?('config/initializers/sentry.rb')
|
|
25
25
|
end
|
|
26
26
|
end
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
class Recipes::FrontEndVite < Rails::AppBuilder
|
|
2
|
+
VUE_VERSION = Potassium::VUE_VERSION
|
|
3
|
+
POSTCSS_VERSION = Potassium::POSTCSS_VERSION
|
|
4
|
+
TAILWINDCSS_VERSION = Potassium::TAILWINDCSS_VERSION
|
|
5
|
+
AUTOPREFIXER_VERSION = Potassium::AUTOPREFIXER_VERSION
|
|
6
|
+
VUE_TEST_UTILS_VERSION = Potassium::VUE_TEST_UTILS_VERSION
|
|
7
|
+
|
|
8
|
+
DEPENDENCIES = {
|
|
9
|
+
tailwind: [
|
|
10
|
+
"postcss@#{POSTCSS_VERSION}",
|
|
11
|
+
"tailwindcss@#{TAILWINDCSS_VERSION}",
|
|
12
|
+
"autoprefixer@#{AUTOPREFIXER_VERSION}",
|
|
13
|
+
"sass"
|
|
14
|
+
],
|
|
15
|
+
typescript: [
|
|
16
|
+
"typescript"
|
|
17
|
+
],
|
|
18
|
+
typescript_dev: [
|
|
19
|
+
"@types/node"
|
|
20
|
+
],
|
|
21
|
+
vue: [
|
|
22
|
+
"vue@#{VUE_VERSION}"
|
|
23
|
+
],
|
|
24
|
+
vue_dev: [
|
|
25
|
+
"@vitejs/plugin-vue",
|
|
26
|
+
"@vue/tsconfig",
|
|
27
|
+
"vue-tsc"
|
|
28
|
+
],
|
|
29
|
+
vitest_dev: [
|
|
30
|
+
"vitest",
|
|
31
|
+
"@vue/test-utils@#{VUE_TEST_UTILS_VERSION}",
|
|
32
|
+
"jsdom"
|
|
33
|
+
],
|
|
34
|
+
api: [
|
|
35
|
+
"axios",
|
|
36
|
+
"humps"
|
|
37
|
+
],
|
|
38
|
+
api_dev: [
|
|
39
|
+
"@types/humps"
|
|
40
|
+
]
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
def installed?
|
|
44
|
+
gem_exists?(/vite_rails/)
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def create
|
|
48
|
+
add_vite
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def install
|
|
52
|
+
add_vite
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def add_vite
|
|
56
|
+
gather_gem("vite_rails")
|
|
57
|
+
recipe = self
|
|
58
|
+
after(:gem_install, wrap_in_action: :vite_install) do
|
|
59
|
+
run "yarn install"
|
|
60
|
+
run "bundle exec vite install"
|
|
61
|
+
recipe.install_packages
|
|
62
|
+
recipe.setup_tailwind
|
|
63
|
+
recipe.copy_config_files
|
|
64
|
+
recipe.setup_vite
|
|
65
|
+
recipe.copy_default_assets
|
|
66
|
+
recipe.insert_vue_into_layout
|
|
67
|
+
recipe.setup_api_client
|
|
68
|
+
add_readme_header :vite
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def install_packages
|
|
73
|
+
packages, dev_packages = DEPENDENCIES.partition { |k, _| !k.to_s.end_with?('_dev') }.map(&:to_h)
|
|
74
|
+
|
|
75
|
+
run "yarn add #{packages.values.flatten.join(' ')}"
|
|
76
|
+
run "yarn add --dev #{dev_packages.values.flatten.join(' ')}"
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def setup_tailwind
|
|
80
|
+
run "npx tailwindcss init -p"
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def copy_config_files
|
|
84
|
+
copy_file '../assets/vite.config.ts', 'vite.config.ts', force: true
|
|
85
|
+
copy_file '../assets/tailwind.config.js', 'tailwind.config.js', force: true
|
|
86
|
+
copy_file '../assets/tsconfig.json', 'tsconfig.json', force: true
|
|
87
|
+
copy_file '../assets/tsconfig.config.json', 'tsconfig.config.json', force: true
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
def setup_vite
|
|
91
|
+
add_vite_dev_ws_content_security_policy
|
|
92
|
+
copy_dotenv_monkeypatch
|
|
93
|
+
end
|
|
94
|
+
|
|
95
|
+
def copy_default_assets
|
|
96
|
+
copy_file '../assets/app/frontend/entrypoints/application.js',
|
|
97
|
+
'app/frontend/entrypoints/application.js', force: true
|
|
98
|
+
copy_file '../assets/app/frontend/css/application.css', 'app/frontend/css/application.css',
|
|
99
|
+
force: true
|
|
100
|
+
copy_file '../assets/app/frontend/components/app.vue', 'app/frontend/components/app.vue',
|
|
101
|
+
force: true
|
|
102
|
+
copy_file '../assets/app/frontend/types/vue.d.ts', 'app/frontend/types/vue.d.ts'
|
|
103
|
+
copy_file '../assets/app/frontend/components/app.spec.ts',
|
|
104
|
+
'app/frontend/components/app.spec.ts'
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def insert_vue_into_layout
|
|
108
|
+
layout_file = "app/views/layouts/application.html.erb"
|
|
109
|
+
insert_into_file(
|
|
110
|
+
layout_file,
|
|
111
|
+
"<div id=\"vue-app\">\n <app></app>\n ",
|
|
112
|
+
before: "<%= yield %>"
|
|
113
|
+
)
|
|
114
|
+
insert_into_file layout_file, "\n </div>", after: "<%= yield %>"
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
def setup_api_client
|
|
118
|
+
copy_file '../assets/app/frontend/api/index.ts', 'app/frontend/api/index.ts'
|
|
119
|
+
copy_file '../assets/app/frontend/api/__mocks__/index.mock.ts',
|
|
120
|
+
'app/frontend/api/__mocks__/index.mock.ts'
|
|
121
|
+
copy_file '../assets/app/frontend/utils/case-converter.ts',
|
|
122
|
+
'app/frontend/utils/case-converter.ts'
|
|
123
|
+
copy_file '../assets/app/frontend/utils/csrf-token.ts',
|
|
124
|
+
'app/frontend/utils/csrf-token.ts'
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
def add_vite_dev_ws_content_security_policy
|
|
128
|
+
initializer = "config/initializers/content_security_policy.rb"
|
|
129
|
+
line = "# policy.style_src *policy.style_src, :unsafe_inline if Rails.env.development?"
|
|
130
|
+
policy = <<~HERE.chomp
|
|
131
|
+
# if Rails.env.development?
|
|
132
|
+
# policy.connect_src *policy.connect_src,
|
|
133
|
+
# "ws://\#{ViteRuby.config.host_with_port}"
|
|
134
|
+
# end
|
|
135
|
+
HERE
|
|
136
|
+
# check if policy already exists
|
|
137
|
+
return if File.read(initializer).include?("policy.connect_src *policy.connect_src")
|
|
138
|
+
|
|
139
|
+
inject_into_file initializer, after: line do
|
|
140
|
+
policy
|
|
141
|
+
end
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
def copy_dotenv_monkeypatch
|
|
145
|
+
copy_file '../assets/lib/dotenv_monkeypatch.rb',
|
|
146
|
+
'lib/dotenv_monkeypatch.rb', force: true
|
|
147
|
+
insert_into_file(
|
|
148
|
+
"config/application.rb",
|
|
149
|
+
"\nrequire_relative '../lib/dotenv_monkeypatch'\n",
|
|
150
|
+
after: "Bundler.require(*Rails.groups)"
|
|
151
|
+
)
|
|
152
|
+
end
|
|
153
|
+
end
|
|
@@ -25,7 +25,8 @@ class Recipes::GoogleTagManager < Rails::AppBuilder
|
|
|
25
25
|
def add_content_security_policy
|
|
26
26
|
inject_into_file(
|
|
27
27
|
'config/initializers/content_security_policy.rb',
|
|
28
|
-
content_security_policy_code
|
|
28
|
+
content_security_policy_code,
|
|
29
|
+
before: '# Report violations without enforcing the policy.'
|
|
29
30
|
)
|
|
30
31
|
end
|
|
31
32
|
|
|
@@ -67,28 +68,23 @@ class Recipes::GoogleTagManager < Rails::AppBuilder
|
|
|
67
68
|
|
|
68
69
|
def content_security_policy_code
|
|
69
70
|
<<~HERE
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
'https://www.google-analytics.com',
|
|
88
|
-
'https://ssl.google-analytics.com'
|
|
89
|
-
)
|
|
90
|
-
policy.img_src :self, 'data:', :https, 'https://www.googletagmanager.com', 'https://www.google-analytics.com'
|
|
91
|
-
end
|
|
71
|
+
# policy.connect_src(
|
|
72
|
+
# *policy.connect_src,
|
|
73
|
+
# 'https://www.google-analytics.com'
|
|
74
|
+
# )
|
|
75
|
+
# google tag manager requires to enable unsafe inline:
|
|
76
|
+
# https://developers.google.com/tag-manager/web/csp
|
|
77
|
+
# policy.script_src(
|
|
78
|
+
# *policy.script_src,
|
|
79
|
+
# 'https://www.googletagmanager.com',
|
|
80
|
+
# 'https://www.google-analytics.com',
|
|
81
|
+
# 'https://ssl.google-analytics.com'
|
|
82
|
+
# )
|
|
83
|
+
# policy.img_src(
|
|
84
|
+
# *policy.img_src,
|
|
85
|
+
# 'https://www.googletagmanager.com',
|
|
86
|
+
# 'https://www.google-analytics.com'
|
|
87
|
+
# )
|
|
92
88
|
HERE
|
|
93
89
|
end
|
|
94
90
|
end
|
|
@@ -8,7 +8,7 @@ class Recipes::Node < Rails::AppBuilder
|
|
|
8
8
|
def create
|
|
9
9
|
info "Using node version LTS #{NODE_VERSION}"
|
|
10
10
|
create_file '.node-version', NODE_VERSION, force: true
|
|
11
|
-
after(:
|
|
11
|
+
after(:vite_install) do
|
|
12
12
|
json_file = File.read(Pathname.new("package.json"))
|
|
13
13
|
js_package = JSON.parse(json_file)
|
|
14
14
|
js_package["engines"] = { "node" => "#{NODE_VERSION}.x" }
|
|
@@ -20,13 +20,11 @@ class Recipes::Style < Rails::AppBuilder
|
|
|
20
20
|
gather_gem 'rubocop-platanus'
|
|
21
21
|
end
|
|
22
22
|
|
|
23
|
-
after(:
|
|
23
|
+
after(:vite_install) do
|
|
24
24
|
run "yarn add --dev stylelint eslint eslint-plugin-import "\
|
|
25
25
|
"@typescript-eslint/eslint-plugin @types/jest @typescript-eslint/parser "\
|
|
26
|
-
"eslint-plugin-jest eslint-plugin-platanus"
|
|
27
|
-
|
|
28
|
-
run 'yarn add --dev eslint-plugin-vue @vue/eslint-config-typescript'
|
|
29
|
-
end
|
|
26
|
+
"eslint-plugin-jest eslint-plugin-platanus eslint-plugin-vue "\
|
|
27
|
+
"@vue/eslint-config-typescript eslint-plugin-tailwindcss"
|
|
30
28
|
end
|
|
31
29
|
end
|
|
32
30
|
|
|
@@ -5,7 +5,6 @@ class Recipes::VueAdmin < Rails::AppBuilder
|
|
|
5
5
|
Ask.confirm "Do you want Vue support for ActiveAdmin?"
|
|
6
6
|
end
|
|
7
7
|
set(:vue_admin, vue_admin)
|
|
8
|
-
set(:front_end, :vue) if vue_admin
|
|
9
8
|
end
|
|
10
9
|
end
|
|
11
10
|
|
|
@@ -29,23 +28,18 @@ class Recipes::VueAdmin < Rails::AppBuilder
|
|
|
29
28
|
end
|
|
30
29
|
|
|
31
30
|
def installed?
|
|
32
|
-
|
|
31
|
+
file_exist?("lib/vue_component.rb")
|
|
33
32
|
end
|
|
34
33
|
|
|
35
34
|
def add_vue_admin
|
|
36
35
|
add_vue_component_library
|
|
37
36
|
add_component_integration
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
js_line,
|
|
42
|
-
<<~HERE
|
|
43
|
-
#{js_line}
|
|
44
|
-
#{active_admin_js}
|
|
45
|
-
HERE
|
|
37
|
+
insert_into_file(
|
|
38
|
+
'app/frontend/entrypoints/active_admin.js',
|
|
39
|
+
active_admin_js
|
|
46
40
|
)
|
|
47
41
|
copy_file '../assets/active_admin/admin-component.vue',
|
|
48
|
-
'app/
|
|
42
|
+
'app/frontend/components/admin-component.vue',
|
|
49
43
|
force: true
|
|
50
44
|
end
|
|
51
45
|
|
|
@@ -128,7 +122,7 @@ class Recipes::VueAdmin < Rails::AppBuilder
|
|
|
128
122
|
def active_admin_js
|
|
129
123
|
<<~HERE
|
|
130
124
|
import { createApp } from 'vue';
|
|
131
|
-
import AdminComponent from '
|
|
125
|
+
import AdminComponent from '../components/admin-component.vue';
|
|
132
126
|
|
|
133
127
|
function onLoad() {
|
|
134
128
|
if (document.getElementById('wrapper') !== null) {
|
|
@@ -141,7 +135,7 @@ class Recipes::VueAdmin < Rails::AppBuilder
|
|
|
141
135
|
}));
|
|
142
136
|
},
|
|
143
137
|
});
|
|
144
|
-
app.component('
|
|
138
|
+
app.component('admin_component', AdminComponent);
|
|
145
139
|
app.mount('#wrapper');
|
|
146
140
|
}
|
|
147
141
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
class Recipes::Yarn < Rails::AppBuilder
|
|
2
2
|
def create
|
|
3
|
-
template '../assets/package.json', 'package.json'
|
|
3
|
+
template '../assets/package.json', 'package.json'
|
|
4
4
|
template '../assets/bin/update.erb', 'bin/update', force: true
|
|
5
5
|
application "config.assets.paths << Rails.root.join('node_modules')"
|
|
6
6
|
append_to_file ".gitignore", "node_modules/\n"
|
|
@@ -12,16 +12,11 @@ run_action(:cleaning) do
|
|
|
12
12
|
clean_gemfile
|
|
13
13
|
end
|
|
14
14
|
|
|
15
|
-
run_action(:add_utils) do
|
|
16
|
-
gather_gem("enumerize")
|
|
17
|
-
end
|
|
18
|
-
|
|
19
15
|
run_action(:asking) do
|
|
20
16
|
ask :database
|
|
21
17
|
ask :devise
|
|
22
18
|
ask :admin
|
|
23
19
|
ask :google_tag_manager
|
|
24
|
-
ask :front_end
|
|
25
20
|
ask :vue_admin
|
|
26
21
|
ask :mailer
|
|
27
22
|
ask :background_processor
|
|
@@ -77,11 +72,12 @@ run_action(:recipe_loading) do
|
|
|
77
72
|
create :script
|
|
78
73
|
create :github
|
|
79
74
|
create :cleanup
|
|
80
|
-
create :front_end
|
|
81
|
-
create :admin
|
|
82
|
-
create :vue_admin
|
|
83
75
|
create :google_tag_manager
|
|
84
76
|
create :mjml
|
|
77
|
+
create :bullet
|
|
78
|
+
create :front_end_vite
|
|
79
|
+
create :admin
|
|
80
|
+
create :vue_admin
|
|
85
81
|
end
|
|
86
82
|
|
|
87
83
|
info "Gathered enough information. Applying the template. Wait a minute."
|
data/lib/potassium/version.rb
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
module Potassium
|
|
2
|
-
VERSION = "
|
|
2
|
+
VERSION = "7.0.0"
|
|
3
3
|
RUBY_VERSION = "2.7.0"
|
|
4
|
-
RAILS_VERSION = "~>
|
|
4
|
+
RAILS_VERSION = "~> 7.0.4.2"
|
|
5
5
|
RUBOCOP_VERSION = "~> 1.9"
|
|
6
6
|
RUBOCOP_RSPEC_VERSION = "~> 2.2"
|
|
7
7
|
POSTGRES_VERSION = "11.3"
|
|
8
8
|
MYSQL_VERSION = "5.7"
|
|
9
9
|
NODE_VERSION = "14"
|
|
10
|
-
TAILWINDCSS_VERSION = "^3"
|
|
11
|
-
POSTCSS_VERSION = "^8"
|
|
12
|
-
AUTOPREFIXER_VERSION = "^10"
|
|
10
|
+
TAILWINDCSS_VERSION = "^3.2.7"
|
|
11
|
+
POSTCSS_VERSION = "^8.4.21"
|
|
12
|
+
AUTOPREFIXER_VERSION = "^10.4.13"
|
|
13
13
|
VUE_VERSION = "^3.2.33"
|
|
14
14
|
VUE_LOADER_VERSION = "^16.8.3"
|
|
15
15
|
VUE_TEST_UTILS_VERSION = "^2.0.2"
|
|
16
|
-
JEST_VERSION = "^
|
|
16
|
+
JEST_VERSION = "^29.0.0"
|
|
17
17
|
end
|
data/spec/features/api_spec.rb
CHANGED
|
@@ -9,8 +9,8 @@ RSpec.describe "Api" do
|
|
|
9
9
|
|
|
10
10
|
it "adds power_api related gems to Gemfile" do
|
|
11
11
|
gemfile_content = IO.read("#{project_path}/Gemfile")
|
|
12
|
-
expect(gemfile_content).to include("
|
|
13
|
-
expect(gemfile_content).to include("
|
|
12
|
+
expect(gemfile_content).to include("power_api")
|
|
13
|
+
expect(gemfile_content).to include("rswag-specs")
|
|
14
14
|
end
|
|
15
15
|
|
|
16
16
|
it "adds the power_api brief to README file" do
|