shopify-cli 2.15.2 → 2.15.5

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 (58) hide show
  1. checksums.yaml +4 -4
  2. data/.vscode/settings.json +1 -2
  3. data/CHANGELOG.md +69 -22
  4. data/Gemfile.lock +1 -1
  5. data/Rakefile +8 -0
  6. data/ext/javy/hashes/javy-arm-macos-v0.3.0.gz.sha256 +1 -0
  7. data/ext/javy/hashes/javy-x86_64-linux-v0.3.0.gz.sha256 +1 -0
  8. data/ext/javy/hashes/javy-x86_64-macos-v0.3.0.gz.sha256 +1 -0
  9. data/ext/javy/hashes/javy-x86_64-windows-v0.3.0.gz.sha256 +1 -0
  10. data/ext/javy/version +1 -1
  11. data/ext/shopify-extensions/version +1 -1
  12. data/lib/project_types/extension/cli.rb +4 -0
  13. data/lib/project_types/extension/commands/check.rb +6 -1
  14. data/lib/project_types/extension/forms/questions/ask_template.rb +1 -2
  15. data/lib/project_types/extension/messages/messages.rb +0 -2
  16. data/lib/project_types/extension/models/development_server_requirements.rb +1 -0
  17. data/lib/project_types/extension/models/specification_handlers/beacon_extension.rb +57 -0
  18. data/lib/project_types/extension/models/specification_handlers/beacon_extension_utils/script_config.rb +33 -0
  19. data/lib/project_types/extension/models/specification_handlers/beacon_extension_utils/script_config_repository.rb +75 -0
  20. data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +16 -1
  21. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +4 -1
  22. data/lib/project_types/extension/tasks/configure_options.rb +2 -1
  23. data/lib/project_types/extension/tasks/convert_server_config.rb +13 -2
  24. data/lib/project_types/extension/tasks/merge_server_config.rb +5 -2
  25. data/lib/project_types/script/cli.rb +1 -0
  26. data/lib/project_types/script/layers/application/create_script.rb +14 -6
  27. data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +6 -21
  28. data/lib/project_types/script/layers/infrastructure/sparse_checkout_details.rb +35 -0
  29. data/lib/project_types/theme/cli.rb +1 -0
  30. data/lib/project_types/theme/commands/check.rb +4 -1
  31. data/lib/project_types/theme/commands/open.rb +2 -2
  32. data/lib/project_types/theme/commands/push.rb +1 -3
  33. data/lib/project_types/theme/commands/share.rb +56 -0
  34. data/lib/project_types/theme/messages/messages.rb +24 -3
  35. data/lib/shopify_cli/changelog.rb +97 -25
  36. data/lib/shopify_cli/command_options/command_serve_options.rb +10 -0
  37. data/lib/shopify_cli/commands/app/serve.rb +7 -7
  38. data/lib/shopify_cli/commands/login.rb +5 -2
  39. data/lib/shopify_cli/context.rb +13 -0
  40. data/lib/shopify_cli/identity_auth.rb +24 -4
  41. data/lib/shopify_cli/messages/messages.rb +17 -7
  42. data/lib/shopify_cli/release.rb +1 -1
  43. data/lib/shopify_cli/services/app/create/rails_service.rb +9 -1
  44. data/lib/shopify_cli/services/app/serve/node_service.rb +2 -25
  45. data/lib/shopify_cli/services/app/serve/php_service.rb +2 -25
  46. data/lib/shopify_cli/services/app/serve/rails_service.rb +8 -28
  47. data/lib/shopify_cli/services/app/serve/serve_service.rb +57 -0
  48. data/lib/shopify_cli/services.rb +1 -0
  49. data/lib/shopify_cli/tasks/update_dashboard_urls.rb +7 -9
  50. data/lib/shopify_cli/theme/dev_server/remote_watcher/json_files_update_job.rb +1 -0
  51. data/lib/shopify_cli/theme/dev_server/watcher.rb +2 -8
  52. data/lib/shopify_cli/theme/dev_server.rb +3 -2
  53. data/lib/shopify_cli/theme/theme.rb +21 -7
  54. data/lib/shopify_cli/theme/theme_admin_api.rb +23 -8
  55. data/lib/shopify_cli/tunnel.rb +3 -13
  56. data/lib/shopify_cli/version.rb +1 -1
  57. data/vendor/deps/cli-ui/lib/cli/ui/os.rb +8 -0
  58. metadata +12 -2
@@ -18,6 +18,7 @@ module ShopifyCLI
18
18
  missing_node: "Node.js is required to continue. Install Node.js here: https://nodejs.org/en/download.",
19
19
  missing_npm: "npm is required to continue. Install npm here: https://www.npmjs.com/get-npm.",
20
20
  missing_ruby: "Ruby is required to continue. Install Ruby here: https://www.ruby-lang.org/en/downloads.",
21
+ bundle_info_failure: "Error getting version for %s gem",
21
22
  option_parser: {
22
23
  invalid_option: "The option {{command:%s}} is not supported.",
23
24
  invalid_option_store_equals: <<~MESSAGE,
@@ -263,6 +264,7 @@ module ShopifyCLI
263
264
  {{bold:Options:}}
264
265
  {{cyan:--host=HOST}}: Bypass running tunnel and use custom host. HOST must be HTTPS url.
265
266
  {{cyan:--port=PORT}}: Use custom port.
267
+ {{cyan:--no-update}}: Skips the dashboard URL update step
266
268
  HELP
267
269
  open_info: <<~MESSAGE,
268
270
  {{*}} To install and start using your app, open this URL in your browser:
@@ -283,6 +285,13 @@ module ShopifyCLI
283
285
  },
284
286
  extension: {
285
287
  push: {
288
+ beacon_extension: {
289
+ error: {
290
+ file_read_error: "There was a problem reading %s",
291
+ missing_config_key_error: "Configuration is missing key: %s",
292
+ invalid_config_value_error: "Configuration value is invalid: %s",
293
+ },
294
+ },
286
295
  checkout_ui_extension: {
287
296
  localization: {
288
297
  error: {
@@ -294,6 +303,7 @@ module ShopifyCLI
294
303
  invalid_file_extension: "Invalid locale filename: `%s`; only .json files are allowed.",
295
304
  invalid_locale_code: "Invalid locale filename: `%s`; locale code should be 2 or 3 letters,"\
296
305
  " optionally followed by a two-letter region code, e.g. `fr-CA`.",
306
+ invalid_file_encoding: "Invalid file encoding for `%s`; file encoding should be UTF-8.",
297
307
  single_default_locale: "There must be one and only one locale identified as the default locale,"\
298
308
  " e.g. `en.default.json`",
299
309
  },
@@ -447,6 +457,11 @@ module ShopifyCLI
447
457
  shop_prompt: <<~PROMPT,
448
458
  What store are you connecting to? (e.g. my-store.myshopify.com; do {{bold:NOT}} include protocol part, e.g., https://)
449
459
  PROMPT
460
+ spinner: {
461
+ initiating: "Initiating authentication",
462
+ finalizing: "Finalizing authentication",
463
+ loading_organizations: "Loading available partner organizations",
464
+ },
450
465
  },
451
466
 
452
467
  logout: {
@@ -714,7 +729,6 @@ module ShopifyCLI
714
729
  updated: "{{v}} Whitelist URLS updated in Partners Dashboard}}",
715
730
  update_error:
716
731
  "{{x}} error: For authentication issues, run {{command:%s logout}} to clear invalid credentials",
717
- update_prompt: "Do you want to update your application url?",
718
732
  },
719
733
  select_org_and_shop: {
720
734
  authentication_issue: "For authentication issues, run {{command:%s logout}} to clear invalid credentials",
@@ -746,16 +760,12 @@ module ShopifyCLI
746
760
  " package manager for your system.",
747
761
  ngrok: "Something went wrong with ngrok installation,"\
748
762
  "please make sure %s exists within %s before trying again",
763
+ signup_required: "A free ngrok account is required: {{underline:https://ngrok.com/signup}}. After you "\
764
+ "signup, install your personal authorization token using {{command:%s app tunnel auth <token>}}.",
749
765
  },
750
766
  installing: "Installing ngrok…",
751
767
  not_running: "{{green:x}} ngrok tunnel not running",
752
768
  prereq_command_location: "%s @ %s",
753
- signup_suggestion: <<~MESSAGE,
754
- {{*}} To avoid tunnels that timeout, it is recommended to signup for a free ngrok
755
- account at {{underline:https://ngrok.com/signup}}. After you signup, install your
756
- personalized authorization token using {{command:%s app tunnel auth <token>}}.
757
- MESSAGE
758
- start: "{{v}} ngrok tunnel running at {{underline:%s}}",
759
769
  start_with_account: "{{v}} ngrok tunnel running at {{underline:%s}}, with account %s",
760
770
  stopped: "{{green:x}} ngrok tunnel stopped",
761
771
  timed_out: "{{x}} ngrok tunnel has timed out, restarting…",
@@ -90,7 +90,7 @@ module ShopifyCLI
90
90
  "main",
91
91
  release_branch_name,
92
92
  "Packaging for release v#{new_version}",
93
- release_notes("Unreleased")
93
+ release_notes(new_version)
94
94
  ).tap { |results| puts "Created #{repo} PR ##{results["number"]}" }
95
95
  end
96
96
 
@@ -109,7 +109,9 @@ module ShopifyCLI
109
109
 
110
110
  def check_ruby
111
111
  ruby_version = Environment.ruby_version(context: context)
112
- return if ruby_version.satisfies?("~>2.5") || ruby_version.satisfies?("~>3.1.0")
112
+ return if ruby_version.satisfies?("~>2.5") ||
113
+ ruby_version.satisfies?("~>3.0.0") ||
114
+ ruby_version.satisfies?("~>3.1.0")
113
115
  context.abort(context.message("core.app.create.rails.error.invalid_ruby_version"))
114
116
  end
115
117
 
@@ -205,6 +207,12 @@ module ShopifyCLI
205
207
  end
206
208
 
207
209
  def set_custom_ua
210
+ requires_ua_file = Dir.chdir(context.root) do
211
+ context.ruby_gem_version("shopify_app") < ::Semantic::Version.new("19.0.0")
212
+ end
213
+
214
+ return unless requires_ua_file
215
+
208
216
  ua_path = File.join("config", "initializers", "user_agent.rb")
209
217
  context.write(ua_path, USER_AGENT_CODE)
210
218
  end
@@ -2,32 +2,9 @@ module ShopifyCLI
2
2
  module Services
3
3
  module App
4
4
  module Serve
5
- class NodeService < BaseService
6
- attr_accessor :host, :port, :context
7
-
8
- def initialize(host:, port:, context:)
9
- @host = host
10
- @port = port
11
- @context = context
12
- super()
13
- end
14
-
5
+ class NodeService < ServeService
15
6
  def call
16
- project = ShopifyCLI::Project.current
17
- url = host || ShopifyCLI::Tunnel.start(context, port: port)
18
- raise ShopifyCLI::Abort,
19
- context.message("core.app.serve.error.host_must_be_https") if url.match(/^https/i).nil?
20
- project.env.update(context, :host, url)
21
- ShopifyCLI::Tasks::UpdateDashboardURLS.call(
22
- context,
23
- url: url,
24
- callback_url: "/auth/callback",
25
- )
26
-
27
- if project.env.shop
28
- project_url = "#{project.env.host}/auth?shop=#{project.env.shop}"
29
- context.puts("\n" + context.message("core.app.serve.open_info", project_url) + "\n")
30
- end
7
+ generate_url
31
8
 
32
9
  CLI::UI::Frame.open(context.message("core.app.serve.running_server")) do
33
10
  env = project.env.to_h
@@ -2,32 +2,9 @@ module ShopifyCLI
2
2
  module Services
3
3
  module App
4
4
  module Serve
5
- class PHPService < BaseService
6
- attr_accessor :host, :port, :context
7
-
8
- def initialize(host:, port:, context:)
9
- @host = host
10
- @port = port
11
- @context = context
12
- super()
13
- end
14
-
5
+ class PHPService < ServeService
15
6
  def call
16
- project = ShopifyCLI::Project.current
17
- url = host || ShopifyCLI::Tunnel.start(context, port: port)
18
- raise ShopifyCLI::Abort,
19
- context.message("core.app.serve.error.host_must_be_https") if url.match(/^https/i).nil?
20
- project.env.update(context, :host, url)
21
- ShopifyCLI::Tasks::UpdateDashboardURLS.call(
22
- context,
23
- url: url,
24
- callback_url: "/auth/callback",
25
- )
26
-
27
- if project.env.shop
28
- project_url = "#{project.env.host}/login?shop=#{project.env.shop}"
29
- context.puts("\n" + context.message("core.app.serve.open_info", project_url) + "\n")
30
- end
7
+ generate_url
31
8
 
32
9
  CLI::UI::Frame.open(context.message("core.app.serve.running_server")) do
33
10
  if ShopifyCLI::ProcessSupervision.running?(:npm_watch)
@@ -2,38 +2,18 @@ module ShopifyCLI
2
2
  module Services
3
3
  module App
4
4
  module Serve
5
- class RailsService < BaseService
6
- attr_accessor :host, :port, :context
7
-
8
- def initialize(host:, port:, context:)
9
- @host = host
10
- @port = port
11
- @context = context
12
- super()
13
- end
14
-
5
+ class RailsService < ServeService
15
6
  def call
16
- project = ShopifyCLI::Project.current
17
- url = host || ShopifyCLI::Tunnel.start(context, port: port)
18
- raise ShopifyCLI::Abort,
19
- context.message("core.app.serve.error.host_must_be_https") if url.match(/^https/i).nil?
20
- project.env.update(context, :host, url)
21
- ShopifyCLI::Tasks::UpdateDashboardURLS.call(
22
- context,
23
- url: url,
24
- callback_url: "/auth/shopify/callback",
25
- )
26
-
27
- if project.env.shop
28
- project_url = "#{project.env.host}/login?shop=#{project.env.shop}"
29
- context.puts("\n" + context.message("core.app.serve.open_info", project_url) + "\n")
30
- end
7
+ generate_url
31
8
 
32
9
  CLI::UI::Frame.open(context.message("core.app.serve.running_server")) do
33
- env = ShopifyCLI::Project.current.env.to_h
34
- env.delete("HOST")
10
+ original_env = JSON.parse(ENV["ORIGINAL_ENV"] || "{}")
11
+ env = original_env.merge(ShopifyCLI::Project.current.env.to_h)
12
+ env.delete("HOST") if context.ruby_gem_version("shopify_app") < ::Semantic::Version.new("19.0.0")
35
13
  env["PORT"] = port.to_s
36
- env["GEM_PATH"] = Rails::Gem.gem_path(context)
14
+ env["GEM_PATH"] =
15
+ [env["GEM_PATH"], Rails::Gem.gem_path(context)].compact
16
+ .join(CLI::UI::OS.current.path_separator)
37
17
  if context.windows?
38
18
  context.system("ruby bin\\rails server", env: env)
39
19
  else
@@ -0,0 +1,57 @@
1
+ module ShopifyCLI
2
+ module Services
3
+ module App
4
+ module Serve
5
+ class ServeService < BaseService
6
+ attr_accessor :host, :port, :no_update, :context
7
+
8
+ def initialize(host:, port:, no_update:, context:)
9
+ @host = host
10
+ @port = port
11
+ @no_update = no_update
12
+ @context = context
13
+ super()
14
+ end
15
+
16
+ def call
17
+ raise NotImplementedError
18
+ end
19
+
20
+ private
21
+
22
+ def generate_url
23
+ create_tunnel
24
+ update_url unless no_update
25
+ show_app_url
26
+ end
27
+
28
+ def create_tunnel
29
+ url = host || ShopifyCLI::Tunnel.start(context, port: port)
30
+ raise ShopifyCLI::Abort,
31
+ context.message("core.app.serve.error.host_must_be_https") if url.match(/^https/i).nil?
32
+ project.env.update(context, :host, url)
33
+ end
34
+
35
+ def update_url
36
+ ShopifyCLI::Tasks::UpdateDashboardURLS.call(
37
+ context,
38
+ url: project.env.host,
39
+ callback_url: "/auth/shopify/callback",
40
+ )
41
+ end
42
+
43
+ def show_app_url
44
+ return unless project.env.shop
45
+
46
+ project_url = "#{project.env.host}/login?shop=#{project.env.shop}"
47
+ context.puts("\n" + context.message("core.app.serve.open_info", project_url) + "\n")
48
+ end
49
+
50
+ def project
51
+ @project ||= ShopifyCLI::Project.current
52
+ end
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -5,6 +5,7 @@ module ShopifyCLI
5
5
 
6
6
  module App
7
7
  module Serve
8
+ autoload :ServeService, "shopify_cli/services/app/serve/serve_service"
8
9
  autoload :NodeService, "shopify_cli/services/app/serve/node_service"
9
10
  autoload :RailsService, "shopify_cli/services/app/serve/rails_service"
10
11
  autoload :PHPService, "shopify_cli/services/app/serve/php_service"
@@ -9,24 +9,22 @@ module ShopifyCLI
9
9
  api_key = project.env.api_key
10
10
  result = ShopifyCLI::PartnersAPI.query(ctx, "get_app_urls", apiKey: api_key)
11
11
  app = result["data"]["app"]
12
- consent = check_application_url(app["applicationUrl"], url)
12
+
13
+ return if app["applicationUrl"].match(url)
14
+
13
15
  constructed_urls = construct_redirect_urls(app["redirectUrlWhitelist"], url, callback_url)
14
- return if url == app["applicationUrl"]
15
16
  ShopifyCLI::PartnersAPI.query(@ctx, "update_dashboard_urls", input: {
16
- applicationUrl: consent ? url : app["applicationUrl"],
17
- redirectUrlWhitelist: constructed_urls, apiKey: api_key
17
+ applicationUrl: url,
18
+ redirectUrlWhitelist: constructed_urls,
19
+ apiKey: api_key,
18
20
  })
21
+
19
22
  @ctx.puts(@ctx.message("core.tasks.update_dashboard_urls.updated"))
20
23
  rescue
21
24
  @ctx.puts(@ctx.message("core.tasks.update_dashboard_urls.update_error", ShopifyCLI::TOOL_NAME))
22
25
  raise
23
26
  end
24
27
 
25
- def check_application_url(application_url, new_url)
26
- return false if application_url.match(new_url)
27
- CLI::UI::Prompt.confirm(@ctx.message("core.tasks.update_dashboard_urls.update_prompt"))
28
- end
29
-
30
28
  def construct_redirect_urls(urls, new_url, callback_url)
31
29
  new_urls = urls.map do |url|
32
30
  if (match = url.match(NGROK_REGEX))
@@ -26,6 +26,7 @@ module ShopifyCLI
26
26
  .json_files
27
27
  .reject { |file| @syncer.pending_updates.include?(file) }
28
28
  .reject { |file| @syncer.broken_file?(file) }
29
+ .reject { |file| @syncer.ignore_file?(file) }
29
30
  end
30
31
  end
31
32
  end
@@ -46,20 +46,14 @@ module ShopifyCLI
46
46
  files
47
47
  .select { |file| @theme.theme_file?(file) }
48
48
  .map { |file| @theme[file] }
49
- .reject { |file| ignore_file?(file) }
49
+ .reject { |file| @syncer.ignore_file?(file) }
50
50
  end
51
51
 
52
52
  def filter_remote_files(files)
53
53
  files
54
54
  .select { |file| @syncer.remote_file?(file) }
55
55
  .map { |file| @theme[file] }
56
- .reject { |file| ignore_file?(file) }
57
- end
58
-
59
- private
60
-
61
- def ignore_file?(file)
62
- @ignore_filter&.ignore?(file.relative_path)
56
+ .reject { |file| @syncer.ignore_file?(file) }
63
57
  end
64
58
  end
65
59
  end
@@ -32,7 +32,7 @@ module ShopifyCLI
32
32
  theme = DevelopmentTheme.find_or_create!(ctx, root: root)
33
33
  ignore_filter = IgnoreFilter.from_path(root)
34
34
  @syncer = Syncer.new(ctx, theme: theme, ignore_filter: ignore_filter, overwrite_json: !editor_sync)
35
- watcher = Watcher.new(ctx, theme: theme, syncer: @syncer, ignore_filter: ignore_filter, poll: poll)
35
+ watcher = Watcher.new(ctx, theme: theme, syncer: @syncer, poll: poll)
36
36
  remote_watcher = RemoteWatcher.to(theme: theme, syncer: @syncer)
37
37
 
38
38
  # Setup the middleware stack. Mimics Rack::Builder / config.ru, but in reverse order
@@ -92,7 +92,8 @@ module ShopifyCLI
92
92
 
93
93
  rescue ShopifyCLI::API::APIRequestForbiddenError,
94
94
  ShopifyCLI::API::APIRequestUnauthorizedError
95
- raise ShopifyCLI::Abort, @ctx.message("theme.serve.ensure_user", theme.shop)
95
+ shop = ShopifyCLI::AdminAPI.get_shop_or_abort(@ctx)
96
+ raise ShopifyCLI::Abort, @ctx.message("theme.serve.ensure_user", shop)
96
97
  rescue Errno::EADDRINUSE
97
98
  error_message = @ctx.message("theme.serve.address_already_in_use", address)
98
99
  help_message = @ctx.message("theme.serve.try_port_option")
@@ -37,10 +37,10 @@ module ShopifyCLI
37
37
  end
38
38
 
39
39
  def glob(pattern, raise_on_dir: false)
40
- root.glob(pattern).map do |path|
41
- abort_if_directory!(path) if raise_on_dir
42
- File.new(path, root)
43
- end
40
+ root
41
+ .glob(pattern)
42
+ .select { |path| file?(path, raise_on_dir) }
43
+ .map { |path| File.new(path, root) }
44
44
  end
45
45
 
46
46
  def theme_file?(file)
@@ -155,6 +155,13 @@ module ShopifyCLI
155
155
  end
156
156
 
157
157
  class << self
158
+ def create_unpublished(ctx, root: nil, name: nil)
159
+ name ||= random_name
160
+ theme = new(ctx, root: root, name: name, role: "unpublished")
161
+ theme.create
162
+ theme
163
+ end
164
+
158
165
  def all(ctx, root: nil)
159
166
  _status, body = fetch_themes(ctx)
160
167
 
@@ -182,6 +189,10 @@ module ShopifyCLI
182
189
 
183
190
  private
184
191
 
192
+ def random_name
193
+ ShopifyCLI::Helpers::Haikunator.haikunate(9999)
194
+ end
195
+
185
196
  def find(ctx, root, &block)
186
197
  _status, body = fetch_themes(ctx)
187
198
 
@@ -222,9 +233,12 @@ module ShopifyCLI
222
233
  self
223
234
  end
224
235
 
225
- def abort_if_directory!(path)
226
- return unless ::File.directory?(path)
227
- @ctx.abort(@ctx.message("theme.serve.error.invalid_subdirectory", path.to_s))
236
+ def file?(path, raise_on_dir = false)
237
+ if raise_on_dir && ::File.directory?(path)
238
+ @ctx.abort(@ctx.message("theme.serve.error.invalid_subdirectory", path.to_s))
239
+ end
240
+
241
+ ::File.file?(path)
228
242
  end
229
243
  end
230
244
  end
@@ -41,31 +41,46 @@ module ShopifyCLI
41
41
  )
42
42
  rescue ShopifyCLI::API::APIRequestForbiddenError,
43
43
  ShopifyCLI::API::APIRequestUnauthorizedError => error
44
+
45
+ ##
44
46
  # The Admin API returns 403 Forbidden responses on different
45
47
  # scenarios:
46
48
  #
47
49
  # * when a user doesn't have permissions for a request:
48
- # <APIRequestForbiddenError: 403 {}>
50
+ # - <APIRequestForbiddenError: 403 {}>
51
+ # - <APIRequestForbiddenError: 403 {"errors":"Unauthorized Access"}>
49
52
  #
50
53
  # * when an asset operation cannot be performed:
51
- # <APIRequestForbiddenError: 403 {"message":"templates/gift_card.liquid could not be deleted"}>
52
- if empty_response_error?(error)
53
- return handle_permissions_error
54
+ # - <APIRequestForbiddenError: 403 {"message":"templates/gift_card.liquid could not be deleted"}>
55
+ #
56
+ if empty_response?(error) || unauthorized_response?(error)
57
+ return permission_error
54
58
  end
55
59
 
56
60
  raise error
57
61
  end
58
62
 
59
- def handle_permissions_error
63
+ def permission_error
60
64
  ensure_user_error = @ctx.message("theme.ensure_user_error", shop)
61
65
  ensure_user_try_this = @ctx.message("theme.ensure_user_try_this")
62
66
 
63
67
  @ctx.abort(ensure_user_error, ensure_user_try_this)
64
68
  end
65
69
 
66
- def empty_response_error?(error)
67
- error_message = error&.response&.body.to_s
68
- error_message.empty?
70
+ def empty_response?(error)
71
+ response_body(error).empty?
72
+ end
73
+
74
+ def unauthorized_response?(error)
75
+ parsed_body = JSON.parse(response_body(error))
76
+ errors = parsed_body["errors"].to_s
77
+ errors.match?(/Unauthorized Access/)
78
+ rescue JSON::ParserError
79
+ false
80
+ end
81
+
82
+ def response_body(error)
83
+ error&.response&.body.to_s
69
84
  end
70
85
  end
71
86
  end
@@ -66,14 +66,9 @@ module ShopifyCLI
66
66
  #
67
67
  def start(ctx, port: PORT)
68
68
  install(ctx)
69
- if authenticated?
70
- url, account = start_ngrok(ctx, port)
71
- ctx.puts(ctx.message("core.tunnel.start_with_account", url, account))
72
- else
73
- url, _ = restart_ngrok(ctx, port)
74
- ctx.puts(ctx.message("core.tunnel.start", url))
75
- ctx.puts(ctx.message("core.tunnel.signup_suggestion", ShopifyCLI::TOOL_NAME))
76
- end
69
+ ctx.abort(ctx.message("core.tunnel.error.signup_required", ShopifyCLI::TOOL_NAME)) unless authenticated?
70
+ url, account = start_ngrok(ctx, port)
71
+ ctx.puts(ctx.message("core.tunnel.start_with_account", url, account))
77
72
  url
78
73
  end
79
74
 
@@ -208,11 +203,6 @@ module ShopifyCLI
208
203
  [log.url, log.account]
209
204
  end
210
205
 
211
- def restart_ngrok(ctx, port)
212
- ShopifyCLI::ProcessSupervision.stop(:ngrok)
213
- start_ngrok(ctx, port)
214
- end
215
-
216
206
  def check_prereq_command(ctx, command)
217
207
  cmd_path = ctx.which(command)
218
208
  ctx.abort(ctx.message("core.tunnel.error.prereq_command_required", command)) if cmd_path.nil?
@@ -1,3 +1,3 @@
1
1
  module ShopifyCLI
2
- VERSION = "2.15.2"
2
+ VERSION = "2.15.5"
3
3
  end
@@ -35,6 +35,10 @@ module CLI
35
35
  def shift_cursor_on_line_reset?
36
36
  false
37
37
  end
38
+
39
+ def path_separator
40
+ ":"
41
+ end
38
42
  end
39
43
  end
40
44
 
@@ -58,6 +62,10 @@ module CLI
58
62
  def shift_cursor_on_line_reset?
59
63
  true
60
64
  end
65
+
66
+ def path_separator
67
+ ";"
68
+ end
61
69
  end
62
70
  end
63
71
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopify-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.15.2
4
+ version: 2.15.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-03-28 00:00:00.000000000 Z
11
+ date: 2022-04-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -158,15 +158,19 @@ files:
158
158
  - ext/javy/hashes/javy-arm-macos-v0.1.0.gz.sha256
159
159
  - ext/javy/hashes/javy-arm-macos-v0.2.0.gz.sha256
160
160
  - ext/javy/hashes/javy-arm-macos-v0.2.1.gz.sha256
161
+ - ext/javy/hashes/javy-arm-macos-v0.3.0.gz.sha256
161
162
  - ext/javy/hashes/javy-x86_64-linux-v0.1.0.gz.sha256
162
163
  - ext/javy/hashes/javy-x86_64-linux-v0.2.0.gz.sha256
163
164
  - ext/javy/hashes/javy-x86_64-linux-v0.2.1.gz.sha256
165
+ - ext/javy/hashes/javy-x86_64-linux-v0.3.0.gz.sha256
164
166
  - ext/javy/hashes/javy-x86_64-macos-v0.1.0.gz.sha256
165
167
  - ext/javy/hashes/javy-x86_64-macos-v0.2.0.gz.sha256
166
168
  - ext/javy/hashes/javy-x86_64-macos-v0.2.1.gz.sha256
169
+ - ext/javy/hashes/javy-x86_64-macos-v0.3.0.gz.sha256
167
170
  - ext/javy/hashes/javy-x86_64-windows-v0.1.0.gz.sha256
168
171
  - ext/javy/hashes/javy-x86_64-windows-v0.2.0.gz.sha256
169
172
  - ext/javy/hashes/javy-x86_64-windows-v0.2.1.gz.sha256
173
+ - ext/javy/hashes/javy-x86_64-windows-v0.3.0.gz.sha256
170
174
  - ext/javy/javy.rb
171
175
  - ext/javy/version
172
176
  - ext/shopify-extensions/extconf.rb
@@ -247,6 +251,9 @@ files:
247
251
  - lib/project_types/extension/models/server_config/root.rb
248
252
  - lib/project_types/extension/models/server_config/user.rb
249
253
  - lib/project_types/extension/models/specification.rb
254
+ - lib/project_types/extension/models/specification_handlers/beacon_extension.rb
255
+ - lib/project_types/extension/models/specification_handlers/beacon_extension_utils/script_config.rb
256
+ - lib/project_types/extension/models/specification_handlers/beacon_extension_utils/script_config_repository.rb
250
257
  - lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb
251
258
  - lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb
252
259
  - lib/project_types/extension/models/specification_handlers/default.rb
@@ -335,6 +342,7 @@ files:
335
342
  - lib/project_types/script/layers/infrastructure/script_service.rb
336
343
  - lib/project_types/script/layers/infrastructure/script_uploader.rb
337
344
  - lib/project_types/script/layers/infrastructure/service_locator.rb
345
+ - lib/project_types/script/layers/infrastructure/sparse_checkout_details.rb
338
346
  - lib/project_types/script/loaders/project.rb
339
347
  - lib/project_types/script/loaders/specification_handler.rb
340
348
  - lib/project_types/script/messages/messages.rb
@@ -354,6 +362,7 @@ files:
354
362
  - lib/project_types/theme/commands/pull.rb
355
363
  - lib/project_types/theme/commands/push.rb
356
364
  - lib/project_types/theme/commands/serve.rb
365
+ - lib/project_types/theme/commands/share.rb
357
366
  - lib/project_types/theme/conversions/base_glob.rb
358
367
  - lib/project_types/theme/conversions/ignore_glob.rb
359
368
  - lib/project_types/theme/conversions/include_glob.rb
@@ -465,6 +474,7 @@ files:
465
474
  - lib/shopify_cli/services/app/serve/node_service.rb
466
475
  - lib/shopify_cli/services/app/serve/php_service.rb
467
476
  - lib/shopify_cli/services/app/serve/rails_service.rb
477
+ - lib/shopify_cli/services/app/serve/serve_service.rb
468
478
  - lib/shopify_cli/services/app/tunnel/auth_service.rb
469
479
  - lib/shopify_cli/services/app/tunnel/start_service.rb
470
480
  - lib/shopify_cli/services/app/tunnel/stop_service.rb