shopify-cli 1.4.0 → 1.7.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (302) 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/.rubocop.yml +56 -7
  8. data/.rubocop_todo.yml +4 -13
  9. data/.travis.yml +1 -0
  10. data/CHANGELOG.md +27 -1
  11. data/Gemfile +12 -10
  12. data/Gemfile.lock +33 -31
  13. data/README.md +39 -7
  14. data/RELEASING.md +5 -27
  15. data/Rakefile +32 -28
  16. data/bin/load_shopify.rb +6 -6
  17. data/bin/shopify +2 -2
  18. data/dev.yml +2 -2
  19. data/docs/_config.yml +1 -18
  20. data/docs/app/node/commands/index.md +2 -80
  21. data/docs/app/node/index.md +2 -33
  22. data/docs/app/rails/commands/index.md +2 -78
  23. data/docs/app/rails/index.md +2 -34
  24. data/docs/core/index.md +2 -84
  25. data/docs/getting-started/index.md +2 -25
  26. data/docs/getting-started/install/index.md +1 -118
  27. data/docs/getting-started/migrate/index.md +2 -94
  28. data/docs/getting-started/uninstall/index.md +2 -35
  29. data/docs/getting-started/upgrade/index.md +2 -39
  30. data/docs/help/start-app/index.md +2 -4
  31. data/docs/index.md +2 -24
  32. data/ext/shopify-cli/extconf.rb +7 -7
  33. data/install.sh +1 -1
  34. data/lib/docgen/markdown.rb +11 -11
  35. data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
  36. data/lib/project_types/extension/cli.rb +64 -47
  37. data/lib/project_types/extension/commands/build.rb +3 -3
  38. data/lib/project_types/extension/commands/create.rb +16 -9
  39. data/lib/project_types/extension/commands/extension_command.rb +8 -5
  40. data/lib/project_types/extension/commands/push.rb +8 -8
  41. data/lib/project_types/extension/commands/register.rb +19 -30
  42. data/lib/project_types/extension/commands/serve.rb +23 -3
  43. data/lib/project_types/extension/commands/tunnel.rb +12 -12
  44. data/lib/project_types/extension/extension_project.rb +4 -4
  45. data/lib/project_types/extension/extension_project_keys.rb +4 -4
  46. data/lib/project_types/extension/features/argo.rb +117 -0
  47. data/lib/project_types/extension/features/argo_config.rb +5 -5
  48. data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
  49. data/lib/project_types/extension/features/argo_setup.rb +2 -2
  50. data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
  51. data/lib/project_types/extension/forms/create.rb +28 -34
  52. data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
  53. data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
  54. data/lib/project_types/extension/forms/questions/ask_type.rb +36 -0
  55. data/lib/project_types/extension/messages/messages.rb +53 -52
  56. data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
  57. data/lib/project_types/extension/models/specification.rb +35 -0
  58. data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +19 -0
  59. data/lib/project_types/extension/models/specification_handlers/default.rb +67 -0
  60. data/lib/project_types/extension/models/specifications.rb +77 -0
  61. data/lib/project_types/extension/tasks/configure_features.rb +52 -0
  62. data/lib/project_types/extension/tasks/converters/app_converter.rb +6 -6
  63. data/lib/project_types/extension/tasks/converters/registration_converter.rb +6 -6
  64. data/lib/project_types/extension/tasks/converters/validation_error_converter.rb +4 -4
  65. data/lib/project_types/extension/tasks/converters/version_converter.rb +7 -7
  66. data/lib/project_types/extension/tasks/create_extension.rb +4 -4
  67. data/lib/project_types/extension/tasks/fetch_specifications.rb +38 -0
  68. data/lib/project_types/extension/tasks/get_app.rb +4 -4
  69. data/lib/project_types/extension/tasks/get_apps.rb +3 -3
  70. data/lib/project_types/extension/tasks/update_draft.rb +4 -4
  71. data/lib/project_types/extension/tasks/user_errors.rb +4 -4
  72. data/lib/project_types/node/cli.rb +19 -16
  73. data/lib/project_types/node/commands/connect.rb +15 -0
  74. data/lib/project_types/node/commands/create.rb +44 -41
  75. data/lib/project_types/node/commands/deploy.rb +4 -4
  76. data/lib/project_types/node/commands/deploy/heroku.rb +24 -24
  77. data/lib/project_types/node/commands/generate.rb +9 -18
  78. data/lib/project_types/node/commands/open.rb +2 -2
  79. data/lib/project_types/node/commands/populate.rb +6 -6
  80. data/lib/project_types/node/commands/populate/customer.rb +5 -5
  81. data/lib/project_types/node/commands/populate/draft_order.rb +5 -5
  82. data/lib/project_types/node/commands/populate/product.rb +5 -5
  83. data/lib/project_types/node/commands/serve.rb +9 -9
  84. data/lib/project_types/node/commands/tunnel.rb +7 -7
  85. data/lib/project_types/node/forms/create.rb +7 -7
  86. data/lib/project_types/node/messages/messages.rb +19 -53
  87. data/lib/project_types/rails/cli.rb +21 -18
  88. data/lib/project_types/rails/commands/connect.rb +15 -0
  89. data/lib/project_types/rails/commands/create.rb +58 -57
  90. data/lib/project_types/rails/commands/deploy.rb +4 -4
  91. data/lib/project_types/rails/commands/deploy/heroku.rb +30 -30
  92. data/lib/project_types/rails/commands/generate.rb +7 -7
  93. data/lib/project_types/rails/commands/generate/webhook.rb +6 -6
  94. data/lib/project_types/rails/commands/open.rb +2 -2
  95. data/lib/project_types/rails/commands/populate.rb +6 -6
  96. data/lib/project_types/rails/commands/populate/customer.rb +5 -5
  97. data/lib/project_types/rails/commands/populate/draft_order.rb +5 -5
  98. data/lib/project_types/rails/commands/populate/product.rb +5 -5
  99. data/lib/project_types/rails/commands/serve.rb +11 -11
  100. data/lib/project_types/rails/commands/tunnel.rb +7 -7
  101. data/lib/project_types/rails/forms/create.rb +24 -24
  102. data/lib/project_types/rails/gem.rb +24 -24
  103. data/lib/project_types/rails/messages/messages.rb +12 -9
  104. data/lib/project_types/rails/ruby.rb +2 -2
  105. data/lib/project_types/script/cli.rb +44 -38
  106. data/lib/project_types/script/commands/create.rb +15 -10
  107. data/lib/project_types/script/commands/disable.rb +3 -3
  108. data/lib/project_types/script/commands/enable.rb +19 -9
  109. data/lib/project_types/script/commands/push.rb +10 -17
  110. data/lib/project_types/script/config/extension_points.yml +17 -12
  111. data/lib/project_types/script/errors.rb +22 -0
  112. data/lib/project_types/script/forms/create.rb +29 -5
  113. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +12 -1
  114. data/lib/project_types/script/layers/application/build_script.rb +19 -19
  115. data/lib/project_types/script/layers/application/create_script.rb +41 -12
  116. data/lib/project_types/script/layers/application/disable_script.rb +2 -2
  117. data/lib/project_types/script/layers/application/enable_script.rb +2 -2
  118. data/lib/project_types/script/layers/application/extension_points.rb +24 -0
  119. data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
  120. data/lib/project_types/script/layers/application/push_script.rb +15 -18
  121. data/lib/project_types/script/layers/domain/config_ui.rb +16 -0
  122. data/lib/project_types/script/layers/domain/errors.rb +23 -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 -55
  127. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +49 -18
  128. data/lib/project_types/script/layers/infrastructure/config_ui_repository.rb +46 -0
  129. data/lib/project_types/script/layers/infrastructure/errors.rb +37 -1
  130. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
  131. data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
  132. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +20 -13
  133. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
  134. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
  135. data/lib/project_types/script/layers/infrastructure/script_service.rb +39 -17
  136. data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
  137. data/lib/project_types/script/messages/messages.rb +79 -10
  138. data/lib/project_types/script/script_project.rb +26 -16
  139. data/lib/project_types/script/ui/error_handler.rb +141 -45
  140. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  141. data/lib/project_types/script/ui/strict_spinner.rb +1 -1
  142. data/lib/project_types/theme/cli.rb +40 -0
  143. data/lib/project_types/theme/commands/connect.rb +54 -0
  144. data/lib/project_types/theme/commands/create.rb +48 -0
  145. data/lib/project_types/theme/commands/deploy.rb +38 -0
  146. data/lib/project_types/theme/commands/generate.rb +20 -0
  147. data/lib/project_types/theme/commands/generate/env.rb +79 -0
  148. data/lib/project_types/theme/commands/push.rb +55 -0
  149. data/lib/project_types/theme/commands/serve.rb +31 -0
  150. data/lib/project_types/theme/forms/connect.rb +34 -0
  151. data/lib/project_types/theme/forms/create.rb +22 -0
  152. data/lib/project_types/theme/messages/messages.rb +147 -0
  153. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
  154. data/lib/project_types/theme/themekit.rb +113 -0
  155. data/lib/rubygems_plugin.rb +3 -3
  156. data/lib/shopify-cli/admin_api.rb +52 -12
  157. data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
  158. data/lib/shopify-cli/admin_api/schema.rb +3 -3
  159. data/lib/shopify-cli/api.rb +36 -31
  160. data/lib/shopify-cli/command.rb +1 -1
  161. data/lib/shopify-cli/commands.rb +9 -9
  162. data/lib/shopify-cli/commands/config.rb +28 -28
  163. data/lib/shopify-cli/commands/connect.rb +35 -18
  164. data/lib/shopify-cli/commands/create.rb +5 -5
  165. data/lib/shopify-cli/commands/help.rb +6 -6
  166. data/lib/shopify-cli/commands/logout.rb +3 -3
  167. data/lib/shopify-cli/commands/system.rb +33 -33
  168. data/lib/shopify-cli/commands/version.rb +2 -2
  169. data/lib/shopify-cli/context.rb +43 -22
  170. data/lib/shopify-cli/core.rb +4 -4
  171. data/lib/shopify-cli/core/entry_point.rb +5 -5
  172. data/lib/shopify-cli/core/executor.rb +1 -1
  173. data/lib/shopify-cli/core/help_resolver.rb +2 -2
  174. data/lib/shopify-cli/core/monorail.rb +21 -19
  175. data/lib/shopify-cli/db.rb +2 -2
  176. data/lib/shopify-cli/feature.rb +1 -3
  177. data/lib/shopify-cli/form.rb +1 -1
  178. data/lib/shopify-cli/git.rb +17 -17
  179. data/lib/shopify-cli/helpers.rb +1 -1
  180. data/lib/shopify-cli/helpers/haikunator.rb +1 -1
  181. data/lib/shopify-cli/heroku.rb +28 -28
  182. data/lib/shopify-cli/http_request.rb +21 -9
  183. data/lib/shopify-cli/js_deps.rb +13 -13
  184. data/lib/shopify-cli/js_system.rb +5 -5
  185. data/lib/shopify-cli/lazy_delegator.rb +55 -0
  186. data/lib/shopify-cli/messages/messages.rb +21 -10
  187. data/lib/shopify-cli/method_object.rb +104 -0
  188. data/lib/shopify-cli/oauth.rb +25 -25
  189. data/lib/shopify-cli/oauth/servlet.rb +9 -9
  190. data/lib/shopify-cli/options.rb +3 -3
  191. data/lib/shopify-cli/packager.rb +24 -24
  192. data/lib/shopify-cli/partners_api.rb +38 -16
  193. data/lib/shopify-cli/partners_api/organizations.rb +10 -10
  194. data/lib/shopify-cli/process_supervision.rb +8 -8
  195. data/lib/shopify-cli/project.rb +27 -23
  196. data/lib/shopify-cli/project_type.rb +21 -5
  197. data/lib/shopify-cli/resolve_constant.rb +25 -0
  198. data/lib/shopify-cli/resources.rb +1 -1
  199. data/lib/shopify-cli/resources/env_file.rb +9 -9
  200. data/lib/shopify-cli/result.rb +432 -0
  201. data/lib/shopify-cli/shopifolk.rb +35 -18
  202. data/lib/shopify-cli/sub_command.rb +1 -1
  203. data/lib/shopify-cli/task.rb +9 -1
  204. data/lib/shopify-cli/tasks.rb +7 -7
  205. data/lib/shopify-cli/tasks/create_api_client.rb +17 -6
  206. data/lib/shopify-cli/tasks/ensure_dev_store.rb +11 -11
  207. data/lib/shopify-cli/tasks/ensure_env.rb +18 -15
  208. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
  209. data/lib/shopify-cli/tasks/select_org_and_shop.rb +29 -24
  210. data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
  211. data/lib/shopify-cli/transform_data_structure.rb +86 -0
  212. data/lib/shopify-cli/tunnel.rb +36 -30
  213. data/lib/shopify-cli/version.rb +1 -1
  214. data/lib/shopify_cli.rb +57 -52
  215. data/shopify-cli.gemspec +6 -6
  216. data/shopify.fish +1 -1
  217. data/shopify.sh +1 -1
  218. data/vendor/deps/cli-kit/REVISION +1 -1
  219. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
  220. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
  221. data/vendor/deps/cli-ui/REVISION +1 -1
  222. data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
  223. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
  224. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
  225. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
  226. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
  227. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
  228. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
  229. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
  230. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
  231. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
  232. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
  233. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
  234. data/vendor/deps/webrick/.gitignore +9 -0
  235. data/vendor/deps/webrick/Gemfile +3 -0
  236. data/vendor/deps/webrick/LICENSE.txt +22 -0
  237. data/vendor/deps/webrick/README.md +61 -0
  238. data/vendor/deps/webrick/Rakefile +10 -0
  239. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  240. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  241. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  242. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  243. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  244. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  245. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  246. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  247. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  248. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  249. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  250. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  251. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  252. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  253. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  254. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  255. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  256. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  257. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  258. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  259. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  260. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  261. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  262. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  263. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  264. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  265. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  266. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  267. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  268. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  269. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  270. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  271. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  272. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  273. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  274. data/vendor/deps/webrick/webrick.gemspec +74 -0
  275. data/vendor/gen/template/bin/update-deps +9 -9
  276. metadata +83 -29
  277. data/docs/Gemfile +0 -5
  278. data/docs/Gemfile.lock +0 -258
  279. data/docs/_data/nav.yml +0 -35
  280. data/docs/_includes/footer.html +0 -15
  281. data/docs/_includes/head.html +0 -19
  282. data/docs/_includes/sidebar_nav.html +0 -22
  283. data/docs/_includes/toc.html +0 -112
  284. data/docs/_layouts/default.html +0 -79
  285. data/docs/css/docs.css +0 -157
  286. data/docs/images/header.png +0 -0
  287. data/docs/installing-ruby.md +0 -28
  288. data/lib/project_types/extension/features/argo/admin.rb +0 -20
  289. data/lib/project_types/extension/features/argo/base.rb +0 -129
  290. data/lib/project_types/extension/features/argo/checkout.rb +0 -20
  291. data/lib/project_types/extension/forms/register.rb +0 -47
  292. data/lib/project_types/extension/models/type.rb +0 -81
  293. data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
  294. data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
  295. data/lib/project_types/node/commands/generate/billing.rb +0 -39
  296. data/lib/project_types/node/commands/generate/page.rb +0 -59
  297. data/lib/project_types/node/commands/generate/webhook.rb +0 -37
  298. data/lib/project_types/script/layers/domain/script.rb +0 -18
  299. data/lib/project_types/script/layers/infrastructure/assemblyscript_tsconfig.rb +0 -38
  300. data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -59
  301. data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
  302. data/lib/project_types/script/templates/ts/as-pect.d.ts +0 -1
@@ -1,4 +1,4 @@
1
- require 'shopify_cli'
1
+ require "shopify_cli"
2
2
 
3
3
  module ShopifyCli
4
4
  ##
@@ -37,9 +37,9 @@ module ShopifyCli
37
37
  # ShopifyCli::JsDeps.new(context).install(true)
38
38
  #
39
39
  def install(verbose = false)
40
- title = ctx.message('core.js_deps.installing', @system.package_manager)
41
- success = ctx.message('core.js_deps.installed')
42
- failure = ctx.message('core.js_deps.error.install_error', @system.package_manager)
40
+ title = ctx.message("core.js_deps.installing", @system.package_manager)
41
+ success = ctx.message("core.js_deps.installed")
42
+ failure = ctx.message("core.js_deps.error.install_error", @system.package_manager)
43
43
 
44
44
  CLI::UI::Frame.open(title, success_text: success, failure_text: failure) do
45
45
  @system.call(
@@ -53,14 +53,14 @@ module ShopifyCli
53
53
 
54
54
  def yarn(verbose = false)
55
55
  cmd = %w(yarn install)
56
- cmd << '--silent' unless verbose
56
+ cmd << "--silent" unless verbose
57
57
 
58
58
  run_install_command(cmd)
59
59
  end
60
60
 
61
61
  def npm(verbose = false)
62
- cmd = %w(npm install --no-audit --no-optional)
63
- cmd << '--quiet' unless verbose
62
+ cmd = %w(npm install --no-audit)
63
+ cmd << "--quiet" unless verbose
64
64
 
65
65
  run_install_command(cmd)
66
66
  end
@@ -69,7 +69,7 @@ module ShopifyCli
69
69
  deps = parse_dependencies
70
70
  errors = nil
71
71
 
72
- spinner_title = ctx.message('core.js_deps.installing', @system.package_manager)
72
+ spinner_title = ctx.message("core.js_deps.installing", @system.package_manager)
73
73
  success = CLI::UI::Spinner.spin(spinner_title, auto_debrief: false) do |spinner|
74
74
  _, errors, status = CLI::Kit::System.capture3(*cmd, env: @ctx.env, chdir: ctx.root)
75
75
  update_spinner_title_and_status(spinner, status, deps)
@@ -81,19 +81,19 @@ module ShopifyCli
81
81
 
82
82
  def update_spinner_title_and_status(spinner, status, deps)
83
83
  if status.success?
84
- spinner.update_title(ctx.message('core.js_deps.installed', deps.size))
84
+ spinner.update_title(ctx.message("core.js_deps.installed", deps.size))
85
85
  else
86
- spinner.update_title(ctx.message('core.js_deps.error.install_spinner_error', deps.size))
86
+ spinner.update_title(ctx.message("core.js_deps.error.install_spinner_error", deps.size))
87
87
  CLI::UI::Spinner::TASK_FAILED
88
88
  end
89
89
  end
90
90
 
91
91
  def parse_dependencies
92
- package_json = File.join(ctx.root, 'package.json')
92
+ package_json = File.join(ctx.root, "package.json")
93
93
  pkg = begin
94
94
  JSON.parse(File.read(package_json))
95
95
  rescue Errno::ENOENT, Errno::ENOTDIR
96
- ctx.abort(ctx.message('core.js_deps.error.missing_package', package_json))
96
+ ctx.abort(ctx.message("core.js_deps.error.missing_package", package_json))
97
97
  end
98
98
 
99
99
  %w(dependencies devDependencies).map do |key|
@@ -101,7 +101,7 @@ module ShopifyCli
101
101
  end.flatten
102
102
  rescue JSON::ParserError
103
103
  ctx.puts(
104
- ctx.message('core.js_deps.error.invalid_package', File.read(File.join(path, 'package.json'))),
104
+ ctx.message("core.js_deps.error.invalid_package", File.read(File.join(path, "package.json"))),
105
105
  error: true
106
106
  )
107
107
  raise ShopifyCli::AbortSilent
@@ -1,4 +1,4 @@
1
- require 'shopify_cli'
1
+ require "shopify_cli"
2
2
 
3
3
  module ShopifyCli
4
4
  ##
@@ -7,8 +7,8 @@ module ShopifyCli
7
7
  class JsSystem
8
8
  include SmartProperties
9
9
 
10
- YARN_CORE_COMMAND = 'yarn'
11
- NPM_CORE_COMMAND = 'npm'
10
+ YARN_CORE_COMMAND = "yarn"
11
+ NPM_CORE_COMMAND = "npm"
12
12
 
13
13
  class << self
14
14
  ##
@@ -64,8 +64,8 @@ module ShopifyCli
64
64
  #
65
65
  def yarn?
66
66
  @has_yarn ||= begin
67
- cmd_path = @ctx.which('yarn')
68
- File.exist?(File.join(ctx.root, 'yarn.lock')) && !cmd_path.nil?
67
+ cmd_path = @ctx.which("yarn")
68
+ File.exist?(File.join(ctx.root, "yarn.lock")) && !cmd_path.nil?
69
69
  end
70
70
  end
71
71
 
@@ -0,0 +1,55 @@
1
+ require "delegate"
2
+
3
+ module ShopifyCli
4
+ ##
5
+ # `LazyDelegator` defers initialization of its underlying delegatee until the
6
+ # latter is accessed for the first time due to a method call that the
7
+ # delegator cannot handle itself:
8
+ #
9
+ # result = LazyDelegator.new do
10
+ # # carry out costly operation ...
11
+ # end
12
+ #
13
+ # result # referencing the object itself does not result in Proc evaluation
14
+ # result.to_h # however, calling a method on it will result in Proc evaluation
15
+ #
16
+ # LazyDelegator lends itself to being subclassed in scenarios where some
17
+ # facts are known and others are costly to compute:
18
+ #
19
+ # class LazySpecificationHandler < ShopifyCli::LazyDelegator
20
+ # attr_reader :identifier
21
+ #
22
+ # def initialize(identifier, &initializer)
23
+ # super(&initializer)
24
+ # @identifier = identifier
25
+ # end
26
+ # end
27
+ #
28
+ # handler = LazySpecificationHandler.new(:product_subscription) do
29
+ # # fetch specification from the Partners Dashboard API ...
30
+ # end
31
+ #
32
+ # # Accessing identifier will not result in Proc evaluation as it is
33
+ # # available as an attribute of the delegator itself
34
+ # handler.identifier # => :product_subscription
35
+ #
36
+ # # Accessing the specification will result in evaluation of the Proc
37
+ # # and in our example in a subsequent network call
38
+ # handler.specification # => <Extension::Models::Specifcation:...>
39
+ #
40
+ class LazyDelegator < SimpleDelegator
41
+ def initialize(&delegatee_initializer)
42
+ super([false, delegatee_initializer])
43
+ end
44
+
45
+ protected
46
+
47
+ def __getobj__(*)
48
+ initialized, value_or_initializer = super
49
+ return value_or_initializer if initialized
50
+ value_or_initializer.call.tap do |value|
51
+ __setobj__([true, value])
52
+ end
53
+ end
54
+ end
55
+ end
@@ -3,6 +3,16 @@
3
3
  module ShopifyCli
4
4
  module Messages
5
5
  MESSAGES = {
6
+ apps: {
7
+ create: {
8
+ info: {
9
+ created: "{{v}} {{green:%s}} was created in the organization's Partner Dashboard {{underline:%s}}",
10
+ serve: "{{*}} Change directories to your new project folder {{green:%s}} and run {{command:%s serve}} " \
11
+ "to start a local server",
12
+ install: "{{*}} Then, visit {{underline:%s/test}} to install {{green:%s}} on your Dev Store",
13
+ },
14
+ },
15
+ },
6
16
  core: {
7
17
  connect: {
8
18
  help: <<~HELP,
@@ -10,11 +20,7 @@ module ShopifyCli
10
20
  Usage: {{command:%s connect}}
11
21
  HELP
12
22
 
13
- production_warning: <<~MESSAGE,
14
- {{yellow:! Warning: if you have connected to an {{bold:app in production}}, running {{command:serve}} may update the app URL and cause an outage.
15
- MESSAGE
16
23
  already_connected_warning: "{{yellow:! This app appears to be already connected}}",
17
- connected: "{{v}} Project now connected to {{green:%s}}",
18
24
  project_type_select: "What type of project would you like to connect?",
19
25
  cli_yml_saved: ".shopify-cli.yml saved to project root",
20
26
  },
@@ -113,7 +119,7 @@ module ShopifyCli
113
119
  missing_package: "expected to have a file at: %s",
114
120
  invalid_package: "{{info:%s}} was not valid JSON. Fix this then try again",
115
121
  install_spinner_error: "Unable to install all %d dependencies",
116
- install_error: 'An error occurred while installing dependencies',
122
+ install_error: "An error occurred while installing dependencies",
117
123
  },
118
124
 
119
125
  installing: "Installing dependencies with %s...",
@@ -176,8 +182,9 @@ module ShopifyCli
176
182
 
177
183
  api: {
178
184
  error: {
179
- internal_server_error: '{{red:{{x}} An unexpected error occurred on Shopify.}}',
185
+ internal_server_error: "{{red:{{x}} An unexpected error occurred on Shopify.}}",
180
186
  internal_server_error_debug: "\n{{red:Response details:}}\n%s\n\n",
187
+ invalid_url: "Invalid URL: %s",
181
188
  },
182
189
  },
183
190
 
@@ -265,7 +272,7 @@ module ShopifyCli
265
272
  MESSAGE
266
273
  development_store_select: "Which development store would you like to use?",
267
274
  app_select: "To which app does this project belong?",
268
- no_apps: 'You have no apps to connect to, creating a new app.',
275
+ no_apps: "You have no apps to connect to, creating a new app.",
269
276
  app_name: "App name",
270
277
  app_type: {
271
278
  select: "What type of app are you building?",
@@ -300,6 +307,8 @@ module ShopifyCli
300
307
  organization_not_found: "Cannot find a partner organization with that ID",
301
308
  partners_notice: "Please visit https://partners.shopify.com/ to create a partners account",
302
309
  },
310
+ first_party: "Are you working on a 1P (1st Party) app?",
311
+ identified_as_shopify: "We've identified you as a {{green:Shopify}} employee.",
303
312
  organization: "Partner organization {{green:%s (%s)}}",
304
313
  organization_select: "Select partner organization",
305
314
  },
@@ -311,6 +320,8 @@ module ShopifyCli
311
320
  url_fetch_failure: "Unable to fetch external url",
312
321
  prereq_command_required: "%1$s is required for installing ngrok. Please install %1$s using the appropriate"\
313
322
  " package manager for your system.",
323
+ ngrok: "Something went wrong with ngrok installation,"\
324
+ "please make sure %s exists within %s before trying again",
314
325
  },
315
326
 
316
327
  not_running: "{{green:x}} ngrok tunnel not running",
@@ -345,15 +356,15 @@ module ShopifyCli
345
356
  {{x}} This version of Shopify App CLI is no longer supported. You’ll need to migrate to the new CLI version to continue.
346
357
 
347
358
  Please visit this page for complete instructions:
348
- {{underline:https://shopify.github.io/shopify-app-cli/migrate/}}
359
+ {{underline:https://shopify.dev/tools/cli/troubleshooting#migrate-from-a-legacy-version}}
349
360
 
350
361
  MESSAGE
351
362
 
352
363
  new_version: <<~MESSAGE,
353
- {{*}} {{yellow:A new version of the Shopify App CLI is available! You have version %s and the latest version is %s.
364
+ {{*}} {{yellow:A new version of Shopify App CLI is available! You have version %s and the latest version is %s.
354
365
 
355
366
  To upgrade, follow the instructions for the package manager you’re using:
356
- {{underline:https://shopify.github.io/shopify-app-cli/getting-started/upgrade/}}}}
367
+ {{underline:https://shopify.dev/tools/cli/troubleshooting#upgrade-shopify-app-cli}}}}
357
368
 
358
369
  MESSAGE
359
370
  },
@@ -0,0 +1,104 @@
1
+ module ShopifyCli
2
+ ##
3
+ # The `MethodObject` mixin can be included in any class that implements `call`
4
+ # to ensure that
5
+ #
6
+ # * `call` will always return a `ShopifyCli::Result` by prepending a module
7
+ # that takes care of the result wrapping and
8
+ # * a `to_proc` method that allows instances of this class to be passed as a
9
+ # block.
10
+ #
11
+ # For convenience, this mixin also adds the corresponding class methods:
12
+ # `call` and `to_proc`. Method and result objects pair nicely as they greatly
13
+ # simplify the creation of complex processing chains:
14
+ #
15
+ # class Serialize
16
+ # include MethodObject
17
+ #
18
+ # def call(attrs)
19
+ # attrs.to_json
20
+ # end
21
+ # end
22
+ #
23
+ # class Deserialize
24
+ # include MethodObject
25
+ #
26
+ # def call(json)
27
+ # JSON.parse(json)
28
+ # end
29
+ # end
30
+ #
31
+ # Serialize
32
+ # .call(firstname: "John", lastname: "Doe")
33
+ # .then(&Deserialize)
34
+ # .map { |attrs| OpenStruct.new(attrs) }
35
+ # .unwrap(nil)
36
+ #
37
+ # While this example is contrived, it still illustrates some key advantages of
38
+ # this programming paradigm:
39
+ #
40
+ # * chaining operations is as simple as repeatedly calling `then` or `map`,
41
+ # * method objects don't have to be manually instantiated but can be
42
+ # constructed using the `&` operator,
43
+ # * error handling is deferred until the result is unwrapped.
44
+ #
45
+ # Please see the section for `ShopifyCli::Result`,
46
+ # `ShopifyCli::Result::Success`, and `ShopifyCli::Result::Failure` for more
47
+ # information on the API of result objects.
48
+ #
49
+ module MethodObject
50
+ module AutoCreateResultObject
51
+ ##
52
+ # invokes the original `call` implementation and wraps its return value
53
+ # into a result object.
54
+ #
55
+ def call(*args, **kwargs)
56
+ Result.wrap { super(*args, **kwargs) }.call
57
+ end
58
+ end
59
+
60
+ module ClassMethods
61
+ ##
62
+ # creates a new instance and invokes `call`. Any positional argument
63
+ # is forward to `call`. Keyword arguments are either forwarded to the
64
+ # initializer or to `call`. If the keyword argument matches the name of
65
+ # property, it is forwarded to the initializer, otherwise to call.
66
+ #
67
+ def call(*args, **kwargs)
68
+ properties.keys.yield_self do |properties|
69
+ new(**kwargs.slice(*properties))
70
+ .call(*args, **kwargs.slice(*(kwargs.keys - properties)))
71
+ end
72
+ end
73
+
74
+ ##
75
+ # returns a proc that invokes `call` with all arguments it receives when
76
+ # called itself.
77
+ #
78
+ def to_proc
79
+ method(:call).to_proc
80
+ end
81
+ end
82
+
83
+ ##
84
+ # is invoked when this mixin is included into a class. This results in
85
+ #
86
+ # * including `SmartProperties`,
87
+ # * prepending the result wrapping mechanism, and
88
+ # * adding the class methods `.call` and `.to_proc`.
89
+ #
90
+ def self.included(method_object_implementation)
91
+ method_object_implementation.prepend(AutoCreateResultObject)
92
+ method_object_implementation.include(SmartProperties)
93
+ method_object_implementation.extend(ClassMethods)
94
+ end
95
+
96
+ ##
97
+ # returns a proc that invokes `call` with all arguments it receives when
98
+ # called itself.
99
+ #
100
+ def to_proc
101
+ method(:call).to_proc
102
+ end
103
+ end
104
+ end
@@ -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