shopify-cli 1.3.1 → 1.7.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 (301) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +2 -2
  3. data/.github/CONTRIBUTING.md +9 -1
  4. data/.github/PULL_REQUEST_TEMPLATE.md +10 -1
  5. data/.github/workflows/release.yml +61 -0
  6. data/.github/workflows/triage.yml +22 -0
  7. data/.gitignore +0 -1
  8. data/.rubocop.yml +61 -8
  9. data/.rubocop_todo.yml +11 -0
  10. data/.travis.yml +1 -0
  11. data/CHANGELOG.md +30 -0
  12. data/Gemfile +12 -11
  13. data/Gemfile.lock +39 -37
  14. data/README.md +39 -7
  15. data/RELEASING.md +19 -29
  16. data/Rakefile +32 -28
  17. data/bin/load_shopify.rb +6 -6
  18. data/bin/shopify +2 -2
  19. data/dev.yml +2 -2
  20. data/docs/_config.yml +1 -18
  21. data/docs/app/node/commands/index.md +2 -80
  22. data/docs/app/node/index.md +2 -33
  23. data/docs/app/rails/commands/index.md +2 -78
  24. data/docs/app/rails/index.md +2 -34
  25. data/docs/core/index.md +2 -84
  26. data/docs/getting-started/index.md +2 -25
  27. data/docs/getting-started/install/index.md +1 -118
  28. data/docs/getting-started/migrate/index.md +2 -94
  29. data/docs/getting-started/uninstall/index.md +2 -35
  30. data/docs/getting-started/upgrade/index.md +2 -39
  31. data/docs/help/start-app/index.md +2 -4
  32. data/docs/index.md +2 -24
  33. data/ext/shopify-cli/extconf.rb +7 -7
  34. data/install.sh +1 -1
  35. data/lib/docgen/markdown.rb +11 -11
  36. data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
  37. data/lib/project_types/extension/cli.rb +64 -47
  38. data/lib/project_types/extension/commands/build.rb +3 -3
  39. data/lib/project_types/extension/commands/create.rb +16 -9
  40. data/lib/project_types/extension/commands/extension_command.rb +8 -5
  41. data/lib/project_types/extension/commands/push.rb +8 -8
  42. data/lib/project_types/extension/commands/register.rb +19 -30
  43. data/lib/project_types/extension/commands/serve.rb +2 -2
  44. data/lib/project_types/extension/commands/tunnel.rb +12 -12
  45. data/lib/project_types/extension/extension_project.rb +4 -4
  46. data/lib/project_types/extension/extension_project_keys.rb +4 -4
  47. data/lib/project_types/extension/features/argo.rb +117 -0
  48. data/lib/project_types/extension/features/argo_config.rb +5 -5
  49. data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
  50. data/lib/project_types/extension/features/argo_setup.rb +2 -2
  51. data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
  52. data/lib/project_types/extension/forms/create.rb +28 -34
  53. data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
  54. data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
  55. data/lib/project_types/extension/forms/questions/ask_type.rb +36 -0
  56. data/lib/project_types/extension/messages/messages.rb +53 -52
  57. data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
  58. data/lib/project_types/extension/models/specification.rb +35 -0
  59. data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +19 -0
  60. data/lib/project_types/extension/models/specification_handlers/default.rb +67 -0
  61. data/lib/project_types/extension/models/specifications.rb +77 -0
  62. data/lib/project_types/extension/tasks/configure_features.rb +52 -0
  63. data/lib/project_types/extension/tasks/converters/app_converter.rb +6 -6
  64. data/lib/project_types/extension/tasks/converters/registration_converter.rb +6 -6
  65. data/lib/project_types/extension/tasks/converters/validation_error_converter.rb +4 -4
  66. data/lib/project_types/extension/tasks/converters/version_converter.rb +7 -7
  67. data/lib/project_types/extension/tasks/create_extension.rb +4 -4
  68. data/lib/project_types/extension/tasks/fetch_specifications.rb +38 -0
  69. data/lib/project_types/extension/tasks/get_app.rb +4 -4
  70. data/lib/project_types/extension/tasks/get_apps.rb +3 -3
  71. data/lib/project_types/extension/tasks/update_draft.rb +4 -4
  72. data/lib/project_types/extension/tasks/user_errors.rb +4 -4
  73. data/lib/project_types/node/cli.rb +19 -16
  74. data/lib/project_types/node/commands/connect.rb +15 -0
  75. data/lib/project_types/node/commands/create.rb +46 -38
  76. data/lib/project_types/node/commands/deploy.rb +4 -4
  77. data/lib/project_types/node/commands/deploy/heroku.rb +24 -24
  78. data/lib/project_types/node/commands/generate.rb +9 -18
  79. data/lib/project_types/node/commands/open.rb +2 -2
  80. data/lib/project_types/node/commands/populate.rb +6 -6
  81. data/lib/project_types/node/commands/populate/customer.rb +5 -5
  82. data/lib/project_types/node/commands/populate/draft_order.rb +5 -5
  83. data/lib/project_types/node/commands/populate/product.rb +5 -5
  84. data/lib/project_types/node/commands/serve.rb +9 -9
  85. data/lib/project_types/node/commands/tunnel.rb +7 -7
  86. data/lib/project_types/node/forms/create.rb +7 -7
  87. data/lib/project_types/node/messages/messages.rb +19 -53
  88. data/lib/project_types/rails/cli.rb +21 -18
  89. data/lib/project_types/rails/commands/connect.rb +15 -0
  90. data/lib/project_types/rails/commands/create.rb +60 -54
  91. data/lib/project_types/rails/commands/deploy.rb +4 -4
  92. data/lib/project_types/rails/commands/deploy/heroku.rb +30 -30
  93. data/lib/project_types/rails/commands/generate.rb +7 -7
  94. data/lib/project_types/rails/commands/generate/webhook.rb +6 -6
  95. data/lib/project_types/rails/commands/open.rb +2 -2
  96. data/lib/project_types/rails/commands/populate.rb +6 -6
  97. data/lib/project_types/rails/commands/populate/customer.rb +5 -5
  98. data/lib/project_types/rails/commands/populate/draft_order.rb +5 -5
  99. data/lib/project_types/rails/commands/populate/product.rb +5 -5
  100. data/lib/project_types/rails/commands/serve.rb +11 -11
  101. data/lib/project_types/rails/commands/tunnel.rb +7 -7
  102. data/lib/project_types/rails/forms/create.rb +24 -24
  103. data/lib/project_types/rails/gem.rb +24 -24
  104. data/lib/project_types/rails/messages/messages.rb +12 -9
  105. data/lib/project_types/rails/ruby.rb +2 -2
  106. data/lib/project_types/script/cli.rb +42 -38
  107. data/lib/project_types/script/commands/create.rb +13 -10
  108. data/lib/project_types/script/commands/disable.rb +3 -3
  109. data/lib/project_types/script/commands/enable.rb +19 -9
  110. data/lib/project_types/script/commands/push.rb +10 -17
  111. data/lib/project_types/script/config/extension_points.yml +17 -12
  112. data/lib/project_types/script/errors.rb +38 -0
  113. data/lib/project_types/script/forms/create.rb +29 -5
  114. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +12 -1
  115. data/lib/project_types/script/layers/application/build_script.rb +18 -19
  116. data/lib/project_types/script/layers/application/create_script.rb +13 -11
  117. data/lib/project_types/script/layers/application/disable_script.rb +2 -2
  118. data/lib/project_types/script/layers/application/enable_script.rb +2 -2
  119. data/lib/project_types/script/layers/application/extension_points.rb +24 -0
  120. data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
  121. data/lib/project_types/script/layers/application/push_script.rb +12 -18
  122. data/lib/project_types/script/layers/domain/errors.rb +7 -0
  123. data/lib/project_types/script/layers/domain/extension_point.rb +62 -7
  124. data/lib/project_types/script/layers/domain/metadata.rb +55 -0
  125. data/lib/project_types/script/layers/domain/push_package.rb +29 -6
  126. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +19 -54
  127. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +49 -18
  128. data/lib/project_types/script/layers/infrastructure/errors.rb +17 -1
  129. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
  130. data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
  131. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +20 -13
  132. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
  133. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
  134. data/lib/project_types/script/layers/infrastructure/script_service.rb +26 -16
  135. data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
  136. data/lib/project_types/script/messages/messages.rb +67 -10
  137. data/lib/project_types/script/script_project.rb +47 -16
  138. data/lib/project_types/script/ui/error_handler.rb +115 -45
  139. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  140. data/lib/project_types/script/ui/strict_spinner.rb +1 -1
  141. data/lib/project_types/theme/cli.rb +40 -0
  142. data/lib/project_types/theme/commands/connect.rb +54 -0
  143. data/lib/project_types/theme/commands/create.rb +48 -0
  144. data/lib/project_types/theme/commands/deploy.rb +38 -0
  145. data/lib/project_types/theme/commands/generate.rb +20 -0
  146. data/lib/project_types/theme/commands/generate/env.rb +79 -0
  147. data/lib/project_types/theme/commands/push.rb +55 -0
  148. data/lib/project_types/theme/commands/serve.rb +31 -0
  149. data/lib/project_types/theme/forms/connect.rb +34 -0
  150. data/lib/project_types/theme/forms/create.rb +22 -0
  151. data/lib/project_types/theme/messages/messages.rb +147 -0
  152. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
  153. data/lib/project_types/theme/themekit.rb +113 -0
  154. data/lib/rubygems_plugin.rb +3 -3
  155. data/lib/shopify-cli/admin_api.rb +52 -12
  156. data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
  157. data/lib/shopify-cli/admin_api/schema.rb +3 -3
  158. data/lib/shopify-cli/api.rb +38 -37
  159. data/lib/shopify-cli/command.rb +1 -1
  160. data/lib/shopify-cli/commands.rb +9 -9
  161. data/lib/shopify-cli/commands/config.rb +28 -28
  162. data/lib/shopify-cli/commands/connect.rb +35 -18
  163. data/lib/shopify-cli/commands/create.rb +5 -5
  164. data/lib/shopify-cli/commands/help.rb +6 -6
  165. data/lib/shopify-cli/commands/logout.rb +3 -3
  166. data/lib/shopify-cli/commands/system.rb +40 -31
  167. data/lib/shopify-cli/commands/version.rb +2 -2
  168. data/lib/shopify-cli/context.rb +43 -22
  169. data/lib/shopify-cli/core.rb +4 -4
  170. data/lib/shopify-cli/core/entry_point.rb +6 -6
  171. data/lib/shopify-cli/core/executor.rb +1 -1
  172. data/lib/shopify-cli/core/help_resolver.rb +2 -2
  173. data/lib/shopify-cli/core/monorail.rb +21 -19
  174. data/lib/shopify-cli/db.rb +2 -2
  175. data/lib/shopify-cli/feature.rb +1 -3
  176. data/lib/shopify-cli/form.rb +1 -1
  177. data/lib/shopify-cli/git.rb +17 -17
  178. data/lib/shopify-cli/helpers.rb +1 -1
  179. data/lib/shopify-cli/helpers/haikunator.rb +1 -1
  180. data/lib/shopify-cli/heroku.rb +28 -28
  181. data/lib/shopify-cli/http_request.rb +27 -0
  182. data/lib/shopify-cli/js_deps.rb +13 -13
  183. data/lib/shopify-cli/js_system.rb +5 -5
  184. data/lib/shopify-cli/lazy_delegator.rb +55 -0
  185. data/lib/shopify-cli/messages/messages.rb +24 -10
  186. data/lib/shopify-cli/method_object.rb +104 -0
  187. data/lib/shopify-cli/oauth.rb +25 -25
  188. data/lib/shopify-cli/oauth/servlet.rb +9 -9
  189. data/lib/shopify-cli/options.rb +3 -3
  190. data/lib/shopify-cli/packager.rb +24 -24
  191. data/lib/shopify-cli/partners_api.rb +38 -16
  192. data/lib/shopify-cli/partners_api/organizations.rb +10 -10
  193. data/lib/shopify-cli/process_supervision.rb +8 -8
  194. data/lib/shopify-cli/project.rb +27 -23
  195. data/lib/shopify-cli/project_type.rb +21 -5
  196. data/lib/shopify-cli/resolve_constant.rb +25 -0
  197. data/lib/shopify-cli/resources.rb +1 -1
  198. data/lib/shopify-cli/resources/env_file.rb +9 -9
  199. data/lib/shopify-cli/result.rb +432 -0
  200. data/lib/shopify-cli/shopifolk.rb +84 -0
  201. data/lib/shopify-cli/sub_command.rb +1 -1
  202. data/lib/shopify-cli/task.rb +9 -1
  203. data/lib/shopify-cli/tasks.rb +7 -7
  204. data/lib/shopify-cli/tasks/create_api_client.rb +17 -6
  205. data/lib/shopify-cli/tasks/ensure_dev_store.rb +11 -11
  206. data/lib/shopify-cli/tasks/ensure_env.rb +18 -15
  207. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
  208. data/lib/shopify-cli/tasks/select_org_and_shop.rb +29 -24
  209. data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
  210. data/lib/shopify-cli/transform_data_structure.rb +86 -0
  211. data/lib/shopify-cli/tunnel.rb +36 -30
  212. data/lib/shopify-cli/version.rb +1 -1
  213. data/lib/shopify_cli.rb +57 -51
  214. data/shopify-cli.gemspec +6 -6
  215. data/shopify.fish +1 -1
  216. data/shopify.sh +1 -1
  217. data/vendor/deps/cli-kit/REVISION +1 -1
  218. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
  219. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
  220. data/vendor/deps/cli-ui/REVISION +1 -1
  221. data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
  222. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
  223. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
  224. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
  225. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
  226. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
  227. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
  228. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
  229. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
  230. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
  231. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
  232. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
  233. data/vendor/deps/webrick/.gitignore +9 -0
  234. data/vendor/deps/webrick/Gemfile +3 -0
  235. data/vendor/deps/webrick/LICENSE.txt +22 -0
  236. data/vendor/deps/webrick/README.md +61 -0
  237. data/vendor/deps/webrick/Rakefile +10 -0
  238. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  239. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  240. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  241. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  242. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  243. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  244. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  245. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  246. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  247. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  248. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  249. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  250. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  251. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  252. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  253. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  254. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  255. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  256. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  257. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  258. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  259. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  260. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  261. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  262. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  263. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  264. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  265. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  266. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  267. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  268. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  269. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  270. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  271. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  272. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  273. data/vendor/deps/webrick/webrick.gemspec +74 -0
  274. data/vendor/gen/template/bin/update-deps +9 -9
  275. metadata +84 -29
  276. data/docs/Gemfile +0 -5
  277. data/docs/Gemfile.lock +0 -258
  278. data/docs/_data/nav.yml +0 -35
  279. data/docs/_includes/footer.html +0 -15
  280. data/docs/_includes/head.html +0 -19
  281. data/docs/_includes/sidebar_nav.html +0 -22
  282. data/docs/_includes/toc.html +0 -112
  283. data/docs/_layouts/default.html +0 -79
  284. data/docs/css/docs.css +0 -157
  285. data/docs/images/header.png +0 -0
  286. data/docs/installing-ruby.md +0 -28
  287. data/lib/project_types/extension/features/argo/admin.rb +0 -20
  288. data/lib/project_types/extension/features/argo/base.rb +0 -129
  289. data/lib/project_types/extension/features/argo/checkout.rb +0 -20
  290. data/lib/project_types/extension/forms/register.rb +0 -47
  291. data/lib/project_types/extension/models/type.rb +0 -81
  292. data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
  293. data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
  294. data/lib/project_types/node/commands/generate/billing.rb +0 -39
  295. data/lib/project_types/node/commands/generate/page.rb +0 -59
  296. data/lib/project_types/node/commands/generate/webhook.rb +0 -37
  297. data/lib/project_types/script/layers/domain/script.rb +0 -18
  298. data/lib/project_types/script/layers/infrastructure/assemblyscript_tsconfig.rb +0 -38
  299. data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -59
  300. data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
  301. data/lib/project_types/script/templates/ts/as-pect.d.ts +0 -1
@@ -1,18 +1,18 @@
1
- require 'base64'
2
- require 'digest'
3
- require 'json'
4
- require 'net/http'
5
- require 'securerandom'
6
- require 'openssl'
7
- require 'shopify_cli'
8
- require 'uri'
9
- require 'webrick'
1
+ require "base64"
2
+ require "digest"
3
+ require "json"
4
+ require "net/http"
5
+ require "securerandom"
6
+ require "openssl"
7
+ require "shopify_cli"
8
+ require "uri"
9
+ require "webrick"
10
10
 
11
11
  module ShopifyCli
12
12
  class OAuth
13
13
  include SmartProperties
14
14
 
15
- autoload :Servlet, 'shopify-cli/oauth/servlet'
15
+ autoload :Servlet, "shopify-cli/oauth/servlet"
16
16
 
17
17
  class Error < StandardError; end
18
18
  LocalRequest = Struct.new(:method, :path, :query, :protocol)
@@ -54,10 +54,10 @@ module ShopifyCli
54
54
  @server ||= begin
55
55
  server = WEBrick::HTTPServer.new(
56
56
  Port: DEFAULT_PORT,
57
- Logger: WEBrick::Log.new(File.open(File::NULL, 'w')),
57
+ Logger: WEBrick::Log.new(File.open(File::NULL, "w")),
58
58
  AccessLog: [],
59
59
  )
60
- server.mount('/', Servlet, self, state_token)
60
+ server.mount("/", Servlet, self, state_token)
61
61
  server
62
62
  end
63
63
  end
@@ -80,17 +80,17 @@ module ShopifyCli
80
80
  end
81
81
 
82
82
  def output_authentication_info(uri)
83
- login_location = ctx.message(service == 'admin' ? 'core.oauth.location.admin' : 'core.oauth.location.partner')
84
- ctx.puts(ctx.message('core.oauth.authentication_required', login_location))
83
+ login_location = ctx.message(service == "admin" ? "core.oauth.location.admin" : "core.oauth.location.partner")
84
+ ctx.puts(ctx.message("core.oauth.authentication_required", login_location))
85
85
  ctx.open_url!(uri)
86
86
  end
87
87
 
88
88
  def receive_access_code
89
89
  @access_code ||= begin
90
90
  @server_thread.join(240)
91
- raise Error, ctx.message('core.oauth.error.timeout') if response_query.nil?
92
- raise Error, response_query['error_description'] unless response_query['error'].nil?
93
- response_query['code']
91
+ raise Error, ctx.message("core.oauth.error.timeout") if response_query.nil?
92
+ raise Error, response_query["error_description"] unless response_query["error"].nil?
93
+ response_query["code"]
94
94
  end
95
95
  end
96
96
 
@@ -105,8 +105,8 @@ module ShopifyCli
105
105
  }.merge(confirmation_param)
106
106
  )
107
107
  store.set(
108
- "#{service}_access_token".to_sym => resp['access_token'],
109
- "#{service}_refresh_token".to_sym => resp['refresh_token'],
108
+ "#{service}_access_token".to_sym => resp["access_token"],
109
+ "#{service}_refresh_token".to_sym => resp["refresh_token"],
110
110
  )
111
111
  end
112
112
 
@@ -130,8 +130,8 @@ module ShopifyCli
130
130
  client_id: client_id,
131
131
  )
132
132
  store.set(
133
- "#{service}_access_token".to_sym => resp['access_token'],
134
- "#{service}_refresh_token".to_sym => resp['refresh_token'],
133
+ "#{service}_access_token".to_sym => resp["access_token"],
134
+ "#{service}_refresh_token".to_sym => resp["refresh_token"],
135
135
  )
136
136
  end
137
137
 
@@ -155,7 +155,7 @@ module ShopifyCli
155
155
  scope: scopes,
156
156
  subject_token: store.get("#{service}_access_token".to_sym),
157
157
  )
158
- store.set("#{service}_exchange_token".to_sym => resp['access_token'])
158
+ store.set("#{service}_exchange_token".to_sym => resp["access_token"])
159
159
  end
160
160
 
161
161
  def post_token_request(url, params)
@@ -163,17 +163,17 @@ module ShopifyCli
163
163
  https = Net::HTTP.new(uri.host, uri.port)
164
164
  https.use_ssl = true
165
165
  request = Net::HTTP::Post.new(uri.path)
166
- request['User-Agent'] = "Shopify App CLI #{::ShopifyCli::VERSION}"
166
+ request["User-Agent"] = "Shopify App CLI #{::ShopifyCli::VERSION}"
167
167
  request.body = URI.encode_www_form(params)
168
168
  res = https.request(request)
169
- raise Error, JSON.parse(res.body)['error_description'] unless res.is_a?(Net::HTTPSuccess)
169
+ raise Error, JSON.parse(res.body)["error_description"] unless res.is_a?(Net::HTTPSuccess)
170
170
  JSON.parse(res.body)
171
171
  end
172
172
 
173
173
  def challange_params
174
174
  {
175
175
  code_challenge: code_challenge,
176
- code_challenge_method: 'S256',
176
+ code_challenge_method: "S256",
177
177
  }
178
178
  end
179
179
 
@@ -26,18 +26,18 @@ module ShopifyCli
26
26
  end
27
27
 
28
28
  def do_GET(req, res) # rubocop:disable Naming/MethodName
29
- if !req.query['error'].nil?
29
+ if !req.query["error"].nil?
30
30
  respond_with(
31
31
  res,
32
32
  400,
33
- Context.message('core.oauth.servlet.invalid_request_response', req.query['error_description'])
33
+ Context.message("core.oauth.servlet.invalid_request_response", req.query["error_description"])
34
34
  )
35
- elsif req.query['state'] != @state_token
36
- response_message = Context.message('core.oauth.servlet.invalid_state_response')
37
- req.query.merge!('error' => 'invalid_state', 'error_description' => response_message)
35
+ elsif req.query["state"] != @state_token
36
+ response_message = Context.message("core.oauth.servlet.invalid_state_response")
37
+ req.query.merge!("error" => "invalid_state", "error_description" => response_message)
38
38
  respond_with(res, 403, response_message)
39
39
  else
40
- respond_with(res, 200, Context.message('core.oauth.servlet.success_response'))
40
+ respond_with(res, 200, Context.message("core.oauth.servlet.success_response"))
41
41
  end
42
42
  @oauth.response_query = req.query
43
43
  @server.shutdown
@@ -48,10 +48,10 @@ module ShopifyCli
48
48
  locals = {
49
49
  status: status,
50
50
  message: message,
51
- color: successful ? 'black' : 'red',
51
+ color: successful ? "black" : "red",
52
52
  title:
53
- Context.message(successful ? 'core.oauth.servlet.authenticated' : 'core.oauth.servlet.not_authenticated'),
54
- autoclose: successful ? AUTOCLOSE_TEMPLATE : '',
53
+ Context.message(successful ? "core.oauth.servlet.authenticated" : "core.oauth.servlet.not_authenticated"),
54
+ autoclose: successful ? AUTOCLOSE_TEMPLATE : "",
55
55
  }
56
56
  response.status = status
57
57
  response.body = format(TEMPLATE, locals)
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
3
- require 'optparse'
2
+ require "shopify_cli"
3
+ require "optparse"
4
4
 
5
5
  module ShopifyCli
6
6
  class Options
@@ -31,7 +31,7 @@ module ShopifyCli
31
31
  def parser
32
32
  @parser ||= begin
33
33
  opt = OptionParser.new
34
- opt.on('--help', '-h', Context.message('core.options.help_text')) do |v|
34
+ opt.on("--help", "-h", Context.message("core.options.help_text")) do |v|
35
35
  @help = v
36
36
  end
37
37
  end
@@ -1,17 +1,17 @@
1
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)
8
8
  end
9
9
 
10
10
  def build_debian
11
- ensure_program_installed('dpkg-deb', 'brew install dpkg')
11
+ ensure_program_installed("dpkg-deb", "brew install dpkg")
12
12
 
13
- root_dir = File.join(PACKAGING_DIR, 'debian')
14
- debian_dir = File.join(root_dir, 'shopify-cli', 'DEBIAN')
13
+ root_dir = File.join(PACKAGING_DIR, "debian")
14
+ debian_dir = File.join(root_dir, "shopify-cli", "DEBIAN")
15
15
  FileUtils.mkdir_p(debian_dir)
16
16
 
17
17
  puts "\nBuilding Debian package"
@@ -24,15 +24,15 @@ 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)
28
- File.open(file_path, 'w', 0775) { |f| f.write(file_contents) }
27
+ file_contents = file_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION)
28
+ File.open(file_path, "w", 0775) { |f| f.write(file_contents) }
29
29
  end
30
30
 
31
31
  puts "Building package..."
32
32
  Dir.chdir(root_dir)
33
- raise "Failed to build package" unless system('dpkg-deb', '-b', 'shopify-cli')
33
+ raise "Failed to build package" unless system("dpkg-deb", "-b", "shopify-cli")
34
34
 
35
- output_path = File.join(root_dir, 'shopify-cli.deb')
35
+ output_path = File.join(root_dir, "shopify-cli.deb")
36
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"
@@ -40,34 +40,34 @@ module ShopifyCli
40
40
  end
41
41
 
42
42
  def build_rpm
43
- ensure_program_installed('rpmbuild', 'brew install rpm')
43
+ ensure_program_installed("rpmbuild", "brew install rpm")
44
44
 
45
- root_dir = File.join(PACKAGING_DIR, 'rpm')
46
- rpm_build_dir = File.join(root_dir, 'build')
45
+ root_dir = File.join(PACKAGING_DIR, "rpm")
46
+ rpm_build_dir = File.join(root_dir, "build")
47
47
  FileUtils.mkdir_p(rpm_build_dir)
48
48
 
49
- spec_path = File.join(root_dir, 'shopify-cli.spec')
49
+ spec_path = File.join(root_dir, "shopify-cli.spec")
50
50
  puts "\nBuilding RPM package"
51
51
 
52
52
  puts "Generating spec file..."
53
53
  File.delete(spec_path) if File.exist?(spec_path)
54
54
 
55
- spec_contents = File.read(File.join(root_dir, 'shopify-cli.spec.base'))
56
- spec_contents = spec_contents.gsub('SHOPIFY_CLI_VERSION', ShopifyCli::VERSION)
55
+ spec_contents = File.read(File.join(root_dir, "shopify-cli.spec.base"))
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..."
60
60
  Dir.chdir(root_dir)
61
- system('rpmbuild', '-bb', File.basename(spec_path))
61
+ system("rpmbuild", "-bb", File.basename(spec_path))
62
62
 
63
- output_dir = File.join(root_dir, 'build', 'noarch')
63
+ output_dir = File.join(root_dir, "build", "noarch")
64
64
 
65
65
  puts "Moving generated packages: \n From: #{output_dir}\n To: #{BUILDS_DIR}\n\n"
66
66
  FileUtils.mv(Dir.glob("#{output_dir}/*.rpm"), BUILDS_DIR)
67
67
  end
68
68
 
69
69
  def build_homebrew
70
- root_dir = File.join(PACKAGING_DIR, 'homebrew')
70
+ root_dir = File.join(PACKAGING_DIR, "homebrew")
71
71
 
72
72
  build_path = File.join(BUILDS_DIR, "shopify-cli.rb")
73
73
  puts "\nBuilding Homebrew package"
@@ -75,18 +75,18 @@ module ShopifyCli
75
75
  puts "Generating formula..."
76
76
  File.delete(build_path) if File.exist?(build_path)
77
77
 
78
- spec_contents = File.read(File.join(root_dir, 'shopify-cli.base.rb'))
79
- spec_contents = spec_contents.gsub('SHOPIFY_CLI_VERSION', ShopifyCli::VERSION)
78
+ spec_contents = File.read(File.join(root_dir, "shopify-cli.base.rb"))
79
+ spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION)
80
80
 
81
81
  puts "Grabbing sha256 checksum from Rubygems.org"
82
- require 'digest/sha2'
83
- require 'open-uri'
82
+ require "digest/sha2"
83
+ require "open-uri"
84
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
 
88
88
  puts "Got sha256 checksum for gem: #{gem_checksum}"
89
- spec_contents = spec_contents.gsub('SHOPIFY_CLI_GEM_CHECKSUM', gem_checksum)
89
+ spec_contents = spec_contents.gsub("SHOPIFY_CLI_GEM_CHECKSUM", gem_checksum)
90
90
 
91
91
  puts "Writing generated formula\n To: #{build_path}\n\n"
92
92
  File.write(build_path, spec_contents)
@@ -95,7 +95,7 @@ module ShopifyCli
95
95
  private
96
96
 
97
97
  def ensure_program_installed(program, installation_cmd)
98
- unless system(program, '--version', out: File::NULL, err: File::NULL)
98
+ unless system(program, "--version", out: File::NULL, err: File::NULL)
99
99
  raise <<~MESSAGE
100
100
 
101
101
  Could not find program #{program} which is required to build the package.
@@ -1,4 +1,4 @@
1
- require 'shopify_cli'
1
+ require "shopify_cli"
2
2
 
3
3
  module ShopifyCli
4
4
  ##
@@ -6,17 +6,17 @@ module ShopifyCli
6
6
  # schema.
7
7
  #
8
8
  class PartnersAPI < API
9
- autoload :Organizations, 'shopify-cli/partners_api/organizations'
9
+ autoload :Organizations, "shopify-cli/partners_api/organizations"
10
10
 
11
11
  # Defines the environment variable that this API looks for to operate on local
12
12
  # services. If you set this environment variable in your shell then the partners
13
- # api will operation on your local instance
13
+ # API will operate on your local instance
14
14
  #
15
15
  # #### Example
16
16
  #
17
17
  # SHOPIFY_APP_CLI_LOCAL_PARTNERS=1 shopify create
18
18
  #
19
- LOCAL_DEBUG = 'SHOPIFY_APP_CLI_LOCAL_PARTNERS'
19
+ LOCAL_DEBUG = "SHOPIFY_APP_CLI_LOCAL_PARTNERS"
20
20
 
21
21
  class << self
22
22
  ##
@@ -27,7 +27,7 @@ module ShopifyCli
27
27
  # #### Parameters
28
28
  # - `ctx`: running context from your command
29
29
  # - `query_name`: name of the query you want to use, loaded from the `lib/graphql` directory.
30
- # - `**variable`: a hash of variables to be supplied to the query ro mutation
30
+ # - `**variables`: a hash of variables to be supplied to the query or mutation
31
31
  #
32
32
  # #### Raises
33
33
  #
@@ -50,6 +50,13 @@ module ShopifyCli
50
50
  end
51
51
  end
52
52
 
53
+ def partners_url_for(organization_id, api_client_id, local_debug)
54
+ if ShopifyCli::Shopifolk.acting_as_shopify_organization?
55
+ organization_id = "internal"
56
+ end
57
+ "#{partners_endpoint(local_debug)}/#{organization_id}/apps/#{api_client_id}"
58
+ end
59
+
53
60
  private
54
61
 
55
62
  def authenticated_req(ctx)
@@ -58,7 +65,7 @@ module ShopifyCli
58
65
  authenticate(ctx)
59
66
  retry
60
67
  rescue API::APIRequestNotFoundError
61
- ctx.puts(ctx.message('core.partners_api.error.account_not_found', ShopifyCli::TOOL_NAME))
68
+ ctx.puts(ctx.message("core.partners_api.error.account_not_found", ShopifyCli::TOOL_NAME))
62
69
  end
63
70
 
64
71
  def api_client(ctx)
@@ -79,31 +86,46 @@ module ShopifyCli
79
86
  def authenticate(ctx)
80
87
  OAuth.new(
81
88
  ctx: ctx,
82
- service: 'identity',
89
+ service: "identity",
83
90
  client_id: cli_id,
84
- scopes: 'openid https://api.shopify.com/auth/partners.app.cli.access',
91
+ scopes: scopes.join(" "),
85
92
  request_exchange: partners_id,
86
93
  ).authenticate("#{auth_endpoint}/oauth")
87
94
  end
88
95
 
89
96
  def partners_id
90
- return '271e16d403dfa18082ffb3d197bd2b5f4479c3fc32736d69296829cbb28d41a6' if ENV[LOCAL_DEBUG].nil?
91
- 'df89d73339ac3c6c5f0a98d9ca93260763e384d51d6038da129889c308973978'
97
+ return "271e16d403dfa18082ffb3d197bd2b5f4479c3fc32736d69296829cbb28d41a6" if ENV[LOCAL_DEBUG].nil?
98
+ "df89d73339ac3c6c5f0a98d9ca93260763e384d51d6038da129889c308973978"
92
99
  end
93
100
 
94
101
  def cli_id
95
- return 'fbdb2649-e327-4907-8f67-908d24cfd7e3' if ENV[LOCAL_DEBUG].nil?
96
- 'e5380e02-312a-7408-5718-e07017e9cf52'
102
+ return "fbdb2649-e327-4907-8f67-908d24cfd7e3" if ENV[LOCAL_DEBUG].nil?
103
+ "e5380e02-312a-7408-5718-e07017e9cf52"
97
104
  end
98
105
 
99
106
  def auth_endpoint
100
- return 'https://accounts.shopify.com' if ENV[LOCAL_DEBUG].nil?
101
- 'https://identity.myshopify.io'
107
+ return "https://accounts.shopify.com" if ENV[LOCAL_DEBUG].nil?
108
+ "https://identity.myshopify.io"
102
109
  end
103
110
 
104
111
  def endpoint
105
- return 'https://partners.shopify.com' if ENV[LOCAL_DEBUG].nil?
106
- 'https://partners.myshopify.io/'
112
+ return "https://partners.shopify.com" if ENV[LOCAL_DEBUG].nil?
113
+ "https://partners.myshopify.io/"
114
+ end
115
+
116
+ def partners_endpoint(local_debug)
117
+ domain = if local_debug
118
+ "partners.myshopify.io"
119
+ else
120
+ "partners.shopify.com"
121
+ end
122
+ "https://#{domain}"
123
+ end
124
+
125
+ def scopes
126
+ %w[openid https://api.shopify.com/auth/partners.app.cli.access].tap do |result|
127
+ result << "employee" if ShopifyCli::Shopifolk.acting_as_shopify_organization?
128
+ end
107
129
  end
108
130
  end
109
131
 
@@ -3,26 +3,26 @@ module ShopifyCli
3
3
  class Organizations
4
4
  class << self
5
5
  def fetch_all(ctx)
6
- resp = PartnersAPI.query(ctx, 'all_organizations')
7
- (resp.dig('data', 'organizations', 'nodes') || []).map do |org|
8
- org['stores'] = (org.dig('stores', 'nodes') || [])
6
+ resp = PartnersAPI.query(ctx, "all_organizations")
7
+ (resp.dig("data", "organizations", "nodes") || []).map do |org|
8
+ org["stores"] = (org.dig("stores", "nodes") || [])
9
9
  org
10
10
  end
11
11
  end
12
12
 
13
13
  def fetch(ctx, id:)
14
- resp = PartnersAPI.query(ctx, 'find_organization', id: id)
15
- org = resp.dig('data', 'organizations', 'nodes').first
14
+ resp = PartnersAPI.query(ctx, "find_organization", id: id)
15
+ org = resp.dig("data", "organizations", "nodes").first
16
16
  return nil if org.nil?
17
- org['stores'] = (org.dig('stores', 'nodes') || [])
17
+ org["stores"] = (org.dig("stores", "nodes") || [])
18
18
  org
19
19
  end
20
20
 
21
21
  def fetch_with_app(ctx)
22
- resp = PartnersAPI.query(ctx, 'all_orgs_with_apps')
23
- (resp.dig('data', 'organizations', 'nodes') || []).map do |org|
24
- org['stores'] = (org.dig('stores', 'nodes') || [])
25
- org['apps'] = (org.dig('apps', 'nodes') || [])
22
+ resp = PartnersAPI.query(ctx, "all_orgs_with_apps")
23
+ (resp.dig("data", "organizations", "nodes") || []).map do |org|
24
+ org["stores"] = (org.dig("stores", "nodes") || [])
25
+ org["apps"] = (org.dig("apps", "nodes") || [])
26
26
  org
27
27
  end
28
28
  end
@@ -1,4 +1,4 @@
1
- require 'fileutils'
1
+ require "fileutils"
2
2
 
3
3
  module ShopifyCli
4
4
  ##
@@ -19,7 +19,7 @@ module ShopifyCli
19
19
  class << self
20
20
  def run_dir
21
21
  # is the directory where the pid and logfile are kept
22
- File.join(ShopifyCli.cache_dir, 'sv')
22
+ File.join(ShopifyCli.cache_dir, "sv")
23
23
  end
24
24
 
25
25
  ##
@@ -36,7 +36,7 @@ module ShopifyCli
36
36
  # will be nil if the process is not running.
37
37
  #
38
38
  def for_ident(identifier)
39
- pid, time = File.read(File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.pid")).split(':')
39
+ pid, time = File.read(File.join(ShopifyCli::ProcessSupervision.run_dir, "#{identifier}.pid")).split(":")
40
40
  new(identifier, pid: Integer(pid), time: time)
41
41
  rescue Errno::ENOENT
42
42
  nil
@@ -66,7 +66,7 @@ module ShopifyCli
66
66
  pid_file = new(identifier)
67
67
 
68
68
  # Make sure the file exists and is empty, otherwise Windows fails
69
- File.open(pid_file.log_path, 'w') {}
69
+ File.open(pid_file.log_path, "w") {}
70
70
  pid = Process.spawn(
71
71
  *args,
72
72
  out: pid_file.log_path,
@@ -128,7 +128,7 @@ module ShopifyCli
128
128
  end
129
129
  end
130
130
 
131
- def initialize(identifier, pid: nil, time: Time.now.strftime('%s')) # :nodoc:
131
+ def initialize(identifier, pid: nil, time: Time.now.strftime("%s")) # :nodoc:
132
132
  @identifier = identifier
133
133
  @pid = pid
134
134
  @time = time
@@ -204,13 +204,13 @@ module ShopifyCli
204
204
 
205
205
  # Windows does not handle SIGTERM, go straight to SIGKILL
206
206
  unless ctx.windows?
207
- Process.kill('TERM', id)
207
+ Process.kill("TERM", id)
208
208
  50.times do
209
- sleep 0.1
209
+ sleep(0.1)
210
210
  break unless stat(id)
211
211
  end
212
212
  end
213
- Process.kill('KILL', id) if stat(id)
213
+ Process.kill("KILL", id) if stat(id)
214
214
  sleep(0.1) if ctx.windows? # Give Windows a second to actually close the process
215
215
  end
216
216