shopify-cli 1.3.1 → 1.7.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 (301) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +2 -2
  3. data/.github/CONTRIBUTING.md +9 -1
  4. data/.github/PULL_REQUEST_TEMPLATE.md +10 -1
  5. data/.github/workflows/release.yml +61 -0
  6. data/.github/workflows/triage.yml +22 -0
  7. data/.gitignore +0 -1
  8. data/.rubocop.yml +61 -8
  9. data/.rubocop_todo.yml +11 -0
  10. data/.travis.yml +1 -0
  11. data/CHANGELOG.md +30 -0
  12. data/Gemfile +12 -11
  13. data/Gemfile.lock +39 -37
  14. data/README.md +39 -7
  15. data/RELEASING.md +19 -29
  16. data/Rakefile +32 -28
  17. data/bin/load_shopify.rb +6 -6
  18. data/bin/shopify +2 -2
  19. data/dev.yml +2 -2
  20. data/docs/_config.yml +1 -18
  21. data/docs/app/node/commands/index.md +2 -80
  22. data/docs/app/node/index.md +2 -33
  23. data/docs/app/rails/commands/index.md +2 -78
  24. data/docs/app/rails/index.md +2 -34
  25. data/docs/core/index.md +2 -84
  26. data/docs/getting-started/index.md +2 -25
  27. data/docs/getting-started/install/index.md +1 -118
  28. data/docs/getting-started/migrate/index.md +2 -94
  29. data/docs/getting-started/uninstall/index.md +2 -35
  30. data/docs/getting-started/upgrade/index.md +2 -39
  31. data/docs/help/start-app/index.md +2 -4
  32. data/docs/index.md +2 -24
  33. data/ext/shopify-cli/extconf.rb +7 -7
  34. data/install.sh +1 -1
  35. data/lib/docgen/markdown.rb +11 -11
  36. data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
  37. data/lib/project_types/extension/cli.rb +64 -47
  38. data/lib/project_types/extension/commands/build.rb +3 -3
  39. data/lib/project_types/extension/commands/create.rb +16 -9
  40. data/lib/project_types/extension/commands/extension_command.rb +8 -5
  41. data/lib/project_types/extension/commands/push.rb +8 -8
  42. data/lib/project_types/extension/commands/register.rb +19 -30
  43. data/lib/project_types/extension/commands/serve.rb +2 -2
  44. data/lib/project_types/extension/commands/tunnel.rb +12 -12
  45. data/lib/project_types/extension/extension_project.rb +4 -4
  46. data/lib/project_types/extension/extension_project_keys.rb +4 -4
  47. data/lib/project_types/extension/features/argo.rb +117 -0
  48. data/lib/project_types/extension/features/argo_config.rb +5 -5
  49. data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
  50. data/lib/project_types/extension/features/argo_setup.rb +2 -2
  51. data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
  52. data/lib/project_types/extension/forms/create.rb +28 -34
  53. data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
  54. data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
  55. data/lib/project_types/extension/forms/questions/ask_type.rb +36 -0
  56. data/lib/project_types/extension/messages/messages.rb +53 -52
  57. data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
  58. data/lib/project_types/extension/models/specification.rb +35 -0
  59. data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +19 -0
  60. data/lib/project_types/extension/models/specification_handlers/default.rb +67 -0
  61. data/lib/project_types/extension/models/specifications.rb +77 -0
  62. data/lib/project_types/extension/tasks/configure_features.rb +52 -0
  63. data/lib/project_types/extension/tasks/converters/app_converter.rb +6 -6
  64. data/lib/project_types/extension/tasks/converters/registration_converter.rb +6 -6
  65. data/lib/project_types/extension/tasks/converters/validation_error_converter.rb +4 -4
  66. data/lib/project_types/extension/tasks/converters/version_converter.rb +7 -7
  67. data/lib/project_types/extension/tasks/create_extension.rb +4 -4
  68. data/lib/project_types/extension/tasks/fetch_specifications.rb +38 -0
  69. data/lib/project_types/extension/tasks/get_app.rb +4 -4
  70. data/lib/project_types/extension/tasks/get_apps.rb +3 -3
  71. data/lib/project_types/extension/tasks/update_draft.rb +4 -4
  72. data/lib/project_types/extension/tasks/user_errors.rb +4 -4
  73. data/lib/project_types/node/cli.rb +19 -16
  74. data/lib/project_types/node/commands/connect.rb +15 -0
  75. data/lib/project_types/node/commands/create.rb +46 -38
  76. data/lib/project_types/node/commands/deploy.rb +4 -4
  77. data/lib/project_types/node/commands/deploy/heroku.rb +24 -24
  78. data/lib/project_types/node/commands/generate.rb +9 -18
  79. data/lib/project_types/node/commands/open.rb +2 -2
  80. data/lib/project_types/node/commands/populate.rb +6 -6
  81. data/lib/project_types/node/commands/populate/customer.rb +5 -5
  82. data/lib/project_types/node/commands/populate/draft_order.rb +5 -5
  83. data/lib/project_types/node/commands/populate/product.rb +5 -5
  84. data/lib/project_types/node/commands/serve.rb +9 -9
  85. data/lib/project_types/node/commands/tunnel.rb +7 -7
  86. data/lib/project_types/node/forms/create.rb +7 -7
  87. data/lib/project_types/node/messages/messages.rb +19 -53
  88. data/lib/project_types/rails/cli.rb +21 -18
  89. data/lib/project_types/rails/commands/connect.rb +15 -0
  90. data/lib/project_types/rails/commands/create.rb +60 -54
  91. data/lib/project_types/rails/commands/deploy.rb +4 -4
  92. data/lib/project_types/rails/commands/deploy/heroku.rb +30 -30
  93. data/lib/project_types/rails/commands/generate.rb +7 -7
  94. data/lib/project_types/rails/commands/generate/webhook.rb +6 -6
  95. data/lib/project_types/rails/commands/open.rb +2 -2
  96. data/lib/project_types/rails/commands/populate.rb +6 -6
  97. data/lib/project_types/rails/commands/populate/customer.rb +5 -5
  98. data/lib/project_types/rails/commands/populate/draft_order.rb +5 -5
  99. data/lib/project_types/rails/commands/populate/product.rb +5 -5
  100. data/lib/project_types/rails/commands/serve.rb +11 -11
  101. data/lib/project_types/rails/commands/tunnel.rb +7 -7
  102. data/lib/project_types/rails/forms/create.rb +24 -24
  103. data/lib/project_types/rails/gem.rb +24 -24
  104. data/lib/project_types/rails/messages/messages.rb +12 -9
  105. data/lib/project_types/rails/ruby.rb +2 -2
  106. data/lib/project_types/script/cli.rb +42 -38
  107. data/lib/project_types/script/commands/create.rb +13 -10
  108. data/lib/project_types/script/commands/disable.rb +3 -3
  109. data/lib/project_types/script/commands/enable.rb +19 -9
  110. data/lib/project_types/script/commands/push.rb +10 -17
  111. data/lib/project_types/script/config/extension_points.yml +17 -12
  112. data/lib/project_types/script/errors.rb +38 -0
  113. data/lib/project_types/script/forms/create.rb +29 -5
  114. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +12 -1
  115. data/lib/project_types/script/layers/application/build_script.rb +18 -19
  116. data/lib/project_types/script/layers/application/create_script.rb +13 -11
  117. data/lib/project_types/script/layers/application/disable_script.rb +2 -2
  118. data/lib/project_types/script/layers/application/enable_script.rb +2 -2
  119. data/lib/project_types/script/layers/application/extension_points.rb +24 -0
  120. data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
  121. data/lib/project_types/script/layers/application/push_script.rb +12 -18
  122. data/lib/project_types/script/layers/domain/errors.rb +7 -0
  123. data/lib/project_types/script/layers/domain/extension_point.rb +62 -7
  124. data/lib/project_types/script/layers/domain/metadata.rb +55 -0
  125. data/lib/project_types/script/layers/domain/push_package.rb +29 -6
  126. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +19 -54
  127. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +49 -18
  128. data/lib/project_types/script/layers/infrastructure/errors.rb +17 -1
  129. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
  130. data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
  131. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +20 -13
  132. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
  133. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
  134. data/lib/project_types/script/layers/infrastructure/script_service.rb +26 -16
  135. data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
  136. data/lib/project_types/script/messages/messages.rb +67 -10
  137. data/lib/project_types/script/script_project.rb +47 -16
  138. data/lib/project_types/script/ui/error_handler.rb +115 -45
  139. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  140. data/lib/project_types/script/ui/strict_spinner.rb +1 -1
  141. data/lib/project_types/theme/cli.rb +40 -0
  142. data/lib/project_types/theme/commands/connect.rb +54 -0
  143. data/lib/project_types/theme/commands/create.rb +48 -0
  144. data/lib/project_types/theme/commands/deploy.rb +38 -0
  145. data/lib/project_types/theme/commands/generate.rb +20 -0
  146. data/lib/project_types/theme/commands/generate/env.rb +79 -0
  147. data/lib/project_types/theme/commands/push.rb +55 -0
  148. data/lib/project_types/theme/commands/serve.rb +31 -0
  149. data/lib/project_types/theme/forms/connect.rb +34 -0
  150. data/lib/project_types/theme/forms/create.rb +22 -0
  151. data/lib/project_types/theme/messages/messages.rb +147 -0
  152. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
  153. data/lib/project_types/theme/themekit.rb +113 -0
  154. data/lib/rubygems_plugin.rb +3 -3
  155. data/lib/shopify-cli/admin_api.rb +52 -12
  156. data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
  157. data/lib/shopify-cli/admin_api/schema.rb +3 -3
  158. data/lib/shopify-cli/api.rb +38 -37
  159. data/lib/shopify-cli/command.rb +1 -1
  160. data/lib/shopify-cli/commands.rb +9 -9
  161. data/lib/shopify-cli/commands/config.rb +28 -28
  162. data/lib/shopify-cli/commands/connect.rb +35 -18
  163. data/lib/shopify-cli/commands/create.rb +5 -5
  164. data/lib/shopify-cli/commands/help.rb +6 -6
  165. data/lib/shopify-cli/commands/logout.rb +3 -3
  166. data/lib/shopify-cli/commands/system.rb +40 -31
  167. data/lib/shopify-cli/commands/version.rb +2 -2
  168. data/lib/shopify-cli/context.rb +43 -22
  169. data/lib/shopify-cli/core.rb +4 -4
  170. data/lib/shopify-cli/core/entry_point.rb +6 -6
  171. data/lib/shopify-cli/core/executor.rb +1 -1
  172. data/lib/shopify-cli/core/help_resolver.rb +2 -2
  173. data/lib/shopify-cli/core/monorail.rb +21 -19
  174. data/lib/shopify-cli/db.rb +2 -2
  175. data/lib/shopify-cli/feature.rb +1 -3
  176. data/lib/shopify-cli/form.rb +1 -1
  177. data/lib/shopify-cli/git.rb +17 -17
  178. data/lib/shopify-cli/helpers.rb +1 -1
  179. data/lib/shopify-cli/helpers/haikunator.rb +1 -1
  180. data/lib/shopify-cli/heroku.rb +28 -28
  181. data/lib/shopify-cli/http_request.rb +27 -0
  182. data/lib/shopify-cli/js_deps.rb +13 -13
  183. data/lib/shopify-cli/js_system.rb +5 -5
  184. data/lib/shopify-cli/lazy_delegator.rb +55 -0
  185. data/lib/shopify-cli/messages/messages.rb +24 -10
  186. data/lib/shopify-cli/method_object.rb +104 -0
  187. data/lib/shopify-cli/oauth.rb +25 -25
  188. data/lib/shopify-cli/oauth/servlet.rb +9 -9
  189. data/lib/shopify-cli/options.rb +3 -3
  190. data/lib/shopify-cli/packager.rb +24 -24
  191. data/lib/shopify-cli/partners_api.rb +38 -16
  192. data/lib/shopify-cli/partners_api/organizations.rb +10 -10
  193. data/lib/shopify-cli/process_supervision.rb +8 -8
  194. data/lib/shopify-cli/project.rb +27 -23
  195. data/lib/shopify-cli/project_type.rb +21 -5
  196. data/lib/shopify-cli/resolve_constant.rb +25 -0
  197. data/lib/shopify-cli/resources.rb +1 -1
  198. data/lib/shopify-cli/resources/env_file.rb +9 -9
  199. data/lib/shopify-cli/result.rb +432 -0
  200. data/lib/shopify-cli/shopifolk.rb +84 -0
  201. data/lib/shopify-cli/sub_command.rb +1 -1
  202. data/lib/shopify-cli/task.rb +9 -1
  203. data/lib/shopify-cli/tasks.rb +7 -7
  204. data/lib/shopify-cli/tasks/create_api_client.rb +17 -6
  205. data/lib/shopify-cli/tasks/ensure_dev_store.rb +11 -11
  206. data/lib/shopify-cli/tasks/ensure_env.rb +18 -15
  207. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
  208. data/lib/shopify-cli/tasks/select_org_and_shop.rb +29 -24
  209. data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
  210. data/lib/shopify-cli/transform_data_structure.rb +86 -0
  211. data/lib/shopify-cli/tunnel.rb +36 -30
  212. data/lib/shopify-cli/version.rb +1 -1
  213. data/lib/shopify_cli.rb +57 -51
  214. data/shopify-cli.gemspec +6 -6
  215. data/shopify.fish +1 -1
  216. data/shopify.sh +1 -1
  217. data/vendor/deps/cli-kit/REVISION +1 -1
  218. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
  219. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
  220. data/vendor/deps/cli-ui/REVISION +1 -1
  221. data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
  222. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
  223. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
  224. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
  225. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
  226. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
  227. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
  228. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
  229. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
  230. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
  231. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
  232. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
  233. data/vendor/deps/webrick/.gitignore +9 -0
  234. data/vendor/deps/webrick/Gemfile +3 -0
  235. data/vendor/deps/webrick/LICENSE.txt +22 -0
  236. data/vendor/deps/webrick/README.md +61 -0
  237. data/vendor/deps/webrick/Rakefile +10 -0
  238. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  239. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  240. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  241. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  242. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  243. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  244. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  245. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  246. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  247. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  248. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  249. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  250. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  251. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  252. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  253. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  254. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  255. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  256. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  257. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  258. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  259. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  260. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  261. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  262. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  263. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  264. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  265. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  266. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  267. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  268. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  269. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  270. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  271. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  272. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  273. data/vendor/deps/webrick/webrick.gemspec +74 -0
  274. data/vendor/gen/template/bin/update-deps +9 -9
  275. metadata +84 -29
  276. data/docs/Gemfile +0 -5
  277. data/docs/Gemfile.lock +0 -258
  278. data/docs/_data/nav.yml +0 -35
  279. data/docs/_includes/footer.html +0 -15
  280. data/docs/_includes/head.html +0 -19
  281. data/docs/_includes/sidebar_nav.html +0 -22
  282. data/docs/_includes/toc.html +0 -112
  283. data/docs/_layouts/default.html +0 -79
  284. data/docs/css/docs.css +0 -157
  285. data/docs/images/header.png +0 -0
  286. data/docs/installing-ruby.md +0 -28
  287. data/lib/project_types/extension/features/argo/admin.rb +0 -20
  288. data/lib/project_types/extension/features/argo/base.rb +0 -129
  289. data/lib/project_types/extension/features/argo/checkout.rb +0 -20
  290. data/lib/project_types/extension/forms/register.rb +0 -47
  291. data/lib/project_types/extension/models/type.rb +0 -81
  292. data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
  293. data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
  294. data/lib/project_types/node/commands/generate/billing.rb +0 -39
  295. data/lib/project_types/node/commands/generate/page.rb +0 -59
  296. data/lib/project_types/node/commands/generate/webhook.rb +0 -37
  297. data/lib/project_types/script/layers/domain/script.rb +0 -18
  298. data/lib/project_types/script/layers/infrastructure/assemblyscript_tsconfig.rb +0 -38
  299. data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -59
  300. data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
  301. data/lib/project_types/script/templates/ts/as-pect.d.ts +0 -1
@@ -7,9 +7,9 @@ module Extension
7
7
  NPM_SERVE_COMMAND = %w(run-script server)
8
8
 
9
9
  def call(_args, _command_name)
10
- CLI::UI::Frame.open(@ctx.message('serve.frame_title')) do
10
+ CLI::UI::Frame.open(@ctx.message("serve.frame_title")) do
11
11
  success = ShopifyCli::JsSystem.call(@ctx, yarn: YARN_SERVE_COMMAND, npm: NPM_SERVE_COMMAND)
12
- @ctx.abort(@ctx.message('serve.serve_failure_message')) unless success
12
+ @ctx.abort(@ctx.message("serve.serve_failure_message")) unless success
13
13
  end
14
14
  end
15
15
 
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Commands
6
6
  class Tunnel < ExtensionCommand
7
7
  options do |parser, flags|
8
- parser.on('--port=PORT') { |port| flags[:port] = port }
8
+ parser.on("--port=PORT") { |port| flags[:port] = port }
9
9
  end
10
10
 
11
- AUTH_SUBCOMMAND = 'auth'
12
- START_SUBCOMMAND = 'start'
13
- STOP_SUBCOMMAND = 'stop'
14
- STATUS_SUBCOMMAND = 'status'
11
+ AUTH_SUBCOMMAND = "auth"
12
+ START_SUBCOMMAND = "start"
13
+ STOP_SUBCOMMAND = "stop"
14
+ STATUS_SUBCOMMAND = "status"
15
15
  DEFAULT_PORT = 39351
16
16
 
17
17
  def call(args, _name)
@@ -27,11 +27,11 @@ module Extension
27
27
  end
28
28
 
29
29
  def self.help
30
- ShopifyCli::Context.message('tunnel.help', ShopifyCli::TOOL_NAME)
30
+ ShopifyCli::Context.message("tunnel.help", ShopifyCli::TOOL_NAME)
31
31
  end
32
32
 
33
33
  def self.extended_help
34
- ShopifyCli::Context.message('tunnel.extended_help', ShopifyCli::TOOL_NAME, DEFAULT_PORT)
34
+ ShopifyCli::Context.message("tunnel.extended_help", ShopifyCli::TOOL_NAME, DEFAULT_PORT)
35
35
  end
36
36
 
37
37
  private
@@ -40,9 +40,9 @@ module Extension
40
40
  tunnel_url = ShopifyCli::Tunnel.urls.first
41
41
 
42
42
  if tunnel_url.nil?
43
- @ctx.puts(@ctx.message('tunnel.no_tunnel_running'))
43
+ @ctx.puts(@ctx.message("tunnel.no_tunnel_running"))
44
44
  else
45
- @ctx.puts(@ctx.message('tunnel.tunnel_running_at', tunnel_url))
45
+ @ctx.puts(@ctx.message("tunnel.tunnel_running_at", tunnel_url))
46
46
  end
47
47
  end
48
48
 
@@ -50,7 +50,7 @@ module Extension
50
50
  return DEFAULT_PORT unless options.flags.key?(:port)
51
51
 
52
52
  port = options.flags[:port].to_i
53
- @ctx.abort(@ctx.message('tunnel.invalid_port', options.flags[:port])) unless port > 0
53
+ @ctx.abort(@ctx.message("tunnel.invalid_port", options.flags[:port])) unless port > 0
54
54
  port
55
55
  end
56
56
 
@@ -58,7 +58,7 @@ module Extension
58
58
  token = args.shift
59
59
 
60
60
  if token.nil?
61
- @ctx.puts(@ctx.message('tunnel.missing_token'))
61
+ @ctx.puts(@ctx.message("tunnel.missing_token"))
62
62
  @ctx.puts("#{self.class.help}\n#{self.class.extended_help}")
63
63
  else
64
64
  ShopifyCli::Tunnel.auth(@ctx, token)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  class ExtensionProject < ShopifyCli::Project
@@ -13,7 +13,7 @@ module Extension
13
13
  )
14
14
  end
15
15
 
16
- def write_env_file(context:, title:, api_key: '', api_secret: '', registration_id: nil)
16
+ def write_env_file(context:, title:, api_key: "", api_secret: "", registration_id: nil)
17
17
  ShopifyCli::Resources::EnvFile.new(
18
18
  api_key: api_key,
19
19
  secret: api_secret,
@@ -34,11 +34,11 @@ module Extension
34
34
  end
35
35
 
36
36
  def app
37
- Models::App.new(api_key: env['api_key'], secret: env['secret'])
37
+ Models::App.new(api_key: env["api_key"], secret: env["secret"])
38
38
  end
39
39
 
40
40
  def registered?
41
- property_present?('api_key') && property_present?('secret') && registration_id?
41
+ property_present?("api_key") && property_present?("secret") && registration_id?
42
42
  end
43
43
 
44
44
  def title
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module ExtensionProjectKeys
6
- REGISTRATION_ID_KEY = 'EXTENSION_ID'
7
- EXTENSION_TYPE_KEY = 'EXTENSION_TYPE'
8
- TITLE_KEY = 'EXTENSION_TITLE'
6
+ REGISTRATION_ID_KEY = "EXTENSION_ID"
7
+ EXTENSION_TYPE_KEY = "EXTENSION_TYPE"
8
+ TITLE_KEY = "EXTENSION_TITLE"
9
9
  end
10
10
  end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+ require "base64"
3
+ require "shopify_cli"
4
+ require "semantic/semantic"
5
+
6
+ module Extension
7
+ module Features
8
+ class Argo
9
+ include SmartProperties
10
+
11
+ property! :git_template, converts: :to_str
12
+ property! :renderer_package_name, converts: :to_str
13
+
14
+ SCRIPT_PATH = %w(build main.js).freeze
15
+
16
+ NPM_LIST_COMMAND = %w(list).freeze
17
+ YARN_LIST_COMMAND = %w(list --pattern).freeze
18
+ NPM_LIST_PARAMETERS = %w(--prod).freeze
19
+ YARN_LIST_PARAMETERS = %w(--production).freeze
20
+ private_constant :NPM_LIST_COMMAND, :YARN_LIST_COMMAND, :NPM_LIST_PARAMETERS, :YARN_LIST_PARAMETERS
21
+
22
+ YARN_INSTALL_COMMAND = %w(install).freeze
23
+ YARN_INSTALL_PARAMETERS = %w(--silent).freeze
24
+ YARN_RUN_COMMAND = %w(run).freeze
25
+ YARN_RUN_SCRIPT_NAME = %w(build).freeze
26
+ private_constant :YARN_INSTALL_COMMAND, :YARN_INSTALL_PARAMETERS, :YARN_RUN_COMMAND, :YARN_RUN_SCRIPT_NAME
27
+
28
+ def create(directory_name, identifier, context)
29
+ Features::ArgoSetup.new(git_template: git_template).call(directory_name, identifier, context)
30
+ end
31
+
32
+ def config(context)
33
+ js_system = ShopifyCli::JsSystem.new(ctx: context)
34
+ if js_system.package_manager == "yarn"
35
+ run_yarn_install(context, js_system)
36
+ run_yarn_run_script(context, js_system)
37
+ end
38
+ filepath = File.join(context.root, SCRIPT_PATH)
39
+ context.abort(context.message("features.argo.missing_file_error")) unless File.exist?(filepath)
40
+ begin
41
+ {
42
+ renderer_version: extract_argo_renderer_version(context),
43
+ serialized_script: Base64.strict_encode64(File.read(filepath).chomp),
44
+ }
45
+ rescue StandardError
46
+ context.abort(context.message("features.argo.script_prepare_error"))
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def extract_argo_renderer_version(context)
53
+ result = run_list_command(context)
54
+ found_version = find_version_number(context, result)
55
+ context.abort(
56
+ context.message("features.argo.dependencies.argo_renderer_package_invalid_version_error")
57
+ ) if found_version.nil?
58
+ ::Semantic::Version.new(found_version).to_s
59
+ rescue ArgumentError
60
+ context.abort(
61
+ context.message("features.argo.dependencies.argo_renderer_package_invalid_version_error")
62
+ )
63
+ end
64
+
65
+ def find_version_number(context, result)
66
+ packages = result.to_json.split('\n')
67
+ found_package = packages.find do |package|
68
+ package.match(/#{renderer_package_name}@/)
69
+ end
70
+ if found_package.nil?
71
+ error = "'#{renderer_package_name}' not found."
72
+ context.abort(
73
+ context.message("features.argo.dependencies.argo_missing_renderer_package_error", error)
74
+ )
75
+ end
76
+ found_package.split("@")[2]&.strip
77
+ end
78
+
79
+ def run_list_command(context)
80
+ js_system = ShopifyCli::JsSystem.new(ctx: context)
81
+ result, error, status = js_system.call(
82
+ yarn: YARN_LIST_COMMAND + [renderer_package_name] + YARN_LIST_PARAMETERS,
83
+ npm: NPM_LIST_COMMAND + [renderer_package_name] + NPM_LIST_PARAMETERS,
84
+ capture_response: true
85
+ )
86
+ context.abort(
87
+ context.message("features.argo.dependencies.argo_missing_renderer_package_error", error)
88
+ ) unless status.success?
89
+ result
90
+ end
91
+
92
+ def run_yarn_install(context, js_system)
93
+ _result, error, status = js_system.call(
94
+ yarn: YARN_INSTALL_COMMAND + YARN_INSTALL_PARAMETERS,
95
+ npm: [],
96
+ capture_response: true
97
+ )
98
+
99
+ context.abort(
100
+ context.message("features.argo.dependencies.yarn_install_error", error)
101
+ ) unless status.success?
102
+ end
103
+
104
+ def run_yarn_run_script(context, js_system)
105
+ _result, error, status = js_system.call(
106
+ yarn: YARN_RUN_COMMAND + YARN_RUN_SCRIPT_NAME,
107
+ npm: [],
108
+ capture_response: true
109
+ )
110
+
111
+ context.abort(
112
+ context.message("features.argo.dependencies.yarn_run_script_error", error)
113
+ ) unless status.success?
114
+ end
115
+ end
116
+ end
117
+ end
@@ -3,7 +3,7 @@
3
3
  module Extension
4
4
  module Features
5
5
  class ArgoConfig
6
- CONFIG_FILE_NAME = 'extension.config.yml'
6
+ CONFIG_FILE_NAME = "extension.config.yml"
7
7
 
8
8
  class << self
9
9
  def parse_yaml(context, permitted_keys = [])
@@ -11,7 +11,7 @@ module Extension
11
11
 
12
12
  return {} unless File.size?(file_name)
13
13
 
14
- require 'yaml' # takes 20ms, so deferred as late as possible.
14
+ require "yaml" # takes 20ms, so deferred as late as possible.
15
15
  begin
16
16
  config = YAML.load_file(file_name)
17
17
 
@@ -21,7 +21,7 @@ module Extension
21
21
  return {} if config.nil?
22
22
 
23
23
  unless config.is_a?(Hash)
24
- raise ShopifyCli::Abort, ShopifyCli::Context.message('core.yaml.error.not_hash', CONFIG_FILE_NAME)
24
+ raise ShopifyCli::Abort, ShopifyCli::Context.message("core.yaml.error.not_hash", CONFIG_FILE_NAME)
25
25
  end
26
26
 
27
27
  config.transform_keys!(&:to_sym)
@@ -31,7 +31,7 @@ module Extension
31
31
  rescue Psych::SyntaxError => e
32
32
  raise(
33
33
  ShopifyCli::Abort,
34
- ShopifyCli::Context.message('core.yaml.error.invalid', CONFIG_FILE_NAME, e.message)
34
+ ShopifyCli::Context.message("core.yaml.error.invalid", CONFIG_FILE_NAME, e.message)
35
35
  )
36
36
  end
37
37
  end
@@ -47,7 +47,7 @@ module Extension
47
47
  raise(
48
48
  ShopifyCli::Abort,
49
49
  ShopifyCli::Context.message(
50
- 'features.argo.config.unpermitted_keys',
50
+ "features.argo.config.unpermitted_keys",
51
51
  CONFIG_FILE_NAME,
52
52
  unpermitted_keys.map { |k| "\n- #{k}" }.join
53
53
  )
@@ -5,21 +5,21 @@ module Extension
5
5
  class ArgoDependencies
6
6
  def self.node_installed(min_major:, min_minor: nil)
7
7
  -> (context) do
8
- out, status = CLI::Kit::System.capture2('node', '-v')
9
- context.abort(context.message('features.argo.dependencies.node.node_not_installed')) unless status.success?
8
+ out, status = CLI::Kit::System.capture2("node", "-v")
9
+ context.abort(context.message("features.argo.dependencies.node.node_not_installed")) unless status.success?
10
10
 
11
- min_version = 'v' + min_major .to_s + '.' + (min_minor.nil? ? 'x' : min_minor.to_s) + '.x'
11
+ min_version = "v" + min_major .to_s + "." + (min_minor.nil? ? "x" : min_minor.to_s) + ".x"
12
12
  version = out.strip
13
13
  parsed_version = version.match(/v(?<major>\d+).(?<minor>\d+).(?<patch>\d+)/)
14
14
 
15
15
  unless min_major.nil? || parsed_version[:major].to_i >= min_major
16
- context.abort(context.message('features.argo.dependencies.node.version_too_low', version, min_version))
16
+ context.abort(context.message("features.argo.dependencies.node.version_too_low", version, min_version))
17
17
  end
18
18
 
19
19
  return if parsed_version[:major].to_i > min_major
20
20
 
21
21
  unless min_minor.nil? || parsed_version[:minor].to_i >= min_minor
22
- context.abort(context.message('features.argo.dependencies.node.version_too_low', version, min_version))
22
+ context.abort(context.message("features.argo.dependencies.node.version_too_low", version, min_version))
23
23
  end
24
24
  end
25
25
  end
@@ -5,8 +5,8 @@ module Extension
5
5
  class ArgoSetup
6
6
  include SmartProperties
7
7
 
8
- GIT_DIRECTORY = '.git'
9
- SCRIPTS_DIRECTORY = 'scripts'
8
+ GIT_DIRECTORY = ".git"
9
+ SCRIPTS_DIRECTORY = "scripts"
10
10
 
11
11
  property! :git_template, accepts: String
12
12
  property! :dependency_checks, default: []
@@ -5,7 +5,7 @@ module Extension
5
5
  module ArgoSetupSteps
6
6
  YARN_INITIALIZE_COMMAND = %w(generate).freeze
7
7
  NPM_INITIALIZE_COMMAND = %w(run generate --).freeze
8
- INITIALIZE_TYPE_PARAMETER = '--type=%s'
8
+ INITIALIZE_TYPE_PARAMETER = "--type=%s"
9
9
 
10
10
  def self.check_dependencies(dependency_checks)
11
11
  ArgoSetupStep.always_successful do |context, _identifier, _directory_name, _js_system|
@@ -21,7 +21,7 @@ module Extension
21
21
  ShopifyCli::Git.clone(git_template, directory_name, ctx: context)
22
22
  context.root = File.join(context.root, directory_name)
23
23
  rescue StandardError
24
- context.puts('{{x}} Unable to clone the repository.')
24
+ context.puts("{{x}} Unable to clone the repository.")
25
25
  end
26
26
  end
27
27
  end
@@ -34,8 +34,8 @@ module Extension
34
34
 
35
35
  def self.initialize_project
36
36
  ArgoSetupStep.default do |context, identifier, _directory_name, js_system|
37
- frame_title = context.message('create.setup_project_frame_title')
38
- failure_message = context.message('features.argo.initialization_error')
37
+ frame_title = context.message("create.setup_project_frame_title")
38
+ failure_message = context.message("features.argo.initialization_error")
39
39
 
40
40
  result = true
41
41
  CLI::UI::Frame.open(frame_title, failure_text: failure_message) do
@@ -3,50 +3,44 @@
3
3
  module Extension
4
4
  module Forms
5
5
  class Create < ShopifyCli::Form
6
- flag_arguments :name, :type
6
+ flag_arguments :name, :type, :api_key
7
7
 
8
- def ask
9
- self.type = ask_type
10
- self.name = ask_name
11
- end
8
+ attr_reader :app
12
9
 
13
- def directory_name
14
- @directory_name ||= name.strip.gsub(/( )/, '_').downcase
15
- end
10
+ class ExtensionProjectDetails
11
+ include SmartProperties
16
12
 
17
- private
13
+ property :app, accepts: Models::App
14
+ property :name, accepts: String
15
+ property :type, accepts: Models::SpecificationHandlers::Default
18
16
 
19
- def ask_name
20
- ask_with_reprompt(
21
- initial_value: name,
22
- break_condition: -> (current_name) { Models::Registration.valid_title?(current_name) },
23
- prompt_message: ctx.message('create.ask_name'),
24
- reprompt_message: ctx.message('create.invalid_name', Models::Registration::MAX_TITLE_LENGTH)
25
- )
17
+ def complete?
18
+ !!(app && name && type)
19
+ end
26
20
  end
27
21
 
28
- def ask_type
29
- return Models::Type.load_type(type) if Models::Type.valid?(type)
30
- ctx.puts(ctx.message('create.invalid_type')) unless type.nil?
31
-
32
- CLI::UI::Prompt.ask(ctx.message('create.ask_type')) do |handler|
33
- Models::Type.repository.values.each do |type|
34
- handler.option("#{type.name} #{type.tagline}") { type }
22
+ def ask
23
+ ShopifyCli::Result.wrap(ExtensionProjectDetails.new)
24
+ .then(&Questions::AskApp.new(ctx: ctx, api_key: api_key))
25
+ .then(&Questions::AskType.new(ctx: ctx, type: type))
26
+ .then(&Questions::AskName.new(ctx: ctx, name: name))
27
+ .unwrap { |e| raise e }
28
+ .tap do |project_details|
29
+ ctx.abort(ctx.message("create.incomplete_configuration")) unless project_details.complete?
30
+
31
+ self.app = project_details.app
32
+ self.type = project_details.type
33
+ self.name = project_details.name
35
34
  end
36
- end
37
35
  end
38
36
 
39
- def ask_with_reprompt(initial_value:, break_condition:, prompt_message:, reprompt_message:)
40
- value = initial_value
41
- reprompt = false
42
-
43
- until break_condition.call(value)
44
- ctx.puts(reprompt_message) if reprompt
45
- value = CLI::UI::Prompt.ask(prompt_message)&.strip
46
- reprompt = true
47
- end
48
- value
37
+ def directory_name
38
+ name.strip.gsub(/( )/, "_").downcase
49
39
  end
40
+
41
+ private
42
+
43
+ attr_writer :app
50
44
  end
51
45
  end
52
46
  end
@@ -0,0 +1,53 @@
1
+ module Extension
2
+ module Forms
3
+ module Questions
4
+ class AskApp
5
+ include ShopifyCli::MethodObject
6
+
7
+ property! :ctx
8
+ property :api_key
9
+ property! :prompt,
10
+ converts: :to_proc,
11
+ default: -> { CLI::UI::Prompt.method(:ask) }
12
+
13
+ def call(project_details)
14
+ project_details.tap(&method(:prompt_for_app))
15
+ end
16
+
17
+ private
18
+
19
+ def prompt_for_app(project_details)
20
+ project_details.app =
21
+ api_key.nil? ? choose_interactively(load_apps) : validate_app_ownership(api_key)
22
+ end
23
+
24
+ def validate_app_ownership(api_key)
25
+ found_app = Tasks::GetApp.call(context: ctx, api_key: api_key)
26
+ ctx.abort(ctx.message("create.invalid_api_key", api_key)) if found_app.nil?
27
+ found_app
28
+ end
29
+
30
+ def choose_interactively(apps)
31
+ prompt.call(ctx.message("create.ask_app")) do |handler|
32
+ apps.each do |app|
33
+ handler.option("#{app.title} by #{app.business_name}") { app }
34
+ end
35
+ end
36
+ end
37
+
38
+ def load_apps
39
+ ctx.puts(@ctx.message("create.loading_apps"))
40
+ apps = Tasks::GetApps.call(context: ctx)
41
+
42
+ apps.empty? ? abort_no_apps : apps
43
+ end
44
+
45
+ def abort_no_apps
46
+ ctx.puts(@ctx.message("create.no_apps"))
47
+ ctx.puts(@ctx.message("create.learn_about_apps"))
48
+ raise ShopifyCli::AbortSilent
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end