shopify-cli 2.20.1 → 2.23.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2bab2227e665dd4dec8e90ca261705072971a838f85d19bcbb85d18ed1a1d5b0
4
- data.tar.gz: 90e22472586a681a26974882b79ac3fd326fdcf696db2aa29201ab5d9a37c2b0
3
+ metadata.gz: db890ff22a5395154b92a4cf782ad621c2462b8aac8cc843c102be2a388a098b
4
+ data.tar.gz: e1ce745c465a52a84b33075e0b7ba8ffe15a10397061a9a5bea5bc1bd3669618
5
5
  SHA512:
6
- metadata.gz: 24701865a98be1b3062ff7644fff3d35b61532803e96c39d84c7fae636b8205531e57e41641d1222dbd09275288e4dee2f2f94c837d58846212a0f4ed1643b28
7
- data.tar.gz: 6e5c53ef75f07879d338692ce9271749002c13f8174a19fe3857b3396ec1512a2368770ec50bd24de2a0c9dc325dddb5b3547564c79cc360a40d1b19b35d2c50
6
+ metadata.gz: 506f249416682dda65299eaf0dd6d589f1dea1fbb2097f92f4738e5ad529184aabeb3b84387ed8d012db60da271e28ef53df24a9c49a85bdcfab0d722be23459
7
+ data.tar.gz: 7fdb0b575be5f09c9185479a04313bb16f0144e21316ebe48e17e98ef80d9766d765760c6d65fdcca1611eb367f2a3b59153c60f6406f92e5c98fa4cd1c36b58
data/.github/CODEOWNERS CHANGED
@@ -1,5 +1,5 @@
1
1
  * @shopify/core-build-learn
2
- * @shopify/development-lifecycle
2
+ * @shopify/cli-foundations
3
3
 
4
4
  /lib/project_types/script/ @shopify/scripts-platform
5
5
  /test/project_types/script/ @shopify/scripts-platform
@@ -22,7 +22,6 @@ jobs:
22
22
  - 2.6.6
23
23
  - 2.7.5
24
24
  os:
25
- - macos-10.15
26
25
  - macos-11
27
26
  - ubuntu-20.04
28
27
  - ubuntu-18.04
data/CHANGELOG.md CHANGED
@@ -2,6 +2,32 @@ From version 2.6.0, the sections in this file adhere to the [keep a changelog](h
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## Version 2.23.0 - 2022-08-22
6
+
7
+ ### Fixed
8
+ * [#2528](https://github.com/Shopify/shopify-cli/pull/2528): Switch from using absolute file paths to relative paths for ignore filter
9
+
10
+ ### Added
11
+ * [#2520](https://github.com/Shopify/shopify-cli/pull/2520): Add the option to ignore new version warnings by passing the `SHOPIFY_CLI_RUN_AS_SUBPROCESS` environment variable
12
+ * [#2440](https://github.com/Shopify/shopify-cli/pull/2440): Warn when using CLI 2.0 in a CLI 3.0 project
13
+
14
+ ## Version 2.22.0 - 2022-08-08
15
+
16
+ ### Fixed
17
+ * [#2512](https://github.com/Shopify/shopify-cli/pull/2512): Add the `-t/--theme` parameter to the `shopify theme serve -h` message
18
+ * [#2505](https://github.com/Shopify/shopify-cli/pull/2505): Show warning messages when `shopify theme push/pull` has errors
19
+
20
+ ## Version 2.21.0 - 2022-08-03
21
+
22
+ ### Fixed
23
+ * [#2453](https://github.com/Shopify/shopify-cli/pull/2453): Fix [#2382](https://github.com/Shopify/shopify-cli/issues/2382): Ensure we wait 24 hours to show update message again
24
+ * [#2463](https://github.com/Shopify/shopify-cli/pull/2463): Fix for "Keep the remote version" deletes files on new development theme
25
+ * [#2405](https://github.com/Shopify/shopify-cli/pull/2405): Fix `theme serve` to trigger page refresh when a file is deleted
26
+ * [#2489](https://github.com/Shopify/shopify-cli/pull/2489): Fix `theme serve` to hot reload many occurrences of a stylesheet
27
+
28
+ ### Added
29
+ * [#2496](https://github.com/Shopify/shopify-cli/pull/2496): Accept storefront renderer token from ENV variable
30
+
5
31
  ## Version 2.20.1 - 2022-07-18
6
32
 
7
33
  ### Fixed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shopify-cli (2.20.1)
4
+ shopify-cli (2.23.0)
5
5
  bugsnag (~> 6.22)
6
6
  listen (~> 3.7.0)
7
7
  theme-check (~> 1.10.3)
@@ -1,14 +1,3 @@
1
- payment_methods:
2
- domain: 'checkout'
3
- libraries:
4
- typescript:
5
- beta: true
6
- package: "@shopify/scripts-checkout-apis"
7
- repo: "https://github.com/Shopify/function-examples"
8
- wasm:
9
- repo: "https://github.com/Shopify/function-examples"
10
- rust:
11
- repo: "https://github.com/Shopify/function-examples"
12
1
  payment_customization:
13
2
  beta: true
14
3
  domain: 'checkout'
@@ -20,10 +9,6 @@ payment_customization:
20
9
  shipping_methods:
21
10
  domain: 'checkout'
22
11
  libraries:
23
- typescript:
24
- beta: true
25
- package: "@shopify/scripts-checkout-apis"
26
- repo: "https://github.com/Shopify/function-examples"
27
12
  wasm:
28
13
  repo: "https://github.com/Shopify/function-examples"
29
14
  rust:
@@ -52,7 +52,11 @@ module Theme
52
52
  CLI::UI::Frame.open(@ctx.message("theme.pull.pulling", theme.name, theme.id, theme.shop)) do
53
53
  UI::SyncProgressBar.new(syncer).progress(:download_theme!, delete: delete)
54
54
  end
55
- @ctx.done(@ctx.message("theme.pull.done"))
55
+ if syncer.has_any_error?
56
+ @ctx.warn(@ctx.message("theme.pull.done_with_errors"))
57
+ else
58
+ @ctx.done(@ctx.message("theme.pull.done"))
59
+ end
56
60
  rescue ShopifyCLI::API::APIRequestNotFoundError
57
61
  @ctx.abort(@ctx.message("theme.pull.theme_not_found", "##{theme.id}"))
58
62
  ensure
@@ -63,20 +63,12 @@ module Theme
63
63
  syncer.start_threads
64
64
  if options.flags[:json]
65
65
  syncer.upload_theme!(delete: delete)
66
- puts(JSON.generate(theme: theme.to_h))
67
66
  else
68
67
  CLI::UI::Frame.open(@ctx.message("theme.push.info.pushing", theme.name, theme.id, theme.shop)) do
69
68
  UI::SyncProgressBar.new(syncer).progress(:upload_theme!, delete: delete)
70
69
  end
71
-
72
- if options.flags[:publish]
73
- theme.publish
74
- @ctx.done(@ctx.message("theme.publish.done", theme.preview_url))
75
- else
76
- @ctx.done(@ctx.message("theme.push.done", theme.preview_url, theme.editor_url))
77
- end
78
70
  end
79
- raise ShopifyCLI::AbortSilent if syncer.has_any_error?
71
+ push_completion_handler(theme, syncer.has_any_error?)
80
72
  ensure
81
73
  syncer.shutdown
82
74
  end
@@ -90,6 +82,23 @@ module Theme
90
82
 
91
83
  private
92
84
 
85
+ def push_completion_handler(theme, has_errors)
86
+ if options.flags[:json]
87
+ output = { theme: theme.to_h }
88
+ output[:warning] = @ctx.message("theme.push.with_errors") if has_errors
89
+
90
+ puts(JSON.generate(output))
91
+ elsif options.flags[:publish]
92
+ theme.publish
93
+ return @ctx.done(@ctx.message("theme.publish.done", theme.preview_url)) unless has_errors
94
+ @ctx.warn(@ctx.message("theme.publish.done_with_errors", theme.preview_url))
95
+ else
96
+ return @ctx.done(@ctx.message("theme.push.done", theme.preview_url, theme.editor_url)) unless has_errors
97
+ @ctx.warn(@ctx.message("theme.push.done_with_errors", theme.preview_url, theme.editor_url))
98
+ end
99
+ raise ShopifyCLI::AbortSilent if has_errors
100
+ end
101
+
93
102
  def find_theme(root, theme_id: nil, theme: nil, live: nil, development: nil, unpublished: nil, **_args)
94
103
  if theme_id
95
104
  @ctx.warn(@ctx.message("theme.push.deprecated_themeid"))
@@ -43,6 +43,7 @@ module Theme
43
43
  Run without arguments to select theme from a list.
44
44
  HELP
45
45
  done: "Your theme is now live at %s",
46
+ done_with_errors: "{{warning:Your theme was published with errors and is now live at %s.}}",
46
47
  not_found: "Theme #%s does not exist",
47
48
  no_themes_error: "You don't have any theme to be published.",
48
49
  no_themes_resolution: "Try to create an unpublished theme with {{command:theme push -u -t <theme_name>}}.",
@@ -102,7 +103,17 @@ module Theme
102
103
  {{info:Customize this theme in the Theme Editor:}}
103
104
  {{underline:%s}}
104
105
  DONE
106
+ done_with_errors: <<~WARN,
107
+ {{yellow:Your theme was pushed with errors.}}
108
+
109
+ {{info:View your theme:}}
110
+ {{underline:%s}}
111
+
112
+ {{info:Customize this theme in the Theme Editor:}}
113
+ {{underline:%s}}
114
+ WARN
105
115
  name: "Theme name",
116
+ with_errors: "Theme pushed with errors.",
106
117
  },
107
118
  serve: {
108
119
  theme_not_found: "Theme \"%s\" doesn't exist",
@@ -112,14 +123,15 @@ module Theme
112
123
  Usage: {{command:%s theme serve [ ROOT ]}}
113
124
 
114
125
  Options:
115
- {{command:--port=PORT}} Local port to serve theme preview from.
116
- {{command:--poll}} Force polling to detect file changes.
117
- {{command:--host=HOST}} Set which network interface the web server listens on. The default value is 127.0.0.1.
118
- {{command:--theme-editor-sync}} Synchronize Theme Editor updates in the local theme files.
119
- {{command:--live-reload=MODE}} The live reload mode switches the server behavior when a file is modified:
120
- - {{command:hot-reload}} Hot reloads local changes to CSS and sections (default)
121
- - {{command:full-page}} Always refreshes the entire page
122
- - {{command:off}} Deactivate live reload
126
+ {{command:-t, --theme=NAME_OR_ID}} Theme ID or name of the remote theme.
127
+ {{command:--port=PORT}} Local port to serve theme preview from.
128
+ {{command:--poll}} Force polling to detect file changes.
129
+ {{command:--host=HOST}} Set which network interface the web server listens on. The default value is 127.0.0.1.
130
+ {{command:--theme-editor-sync}} Synchronize Theme Editor updates in the local theme files.
131
+ {{command:--live-reload=MODE}} The live reload mode switches the server behavior when a file is modified:
132
+ - {{command:hot-reload}} Hot reloads local changes to CSS and sections (default)
133
+ - {{command:full-page}} Always refreshes the entire page
134
+ - {{command:off}} Deactivate live reload
123
135
  HELP
124
136
  reload_mode_is_not_valid: "The live reload mode `%s` is not valid.",
125
137
  try_a_valid_reload_mode: "Try a valid live reload mode: %s.",
@@ -318,7 +330,8 @@ module Theme
318
330
  HELP
319
331
  select: "Select a theme to pull from",
320
332
  pulling: "Pulling theme files from %s (#%s) on %s",
321
- done: "Theme pulled successfully",
333
+ done: "Theme pulled successfully.",
334
+ done_with_errors: "{{warning:Your theme was pulled with errors.}}",
322
335
  deprecated_themeid: <<~WARN,
323
336
  {{warning:The {{command:-i, --themeid}} flag is deprecated. Use {{command:-t, --theme}} instead.}}
324
337
  WARN
@@ -31,6 +31,7 @@ module ShopifyCLI
31
31
  module EnvironmentVariables
32
32
  STACKTRACE = "SHOPIFY_CLI_STACKTRACE"
33
33
  TTY = "SHOPIFY_CLI_TTY"
34
+ RUN_AS_SUBPROCESS = "SHOPIFY_CLI_RUN_AS_SUBPROCESS"
34
35
 
35
36
  # When true the CLI points to a local instance of
36
37
  # the partners dashboard and identity.
@@ -54,6 +55,7 @@ module ShopifyCLI
54
55
  # Authentication
55
56
  AUTH_TOKEN = "SHOPIFY_CLI_AUTH_TOKEN"
56
57
  ADMIN_AUTH_TOKEN = "SHOPIFY_CLI_ADMIN_AUTH_TOKEN"
58
+ STOREFRONT_RENDERER_AUTH_TOKEN = "SHOPIFY_CLI_STOREFRONT_RENDERER_AUTH_TOKEN"
57
59
 
58
60
  # Monorail
59
61
  MONORAIL_REAL_EVENTS = "MONORAIL_REAL_EVENTS"
@@ -628,9 +628,10 @@ module ShopifyCLI
628
628
  thread = Thread.new { retrieve_latest_gem_version }
629
629
  at_exit { thread.join }
630
630
  end
631
+ latest_version =
632
+ ShopifyCLI::Config.get(VERSION_CHECK_SECTION, LATEST_VERSION_FIELD, default: ShopifyCLI::VERSION)
633
+ latest_version if ::Semantic::Version.new(latest_version) > ::Semantic::Version.new(ShopifyCLI::VERSION)
631
634
  end
632
- latest_version = ShopifyCLI::Config.get(VERSION_CHECK_SECTION, LATEST_VERSION_FIELD, default: ShopifyCLI::VERSION)
633
- latest_version if ::Semantic::Version.new(latest_version) > ::Semantic::Version.new(ShopifyCLI::VERSION)
634
635
  end
635
636
 
636
637
  # Returns file extension depending on OS
@@ -0,0 +1,20 @@
1
+ module ShopifyCLI
2
+ module Core
3
+ ##
4
+ # ShopifyCLI::Core::CliVersion checks that the CLI in use is correct for the project.
5
+ #
6
+ class CliVersion
7
+ class << self
8
+ def using_3_0?
9
+ !!cli_3_0_toml_dir
10
+ end
11
+
12
+ private
13
+
14
+ def cli_3_0_toml_dir
15
+ Utilities.directory("shopify.app.toml", Dir.pwd)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -5,13 +5,27 @@ module ShopifyCLI
5
5
  module EntryPoint
6
6
  class << self
7
7
  def call(args, ctx = Context.new)
8
- if ctx.development? && !ctx.testing?
9
- ctx.warn(
10
- ctx.message("core.warning.development_version", File.join(ShopifyCLI::ROOT, "bin", ShopifyCLI::TOOL_NAME))
11
- )
12
- elsif !ctx.testing?
13
- new_version = ctx.new_version
14
- ctx.warn(ctx.message("core.warning.new_version", ShopifyCLI::VERSION, new_version)) unless new_version.nil?
8
+ # Only instruct the user to update the CLI, or warn them that they're
9
+ # using CLI2 not CLI3, if they're running CLI2 directly. Otherwise the
10
+ # warnings will be confusing and/or incorrect.
11
+ unless Environment.run_as_subprocess?
12
+ if ctx.development? && !ctx.testing?
13
+ ctx.warn(
14
+ ctx.message(
15
+ "core.warning.development_version",
16
+ File.join(ShopifyCLI::ROOT, "bin", ShopifyCLI::TOOL_NAME)
17
+ )
18
+ )
19
+ # because `!ctx.new_version.nil?` will change the config by calling ::Config.set
20
+ # it's important to keep the checks in this order so that we don't trigger it while testing
21
+ # since changing the config will throw errors
22
+ elsif !ctx.testing? && !ctx.new_version.nil?
23
+ ctx.warn(ctx.message("core.warning.new_version", ShopifyCLI::VERSION, ctx.new_version))
24
+ end
25
+
26
+ if ShopifyCLI::Core::CliVersion.using_3_0?
27
+ ctx.warn(ctx.message("core.warning.in_3_0_directory"))
28
+ end
15
29
  end
16
30
 
17
31
  ProjectType.load_all
@@ -4,5 +4,6 @@ module ShopifyCLI
4
4
  autoload :Executor, "shopify_cli/core/executor"
5
5
  autoload :HelpResolver, "shopify_cli/core/help_resolver"
6
6
  autoload :Monorail, "shopify_cli/core/monorail"
7
+ autoload :CliVersion, "shopify_cli/core/cli_version"
7
8
  end
8
9
  end
@@ -170,6 +170,10 @@ module ShopifyCLI
170
170
  env_variables[Constants::EnvironmentVariables::ADMIN_AUTH_TOKEN]
171
171
  end
172
172
 
173
+ def self.storefront_renderer_auth_token(env_variables: ENV)
174
+ env_variables[Constants::EnvironmentVariables::STOREFRONT_RENDERER_AUTH_TOKEN]
175
+ end
176
+
173
177
  def self.store(env_variables: ENV)
174
178
  env_variables[Constants::EnvironmentVariables::STORE]
175
179
  end
@@ -177,5 +181,12 @@ module ShopifyCLI
177
181
  def self.env_variable_truthy?(variable_name, env_variables: ENV)
178
182
  TRUTHY_ENV_VARIABLE_VALUES.include?(env_variables[variable_name.to_s])
179
183
  end
184
+
185
+ def self.run_as_subprocess?(env_variables: ENV)
186
+ env_variable_truthy?(
187
+ Constants::EnvironmentVariables::RUN_AS_SUBPROCESS,
188
+ env_variables: env_variables
189
+ )
190
+ end
180
191
  end
181
192
  end
@@ -791,6 +791,16 @@ module ShopifyCLI
791
791
  {{underline:https://shopify.dev/tools/cli/troubleshooting#upgrade-shopify-cli}}}}
792
792
 
793
793
  MESSAGE
794
+
795
+ in_3_0_directory: <<~MESSAGE,
796
+ {{*}} {{yellow:You appear to be working with a CLI 3.0 project, but running a CLI 2.0 command. New syntax documentation: https://shopify.dev/apps/tools/cli/commands#command-syntax}}
797
+
798
+ For more information on CLI 3.0, see the documentation:
799
+ {{underline:https://shopify.dev/apps/tools/cli}}
800
+
801
+ Already have CLI 3.0 installed? Run it using your node package manager, as explained here:
802
+ {{underline:https://shopify.dev/apps/tools/cli/cli-2#running-shopify-cli-2-x-and-3-x-in-the-same-environment}}
803
+ MESSAGE
794
804
  },
795
805
  reporting: {
796
806
  help: <<~HELP,
@@ -119,18 +119,9 @@ module ShopifyCLI
119
119
  private
120
120
 
121
121
  def directory(dir)
122
- @dir ||= Hash.new { |h, k| h[k] = __directory(k) }
122
+ @dir ||= Hash.new { |h, k| h[k] = Utilities.directory(".shopify-cli.yml", k) }
123
123
  @dir[dir]
124
124
  end
125
-
126
- def __directory(curr)
127
- loop do
128
- return nil if curr == "/" || /^[A-Z]:\/$/.match?(curr)
129
- file = File.join(curr, ".shopify-cli.yml")
130
- return curr if File.exist?(file)
131
- curr = File.dirname(curr)
132
- end
133
- end
134
125
  end
135
126
 
136
127
  property :directory # :nodoc:
@@ -30,7 +30,7 @@ module ShopifyCLI
30
30
  def parse(directory)
31
31
  File.read(path(directory))
32
32
  .gsub("\r\n", "\n").split("\n").each_with_object({}) do |line, output|
33
- match = /\A([A-Za-z_0-9]+)\s*=\s*(.*)\z/.match(line)
33
+ match = /\A(#*\s*[A-Za-z_0-9]+)\s*=\s*(.*)\z/.match(line)
34
34
  if match
35
35
  key = match[1]
36
36
  output[key] = case match[2]
@@ -14,7 +14,7 @@
14
14
  function connect() {
15
15
  const eventSource = new EventSource('/hot-reload');
16
16
 
17
- eventSource.onmessage = handleUpdate;
17
+ eventSource.onmessage = onMessage;
18
18
 
19
19
  eventSource.onopen = () => console.log('[HotReload] SSE connected.');
20
20
 
@@ -97,10 +97,23 @@
97
97
  window.location.reload();
98
98
  }
99
99
 
100
- function handleUpdate(message) {
101
- var data = JSON.parse(message.data);
100
+ function onMessage(message) {
101
+ const data = JSON.parse(message.data);
102
+ if (data.reload_page) {
103
+ refreshPage([]);
104
+ return;
105
+ }
106
+
107
+ handleUpdate(data);
108
+ }
109
+
110
+ function handleUpdate(data) {
102
111
  var modifiedFiles = data.modified;
103
112
 
113
+ if (modifiedFiles === undefined) {
114
+ return;
115
+ }
116
+
104
117
  if (isRefreshRequired(modifiedFiles)) {
105
118
  refreshPage(modifiedFiles);
106
119
  } else {
@@ -114,13 +127,15 @@
114
127
 
115
128
  function reloadCssFile(filename) {
116
129
  // Find a stylesheet link starting with /assets (locally-served only) containing the filename
117
- let link = document.querySelector(`link[href^="/assets"][href*="${filename}"][rel="stylesheet"]`);
130
+ let links = document.querySelectorAll(`link[href^="/assets"][href*="${filename}"][rel="stylesheet"]`);
118
131
 
119
- if (!link) {
132
+ if (!links.length) {
120
133
  console.log(`[HotReload] Could not find link for stylesheet ${filename}`);
121
134
  } else {
122
- link.href = new URL(link.href).pathname + `?v=${Date.now()}`;
123
- console.log(`[HotReload] Reloaded stylesheet ${filename}`);
135
+ links.forEach(link => {
136
+ link.href = new URL(link.href).pathname + `?v=${Date.now()}`;
137
+ console.log(`[HotReload] Reloaded stylesheet ${filename}`);
138
+ })
124
139
  }
125
140
  }
126
141
 
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyCLI
4
+ module Theme
5
+ module DevServer
6
+ class HotReload
7
+ class RemoteFileDeleter
8
+ def initialize(ctx, theme:, streams:)
9
+ @ctx = ctx
10
+ @theme = theme
11
+ @streams = streams
12
+ end
13
+
14
+ def delete(file)
15
+ retries = 6
16
+
17
+ until retries.zero?
18
+ retries -= 1
19
+
20
+ _status, body = fetch_asset(file)
21
+ retries = 0 if deleted_file?(body)
22
+
23
+ wait
24
+ end
25
+
26
+ notify(file)
27
+ end
28
+
29
+ private
30
+
31
+ def api_client
32
+ @api_client ||= ThemeAdminAPI.new(@ctx, @theme.shop)
33
+ end
34
+
35
+ def deleted_file?(body)
36
+ remote_checksum = body.dig("asset", "checksum")
37
+
38
+ remote_checksum.nil?
39
+ end
40
+
41
+ def notify(file)
42
+ @streams.broadcast(JSON.generate(deleted: [file]))
43
+ @ctx.debug("[RemoteFileDeleter] Deleted #{file}")
44
+ end
45
+
46
+ def wait
47
+ sleep(1)
48
+ end
49
+
50
+ def fetch_asset(file)
51
+ api_client.get(
52
+ path: "themes/#{@theme.id}/assets.json",
53
+ query: URI.encode_www_form("asset[key]" => file.relative_path),
54
+ )
55
+ rescue ShopifyCLI::API::APIRequestNotFoundError
56
+ [404, {}]
57
+ end
58
+ end
59
+ end
60
+ end
61
+ end
62
+ end
@@ -1,6 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require_relative "hot_reload/remote_file_reloader"
4
+ require_relative "hot_reload/remote_file_deleter"
4
5
  require_relative "hot_reload/sections_index"
5
6
 
6
7
  module ShopifyCLI
@@ -14,6 +15,7 @@ module ShopifyCLI
14
15
  @mode = mode
15
16
  @streams = SSE::Streams.new
16
17
  @remote_file_reloader = RemoteFileReloader.new(ctx, theme: @theme, streams: @streams)
18
+ @remote_file_deleter = RemoteFileDeleter.new(ctx, theme: @theme, streams: @streams)
17
19
  @sections_index = SectionsIndex.new(@theme)
18
20
  @watcher = watcher
19
21
  @watcher.add_observer(self, :notify_streams_of_file_change)
@@ -36,13 +38,20 @@ module ShopifyCLI
36
38
  @streams.close
37
39
  end
38
40
 
39
- def notify_streams_of_file_change(modified, added, _removed)
41
+ def notify_streams_of_file_change(modified, added, removed)
40
42
  files = (modified + added)
41
- .reject { |file| @ignore_filter&.ignore?(file) }
42
43
  .map { |file| @theme[file] }
44
+ .reject { |file| @ignore_filter&.ignore?(file.relative_path) }
43
45
 
44
46
  files -= liquid_css_files = files.select(&:liquid_css?)
45
47
 
48
+ deleted_files = removed
49
+ .map { |file| @theme[file] }
50
+ .reject { |file| @ignore_filter&.ignore?(file.relative_path) }
51
+
52
+ remote_delete(deleted_files) unless deleted_files.empty?
53
+ reload_page(removed) unless deleted_files.empty?
54
+
46
55
  hot_reload(files) unless files.empty?
47
56
  remote_reload(liquid_css_files)
48
57
  end
@@ -55,8 +64,21 @@ module ShopifyCLI
55
64
  @ctx.debug("[HotReload] Modified #{paths.join(", ")}")
56
65
  end
57
66
 
67
+ def reload_page(removed)
68
+ @streams.broadcast(JSON.generate(reload_page: true))
69
+ @ctx.debug("[ReloadPage] Deleted #{removed.join(", ")}")
70
+ end
71
+
72
+ def remote_delete(files)
73
+ files.each do |file|
74
+ @ctx.debug("delete file each -> file.relative_path #{file.relative_path}")
75
+ @remote_file_deleter.delete(file)
76
+ end
77
+ end
78
+
58
79
  def remote_reload(files)
59
80
  files.each do |file|
81
+ @ctx.debug("reload file each -> file.relative_path #{file.relative_path}")
60
82
  @remote_file_reloader.reload(file)
61
83
  end
62
84
  end
@@ -94,6 +94,7 @@ module ShopifyCLI
94
94
  end
95
95
 
96
96
  def bearer_token
97
+ Environment.storefront_renderer_auth_token ||
97
98
  ShopifyCLI::DB.get(:storefront_renderer_production_exchange_token) ||
98
99
  raise(KeyError, "storefront_renderer_production_exchange_token missing")
99
100
  end
@@ -10,7 +10,7 @@ module ShopifyCLI
10
10
  end
11
11
 
12
12
  def ignore_file?(file)
13
- path = file.path
13
+ path = file.relative_path
14
14
  ignore_path?(path)
15
15
  end
16
16
 
@@ -382,7 +382,9 @@ module ShopifyCLI
382
382
  rescue JSON::ParserError
383
383
  [exception.message]
384
384
  rescue StandardError => e
385
- ["The asset #{operation.file} is could not be synced (cause: #{e.message})."]
385
+ cause = "(cause: #{e.message})"
386
+ backtrace = e.backtrace.join("\n")
387
+ ["The asset #{operation.file} could not be synced #{cause} #{backtrace}"]
386
388
  end
387
389
 
388
390
  def backoff_if_near_limit!(used, limit)
@@ -393,7 +395,11 @@ module ShopifyCLI
393
395
  end
394
396
 
395
397
  def overwrite_json?
396
- @overwrite_json
398
+ theme_created_at_runtime? || @overwrite_json
399
+ end
400
+
401
+ def theme_created_at_runtime?
402
+ @theme.created_at_runtime?
397
403
  end
398
404
 
399
405
  def backingoff?
@@ -120,6 +120,7 @@ module ShopifyCLI
120
120
  )
121
121
 
122
122
  @id = body["theme"]["id"]
123
+ @created_at_runtime = true
123
124
  end
124
125
 
125
126
  def delete
@@ -147,6 +148,10 @@ module ShopifyCLI
147
148
  development? && id != ShopifyCLI::DB.get(:development_theme_id)
148
149
  end
149
150
 
151
+ def created_at_runtime?
152
+ @created_at_runtime ||= false
153
+ end
154
+
150
155
  def to_h
151
156
  {
152
157
  id: id,
@@ -3,5 +3,14 @@ module ShopifyCLI
3
3
  def self.version_dropping_pre_and_build(version)
4
4
  Semantic::Version.new("#{version.major}.#{version.minor}.#{version.patch}")
5
5
  end
6
+
7
+ def self.directory(pattern, curr)
8
+ loop do
9
+ return nil if curr == "/" || /^[A-Z]:\/$/.match?(curr)
10
+ file = File.join(curr, pattern)
11
+ return curr if File.exist?(file)
12
+ curr = File.dirname(curr)
13
+ end
14
+ end
6
15
  end
7
16
  end
@@ -1,3 +1,3 @@
1
1
  module ShopifyCLI
2
- VERSION = "2.20.1"
2
+ VERSION = "2.23.0"
3
3
  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.20.1
4
+ version: 2.23.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-18 00:00:00.000000000 Z
11
+ date: 2022-08-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -422,6 +422,7 @@ files:
422
422
  - lib/shopify_cli/constants.rb
423
423
  - lib/shopify_cli/context.rb
424
424
  - lib/shopify_cli/core.rb
425
+ - lib/shopify_cli/core/cli_version.rb
425
426
  - lib/shopify_cli/core/entry_point.rb
426
427
  - lib/shopify_cli/core/executor.rb
427
428
  - lib/shopify_cli/core/finalize.rb
@@ -507,6 +508,7 @@ files:
507
508
  - lib/shopify_cli/theme/dev_server/hot-reload-no-script.html
508
509
  - lib/shopify_cli/theme/dev_server/hot-reload.js
509
510
  - lib/shopify_cli/theme/dev_server/hot_reload.rb
511
+ - lib/shopify_cli/theme/dev_server/hot_reload/remote_file_deleter.rb
510
512
  - lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb
511
513
  - lib/shopify_cli/theme/dev_server/hot_reload/sections_index.rb
512
514
  - lib/shopify_cli/theme/dev_server/local_assets.rb