shopify-cli 2.4.0 → 2.5.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 (223) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/shopify.yml +0 -2
  3. data/.rubocop.yml +14 -14
  4. data/.rubocop_todo.yml +3 -3
  5. data/CHANGELOG.md +5 -0
  6. data/Dockerfile +1 -1
  7. data/Gemfile.lock +1 -1
  8. data/RELEASING.md +1 -1
  9. data/Rakefile +18 -18
  10. data/bin/shopify +3 -3
  11. data/lib/project_types/extension/cli.rb +3 -3
  12. data/lib/project_types/extension/commands/build.rb +2 -2
  13. data/lib/project_types/extension/commands/check.rb +2 -2
  14. data/lib/project_types/extension/commands/connect.rb +1 -1
  15. data/lib/project_types/extension/commands/create.rb +41 -23
  16. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  17. data/lib/project_types/extension/commands/info.rb +1 -1
  18. data/lib/project_types/extension/commands/push.rb +1 -1
  19. data/lib/project_types/extension/commands/register.rb +2 -2
  20. data/lib/project_types/extension/commands/serve.rb +5 -5
  21. data/lib/project_types/extension/commands/tunnel.rb +6 -6
  22. data/lib/project_types/extension/extension_project.rb +4 -4
  23. data/lib/project_types/extension/features/argo.rb +2 -2
  24. data/lib/project_types/extension/features/argo_config.rb +5 -5
  25. data/lib/project_types/extension/features/argo_serve.rb +20 -6
  26. data/lib/project_types/extension/features/argo_setup.rb +1 -1
  27. data/lib/project_types/extension/features/argo_setup_step.rb +1 -1
  28. data/lib/project_types/extension/features/argo_setup_steps.rb +2 -2
  29. data/lib/project_types/extension/forms/connect.rb +2 -2
  30. data/lib/project_types/extension/forms/create.rb +2 -2
  31. data/lib/project_types/extension/forms/questions/ask_app.rb +2 -2
  32. data/lib/project_types/extension/forms/questions/ask_name.rb +1 -1
  33. data/lib/project_types/extension/forms/questions/ask_registration.rb +2 -2
  34. data/lib/project_types/extension/forms/questions/ask_template.rb +2 -2
  35. data/lib/project_types/extension/forms/questions/ask_type.rb +2 -2
  36. data/lib/project_types/extension/messages/message_loading.rb +2 -2
  37. data/lib/project_types/extension/models/development_server.rb +45 -6
  38. data/lib/project_types/extension/models/development_server_requirements.rb +22 -3
  39. data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
  40. data/lib/project_types/extension/models/specification.rb +1 -1
  41. data/lib/project_types/extension/models/specification_handlers/default.rb +10 -2
  42. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +1 -1
  43. data/lib/project_types/extension/models/specifications.rb +4 -4
  44. data/lib/project_types/extension/tasks/choose_next_available_port.rb +1 -1
  45. data/lib/project_types/extension/tasks/configure_features.rb +1 -1
  46. data/lib/project_types/extension/tasks/configure_options.rb +1 -1
  47. data/lib/project_types/extension/tasks/converters/product_converter.rb +1 -1
  48. data/lib/project_types/extension/tasks/create_extension.rb +2 -2
  49. data/lib/project_types/extension/tasks/fetch_specifications.rb +2 -2
  50. data/lib/project_types/extension/tasks/find_npm_packages.rb +3 -3
  51. data/lib/project_types/extension/tasks/get_app.rb +2 -2
  52. data/lib/project_types/extension/tasks/get_apps.rb +2 -2
  53. data/lib/project_types/extension/tasks/get_extensions.rb +2 -2
  54. data/lib/project_types/extension/tasks/get_product.rb +2 -2
  55. data/lib/project_types/extension/tasks/run_extension_command.rb +10 -3
  56. data/lib/project_types/extension/tasks/update_draft.rb +2 -2
  57. data/lib/project_types/node/cli.rb +3 -3
  58. data/lib/project_types/node/commands/connect.rb +4 -4
  59. data/lib/project_types/node/commands/create.rb +10 -10
  60. data/lib/project_types/node/commands/deploy/heroku.rb +4 -4
  61. data/lib/project_types/node/commands/deploy.rb +3 -3
  62. data/lib/project_types/node/commands/generate.rb +2 -2
  63. data/lib/project_types/node/commands/open.rb +3 -3
  64. data/lib/project_types/node/commands/serve.rb +7 -7
  65. data/lib/project_types/node/commands/tunnel.rb +6 -6
  66. data/lib/project_types/node/forms/create.rb +3 -3
  67. data/lib/project_types/php/cli.rb +27 -0
  68. data/lib/project_types/php/commands/connect.rb +19 -0
  69. data/lib/project_types/php/commands/create.rb +143 -0
  70. data/lib/project_types/php/commands/deploy/heroku.rb +129 -0
  71. data/lib/project_types/php/commands/deploy.rb +32 -0
  72. data/lib/project_types/php/commands/open.rb +16 -0
  73. data/lib/project_types/php/commands/serve.rb +51 -0
  74. data/lib/project_types/php/commands/tunnel.rb +37 -0
  75. data/lib/project_types/php/forms/create.rb +45 -0
  76. data/lib/project_types/php/messages/messages.rb +191 -0
  77. data/lib/project_types/rails/cli.rb +3 -3
  78. data/lib/project_types/rails/commands/connect.rb +4 -4
  79. data/lib/project_types/rails/commands/create.rb +12 -12
  80. data/lib/project_types/rails/commands/deploy/heroku.rb +4 -4
  81. data/lib/project_types/rails/commands/deploy.rb +3 -3
  82. data/lib/project_types/rails/commands/generate/webhook.rb +3 -3
  83. data/lib/project_types/rails/commands/generate.rb +3 -3
  84. data/lib/project_types/rails/commands/open.rb +3 -3
  85. data/lib/project_types/rails/commands/serve.rb +8 -8
  86. data/lib/project_types/rails/commands/tunnel.rb +6 -6
  87. data/lib/project_types/rails/forms/create.rb +3 -3
  88. data/lib/project_types/rails/gem.rb +1 -1
  89. data/lib/project_types/rails/ruby.rb +1 -1
  90. data/lib/project_types/script/cli.rb +11 -4
  91. data/lib/project_types/script/commands/create.rb +2 -2
  92. data/lib/project_types/script/commands/push.rb +2 -2
  93. data/lib/project_types/script/forms/create.rb +1 -1
  94. data/lib/project_types/script/layers/application/extension_points.rb +2 -2
  95. data/lib/project_types/script/layers/application/push_script.rb +4 -1
  96. data/lib/project_types/script/layers/domain/script_project.rb +2 -2
  97. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +55 -0
  98. data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +35 -0
  99. data/lib/project_types/script/layers/infrastructure/command_runner.rb +1 -1
  100. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +1 -1
  101. data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +1 -1
  102. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -1
  103. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +5 -5
  104. data/lib/project_types/script/layers/infrastructure/script_service.rb +4 -8
  105. data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
  106. data/lib/project_types/script/tasks/ensure_env.rb +6 -6
  107. data/lib/project_types/script/ui/error_handler.rb +75 -75
  108. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  109. data/lib/project_types/theme/cli.rb +3 -3
  110. data/lib/project_types/theme/commands/check.rb +3 -3
  111. data/lib/project_types/theme/commands/delete.rb +7 -7
  112. data/lib/project_types/theme/commands/init.rb +3 -3
  113. data/lib/project_types/theme/commands/language_server.rb +2 -2
  114. data/lib/project_types/theme/commands/package.rb +2 -2
  115. data/lib/project_types/theme/commands/publish.rb +5 -5
  116. data/lib/project_types/theme/commands/pull.rb +9 -9
  117. data/lib/project_types/theme/commands/push.rb +12 -12
  118. data/lib/project_types/theme/commands/serve.rb +4 -4
  119. data/lib/project_types/theme/forms/confirm_store.rb +1 -1
  120. data/lib/project_types/theme/forms/select.rb +2 -2
  121. data/lib/{shopify-cli → shopify_cli}/admin_api/populate_resource_command.rb +3 -3
  122. data/lib/{shopify-cli → shopify_cli}/admin_api/schema.rb +4 -4
  123. data/lib/{shopify-cli → shopify_cli}/admin_api.rb +27 -27
  124. data/lib/{shopify-cli → shopify_cli}/api.rb +8 -8
  125. data/lib/{shopify-cli → shopify_cli}/command.rb +3 -3
  126. data/lib/{shopify-cli → shopify_cli}/commands/config.rb +14 -14
  127. data/lib/{shopify-cli → shopify_cli}/commands/help.rb +4 -4
  128. data/lib/{shopify-cli → shopify_cli}/commands/login.rb +7 -7
  129. data/lib/shopify_cli/commands/logout.rb +39 -0
  130. data/lib/{shopify-cli → shopify_cli}/commands/populate/customer.rb +4 -4
  131. data/lib/{shopify-cli → shopify_cli}/commands/populate/draft_order.rb +4 -4
  132. data/lib/{shopify-cli → shopify_cli}/commands/populate/product.rb +4 -4
  133. data/lib/shopify_cli/commands/populate.rb +23 -0
  134. data/lib/shopify_cli/commands/store.rb +15 -0
  135. data/lib/{shopify-cli → shopify_cli}/commands/switch.rb +5 -5
  136. data/lib/{shopify-cli → shopify_cli}/commands/system.rb +10 -10
  137. data/lib/shopify_cli/commands/version.rb +15 -0
  138. data/lib/{shopify-cli → shopify_cli}/commands/whoami.rb +7 -7
  139. data/lib/shopify_cli/commands.rb +34 -0
  140. data/lib/{shopify-cli → shopify_cli}/connect.rb +3 -3
  141. data/lib/{shopify-cli → shopify_cli}/constants.rb +1 -1
  142. data/lib/{shopify-cli → shopify_cli}/context.rb +6 -6
  143. data/lib/{shopify-cli → shopify_cli}/core/entry_point.rb +7 -7
  144. data/lib/{shopify-cli → shopify_cli}/core/executor.rb +3 -3
  145. data/lib/{shopify-cli → shopify_cli}/core/finalize.rb +1 -1
  146. data/lib/{shopify-cli → shopify_cli}/core/help_resolver.rb +2 -2
  147. data/lib/{shopify-cli → shopify_cli}/core/monorail.rb +8 -8
  148. data/lib/shopify_cli/core.rb +8 -0
  149. data/lib/{shopify-cli → shopify_cli}/db.rb +8 -8
  150. data/lib/{shopify-cli → shopify_cli}/environment.rb +1 -1
  151. data/lib/{shopify-cli → shopify_cli}/feature.rb +8 -8
  152. data/lib/{shopify-cli → shopify_cli}/form.rb +2 -2
  153. data/lib/{shopify-cli → shopify_cli}/git.rb +6 -6
  154. data/lib/{shopify-cli → shopify_cli}/helpers/haikunator.rb +1 -1
  155. data/lib/shopify_cli/helpers.rb +5 -0
  156. data/lib/{shopify-cli → shopify_cli}/heroku.rb +38 -13
  157. data/lib/{shopify-cli → shopify_cli}/http_request.rb +1 -1
  158. data/lib/{shopify-cli → shopify_cli}/identity_auth/servlet.rb +1 -1
  159. data/lib/{shopify-cli → shopify_cli}/identity_auth.rb +8 -8
  160. data/lib/{shopify-cli → shopify_cli}/js_deps.rb +7 -7
  161. data/lib/{shopify-cli → shopify_cli}/js_system.rb +10 -10
  162. data/lib/{shopify-cli → shopify_cli}/lazy_delegator.rb +2 -2
  163. data/lib/{shopify-cli → shopify_cli}/messages/messages.rb +17 -1
  164. data/lib/{shopify-cli → shopify_cli}/method_object.rb +4 -4
  165. data/lib/{shopify-cli → shopify_cli}/options.rb +1 -1
  166. data/lib/{shopify-cli → shopify_cli}/packager.rb +8 -8
  167. data/lib/{shopify-cli → shopify_cli}/partners_api/organizations.rb +1 -1
  168. data/lib/{shopify-cli → shopify_cli}/partners_api.rb +13 -13
  169. data/lib/shopify_cli/php_deps.rb +102 -0
  170. data/lib/{shopify-cli → shopify_cli}/process_supervision.rb +10 -8
  171. data/lib/{shopify-cli → shopify_cli}/project.rb +15 -15
  172. data/lib/{shopify-cli → shopify_cli}/project_commands.rb +3 -3
  173. data/lib/{shopify-cli → shopify_cli}/project_type.rb +5 -5
  174. data/lib/{shopify-cli → shopify_cli}/resolve_constant.rb +5 -5
  175. data/lib/{shopify-cli → shopify_cli}/resources/env_file.rb +1 -1
  176. data/lib/shopify_cli/resources.rb +5 -0
  177. data/lib/{shopify-cli → shopify_cli}/result.rb +11 -11
  178. data/lib/{shopify-cli → shopify_cli}/shopifolk.rb +6 -6
  179. data/lib/{shopify-cli → shopify_cli}/sub_command.rb +1 -1
  180. data/lib/{shopify-cli → shopify_cli}/task.rb +1 -1
  181. data/lib/{shopify-cli → shopify_cli}/tasks/confirm_store.rb +3 -3
  182. data/lib/{shopify-cli → shopify_cli}/tasks/create_api_client.rb +4 -4
  183. data/lib/shopify_cli/tasks/ensure_authenticated.rb +13 -0
  184. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_dev_store.rb +5 -5
  185. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_env.rb +3 -3
  186. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_loopback_url.rb +4 -4
  187. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_project_type.rb +3 -3
  188. data/lib/{shopify-cli → shopify_cli}/tasks/select_org_and_shop.rb +8 -8
  189. data/lib/{shopify-cli → shopify_cli}/tasks/update_dashboard_urls.rb +6 -6
  190. data/lib/{shopify-cli → shopify_cli}/tasks.rb +10 -10
  191. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/certificate_manager.rb +5 -5
  192. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/header_hash.rb +1 -1
  193. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot-reload.js +0 -0
  194. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot_reload.rb +1 -1
  195. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/local_assets.rb +1 -1
  196. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/proxy.rb +2 -2
  197. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/sse.rb +1 -1
  198. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/watcher.rb +1 -1
  199. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/web_server.rb +1 -1
  200. data/lib/{shopify-cli → shopify_cli}/theme/dev_server.rb +3 -3
  201. data/lib/{shopify-cli → shopify_cli}/theme/development_theme.rb +9 -9
  202. data/lib/{shopify-cli → shopify_cli}/theme/file.rb +1 -1
  203. data/lib/{shopify-cli → shopify_cli}/theme/ignore_filter.rb +1 -1
  204. data/lib/{shopify-cli → shopify_cli}/theme/mime_type.rb +1 -1
  205. data/lib/{shopify-cli → shopify_cli}/theme/syncer.rb +6 -6
  206. data/lib/{shopify-cli → shopify_cli}/theme/theme.rb +4 -4
  207. data/lib/{shopify-cli → shopify_cli}/transform_data_structure.rb +4 -4
  208. data/lib/{shopify-cli → shopify_cli}/tunnel.rb +14 -14
  209. data/lib/shopify_cli/version.rb +3 -0
  210. data/lib/shopify_cli.rb +50 -49
  211. data/shopify-cli.gemspec +2 -2
  212. metadata +104 -91
  213. data/lib/project_types/script/layers/infrastructure/api_clients.rb +0 -89
  214. data/lib/shopify-cli/commands/logout.rb +0 -39
  215. data/lib/shopify-cli/commands/populate.rb +0 -23
  216. data/lib/shopify-cli/commands/store.rb +0 -15
  217. data/lib/shopify-cli/commands/version.rb +0 -15
  218. data/lib/shopify-cli/commands.rb +0 -34
  219. data/lib/shopify-cli/core.rb +0 -8
  220. data/lib/shopify-cli/helpers.rb +0 -5
  221. data/lib/shopify-cli/resources.rb +0 -5
  222. data/lib/shopify-cli/tasks/ensure_authenticated.rb +0 -13
  223. data/lib/shopify-cli/version.rb +0 -3
@@ -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,19 @@ 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
+ ).call
120
+ end
121
+
122
+ def supports_development_server?
123
+ Models::DevelopmentServerRequirements.supported?(specification_handler.specification.identifier)
124
+ end
111
125
  end
112
126
  end
113
127
  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,20 @@ 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
13
24
 
14
25
  def create(server_config)
15
26
  CLI::Kit::System.capture3(executable, "create", "-", stdin_data: server_config.to_yaml)
@@ -18,18 +29,46 @@ module Extension
18
29
  end
19
30
 
20
31
  def build(server_config)
21
- _, error, pid = CLI::Kit::System.capture3(executable, "build", "-", stdin_data: server_config.to_yaml)
22
- return if pid.success?
32
+ _, error, status = CLI::Kit::System.capture3(executable, "build", "-", stdin_data: server_config.to_yaml)
33
+ return if status.success?
23
34
  raise DevelopmentServerError, error
24
35
  end
25
36
 
26
- def serve
27
- raise NotImplementedError
37
+ def serve(context, server_config)
38
+ CLI::Kit::System.popen3(executable, "serve", "-") do |input, out, err, status|
39
+ context.puts("Sending configuration data …")
40
+ input << server_config.to_yaml
41
+ input.close
42
+
43
+ forward_output_to_user(out, err, context)
44
+
45
+ status.value
46
+ end
28
47
  end
29
48
 
30
49
  def version
31
50
  raise NotImplementedError
32
51
  end
52
+
53
+ private
54
+
55
+ def forward_output_to_user(out, err, ctx)
56
+ ctx.puts("Starting monitoring threads …")
57
+
58
+ Thread.new do
59
+ ctx.puts("Ready to process standard output")
60
+ while (line = out.gets)
61
+ ctx.puts(line)
62
+ end
63
+ end
64
+
65
+ Thread.new do
66
+ ctx.puts("Ready to process standard error")
67
+ while (error = err.gets)
68
+ ctx.puts(error)
69
+ end
70
+ end
71
+ end
33
72
  end
34
73
  end
35
74
  end
@@ -8,9 +8,28 @@ 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
+ extension_dir = File.join(ShopifyCLI::ROOT, "ext", "shopify-extensions")
23
+ File.exist?(File.join(extension_dir, UNIX_NAME)) || File.exist?(File.join(extension_dir, WINDOWS_NAME))
24
+ end
25
+
26
+ def type_supported?(type)
27
+ SUPPORTED_EXTENSION_TYPES.include?(type.downcase)
28
+ end
29
+
30
+ def beta_enabled?
31
+ ShopifyCLI::Shopifolk.check && ShopifyCLI::Feature.enabled?(:extension_server_beta)
32
+ end
14
33
  end
15
34
  end
16
35
  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
 
@@ -118,6 +122,10 @@ module Extension
118
122
  def messages
119
123
  @messages ||= Messages::TYPES[identifier.downcase.to_sym] || {}
120
124
  end
125
+
126
+ def supports_development_server?
127
+ Models::DevelopmentServerRequirements.supported?(identifier)
128
+ end
121
129
  end
122
130
  end
123
131
  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 }
@@ -1,7 +1,7 @@
1
1
  module Extension
2
2
  module Tasks
3
3
  class ConfigureFeatures
4
- include ShopifyCli::MethodObject
4
+ include ShopifyCLI::MethodObject
5
5
 
6
6
  class Error < RuntimeError; end
7
7
  class UnknownSurfaceArea < Error; end
@@ -1,7 +1,7 @@
1
1
  module Extension
2
2
  module Tasks
3
3
  class ConfigureOptions
4
- include ShopifyCli::MethodObject
4
+ include ShopifyCLI::MethodObject
5
5
 
6
6
  def call(specification_attribute_sets)
7
7
  specification_attribute_sets.each do |attributes|
@@ -12,7 +12,7 @@ module Extension
12
12
  variant = hash.dig(*VARIANT_PATH)
13
13
  return unless variant
14
14
  Models::Product.new(
15
- variant_id: ShopifyCli::API.gid_to_id(variant)
15
+ variant_id: ShopifyCLI::API.gid_to_id(variant)
16
16
  )
17
17
  end
18
18
  end
@@ -3,7 +3,7 @@ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Tasks
6
- class CreateExtension < ShopifyCli::Task
6
+ class CreateExtension < ShopifyCLI::Task
7
7
  include UserErrors
8
8
 
9
9
  GRAPHQL_FILE = "extension_create"
@@ -20,7 +20,7 @@ module Extension
20
20
  extension_context: extension_context,
21
21
  }
22
22
 
23
- response = ShopifyCli::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
23
+ response = ShopifyCLI::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
24
24
  context.abort(context.message("tasks.errors.parse_error")) if response.nil?
25
25
 
26
26
  abort_if_user_errors(context, response)
@@ -1,13 +1,13 @@
1
1
  module Extension
2
2
  module Tasks
3
3
  class FetchSpecifications
4
- include ShopifyCli::MethodObject
4
+ include ShopifyCLI::MethodObject
5
5
 
6
6
  property :context
7
7
  property :api_key
8
8
 
9
9
  def call
10
- response = ShopifyCli::PartnersAPI
10
+ response = ShopifyCLI::PartnersAPI
11
11
  .query(context, "fetch_specifications", api_key: api_key)
12
12
  .dig("data", "extensionSpecifications")
13
13
  context.abort(context.message("tasks.errors.parse_error")) if response.nil?
@@ -1,9 +1,9 @@
1
1
  module Extension
2
2
  module Tasks
3
3
  class FindNpmPackages
4
- include ShopifyCli::MethodObject
4
+ include ShopifyCLI::MethodObject
5
5
 
6
- property! :js_system, accepts: ShopifyCli::JsSystem
6
+ property! :js_system, accepts: ShopifyCLI::JsSystem
7
7
  property! :production_only, accepts: [true, false], default: false, reader: :production_only?
8
8
 
9
9
  def self.at_least_one_of(*package_names, **config)
@@ -69,7 +69,7 @@ module Extension
69
69
  raise ArgumentError, "Expected a list of package names"
70
70
  end
71
71
 
72
- ShopifyCli::Result
72
+ ShopifyCLI::Result
73
73
  .call(&method(:list_packages))
74
74
  .then(&method(:search_packages).curry[package_names])
75
75
  .then(&method(:filter_duplicates))
@@ -3,7 +3,7 @@ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Tasks
6
- class GetApp < ShopifyCli::Task
6
+ class GetApp < ShopifyCLI::Task
7
7
  GRAPHQL_FILE = "get_app_by_api_key"
8
8
 
9
9
  RESPONSE_FIELD = %w(data)
@@ -12,7 +12,7 @@ module Extension
12
12
  def call(context:, api_key:)
13
13
  input = { api_key: api_key }
14
14
 
15
- response = ShopifyCli::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
15
+ response = ShopifyCLI::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
16
16
  context.abort(context.message("tasks.errors.parse_error")) if response.nil?
17
17
 
18
18
  Converters::AppConverter.from_hash(response.dig(APP_FIELD))
@@ -3,9 +3,9 @@ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Tasks
6
- class GetApps < ShopifyCli::Task
6
+ class GetApps < ShopifyCLI::Task
7
7
  def call(context:)
8
- organizations = ShopifyCli::PartnersAPI::Organizations.fetch_with_app(context)
8
+ organizations = ShopifyCLI::PartnersAPI::Organizations.fetch_with_app(context)
9
9
  apps_from_organizations(organizations)
10
10
  end
11
11
 
@@ -3,9 +3,9 @@ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Tasks
6
- class GetExtensions < ShopifyCli::Task
6
+ class GetExtensions < ShopifyCLI::Task
7
7
  def call(context:, type:)
8
- organizations = ShopifyCli::PartnersAPI::Organizations.fetch_with_extensions(context, type)
8
+ organizations = ShopifyCLI::PartnersAPI::Organizations.fetch_with_extensions(context, type)
9
9
  extensions_from_organizations(organizations, context: context)
10
10
  end
11
11
 
@@ -3,12 +3,12 @@ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Tasks
6
- class GetProduct < ShopifyCli::Task
6
+ class GetProduct < ShopifyCLI::Task
7
7
  API_VERSION = "2021-07"
8
8
  GRAPHQL_FILE = "get_variant_id"
9
9
 
10
10
  def call(context, shop)
11
- response = ShopifyCli::AdminAPI.query(
11
+ response = ShopifyCLI::AdminAPI.query(
12
12
  context,
13
13
  GRAPHQL_FILE,
14
14
  shop: shop,
@@ -4,7 +4,7 @@ require "shopify_cli"
4
4
 
5
5
  module Extension
6
6
  module Tasks
7
- class RunExtensionCommand < ShopifyCli::Task
7
+ class RunExtensionCommand < ShopifyCLI::Task
8
8
  include SmartProperties
9
9
 
10
10
  SUPPORTED_EXTENSION_TYPES = [
@@ -14,15 +14,18 @@ module Extension
14
14
  SUPPORTED_COMMANDS = [
15
15
  "create",
16
16
  "build",
17
+ "serve",
17
18
  ]
18
19
 
19
20
  property :root_dir, accepts: String
20
21
  property :template, accepts: Models::ServerConfig::Development::VALID_TEMPLATES
21
22
  property! :type, accepts: SUPPORTED_EXTENSION_TYPES
22
23
  property! :command, accepts: SUPPORTED_COMMANDS
24
+ property :context, accepts: ShopifyCLI::Context
25
+ property :port, accepts: Integer, default: 39351
23
26
 
24
27
  def call
25
- ShopifyCli::Result
28
+ ShopifyCLI::Result
26
29
  .call(&method(:build_extension))
27
30
  .then(&method(:build_server_config))
28
31
  .then(&method(:run_command))
@@ -42,7 +45,7 @@ module Extension
42
45
  end
43
46
 
44
47
  def build_server_config(extension)
45
- Models::ServerConfig::Root.new(extensions: [extension])
48
+ Models::ServerConfig::Root.new(port: port, extensions: [extension])
46
49
  end
47
50
 
48
51
  def run_command(server_config)
@@ -51,6 +54,10 @@ module Extension
51
54
  Models::DevelopmentServer.new.create(server_config)
52
55
  when "build"
53
56
  Models::DevelopmentServer.new.build(server_config)
57
+ when "serve"
58
+ Models::DevelopmentServer.new.serve(context, server_config)
59
+ else
60
+ raise NotImplementedError
54
61
  end
55
62
  end
56
63
  end