shopify-cli 2.6.4 → 2.7.1

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 (181) 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/.gitignore +1 -0
  6. data/.vscode/extensions.json +5 -0
  7. data/.vscode/settings.json +9 -0
  8. data/CHANGELOG.md +35 -3
  9. data/CONTRIBUTING.md +1 -21
  10. data/{Dockerfile → Codespace.dockerfile} +11 -3
  11. data/Gemfile +1 -0
  12. data/Gemfile.lock +6 -4
  13. data/README.md +20 -99
  14. data/Rakefile +27 -0
  15. data/Tests.dockerfile +35 -0
  16. data/assets/logo.png +0 -0
  17. data/dev.yml +0 -3
  18. data/docs/README.md +13 -0
  19. data/docs/contributors/testing.md +27 -0
  20. data/docs/users/installation.md +46 -0
  21. data/{THEMEKIT_MIGRATION.md → docs/users/migrate-from-themekit.md} +1 -1
  22. data/ext/javy/javy.rb +186 -0
  23. data/ext/javy/version +1 -0
  24. data/lib/project_types/extension/cli.rb +7 -3
  25. data/lib/project_types/extension/commands/build.rb +1 -0
  26. data/lib/project_types/extension/commands/create.rb +6 -6
  27. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  28. data/lib/project_types/extension/features/argo.rb +1 -8
  29. data/lib/project_types/extension/features/argo_serve.rb +9 -23
  30. data/lib/project_types/extension/forms/create.rb +1 -1
  31. data/lib/project_types/extension/forms/questions/ask_template.rb +3 -6
  32. data/lib/project_types/extension/messages/messages.rb +1 -0
  33. data/lib/project_types/extension/models/development_server_requirements.rb +2 -3
  34. data/lib/project_types/extension/models/server_config/app.rb +13 -0
  35. data/lib/project_types/extension/models/server_config/development.rb +5 -4
  36. data/lib/project_types/extension/models/server_config/development_renderer.rb +1 -1
  37. data/lib/project_types/extension/models/server_config/development_resource.rb +13 -0
  38. data/lib/project_types/extension/models/server_config/extension.rb +4 -0
  39. data/lib/project_types/extension/models/server_config/root.rb +4 -1
  40. data/lib/project_types/extension/tasks/convert_server_config.rb +65 -0
  41. data/lib/project_types/extension/tasks/ensure_resource_url.rb +39 -0
  42. data/lib/project_types/extension/tasks/find_package_from_json.rb +37 -0
  43. data/lib/project_types/extension/tasks/merge_server_config.rb +32 -0
  44. data/lib/project_types/extension/tasks/run_extension_command.rb +11 -10
  45. data/lib/project_types/node/cli.rb +0 -16
  46. data/lib/project_types/node/forms/create.rb +5 -5
  47. data/lib/project_types/node/messages/messages.rb +2 -144
  48. data/lib/project_types/php/cli.rb +0 -11
  49. data/lib/project_types/php/forms/create.rb +5 -6
  50. data/lib/project_types/php/messages/messages.rb +2 -161
  51. data/lib/project_types/rails/cli.rb +0 -16
  52. data/lib/project_types/rails/commands/create.rb +46 -17
  53. data/lib/project_types/rails/forms/create.rb +5 -7
  54. data/lib/project_types/rails/messages/messages.rb +6 -151
  55. data/lib/project_types/script/cli.rb +2 -1
  56. data/lib/project_types/script/commands/create.rb +2 -5
  57. data/lib/project_types/script/commands/javy.rb +31 -0
  58. data/lib/project_types/script/commands/push.rb +1 -1
  59. data/lib/project_types/script/config/extension_points.yml +3 -0
  60. data/lib/project_types/script/errors.rb +0 -18
  61. data/lib/project_types/script/layers/application/create_script.rb +2 -2
  62. data/lib/project_types/script/layers/domain/script_json.rb +1 -1
  63. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +0 -4
  64. data/lib/project_types/script/layers/infrastructure/errors.rb +8 -3
  65. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb +22 -3
  66. data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +25 -0
  67. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +3 -4
  68. data/lib/project_types/script/layers/infrastructure/script_service.rb +1 -1
  69. data/lib/project_types/script/messages/messages.rb +16 -22
  70. data/lib/project_types/script/ui/error_handler.rb +1 -27
  71. data/lib/project_types/theme/cli.rb +1 -1
  72. data/lib/project_types/theme/commands/check.rb +1 -1
  73. data/lib/project_types/theme/commands/delete.rb +1 -1
  74. data/lib/project_types/theme/commands/init.rb +1 -1
  75. data/lib/project_types/theme/commands/language_server.rb +1 -1
  76. data/lib/project_types/theme/commands/package.rb +1 -1
  77. data/lib/project_types/theme/commands/publish.rb +1 -1
  78. data/lib/project_types/theme/commands/pull.rb +1 -1
  79. data/lib/project_types/theme/commands/push.rb +1 -1
  80. data/lib/project_types/theme/commands/serve.rb +9 -2
  81. data/lib/project_types/theme/messages/messages.rb +30 -1
  82. data/lib/shopify_cli/admin_api/populate_resource_command.rb +1 -1
  83. data/lib/shopify_cli/api.rb +7 -2
  84. data/lib/shopify_cli/app_type_detector.rb +24 -20
  85. data/lib/shopify_cli/command/app_sub_command.rb +10 -0
  86. data/lib/shopify_cli/command/project_command.rb +18 -0
  87. data/lib/shopify_cli/command/sub_command.rb +19 -0
  88. data/lib/shopify_cli/command.rb +7 -2
  89. data/lib/shopify_cli/commands/app/connect.rb +22 -0
  90. data/lib/shopify_cli/commands/app/create/node.rb +38 -0
  91. data/lib/shopify_cli/commands/app/create/php.rb +36 -0
  92. data/lib/shopify_cli/commands/app/create/rails.rb +40 -0
  93. data/lib/shopify_cli/commands/app/create.rb +28 -0
  94. data/lib/shopify_cli/commands/app/deploy.rb +49 -0
  95. data/lib/shopify_cli/commands/app/open.rb +19 -0
  96. data/lib/shopify_cli/commands/app/serve.rb +49 -0
  97. data/lib/shopify_cli/commands/app/tunnel.rb +43 -0
  98. data/lib/shopify_cli/commands/app.rb +29 -0
  99. data/lib/shopify_cli/commands/config.rb +2 -2
  100. data/lib/shopify_cli/commands.rb +1 -0
  101. data/lib/shopify_cli/constants.rb +4 -0
  102. data/lib/shopify_cli/exception_reporter.rb +8 -6
  103. data/lib/shopify_cli/git.rb +12 -1
  104. data/lib/shopify_cli/github/issue_url_generator.rb +19 -0
  105. data/lib/shopify_cli/github.rb +5 -0
  106. data/lib/shopify_cli/messages/messages.rb +253 -9
  107. data/lib/shopify_cli/migrator.rb +9 -11
  108. data/lib/shopify_cli/project.rb +5 -1
  109. data/lib/shopify_cli/project_commands.rb +1 -1
  110. data/lib/shopify_cli/services/app/connect_service.rb +25 -0
  111. data/lib/shopify_cli/services/app/create/node_service.rb +155 -0
  112. data/lib/shopify_cli/services/app/create/php_service.rb +152 -0
  113. data/lib/shopify_cli/services/app/create/rails_service.rb +215 -0
  114. data/lib/shopify_cli/services/app/deploy/heroku/node_service.rb +101 -0
  115. data/lib/shopify_cli/services/app/deploy/heroku/php_service.rb +135 -0
  116. data/lib/shopify_cli/services/app/deploy/heroku/rails_service.rb +120 -0
  117. data/lib/shopify_cli/services/app/open_service.rb +19 -0
  118. data/lib/shopify_cli/services/app/serve/node_service.rb +42 -0
  119. data/lib/shopify_cli/services/app/serve/php_service.rb +46 -0
  120. data/lib/shopify_cli/services/app/serve/rails_service.rb +48 -0
  121. data/lib/shopify_cli/services/app/tunnel/auth_service.rb +21 -0
  122. data/lib/shopify_cli/services/app/tunnel/start_service.rb +20 -0
  123. data/lib/shopify_cli/services/app/tunnel/stop_service.rb +20 -0
  124. data/lib/shopify_cli/services.rb +31 -0
  125. data/lib/shopify_cli/theme/dev_server/local_assets.rb +1 -1
  126. data/lib/shopify_cli/theme/dev_server.rb +35 -17
  127. data/lib/shopify_cli/tunnel.rb +25 -20
  128. data/lib/shopify_cli/version.rb +1 -1
  129. data/lib/shopify_cli.rb +1 -2
  130. data/shopify-cli.gemspec +2 -6
  131. data/shopify-dev +18 -0
  132. data/utilities/constants.rb +7 -0
  133. data/utilities/docker/container.rb +30 -2
  134. data/utilities/docker.rb +3 -2
  135. data/utilities/utilities.rb +1 -0
  136. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +1 -1
  137. metadata +56 -53
  138. data/docs/_config.yml +0 -2
  139. data/docs/app/node/commands/index.md +0 -4
  140. data/docs/app/node/index.md +0 -4
  141. data/docs/app/rails/commands/index.md +0 -4
  142. data/docs/app/rails/index.md +0 -4
  143. data/docs/core/index.md +0 -4
  144. data/docs/getting-started/index.md +0 -4
  145. data/docs/getting-started/install/index.md +0 -4
  146. data/docs/getting-started/migrate/index.md +0 -4
  147. data/docs/getting-started/uninstall/index.md +0 -4
  148. data/docs/getting-started/upgrade/index.md +0 -4
  149. data/docs/help/start-app/index.md +0 -4
  150. data/docs/index.md +0 -4
  151. data/ext/shopify-cli/extconf.rb +0 -60
  152. data/install.sh +0 -7
  153. data/lib/project_types/extension/tasks/converters/server_config_converter.rb +0 -31
  154. data/lib/project_types/extension/tasks/load_server_config.rb +0 -23
  155. data/lib/project_types/node/commands/connect.rb +0 -21
  156. data/lib/project_types/node/commands/create.rb +0 -125
  157. data/lib/project_types/node/commands/deploy/heroku.rb +0 -96
  158. data/lib/project_types/node/commands/deploy.rb +0 -32
  159. data/lib/project_types/node/commands/generate.rb +0 -22
  160. data/lib/project_types/node/commands/open.rb +0 -18
  161. data/lib/project_types/node/commands/serve.rb +0 -45
  162. data/lib/project_types/node/commands/tunnel.rb +0 -41
  163. data/lib/project_types/php/commands/connect.rb +0 -19
  164. data/lib/project_types/php/commands/create.rb +0 -143
  165. data/lib/project_types/php/commands/deploy/heroku.rb +0 -129
  166. data/lib/project_types/php/commands/deploy.rb +0 -32
  167. data/lib/project_types/php/commands/open.rb +0 -16
  168. data/lib/project_types/php/commands/serve.rb +0 -48
  169. data/lib/project_types/php/commands/tunnel.rb +0 -37
  170. data/lib/project_types/rails/commands/connect.rb +0 -21
  171. data/lib/project_types/rails/commands/deploy/heroku.rb +0 -115
  172. data/lib/project_types/rails/commands/deploy.rb +0 -32
  173. data/lib/project_types/rails/commands/generate/webhook.rb +0 -42
  174. data/lib/project_types/rails/commands/generate.rb +0 -60
  175. data/lib/project_types/rails/commands/open.rb +0 -18
  176. data/lib/project_types/rails/commands/serve.rb +0 -51
  177. data/lib/project_types/rails/commands/tunnel.rb +0 -41
  178. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +0 -0
  179. data/lib/shopify_cli/sub_command.rb +0 -17
  180. data/shopify.fish +0 -12
  181. data/shopify.sh +0 -11
@@ -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
 
@@ -31,9 +31,12 @@ module ShopifyCLI
31
31
  config.auto_capture_sessions = false
32
32
  end
33
33
 
34
- metadata = {}
34
+ metadata = { rubyPlatform: RUBY_PLATFORM }
35
35
  metadata.merge!(custom_metadata)
36
- Bugsnag.notify(error, metadata)
36
+
37
+ Bugsnag.notify(error) do |event|
38
+ event.add_metadata(:device, metadata)
39
+ end
37
40
  end
38
41
 
39
42
  def self.report?(context:)
@@ -45,7 +48,6 @@ module ShopifyCLI
45
48
  unless ReportingConfigurationController.reporting_prompted?
46
49
  ReportingConfigurationController.check_or_prompt_report_automatically(source: :uncaught_error)
47
50
  end
48
-
49
51
  report_error
50
52
  end
51
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
@@ -8,28 +8,272 @@ module ShopifyCLI
8
8
  info: {
9
9
  created: "{{v}} {{green:%s}} was created in the organization's Partner Dashboard {{underline:%s}}",
10
10
  serve: "{{*}} Change directories to your new project folder {{green:%s}} and run "\
11
- "{{command:%s %s serve}} to start a local server",
11
+ "{{command:%s app serve}} to start a local server",
12
12
  install: "{{*}} Then, visit {{underline:%s/test}} to install {{green:%s}} on your Dev Store",
13
13
  },
14
14
  },
15
15
  },
16
16
  core: {
17
17
  app: {
18
+ help: <<~HELP,
19
+ Suite of commands for developing apps. See {{command:%1$s app <command> --help}} for usage of each command.
20
+ Usage: {{command:%1$s app [ %2$s ]}}
21
+ HELP
22
+ error: {
23
+ type_not_found: <<~MESSAGE,
24
+ Couldn't detect the app type in directory %s. We currently support Rails, PHP, and NodeJS apps.
25
+ MESSAGE
26
+ missing_shopify_cli_yml: <<~MESSAGE,
27
+ Couldn't find a #{Constants::Files::SHOPIFY_CLI_YML} file in the directory %s to determine the app type.
28
+ MESSAGE
29
+ invalid_project_type: <<~MESSAGE,
30
+ The project type %s doesn't represent an app.
31
+ MESSAGE
32
+ },
33
+ create: {
34
+ type_required_error: "",
35
+ invalid_type: "The type %s is not supported. The only supported types are"\
36
+ " {{command:[ rails | node | php ]}}",
37
+ help: <<~HELP,
38
+ {{command:%s app create}}: Creates a ruby on rails app.
39
+ Usage: {{command:%s app create [ rails | node | php ]}}
40
+ HELP
41
+ rails: {
42
+ help: <<~HELP,
43
+ {{command:%s app create rails}}: Creates a ruby on rails app.
44
+ Usage: {{command:%s app create rails}}
45
+ Options:
46
+ {{command:--name=NAME}} App name. Any string.
47
+ {{command:--organization-id=ID}} Partner organization ID. Must be an existing organization.
48
+ {{command:--store-domain=MYSHOPIFYDOMAIN }} Development store URL. Must be an existing development store.
49
+ {{command:--db=DB}} Database type. Must be one of: mysql, postgresql, sqlite3, oracle, frontbase, ibm_db, sqlserver, jdbcmysql, jdbcsqlite3, jdbcpostgresql, jdbc.
50
+ {{command:--rails-opts=RAILSOPTS}} Additional options. Must be string containing one or more valid Rails options, separated by spaces.
51
+ HELP
52
+
53
+ error: {
54
+ invalid_ruby_version: "This project requires a Ruby version ~> 2.5 or Ruby 3.0.",
55
+ dir_exists: "Project directory %s already exists. Please use a different name.",
56
+ install_failure: "Error installing %s gem",
57
+ node_required: "node is required to create a rails project. Download at https://nodejs.org/en/download.",
58
+ node_version_failure: "Failed to get the current node version. Please make sure it is installed as " \
59
+ "per the instructions at https://nodejs.org/en.",
60
+ yarn_required: "yarn is required to create a rails project. Download at " \
61
+ "https://classic.yarnpkg.com/en/docs/install.",
62
+ yarn_version_failure: "Failed to get the current yarn version. Please make sure it is " \
63
+ "installed as per the instructions at https://classic.yarnpkg.com/en/docs/install.",
64
+ },
65
+
66
+ info: {
67
+ open_new_shell: "{{*}} {{yellow:After installing %s, please open a new Command Prompt or PowerShell " \
68
+ "window to continue.}}",
69
+ },
70
+ installing_bundler: "Installing bundler…",
71
+ generating_app: "Generating new rails app project in %s…",
72
+ adding_shopify_gem: "{{v}} Adding shopify_app gem…",
73
+ node_version: "node %s",
74
+ yarn_version: "yarn %s",
75
+ running_bundle_install: "Running bundle install…",
76
+ running_generator: "Running shopify_app generator…",
77
+ running_migrations: "Running migrations…",
78
+ running_webpacker_install: "Running webpacker:install…",
79
+ },
80
+ node: {
81
+ help: <<~HELP,
82
+ {{command:%s app create node}}: Creates an embedded nodejs app.
83
+ Usage: {{command:%s app create node}}
84
+ Options:
85
+ {{command:--name=NAME}} App name. Any string.
86
+ {{command:--organization-id=ID}} Partner organization ID. Must be an existing organization.
87
+ {{command:--store-domain=MYSHOPIFYDOMAIN }} Development store URL. Must be an existing development store.
88
+ HELP
89
+ error: {
90
+ node_required: "node is required to create an app project. Download at https://nodejs.org/en/download.",
91
+ node_version_failure: "Failed to get the current node version. Please make sure it is installed as " \
92
+ "per the instructions at https://nodejs.org/en.",
93
+ npm_required: "npm is required to create an app project. Download at https://www.npmjs.com/get-npm.",
94
+ npm_version_failure: "Failed to get the current npm version. Please make sure it is installed as per " \
95
+ "the instructions at https://www.npmjs.com/get-npm.",
96
+ },
97
+ node_version: "node %s",
98
+ npm_version: "npm %s",
99
+ },
100
+ php: {
101
+ help: <<~HELP,
102
+ {{command:%s app create php}}: Creates an embedded PHP app.
103
+ Usage: {{command:%s app create php}}
104
+ Options:
105
+ {{command:--name=NAME}} App name. Any string.
106
+ {{command:--organization-id=ID}} Partner organization ID. Must be an existing organization.
107
+ {{command:--store-domain=MYSHOPIFYDOMAIN}} Development store URL. Must be an existing development store.
108
+ {{command:--type=APPTYPE}} Whether this app is public or custom.
109
+ {{command:--verbose}} Output verbose information when installing dependencies.
110
+ HELP
111
+
112
+ error: {
113
+ php_required: <<~VERSION,
114
+ PHP is required to create an app project. For installation instructions, visit:
115
+ {{underline:https://www.php.net/manual/en/install.php}}
116
+ VERSION
117
+ php_version_failure: <<~VERSION,
118
+ Failed to get the current PHP version. Please make sure it is installed as per the instructions at:
119
+ {{underline:https://www.php.net/manual/en/install.php.}}
120
+ VERSION
121
+ php_version_too_low: "Your PHP version is too low. Please use version %s or higher.",
122
+ composer_required: <<~COMPOSER,
123
+ Composer is required to create an app project. Download at:
124
+ {{underline:https://getcomposer.org/download/}}
125
+ COMPOSER
126
+ npm_required: "npm is required to create an app project. Download at https://www.npmjs.com/get-npm.",
127
+ npm_version_failure: "Failed to get the current npm version. Please make sure it is installed as per " \
128
+ "the instructions at https://www.npmjs.com/get-npm.",
129
+ app_setup: "Failed to set up the app",
130
+ },
131
+
132
+ php_version: "PHP %s",
133
+ npm_version: "npm %s",
134
+ app_setting_up: "Setting up app…",
135
+ app_set_up: "App is now set up",
136
+ },
137
+ },
138
+ deploy: {
139
+ help: <<~HELP,
140
+ Deploy the current app to a hosting service. Heroku ({{underline:https://www.heroku.com}}) is currently the only option, but more will be added in the future.
141
+ Usage: {{command:%s app deploy [ heroku ]}}
142
+ HELP
143
+ extended_help: <<~HELP,
144
+ {{bold:Subcommands:}}
145
+ {{cyan:heroku}}: Deploys the current app to Heroku.
146
+ Usage: {{command:%s app deploy heroku}}
147
+ HELP
148
+ error: {
149
+ missing_platform: <<~MESSAGE,
150
+ The platform argument is missing.
151
+ Usage: {{command:%s app deploy [ heroku ]}}
152
+ MESSAGE
153
+ invalid_platform: <<~MESSAGE,
154
+ The platform argument passed {{command:%s}} is not supported.
155
+ Usage: {{command:%s app deploy [ heroku ]}}
156
+ MESSAGE
157
+ },
158
+ heroku: {
159
+ downloading: "Downloading Heroku CLI…",
160
+ downloaded: "Downloaded Heroku CLI",
161
+ installing: "Installing Heroku CLI…",
162
+ installing_windows: "Running Heroku CLI install wizard…",
163
+ installed: "Installed Heroku CLI",
164
+ authenticated_with_account: "{{v}} Authenticated with Heroku as {{green:%s}}",
165
+ authenticating: "Authenticating with Heroku…",
166
+ authenticated: "{{v}} Authenticated with Heroku",
167
+ deploying: "Deploying to Heroku…",
168
+ deployed: "{{v}} Deployed to Heroku",
169
+ php: {
170
+ post_deploy: <<~DEPLOYED,
171
+ {{v}} Deployed to Heroku, you can access your app at {{green:%s}}
172
+
173
+ If you're deploying this app for the first time, make sure to set up your database and your app's environment at {{bold:App dashboard -> Settings -> Config Vars}}.
174
+
175
+ When setting your config vars, don't forget to set up your database and the appropriate Laravel values for it, particularly {{bold:DB_CONNECTION and DB_DATABASE}}.
176
+ DEPLOYED
177
+ error: {
178
+ generate_app_key: "Failed to generate Laravel APP_KEY",
179
+ },
180
+ },
181
+ rails: {
182
+ db_check: {
183
+ validating: "Validating application…",
184
+ checking: "Checking database type…",
185
+ validated: "Database type \"%s\" validated for platform \"Heroku\"",
186
+ problem: "A problem was encountered while checking your database type.",
187
+ sqlite: <<~SQLITE,
188
+ Heroku does not support deployment using the SQLite database system.
189
+ Change the database type using {{command:rails db:system:change --to=[new_db_type]}}. For more info:
190
+ {{underline:https://gorails.com/episodes/rails-6-db-system-change-command}}
191
+ SQLITE
192
+ },
193
+ },
194
+ git: {
195
+ checking: "Checking git repo…",
196
+ initialized: "Git repo initialized",
197
+ what_branch: "What branch would you like to deploy?",
198
+ branch_selected: "{{v}} Git branch {{green:%s}} selected for deploy",
199
+ },
200
+ app: {
201
+ no_apps_found: "No existing Heroku app found. What would you like to do?",
202
+ name: "What is your Heroku app’s name?",
203
+ select: "Specify an existing Heroku app",
204
+ selecting: "Selecting Heroku app %s…",
205
+ selected: "{{v}} Heroku app {{green:%s}} selected",
206
+ create: "Create a new Heroku app",
207
+ creating: "Creating new Heroku app…",
208
+ created: "{{v}} New Heroku app created",
209
+ setting_configs: "Setting Shopify app configs…",
210
+ configs_set: "{{v}} Shopify app configs set",
211
+ },
212
+ },
213
+ },
214
+ connect: {
215
+ help: <<~HELP,
216
+ {{command:%s app connect}}: Connects an existing app to Shopify CLI. Creates a config file.
217
+ Usage: {{command:%s app connect}}
218
+ HELP
219
+ connected: "Project now connected to {{green:%s}}",
220
+ production_warning: <<~MESSAGE,
221
+ {{yellow:! Warning: if you have connected to an {{bold:app in production}}, running {{command:serve}} may update the app URL and cause an outage.
222
+ MESSAGE
223
+ },
224
+ tunnel: {
225
+ help: <<~HELP,
226
+ Start or stop an http tunnel to your local development app using ngrok.
227
+ Usage: {{command:%s app tunnel [ auth | start | stop ]}}
228
+ HELP
229
+ extended_help: <<~HELP,
230
+ {{bold:Subcommands:}}
231
+
232
+ {{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.
233
+ Usage: {{command:%1$s app tunnel auth <token>}}
234
+
235
+ {{cyan:start}}: Starts an ngrok tunnel, will print the URL for an existing tunnel if already running.
236
+ Usage: {{command:%1$s app tunnel start}}
237
+
238
+ {{cyan:stop}}: Stops the ngrok tunnel.
239
+ Usage: {{command:%1$s app tunnel stop}}
240
+
241
+ HELP
242
+ error: {
243
+ token_argument_missing: "{{x}} {{red:auth requires a token argument}}\n\n",
244
+ },
245
+ },
18
246
  serve: {
247
+ help: <<~HELP,
248
+ Start a local development server for your project, as well as a public ngrok tunnel to your localhost.
249
+ Usage: {{command:%s app serve}}
250
+ HELP
251
+ extended_help: <<~HELP,
252
+ {{bold:Options:}}
253
+ {{cyan:--host=HOST}}: Bypass running tunnel and use custom host. HOST must be HTTPS url.
254
+ {{cyan:--port=PORT}}: Use custom port.
255
+ HELP
256
+ open_info: <<~MESSAGE,
257
+ {{*}} To install and start using your app, open this URL in your browser:
258
+ {{green:%s}}
259
+ MESSAGE
260
+ running_server: "Running server…",
19
261
  error: {
20
- invalid_port: "%s is not a valid port.",
21
262
  host_must_be_https: "HOST must be a HTTPS url.",
263
+ invalid_port: "%s is not a valid port.",
22
264
  },
23
265
  },
24
- help: <<~HELP,
25
- Create and manage embedded apps
26
- Usage: {{command:%s app [ rails | node | php ] }}
27
- HELP
266
+ open: {
267
+ help: <<~HELP,
268
+ Open your local development app in the default browser.
269
+ Usage: {{command:%s app open}}
270
+ HELP
271
+ },
28
272
  },
29
273
  error_reporting: {
30
274
  unhandled_error: {
31
275
  message: "{{x}} {{red:An unexpected error occured.}}",
32
- issue_message: "{{red:\tTo \e]8;;#{ShopifyCLI::Constants::Links::NEW_ISSUE}\e\\submit an issue\e]8;;\e\\"\
276
+ issue_message: "{{red:\tTo \e]8;;%s\e\\submit an issue\e]8;;\e\\"\
33
277
  " include the stack trace.}}",
34
278
  stacktrace_message: "{{red:\tTo print the stack trace, add the environment variable %s.}}",
35
279
  },
@@ -328,7 +572,7 @@ module ShopifyCLI
328
572
  error: {
329
573
  not_in_project: <<~MESSAGE,
330
574
  {{x}} You are not in a Shopify app project
331
- {{yellow:{{*}}}}{{reset: Run}}{{cyan: shopify rails create}}{{reset: or}}{{cyan: shopify node create}}{{reset: to create your app}}
575
+ {{yellow:{{*}}}}{{reset: Run}}{{cyan: shopify app create}}{{reset: to create your app}}
332
576
  MESSAGE
333
577
  },
334
578
  },
@@ -520,7 +764,7 @@ module ShopifyCLI
520
764
  Anonymized reports will be sent to Shopify.
521
765
  MESSAGE
522
766
  turned_off_message: <<~MESSAGE,
523
- Turn on automatic reporting later wtih {{command:%s reporting on}}.
767
+ Turn on automatic reporting later with {{command:%s reporting on}}.
524
768
  MESSAGE
525
769
  },
526
770
  whoami: {
@@ -9,23 +9,21 @@ module ShopifyCLI
9
9
  migrations_directory: File.expand_path("migrator/migrations", __dir__)
10
10
  )
11
11
  baseline_date = last_migration_date
12
- unless baseline_date.nil?
13
- migrations = migrations(migrations_directory: migrations_directory)
14
- .select { |m|
15
- m.date > baseline_date.to_i
16
- }
17
- .each { |m| m.run }
12
+ unless baseline_date.nil?
13
+ migrations(migrations_directory: migrations_directory)
14
+ .select do |m|
15
+ m.date > baseline_date.to_i
16
+ end
17
+ .each(&:run)
18
18
  end
19
19
 
20
20
  store_last_migration_date
21
21
  end
22
22
 
23
- private
24
-
25
23
  def self.store_last_migration_date
26
24
  ShopifyCLI::DB.set(ShopifyCLI::Constants::StoreKeys::LAST_MIGRATION_DATE => Time.now.to_i)
27
25
  end
28
-
26
+
29
27
  def self.last_migration_date
30
28
  ShopifyCLI::DB.get(ShopifyCLI::Constants::StoreKeys::LAST_MIGRATION_DATE)
31
29
  end
@@ -35,7 +33,7 @@ module ShopifyCLI
35
33
  file_name = File.basename(file_path).gsub(".rb", "")
36
34
  file_name_components = file_name.split("_")
37
35
  date_timestamp = file_name_components[0].to_i
38
- migration_name = file_name_components[1...].join("_")
36
+ migration_name = file_name_components.drop(1).join("_")
39
37
 
40
38
  Migrator::Migration.new(
41
39
  name: migration_name,
@@ -45,4 +43,4 @@ module ShopifyCLI
45
43
  end
46
44
  end
47
45
  end
48
- end
46
+ end
@@ -81,7 +81,11 @@ module ShopifyCLI
81
81
  #
82
82
  # #### Example
83
83
  #
84
- # type = ShopifyCLI::Project.current_project_type
84
+ # ShopifyCLI::Project.write(
85
+ # @ctx,
86
+ # project_type: "node",
87
+ # organization_id: form_data.organization_id,
88
+ # )
85
89
  #
86
90
  def write(ctx, project_type:, organization_id:, **identifiers)
87
91
  require "yaml" # takes 20ms, so deferred as late as possible.
@@ -1,5 +1,5 @@
1
1
  module ShopifyCLI
2
- class ProjectCommands < Command
2
+ class ProjectCommand < Command
3
3
  def call(*)
4
4
  @ctx.puts(self.class.help)
5
5
  end
@@ -0,0 +1,25 @@
1
+ module ShopifyCLI
2
+ module Services
3
+ module App
4
+ class ConnectService < BaseService
5
+ attr_reader :app_type, :project, :context
6
+
7
+ def initialize(app_type:, project:, context:)
8
+ @app_type = app_type
9
+ @project = project
10
+ @context = context
11
+ super()
12
+ end
13
+
14
+ def call
15
+ unless project&.env.nil?
16
+ context.puts(context.message("core.app.connect.production_warning"))
17
+ end
18
+
19
+ app = ShopifyCLI::Connect.new(context).default_connect(app_type.to_s)
20
+ context.done(context.message("core.app.connect.connected", app))
21
+ end
22
+ end
23
+ end
24
+ end
25
+ end