shopify-cli 2.13.0 → 2.15.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|