webamm_to_rails 7.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (193) hide show
  1. checksums.yaml +7 -0
  2. data/README.md +3 -0
  3. data/lib/webamm_to_rails/features/definitions.rb +19 -0
  4. data/lib/webamm_to_rails/features/devise_onlineable/definition.rb +44 -0
  5. data/lib/webamm_to_rails/features/devise_onlineable/definitions/connection/presenter.rb +29 -0
  6. data/lib/webamm_to_rails/features/devise_onlineable/definitions/connection/template.erb +17 -0
  7. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/channels/online_channel.rb.erb +13 -0
  8. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/javascript/channels/consumer.js.erb +6 -0
  9. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/javascript/channels/index.js.erb +5 -0
  10. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/javascript/channels/online_channel.js.erb +48 -0
  11. data/lib/webamm_to_rails/features/devise_onlineable/templates/app/models/concerns/devise_onlineable.rb.erb +39 -0
  12. data/lib/webamm_to_rails/rails_boilerplate/builder.rb +318 -0
  13. data/lib/webamm_to_rails/rails_boilerplate/templates/Dockerfile.erb +83 -0
  14. data/lib/webamm_to_rails/rails_boilerplate/templates/Procfile.dev.erb +3 -0
  15. data/lib/webamm_to_rails/rails_boilerplate/templates/README.md.erb +24 -0
  16. data/lib/webamm_to_rails/rails_boilerplate/templates/Rakefile.erb +6 -0
  17. data/lib/webamm_to_rails/rails_boilerplate/templates/app/assets/config/manifest.js.erb +2 -0
  18. data/lib/webamm_to_rails/rails_boilerplate/templates/app/assets/stylesheets/application.tailwind.css.erb +3 -0
  19. data/lib/webamm_to_rails/rails_boilerplate/templates/app/channels/application_cable/channel.rb.erb +4 -0
  20. data/lib/webamm_to_rails/rails_boilerplate/templates/app/channels/application_cable/connection.rb.erb +4 -0
  21. data/lib/webamm_to_rails/rails_boilerplate/templates/app/helpers/application_helper.rb.erb +2 -0
  22. data/lib/webamm_to_rails/rails_boilerplate/templates/app/javascript/application.js.erb +3 -0
  23. data/lib/webamm_to_rails/rails_boilerplate/templates/app/javascript/controllers/application.js.erb +9 -0
  24. data/lib/webamm_to_rails/rails_boilerplate/templates/app/javascript/controllers/hello_controller.js.erb +7 -0
  25. data/lib/webamm_to_rails/rails_boilerplate/templates/app/javascript/controllers/index.js.erb +8 -0
  26. data/lib/webamm_to_rails/rails_boilerplate/templates/app/jobs/application_job.rb.erb +7 -0
  27. data/lib/webamm_to_rails/rails_boilerplate/templates/app/mailers/application_mailer.rb.erb +4 -0
  28. data/lib/webamm_to_rails/rails_boilerplate/templates/app/models/application_record.rb.erb +3 -0
  29. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/layouts/application.html.erb +44 -0
  30. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/layouts/mailer.html.erb +13 -0
  31. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/layouts/mailer.text.erb +1 -0
  32. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/pwa/manifest.json.erb +22 -0
  33. data/lib/webamm_to_rails/rails_boilerplate/templates/app/views/pwa/service-worker.js.erb +26 -0
  34. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/brakeman.erb +7 -0
  35. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/bundle.erb +109 -0
  36. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/dev.erb +11 -0
  37. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/docker-entrypoint.erb +13 -0
  38. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/rails.erb +4 -0
  39. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/rake.erb +4 -0
  40. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/rubocop.erb +8 -0
  41. data/lib/webamm_to_rails/rails_boilerplate/templates/bin/setup.erb +40 -0
  42. data/lib/webamm_to_rails/rails_boilerplate/templates/config/application.rb.erb +42 -0
  43. data/lib/webamm_to_rails/rails_boilerplate/templates/config/boot.rb.erb +4 -0
  44. data/lib/webamm_to_rails/rails_boilerplate/templates/config/cable.yml.erb +11 -0
  45. data/lib/webamm_to_rails/rails_boilerplate/templates/config/credentials.yml.enc.erb +1 -0
  46. data/lib/webamm_to_rails/rails_boilerplate/templates/config/database.yml.erb +85 -0
  47. data/lib/webamm_to_rails/rails_boilerplate/templates/config/environment.rb.erb +5 -0
  48. data/lib/webamm_to_rails/rails_boilerplate/templates/config/environments/development.rb.erb +84 -0
  49. data/lib/webamm_to_rails/rails_boilerplate/templates/config/environments/production.rb.erb +102 -0
  50. data/lib/webamm_to_rails/rails_boilerplate/templates/config/environments/test.rb.erb +67 -0
  51. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/assets.rb.erb +12 -0
  52. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/content_security_policy.rb.erb +25 -0
  53. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/filter_parameter_logging.rb.erb +8 -0
  54. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/inflections.rb.erb +16 -0
  55. data/lib/webamm_to_rails/rails_boilerplate/templates/config/initializers/permissions_policy.rb.erb +13 -0
  56. data/lib/webamm_to_rails/rails_boilerplate/templates/config/locales/en.yml.erb +31 -0
  57. data/lib/webamm_to_rails/rails_boilerplate/templates/config/master.key.erb +1 -0
  58. data/lib/webamm_to_rails/rails_boilerplate/templates/config/puma.rb.erb +33 -0
  59. data/lib/webamm_to_rails/rails_boilerplate/templates/config/storage.yml.erb +34 -0
  60. data/lib/webamm_to_rails/rails_boilerplate/templates/config.ru.erb +6 -0
  61. data/lib/webamm_to_rails/rails_boilerplate/templates/db/seeds.rb.erb +9 -0
  62. data/lib/webamm_to_rails/rails_boilerplate/templates/dockerignore.erb +48 -0
  63. data/lib/webamm_to_rails/rails_boilerplate/templates/gitattributes.erb +9 -0
  64. data/lib/webamm_to_rails/rails_boilerplate/templates/github/dependabot.yml.erb +0 -0
  65. data/lib/webamm_to_rails/rails_boilerplate/templates/github/workflows/ci.yml.erb +38 -0
  66. data/lib/webamm_to_rails/rails_boilerplate/templates/gitignore.erb +40 -0
  67. data/lib/webamm_to_rails/rails_boilerplate/templates/node-version.erb +1 -0
  68. data/lib/webamm_to_rails/rails_boilerplate/templates/public/404.html.erb +67 -0
  69. data/lib/webamm_to_rails/rails_boilerplate/templates/public/406-unsupported-browser.html.erb +66 -0
  70. data/lib/webamm_to_rails/rails_boilerplate/templates/public/422.html.erb +67 -0
  71. data/lib/webamm_to_rails/rails_boilerplate/templates/public/500.html.erb +66 -0
  72. data/lib/webamm_to_rails/rails_boilerplate/templates/public/icon.png.erb +0 -0
  73. data/lib/webamm_to_rails/rails_boilerplate/templates/public/icon.svg.erb +3 -0
  74. data/lib/webamm_to_rails/rails_boilerplate/templates/public/robots.txt.erb +1 -0
  75. data/lib/webamm_to_rails/rails_boilerplate/templates/rubocop.yml.erb +8 -0
  76. data/lib/webamm_to_rails/rails_boilerplate/templates/ruby-version.erb +1 -0
  77. data/lib/webamm_to_rails/rails_boilerplate/templates/tailwind.config.js.erb +8 -0
  78. data/lib/webamm_to_rails/sources/controllers/actions/create_definition/presenter.rb +50 -0
  79. data/lib/webamm_to_rails/sources/controllers/actions/create_definition/template.erb +9 -0
  80. data/lib/webamm_to_rails/sources/controllers/actions/definition.rb +66 -0
  81. data/lib/webamm_to_rails/sources/controllers/actions/destroy_definition/presenter.rb +52 -0
  82. data/lib/webamm_to_rails/sources/controllers/actions/destroy_definition/template.erb +6 -0
  83. data/lib/webamm_to_rails/sources/controllers/actions/edit_definition/presenter.rb +40 -0
  84. data/lib/webamm_to_rails/sources/controllers/actions/edit_definition/template.erb +3 -0
  85. data/lib/webamm_to_rails/sources/controllers/actions/index_definition/presenter.rb +40 -0
  86. data/lib/webamm_to_rails/sources/controllers/actions/index_definition/template.erb +3 -0
  87. data/lib/webamm_to_rails/sources/controllers/actions/new_definition/presenter.rb +40 -0
  88. data/lib/webamm_to_rails/sources/controllers/actions/new_definition/template.erb +3 -0
  89. data/lib/webamm_to_rails/sources/controllers/actions/show_definition/presenter.rb +40 -0
  90. data/lib/webamm_to_rails/sources/controllers/actions/show_definition/template.erb +3 -0
  91. data/lib/webamm_to_rails/sources/controllers/actions/strong_parameters_definition/presenter.rb +50 -0
  92. data/lib/webamm_to_rails/sources/controllers/actions/strong_parameters_definition/template.erb +3 -0
  93. data/lib/webamm_to_rails/sources/controllers/actions/update_definition/presenter.rb +54 -0
  94. data/lib/webamm_to_rails/sources/controllers/actions/update_definition/template.erb +9 -0
  95. data/lib/webamm_to_rails/sources/controllers/application_controller/authentication/devise_groups/presenter.rb +49 -0
  96. data/lib/webamm_to_rails/sources/controllers/application_controller/authentication/devise_groups_definition/presenter.rb +30 -0
  97. data/lib/webamm_to_rails/sources/controllers/application_controller/definition.rb +36 -0
  98. data/lib/webamm_to_rails/sources/controllers/application_controller/template.erb +5 -0
  99. data/lib/webamm_to_rails/sources/controllers/class_definition/presenter.rb +17 -0
  100. data/lib/webamm_to_rails/sources/controllers/definition.rb +44 -0
  101. data/lib/webamm_to_rails/sources/controllers/filters/definition.rb +32 -0
  102. data/lib/webamm_to_rails/sources/controllers/filters/devise_definition/presenter.rb +55 -0
  103. data/lib/webamm_to_rails/sources/controllers/template.erb +17 -0
  104. data/lib/webamm_to_rails/sources/gemfile/default_set.rb +27 -0
  105. data/lib/webamm_to_rails/sources/gemfile/definition.rb +31 -0
  106. data/lib/webamm_to_rails/sources/gemfile/gem.rb +8 -0
  107. data/lib/webamm_to_rails/sources/gemfile/gem_definition/presenter.rb +22 -0
  108. data/lib/webamm_to_rails/sources/gemfile/project_set.rb +21 -0
  109. data/lib/webamm_to_rails/sources/gemfile/sets/authentication.rb +34 -0
  110. data/lib/webamm_to_rails/sources/gemfile/template.erb +17 -0
  111. data/lib/webamm_to_rails/sources/helpers/definitions.rb +21 -0
  112. data/lib/webamm_to_rails/sources/helpers/devise/presenter.rb +27 -0
  113. data/lib/webamm_to_rails/sources/helpers/devise/qr_code_helper/presenter.rb +19 -0
  114. data/lib/webamm_to_rails/sources/helpers/devise/qr_code_helper/template.erb +22 -0
  115. data/lib/webamm_to_rails/sources/initializers/definitions.rb +26 -0
  116. data/lib/webamm_to_rails/sources/initializers/devise_definition/presenter.rb +27 -0
  117. data/lib/webamm_to_rails/sources/initializers/devise_definition/template.erb +397 -0
  118. data/lib/webamm_to_rails/sources/migrations/active_storage_definition/presenter.rb +29 -0
  119. data/lib/webamm_to_rails/sources/migrations/active_storage_definition/template.erb +57 -0
  120. data/lib/webamm_to_rails/sources/migrations/associations.rb +49 -0
  121. data/lib/webamm_to_rails/sources/migrations/class_definition/presenter.rb +17 -0
  122. data/lib/webamm_to_rails/sources/migrations/column_definition/presenter.rb +38 -0
  123. data/lib/webamm_to_rails/sources/migrations/columns.rb +33 -0
  124. data/lib/webamm_to_rails/sources/migrations/definition.rb +52 -0
  125. data/lib/webamm_to_rails/sources/migrations/devise/definition.rb +278 -0
  126. data/lib/webamm_to_rails/sources/migrations/files_list.rb +98 -0
  127. data/lib/webamm_to_rails/sources/migrations/index_definition/presenter.rb +34 -0
  128. data/lib/webamm_to_rails/sources/migrations/indices.rb +33 -0
  129. data/lib/webamm_to_rails/sources/migrations/table_definition/presenter.rb +21 -0
  130. data/lib/webamm_to_rails/sources/migrations/template.erb +12 -0
  131. data/lib/webamm_to_rails/sources/migrations/uuid_definition/presenter.rb +29 -0
  132. data/lib/webamm_to_rails/sources/migrations/uuid_definition/template.erb +5 -0
  133. data/lib/webamm_to_rails/sources/models/association_definition/presenter.rb +49 -0
  134. data/lib/webamm_to_rails/sources/models/associations.rb +113 -0
  135. data/lib/webamm_to_rails/sources/models/attachment_definition/presenter.rb +21 -0
  136. data/lib/webamm_to_rails/sources/models/attachments.rb +25 -0
  137. data/lib/webamm_to_rails/sources/models/class_definition/presenter.rb +17 -0
  138. data/lib/webamm_to_rails/sources/models/concerns.rb +27 -0
  139. data/lib/webamm_to_rails/sources/models/definition.rb +57 -0
  140. data/lib/webamm_to_rails/sources/models/devise_definition/presenter.rb +49 -0
  141. data/lib/webamm_to_rails/sources/models/enum_definition/presenter.rb +19 -0
  142. data/lib/webamm_to_rails/sources/models/enums.rb +25 -0
  143. data/lib/webamm_to_rails/sources/models/template.erb +7 -0
  144. data/lib/webamm_to_rails/sources/package_json/definition.rb +27 -0
  145. data/lib/webamm_to_rails/sources/package_json/template.erb +21 -0
  146. data/lib/webamm_to_rails/sources/routes/authentication_definition/presenter.rb +21 -0
  147. data/lib/webamm_to_rails/sources/routes/definition.rb +38 -0
  148. data/lib/webamm_to_rails/sources/routes/resource_definition/presenter.rb +25 -0
  149. data/lib/webamm_to_rails/sources/routes/template.erb +14 -0
  150. data/lib/webamm_to_rails/sources/views/definition.rb +28 -0
  151. data/lib/webamm_to_rails/sources/views/devise/invitable/presenter.rb +31 -0
  152. data/lib/webamm_to_rails/sources/views/devise/invitable/templates/invitations/edit.html.erb +38 -0
  153. data/lib/webamm_to_rails/sources/views/devise/invitable/templates/invitations/new.html.erb +31 -0
  154. data/lib/webamm_to_rails/sources/views/devise/invitable/templates/mailer/invitation_instructions.html.erb +23 -0
  155. data/lib/webamm_to_rails/sources/views/devise/otp/presenter.rb +32 -0
  156. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_credentials/refresh.html.erb +19 -0
  157. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_credentials/show.html.erb +70 -0
  158. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/_token_secret.html.erb +21 -0
  159. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/_trusted_devices.html.erb +12 -0
  160. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/edit.html.erb +48 -0
  161. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/recovery.html.erb +21 -0
  162. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/recovery_codes.html.erb +3 -0
  163. data/lib/webamm_to_rails/sources/views/devise/otp/templates/otp_tokens/show.html.erb +21 -0
  164. data/lib/webamm_to_rails/sources/views/devise/presenter.rb +37 -0
  165. data/lib/webamm_to_rails/sources/views/devise/standard/presenter.rb +39 -0
  166. data/lib/webamm_to_rails/sources/views/devise/standard/templates/confirmations/new.html.erb +31 -0
  167. data/lib/webamm_to_rails/sources/views/devise/standard/templates/mailer/confirmation_instructions.html.erb +17 -0
  168. data/lib/webamm_to_rails/sources/views/devise/standard/templates/mailer/email_changed.html.erb +7 -0
  169. data/lib/webamm_to_rails/sources/views/devise/standard/templates/mailer/password_change.html.erb +3 -0
  170. data/lib/webamm_to_rails/sources/views/devise/standard/templates/mailer/reset_password_instructions.html.erb +22 -0
  171. data/lib/webamm_to_rails/sources/views/devise/standard/templates/passwords/edit.html.erb +36 -0
  172. data/lib/webamm_to_rails/sources/views/devise/standard/templates/passwords/new.html.erb +31 -0
  173. data/lib/webamm_to_rails/sources/views/devise/standard/templates/registrations/edit.html.erb +43 -0
  174. data/lib/webamm_to_rails/sources/views/devise/standard/templates/registrations/new.html.erb +39 -0
  175. data/lib/webamm_to_rails/sources/views/devise/standard/templates/sessions/new.html.erb +23 -0
  176. data/lib/webamm_to_rails/sources/views/devise/standard/templates/shared/_links.html.erb +27 -0
  177. data/lib/webamm_to_rails/sources/views/resource/edit_definition/presenter.rb +41 -0
  178. data/lib/webamm_to_rails/sources/views/resource/edit_definition/template.erb +1 -0
  179. data/lib/webamm_to_rails/sources/views/resource/form_definition/presenter.rb +50 -0
  180. data/lib/webamm_to_rails/sources/views/resource/form_definition/template.erb +82 -0
  181. data/lib/webamm_to_rails/sources/views/resource/index_definition/presenter.rb +69 -0
  182. data/lib/webamm_to_rails/sources/views/resource/index_definition/template.erb +78 -0
  183. data/lib/webamm_to_rails/sources/views/resource/new_definition/presenter.rb +41 -0
  184. data/lib/webamm_to_rails/sources/views/resource/new_definition/template.erb +1 -0
  185. data/lib/webamm_to_rails/sources/views/resource/presenter.rb +41 -0
  186. data/lib/webamm_to_rails/sources/views/resource/show_definition/presenter.rb +61 -0
  187. data/lib/webamm_to_rails/sources/views/resource/show_definition/template.erb +34 -0
  188. data/lib/webamm_to_rails/utils/format_code.rb +11 -0
  189. data/lib/webamm_to_rails/utils/format_template.rb +11 -0
  190. data/lib/webamm_to_rails/version.rb +5 -0
  191. data/lib/webamm_to_rails.rb +112 -0
  192. data/webamm_to_rails.gemspec +28 -0
  193. metadata +332 -0
@@ -0,0 +1,21 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Models
4
+ class AttachmentDefinition
5
+ class Presenter
6
+ def initialize(column:)
7
+ @column = column
8
+ end
9
+
10
+ def render
11
+ if @column.name == @column.name.pluralize
12
+ "has_many_attached :#{@column.name}"
13
+ else
14
+ "has_one_attached :#{@column.name}"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'attachment_definition/presenter'
2
+
3
+ module WebammToRails
4
+ module Sources
5
+ module Models
6
+ class Attachments
7
+ def initialize(table_definition:)
8
+ @table_definition = table_definition
9
+ end
10
+
11
+ def collection
12
+ attachment_columns.map do |column|
13
+ ::WebammToRails::Sources::Models::AttachmentDefinition::Presenter.new(column: column).render
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def attachment_columns
20
+ @table_definition.columns.select { |col| col.type == 'file' }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,17 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Models
4
+ class ClassDefinition
5
+ class Presenter
6
+ def initialize(table_name:)
7
+ @table_name = table_name
8
+ end
9
+
10
+ def render(base_class: 'ApplicationRecord')
11
+ "class #{@table_name.classify} < #{base_class}"
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
17
+ end
@@ -0,0 +1,27 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Models
4
+ class Concerns
5
+ def initialize(table_definition:, waml_definition:)
6
+ @table_definition = table_definition
7
+ @waml_definition = waml_definition
8
+ end
9
+
10
+ def collection
11
+ return [] if table_authentication.blank?
12
+ return [] if table_authentication.features.blank? || !table_authentication.features.include?('online_indication')
13
+
14
+ ['include DeviseOnlineable']
15
+ end
16
+
17
+ private
18
+
19
+ def table_authentication
20
+ return if @waml_definition.authentication.blank?
21
+
22
+ @waml_definition.authentication.find { |auth| auth.table == @table_definition.table }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,57 @@
1
+ require_relative 'class_definition/presenter'
2
+ require_relative 'devise_definition/presenter'
3
+ require_relative 'enums'
4
+ require_relative 'associations'
5
+ require_relative 'concerns'
6
+ require_relative 'attachments'
7
+
8
+ module WebammToRails
9
+ module Sources
10
+ module Models
11
+ class Definition
12
+ def initialize(table_definition:, waml_definition:)
13
+ @table_definition = table_definition
14
+ @waml_definition = waml_definition
15
+ end
16
+
17
+ def render
18
+ template_path = File.expand_path('template.erb', __dir__)
19
+ template_content = File.read(template_path)
20
+ raw_content = ERB.new(template_content, trim_mode: '-').result(instance_eval { binding })
21
+
22
+ ::WebammToRails::Utils::FormatCode.call(raw_content)
23
+ end
24
+
25
+ private
26
+
27
+ def class_definition
28
+ ::WebammToRails::Sources::Models::ClassDefinition::Presenter.new(table_name: table_name).render
29
+ end
30
+
31
+ def associations
32
+ ::WebammToRails::Sources::Models::Associations.new(table_definition: @table_definition, waml_definition: @waml_definition).collection
33
+ end
34
+
35
+ def enums
36
+ ::WebammToRails::Sources::Models::Enums.new(table_definition: @table_definition).collection
37
+ end
38
+
39
+ def concerns
40
+ ::WebammToRails::Sources::Models::Concerns.new(table_definition: @table_definition, waml_definition: @waml_definition).collection
41
+ end
42
+
43
+ def table_name
44
+ @table_definition.table
45
+ end
46
+
47
+ def devise_definition
48
+ ::WebammToRails::Sources::Models::DeviseDefinition::Presenter.new(table_name: table_name, waml_definition: @waml_definition).render
49
+ end
50
+
51
+ def attachments
52
+ ::WebammToRails::Sources::Models::Attachments.new(table_definition: @table_definition).collection
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,49 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Models
4
+ class DeviseDefinition
5
+ class Presenter
6
+ def initialize(table_name:, waml_definition:)
7
+ @table_name = table_name
8
+ @waml_definition = waml_definition
9
+ end
10
+
11
+ def render
12
+ return unless authenticated?
13
+
14
+ base_strategies = [
15
+ 'database_authenticatable', 'validatable', 'rememberable', 'recoverable', 'trackable'
16
+ ]
17
+
18
+ if auth_features.include?('allow_sign_up')
19
+ base_strategies << 'registerable'
20
+ base_strategies << 'confirmable'
21
+ end
22
+
23
+ if auth_features.include?('invitations')
24
+ base_strategies << 'invitable'
25
+ end
26
+
27
+ if auth_features.include?('two_factor_authentication')
28
+ base_strategies << 'otp_authenticatable'
29
+ end
30
+
31
+ "devise #{base_strategies.map { |strategy| ":#{strategy}" }.join(', ')}"
32
+ end
33
+
34
+ private
35
+
36
+ def authenticated?
37
+ return false if @waml_definition.authentication.blank?
38
+
39
+ @waml_definition.authentication.map(&:table).include?(@table_name)
40
+ end
41
+
42
+ def auth_features
43
+ @waml_definition.authentication.find { |auth| auth.table == @table_name }.features
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,19 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Models
4
+ class EnumDefinition
5
+ class Presenter
6
+ def initialize(column:)
7
+ @column = column
8
+ end
9
+
10
+ def render
11
+ base_def = "enum :#{@column.name}, { #{@column.values.map(&:underscore).map.with_index { |val, i| "#{val}: #{i}" }.join(', ')} }"
12
+ base_def += ", default: :#{@column.default}" if @column.default.present?
13
+ base_def
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,25 @@
1
+ require_relative 'enum_definition/presenter'
2
+
3
+ module WebammToRails
4
+ module Sources
5
+ module Models
6
+ class Enums
7
+ def initialize(table_definition:)
8
+ @table_definition = table_definition
9
+ end
10
+
11
+ def collection
12
+ enum_columns.map do |column|
13
+ ::WebammToRails::Sources::Models::EnumDefinition::Presenter.new(column: column).render
14
+ end
15
+ end
16
+
17
+ private
18
+
19
+ def enum_columns
20
+ @table_definition.columns.select { |col| col.type == 'enum_column' }
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,7 @@
1
+ <%= class_definition %>
2
+ <%= concerns.join("\n") if concerns.any? %>
3
+ <%= devise_definition %>
4
+ <%= associations.join("\n") if associations.any? %>
5
+ <%= enums.join("\n") if enums.any? %>
6
+ <%= attachments.join("\n ") if attachments.any? %>
7
+ end
@@ -0,0 +1,27 @@
1
+ require 'json'
2
+
3
+ module WebammToRails
4
+ module Sources
5
+ module PackageJson
6
+ class Definition
7
+ def initialize(waml_definition:)
8
+ @waml_definition = waml_definition
9
+ end
10
+
11
+ def render
12
+ template_path = File.expand_path('template.erb', __dir__)
13
+ template_content = File.read(template_path)
14
+ raw_content = ERB.new(template_content, trim_mode: '-').result(instance_eval { binding })
15
+
16
+ JSON.parse(raw_content).to_json
17
+ end
18
+
19
+ private
20
+
21
+ def use_actioncable?
22
+ @waml_definition.authentication.present? && @waml_definition.authentication.any? { |auth| auth.features.include?('online_indication') }
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,21 @@
1
+ {
2
+ "name": "app",
3
+ "private": true,
4
+ "devDependencies": {
5
+ "esbuild": "^0.23.0"
6
+ },
7
+ "scripts": {
8
+ "build": "esbuild app/javascript/*.* --bundle --sourcemap --format=esm --outdir=app/assets/builds --public-path=/assets",
9
+ "build:css": "tailwindcss -i ./app/assets/stylesheets/application.tailwind.css -o ./app/assets/builds/application.css --minify"
10
+ },
11
+ "dependencies": {
12
+ "@hotwired/stimulus": "^3.2.2",
13
+ "@hotwired/turbo-rails": "^8.0.5",
14
+ "autoprefixer": "^10.4.20",
15
+ "postcss": "^8.4.41",
16
+ "tailwindcss": "^3.4.9"
17
+ <% if use_actioncable? -%>
18
+ ,"@rails/actioncable": "7.1.3-4"
19
+ <% end -%>
20
+ }
21
+ }
@@ -0,0 +1,21 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Routes
4
+ module AuthenticationDefinition
5
+ class Presenter
6
+ def initialize(waml_definition:)
7
+ @waml_definition = waml_definition
8
+ end
9
+
10
+ def render
11
+ return if @waml_definition.authentication.blank?
12
+
13
+ @waml_definition.authentication.map do |authentication|
14
+ "devise_for :#{authentication.table}"
15
+ end.join("\n")
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,38 @@
1
+ require_relative 'authentication_definition/presenter'
2
+ require_relative 'resource_definition/presenter'
3
+
4
+ module WebammToRails
5
+ module Sources
6
+ module Routes
7
+ class Definition
8
+ def initialize(waml_definition:)
9
+ @waml_definition = waml_definition
10
+ end
11
+
12
+ def render
13
+ template_path = File.expand_path('template.erb', __dir__)
14
+ template_content = File.read(template_path)
15
+ raw_content = ERB.new(template_content, trim_mode: '-').result(instance_eval { binding })
16
+
17
+ ::WebammToRails::Utils::FormatCode.call(raw_content)
18
+ end
19
+
20
+ private
21
+
22
+ def authentication_definition
23
+ ::WebammToRails::Sources::Routes::AuthenticationDefinition::Presenter.new(
24
+ waml_definition: @waml_definition
25
+ ).render
26
+ end
27
+
28
+ def resources
29
+ @waml_definition.database.crud.map do |resource|
30
+ ::WebammToRails::Sources::Routes::ResourceDefinition::Presenter.new(
31
+ crud_definition: resource
32
+ ).render
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,25 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Routes
4
+ module ResourceDefinition
5
+ class Presenter
6
+ def initialize(crud_definition:)
7
+ @crud_definition = crud_definition
8
+ end
9
+
10
+ def render
11
+ base_def = "resources :#{@crud_definition.table}"
12
+
13
+ return base_def if @crud_definition.actions.size == 7
14
+
15
+ base_actions = @crud_definition.actions.map(&:name)
16
+ base_actions << 'edit' if base_actions.include?('update')
17
+ base_actions << 'new' if base_actions.include?('create')
18
+
19
+ base_def + ", only: %i[#{base_actions.join(' ')}]"
20
+ end
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,14 @@
1
+ Rails.application.routes.draw do
2
+ mount LetterOpenerWeb::Engine, at: "/letter_opener" if Rails.env.development?
3
+
4
+ get "up" => "rails/health#show", as: :rails_health_check
5
+
6
+ # Render dynamic PWA files from app/views/pwa/*
7
+ get "service-worker" => "rails/pwa#service_worker", as: :pwa_service_worker
8
+ get "manifest" => "rails/pwa#manifest", as: :pwa_manifest
9
+
10
+ <%= authentication_definition if authentication_definition.present? %>
11
+ <% resources.each do |resource| %>
12
+ <%= resource %>
13
+ <% end %>
14
+ end
@@ -0,0 +1,28 @@
1
+ require_relative 'devise/presenter'
2
+ require_relative 'resource/presenter'
3
+
4
+ module WebammToRails
5
+ module Sources
6
+ module Views
7
+ class Definition
8
+ def initialize(waml_definition:)
9
+ @waml_definition = waml_definition
10
+ end
11
+
12
+ def collection
13
+ views = []
14
+ views |= ::WebammToRails::Sources::Views::Devise::Presenter.new(waml_definition: @waml_definition).collection
15
+
16
+ @waml_definition.database.crud.each do |crud_definition|
17
+ views |= ::WebammToRails::Sources::Views::Resource::Presenter.new(
18
+ crud_definition: crud_definition,
19
+ waml_definition: @waml_definition
20
+ ).collection
21
+ end
22
+
23
+ views
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,31 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Views
4
+ module Devise
5
+ module Invitable
6
+ class Presenter
7
+ def initialize(table_name:)
8
+ @table_name = table_name
9
+ end
10
+
11
+ def collection
12
+ base_path = "app/views/#{@table_name}/"
13
+ templates = [
14
+ 'mailer/invitation_instructions.html.erb',
15
+ 'invitations/edit.html.erb',
16
+ 'invitations/new.html.erb'
17
+ ]
18
+
19
+ templates.map do |template|
20
+ {
21
+ path: base_path + template,
22
+ content: File.read(File.expand_path("templates/#{template}", __dir__))
23
+ }
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,38 @@
1
+ <%= form_for(resource, as: resource_name, url: invitation_path(resource_name), html: { method: :put, class: "max-w-4xl mx-auto" }) do |form| %>
2
+ <%= form.hidden_field :invitation_token, readonly: true %>
3
+ <% if resource.errors.any? %>
4
+ <div class="rounded-md bg-red-50 p-4 mb-4">
5
+ <div class="flex">
6
+ <div class="flex-shrink-0">
7
+ <svg class="h-5 w-5 text-red-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
8
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z" clip-rule="evenodd" />
9
+ </svg>
10
+ </div>
11
+ <div class="ml-3">
12
+ <h3 class="text-sm font-medium text-red-800"><%= pluralize(resource.errors.count, "error") %> prohibited this record from being saved:</h3>
13
+ <div class="mt-2 text-sm text-red-700">
14
+ <ul role="list" class="list-disc space-y-1 pl-5">
15
+ <% resource.errors.each do |error| %>
16
+ <li><%= error.full_message %></li>
17
+ <% end %>
18
+ </ul>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ </div>
23
+ <% end %>
24
+
25
+ <% if form.object.class.require_password_on_accepting %>
26
+ <div class="my-5">
27
+ <label class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Password:</label>
28
+ <%= form.password_field :password, class: 'shadow-sm bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 dark:shadow-sm-light' %>
29
+ </div>
30
+
31
+ <div class="my-5">
32
+ <label class="block mb-2 text-sm font-medium text-gray-900 dark:text-white">Password confirmation:</label>
33
+ <%= form.password_field :password_confirmation, class: 'shadow-sm bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 dark:shadow-sm-light' %>
34
+ </div>
35
+ <% end %>
36
+
37
+ <%= form.submit t("devise.invitations.edit.submit_button"), class: 'text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800' %>
38
+ <% end %>
@@ -0,0 +1,31 @@
1
+ <%= form_for(resource, as: resource_name, url: invitation_path(resource_name), html: { method: :post, class: "max-w-4xl mx-auto" }) do |form| %>
2
+ <% if resource.errors.any? %>
3
+ <div class="rounded-md bg-red-50 p-4 mb-4">
4
+ <div class="flex">
5
+ <div class="flex-shrink-0">
6
+ <svg class="h-5 w-5 text-red-400" viewBox="0 0 20 20" fill="currentColor" aria-hidden="true">
7
+ <path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.28 7.22a.75.75 0 00-1.06 1.06L8.94 10l-1.72 1.72a.75.75 0 101.06 1.06L10 11.06l1.72 1.72a.75.75 0 101.06-1.06L11.06 10l1.72-1.72a.75.75 0 00-1.06-1.06L10 8.94 8.28 7.22z" clip-rule="evenodd" />
8
+ </svg>
9
+ </div>
10
+ <div class="ml-3">
11
+ <h3 class="text-sm font-medium text-red-800"><%= pluralize(resource.errors.count, "error") %> prohibited this record from being saved:</h3>
12
+ <div class="mt-2 text-sm text-red-700">
13
+ <ul role="list" class="list-disc space-y-1 pl-5">
14
+ <% resource.errors.each do |error| %>
15
+ <li><%= error.full_message %></li>
16
+ <% end %>
17
+ </ul>
18
+ </div>
19
+ </div>
20
+ </div>
21
+ </div>
22
+ <% end %>
23
+ <% resource.class.invite_key_fields.each do |field| -%>
24
+ <div class="my-5">
25
+ <label class="block mb-2 text-sm font-medium text-gray-900 dark:text-white"><%= field %></label>
26
+ <%= form.text_field field, class: 'shadow-sm bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-blue-500 focus:border-blue-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-blue-500 dark:focus:border-blue-500 dark:shadow-sm-light' %>
27
+ </div>
28
+ <% end -%>
29
+
30
+ <%= form.submit t("devise.invitations.new.submit_button"), class: 'text-white bg-blue-700 hover:bg-blue-800 focus:ring-4 focus:outline-none focus:ring-blue-300 font-medium rounded-lg text-sm px-5 py-2.5 text-center dark:bg-blue-600 dark:hover:bg-blue-700 dark:focus:ring-blue-800' %>
31
+ <% end %>
@@ -0,0 +1,23 @@
1
+ <p><%= t("devise.mailer.invitation_instructions.hello", email: @resource.email) %></p>
2
+ <p><%= t("devise.mailer.invitation_instructions.someone_invited_you", url: root_url) %></p>
3
+ <table role="presentation" border="0" cellpadding="0" cellspacing="0" class="btn btn-primary">
4
+ <tbody>
5
+ <tr>
6
+ <td align="left">
7
+ <table role="presentation" border="0" cellpadding="0" cellspacing="0">
8
+ <tbody>
9
+ <tr>
10
+ <td><%= link_to t("devise.mailer.invitation_instructions.accept"), accept_invitation_url(@resource, invitation_token: @token) %></td>
11
+ </tr>
12
+ </tbody>
13
+ </table>
14
+ </td>
15
+ </tr>
16
+ </tbody>
17
+ </table>
18
+
19
+ <% if @resource.invitation_due_at %>
20
+ <p><%= t("devise.mailer.invitation_instructions.accept_until", due_date: l(@resource.invitation_due_at, format: :'devise.mailer.invitation_instructions.accept_until_format')) %></p>
21
+ <% end %>
22
+
23
+ <p><%= t("devise.mailer.invitation_instructions.ignore") %></p>
@@ -0,0 +1,32 @@
1
+ module WebammToRails
2
+ module Sources
3
+ module Views
4
+ module Devise
5
+ module Otp
6
+ class Presenter
7
+ def collection
8
+ base_path = "app/views/devise/"
9
+ templates = [
10
+ 'otp_credentials/show.html.erb',
11
+ 'otp_credentials/refresh.html.erb',
12
+ 'otp_tokens/_token_secret.html.erb',
13
+ 'otp_tokens/_trusted_devices.html.erb',
14
+ 'otp_tokens/edit.html.erb',
15
+ 'otp_tokens/recovery_codes.html.erb',
16
+ 'otp_tokens/recovery.html.erb',
17
+ 'otp_tokens/show.html.erb'
18
+ ]
19
+
20
+ templates.map do |template|
21
+ {
22
+ path: base_path + template,
23
+ content: File.read(File.expand_path("templates/#{template}", __dir__))
24
+ }
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,19 @@
1
+ <h2><%= I18n.t('title', :scope => 'devise.otp.credentials_refresh') %></h2>
2
+ <p><%= I18n.t('explain', :scope => 'devise.otp.credentials_refresh') %></p>
3
+
4
+ <%= form_for(resource, :as => resource_name, :url => [:refresh, resource_name, :otp_credential], :html => { :method => :put, "data-turbo" => false }) do |f| %>
5
+
6
+ <%= render "devise/shared/error_messages", resource: resource %>
7
+
8
+ <div>
9
+ <%= f.label :email %><br />
10
+ <%= f.text_field :email, :disabled => :true%>
11
+ </div>
12
+
13
+ <div>
14
+ <%= f.label :password %><br />
15
+ <%= f.password_field :refresh_password, :autocomplete => :off, :autofocus => true %>
16
+ </div>
17
+
18
+ <div><%= f.submit I18n.t(:go_on, :scope => 'devise.otp.credentials_refresh') %></div>
19
+ <% end %>