shopify-cli 2.2.2 → 2.6.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 (267) 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 +3 -0
  6. data/.rubocop.yml +14 -14
  7. data/.rubocop_todo.yml +3 -3
  8. data/CHANGELOG.md +30 -0
  9. data/CONTRIBUTING.md +23 -0
  10. data/Dockerfile +17 -0
  11. data/Gemfile +1 -0
  12. data/Gemfile.lock +67 -24
  13. data/RELEASING.md +1 -1
  14. data/Rakefile +75 -18
  15. data/bin/console +11 -0
  16. data/bin/shopify +16 -4
  17. data/dev.yml +14 -1
  18. data/ext/shopify-cli/extconf.rb +2 -0
  19. data/ext/shopify-extensions/extconf.rb +21 -0
  20. data/ext/shopify-extensions/shopify_extensions.rb +152 -0
  21. data/ext/shopify-extensions/version +1 -0
  22. data/lib/project_types/extension/cli.rb +19 -3
  23. data/lib/project_types/extension/commands/build.rb +32 -3
  24. data/lib/project_types/extension/commands/check.rb +2 -2
  25. data/lib/project_types/extension/commands/connect.rb +1 -1
  26. data/lib/project_types/extension/commands/create.rb +59 -16
  27. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  28. data/lib/project_types/extension/commands/info.rb +1 -1
  29. data/lib/project_types/extension/commands/push.rb +1 -1
  30. data/lib/project_types/extension/commands/register.rb +2 -2
  31. data/lib/project_types/extension/commands/serve.rb +5 -5
  32. data/lib/project_types/extension/commands/tunnel.rb +6 -6
  33. data/lib/project_types/extension/extension_project.rb +4 -4
  34. data/lib/project_types/extension/features/argo.rb +3 -3
  35. data/lib/project_types/extension/features/argo_config.rb +5 -5
  36. data/lib/project_types/extension/features/argo_serve.rb +21 -6
  37. data/lib/project_types/extension/features/argo_setup.rb +1 -1
  38. data/lib/project_types/extension/features/argo_setup_step.rb +1 -1
  39. data/lib/project_types/extension/features/argo_setup_steps.rb +2 -2
  40. data/lib/project_types/extension/forms/connect.rb +2 -2
  41. data/lib/project_types/extension/forms/create.rb +6 -3
  42. data/lib/project_types/extension/forms/questions/ask_app.rb +2 -2
  43. data/lib/project_types/extension/forms/questions/ask_name.rb +1 -1
  44. data/lib/project_types/extension/forms/questions/ask_registration.rb +2 -2
  45. data/lib/project_types/extension/forms/questions/ask_template.rb +44 -0
  46. data/lib/project_types/extension/forms/questions/ask_type.rb +2 -2
  47. data/lib/project_types/extension/messages/message_loading.rb +2 -2
  48. data/lib/project_types/extension/messages/messages.rb +3 -0
  49. data/lib/project_types/extension/models/development_server.rb +78 -0
  50. data/lib/project_types/extension/models/development_server_requirements.rb +35 -0
  51. data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
  52. data/lib/project_types/extension/models/server_config/base.rb +31 -0
  53. data/lib/project_types/extension/models/server_config/development.rb +23 -0
  54. data/lib/project_types/extension/models/server_config/development_entries.rb +38 -0
  55. data/lib/project_types/extension/models/server_config/development_renderer.rb +30 -0
  56. data/lib/project_types/extension/models/server_config/extension.rb +35 -0
  57. data/lib/project_types/extension/models/server_config/root.rb +18 -0
  58. data/lib/project_types/extension/models/server_config/user.rb +10 -0
  59. data/lib/project_types/extension/models/specification.rb +1 -1
  60. data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +1 -1
  61. data/lib/project_types/extension/models/specification_handlers/default.rb +14 -2
  62. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +1 -1
  63. data/lib/project_types/extension/models/specifications.rb +4 -4
  64. data/lib/project_types/extension/tasks/choose_next_available_port.rb +2 -2
  65. data/lib/project_types/extension/tasks/configure_features.rb +1 -1
  66. data/lib/project_types/extension/tasks/configure_options.rb +1 -1
  67. data/lib/project_types/extension/tasks/converters/product_converter.rb +1 -1
  68. data/lib/project_types/extension/tasks/converters/server_config_converter.rb +31 -0
  69. data/lib/project_types/extension/tasks/create_extension.rb +2 -2
  70. data/lib/project_types/extension/tasks/fetch_specifications.rb +2 -2
  71. data/lib/project_types/extension/tasks/find_npm_packages.rb +5 -5
  72. data/lib/project_types/extension/tasks/get_app.rb +2 -2
  73. data/lib/project_types/extension/tasks/get_apps.rb +2 -2
  74. data/lib/project_types/extension/tasks/get_extensions.rb +2 -2
  75. data/lib/project_types/extension/tasks/get_product.rb +2 -2
  76. data/lib/project_types/extension/tasks/load_server_config.rb +23 -0
  77. data/lib/project_types/extension/tasks/run_extension_command.rb +81 -0
  78. data/lib/project_types/extension/tasks/update_draft.rb +2 -2
  79. data/lib/project_types/node/cli.rb +3 -3
  80. data/lib/project_types/node/commands/connect.rb +4 -4
  81. data/lib/project_types/node/commands/create.rb +10 -14
  82. data/lib/project_types/node/commands/deploy/heroku.rb +4 -4
  83. data/lib/project_types/node/commands/deploy.rb +3 -3
  84. data/lib/project_types/node/commands/generate.rb +2 -2
  85. data/lib/project_types/node/commands/open.rb +3 -3
  86. data/lib/project_types/node/commands/serve.rb +15 -7
  87. data/lib/project_types/node/commands/tunnel.rb +6 -6
  88. data/lib/project_types/node/forms/create.rb +3 -3
  89. data/lib/project_types/node/messages/messages.rb +3 -0
  90. data/lib/project_types/php/cli.rb +27 -0
  91. data/lib/project_types/php/commands/connect.rb +19 -0
  92. data/lib/project_types/php/commands/create.rb +143 -0
  93. data/lib/project_types/php/commands/deploy/heroku.rb +129 -0
  94. data/lib/project_types/php/commands/deploy.rb +32 -0
  95. data/lib/project_types/php/commands/open.rb +16 -0
  96. data/lib/project_types/php/commands/serve.rb +51 -0
  97. data/lib/project_types/php/commands/tunnel.rb +37 -0
  98. data/lib/project_types/php/forms/create.rb +45 -0
  99. data/lib/project_types/php/messages/messages.rb +191 -0
  100. data/lib/project_types/rails/cli.rb +3 -3
  101. data/lib/project_types/rails/commands/connect.rb +4 -4
  102. data/lib/project_types/rails/commands/create.rb +12 -16
  103. data/lib/project_types/rails/commands/deploy/heroku.rb +4 -4
  104. data/lib/project_types/rails/commands/deploy.rb +3 -3
  105. data/lib/project_types/rails/commands/generate/webhook.rb +3 -3
  106. data/lib/project_types/rails/commands/generate.rb +3 -3
  107. data/lib/project_types/rails/commands/open.rb +3 -3
  108. data/lib/project_types/rails/commands/serve.rb +8 -8
  109. data/lib/project_types/rails/commands/tunnel.rb +6 -6
  110. data/lib/project_types/rails/forms/create.rb +3 -3
  111. data/lib/project_types/rails/gem.rb +1 -1
  112. data/lib/project_types/rails/ruby.rb +1 -1
  113. data/lib/project_types/script/cli.rb +16 -6
  114. data/lib/project_types/script/commands/create.rb +4 -2
  115. data/lib/project_types/script/commands/push.rb +2 -2
  116. data/lib/project_types/script/config/extension_points.yml +30 -29
  117. data/lib/project_types/script/forms/create.rb +1 -1
  118. data/lib/project_types/script/layers/application/create_script.rb +32 -12
  119. data/lib/project_types/script/layers/application/extension_points.rb +4 -4
  120. data/lib/project_types/script/layers/application/push_script.rb +13 -1
  121. data/lib/project_types/script/layers/domain/extension_point.rb +13 -45
  122. data/lib/project_types/script/layers/domain/push_package.rb +0 -12
  123. data/lib/project_types/script/layers/domain/script_project.rb +2 -2
  124. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +57 -0
  125. data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +35 -0
  126. data/lib/project_types/script/layers/infrastructure/command_runner.rb +1 -1
  127. data/lib/project_types/script/layers/infrastructure/errors.rb +5 -0
  128. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +10 -90
  129. data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +76 -11
  130. data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +1 -1
  131. data/lib/project_types/script/layers/infrastructure/languages/typescript_project_creator.rb +33 -0
  132. data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +105 -0
  133. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -1
  134. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +6 -6
  135. data/lib/project_types/script/layers/infrastructure/script_service.rb +25 -144
  136. data/lib/project_types/script/layers/infrastructure/script_uploader.rb +27 -0
  137. data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
  138. data/lib/project_types/script/messages/messages.rb +4 -0
  139. data/lib/project_types/script/tasks/ensure_env.rb +7 -7
  140. data/lib/project_types/script/ui/error_handler.rb +84 -76
  141. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  142. data/lib/project_types/theme/cli.rb +3 -3
  143. data/lib/project_types/theme/commands/check.rb +3 -3
  144. data/lib/project_types/theme/commands/delete.rb +7 -7
  145. data/lib/project_types/theme/commands/init.rb +3 -3
  146. data/lib/project_types/theme/commands/language_server.rb +2 -2
  147. data/lib/project_types/theme/commands/package.rb +2 -2
  148. data/lib/project_types/theme/commands/publish.rb +5 -5
  149. data/lib/project_types/theme/commands/pull.rb +15 -9
  150. data/lib/project_types/theme/commands/push.rb +18 -12
  151. data/lib/project_types/theme/commands/serve.rb +4 -4
  152. data/lib/project_types/theme/forms/confirm_store.rb +1 -1
  153. data/lib/project_types/theme/forms/select.rb +2 -2
  154. data/lib/{shopify-cli → shopify_cli}/admin_api/populate_resource_command.rb +3 -3
  155. data/lib/{shopify-cli → shopify_cli}/admin_api/schema.rb +4 -4
  156. data/lib/{shopify-cli → shopify_cli}/admin_api.rb +27 -27
  157. data/lib/{shopify-cli → shopify_cli}/api.rb +8 -8
  158. data/lib/shopify_cli/command/app_sub_command.rb +16 -0
  159. data/lib/{shopify-cli → shopify_cli}/command.rb +3 -3
  160. data/lib/{shopify-cli → shopify_cli}/commands/config.rb +14 -14
  161. data/lib/{shopify-cli → shopify_cli}/commands/help.rb +4 -4
  162. data/lib/{shopify-cli → shopify_cli}/commands/login.rb +7 -7
  163. data/lib/shopify_cli/commands/logout.rb +39 -0
  164. data/lib/{shopify-cli → shopify_cli}/commands/populate/customer.rb +4 -4
  165. data/lib/{shopify-cli → shopify_cli}/commands/populate/draft_order.rb +4 -4
  166. data/lib/{shopify-cli → shopify_cli}/commands/populate/product.rb +4 -4
  167. data/lib/shopify_cli/commands/populate.rb +23 -0
  168. data/lib/shopify_cli/commands/store.rb +15 -0
  169. data/lib/{shopify-cli → shopify_cli}/commands/switch.rb +5 -5
  170. data/lib/{shopify-cli → shopify_cli}/commands/system.rb +10 -10
  171. data/lib/shopify_cli/commands/version.rb +15 -0
  172. data/lib/{shopify-cli → shopify_cli}/commands/whoami.rb +7 -7
  173. data/lib/shopify_cli/commands.rb +34 -0
  174. data/lib/{shopify-cli → shopify_cli}/connect.rb +3 -3
  175. data/lib/shopify_cli/constants.rb +54 -0
  176. data/lib/{shopify-cli → shopify_cli}/context.rb +6 -6
  177. data/lib/{shopify-cli → shopify_cli}/core/entry_point.rb +7 -7
  178. data/lib/{shopify-cli → shopify_cli}/core/executor.rb +8 -4
  179. data/lib/{shopify-cli → shopify_cli}/core/finalize.rb +1 -1
  180. data/lib/{shopify-cli → shopify_cli}/core/help_resolver.rb +2 -2
  181. data/lib/{shopify-cli → shopify_cli}/core/monorail.rb +8 -8
  182. data/lib/shopify_cli/core.rb +8 -0
  183. data/lib/{shopify-cli → shopify_cli}/db.rb +8 -8
  184. data/lib/shopify_cli/environment.rb +91 -0
  185. data/lib/shopify_cli/exception_reporter/permission_controller.rb +54 -0
  186. data/lib/shopify_cli/exception_reporter.rb +55 -0
  187. data/lib/{shopify-cli → shopify_cli}/feature.rb +8 -8
  188. data/lib/{shopify-cli → shopify_cli}/form.rb +2 -2
  189. data/lib/{shopify-cli → shopify_cli}/git.rb +38 -8
  190. data/lib/{shopify-cli → shopify_cli}/helpers/haikunator.rb +1 -1
  191. data/lib/shopify_cli/helpers.rb +5 -0
  192. data/lib/{shopify-cli → shopify_cli}/heroku.rb +38 -13
  193. data/lib/{shopify-cli → shopify_cli}/http_request.rb +1 -1
  194. data/lib/{shopify-cli → shopify_cli}/identity_auth/servlet.rb +1 -1
  195. data/lib/{shopify-cli → shopify_cli}/identity_auth.rb +24 -31
  196. data/lib/{shopify-cli → shopify_cli}/js_deps.rb +7 -7
  197. data/lib/{shopify-cli → shopify_cli}/js_system.rb +10 -10
  198. data/lib/{shopify-cli → shopify_cli}/lazy_delegator.rb +2 -2
  199. data/lib/{shopify-cli → shopify_cli}/messages/messages.rb +44 -2
  200. data/lib/{shopify-cli → shopify_cli}/method_object.rb +15 -8
  201. data/lib/shopify_cli/migrator/migration.rb +27 -0
  202. data/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +13 -0
  203. data/lib/shopify_cli/migrator.rb +48 -0
  204. data/lib/{shopify-cli → shopify_cli}/options.rb +1 -1
  205. data/lib/{shopify-cli → shopify_cli}/packager.rb +8 -8
  206. data/lib/{shopify-cli → shopify_cli}/partners_api/organizations.rb +1 -1
  207. data/lib/{shopify-cli → shopify_cli}/partners_api.rb +16 -40
  208. data/lib/shopify_cli/php_deps.rb +102 -0
  209. data/lib/{shopify-cli → shopify_cli}/process_supervision.rb +23 -21
  210. data/lib/{shopify-cli → shopify_cli}/project.rb +15 -15
  211. data/lib/{shopify-cli → shopify_cli}/project_commands.rb +3 -3
  212. data/lib/{shopify-cli → shopify_cli}/project_type.rb +5 -5
  213. data/lib/{shopify-cli → shopify_cli}/resolve_constant.rb +5 -5
  214. data/lib/{shopify-cli → shopify_cli}/resources/env_file.rb +1 -1
  215. data/lib/shopify_cli/resources.rb +5 -0
  216. data/lib/{shopify-cli → shopify_cli}/result.rb +11 -11
  217. data/lib/{shopify-cli → shopify_cli}/shopifolk.rb +6 -6
  218. data/lib/{shopify-cli → shopify_cli}/sub_command.rb +1 -1
  219. data/lib/{shopify-cli → shopify_cli}/task.rb +1 -1
  220. data/lib/{shopify-cli → shopify_cli}/tasks/confirm_store.rb +3 -3
  221. data/lib/{shopify-cli → shopify_cli}/tasks/create_api_client.rb +4 -4
  222. data/lib/shopify_cli/tasks/ensure_authenticated.rb +13 -0
  223. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_dev_store.rb +5 -5
  224. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_env.rb +3 -3
  225. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_loopback_url.rb +4 -4
  226. data/lib/{shopify-cli → shopify_cli}/tasks/ensure_project_type.rb +3 -3
  227. data/lib/{shopify-cli → shopify_cli}/tasks/select_org_and_shop.rb +8 -8
  228. data/lib/{shopify-cli → shopify_cli}/tasks/update_dashboard_urls.rb +6 -6
  229. data/lib/{shopify-cli → shopify_cli}/tasks.rb +10 -10
  230. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/certificate_manager.rb +5 -5
  231. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/header_hash.rb +5 -1
  232. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot-reload.js +0 -0
  233. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot_reload.rb +5 -6
  234. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/local_assets.rb +1 -1
  235. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/proxy.rb +15 -3
  236. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/sse.rb +1 -1
  237. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/watcher.rb +1 -1
  238. data/lib/{shopify-cli → shopify_cli}/theme/dev_server/web_server.rb +1 -1
  239. data/lib/{shopify-cli → shopify_cli}/theme/dev_server.rb +3 -3
  240. data/lib/shopify_cli/theme/development_theme.rb +83 -0
  241. data/lib/{shopify-cli → shopify_cli}/theme/file.rb +12 -4
  242. data/lib/{shopify-cli → shopify_cli}/theme/ignore_filter.rb +8 -1
  243. data/lib/{shopify-cli → shopify_cli}/theme/mime_type.rb +1 -1
  244. data/lib/{shopify-cli → shopify_cli}/theme/syncer.rb +7 -7
  245. data/lib/{shopify-cli → shopify_cli}/theme/theme.rb +4 -4
  246. data/lib/{shopify-cli → shopify_cli}/transform_data_structure.rb +4 -4
  247. data/lib/{shopify-cli → shopify_cli}/tunnel.rb +14 -14
  248. data/lib/shopify_cli/version.rb +3 -0
  249. data/lib/shopify_cli.rb +61 -50
  250. data/shopify-cli.gemspec +13 -5
  251. data/utilities/docker.rb +47 -0
  252. data/utilities/utilities.rb +5 -0
  253. metadata +155 -97
  254. data/.github/workflows/build.yml +0 -28
  255. data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +0 -73
  256. data/lib/project_types/script/layers/infrastructure/languages/rust_task_runner.rb +0 -60
  257. data/lib/shopify-cli/commands/logout.rb +0 -39
  258. data/lib/shopify-cli/commands/populate.rb +0 -23
  259. data/lib/shopify-cli/commands/store.rb +0 -15
  260. data/lib/shopify-cli/commands/version.rb +0 -15
  261. data/lib/shopify-cli/commands.rb +0 -34
  262. data/lib/shopify-cli/core.rb +0 -8
  263. data/lib/shopify-cli/helpers.rb +0 -5
  264. data/lib/shopify-cli/resources.rb +0 -5
  265. data/lib/shopify-cli/tasks/ensure_authenticated.rb +0 -13
  266. data/lib/shopify-cli/theme/development_theme.rb +0 -69
  267. data/lib/shopify-cli/version.rb +0 -3
@@ -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: {
@@ -14,6 +14,25 @@ module ShopifyCli
14
14
  },
15
15
  },
16
16
  core: {
17
+ error_reporting: {
18
+ unhandled_error: {
19
+ message: "{{x}} {{red:An unexpected error occured.}}",
20
+ issue_message: "{{red:\tTo \e]8;;#{ShopifyCLI::Constants::Links::NEW_ISSUE}\e\\submit an issue\e]8;;\e\\"\
21
+ " include the stack trace.}}",
22
+ stacktrace_message: "{{red:\tTo print the stack trace, add the environment variable %s.}}",
23
+ },
24
+ enable_automatic_reporting_prompt: {
25
+ question: "Automatically send error reports moving forward?",
26
+ yes: "Automatically send error reports to the Shopify team",
27
+ no: "Don't send error reports",
28
+ enabled: "Anonymized error reports will be sent to Shopify.",
29
+ },
30
+ report_error: {
31
+ question: "Send an error report to Shopify?",
32
+ yes: "Send report",
33
+ no: "Don't send",
34
+ },
35
+ },
17
36
  connect: {
18
37
  already_connected_warning: "{{yellow:! This app appears to be already connected}}",
19
38
  project_type_select: "What type of project would you like to connect?",
@@ -67,10 +86,18 @@ module ShopifyCli
67
86
  repo_not_initiated:
68
87
  "Git repo is not initiated. Please run {{command:git init}} and make at least one commit.",
69
88
  no_commits_made: "No git commits have been made. Please make at least one commit.",
89
+ remote_not_added: "Remote could not be added.",
90
+ sparse_checkout_not_enabled: "Sparse checkout could not be enabled.",
91
+ sparse_checkout_not_set: "Sparse checkout set command failed.",
92
+ pull_failed: "Pull failed.",
93
+ pull_failed_bad_branch: "Pull failed. Branch %s cannot be found. Check the branch name and try again.",
70
94
  },
71
95
 
72
96
  cloning: "Cloning %s into %s…",
73
97
  cloned: "{{v}} Cloned into %s",
98
+ pulling_from_to: "Pulling %s into %s…",
99
+ pulling: "Pulling…",
100
+ pulled: "Pulled into %s",
74
101
  },
75
102
 
76
103
  help: {
@@ -92,6 +119,8 @@ module ShopifyCli
92
119
  download: "Heroku CLI could not be downloaded",
93
120
  install: "Could not install Heroku CLI",
94
121
  could_not_select_app: "Heroku app {{green:%s}} could not be selected",
122
+ set_config: "Failed to set config %s to %s in Heroku app",
123
+ add_buildpacks: "Failed to add buildpacks in Heroku app",
95
124
  },
96
125
  },
97
126
 
@@ -188,6 +217,20 @@ module ShopifyCli
188
217
  },
189
218
  },
190
219
 
220
+ php_deps: {
221
+ error: {
222
+ missing_package: "Expected to have a file at: %s",
223
+ invalid_package: "{{info:%s}} was not valid JSON. Fix this then try again",
224
+ install: "Failed to install %s packages",
225
+ install_spinner_error: "Unable to install all %d dependencies",
226
+ install_error: "An error occurred while installing dependencies",
227
+ },
228
+
229
+ installing: "Installing Composer dependencies…",
230
+ installed: "Dependencies installed",
231
+ installed_count: "%d dependencies installed",
232
+ },
233
+
191
234
  api: {
192
235
  error: {
193
236
  failed_auth: "Failed to authenticate with Shopify. Please try again later.",
@@ -413,7 +456,6 @@ module ShopifyCli
413
456
  ngrok: "Something went wrong with ngrok installation,"\
414
457
  "please make sure %s exists within %s before trying again",
415
458
  },
416
-
417
459
  installing: "Installing ngrok…",
418
460
  not_running: "{{green:x}} ngrok tunnel not running",
419
461
  prereq_command_location: "%s @ %s",
@@ -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,18 +42,20 @@ 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
50
50
  module AutoCreateResultObject
51
+ def self.ruby2_keywords(*); end unless respond_to?(:ruby2_keywords, true)
52
+
51
53
  ##
52
54
  # invokes the original `call` implementation and wraps its return value
53
55
  # into a result object.
54
56
  #
55
- def call(*args, **kwargs, &block)
56
- Result.wrap { kwargs.any? ? super(*args, **kwargs, &block) : super(*args, &block) }.call
57
+ ruby2_keywords def call(*args, &block)
58
+ Result.wrap { super(*args, &block) }.call
57
59
  end
58
60
  end
59
61
 
@@ -66,8 +68,13 @@ module ShopifyCli
66
68
  #
67
69
  def call(*args, **kwargs, &block)
68
70
  properties.keys.yield_self do |properties|
69
- new(**kwargs.slice(*properties))
70
- .call(*args, **kwargs.slice(*(kwargs.keys - properties)), &block)
71
+ instance = new(**kwargs.slice(*properties))
72
+ kwargs = kwargs.slice(*(kwargs.keys - properties))
73
+ if kwargs.any?
74
+ instance.call(*args, **kwargs, &block)
75
+ else
76
+ instance.call(*args, &block)
77
+ end
71
78
  end
72
79
  end
73
80
 
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+ require "date"
3
+
4
+ module ShopifyCLI
5
+ module Migrator
6
+ class Migration
7
+ attr_reader :name, :path, :date
8
+
9
+ def initialize(name:, path:, date:)
10
+ @name = name
11
+ @path = path
12
+ @date = date
13
+ end
14
+
15
+ def run
16
+ require(path)
17
+ ShopifyCli::Migrator::Migrations.const_get(class_name).run
18
+ rescue StandardError
19
+ # Continue
20
+ end
21
+
22
+ def class_name
23
+ name.split("_").collect(&:capitalize).join
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyCLI
4
+ module Migrator
5
+ module Migrations
6
+ class Base
7
+ def self.run
8
+ # This is a noop migration to be used as a reference
9
+ end
10
+ end
11
+ end
12
+ end
13
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+ require "date"
3
+
4
+ module ShopifyCLI
5
+ module Migrator
6
+ autoload :Migration, "shopify_cli/migrator/migration"
7
+
8
+ def self.migrate(
9
+ migrations_directory: File.expand_path("migrator/migrations", __dir__)
10
+ )
11
+ baseline_date = last_migration_date
12
+ unless baseline_date.nil?
13
+ migrations = migrations(migrations_directory: migrations_directory)
14
+ .select { |m|
15
+ m.date > baseline_date.to_i
16
+ }
17
+ .each { |m| m.run }
18
+ end
19
+
20
+ store_last_migration_date
21
+ end
22
+
23
+ private
24
+
25
+ def self.store_last_migration_date
26
+ ShopifyCLI::DB.set(ShopifyCLI::Constants::StoreKeys::LAST_MIGRATION_DATE => Time.now.to_i)
27
+ end
28
+
29
+ def self.last_migration_date
30
+ ShopifyCLI::DB.get(ShopifyCLI::Constants::StoreKeys::LAST_MIGRATION_DATE)
31
+ end
32
+
33
+ def self.migrations(migrations_directory:)
34
+ Dir.glob(File.join(migrations_directory, "*.rb")).map do |file_path|
35
+ file_name = File.basename(file_path).gsub(".rb", "")
36
+ file_name_components = file_name.split("_")
37
+ date_timestamp = file_name_components[0].to_i
38
+ migration_name = file_name_components[1...].join("_")
39
+
40
+ Migrator::Migration.new(
41
+ name: migration_name,
42
+ date: Time.at(date_timestamp).to_i,
43
+ path: file_path
44
+ )
45
+ end
46
+ end
47
+ end
48
+ end
@@ -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)
@@ -0,0 +1,102 @@
1
+ require "shopify_cli"
2
+
3
+ module ShopifyCLI
4
+ ##
5
+ # ShopifyCLI::PHPDeps ensures that all PHP dependencies are installed for projects.
6
+ #
7
+ class PHPDeps
8
+ include SmartProperties
9
+
10
+ property! :ctx, accepts: ShopifyCLI::Context
11
+
12
+ ##
13
+ # Proxy to instance method ShopifyCLI::PHPDeps.new.install.
14
+ #
15
+ # #### Parameters
16
+ # - `ctx`: running context from your command
17
+ # - `verbose`: whether to run the installation tools in verbose mode
18
+ #
19
+ # #### Example
20
+ #
21
+ # ShopifyCLI::PHPDeps.install(ctx)
22
+ #
23
+ def self.install(ctx, verbose = false)
24
+ new(ctx: ctx).install(verbose)
25
+ end
26
+
27
+ ##
28
+ # Installs all of a project's PHP dependencies using Composer.
29
+ #
30
+ # #### Parameters
31
+ # - `verbose`: whether to run the installation tools in verbose mode
32
+ #
33
+ # #### Example
34
+ #
35
+ # # context is the running context for the command
36
+ # ShopifyCLI::PHPDeps.new(context).install(true)
37
+ #
38
+ def install(verbose = false)
39
+ title = ctx.message("core.php_deps.installing")
40
+ success = ctx.message("core.php_deps.installed")
41
+ failure = ctx.message("core.php_deps.error.install_error")
42
+
43
+ CLI::UI::Frame.open(title, success_text: success, failure_text: failure) do
44
+ composer(verbose)
45
+ end
46
+ end
47
+
48
+ private
49
+
50
+ def composer(verbose = false)
51
+ cmd = %w(composer install)
52
+ cmd << "--quiet" unless verbose
53
+
54
+ run_install_command(cmd)
55
+ end
56
+
57
+ def run_install_command(cmd)
58
+ deps = parse_dependencies
59
+ errors = nil
60
+
61
+ spinner_title = ctx.message("core.php_deps.installing")
62
+ success = CLI::UI::Spinner.spin(spinner_title, auto_debrief: false) do |spinner|
63
+ _out, errors, status = CLI::Kit::System.capture3(*cmd, env: @ctx.env, chdir: ctx.root)
64
+ update_spinner_title_and_status(spinner, status, deps)
65
+ end
66
+
67
+ errors.lines.each { |e| ctx.puts e } unless success || errors.nil?
68
+
69
+ ctx.abort(ctx.message("core.php_deps.error.install", "Composer")) unless success
70
+ success
71
+ end
72
+
73
+ def update_spinner_title_and_status(spinner, status, deps)
74
+ if status.success?
75
+ spinner.update_title(ctx.message("core.php_deps.installed_count", deps.size))
76
+ else
77
+ spinner.update_title(ctx.message("core.php_deps.error.install_spinner_error", deps.size))
78
+ CLI::UI::Spinner::TASK_FAILED
79
+ end
80
+ end
81
+
82
+ def parse_dependencies
83
+ composer_json = File.join(ctx.root, "composer.json")
84
+ pkg =
85
+ begin
86
+ JSON.parse(File.read(composer_json))
87
+ rescue Errno::ENOENT, Errno::ENOTDIR
88
+ ctx.abort(ctx.message("core.php_deps.error.missing_package", composer_json))
89
+ end
90
+
91
+ %w(require require-dev).map do |key|
92
+ pkg.fetch(key, []).keys
93
+ end.flatten
94
+ rescue JSON::ParserError
95
+ ctx.puts(
96
+ ctx.message("core.php_deps.error.invalid_package", File.read(File.join(path, "composer.json"))),
97
+ error: true
98
+ )
99
+ raise ShopifyCLI::AbortSilent
100
+ end
101
+ end
102
+ end