shopify-cli 2.2.1 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (249) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/ISSUE_TEMPLATE.md +0 -4
  4. data/.github/workflows/shopify.yml +104 -0
  5. data/.gitignore +2 -0
  6. data/.rubocop.yml +14 -14
  7. data/.rubocop_todo.yml +3 -3
  8. data/CHANGELOG.md +23 -0
  9. data/CONTRIBUTING.md +23 -0
  10. data/Dockerfile +19 -0
  11. data/Gemfile +1 -0
  12. data/Gemfile.lock +50 -13
  13. data/RELEASING.md +1 -1
  14. data/Rakefile +84 -18
  15. data/bin/shopify +3 -3
  16. data/dev.yml +11 -1
  17. data/ext/shopify-extensions/extconf.rb +21 -0
  18. data/ext/shopify-extensions/shopify_extensions.rb +152 -0
  19. data/ext/shopify-extensions/version +1 -0
  20. data/lib/project_types/extension/cli.rb +17 -3
  21. data/lib/project_types/extension/commands/build.rb +31 -3
  22. data/lib/project_types/extension/commands/check.rb +2 -2
  23. data/lib/project_types/extension/commands/connect.rb +1 -1
  24. data/lib/project_types/extension/commands/create.rb +59 -16
  25. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  26. data/lib/project_types/extension/commands/info.rb +1 -1
  27. data/lib/project_types/extension/commands/push.rb +1 -1
  28. data/lib/project_types/extension/commands/register.rb +2 -2
  29. data/lib/project_types/extension/commands/serve.rb +5 -5
  30. data/lib/project_types/extension/commands/tunnel.rb +6 -6
  31. data/lib/project_types/extension/extension_project.rb +4 -4
  32. data/lib/project_types/extension/features/argo.rb +2 -2
  33. data/lib/project_types/extension/features/argo_config.rb +5 -5
  34. data/lib/project_types/extension/features/argo_serve.rb +20 -6
  35. data/lib/project_types/extension/features/argo_setup.rb +1 -1
  36. data/lib/project_types/extension/features/argo_setup_step.rb +1 -1
  37. data/lib/project_types/extension/features/argo_setup_steps.rb +2 -2
  38. data/lib/project_types/extension/forms/connect.rb +2 -2
  39. data/lib/project_types/extension/forms/create.rb +6 -3
  40. data/lib/project_types/extension/forms/questions/ask_app.rb +2 -2
  41. data/lib/project_types/extension/forms/questions/ask_name.rb +1 -1
  42. data/lib/project_types/extension/forms/questions/ask_registration.rb +2 -2
  43. data/lib/project_types/extension/forms/questions/ask_template.rb +44 -0
  44. data/lib/project_types/extension/forms/questions/ask_type.rb +2 -2
  45. data/lib/project_types/extension/messages/message_loading.rb +2 -2
  46. data/lib/project_types/extension/messages/messages.rb +3 -0
  47. data/lib/project_types/extension/models/development_server.rb +74 -0
  48. data/lib/project_types/extension/models/development_server_requirements.rb +36 -0
  49. data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
  50. data/lib/project_types/extension/models/server_config/base.rb +31 -0
  51. data/lib/project_types/extension/models/server_config/development.rb +23 -0
  52. data/lib/project_types/extension/models/server_config/development_entries.rb +38 -0
  53. data/lib/project_types/extension/models/server_config/development_renderer.rb +30 -0
  54. data/lib/project_types/extension/models/server_config/extension.rb +35 -0
  55. data/lib/project_types/extension/models/server_config/root.rb +18 -0
  56. data/lib/project_types/extension/models/server_config/user.rb +10 -0
  57. data/lib/project_types/extension/models/specification.rb +1 -1
  58. data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +1 -1
  59. data/lib/project_types/extension/models/specification_handlers/default.rb +10 -2
  60. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +1 -1
  61. data/lib/project_types/extension/models/specifications.rb +4 -4
  62. data/lib/project_types/extension/tasks/choose_next_available_port.rb +2 -2
  63. data/lib/project_types/extension/tasks/configure_features.rb +1 -1
  64. data/lib/project_types/extension/tasks/configure_options.rb +1 -1
  65. data/lib/project_types/extension/tasks/converters/product_converter.rb +1 -1
  66. data/lib/project_types/extension/tasks/create_extension.rb +2 -2
  67. data/lib/project_types/extension/tasks/fetch_specifications.rb +2 -2
  68. data/lib/project_types/extension/tasks/find_npm_packages.rb +3 -3
  69. data/lib/project_types/extension/tasks/get_app.rb +2 -2
  70. data/lib/project_types/extension/tasks/get_apps.rb +2 -2
  71. data/lib/project_types/extension/tasks/get_extensions.rb +2 -2
  72. data/lib/project_types/extension/tasks/get_product.rb +2 -2
  73. data/lib/project_types/extension/tasks/run_extension_command.rb +65 -0
  74. data/lib/project_types/extension/tasks/update_draft.rb +2 -2
  75. data/lib/project_types/node/cli.rb +3 -3
  76. data/lib/project_types/node/commands/connect.rb +4 -4
  77. data/lib/project_types/node/commands/create.rb +10 -14
  78. data/lib/project_types/node/commands/deploy/heroku.rb +4 -4
  79. data/lib/project_types/node/commands/deploy.rb +3 -3
  80. data/lib/project_types/node/commands/generate.rb +2 -2
  81. data/lib/project_types/node/commands/open.rb +3 -3
  82. data/lib/project_types/node/commands/serve.rb +7 -7
  83. data/lib/project_types/node/commands/tunnel.rb +6 -6
  84. data/lib/project_types/node/forms/create.rb +3 -3
  85. data/lib/project_types/php/cli.rb +27 -0
  86. data/lib/project_types/php/commands/connect.rb +19 -0
  87. data/lib/project_types/php/commands/create.rb +143 -0
  88. data/lib/project_types/php/commands/deploy/heroku.rb +129 -0
  89. data/lib/project_types/php/commands/deploy.rb +32 -0
  90. data/lib/project_types/php/commands/open.rb +16 -0
  91. data/lib/project_types/php/commands/serve.rb +51 -0
  92. data/lib/project_types/php/commands/tunnel.rb +37 -0
  93. data/lib/project_types/php/forms/create.rb +45 -0
  94. data/lib/project_types/php/messages/messages.rb +191 -0
  95. data/lib/project_types/rails/cli.rb +3 -3
  96. data/lib/project_types/rails/commands/connect.rb +4 -4
  97. data/lib/project_types/rails/commands/create.rb +12 -16
  98. data/lib/project_types/rails/commands/deploy/heroku.rb +4 -4
  99. data/lib/project_types/rails/commands/deploy.rb +3 -3
  100. data/lib/project_types/rails/commands/generate/webhook.rb +3 -3
  101. data/lib/project_types/rails/commands/generate.rb +3 -3
  102. data/lib/project_types/rails/commands/open.rb +3 -3
  103. data/lib/project_types/rails/commands/serve.rb +8 -8
  104. data/lib/project_types/rails/commands/tunnel.rb +6 -6
  105. data/lib/project_types/rails/forms/create.rb +3 -3
  106. data/lib/project_types/rails/gem.rb +1 -1
  107. data/lib/project_types/rails/ruby.rb +1 -1
  108. data/lib/project_types/script/cli.rb +12 -3
  109. data/lib/project_types/script/commands/create.rb +2 -2
  110. data/lib/project_types/script/commands/push.rb +2 -2
  111. data/lib/project_types/script/forms/create.rb +1 -1
  112. data/lib/project_types/script/graphql/app_script_set.graphql +40 -0
  113. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +0 -44
  114. data/lib/project_types/script/graphql/module_upload_url_generate.graphql +9 -0
  115. data/lib/project_types/script/layers/application/extension_points.rb +2 -2
  116. data/lib/project_types/script/layers/application/push_script.rb +13 -1
  117. data/lib/project_types/script/layers/domain/push_package.rb +1 -14
  118. data/lib/project_types/script/layers/domain/script_project.rb +2 -2
  119. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +55 -0
  120. data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +35 -0
  121. data/lib/project_types/script/layers/infrastructure/command_runner.rb +1 -1
  122. data/lib/project_types/script/layers/infrastructure/errors.rb +2 -0
  123. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +2 -2
  124. data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +1 -1
  125. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -2
  126. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +5 -5
  127. data/lib/project_types/script/layers/infrastructure/script_service.rb +28 -97
  128. data/lib/project_types/script/layers/infrastructure/script_uploader.rb +27 -0
  129. data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
  130. data/lib/project_types/script/messages/messages.rb +3 -0
  131. data/lib/project_types/script/tasks/ensure_env.rb +7 -7
  132. data/lib/project_types/script/ui/error_handler.rb +79 -74
  133. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  134. data/lib/project_types/theme/cli.rb +3 -3
  135. data/lib/project_types/theme/commands/check.rb +3 -3
  136. data/lib/project_types/theme/commands/delete.rb +7 -7
  137. data/lib/project_types/theme/commands/init.rb +3 -3
  138. data/lib/project_types/theme/commands/language_server.rb +2 -2
  139. data/lib/project_types/theme/commands/package.rb +2 -2
  140. data/lib/project_types/theme/commands/publish.rb +5 -5
  141. data/lib/project_types/theme/commands/pull.rb +15 -9
  142. data/lib/project_types/theme/commands/push.rb +18 -12
  143. data/lib/project_types/theme/commands/serve.rb +4 -4
  144. data/lib/project_types/theme/forms/confirm_store.rb +1 -1
  145. data/lib/project_types/theme/forms/select.rb +2 -2
  146. data/lib/{shopify-cli → shopify_cli}/admin_api/populate_resource_command.rb +3 -3
  147. data/lib/{shopify-cli → shopify_cli}/admin_api/schema.rb +4 -4
  148. data/lib/{shopify-cli → shopify_cli}/admin_api.rb +27 -27
  149. data/lib/{shopify-cli → shopify_cli}/api.rb +8 -8
  150. data/lib/{shopify-cli → shopify_cli}/command.rb +3 -3
  151. data/lib/{shopify-cli → shopify_cli}/commands/config.rb +14 -14
  152. data/lib/{shopify-cli → shopify_cli}/commands/help.rb +4 -4
  153. data/lib/{shopify-cli → shopify_cli}/commands/login.rb +7 -7
  154. data/lib/shopify_cli/commands/logout.rb +39 -0
  155. data/lib/{shopify-cli → shopify_cli}/commands/populate/customer.rb +4 -4
  156. data/lib/{shopify-cli → shopify_cli}/commands/populate/draft_order.rb +4 -4
  157. data/lib/{shopify-cli → shopify_cli}/commands/populate/product.rb +4 -4
  158. data/lib/shopify_cli/commands/populate.rb +23 -0
  159. data/lib/shopify_cli/commands/store.rb +15 -0
  160. data/lib/{shopify-cli → shopify_cli}/commands/switch.rb +5 -5
  161. data/lib/{shopify-cli → shopify_cli}/commands/system.rb +10 -10
  162. data/lib/shopify_cli/commands/version.rb +15 -0
  163. data/lib/{shopify-cli → shopify_cli}/commands/whoami.rb +7 -7
  164. data/lib/shopify_cli/commands.rb +34 -0
  165. data/lib/{shopify-cli → shopify_cli}/connect.rb +3 -3
  166. data/lib/shopify_cli/constants.rb +26 -0
  167. data/lib/{shopify-cli → shopify_cli}/context.rb +6 -6
  168. data/lib/{shopify-cli → shopify_cli}/core/entry_point.rb +7 -7
  169. data/lib/{shopify-cli → shopify_cli}/core/executor.rb +3 -3
  170. data/lib/{shopify-cli → shopify_cli}/core/finalize.rb +1 -1
  171. data/lib/{shopify-cli → shopify_cli}/core/help_resolver.rb +2 -2
  172. data/lib/{shopify-cli → shopify_cli}/core/monorail.rb +8 -8
  173. data/lib/shopify_cli/core.rb +8 -0
  174. data/lib/{shopify-cli → shopify_cli}/db.rb +8 -8
  175. data/lib/shopify_cli/environment.rb +60 -0
  176. data/lib/{shopify-cli → shopify_cli}/feature.rb +8 -8
  177. data/lib/{shopify-cli → shopify_cli}/form.rb +2 -2
  178. data/lib/{shopify-cli → shopify_cli}/git.rb +8 -8
  179. data/lib/{shopify-cli → shopify_cli}/helpers/haikunator.rb +1 -1
  180. data/lib/shopify_cli/helpers.rb +5 -0
  181. data/lib/{shopify-cli → shopify_cli}/heroku.rb +38 -13
  182. data/lib/{shopify-cli → shopify_cli}/http_request.rb +1 -1
  183. data/lib/{shopify-cli → shopify_cli}/identity_auth/servlet.rb +1 -1
  184. data/lib/{shopify-cli → shopify_cli}/identity_auth.rb +24 -31
  185. data/lib/{shopify-cli → shopify_cli}/js_deps.rb +7 -7
  186. data/lib/{shopify-cli → shopify_cli}/js_system.rb +10 -10
  187. data/lib/{shopify-cli → shopify_cli}/lazy_delegator.rb +2 -2
  188. data/lib/{shopify-cli → shopify_cli}/messages/messages.rb +17 -1
  189. data/lib/{shopify-cli → shopify_cli}/method_object.rb +4 -4
  190. data/lib/{shopify-cli → shopify_cli}/options.rb +1 -1
  191. data/lib/{shopify-cli → shopify_cli}/packager.rb +8 -8
  192. data/lib/{shopify-cli → shopify_cli}/partners_api/organizations.rb +1 -1
  193. data/lib/{shopify-cli → shopify_cli}/partners_api.rb +16 -40
  194. data/lib/shopify_cli/php_deps.rb +102 -0
  195. data/lib/{shopify-cli → shopify_cli}/process_supervision.rb +23 -21
  196. data/lib/{shopify-cli → shopify_cli}/project.rb +15 -15
  197. data/lib/{shopify-cli → shopify_cli}/project_commands.rb +3 -3
  198. data/lib/{shopify-cli → shopify_cli}/project_type.rb +5 -5
  199. data/lib/{shopify-cli → shopify_cli}/resolve_constant.rb +5 -5
  200. data/lib/{shopify-cli → shopify_cli}/resources/env_file.rb +1 -1
  201. data/lib/shopify_cli/resources.rb +5 -0
  202. data/lib/{shopify-cli → shopify_cli}/result.rb +11 -11
  203. data/lib/{shopify-cli → shopify_cli}/shopifolk.rb +6 -6
  204. data/lib/{shopify-cli → shopify_cli}/sub_command.rb +1 -1
  205. data/lib/{shopify-cli → shopify_cli}/task.rb +1 -1
  206. data/lib/{shopify-cli → shopify_cli}/tasks/confirm_store.rb +3 -3
  207. data/lib/{shopify-cli → shopify_cli}/tasks/create_api_client.rb +4 -4
  208. data/lib/shopify_cli/tasks/ensure_authenticated.rb +13 -0
  209. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_dev_store.rb +5 -5
  210. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_env.rb +3 -3
  211. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_loopback_url.rb +4 -4
  212. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_project_type.rb +3 -3
  213. data/lib/{shopify-cli → shopify_cli}/tasks/select_org_and_shop.rb +8 -8
  214. data/lib/{shopify-cli → shopify_cli}/tasks/update_dashboard_urls.rb +6 -6
  215. data/lib/{shopify-cli → shopify_cli}/tasks.rb +10 -10
  216. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/certificate_manager.rb +5 -5
  217. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/header_hash.rb +5 -1
  218. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot-reload.js +0 -0
  219. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot_reload.rb +5 -6
  220. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/local_assets.rb +1 -1
  221. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/proxy.rb +15 -3
  222. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/sse.rb +1 -1
  223. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/watcher.rb +1 -1
  224. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/web_server.rb +1 -1
  225. data/lib/{shopify-cli → shopify_cli}/theme/dev_server.rb +3 -3
  226. data/lib/shopify_cli/theme/development_theme.rb +83 -0
  227. data/lib/{shopify-cli → shopify_cli}/theme/file.rb +12 -4
  228. data/lib/{shopify-cli → shopify_cli}/theme/ignore_filter.rb +8 -1
  229. data/lib/{shopify-cli → shopify_cli}/theme/mime_type.rb +1 -1
  230. data/lib/{shopify-cli → shopify_cli}/theme/syncer.rb +7 -7
  231. data/lib/{shopify-cli → shopify_cli}/theme/theme.rb +4 -4
  232. data/lib/{shopify-cli → shopify_cli}/transform_data_structure.rb +4 -4
  233. data/lib/{shopify-cli → shopify_cli}/tunnel.rb +14 -14
  234. data/lib/shopify_cli/version.rb +3 -0
  235. data/lib/shopify_cli.rb +52 -49
  236. data/shopify-cli.gemspec +5 -5
  237. metadata +130 -95
  238. data/.github/workflows/build.yml +0 -28
  239. data/lib/shopify-cli/commands/logout.rb +0 -39
  240. data/lib/shopify-cli/commands/populate.rb +0 -23
  241. data/lib/shopify-cli/commands/store.rb +0 -15
  242. data/lib/shopify-cli/commands/version.rb +0 -15
  243. data/lib/shopify-cli/commands.rb +0 -34
  244. data/lib/shopify-cli/core.rb +0 -8
  245. data/lib/shopify-cli/helpers.rb +0 -5
  246. data/lib/shopify-cli/resources.rb +0 -5
  247. data/lib/shopify-cli/tasks/ensure_authenticated.rb +0 -13
  248. data/lib/shopify-cli/theme/development_theme.rb +0 -69
  249. data/lib/shopify-cli/version.rb +0 -3
@@ -1,4 +1,4 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  class Heroku
3
3
  DOWNLOAD_URLS = {
4
4
  linux: "https://cli-assets.heroku.com/heroku-linux-x64.tar.gz",
@@ -36,7 +36,7 @@ module ShopifyCli
36
36
  def download
37
37
  return if installed?
38
38
 
39
- result = @ctx.system("curl", "-o", download_path, DOWNLOAD_URLS[@ctx.os], chdir: ShopifyCli.cache_dir)
39
+ result = @ctx.system("curl", "-o", download_path, DOWNLOAD_URLS[@ctx.os], chdir: ShopifyCLI.cache_dir)
40
40
  @ctx.abort(@ctx.message("core.heroku.error.download")) unless result.success?
41
41
  @ctx.abort(@ctx.message("core.heroku.error.download")) unless File.exist?(download_path)
42
42
  end
@@ -47,7 +47,7 @@ module ShopifyCli
47
47
  result = if @ctx.windows?
48
48
  @ctx.system("\"#{download_path}\"")
49
49
  else
50
- @ctx.system("tar", "-xf", download_path, chdir: ShopifyCli.cache_dir)
50
+ @ctx.system("tar", "-xf", download_path, chdir: ShopifyCLI.cache_dir)
51
51
  end
52
52
  @ctx.abort(@ctx.message("core.heroku.error.install")) unless result.success?
53
53
 
@@ -67,23 +67,33 @@ module ShopifyCli
67
67
  nil
68
68
  end
69
69
 
70
- private
71
-
72
- def download_filename
73
- URI.parse(DOWNLOAD_URLS[@ctx.os]).path.split("/").last
70
+ def get_config(config)
71
+ output, status = @ctx.capture2e(heroku_command, "config:get", config.to_s)
72
+ return output.strip if status.success?
73
+ nil
74
74
  end
75
75
 
76
- def download_path
77
- File.join(ShopifyCli.cache_dir, download_filename)
76
+ def set_config(config, value)
77
+ result = @ctx.system(heroku_command, "config:set", "#{config}=#{value}")
78
+
79
+ msg = @ctx.message("core.heroku.error.set_config", config, value)
80
+ @ctx.abort(msg) unless result.success?
78
81
  end
79
82
 
80
- def git_remote
81
- output, status = @ctx.capture2e("git", "remote", "get-url", "heroku")
82
- status.success? ? output : nil
83
+ def add_buildpacks(buildpacks)
84
+ result = @ctx.system(heroku_command, "buildpacks:clear")
85
+ msg = @ctx.message("core.heroku.error.add_buildpacks")
86
+ @ctx.abort(msg) unless result.success?
87
+
88
+ buildpacks.each do |buildpack|
89
+ result = @ctx.system(heroku_command, "buildpacks:add", buildpack)
90
+ msg = @ctx.message("core.heroku.error.add_buildpacks")
91
+ @ctx.abort(msg) unless result.success?
92
+ end
83
93
  end
84
94
 
85
95
  def heroku_command
86
- local_path = File.join(ShopifyCli.cache_dir, "heroku", "bin", "heroku").to_s
96
+ local_path = File.join(ShopifyCLI.cache_dir, "heroku", "bin", "heroku").to_s
87
97
  if File.exist?(local_path)
88
98
  local_path
89
99
  elsif @ctx.windows?
@@ -103,6 +113,21 @@ module ShopifyCli
103
113
  end
104
114
  end
105
115
 
116
+ private
117
+
118
+ def download_filename
119
+ URI.parse(DOWNLOAD_URLS[@ctx.os]).path.split("/").last
120
+ end
121
+
122
+ def download_path
123
+ File.join(ShopifyCLI.cache_dir, download_filename)
124
+ end
125
+
126
+ def git_remote
127
+ output, status = @ctx.capture2e("git", "remote", "get-url", "heroku")
128
+ status.success? ? output : nil
129
+ end
130
+
106
131
  def installed?
107
132
  _output, status = @ctx.capture2e(heroku_command, "--version")
108
133
  status.success?
@@ -1,7 +1,7 @@
1
1
  require "net/http"
2
2
  require "openssl"
3
3
 
4
- module ShopifyCli
4
+ module ShopifyCLI
5
5
  class HttpRequest
6
6
  class << self
7
7
  def post(uri, body, headers)
@@ -1,4 +1,4 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  class IdentityAuth
3
3
  class Servlet < WEBrick::HTTPServlet::AbstractServlet
4
4
  TEMPLATE = %{<!DOCTYPE html>
@@ -8,16 +8,15 @@ require "shopify_cli"
8
8
  require "uri"
9
9
  require "webrick"
10
10
 
11
- module ShopifyCli
11
+ module ShopifyCLI
12
12
  class IdentityAuth
13
13
  include SmartProperties
14
14
 
15
- autoload :Servlet, "shopify-cli/identity_auth/servlet"
15
+ autoload :Servlet, "shopify_cli/identity_auth/servlet"
16
16
 
17
17
  class Error < StandardError; end
18
18
  class Timeout < StandardError; end
19
19
  LocalRequest = Struct.new(:method, :path, :query, :protocol)
20
- LOCAL_DEBUG = "SHOPIFY_APP_CLI_LOCAL_PARTNERS"
21
20
 
22
21
  DEFAULT_PORT = 3456
23
22
  REDIRECT_HOST = "http://127.0.0.1:#{DEFAULT_PORT}"
@@ -50,7 +49,7 @@ module ShopifyCli
50
49
  ]
51
50
 
52
51
  property! :ctx
53
- property :store, default: -> { ShopifyCli::DB.new }
52
+ property :store, default: -> { ShopifyCLI::DB.new }
54
53
  property :state_token, accepts: String, default: SecureRandom.hex(30)
55
54
  property :code_verifier, accepts: String, default: SecureRandom.hex(30)
56
55
 
@@ -71,7 +70,7 @@ module ShopifyCli
71
70
 
72
71
  def reauthenticate
73
72
  return if refresh_exchange_tokens || refresh_access_tokens
74
- ctx.abort(ctx.message("core.identity_auth.error.reauthenticate", ShopifyCli::TOOL_NAME))
73
+ ctx.abort(ctx.message("core.identity_auth.error.reauthenticate", ShopifyCLI::TOOL_NAME))
75
74
  end
76
75
 
77
76
  def code_challenge
@@ -94,8 +93,8 @@ module ShopifyCli
94
93
  end
95
94
 
96
95
  def self.delete_tokens_and_keys
97
- ShopifyCli::DB.del(*IDENTITY_ACCESS_TOKENS)
98
- ShopifyCli::DB.del(*EXCHANGE_TOKENS)
96
+ ShopifyCLI::DB.del(*IDENTITY_ACCESS_TOKENS)
97
+ ShopifyCLI::DB.del(*EXCHANGE_TOKENS)
99
98
  end
100
99
 
101
100
  private
@@ -213,7 +212,7 @@ module ShopifyCli
213
212
  https = Net::HTTP.new(uri.host, uri.port)
214
213
  https.use_ssl = true
215
214
  request = Net::HTTP::Post.new(uri.path)
216
- request["User-Agent"] = "Shopify CLI #{::ShopifyCli::VERSION}"
215
+ request["User-Agent"] = "Shopify CLI #{::ShopifyCLI::VERSION}"
217
216
  request.body = URI.encode_www_form(params)
218
217
  res = https.request(request)
219
218
  unless res.is_a?(Net::HTTPSuccess)
@@ -236,12 +235,17 @@ module ShopifyCli
236
235
  end
237
236
 
238
237
  def auth_url
239
- return "https://accounts.shopify.com/oauth" if ENV[LOCAL_DEBUG].nil?
240
- "https://identity.myshopify.io/oauth"
238
+ if Environment.use_local_partners_instance?
239
+ "https://identity.myshopify.io/oauth"
240
+ elsif Environment.use_spin_partners_instance?
241
+ "https://identity.#{Environment.spin_url}/oauth"
242
+ else
243
+ "https://accounts.shopify.com/oauth"
244
+ end
241
245
  end
242
246
 
243
247
  def client_id_for_application(application_name)
244
- client_ids = if ENV[LOCAL_DEBUG]
248
+ client_ids = if Environment.use_local_partners_instance? || Environment.use_spin_partners_instance?
245
249
  DEV_APPLICATION_CLIENT_IDS
246
250
  else
247
251
  APPLICATION_CLIENT_IDS
@@ -252,31 +256,20 @@ module ShopifyCli
252
256
 
253
257
  def scopes(additional_scopes = [])
254
258
  (["openid"] + additional_scopes).tap do |result|
255
- result << "employee" if ShopifyCli::Shopifolk.acting_as_shopify_organization?
259
+ result << "employee" if ShopifyCLI::Shopifolk.acting_as_shopify_organization?
256
260
  end.join(" ")
257
261
  end
258
262
 
259
263
  def client_id
260
- return "fbdb2649-e327-4907-8f67-908d24cfd7e3" if ENV[LOCAL_DEBUG].nil?
261
-
262
- ctx.abort(ctx.message("core.identity_auth.error.local_identity_not_running")) unless local_identity_running?
263
-
264
- # Fetch the client ID from the local Identity Dynamic Registration endpoint
265
- response = post_request("/client", {
266
- name: "shopify-cli-development",
267
- public_type: "native",
268
- })
269
-
270
- response["client_id"]
271
- end
272
-
273
- def local_identity_running?
274
- Net::HTTP.start("identity.myshopify.io", 443, use_ssl: true, open_timeout: 1, read_timeout: 10) do |http|
275
- req = Net::HTTP::Get.new(URI.join("https://identity.myshopify.io", "/services/ping"))
276
- http.request(req).is_a?(Net::HTTPSuccess)
264
+ if Environment.use_local_partners_instance? || Environment.use_spin_partners_instance?
265
+ Constants::Identity::CLIENT_ID_DEV
266
+ else
267
+ # In the future we might want to use Identity's dynamic
268
+ # registration. To migrate to a dynamic client ID we
269
+ # need to refactor some code that relies on a static
270
+ # value for the client
271
+ Constants::Identity::CLIENT_ID
277
272
  end
278
- rescue Timeout::Error, Errno::EHOSTUNREACH, Errno::EHOSTDOWN, Errno::EADDRNOTAVAIL, Errno::ECONNREFUSED
279
- false
280
273
  end
281
274
  end
282
275
  end
@@ -1,17 +1,17 @@
1
1
  require "shopify_cli"
2
2
 
3
- module ShopifyCli
3
+ module ShopifyCLI
4
4
  ##
5
- # ShopifyCli::JsDeps ensures that all JavaScript dependencies are installed for projects.
5
+ # ShopifyCLI::JsDeps ensures that all JavaScript dependencies are installed for projects.
6
6
  #
7
7
  class JsDeps
8
8
  include SmartProperties
9
9
 
10
- property! :ctx, accepts: ShopifyCli::Context
10
+ property! :ctx, accepts: ShopifyCLI::Context
11
11
  property! :system, accepts: JsSystem, default: -> { JsSystem.new(ctx: ctx) }
12
12
 
13
13
  ##
14
- # Proxy to instance method ShopifyCli::JsDeps.new.install.
14
+ # Proxy to instance method ShopifyCLI::JsDeps.new.install.
15
15
  #
16
16
  # #### Parameters
17
17
  # - `ctx`: running context from your command
@@ -19,7 +19,7 @@ module ShopifyCli
19
19
  #
20
20
  # #### Example
21
21
  #
22
- # ShopifyCli::JsDeps.install(ctx)
22
+ # ShopifyCLI::JsDeps.install(ctx)
23
23
  #
24
24
  def self.install(ctx, verbose = false)
25
25
  new(ctx: ctx).install(verbose)
@@ -34,7 +34,7 @@ module ShopifyCli
34
34
  # #### Example
35
35
  #
36
36
  # # context is the running context for the command
37
- # ShopifyCli::JsDeps.new(context).install(true)
37
+ # ShopifyCLI::JsDeps.new(context).install(true)
38
38
  #
39
39
  def install(verbose = false)
40
40
  title = ctx.message("core.js_deps.installing", @system.package_manager)
@@ -104,7 +104,7 @@ module ShopifyCli
104
104
  ctx.message("core.js_deps.error.invalid_package", File.read(File.join(path, "package.json"))),
105
105
  error: true
106
106
  )
107
- raise ShopifyCli::AbortSilent
107
+ raise ShopifyCLI::AbortSilent
108
108
  end
109
109
  end
110
110
  end
@@ -1,8 +1,8 @@
1
1
  require "shopify_cli"
2
2
 
3
- module ShopifyCli
3
+ module ShopifyCLI
4
4
  ##
5
- # ShopifyCli::JsSystem allows conditional system calls of npm or yarn commands.
5
+ # ShopifyCLI::JsSystem allows conditional system calls of npm or yarn commands.
6
6
  #
7
7
  class JsSystem
8
8
  include SmartProperties
@@ -12,21 +12,21 @@ module ShopifyCli
12
12
 
13
13
  class << self
14
14
  ##
15
- # Proxy to instance method `ShopifyCli::JsSystem.new.yarn?`
15
+ # Proxy to instance method `ShopifyCLI::JsSystem.new.yarn?`
16
16
  #
17
17
  # #### Parameters
18
18
  # - `ctx`: running context from your command
19
19
  #
20
20
  # #### Example
21
21
  #
22
- # ShopifyCli::JsSystem.yarn?(ctx)
22
+ # ShopifyCLI::JsSystem.yarn?(ctx)
23
23
  #
24
24
  def yarn?(ctx)
25
25
  JsSystem.new(ctx: ctx).yarn?
26
26
  end
27
27
 
28
28
  ##
29
- # Proxy to instance method `ShopifyCli::JsSystem.new.call`
29
+ # Proxy to instance method `ShopifyCLI::JsSystem.new.call`
30
30
  #
31
31
  # #### Parameters
32
32
  # - `ctx`: running context from your command
@@ -35,21 +35,21 @@ module ShopifyCli
35
35
  #
36
36
  # #### Example
37
37
  #
38
- # ShopifyCli::JsSystem.call(ctx, yarn: ['install', '--silent'], npm: ['install', '--no-audit'])
38
+ # ShopifyCLI::JsSystem.call(ctx, yarn: ['install', '--silent'], npm: ['install', '--no-audit'])
39
39
  #
40
40
  def call(ctx, yarn:, npm:, capture_response: false)
41
41
  JsSystem.new(ctx: ctx).call(yarn: yarn, npm: npm, capture_response: capture_response)
42
42
  end
43
43
  end
44
44
 
45
- property :ctx, accepts: ShopifyCli::Context
45
+ property :ctx, accepts: ShopifyCLI::Context
46
46
 
47
47
  ##
48
48
  # Returns the name of the JS package manager being used
49
49
  #
50
50
  # #### Example
51
51
  #
52
- # ShopifyCli::JsSystem.new(ctx: ctx).package_manager
52
+ # ShopifyCLI::JsSystem.new(ctx: ctx).package_manager
53
53
  #
54
54
  def package_manager
55
55
  yarn? ? YARN_CORE_COMMAND : NPM_CORE_COMMAND
@@ -60,7 +60,7 @@ module ShopifyCli
60
60
  #
61
61
  # #### Example
62
62
  #
63
- # ShopifyCli::JsSystem.new(ctx: ctx).yarn?
63
+ # ShopifyCLI::JsSystem.new(ctx: ctx).yarn?
64
64
  #
65
65
  def yarn?
66
66
  @has_yarn ||= begin
@@ -80,7 +80,7 @@ module ShopifyCli
80
80
  #
81
81
  # #### Example
82
82
  #
83
- # ShopifyCli::JsSystem.new(ctx: ctx).call(
83
+ # ShopifyCLI::JsSystem.new(ctx: ctx).call(
84
84
  # yarn: ['install', '--silent'],
85
85
  # npm: ['install', '--no-audit'],
86
86
  # capture_response: false
@@ -1,6 +1,6 @@
1
1
  require "delegate"
2
2
 
3
- module ShopifyCli
3
+ module ShopifyCLI
4
4
  ##
5
5
  # `LazyDelegator` defers initialization of its underlying delegatee until the
6
6
  # latter is accessed for the first time due to a method call that the
@@ -16,7 +16,7 @@ module ShopifyCli
16
16
  # LazyDelegator lends itself to being subclassed in scenarios where some
17
17
  # facts are known and others are costly to compute:
18
18
  #
19
- # class LazySpecificationHandler < ShopifyCli::LazyDelegator
19
+ # class LazySpecificationHandler < ShopifyCLI::LazyDelegator
20
20
  # attr_reader :identifier
21
21
  #
22
22
  # def initialize(identifier, &initializer)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- module ShopifyCli
3
+ module ShopifyCLI
4
4
  module Messages
5
5
  MESSAGES = {
6
6
  apps: {
@@ -92,6 +92,8 @@ module ShopifyCli
92
92
  download: "Heroku CLI could not be downloaded",
93
93
  install: "Could not install Heroku CLI",
94
94
  could_not_select_app: "Heroku app {{green:%s}} could not be selected",
95
+ set_config: "Failed to set config %s to %s in Heroku app",
96
+ add_buildpacks: "Failed to add buildpacks in Heroku app",
95
97
  },
96
98
  },
97
99
 
@@ -188,6 +190,20 @@ module ShopifyCli
188
190
  },
189
191
  },
190
192
 
193
+ php_deps: {
194
+ error: {
195
+ missing_package: "Expected to have a file at: %s",
196
+ invalid_package: "{{info:%s}} was not valid JSON. Fix this then try again",
197
+ install: "Failed to install %s packages",
198
+ install_spinner_error: "Unable to install all %d dependencies",
199
+ install_error: "An error occurred while installing dependencies",
200
+ },
201
+
202
+ installing: "Installing Composer dependencies…",
203
+ installed: "Dependencies installed",
204
+ installed_count: "%d dependencies installed",
205
+ },
206
+
191
207
  api: {
192
208
  error: {
193
209
  failed_auth: "Failed to authenticate with Shopify. Please try again later.",
@@ -1,9 +1,9 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  ##
3
3
  # The `MethodObject` mixin can be included in any class that implements `call`
4
4
  # to ensure that
5
5
  #
6
- # * `call` will always return a `ShopifyCli::Result` by prepending a module
6
+ # * `call` will always return a `ShopifyCLI::Result` by prepending a module
7
7
  # that takes care of the result wrapping and
8
8
  # * a `to_proc` method that allows instances of this class to be passed as a
9
9
  # block.
@@ -42,8 +42,8 @@ module ShopifyCli
42
42
  # constructed using the `&` operator,
43
43
  # * error handling is deferred until the result is unwrapped.
44
44
  #
45
- # Please see the section for `ShopifyCli::Result`,
46
- # `ShopifyCli::Result::Success`, and `ShopifyCli::Result::Failure` for more
45
+ # Please see the section for `ShopifyCLI::Result`,
46
+ # `ShopifyCLI::Result::Success`, and `ShopifyCLI::Result::Failure` for more
47
47
  # information on the API of result objects.
48
48
  #
49
49
  module MethodObject
@@ -2,7 +2,7 @@
2
2
  require "shopify_cli"
3
3
  require "optparse"
4
4
 
5
- module ShopifyCli
5
+ module ShopifyCLI
6
6
  class Options
7
7
  include SmartProperties
8
8
 
@@ -1,7 +1,7 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  class Packager
3
- PACKAGING_DIR = File.join(ShopifyCli::ROOT, "packaging")
4
- BUILDS_DIR = File.join(PACKAGING_DIR, "builds", ShopifyCli::VERSION)
3
+ PACKAGING_DIR = File.join(ShopifyCLI::ROOT, "packaging")
4
+ BUILDS_DIR = File.join(PACKAGING_DIR, "builds", ShopifyCLI::VERSION)
5
5
 
6
6
  def initialize
7
7
  FileUtils.mkdir_p(BUILDS_DIR)
@@ -24,7 +24,7 @@ module ShopifyCli
24
24
  file_path = File.join(debian_dir, file)
25
25
 
26
26
  file_contents = File.read(File.join(root_dir, "#{file}.base"))
27
- file_contents = file_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION)
27
+ file_contents = file_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCLI::VERSION)
28
28
  File.open(file_path, "w", 0775) { |f| f.write(file_contents) }
29
29
  end
30
30
 
@@ -33,7 +33,7 @@ module ShopifyCli
33
33
  raise "Failed to build package" unless system("dpkg-deb", "-b", "shopify-cli")
34
34
 
35
35
  output_path = File.join(root_dir, "shopify-cli.deb")
36
- final_path = File.join(BUILDS_DIR, "shopify-cli-#{ShopifyCli::VERSION}.deb")
36
+ final_path = File.join(BUILDS_DIR, "shopify-cli-#{ShopifyCLI::VERSION}.deb")
37
37
 
38
38
  puts "Moving generated package: \n From: #{output_path}\n To: #{final_path}\n\n"
39
39
  FileUtils.mv(output_path, final_path)
@@ -53,7 +53,7 @@ module ShopifyCli
53
53
  File.delete(spec_path) if File.exist?(spec_path)
54
54
 
55
55
  spec_contents = File.read(File.join(root_dir, "shopify-cli.spec.base"))
56
- spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION)
56
+ spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCLI::VERSION)
57
57
  File.write(spec_path, spec_contents)
58
58
 
59
59
  puts "Building package…"
@@ -76,12 +76,12 @@ module ShopifyCli
76
76
  File.delete(build_path) if File.exist?(build_path)
77
77
 
78
78
  spec_contents = File.read(File.join(root_dir, "shopify-cli.base.rb"))
79
- spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION)
79
+ spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCLI::VERSION)
80
80
 
81
81
  puts "Grabbing sha256 checksum from Rubygems.org"
82
82
  require "digest/sha2"
83
83
  require "open-uri"
84
- gem_checksum = open("https://rubygems.org/downloads/shopify-cli-#{ShopifyCli::VERSION}.gem") do |io|
84
+ gem_checksum = open("https://rubygems.org/downloads/shopify-cli-#{ShopifyCLI::VERSION}.gem") do |io|
85
85
  Digest::SHA256.new.hexdigest(io.read)
86
86
  end
87
87
 
@@ -1,4 +1,4 @@
1
- module ShopifyCli
1
+ module ShopifyCLI
2
2
  class PartnersAPI
3
3
  class Organizations
4
4
  class << self
@@ -1,22 +1,12 @@
1
1
  require "shopify_cli"
2
2
 
3
- module ShopifyCli
3
+ module ShopifyCLI
4
4
  ##
5
- # ShopifyCli::PartnersAPI provides easy access to the partners dashboard CLI
5
+ # ShopifyCLI::PartnersAPI provides easy access to the partners dashboard CLI
6
6
  # schema.
7
7
  #
8
8
  class PartnersAPI < API
9
- autoload :Organizations, "shopify-cli/partners_api/organizations"
10
-
11
- # Defines the environment variable that this API looks for to operate on local
12
- # services. If you set this environment variable in your shell then the partners
13
- # API will operate on your local instance
14
- #
15
- # #### Example
16
- #
17
- # SHOPIFY_APP_CLI_LOCAL_PARTNERS=1 shopify create
18
- #
19
- LOCAL_DEBUG = "SHOPIFY_APP_CLI_LOCAL_PARTNERS"
9
+ autoload :Organizations, "shopify_cli/partners_api/organizations"
20
10
 
21
11
  class << self
22
12
  ##
@@ -31,10 +21,10 @@ module ShopifyCli
31
21
  #
32
22
  # #### Raises
33
23
  #
34
- # * http 404 will raise a ShopifyCli::API::APIRequestNotFoundError
35
- # * http 400..499 will raise a ShopifyCli::API::APIRequestClientError
36
- # * http 500..599 will raise a ShopifyCli::API::APIRequestServerError
37
- # * All other codes will raise ShopifyCli::API::APIRequestUnexpectedError
24
+ # * http 404 will raise a ShopifyCLI::API::APIRequestNotFoundError
25
+ # * http 400..499 will raise a ShopifyCLI::API::APIRequestClientError
26
+ # * http 500..599 will raise a ShopifyCLI::API::APIRequestServerError
27
+ # * All other codes will raise ShopifyCLI::API::APIRequestUnexpectedError
38
28
  #
39
29
  # #### Returns
40
30
  #
@@ -42,13 +32,13 @@ module ShopifyCli
42
32
  #
43
33
  # #### Example
44
34
  #
45
- # ShopifyCli::PartnersAPI.query(@ctx, 'all_organizations')
35
+ # ShopifyCLI::PartnersAPI.query(@ctx, 'all_organizations')
46
36
  #
47
37
  def query(ctx, query_name, **variables)
48
38
  CLI::Kit::Util.begin do
49
39
  api_client(ctx).query(query_name, variables: variables)
50
40
  end.retry_after(API::APIRequestUnauthorizedError, retries: 1) do
51
- ShopifyCli::IdentityAuth.new(ctx: ctx).reauthenticate
41
+ ShopifyCLI::IdentityAuth.new(ctx: ctx).reauthenticate
52
42
  end
53
43
  rescue API::APIRequestUnauthorizedError => e
54
44
  if (request_info = auth_failure_info(ctx, e))
@@ -56,14 +46,14 @@ module ShopifyCli
56
46
  end
57
47
  ctx.abort(ctx.message("core.api.error.failed_auth"))
58
48
  rescue API::APIRequestNotFoundError
59
- ctx.puts(ctx.message("core.partners_api.error.account_not_found", ShopifyCli::TOOL_NAME))
49
+ ctx.puts(ctx.message("core.partners_api.error.account_not_found", ShopifyCLI::TOOL_NAME))
60
50
  end
61
51
 
62
- def partners_url_for(organization_id, api_client_id, local_debug)
63
- if ShopifyCli::Shopifolk.acting_as_shopify_organization?
52
+ def partners_url_for(organization_id, api_client_id)
53
+ if ShopifyCLI::Shopifolk.acting_as_shopify_organization?
64
54
  organization_id = "internal"
65
55
  end
66
- "#{partners_endpoint(local_debug)}/#{organization_id}/apps/#{api_client_id}"
56
+ "https://#{Environment.partners_domain}/#{organization_id}/apps/#{api_client_id}"
67
57
  end
68
58
 
69
59
  private
@@ -72,29 +62,15 @@ module ShopifyCli
72
62
  new(
73
63
  ctx: ctx,
74
64
  token: access_token(ctx),
75
- url: "#{endpoint}/api/cli/graphql",
65
+ url: "https://#{Environment.partners_domain}/api/cli/graphql",
76
66
  )
77
67
  end
78
68
 
79
69
  def access_token(ctx)
80
- ShopifyCli::DB.get(:partners_exchange_token) do
70
+ ShopifyCLI::DB.get(:partners_exchange_token) do
81
71
  IdentityAuth.new(ctx: ctx).authenticate
82
- ShopifyCli::DB.get(:partners_exchange_token)
83
- end
84
- end
85
-
86
- def endpoint
87
- return "https://partners.shopify.com" if ENV[LOCAL_DEBUG].nil?
88
- "https://partners.myshopify.io/"
89
- end
90
-
91
- def partners_endpoint(local_debug)
92
- domain = if local_debug
93
- "partners.myshopify.io"
94
- else
95
- "partners.shopify.com"
72
+ ShopifyCLI::DB.get(:partners_exchange_token)
96
73
  end
97
- "https://#{domain}"
98
74
  end
99
75
 
100
76
  def auth_failure_info(ctx, error)