jets 3.1.0 → 5.0.10

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.
Files changed (650) hide show
  1. checksums.yaml +4 -4
  2. data/.github/FUNDING.yml +1 -0
  3. data/.gitignore +5 -1
  4. data/CHANGELOG.md +190 -1
  5. data/CONTRIBUTING.md +1 -1
  6. data/Gemfile +1 -5
  7. data/LICENSE.txt +1 -1
  8. data/README.md +28 -50
  9. data/Rakefile +3 -3
  10. data/backers.md +0 -5
  11. data/engines/internal/app/controllers/jets/application_controller.rb +28 -0
  12. data/engines/internal/app/controllers/jets/bare_controller.rb +6 -0
  13. data/engines/internal/app/controllers/jets/health_controller.rb +55 -0
  14. data/engines/internal/app/controllers/jets/info_controller.rb +45 -0
  15. data/{lib/jets → engines}/internal/app/controllers/jets/mailers_controller.rb +12 -14
  16. data/{lib/jets → engines}/internal/app/controllers/jets/mount_controller.rb +6 -10
  17. data/{lib/jets → engines}/internal/app/controllers/jets/public_controller.rb +6 -2
  18. data/engines/internal/app/controllers/jets/welcome_controller.rb +9 -0
  19. data/engines/internal/app/functions/jets/base_path.rb +109 -0
  20. data/engines/internal/app/functions/jets/base_path_mapping.rb +191 -0
  21. data/engines/internal/app/jobs/jets/preheat_job.rb +68 -0
  22. data/engines/internal/app/views/jets/info/properties.html.erb +1 -0
  23. data/engines/internal/app/views/jets/info/routes.html.erb +10 -0
  24. data/{lib/jets → engines}/internal/app/views/jets/mailers/email.html.erb +37 -17
  25. data/engines/internal/app/views/jets/mailers/index.html.erb +8 -0
  26. data/engines/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  27. data/{lib/jets/commands/templates/skeleton/public/index.html.tt → engines/internal/app/views/jets/welcome/index.html.erb} +8 -4
  28. data/engines/internal/app/views/layouts/application.html.erb +51 -0
  29. data/engines/internal/lib/internal/actiondispatch.rb +39 -0
  30. data/engines/internal/lib/internal/actionmailer.rb +51 -0
  31. data/engines/internal/lib/internal/actionview.rb +152 -0
  32. data/engines/internal/lib/internal/activerecord.rb +37 -0
  33. data/engines/internal/lib/internal/activesupport.rb +47 -0
  34. data/engines/internal/lib/internal/engine.rb +13 -0
  35. data/engines/internal/lib/internal/i18n_engine.rb +19 -0
  36. data/engines/internal/lib/internal/jets_controller.rb +46 -0
  37. data/engines/internal/lib/internal/overrides/debug_exceptions.rb +40 -0
  38. data/engines/internal/lib/internal/templates/rescues/_trace.html.erb +62 -0
  39. data/engines/internal/lib/internal/templates/rescues/_trace.text.erb +9 -0
  40. data/engines/internal/lib/internal/turbines/asset_tag_helper.rb +70 -0
  41. data/engines/internal/lib/internal/turbines/helpers.rb +18 -0
  42. data/engines/internal/lib/internal/turbines/routes_helpers.rb +42 -0
  43. data/exe/jets +1 -10
  44. data/jets.gemspec +17 -13
  45. data/lib/jets/app_loader.rb +77 -0
  46. data/lib/jets/application/bootstrap.rb +100 -0
  47. data/lib/jets/application/configuration/defaults.rb +256 -0
  48. data/lib/jets/application/configuration.rb +494 -0
  49. data/lib/jets/application/default_middleware_stack.rb +140 -0
  50. data/lib/jets/application/dummy_erb_compiler.rb +18 -0
  51. data/lib/jets/application/finisher.rb +266 -0
  52. data/lib/jets/application/routes_reloader.rb +80 -0
  53. data/lib/jets/application.rb +515 -199
  54. data/lib/jets/authorizer/base.rb +1 -0
  55. data/lib/jets/authorizer/dsl.rb +15 -11
  56. data/lib/jets/authorizer/helpers/iam_helper.rb +13 -11
  57. data/lib/jets/autoloaders/gem.rb +70 -0
  58. data/lib/jets/autoloaders/inflector.rb +21 -0
  59. data/lib/jets/autoloaders.rb +38 -101
  60. data/lib/jets/aws_info.rb +2 -2
  61. data/lib/jets/aws_services/stack_status.rb +2 -2
  62. data/lib/jets/aws_services.rb +8 -0
  63. data/lib/jets/backtrace_cleaner.rb +27 -0
  64. data/lib/jets/booter.rb +30 -118
  65. data/lib/jets/builders/code_builder.rb +67 -125
  66. data/lib/jets/builders/code_size.rb +1 -0
  67. data/lib/jets/builders/gem_replacer.rb +6 -12
  68. data/lib/jets/builders/handler_generator.rb +43 -15
  69. data/lib/jets/builders/lambda_layer.rb +2 -7
  70. data/lib/jets/builders/purger.rb +1 -1
  71. data/lib/jets/builders/rack_packager.rb +1 -1
  72. data/lib/jets/builders/ruby_packager.rb +54 -10
  73. data/lib/jets/builders/shim_vars/app.rb +10 -6
  74. data/lib/jets/builders/templates/handlers/one_lambda_for_all_controllers.rb +33 -0
  75. data/lib/jets/builders/templates/handlers/one_lambda_per_controller.rb +20 -0
  76. data/lib/jets/builders/templates/{handler.rb → handlers/one_lambda_per_method.rb} +6 -0
  77. data/lib/jets/bundle.rb +2 -9
  78. data/lib/jets/cfn/base.rb +82 -0
  79. data/lib/jets/cfn/builder/api/base.rb +12 -0
  80. data/lib/jets/cfn/{builders/api_deployment_builder.rb → builder/api/deployment.rb} +11 -21
  81. data/lib/jets/cfn/builder/api/gateway.rb +104 -0
  82. data/lib/jets/cfn/builder/api/mapping.rb +54 -0
  83. data/lib/jets/cfn/builder/api/methods.rb +72 -0
  84. data/lib/jets/cfn/builder/api/paged.rb +30 -0
  85. data/lib/jets/cfn/builder/api/pages/base.rb +105 -0
  86. data/lib/jets/cfn/builder/api/pages/methods.rb +17 -0
  87. data/lib/jets/cfn/builder/api/pages/page.rb +19 -0
  88. data/lib/jets/cfn/builder/api/pages/resources.rb +21 -0
  89. data/lib/jets/cfn/builder/api/resources.rb +40 -0
  90. data/lib/jets/cfn/{builders/authorizer_builder.rb → builder/authorizer.rb} +16 -19
  91. data/lib/jets/cfn/builder/controller.rb +28 -0
  92. data/lib/jets/cfn/builder/function.rb +9 -0
  93. data/lib/jets/cfn/builder/interface.rb +146 -0
  94. data/lib/jets/cfn/builder/job.rb +10 -0
  95. data/lib/jets/cfn/builder/nested.rb +130 -0
  96. data/lib/jets/cfn/builder/one_controller.rb +53 -0
  97. data/lib/jets/cfn/{builders/parent_builder → builder/parent}/stagger.rb +1 -1
  98. data/lib/jets/cfn/builder/parent.rb +149 -0
  99. data/lib/jets/cfn/builder/post_process.rb +25 -0
  100. data/lib/jets/cfn/{builders/rule_builder.rb → builder/rule.rb} +4 -8
  101. data/lib/jets/cfn/{builders/shared_builder.rb → builder/shared.rb} +5 -4
  102. data/lib/jets/cfn/{builders → builder}/util/source.rb +1 -1
  103. data/lib/jets/{commands/build.rb → cfn/builder.rb} +58 -80
  104. data/lib/jets/cfn/deployment.rb +85 -0
  105. data/lib/jets/cfn/download.rb +39 -0
  106. data/lib/jets/cfn/params/api/base.rb +39 -0
  107. data/lib/jets/cfn/params/api/cors.rb +10 -0
  108. data/lib/jets/cfn/params/api/methods.rb +69 -0
  109. data/lib/jets/cfn/params/api/resources.rb +28 -0
  110. data/lib/jets/{resource/child_stack/common_parameters.rb → cfn/params/common.rb} +4 -4
  111. data/lib/jets/{resource → cfn/resource}/api_gateway/authorizer.rb +21 -21
  112. data/lib/jets/cfn/resource/api_gateway/base_path/function.rb +57 -0
  113. data/lib/jets/{resource → cfn/resource}/api_gateway/base_path/mapping.rb +13 -12
  114. data/lib/jets/cfn/resource/api_gateway/base_path/role.rb +70 -0
  115. data/lib/jets/{resource → cfn/resource}/api_gateway/deployment.rb +13 -20
  116. data/lib/jets/{resource → cfn/resource}/api_gateway/domain_name.rb +11 -11
  117. data/lib/jets/{resource → cfn/resource}/api_gateway/method/authorization.rb +1 -1
  118. data/lib/jets/cfn/resource/api_gateway/method.rb +92 -0
  119. data/lib/jets/{resource → cfn/resource}/api_gateway/resource.rb +14 -10
  120. data/lib/jets/cfn/resource/api_gateway/resource_id.rb +25 -0
  121. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/change_detection.rb +1 -1
  122. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id/message.rb +14 -4
  123. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id.rb +4 -4
  124. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/base.rb +15 -41
  125. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/media_types.rb +3 -3
  126. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/page.rb +6 -6
  127. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/to.rb +8 -3
  128. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/variable.rb +2 -2
  129. data/lib/jets/cfn/resource/api_gateway/rest_api/routes/change.rb +27 -0
  130. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision/variable_exception.rb +1 -1
  131. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision.rb +1 -1
  132. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes.rb +1 -1
  133. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api.rb +22 -12
  134. data/lib/jets/{resource → cfn/resource}/associated.rb +1 -1
  135. data/lib/jets/{resource → cfn/resource}/config/config_rule.rb +18 -18
  136. data/lib/jets/{resource → cfn/resource}/config/managed_rule.rb +5 -5
  137. data/lib/jets/{resource → cfn/resource}/events/rule.rb +10 -10
  138. data/lib/jets/{resource → cfn/resource}/iam/application_role.rb +4 -4
  139. data/lib/jets/cfn/resource/iam/base_role_definition.rb +56 -0
  140. data/lib/jets/{resource → cfn/resource}/iam/class_role.rb +5 -5
  141. data/lib/jets/{resource → cfn/resource}/iam/function_role.rb +6 -6
  142. data/lib/jets/{resource → cfn/resource}/iam/managed_policy.rb +1 -1
  143. data/lib/jets/cfn/resource/iam/policy.rb +31 -0
  144. data/lib/jets/{resource → cfn/resource}/iam/policy_document.rb +10 -9
  145. data/lib/jets/{resource → cfn/resource}/iot/topic_rule.rb +10 -10
  146. data/lib/jets/{resource → cfn/resource}/lambda/event_source_mapping.rb +9 -9
  147. data/lib/jets/cfn/resource/lambda/function/controller.rb +21 -0
  148. data/lib/jets/{resource → cfn/resource}/lambda/function/environment.rb +9 -7
  149. data/lib/jets/cfn/resource/lambda/function.rb +266 -0
  150. data/lib/jets/{resource → cfn/resource}/lambda/gem_layer.rb +2 -2
  151. data/lib/jets/{resource → cfn/resource}/lambda/layer_version.rb +10 -10
  152. data/lib/jets/cfn/resource/lambda/permission.rb +51 -0
  153. data/lib/jets/cfn/resource/logs/subscription_filter.rb +31 -0
  154. data/lib/jets/cfn/resource/nested/api/base.rb +4 -0
  155. data/lib/jets/cfn/resource/nested/api/deployment.rb +53 -0
  156. data/lib/jets/cfn/resource/nested/api/gateway.rb +15 -0
  157. data/lib/jets/cfn/resource/nested/api/mapping.rb +33 -0
  158. data/lib/jets/cfn/resource/nested/api/methods.rb +30 -0
  159. data/lib/jets/cfn/resource/nested/api/page.rb +8 -0
  160. data/lib/jets/cfn/resource/nested/api/resources.rb +22 -0
  161. data/lib/jets/{resource/child_stack → cfn/resource/nested}/app_class.rb +15 -48
  162. data/lib/jets/{resource/child_stack → cfn/resource/nested}/authorizer.rb +8 -14
  163. data/lib/jets/cfn/resource/nested/base.rb +38 -0
  164. data/lib/jets/cfn/resource/nested/one_controller.rb +48 -0
  165. data/lib/jets/{resource/child_stack → cfn/resource/nested}/shared.rb +10 -16
  166. data/lib/jets/cfn/resource/one/function.rb +66 -0
  167. data/lib/jets/cfn/resource/one/permission.rb +17 -0
  168. data/lib/jets/{resource → cfn/resource}/replacer.rb +26 -27
  169. data/lib/jets/{resource → cfn/resource}/route53/record_set.rb +18 -18
  170. data/lib/jets/{resource → cfn/resource}/s3/bucket.rb +4 -4
  171. data/lib/jets/cfn/resource/s3/jets_bucket.rb +68 -0
  172. data/lib/jets/{resource → cfn/resource}/sns/subscription.rb +8 -8
  173. data/lib/jets/{resource → cfn/resource}/sns/topic.rb +10 -10
  174. data/lib/jets/{resource → cfn/resource}/sns/topic_policy.rb +13 -13
  175. data/lib/jets/{resource → cfn/resource}/sqs/queue.rb +5 -5
  176. data/lib/jets/{resource → cfn/resource}/standardizer.rb +8 -9
  177. data/lib/jets/cfn/resource.rb +8 -0
  178. data/lib/jets/cfn/ship.rb +33 -29
  179. data/lib/jets/cfn/status.rb +46 -3
  180. data/lib/jets/cfn/template.rb +89 -0
  181. data/lib/jets/cfn/upload.rb +29 -23
  182. data/lib/jets/cli.rb +28 -203
  183. data/lib/jets/command/actions.rb +49 -0
  184. data/lib/jets/command/api_helpers.rb +42 -0
  185. data/lib/jets/command/aws_helpers.rb +26 -0
  186. data/lib/jets/command/base.rb +209 -0
  187. data/lib/jets/command/behavior.rb +83 -0
  188. data/lib/jets/command/environment_argument.rb +42 -0
  189. data/lib/jets/command/help/call.md +48 -0
  190. data/lib/jets/{commands → command}/help/deploy.md +1 -1
  191. data/lib/jets/command/help/gems/check.md +1 -0
  192. data/lib/jets/command/help/logs.md +21 -0
  193. data/lib/jets/{commands → command}/help/new.md +3 -4
  194. data/lib/jets/command/help/projects.md +6 -0
  195. data/lib/jets/command/help/releases.md +19 -0
  196. data/lib/jets/command/help/rollback.md +5 -0
  197. data/lib/jets/command/help/routes.md +15 -0
  198. data/lib/jets/command/help/runner.md +40 -0
  199. data/lib/jets/command/help/stacks.md +6 -0
  200. data/lib/jets/command/help.rb +17 -0
  201. data/lib/jets/command/helpers/editor.rb +35 -0
  202. data/lib/jets/command/rake_decorate.rb +38 -0
  203. data/lib/jets/command.rb +142 -0
  204. data/lib/jets/commands/application/application_command.rb +46 -0
  205. data/lib/jets/commands/build/build_command.rb +33 -0
  206. data/lib/jets/commands/call/anonymous_guesser.rb +1 -1
  207. data/lib/jets/commands/call/autoload_guesser.rb +2 -2
  208. data/lib/jets/commands/call/base_guesser.rb +5 -5
  209. data/lib/jets/commands/call/call_command.rb +27 -0
  210. data/lib/jets/commands/call/caller.rb +184 -0
  211. data/lib/jets/commands/call/guesser.rb +1 -1
  212. data/lib/jets/commands/clean/base.rb +1 -1
  213. data/lib/jets/commands/clean/build.rb +1 -1
  214. data/lib/jets/commands/clean/clean_command.rb +15 -0
  215. data/lib/jets/commands/clean/log.rb +4 -4
  216. data/lib/jets/commands/configure/configure_command.rb +9 -0
  217. data/lib/jets/commands/console/console_command.rb +38 -0
  218. data/lib/jets/commands/credentials/USAGE +103 -0
  219. data/lib/jets/commands/credentials/credentials_command/diffing.rb +51 -0
  220. data/lib/jets/commands/credentials/credentials_command.rb +139 -0
  221. data/lib/jets/commands/db/system/change/change_command.rb +24 -0
  222. data/lib/jets/commands/dbconsole/dbconsole_command.rb +184 -0
  223. data/lib/jets/commands/degenerate/degenerate_command.rb +21 -0
  224. data/lib/jets/commands/delete/delete_command.rb +154 -0
  225. data/lib/jets/commands/{deploy.rb → deploy/deploy_command.rb} +34 -53
  226. data/lib/jets/commands/dev/dev_command.rb +19 -0
  227. data/lib/jets/commands/{dotenv.rb → dotenv/dotenv_command.rb} +2 -2
  228. data/lib/jets/commands/encrypted/USAGE +46 -0
  229. data/lib/jets/commands/encrypted/encrypted_command.rb +87 -0
  230. data/lib/jets/commands/gems/gems_command.rb +14 -0
  231. data/lib/jets/commands/generate/generate_command.rb +95 -0
  232. data/lib/jets/commands/help/USAGE +20 -0
  233. data/lib/jets/commands/help/help_command.rb +15 -0
  234. data/lib/jets/commands/initializers/initializers_command.rb +19 -0
  235. data/lib/jets/commands/logs/logs_command.rb +45 -0
  236. data/lib/jets/commands/new/new_command.rb +19 -0
  237. data/lib/jets/commands/notes/notes_command.rb +30 -0
  238. data/lib/jets/commands/plugin/plugin_command.rb +45 -0
  239. data/lib/jets/commands/projects/projects_command.rb +30 -0
  240. data/lib/jets/commands/rake/rake_command.rb +59 -0
  241. data/lib/jets/commands/releases/releases_command.rb +124 -0
  242. data/lib/jets/commands/rollback/rollback_command.rb +33 -0
  243. data/lib/jets/commands/routes/routes_command.rb +19 -0
  244. data/lib/jets/commands/runner/runner_command.rb +60 -0
  245. data/lib/jets/commands/server/server_command.rb +291 -0
  246. data/lib/jets/commands/stacks/stacks_command.rb +39 -0
  247. data/lib/jets/commands/status/status_command.rb +16 -0
  248. data/lib/jets/commands/url/url_command.rb +92 -0
  249. data/lib/jets/commands/version/version_command.rb +11 -0
  250. data/lib/jets/commands.rb +17 -0
  251. data/lib/jets/configuration.rb +166 -0
  252. data/lib/jets/controller/base.rb +105 -183
  253. data/lib/jets/controller/compat/abstract_controller/base.rb +126 -0
  254. data/lib/jets/controller/compat/action_controller/metal.rb +99 -0
  255. data/lib/jets/controller/compat/caching.rb +13 -0
  256. data/lib/jets/controller/compat/future.rb +13 -0
  257. data/lib/jets/controller/compat/route_set.rb +47 -0
  258. data/lib/jets/controller/decorate/apigw_stage.rb +39 -0
  259. data/lib/jets/controller/{authorization.rb → decorate/authorization.rb} +1 -1
  260. data/lib/jets/controller/decorate/logging.rb +90 -0
  261. data/lib/jets/controller/decorate/redirecting.rb +16 -0
  262. data/lib/jets/controller/decorate/url_for.rb +10 -0
  263. data/lib/jets/controller/{rack/adapter.rb → handler/apigw.rb} +36 -37
  264. data/lib/jets/controller/handler.rb +41 -0
  265. data/lib/jets/controller/middleware/main.rb +16 -8
  266. data/lib/jets/controller/middleware/{local/api_gateway.rb → mimic/apigw.rb} +41 -4
  267. data/lib/jets/controller/middleware/mimic/lambda_context.rb +44 -0
  268. data/lib/jets/controller/middleware/{local.rb → mimic.rb} +36 -51
  269. data/lib/jets/controller/rack_adapter/action.rb +35 -0
  270. data/lib/jets/controller/{rack → rack_adapter}/env.rb +39 -18
  271. data/lib/jets/controller/request/compat/params.rb +144 -0
  272. data/lib/jets/controller/request/compat/request.rb +125 -0
  273. data/lib/jets/controller/request.rb +35 -18
  274. data/lib/jets/controller/response/compat/response.rb +67 -0
  275. data/lib/jets/controller/response.rb +91 -8
  276. data/lib/jets/core.rb +159 -52
  277. data/lib/jets/core_ext/file.rb +9 -0
  278. data/lib/jets/core_ext/kernel.rb +2 -2
  279. data/lib/jets/core_ext/symbol.rb +5 -0
  280. data/lib/jets/core_ext.rb +4 -0
  281. data/lib/jets/dev_caching.rb +44 -0
  282. data/lib/jets/dotenv/ssm.rb +6 -3
  283. data/lib/jets/dotenv.rb +4 -3
  284. data/lib/jets/engine/configuration.rb +96 -0
  285. data/lib/jets/engine/turbines.rb +23 -0
  286. data/lib/jets/engine.rb +380 -0
  287. data/lib/jets/erb.rb +1 -1
  288. data/lib/jets/exception_reporting.rb +43 -0
  289. data/lib/jets/generators/job/job_generator.rb +41 -0
  290. data/lib/jets/generators/job/templates/event_types/dynamodb.rb.tt +8 -0
  291. data/lib/jets/generators/job/templates/event_types/iot.rb.tt +8 -0
  292. data/lib/jets/generators/job/templates/event_types/kinesis.rb.tt +9 -0
  293. data/lib/jets/generators/job/templates/event_types/log.rb.tt +9 -0
  294. data/lib/jets/generators/job/templates/event_types/rule.rb.tt +23 -0
  295. data/lib/jets/generators/job/templates/event_types/s3.rb.tt +11 -0
  296. data/lib/jets/generators/job/templates/event_types/scheduled.rb.tt +8 -0
  297. data/lib/jets/generators/job/templates/event_types/sns.rb.tt +11 -0
  298. data/lib/jets/generators/job/templates/event_types/sqs.rb.tt +11 -0
  299. data/lib/jets/generators/overrides/app/USAGE +38 -0
  300. data/lib/jets/generators/overrides/app/app_generator.rb +148 -0
  301. data/lib/jets/generators/overrides/app/helpers.rb +139 -0
  302. data/lib/jets/generators/overrides/app/templates/.env +10 -0
  303. data/lib/jets/{commands/templates/skeleton/.gitignore → generators/overrides/app/templates/.gitignore.tt} +2 -1
  304. data/lib/jets/generators/overrides/app/templates/.jetsignore +6 -0
  305. data/lib/jets/generators/overrides/app/templates/Gemfile.tt +28 -0
  306. data/lib/jets/generators/overrides/app/templates/Rakefile +2 -0
  307. data/lib/jets/generators/overrides/app/templates/app/assets/config/manifest.js +3 -0
  308. data/lib/jets/generators/overrides/app/templates/app/assets/stylesheets/application.css +15 -0
  309. data/lib/jets/generators/overrides/app/templates/app/javascript/application.js +5 -0
  310. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/models/application_record.rb +1 -1
  311. data/lib/jets/generators/overrides/app/templates/app/views/layouts/application.html.erb.tt +30 -0
  312. data/lib/jets/generators/overrides/app/templates/bin/jets +3 -0
  313. data/lib/jets/generators/overrides/app/templates/config/application.rb.tt +15 -0
  314. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/database.yml.tt +1 -1
  315. data/lib/jets/generators/overrides/app/templates/config/environments/development.rb.tt +29 -0
  316. data/lib/jets/generators/overrides/app/templates/config/environments/production.rb.tt +21 -0
  317. data/lib/jets/generators/overrides/app/templates/config/environments/test.rb.tt +23 -0
  318. data/lib/jets/generators/overrides/app/templates/config/initializers/content_security_policy.rb +31 -0
  319. data/lib/jets/generators/overrides/app/templates/config/initializers/filter_parameter_logging.rb +8 -0
  320. data/lib/jets/generators/overrides/app/templates/config/initializers/permissions_policy.rb +11 -0
  321. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/routes.rb +5 -1
  322. data/lib/jets/generators/overrides/app/templates/db/.gitkeep +0 -0
  323. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/404.html +6 -6
  324. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/422.html +6 -6
  325. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/500.html +6 -6
  326. data/lib/jets/generators/overrides/templates/erb/scaffold/index.html.erb +22 -0
  327. data/lib/jets/generators/overrides/templates/erb/scaffold/partial.html.erb +8 -0
  328. data/lib/jets/{generator/templates/rails/scaffold_controller/api_controller.rb → generators/overrides/templates/rails/scaffold_controller/api_controller.rb.tt} +5 -9
  329. data/lib/jets/generators/overrides/templates/rails/scaffold_controller/controller.rb.tt +67 -0
  330. data/lib/jets/generators.rb +112 -0
  331. data/lib/jets/inflections.rb +1 -1
  332. data/lib/jets/info.rb +116 -0
  333. data/lib/jets/initializable.rb +95 -0
  334. data/lib/jets/job/base.rb +11 -8
  335. data/lib/jets/job/dsl/dynamodb_event.rb +25 -14
  336. data/lib/jets/job/dsl/event_source_mapping.rb +1 -1
  337. data/lib/jets/job/dsl/iot_event.rb +6 -6
  338. data/lib/jets/job/dsl/kinesis_event.rb +10 -9
  339. data/lib/jets/job/dsl/log_event.rb +2 -2
  340. data/lib/jets/job/dsl/rule_event.rb +7 -4
  341. data/lib/jets/job/dsl/s3_event.rb +5 -5
  342. data/lib/jets/job/dsl/sns_event.rb +6 -6
  343. data/lib/jets/job/dsl/sqs_event.rb +15 -14
  344. data/lib/jets/job/helpers/{kinesis_event_helper.rb → kinesis_event.rb} +5 -1
  345. data/lib/jets/job/helpers/{log_event_helper.rb → log_event.rb} +5 -1
  346. data/lib/jets/job/helpers/s3_event.rb +50 -0
  347. data/lib/jets/job/helpers/sns_event.rb +26 -0
  348. data/lib/jets/job/helpers/sqs_event.rb +26 -0
  349. data/lib/jets/klass.rb +5 -6
  350. data/lib/jets/lambda/definition.rb +118 -0
  351. data/lib/jets/lambda/dsl/warnings.rb +57 -0
  352. data/lib/jets/lambda/dsl.rb +70 -53
  353. data/lib/jets/lambda/function.rb +3 -3
  354. data/lib/jets/lambda/function_constructor.rb +6 -6
  355. data/lib/jets/lambda/functions.rb +36 -1
  356. data/lib/jets/mega/hash_converter.rb +2 -2
  357. data/lib/jets/mega/request/source.rb +1 -2
  358. data/lib/jets/mega/request.rb +4 -4
  359. data/lib/jets/names.rb +79 -0
  360. data/lib/jets/overrides/dummy/rails.rb +11 -0
  361. data/lib/jets/overrides/lambda/marshaller.rb +10 -0
  362. data/lib/jets/overrides/puma.rb +10 -0
  363. data/lib/jets/paths.rb +243 -0
  364. data/lib/jets/{poly_fun → poly}/base_executor.rb +13 -13
  365. data/lib/jets/{poly_fun → poly}/lambda_executor.rb +2 -2
  366. data/lib/jets/{poly_fun → poly}/node_error.rb +1 -1
  367. data/lib/jets/{poly_fun → poly}/node_executor.rb +4 -4
  368. data/lib/jets/{poly_fun → poly}/python_error.rb +1 -1
  369. data/lib/jets/{poly_fun → poly}/python_executor.rb +2 -2
  370. data/lib/jets/{poly_fun.rb → poly.rb} +12 -12
  371. data/lib/jets/preheat.rb +26 -33
  372. data/lib/jets/processors/deducer.rb +2 -2
  373. data/lib/jets/processors/main_processor.rb +6 -13
  374. data/lib/jets/rack/logger.rb +77 -0
  375. data/lib/jets/router/compat/route_set.rb +177 -0
  376. data/lib/jets/router/dsl/mount.rb +40 -6
  377. data/lib/jets/router/dsl.rb +125 -105
  378. data/lib/jets/router/engine_mount.rb +36 -0
  379. data/lib/jets/router/help.rb +130 -0
  380. data/lib/jets/router/helpers/named_routes/add_full_url.rb +13 -0
  381. data/lib/jets/router/helpers/named_routes/generated.rb +197 -0
  382. data/lib/jets/router/helpers/named_routes/proxy.rb +66 -0
  383. data/lib/jets/router/matcher.rb +140 -17
  384. data/lib/jets/router/resources/options.rb +6 -4
  385. data/lib/jets/router/route/after_initialize.rb +64 -0
  386. data/lib/jets/router/route/as.rb +93 -0
  387. data/lib/jets/router/route/authorizer.rb +1 -0
  388. data/lib/jets/router/route/compat.rb +45 -0
  389. data/lib/jets/router/route/info.rb +74 -0
  390. data/lib/jets/router/route/node.rb +137 -0
  391. data/lib/jets/router/route/path.rb +93 -0
  392. data/lib/jets/router/route.rb +109 -90
  393. data/lib/jets/router/route_set.rb +214 -0
  394. data/lib/jets/router/scope.rb +204 -69
  395. data/lib/jets/router/state.rb +67 -0
  396. data/lib/jets/router/util.rb +1 -31
  397. data/lib/jets/router.rb +64 -150
  398. data/lib/jets/ruby_version_check.rb +15 -0
  399. data/lib/jets/rule/base.rb +1 -0
  400. data/lib/jets/rule/dsl.rb +7 -7
  401. data/lib/jets/secrets.rb +110 -0
  402. data/lib/jets/spec_helpers/controllers/request.rb +22 -16
  403. data/lib/jets/spec_helpers/controllers.rb +32 -24
  404. data/lib/jets/spec_helpers.rb +0 -6
  405. data/lib/jets/stack/builder.rb +3 -2
  406. data/lib/jets/stack/definition.rb +1 -4
  407. data/lib/jets/stack/function.rb +4 -2
  408. data/lib/jets/stack/main/dsl/cloudwatch.rb +4 -4
  409. data/lib/jets/stack/main/dsl/kinesis.rb +2 -2
  410. data/lib/jets/stack/main/dsl/lambda.rb +26 -19
  411. data/lib/jets/stack/main/dsl/sqs.rb +1 -1
  412. data/lib/jets/stack/output/lookup.rb +6 -2
  413. data/lib/jets/stack/output.rb +2 -2
  414. data/lib/jets/stack/parameter.rb +2 -2
  415. data/lib/jets/stack/resource.rb +3 -3
  416. data/lib/jets/stack/s3_event.rb +51 -37
  417. data/lib/jets/stack.rb +1 -1
  418. data/lib/jets/tasks/engine.rake +85 -0
  419. data/lib/jets/tasks/framework.rake +66 -0
  420. data/lib/jets/tasks/log.rake +41 -0
  421. data/lib/jets/tasks/middleware.rake +9 -0
  422. data/lib/jets/tasks/misc.rake +81 -0
  423. data/lib/jets/tasks/statistics.rake +37 -0
  424. data/lib/jets/tasks/tmp.rake +51 -0
  425. data/lib/jets/tasks/yarn.rake +29 -0
  426. data/lib/jets/tasks/zeitwerk.rake +61 -0
  427. data/lib/jets/tasks.rb +18 -0
  428. data/lib/jets/tmp_loader.rb +1 -1
  429. data/lib/jets/turbine/configurable.rb +36 -0
  430. data/lib/jets/turbine/configuration.rb +101 -0
  431. data/lib/jets/turbine.rb +164 -20
  432. data/lib/jets/util/camelize.rb +24 -0
  433. data/lib/jets/util/yamler.rb +18 -0
  434. data/lib/jets/version.rb +1 -1
  435. data/lib/jets.rb +9 -14
  436. metadata +462 -349
  437. data/.python-version +0 -1
  438. data/.ruby-version +0 -1
  439. data/bin/release +0 -9
  440. data/lib/jets/application/defaults.rb +0 -200
  441. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +0 -16
  442. data/lib/jets/builders/reconfigure_rails.rb +0 -114
  443. data/lib/jets/cfn/builders/api_gateway_builder.rb +0 -123
  444. data/lib/jets/cfn/builders/api_resources_builder.rb +0 -44
  445. data/lib/jets/cfn/builders/base_child_builder.rb +0 -69
  446. data/lib/jets/cfn/builders/controller_builder.rb +0 -50
  447. data/lib/jets/cfn/builders/function_builder.rb +0 -14
  448. data/lib/jets/cfn/builders/interface.rb +0 -133
  449. data/lib/jets/cfn/builders/job_builder.rb +0 -14
  450. data/lib/jets/cfn/builders/parent_builder.rb +0 -130
  451. data/lib/jets/cfn/built_template.rb +0 -15
  452. data/lib/jets/cfn/template_source.rb +0 -61
  453. data/lib/jets/commands/base.rb +0 -145
  454. data/lib/jets/commands/call.rb +0 -182
  455. data/lib/jets/commands/clean.rb +0 -19
  456. data/lib/jets/commands/configure.rb +0 -51
  457. data/lib/jets/commands/console.rb +0 -12
  458. data/lib/jets/commands/db/environment-task.rake +0 -3
  459. data/lib/jets/commands/db/tasks/dummy/app.rb +0 -25
  460. data/lib/jets/commands/db/tasks/dummy/config.rb +0 -14
  461. data/lib/jets/commands/db/tasks.rb +0 -34
  462. data/lib/jets/commands/db.rb +0 -13
  463. data/lib/jets/commands/dbconsole.rb +0 -134
  464. data/lib/jets/commands/delete.rb +0 -136
  465. data/lib/jets/commands/dynamodb/migrate.rb +0 -9
  466. data/lib/jets/commands/dynamodb/migrator.rb +0 -36
  467. data/lib/jets/commands/dynamodb.rb +0 -19
  468. data/lib/jets/commands/gems.rb +0 -13
  469. data/lib/jets/commands/help/call.md +0 -69
  470. data/lib/jets/commands/help/dynamodb/generate.md +0 -52
  471. data/lib/jets/commands/help/dynamodb/migrate.md +0 -4
  472. data/lib/jets/commands/help/gems/check.md +0 -6
  473. data/lib/jets/commands/help/routes.md +0 -16
  474. data/lib/jets/commands/help/runner.md +0 -17
  475. data/lib/jets/commands/help.rb +0 -9
  476. data/lib/jets/commands/import/base.rb +0 -49
  477. data/lib/jets/commands/import/cheatsheet.rb +0 -35
  478. data/lib/jets/commands/import/rack.rb +0 -16
  479. data/lib/jets/commands/import/rails.rb +0 -74
  480. data/lib/jets/commands/import/sequence.rb +0 -90
  481. data/lib/jets/commands/import/templates/config/database.yml +0 -30
  482. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +0 -89
  483. data/lib/jets/commands/import.rb +0 -12
  484. data/lib/jets/commands/main.rb +0 -166
  485. data/lib/jets/commands/markdown/creator.rb +0 -58
  486. data/lib/jets/commands/markdown/index.rb +0 -27
  487. data/lib/jets/commands/markdown/page.rb +0 -125
  488. data/lib/jets/commands/markdown/shell.rb +0 -11
  489. data/lib/jets/commands/new.rb +0 -173
  490. data/lib/jets/commands/rake_command.rb +0 -61
  491. data/lib/jets/commands/rake_tasks.rb +0 -50
  492. data/lib/jets/commands/runner.rb +0 -16
  493. data/lib/jets/commands/sequence.rb +0 -105
  494. data/lib/jets/commands/stack_info.rb +0 -30
  495. data/lib/jets/commands/templates/skeleton/.env.development.tt +0 -3
  496. data/lib/jets/commands/templates/skeleton/.env.test +0 -3
  497. data/lib/jets/commands/templates/skeleton/.env.tt +0 -3
  498. data/lib/jets/commands/templates/skeleton/.jetskeep +0 -1
  499. data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -40
  500. data/lib/jets/commands/templates/skeleton/Procfile +0 -7
  501. data/lib/jets/commands/templates/skeleton/Rakefile +0 -2
  502. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +0 -2
  503. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +0 -26
  504. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -71
  505. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +0 -22
  506. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +0 -7
  507. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +0 -9
  508. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +0 -7
  509. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +0 -23
  510. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +0 -24
  511. data/lib/jets/commands/upgrade/templates/bin/webpack +0 -19
  512. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +0 -19
  513. data/lib/jets/commands/upgrade/version1.rb +0 -136
  514. data/lib/jets/commands/upgrade.rb +0 -105
  515. data/lib/jets/commands/url.rb +0 -69
  516. data/lib/jets/commands/webpacker_template.rb +0 -18
  517. data/lib/jets/controller/callbacks.rb +0 -73
  518. data/lib/jets/controller/cookies/jar.rb +0 -269
  519. data/lib/jets/controller/cookies.rb +0 -38
  520. data/lib/jets/controller/error/invalid_authenticity_token.rb +0 -6
  521. data/lib/jets/controller/error.rb +0 -4
  522. data/lib/jets/controller/forgery_protection.rb +0 -43
  523. data/lib/jets/controller/layout.rb +0 -17
  524. data/lib/jets/controller/middleware/cors.rb +0 -60
  525. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +0 -38
  526. data/lib/jets/controller/middleware/local/route_matcher.rb +0 -22
  527. data/lib/jets/controller/middleware/reloader.rb +0 -15
  528. data/lib/jets/controller/parameters_filter.rb +0 -29
  529. data/lib/jets/controller/params.rb +0 -117
  530. data/lib/jets/controller/redirection.rb +0 -61
  531. data/lib/jets/controller/rendering/rack_renderer.rb +0 -267
  532. data/lib/jets/controller/rendering.rb +0 -96
  533. data/lib/jets/controller/stage.rb +0 -34
  534. data/lib/jets/controller.rb +0 -3
  535. data/lib/jets/db.rb +0 -15
  536. data/lib/jets/generator/templates/active_job/job/templates/job.rb.tt +0 -8
  537. data/lib/jets/generator/templates/erb/controller/view.html.erb +0 -2
  538. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +0 -29
  539. data/lib/jets/generator/templates/rails/controller/controller.rb +0 -13
  540. data/lib/jets/generator/templates/rails/helper/helper.rb +0 -4
  541. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +0 -67
  542. data/lib/jets/generator.rb +0 -112
  543. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +0 -16
  544. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +0 -12
  545. data/lib/jets/internal/app/functions/jets/base_path.rb +0 -18
  546. data/lib/jets/internal/app/functions/jets/base_path_mapping.rb +0 -100
  547. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +0 -9
  548. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +0 -70
  549. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +0 -8
  550. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +0 -6
  551. data/lib/jets/internal/turbines/jets/mailer.rb +0 -52
  552. data/lib/jets/job/helpers/s3_event_helper.rb +0 -13
  553. data/lib/jets/lambda/task.rb +0 -111
  554. data/lib/jets/logger.rb +0 -21
  555. data/lib/jets/middleware/configurator.rb +0 -84
  556. data/lib/jets/middleware/default_stack.rb +0 -53
  557. data/lib/jets/middleware/layer.rb +0 -34
  558. data/lib/jets/middleware/stack.rb +0 -77
  559. data/lib/jets/middleware.rb +0 -33
  560. data/lib/jets/naming.rb +0 -63
  561. data/lib/jets/overrides/rails/action_controller.rb +0 -13
  562. data/lib/jets/overrides/rails/asset_tag_helper.rb +0 -114
  563. data/lib/jets/overrides/rails/common_methods.rb +0 -13
  564. data/lib/jets/overrides/rails/migration_checker.rb +0 -34
  565. data/lib/jets/overrides/rails/rendering_helper.rb +0 -27
  566. data/lib/jets/overrides/rails/url_helper.rb +0 -88
  567. data/lib/jets/overrides/rails.rb +0 -6
  568. data/lib/jets/rack_server.rb +0 -86
  569. data/lib/jets/resource/api_gateway/base_path/function.rb +0 -49
  570. data/lib/jets/resource/api_gateway/base_path/role.rb +0 -76
  571. data/lib/jets/resource/api_gateway/cors.rb +0 -61
  572. data/lib/jets/resource/api_gateway/method.rb +0 -102
  573. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +0 -16
  574. data/lib/jets/resource/base.rb +0 -28
  575. data/lib/jets/resource/child_stack/api_deployment.rb +0 -58
  576. data/lib/jets/resource/child_stack/api_gateway.rb +0 -23
  577. data/lib/jets/resource/child_stack/api_resource/page.rb +0 -20
  578. data/lib/jets/resource/child_stack/api_resource.rb +0 -54
  579. data/lib/jets/resource/child_stack/base.rb +0 -24
  580. data/lib/jets/resource/iam/base_role_definition.rb +0 -47
  581. data/lib/jets/resource/lambda/function.rb +0 -221
  582. data/lib/jets/resource/logs/subscription_filter.rb +0 -31
  583. data/lib/jets/resource/permission.rb +0 -45
  584. data/lib/jets/resource.rb +0 -71
  585. data/lib/jets/router/error.rb +0 -4
  586. data/lib/jets/router/finder.rb +0 -47
  587. data/lib/jets/router/helpers/core_helper.rb +0 -27
  588. data/lib/jets/router/helpers/named_routes_helper.rb +0 -8
  589. data/lib/jets/router/helpers.rb +0 -4
  590. data/lib/jets/router/method_creator/code.rb +0 -99
  591. data/lib/jets/router/method_creator/edit.rb +0 -12
  592. data/lib/jets/router/method_creator/generic.rb +0 -11
  593. data/lib/jets/router/method_creator/index.rb +0 -48
  594. data/lib/jets/router/method_creator/new.rb +0 -12
  595. data/lib/jets/router/method_creator/root.rb +0 -15
  596. data/lib/jets/router/method_creator/show.rb +0 -12
  597. data/lib/jets/router/method_creator.rb +0 -50
  598. data/lib/jets/turbo/database_yaml.rb +0 -41
  599. data/lib/jets/turbo/project/.gitignore +0 -12
  600. data/lib/jets/turbo/project/.jetskeep +0 -1
  601. data/lib/jets/turbo/project/Gemfile +0 -16
  602. data/lib/jets/turbo/project/Rakefile +0 -2
  603. data/lib/jets/turbo/project/app/controllers/application_controller.rb +0 -2
  604. data/lib/jets/turbo/project/app/helpers/application_helper.rb +0 -2
  605. data/lib/jets/turbo/project/app/jobs/application_job.rb +0 -4
  606. data/lib/jets/turbo/project/config/application.rb +0 -5
  607. data/lib/jets/turbo/project/config/routes.rb +0 -4
  608. data/lib/jets/turbo/project/config.ru +0 -5
  609. data/lib/jets/turbo/rails.rb +0 -127
  610. data/lib/jets/turbo/templates/config/database.yml +0 -30
  611. data/lib/jets/turbo.rb +0 -56
  612. data/readme/prerelease.md +0 -6
  613. data/readme/testing.md +0 -60
  614. /data/{lib/jets → engines}/internal/app/shared/functions/jets/s3_bucket_config.rb +0 -0
  615. /data/lib/jets/{commands → command}/help/build.md +0 -0
  616. /data/lib/jets/{commands → command}/help/clean/build.md +0 -0
  617. /data/lib/jets/{commands → command}/help/clean/log.md +0 -0
  618. /data/lib/jets/{commands → command}/help/console.md +0 -0
  619. /data/lib/jets/{commands → command}/help/db/generate.md +0 -0
  620. /data/lib/jets/{commands → command}/help/dbconsole.md +0 -0
  621. /data/lib/jets/{commands → command}/help/degenerate.md +0 -0
  622. /data/lib/jets/{commands → command}/help/delete.md +0 -0
  623. /data/lib/jets/{commands → command}/help/generate.md +0 -0
  624. /data/lib/jets/{commands → command}/help/import/rack.md +0 -0
  625. /data/lib/jets/{commands → command}/help/import/rails.md +0 -0
  626. /data/lib/jets/{commands → command}/help/server.md +0 -0
  627. /data/lib/jets/{commands → command}/help/status.md +0 -0
  628. /data/lib/jets/{commands → command}/help/upgrade.md +0 -0
  629. /data/lib/jets/{commands → command}/help/url.md +0 -0
  630. /data/lib/jets/{generator/templates/active_job → generators}/job/templates/application_job.rb.tt +0 -0
  631. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/.rspec +0 -0
  632. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/README.md +0 -0
  633. /data/{.gitmodules → lib/jets/generators/overrides/app/templates/app/assets/images/.keep} +0 -0
  634. /data/lib/jets/{commands/templates/skeleton/db/.gitkeep → generators/overrides/app/templates/app/assets/javascripts/.keep} +0 -0
  635. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/controllers/application_controller.rb +0 -0
  636. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/helpers/application_helper.rb +0 -0
  637. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/jobs/application_job.rb +0 -0
  638. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config.ru +0 -0
  639. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/favicon.ico +0 -0
  640. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/controllers/posts_controller_spec.rb +0 -0
  641. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-index.json +0 -0
  642. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-show.json +0 -0
  643. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/spec_helper.rb.tt +0 -0
  644. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/_form.html.erb +0 -0
  645. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/edit.html.erb +0 -0
  646. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/new.html.erb +0 -0
  647. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/show.html.erb +0 -0
  648. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/javascript.js +0 -0
  649. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/stylesheet.css +0 -0
  650. /data/lib/jets/{generator → generators/overrides}/templates/rails/scaffold/scaffold.css +0 -0
@@ -1,16 +1,13 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Jets::MailersController < Jets::Controller::Base # :nodoc:
4
+ around_action :set_locale, only: :preview
4
5
  before_action :find_preview, only: [:preview]
5
- before_action :set_locale, only: [:preview]
6
- # TODO: allow multiple actions
7
- # before_action :find_preview, :set_locale, only: :preview
6
+ before_action :require_local!, unless: :show_previews?
8
7
 
9
- # TODO: add helper_method support
10
- # helper_method :part_query, :locale_query
8
+ helper_method :part_query, :locale_query
11
9
 
12
- # TODO: content_security_policy
13
- # content_security_policy(false)
10
+ content_security_policy(false)
14
11
 
15
12
  def index
16
13
  @previews = ActionMailer::Preview.all
@@ -20,25 +17,26 @@ class Jets::MailersController < Jets::Controller::Base # :nodoc:
20
17
  def preview
21
18
  if params[:path] == @preview.preview_name
22
19
  @page_title = "Mailer Previews for #{@preview.preview_name}"
23
- render :mailer
20
+ render action: "mailer"
24
21
  else
25
22
  @email_action = File.basename(params[:path])
26
23
 
27
24
  if @preview.email_exists?(@email_action)
25
+ @page_title = "Mailer Preview for #{@preview.preview_name}##{@email_action}"
28
26
  @email = @preview.call(@email_action, params)
29
27
 
30
28
  if params[:part]
31
29
  part_type = Mime::Type.lookup(params[:part])
32
30
 
33
31
  if part = find_part(part_type)
34
- response.headers["Content-Type"] = params[:part]
32
+ response.content_type = part_type
35
33
  render plain: part.respond_to?(:decoded) ? part.decoded : part
36
34
  else
37
35
  raise AbstractController::ActionNotFound, "Email part '#{part_type}' not found in #{@preview.name}##{@email_action}"
38
36
  end
39
37
  else
40
- @part = find_preferred_part(Mime[:html], Mime[:text])
41
- render :email, layout: false, formats: %w[html]
38
+ @part = find_preferred_part(request.format, Mime[:html], Mime[:text])
39
+ render action: "email", layout: false, formats: [:html]
42
40
  end
43
41
  else
44
42
  raise AbstractController::ActionNotFound, "Email '#{@email_action}' not found in #{@preview.name}"
@@ -53,7 +51,7 @@ class Jets::MailersController < Jets::Controller::Base # :nodoc:
53
51
 
54
52
  def find_preview # :doc:
55
53
  candidates = []
56
- params[:path].to_s.scan(%r{/|$}) { candidates << $` } # ` # hack to fix syntax highlighting
54
+ params[:path].to_s.scan(%r{/|$}) { candidates << $` }
57
55
  preview = candidates.detect { |candidate| ActionMailer::Preview.exists?(candidate) }
58
56
 
59
57
  if preview
@@ -91,7 +89,7 @@ class Jets::MailersController < Jets::Controller::Base # :nodoc:
91
89
  request.query_parameters.merge(locale: locale).to_query
92
90
  end
93
91
 
94
- def set_locale
95
- I18n.locale = params[:locale] || I18n.default_locale
92
+ def set_locale(&block)
93
+ I18n.with_locale(params[:locale] || I18n.default_locale, &block)
96
94
  end
97
95
  end
@@ -15,11 +15,8 @@ class Jets::MountController < Jets::BareController
15
15
 
16
16
  status, headers, io = mount_class.call(env)
17
17
  body = read_body(io)
18
- render(
19
- status: status,
20
- headers: headers,
21
- body: body,
22
- )
18
+ self.headers.merge!(headers)
19
+ render body: body, status: status
23
20
  end
24
21
 
25
22
  private
@@ -32,15 +29,14 @@ private
32
29
  result.join
33
30
  end
34
31
 
35
- # Locally Jets::Router::Finder gets called twice because it also gets called in Jets::Controller::Middleware::Local
36
- # On Lambda, Jets::Router::Finder only gets called once.
37
- # TODO: Maybe add caching improvement.
32
+ # Locally Jets::Router::Matcher gets called in Jets::Controller::Middleware::Mimic
33
+ # On Lambda, Jets::Router::Matcher in handlers.
38
34
  def find_route
39
- Jets::Router::Finder.new(event["path"], "ANY").run
35
+ Jets::Router::Matcher.new.find_by_request(request, "ANY")
40
36
  end
41
37
 
42
38
  def build_env(path)
43
- env = Jets::Controller::Rack::Env.new(event, context, adapter: true).convert
39
+ env = Jets::Controller::RackAdapter::Env.new(event, context, adapter: true).convert
44
40
  # remap path info
45
41
  mount_at = mount_at(path)
46
42
  path_info = env["PATH_INFO"]
@@ -3,7 +3,6 @@ require "mini_mime"
3
3
 
4
4
  class Jets::PublicController < Jets::Controller::Base
5
5
  layout false
6
- internal true
7
6
 
8
7
  def show
9
8
  catchall = params[:catchall].blank? ? 'index.html' : params[:catchall]
@@ -25,7 +24,12 @@ class Jets::PublicController < Jets::Controller::Base
25
24
  render file: catchall_path, content_type: content_type
26
25
  end
27
26
  else
28
- render file: "#{public_path}/404", status: 404
27
+ not_found_path = "#{public_path}/404.html"
28
+ if File.exist?(not_found_path)
29
+ render file: not_found_path, status: 404
30
+ else
31
+ render plain: "404 Not Found", status: 404
32
+ end
29
33
  end
30
34
  end
31
35
  end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Jets::WelcomeController < Jets::ApplicationController # :nodoc:
4
+ skip_forgery_protection
5
+ layout false
6
+
7
+ def index
8
+ end
9
+ end
@@ -0,0 +1,109 @@
1
+ begin
2
+ require 'bundler/setup'
3
+ # When require bundler/setup fails, AWS Lambda won't be able to load base_path_mapping
4
+ # So we'll require base_path_mapping within begin/rescue block so that it does not also
5
+ # fail the entire lambda function.
6
+ # require 'jets/internal/app/functions/jets/base_path_mapping'
7
+ require_relative "base_path_mapping"
8
+ rescue Exception => e
9
+ # Note: rescue LoadError is not enough in AWS Lambda environment
10
+ # Actual exceptions:
11
+ # require bundler/setup: Ruby exception "Bundler::GemNotFound"
12
+ # require base_path_mappnig: AWS Lambda reported error "errorType": "Init<LoadError>"
13
+ # Will use a generic rescue Exception though in case error changes in the future.
14
+ puts "WARN: #{e.class} #{e.message}"
15
+ puts <<~EOL
16
+ Could not require bundler/setup.
17
+ This can happen for weird timeout missing error. Example:
18
+
19
+ Could not find timeout-0.3.2 in locally installed gems
20
+
21
+ Happens when the gem command is out-of-date on old versions of ruby 2.7.
22
+ See: https://community.boltops.com/t/could-not-find-timeout-0-3-1-in-any-of-the-sources/996
23
+ EOL
24
+ end
25
+ require 'cfn_response'
26
+
27
+ STAGE_NAME = "<%= @stage_name %>"
28
+
29
+ def lambda_handler(event:, context:)
30
+ cfn = CfnResponse.new(event, context)
31
+ cfn.response do
32
+ # Super edge case: mapping is nil when require bundler/setup fails
33
+ begin
34
+ mapping = BasePathMapping.new(event, STAGE_NAME)
35
+ rescue NameError => e
36
+ puts "ERROR: #{e.class} #{e.message}"
37
+ puts error_message
38
+ end
39
+
40
+ # This is the "second pass" of CloudFormation when it tries to delete the BasePathMapping during rollback
41
+ if mapping.nil? && event['RequestType'] == "Delete"
42
+ cfn.success # so that CloudFormation can continue the delete process from a rollback
43
+ delay
44
+ return
45
+ end
46
+
47
+ # Normal behavior when mapping is not nil when bundler/setup loads successfully
48
+ case event['RequestType']
49
+ when "Create", "Update"
50
+ mapping.update
51
+ when "Delete"
52
+ mapping.delete(true) if mapping.should_delete?
53
+ end
54
+ end
55
+ end
56
+
57
+ def delay
58
+ puts "Delaying 60 seconds to allow user some time to see lambda function logs."
59
+ 60.times do
60
+ puts Time.now
61
+ sleep 1
62
+ end
63
+ end
64
+
65
+ def error_message
66
+ <<~EOL
67
+ This is ultimately the result of require bundler/setup failing to load.
68
+ On the CloudFormation first pass, the BasePathMapping fails to CREATE.
69
+ CloudFormation does a rollback and tries to delete the BasePathMapping.
70
+
71
+ Jets will send a success response to CloudFormation so it can continue and delete
72
+ BasePathMapping on the rollback. Otherwise, CloudFormation ends up in the terminal
73
+ UPDATE_FAILED state and the CloudFormation console provides 3 options:
74
+
75
+ 1) retry 2) update 3) rollback.
76
+
77
+ The only option that seems to work is rollback to get it out of UPDATE_FAILED to
78
+ UPDATE_ROLLBACK_COMPLETE. But then, if we `jets deploy` again without fixing the
79
+ require bundler/setup issue, we'll end back up in the UPDATE_FAILED state.
80
+
81
+ Will handle this error so we can continue the stack because we do not want it to fail
82
+ and never be able to send the CfnResponse. Then we have to wait hours for a CloudFormation timeout.
83
+ Sometimes deleting the APP-dev-ApiDeployment20230518230443-EXAMPLEY8YQP0 stack
84
+ allows the cloudformation stacks to continue, but usually, it'll only just slightly speed up the rollback.
85
+
86
+ Some examples of actual rollback times:
87
+
88
+ When left alone, the rollback takes about 2.5 hours.
89
+
90
+ 2023-05-19 05:39:25 User Initiated
91
+ 2023-05-19 08:01:48 UPDATE_ROLLBACK_COMPLETE
92
+
93
+ When deleting the APP-dev-ApiDeployment20230518230443-EXAMPLEY8YQP0 stack, it takes about 1.5 hours.
94
+
95
+ 2023-05-19 06:25:41 User Initiated
96
+ 2023-05-19 07:47:03 UPDATE_ROLLBACK_COMPLETE
97
+
98
+ Rescuing and handling the error here allows the CloudFormation stack to continue and finish the rollback process.
99
+ It takes the rollback time down to about 3 minutes. Example:
100
+
101
+ 2023-05-19 16:34:19 User Initiated
102
+ 2023-05-19 16:37:34 UPDATE_ROLLBACK_COMPLETE
103
+
104
+ Note: The first cloudformation CREATE pass sends FAILED Status to CloudFormation,
105
+ and the second cloudformation DELETE pass sends SUCCESS Status to CloudFormation.
106
+
107
+ Related: https://community.boltops.com/t/could-not-find-timeout-0-3-1-in-any-of-the-sources/996
108
+ EOL
109
+ end
@@ -0,0 +1,191 @@
1
+ require 'aws-sdk-apigateway'
2
+ require 'aws-sdk-cloudformation'
3
+
4
+ class BasePathMapping
5
+ def initialize(event, stage_name)
6
+ @event, @stage_name = event, stage_name
7
+ aws_config_update!
8
+ end
9
+
10
+ # Override the AWS retry settings. The aws-sdk-core has expondential backup with this formula:
11
+ #
12
+ # 2 ** c.retries * c.config.retry_base_delay
13
+ #
14
+ # So the max delay will be 2 ** 7 * 0.6 = 76.8s
15
+ #
16
+ # Useful links:
17
+ #
18
+ # https://github.com/aws/aws-sdk-ruby/blob/master/gems/aws-sdk-core/lib/aws-sdk-core/plugins/retry_errors.rb
19
+ # https://docs.aws.amazon.com/apigateway/latest/developerguide/limits.html
20
+ #
21
+ def aws_config_update!
22
+ Aws.config.update(
23
+ retry_limit: 7, # default: 3
24
+ retry_base_delay: 0.6, # default: 0.3
25
+ )
26
+ end
27
+
28
+ # Cannot use update_base_path_mapping to update the base_mapping because it doesnt
29
+ # allow us to change the rest_api_id. So we delete and create.
30
+ def update
31
+ puts "BasePathMapping update"
32
+ if rest_api_changed?
33
+ delete(true)
34
+ create
35
+ else
36
+ puts "BasePathMapping update: rest_api_id #{rest_api_id} did not change. Skipping."
37
+ end
38
+
39
+ puts "BasePathMapping update complete"
40
+ end
41
+
42
+ def rest_api_changed?
43
+ puts "BasePathMapping checking if rest_api_id changed"
44
+ mapping = current_base_path_mapping
45
+ return true unless mapping
46
+ mapping.rest_api_id != rest_api_id
47
+ end
48
+
49
+ def current_base_path_mapping
50
+ resp = apigateway.get_base_path_mapping(base_path: "(none)", domain_name: domain_name)
51
+ rescue Aws::APIGateway::Errors::NotFoundException
52
+ return nil
53
+ end
54
+
55
+ # Dont delete the newly created base path mapping unless this is an operation
56
+ # where we're fully deleting the stack
57
+ def should_delete?
58
+ deleting_parent?
59
+ end
60
+
61
+ def delete(fail_silently=false)
62
+ puts "BasePathMapping delete"
63
+ options = {
64
+ domain_name: domain_name, # required
65
+ base_path: base_path.empty? ? '(none)' : base_path,
66
+ }
67
+ puts "BasePathMapping delete options #{options.inspect}"
68
+ apigateway.delete_base_path_mapping(options)
69
+ wait_for_delete
70
+ puts "BasePathMapping delete complete"
71
+ # https://github.com/tongueroo/jets/issues/255
72
+ # Used to return: Aws::APIGateway::Errors::NotFoundException
73
+ # Now returns: Aws::APIGateway::Errors::InternalFailure
74
+ # So we'll use a more generic error
75
+ rescue Aws::APIGateway::Errors::ServiceError => e
76
+ raise(e) unless fail_silently
77
+ end
78
+
79
+ # Wait for deletion to complete
80
+ # Otherwise, CloudFormation continues too fast during a `jets delete`
81
+ # and the initially fails deletion. CloudFormaton then retries until it's successfully.
82
+ # The stack ultimately finishes deleting successfully but the error messages
83
+ # are confusing to the user.
84
+ def wait_for_delete
85
+ loop do
86
+ resp = apigateway.get_base_path_mapping(
87
+ domain_name: domain_name,
88
+ base_path: base_path.empty? ? '(none)' : base_path,
89
+ )
90
+ break if resp.nil? || resp.empty?
91
+ sleep(5)
92
+ end
93
+ rescue Aws::APIGateway::Errors::NotFoundException
94
+ nil
95
+ end
96
+
97
+ def create
98
+ puts "BasePathMapping create"
99
+ options = {
100
+ domain_name: domain_name, # required
101
+ base_path: base_path,
102
+ rest_api_id: rest_api_id, # required
103
+ stage: @stage_name,
104
+ }
105
+ puts "BasePathMapping create options #{options.inspect}"
106
+ apigateway.create_base_path_mapping(options)
107
+ puts "BasePathMapping create complete"
108
+ rescue Aws::APIGateway::Errors::ServiceError => e
109
+ puts "ERROR: #{e.class}: #{e.message}"
110
+ puts "BasePathMapping create failed"
111
+ if e.message.include?("Invalid domain name identifier specified")
112
+ puts <<~EOL
113
+ This super edge case error seems to happen when the cloudformation stack does a rollback
114
+ because the BasePathMapping custom resource fails. This has happened with a strange combination of
115
+ ruby 2.7 and the timeout gem not being picked up in the AWS Lambda runtime environment
116
+ Specifically, when jets deploy was used with a rubygems install that is out-of-date.
117
+ See: https://community.boltops.com/t/could-not-find-timeout-0-3-1-in-any-of-the-sources/996
118
+
119
+ The new base path mapping is not created correctly and the old base path mapping is not properly deleted.
120
+ The old ghost base mapping interferes with the new base path mapping.
121
+ The workaround solution seems to require removing all the config.domain settings and deploying again. Example:
122
+
123
+ config/application.rb
124
+
125
+ config.domain.cert_arn = "arn:aws:acm:us-west-2:111111111111:certificate/EXAMPLE1-a3de-4fe7-b72e-4cc153c5303e"
126
+ config.domain.hosted_zone_name = "example.com"
127
+
128
+ Comment out those settings, deploy, then uncomment and deploy again.
129
+ If there's a better workaround, please let us know.
130
+ EOL
131
+ end
132
+ raise(e)
133
+ end
134
+
135
+ def mapping_stack
136
+ @mapping_stack ||= cfn.describe_stacks(stack_name: @event['StackId']).stacks.first
137
+ end
138
+
139
+ def rest_api_id
140
+ @rest_api_id ||= parameter_value('RestApi')
141
+ end
142
+
143
+ def domain_name
144
+ @domain_name ||= parameter_value('DomainName')
145
+ end
146
+
147
+ def base_path
148
+ @base_path ||= parameter_value('BasePath') || ''
149
+ end
150
+
151
+ def parameter_value(parameter_key)
152
+ puts "mapping_stack #{mapping_stack.inspect}"
153
+ param = mapping_stack[:parameters].find { |p| p.parameter_key == parameter_key }
154
+ param&.parameter_value # possible for this to be nil when removing the config: IE: config.domain.name = nil
155
+ end
156
+
157
+ def deleting_parent?
158
+ stack = cfn.describe_stacks(stack_name: parent_stack_name).stacks.first
159
+ stack.stack_status == 'DELETE_IN_PROGRESS'
160
+ end
161
+
162
+ def parent_stack_name
163
+ mapping_stack[:root_id]
164
+ end
165
+
166
+ def apigateway
167
+ @apigateway ||= Aws::APIGateway::Client.new(aws_options)
168
+ end
169
+
170
+ def cfn
171
+ @cfn ||= Aws::CloudFormation::Client.new(aws_options)
172
+ end
173
+
174
+ def aws_options
175
+ options = {
176
+ retry_limit: 7, # default: 3
177
+ retry_base_delay: 0.6, # default: 0.3
178
+ }
179
+ options.merge!(
180
+ log_level: :debug,
181
+ logger: Logger.new($stdout),
182
+ ) if ENV['JETS_DEBUG_AWS_SDK']
183
+ options
184
+ end
185
+ end
186
+
187
+ if __FILE__ == $0
188
+ event = JSON.load(File.read(ARGV[0]))
189
+ stage_name = 'dev' # change to test
190
+ BasePathMapping.new(event, stage_name).update
191
+ end
@@ -0,0 +1,68 @@
1
+ class Jets::PreheatJob < Jets::Job::Base
2
+ include Jets::AwsServices
3
+
4
+ class_timeout 30
5
+ class_memory 1024
6
+ class_iam_policy([
7
+ {
8
+ Sid: "Statement1",
9
+ Action: ["logs:*"],
10
+ Effect: "Allow",
11
+ Resource: [{
12
+ "Fn::Sub": "arn:aws:logs:${AWS::Region}:${AWS::AccountId}:log-group:/aws/lambda/${JetsPreheatJobWarmLambdaFunction}"
13
+ }]
14
+ },
15
+ {
16
+ Sid: "Statement2",
17
+ Action: ["lambda:InvokeFunction", "lambda:InvokeAsync"],
18
+ Effect: "Allow",
19
+ Resource: [{
20
+ "Fn::Sub": "arn:aws:lambda:${AWS::Region}:${AWS::AccountId}:function:#{Jets.project_namespace}-*"
21
+ }]
22
+ }
23
+ ])
24
+
25
+ rate(Jets.config.prewarm.rate) if Jets.config.prewarm.enable
26
+ def warm
27
+ options = call_options(event[:quiet])
28
+ Jets::Preheat.warm_all(options)
29
+ "Finished prewarming your application."
30
+ end
31
+
32
+ class << self
33
+ # Can use this to prewarm post deploy
34
+ def prewarm!
35
+ perform_now(:warm, quiet: true)
36
+ end
37
+ end
38
+
39
+ private
40
+ # Usually: jets-preheat_job-warm unless JETS_RESET=1, in that case need to lookup the function name
41
+ def warm_function_name
42
+ # Return early to avoid lookup call normally
43
+ return "jets-preheat_job-warm" unless ENV['JETS_RESET'] == "1"
44
+
45
+ parent_stack = cfn.describe_stack_resources(stack_name: Jets::Names.parent_stack_name)
46
+ preheat_stack = parent_stack.stack_resources.find do |resource|
47
+ resource.logical_resource_id =~ /JetsPreheatJob/
48
+ end
49
+
50
+ resp = cfn.describe_stack_resources(stack_name: preheat_stack.physical_resource_id)
51
+ resources = resp.stack_resources
52
+ warm_function = resources.find do |resource|
53
+ resource.logical_resource_id =~ /WarmLambdaFunction/
54
+ end
55
+ warm_function.physical_resource_id # IE: jets-preheat_job-warm
56
+ end
57
+
58
+ def call_options(quiet)
59
+ options = {}
60
+ options.merge!(mute: true, mute_output: true) if quiet
61
+ # All the methods in this Job class leads to Jets::Commands::Call.
62
+ # This is true for the Jets::Preheat.warm_all also.
63
+ # These jobs delegate out to Lambda function calls. We do not need/want
64
+ # the invocation type: RequestResponse in this case.
65
+ options.merge!(invocation_type: "Event")
66
+ options
67
+ end
68
+ end
@@ -0,0 +1 @@
1
+ <%= @info.html_safe %>
@@ -0,0 +1,10 @@
1
+ <h2>
2
+ Routes
3
+ </h2>
4
+
5
+ <p>
6
+ Routes match in priority from top to bottom
7
+ </p>
8
+
9
+ <%# @routes_inspector.format(ActionDispatch::Routing::HtmlTableFormatter.new(self)) %>
10
+ <%= raw @routes_table %>
@@ -1,5 +1,6 @@
1
1
  <!DOCTYPE html>
2
2
  <html><head>
3
+ <title><%= @page_title %></title>
3
4
  <meta name="viewport" content="width=device-width" />
4
5
  <style type="text/css">
5
6
  html, body, iframe {
@@ -55,35 +56,35 @@
55
56
  <dl>
56
57
  <% if @email.respond_to?(:smtp_envelope_from) && Array(@email.from) != Array(@email.smtp_envelope_from) %>
57
58
  <dt>SMTP-From:</dt>
58
- <dd><%= @email.smtp_envelope_from %></dd>
59
+ <dd id="smtp_from"><%= @email.smtp_envelope_from %></dd>
59
60
  <% end %>
60
61
 
61
62
  <% if @email.respond_to?(:smtp_envelope_to) && @email.to != @email.smtp_envelope_to %>
62
63
  <dt>SMTP-To:</dt>
63
- <dd><%= @email.smtp_envelope_to %></dd>
64
+ <dd id="smtp_to"><%= @email.smtp_envelope_to %></dd>
64
65
  <% end %>
65
66
 
66
67
  <dt>From:</dt>
67
- <dd><%= @email.header['from'] %></dd>
68
+ <dd id="from"><%= @email.header['from'] %></dd>
68
69
 
69
70
  <% if @email.reply_to %>
70
71
  <dt>Reply-To:</dt>
71
- <dd><%= @email.header['reply-to'] %></dd>
72
+ <dd id="reply_to"><%= @email.header['reply-to'] %></dd>
72
73
  <% end %>
73
74
 
74
75
  <dt>To:</dt>
75
- <dd><%= @email.header['to'] %></dd>
76
+ <dd id="to"><%= @email.header['to'] %></dd>
76
77
 
77
78
  <% if @email.cc %>
78
79
  <dt>CC:</dt>
79
- <dd><%= @email.header['cc'] %></dd>
80
+ <dd id="cc"><%= @email.header['cc'] %></dd>
80
81
  <% end %>
81
82
 
82
83
  <dt>Date:</dt>
83
- <dd><%= Time.current.rfc2822 %></dd>
84
+ <dd id="date"><%= Time.current.rfc2822 %></dd>
84
85
 
85
86
  <dt>Subject:</dt>
86
- <dd><strong><%= @email.subject %></strong></dd>
87
+ <dd><strong id="subject"><%= @email.subject %></strong></dd>
87
88
 
88
89
  <% unless @email.attachments.nil? || @email.attachments.empty? %>
89
90
  <dt>Attachments:</dt>
@@ -96,15 +97,17 @@
96
97
  <% end %>
97
98
 
98
99
  <dt>Format:</dt>
99
- <% if @email.multipart? %>
100
+ <% if @email.html_part && @email.text_part %>
100
101
  <dd>
101
102
  <select id="part" onchange="refreshBody(false);">
102
103
  <option <%= request.format == Mime[:html] ? 'selected' : '' %> value="<%= part_query('text/html') %>">View as HTML email</option>
103
104
  <option <%= request.format == Mime[:text] ? 'selected' : '' %> value="<%= part_query('text/plain') %>">View as plain-text email</option>
104
105
  </select>
105
106
  </dd>
107
+ <% elsif @part %>
108
+ <dd id="mime_type" data-mime-type="<%= part_query(@part.mime_type) %>"><%= @part.mime_type == 'text/html' ? 'HTML email' : 'plain-text email' %></dd>
106
109
  <% else %>
107
- <dd id="mime_type" data-mime-type="<%= part_query(@email.mime_type) %>"><%= @email.mime_type == 'text/html' ? 'HTML email' : 'plain-text email' %></dd>
110
+ <dd id="mime_type" data-mime-type=""></dd>
108
111
  <% end %>
109
112
 
110
113
  <% if I18n.available_locales.count > 1 %>
@@ -120,7 +123,14 @@
120
123
  </dl>
121
124
  </header>
122
125
 
123
- <iframe seamless name="messageBody" src="?part=<%= part_query(@part.mime_type) %>"></iframe>
126
+ <% if @part && @part.mime_type %>
127
+ <iframe name="messageBody" src="?<%= part_query(@part.mime_type) %>"></iframe>
128
+ <% else %>
129
+ <p>
130
+ You are trying to preview an email that does not have any content.
131
+ This is probably because the <em>mail</em> method has not been called in <em><%= @preview.preview_name %>#<%= @email_action %></em>.
132
+ </p>
133
+ <% end %>
124
134
 
125
135
  <script>
126
136
  function refreshBody(reload) {
@@ -130,14 +140,24 @@
130
140
  var part_param = part_select ?
131
141
  part_select.options[part_select.selectedIndex].value :
132
142
  document.querySelector('#mime_type').dataset.mimeType;
133
- var fresh_location = '?part=' + part_param;
134
- var doc = iframe.contentWindow.document;
143
+ var locale_param = locale_select ? locale_select.options[locale_select.selectedIndex].value : null;
144
+ var fresh_location;
145
+ if (locale_param) {
146
+ fresh_location = '?' + part_param + '&' + locale_param;
147
+ } else {
148
+ fresh_location = '?' + part_param;
149
+ }
150
+ iframe.contentWindow.location = fresh_location;
135
151
 
136
- doc.open();
137
- doc.write("Loading...");
138
- doc.close();
152
+ var url = location.pathname.replace(/\.(txt|html)$/, '');
153
+ var format = /html/.test(part_param) ? '.html' : '.txt';
154
+ var state_to_replace = locale_param ? (url + format + '?' + locale_param) : (url + format);
139
155
 
140
- iframe.contentWindow.location = fresh_location;
156
+ if (reload) {
157
+ location.href = state_to_replace;
158
+ } else if (history.replaceState) {
159
+ window.history.replaceState({}, '', state_to_replace);
160
+ }
141
161
  }
142
162
  </script>
143
163
 
@@ -0,0 +1,8 @@
1
+ <% @previews.each do |preview| %>
2
+ <h3><%= link_to preview.preview_name.titleize, url_for(controller: "jets/mailers", action: "preview", path: preview.preview_name) %></h3>
3
+ <ul>
4
+ <% preview.emails.each do |email| %>
5
+ <li><%= link_to email, url_for(controller: "jets/mailers", action: "preview", path: "#{preview.preview_name}/#{email}") %></li>
6
+ <% end %>
7
+ </ul>
8
+ <% end %>
@@ -0,0 +1,6 @@
1
+ <h3><%= @preview.preview_name.titleize %></h3>
2
+ <ul>
3
+ <% @preview.emails.each do |email| %>
4
+ <li><%= link_to email, url_for(controller: "jets/mailers", action: "preview", path: "#{@preview.preview_name}/#{email}") %></li>
5
+ <% end %>
6
+ </ul>
@@ -79,12 +79,16 @@
79
79
  $ open http://localhost:8888/posts
80
80
  $ jets help
81
81
  </code></pre></div>
82
- <p>More on info: <a href="http://rubyonjets.com">rubyonjets.com</a></p>
83
- <p>Also check out the <a href="http://rubyonjets.com/reference">Jets CLI reference</a>.</p>
82
+ <p>Docs on: <a href="http://rubyonjets.com">rubyonjets.com</a></p>
83
+ <p>CLI: <a href="http://rubyonjets.com/reference">Jets CLI reference</a></p>
84
+ <p>Jets Info: <%= link_to "Properties", controller: "jets/info", action: "properties" %></p>
85
+ <p>Jets Info: <%= link_to "Routes", controller: "jets/info", action: "routes" %></p>
84
86
  </div>
85
87
  <p class="version">
86
- <strong>Jets version:</strong> <%= Jets.version %><br />
87
- <strong>Ruby version:</strong> <%= RUBY_VERSION %>
88
+ <ul>
89
+ <li><strong>Jets version:</strong> <%= Jets.version %></li>
90
+ <li><strong>Ruby version:</strong> <%= RUBY_DESCRIPTION %></li>
91
+ </ul>
88
92
  </p>
89
93
  </div>
90
94
  </body>