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
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
  module Rails
3
3
  class Command
4
- class Serve < ShopifyCli::SubCommand
4
+ class Serve < ShopifyCLI::SubCommand
5
5
  prerequisite_task ensure_project_type: :rails
6
6
  prerequisite_task :ensure_env, :ensure_dev_store
7
7
 
@@ -12,11 +12,11 @@ module Rails
12
12
  end
13
13
 
14
14
  def call(*)
15
- project = ShopifyCli::Project.current
16
- url = options.flags[:host] || ShopifyCli::Tunnel.start(@ctx)
15
+ project = ShopifyCLI::Project.current
16
+ url = options.flags[:host] || ShopifyCLI::Tunnel.start(@ctx)
17
17
  @ctx.abort(@ctx.message("rails.serve.error.host_must_be_https")) if url.match(/^https/i).nil?
18
18
  project.env.update(@ctx, :host, url)
19
- ShopifyCli::Tasks::UpdateDashboardURLS.call(
19
+ ShopifyCLI::Tasks::UpdateDashboardURLS.call(
20
20
  @ctx,
21
21
  url: url,
22
22
  callback_url: "/auth/shopify/callback",
@@ -28,9 +28,9 @@ module Rails
28
28
  end
29
29
 
30
30
  CLI::UI::Frame.open(@ctx.message("rails.serve.running_server")) do
31
- env = ShopifyCli::Project.current.env.to_h
31
+ env = ShopifyCLI::Project.current.env.to_h
32
32
  env.delete("HOST")
33
- env["PORT"] = ShopifyCli::Tunnel::PORT.to_s
33
+ env["PORT"] = ShopifyCLI::Tunnel::PORT.to_s
34
34
  env["GEM_PATH"] = Gem.gem_path(@ctx)
35
35
  if @ctx.windows?
36
36
  @ctx.system("ruby bin\\rails server", env: env)
@@ -41,11 +41,11 @@ module Rails
41
41
  end
42
42
 
43
43
  def self.help
44
- ShopifyCli::Context.message("rails.serve.help", ShopifyCli::TOOL_NAME)
44
+ ShopifyCLI::Context.message("rails.serve.help", ShopifyCLI::TOOL_NAME)
45
45
  end
46
46
 
47
47
  def self.extended_help
48
- ShopifyCli::Context.message("rails.serve.extended_help", ShopifyCli::TOOL_NAME)
48
+ ShopifyCLI::Context.message("rails.serve.extended_help", ShopifyCLI::TOOL_NAME)
49
49
  end
50
50
  end
51
51
  end
@@ -4,7 +4,7 @@ require "shopify_cli"
4
4
 
5
5
  module Rails
6
6
  class Command
7
- class Tunnel < ShopifyCli::SubCommand
7
+ class Tunnel < ShopifyCLI::SubCommand
8
8
  # subcommands :auth, :start, :stop
9
9
 
10
10
  prerequisite_task ensure_project_type: :rails
@@ -18,23 +18,23 @@ module Rails
18
18
  @ctx.puts(@ctx.message("rails.tunnel.error.token_argument_missing"))
19
19
  @ctx.puts("#{self.class.help}\n#{self.class.extended_help}")
20
20
  else
21
- ShopifyCli::Tunnel.auth(@ctx, token)
21
+ ShopifyCLI::Tunnel.auth(@ctx, token)
22
22
  end
23
23
  when "start"
24
- ShopifyCli::Tunnel.start(@ctx)
24
+ ShopifyCLI::Tunnel.start(@ctx)
25
25
  when "stop"
26
- ShopifyCli::Tunnel.stop(@ctx)
26
+ ShopifyCLI::Tunnel.stop(@ctx)
27
27
  else
28
28
  @ctx.puts(self.class.help)
29
29
  end
30
30
  end
31
31
 
32
32
  def self.help
33
- ShopifyCli::Context.message("rails.tunnel.help", ShopifyCli::TOOL_NAME)
33
+ ShopifyCLI::Context.message("rails.tunnel.help", ShopifyCLI::TOOL_NAME)
34
34
  end
35
35
 
36
36
  def self.extended_help
37
- ShopifyCli::Context.message("rails.tunnel.extended_help", ShopifyCli::TOOL_NAME)
37
+ ShopifyCLI::Context.message("rails.tunnel.extended_help", ShopifyCLI::TOOL_NAME)
38
38
  end
39
39
  end
40
40
  end
@@ -2,7 +2,7 @@ require "uri"
2
2
 
3
3
  module Rails
4
4
  module Forms
5
- class Create < ShopifyCli::Form
5
+ class Create < ShopifyCLI::Form
6
6
  attr_accessor :name
7
7
  flag_arguments :title, :organization_id, :shop_domain, :type, :db
8
8
  VALID_DB_TYPES = ["sqlite3",
@@ -22,7 +22,7 @@ module Rails
22
22
  self.title ||= CLI::UI::Prompt.ask(ctx.message("rails.forms.create.app_name"))
23
23
  self.name = format_name
24
24
  self.type = ask_type
25
- res = ShopifyCli::Tasks::SelectOrgAndShop.call(ctx, organization_id: organization_id, shop_domain: shop_domain)
25
+ res = ShopifyCLI::Tasks::SelectOrgAndShop.call(ctx, organization_id: organization_id, shop_domain: shop_domain)
26
26
  self.organization_id = res[:organization_id]
27
27
  self.shop_domain = res[:shop_domain]
28
28
  self.db = ask_db
@@ -48,7 +48,7 @@ module Rails
48
48
  end
49
49
  end
50
50
 
51
- unless ShopifyCli::Tasks::CreateApiClient::VALID_APP_TYPES.include?(type)
51
+ unless ShopifyCLI::Tasks::CreateApiClient::VALID_APP_TYPES.include?(type)
52
52
  ctx.abort(ctx.message("rails.forms.create.error.invalid_app_type", type))
53
53
  end
54
54
  ctx.puts(ctx.message("rails.forms.create.app_type.selected", type))
@@ -5,7 +5,7 @@ module Rails
5
5
  class Gem
6
6
  include SmartProperties
7
7
 
8
- property :ctx, accepts: ShopifyCli::Context, required: true
8
+ property :ctx, accepts: ShopifyCLI::Context, required: true
9
9
  property :name, converts: :to_s, required: true
10
10
  property :version, converts: :to_s
11
11
 
@@ -4,7 +4,7 @@ module Rails
4
4
 
5
5
  VERSION_STRING = /ruby ([\d\.]+)/
6
6
 
7
- property :ctx, accepts: ShopifyCli::Context, required: true
7
+ property :ctx, accepts: ShopifyCLI::Context, required: true
8
8
 
9
9
  class << self
10
10
  def version(ctx)
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Script
4
- class Project < ShopifyCli::ProjectType
4
+ class Project < ShopifyCLI::ProjectType
5
5
  hidden_feature(feature_set: :script_project)
6
6
 
7
7
  require Project.project_filepath("messages/messages")
@@ -9,12 +9,12 @@ module Script
9
9
  end
10
10
 
11
11
  # define/autoload project specific Commands
12
- class Command < ShopifyCli::ProjectCommands
12
+ class Command < ShopifyCLI::ProjectCommands
13
13
  hidden_feature(feature_set: :script_project)
14
14
  subcommand :Create, "create", Project.project_filepath("commands/create")
15
15
  subcommand :Push, "push", Project.project_filepath("commands/push")
16
16
  end
17
- ShopifyCli::Commands.register("Script::Command", "script")
17
+ ShopifyCLI::Commands.register("Script::Command", "script")
18
18
 
19
19
  # define/autoload project specific Forms
20
20
  module Forms
@@ -45,7 +45,6 @@ module Script
45
45
  end
46
46
 
47
47
  module Infrastructure
48
- autoload :ApiClients, Project.project_filepath("layers/infrastructure/api_clients")
49
48
  autoload :Errors, Project.project_filepath("layers/infrastructure/errors")
50
49
  autoload :CommandRunner, Project.project_filepath("layers/infrastructure/command_runner")
51
50
  autoload :PushPackageRepository, Project.project_filepath("layers/infrastructure/push_package_repository")
@@ -53,6 +52,7 @@ module Script
53
52
  autoload :ScriptProjectRepository, Project.project_filepath("layers/infrastructure/script_project_repository")
54
53
  autoload :ScriptService, Project.project_filepath("layers/infrastructure/script_service")
55
54
  autoload :ScriptUploader, Project.project_filepath("layers/infrastructure/script_uploader")
55
+ autoload :ServiceLocator, Project.project_filepath("layers/infrastructure/service_locator")
56
56
 
57
57
  module Languages
58
58
  autoload :AssemblyScriptProjectCreator,
@@ -65,6 +65,13 @@ module Script
65
65
  autoload :RustTaskRunner, Project.project_filepath("layers/infrastructure/languages/rust_task_runner")
66
66
  autoload :TaskRunner, Project.project_filepath("layers/infrastructure/languages/task_runner")
67
67
  end
68
+
69
+ module ApiClients
70
+ autoload :PartnersProxyApiClient,
71
+ Project.project_filepath("layers/infrastructure/api_clients/partners_proxy_api_client")
72
+ autoload :ScriptServiceApiClient,
73
+ Project.project_filepath("layers/infrastructure/api_clients/script_service_api_client")
74
+ end
68
75
  end
69
76
  end
70
77
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Script
4
4
  class Command
5
- class Create < ShopifyCli::SubCommand
5
+ class Create < ShopifyCLI::SubCommand
6
6
  prerequisite_task :ensure_authenticated
7
7
 
8
8
  options do |parser, flags|
@@ -35,7 +35,7 @@ module Script
35
35
 
36
36
  def self.help
37
37
  allowed_values = Script::Layers::Application::ExtensionPoints.available_types.map { |type| "{{cyan:#{type}}}" }
38
- ShopifyCli::Context.message("script.create.help", ShopifyCli::TOOL_NAME, allowed_values.join(", "))
38
+ ShopifyCLI::Context.message("script.create.help", ShopifyCLI::TOOL_NAME, allowed_values.join(", "))
39
39
  end
40
40
  end
41
41
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Script
4
4
  class Command
5
- class Push < ShopifyCli::SubCommand
5
+ class Push < ShopifyCLI::SubCommand
6
6
  prerequisite_task ensure_project_type: :script
7
7
 
8
8
  options do |parser, flags|
@@ -28,7 +28,7 @@ module Script
28
28
  end
29
29
 
30
30
  def self.help
31
- ShopifyCli::Context.message("script.push.help", ShopifyCli::TOOL_NAME)
31
+ ShopifyCLI::Context.message("script.push.help", ShopifyCLI::TOOL_NAME)
32
32
  end
33
33
  end
34
34
  end
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Script
4
4
  module Forms
5
- class Create < ShopifyCli::Form
5
+ class Create < ShopifyCLI::Form
6
6
  flag_arguments :extension_point, :name, :language
7
7
 
8
8
  def ask
@@ -15,7 +15,7 @@ module Script
15
15
  def self.available_types
16
16
  Infrastructure::ExtensionPointRepository.new.extension_points.select do |ep|
17
17
  next false if ep.deprecated?
18
- !ep.beta? || ShopifyCli::Feature.enabled?(:scripts_beta_extension_points)
18
+ !ep.beta? || ShopifyCLI::Feature.enabled?(:scripts_beta_extension_points)
19
19
  end.map(&:type)
20
20
  end
21
21
 
@@ -28,7 +28,7 @@ module Script
28
28
 
29
29
  def self.languages(type:)
30
30
  get(type: type).sdks.all.map do |sdk|
31
- next nil if sdk.beta? && !ShopifyCli::Feature.enabled?(:scripts_beta_languages)
31
+ next nil if sdk.beta? && !ShopifyCLI::Feature.enabled?(:scripts_beta_languages)
32
32
  sdk.class.language
33
33
  end.compact
34
34
  end
@@ -20,7 +20,10 @@ module Script
20
20
  compiled_type: task_runner.compiled_type,
21
21
  metadata: task_runner.metadata,
22
22
  )
23
- script_service = Infrastructure::ScriptService.new(ctx: p_ctx, api_key: script_project.api_key)
23
+ script_service = Infrastructure::ServiceLocator.script_service(
24
+ ctx: p_ctx,
25
+ api_key: script_project.api_key
26
+ )
24
27
  module_upload_url = Infrastructure::ScriptUploader.new(script_service).upload(package.script_content)
25
28
  uuid = script_service.set_app_script(
26
29
  uuid: package.uuid,
@@ -9,7 +9,7 @@ module Script
9
9
  UUID_ENV_KEY = "UUID"
10
10
 
11
11
  property! :id, accepts: String
12
- property :env, accepts: ShopifyCli::Resources::EnvFile
12
+ property :env, accepts: ShopifyCLI::Resources::EnvFile
13
13
 
14
14
  property! :extension_point_type, accepts: String
15
15
  property! :script_name, accepts: String
@@ -20,7 +20,7 @@ module Script
20
20
  def initialize(*)
21
21
  super
22
22
 
23
- ShopifyCli::Core::Monorail.metadata = {
23
+ ShopifyCLI::Core::Monorail.metadata = {
24
24
  "script_name" => script_name,
25
25
  "extension_point_type" => extension_point_type,
26
26
  "language" => language,
@@ -0,0 +1,55 @@
1
+ module Script
2
+ module Layers
3
+ module Infrastructure
4
+ module ApiClients
5
+ class PartnersProxyApiClient
6
+ def initialize(ctx, api_key)
7
+ @ctx = ctx
8
+ @api_key = api_key
9
+ end
10
+
11
+ def query(query_name, variables: {})
12
+ proxy_response = ShimAPI.query(@ctx, query_name, api_key: @api_key, variables: variables.to_json)
13
+ raise_if_graphql_failed(proxy_response)
14
+
15
+ response = proxy_response["data"]["scriptServiceProxy"]
16
+ JSON.parse(response) if response
17
+ end
18
+
19
+ private
20
+
21
+ def raise_if_graphql_failed(response)
22
+ raise Errors::EmptyResponseError if response.nil?
23
+
24
+ return unless response.key?("errors")
25
+ case error_code(response["errors"])
26
+ when "forbidden"
27
+ raise Errors::ForbiddenError
28
+ when "forbidden_on_shop"
29
+ raise Errors::ShopAuthenticationError
30
+ when "app_not_installed_on_shop"
31
+ raise Errors::AppNotInstalledError
32
+ else
33
+ raise Errors::GraphqlError, response["errors"]
34
+ end
35
+ end
36
+
37
+ def error_code(errors)
38
+ errors.map do |e|
39
+ code = e.dig("extensions", "code")
40
+ return code if code
41
+ end
42
+ end
43
+
44
+ class ShimAPI < ShopifyCLI::PartnersAPI
45
+ def query(query_name, variables: {})
46
+ variables[:query] = load_query(query_name)
47
+ super("script_service_proxy", variables: variables)
48
+ end
49
+ end
50
+ private_constant(:ShimAPI)
51
+ end
52
+ end
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,35 @@
1
+ module Script
2
+ module Layers
3
+ module Infrastructure
4
+ module ApiClients
5
+ class ScriptServiceApiClient
6
+ LOCAL_INSTANCE_URL = "https://script-service.myshopify.io"
7
+
8
+ def initialize(ctx, api_key)
9
+ instance_url = script_service_url
10
+ @api = ShopifyCLI::API.new(
11
+ ctx: ctx,
12
+ url: "#{instance_url}/graphql",
13
+ token: { "APP_KEY" => api_key }.compact.to_json,
14
+ auth_header: "X-Shopify-Authenticated-Tokens"
15
+ )
16
+ end
17
+
18
+ def query(query_name, variables: {})
19
+ @api.query(query_name, variables: variables)
20
+ end
21
+
22
+ private
23
+
24
+ def script_service_url
25
+ if ::ShopifyCLI::Environment.use_spin_partners_instance?
26
+ "https://script-service.#{::ShopifyCLI::Environment.spin_url}"
27
+ else
28
+ LOCAL_INSTANCE_URL
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
@@ -6,7 +6,7 @@ module Script
6
6
  class CommandRunner
7
7
  include SmartProperties
8
8
 
9
- property! :ctx, accepts: ShopifyCli::Context
9
+ property! :ctx, accepts: ShopifyCLI::Context
10
10
 
11
11
  def call(cmd)
12
12
  out, status = ctx.capture2e(cmd)
@@ -6,7 +6,7 @@ module Script
6
6
  module Languages
7
7
  class AssemblyScriptProjectCreator
8
8
  include SmartProperties
9
- property! :ctx, accepts: ShopifyCli::Context
9
+ property! :ctx, accepts: ShopifyCLI::Context
10
10
  property! :extension_point, accepts: Domain::ExtensionPoint
11
11
  property! :script_name, accepts: String
12
12
  property! :path_to_project, accepts: String
@@ -6,7 +6,7 @@ module Script
6
6
  module Languages
7
7
  class RustProjectCreator
8
8
  include SmartProperties
9
- property! :ctx, accepts: ShopifyCli::Context
9
+ property! :ctx, accepts: ShopifyCLI::Context
10
10
  property! :extension_point, accepts: Domain::ExtensionPoint
11
11
  property! :script_name, accepts: String
12
12
  property! :path_to_project, accepts: String
@@ -5,7 +5,7 @@ module Script
5
5
  module Infrastructure
6
6
  class PushPackageRepository
7
7
  include SmartProperties
8
- property! :ctx, accepts: ShopifyCli::Context
8
+ property! :ctx, accepts: ShopifyCLI::Context
9
9
 
10
10
  def create_push_package(script_project:, script_content:, compiled_type:, metadata:)
11
11
  build_file_path = file_path(script_project.id, compiled_type)
@@ -5,7 +5,7 @@ module Script
5
5
  module Infrastructure
6
6
  class ScriptProjectRepository
7
7
  include SmartProperties
8
- property! :ctx, accepts: ShopifyCli::Context
8
+ property! :ctx, accepts: ShopifyCLI::Context
9
9
 
10
10
  SCRIPT_JSON_FILENAME = "script.json"
11
11
  MUTABLE_ENV_VALUES = %i(uuid)
@@ -13,7 +13,7 @@ module Script
13
13
  def create(script_name:, extension_point_type:, language:)
14
14
  validate_metadata!(extension_point_type, language)
15
15
 
16
- ShopifyCli::Project.write(
16
+ ShopifyCLI::Project.write(
17
17
  ctx,
18
18
  project_type: :script,
19
19
  organization_id: nil,
@@ -63,7 +63,7 @@ module Script
63
63
  end
64
64
 
65
65
  def create_env(api_key:, secret:, uuid:)
66
- ShopifyCli::Resources::EnvFile.new(
66
+ ShopifyCLI::Resources::EnvFile.new(
67
67
  api_key: api_key,
68
68
  secret: secret,
69
69
  extra: {
@@ -125,7 +125,7 @@ module Script
125
125
  end
126
126
 
127
127
  def project
128
- @project ||= ShopifyCli::Project.current(force_reload: true)
128
+ @project ||= ShopifyCLI::Project.current(force_reload: true)
129
129
  end
130
130
 
131
131
  def default_language
@@ -142,7 +142,7 @@ module Script
142
142
 
143
143
  class ScriptJsonRepository
144
144
  include SmartProperties
145
- property! :ctx, accepts: ShopifyCli::Context
145
+ property! :ctx, accepts: ShopifyCLI::Context
146
146
 
147
147
  def get
148
148
  current_script_json || raise(Domain::Errors::NoScriptJsonFile)
@@ -7,13 +7,9 @@ module Script
7
7
  module Layers
8
8
  module Infrastructure
9
9
  class ScriptService
10
- include SmartProperties
11
- property! :ctx, accepts: ShopifyCli::Context
12
- property! :api_key, accepts: String
13
-
14
- def initialize(*args, ctx:, api_key:, **kwargs)
15
- super(*args, ctx: ctx, api_key: api_key, **kwargs)
16
- @client = ApiClients.default_client(ctx, api_key)
10
+ def initialize(client:, api_key:)
11
+ @client = client
12
+ @api_key = api_key
17
13
  end
18
14
 
19
15
  def set_app_script(
@@ -68,7 +64,7 @@ module Script
68
64
 
69
65
  def get_app_scripts(extension_point_type:)
70
66
  query_name = "get_app_scripts"
71
- variables = { appKey: api_key, extensionPointName: extension_point_type.upcase }
67
+ variables = { appKey: @api_key, extensionPointName: extension_point_type.upcase }
72
68
  response = make_request(query_name: query_name, variables: variables)
73
69
  response["data"]["appScripts"]
74
70
  end
@@ -0,0 +1,20 @@
1
+ module Script
2
+ module Layers
3
+ module Infrastructure
4
+ class ServiceLocator
5
+ def self.api_client(ctx:, api_key:)
6
+ if ENV["BYPASS_PARTNERS_PROXY"]
7
+ ApiClients::ScriptServiceApiClient.new(ctx, api_key)
8
+ else
9
+ ApiClients::PartnersProxyApiClient.new(ctx, api_key)
10
+ end
11
+ end
12
+
13
+ def self.script_service(ctx:, api_key:)
14
+ client = api_client(ctx: ctx, api_key: api_key)
15
+ ScriptService.new(client: client, api_key: api_key)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -2,7 +2,7 @@ require "shopify_cli"
2
2
 
3
3
  module Script
4
4
  module Tasks
5
- class EnsureEnv < ShopifyCli::Task
5
+ class EnsureEnv < ShopifyCLI::Task
6
6
  attr_accessor :ctx
7
7
 
8
8
  def call(ctx)
@@ -31,11 +31,11 @@ module Script
31
31
  def ask_org
32
32
  return stubbed_org if partner_proxy_bypass
33
33
 
34
- if ShopifyCli::Shopifolk.check && wants_to_run_against_shopify_org?
35
- ShopifyCli::Shopifolk.act_as_shopify_organization
34
+ if ShopifyCLI::Shopifolk.check && wants_to_run_against_shopify_org?
35
+ ShopifyCLI::Shopifolk.act_as_shopify_organization
36
36
  end
37
37
 
38
- orgs = ShopifyCli::PartnersAPI::Organizations.fetch_with_app(ctx)
38
+ orgs = ShopifyCLI::PartnersAPI::Organizations.fetch_with_app(ctx)
39
39
  if orgs.count == 1
40
40
  default = orgs.first
41
41
  ctx.puts(ctx.message("script.application.ensure_env.organization", default["businessName"], default["id"]))
@@ -69,7 +69,7 @@ module Script
69
69
  end
70
70
 
71
71
  def ask_app(apps)
72
- unless ShopifyCli::Shopifolk.acting_as_shopify_organization?
72
+ unless ShopifyCLI::Shopifolk.acting_as_shopify_organization?
73
73
  apps = apps.select { |app| app["appType"] == "custom" }
74
74
  end
75
75
 
@@ -89,7 +89,7 @@ module Script
89
89
  end
90
90
 
91
91
  def ask_script_uuid(app, extension_point_type)
92
- script_service = Layers::Infrastructure::ScriptService.new(ctx: ctx, api_key: app["apiKey"])
92
+ script_service = Layers::Infrastructure::ServiceLocator.script_service(ctx: ctx, api_key: app["apiKey"])
93
93
  scripts = script_service.get_app_scripts(extension_point_type: extension_point_type)
94
94
 
95
95
  return nil unless scripts.count > 0 &&