shopify-cli 1.13.0 → 2.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (199) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -1
  3. data/.github/CONTRIBUTING.md +7 -7
  4. data/.github/DESIGN.md +3 -3
  5. data/.github/workflows/build.yml +1 -1
  6. data/.gitignore +3 -0
  7. data/.rubocop.yml +3 -1
  8. data/.ruby-version +1 -1
  9. data/CHANGELOG.md +57 -24
  10. data/Gemfile +4 -0
  11. data/Gemfile.lock +32 -0
  12. data/LICENSE +4 -1
  13. data/README.md +94 -26
  14. data/RELEASING.md +31 -7
  15. data/Rakefile +2 -2
  16. data/SECURITY.md +1 -1
  17. data/THEMEKIT_MIGRATION.md +18 -0
  18. data/bin/load_shopify.rb +1 -1
  19. data/bin/shopify +3 -3
  20. data/dev.yml +1 -1
  21. data/docs/app/node/index.md +1 -1
  22. data/docs/app/rails/index.md +1 -1
  23. data/docs/core/index.md +1 -1
  24. data/docs/getting-started/index.md +1 -1
  25. data/docs/getting-started/install/index.md +1 -1
  26. data/docs/getting-started/migrate/index.md +1 -1
  27. data/docs/getting-started/uninstall/index.md +1 -1
  28. data/docs/getting-started/upgrade/index.md +1 -1
  29. data/docs/help/start-app/index.md +1 -1
  30. data/docs/index.md +1 -1
  31. data/ext/shopify-cli/extconf.rb +17 -5
  32. data/install.sh +1 -1
  33. data/lib/docgen/index_template.md.erb +2 -2
  34. data/lib/graphql/all_orgs_with_extensions.graphql +37 -0
  35. data/lib/graphql/api_versions.graphql +1 -1
  36. data/lib/graphql/find_organization.graphql +2 -1
  37. data/lib/project_types/extension/cli.rb +18 -15
  38. data/lib/project_types/extension/commands/build.rb +4 -5
  39. data/lib/project_types/extension/commands/connect.rb +35 -0
  40. data/lib/project_types/extension/commands/create.rb +12 -16
  41. data/lib/project_types/extension/commands/extension_command.rb +2 -2
  42. data/lib/project_types/extension/commands/info.rb +86 -0
  43. data/lib/project_types/extension/commands/push.rb +8 -7
  44. data/lib/project_types/extension/commands/register.rb +4 -5
  45. data/lib/project_types/extension/commands/serve.rb +5 -8
  46. data/lib/project_types/extension/commands/tunnel.rb +3 -1
  47. data/lib/project_types/extension/errors.rb +9 -0
  48. data/lib/project_types/extension/extension_project.rb +17 -1
  49. data/lib/project_types/extension/extension_project_keys.rb +1 -0
  50. data/lib/project_types/extension/features/argo.rb +6 -6
  51. data/lib/project_types/extension/features/argo_runtime.rb +22 -56
  52. data/lib/project_types/extension/features/argo_serve.rb +25 -18
  53. data/lib/project_types/extension/forms/connect.rb +42 -0
  54. data/lib/project_types/extension/forms/questions/ask_name.rb +14 -6
  55. data/lib/project_types/extension/forms/questions/ask_registration.rb +51 -0
  56. data/lib/project_types/extension/messages/messages.rb +80 -16
  57. data/lib/project_types/extension/models/specification.rb +1 -0
  58. data/lib/project_types/extension/models/specification_handlers/{checkout_argo_extension.rb → checkout_ui_extension.rb} +3 -1
  59. data/lib/project_types/extension/models/specification_handlers/default.rb +13 -3
  60. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +89 -0
  61. data/lib/project_types/extension/models/specifications.rb +1 -0
  62. data/lib/project_types/extension/tasks/configure_features.rb +6 -7
  63. data/lib/project_types/extension/tasks/configure_options.rb +20 -0
  64. data/lib/project_types/extension/tasks/get_extensions.rb +32 -0
  65. data/lib/project_types/node/cli.rb +9 -21
  66. data/lib/project_types/node/commands/connect.rb +8 -2
  67. data/lib/project_types/node/commands/create.rb +9 -5
  68. data/lib/project_types/node/commands/deploy.rb +15 -5
  69. data/lib/project_types/node/commands/deploy/heroku.rb +29 -29
  70. data/lib/project_types/node/commands/generate.rb +4 -2
  71. data/lib/project_types/node/commands/open.rb +4 -2
  72. data/lib/project_types/node/commands/serve.rb +3 -2
  73. data/lib/project_types/node/commands/tunnel.rb +4 -2
  74. data/lib/project_types/node/messages/messages.rb +47 -90
  75. data/lib/project_types/rails/cli.rb +9 -21
  76. data/lib/project_types/rails/commands/connect.rb +8 -2
  77. data/lib/project_types/rails/commands/create.rb +10 -6
  78. data/lib/project_types/rails/commands/deploy.rb +15 -5
  79. data/lib/project_types/rails/commands/deploy/heroku.rb +84 -82
  80. data/lib/project_types/rails/commands/generate.rb +15 -5
  81. data/lib/project_types/rails/commands/generate/webhook.rb +28 -26
  82. data/lib/project_types/rails/commands/open.rb +4 -2
  83. data/lib/project_types/rails/commands/serve.rb +3 -2
  84. data/lib/project_types/rails/commands/tunnel.rb +4 -2
  85. data/lib/project_types/rails/messages/messages.rb +72 -119
  86. data/lib/project_types/script/cli.rb +6 -8
  87. data/lib/project_types/script/commands/create.rb +3 -1
  88. data/lib/project_types/script/commands/push.rb +12 -5
  89. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +9 -3
  90. data/lib/project_types/script/layers/application/create_script.rb +4 -3
  91. data/lib/project_types/script/layers/domain/errors.rb +6 -11
  92. data/lib/project_types/script/layers/domain/push_package.rb +4 -8
  93. data/lib/project_types/script/layers/domain/script_json.rb +32 -0
  94. data/lib/project_types/script/layers/domain/script_project.rb +1 -1
  95. data/lib/project_types/script/layers/infrastructure/errors.rb +13 -17
  96. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +29 -21
  97. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +2 -4
  98. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +45 -34
  99. data/lib/project_types/script/layers/infrastructure/script_service.rb +37 -16
  100. data/lib/project_types/script/messages/messages.rb +66 -55
  101. data/lib/project_types/script/tasks/ensure_env.rb +22 -1
  102. data/lib/project_types/script/ui/error_handler.rb +32 -32
  103. data/lib/project_types/theme/cli.rb +16 -27
  104. data/lib/project_types/theme/commands/check.rb +33 -0
  105. data/lib/project_types/theme/commands/delete.rb +64 -0
  106. data/lib/project_types/theme/commands/init.rb +42 -0
  107. data/lib/project_types/theme/commands/language_server.rb +16 -0
  108. data/lib/project_types/theme/commands/package.rb +55 -0
  109. data/lib/project_types/theme/commands/publish.rb +43 -0
  110. data/lib/project_types/theme/commands/pull.rb +51 -0
  111. data/lib/project_types/theme/commands/push.rb +58 -32
  112. data/lib/project_types/theme/commands/serve.rb +8 -16
  113. data/lib/project_types/theme/forms/confirm_store.rb +15 -0
  114. data/lib/project_types/theme/forms/select.rb +59 -0
  115. data/lib/project_types/theme/messages/messages.rb +118 -103
  116. data/lib/project_types/theme/ui/sync_progress_bar.rb +20 -0
  117. data/lib/shopify-cli/admin_api.rb +57 -38
  118. data/lib/shopify-cli/admin_api/populate_resource_command.rb +6 -14
  119. data/lib/shopify-cli/admin_api/schema.rb +1 -10
  120. data/lib/shopify-cli/api.rb +29 -14
  121. data/lib/shopify-cli/command.rb +15 -3
  122. data/lib/shopify-cli/commands.rb +7 -2
  123. data/lib/shopify-cli/commands/help.rb +2 -29
  124. data/lib/shopify-cli/commands/login.rb +95 -0
  125. data/lib/shopify-cli/commands/logout.rb +24 -8
  126. data/lib/shopify-cli/commands/populate.rb +23 -0
  127. data/lib/{project_types/node → shopify-cli}/commands/populate/customer.rb +2 -8
  128. data/lib/{project_types/node → shopify-cli}/commands/populate/draft_order.rb +2 -2
  129. data/lib/{project_types/node → shopify-cli}/commands/populate/product.rb +2 -8
  130. data/lib/shopify-cli/commands/store.rb +15 -0
  131. data/lib/shopify-cli/commands/switch.rb +39 -0
  132. data/lib/shopify-cli/commands/system.rb +12 -0
  133. data/lib/shopify-cli/commands/whoami.rb +28 -0
  134. data/lib/shopify-cli/connect.rb +32 -0
  135. data/lib/shopify-cli/context.rb +65 -4
  136. data/lib/shopify-cli/core/entry_point.rb +3 -22
  137. data/lib/shopify-cli/core/monorail.rb +6 -2
  138. data/lib/shopify-cli/db.rb +4 -4
  139. data/lib/shopify-cli/http_request.rb +16 -0
  140. data/lib/shopify-cli/identity_auth.rb +282 -0
  141. data/lib/shopify-cli/{oauth → identity_auth}/servlet.rb +11 -12
  142. data/lib/shopify-cli/messages/messages.rb +140 -46
  143. data/lib/shopify-cli/packager.rb +5 -5
  144. data/lib/shopify-cli/partners_api.rb +21 -44
  145. data/lib/shopify-cli/partners_api/organizations.rb +8 -0
  146. data/lib/shopify-cli/project_commands.rb +16 -0
  147. data/lib/shopify-cli/project_type.rb +0 -31
  148. data/lib/shopify-cli/shopifolk.rb +8 -11
  149. data/lib/shopify-cli/sub_command.rb +1 -0
  150. data/lib/shopify-cli/tasks.rb +3 -0
  151. data/lib/shopify-cli/tasks/confirm_store.rb +18 -0
  152. data/lib/shopify-cli/tasks/create_api_client.rb +2 -2
  153. data/lib/shopify-cli/tasks/ensure_authenticated.rb +13 -0
  154. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +1 -1
  155. data/lib/shopify-cli/tasks/ensure_project_type.rb +12 -0
  156. data/lib/shopify-cli/tasks/select_org_and_shop.rb +0 -3
  157. data/lib/shopify-cli/theme/dev_server.rb +98 -0
  158. data/lib/shopify-cli/theme/dev_server/certificate_manager.rb +79 -0
  159. data/lib/shopify-cli/theme/dev_server/header_hash.rb +94 -0
  160. data/lib/shopify-cli/theme/dev_server/hot-reload.js +93 -0
  161. data/lib/shopify-cli/theme/dev_server/hot_reload.rb +76 -0
  162. data/lib/shopify-cli/theme/dev_server/local_assets.rb +87 -0
  163. data/lib/shopify-cli/theme/dev_server/proxy.rb +205 -0
  164. data/lib/shopify-cli/theme/dev_server/sse.rb +75 -0
  165. data/lib/shopify-cli/theme/dev_server/watcher.rb +59 -0
  166. data/lib/shopify-cli/theme/dev_server/web_server.rb +140 -0
  167. data/lib/shopify-cli/theme/development_theme.rb +69 -0
  168. data/lib/shopify-cli/theme/file.rb +112 -0
  169. data/lib/shopify-cli/theme/ignore_filter.rb +109 -0
  170. data/lib/shopify-cli/theme/mime_type.rb +34 -0
  171. data/lib/shopify-cli/theme/syncer.rb +332 -0
  172. data/lib/shopify-cli/theme/theme.rb +204 -0
  173. data/lib/shopify-cli/tunnel.rb +1 -1
  174. data/lib/shopify-cli/version.rb +1 -1
  175. data/lib/shopify_cli.rb +18 -11
  176. data/shopify-cli.gemspec +12 -5
  177. data/shopify.fish +1 -1
  178. data/shopify.sh +1 -1
  179. metadata +91 -35
  180. data/.github/workflows/release.yml +0 -59
  181. data/lib/project_types/extension/features/argo_serve_options.rb +0 -41
  182. data/lib/project_types/node/commands/populate.rb +0 -23
  183. data/lib/project_types/rails/commands/populate.rb +0 -23
  184. data/lib/project_types/rails/commands/populate/customer.rb +0 -31
  185. data/lib/project_types/rails/commands/populate/draft_order.rb +0 -28
  186. data/lib/project_types/rails/commands/populate/product.rb +0 -30
  187. data/lib/project_types/script/layers/domain/config_ui.rb +0 -16
  188. data/lib/project_types/theme/commands/connect.rb +0 -54
  189. data/lib/project_types/theme/commands/create.rb +0 -48
  190. data/lib/project_types/theme/commands/deploy.rb +0 -38
  191. data/lib/project_types/theme/commands/generate.rb +0 -20
  192. data/lib/project_types/theme/commands/generate/env.rb +0 -79
  193. data/lib/project_types/theme/forms/connect.rb +0 -34
  194. data/lib/project_types/theme/forms/create.rb +0 -22
  195. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +0 -78
  196. data/lib/project_types/theme/themekit.rb +0 -113
  197. data/lib/shopify-cli/commands/connect.rb +0 -64
  198. data/lib/shopify-cli/commands/create.rb +0 -50
  199. data/lib/shopify-cli/oauth.rb +0 -198
@@ -44,6 +44,7 @@ module Extension
44
44
  .map(&ShopifyCli::TransformDataStructure.new(symbolize_keys: true, underscore_keys: true))
45
45
  .then(&method(:select_cli_extensions))
46
46
  .then(&Tasks::ConfigureFeatures)
47
+ .then(&Tasks::ConfigureOptions)
47
48
  .then(&method(:ensure_legacy_compatibility))
48
49
  .then(&method(:build_specifications))
49
50
  .then(&method(:require_handler_implementations))
@@ -38,16 +38,15 @@ module Extension
38
38
  def surface_area_configurations
39
39
  {
40
40
  admin: {
41
- git_template: "https://github.com/Shopify/argo-admin-template.git",
42
- renderer_package_name: "@shopify/argo-admin",
41
+ git_template: "https://github.com/Shopify/admin-ui-extensions-template",
42
+ renderer_package_name: "@shopify/admin-ui-extensions",
43
43
  required_fields: [:shop, :api_key],
44
- required_shop_beta_flags: [:argo_admin_beta],
45
- cli_package_name: "@shopify/argo-admin-cli",
44
+ cli_package_name: "@shopify/admin-ui-extensions-run",
46
45
  },
47
46
  checkout: {
48
- git_template: "https://github.com/Shopify/argo-checkout-template.git",
49
- renderer_package_name: "@shopify/argo-checkout",
50
- cli_package_name: "@shopify/argo-run",
47
+ git_template: "https://github.com/Shopify/checkout-ui-extensions-template",
48
+ renderer_package_name: "@shopify/checkout-ui-extensions",
49
+ cli_package_name: "@shopify/checkout-ui-extensions-run",
51
50
  },
52
51
  }
53
52
  end
@@ -0,0 +1,20 @@
1
+ module Extension
2
+ module Tasks
3
+ class ConfigureOptions
4
+ include ShopifyCli::MethodObject
5
+
6
+ def call(specification_attribute_sets)
7
+ specification_attribute_sets.each do |attributes|
8
+ attributes[:options] ||= {}
9
+ configure_skip_build(attributes)
10
+ end
11
+ end
12
+
13
+ private
14
+
15
+ def configure_skip_build(attributes)
16
+ attributes[:options].merge!(skip_build: attributes[:identifier] == "theme_app_extension")
17
+ end
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,32 @@
1
+ # frozen_string_literal: true
2
+ require "shopify_cli"
3
+
4
+ module Extension
5
+ module Tasks
6
+ class GetExtensions < ShopifyCli::Task
7
+ def call(context:, type:)
8
+ organizations = ShopifyCli::PartnersAPI::Organizations.fetch_with_extensions(context, type)
9
+ extensions_from_organizations(organizations, context: context)
10
+ end
11
+
12
+ private
13
+
14
+ def extensions_from_organizations(organizations, context:)
15
+ organizations.flat_map do |organization|
16
+ extensions_owned_by_organization(organization, context: context)
17
+ end
18
+ end
19
+
20
+ def extensions_owned_by_organization(organization, context:)
21
+ return [] unless organization.key?("apps") && organization["apps"].any?
22
+
23
+ organization["apps"].flat_map do |app|
24
+ app["extensionRegistrations"].map do |registration|
25
+ [Converters::AppConverter.from_hash(app, organization),
26
+ Converters::RegistrationConverter.from_hash(context, registration)]
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
32
+ end
@@ -1,33 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
  module Node
3
3
  class Project < ShopifyCli::ProjectType
4
- title("Node.js App")
5
- creator("Node::Commands::Create")
6
- connector("Node::Commands::Connect")
7
-
8
- register_command("Node::Commands::Deploy", "deploy")
9
- register_command("Node::Commands::Generate", "generate")
10
- register_command("Node::Commands::Open", "open")
11
- register_command("Node::Commands::Populate", "populate")
12
- register_command("Node::Commands::Serve", "serve")
13
- register_command("Node::Commands::Tunnel", "tunnel")
14
- # register_task('Node::Tasks::NodeTask', 'node_task')
15
-
16
4
  require Project.project_filepath("messages/messages")
17
5
  register_messages(Node::Messages::MESSAGES)
18
6
  end
19
7
 
20
8
  # define/autoload project specific Commands
21
- module Commands
22
- autoload :Connect, Project.project_filepath("commands/connect")
23
- autoload :Create, Project.project_filepath("commands/create")
24
- autoload :Deploy, Project.project_filepath("commands/deploy")
25
- autoload :Generate, Project.project_filepath("commands/generate")
26
- autoload :Open, Project.project_filepath("commands/open")
27
- autoload :Populate, Project.project_filepath("commands/populate")
28
- autoload :Serve, Project.project_filepath("commands/serve")
29
- autoload :Tunnel, Project.project_filepath("commands/tunnel")
9
+ class Command < ShopifyCli::ProjectCommands
10
+ subcommand :Connect, "connect", Project.project_filepath("commands/connect")
11
+ subcommand :Create, "create", Project.project_filepath("commands/create")
12
+ subcommand :Deploy, "deploy", Project.project_filepath("commands/deploy")
13
+ subcommand :Generate, "generate", Project.project_filepath("commands/generate")
14
+ subcommand :Open, "open", Project.project_filepath("commands/open")
15
+ subcommand :Serve, "serve", Project.project_filepath("commands/serve")
16
+ subcommand :Tunnel, "tunnel", Project.project_filepath("commands/tunnel")
30
17
  end
18
+ ShopifyCli::Commands.register("Node::Command", "node")
31
19
 
32
20
  # define/autoload project specific Tasks
33
21
  module Tasks
@@ -1,15 +1,21 @@
1
1
  # frozen_string_literal: true
2
2
  module Node
3
- module Commands
3
+ class Command
4
4
  class Connect < ShopifyCli::SubCommand
5
+ prerequisite_task ensure_project_type: :node
6
+
5
7
  def call(*)
6
8
  if ShopifyCli::Project.has_current? && ShopifyCli::Project.current.env
7
9
  @ctx.puts(@ctx.message("node.connect.production_warning"))
8
10
  end
9
11
 
10
- app = ShopifyCli::Commands::Connect.new.default_connect("node")
12
+ app = ShopifyCli::Connect.new(@ctx).default_connect("node")
11
13
  @ctx.done(@ctx.message("node.connect.connected", app))
12
14
  end
15
+
16
+ def self.help
17
+ ShopifyCli::Context.message("node.connect.help", ShopifyCli::TOOL_NAME, ShopifyCli::TOOL_NAME)
18
+ end
13
19
  end
14
20
  end
15
21
  end
@@ -1,16 +1,20 @@
1
1
  # frozen_string_literal: true
2
2
  module Node
3
- module Commands
3
+ class Command
4
4
  class Create < ShopifyCli::SubCommand
5
+ prerequisite_task :ensure_authenticated
6
+
5
7
  options do |parser, flags|
6
8
  # backwards compatibility allow 'title' for now
7
9
  parser.on("--title=TITLE") { |t| flags[:title] = t }
8
10
  parser.on("--name=NAME") { |t| flags[:title] = t }
9
- parser.on("--organization_id=ID") { |url| flags[:organization_id] = url }
10
- parser.on("--organization-id=ID") { |url| flags[:organization_id] = url }
11
+ parser.on("--organization_id=ID") { |id| flags[:organization_id] = id }
12
+ parser.on("--organization-id=ID") { |id| flags[:organization_id] = id }
13
+ parser.on("--store=MYSHOPIFYDOMAIN") { |url| flags[:shop_domain] = url }
14
+ # backwards compatibility allow 'shop domain' for now
11
15
  parser.on("--shop_domain=MYSHOPIFYDOMAIN") { |url| flags[:shop_domain] = url }
12
16
  parser.on("--shop-domain=MYSHOPIFYDOMAIN") { |url| flags[:shop_domain] = url }
13
- parser.on("--type=APPTYPE") { |url| flags[:type] = url }
17
+ parser.on("--type=APPTYPE") { |type| flags[:type] = type }
14
18
  parser.on("--verbose") { flags[:verbose] = true }
15
19
  end
16
20
 
@@ -45,7 +49,7 @@ module Node
45
49
  partners_url = ShopifyCli::PartnersAPI.partners_url_for(form.organization_id, api_client["id"], local_debug?)
46
50
 
47
51
  @ctx.puts(@ctx.message("apps.create.info.created", form.title, partners_url))
48
- @ctx.puts(@ctx.message("apps.create.info.serve", form.name, ShopifyCli::TOOL_NAME))
52
+ @ctx.puts(@ctx.message("apps.create.info.serve", form.name, ShopifyCli::TOOL_NAME, "node"))
49
53
  unless ShopifyCli::Shopifolk.acting_as_shopify_organization?
50
54
  @ctx.puts(@ctx.message("apps.create.info.install", partners_url, form.title))
51
55
  end
@@ -2,12 +2,22 @@
2
2
  require "shopify_cli"
3
3
 
4
4
  module Node
5
- module Commands
6
- class Deploy < ShopifyCli::Command
7
- subcommand :Heroku, "heroku", Project.project_filepath("commands/deploy/heroku")
5
+ class Command
6
+ class Deploy < ShopifyCli::SubCommand
7
+ prerequisite_task ensure_project_type: :node
8
8
 
9
- def call(*)
10
- @ctx.puts(self.class.help)
9
+ autoload :Heroku, Project.project_filepath("commands/deploy/heroku")
10
+
11
+ HEROKU = "heroku"
12
+
13
+ def call(args, _name)
14
+ subcommand = args.shift
15
+ case subcommand
16
+ when HEROKU
17
+ Node::Command::Deploy::Heroku.start(@ctx)
18
+ else
19
+ @ctx.puts(self.class.help)
20
+ end
11
21
  end
12
22
 
13
23
  def self.help
@@ -2,81 +2,81 @@
2
2
  require "shopify_cli"
3
3
 
4
4
  module Node
5
- module Commands
5
+ class Command
6
6
  class Deploy
7
- class Heroku < ShopifyCli::SubCommand
7
+ class Heroku
8
8
  def self.help
9
9
  ShopifyCli::Context.message("node.deploy.heroku.help", ShopifyCli::TOOL_NAME)
10
10
  end
11
11
 
12
- def call(*)
12
+ def self.start(ctx)
13
13
  spin_group = CLI::UI::SpinGroup.new
14
- heroku_service = ShopifyCli::Heroku.new(@ctx)
14
+ heroku_service = ShopifyCli::Heroku.new(ctx)
15
15
 
16
- spin_group.add(@ctx.message("node.deploy.heroku.downloading")) do |spinner|
16
+ spin_group.add(ctx.message("node.deploy.heroku.downloading")) do |spinner|
17
17
  heroku_service.download
18
- spinner.update_title(@ctx.message("node.deploy.heroku.downloaded"))
18
+ spinner.update_title(ctx.message("node.deploy.heroku.downloaded"))
19
19
  end
20
20
  spin_group.wait
21
21
 
22
- install_message = @ctx.message(
23
- @ctx.windows? ? "node.deploy.heroku.installing_windows" : "node.deploy.heroku.installing"
22
+ install_message = ctx.message(
23
+ ctx.windows? ? "node.deploy.heroku.installing_windows" : "node.deploy.heroku.installing"
24
24
  )
25
25
  spin_group.add(install_message) do |spinner|
26
26
  heroku_service.install
27
- spinner.update_title(@ctx.message("node.deploy.heroku.installed"))
27
+ spinner.update_title(ctx.message("node.deploy.heroku.installed"))
28
28
  end
29
29
  spin_group.wait
30
30
 
31
- spin_group.add(@ctx.message("node.deploy.heroku.git.checking")) do |spinner|
32
- ShopifyCli::Git.init(@ctx)
33
- spinner.update_title(@ctx.message("node.deploy.heroku.git.initialized"))
31
+ spin_group.add(ctx.message("node.deploy.heroku.git.checking")) do |spinner|
32
+ ShopifyCli::Git.init(ctx)
33
+ spinner.update_title(ctx.message("node.deploy.heroku.git.initialized"))
34
34
  end
35
35
  spin_group.wait
36
36
 
37
37
  if (account = heroku_service.whoami)
38
- @ctx.puts(@ctx.message("node.deploy.heroku.authenticated_with_account", account))
38
+ ctx.puts(ctx.message("node.deploy.heroku.authenticated_with_account", account))
39
39
  else
40
40
  CLI::UI::Frame.open(
41
- @ctx.message("node.deploy.heroku.authenticating"),
42
- success_text: @ctx.message("node.deploy.heroku.authenticated")
41
+ ctx.message("node.deploy.heroku.authenticating"),
42
+ success_text: ctx.message("node.deploy.heroku.authenticated")
43
43
  ) do
44
44
  heroku_service.authenticate
45
45
  end
46
46
  end
47
47
 
48
48
  if (app_name = heroku_service.app)
49
- @ctx.puts(@ctx.message("node.deploy.heroku.app.selected", app_name))
49
+ ctx.puts(ctx.message("node.deploy.heroku.app.selected", app_name))
50
50
  else
51
- app_type = CLI::UI::Prompt.ask(@ctx.message("node.deploy.heroku.app.no_apps_found")) do |handler|
52
- handler.option(@ctx.message("node.deploy.heroku.app.create")) { :new }
53
- handler.option(@ctx.message("node.deploy.heroku.app.select")) { :existing }
51
+ app_type = CLI::UI::Prompt.ask(ctx.message("node.deploy.heroku.app.no_apps_found")) do |handler|
52
+ handler.option(ctx.message("node.deploy.heroku.app.create")) { :new }
53
+ handler.option(ctx.message("node.deploy.heroku.app.select")) { :existing }
54
54
  end
55
55
 
56
56
  if app_type == :existing
57
- app_name = CLI::UI::Prompt.ask(@ctx.message("node.deploy.heroku.app.name"))
57
+ app_name = CLI::UI::Prompt.ask(ctx.message("node.deploy.heroku.app.name"))
58
58
  CLI::UI::Frame.open(
59
- @ctx.message("node.deploy.heroku.app.selecting", app_name),
60
- success_text: @ctx.message("node.deploy.heroku.app.selected", app_name)
59
+ ctx.message("node.deploy.heroku.app.selecting", app_name),
60
+ success_text: ctx.message("node.deploy.heroku.app.selected", app_name)
61
61
  ) do
62
62
  heroku_service.select_existing_app(app_name)
63
63
  end
64
64
  elsif app_type == :new
65
65
  CLI::UI::Frame.open(
66
- @ctx.message("node.deploy.heroku.app.creating"),
67
- success_text: @ctx.message("node.deploy.heroku.app.created")
66
+ ctx.message("node.deploy.heroku.app.creating"),
67
+ success_text: ctx.message("node.deploy.heroku.app.created")
68
68
  ) do
69
69
  heroku_service.create_new_app
70
70
  end
71
71
  end
72
72
  end
73
73
 
74
- branches = ShopifyCli::Git.branches(@ctx)
74
+ branches = ShopifyCli::Git.branches(ctx)
75
75
  if branches.length == 1
76
76
  branch_to_deploy = branches[0]
77
- @ctx.puts(@ctx.message("node.deploy.heroku.git.branch_selected", branch_to_deploy))
77
+ ctx.puts(ctx.message("node.deploy.heroku.git.branch_selected", branch_to_deploy))
78
78
  else
79
- branch_to_deploy = CLI::UI::Prompt.ask(@ctx.message("node.deploy.heroku.git.what_branch")) do |handler|
79
+ branch_to_deploy = CLI::UI::Prompt.ask(ctx.message("node.deploy.heroku.git.what_branch")) do |handler|
80
80
  branches.each do |branch|
81
81
  handler.option(branch) { branch }
82
82
  end
@@ -84,8 +84,8 @@ module Node
84
84
  end
85
85
 
86
86
  CLI::UI::Frame.open(
87
- @ctx.message("node.deploy.heroku.deploying"),
88
- success_text: @ctx.message("node.deploy.heroku.deployed")
87
+ ctx.message("node.deploy.heroku.deploying"),
88
+ success_text: ctx.message("node.deploy.heroku.deployed")
89
89
  ) do
90
90
  heroku_service.deploy(branch_to_deploy)
91
91
  end
@@ -2,8 +2,10 @@
2
2
  require "shopify_cli"
3
3
 
4
4
  module Node
5
- module Commands
6
- class Generate < ShopifyCli::Command
5
+ class Command
6
+ class Generate < ShopifyCli::SubCommand
7
+ prerequisite_task ensure_project_type: :node
8
+
7
9
  def call(*)
8
10
  @ctx.puts(self.class.help)
9
11
  end
@@ -1,8 +1,10 @@
1
1
  require "shopify_cli"
2
2
 
3
3
  module Node
4
- module Commands
5
- class Open < ShopifyCli::Command
4
+ class Command
5
+ class Open < ShopifyCli::SubCommand
6
+ prerequisite_task ensure_project_type: :node
7
+
6
8
  def call(*)
7
9
  project = ShopifyCli::Project.current
8
10
  @ctx.open_url!("#{project.env.host}/auth?shop=#{project.env.shop}")
@@ -1,7 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
  module Node
3
- module Commands
4
- class Serve < ShopifyCli::Command
3
+ class Command
4
+ class Serve < ShopifyCli::SubCommand
5
+ prerequisite_task ensure_project_type: :node
5
6
  prerequisite_task :ensure_env, :ensure_dev_store
6
7
 
7
8
  options do |parser, flags|
@@ -3,10 +3,12 @@
3
3
  require "shopify_cli"
4
4
 
5
5
  module Node
6
- module Commands
7
- class Tunnel < ShopifyCli::Command
6
+ class Command
7
+ class Tunnel < ShopifyCli::SubCommand
8
8
  # subcommands :auth, :start, :stop
9
9
 
10
+ prerequisite_task ensure_project_type: :node
11
+
10
12
  def call(args, _name)
11
13
  subcommand = args.shift
12
14
  case subcommand
@@ -4,26 +4,34 @@ module Node
4
4
  module Messages
5
5
  MESSAGES = {
6
6
  node: {
7
+ help: <<~HELP,
8
+ Suite of commands for developing Node.js apps. See {{command:%1$s node <command> --help}} for usage of each command.
9
+ Usage: {{command:%1$s node [ %2$s ]}}
10
+ HELP
11
+
7
12
  error: {
8
13
  generic: "Error",
9
14
  },
10
15
 
11
16
  connect: {
12
17
  connected: "Project now connected to {{green:%s}}",
18
+ help: <<~HELP,
19
+ {{command:%s node connect}}: Connects an existing Node.js app to Shopify CLI. Creates a config file.
20
+ Usage: {{command:%s node connect}}
21
+ HELP
13
22
  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.
23
+ {{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
24
  MESSAGE
16
25
  },
17
26
 
18
27
  create: {
19
28
  help: <<~HELP,
20
- {{command:%s create node}}: Creates an embedded nodejs app.
21
- Usage: {{command:%s create node}}
22
- Options:
23
- {{command:--name=NAME}} App name. Any string.
24
- {{command:--app-url=APPURL}} App URL. Must be a valid URL.
25
- {{command:--organization-id=ID}} Partner organization ID. Must be an existing organization.
26
- {{command:--shop-domain=MYSHOPIFYDOMAIN }} Development store URL. Must be an existing development store.
29
+ {{command:%s node create}}: Creates an embedded nodejs app.
30
+ Usage: {{command:%s node create}}
31
+ Options:
32
+ {{command:--name=NAME}} App name. Any string.
33
+ {{command:--organization-id=ID}} Partner organization ID. Must be an existing organization.
34
+ {{command:--store=MYSHOPIFYDOMAIN }} Development store URL. Must be an existing development store.
27
35
  HELP
28
36
  error: {
29
37
  node_required: "node is required to create an app project. Download at https://nodejs.org/en/download.",
@@ -39,18 +47,18 @@ module Node
39
47
 
40
48
  deploy: {
41
49
  help: <<~HELP,
42
- Deploy the current Node project to a hosting service. Heroku ({{underline:https://www.heroku.com}}) is currently the only option, but more will be added in the future.
43
- Usage: {{command:%s deploy [ heroku ]}}
50
+ Deploy the current Node project to a hosting service. Heroku ({{underline:https://www.heroku.com}}) is currently the only option, but more will be added in the future.
51
+ Usage: {{command:%s node deploy [ heroku ]}}
44
52
  HELP
45
53
  extended_help: <<~HELP,
46
- {{bold:Subcommands:}}
47
- {{cyan:heroku}}: Deploys the current Node project to Heroku.
48
- Usage: {{command:%s deploy heroku}}
54
+ {{bold:Subcommands:}}
55
+ {{cyan:heroku}}: Deploys the current Node project to Heroku.
56
+ Usage: {{command:%s node deploy heroku}}
49
57
  HELP
50
58
  heroku: {
51
59
  help: <<~HELP,
52
- Deploy the current Node project to Heroku
53
- Usage: {{command:%s deploy heroku}}
60
+ Deploy the current Node project to Heroku
61
+ Usage: {{command:%s node deploy heroku}}
54
62
  HELP
55
63
  downloading: "Downloading Heroku CLI…",
56
64
  downloaded: "Downloaded Heroku CLI",
@@ -83,85 +91,34 @@ module Node
83
91
 
84
92
  generate: {
85
93
  help: <<~HELP,
86
- {{red:The {{command:generate}} command is no longer supported.}}
87
- You can complete any tasks previously supported by {{command:generate}} with these guides:
88
- {{green:page}}
89
- Create a page with Polaris design components: {{green:https://shopify.dev/tutorials/build-a-shopify-app-with-node-and-react/build-your-user-interface-with-polaris}}
94
+ {{red:The {{command:generate}} command is no longer supported.}}
95
+ You can complete any tasks previously supported by {{command:generate}} with these guides:
96
+ {{green:page}}
97
+ Create a page with Polaris design components: {{green:https://shopify.dev/tutorials/build-a-shopify-app-with-node-and-react/build-your-user-interface-with-polaris}}
90
98
 
91
- {{green:webhook}}
92
- Register and process webhooks: {{green:https://github.com/Shopify/shopify-node-api/blob/main/docs/usage/webhooks.md}}
99
+ {{green:webhook}}
100
+ Register and process webhooks: {{green:https://github.com/Shopify/shopify-node-api/blob/main/docs/usage/webhooks.md}}
93
101
 
94
- {{green:billing}}
95
- Create and manage app billing models: {{green:https://shopify.dev/tutorials/bill-for-your-app-using-graphql-admin-api}}
102
+ {{green:billing}}
103
+ Create and manage app billing models: {{green:https://shopify.dev/tutorials/bill-for-your-app-using-graphql-admin-api}}
96
104
  HELP
97
105
  },
98
106
 
99
107
  open: {
100
108
  help: <<~HELP,
101
- Open your local development app in the default browser.
102
- Usage: {{command:%s open}}
103
- HELP
104
- },
105
-
106
- populate: {
107
- help: <<~HELP,
108
- Populate your Shopify development store with example customers, orders, or products.
109
- Usage: {{command:%s populate [ customers | draftorders | products ]}}
109
+ Open your local development app in the default browser.
110
+ Usage: {{command:%s node open}}
110
111
  HELP
111
- extended_help: <<~HELP,
112
- {{bold:Subcommands:}}
113
-
114
- {{cyan:customers [options]}}: Add dummy customers to the specified development store.
115
- Usage: {{command:%1$s populate customers}}
116
-
117
- {{cyan:draftorders [options]}}: Add dummy orders to the specified development store.
118
- Usage: {{command:%1$s populate draftorders}}
119
-
120
- {{cyan:products [options]}}: Add dummy products to the specified development store.
121
- Usage: {{command:%1$s populate products}}
122
-
123
- {{bold:Options:}}
124
-
125
- {{cyan:--count [integer]}}: The number of dummy items to populate. Defaults to 5.
126
- {{cyan:--silent}}: Silence the populate output.
127
- {{cyan:--help}}: Display more options specific to each subcommand.
128
-
129
- {{bold:Examples:}}
130
-
131
- {{command:%1$s populate products}}
132
- Populate your development store with 5 additional products.
133
-
134
- {{command:%1$s populate customers --count 30}}
135
- Populate your development store with 30 additional customers.
136
-
137
- {{command:%1$s populate draftorders}}
138
- Populate your development store with 5 additional orders.
139
-
140
- {{command:%1$s populate products --help}}
141
- Display the list of options available to customize the {{command:%1$s populate products}} command.
142
- HELP
143
-
144
- customer: {
145
- added: "%s added to {{green:%s}} at {{underline:%scustomers/%d}}",
146
- },
147
-
148
- draft_order: {
149
- added: "DraftOrder added to {{green:%s}} at {{underline:%sdraft_orders/%d}}",
150
- },
151
-
152
- product: {
153
- added: "%s added to {{green:%s}} at {{underline:%sproducts/%d}}",
154
- },
155
112
  },
156
113
 
157
114
  serve: {
158
115
  help: <<~HELP,
159
- Start a local development node server for your project, as well as a public ngrok tunnel to your localhost.
160
- Usage: {{command:%s serve}}
116
+ Start a local development node server for your project, as well as a public ngrok tunnel to your localhost.
117
+ Usage: {{command:%s node serve}}
161
118
  HELP
162
119
  extended_help: <<~HELP,
163
- {{bold:Options:}}
164
- {{cyan:--host=HOST}}: Bypass running tunnel and use custom host. HOST must be HTTPS url.
120
+ {{bold:Options:}}
121
+ {{cyan:--host=HOST}}: Bypass running tunnel and use custom host. HOST must be HTTPS url.
165
122
  HELP
166
123
 
167
124
  error: {
@@ -172,25 +129,25 @@ module Node
172
129
  {{*}} To install and start using your app, open this URL in your browser:
173
130
  {{green:%s}}
174
131
  MESSAGE
175
- running_server: "Running server...",
132
+ running_server: "Running server",
176
133
  },
177
134
 
178
135
  tunnel: {
179
136
  help: <<~HELP,
180
- Start or stop an http tunnel to your local development app using ngrok.
181
- Usage: {{command:%s tunnel [ auth | start | stop ]}}
137
+ Start or stop an http tunnel to your local development app using ngrok.
138
+ Usage: {{command:%s node tunnel [ auth | start | stop ]}}
182
139
  HELP
183
140
  extended_help: <<~HELP,
184
- {{bold:Subcommands:}}
141
+ {{bold:Subcommands:}}
185
142
 
186
- {{cyan:auth}}: Writes an ngrok auth token to ~/.ngrok2/ngrok.yml to connect with an ngrok account. Visit https://dashboard.ngrok.com/signup to sign up.
187
- Usage: {{command:%1$s tunnel auth <token>}}
143
+ {{cyan:auth}}: Writes an ngrok auth token to ~/.ngrok2/ngrok.yml to connect with an ngrok account. Visit https://dashboard.ngrok.com/signup to sign up.
144
+ Usage: {{command:%1$s node tunnel auth <token>}}
188
145
 
189
- {{cyan:start}}: Starts an ngrok tunnel, will print the URL for an existing tunnel if already running.
190
- Usage: {{command:%1$s tunnel start}}
146
+ {{cyan:start}}: Starts an ngrok tunnel, will print the URL for an existing tunnel if already running.
147
+ Usage: {{command:%1$s node tunnel start}}
191
148
 
192
- {{cyan:stop}}: Stops the ngrok tunnel.
193
- Usage: {{command:%1$s tunnel stop}}
149
+ {{cyan:stop}}: Stops the ngrok tunnel.
150
+ Usage: {{command:%1$s node tunnel stop}}
194
151
 
195
152
  HELP
196
153