shopify-cli 2.20.1 → 2.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2bab2227e665dd4dec8e90ca261705072971a838f85d19bcbb85d18ed1a1d5b0
4
- data.tar.gz: 90e22472586a681a26974882b79ac3fd326fdcf696db2aa29201ab5d9a37c2b0
3
+ metadata.gz: 8971e6497feaa24c2fd34b00c29208f44ffb4cd6405b1b1ec08324b41ade05ad
4
+ data.tar.gz: 111bbf0f53d8d57812916ee930773887e07163008bd04a1796312378148d70ea
5
5
  SHA512:
6
- metadata.gz: 24701865a98be1b3062ff7644fff3d35b61532803e96c39d84c7fae636b8205531e57e41641d1222dbd09275288e4dee2f2f94c837d58846212a0f4ed1643b28
7
- data.tar.gz: 6e5c53ef75f07879d338692ce9271749002c13f8174a19fe3857b3396ec1512a2368770ec50bd24de2a0c9dc325dddb5b3547564c79cc360a40d1b19b35d2c50
6
+ metadata.gz: f83037ed5100015bb76f76864af37bff6a735c61d43f1d7870f67441f45d565530e2ebe43537f1f0891a6eda67a2631604916359b678ab8a7d262576a576171d
7
+ data.tar.gz: 7dd3af12ba1f384d7232c48c5a6f2724a99917eeb598d61d9a01cb86be4d2f114142daf226dc4f58f8083b4f0f8937cbd7f55d9b9283272be4e5c8c6e257ae04
data/CHANGELOG.md CHANGED
@@ -2,6 +2,17 @@ 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.21.0 - 2022-08-03
6
+
7
+ ### Fixed
8
+ * [#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
9
+ * [#2463](https://github.com/Shopify/shopify-cli/pull/2463): Fix for "Keep the remote version" deletes files on new development theme
10
+ * [#2405](https://github.com/Shopify/shopify-cli/pull/2405): Fix `theme serve` to trigger page refresh when a file is deleted
11
+ * [#2489](https://github.com/Shopify/shopify-cli/pull/2489): Fix `theme serve` to hot reload many occurrences of a stylesheet
12
+
13
+ ### Added
14
+ * [#2496](https://github.com/Shopify/shopify-cli/pull/2496): Accept storefront renderer token from ENV variable
15
+
5
16
  ## Version 2.20.1 - 2022-07-18
6
17
 
7
18
  ### 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.21.0)
5
5
  bugsnag (~> 6.22)
6
6
  listen (~> 3.7.0)
7
7
  theme-check (~> 1.10.3)
@@ -54,6 +54,7 @@ module ShopifyCLI
54
54
  # Authentication
55
55
  AUTH_TOKEN = "SHOPIFY_CLI_AUTH_TOKEN"
56
56
  ADMIN_AUTH_TOKEN = "SHOPIFY_CLI_ADMIN_AUTH_TOKEN"
57
+ STOREFRONT_RENDERER_AUTH_TOKEN = "SHOPIFY_CLI_STOREFRONT_RENDERER_AUTH_TOKEN"
57
58
 
58
59
  # Monorail
59
60
  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
@@ -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
@@ -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
43
  .reject { |file| @ignore_filter&.ignore?(file) }
42
44
  .map { |file| @theme[file] }
43
45
 
44
46
  files -= liquid_css_files = files.select(&:liquid_css?)
45
47
 
48
+ deleted_files = removed
49
+ .reject { |file| @ignore_filter&.ignore?(file) }
50
+ .map { |file| @theme[file] }
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
@@ -393,7 +393,11 @@ module ShopifyCLI
393
393
  end
394
394
 
395
395
  def overwrite_json?
396
- @overwrite_json
396
+ theme_created_at_runtime? || @overwrite_json
397
+ end
398
+
399
+ def theme_created_at_runtime?
400
+ @theme.created_at_runtime?
397
401
  end
398
402
 
399
403
  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,
@@ -1,3 +1,3 @@
1
1
  module ShopifyCLI
2
- VERSION = "2.20.1"
2
+ VERSION = "2.21.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.21.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-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -507,6 +507,7 @@ files:
507
507
  - lib/shopify_cli/theme/dev_server/hot-reload-no-script.html
508
508
  - lib/shopify_cli/theme/dev_server/hot-reload.js
509
509
  - lib/shopify_cli/theme/dev_server/hot_reload.rb
510
+ - lib/shopify_cli/theme/dev_server/hot_reload/remote_file_deleter.rb
510
511
  - lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb
511
512
  - lib/shopify_cli/theme/dev_server/hot_reload/sections_index.rb
512
513
  - lib/shopify_cli/theme/dev_server/local_assets.rb