shopify-cli 2.6.6 → 2.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (153) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer.json +5 -0
  3. data/.github/DESIGN.md +1 -1
  4. data/.github/ISSUE_TEMPLATE.md +7 -0
  5. data/.vscode/extensions.json +5 -0
  6. data/.vscode/settings.json +9 -0
  7. data/CHANGELOG.md +12 -3
  8. data/CONTRIBUTING.md +1 -29
  9. data/{Dockerfile → Codespace.dockerfile} +0 -0
  10. data/Gemfile.lock +4 -4
  11. data/README.md +20 -99
  12. data/Tests.dockerfile +35 -0
  13. data/assets/logo.png +0 -0
  14. data/dev.yml +0 -3
  15. data/docs/README.md +13 -0
  16. data/docs/contributors/testing.md +27 -0
  17. data/docs/users/installation.md +46 -0
  18. data/{THEMEKIT_MIGRATION.md → docs/users/migrate-from-themekit.md} +1 -1
  19. data/lib/project_types/extension/cli.rb +6 -3
  20. data/lib/project_types/extension/commands/create.rb +5 -6
  21. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  22. data/lib/project_types/extension/features/argo_serve.rb +9 -23
  23. data/lib/project_types/extension/forms/questions/ask_template.rb +1 -5
  24. data/lib/project_types/extension/models/development_server_requirements.rb +2 -3
  25. data/lib/project_types/extension/models/server_config/app.rb +13 -0
  26. data/lib/project_types/extension/models/server_config/development.rb +5 -4
  27. data/lib/project_types/extension/models/server_config/development_renderer.rb +1 -1
  28. data/lib/project_types/extension/models/server_config/development_resource.rb +13 -0
  29. data/lib/project_types/extension/models/server_config/extension.rb +3 -1
  30. data/lib/project_types/extension/models/server_config/root.rb +4 -1
  31. data/lib/project_types/extension/tasks/convert_server_config.rb +65 -0
  32. data/lib/project_types/extension/tasks/ensure_resource_url.rb +39 -0
  33. data/lib/project_types/extension/tasks/merge_server_config.rb +32 -0
  34. data/lib/project_types/extension/tasks/run_extension_command.rb +10 -9
  35. data/lib/project_types/node/cli.rb +0 -16
  36. data/lib/project_types/node/forms/create.rb +5 -5
  37. data/lib/project_types/node/messages/messages.rb +2 -144
  38. data/lib/project_types/php/cli.rb +0 -11
  39. data/lib/project_types/php/forms/create.rb +5 -6
  40. data/lib/project_types/php/messages/messages.rb +2 -161
  41. data/lib/project_types/rails/cli.rb +0 -16
  42. data/lib/project_types/rails/commands/create.rb +1 -1
  43. data/lib/project_types/rails/forms/create.rb +5 -6
  44. data/lib/project_types/rails/messages/messages.rb +6 -151
  45. data/lib/project_types/script/cli.rb +1 -1
  46. data/lib/project_types/script/commands/create.rb +1 -1
  47. data/lib/project_types/script/commands/push.rb +1 -1
  48. data/lib/project_types/theme/cli.rb +1 -1
  49. data/lib/project_types/theme/commands/check.rb +1 -1
  50. data/lib/project_types/theme/commands/delete.rb +1 -1
  51. data/lib/project_types/theme/commands/init.rb +1 -1
  52. data/lib/project_types/theme/commands/language_server.rb +1 -1
  53. data/lib/project_types/theme/commands/package.rb +1 -1
  54. data/lib/project_types/theme/commands/publish.rb +1 -1
  55. data/lib/project_types/theme/commands/pull.rb +1 -1
  56. data/lib/project_types/theme/commands/push.rb +1 -1
  57. data/lib/project_types/theme/commands/serve.rb +9 -3
  58. data/lib/project_types/theme/messages/messages.rb +5 -1
  59. data/lib/shopify_cli/admin_api/populate_resource_command.rb +1 -1
  60. data/lib/shopify_cli/api.rb +7 -2
  61. data/lib/shopify_cli/app_type_detector.rb +24 -20
  62. data/lib/shopify_cli/command/app_sub_command.rb +10 -0
  63. data/lib/shopify_cli/command/project_command.rb +18 -0
  64. data/lib/shopify_cli/command/sub_command.rb +19 -0
  65. data/lib/shopify_cli/command.rb +7 -2
  66. data/lib/shopify_cli/commands/app/connect.rb +22 -0
  67. data/lib/shopify_cli/commands/app/create/node.rb +38 -0
  68. data/lib/shopify_cli/commands/app/create/php.rb +36 -0
  69. data/lib/shopify_cli/commands/app/create/rails.rb +40 -0
  70. data/lib/shopify_cli/commands/app/create.rb +28 -0
  71. data/lib/shopify_cli/commands/app/deploy.rb +49 -0
  72. data/lib/shopify_cli/commands/app/open.rb +19 -0
  73. data/lib/shopify_cli/commands/app/serve.rb +49 -0
  74. data/lib/shopify_cli/commands/app/tunnel.rb +43 -0
  75. data/lib/shopify_cli/commands/app.rb +29 -0
  76. data/lib/shopify_cli/commands/config.rb +2 -2
  77. data/lib/shopify_cli/commands.rb +1 -0
  78. data/lib/shopify_cli/constants.rb +4 -0
  79. data/lib/shopify_cli/exception_reporter.rb +3 -4
  80. data/lib/shopify_cli/git.rb +12 -1
  81. data/lib/shopify_cli/github/issue_url_generator.rb +19 -0
  82. data/lib/shopify_cli/github.rb +5 -0
  83. data/lib/shopify_cli/messages/messages.rb +252 -8
  84. data/lib/shopify_cli/project.rb +5 -1
  85. data/lib/shopify_cli/project_commands.rb +1 -1
  86. data/lib/shopify_cli/services/app/connect_service.rb +25 -0
  87. data/lib/shopify_cli/services/app/create/node_service.rb +153 -0
  88. data/lib/shopify_cli/services/app/create/php_service.rb +152 -0
  89. data/lib/shopify_cli/services/app/create/rails_service.rb +213 -0
  90. data/lib/shopify_cli/services/app/deploy/heroku/node_service.rb +101 -0
  91. data/lib/shopify_cli/services/app/deploy/heroku/php_service.rb +135 -0
  92. data/lib/shopify_cli/services/app/deploy/heroku/rails_service.rb +120 -0
  93. data/lib/shopify_cli/services/app/open_service.rb +19 -0
  94. data/lib/shopify_cli/services/app/serve/node_service.rb +42 -0
  95. data/lib/shopify_cli/services/app/serve/php_service.rb +46 -0
  96. data/lib/shopify_cli/services/app/serve/rails_service.rb +48 -0
  97. data/lib/shopify_cli/services/app/tunnel/auth_service.rb +21 -0
  98. data/lib/shopify_cli/services/app/tunnel/start_service.rb +20 -0
  99. data/lib/shopify_cli/services/app/tunnel/stop_service.rb +20 -0
  100. data/lib/shopify_cli/services.rb +31 -0
  101. data/lib/shopify_cli/theme/dev_server/local_assets.rb +1 -1
  102. data/lib/shopify_cli/theme/dev_server.rb +8 -2
  103. data/lib/shopify_cli/version.rb +1 -1
  104. data/lib/shopify_cli.rb +1 -2
  105. data/shopify-cli.gemspec +1 -1
  106. data/shopify-dev +18 -0
  107. data/utilities/constants.rb +7 -0
  108. data/utilities/docker/container.rb +10 -3
  109. data/utilities/docker.rb +2 -2
  110. data/utilities/utilities.rb +1 -0
  111. metadata +49 -48
  112. data/docs/_config.yml +0 -2
  113. data/docs/app/node/commands/index.md +0 -4
  114. data/docs/app/node/index.md +0 -4
  115. data/docs/app/rails/commands/index.md +0 -4
  116. data/docs/app/rails/index.md +0 -4
  117. data/docs/core/index.md +0 -4
  118. data/docs/getting-started/index.md +0 -4
  119. data/docs/getting-started/install/index.md +0 -4
  120. data/docs/getting-started/migrate/index.md +0 -4
  121. data/docs/getting-started/uninstall/index.md +0 -4
  122. data/docs/getting-started/upgrade/index.md +0 -4
  123. data/docs/help/start-app/index.md +0 -4
  124. data/docs/index.md +0 -4
  125. data/install.sh +0 -7
  126. data/lib/project_types/extension/tasks/converters/server_config_converter.rb +0 -30
  127. data/lib/project_types/extension/tasks/load_server_config.rb +0 -28
  128. data/lib/project_types/node/commands/connect.rb +0 -21
  129. data/lib/project_types/node/commands/create.rb +0 -125
  130. data/lib/project_types/node/commands/deploy/heroku.rb +0 -96
  131. data/lib/project_types/node/commands/deploy.rb +0 -32
  132. data/lib/project_types/node/commands/generate.rb +0 -22
  133. data/lib/project_types/node/commands/open.rb +0 -18
  134. data/lib/project_types/node/commands/serve.rb +0 -45
  135. data/lib/project_types/node/commands/tunnel.rb +0 -41
  136. data/lib/project_types/php/commands/connect.rb +0 -19
  137. data/lib/project_types/php/commands/create.rb +0 -143
  138. data/lib/project_types/php/commands/deploy/heroku.rb +0 -129
  139. data/lib/project_types/php/commands/deploy.rb +0 -32
  140. data/lib/project_types/php/commands/open.rb +0 -16
  141. data/lib/project_types/php/commands/serve.rb +0 -48
  142. data/lib/project_types/php/commands/tunnel.rb +0 -37
  143. data/lib/project_types/rails/commands/connect.rb +0 -21
  144. data/lib/project_types/rails/commands/deploy/heroku.rb +0 -115
  145. data/lib/project_types/rails/commands/deploy.rb +0 -32
  146. data/lib/project_types/rails/commands/generate/webhook.rb +0 -42
  147. data/lib/project_types/rails/commands/generate.rb +0 -60
  148. data/lib/project_types/rails/commands/open.rb +0 -18
  149. data/lib/project_types/rails/commands/serve.rb +0 -51
  150. data/lib/project_types/rails/commands/tunnel.rb +0 -41
  151. data/lib/shopify_cli/sub_command.rb +0 -17
  152. data/shopify.fish +0 -12
  153. data/shopify.sh +0 -11
@@ -0,0 +1,38 @@
1
+ module ShopifyCLI
2
+ module Commands
3
+ class App
4
+ class Create
5
+ class Node < ShopifyCLI::Command::AppSubCommand
6
+ unless ShopifyCLI::Environment.acceptance_test?
7
+ prerequisite_task :ensure_authenticated
8
+ end
9
+
10
+ options do |parser, flags|
11
+ parser.on("--name=NAME") { |t| flags[:name] = t }
12
+ parser.on("--organization-id=ID") { |id| flags[:organization_id] = id }
13
+ parser.on("--store-domain=MYSHOPIFYDOMAIN") { |url| flags[:store_domain] = url }
14
+ parser.on("--type=APPTYPE") { |type| flags[:type] = type }
15
+ parser.on("--verbose") { flags[:verbose] = true }
16
+ end
17
+
18
+ def call(*)
19
+ Services::App::Create::NodeService.call(
20
+ name: options.flags[:name],
21
+ organization_id: options.flags[:organization_id],
22
+ store_domain: options.flags[:store_domain],
23
+ type: options.flags[:type],
24
+ verbose: !options.flags[:verbose].nil?,
25
+ context: @ctx
26
+ )
27
+ end
28
+
29
+ class << self
30
+ def help
31
+ ShopifyCLI::Context.message("core.app.create.node.help", ShopifyCLI::TOOL_NAME, ShopifyCLI::TOOL_NAME)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,36 @@
1
+ module ShopifyCLI
2
+ module Commands
3
+ class App
4
+ class Create
5
+ class PHP < ShopifyCLI::Command::AppSubCommand
6
+ prerequisite_task :ensure_authenticated
7
+
8
+ options do |parser, flags|
9
+ parser.on("--name=NAME") { |name| flags[:name] = name }
10
+ parser.on("--organization-id=ID") { |organization_id| flags[:organization_id] = organization_id }
11
+ parser.on("--store-domain=MYSHOPIFYDOMAIN") { |url| flags[:store_domain] = url }
12
+ parser.on("--type=APPTYPE") { |type| flags[:type] = type }
13
+ parser.on("--verbose") { flags[:verbose] = true }
14
+ end
15
+
16
+ def call(*)
17
+ Services::App::Create::PHPService.call(
18
+ name: options.flags[:name],
19
+ organization_id: options.flags[:organization_id],
20
+ store_domain: options.flags[:store_domain],
21
+ type: options.flags[:type],
22
+ verbose: !options.flags[:verbose].nil?,
23
+ context: @ctx
24
+ )
25
+ end
26
+
27
+ class << self
28
+ def help
29
+ ShopifyCLI::Context.message("core.app.create.php.help", ShopifyCLI::TOOL_NAME, ShopifyCLI::TOOL_NAME)
30
+ end
31
+ end
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,40 @@
1
+ module ShopifyCLI
2
+ module Commands
3
+ class App
4
+ class Create
5
+ class Rails < ShopifyCLI::Command::AppSubCommand
6
+ unless ShopifyCLI::Environment.acceptance_test?
7
+ prerequisite_task :ensure_authenticated
8
+ end
9
+
10
+ options do |parser, flags|
11
+ parser.on("--name=NAME") { |t| flags[:name] = t }
12
+ parser.on("--organization-id=ID") { |id| flags[:organization_id] = id }
13
+ parser.on("--store-domain=MYSHOPIFYDOMAIN") { |url| flags[:store_domain] = url }
14
+ parser.on("--type=APPTYPE") { |type| flags[:type] = type }
15
+ parser.on("--db=DB") { |db| flags[:db] = db }
16
+ parser.on("--rails-opts=RAILSOPTS") { |opts| flags[:rails_opts] = opts }
17
+ end
18
+
19
+ def call(*)
20
+ Services::App::Create::RailsService.call(
21
+ name: options.flags[:name],
22
+ organization_id: options.flags[:organization_id],
23
+ store_domain: options.flags[:store_domain],
24
+ type: options.flags[:type],
25
+ db: options.flags[:db],
26
+ rails_opts: options.flags[:rails_opts],
27
+ context: @ctx
28
+ )
29
+ end
30
+
31
+ class << self
32
+ def help
33
+ ShopifyCLI::Context.message("core.app.create.rails.help", ShopifyCLI::TOOL_NAME, ShopifyCLI::TOOL_NAME)
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,28 @@
1
+ module ShopifyCLI
2
+ module Commands
3
+ class App
4
+ class Create < ShopifyCLI::Command
5
+ subcommand :Rails, "rails", "shopify_cli/commands/app/create/rails"
6
+ subcommand :PHP, "php", "shopify_cli/commands/app/create/php"
7
+ subcommand :Node, "node", "shopify_cli/commands/app/create/node"
8
+
9
+ def call(_args, _command_name)
10
+ @ctx.puts(self.class.help)
11
+ end
12
+
13
+ def self.help
14
+ ShopifyCLI::Context.message("core.app.create.help", ShopifyCLI::TOOL_NAME, ShopifyCLI::TOOL_NAME)
15
+ end
16
+
17
+ def self.call_help(*)
18
+ output = help
19
+ if respond_to?(:extended_help)
20
+ output += "\n"
21
+ output += extended_help
22
+ end
23
+ @ctx.puts(output)
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,49 @@
1
+ module ShopifyCLI
2
+ module Commands
3
+ class App
4
+ class Deploy < ShopifyCLI::Command::AppSubCommand
5
+ subcommand :Heroku, "heroku", "shopify_cli/commands/app/deploy/heroku"
6
+
7
+ def call(args, _name)
8
+ platform = args.shift
9
+ case platform
10
+ when "heroku"
11
+ case detect_app
12
+ when :rails
13
+ Services::App::Deploy::Heroku::RailsService.call(
14
+ context: @ctx
15
+ )
16
+ when :php
17
+ Services::App::Deploy::Heroku::PHPService.call(
18
+ context: @ctx
19
+ )
20
+ when :node
21
+ Services::App::Deploy::Heroku::NodeService.call(
22
+ context: @ctx
23
+ )
24
+ end
25
+ when nil
26
+ raise ShopifyCLI::Abort, @ctx.message(
27
+ "core.app.deploy.error.missing_platform",
28
+ ShopifyCLI::TOOL_NAME
29
+ )
30
+ else
31
+ raise ShopifyCLI::Abort, @ctx.message(
32
+ "core.app.deploy.error.invalid_platform",
33
+ platform,
34
+ ShopifyCLI::TOOL_NAME
35
+ )
36
+ end
37
+ end
38
+
39
+ def self.help
40
+ ShopifyCLI::Context.message("core.app.deploy.help", ShopifyCLI::TOOL_NAME, ShopifyCLI::TOOL_NAME)
41
+ end
42
+
43
+ def self.extended_help
44
+ ShopifyCLI::Context.message("core.app.deploy.extended_help", ShopifyCLI::TOOL_NAME)
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,19 @@
1
+ module ShopifyCLI
2
+ module Commands
3
+ class App
4
+ class Open < ShopifyCLI::Command::AppSubCommand
5
+ def call(*)
6
+ project = ShopifyCLI::Project.current
7
+ Services::App::OpenService.call(
8
+ project: project,
9
+ context: @ctx
10
+ )
11
+ end
12
+
13
+ def self.help
14
+ ShopifyCLI::Context.message("core.app.open.help", ShopifyCLI::TOOL_NAME, ShopifyCLI::TOOL_NAME)
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,49 @@
1
+ module ShopifyCLI
2
+ module Commands
3
+ class App
4
+ class Serve < ShopifyCLI::Command::AppSubCommand
5
+ include ShopifyCLI::CommandOptions::CommandServeOptions
6
+
7
+ prerequisite_task :ensure_env, :ensure_dev_store
8
+
9
+ options do |parser, flags|
10
+ parser.on("--host=HOST") do |h|
11
+ flags[:host] = h.gsub('"', "")
12
+ end
13
+ parser.on("--port=PORT") { |port| flags[:port] = port }
14
+ end
15
+
16
+ def call(*)
17
+ case detect_app
18
+ when :rails
19
+ Services::App::Serve::RailsService.call(
20
+ host: host,
21
+ port: port,
22
+ context: @ctx
23
+ )
24
+ when :node
25
+ Services::App::Serve::NodeService.call(
26
+ host: host,
27
+ port: port,
28
+ context: @ctx
29
+ )
30
+ when :php
31
+ Services::App::Serve::PHPService.call(
32
+ host: host,
33
+ port: port,
34
+ context: @ctx
35
+ )
36
+ end
37
+ end
38
+
39
+ def self.help
40
+ ShopifyCLI::Context.message("core.app.serve.help", ShopifyCLI::TOOL_NAME, ShopifyCLI::TOOL_NAME)
41
+ end
42
+
43
+ def self.extended_help
44
+ ShopifyCLI::Context.message("app.core.serve.extended_help")
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
@@ -0,0 +1,43 @@
1
+ require "project_types/node/cli"
2
+
3
+ module ShopifyCLI
4
+ module Commands
5
+ class App
6
+ class Tunnel < ShopifyCLI::Command::AppSubCommand
7
+ def call(args, _name)
8
+ subcommand = args.shift
9
+ case subcommand
10
+ when "auth"
11
+ token = args.shift
12
+ if token.nil?
13
+ raise ShopifyCLI::Abort, @ctx.message("core.app.tunnel.error.token_argument_missing")
14
+ else
15
+ Services::App::Tunnel::AuthService.call(
16
+ token: token,
17
+ context: @ctx
18
+ )
19
+ end
20
+ when "start"
21
+ Services::App::Tunnel::StartService.call(
22
+ context: @ctx
23
+ )
24
+ when "stop"
25
+ Services::App::Tunnel::StopService.call(
26
+ context: @ctx
27
+ )
28
+ else
29
+ @ctx.puts(self.class.help)
30
+ end
31
+ end
32
+
33
+ def self.help
34
+ ShopifyCLI::Context.message("core.app.tunnel.help", ShopifyCLI::TOOL_NAME, ShopifyCLI::TOOL_NAME)
35
+ end
36
+
37
+ def self.extended_help
38
+ ShopifyCLI::Context.message("core.app.tunnel.extended_help", ShopifyCLI::TOOL_NAME)
39
+ end
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,29 @@
1
+ require "shopify_cli"
2
+
3
+ module ShopifyCLI
4
+ module Commands
5
+ class App < ShopifyCLI::Command
6
+ subcommand :Connect, "connect", "shopify_cli/commands/app/connect"
7
+ subcommand :Create, "create", "shopify_cli/commands/app/create"
8
+ subcommand :Deploy, "deploy", "shopify_cli/commands/app/deploy"
9
+ subcommand :Open, "open", "shopify_cli/commands/app/open"
10
+ subcommand :Serve, "serve", "shopify_cli/commands/app/serve"
11
+ subcommand :Tunnel, "tunnel", "shopify_cli/commands/app/tunnel"
12
+
13
+ def call(*)
14
+ @ctx.puts(self.class.help)
15
+ end
16
+
17
+ class << self
18
+ def help
19
+ subcommands = subcommand_registry.command_names.join(" | ")
20
+ ShopifyCLI::Context.message("core.app.help", ShopifyCLI::TOOL_NAME, subcommands)
21
+ end
22
+
23
+ def call_help(*)
24
+ @ctx.puts(help)
25
+ end
26
+ end
27
+ end
28
+ end
29
+ end
@@ -16,7 +16,7 @@ module ShopifyCLI
16
16
  ShopifyCLI::Context.message("core.config.help", ShopifyCLI::TOOL_NAME)
17
17
  end
18
18
 
19
- class Feature < ShopifyCLI::SubCommand
19
+ class Feature < ShopifyCLI::Command::SubCommand
20
20
  def self.help
21
21
  ShopifyCLI::Context.message("core.config.feature.help", ShopifyCLI::TOOL_NAME)
22
22
  end
@@ -45,7 +45,7 @@ module ShopifyCLI
45
45
  end
46
46
  end
47
47
 
48
- class Analytics < ShopifyCLI::SubCommand
48
+ class Analytics < ShopifyCLI::Command::SubCommand
49
49
  def self.help
50
50
  ShopifyCLI::Context.message("core.config.analytics.help", ShopifyCLI::TOOL_NAME)
51
51
  end
@@ -29,6 +29,7 @@ module ShopifyCLI
29
29
  register :System, "system", "shopify_cli/commands/system", true
30
30
  register :Version, "version", "shopify_cli/commands/version", true
31
31
  register :Whoami, "whoami", "shopify_cli/commands/whoami", true
32
+ register :App, "app", "shopify_cli/commands/app", true
32
33
 
33
34
  autoload :Connect, "shopify_cli/commands/connect"
34
35
  end
@@ -4,6 +4,10 @@ module ShopifyCLI
4
4
  ROOT = File.expand_path("../..", __dir__)
5
5
  end
6
6
 
7
+ module Files
8
+ SHOPIFY_CLI_YML = ".shopify-cli.yml"
9
+ end
10
+
7
11
  module StoreKeys
8
12
  LAST_MIGRATION_DATE = :last_migration_date
9
13
  ANALYTICS_ENABLED = :analytics_enabled
@@ -2,10 +2,10 @@ module ShopifyCLI
2
2
  module ExceptionReporter
3
3
  def self.report(error, _logs = nil, _api_key = nil, custom_metadata = {})
4
4
  context = ShopifyCLI::Context.new
5
-
6
5
  unless ShopifyCLI::Environment.development?
7
6
  context.puts(context.message("core.error_reporting.unhandled_error.message"))
8
- context.puts(context.message("core.error_reporting.unhandled_error.issue_message"))
7
+ context.puts(context.message("core.error_reporting.unhandled_error.issue_message",
8
+ ShopifyCLI::GitHub::IssueURLGenerator.error_url(error)))
9
9
  end
10
10
 
11
11
  # Stack trace hint
@@ -17,8 +17,8 @@ module ShopifyCLI
17
17
  context.puts("\n")
18
18
 
19
19
  return unless reportable_error?(error)
20
- return unless report?(context: context)
21
20
 
21
+ return unless report?(context: context)
22
22
  ENV["BUGSNAG_DISABLE_AUTOCONFIGURE"] = "1"
23
23
  require "bugsnag"
24
24
 
@@ -48,7 +48,6 @@ module ShopifyCLI
48
48
  unless ReportingConfigurationController.reporting_prompted?
49
49
  ReportingConfigurationController.check_or_prompt_report_automatically(source: :uncaught_error)
50
50
  end
51
-
52
51
  report_error
53
52
  end
54
53
 
@@ -4,6 +4,12 @@ module ShopifyCLI
4
4
  # git.
5
5
  class Git
6
6
  class << self
7
+ # Check if Git is available in the environment
8
+ def available?(ctx)
9
+ _output, status = ctx.capture2e("git", "status")
10
+ status.success?
11
+ end
12
+
7
13
  ##
8
14
  # will return the current sha of the cli repo
9
15
  #
@@ -20,8 +26,13 @@ module ShopifyCLI
20
26
  #
21
27
  # ShopifyCLI::Git.sha
22
28
  #
29
+ # Some environments don't have git in PATH and this prevents
30
+ # the execution from raising an error
31
+ # https://app.bugsnag.com/shopify/shopify-cli/errors/615dd36365ce57000889d4c5
23
32
  def sha(dir: Dir.pwd, ctx: Context.new)
24
- rev_parse("HEAD", dir: dir, ctx: ctx)
33
+ if available?(ctx)
34
+ rev_parse("HEAD", dir: dir, ctx: ctx)
35
+ end
25
36
  end
26
37
 
27
38
  ##
@@ -0,0 +1,19 @@
1
+ module ShopifyCLI
2
+ module GitHub
3
+ module IssueURLGenerator
4
+ def self.error_url(error)
5
+ title = "#{error.class}: #{error.message}"
6
+ labels = "type:bug"
7
+ content = File.read(File.join(ShopifyCLI::ROOT, ".github/ISSUE_TEMPLATE.md"))
8
+
9
+ # take at most 5 lines from backtrace
10
+ stacktrace = error.backtrace.length < 5 ? error.backtrace : error.backtrace[0..4]
11
+ body = stacktrace.join("\n").to_s
12
+ output = content.gsub(/<!--Stacktrace(.|\n)*-->/, body)
13
+ query = URI.encode_www_form({ title: title, body: output, labels: labels })
14
+ url = "#{ShopifyCLI::Constants::Links::NEW_ISSUE}?#{query}"
15
+ url
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ module ShopifyCLI
2
+ module GitHub
3
+ autoload :IssueURLGenerator, "shopify_cli/github/issue_url_generator"
4
+ end
5
+ end