shopify-cli 1.4.1 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (303) 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 +3 -2
  5. data/.github/workflows/release.yml +0 -1
  6. data/.github/workflows/triage.yml +22 -0
  7. data/.rubocop.yml +21 -7
  8. data/.rubocop_todo.yml +2 -15
  9. data/.travis.yml +1 -1
  10. data/CHANGELOG.md +28 -0
  11. data/Gemfile +12 -11
  12. data/Gemfile.lock +17 -14
  13. data/README.md +39 -7
  14. data/RELEASING.md +5 -13
  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 +12 -12
  35. data/lib/graphql/fetch_specifications.graphql +14 -0
  36. data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
  37. data/lib/project_types/extension/cli.rb +54 -47
  38. data/lib/project_types/extension/commands/build.rb +3 -3
  39. data/lib/project_types/extension/commands/create.rb +17 -10
  40. data/lib/project_types/extension/commands/extension_command.rb +12 -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 +31 -3
  44. data/lib/project_types/extension/commands/tunnel.rb +12 -12
  45. data/lib/project_types/extension/extension_project.rb +8 -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 +47 -0
  56. data/lib/project_types/extension/messages/messages.rb +55 -52
  57. data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
  58. data/lib/project_types/extension/models/specification.rb +37 -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 +88 -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 +18 -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 +44 -41
  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 +17 -8
  87. data/lib/project_types/node/messages/messages.rb +20 -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 +58 -57
  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 +35 -25
  103. data/lib/project_types/rails/gem.rb +24 -24
  104. data/lib/project_types/rails/messages/messages.rb +13 -9
  105. data/lib/project_types/rails/ruby.rb +2 -2
  106. data/lib/project_types/script/cli.rb +44 -38
  107. data/lib/project_types/script/commands/create.rb +15 -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 +30 -12
  112. data/lib/project_types/script/errors.rb +22 -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 +19 -19
  116. data/lib/project_types/script/layers/application/create_script.rb +45 -12
  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 +15 -18
  122. data/lib/project_types/script/layers/domain/config_ui.rb +16 -0
  123. data/lib/project_types/script/layers/domain/errors.rb +23 -0
  124. data/lib/project_types/script/layers/domain/extension_point.rb +67 -7
  125. data/lib/project_types/script/layers/domain/metadata.rb +55 -0
  126. data/lib/project_types/script/layers/domain/push_package.rb +29 -6
  127. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +45 -55
  128. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +41 -45
  129. data/lib/project_types/script/layers/infrastructure/config_ui_repository.rb +46 -0
  130. data/lib/project_types/script/layers/infrastructure/errors.rb +32 -5
  131. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
  132. data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
  133. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +20 -13
  134. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
  135. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
  136. data/lib/project_types/script/layers/infrastructure/script_service.rb +39 -17
  137. data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
  138. data/lib/project_types/script/messages/messages.rb +76 -10
  139. data/lib/project_types/script/script_project.rb +26 -16
  140. data/lib/project_types/script/ui/error_handler.rb +135 -50
  141. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  142. data/lib/project_types/script/ui/strict_spinner.rb +1 -1
  143. data/lib/project_types/theme/cli.rb +40 -0
  144. data/lib/project_types/theme/commands/connect.rb +54 -0
  145. data/lib/project_types/theme/commands/create.rb +48 -0
  146. data/lib/project_types/theme/commands/deploy.rb +38 -0
  147. data/lib/project_types/theme/commands/generate.rb +20 -0
  148. data/lib/project_types/theme/commands/generate/env.rb +79 -0
  149. data/lib/project_types/theme/commands/push.rb +55 -0
  150. data/lib/project_types/theme/commands/serve.rb +31 -0
  151. data/lib/project_types/theme/forms/connect.rb +34 -0
  152. data/lib/project_types/theme/forms/create.rb +22 -0
  153. data/lib/project_types/theme/messages/messages.rb +147 -0
  154. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
  155. data/lib/project_types/theme/themekit.rb +113 -0
  156. data/lib/rubygems_plugin.rb +3 -3
  157. data/lib/shopify-cli/admin_api.rb +52 -12
  158. data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
  159. data/lib/shopify-cli/admin_api/schema.rb +3 -3
  160. data/lib/shopify-cli/api.rb +36 -31
  161. data/lib/shopify-cli/command.rb +1 -1
  162. data/lib/shopify-cli/commands.rb +9 -9
  163. data/lib/shopify-cli/commands/config.rb +28 -28
  164. data/lib/shopify-cli/commands/connect.rb +35 -18
  165. data/lib/shopify-cli/commands/create.rb +5 -5
  166. data/lib/shopify-cli/commands/help.rb +6 -6
  167. data/lib/shopify-cli/commands/logout.rb +3 -3
  168. data/lib/shopify-cli/commands/system.rb +33 -33
  169. data/lib/shopify-cli/commands/version.rb +2 -2
  170. data/lib/shopify-cli/context.rb +43 -22
  171. data/lib/shopify-cli/core.rb +4 -4
  172. data/lib/shopify-cli/core/entry_point.rb +5 -5
  173. data/lib/shopify-cli/core/executor.rb +1 -1
  174. data/lib/shopify-cli/core/help_resolver.rb +2 -2
  175. data/lib/shopify-cli/core/monorail.rb +17 -16
  176. data/lib/shopify-cli/db.rb +2 -2
  177. data/lib/shopify-cli/feature.rb +1 -3
  178. data/lib/shopify-cli/form.rb +1 -1
  179. data/lib/shopify-cli/git.rb +17 -17
  180. data/lib/shopify-cli/helpers.rb +1 -1
  181. data/lib/shopify-cli/helpers/haikunator.rb +1 -1
  182. data/lib/shopify-cli/heroku.rb +28 -28
  183. data/lib/shopify-cli/http_request.rb +21 -9
  184. data/lib/shopify-cli/js_deps.rb +13 -13
  185. data/lib/shopify-cli/js_system.rb +5 -5
  186. data/lib/shopify-cli/lazy_delegator.rb +55 -0
  187. data/lib/shopify-cli/messages/messages.rb +21 -10
  188. data/lib/shopify-cli/method_object.rb +104 -0
  189. data/lib/shopify-cli/oauth.rb +25 -25
  190. data/lib/shopify-cli/oauth/servlet.rb +9 -9
  191. data/lib/shopify-cli/options.rb +3 -3
  192. data/lib/shopify-cli/packager.rb +24 -24
  193. data/lib/shopify-cli/partners_api.rb +38 -16
  194. data/lib/shopify-cli/partners_api/organizations.rb +10 -10
  195. data/lib/shopify-cli/process_supervision.rb +8 -8
  196. data/lib/shopify-cli/project.rb +27 -23
  197. data/lib/shopify-cli/project_type.rb +21 -5
  198. data/lib/shopify-cli/resolve_constant.rb +25 -0
  199. data/lib/shopify-cli/resources.rb +1 -1
  200. data/lib/shopify-cli/resources/env_file.rb +9 -9
  201. data/lib/shopify-cli/result.rb +432 -0
  202. data/lib/shopify-cli/shopifolk.rb +35 -18
  203. data/lib/shopify-cli/sub_command.rb +1 -1
  204. data/lib/shopify-cli/task.rb +9 -1
  205. data/lib/shopify-cli/tasks.rb +7 -7
  206. data/lib/shopify-cli/tasks/create_api_client.rb +13 -4
  207. data/lib/shopify-cli/tasks/ensure_dev_store.rb +12 -12
  208. data/lib/shopify-cli/tasks/ensure_env.rb +18 -15
  209. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
  210. data/lib/shopify-cli/tasks/select_org_and_shop.rb +28 -24
  211. data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
  212. data/lib/shopify-cli/transform_data_structure.rb +86 -0
  213. data/lib/shopify-cli/tunnel.rb +36 -30
  214. data/lib/shopify-cli/version.rb +1 -1
  215. data/lib/shopify_cli.rb +57 -52
  216. data/shopify-cli.gemspec +6 -6
  217. data/shopify.fish +1 -1
  218. data/shopify.sh +1 -1
  219. data/vendor/deps/cli-kit/REVISION +1 -1
  220. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
  221. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
  222. data/vendor/deps/cli-ui/REVISION +1 -1
  223. data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
  224. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
  225. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
  226. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
  227. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
  228. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
  229. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
  230. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
  231. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
  232. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
  233. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
  234. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
  235. data/vendor/deps/webrick/.gitignore +9 -0
  236. data/vendor/deps/webrick/Gemfile +3 -0
  237. data/vendor/deps/webrick/LICENSE.txt +22 -0
  238. data/vendor/deps/webrick/README.md +61 -0
  239. data/vendor/deps/webrick/Rakefile +10 -0
  240. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  241. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  242. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  243. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  244. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  245. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  246. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  247. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  248. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  249. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  250. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  251. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  252. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  253. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  254. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  255. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  256. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  257. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  258. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  259. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  260. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  261. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  262. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  263. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  264. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  265. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  266. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  267. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  268. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  269. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  270. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  271. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  272. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  273. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  274. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  275. data/vendor/deps/webrick/webrick.gemspec +74 -0
  276. data/vendor/gen/template/bin/update-deps +9 -9
  277. metadata +83 -29
  278. data/docs/Gemfile +0 -5
  279. data/docs/Gemfile.lock +0 -258
  280. data/docs/_data/nav.yml +0 -35
  281. data/docs/_includes/footer.html +0 -15
  282. data/docs/_includes/head.html +0 -19
  283. data/docs/_includes/sidebar_nav.html +0 -22
  284. data/docs/_includes/toc.html +0 -112
  285. data/docs/_layouts/default.html +0 -79
  286. data/docs/css/docs.css +0 -157
  287. data/docs/images/header.png +0 -0
  288. data/docs/installing-ruby.md +0 -28
  289. data/lib/project_types/extension/features/argo/admin.rb +0 -20
  290. data/lib/project_types/extension/features/argo/base.rb +0 -129
  291. data/lib/project_types/extension/features/argo/checkout.rb +0 -20
  292. data/lib/project_types/extension/forms/register.rb +0 -47
  293. data/lib/project_types/extension/models/type.rb +0 -81
  294. data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
  295. data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
  296. data/lib/project_types/node/commands/generate/billing.rb +0 -39
  297. data/lib/project_types/node/commands/generate/page.rb +0 -59
  298. data/lib/project_types/node/commands/generate/webhook.rb +0 -37
  299. data/lib/project_types/script/layers/domain/script.rb +0 -18
  300. data/lib/project_types/script/layers/infrastructure/assemblyscript_tsconfig.rb +0 -38
  301. data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -59
  302. data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
  303. data/lib/project_types/script/templates/ts/as-pect.d.ts +0 -1
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Commands
@@ -12,9 +12,9 @@ module Extension
12
12
  def call(_args, _command_name)
13
13
  system = ShopifyCli::JsSystem.new(ctx: @ctx)
14
14
 
15
- CLI::UI::Frame.open(@ctx.message('build.frame_title', system.package_manager)) do
15
+ CLI::UI::Frame.open(@ctx.message("build.frame_title", system.package_manager)) do
16
16
  success = system.call(yarn: YARN_BUILD_COMMAND, npm: NPM_BUILD_COMMAND)
17
- @ctx.abort(@ctx.message('build.build_failure_message')) unless success
17
+ @ctx.abort(@ctx.message("build.build_failure_message")) unless success
18
18
  end
19
19
  end
20
20
 
@@ -4,24 +4,30 @@ module Extension
4
4
  module Commands
5
5
  class Create < ShopifyCli::SubCommand
6
6
  options do |parser, flags|
7
- parser.on('--name=NAME') { |name| flags[:name] = name }
8
- parser.on('--type=TYPE') { |type| flags[:type] = type.upcase }
7
+ parser.on("--name=NAME") { |name| flags[:name] = name }
8
+ parser.on("--type=TYPE") { |type| flags[:type] = type.upcase }
9
+ parser.on("--api-key=KEY") { |key| flags[:api_key] = key.downcase }
9
10
  end
10
11
 
11
12
  def call(args, _)
12
13
  with_create_form(args) do |form|
13
14
  if Dir.exist?(form.directory_name)
14
- @ctx.abort(@ctx.message('create.errors.directory_exists', form.directory_name))
15
+ @ctx.abort(@ctx.message("create.errors.directory_exists", form.directory_name))
15
16
  end
16
17
 
17
18
  if form.type.create(form.directory_name, @ctx)
18
19
  ExtensionProject.write_cli_file(context: @ctx, type: form.type.identifier)
19
- ExtensionProject.write_env_file(context: @ctx, title: form.name)
20
-
21
- @ctx.puts(@ctx.message('create.ready_to_start', form.directory_name, form.name))
22
- @ctx.puts(@ctx.message('create.learn_more', form.type.name))
20
+ ExtensionProject.write_env_file(
21
+ context: @ctx,
22
+ title: form.name,
23
+ api_key: form.app.api_key,
24
+ api_secret: form.app.secret
25
+ )
26
+
27
+ @ctx.puts(@ctx.message("create.ready_to_start", form.directory_name, form.name))
28
+ @ctx.puts(@ctx.message("create.learn_more", form.type.name))
23
29
  else
24
- @ctx.puts(@ctx.message('create.try_again'))
30
+ @ctx.puts(@ctx.message("create.try_again"))
25
31
  end
26
32
  end
27
33
  end
@@ -29,10 +35,11 @@ module Extension
29
35
  def self.help
30
36
  <<~HELP
31
37
  Create a new app extension.
32
- Usage: {{command:#{ShopifyCli::TOOL_NAME} create extension <name>}}
38
+ Usage: {{command:#{ShopifyCli::TOOL_NAME} create extension}}
33
39
  Options:
34
40
  {{command:--type=TYPE}} The type of extension you would like to create.
35
- {{command:--name=NAME}} The name of your extension (50 characters).”
41
+ {{command:--name=NAME}} The name of your extension (50 characters).
42
+ {{command:--api-key=KEY}} The API key of your app.
36
43
  HELP
37
44
  end
38
45
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Commands
@@ -10,11 +10,18 @@ module Extension
10
10
 
11
11
  def extension_type
12
12
  @extension_type ||= begin
13
- unless Models::Type.valid?(project.extension_type_identifier)
14
- @ctx.abort(@ctx.message('errors.unknown_type', project.extension_type_identifier))
15
- end
13
+ identifier = project.extension_type_identifier
14
+ Models::LazySpecificationHandler.new(identifier) do
15
+ specifications = Models::Specifications.new(
16
+ fetch_specifications: Tasks::FetchSpecifications.new(api_key: project.app.api_key, context: @ctx)
17
+ )
18
+
19
+ unless specifications.valid?(identifier)
20
+ @ctx.abort(@ctx.message("errors.unknown_type", project.extension_type_identifier))
21
+ end
16
22
 
17
- Models::Type.load_type(project.extension_type_identifier)
23
+ specifications[identifier]
24
+ end
18
25
  end
19
26
  end
20
27
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Commands
@@ -10,7 +10,7 @@ module Extension
10
10
  Commands::Register.new(@ctx).call(args, name) unless project.registered?
11
11
  Commands::Build.new(@ctx).call(args, name)
12
12
 
13
- CLI::UI::Frame.open(@ctx.message('push.frame_title')) do
13
+ CLI::UI::Frame.open(@ctx.message("push.frame_title")) do
14
14
  updated_draft_version = update_draft
15
15
  show_message(updated_draft_version)
16
16
  end
@@ -30,18 +30,18 @@ module Extension
30
30
  end
31
31
 
32
32
  def output_success_messages(draft)
33
- @ctx.puts(@ctx.message('push.success_confirmation', project.title, format_time(draft.last_user_interaction_at)))
34
- @ctx.puts(@ctx.message('push.success_info', draft.location))
33
+ @ctx.puts(@ctx.message("push.success_confirmation", project.title, format_time(draft.last_user_interaction_at)))
34
+ @ctx.puts(@ctx.message("push.success_info", draft.location))
35
35
  end
36
36
 
37
37
  def output_validation_errors(draft)
38
- @ctx.puts(@ctx.message('push.pushed_with_errors', format_time(draft.last_user_interaction_at)))
38
+ @ctx.puts(@ctx.message("push.pushed_with_errors", format_time(draft.last_user_interaction_at)))
39
39
 
40
40
  draft.validation_errors.each do |error|
41
- @ctx.puts(format('{{x}} %s: %s', error.field.last, error.message))
41
+ @ctx.puts(format("{{x}} %s: %s", error.field.last, error.message))
42
42
  end
43
43
 
44
- @ctx.puts(@ctx.message('push.push_with_errors_info'))
44
+ @ctx.puts(@ctx.message("push.push_with_errors_info"))
45
45
  end
46
46
 
47
47
  def format_time(time)
@@ -49,7 +49,7 @@ module Extension
49
49
  end
50
50
 
51
51
  def with_waiting_text
52
- @ctx.puts(@ctx.message('push.waiting_text'))
52
+ @ctx.puts(@ctx.message("push.waiting_text"))
53
53
  yield
54
54
  end
55
55
 
@@ -3,23 +3,17 @@
3
3
  module Extension
4
4
  module Commands
5
5
  class Register < ExtensionCommand
6
- options do |parser, flags|
7
- parser.on('--api_key=KEY') { |key| flags[:api_key] = key.downcase }
8
- end
9
-
10
- def call(args, _command_name)
11
- CLI::UI::Frame.open(@ctx.message('register.frame_title')) do
12
- @ctx.abort(@ctx.message('register.already_registered')) if project.registered?
6
+ def call(_args, _command_name)
7
+ CLI::UI::Frame.open(@ctx.message("register.frame_title")) do
8
+ @ctx.abort(@ctx.message("register.already_registered")) if project.registered?
13
9
 
14
- with_register_form(args) do |form|
15
- should_continue = confirm_registration(form.app)
16
- registration = should_continue ? register_extension(form.app) : abort_not_registered
10
+ should_continue = confirm_registration
11
+ registration = should_continue ? register_extension : abort_not_registered
17
12
 
18
- update_project_files(form.app, registration)
13
+ update_project_files(registration)
19
14
 
20
- @ctx.puts(@ctx.message('register.success', project.title, form.app.title))
21
- @ctx.puts(@ctx.message('register.success_info'))
22
- end
15
+ @ctx.puts(@ctx.message("register.success", project.title))
16
+ @ctx.puts(@ctx.message("register.success_info"))
23
17
  end
24
18
  end
25
19
 
@@ -27,27 +21,18 @@ module Extension
27
21
  <<~HELP
28
22
  Register your local extension to a Shopify app
29
23
  Usage: {{command:#{ShopifyCli::TOOL_NAME} register}}
30
- Options:
31
- {{command:--api_key=API_KEY}} The API key used to register an app with the extension. This can be found on the app page on Partners Dashboard.
32
24
  HELP
33
25
  end
34
26
 
35
27
  private
36
28
 
37
- def with_register_form(args)
38
- form = Forms::Register.ask(@ctx, args, options.flags)
39
- return @ctx.puts(self.class.help) if form.nil?
40
-
41
- yield form
29
+ def confirm_registration
30
+ @ctx.puts(@ctx.message("register.confirm_info", extension_type.name))
31
+ CLI::UI::Prompt.confirm(@ctx.message("register.confirm_question"))
42
32
  end
43
33
 
44
- def confirm_registration(app)
45
- @ctx.puts(@ctx.message('register.confirm_info', extension_type.name))
46
- CLI::UI::Prompt.confirm(@ctx.message('register.confirm_question', app.title))
47
- end
48
-
49
- def register_extension(app)
50
- @ctx.puts(@ctx.message('register.waiting_text'))
34
+ def register_extension
35
+ @ctx.puts(@ctx.message("register.waiting_text"))
51
36
 
52
37
  Tasks::CreateExtension.call(
53
38
  context: @ctx,
@@ -59,7 +44,7 @@ module Extension
59
44
  )
60
45
  end
61
46
 
62
- def update_project_files(app, registration)
47
+ def update_project_files(registration)
63
48
  ExtensionProject.write_env_file(
64
49
  context: @ctx,
65
50
  api_key: app.api_key,
@@ -69,8 +54,12 @@ module Extension
69
54
  )
70
55
  end
71
56
 
57
+ def app
58
+ @app ||= project.app
59
+ end
60
+
72
61
  def abort_not_registered
73
- @ctx.puts(@ctx.message('register.confirm_abort'))
62
+ @ctx.puts(@ctx.message("register.confirm_abort"))
74
63
  raise ShopifyCli::AbortSilent
75
64
  end
76
65
  end
@@ -7,9 +7,22 @@ module Extension
7
7
  NPM_SERVE_COMMAND = %w(run-script server)
8
8
 
9
9
  def call(_args, _command_name)
10
- CLI::UI::Frame.open(@ctx.message('serve.frame_title')) do
11
- success = ShopifyCli::JsSystem.call(@ctx, yarn: YARN_SERVE_COMMAND, npm: NPM_SERVE_COMMAND)
12
- @ctx.abort(@ctx.message('serve.serve_failure_message')) unless success
10
+ if argo_admin?
11
+ ShopifyCli::Tasks::EnsureEnv.call(@ctx, required: [:api_key, :secret, :shop])
12
+ ShopifyCli::Tasks::EnsureDevStore.call(@ctx)
13
+ validate_env
14
+ end
15
+
16
+ CLI::UI::Frame.open(@ctx.message("serve.frame_title")) do
17
+ yarn_serve_command = YARN_SERVE_COMMAND
18
+ npm_serve_command = NPM_SERVE_COMMAND
19
+ if argo_admin?
20
+ serve_args = %W(--shop=#{project.env.shop} --apiKey=#{project.env.api_key})
21
+ yarn_serve_command += serve_args
22
+ npm_serve_command += %w(--) + serve_args
23
+ end
24
+ success = ShopifyCli::JsSystem.call(@ctx, yarn: yarn_serve_command, npm: npm_serve_command)
25
+ @ctx.abort(@ctx.message("serve.serve_failure_message")) unless success
13
26
  end
14
27
  end
15
28
 
@@ -19,6 +32,21 @@ module Extension
19
32
  Usage: {{command:#{ShopifyCli::TOOL_NAME} serve}}
20
33
  HELP
21
34
  end
35
+
36
+ private
37
+
38
+ def argo_admin?
39
+ ShopifyCli::Shopifolk.check &&
40
+ ShopifyCli::Feature.enabled?(:argo_admin_beta) &&
41
+ extension_type.specification.features&.argo&.surface == "admin"
42
+ end
43
+
44
+ def validate_env
45
+ ExtensionProject.reload
46
+ @ctx.abort(@ctx.message("serve.serve_missing_information")) if
47
+ project.env.shop.nil? || project.env.api_key.nil? ||
48
+ project.env.shop.strip.empty? || project.env.api_key.strip.empty?
49
+ end
22
50
  end
23
51
  end
24
52
  end
@@ -1,17 +1,17 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Commands
6
6
  class Tunnel < ExtensionCommand
7
7
  options do |parser, flags|
8
- parser.on('--port=PORT') { |port| flags[:port] = port }
8
+ parser.on("--port=PORT") { |port| flags[:port] = port }
9
9
  end
10
10
 
11
- AUTH_SUBCOMMAND = 'auth'
12
- START_SUBCOMMAND = 'start'
13
- STOP_SUBCOMMAND = 'stop'
14
- STATUS_SUBCOMMAND = 'status'
11
+ AUTH_SUBCOMMAND = "auth"
12
+ START_SUBCOMMAND = "start"
13
+ STOP_SUBCOMMAND = "stop"
14
+ STATUS_SUBCOMMAND = "status"
15
15
  DEFAULT_PORT = 39351
16
16
 
17
17
  def call(args, _name)
@@ -27,11 +27,11 @@ module Extension
27
27
  end
28
28
 
29
29
  def self.help
30
- ShopifyCli::Context.message('tunnel.help', ShopifyCli::TOOL_NAME)
30
+ ShopifyCli::Context.message("tunnel.help", ShopifyCli::TOOL_NAME)
31
31
  end
32
32
 
33
33
  def self.extended_help
34
- ShopifyCli::Context.message('tunnel.extended_help', ShopifyCli::TOOL_NAME, DEFAULT_PORT)
34
+ ShopifyCli::Context.message("tunnel.extended_help", ShopifyCli::TOOL_NAME, DEFAULT_PORT)
35
35
  end
36
36
 
37
37
  private
@@ -40,9 +40,9 @@ module Extension
40
40
  tunnel_url = ShopifyCli::Tunnel.urls.first
41
41
 
42
42
  if tunnel_url.nil?
43
- @ctx.puts(@ctx.message('tunnel.no_tunnel_running'))
43
+ @ctx.puts(@ctx.message("tunnel.no_tunnel_running"))
44
44
  else
45
- @ctx.puts(@ctx.message('tunnel.tunnel_running_at', tunnel_url))
45
+ @ctx.puts(@ctx.message("tunnel.tunnel_running_at", tunnel_url))
46
46
  end
47
47
  end
48
48
 
@@ -50,7 +50,7 @@ module Extension
50
50
  return DEFAULT_PORT unless options.flags.key?(:port)
51
51
 
52
52
  port = options.flags[:port].to_i
53
- @ctx.abort(@ctx.message('tunnel.invalid_port', options.flags[:port])) unless port > 0
53
+ @ctx.abort(@ctx.message("tunnel.invalid_port", options.flags[:port])) unless port > 0
54
54
  port
55
55
  end
56
56
 
@@ -58,7 +58,7 @@ module Extension
58
58
  token = args.shift
59
59
 
60
60
  if token.nil?
61
- @ctx.puts(@ctx.message('tunnel.missing_token'))
61
+ @ctx.puts(@ctx.message("tunnel.missing_token"))
62
62
  @ctx.puts("#{self.class.help}\n#{self.class.extended_help}")
63
63
  else
64
64
  ShopifyCli::Tunnel.auth(@ctx, token)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  class ExtensionProject < ShopifyCli::Project
@@ -13,7 +13,7 @@ module Extension
13
13
  )
14
14
  end
15
15
 
16
- def write_env_file(context:, title:, api_key: '', api_secret: '', registration_id: nil)
16
+ def write_env_file(context:, title:, api_key: "", api_secret: "", registration_id: nil)
17
17
  ShopifyCli::Resources::EnvFile.new(
18
18
  api_key: api_key,
19
19
  secret: api_secret,
@@ -23,6 +23,10 @@ module Extension
23
23
  }.compact
24
24
  ).write(context)
25
25
 
26
+ reload
27
+ end
28
+
29
+ def reload
26
30
  current.reload unless project_empty?
27
31
  end
28
32
 
@@ -34,11 +38,11 @@ module Extension
34
38
  end
35
39
 
36
40
  def app
37
- Models::App.new(api_key: env['api_key'], secret: env['secret'])
41
+ Models::App.new(api_key: env["api_key"], secret: env["secret"])
38
42
  end
39
43
 
40
44
  def registered?
41
- property_present?('api_key') && property_present?('secret') && registration_id?
45
+ property_present?("api_key") && property_present?("secret") && registration_id?
42
46
  end
43
47
 
44
48
  def title
@@ -1,10 +1,10 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module ExtensionProjectKeys
6
- REGISTRATION_ID_KEY = 'EXTENSION_ID'
7
- EXTENSION_TYPE_KEY = 'EXTENSION_TYPE'
8
- TITLE_KEY = 'EXTENSION_TITLE'
6
+ REGISTRATION_ID_KEY = "EXTENSION_ID"
7
+ EXTENSION_TYPE_KEY = "EXTENSION_TYPE"
8
+ TITLE_KEY = "EXTENSION_TITLE"
9
9
  end
10
10
  end
@@ -0,0 +1,117 @@
1
+ # frozen_string_literal: true
2
+ require "base64"
3
+ require "shopify_cli"
4
+ require "semantic/semantic"
5
+
6
+ module Extension
7
+ module Features
8
+ class Argo
9
+ include SmartProperties
10
+
11
+ property! :git_template, converts: :to_str
12
+ property! :renderer_package_name, converts: :to_str
13
+
14
+ SCRIPT_PATH = %w(build main.js).freeze
15
+
16
+ NPM_LIST_COMMAND = %w(list).freeze
17
+ YARN_LIST_COMMAND = %w(list --pattern).freeze
18
+ NPM_LIST_PARAMETERS = %w(--prod).freeze
19
+ YARN_LIST_PARAMETERS = %w(--production).freeze
20
+ private_constant :NPM_LIST_COMMAND, :YARN_LIST_COMMAND, :NPM_LIST_PARAMETERS, :YARN_LIST_PARAMETERS
21
+
22
+ YARN_INSTALL_COMMAND = %w(install).freeze
23
+ YARN_INSTALL_PARAMETERS = %w(--silent).freeze
24
+ YARN_RUN_COMMAND = %w(run).freeze
25
+ YARN_RUN_SCRIPT_NAME = %w(build).freeze
26
+ private_constant :YARN_INSTALL_COMMAND, :YARN_INSTALL_PARAMETERS, :YARN_RUN_COMMAND, :YARN_RUN_SCRIPT_NAME
27
+
28
+ def create(directory_name, identifier, context)
29
+ Features::ArgoSetup.new(git_template: git_template).call(directory_name, identifier, context)
30
+ end
31
+
32
+ def config(context)
33
+ js_system = ShopifyCli::JsSystem.new(ctx: context)
34
+ if js_system.package_manager == "yarn"
35
+ run_yarn_install(context, js_system)
36
+ run_yarn_run_script(context, js_system)
37
+ end
38
+ filepath = File.join(context.root, SCRIPT_PATH)
39
+ context.abort(context.message("features.argo.missing_file_error")) unless File.exist?(filepath)
40
+ begin
41
+ {
42
+ renderer_version: extract_argo_renderer_version(context),
43
+ serialized_script: Base64.strict_encode64(File.read(filepath).chomp),
44
+ }
45
+ rescue StandardError
46
+ context.abort(context.message("features.argo.script_prepare_error"))
47
+ end
48
+ end
49
+
50
+ private
51
+
52
+ def extract_argo_renderer_version(context)
53
+ result = run_list_command(context)
54
+ found_version = find_version_number(context, result)
55
+ context.abort(
56
+ context.message("features.argo.dependencies.argo_renderer_package_invalid_version_error")
57
+ ) if found_version.nil?
58
+ ::Semantic::Version.new(found_version).to_s
59
+ rescue ArgumentError
60
+ context.abort(
61
+ context.message("features.argo.dependencies.argo_renderer_package_invalid_version_error")
62
+ )
63
+ end
64
+
65
+ def find_version_number(context, result)
66
+ packages = result.to_json.split('\n')
67
+ found_package = packages.find do |package|
68
+ package.match(/#{renderer_package_name}@/)
69
+ end
70
+ if found_package.nil?
71
+ error = "'#{renderer_package_name}' not found."
72
+ context.abort(
73
+ context.message("features.argo.dependencies.argo_missing_renderer_package_error", error)
74
+ )
75
+ end
76
+ found_package.split("@")[2]&.strip
77
+ end
78
+
79
+ def run_list_command(context)
80
+ js_system = ShopifyCli::JsSystem.new(ctx: context)
81
+ result, error, status = js_system.call(
82
+ yarn: YARN_LIST_COMMAND + [renderer_package_name] + YARN_LIST_PARAMETERS,
83
+ npm: NPM_LIST_COMMAND + [renderer_package_name] + NPM_LIST_PARAMETERS,
84
+ capture_response: true
85
+ )
86
+ context.abort(
87
+ context.message("features.argo.dependencies.argo_missing_renderer_package_error", error)
88
+ ) unless status.success?
89
+ result
90
+ end
91
+
92
+ def run_yarn_install(context, js_system)
93
+ _result, error, status = js_system.call(
94
+ yarn: YARN_INSTALL_COMMAND + YARN_INSTALL_PARAMETERS,
95
+ npm: [],
96
+ capture_response: true
97
+ )
98
+
99
+ context.abort(
100
+ context.message("features.argo.dependencies.yarn_install_error", error)
101
+ ) unless status.success?
102
+ end
103
+
104
+ def run_yarn_run_script(context, js_system)
105
+ _result, error, status = js_system.call(
106
+ yarn: YARN_RUN_COMMAND + YARN_RUN_SCRIPT_NAME,
107
+ npm: [],
108
+ capture_response: true
109
+ )
110
+
111
+ context.abort(
112
+ context.message("features.argo.dependencies.yarn_run_script_error", error)
113
+ ) unless status.success?
114
+ end
115
+ end
116
+ end
117
+ end