jets 4.0.10 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -1
  3. data/CHANGELOG.md +53 -0
  4. data/Gemfile +1 -5
  5. data/LICENSE.txt +1 -1
  6. data/README.md +20 -36
  7. data/Rakefile +3 -3
  8. data/engines/internal/app/controllers/jets/application_controller.rb +28 -0
  9. data/engines/internal/app/controllers/jets/bare_controller.rb +6 -0
  10. data/engines/internal/app/controllers/jets/health_controller.rb +55 -0
  11. data/engines/internal/app/controllers/jets/info_controller.rb +45 -0
  12. data/{lib/jets → engines}/internal/app/controllers/jets/mailers_controller.rb +12 -14
  13. data/{lib/jets → engines}/internal/app/controllers/jets/mount_controller.rb +6 -10
  14. data/{lib/jets → engines}/internal/app/controllers/jets/public_controller.rb +6 -2
  15. data/engines/internal/app/controllers/jets/welcome_controller.rb +9 -0
  16. data/{lib/jets → engines}/internal/app/functions/jets/base_path.rb +2 -1
  17. data/{lib/jets → engines}/internal/app/functions/jets/base_path_mapping.rb +26 -6
  18. data/engines/internal/app/jobs/jets/preheat_job.rb +67 -0
  19. data/engines/internal/app/views/jets/info/properties.html.erb +1 -0
  20. data/engines/internal/app/views/jets/info/routes.html.erb +10 -0
  21. data/{lib/jets → engines}/internal/app/views/jets/mailers/email.html.erb +37 -17
  22. data/engines/internal/app/views/jets/mailers/index.html.erb +8 -0
  23. data/engines/internal/app/views/jets/mailers/mailer.html.erb +6 -0
  24. data/{lib/jets/commands/templates/skeleton/public/index.html.tt → engines/internal/app/views/jets/welcome/index.html.erb} +8 -4
  25. data/engines/internal/app/views/layouts/application.html.erb +51 -0
  26. data/engines/internal/lib/internal/actiondispatch.rb +39 -0
  27. data/engines/internal/lib/internal/actionmailer.rb +51 -0
  28. data/engines/internal/lib/internal/actionview.rb +152 -0
  29. data/engines/internal/lib/internal/activerecord.rb +37 -0
  30. data/engines/internal/lib/internal/activesupport.rb +47 -0
  31. data/engines/internal/lib/internal/engine.rb +13 -0
  32. data/engines/internal/lib/internal/i18n_engine.rb +19 -0
  33. data/engines/internal/lib/internal/jets_controller.rb +46 -0
  34. data/engines/internal/lib/internal/overrides/debug_exceptions.rb +40 -0
  35. data/engines/internal/lib/internal/templates/rescues/_trace.html.erb +62 -0
  36. data/engines/internal/lib/internal/templates/rescues/_trace.text.erb +9 -0
  37. data/engines/internal/lib/internal/turbines/asset_tag_helper.rb +70 -0
  38. data/engines/internal/lib/internal/turbines/helpers.rb +18 -0
  39. data/engines/internal/lib/internal/turbines/routes_helpers.rb +42 -0
  40. data/exe/jets +1 -10
  41. data/jets.gemspec +14 -11
  42. data/lib/jets/app_loader.rb +77 -0
  43. data/lib/jets/application/bootstrap.rb +100 -0
  44. data/lib/jets/application/configuration/defaults.rb +256 -0
  45. data/lib/jets/application/configuration.rb +494 -0
  46. data/lib/jets/application/default_middleware_stack.rb +140 -0
  47. data/lib/jets/application/dummy_erb_compiler.rb +18 -0
  48. data/lib/jets/application/finisher.rb +266 -0
  49. data/lib/jets/application/routes_reloader.rb +80 -0
  50. data/lib/jets/application.rb +515 -198
  51. data/lib/jets/authorizer/base.rb +1 -0
  52. data/lib/jets/authorizer/dsl.rb +15 -11
  53. data/lib/jets/authorizer/helpers/iam_helper.rb +13 -11
  54. data/lib/jets/autoloaders/gem.rb +70 -0
  55. data/lib/jets/autoloaders/inflector.rb +21 -0
  56. data/lib/jets/autoloaders.rb +38 -101
  57. data/lib/jets/aws_services/stack_status.rb +1 -1
  58. data/lib/jets/backtrace_cleaner.rb +27 -0
  59. data/lib/jets/booter.rb +29 -176
  60. data/lib/jets/builders/code_builder.rb +45 -117
  61. data/lib/jets/builders/code_size.rb +1 -0
  62. data/lib/jets/builders/gem_replacer.rb +5 -6
  63. data/lib/jets/builders/handler_generator.rb +34 -14
  64. data/lib/jets/builders/lambda_layer.rb +2 -7
  65. data/lib/jets/builders/purger.rb +1 -1
  66. data/lib/jets/builders/rack_packager.rb +1 -1
  67. data/lib/jets/builders/ruby_packager.rb +17 -6
  68. data/lib/jets/builders/shim_vars/app.rb +10 -6
  69. data/lib/jets/builders/templates/handlers/one_lambda_for_all_controllers.rb +33 -0
  70. data/lib/jets/builders/templates/handlers/one_lambda_per_controller.rb +20 -0
  71. data/lib/jets/builders/templates/{handler.rb → handlers/one_lambda_per_method.rb} +6 -0
  72. data/lib/jets/bundle.rb +2 -9
  73. data/lib/jets/cfn/base.rb +82 -0
  74. data/lib/jets/cfn/builder/api/base.rb +12 -0
  75. data/lib/jets/cfn/{builders/api_deployment_builder.rb → builder/api/deployment.rb} +10 -20
  76. data/lib/jets/cfn/{builders/api_gateway_builder.rb → builder/api/gateway.rb} +14 -37
  77. data/lib/jets/cfn/builder/api/mapping.rb +54 -0
  78. data/lib/jets/cfn/builder/api/methods.rb +72 -0
  79. data/lib/jets/cfn/builder/api/paged.rb +30 -0
  80. data/lib/jets/cfn/builder/api/pages/base.rb +105 -0
  81. data/lib/jets/cfn/builder/api/pages/methods.rb +17 -0
  82. data/lib/jets/cfn/builder/api/pages/page.rb +19 -0
  83. data/lib/jets/cfn/builder/api/pages/resources.rb +21 -0
  84. data/lib/jets/cfn/builder/api/resources.rb +40 -0
  85. data/lib/jets/cfn/{builders/authorizer_builder.rb → builder/authorizer.rb} +16 -19
  86. data/lib/jets/cfn/builder/controller.rb +28 -0
  87. data/lib/jets/cfn/builder/function.rb +9 -0
  88. data/lib/jets/cfn/{builders → builder}/interface.rb +45 -51
  89. data/lib/jets/cfn/builder/job.rb +10 -0
  90. data/lib/jets/cfn/builder/nested.rb +130 -0
  91. data/lib/jets/cfn/builder/one_controller.rb +53 -0
  92. data/lib/jets/cfn/{builders/parent_builder → builder/parent}/stagger.rb +1 -1
  93. data/lib/jets/cfn/{builders/parent_builder.rb → builder/parent.rb} +54 -54
  94. data/lib/jets/cfn/builder/post_process.rb +25 -0
  95. data/lib/jets/cfn/{builders/rule_builder.rb → builder/rule.rb} +4 -8
  96. data/lib/jets/cfn/{builders/shared_builder.rb → builder/shared.rb} +4 -3
  97. data/lib/jets/cfn/{builders → builder}/util/source.rb +1 -1
  98. data/lib/jets/{commands/build.rb → cfn/builder.rb} +50 -78
  99. data/lib/jets/cfn/deployment.rb +45 -0
  100. data/lib/jets/cfn/download.rb +39 -0
  101. data/lib/jets/cfn/params/api/base.rb +39 -0
  102. data/lib/jets/cfn/params/api/cors.rb +10 -0
  103. data/lib/jets/cfn/params/api/methods.rb +69 -0
  104. data/lib/jets/cfn/params/api/resources.rb +28 -0
  105. data/lib/jets/{resource/child_stack/common_parameters.rb → cfn/params/common.rb} +3 -3
  106. data/lib/jets/{resource → cfn/resource}/api_gateway/authorizer.rb +21 -21
  107. data/lib/jets/cfn/resource/api_gateway/base_path/function.rb +57 -0
  108. data/lib/jets/{resource → cfn/resource}/api_gateway/base_path/mapping.rb +13 -12
  109. data/lib/jets/cfn/resource/api_gateway/base_path/role.rb +70 -0
  110. data/lib/jets/{resource → cfn/resource}/api_gateway/deployment.rb +13 -20
  111. data/lib/jets/{resource → cfn/resource}/api_gateway/domain_name.rb +11 -11
  112. data/lib/jets/{resource → cfn/resource}/api_gateway/method/authorization.rb +1 -1
  113. data/lib/jets/cfn/resource/api_gateway/method.rb +92 -0
  114. data/lib/jets/{resource → cfn/resource}/api_gateway/resource.rb +14 -10
  115. data/lib/jets/cfn/resource/api_gateway/resource_id.rb +25 -0
  116. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/change_detection.rb +1 -1
  117. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id/message.rb +1 -1
  118. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/logical_id.rb +1 -1
  119. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/base.rb +5 -3
  120. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/media_types.rb +2 -2
  121. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/page.rb +5 -5
  122. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/to.rb +8 -3
  123. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/change/variable.rb +2 -2
  124. data/lib/jets/cfn/resource/api_gateway/rest_api/routes/change.rb +27 -0
  125. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision/variable_exception.rb +1 -1
  126. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes/collision.rb +1 -1
  127. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api/routes.rb +1 -1
  128. data/lib/jets/{resource → cfn/resource}/api_gateway/rest_api.rb +12 -12
  129. data/lib/jets/{resource → cfn/resource}/associated.rb +1 -1
  130. data/lib/jets/{resource → cfn/resource}/config/config_rule.rb +18 -18
  131. data/lib/jets/{resource → cfn/resource}/config/managed_rule.rb +5 -5
  132. data/lib/jets/{resource → cfn/resource}/events/rule.rb +10 -10
  133. data/lib/jets/{resource → cfn/resource}/iam/application_role.rb +4 -4
  134. data/lib/jets/{resource → cfn/resource}/iam/base_role_definition.rb +15 -15
  135. data/lib/jets/{resource → cfn/resource}/iam/class_role.rb +5 -5
  136. data/lib/jets/{resource → cfn/resource}/iam/function_role.rb +6 -6
  137. data/lib/jets/{resource → cfn/resource}/iam/managed_policy.rb +1 -1
  138. data/lib/jets/{resource → cfn/resource}/iam/policy.rb +8 -8
  139. data/lib/jets/{resource → cfn/resource}/iam/policy_document.rb +10 -9
  140. data/lib/jets/{resource → cfn/resource}/iot/topic_rule.rb +10 -10
  141. data/lib/jets/{resource → cfn/resource}/lambda/event_source_mapping.rb +9 -9
  142. data/lib/jets/cfn/resource/lambda/function/controller.rb +21 -0
  143. data/lib/jets/{resource → cfn/resource}/lambda/function/environment.rb +4 -5
  144. data/lib/jets/cfn/resource/lambda/function.rb +266 -0
  145. data/lib/jets/{resource → cfn/resource}/lambda/gem_layer.rb +2 -2
  146. data/lib/jets/{resource → cfn/resource}/lambda/layer_version.rb +10 -10
  147. data/lib/jets/cfn/resource/lambda/permission.rb +51 -0
  148. data/lib/jets/cfn/resource/logs/subscription_filter.rb +31 -0
  149. data/lib/jets/cfn/resource/nested/api/base.rb +4 -0
  150. data/lib/jets/cfn/resource/nested/api/deployment.rb +53 -0
  151. data/lib/jets/cfn/resource/nested/api/gateway.rb +15 -0
  152. data/lib/jets/cfn/resource/nested/api/mapping.rb +33 -0
  153. data/lib/jets/cfn/resource/nested/api/methods.rb +30 -0
  154. data/lib/jets/cfn/resource/nested/api/page.rb +8 -0
  155. data/lib/jets/cfn/resource/nested/api/resources.rb +22 -0
  156. data/lib/jets/{resource/child_stack → cfn/resource/nested}/app_class.rb +15 -48
  157. data/lib/jets/{resource/child_stack → cfn/resource/nested}/authorizer.rb +8 -14
  158. data/lib/jets/cfn/resource/nested/base.rb +38 -0
  159. data/lib/jets/cfn/resource/nested/one_controller.rb +48 -0
  160. data/lib/jets/{resource/child_stack → cfn/resource/nested}/shared.rb +10 -16
  161. data/lib/jets/cfn/resource/one/function.rb +66 -0
  162. data/lib/jets/cfn/resource/one/permission.rb +17 -0
  163. data/lib/jets/{resource → cfn/resource}/replacer.rb +26 -27
  164. data/lib/jets/{resource → cfn/resource}/route53/record_set.rb +18 -18
  165. data/lib/jets/{resource → cfn/resource}/s3/bucket.rb +4 -4
  166. data/lib/jets/cfn/resource/s3/jets_bucket.rb +68 -0
  167. data/lib/jets/{resource → cfn/resource}/sns/subscription.rb +8 -8
  168. data/lib/jets/{resource → cfn/resource}/sns/topic.rb +10 -10
  169. data/lib/jets/{resource → cfn/resource}/sns/topic_policy.rb +13 -13
  170. data/lib/jets/{resource → cfn/resource}/sqs/queue.rb +5 -5
  171. data/lib/jets/{resource → cfn/resource}/standardizer.rb +8 -9
  172. data/lib/jets/cfn/resource.rb +8 -0
  173. data/lib/jets/cfn/ship.rb +20 -19
  174. data/lib/jets/cfn/template.rb +89 -0
  175. data/lib/jets/cfn/upload.rb +26 -23
  176. data/lib/jets/cli.rb +28 -210
  177. data/lib/jets/command/actions.rb +49 -0
  178. data/lib/jets/command/api_helpers.rb +41 -0
  179. data/lib/jets/command/aws_helpers.rb +26 -0
  180. data/lib/jets/command/base.rb +204 -0
  181. data/lib/jets/command/behavior.rb +83 -0
  182. data/lib/jets/command/environment_argument.rb +42 -0
  183. data/lib/jets/command/help/call.md +48 -0
  184. data/lib/jets/{commands → command}/help/deploy.md +1 -1
  185. data/lib/jets/command/help/logs.md +21 -0
  186. data/lib/jets/{commands → command}/help/new.md +3 -4
  187. data/lib/jets/command/help/projects.md +6 -0
  188. data/lib/jets/command/help/releases.md +37 -0
  189. data/lib/jets/command/help/rollback.md +5 -0
  190. data/lib/jets/command/help/routes.md +15 -0
  191. data/lib/jets/command/help/stacks.md +6 -0
  192. data/lib/jets/command/help.rb +17 -0
  193. data/lib/jets/command/helpers/editor.rb +35 -0
  194. data/lib/jets/command.rb +133 -0
  195. data/lib/jets/commands/application/application_command.rb +40 -0
  196. data/lib/jets/commands/build/build_command.rb +33 -0
  197. data/lib/jets/commands/call/anonymous_guesser.rb +1 -1
  198. data/lib/jets/commands/call/autoload_guesser.rb +2 -2
  199. data/lib/jets/commands/call/base_guesser.rb +4 -4
  200. data/lib/jets/commands/call/call_command.rb +27 -0
  201. data/lib/jets/commands/call/caller.rb +184 -0
  202. data/lib/jets/commands/call/guesser.rb +1 -1
  203. data/lib/jets/commands/clean/base.rb +1 -1
  204. data/lib/jets/commands/clean/build.rb +1 -1
  205. data/lib/jets/commands/clean/clean_command.rb +15 -0
  206. data/lib/jets/commands/clean/log.rb +1 -1
  207. data/lib/jets/commands/configure/configure_command.rb +9 -0
  208. data/lib/jets/commands/console/console_command.rb +38 -0
  209. data/lib/jets/commands/credentials/USAGE +103 -0
  210. data/lib/jets/commands/credentials/credentials_command/diffing.rb +51 -0
  211. data/lib/jets/commands/credentials/credentials_command.rb +139 -0
  212. data/lib/jets/commands/db/system/change/change_command.rb +24 -0
  213. data/lib/jets/commands/dbconsole/dbconsole_command.rb +184 -0
  214. data/lib/jets/commands/degenerate/degenerate_command.rb +21 -0
  215. data/lib/jets/commands/delete/delete_command.rb +155 -0
  216. data/lib/jets/commands/{deploy.rb → deploy/deploy_command.rb} +28 -47
  217. data/lib/jets/commands/dev/dev_command.rb +19 -0
  218. data/lib/jets/commands/{dotenv.rb → dotenv/dotenv_command.rb} +2 -2
  219. data/lib/jets/commands/encrypted/USAGE +46 -0
  220. data/lib/jets/commands/encrypted/encrypted_command.rb +87 -0
  221. data/lib/jets/commands/gems/gems_command.rb +14 -0
  222. data/lib/jets/commands/generate/generate_command.rb +95 -0
  223. data/lib/jets/commands/help/USAGE +20 -0
  224. data/lib/jets/commands/help/help_command.rb +15 -0
  225. data/lib/jets/commands/initializers/initializers_command.rb +19 -0
  226. data/lib/jets/commands/logs/logs_command.rb +45 -0
  227. data/lib/jets/commands/new/new_command.rb +19 -0
  228. data/lib/jets/commands/notes/notes_command.rb +30 -0
  229. data/lib/jets/commands/plugin/plugin_command.rb +45 -0
  230. data/lib/jets/commands/projects/projects_command.rb +30 -0
  231. data/lib/jets/commands/rake/rake_command.rb +59 -0
  232. data/lib/jets/commands/releases/releases_command.rb +72 -0
  233. data/lib/jets/commands/rollback/rollback_command.rb +41 -0
  234. data/lib/jets/commands/routes/routes_command.rb +19 -0
  235. data/lib/jets/commands/runner/runner_command.rb +60 -0
  236. data/lib/jets/commands/server/server_command.rb +291 -0
  237. data/lib/jets/commands/stacks/stacks_command.rb +39 -0
  238. data/lib/jets/commands/status/status_command.rb +9 -0
  239. data/lib/jets/commands/{url.rb → url/url_command.rb} +37 -14
  240. data/lib/jets/commands/version/version_command.rb +11 -0
  241. data/lib/jets/commands.rb +17 -0
  242. data/lib/jets/configuration.rb +166 -0
  243. data/lib/jets/controller/base.rb +105 -183
  244. data/lib/jets/controller/compat/abstract_controller/base.rb +126 -0
  245. data/lib/jets/controller/compat/action_controller/metal.rb +99 -0
  246. data/lib/jets/controller/compat/caching.rb +13 -0
  247. data/lib/jets/controller/compat/future.rb +13 -0
  248. data/lib/jets/controller/compat/route_set.rb +47 -0
  249. data/lib/jets/controller/decorate/apigw_stage.rb +39 -0
  250. data/lib/jets/controller/{authorization.rb → decorate/authorization.rb} +1 -1
  251. data/lib/jets/controller/decorate/logging.rb +90 -0
  252. data/lib/jets/controller/decorate/redirecting.rb +16 -0
  253. data/lib/jets/controller/decorate/url_for.rb +10 -0
  254. data/lib/jets/controller/{rack/adapter.rb → handler/apigw.rb} +36 -37
  255. data/lib/jets/controller/handler.rb +41 -0
  256. data/lib/jets/controller/middleware/main.rb +16 -8
  257. data/lib/jets/controller/middleware/{local/api_gateway.rb → mimic/apigw.rb} +40 -15
  258. data/lib/jets/controller/middleware/mimic/lambda_context.rb +44 -0
  259. data/lib/jets/controller/middleware/{local.rb → mimic.rb} +36 -51
  260. data/lib/jets/controller/rack_adapter/action.rb +35 -0
  261. data/lib/jets/controller/{rack → rack_adapter}/env.rb +39 -24
  262. data/lib/jets/controller/request/compat/params.rb +144 -0
  263. data/lib/jets/controller/request/compat/request.rb +125 -0
  264. data/lib/jets/controller/request.rb +35 -18
  265. data/lib/jets/controller/response/compat/response.rb +67 -0
  266. data/lib/jets/controller/response.rb +91 -8
  267. data/lib/jets/core.rb +142 -51
  268. data/lib/jets/core_ext/kernel.rb +2 -2
  269. data/lib/jets/core_ext/symbol.rb +5 -0
  270. data/lib/jets/core_ext.rb +4 -0
  271. data/lib/jets/dev_caching.rb +44 -0
  272. data/lib/jets/dotenv/ssm.rb +5 -2
  273. data/lib/jets/dotenv.rb +2 -1
  274. data/lib/jets/engine/configuration.rb +96 -0
  275. data/lib/jets/engine/turbines.rb +23 -0
  276. data/lib/jets/engine.rb +380 -0
  277. data/lib/jets/exception_reporting.rb +43 -0
  278. data/lib/jets/generators/job/job_generator.rb +41 -0
  279. data/lib/jets/generators/job/templates/event_types/dynamodb.rb.tt +8 -0
  280. data/lib/jets/generators/job/templates/event_types/iot.rb.tt +8 -0
  281. data/lib/jets/generators/job/templates/event_types/kinesis.rb.tt +9 -0
  282. data/lib/jets/generators/job/templates/event_types/log.rb.tt +9 -0
  283. data/lib/jets/generators/job/templates/event_types/rule.rb.tt +23 -0
  284. data/lib/jets/generators/job/templates/event_types/s3.rb.tt +11 -0
  285. data/lib/jets/{generator/templates/active_job/job/templates/job.rb.tt → generators/job/templates/event_types/scheduled.rb.tt} +3 -3
  286. data/lib/jets/generators/job/templates/event_types/sns.rb.tt +9 -0
  287. data/lib/jets/generators/job/templates/event_types/sqs.rb.tt +9 -0
  288. data/lib/jets/generators/overrides/app/USAGE +38 -0
  289. data/lib/jets/generators/overrides/app/app_generator.rb +148 -0
  290. data/lib/jets/generators/overrides/app/helpers.rb +139 -0
  291. data/lib/jets/generators/overrides/app/templates/.env +10 -0
  292. data/lib/jets/{commands/templates/skeleton/.gitignore → generators/overrides/app/templates/.gitignore.tt} +2 -1
  293. data/lib/jets/generators/overrides/app/templates/Gemfile.tt +25 -0
  294. data/lib/jets/generators/overrides/app/templates/Rakefile +2 -0
  295. data/lib/jets/generators/overrides/app/templates/app/assets/config/manifest.js +3 -0
  296. data/lib/jets/generators/overrides/app/templates/app/assets/stylesheets/application.css +15 -0
  297. data/lib/jets/generators/overrides/app/templates/app/javascript/application.js +5 -0
  298. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/models/application_record.rb +1 -1
  299. data/lib/jets/generators/overrides/app/templates/app/views/layouts/application.html.erb.tt +30 -0
  300. data/lib/jets/generators/overrides/app/templates/bin/jets +3 -0
  301. data/lib/jets/generators/overrides/app/templates/config/application.rb.tt +15 -0
  302. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/database.yml.tt +1 -1
  303. data/lib/jets/generators/overrides/app/templates/config/environments/development.rb.tt +29 -0
  304. data/lib/jets/generators/overrides/app/templates/config/environments/production.rb.tt +19 -0
  305. data/lib/jets/generators/overrides/app/templates/config/environments/test.rb.tt +23 -0
  306. data/lib/jets/generators/overrides/app/templates/config/initializers/content_security_policy.rb +31 -0
  307. data/lib/jets/generators/overrides/app/templates/config/initializers/filter_parameter_logging.rb +8 -0
  308. data/lib/jets/generators/overrides/app/templates/config/initializers/permissions_policy.rb +11 -0
  309. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config/routes.rb +5 -1
  310. data/lib/jets/generators/overrides/app/templates/db/.gitkeep +0 -0
  311. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/404.html +6 -6
  312. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/422.html +6 -6
  313. data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/500.html +6 -6
  314. data/lib/jets/generators/overrides/templates/erb/scaffold/index.html.erb +22 -0
  315. data/lib/jets/generators/overrides/templates/erb/scaffold/partial.html.erb +8 -0
  316. data/lib/jets/{generator/templates/rails/scaffold_controller/api_controller.rb → generators/overrides/templates/rails/scaffold_controller/api_controller.rb.tt} +5 -9
  317. data/lib/jets/generators/overrides/templates/rails/scaffold_controller/controller.rb.tt +67 -0
  318. data/lib/jets/generators.rb +112 -0
  319. data/lib/jets/info.rb +116 -0
  320. data/lib/jets/initializable.rb +95 -0
  321. data/lib/jets/job/base.rb +3 -2
  322. data/lib/jets/job/dsl/dynamodb_event.rb +19 -9
  323. data/lib/jets/job/dsl/event_source_mapping.rb +1 -1
  324. data/lib/jets/job/dsl/iot_event.rb +6 -6
  325. data/lib/jets/job/dsl/kinesis_event.rb +5 -5
  326. data/lib/jets/job/dsl/log_event.rb +2 -2
  327. data/lib/jets/job/dsl/rule_event.rb +7 -4
  328. data/lib/jets/job/dsl/s3_event.rb +1 -1
  329. data/lib/jets/job/dsl/sns_event.rb +6 -6
  330. data/lib/jets/job/dsl/sqs_event.rb +11 -11
  331. data/lib/jets/klass.rb +5 -6
  332. data/lib/jets/lambda/definition.rb +118 -0
  333. data/lib/jets/lambda/dsl/warnings.rb +57 -0
  334. data/lib/jets/lambda/dsl.rb +64 -53
  335. data/lib/jets/lambda/function.rb +3 -3
  336. data/lib/jets/lambda/function_constructor.rb +6 -6
  337. data/lib/jets/lambda/functions.rb +36 -1
  338. data/lib/jets/mega/request/source.rb +1 -2
  339. data/lib/jets/mega/request.rb +4 -4
  340. data/lib/jets/names.rb +31 -15
  341. data/lib/jets/overrides/dummy/rails.rb +11 -0
  342. data/lib/jets/overrides/lambda/marshaller.rb +10 -0
  343. data/lib/jets/overrides/puma.rb +10 -0
  344. data/lib/jets/paths.rb +243 -0
  345. data/lib/jets/{poly_fun → poly}/base_executor.rb +13 -13
  346. data/lib/jets/{poly_fun → poly}/lambda_executor.rb +2 -2
  347. data/lib/jets/{poly_fun → poly}/node_error.rb +1 -1
  348. data/lib/jets/{poly_fun → poly}/node_executor.rb +4 -4
  349. data/lib/jets/{poly_fun → poly}/python_error.rb +1 -1
  350. data/lib/jets/{poly_fun → poly}/python_executor.rb +2 -2
  351. data/lib/jets/{poly_fun.rb → poly.rb} +12 -12
  352. data/lib/jets/preheat.rb +12 -25
  353. data/lib/jets/processors/deducer.rb +2 -2
  354. data/lib/jets/processors/main_processor.rb +6 -13
  355. data/lib/jets/rack/logger.rb +77 -0
  356. data/lib/jets/router/compat/route_set.rb +177 -0
  357. data/lib/jets/router/dsl/mount.rb +40 -6
  358. data/lib/jets/router/dsl.rb +125 -105
  359. data/lib/jets/router/engine_mount.rb +36 -0
  360. data/lib/jets/router/help.rb +130 -0
  361. data/lib/jets/router/helpers/named_routes/add_full_url.rb +13 -0
  362. data/lib/jets/router/helpers/named_routes/generated.rb +197 -0
  363. data/lib/jets/router/helpers/named_routes/proxy.rb +66 -0
  364. data/lib/jets/router/matcher.rb +140 -17
  365. data/lib/jets/router/resources/options.rb +6 -4
  366. data/lib/jets/router/route/after_initialize.rb +64 -0
  367. data/lib/jets/router/route/as.rb +93 -0
  368. data/lib/jets/router/route/authorizer.rb +1 -0
  369. data/lib/jets/router/route/compat.rb +45 -0
  370. data/lib/jets/router/route/info.rb +74 -0
  371. data/lib/jets/router/route/node.rb +137 -0
  372. data/lib/jets/router/route/path.rb +93 -0
  373. data/lib/jets/router/route.rb +109 -106
  374. data/lib/jets/router/route_set.rb +214 -0
  375. data/lib/jets/router/scope.rb +204 -69
  376. data/lib/jets/router/state.rb +36 -16
  377. data/lib/jets/router/util.rb +1 -31
  378. data/lib/jets/router.rb +64 -162
  379. data/lib/jets/ruby_version_check.rb +15 -0
  380. data/lib/jets/rule/base.rb +1 -0
  381. data/lib/jets/rule/dsl.rb +7 -7
  382. data/lib/jets/secrets.rb +110 -0
  383. data/lib/jets/spec_helpers/controllers/request.rb +22 -16
  384. data/lib/jets/spec_helpers/controllers.rb +32 -24
  385. data/lib/jets/spec_helpers.rb +0 -6
  386. data/lib/jets/stack/builder.rb +3 -2
  387. data/lib/jets/stack/definition.rb +1 -4
  388. data/lib/jets/stack/function.rb +2 -2
  389. data/lib/jets/stack/main/dsl/cloudwatch.rb +4 -4
  390. data/lib/jets/stack/main/dsl/kinesis.rb +2 -2
  391. data/lib/jets/stack/main/dsl/lambda.rb +26 -20
  392. data/lib/jets/stack/main/dsl/sqs.rb +2 -2
  393. data/lib/jets/stack/output/lookup.rb +1 -1
  394. data/lib/jets/stack/output.rb +2 -2
  395. data/lib/jets/stack/parameter.rb +2 -2
  396. data/lib/jets/stack/resource.rb +3 -3
  397. data/lib/jets/stack/s3_event.rb +51 -37
  398. data/lib/jets/stack.rb +1 -1
  399. data/lib/jets/tasks/engine.rake +85 -0
  400. data/lib/jets/tasks/framework.rake +66 -0
  401. data/lib/jets/tasks/log.rake +41 -0
  402. data/lib/jets/tasks/middleware.rake +9 -0
  403. data/lib/jets/tasks/misc.rake +81 -0
  404. data/lib/jets/tasks/statistics.rake +37 -0
  405. data/lib/jets/tasks/tmp.rake +51 -0
  406. data/lib/jets/tasks/yarn.rake +29 -0
  407. data/lib/jets/tasks/zeitwerk.rake +61 -0
  408. data/lib/jets/tasks.rb +18 -0
  409. data/lib/jets/turbine/configurable.rb +36 -0
  410. data/lib/jets/turbine/configuration.rb +101 -0
  411. data/lib/jets/turbine.rb +164 -20
  412. data/lib/jets/util/camelize.rb +24 -0
  413. data/lib/jets/version.rb +1 -1
  414. data/lib/jets.rb +7 -15
  415. metadata +427 -336
  416. data/bin/release +0 -9
  417. data/lib/jets/application/defaults.rb +0 -230
  418. data/lib/jets/builders/reconfigure_rails/config/initializers/jets.rb +0 -16
  419. data/lib/jets/builders/reconfigure_rails.rb +0 -114
  420. data/lib/jets/cfn/builders/api_resources_builder.rb +0 -44
  421. data/lib/jets/cfn/builders/base_child_builder.rb +0 -88
  422. data/lib/jets/cfn/builders/controller_builder.rb +0 -50
  423. data/lib/jets/cfn/builders/function_builder.rb +0 -14
  424. data/lib/jets/cfn/builders/job_builder.rb +0 -14
  425. data/lib/jets/cfn/builders/page_builder.rb +0 -80
  426. data/lib/jets/cfn/built_template.rb +0 -15
  427. data/lib/jets/cfn/template_source.rb +0 -61
  428. data/lib/jets/commands/base.rb +0 -145
  429. data/lib/jets/commands/call.rb +0 -184
  430. data/lib/jets/commands/clean.rb +0 -19
  431. data/lib/jets/commands/configure.rb +0 -51
  432. data/lib/jets/commands/console.rb +0 -18
  433. data/lib/jets/commands/db/environment-task.rake +0 -3
  434. data/lib/jets/commands/db/tasks/dummy/app.rb +0 -25
  435. data/lib/jets/commands/db/tasks/dummy/config.rb +0 -14
  436. data/lib/jets/commands/db/tasks.rb +0 -34
  437. data/lib/jets/commands/db.rb +0 -13
  438. data/lib/jets/commands/dbconsole.rb +0 -134
  439. data/lib/jets/commands/delete.rb +0 -136
  440. data/lib/jets/commands/dynamodb/migrate.rb +0 -9
  441. data/lib/jets/commands/dynamodb/migrator.rb +0 -36
  442. data/lib/jets/commands/dynamodb.rb +0 -19
  443. data/lib/jets/commands/gems.rb +0 -13
  444. data/lib/jets/commands/help/call.md +0 -69
  445. data/lib/jets/commands/help/dynamodb/generate.md +0 -52
  446. data/lib/jets/commands/help/dynamodb/migrate.md +0 -4
  447. data/lib/jets/commands/help/routes.md +0 -16
  448. data/lib/jets/commands/help.rb +0 -9
  449. data/lib/jets/commands/import/base.rb +0 -49
  450. data/lib/jets/commands/import/cheatsheet.rb +0 -35
  451. data/lib/jets/commands/import/rack.rb +0 -16
  452. data/lib/jets/commands/import/rails.rb +0 -74
  453. data/lib/jets/commands/import/sequence.rb +0 -90
  454. data/lib/jets/commands/import/templates/config/database.yml +0 -30
  455. data/lib/jets/commands/import/templates/submodules-cheatsheet.md +0 -89
  456. data/lib/jets/commands/import.rb +0 -12
  457. data/lib/jets/commands/main.rb +0 -169
  458. data/lib/jets/commands/markdown/creator.rb +0 -58
  459. data/lib/jets/commands/markdown/index.rb +0 -27
  460. data/lib/jets/commands/markdown/page.rb +0 -125
  461. data/lib/jets/commands/markdown/shell.rb +0 -11
  462. data/lib/jets/commands/new.rb +0 -173
  463. data/lib/jets/commands/rake_command.rb +0 -61
  464. data/lib/jets/commands/rake_tasks.rb +0 -50
  465. data/lib/jets/commands/runner.rb +0 -16
  466. data/lib/jets/commands/sequence.rb +0 -104
  467. data/lib/jets/commands/stack_info.rb +0 -30
  468. data/lib/jets/commands/templates/skeleton/.env.development.tt +0 -3
  469. data/lib/jets/commands/templates/skeleton/.env.test +0 -3
  470. data/lib/jets/commands/templates/skeleton/.env.tt +0 -3
  471. data/lib/jets/commands/templates/skeleton/.jetskeep +0 -1
  472. data/lib/jets/commands/templates/skeleton/Gemfile.tt +0 -40
  473. data/lib/jets/commands/templates/skeleton/Procfile +0 -7
  474. data/lib/jets/commands/templates/skeleton/Rakefile +0 -2
  475. data/lib/jets/commands/templates/skeleton/app/models/application_item.rb +0 -2
  476. data/lib/jets/commands/templates/skeleton/app/views/layouts/application.html.erb.tt +0 -26
  477. data/lib/jets/commands/templates/skeleton/config/application.rb.tt +0 -72
  478. data/lib/jets/commands/templates/skeleton/config/dynamodb.yml +0 -22
  479. data/lib/jets/commands/templates/skeleton/config/environments/development.rb +0 -7
  480. data/lib/jets/commands/templates/skeleton/config/environments/production.rb +0 -9
  481. data/lib/jets/commands/templates/skeleton/config/environments/test.rb +0 -7
  482. data/lib/jets/commands/templates/webpacker/app/javascript/packs/application.js.tt +0 -23
  483. data/lib/jets/commands/templates/webpacker/app/javascript/packs/theme.scss.tt +0 -24
  484. data/lib/jets/commands/upgrade/templates/bin/webpack +0 -19
  485. data/lib/jets/commands/upgrade/templates/bin/webpack-dev-server +0 -19
  486. data/lib/jets/commands/upgrade/version1.rb +0 -136
  487. data/lib/jets/commands/upgrade.rb +0 -105
  488. data/lib/jets/commands/webpacker_template.rb +0 -18
  489. data/lib/jets/controller/callbacks.rb +0 -73
  490. data/lib/jets/controller/cookies/jar.rb +0 -269
  491. data/lib/jets/controller/cookies.rb +0 -38
  492. data/lib/jets/controller/error/invalid_authenticity_token.rb +0 -6
  493. data/lib/jets/controller/error.rb +0 -4
  494. data/lib/jets/controller/forgery_protection.rb +0 -43
  495. data/lib/jets/controller/layout.rb +0 -17
  496. data/lib/jets/controller/middleware/cors.rb +0 -60
  497. data/lib/jets/controller/middleware/local/mimic_aws_call.rb +0 -38
  498. data/lib/jets/controller/middleware/local/route_matcher.rb +0 -22
  499. data/lib/jets/controller/middleware/reloader.rb +0 -15
  500. data/lib/jets/controller/parameters_filter.rb +0 -29
  501. data/lib/jets/controller/params.rb +0 -117
  502. data/lib/jets/controller/redirection.rb +0 -61
  503. data/lib/jets/controller/rendering/rack_renderer.rb +0 -267
  504. data/lib/jets/controller/rendering.rb +0 -96
  505. data/lib/jets/controller/stage.rb +0 -34
  506. data/lib/jets/controller.rb +0 -3
  507. data/lib/jets/db.rb +0 -15
  508. data/lib/jets/generator/templates/erb/controller/view.html.erb +0 -2
  509. data/lib/jets/generator/templates/erb/scaffold/index.html.erb +0 -29
  510. data/lib/jets/generator/templates/rails/controller/controller.rb +0 -13
  511. data/lib/jets/generator/templates/rails/helper/helper.rb +0 -4
  512. data/lib/jets/generator/templates/rails/scaffold_controller/controller.rb +0 -67
  513. data/lib/jets/generator.rb +0 -112
  514. data/lib/jets/internal/app/controllers/jets/bare_controller.rb +0 -16
  515. data/lib/jets/internal/app/controllers/jets/rack_controller.rb +0 -12
  516. data/lib/jets/internal/app/helpers/jets/mailers_helper.rb +0 -9
  517. data/lib/jets/internal/app/jobs/jets/preheat_job.rb +0 -57
  518. data/lib/jets/internal/app/views/jets/mailers/index.html.erb +0 -8
  519. data/lib/jets/internal/app/views/jets/mailers/mailer.html.erb +0 -6
  520. data/lib/jets/internal/turbines/jets/mailer.rb +0 -52
  521. data/lib/jets/lambda/task.rb +0 -111
  522. data/lib/jets/logger.rb +0 -21
  523. data/lib/jets/middleware/configurator.rb +0 -84
  524. data/lib/jets/middleware/default_stack.rb +0 -53
  525. data/lib/jets/middleware/layer.rb +0 -34
  526. data/lib/jets/middleware/stack.rb +0 -77
  527. data/lib/jets/middleware.rb +0 -33
  528. data/lib/jets/overrides/rails/action_controller.rb +0 -13
  529. data/lib/jets/overrides/rails/asset_tag_helper.rb +0 -114
  530. data/lib/jets/overrides/rails/common_methods.rb +0 -13
  531. data/lib/jets/overrides/rails/migration_checker.rb +0 -34
  532. data/lib/jets/overrides/rails/rendering_helper.rb +0 -27
  533. data/lib/jets/overrides/rails/url_helper.rb +0 -88
  534. data/lib/jets/overrides/rails.rb +0 -6
  535. data/lib/jets/rack_server.rb +0 -86
  536. data/lib/jets/resource/api_gateway/base_path/function.rb +0 -49
  537. data/lib/jets/resource/api_gateway/base_path/role.rb +0 -76
  538. data/lib/jets/resource/api_gateway/cors.rb +0 -61
  539. data/lib/jets/resource/api_gateway/method.rb +0 -102
  540. data/lib/jets/resource/api_gateway/rest_api/routes/change.rb +0 -16
  541. data/lib/jets/resource/base.rb +0 -28
  542. data/lib/jets/resource/child_stack/api_deployment.rb +0 -58
  543. data/lib/jets/resource/child_stack/api_gateway.rb +0 -23
  544. data/lib/jets/resource/child_stack/api_resource/page.rb +0 -20
  545. data/lib/jets/resource/child_stack/api_resource.rb +0 -54
  546. data/lib/jets/resource/child_stack/base.rb +0 -24
  547. data/lib/jets/resource/lambda/function.rb +0 -221
  548. data/lib/jets/resource/logs/subscription_filter.rb +0 -31
  549. data/lib/jets/resource/permission.rb +0 -45
  550. data/lib/jets/resource.rb +0 -71
  551. data/lib/jets/router/error.rb +0 -4
  552. data/lib/jets/router/finder.rb +0 -47
  553. data/lib/jets/router/helpers/core_helper.rb +0 -27
  554. data/lib/jets/router/helpers/named_routes_helper.rb +0 -8
  555. data/lib/jets/router/helpers.rb +0 -4
  556. data/lib/jets/router/method_creator/code.rb +0 -99
  557. data/lib/jets/router/method_creator/edit.rb +0 -12
  558. data/lib/jets/router/method_creator/generic.rb +0 -11
  559. data/lib/jets/router/method_creator/index.rb +0 -48
  560. data/lib/jets/router/method_creator/new.rb +0 -12
  561. data/lib/jets/router/method_creator/root.rb +0 -15
  562. data/lib/jets/router/method_creator/show.rb +0 -12
  563. data/lib/jets/router/method_creator.rb +0 -50
  564. data/lib/jets/turbo/database_yaml.rb +0 -41
  565. data/lib/jets/turbo/project/.gitignore +0 -12
  566. data/lib/jets/turbo/project/.jetskeep +0 -1
  567. data/lib/jets/turbo/project/Gemfile +0 -16
  568. data/lib/jets/turbo/project/Rakefile +0 -2
  569. data/lib/jets/turbo/project/app/controllers/application_controller.rb +0 -2
  570. data/lib/jets/turbo/project/app/helpers/application_helper.rb +0 -2
  571. data/lib/jets/turbo/project/app/jobs/application_job.rb +0 -4
  572. data/lib/jets/turbo/project/config/application.rb +0 -5
  573. data/lib/jets/turbo/project/config/routes.rb +0 -4
  574. data/lib/jets/turbo/project/config.ru +0 -5
  575. data/lib/jets/turbo/rails.rb +0 -127
  576. data/lib/jets/turbo/templates/config/database.yml +0 -30
  577. data/lib/jets/turbo.rb +0 -56
  578. data/readme/prerelease.md +0 -6
  579. data/readme/testing.md +0 -60
  580. /data/{lib/jets → engines}/internal/app/shared/functions/jets/s3_bucket_config.rb +0 -0
  581. /data/lib/jets/{commands → command}/help/build.md +0 -0
  582. /data/lib/jets/{commands → command}/help/clean/build.md +0 -0
  583. /data/lib/jets/{commands → command}/help/clean/log.md +0 -0
  584. /data/lib/jets/{commands → command}/help/console.md +0 -0
  585. /data/lib/jets/{commands → command}/help/db/generate.md +0 -0
  586. /data/lib/jets/{commands → command}/help/dbconsole.md +0 -0
  587. /data/lib/jets/{commands → command}/help/degenerate.md +0 -0
  588. /data/lib/jets/{commands → command}/help/delete.md +0 -0
  589. /data/lib/jets/{commands → command}/help/gems/check.md +0 -0
  590. /data/lib/jets/{commands → command}/help/generate.md +0 -0
  591. /data/lib/jets/{commands → command}/help/import/rack.md +0 -0
  592. /data/lib/jets/{commands → command}/help/import/rails.md +0 -0
  593. /data/lib/jets/{commands → command}/help/runner.md +0 -0
  594. /data/lib/jets/{commands → command}/help/server.md +0 -0
  595. /data/lib/jets/{commands → command}/help/status.md +0 -0
  596. /data/lib/jets/{commands → command}/help/upgrade.md +0 -0
  597. /data/lib/jets/{commands → command}/help/url.md +0 -0
  598. /data/lib/jets/{generator/templates/active_job → generators}/job/templates/application_job.rb.tt +0 -0
  599. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/.rspec +0 -0
  600. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/README.md +0 -0
  601. /data/{.gitmodules → lib/jets/generators/overrides/app/templates/app/assets/images/.keep} +0 -0
  602. /data/lib/jets/{commands/templates/skeleton/db/.gitkeep → generators/overrides/app/templates/app/assets/javascripts/.keep} +0 -0
  603. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/controllers/application_controller.rb +0 -0
  604. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/helpers/application_helper.rb +0 -0
  605. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/app/jobs/application_job.rb +0 -0
  606. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/config.ru +0 -0
  607. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/public/favicon.ico +0 -0
  608. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/controllers/posts_controller_spec.rb +0 -0
  609. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-index.json +0 -0
  610. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/fixtures/payloads/posts-show.json +0 -0
  611. /data/lib/jets/{commands/templates/skeleton → generators/overrides/app/templates}/spec/spec_helper.rb.tt +0 -0
  612. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/_form.html.erb +0 -0
  613. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/edit.html.erb +0 -0
  614. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/new.html.erb +0 -0
  615. /data/lib/jets/{generator → generators/overrides}/templates/erb/scaffold/show.html.erb +0 -0
  616. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/javascript.js +0 -0
  617. /data/lib/jets/{generator → generators/overrides}/templates/rails/assets/stylesheet.css +0 -0
  618. /data/lib/jets/{generator → generators/overrides}/templates/rails/scaffold/scaffold.css +0 -0
@@ -0,0 +1,133 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "active_support"
4
+ require "active_support/core_ext/enumerable"
5
+ require "active_support/core_ext/object/blank"
6
+
7
+ require "thor"
8
+
9
+ module Jets
10
+ module Command
11
+ extend ActiveSupport::Autoload
12
+
13
+ autoload :Behavior
14
+ autoload :Base
15
+
16
+ include Behavior
17
+
18
+ HELP_MAPPINGS = %w(-h -? --help)
19
+
20
+ class << self
21
+ def hidden_commands # :nodoc:
22
+ @hidden_commands ||= []
23
+ end
24
+
25
+ def environment # :nodoc:
26
+ ENV["JETS_ENV"].presence || ENV["RACK_ENV"].presence || "development"
27
+ end
28
+
29
+ # Receives a namespace, arguments, and the behavior to invoke the command.
30
+ def invoke(full_namespace, args = [], **config)
31
+ namespace = full_namespace = full_namespace.to_s
32
+
33
+ if char = namespace =~ /:(\w+)$/
34
+ command_name, namespace = $1, namespace.slice(0, char)
35
+ else
36
+ command_name = namespace
37
+ end
38
+
39
+ command_name, namespace = "help", "help" if command_name.blank? || HELP_MAPPINGS.include?(command_name)
40
+ command_name, namespace, args = "application", "application", ["--help"] if jets_new_with_no_path?(args)
41
+ command_name, namespace = "version", "version" if %w( -v --version ).include?(command_name)
42
+
43
+ original_argv = ARGV.dup
44
+ ARGV.replace(args)
45
+
46
+ command = find_by_namespace(namespace, command_name)
47
+ if command && command.all_commands[command_name]
48
+ command.perform(full_namespace, command_name, args, config)
49
+ else
50
+ args = ["--describe", full_namespace] if HELP_MAPPINGS.include?(args[0])
51
+ find_by_namespace("rake").perform(full_namespace, args, config)
52
+ end
53
+ ensure
54
+ ARGV.replace(original_argv)
55
+ end
56
+
57
+ # Jets finds namespaces similar to Thor, it only adds one rule:
58
+ #
59
+ # Command names must end with "_command.rb". This is required because Jets
60
+ # looks in load paths and loads the command just before it's going to be used.
61
+ #
62
+ # find_by_namespace :webrat, :integration
63
+ #
64
+ # Will search for the following commands:
65
+ #
66
+ # "webrat", "webrat:integration", "jets:webrat", "jets:webrat:integration"
67
+ #
68
+ def find_by_namespace(namespace, command_name = nil) # :nodoc:
69
+ lookups = [ namespace ]
70
+ lookups << "#{namespace}:#{command_name}" if command_name
71
+ lookups.concat lookups.map { |lookup| "jets:#{lookup}" }
72
+
73
+ lookup(lookups)
74
+
75
+ namespaces = subclasses.index_by(&:namespace)
76
+ namespaces[(lookups & namespaces.keys).first]
77
+ end
78
+
79
+ # Returns the root of the Jets engine or app running the command.
80
+ def root
81
+ if defined?(ENGINE_ROOT)
82
+ Pathname.new(ENGINE_ROOT)
83
+ elsif defined?(APP_PATH)
84
+ Pathname.new(File.expand_path("../..", APP_PATH))
85
+ end
86
+ end
87
+
88
+ def print_commands # :nodoc:
89
+ commands.each { |command| puts(" #{command}") }
90
+ end
91
+
92
+ private
93
+ COMMANDS_IN_USAGE = %w(
94
+ generate
95
+ console
96
+ server
97
+ deploy
98
+ logs
99
+ new
100
+ )
101
+ private_constant :COMMANDS_IN_USAGE
102
+
103
+ PRO_COMMANDS = %w(
104
+ projects
105
+ stacks
106
+ releases
107
+ rollback
108
+ )
109
+
110
+ def jets_new_with_no_path?(args)
111
+ args == ["new"]
112
+ end
113
+
114
+ def commands
115
+ lookup!
116
+ visible_commands = (subclasses - hidden_commands).flat_map(&:printing_commands)
117
+ (visible_commands - COMMANDS_IN_USAGE - PRO_COMMANDS).sort
118
+ end
119
+
120
+ def command_type # :doc:
121
+ @command_type ||= "command"
122
+ end
123
+
124
+ def lookup_paths # :doc:
125
+ @lookup_paths ||= %w( jets/commands commands )
126
+ end
127
+
128
+ def file_lookup_paths # :doc:
129
+ @file_lookup_paths ||= [ "{#{lookup_paths.join(',')}}", "**", "*_command.rb" ]
130
+ end
131
+ end
132
+ end
133
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Jets
4
+ module Command
5
+ class ApplicationCommand < Base # :nodoc:
6
+ hide_command!
7
+
8
+ self.bin = "jets" if respond_to?(:bin=) # Rails 7.1
9
+
10
+ def help
11
+ perform # Punt help output to the generator.
12
+ end
13
+
14
+ # This is:
15
+ #
16
+ # bundle exec jets application:help => jets new --help
17
+ # bundle exec jets application => jets new --help
18
+ #
19
+ def perform(*args)
20
+ # require lazily so that Rails constant is only defined within generators
21
+ require "jets/generators/overrides/app/app_generator"
22
+ override_exit_on_failure?
23
+ argv = Rails::Generators::ARGVScrubber.new(args).prepare!
24
+ Jets::Generators::AppGenerator.start argv
25
+ end
26
+
27
+ private
28
+ # We override this way because Jets require generators lazily
29
+ def override_exit_on_failure?
30
+ Jets::Generators::AppGenerator.class_eval do
31
+ # We want to exit on failure to be kind to other libraries
32
+ # This is only when accessing via CLI
33
+ def self.exit_on_failure?
34
+ true
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,33 @@
1
+ module Jets::Command
2
+ class BuildCommand < Base # :nodoc:
3
+ include EnvironmentArgument
4
+
5
+ option :templates, type: :boolean, desc: "Build CloudFormation templates only"
6
+
7
+ desc "build", "Builds and packages project for AWS Lambda"
8
+ long_desc Help.text(:build)
9
+ def perform
10
+ ENV['JETS_TEMPLATES'] = '1' if options[:templates]
11
+
12
+ extract_environment_option_from_argument
13
+ require_application_and_environment!
14
+
15
+ puts "Building project for Lambda..."
16
+ # run gets called from the CLI and does not have all the stack_options yet.
17
+ # We compute it and change the options early here.
18
+ @options.merge!(stack_type: stack_type, s3_bucket: Jets.s3_bucket)
19
+ do_build
20
+ end
21
+
22
+ private
23
+ # Note: build is picked up as a command so naming it do_build
24
+ def do_build
25
+ Jets::Builders::CodeBuilder.new.build unless ENV['JETS_TEMPLATES']
26
+ Jets::Cfn::Builder.new(@options).build
27
+ end
28
+
29
+ def stack_type
30
+ first_run? ? :minimal : :full
31
+ end
32
+ end
33
+ end
@@ -1,4 +1,4 @@
1
- class Jets::Commands::Call
1
+ module Jets::Commands::Call
2
2
  class AnonymousGuesser < BaseGuesser
3
3
  def detect_class_name
4
4
  found_path = function_paths.find do |path|
@@ -1,4 +1,4 @@
1
- class Jets::Commands::Call
1
+ module Jets::Commands::Call
2
2
  class AutoloadGuesser < BaseGuesser
3
3
  def detect_class_name
4
4
  # First guess the class name assuming simple
@@ -53,7 +53,7 @@ class Jets::Commands::Call
53
53
  meth = underscored_function_name.sub(underscored_class_name, '')
54
54
  meth = meth.sub(/^[-_]/,'') # remove leading _ or -
55
55
 
56
- if class_name.constantize.tasks.map(&:meth).include?(meth.to_sym)
56
+ if class_name.constantize.definitions.map(&:meth).include?(meth.to_sym)
57
57
  @method_name = meth
58
58
  else
59
59
  @method_name_error ="#{class_name} class found but #{meth} method not found"
@@ -3,7 +3,7 @@
3
3
  # method_name
4
4
  # error_message
5
5
  #
6
- class Jets::Commands::Call
6
+ module Jets::Commands::Call
7
7
  class BaseGuesser
8
8
  include Jets::AwsServices
9
9
 
@@ -26,15 +26,15 @@ class Jets::Commands::Call
26
26
  # Strip the project namespace if the user has accidentally added it
27
27
  # Since we're going to automatically add it no matter what at the end
28
28
  # and dont want the namespace to be included twice
29
- @provided_function_name = @provided_function_name.sub("#{Jets.config.project_namespace}-", "")
29
+ @provided_function_name = @provided_function_name.sub("#{Jets.project_namespace}-", "")
30
30
 
31
31
  code_path = class_name.underscore.gsub('/','-')
32
- function_name = [Jets.config.project_namespace, code_path, method_name].join('-')
32
+ function_name = [Jets.project_namespace, code_path, method_name].join('-')
33
33
  generated_function_name(function_name)
34
34
  end
35
35
 
36
36
  def generated_function_name(function_name)
37
- if function_name.size > Jets::MAX_FUNCTION_NAME_SIZE # name generated by CloudFormation
37
+ if function_name.size > Jets::Cfn::Resource::Lambda::Function::MAX_FUNCTION_NAME_SIZE # name generated by CloudFormation
38
38
  logical_id = @class_name.gsub('::','')
39
39
 
40
40
  parent_resources = stack_resources(parent_stack.stack_id)
@@ -0,0 +1,27 @@
1
+ require "base64"
2
+ require "json"
3
+
4
+ module Jets::Command
5
+ class CallCommand < Base # :nodoc:
6
+ include Jets::AwsServices
7
+
8
+ desc "call [function] [event]", "Call a lambda function on AWS or locally"
9
+ long_desc Help.text(:call)
10
+ option :invocation_type, default: "RequestResponse", desc: "RequestResponse, Event, or DryRun"
11
+ option :log_type, default: "Tail", desc: "Works if invocation_type set to RequestResponse"
12
+ option :qualifier, desc: "Lambda function version or alias name"
13
+ option :show_log, type: :boolean, desc: "Shows last 4KB of log in the x-amz-log-result header"
14
+ option :show_logs, type: :boolean, desc: "Shows last 4KB of log in the x-amz-log-result header"
15
+ option :lambda_proxy, type: :boolean, default: true, desc: "Enables automatic Lambda proxy transformation of the event payload"
16
+ option :guess, type: :boolean, default: true, desc: "Enables guess mode. Uses inference to allows use of all dashes to specify functions. Guess mode verifies that the function exists in the code base."
17
+ option :local, type: :boolean, desc: "Enables local mode. Instead of invoke the AWS Lambda function, the method gets called locally with current app code. With local mode guess mode is always used."
18
+ option :retry_limit, type: :numeric, default: nil, desc: "Retry count of invoking function. It work with remote call"
19
+ option :read_timeout, type: :numeric, default: nil, desc: " The number of seconds to wait for response data. It work with remote call"
20
+ def perform(function_name, payload='')
21
+ $stdout.sync = true
22
+ $stderr.sync = true
23
+ $stdout = $stderr # jets call operation
24
+ Jets::Commands::Call::Caller.new(function_name, payload, options).run
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,184 @@
1
+ module Jets::Commands::Call
2
+ class Caller
3
+ include Jets::AwsServices
4
+
5
+ def initialize(provided_function_name, event, options={})
6
+ @options = options
7
+ @guess = @options[:guess].nil? ? true : @options[:guess]
8
+
9
+ @provided_function_name = provided_function_name
10
+ @event = event
11
+
12
+ @invocation_type = options[:invocation_type] || "RequestResponse"
13
+ @log_type = options[:log_type] || "Tail"
14
+ @qualifier = @qualifier
15
+ end
16
+
17
+ def function_name
18
+ if @provided_function_name == 'controller'
19
+ "#{Jets.project_namespace}-controller"
20
+ elsif @provided_function_name.starts_with?(Jets.project_namespace)
21
+ @provided_function_name # fully qualified function name
22
+ elsif @guess
23
+ ensure_guesses_found! # possibly exits here
24
+ guesser.function_name # guesser adds namespace already
25
+ else
26
+ [Jets.project_namespace, @provided_function_name].join('-')
27
+ end
28
+ end
29
+
30
+ def run
31
+ @options[:local] ? local_run : remote_run
32
+ end
33
+
34
+ # With local mode there is no way to bypass the guesser
35
+ def local_run
36
+ puts "Local mode enabled!"
37
+ ensure_guesses_found! # possibly exits here
38
+ klass = guesser.class_name.constantize
39
+ # Example:
40
+ # PostsController.process(event, context, meth)
41
+ event = JSON.load(transformed_event) || {} # transformed_event is JSON text String
42
+
43
+ fun = Jets::Poly.new(klass, guesser.method_name)
44
+ result = fun.run(event) # check the logs for polymorphic function errors
45
+ # Note: even though data might not always be json, the JSON.dump does a
46
+ # good job of not bombing, so always calling it to simplify code.
47
+
48
+ text = Jets::Util.normalize_result(result)
49
+ STDOUT.puts text
50
+ end
51
+
52
+ def remote_run
53
+ puts "Calling lambda function #{function_name} on AWS" unless @options[:mute]
54
+ return if @options[:noop]
55
+
56
+ options = {
57
+ # client_context: client_context,
58
+ function_name: function_name,
59
+ invocation_type: @invocation_type, # "Event", # RequestResponse
60
+ log_type: @log_type, # pretty sweet
61
+ payload: transformed_event, # "fileb://file-path/input.json", <= JSON
62
+ qualifier: @qualifier, # "1",
63
+ }
64
+
65
+ begin
66
+ resp = lambda_client.invoke(options)
67
+ rescue Aws::Lambda::Errors::ResourceNotFoundException
68
+ puts "The function #{function_name} was not found. Maybe check the spelling or the AWS_PROFILE?".color(:red)
69
+ return
70
+ end
71
+
72
+ if @options[:show_logs] || @options[:show_log]
73
+ puts "Last 4KB of log in the x-amz-log-result header:".color(:green)
74
+ puts Base64.decode64(resp.log_result)
75
+ end
76
+
77
+ add_console_link_to_clipboard
78
+ result = resp.payload.read # already been normalized/JSON.dump by AWS
79
+ unless @options[:mute_output]
80
+ STDOUT.puts result # only thing that goes to stdout
81
+ end
82
+ end
83
+
84
+ def guesser
85
+ @guesser ||= Guesser.new(@provided_function_name)
86
+ end
87
+
88
+ def ensure_guesses_found!
89
+ unless guesser.class_name and guesser.method_name
90
+ puts guesser.error_message
91
+ exit
92
+ end
93
+ end
94
+
95
+ # @event is String because it can be the file:// notation
96
+ # Returns text String for the lambda.invoke payload.
97
+ def transformed_event
98
+ text = @event
99
+ if text && text.include?("file://")
100
+ text = load_event_from_file(text)
101
+ end
102
+
103
+ check_valid_json!(text)
104
+
105
+ puts "Function name: #{function_name.color(:green)}" unless @options[:mute]
106
+ return text unless function_name.include?("_controller-")
107
+ return text if @options[:lambda_proxy] == false
108
+
109
+ event = JSON.load(text)
110
+ lambda_proxy = {"queryStringParameters" => event}
111
+ JSON.dump(lambda_proxy)
112
+ end
113
+
114
+ def load_event_from_file(text)
115
+ path = text.gsub('file://','')
116
+ path = "#{Jets.root}/#{path}" unless path[0..0] == '/'
117
+ unless File.exist?(path)
118
+ puts "File #{path} does not exist. Are you sure the file exists?".color(:red)
119
+ exit
120
+ end
121
+ text = IO.read(path)
122
+ end
123
+
124
+ # Exits with friendly error message when user provides bad just
125
+ def check_valid_json!(text)
126
+ JSON.load(text)
127
+ rescue JSON::ParserError => e
128
+ puts "Invalid json provided:\n '#{text}'"
129
+ puts "Exiting... Please try again and provide valid json."
130
+ exit 1
131
+ end
132
+
133
+ # So use can quickly paste this into their browser if they want to see the function
134
+ # via the Lambda console
135
+ def add_console_link_to_clipboard
136
+ return unless RUBY_PLATFORM =~ /darwin/
137
+ return unless system("type pbcopy > /dev/null")
138
+
139
+ # TODO: for add_console_link_to_clipboard get the region from the ~/.aws/config and AWS_PROFILE setting
140
+ region = Aws::S3::Client.new.config.region || ENV["AWS_REGION"] ||'us-east-1'
141
+ link = "https://console.aws.amazon.com/lambda/home?region=#{region}#/functions/#{function_name}?tab=configuration"
142
+ system("echo #{link} | pbcopy")
143
+ puts "Pro tip: The Lambda Console Link to the #{function_name} function has been added to your clipboard." unless @options[:mute]
144
+ end
145
+
146
+ # TODO: Hook client_context up and make sure it works. Think I've figure out how to sign client_context below.
147
+ # Client context must be a valid Base64-encoded JSON object
148
+ # Example: http://docs.aws.amazon.com/mobileanalytics/latest/ug/PutEvents.html
149
+ def client_context
150
+ context = {
151
+ "client" => {
152
+ "client_id" => "Jets",
153
+ "app_title" => "jets call cli",
154
+ "app_version_name" => Jets::VERSION,
155
+ },
156
+ "custom" => {},
157
+ "env" =>{
158
+ "platform" => RUBY_PLATFORM,
159
+ "platform_version" => RUBY_VERSION,
160
+ }
161
+ }
162
+ Base64.encode64(JSON.dump(context))
163
+ end
164
+
165
+ # For this class redirect puts to stderr so user can pipe output to tools like
166
+ # jq. Example:
167
+ # jets call posts_controller-index '{"test":1}' | jq .
168
+ def puts(text)
169
+ $stderr.puts(text)
170
+ end
171
+
172
+ def lambda_client
173
+ opt = {}
174
+ opt = opt.merge({retry_limit: @options[:retry_limit]}) if @options[:retry_limit].present?
175
+ opt = opt.merge({http_read_timeout: @options[:read_timeout]}) if @options[:read_timeout].present?
176
+
177
+ if opt.empty?
178
+ aws_lambda
179
+ else
180
+ Aws::Lambda::Client.new(opt)
181
+ end
182
+ end
183
+ end
184
+ end
@@ -25,7 +25,7 @@
25
25
  #
26
26
  # Now we're at a point where we can start guessing
27
27
  # function_name = detect_function_name(function_name)
28
- class Jets::Commands::Call
28
+ module Jets::Commands::Call
29
29
  class Guesser
30
30
  delegate :class_name, :method_name, :error_message, :function_name,
31
31
  to: :delegate_guesser
@@ -1,4 +1,4 @@
1
- class Jets::Commands::Clean
1
+ module Jets::Commands::Clean
2
2
  class Base
3
3
  def initialize(options={})
4
4
  @options = options
@@ -1,6 +1,6 @@
1
1
  require 'fileutils'
2
2
 
3
- class Jets::Commands::Clean
3
+ module Jets::Commands::Clean
4
4
  class Build < Base
5
5
  def clean
6
6
  are_you_sure?("delete /tmp/jets")
@@ -0,0 +1,15 @@
1
+ module Jets::Command
2
+ class CleanCommand < Base # :nodoc:
3
+ desc "log", "Cleans CloudWatch log groups assocated with app"
4
+ long_desc Help.text("clean/log")
5
+ def log
6
+ Jets::Commands::Clean::Log.new(options).clean
7
+ end
8
+
9
+ desc "build", "Cleans jets build"
10
+ long_desc Help.text("clean/build")
11
+ def build
12
+ Jets::Commands::Clean::Build.new(options).clean
13
+ end
14
+ end
15
+ end
@@ -8,7 +8,7 @@
8
8
  # log groups and we don't want to overly-aggressively delete them.
9
9
  #
10
10
  # The `keep_prefixes(log_group_names)` method calcuates the log groups to keep.
11
- class Jets::Commands::Clean
11
+ module Jets::Commands::Clean
12
12
  class Log < Base
13
13
  extend Memoist
14
14
  include Jets::AwsServices
@@ -0,0 +1,9 @@
1
+ module Jets::Command
2
+ class ConfigureCommand < Base # :nodoc:
3
+ desc "configure [TOKEN]", "configure token and updates ~/.jets/config.yml"
4
+ long_desc Help.text(:configure)
5
+ def perform(token=nil)
6
+ Jets::Api::Config.instance.update_token(token)
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "irb"
4
+ require "irb/completion"
5
+
6
+ module Jets::Command
7
+ class ConsoleCommand < Base # :nodoc:
8
+ include EnvironmentArgument
9
+
10
+ desc "console", "REPL console with Jets environment loaded"
11
+ long_desc Help.text(:console)
12
+ def perform
13
+ extract_environment_option_from_argument
14
+ require_application_and_environment!
15
+ Console.new(options).run
16
+ end
17
+ end
18
+
19
+ class Console
20
+ attr_reader :environment
21
+
22
+ def initialize(environment)
23
+ @environment = environment
24
+ end
25
+
26
+ def run
27
+ puts Jets::Booter.message
28
+
29
+ # Thanks: https://mutelight.org/bin-console
30
+ require "irb"
31
+ require "irb/completion"
32
+
33
+ ARGV.clear # https://stackoverflow.com/questions/33070092/irb-start-not-starting/33136762
34
+ IRB.start
35
+ end
36
+ end
37
+
38
+ end
@@ -0,0 +1,103 @@
1
+ ## Storing Encrypted Credentials in Source Control
2
+
3
+ The Jets `credentials` commands provide access to encrypted credentials,
4
+ so you can safely store access tokens, database passwords, and the like
5
+ safely inside the app without relying on a mess of ENVs.
6
+
7
+ This also allows for atomic deploys: no need to coordinate key changes
8
+ to get everything working as the keys are shipped with the code.
9
+
10
+ ## Setup
11
+
12
+ Applications after Jets 5 automatically have a basic credentials file generated
13
+ that just contains the secret_key_base used by MessageVerifiers/MessageEncryptors, like the ones
14
+ signing and encrypting cookies.
15
+
16
+ For applications created prior to Jets 5, we'll automatically generate a new
17
+ credentials file in `config/credentials.yml.enc` the first time you run `bin/jets credentials:edit`.
18
+ If you didn't have a master key saved in `config/master.key`, that'll be created too.
19
+
20
+ Don't lose this master key! Put it in a password manager your team can access.
21
+ Should you lose it no one, including you, will be able to access any encrypted
22
+ credentials.
23
+
24
+ Don't commit the key! Add `config/master.key` to your source control's
25
+ ignore file. If you use Git, Jets handles this for you.
26
+
27
+ Jets also looks for the master key in `ENV["JETS_MASTER_KEY"]`, if that's easier to manage.
28
+
29
+ You could prepend that to your server's start command like this:
30
+
31
+ JETS_MASTER_KEY="very-secret-and-secure" server.start
32
+
33
+ ## Set up Git to Diff Credentials
34
+
35
+ Jets provides `bin/jets credentials:diff --enroll` to instruct Git to call
36
+ `bin/jets credentials:diff` when `git diff` is run on a credentials file.
37
+
38
+ Running the command enrolls the project such that all credentials files use the
39
+ "jets_credentials" diff driver in .gitattributes.
40
+
41
+ Additionally since Git requires the driver itself to be set up in a config file
42
+ that isn't tracked Jets automatically ensures it's configured when running
43
+ `credentials:edit`.
44
+
45
+ Otherwise each co-worker would have to run enable manually, including on each new
46
+ repo clone.
47
+
48
+ To disenroll from this feature, run `bin/jets credentials:diff --disenroll`.
49
+
50
+ ## Editing Credentials
51
+
52
+ This will open a temporary file in `$EDITOR` with the decrypted contents to edit
53
+ the encrypted credentials.
54
+
55
+ When the temporary file is next saved the contents are encrypted and written to
56
+ `config/credentials.yml.enc` while the file itself is destroyed to prevent credentials
57
+ from leaking.
58
+
59
+ ## Environment Specific Credentials
60
+
61
+ The `credentials` command supports passing an `--environment` option to create an
62
+ environment specific override. That override will take precedence over the
63
+ global `config/credentials.yml.enc` file when running in that environment. So:
64
+
65
+ bin/jets credentials:edit --environment development
66
+
67
+ will create `config/credentials/development.yml.enc` with the corresponding
68
+ encryption key in `config/credentials/development.key` if the credentials file
69
+ doesn't exist.
70
+
71
+ The encryption key can also be put in `ENV["JETS_MASTER_KEY"]`, which takes
72
+ precedence over the file encryption key.
73
+
74
+ In addition to that, the default credentials lookup paths can be overridden through
75
+ `config.credentials.content_path` and `config.credentials.key_path`.
76
+
77
+ ## Editor wait
78
+
79
+ For editors that fork and exit immediately, it's important to pass a wait flag,
80
+ otherwise the credentials will be saved immediately with no chance to edit.
81
+
82
+ EDITOR="code --wait" jets credentials:edit
83
+
84
+ ## Accessing in App
85
+
86
+ Let's say you have credentials like so:
87
+
88
+ ❯ jets credentials:show
89
+ secret_key_base: somesecretvalue
90
+ foo: bar
91
+
92
+ You can access them in the app like so:
93
+
94
+ ❯ jets console
95
+ > Jets.application.credentials.secret_key_base
96
+ => "somesecretvalue"
97
+ > Jets.application.credentials.foo
98
+ => "bar"
99
+ > Jets.application.credentials.does_not_exist
100
+ => nil
101
+
102
+ Remember, when you deploy this to Lambda you should set the `JETS_MASTER_KEY`. You set it with [Env Files](https://rubyonjets.com/docs/env-files/). Otherwise the `Jets.application.credentials.xx` values will return `nil`.
103
+