shopify-cli 2.4.0 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
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