shopify-cli 2.13.0 → 2.15.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.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +5 -0
- data/.github/CONTRIBUTING.md +1 -1
- data/.github/PULL_REQUEST_TEMPLATE.md +1 -1
- data/.github/workflows/stale.yml +46 -0
- data/CHANGELOG.md +36 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +43 -11
- data/Rakefile +43 -0
- data/ext/javy/hashes/javy-arm-macos-v0.2.1.gz.sha256 +1 -0
- data/ext/javy/hashes/javy-x86_64-linux-v0.2.1.gz.sha256 +1 -0
- data/ext/javy/hashes/javy-x86_64-macos-v0.2.1.gz.sha256 +1 -0
- data/ext/javy/hashes/javy-x86_64-windows-v0.2.1.gz.sha256 +1 -0
- data/ext/javy/version +1 -1
- data/ext/shopify-extensions/version +1 -1
- data/lib/project_types/extension/forms/questions/ask_template.rb +5 -8
- data/lib/project_types/extension/messages/messages.rb +10 -0
- data/lib/project_types/extension/models/development_server_requirements.rb +13 -7
- data/lib/project_types/extension/models/npm_package.rb +19 -1
- data/lib/project_types/extension/models/server_config/development_renderer.rb +4 -3
- data/lib/project_types/extension/models/server_config/root.rb +2 -0
- data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +13 -0
- data/lib/project_types/script/cli.rb +0 -4
- data/lib/project_types/script/config/extension_points.yml +18 -6
- data/lib/project_types/script/layers/application/build_script.rb +3 -18
- data/lib/project_types/script/layers/application/push_script.rb +12 -10
- data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +0 -1
- data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +0 -1
- data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +2 -10
- data/lib/project_types/script/layers/infrastructure/languages/wasm_task_runner.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -23
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +1 -1
- data/lib/project_types/script/messages/messages.rb +2 -2
- data/lib/project_types/theme/commands/package.rb +1 -0
- data/lib/project_types/theme/commands/pull.rb +2 -2
- data/lib/project_types/theme/commands/push.rb +2 -2
- data/lib/project_types/theme/conversions/base_glob.rb +20 -5
- data/lib/project_types/theme/messages/messages.rb +9 -0
- data/lib/shopify_cli/changelog.rb +76 -0
- data/lib/shopify_cli/command.rb +8 -7
- data/lib/shopify_cli/commands/app/deploy.rb +0 -1
- data/lib/shopify_cli/context.rb +2 -2
- data/lib/shopify_cli/core/entry_point.rb +1 -1
- data/lib/shopify_cli/core/monorail.rb +14 -6
- data/lib/shopify_cli/environment.rb +19 -11
- data/lib/shopify_cli/exception_reporter.rb +2 -0
- data/lib/shopify_cli/messages/messages.rb +11 -5
- data/lib/shopify_cli/packager.rb +1 -1
- data/lib/shopify_cli/release.rb +94 -0
- data/lib/shopify_cli/result.rb +14 -0
- data/lib/shopify_cli/sed.rb +19 -0
- data/lib/shopify_cli/services/app/create/node_service.rb +2 -14
- data/lib/shopify_cli/services/app/create/php_service.rb +1 -6
- data/lib/shopify_cli/services/app/create/rails_service.rb +4 -12
- data/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb +5 -5
- data/lib/shopify_cli/theme/dev_server/watcher.rb +10 -2
- data/lib/shopify_cli/theme/development_theme.rb +2 -5
- data/lib/shopify_cli/theme/syncer.rb +20 -25
- data/lib/shopify_cli/theme/theme.rb +28 -31
- data/lib/shopify_cli/theme/theme_admin_api.rb +72 -0
- data/lib/shopify_cli/transform_data_structure.rb +3 -2
- data/lib/shopify_cli/tunnel.rb +9 -0
- data/lib/shopify_cli/version.rb +1 -1
- data/shipit.yml +3 -0
- data/shopify-cli.gemspec +12 -3
- metadata +18 -10
- data/lib/project_types/rails/ruby.rb +0 -17
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +0 -36
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb +0 -109
@@ -88,24 +88,12 @@ module ShopifyCLI
|
|
88
88
|
end
|
89
89
|
|
90
90
|
def check_node
|
91
|
-
|
92
|
-
context.abort(context.message("core.app.create.node.error.node_required")) if cmd_path.nil?
|
93
|
-
|
94
|
-
version, stat = context.capture2e("node", "-v")
|
95
|
-
unless stat.success?
|
96
|
-
context.abort(context.message("core.app.create.node.error.node_version_failure"))
|
97
|
-
end
|
98
|
-
|
91
|
+
version = ShopifyCLI::Environment.node_version(context: context)
|
99
92
|
context.done(context.message("core.app.create.node.node_version", version))
|
100
93
|
end
|
101
94
|
|
102
95
|
def check_npm
|
103
|
-
|
104
|
-
context.abort(context.message("core.app.create.node.error.npm_required")) if cmd_path.nil?
|
105
|
-
|
106
|
-
version, stat = context.capture2e("npm", "-v")
|
107
|
-
context.abort(context.message("core.app.create.node.error.npm_version_failure")) unless stat.success?
|
108
|
-
|
96
|
+
version = ShopifyCLI::Environment.npm_version(context: context)
|
109
97
|
context.done(context.message("core.app.create.node.npm_version", version))
|
110
98
|
end
|
111
99
|
|
@@ -69,12 +69,7 @@ module ShopifyCLI
|
|
69
69
|
end
|
70
70
|
|
71
71
|
def check_npm
|
72
|
-
|
73
|
-
context.abort(context.message("core.app.create.php.error.npm_required")) if cmd_path.nil?
|
74
|
-
|
75
|
-
version, stat = context.capture2e("npm", "-v")
|
76
|
-
context.abort(context.message("core.app.create.php.error.npm_version_failure")) unless stat.success?
|
77
|
-
|
72
|
+
version = ShopifyCLI::Environment.npm_version(context: context)
|
78
73
|
context.done(context.message("core.app.create.php.npm_version", version))
|
79
74
|
end
|
80
75
|
|
@@ -108,7 +108,7 @@ module ShopifyCLI
|
|
108
108
|
end
|
109
109
|
|
110
110
|
def check_ruby
|
111
|
-
ruby_version =
|
111
|
+
ruby_version = Environment.ruby_version(context: context)
|
112
112
|
return if ruby_version.satisfies?("~>2.5") || ruby_version.satisfies?("~>3.1.0")
|
113
113
|
context.abort(context.message("core.app.create.rails.error.invalid_ruby_version"))
|
114
114
|
end
|
@@ -219,18 +219,10 @@ module ShopifyCLI
|
|
219
219
|
end
|
220
220
|
|
221
221
|
def install_webpacker?
|
222
|
-
rails_version
|
223
|
-
|
224
|
-
end
|
225
|
-
|
226
|
-
def rails_version
|
227
|
-
output, status = context.capture2e("rails", "--version")
|
228
|
-
unless status.success?
|
229
|
-
context.abort(context.message("core.app.create.rails.error.install_failure", "rails"))
|
230
|
-
end
|
222
|
+
rails_version = Environment.rails_version(context: context)
|
223
|
+
webpacker_config = File.exist?(File.join(context.root, "config/webpacker.yml"))
|
231
224
|
|
232
|
-
|
233
|
-
::Semantic::Version.new(version)
|
225
|
+
rails_version < ::Semantic::Version.new("7.0.0") && !webpacker_config
|
234
226
|
end
|
235
227
|
end
|
236
228
|
end
|
@@ -28,6 +28,10 @@ module ShopifyCLI
|
|
28
28
|
|
29
29
|
private
|
30
30
|
|
31
|
+
def api_client
|
32
|
+
@api_client ||= ThemeAdminAPI.new(@ctx, @theme.shop)
|
33
|
+
end
|
34
|
+
|
31
35
|
def updated_file?(body, file)
|
32
36
|
remote_checksum = body.dig("asset", "checksum")
|
33
37
|
local_checksum = file.checksum
|
@@ -45,12 +49,8 @@ module ShopifyCLI
|
|
45
49
|
end
|
46
50
|
|
47
51
|
def fetch_asset(file)
|
48
|
-
|
49
|
-
@ctx,
|
50
|
-
shop: @theme.shop,
|
52
|
+
api_client.get(
|
51
53
|
path: "themes/#{@theme.id}/assets.json",
|
52
|
-
method: "GET",
|
53
|
-
api_version: "unstable",
|
54
54
|
query: URI.encode_www_form("asset[key]" => file.relative_path.to_s),
|
55
55
|
)
|
56
56
|
rescue ShopifyCLI::API::APIRequestNotFoundError
|
@@ -45,13 +45,21 @@ module ShopifyCLI
|
|
45
45
|
def filter_theme_files(files)
|
46
46
|
files
|
47
47
|
.select { |file| @theme.theme_file?(file) }
|
48
|
-
.
|
48
|
+
.map { |file| @theme[file] }
|
49
|
+
.reject { |file| ignore_file?(file) }
|
49
50
|
end
|
50
51
|
|
51
52
|
def filter_remote_files(files)
|
52
53
|
files
|
53
54
|
.select { |file| @syncer.remote_file?(file) }
|
54
|
-
.
|
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.to_s)
|
55
63
|
end
|
56
64
|
end
|
57
65
|
end
|
@@ -45,11 +45,8 @@ module ShopifyCLI
|
|
45
45
|
def exists?
|
46
46
|
return false unless id
|
47
47
|
|
48
|
-
|
49
|
-
|
50
|
-
shop: shop,
|
51
|
-
path: "themes/#{id}.json",
|
52
|
-
api_version: "unstable",
|
48
|
+
api_client.get(
|
49
|
+
path: "themes/#{id}.json"
|
53
50
|
)
|
54
51
|
rescue ShopifyCLI::API::APIRequestNotFoundError
|
55
52
|
false
|
@@ -7,15 +7,15 @@ require "forwardable"
|
|
7
7
|
require_relative "syncer/error_reporter"
|
8
8
|
require_relative "syncer/standard_reporter"
|
9
9
|
require_relative "syncer/operation"
|
10
|
+
require_relative "theme_admin_api"
|
10
11
|
|
11
12
|
module ShopifyCLI
|
12
13
|
module Theme
|
13
14
|
class Syncer
|
14
15
|
extend Forwardable
|
15
16
|
|
16
|
-
API_VERSION = "unstable"
|
17
|
-
|
18
17
|
attr_reader :checksums
|
18
|
+
attr_reader :checksums_mutex
|
19
19
|
attr_accessor :include_filter
|
20
20
|
attr_accessor :ignore_filter
|
21
21
|
|
@@ -39,6 +39,9 @@ module ShopifyCLI
|
|
39
39
|
# Mutex used to pause all threads when backing-off when hitting API rate limits
|
40
40
|
@backoff_mutex = Mutex.new
|
41
41
|
|
42
|
+
# Mutex used to coordinate changes in the checksums (shared accross all threads)
|
43
|
+
@checksums_mutex = Mutex.new
|
44
|
+
|
42
45
|
# Latest theme assets checksums. Updated on each upload.
|
43
46
|
@checksums = {}
|
44
47
|
|
@@ -46,6 +49,10 @@ module ShopifyCLI
|
|
46
49
|
@error_checksums = []
|
47
50
|
end
|
48
51
|
|
52
|
+
def api_client
|
53
|
+
@api_client ||= ThemeAdminAPI.new(@ctx, @theme.shop)
|
54
|
+
end
|
55
|
+
|
49
56
|
def lock_io!
|
50
57
|
@reporters.each(&:disable!)
|
51
58
|
end
|
@@ -96,11 +103,8 @@ module ShopifyCLI
|
|
96
103
|
end
|
97
104
|
|
98
105
|
def fetch_checksums!
|
99
|
-
_status, response =
|
100
|
-
@
|
101
|
-
shop: @theme.shop,
|
102
|
-
path: "themes/#{@theme.id}/assets.json",
|
103
|
-
api_version: API_VERSION,
|
106
|
+
_status, response = api_client.get(
|
107
|
+
path: "themes/#{@theme.id}/assets.json"
|
104
108
|
)
|
105
109
|
update_checksums(response)
|
106
110
|
end
|
@@ -239,12 +243,8 @@ module ShopifyCLI
|
|
239
243
|
asset[:attachment] = Base64.encode64(file.read)
|
240
244
|
end
|
241
245
|
|
242
|
-
_status, body, response =
|
243
|
-
@ctx,
|
244
|
-
shop: @theme.shop,
|
246
|
+
_status, body, response = api_client.put(
|
245
247
|
path: "themes/#{@theme.id}/assets.json",
|
246
|
-
method: "PUT",
|
247
|
-
api_version: API_VERSION,
|
248
248
|
body: JSON.generate(asset: asset)
|
249
249
|
)
|
250
250
|
|
@@ -272,16 +272,12 @@ module ShopifyCLI
|
|
272
272
|
end
|
273
273
|
|
274
274
|
def ignored_by_include_filter?(path)
|
275
|
-
include_filter && !include_filter.match?(path)
|
275
|
+
!!include_filter && !include_filter.match?(path)
|
276
276
|
end
|
277
277
|
|
278
278
|
def get(file)
|
279
|
-
_status, body, response =
|
280
|
-
@ctx,
|
281
|
-
shop: @theme.shop,
|
279
|
+
_status, body, response = api_client.get(
|
282
280
|
path: "themes/#{@theme.id}/assets.json",
|
283
|
-
method: "GET",
|
284
|
-
api_version: API_VERSION,
|
285
281
|
query: URI.encode_www_form("asset[key]" => file.relative_path.to_s),
|
286
282
|
)
|
287
283
|
|
@@ -298,12 +294,8 @@ module ShopifyCLI
|
|
298
294
|
end
|
299
295
|
|
300
296
|
def delete(file)
|
301
|
-
_status, _body, response =
|
302
|
-
@ctx,
|
303
|
-
shop: @theme.shop,
|
297
|
+
_status, _body, response = api_client.delete(
|
304
298
|
path: "themes/#{@theme.id}/assets.json",
|
305
|
-
method: "DELETE",
|
306
|
-
api_version: API_VERSION,
|
307
299
|
body: JSON.generate(asset: {
|
308
300
|
key: file.relative_path.to_s,
|
309
301
|
})
|
@@ -314,14 +306,17 @@ module ShopifyCLI
|
|
314
306
|
|
315
307
|
def update_checksums(api_response)
|
316
308
|
api_response.values.flatten.each do |asset|
|
317
|
-
|
309
|
+
next unless asset["key"]
|
310
|
+
checksums_mutex.synchronize do
|
318
311
|
@checksums[asset["key"]] = asset["checksum"]
|
319
312
|
end
|
320
313
|
end
|
321
314
|
# Generate .liquid asset files are reported twice in checksum:
|
322
315
|
# once of generated, once for .liquid. We only keep the .liquid, that's the one we have
|
323
316
|
# on disk.
|
324
|
-
|
317
|
+
checksums_mutex.synchronize do
|
318
|
+
@checksums.reject! { |key, _| @checksums.key?("#{key}.liquid") }
|
319
|
+
end
|
325
320
|
end
|
326
321
|
|
327
322
|
def file_has_changed?(file)
|
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require_relative "file"
|
3
|
+
require_relative "theme_admin_api"
|
3
4
|
|
4
5
|
require "pathname"
|
5
6
|
require "time"
|
@@ -20,11 +21,11 @@ module ShopifyCLI
|
|
20
21
|
end
|
21
22
|
|
22
23
|
def theme_files
|
23
|
-
glob(["**/*.liquid", "**/*.json"
|
24
|
+
(glob(["**/*.liquid", "**/*.json"]) + static_asset_files).uniq
|
24
25
|
end
|
25
26
|
|
26
27
|
def static_asset_files
|
27
|
-
glob("assets/*").reject(&:liquid?)
|
28
|
+
glob("assets/*", raise_on_dir: true).reject(&:liquid?)
|
28
29
|
end
|
29
30
|
|
30
31
|
def liquid_files
|
@@ -35,8 +36,11 @@ module ShopifyCLI
|
|
35
36
|
glob("**/*.json")
|
36
37
|
end
|
37
38
|
|
38
|
-
def glob(pattern)
|
39
|
-
root.glob(pattern).map
|
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
44
|
end
|
41
45
|
|
42
46
|
def theme_file?(file)
|
@@ -59,7 +63,7 @@ module ShopifyCLI
|
|
59
63
|
end
|
60
64
|
|
61
65
|
def shop
|
62
|
-
|
66
|
+
api_client.get_shop_or_abort
|
63
67
|
end
|
64
68
|
|
65
69
|
def editor_url
|
@@ -101,9 +105,7 @@ module ShopifyCLI
|
|
101
105
|
def create
|
102
106
|
raise InvalidThemeRole, "Can't create live theme. Use publish." if live?
|
103
107
|
|
104
|
-
_status, body =
|
105
|
-
@ctx,
|
106
|
-
shop: shop,
|
108
|
+
_status, body = api_client.post(
|
107
109
|
path: "themes.json",
|
108
110
|
body: JSON.generate({
|
109
111
|
theme: {
|
@@ -111,31 +113,21 @@ module ShopifyCLI
|
|
111
113
|
role: role,
|
112
114
|
},
|
113
115
|
}),
|
114
|
-
method: "POST",
|
115
|
-
api_version: "unstable",
|
116
116
|
)
|
117
117
|
|
118
118
|
@id = body["theme"]["id"]
|
119
119
|
end
|
120
120
|
|
121
121
|
def delete
|
122
|
-
|
123
|
-
|
124
|
-
shop: shop,
|
125
|
-
method: "DELETE",
|
126
|
-
path: "themes/#{id}.json",
|
127
|
-
api_version: "unstable",
|
122
|
+
api_client.delete(
|
123
|
+
path: "themes/#{id}.json"
|
128
124
|
)
|
129
125
|
end
|
130
126
|
|
131
127
|
def publish
|
132
128
|
return if live?
|
133
|
-
|
134
|
-
@ctx,
|
135
|
-
shop: shop,
|
136
|
-
method: "PUT",
|
129
|
+
api_client.put(
|
137
130
|
path: "themes/#{id}.json",
|
138
|
-
api_version: "unstable",
|
139
131
|
body: JSON.generate(theme: {
|
140
132
|
role: "main",
|
141
133
|
})
|
@@ -205,23 +197,23 @@ module ShopifyCLI
|
|
205
197
|
end
|
206
198
|
|
207
199
|
def fetch_themes(ctx)
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
path: "themes.json"
|
212
|
-
api_version: "unstable",
|
200
|
+
api_client = ThemeAdminAPI.new(ctx)
|
201
|
+
|
202
|
+
api_client.get(
|
203
|
+
path: "themes.json"
|
213
204
|
)
|
214
205
|
end
|
215
206
|
end
|
216
207
|
|
217
208
|
private
|
218
209
|
|
210
|
+
def api_client
|
211
|
+
@api_client ||= ThemeAdminAPI.new(@ctx)
|
212
|
+
end
|
213
|
+
|
219
214
|
def load_info_from_api
|
220
|
-
_status, body =
|
221
|
-
|
222
|
-
shop: shop,
|
223
|
-
path: "themes/#{id}.json",
|
224
|
-
api_version: "unstable",
|
215
|
+
_status, body = api_client.get(
|
216
|
+
path: "themes/#{id}.json"
|
225
217
|
)
|
226
218
|
|
227
219
|
@name = body.dig("theme", "name")
|
@@ -229,6 +221,11 @@ module ShopifyCLI
|
|
229
221
|
|
230
222
|
self
|
231
223
|
end
|
224
|
+
|
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))
|
228
|
+
end
|
232
229
|
end
|
233
230
|
end
|
234
231
|
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
module ShopifyCLI
|
2
|
+
module Theme
|
3
|
+
class ThemeAdminAPI
|
4
|
+
API_VERSION = "unstable"
|
5
|
+
|
6
|
+
attr_reader :shop
|
7
|
+
|
8
|
+
def initialize(ctx, shop = nil)
|
9
|
+
@ctx = ctx
|
10
|
+
@shop = shop || get_shop_or_abort
|
11
|
+
end
|
12
|
+
|
13
|
+
def get(path:, **args)
|
14
|
+
rest_request(method: "GET", path: path, **args)
|
15
|
+
end
|
16
|
+
|
17
|
+
def put(path:, **args)
|
18
|
+
rest_request(method: "PUT", path: path, **args)
|
19
|
+
end
|
20
|
+
|
21
|
+
def post(path:, **args)
|
22
|
+
rest_request(method: "POST", path: path, **args)
|
23
|
+
end
|
24
|
+
|
25
|
+
def delete(path:, **args)
|
26
|
+
rest_request(method: "DELETE", path: path, **args)
|
27
|
+
end
|
28
|
+
|
29
|
+
def get_shop_or_abort # rubocop:disable Naming/AccessorMethodName
|
30
|
+
ShopifyCLI::AdminAPI.get_shop_or_abort(@ctx)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def rest_request(**args)
|
36
|
+
ShopifyCLI::AdminAPI.rest_request(
|
37
|
+
@ctx,
|
38
|
+
shop: @shop,
|
39
|
+
api_version: API_VERSION,
|
40
|
+
**args.compact
|
41
|
+
)
|
42
|
+
rescue ShopifyCLI::API::APIRequestForbiddenError,
|
43
|
+
ShopifyCLI::API::APIRequestUnauthorizedError => error
|
44
|
+
# The Admin API returns 403 Forbidden responses on different
|
45
|
+
# scenarios:
|
46
|
+
#
|
47
|
+
# * when a user doesn't have permissions for a request:
|
48
|
+
# <APIRequestForbiddenError: 403 {}>
|
49
|
+
#
|
50
|
+
# * 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
|
+
end
|
55
|
+
|
56
|
+
raise error
|
57
|
+
end
|
58
|
+
|
59
|
+
def handle_permissions_error
|
60
|
+
ensure_user_error = @ctx.message("theme.ensure_user_error", shop)
|
61
|
+
ensure_user_try_this = @ctx.message("theme.ensure_user_try_this")
|
62
|
+
|
63
|
+
@ctx.abort(ensure_user_error, ensure_user_try_this)
|
64
|
+
end
|
65
|
+
|
66
|
+
def empty_response_error?(error)
|
67
|
+
error_message = error&.response&.body.to_s
|
68
|
+
error_message.empty?
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -40,6 +40,7 @@ module ShopifyCLI
|
|
40
40
|
|
41
41
|
property! :underscore_keys, accepts: [true, false], default: false, reader: :underscore_keys?
|
42
42
|
property! :symbolize_keys, accepts: [true, false], default: false, reader: :symbolize_keys?
|
43
|
+
property! :shallow, accepts: [true, false], default: false, reader: :shallow?
|
43
44
|
property! :associative_array_container,
|
44
45
|
accepts: ->(c) { c.respond_to?(:new) && c.method_defined?(:[]=) },
|
45
46
|
default: -> { Hash }
|
@@ -47,10 +48,10 @@ module ShopifyCLI
|
|
47
48
|
def call(object)
|
48
49
|
case object
|
49
50
|
when Array
|
50
|
-
object.map(&self).map(&:value)
|
51
|
+
shallow? ? object.dup : object.map(&self).map(&:value)
|
51
52
|
when Hash
|
52
53
|
object.each.with_object(associative_array_container.new) do |(key, value), result|
|
53
|
-
result[transform_key(key)] = call(value).value
|
54
|
+
result[transform_key(key)] = shallow? ? value : call(value).value
|
54
55
|
end
|
55
56
|
else
|
56
57
|
ShopifyCLI::Result.success(object)
|
data/lib/shopify_cli/tunnel.rb
CHANGED
@@ -178,6 +178,15 @@ module ShopifyCLI
|
|
178
178
|
|
179
179
|
def fetch_url(ctx, log_path)
|
180
180
|
LogParser.new(log_path)
|
181
|
+
rescue NgrokError => e
|
182
|
+
# Full error messages/descriptions: https://ngrok.com/docs/errors
|
183
|
+
case e.message
|
184
|
+
when /ERR_NGROK_107/
|
185
|
+
ctx.abort(ctx.message("tunnel.invalid_token", e.message))
|
186
|
+
when /ERR_NGROK_108/
|
187
|
+
ctx.abort(ctx.message("tunnel.duplicate_session", e.message))
|
188
|
+
end
|
189
|
+
raise e.class, e.message
|
181
190
|
rescue RuntimeError => e
|
182
191
|
stop(ctx)
|
183
192
|
raise e.class, e.message
|
data/lib/shopify_cli/version.rb
CHANGED
data/shipit.yml
ADDED
data/shopify-cli.gemspec
CHANGED
@@ -28,18 +28,27 @@ Gem::Specification.new do |spec|
|
|
28
28
|
spec.files = Dir.chdir(File.expand_path("..", __FILE__)) do
|
29
29
|
%x(git ls-files -z).split("\x0").reject do |f|
|
30
30
|
f.match(%r{^(test|spec|features|packaging)/}) ||
|
31
|
-
|
31
|
+
f.match(%r{^bin/(update-deps|shopify.bat)$})
|
32
32
|
end
|
33
33
|
end
|
34
34
|
spec.bindir = "bin"
|
35
35
|
spec.require_paths = ["lib", "vendor"]
|
36
36
|
spec.executables << "shopify"
|
37
37
|
|
38
|
-
spec.add_development_dependency("bundler", "~> 2.
|
38
|
+
spec.add_development_dependency("bundler", "~> 2.3.8")
|
39
39
|
spec.add_development_dependency("rake", "~> 12.3", ">= 12.3.3")
|
40
40
|
spec.add_development_dependency("minitest", "~> 5.0")
|
41
41
|
|
42
42
|
spec.add_dependency("bugsnag", "~> 6.22")
|
43
43
|
spec.add_dependency("listen", "~> 3.7.0")
|
44
|
-
|
44
|
+
|
45
|
+
# We prefer being more strict here with the version range to have a more deterministic build.
|
46
|
+
# The added benefit is that, if the user upgrades the CLI, and we have "~> 1.10.1" version range,
|
47
|
+
# they will get a theme-check update.
|
48
|
+
# Whereas if we were to have "~> 1.9", that version would still be satisfied and thus not upgraded.
|
49
|
+
# Both shopify-cli and theme-check gems are owned and developed by Shopify.
|
50
|
+
# These gems are currently being actively developed and it's easiest to update them together.
|
51
|
+
spec.add_dependency("theme-check", "~> 1.10.1")
|
52
|
+
|
53
|
+
spec.extensions = ["ext/shopify-extensions/extconf.rb"]
|
45
54
|
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.
|
4
|
+
version: 2.15.1
|
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-
|
11
|
+
date: 2022-03-24 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 2.
|
19
|
+
version: 2.3.8
|
20
20
|
type: :development
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 2.
|
26
|
+
version: 2.3.8
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: rake
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -92,14 +92,14 @@ dependencies:
|
|
92
92
|
requirements:
|
93
93
|
- - "~>"
|
94
94
|
- !ruby/object:Gem::Version
|
95
|
-
version: 1.
|
95
|
+
version: 1.10.1
|
96
96
|
type: :runtime
|
97
97
|
prerelease: false
|
98
98
|
version_requirements: !ruby/object:Gem::Requirement
|
99
99
|
requirements:
|
100
100
|
- - "~>"
|
101
101
|
- !ruby/object:Gem::Version
|
102
|
-
version: 1.
|
102
|
+
version: 1.10.1
|
103
103
|
description: |
|
104
104
|
Shopify CLI helps you build Shopify apps faster. It quickly scaffolds Node.js
|
105
105
|
and Ruby on Rails embedded apps. It also automates many common tasks in the
|
@@ -109,7 +109,8 @@ email:
|
|
109
109
|
- dev-tools-education@shopify.com
|
110
110
|
executables:
|
111
111
|
- shopify
|
112
|
-
extensions:
|
112
|
+
extensions:
|
113
|
+
- ext/shopify-extensions/extconf.rb
|
113
114
|
extra_rdoc_files: []
|
114
115
|
files:
|
115
116
|
- ".devcontainer.json"
|
@@ -124,6 +125,7 @@ files:
|
|
124
125
|
- ".github/PULL_REQUEST_TEMPLATE.md"
|
125
126
|
- ".github/probots.yml"
|
126
127
|
- ".github/workflows/shopify.yml"
|
128
|
+
- ".github/workflows/stale.yml"
|
127
129
|
- ".github/workflows/triage.yml"
|
128
130
|
- ".gitignore"
|
129
131
|
- ".rubocop.yml"
|
@@ -155,12 +157,16 @@ files:
|
|
155
157
|
- docs/users/migrate-from-themekit.md
|
156
158
|
- ext/javy/hashes/javy-arm-macos-v0.1.0.gz.sha256
|
157
159
|
- ext/javy/hashes/javy-arm-macos-v0.2.0.gz.sha256
|
160
|
+
- ext/javy/hashes/javy-arm-macos-v0.2.1.gz.sha256
|
158
161
|
- ext/javy/hashes/javy-x86_64-linux-v0.1.0.gz.sha256
|
159
162
|
- ext/javy/hashes/javy-x86_64-linux-v0.2.0.gz.sha256
|
163
|
+
- ext/javy/hashes/javy-x86_64-linux-v0.2.1.gz.sha256
|
160
164
|
- ext/javy/hashes/javy-x86_64-macos-v0.1.0.gz.sha256
|
161
165
|
- ext/javy/hashes/javy-x86_64-macos-v0.2.0.gz.sha256
|
166
|
+
- ext/javy/hashes/javy-x86_64-macos-v0.2.1.gz.sha256
|
162
167
|
- ext/javy/hashes/javy-x86_64-windows-v0.1.0.gz.sha256
|
163
168
|
- ext/javy/hashes/javy-x86_64-windows-v0.2.0.gz.sha256
|
169
|
+
- ext/javy/hashes/javy-x86_64-windows-v0.2.1.gz.sha256
|
164
170
|
- ext/javy/javy.rb
|
165
171
|
- ext/javy/version
|
166
172
|
- ext/shopify-extensions/extconf.rb
|
@@ -283,7 +289,6 @@ files:
|
|
283
289
|
- lib/project_types/rails/forms/create.rb
|
284
290
|
- lib/project_types/rails/gem.rb
|
285
291
|
- lib/project_types/rails/messages/messages.rb
|
286
|
-
- lib/project_types/rails/ruby.rb
|
287
292
|
- lib/project_types/script/cli.rb
|
288
293
|
- lib/project_types/script/commands/connect.rb
|
289
294
|
- lib/project_types/script/commands/create.rb
|
@@ -317,8 +322,6 @@ files:
|
|
317
322
|
- lib/project_types/script/layers/infrastructure/command_runner.rb
|
318
323
|
- lib/project_types/script/layers/infrastructure/errors.rb
|
319
324
|
- lib/project_types/script/layers/infrastructure/extension_point_repository.rb
|
320
|
-
- lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb
|
321
|
-
- lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb
|
322
325
|
- lib/project_types/script/layers/infrastructure/languages/project_creator.rb
|
323
326
|
- lib/project_types/script/layers/infrastructure/languages/task_runner.rb
|
324
327
|
- lib/project_types/script/layers/infrastructure/languages/tool_version_checker.rb
|
@@ -367,6 +370,7 @@ files:
|
|
367
370
|
- lib/shopify_cli/admin_api/schema.rb
|
368
371
|
- lib/shopify_cli/api.rb
|
369
372
|
- lib/shopify_cli/app_type_detector.rb
|
373
|
+
- lib/shopify_cli/changelog.rb
|
370
374
|
- lib/shopify_cli/command.rb
|
371
375
|
- lib/shopify_cli/command/app_sub_command.rb
|
372
376
|
- lib/shopify_cli/command/project_command.rb
|
@@ -442,11 +446,13 @@ files:
|
|
442
446
|
- lib/shopify_cli/project.rb
|
443
447
|
- lib/shopify_cli/project_commands.rb
|
444
448
|
- lib/shopify_cli/project_type.rb
|
449
|
+
- lib/shopify_cli/release.rb
|
445
450
|
- lib/shopify_cli/reporting_configuration_controller.rb
|
446
451
|
- lib/shopify_cli/resolve_constant.rb
|
447
452
|
- lib/shopify_cli/resources.rb
|
448
453
|
- lib/shopify_cli/resources/env_file.rb
|
449
454
|
- lib/shopify_cli/result.rb
|
455
|
+
- lib/shopify_cli/sed.rb
|
450
456
|
- lib/shopify_cli/services.rb
|
451
457
|
- lib/shopify_cli/services/app/connect_service.rb
|
452
458
|
- lib/shopify_cli/services/app/create/node_service.rb
|
@@ -502,12 +508,14 @@ files:
|
|
502
508
|
- lib/shopify_cli/theme/syncer/operation.rb
|
503
509
|
- lib/shopify_cli/theme/syncer/standard_reporter.rb
|
504
510
|
- lib/shopify_cli/theme/theme.rb
|
511
|
+
- lib/shopify_cli/theme/theme_admin_api.rb
|
505
512
|
- lib/shopify_cli/thread_pool.rb
|
506
513
|
- lib/shopify_cli/thread_pool/job.rb
|
507
514
|
- lib/shopify_cli/transform_data_structure.rb
|
508
515
|
- lib/shopify_cli/tunnel.rb
|
509
516
|
- lib/shopify_cli/utilities.rb
|
510
517
|
- lib/shopify_cli/version.rb
|
518
|
+
- shipit.yml
|
511
519
|
- shopify-cli.gemspec
|
512
520
|
- shopify-dev
|
513
521
|
- utilities/constants.rb
|