shopify-cli 2.15.2 → 2.15.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (53) hide show
  1. checksums.yaml +4 -4
  2. data/.vscode/settings.json +1 -2
  3. data/CHANGELOG.md +57 -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/lib/project_types/extension/commands/check.rb +6 -1
  12. data/lib/project_types/extension/messages/messages.rb +0 -2
  13. data/lib/project_types/extension/models/development_server_requirements.rb +1 -0
  14. data/lib/project_types/extension/models/specification_handlers/beacon_extension.rb +57 -0
  15. data/lib/project_types/extension/models/specification_handlers/beacon_extension_utils/script_config.rb +33 -0
  16. data/lib/project_types/extension/models/specification_handlers/beacon_extension_utils/script_config_repository.rb +75 -0
  17. data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +16 -1
  18. data/lib/project_types/extension/tasks/configure_options.rb +2 -1
  19. data/lib/project_types/extension/tasks/convert_server_config.rb +13 -2
  20. data/lib/project_types/extension/tasks/merge_server_config.rb +5 -2
  21. data/lib/project_types/script/cli.rb +1 -0
  22. data/lib/project_types/script/layers/application/create_script.rb +14 -6
  23. data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +6 -21
  24. data/lib/project_types/script/layers/infrastructure/sparse_checkout_details.rb +35 -0
  25. data/lib/project_types/theme/cli.rb +1 -0
  26. data/lib/project_types/theme/commands/check.rb +4 -1
  27. data/lib/project_types/theme/commands/open.rb +2 -2
  28. data/lib/project_types/theme/commands/push.rb +1 -3
  29. data/lib/project_types/theme/commands/share.rb +56 -0
  30. data/lib/project_types/theme/messages/messages.rb +24 -3
  31. data/lib/shopify_cli/changelog.rb +97 -25
  32. data/lib/shopify_cli/command_options/command_serve_options.rb +10 -0
  33. data/lib/shopify_cli/commands/app/serve.rb +7 -7
  34. data/lib/shopify_cli/commands/login.rb +5 -2
  35. data/lib/shopify_cli/context.rb +13 -0
  36. data/lib/shopify_cli/identity_auth.rb +24 -4
  37. data/lib/shopify_cli/messages/messages.rb +15 -1
  38. data/lib/shopify_cli/release.rb +1 -1
  39. data/lib/shopify_cli/services/app/create/rails_service.rb +9 -1
  40. data/lib/shopify_cli/services/app/serve/node_service.rb +2 -25
  41. data/lib/shopify_cli/services/app/serve/php_service.rb +2 -25
  42. data/lib/shopify_cli/services/app/serve/rails_service.rb +8 -28
  43. data/lib/shopify_cli/services/app/serve/serve_service.rb +57 -0
  44. data/lib/shopify_cli/services.rb +1 -0
  45. data/lib/shopify_cli/tasks/update_dashboard_urls.rb +7 -9
  46. data/lib/shopify_cli/theme/dev_server/remote_watcher/json_files_update_job.rb +1 -0
  47. data/lib/shopify_cli/theme/dev_server/watcher.rb +2 -8
  48. data/lib/shopify_cli/theme/dev_server.rb +3 -2
  49. data/lib/shopify_cli/theme/theme.rb +21 -7
  50. data/lib/shopify_cli/theme/theme_admin_api.rb +23 -8
  51. data/lib/shopify_cli/version.rb +1 -1
  52. data/vendor/deps/cli-ui/lib/cli/ui/os.rb +8 -0
  53. metadata +12 -2
@@ -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
@@ -1,3 +1,3 @@
1
1
  module ShopifyCLI
2
- VERSION = "2.15.2"
2
+ VERSION = "2.15.3"
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.3
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-07 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