shopify-cli 2.4.0 → 2.6.2

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 (250) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/shopify.yml +0 -2
  3. data/.gitignore +1 -0
  4. data/.rubocop.yml +14 -14
  5. data/.rubocop_todo.yml +3 -3
  6. data/CHANGELOG.md +25 -0
  7. data/Dockerfile +1 -3
  8. data/Gemfile.lock +22 -16
  9. data/README.md +1 -1
  10. data/RELEASING.md +1 -1
  11. data/Rakefile +25 -34
  12. data/bin/console +11 -0
  13. data/bin/shopify +17 -4
  14. data/dev.yml +3 -0
  15. data/ext/shopify-cli/extconf.rb +1 -0
  16. data/lib/project_types/extension/cli.rb +5 -3
  17. data/lib/project_types/extension/commands/build.rb +4 -3
  18. data/lib/project_types/extension/commands/check.rb +2 -2
  19. data/lib/project_types/extension/commands/connect.rb +1 -1
  20. data/lib/project_types/extension/commands/create.rb +41 -23
  21. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  22. data/lib/project_types/extension/commands/info.rb +1 -1
  23. data/lib/project_types/extension/commands/push.rb +1 -1
  24. data/lib/project_types/extension/commands/register.rb +2 -2
  25. data/lib/project_types/extension/commands/serve.rb +5 -5
  26. data/lib/project_types/extension/commands/tunnel.rb +6 -6
  27. data/lib/project_types/extension/extension_project.rb +4 -4
  28. data/lib/project_types/extension/features/argo.rb +3 -3
  29. data/lib/project_types/extension/features/argo_config.rb +5 -5
  30. data/lib/project_types/extension/features/argo_serve.rb +21 -6
  31. data/lib/project_types/extension/features/argo_setup.rb +1 -1
  32. data/lib/project_types/extension/features/argo_setup_step.rb +1 -1
  33. data/lib/project_types/extension/features/argo_setup_steps.rb +2 -2
  34. data/lib/project_types/extension/forms/connect.rb +2 -2
  35. data/lib/project_types/extension/forms/create.rb +2 -2
  36. data/lib/project_types/extension/forms/questions/ask_app.rb +2 -2
  37. data/lib/project_types/extension/forms/questions/ask_name.rb +1 -1
  38. data/lib/project_types/extension/forms/questions/ask_registration.rb +2 -2
  39. data/lib/project_types/extension/forms/questions/ask_template.rb +2 -2
  40. data/lib/project_types/extension/forms/questions/ask_type.rb +2 -2
  41. data/lib/project_types/extension/messages/message_loading.rb +2 -2
  42. data/lib/project_types/extension/models/development_server.rb +49 -6
  43. data/lib/project_types/extension/models/development_server_requirements.rb +21 -3
  44. data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
  45. data/lib/project_types/extension/models/specification.rb +1 -1
  46. data/lib/project_types/extension/models/specification_handlers/default.rb +14 -2
  47. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +1 -1
  48. data/lib/project_types/extension/models/specifications.rb +4 -4
  49. data/lib/project_types/extension/tasks/choose_next_available_port.rb +1 -1
  50. data/lib/project_types/extension/tasks/configure_features.rb +1 -1
  51. data/lib/project_types/extension/tasks/configure_options.rb +1 -1
  52. data/lib/project_types/extension/tasks/converters/product_converter.rb +1 -1
  53. data/lib/project_types/extension/tasks/converters/server_config_converter.rb +31 -0
  54. data/lib/project_types/extension/tasks/create_extension.rb +2 -2
  55. data/lib/project_types/extension/tasks/fetch_specifications.rb +2 -2
  56. data/lib/project_types/extension/tasks/find_npm_packages.rb +5 -5
  57. data/lib/project_types/extension/tasks/get_app.rb +2 -2
  58. data/lib/project_types/extension/tasks/get_apps.rb +2 -2
  59. data/lib/project_types/extension/tasks/get_extensions.rb +2 -2
  60. data/lib/project_types/extension/tasks/get_product.rb +2 -2
  61. data/lib/project_types/extension/tasks/load_server_config.rb +23 -0
  62. data/lib/project_types/extension/tasks/run_extension_command.rb +34 -11
  63. data/lib/project_types/extension/tasks/update_draft.rb +2 -2
  64. data/lib/project_types/node/cli.rb +3 -3
  65. data/lib/project_types/node/commands/connect.rb +4 -4
  66. data/lib/project_types/node/commands/create.rb +10 -10
  67. data/lib/project_types/node/commands/deploy/heroku.rb +4 -4
  68. data/lib/project_types/node/commands/deploy.rb +3 -3
  69. data/lib/project_types/node/commands/generate.rb +2 -2
  70. data/lib/project_types/node/commands/open.rb +3 -3
  71. data/lib/project_types/node/commands/serve.rb +15 -7
  72. data/lib/project_types/node/commands/tunnel.rb +6 -6
  73. data/lib/project_types/node/forms/create.rb +3 -3
  74. data/lib/project_types/node/messages/messages.rb +3 -0
  75. data/lib/project_types/php/cli.rb +27 -0
  76. data/lib/project_types/php/commands/connect.rb +19 -0
  77. data/lib/project_types/php/commands/create.rb +143 -0
  78. data/lib/project_types/php/commands/deploy/heroku.rb +129 -0
  79. data/lib/project_types/php/commands/deploy.rb +32 -0
  80. data/lib/project_types/php/commands/open.rb +16 -0
  81. data/lib/project_types/php/commands/serve.rb +51 -0
  82. data/lib/project_types/php/commands/tunnel.rb +37 -0
  83. data/lib/project_types/php/forms/create.rb +45 -0
  84. data/lib/project_types/php/messages/messages.rb +191 -0
  85. data/lib/project_types/rails/cli.rb +3 -3
  86. data/lib/project_types/rails/commands/connect.rb +4 -4
  87. data/lib/project_types/rails/commands/create.rb +12 -12
  88. data/lib/project_types/rails/commands/deploy/heroku.rb +4 -4
  89. data/lib/project_types/rails/commands/deploy.rb +3 -3
  90. data/lib/project_types/rails/commands/generate/webhook.rb +3 -3
  91. data/lib/project_types/rails/commands/generate.rb +3 -3
  92. data/lib/project_types/rails/commands/open.rb +3 -3
  93. data/lib/project_types/rails/commands/serve.rb +8 -8
  94. data/lib/project_types/rails/commands/tunnel.rb +6 -6
  95. data/lib/project_types/rails/forms/create.rb +3 -3
  96. data/lib/project_types/rails/gem.rb +1 -1
  97. data/lib/project_types/rails/ruby.rb +1 -1
  98. data/lib/project_types/script/cli.rb +15 -7
  99. data/lib/project_types/script/commands/create.rb +4 -2
  100. data/lib/project_types/script/commands/push.rb +2 -2
  101. data/lib/project_types/script/config/extension_points.yml +30 -29
  102. data/lib/project_types/script/forms/create.rb +1 -1
  103. data/lib/project_types/script/layers/application/create_script.rb +32 -12
  104. data/lib/project_types/script/layers/application/extension_points.rb +4 -4
  105. data/lib/project_types/script/layers/application/push_script.rb +4 -1
  106. data/lib/project_types/script/layers/domain/extension_point.rb +13 -45
  107. data/lib/project_types/script/layers/domain/script_project.rb +2 -2
  108. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +57 -0
  109. data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +35 -0
  110. data/lib/project_types/script/layers/infrastructure/command_runner.rb +1 -1
  111. data/lib/project_types/script/layers/infrastructure/errors.rb +5 -0
  112. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +10 -90
  113. data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +76 -11
  114. data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +1 -1
  115. data/lib/project_types/script/layers/infrastructure/languages/typescript_project_creator.rb +33 -0
  116. data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +105 -0
  117. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -1
  118. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +6 -6
  119. data/lib/project_types/script/layers/infrastructure/script_service.rb +4 -8
  120. data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
  121. data/lib/project_types/script/messages/messages.rb +4 -0
  122. data/lib/project_types/script/tasks/ensure_env.rb +6 -6
  123. data/lib/project_types/script/ui/error_handler.rb +83 -75
  124. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  125. data/lib/project_types/theme/cli.rb +3 -3
  126. data/lib/project_types/theme/commands/check.rb +3 -3
  127. data/lib/project_types/theme/commands/delete.rb +7 -7
  128. data/lib/project_types/theme/commands/init.rb +3 -3
  129. data/lib/project_types/theme/commands/language_server.rb +2 -2
  130. data/lib/project_types/theme/commands/package.rb +2 -2
  131. data/lib/project_types/theme/commands/publish.rb +5 -5
  132. data/lib/project_types/theme/commands/pull.rb +9 -9
  133. data/lib/project_types/theme/commands/push.rb +12 -12
  134. data/lib/project_types/theme/commands/serve.rb +4 -4
  135. data/lib/project_types/theme/forms/confirm_store.rb +1 -1
  136. data/lib/project_types/theme/forms/select.rb +2 -2
  137. data/lib/{shopify-cli → shopify_cli}/admin_api/populate_resource_command.rb +3 -3
  138. data/lib/{shopify-cli → shopify_cli}/admin_api/schema.rb +4 -4
  139. data/lib/{shopify-cli → shopify_cli}/admin_api.rb +27 -27
  140. data/lib/{shopify-cli → shopify_cli}/api.rb +12 -8
  141. data/lib/shopify_cli/command/app_sub_command.rb +16 -0
  142. data/lib/{shopify-cli → shopify_cli}/command.rb +3 -3
  143. data/lib/{shopify-cli → shopify_cli}/commands/config.rb +14 -14
  144. data/lib/{shopify-cli → shopify_cli}/commands/help.rb +4 -4
  145. data/lib/{shopify-cli → shopify_cli}/commands/login.rb +7 -7
  146. data/lib/shopify_cli/commands/logout.rb +39 -0
  147. data/lib/{shopify-cli → shopify_cli}/commands/populate/customer.rb +4 -4
  148. data/lib/{shopify-cli → shopify_cli}/commands/populate/draft_order.rb +4 -4
  149. data/lib/{shopify-cli → shopify_cli}/commands/populate/product.rb +4 -4
  150. data/lib/shopify_cli/commands/populate.rb +23 -0
  151. data/lib/shopify_cli/commands/store.rb +15 -0
  152. data/lib/{shopify-cli → shopify_cli}/commands/switch.rb +5 -5
  153. data/lib/{shopify-cli → shopify_cli}/commands/system.rb +10 -10
  154. data/lib/shopify_cli/commands/version.rb +15 -0
  155. data/lib/{shopify-cli → shopify_cli}/commands/whoami.rb +7 -7
  156. data/lib/shopify_cli/commands.rb +34 -0
  157. data/lib/{shopify-cli → shopify_cli}/connect.rb +3 -3
  158. data/lib/shopify_cli/constants.rb +54 -0
  159. data/lib/{shopify-cli → shopify_cli}/context.rb +6 -6
  160. data/lib/{shopify-cli → shopify_cli}/core/entry_point.rb +7 -7
  161. data/lib/{shopify-cli → shopify_cli}/core/executor.rb +8 -4
  162. data/lib/{shopify-cli → shopify_cli}/core/finalize.rb +1 -1
  163. data/lib/{shopify-cli → shopify_cli}/core/help_resolver.rb +2 -2
  164. data/lib/{shopify-cli → shopify_cli}/core/monorail.rb +8 -8
  165. data/lib/shopify_cli/core.rb +8 -0
  166. data/lib/{shopify-cli → shopify_cli}/db.rb +8 -8
  167. data/lib/{shopify-cli → shopify_cli}/environment.rb +36 -5
  168. data/lib/shopify_cli/exception_reporter/permission_controller.rb +54 -0
  169. data/lib/shopify_cli/exception_reporter.rb +55 -0
  170. data/lib/{shopify-cli → shopify_cli}/feature.rb +8 -8
  171. data/lib/{shopify-cli → shopify_cli}/form.rb +2 -2
  172. data/lib/{shopify-cli → shopify_cli}/git.rb +36 -6
  173. data/lib/{shopify-cli → shopify_cli}/helpers/haikunator.rb +1 -1
  174. data/lib/shopify_cli/helpers.rb +5 -0
  175. data/lib/{shopify-cli → shopify_cli}/heroku.rb +38 -13
  176. data/lib/{shopify-cli → shopify_cli}/http_request.rb +1 -1
  177. data/lib/{shopify-cli → shopify_cli}/identity_auth/servlet.rb +1 -1
  178. data/lib/{shopify-cli → shopify_cli}/identity_auth.rb +8 -8
  179. data/lib/{shopify-cli → shopify_cli}/js_deps.rb +7 -7
  180. data/lib/{shopify-cli → shopify_cli}/js_system.rb +10 -10
  181. data/lib/{shopify-cli → shopify_cli}/lazy_delegator.rb +2 -2
  182. data/lib/{shopify-cli → shopify_cli}/messages/messages.rb +44 -2
  183. data/lib/{shopify-cli → shopify_cli}/method_object.rb +15 -8
  184. data/lib/shopify_cli/migrator/migration.rb +27 -0
  185. data/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +13 -0
  186. data/lib/shopify_cli/migrator.rb +48 -0
  187. data/lib/{shopify-cli → shopify_cli}/options.rb +1 -1
  188. data/lib/{shopify-cli → shopify_cli}/packager.rb +8 -8
  189. data/lib/{shopify-cli → shopify_cli}/partners_api/organizations.rb +1 -1
  190. data/lib/{shopify-cli → shopify_cli}/partners_api.rb +13 -13
  191. data/lib/shopify_cli/php_deps.rb +102 -0
  192. data/lib/{shopify-cli → shopify_cli}/process_supervision.rb +10 -8
  193. data/lib/{shopify-cli → shopify_cli}/project.rb +15 -15
  194. data/lib/{shopify-cli → shopify_cli}/project_commands.rb +3 -3
  195. data/lib/{shopify-cli → shopify_cli}/project_type.rb +5 -5
  196. data/lib/{shopify-cli → shopify_cli}/resolve_constant.rb +5 -5
  197. data/lib/{shopify-cli → shopify_cli}/resources/env_file.rb +1 -1
  198. data/lib/shopify_cli/resources.rb +5 -0
  199. data/lib/{shopify-cli → shopify_cli}/result.rb +11 -11
  200. data/lib/{shopify-cli → shopify_cli}/shopifolk.rb +6 -6
  201. data/lib/{shopify-cli → shopify_cli}/sub_command.rb +1 -1
  202. data/lib/{shopify-cli → shopify_cli}/task.rb +1 -1
  203. data/lib/{shopify-cli → shopify_cli}/tasks/confirm_store.rb +3 -3
  204. data/lib/{shopify-cli → shopify_cli}/tasks/create_api_client.rb +4 -4
  205. data/lib/shopify_cli/tasks/ensure_authenticated.rb +13 -0
  206. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_dev_store.rb +5 -5
  207. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_env.rb +3 -3
  208. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_loopback_url.rb +4 -4
  209. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_project_type.rb +3 -3
  210. data/lib/{shopify-cli → shopify_cli}/tasks/select_org_and_shop.rb +8 -8
  211. data/lib/{shopify-cli → shopify_cli}/tasks/update_dashboard_urls.rb +6 -6
  212. data/lib/{shopify-cli → shopify_cli}/tasks.rb +10 -10
  213. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/certificate_manager.rb +5 -5
  214. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/header_hash.rb +1 -1
  215. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot-reload.js +0 -0
  216. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot_reload.rb +1 -1
  217. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/local_assets.rb +1 -1
  218. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/proxy.rb +2 -2
  219. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/sse.rb +1 -1
  220. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/watcher.rb +1 -1
  221. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/web_server.rb +1 -1
  222. data/lib/{shopify-cli → shopify_cli}/theme/dev_server.rb +3 -3
  223. data/lib/{shopify-cli → shopify_cli}/theme/development_theme.rb +9 -9
  224. data/lib/{shopify-cli → shopify_cli}/theme/file.rb +1 -1
  225. data/lib/{shopify-cli → shopify_cli}/theme/ignore_filter.rb +1 -1
  226. data/lib/{shopify-cli → shopify_cli}/theme/mime_type.rb +1 -1
  227. data/lib/{shopify-cli → shopify_cli}/theme/syncer.rb +6 -6
  228. data/lib/{shopify-cli → shopify_cli}/theme/theme.rb +4 -4
  229. data/lib/{shopify-cli → shopify_cli}/transform_data_structure.rb +4 -4
  230. data/lib/{shopify-cli → shopify_cli}/tunnel.rb +14 -14
  231. data/lib/shopify_cli/version.rb +3 -0
  232. data/lib/shopify_cli.rb +61 -52
  233. data/shopify-cli.gemspec +11 -3
  234. data/utilities/docker.rb +47 -0
  235. data/utilities/utilities.rb +5 -0
  236. metadata +133 -95
  237. data/lib/project_types/script/layers/infrastructure/api_clients.rb +0 -89
  238. data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +0 -73
  239. data/lib/project_types/script/layers/infrastructure/languages/rust_task_runner.rb +0 -60
  240. data/lib/shopify-cli/commands/logout.rb +0 -39
  241. data/lib/shopify-cli/commands/populate.rb +0 -23
  242. data/lib/shopify-cli/commands/store.rb +0 -15
  243. data/lib/shopify-cli/commands/version.rb +0 -15
  244. data/lib/shopify-cli/commands.rb +0 -34
  245. data/lib/shopify-cli/constants.rb +0 -26
  246. data/lib/shopify-cli/core.rb +0 -8
  247. data/lib/shopify-cli/helpers.rb +0 -5
  248. data/lib/shopify-cli/resources.rb +0 -5
  249. data/lib/shopify-cli/tasks/ensure_authenticated.rb +0 -13
  250. data/lib/shopify-cli/version.rb +0 -3
@@ -18,7 +18,7 @@ module Extension
18
18
  end
19
19
 
20
20
  def self.help
21
- ShopifyCli::Context.new.message("push.help", ShopifyCli::TOOL_NAME)
21
+ ShopifyCLI::Context.new.message("push.help", ShopifyCLI::TOOL_NAME)
22
22
  end
23
23
 
24
24
  private
@@ -20,7 +20,7 @@ module Extension
20
20
  end
21
21
 
22
22
  def self.help
23
- ShopifyCli::Context.new.message("register.help", ShopifyCli::TOOL_NAME)
23
+ ShopifyCLI::Context.new.message("register.help", ShopifyCLI::TOOL_NAME)
24
24
  end
25
25
 
26
26
  private
@@ -60,7 +60,7 @@ module Extension
60
60
 
61
61
  def abort_not_registered
62
62
  @ctx.puts(@ctx.message("register.confirm_abort"))
63
- raise ShopifyCli::AbortSilent
63
+ raise ShopifyCLI::AbortSilent
64
64
  end
65
65
  end
66
66
  end
@@ -29,7 +29,7 @@ module Extension
29
29
  resource_url: options.flags[:resource_url]
30
30
  )
31
31
 
32
- ShopifyCli::Result
32
+ ShopifyCLI::Result
33
33
  .success(config)
34
34
  .then(&method(:find_available_port))
35
35
  .then(&method(:start_tunnel_if_required))
@@ -38,7 +38,7 @@ module Extension
38
38
  end
39
39
 
40
40
  def self.help
41
- ShopifyCli::Context.new.message("serve.help", ShopifyCli::TOOL_NAME)
41
+ ShopifyCLI::Context.new.message("serve.help", ShopifyCLI::TOOL_NAME)
42
42
  end
43
43
 
44
44
  private
@@ -66,12 +66,12 @@ module Extension
66
66
  end
67
67
 
68
68
  def can_start_tunnel?(runtime_configuration)
69
- return true if ShopifyCli::Tunnel.urls.empty?
70
- ShopifyCli::Tunnel.running_on?(runtime_configuration.port)
69
+ return true if ShopifyCLI::Tunnel.urls.empty?
70
+ ShopifyCLI::Tunnel.running_on?(runtime_configuration.port)
71
71
  end
72
72
 
73
73
  def start_tunnel(runtime_configuration)
74
- tunnel_url = ShopifyCli::Tunnel.start(@ctx, port: runtime_configuration.port)
74
+ tunnel_url = ShopifyCLI::Tunnel.start(@ctx, port: runtime_configuration.port)
75
75
  runtime_configuration.tap { |c| c.tunnel_url = tunnel_url }
76
76
  end
77
77
 
@@ -21,25 +21,25 @@ module Extension
21
21
 
22
22
  case subcommand
23
23
  when AUTH_SUBCOMMAND then authorize(args)
24
- when START_SUBCOMMAND then ShopifyCli::Tunnel.start(@ctx, port: port)
25
- when STOP_SUBCOMMAND then ShopifyCli::Tunnel.stop(@ctx)
24
+ when START_SUBCOMMAND then ShopifyCLI::Tunnel.start(@ctx, port: port)
25
+ when STOP_SUBCOMMAND then ShopifyCLI::Tunnel.stop(@ctx)
26
26
  when STATUS_SUBCOMMAND then status
27
27
  else @ctx.puts(self.class.help)
28
28
  end
29
29
  end
30
30
 
31
31
  def self.help
32
- ShopifyCli::Context.message("tunnel.help", ShopifyCli::TOOL_NAME)
32
+ ShopifyCLI::Context.message("tunnel.help", ShopifyCLI::TOOL_NAME)
33
33
  end
34
34
 
35
35
  def self.extended_help
36
- ShopifyCli::Context.message("tunnel.extended_help", ShopifyCli::TOOL_NAME, DEFAULT_PORT)
36
+ ShopifyCLI::Context.message("tunnel.extended_help", ShopifyCLI::TOOL_NAME, DEFAULT_PORT)
37
37
  end
38
38
 
39
39
  private
40
40
 
41
41
  def status
42
- tunnel_urls = ShopifyCli::Tunnel.urls
42
+ tunnel_urls = ShopifyCLI::Tunnel.urls
43
43
  tunnel_url = tunnel_urls.find { |url| url.start_with?("https://") }
44
44
  tunnel_url = tunnel_urls.first if tunnel_url.nil?
45
45
 
@@ -65,7 +65,7 @@ module Extension
65
65
  @ctx.puts(@ctx.message("tunnel.missing_token"))
66
66
  @ctx.puts("#{self.class.help}\n#{self.class.extended_help}")
67
67
  else
68
- ShopifyCli::Tunnel.auth(@ctx, token)
68
+ ShopifyCLI::Tunnel.auth(@ctx, token)
69
69
  end
70
70
  end
71
71
  end
@@ -3,10 +3,10 @@ require "shopify_cli"
3
3
  require "securerandom"
4
4
 
5
5
  module Extension
6
- class ExtensionProject < ShopifyCli::Project
6
+ class ExtensionProject < ShopifyCLI::Project
7
7
  class << self
8
8
  def write_cli_file(context:, type:)
9
- ShopifyCli::Project.write(
9
+ ShopifyCLI::Project.write(
10
10
  context,
11
11
  project_type: :extension,
12
12
  organization_id: nil,
@@ -42,7 +42,7 @@ module Extension
42
42
  resource_url: nil,
43
43
  shop: nil
44
44
  )
45
- ShopifyCli::Resources::EnvFile.new(
45
+ ShopifyCLI::Resources::EnvFile.new(
46
46
  api_key: api_key,
47
47
  secret: api_secret,
48
48
  shop: shop,
@@ -134,7 +134,7 @@ module Extension
134
134
 
135
135
  def validate_env_present
136
136
  return if env
137
- raise ShopifyCli::Abort, "Missing .env file. Run `shopify extension connect` to generate an .env file."
137
+ raise ShopifyCLI::Abort, "Missing .env file. Run `shopify extension connect` to generate an .env file."
138
138
  end
139
139
 
140
140
  def integer?(value)
@@ -24,7 +24,7 @@ module Extension
24
24
  end
25
25
 
26
26
  def config(context)
27
- js_system = ShopifyCli::JsSystem.new(ctx: context)
27
+ js_system = ShopifyCLI::JsSystem.new(ctx: context)
28
28
  if js_system.package_manager == "yarn"
29
29
  run_yarn_install(context, js_system)
30
30
  run_yarn_run_script(context, js_system)
@@ -42,9 +42,9 @@ module Extension
42
42
  end
43
43
 
44
44
  def renderer_package(context)
45
- js_system = ShopifyCli::JsSystem.new(ctx: context)
45
+ js_system = ShopifyCLI::JsSystem.new(ctx: context)
46
46
  Tasks::FindNpmPackages
47
- .exactly_one_of(renderer_package_name, js_system: js_system)
47
+ .exactly_one_of(renderer_package_name, js_system: js_system, production_only: true)
48
48
  .unwrap { |err| raise err }
49
49
  rescue Extension::PackageResolutionFailed
50
50
  context.abort(
@@ -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)
@@ -30,8 +30,8 @@ module Extension
30
30
  config
31
31
  rescue Psych::SyntaxError => e
32
32
  raise(
33
- ShopifyCli::Abort,
34
- ShopifyCli::Context.message("core.yaml.error.invalid", CONFIG_FILE_NAME, e.message)
33
+ ShopifyCLI::Abort,
34
+ ShopifyCLI::Context.message("core.yaml.error.invalid", CONFIG_FILE_NAME, e.message)
35
35
  )
36
36
  end
37
37
  end
@@ -45,8 +45,8 @@ module Extension
45
45
 
46
46
  unless unpermitted_keys.empty?
47
47
  raise(
48
- ShopifyCli::Abort,
49
- ShopifyCli::Context.message(
48
+ ShopifyCLI::Abort,
49
+ ShopifyCLI::Context.message(
50
50
  "features.argo.config.unpermitted_keys",
51
51
  CONFIG_FILE_NAME,
52
52
  unpermitted_keys.map { |k| "\n- #{k}" }.join
@@ -7,11 +7,11 @@ module Extension
7
7
  NPM_SERVE_COMMAND = %w(run-script server)
8
8
 
9
9
  property! :specification_handler, accepts: Extension::Models::SpecificationHandlers::Default
10
- property! :argo_runtime, accepts: -> (runtime) { runtime.class < Features::Runtimes::Base }
11
- property! :context, accepts: ShopifyCli::Context
10
+ property :argo_runtime, accepts: -> (runtime) { runtime.class < Features::Runtimes::Base }
11
+ property! :context, accepts: ShopifyCLI::Context
12
12
  property! :port, accepts: Integer, default: 39351
13
13
  property :tunnel_url, accepts: String, default: nil
14
- property! :js_system, accepts: ->(jss) { jss.respond_to?(:call) }, default: ShopifyCli::JsSystem
14
+ property! :js_system, accepts: ->(jss) { jss.respond_to?(:call) }, default: ShopifyCLI::JsSystem
15
15
  property :resource_url, accepts: String, default: nil
16
16
 
17
17
  def call
@@ -30,6 +30,7 @@ module Extension
30
30
  private
31
31
 
32
32
  def start_server
33
+ return new_serve_flow if supports_development_server?
33
34
  js_system.call(context, yarn: yarn_serve_command, npm: npm_serve_command)
34
35
  end
35
36
 
@@ -58,8 +59,8 @@ module Extension
58
59
 
59
60
  return if required_fields.none?
60
61
 
61
- ShopifyCli::Tasks::EnsureEnv.call(context, required: required_fields)
62
- ShopifyCli::Tasks::EnsureDevStore.call(context) if required_fields.include?(:shop)
62
+ ShopifyCLI::Tasks::EnsureEnv.call(context, required: required_fields)
63
+ ShopifyCLI::Tasks::EnsureDevStore.call(context) if required_fields.include?(:shop)
63
64
 
64
65
  project = ExtensionProject.current
65
66
  ensure_resource_resource_url! if specification_handler.supplies_resource_url?
@@ -90,7 +91,7 @@ module Extension
90
91
  def ensure_resource_resource_url!
91
92
  project = ExtensionProject.current(force_reload: true)
92
93
 
93
- ShopifyCli::Result
94
+ ShopifyCLI::Result
94
95
  .wrap(project.resource_url)
95
96
  .rescue { specification_handler.build_resource_url(shop: project.env.shop, context: context) }
96
97
  .then(&method(:persist_resource_url))
@@ -108,6 +109,20 @@ module Extension
108
109
  ExtensionProject.update_env_file(context: context, resource_url: resource_url)
109
110
  resource_url
110
111
  end
112
+
113
+ def new_serve_flow
114
+ Tasks::RunExtensionCommand.new(
115
+ type: specification_handler.specification.identifier,
116
+ command: "serve",
117
+ context: context,
118
+ port: port,
119
+ config_file_name: specification_handler.server_config_file,
120
+ ).call
121
+ end
122
+
123
+ def supports_development_server?
124
+ Models::DevelopmentServerRequirements.supported?(specification_handler.specification.identifier)
125
+ end
111
126
  end
112
127
  end
113
128
  end
@@ -26,7 +26,7 @@ module Extension
26
26
  end
27
27
 
28
28
  def run_install_steps(context, steps, identifier, directory_name)
29
- system = ShopifyCli::JsSystem.new(ctx: context)
29
+ system = ShopifyCLI::JsSystem.new(ctx: context)
30
30
 
31
31
  steps.inject(true) do |success, setup_step|
32
32
  success && setup_step.call(context, identifier, directory_name, system)
@@ -11,7 +11,7 @@ module Extension
11
11
  def call(context, identifier, directory_name, js_system)
12
12
  step_result = step.call(context, identifier, directory_name, js_system)
13
13
  can_fail? ? step_result : true
14
- rescue ShopifyCli::Abort => e
14
+ rescue ShopifyCLI::Abort => e
15
15
  context.puts(e.message)
16
16
  false
17
17
  rescue StandardError => e
@@ -18,7 +18,7 @@ module Extension
18
18
  def self.clone_template(git_template)
19
19
  ArgoSetupStep.default do |context, _identifier, directory_name, _js_system|
20
20
  begin
21
- ShopifyCli::Git.clone(git_template, directory_name, ctx: context)
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
24
  context.puts("{{x}} Unable to clone the repository.")
@@ -28,7 +28,7 @@ module Extension
28
28
 
29
29
  def self.install_dependencies
30
30
  ArgoSetupStep.default do |context, _identifier, _directory_name, js_system|
31
- ShopifyCli::JsDeps.new(ctx: context, system: js_system).install
31
+ ShopifyCLI::JsDeps.new(ctx: context, system: js_system).install
32
32
  end
33
33
  end
34
34
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Extension
4
4
  module Forms
5
- class Connect < ShopifyCli::Form
5
+ class Connect < ShopifyCLI::Form
6
6
  attr_reader :registration, :app
7
7
 
8
8
  flag_arguments :type
@@ -19,7 +19,7 @@ module Extension
19
19
  end
20
20
 
21
21
  def ask
22
- ShopifyCli::Result.wrap(ExtensionProjectDetails.new)
22
+ ShopifyCLI::Result.wrap(ExtensionProjectDetails.new)
23
23
  .then(&Questions::AskRegistration.new(ctx: ctx, type: type))
24
24
  .unwrap { |e| raise e }
25
25
  .tap do |project_details|
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Extension
4
4
  module Forms
5
- class Create < ShopifyCli::Form
5
+ class Create < ShopifyCLI::Form
6
6
  flag_arguments :name, :type, :api_key, :template
7
7
 
8
8
  attr_reader :app
@@ -21,7 +21,7 @@ module Extension
21
21
  end
22
22
 
23
23
  def ask
24
- ShopifyCli::Result.wrap(ExtensionProjectDetails.new)
24
+ ShopifyCLI::Result.wrap(ExtensionProjectDetails.new)
25
25
  .then(&Questions::AskApp.new(ctx: ctx, api_key: api_key))
26
26
  .then(&Questions::AskType.new(ctx: ctx, type: type))
27
27
  .then(&Questions::AskTemplate.new(ctx: ctx))
@@ -2,7 +2,7 @@ module Extension
2
2
  module Forms
3
3
  module Questions
4
4
  class AskApp
5
- include ShopifyCli::MethodObject
5
+ include ShopifyCLI::MethodObject
6
6
 
7
7
  property! :ctx
8
8
  property :api_key
@@ -45,7 +45,7 @@ module Extension
45
45
  def abort_no_apps
46
46
  ctx.puts(@ctx.message("create.no_apps"))
47
47
  ctx.puts(@ctx.message("create.learn_about_apps"))
48
- raise ShopifyCli::AbortSilent
48
+ raise ShopifyCLI::AbortSilent
49
49
  end
50
50
  end
51
51
  end
@@ -2,7 +2,7 @@ module Extension
2
2
  module Forms
3
3
  module Questions
4
4
  class AskName
5
- include ShopifyCli::MethodObject
5
+ include ShopifyCLI::MethodObject
6
6
 
7
7
  property! :ctx
8
8
  property :name
@@ -4,7 +4,7 @@ module Extension
4
4
  module Forms
5
5
  module Questions
6
6
  class AskRegistration
7
- include ShopifyCli::MethodObject
7
+ include ShopifyCLI::MethodObject
8
8
 
9
9
  property! :ctx
10
10
  property! :type
@@ -43,7 +43,7 @@ module Extension
43
43
  def abort_no_registrations
44
44
  ctx.puts(@ctx.message("connect.no_extensions", type))
45
45
  ctx.puts(@ctx.message("connect.learn_about_extensions"))
46
- raise ShopifyCli::AbortSilent
46
+ raise ShopifyCLI::AbortSilent
47
47
  end
48
48
  end
49
49
  end
@@ -2,7 +2,7 @@ module Extension
2
2
  module Forms
3
3
  module Questions
4
4
  class AskTemplate
5
- include ShopifyCli::MethodObject
5
+ include ShopifyCLI::MethodObject
6
6
 
7
7
  TEMPLATE_REQUIRED_TYPES = [
8
8
  "checkout_ui_extension",
@@ -28,7 +28,7 @@ module Extension
28
28
  end
29
29
 
30
30
  def extension_server_beta?
31
- ShopifyCli::Shopifolk.check && ShopifyCli::Feature.enabled?(:extension_server_beta)
31
+ ShopifyCLI::Shopifolk.check && ShopifyCLI::Feature.enabled?(:extension_server_beta)
32
32
  end
33
33
 
34
34
  def choose_interactively
@@ -2,7 +2,7 @@ module Extension
2
2
  module Forms
3
3
  module Questions
4
4
  class AskType
5
- include ShopifyCli::MethodObject
5
+ include ShopifyCLI::MethodObject
6
6
 
7
7
  property! :ctx
8
8
  property :type
@@ -39,7 +39,7 @@ module Extension
39
39
 
40
40
  def abort_due_to_missing_specifications
41
41
  ctx.puts(@ctx.message("create.no_available_extensions"))
42
- raise ShopifyCli::AbortSilent
42
+ raise ShopifyCLI::AbortSilent
43
43
  end
44
44
  end
45
45
  end
@@ -15,9 +15,9 @@ module Extension
15
15
  end
16
16
 
17
17
  def self.load_current_type_messages
18
- return unless ShopifyCli::Project.has_current?
18
+ return unless ShopifyCLI::Project.has_current?
19
19
  messages_for_type(
20
- ShopifyCli::Project.current.config[Extension::ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY]
20
+ ShopifyCLI::Project.current.config[Extension::ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY]
21
21
  )
22
22
  end
23
23
 
@@ -7,9 +7,24 @@ module Extension
7
7
 
8
8
  include SmartProperties
9
9
 
10
- EXECUTABLE_PATH = "../../../../../ext/shopify-cli/shopify-extensions/shopify-extensions"
10
+ EXECUTABLE_DIRECTORY = File.join(ShopifyCLI::ROOT, "ext", "shopify-extensions")
11
11
 
12
- property! :executable, converts: :to_s, default: File.expand_path(EXECUTABLE_PATH, __FILE__)
12
+ property :executable, converts: :to_s
13
+
14
+ def executable
15
+ super || begin
16
+ case RbConfig::CONFIG.fetch("host_os")
17
+ when /(linux)|(darwin)/
18
+ File.join(EXECUTABLE_DIRECTORY, "shopify-extensions")
19
+ else
20
+ File.join(EXECUTABLE_DIRECTORY, "shopify-extensions.exe")
21
+ end
22
+ end
23
+ end
24
+
25
+ def executable_installed?
26
+ File.exist?(executable)
27
+ end
13
28
 
14
29
  def create(server_config)
15
30
  CLI::Kit::System.capture3(executable, "create", "-", stdin_data: server_config.to_yaml)
@@ -18,18 +33,46 @@ module Extension
18
33
  end
19
34
 
20
35
  def build(server_config)
21
- _, error, pid = CLI::Kit::System.capture3(executable, "build", "-", stdin_data: server_config.to_yaml)
22
- return if pid.success?
36
+ _, error, status = CLI::Kit::System.capture3(executable, "build", "-", stdin_data: server_config.to_yaml)
37
+ return if status.success?
23
38
  raise DevelopmentServerError, error
24
39
  end
25
40
 
26
- def serve
27
- raise NotImplementedError
41
+ def serve(context, server_config)
42
+ CLI::Kit::System.popen3(executable, "serve", "-") do |input, out, err, status|
43
+ context.puts("Sending configuration data …")
44
+ input << server_config.to_yaml
45
+ input.close
46
+
47
+ forward_output_to_user(out, err, context)
48
+
49
+ status.value
50
+ end
28
51
  end
29
52
 
30
53
  def version
31
54
  raise NotImplementedError
32
55
  end
56
+
57
+ private
58
+
59
+ def forward_output_to_user(out, err, ctx)
60
+ ctx.puts("Starting monitoring threads …")
61
+
62
+ Thread.new do
63
+ ctx.puts("Ready to process standard output")
64
+ while (line = out.gets)
65
+ ctx.puts(line)
66
+ end
67
+ end
68
+
69
+ Thread.new do
70
+ ctx.puts("Ready to process standard error")
71
+ while (error = err.gets)
72
+ ctx.puts(error)
73
+ end
74
+ end
75
+ end
33
76
  end
34
77
  end
35
78
  end
@@ -8,9 +8,27 @@ module Extension
8
8
  "checkout_ui_extension",
9
9
  ]
10
10
 
11
- def self.supported?(type)
12
- return false unless SUPPORTED_EXTENSION_TYPES.include?(type.downcase)
13
- ShopifyCli::Shopifolk.check && ShopifyCli::Feature.enabled?(:extension_server_beta)
11
+ UNIX_NAME = "shopify-extensions"
12
+ WINDOWS_NAME = "shopify-extensions.exe"
13
+
14
+ class << self
15
+ def supported?(type)
16
+ binary_installed? && type_supported?(type) && beta_enabled?
17
+ end
18
+
19
+ private
20
+
21
+ def binary_installed?
22
+ Models::DevelopmentServer.new.executable_installed?
23
+ end
24
+
25
+ def type_supported?(type)
26
+ SUPPORTED_EXTENSION_TYPES.include?(type.downcase)
27
+ end
28
+
29
+ def beta_enabled?
30
+ ShopifyCLI::Shopifolk.check && ShopifyCLI::Feature.enabled?(:extension_server_beta)
31
+ end
14
32
  end
15
33
  end
16
34
  end
@@ -1,6 +1,6 @@
1
1
  module Extension
2
2
  module Models
3
- class LazySpecificationHandler < ShopifyCli::LazyDelegator
3
+ class LazySpecificationHandler < ShopifyCLI::LazyDelegator
4
4
  attr_reader :identifier
5
5
 
6
6
  def initialize(identifier, &specification_handler_initializer)
@@ -18,7 +18,7 @@ module Extension
18
18
  def self.build(feature_set_attributes)
19
19
  feature_set_attributes.each_with_object(OpenStruct.new) do |(identifier, feature_attributes), feature_set|
20
20
  next if feature_attributes.nil?
21
- feature_set[identifier] = ShopifyCli::ResolveConstant
21
+ feature_set[identifier] = ShopifyCLI::ResolveConstant
22
22
  .call(identifier, namespace: Features)
23
23
  .rescue { OpenStruct }
24
24
  .then { |c| c.new(**feature_attributes) }
@@ -43,10 +43,12 @@ module Extension
43
43
  end
44
44
 
45
45
  def choose_port?(context)
46
+ return true if supports_development_server?
46
47
  argo_runtime(context).supports?(:port)
47
48
  end
48
49
 
49
50
  def establish_tunnel?(context)
51
+ return true if supports_development_server?
50
52
  argo_runtime(context).supports?(:public_url)
51
53
  end
52
54
 
@@ -66,6 +68,8 @@ module Extension
66
68
  end
67
69
 
68
70
  def argo_runtime(context)
71
+ return if supports_development_server?
72
+
69
73
  @argo_runtime ||= Features::ArgoRuntime.find(
70
74
  cli_package: cli_package(context),
71
75
  identifier: identifier
@@ -76,7 +80,7 @@ module Extension
76
80
  cli_package_name = specification.features.argo&.cli_package_name
77
81
  return unless cli_package_name
78
82
 
79
- js_system = ShopifyCli::JsSystem.new(ctx: context)
83
+ js_system = ShopifyCLI::JsSystem.new(ctx: context)
80
84
  Tasks::FindNpmPackages.exactly_one_of(cli_package_name, js_system: js_system)
81
85
  .unwrap { |_e| context.abort(context.message("errors.package_not_found", cli_package_name)) }
82
86
  end
@@ -87,7 +91,7 @@ module Extension
87
91
  if (str = messages.dig(*key_parts))
88
92
  str % params
89
93
  else
90
- ShopifyCli::Context.message(key, *params)
94
+ ShopifyCLI::Context.message(key, *params)
91
95
  end
92
96
  end
93
97
 
@@ -99,6 +103,10 @@ module Extension
99
103
  raise NotImplementedError
100
104
  end
101
105
 
106
+ def server_config_file
107
+ "shopifile.yml"
108
+ end
109
+
102
110
  protected
103
111
 
104
112
  def argo
@@ -118,6 +126,10 @@ module Extension
118
126
  def messages
119
127
  @messages ||= Messages::TYPES[identifier.downcase.to_sym] || {}
120
128
  end
129
+
130
+ def supports_development_server?
131
+ Models::DevelopmentServerRequirements.supported?(identifier)
132
+ end
121
133
  end
122
134
  end
123
135
  end
@@ -15,7 +15,7 @@ module Extension
15
15
  context.root = File.join(context.root, directory_name)
16
16
 
17
17
  if getting_started
18
- ShopifyCli::Git.clone("https://github.com/Shopify/theme-extension-getting-started", context.root)
18
+ ShopifyCLI::Git.clone("https://github.com/Shopify/theme-extension-getting-started", context.root)
19
19
  context.rm_r(".git")
20
20
  else
21
21
  FileUtils.makedirs(SUPPORTED_BUCKETS.map { |b| File.join(context.root, b) })
@@ -5,7 +5,7 @@ module Extension
5
5
 
6
6
  property! :custom_handler_root,
7
7
  accepts: ->(d) { File.directory?(d) },
8
- default: -> { File.expand_path("lib/project_types/extension/models/specification_handlers", ShopifyCli::ROOT) }
8
+ default: -> { File.expand_path("lib/project_types/extension/models/specification_handlers", ShopifyCLI::ROOT) }
9
9
 
10
10
  property! :custom_handler_namespace,
11
11
  accepts: ->(m) { m.respond_to?(:const_get) },
@@ -39,9 +39,9 @@ module Extension
39
39
  private
40
40
 
41
41
  def fetch_specifications_and_build_handlers
42
- ShopifyCli::Result
42
+ ShopifyCLI::Result
43
43
  .call(&fetch_specifications)
44
- .map(&ShopifyCli::TransformDataStructure.new(symbolize_keys: true, underscore_keys: true))
44
+ .map(&ShopifyCLI::TransformDataStructure.new(symbolize_keys: true, underscore_keys: true))
45
45
  .then(&method(:select_cli_extensions))
46
46
  .then(&Tasks::ConfigureFeatures)
47
47
  .then(&Tasks::ConfigureOptions)
@@ -61,7 +61,7 @@ module Extension
61
61
 
62
62
  def instantiate_specification_handlers(specifications)
63
63
  specifications.each_with_object({}) do |specification, handlers|
64
- ShopifyCli::ResolveConstant.call(specification.identifier, namespace: custom_handler_namespace)
64
+ ShopifyCLI::ResolveConstant.call(specification.identifier, namespace: custom_handler_namespace)
65
65
  .rescue { |error| error.is_a?(NameError) ? SpecificationHandlers::Default : raise(error) }
66
66
  .then { |handler_class| handler_class.new(specification) }
67
67
  .unwrap { |error| raise error }
@@ -5,7 +5,7 @@ require "socket"
5
5
  module Extension
6
6
  module Tasks
7
7
  class ChooseNextAvailablePort
8
- include ShopifyCli::MethodObject
8
+ include ShopifyCLI::MethodObject
9
9
 
10
10
  property! :from
11
11
  property! :to, default: -> { from + 10 }