shopify-cli 1.5.0 → 1.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (305) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  3. data/.rubocop_todo.yml +15 -2
  4. data/.travis.yml +1 -0
  5. data/CHANGELOG.md +26 -0
  6. data/Gemfile +12 -12
  7. data/Gemfile.lock +14 -14
  8. data/README.md +39 -7
  9. data/Rakefile +32 -28
  10. data/bin/load_shopify.rb +6 -6
  11. data/bin/shopify +2 -2
  12. data/dev.yml +5 -2
  13. data/docs/_config.yml +1 -18
  14. data/docs/app/node/commands/index.md +2 -80
  15. data/docs/app/node/index.md +2 -33
  16. data/docs/app/rails/commands/index.md +2 -78
  17. data/docs/app/rails/index.md +2 -34
  18. data/docs/core/index.md +2 -84
  19. data/docs/getting-started/index.md +2 -25
  20. data/docs/getting-started/install/index.md +1 -118
  21. data/docs/getting-started/migrate/index.md +2 -94
  22. data/docs/getting-started/uninstall/index.md +2 -35
  23. data/docs/getting-started/upgrade/index.md +2 -39
  24. data/docs/help/start-app/index.md +2 -4
  25. data/docs/index.md +2 -24
  26. data/ext/shopify-cli/extconf.rb +7 -7
  27. data/install.sh +1 -1
  28. data/lib/docgen/markdown.rb +12 -12
  29. data/lib/graphql/extension_create.graphql +17 -2
  30. data/lib/graphql/fetch_specifications.graphql +14 -0
  31. data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
  32. data/lib/project_types/extension/cli.rb +56 -48
  33. data/lib/project_types/extension/commands/build.rb +3 -3
  34. data/lib/project_types/extension/commands/create.rb +17 -10
  35. data/lib/project_types/extension/commands/extension_command.rb +14 -7
  36. data/lib/project_types/extension/commands/push.rb +10 -10
  37. data/lib/project_types/extension/commands/register.rb +22 -32
  38. data/lib/project_types/extension/commands/serve.rb +1 -7
  39. data/lib/project_types/extension/commands/tunnel.rb +12 -12
  40. data/lib/project_types/extension/extension_project.rb +22 -7
  41. data/lib/project_types/extension/extension_project_keys.rb +5 -4
  42. data/lib/project_types/extension/features/argo.rb +123 -0
  43. data/lib/project_types/extension/features/argo_config.rb +5 -5
  44. data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
  45. data/lib/project_types/extension/features/argo_renderer_package.rb +32 -0
  46. data/lib/project_types/extension/features/argo_serve.rb +69 -0
  47. data/lib/project_types/extension/features/argo_setup.rb +2 -2
  48. data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
  49. data/lib/project_types/extension/forms/create.rb +28 -34
  50. data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
  51. data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
  52. data/lib/project_types/extension/forms/questions/ask_type.rb +47 -0
  53. data/lib/project_types/extension/messages/message_loading.rb +3 -1
  54. data/lib/project_types/extension/messages/messages.rb +55 -52
  55. data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
  56. data/lib/project_types/extension/models/registration.rb +1 -0
  57. data/lib/project_types/extension/models/specification.rb +39 -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 +75 -0
  60. data/lib/project_types/extension/models/specifications.rb +88 -0
  61. data/lib/project_types/extension/tasks/configure_features.rb +54 -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 +8 -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 +18 -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 -19
  73. data/lib/project_types/node/commands/connect.rb +3 -3
  74. data/lib/project_types/node/commands/create.rb +42 -38
  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 +3 -34
  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 +17 -8
  86. data/lib/project_types/node/messages/messages.rb +13 -47
  87. data/lib/project_types/rails/cli.rb +21 -21
  88. data/lib/project_types/rails/commands/connect.rb +3 -3
  89. data/lib/project_types/rails/commands/create.rb +56 -54
  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 +35 -25
  102. data/lib/project_types/rails/gem.rb +24 -24
  103. data/lib/project_types/rails/messages/messages.rb +6 -5
  104. data/lib/project_types/rails/ruby.rb +2 -2
  105. data/lib/project_types/script/cli.rb +38 -39
  106. data/lib/project_types/script/commands/create.rb +12 -14
  107. data/lib/project_types/script/commands/push.rb +10 -17
  108. data/lib/project_types/script/config/extension_points.yml +29 -10
  109. data/lib/project_types/script/errors.rb +1 -2
  110. data/lib/project_types/script/forms/create.rb +18 -5
  111. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +9 -1
  112. data/lib/project_types/script/graphql/script_service_proxy.graphql +1 -2
  113. data/lib/project_types/script/layers/application/build_script.rb +10 -7
  114. data/lib/project_types/script/layers/application/create_script.rb +37 -25
  115. data/lib/project_types/script/layers/application/extension_points.rb +25 -0
  116. data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
  117. data/lib/project_types/script/layers/application/push_script.rb +13 -18
  118. data/lib/project_types/script/layers/domain/config_ui.rb +16 -0
  119. data/lib/project_types/script/layers/domain/errors.rb +20 -0
  120. data/lib/project_types/script/layers/domain/extension_point.rb +82 -11
  121. data/lib/project_types/script/layers/domain/metadata.rb +48 -0
  122. data/lib/project_types/script/layers/domain/push_package.rb +25 -6
  123. data/lib/project_types/script/layers/domain/script_project.rb +34 -0
  124. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +42 -13
  125. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +24 -49
  126. data/lib/project_types/script/layers/infrastructure/errors.rb +32 -19
  127. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +12 -6
  128. data/lib/project_types/script/layers/infrastructure/project_creator.rb +2 -1
  129. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +22 -17
  130. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +72 -0
  131. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +59 -0
  132. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +145 -0
  133. data/lib/project_types/script/layers/infrastructure/script_service.rb +32 -75
  134. data/lib/project_types/script/layers/infrastructure/task_runner.rb +4 -3
  135. data/lib/project_types/script/messages/messages.rb +58 -59
  136. data/lib/project_types/script/ui/error_handler.rb +115 -72
  137. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  138. data/lib/project_types/script/ui/strict_spinner.rb +1 -1
  139. data/lib/project_types/theme/cli.rb +40 -0
  140. data/lib/project_types/theme/commands/connect.rb +54 -0
  141. data/lib/project_types/theme/commands/create.rb +48 -0
  142. data/lib/project_types/theme/commands/deploy.rb +38 -0
  143. data/lib/project_types/theme/commands/generate.rb +20 -0
  144. data/lib/project_types/theme/commands/generate/env.rb +79 -0
  145. data/lib/project_types/theme/commands/push.rb +55 -0
  146. data/lib/project_types/theme/commands/serve.rb +31 -0
  147. data/lib/project_types/theme/forms/connect.rb +34 -0
  148. data/lib/project_types/theme/forms/create.rb +22 -0
  149. data/lib/project_types/theme/messages/messages.rb +147 -0
  150. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +78 -0
  151. data/lib/project_types/theme/themekit.rb +113 -0
  152. data/lib/rubygems_plugin.rb +3 -3
  153. data/lib/shopify-cli/admin_api.rb +52 -12
  154. data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
  155. data/lib/shopify-cli/admin_api/schema.rb +3 -3
  156. data/lib/shopify-cli/api.rb +34 -31
  157. data/lib/shopify-cli/command.rb +1 -1
  158. data/lib/shopify-cli/commands.rb +9 -9
  159. data/lib/shopify-cli/commands/config.rb +28 -52
  160. data/lib/shopify-cli/commands/connect.rb +10 -10
  161. data/lib/shopify-cli/commands/create.rb +5 -5
  162. data/lib/shopify-cli/commands/help.rb +6 -6
  163. data/lib/shopify-cli/commands/logout.rb +3 -3
  164. data/lib/shopify-cli/commands/system.rb +33 -33
  165. data/lib/shopify-cli/commands/version.rb +2 -2
  166. data/lib/shopify-cli/context.rb +71 -22
  167. data/lib/shopify-cli/core.rb +4 -4
  168. data/lib/shopify-cli/core/entry_point.rb +5 -5
  169. data/lib/shopify-cli/core/executor.rb +1 -1
  170. data/lib/shopify-cli/core/help_resolver.rb +2 -2
  171. data/lib/shopify-cli/core/monorail.rb +16 -16
  172. data/lib/shopify-cli/db.rb +2 -2
  173. data/lib/shopify-cli/feature.rb +1 -3
  174. data/lib/shopify-cli/form.rb +1 -1
  175. data/lib/shopify-cli/git.rb +17 -17
  176. data/lib/shopify-cli/helpers.rb +1 -1
  177. data/lib/shopify-cli/helpers/haikunator.rb +1 -1
  178. data/lib/shopify-cli/heroku.rb +28 -28
  179. data/lib/shopify-cli/http_request.rb +21 -9
  180. data/lib/shopify-cli/js_deps.rb +12 -12
  181. data/lib/shopify-cli/js_system.rb +5 -5
  182. data/lib/shopify-cli/lazy_delegator.rb +55 -0
  183. data/lib/shopify-cli/messages/messages.rb +9 -16
  184. data/lib/shopify-cli/method_object.rb +104 -0
  185. data/lib/shopify-cli/oauth.rb +25 -25
  186. data/lib/shopify-cli/oauth/servlet.rb +9 -9
  187. data/lib/shopify-cli/options.rb +3 -3
  188. data/lib/shopify-cli/packager.rb +24 -24
  189. data/lib/shopify-cli/partners_api.rb +24 -18
  190. data/lib/shopify-cli/partners_api/organizations.rb +10 -10
  191. data/lib/shopify-cli/process_supervision.rb +7 -7
  192. data/lib/shopify-cli/project.rb +16 -16
  193. data/lib/shopify-cli/project_type.rb +4 -4
  194. data/lib/shopify-cli/resolve_constant.rb +25 -0
  195. data/lib/shopify-cli/resources.rb +1 -1
  196. data/lib/shopify-cli/resources/env_file.rb +9 -9
  197. data/lib/shopify-cli/result.rb +432 -0
  198. data/lib/shopify-cli/shopifolk.rb +6 -8
  199. data/lib/shopify-cli/sub_command.rb +1 -1
  200. data/lib/shopify-cli/task.rb +3 -3
  201. data/lib/shopify-cli/tasks.rb +7 -7
  202. data/lib/shopify-cli/tasks/create_api_client.rb +5 -5
  203. data/lib/shopify-cli/tasks/ensure_dev_store.rb +12 -12
  204. data/lib/shopify-cli/tasks/ensure_env.rb +15 -15
  205. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
  206. data/lib/shopify-cli/tasks/select_org_and_shop.rb +25 -24
  207. data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
  208. data/lib/shopify-cli/transform_data_structure.rb +86 -0
  209. data/lib/shopify-cli/tunnel.rb +36 -30
  210. data/lib/shopify-cli/version.rb +1 -1
  211. data/lib/shopify_cli.rb +57 -52
  212. data/shopify-cli.gemspec +6 -6
  213. data/shopify.fish +1 -1
  214. data/shopify.sh +1 -1
  215. data/vendor/deps/cli-kit/REVISION +1 -1
  216. data/vendor/deps/cli-kit/lib/cli/kit/logger.rb +2 -2
  217. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +3 -3
  218. data/vendor/deps/cli-ui/REVISION +1 -1
  219. data/vendor/deps/cli-ui/lib/cli/ui.rb +26 -22
  220. data/vendor/deps/cli-ui/lib/cli/ui/ansi.rb +4 -6
  221. data/vendor/deps/cli-ui/lib/cli/ui/frame.rb +3 -3
  222. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_stack.rb +8 -9
  223. data/vendor/deps/cli-ui/lib/cli/ui/frame/frame_style.rb +1 -1
  224. data/vendor/deps/cli-ui/lib/cli/ui/glyph.rb +1 -0
  225. data/vendor/deps/cli-ui/lib/cli/ui/printer.rb +15 -3
  226. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +4 -11
  227. data/vendor/deps/cli-ui/lib/cli/ui/spinner.rb +3 -5
  228. data/vendor/deps/cli-ui/lib/cli/ui/terminal.rb +10 -10
  229. data/vendor/deps/cli-ui/lib/cli/ui/version.rb +1 -1
  230. data/vendor/deps/cli-ui/lib/cli/ui/wrap.rb +56 -0
  231. data/vendor/deps/webrick/.gitignore +9 -0
  232. data/vendor/deps/webrick/Gemfile +3 -0
  233. data/vendor/deps/webrick/LICENSE.txt +22 -0
  234. data/vendor/deps/webrick/README.md +61 -0
  235. data/vendor/deps/webrick/Rakefile +10 -0
  236. data/vendor/deps/webrick/lib/webrick.rb +232 -0
  237. data/vendor/deps/webrick/lib/webrick/accesslog.rb +157 -0
  238. data/vendor/deps/webrick/lib/webrick/cgi.rb +313 -0
  239. data/vendor/deps/webrick/lib/webrick/compat.rb +36 -0
  240. data/vendor/deps/webrick/lib/webrick/config.rb +158 -0
  241. data/vendor/deps/webrick/lib/webrick/cookie.rb +172 -0
  242. data/vendor/deps/webrick/lib/webrick/htmlutils.rb +30 -0
  243. data/vendor/deps/webrick/lib/webrick/httpauth.rb +96 -0
  244. data/vendor/deps/webrick/lib/webrick/httpauth/authenticator.rb +117 -0
  245. data/vendor/deps/webrick/lib/webrick/httpauth/basicauth.rb +116 -0
  246. data/vendor/deps/webrick/lib/webrick/httpauth/digestauth.rb +395 -0
  247. data/vendor/deps/webrick/lib/webrick/httpauth/htdigest.rb +132 -0
  248. data/vendor/deps/webrick/lib/webrick/httpauth/htgroup.rb +97 -0
  249. data/vendor/deps/webrick/lib/webrick/httpauth/htpasswd.rb +158 -0
  250. data/vendor/deps/webrick/lib/webrick/httpauth/userdb.rb +53 -0
  251. data/vendor/deps/webrick/lib/webrick/httpproxy.rb +354 -0
  252. data/vendor/deps/webrick/lib/webrick/httprequest.rb +636 -0
  253. data/vendor/deps/webrick/lib/webrick/httpresponse.rb +564 -0
  254. data/vendor/deps/webrick/lib/webrick/https.rb +152 -0
  255. data/vendor/deps/webrick/lib/webrick/httpserver.rb +294 -0
  256. data/vendor/deps/webrick/lib/webrick/httpservlet.rb +23 -0
  257. data/vendor/deps/webrick/lib/webrick/httpservlet/abstract.rb +152 -0
  258. data/vendor/deps/webrick/lib/webrick/httpservlet/cgi_runner.rb +47 -0
  259. data/vendor/deps/webrick/lib/webrick/httpservlet/cgihandler.rb +126 -0
  260. data/vendor/deps/webrick/lib/webrick/httpservlet/erbhandler.rb +88 -0
  261. data/vendor/deps/webrick/lib/webrick/httpservlet/filehandler.rb +552 -0
  262. data/vendor/deps/webrick/lib/webrick/httpservlet/prochandler.rb +47 -0
  263. data/vendor/deps/webrick/lib/webrick/httpstatus.rb +194 -0
  264. data/vendor/deps/webrick/lib/webrick/httputils.rb +512 -0
  265. data/vendor/deps/webrick/lib/webrick/httpversion.rb +76 -0
  266. data/vendor/deps/webrick/lib/webrick/log.rb +156 -0
  267. data/vendor/deps/webrick/lib/webrick/server.rb +381 -0
  268. data/vendor/deps/webrick/lib/webrick/ssl.rb +215 -0
  269. data/vendor/deps/webrick/lib/webrick/utils.rb +265 -0
  270. data/vendor/deps/webrick/lib/webrick/version.rb +18 -0
  271. data/vendor/deps/webrick/webrick.gemspec +74 -0
  272. data/vendor/gen/template/bin/update-deps +9 -9
  273. metadata +83 -35
  274. data/docs/Gemfile +0 -5
  275. data/docs/Gemfile.lock +0 -258
  276. data/docs/_data/nav.yml +0 -35
  277. data/docs/_includes/footer.html +0 -15
  278. data/docs/_includes/head.html +0 -19
  279. data/docs/_includes/sidebar_nav.html +0 -22
  280. data/docs/_includes/toc.html +0 -112
  281. data/docs/_layouts/default.html +0 -79
  282. data/docs/css/docs.css +0 -157
  283. data/docs/images/header.png +0 -0
  284. data/docs/installing-ruby.md +0 -28
  285. data/lib/project_types/extension/features/argo/admin.rb +0 -20
  286. data/lib/project_types/extension/features/argo/base.rb +0 -129
  287. data/lib/project_types/extension/features/argo/checkout.rb +0 -20
  288. data/lib/project_types/extension/forms/register.rb +0 -47
  289. data/lib/project_types/extension/models/type.rb +0 -81
  290. data/lib/project_types/extension/models/types/checkout_post_purchase.rb +0 -23
  291. data/lib/project_types/extension/models/types/product_subscription.rb +0 -24
  292. data/lib/project_types/node/commands/generate/billing.rb +0 -39
  293. data/lib/project_types/node/commands/generate/page.rb +0 -59
  294. data/lib/project_types/node/commands/generate/webhook.rb +0 -37
  295. data/lib/project_types/script/commands/disable.rb +0 -25
  296. data/lib/project_types/script/commands/enable.rb +0 -78
  297. data/lib/project_types/script/graphql/shop_script_delete.graphql +0 -14
  298. data/lib/project_types/script/graphql/shop_script_update_or_create.graphql +0 -28
  299. data/lib/project_types/script/layers/application/disable_script.rb +0 -21
  300. data/lib/project_types/script/layers/application/enable_script.rb +0 -23
  301. data/lib/project_types/script/layers/domain/script.rb +0 -18
  302. data/lib/project_types/script/layers/infrastructure/script_repository.rb +0 -47
  303. data/lib/project_types/script/script_project.rb +0 -54
  304. data/lib/project_types/script/templates/ts/as-pect.config.js +0 -27
  305. 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
@@ -8,13 +8,20 @@ module Extension
8
8
  @project ||= ExtensionProject.current
9
9
  end
10
10
 
11
- def extension_type
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
11
+ def specification_handler
12
+ @specification_handler ||= begin
13
+ identifier = project.specification_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.specification_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
 
@@ -59,8 +59,8 @@ module Extension
59
59
  context: @ctx,
60
60
  api_key: project.app.api_key,
61
61
  registration_id: project.registration_id,
62
- config: extension_type.config(@ctx),
63
- extension_context: extension_type.extension_context(@ctx)
62
+ config: specification_handler.config(@ctx),
63
+ extension_context: specification_handler.extension_context(@ctx)
64
64
  )
65
65
  end
66
66
  end
@@ -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,50 +21,46 @@ 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", specification_handler.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,
54
39
  api_key: app.api_key,
55
- type: extension_type.graphql_identifier,
40
+ type: specification_handler.graphql_identifier,
56
41
  title: project.title,
57
42
  config: {},
58
- extension_context: extension_type.extension_context(@ctx)
43
+ extension_context: specification_handler.extension_context(@ctx)
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,
66
51
  api_secret: app.secret,
67
52
  registration_id: registration.id,
53
+ registration_uuid: registration.uuid,
68
54
  title: project.title
69
55
  )
70
56
  end
71
57
 
58
+ def app
59
+ @app ||= project.app
60
+ end
61
+
72
62
  def abort_not_registered
73
- @ctx.puts(@ctx.message('register.confirm_abort'))
63
+ @ctx.puts(@ctx.message("register.confirm_abort"))
74
64
  raise ShopifyCli::AbortSilent
75
65
  end
76
66
  end
@@ -3,14 +3,8 @@
3
3
  module Extension
4
4
  module Commands
5
5
  class Serve < ExtensionCommand
6
- YARN_SERVE_COMMAND = %w(server)
7
- NPM_SERVE_COMMAND = %w(run-script server)
8
-
9
6
  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
13
- end
7
+ specification_handler.serve(@ctx)
14
8
  end
15
9
 
16
10
  def self.help
@@ -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
@@ -9,20 +9,27 @@ module Extension
9
9
  context,
10
10
  project_type: :extension,
11
11
  organization_id: nil,
12
- "#{ExtensionProjectKeys::EXTENSION_TYPE_KEY}": type
12
+ "#{ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY}": type
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(
17
+ context:, title:, api_key: "", api_secret: "", registration_id: nil, registration_uuid: nil
18
+ )
17
19
  ShopifyCli::Resources::EnvFile.new(
18
20
  api_key: api_key,
19
21
  secret: api_secret,
20
22
  extra: {
21
23
  ExtensionProjectKeys::TITLE_KEY => title,
22
24
  ExtensionProjectKeys::REGISTRATION_ID_KEY => registration_id,
25
+ ExtensionProjectKeys::REGISTRATION_UUID_KEY => registration_uuid || generate_temporary_uuid,
23
26
  }.compact
24
27
  ).write(context)
25
28
 
29
+ reload
30
+ end
31
+
32
+ def reload
26
33
  current.reload unless project_empty?
27
34
  end
28
35
 
@@ -34,19 +41,19 @@ module Extension
34
41
  end
35
42
 
36
43
  def app
37
- Models::App.new(api_key: env['api_key'], secret: env['secret'])
44
+ Models::App.new(api_key: env["api_key"], secret: env["secret"])
38
45
  end
39
46
 
40
47
  def registered?
41
- property_present?('api_key') && property_present?('secret') && registration_id?
48
+ property_present?("api_key") && property_present?("secret") && registration_id?
42
49
  end
43
50
 
44
51
  def title
45
52
  get_extra_field(ExtensionProjectKeys::TITLE_KEY)
46
53
  end
47
54
 
48
- def extension_type_identifier
49
- config[ExtensionProjectKeys::EXTENSION_TYPE_KEY]
55
+ def specification_identifier
56
+ config[ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY]
50
57
  end
51
58
 
52
59
  def registration_id?
@@ -59,10 +66,18 @@ module Extension
59
66
  get_extra_field(ExtensionProjectKeys::REGISTRATION_ID_KEY).to_i
60
67
  end
61
68
 
69
+ def registration_uuid
70
+ get_extra_field(ExtensionProjectKeys::REGISTRATION_UUID_KEY)
71
+ end
72
+
62
73
  def reload
63
74
  @env = nil
64
75
  end
65
76
 
77
+ def self.generate_temporary_uuid
78
+ "dev-#{SecureRandom.uuid}"
79
+ end
80
+
66
81
  private
67
82
 
68
83
  def get_extra_field(key)
@@ -1,10 +1,11 @@
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
+ REGISTRATION_UUID_KEY = "EXTENSION_UUID"
8
+ SPECIFICATION_IDENTIFIER_KEY = "EXTENSION_TYPE"
9
+ TITLE_KEY = "EXTENSION_TITLE"
9
10
  end
10
11
  end
@@ -0,0 +1,123 @@
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
+ def renderer_package(context)
51
+ Features::ArgoRendererPackage.new(
52
+ package_name: renderer_package_name, version: extract_argo_renderer_version(context)
53
+ )
54
+ end
55
+
56
+ private
57
+
58
+ def extract_argo_renderer_version(context)
59
+ result = run_list_command(context)
60
+ found_version = find_version_number(context, result)
61
+ context.abort(
62
+ context.message("features.argo.dependencies.argo_renderer_package_invalid_version_error")
63
+ ) if found_version.nil?
64
+ ::Semantic::Version.new(found_version).to_s
65
+ rescue ArgumentError
66
+ context.abort(
67
+ context.message("features.argo.dependencies.argo_renderer_package_invalid_version_error")
68
+ )
69
+ end
70
+
71
+ def find_version_number(context, result)
72
+ packages = result.to_json.split('\n')
73
+ found_package = packages.find do |package|
74
+ package.match(/#{renderer_package_name}@/)
75
+ end
76
+ if found_package.nil?
77
+ error = "'#{renderer_package_name}' not found."
78
+ context.abort(
79
+ context.message("features.argo.dependencies.argo_missing_renderer_package_error", error)
80
+ )
81
+ end
82
+ found_package.split("@")[2]&.strip
83
+ end
84
+
85
+ def run_list_command(context)
86
+ js_system = ShopifyCli::JsSystem.new(ctx: context)
87
+ result, error, status = js_system.call(
88
+ yarn: YARN_LIST_COMMAND + [renderer_package_name] + YARN_LIST_PARAMETERS,
89
+ npm: NPM_LIST_COMMAND + [renderer_package_name] + NPM_LIST_PARAMETERS,
90
+ capture_response: true
91
+ )
92
+ context.abort(
93
+ context.message("features.argo.dependencies.argo_missing_renderer_package_error", error)
94
+ ) unless status.success?
95
+ result
96
+ end
97
+
98
+ def run_yarn_install(context, js_system)
99
+ _result, error, status = js_system.call(
100
+ yarn: YARN_INSTALL_COMMAND + YARN_INSTALL_PARAMETERS,
101
+ npm: [],
102
+ capture_response: true
103
+ )
104
+
105
+ context.abort(
106
+ context.message("features.argo.dependencies.yarn_install_error", error)
107
+ ) unless status.success?
108
+ end
109
+
110
+ def run_yarn_run_script(context, js_system)
111
+ _result, error, status = js_system.call(
112
+ yarn: YARN_RUN_COMMAND + YARN_RUN_SCRIPT_NAME,
113
+ npm: [],
114
+ capture_response: true
115
+ )
116
+
117
+ context.abort(
118
+ context.message("features.argo.dependencies.yarn_run_script_error", error)
119
+ ) unless status.success?
120
+ end
121
+ end
122
+ end
123
+ end