shopify-cli 1.5.0 → 1.9.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 (305) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  3. data/.rubocop_todo.yml +15 -2
  4. data/.travis.yml +1 -0
  5. data/CHANGELOG.md +26 -0
  6. data/Gemfile +12 -12
  7. data/Gemfile.lock +14 -14
  8. data/README.md +39 -7
  9. data/Rakefile +32 -28
  10. data/bin/load_shopify.rb +6 -6
  11. data/bin/shopify +2 -2
  12. data/dev.yml +5 -2
  13. data/docs/_config.yml +1 -18
  14. data/docs/app/node/commands/index.md +2 -80
  15. data/docs/app/node/index.md +2 -33
  16. data/docs/app/rails/commands/index.md +2 -78
  17. data/docs/app/rails/index.md +2 -34
  18. data/docs/core/index.md +2 -84
  19. data/docs/getting-started/index.md +2 -25
  20. data/docs/getting-started/install/index.md +1 -118
  21. data/docs/getting-started/migrate/index.md +2 -94
  22. data/docs/getting-started/uninstall/index.md +2 -35
  23. data/docs/getting-started/upgrade/index.md +2 -39
  24. data/docs/help/start-app/index.md +2 -4
  25. data/docs/index.md +2 -24
  26. data/ext/shopify-cli/extconf.rb +7 -7
  27. data/install.sh +1 -1
  28. data/lib/docgen/markdown.rb +12 -12
  29. data/lib/graphql/extension_create.graphql +17 -2
  30. data/lib/graphql/fetch_specifications.graphql +14 -0
  31. data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
  32. data/lib/project_types/extension/cli.rb +56 -48
  33. data/lib/project_types/extension/commands/build.rb +3 -3
  34. data/lib/project_types/extension/commands/create.rb +17 -10
  35. data/lib/project_types/extension/commands/extension_command.rb +14 -7
  36. data/lib/project_types/extension/commands/push.rb +10 -10
  37. data/lib/project_types/extension/commands/register.rb +22 -32
  38. data/lib/project_types/extension/commands/serve.rb +1 -7
  39. data/lib/project_types/extension/commands/tunnel.rb +12 -12
  40. data/lib/project_types/extension/extension_project.rb +22 -7
  41. data/lib/project_types/extension/extension_project_keys.rb +5 -4
  42. data/lib/project_types/extension/features/argo.rb +123 -0
  43. data/lib/project_types/extension/features/argo_config.rb +5 -5
  44. data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
  45. data/lib/project_types/extension/features/argo_renderer_package.rb +32 -0
  46. data/lib/project_types/extension/features/argo_serve.rb +69 -0
  47. data/lib/project_types/extension/features/argo_setup.rb +2 -2
  48. data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
  49. data/lib/project_types/extension/forms/create.rb +28 -34
  50. data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
  51. data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
  52. data/lib/project_types/extension/forms/questions/ask_type.rb +47 -0
  53. data/lib/project_types/extension/messages/message_loading.rb +3 -1
  54. data/lib/project_types/extension/messages/messages.rb +55 -52
  55. data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
  56. data/lib/project_types/extension/models/registration.rb +1 -0
  57. data/lib/project_types/extension/models/specification.rb +39 -0
  58. data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +19 -0
  59. data/lib/project_types/extension/models/specification_handlers/default.rb +75 -0
  60. data/lib/project_types/extension/models/specifications.rb +88 -0
  61. data/lib/project_types/extension/tasks/configure_features.rb +54 -0
  62. data/lib/project_types/extension/tasks/converters/app_converter.rb +6 -6
  63. data/lib/project_types/extension/tasks/converters/registration_converter.rb +8 -6
  64. data/lib/project_types/extension/tasks/converters/validation_error_converter.rb +4 -4
  65. data/lib/project_types/extension/tasks/converters/version_converter.rb +7 -7
  66. data/lib/project_types/extension/tasks/create_extension.rb +4 -4
  67. data/lib/project_types/extension/tasks/fetch_specifications.rb +18 -0
  68. data/lib/project_types/extension/tasks/get_app.rb +4 -4
  69. data/lib/project_types/extension/tasks/get_apps.rb +3 -3
  70. data/lib/project_types/extension/tasks/update_draft.rb +4 -4
  71. data/lib/project_types/extension/tasks/user_errors.rb +4 -4
  72. data/lib/project_types/node/cli.rb +19 -19
  73. data/lib/project_types/node/commands/connect.rb +3 -3
  74. data/lib/project_types/node/commands/create.rb +42 -38
  75. data/lib/project_types/node/commands/deploy.rb +4 -4
  76. data/lib/project_types/node/commands/deploy/heroku.rb +24 -24
  77. data/lib/project_types/node/commands/generate.rb +3 -34
  78. data/lib/project_types/node/commands/open.rb +2 -2
  79. data/lib/project_types/node/commands/populate.rb +6 -6
  80. data/lib/project_types/node/commands/populate/customer.rb +5 -5
  81. data/lib/project_types/node/commands/populate/draft_order.rb +5 -5
  82. data/lib/project_types/node/commands/populate/product.rb +5 -5
  83. data/lib/project_types/node/commands/serve.rb +9 -9
  84. data/lib/project_types/node/commands/tunnel.rb +7 -7
  85. data/lib/project_types/node/forms/create.rb +17 -8
  86. data/lib/project_types/node/messages/messages.rb +13 -47
  87. data/lib/project_types/rails/cli.rb +21 -21
  88. data/lib/project_types/rails/commands/connect.rb +3 -3
  89. data/lib/project_types/rails/commands/create.rb +56 -54
  90. data/lib/project_types/rails/commands/deploy.rb +4 -4
  91. data/lib/project_types/rails/commands/deploy/heroku.rb +30 -30
  92. data/lib/project_types/rails/commands/generate.rb +7 -7
  93. data/lib/project_types/rails/commands/generate/webhook.rb +6 -6
  94. data/lib/project_types/rails/commands/open.rb +2 -2
  95. data/lib/project_types/rails/commands/populate.rb +6 -6
  96. data/lib/project_types/rails/commands/populate/customer.rb +5 -5
  97. data/lib/project_types/rails/commands/populate/draft_order.rb +5 -5
  98. data/lib/project_types/rails/commands/populate/product.rb +5 -5
  99. data/lib/project_types/rails/commands/serve.rb +11 -11
  100. data/lib/project_types/rails/commands/tunnel.rb +7 -7
  101. data/lib/project_types/rails/forms/create.rb +35 -25
  102. data/lib/project_types/rails/gem.rb +24 -24
  103. data/lib/project_types/rails/messages/messages.rb +6 -5
  104. data/lib/project_types/rails/ruby.rb +2 -2
  105. data/lib/project_types/script/cli.rb +38 -39
  106. data/lib/project_types/script/commands/create.rb +12 -14
  107. data/lib/project_types/script/commands/push.rb +10 -17
  108. data/lib/project_types/script/config/extension_points.yml +29 -10
  109. data/lib/project_types/script/errors.rb +1 -2
  110. data/lib/project_types/script/forms/create.rb +18 -5
  111. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +9 -1
  112. data/lib/project_types/script/graphql/script_service_proxy.graphql +1 -2
  113. data/lib/project_types/script/layers/application/build_script.rb +10 -7
  114. data/lib/project_types/script/layers/application/create_script.rb +37 -25
  115. data/lib/project_types/script/layers/application/extension_points.rb +25 -0
  116. data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
  117. data/lib/project_types/script/layers/application/push_script.rb +13 -18
  118. data/lib/project_types/script/layers/domain/config_ui.rb +16 -0
  119. data/lib/project_types/script/layers/domain/errors.rb +20 -0
  120. data/lib/project_types/script/layers/domain/extension_point.rb +82 -11
  121. data/lib/project_types/script/layers/domain/metadata.rb +48 -0
  122. data/lib/project_types/script/layers/domain/push_package.rb +25 -6
  123. data/lib/project_types/script/layers/domain/script_project.rb +34 -0
  124. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +42 -13
  125. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +24 -49
  126. data/lib/project_types/script/layers/infrastructure/errors.rb +32 -19
  127. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
  128. data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
  129. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +22 -17
  130. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
  131. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
  132. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +145 -0
  133. data/lib/project_types/script/layers/infrastructure/script_service.rb +32 -75
  134. data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
  135. data/lib/project_types/script/messages/messages.rb +58 -59
  136. data/lib/project_types/script/ui/error_handler.rb +115 -72
  137. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  138. data/lib/project_types/script/ui/strict_spinner.rb +1 -1
  139. data/lib/project_types/theme/cli.rb +40 -0
  140. data/lib/project_types/theme/commands/connect.rb +54 -0
  141. data/lib/project_types/theme/commands/create.rb +48 -0
  142. data/lib/project_types/theme/commands/deploy.rb +38 -0
  143. data/lib/project_types/theme/commands/generate.rb +20 -0
  144. data/lib/project_types/theme/commands/generate/env.rb +79 -0
  145. data/lib/project_types/theme/commands/push.rb +55 -0
  146. data/lib/project_types/theme/commands/serve.rb +31 -0
  147. data/lib/project_types/theme/forms/connect.rb +34 -0
  148. data/lib/project_types/theme/forms/create.rb +22 -0
  149. data/lib/project_types/theme/messages/messages.rb +147 -0
  150. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
  151. data/lib/project_types/theme/themekit.rb +113 -0
  152. data/lib/rubygems_plugin.rb +3 -3
  153. data/lib/shopify-cli/admin_api.rb +52 -12
  154. data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
  155. data/lib/shopify-cli/admin_api/schema.rb +3 -3
  156. data/lib/shopify-cli/api.rb +34 -31
  157. data/lib/shopify-cli/command.rb +1 -1
  158. data/lib/shopify-cli/commands.rb +9 -9
  159. data/lib/shopify-cli/commands/config.rb +28 -52
  160. data/lib/shopify-cli/commands/connect.rb +10 -10
  161. data/lib/shopify-cli/commands/create.rb +5 -5
  162. data/lib/shopify-cli/commands/help.rb +6 -6
  163. data/lib/shopify-cli/commands/logout.rb +3 -3
  164. data/lib/shopify-cli/commands/system.rb +33 -33
  165. data/lib/shopify-cli/commands/version.rb +2 -2
  166. data/lib/shopify-cli/context.rb +71 -22
  167. data/lib/shopify-cli/core.rb +4 -4
  168. data/lib/shopify-cli/core/entry_point.rb +5 -5
  169. data/lib/shopify-cli/core/executor.rb +1 -1
  170. data/lib/shopify-cli/core/help_resolver.rb +2 -2
  171. data/lib/shopify-cli/core/monorail.rb +16 -16
  172. data/lib/shopify-cli/db.rb +2 -2
  173. data/lib/shopify-cli/feature.rb +1 -3
  174. data/lib/shopify-cli/form.rb +1 -1
  175. data/lib/shopify-cli/git.rb +17 -17
  176. data/lib/shopify-cli/helpers.rb +1 -1
  177. data/lib/shopify-cli/helpers/haikunator.rb +1 -1
  178. data/lib/shopify-cli/heroku.rb +28 -28
  179. data/lib/shopify-cli/http_request.rb +21 -9
  180. data/lib/shopify-cli/js_deps.rb +12 -12
  181. data/lib/shopify-cli/js_system.rb +5 -5
  182. data/lib/shopify-cli/lazy_delegator.rb +55 -0
  183. data/lib/shopify-cli/messages/messages.rb +9 -16
  184. data/lib/shopify-cli/method_object.rb +104 -0
  185. data/lib/shopify-cli/oauth.rb +25 -25
  186. data/lib/shopify-cli/oauth/servlet.rb +9 -9
  187. data/lib/shopify-cli/options.rb +3 -3
  188. data/lib/shopify-cli/packager.rb +24 -24
  189. data/lib/shopify-cli/partners_api.rb +24 -18
  190. data/lib/shopify-cli/partners_api/organizations.rb +10 -10
  191. data/lib/shopify-cli/process_supervision.rb +7 -7
  192. data/lib/shopify-cli/project.rb +16 -16
  193. data/lib/shopify-cli/project_type.rb +4 -4
  194. data/lib/shopify-cli/resolve_constant.rb +25 -0
  195. data/lib/shopify-cli/resources.rb +1 -1
  196. data/lib/shopify-cli/resources/env_file.rb +9 -9
  197. data/lib/shopify-cli/result.rb +432 -0
  198. data/lib/shopify-cli/shopifolk.rb +6 -8
  199. data/lib/shopify-cli/sub_command.rb +1 -1
  200. data/lib/shopify-cli/task.rb +3 -3
  201. data/lib/shopify-cli/tasks.rb +7 -7
  202. data/lib/shopify-cli/tasks/create_api_client.rb +5 -5
  203. data/lib/shopify-cli/tasks/ensure_dev_store.rb +12 -12
  204. data/lib/shopify-cli/tasks/ensure_env.rb +15 -15
  205. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
  206. data/lib/shopify-cli/tasks/select_org_and_shop.rb +25 -24
  207. data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
  208. data/lib/shopify-cli/transform_data_structure.rb +86 -0
  209. data/lib/shopify-cli/tunnel.rb +36 -30
  210. data/lib/shopify-cli/version.rb +1 -1
  211. data/lib/shopify_cli.rb +57 -52
  212. data/shopify-cli.gemspec +6 -6
  213. data/shopify.fish +1 -1
  214. data/shopify.sh +1 -1
  215. data/vendor/deps/cli-kit/REVISION +1 -1
  216. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
  217. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
  218. data/vendor/deps/cli-ui/REVISION +1 -1
  219. data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
  220. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
  221. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
  222. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
  223. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
  224. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
  225. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
  226. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
  227. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
  228. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
  229. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
  230. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
  231. data/vendor/deps/webrick/.gitignore +9 -0
  232. data/vendor/deps/webrick/Gemfile +3 -0
  233. data/vendor/deps/webrick/LICENSE.txt +22 -0
  234. data/vendor/deps/webrick/README.md +61 -0
  235. data/vendor/deps/webrick/Rakefile +10 -0
  236. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  237. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  238. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  239. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  240. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  241. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  242. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  243. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  244. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  245. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  246. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  247. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  248. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  249. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  250. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  251. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  252. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  253. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  254. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  255. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  256. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  257. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  258. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  259. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  260. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  261. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  262. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  263. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  264. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  265. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  266. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  267. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  268. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  269. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  270. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  271. data/vendor/deps/webrick/webrick.gemspec +74 -0
  272. data/vendor/gen/template/bin/update-deps +9 -9
  273. metadata +83 -35
  274. data/docs/Gemfile +0 -5
  275. data/docs/Gemfile.lock +0 -258
  276. data/docs/_data/nav.yml +0 -35
  277. data/docs/_includes/footer.html +0 -15
  278. data/docs/_includes/head.html +0 -19
  279. data/docs/_includes/sidebar_nav.html +0 -22
  280. data/docs/_includes/toc.html +0 -112
  281. data/docs/_layouts/default.html +0 -79
  282. data/docs/css/docs.css +0 -157
  283. data/docs/images/header.png +0 -0
  284. data/docs/installing-ruby.md +0 -28
  285. data/lib/project_types/extension/features/argo/admin.rb +0 -20
  286. data/lib/project_types/extension/features/argo/base.rb +0 -129
  287. data/lib/project_types/extension/features/argo/checkout.rb +0 -20
  288. data/lib/project_types/extension/forms/register.rb +0 -47
  289. data/lib/project_types/extension/models/type.rb +0 -81
  290. data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
  291. data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
  292. data/lib/project_types/node/commands/generate/billing.rb +0 -39
  293. data/lib/project_types/node/commands/generate/page.rb +0 -59
  294. data/lib/project_types/node/commands/generate/webhook.rb +0 -37
  295. data/lib/project_types/script/commands/disable.rb +0 -25
  296. data/lib/project_types/script/commands/enable.rb +0 -78
  297. data/lib/project_types/script/graphql/shop_script_delete.graphql +0 -14
  298. data/lib/project_types/script/graphql/shop_script_update_or_create.graphql +0 -28
  299. data/lib/project_types/script/layers/application/disable_script.rb +0 -21
  300. data/lib/project_types/script/layers/application/enable_script.rb +0 -23
  301. data/lib/project_types/script/layers/domain/script.rb +0 -18
  302. data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -47
  303. data/lib/project_types/script/script_project.rb +0 -54
  304. data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
  305. data/lib/project_types/script/templates/ts/as-pect.d.ts +0 -1
@@ -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
@@ -0,0 +1,32 @@
1
+ module Extension
2
+ module Features
3
+ class ArgoRendererPackage
4
+ include SmartProperties
5
+
6
+ ARGO_CHECKOUT = "@shopify/argo-checkout"
7
+ ARGO_ADMIN = "@shopify/argo-admin"
8
+
9
+ PACKAGE_NAMES = [
10
+ ARGO_CHECKOUT,
11
+ ARGO_ADMIN,
12
+ ].freeze
13
+ MINIMUM_ARGO_VERSION = "0.9.3".freeze
14
+
15
+ property! :package_name, accepts: PACKAGE_NAMES
16
+ property! :version, accepts: String
17
+
18
+ def checkout?
19
+ package_name == ARGO_CHECKOUT
20
+ end
21
+
22
+ def admin?
23
+ package_name == ARGO_ADMIN
24
+ end
25
+
26
+ def supports_uuid_flag?
27
+ return false if checkout?
28
+ Gem::Version.new(version) > Gem::Version.new(MINIMUM_ARGO_VERSION)
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,69 @@
1
+ module Extension
2
+ module Features
3
+ class ArgoServe
4
+ include SmartProperties
5
+
6
+ property! :specification_handler, accepts: Extension::Models::SpecificationHandlers::Default
7
+ property! :context, accepts: ShopifyCli::Context
8
+
9
+ YARN_SERVE_COMMAND = %w(server)
10
+ NPM_SERVE_COMMAND = %w(run-script server)
11
+
12
+ def call
13
+ validate_env!
14
+
15
+ CLI::UI::Frame.open(context.message("serve.frame_title")) do
16
+ success = ShopifyCli::JsSystem.call(context, yarn: yarn_serve_command, npm: npm_serve_command)
17
+ context.abort(context.message("serve.serve_failure_message")) unless success
18
+ end
19
+ end
20
+
21
+ private
22
+
23
+ def specification
24
+ specification_handler.specification
25
+ end
26
+
27
+ def validate_env!
28
+ ExtensionProject.reload
29
+
30
+ ShopifyCli::Shopifolk.check && ShopifyCli::Feature.enabled?(:argo_admin_beta)
31
+
32
+ required_fields = specification.features.argo.required_fields
33
+
34
+ return if required_fields.none?
35
+
36
+ ShopifyCli::Tasks::EnsureEnv.call(context, required: required_fields)
37
+ ShopifyCli::Tasks::EnsureDevStore.call(context) if required_fields.include?(:shop)
38
+
39
+ project = ExtensionProject.current
40
+
41
+ return if required_fields.all? do |field|
42
+ value = project.env.public_send(field)
43
+ value && !value.strip.empty?
44
+ end
45
+
46
+ context.abort(context.message("serve.serve_missing_information"))
47
+ end
48
+
49
+ def yarn_serve_command
50
+ YARN_SERVE_COMMAND + serve_options(specification.features.argo.required_fields)
51
+ end
52
+
53
+ def npm_serve_command
54
+ NPM_SERVE_COMMAND + ["--"] + serve_options(specification.features.argo.required_fields)
55
+ end
56
+
57
+ def serve_options(required_fields)
58
+ renderer_package = specification_handler.renderer_package(context)
59
+ project = ExtensionProject.current
60
+ @serve_options ||= [].tap do |options|
61
+ options << "--shop=#{project.env.shop}" if required_fields.include?(:shop)
62
+ options << "--apiKey=#{project.env.api_key}" if required_fields.include?(:api_key)
63
+ options << "--argoVersion=#{renderer_package.version}" if renderer_package.admin?
64
+ options << "--uuid=#{project.registration_uuid}" if renderer_package.supports_uuid_flag?
65
+ end
66
+ end
67
+ end
68
+ end
69
+ 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
@@ -0,0 +1,40 @@
1
+ module Extension
2
+ module Forms
3
+ module Questions
4
+ class AskName
5
+ include ShopifyCli::MethodObject
6
+
7
+ property! :ctx
8
+ property :name
9
+ property :prompt,
10
+ accepts: ->(prompt) { prompt.respond_to?(:call) },
11
+ default: -> { CLI::UI::Prompt.method(:ask) }
12
+
13
+ def call(project_details)
14
+ project_details.name = ask_with_reprompt(
15
+ initial_value: name,
16
+ break_condition: -> (current_name) { Models::Registration.valid_title?(current_name) },
17
+ prompt_message: ctx.message("create.ask_name"),
18
+ reprompt_message: ctx.message("create.invalid_name", Models::Registration::MAX_TITLE_LENGTH)
19
+ )
20
+ project_details
21
+ end
22
+
23
+ private
24
+
25
+ def ask_with_reprompt(initial_value:, break_condition:, prompt_message:, reprompt_message:)
26
+ value = initial_value
27
+ reprompt = false
28
+
29
+ until break_condition.call(value)
30
+ ctx.puts(reprompt_message) if reprompt
31
+ value = prompt.call(prompt_message)&.strip
32
+ reprompt = true
33
+ end
34
+
35
+ value
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,47 @@
1
+ module Extension
2
+ module Forms
3
+ module Questions
4
+ class AskType
5
+ include ShopifyCli::MethodObject
6
+
7
+ property! :ctx
8
+ property :type
9
+ property :prompt,
10
+ converts: :to_proc,
11
+ default: -> { CLI::UI::Prompt.method(:ask) }
12
+
13
+ def call(project_details)
14
+ specifications = Models::Specifications.new(
15
+ fetch_specifications: Tasks::FetchSpecifications.new(context: ctx, api_key: project_details.app.api_key)
16
+ )
17
+
18
+ project_details.tap do |p|
19
+ p.type = type.nil? ? choose_type(specifications) : validate_given_type(specifications, type)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def validate_given_type(specifications, type)
26
+ return specifications[type] if specifications.valid?(type)
27
+ ctx.abort(ctx.message("create.invalid_type")) unless type.nil?
28
+ end
29
+
30
+ def choose_type(specifications)
31
+ abort_due_to_missing_specifications if specifications.none?
32
+
33
+ prompt.call(ctx.message("create.ask_type")) do |handler|
34
+ specifications.each do |type|
35
+ handler.option("#{type.name} #{type.tagline}") { type }
36
+ end
37
+ end
38
+ end
39
+
40
+ def abort_due_to_missing_specifications
41
+ ctx.puts(@ctx.message("create.no_available_extensions"))
42
+ raise ShopifyCli::AbortSilent
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
@@ -16,7 +16,9 @@ module Extension
16
16
 
17
17
  def self.load_current_type_messages
18
18
  return unless ShopifyCli::Project.has_current?
19
- messages_for_type(ShopifyCli::Project.current.config[Extension::ExtensionProjectKeys::EXTENSION_TYPE_KEY])
19
+ messages_for_type(
20
+ ShopifyCli::Project.current.config[Extension::ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY]
21
+ )
20
22
  end
21
23
 
22
24
  def self.messages_for_type(type_identifier)