shopify-cli 2.9.0 → 2.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +9 -2
- data/Gemfile.lock +1 -1
- data/lib/project_types/script/layers/domain/errors.rb +3 -2
- data/lib/project_types/script/layers/domain/script_config.rb +6 -4
- data/lib/project_types/script/layers/infrastructure/errors.rb +37 -24
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +28 -28
- data/lib/project_types/script/layers/infrastructure/script_service.rb +22 -5
- data/lib/project_types/script/messages/messages.rb +15 -17
- data/lib/project_types/script/ui/error_handler.rb +41 -29
- data/lib/project_types/theme/commands/pull.rb +6 -1
- data/lib/project_types/theme/commands/push.rb +6 -1
- data/lib/project_types/theme/messages/messages.rb +4 -0
- data/lib/shopify_cli/commands/login.rb +4 -10
- data/lib/shopify_cli/constants.rb +6 -2
- data/lib/shopify_cli/core/executor.rb +4 -4
- data/lib/shopify_cli/environment.rb +35 -16
- data/lib/shopify_cli/identity_auth.rb +3 -3
- data/lib/shopify_cli/messages/messages.rb +1 -1
- data/lib/shopify_cli/method_object.rb +21 -9
- data/lib/shopify_cli/result.rb +61 -59
- data/lib/shopify_cli/task.rb +5 -3
- data/lib/shopify_cli/theme/dev_server/cdn/cdn_helper.rb +49 -0
- data/lib/shopify_cli/theme/dev_server/cdn_assets.rb +69 -0
- data/lib/shopify_cli/theme/dev_server/cdn_fonts.rb +8 -28
- data/lib/shopify_cli/theme/dev_server/local_assets.rb +4 -0
- data/lib/shopify_cli/theme/dev_server.rb +2 -0
- data/lib/shopify_cli/theme/file.rb +2 -2
- data/lib/shopify_cli/theme/filter/path_matcher.rb +38 -0
- data/lib/shopify_cli/theme/ignore_filter.rb +14 -18
- data/lib/shopify_cli/theme/include_filter.rb +43 -0
- data/lib/shopify_cli/theme/syncer.rb +17 -2
- data/lib/shopify_cli/version.rb +1 -1
- data/lib/shopify_cli.rb +2 -1
- data/vendor/deps/ruby2_keywords/LICENSE +22 -0
- data/vendor/deps/ruby2_keywords/README.md +67 -0
- data/vendor/deps/ruby2_keywords/Rakefile +54 -0
- data/vendor/deps/ruby2_keywords/lib/ruby2_keywords.rb +57 -0
- data/vendor/deps/ruby2_keywords/ruby2_keywords.gemspec +18 -0
- data/vendor/deps/ruby2_keywords/test/test_keyword.rb +41 -0
- metadata +12 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a580fc4c23a82fc147e126d1f2cc4b057e5194e75e9c3045e2fa26c97f3d88da
|
4
|
+
data.tar.gz: 7cd7c21a2bac85a9f0bd3809acfb2ae7389f99be65e34e4411cb4fc4bc6235e8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8ef4d2ddcb62c393d7ad69fca6cbdfd577926522fcafe6f172f3370cc4a55d8bf3db68f8fc154dbb6c483b38f718df7991e43c773801c27e1f7a055e3cd0ed1b
|
7
|
+
data.tar.gz: 94d84b3588aeb62ee53f49593e486e268d58a112d73cdae15e2212dbb4a356ba736ff5e5adf31db4d979e83d7e1a8f56650911b0aab89837ef251f73ce6926b4
|
data/CHANGELOG.md
CHANGED
@@ -2,8 +2,16 @@ 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
|
-
## 2.
|
5
|
+
## Version 2.10.0
|
6
|
+
### Fixed
|
7
|
+
* [#1937](https://github.com/Shopify/shopify-cli/pull/1937): Fix `theme pull` to no longer add empty lines on Windows
|
8
|
+
* [#1952](https://github.com/Shopify/shopify-cli/pull/1952): Fix CORS (cross-origin resource sharing) errors
|
9
|
+
* [#1965](https://github.com/Shopify/shopify-cli/pull/1965): Revert: Fix partners ability to login to external shops. (#1873)
|
10
|
+
|
11
|
+
### Added
|
12
|
+
* [#1892](https://github.com/Shopify/shopify-cli/pull/1892): Add `-o`/`--only` parameter to filter files on `theme push`/`theme pull` commands
|
6
13
|
|
14
|
+
## Version 2.9.0
|
7
15
|
### Fixed
|
8
16
|
* [#1922](https://github.com/Shopify/shopify-cli/pull/1922): Respect RUBY_BINDIR from Homebrew for installing gem
|
9
17
|
* [#1906](https://github.com/Shopify/shopify-cli/pull/1906): Fix Ngrok incompatibility with some Apple ARM environments
|
@@ -12,7 +20,6 @@ From version 2.6.0, the sections in this file adhere to the [keep a changelog](h
|
|
12
20
|
|
13
21
|
### Added
|
14
22
|
* [#1900](https://github.com/Shopify/shopify-cli/pull/1900): Add `-d`/`--development` flag to Shopify theme pull command
|
15
|
-
* [#1896](https://github.com/Shopify/shopify-cli/pull/1896): Release Typescript options for payment_methods and shipping_methods scripts
|
16
23
|
* [#1891](https://github.com/Shopify/shopify-cli/pull/1891): Allow for additional arguments in `shopify push script` on CI.
|
17
24
|
* [#1877](https://github.com/Shopify/shopify-cli/pull/1877): Add theme (`-t`/`--theme=NAME_OR_ID`) parameter to `theme push`/`theme pull` commands
|
18
25
|
* [#1871](https://github.com/Shopify/shopify-cli/pull/1871): Add a new `--live-reload` parameter to the `theme serve` command
|
data/Gemfile.lock
CHANGED
@@ -15,10 +15,11 @@ module Script
|
|
15
15
|
end
|
16
16
|
|
17
17
|
class MissingScriptConfigFieldError < ScriptProjectError
|
18
|
-
attr_reader :field
|
19
|
-
def initialize(field)
|
18
|
+
attr_reader :field, :filename
|
19
|
+
def initialize(field:, filename:)
|
20
20
|
super()
|
21
21
|
@field = field
|
22
|
+
@filename = filename
|
22
23
|
end
|
23
24
|
end
|
24
25
|
|
@@ -4,13 +4,13 @@ module Script
|
|
4
4
|
module Layers
|
5
5
|
module Domain
|
6
6
|
class ScriptConfig
|
7
|
-
attr_reader :content, :version, :title, :description, :configuration_ui, :configuration
|
7
|
+
attr_reader :content, :version, :title, :description, :configuration_ui, :configuration, :filename
|
8
8
|
|
9
9
|
REQUIRED_FIELDS = %w(version title)
|
10
10
|
|
11
|
-
def initialize(content:)
|
11
|
+
def initialize(content:, filename:)
|
12
|
+
@filename = filename
|
12
13
|
validate_content!(content)
|
13
|
-
|
14
14
|
@content = content
|
15
15
|
@version = @content["version"].to_s
|
16
16
|
@title = @content["title"]
|
@@ -23,7 +23,9 @@ module Script
|
|
23
23
|
|
24
24
|
def validate_content!(content)
|
25
25
|
REQUIRED_FIELDS.each do |field|
|
26
|
-
|
26
|
+
if content[field].nil?
|
27
|
+
raise Errors::MissingScriptConfigFieldError.new(field: field, filename: filename)
|
28
|
+
end
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -5,65 +5,78 @@ module Script
|
|
5
5
|
module Infrastructure
|
6
6
|
module Errors
|
7
7
|
class BuildError < ScriptProjectError; end
|
8
|
-
|
8
|
+
|
9
|
+
class ScriptConfigurationDefinitionError < ScriptProjectError
|
10
|
+
attr_reader :filename
|
11
|
+
def initialize(message:, filename:)
|
12
|
+
@filename = filename
|
13
|
+
super(message)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
|
17
|
+
class ScriptConfigSyntaxError < ScriptProjectError
|
18
|
+
attr_reader :filename
|
19
|
+
def initialize(filename)
|
20
|
+
@filename = filename
|
21
|
+
super()
|
22
|
+
end
|
23
|
+
end
|
9
24
|
|
10
25
|
class ScriptConfigMissingKeysError < ScriptProjectError
|
11
|
-
attr_reader :missing_keys
|
12
|
-
def initialize(missing_keys)
|
26
|
+
attr_reader :missing_keys, :filename
|
27
|
+
def initialize(missing_keys:, filename:)
|
13
28
|
super()
|
14
29
|
@missing_keys = missing_keys
|
30
|
+
@filename = filename
|
15
31
|
end
|
16
32
|
end
|
17
33
|
|
18
34
|
class ScriptConfigInvalidValueError < ScriptProjectError
|
19
|
-
attr_reader :valid_input_modes
|
20
|
-
def initialize(valid_input_modes)
|
35
|
+
attr_reader :valid_input_modes, :filename
|
36
|
+
def initialize(valid_input_modes:, filename:)
|
21
37
|
super()
|
22
38
|
@valid_input_modes = valid_input_modes
|
39
|
+
@filename = filename
|
23
40
|
end
|
24
41
|
end
|
25
42
|
|
26
43
|
class ScriptConfigFieldsMissingKeysError < ScriptProjectError
|
27
|
-
attr_reader :missing_keys
|
28
|
-
def initialize(missing_keys)
|
44
|
+
attr_reader :missing_keys, :filename
|
45
|
+
def initialize(missing_keys:, filename:)
|
29
46
|
super()
|
30
47
|
@missing_keys = missing_keys
|
48
|
+
@filename = filename
|
31
49
|
end
|
32
50
|
end
|
33
51
|
|
34
52
|
class ScriptConfigFieldsInvalidValueError < ScriptProjectError
|
35
|
-
attr_reader :valid_types
|
36
|
-
def initialize(valid_types)
|
53
|
+
attr_reader :valid_types, :filename
|
54
|
+
def initialize(valid_types:, filename:)
|
37
55
|
super()
|
38
56
|
@valid_types = valid_types
|
57
|
+
@filename = filename
|
39
58
|
end
|
40
59
|
end
|
41
60
|
|
42
61
|
class ScriptEnvAppNotConnectedError < ScriptProjectError; end
|
43
62
|
|
44
|
-
class
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
class MissingScriptConfigYmlFieldError < ScriptProjectError
|
49
|
-
attr_reader :field
|
50
|
-
def initialize(field)
|
63
|
+
class ScriptConfigParseError < ScriptProjectError
|
64
|
+
attr_reader :filename, :serialization_format
|
65
|
+
def initialize(filename:, serialization_format:)
|
51
66
|
super()
|
52
|
-
@
|
67
|
+
@filename = filename
|
68
|
+
@serialization_format = serialization_format
|
53
69
|
end
|
54
70
|
end
|
55
71
|
|
56
|
-
class
|
57
|
-
attr_reader :
|
58
|
-
def initialize(
|
72
|
+
class NoScriptConfigFileError < ScriptProjectError
|
73
|
+
attr_reader :filename
|
74
|
+
def initialize(filename)
|
59
75
|
super()
|
60
|
-
@
|
76
|
+
@filename = filename
|
61
77
|
end
|
62
78
|
end
|
63
79
|
|
64
|
-
class NoScriptConfigYmlFileError < ScriptProjectError; end
|
65
|
-
class NoScriptConfigFileError < ScriptProjectError; end
|
66
|
-
|
67
80
|
class APILibraryNotFoundError < ScriptProjectError
|
68
81
|
attr_reader :library_name
|
69
82
|
def initialize(library_name)
|
@@ -160,12 +160,15 @@ module Script
|
|
160
160
|
|
161
161
|
def script_config_repository
|
162
162
|
@script_config_repository ||= begin
|
163
|
+
script_config_yml_repo = ScriptConfigYmlRepository.new(ctx: ctx)
|
163
164
|
supported_repos = [
|
164
|
-
|
165
|
+
script_config_yml_repo,
|
165
166
|
ScriptJsonRepository.new(ctx: ctx),
|
166
167
|
]
|
167
168
|
repo = supported_repos.find(&:active?)
|
168
|
-
|
169
|
+
if repo.nil?
|
170
|
+
raise Infrastructure::Errors::NoScriptConfigFileError, script_config_yml_repo.filename
|
171
|
+
end
|
169
172
|
repo
|
170
173
|
end
|
171
174
|
end
|
@@ -179,7 +182,7 @@ module Script
|
|
179
182
|
end
|
180
183
|
|
181
184
|
def get!
|
182
|
-
raise Infrastructure::Errors::NoScriptConfigFileError unless active?
|
185
|
+
raise Infrastructure::Errors::NoScriptConfigFileError, filename unless active?
|
183
186
|
|
184
187
|
content = ctx.read(filename)
|
185
188
|
hash = file_content_to_hash(content)
|
@@ -196,6 +199,10 @@ module Script
|
|
196
199
|
from_h(hash)
|
197
200
|
end
|
198
201
|
|
202
|
+
def filename
|
203
|
+
raise NotImplementedError
|
204
|
+
end
|
205
|
+
|
199
206
|
private
|
200
207
|
|
201
208
|
def update_hash(hash:, title:)
|
@@ -204,14 +211,7 @@ module Script
|
|
204
211
|
end
|
205
212
|
|
206
213
|
def from_h(hash)
|
207
|
-
Domain::ScriptConfig.new(content: hash)
|
208
|
-
rescue Domain::Errors::MissingScriptConfigFieldError => e
|
209
|
-
raise missing_field_error, e.field
|
210
|
-
end
|
211
|
-
|
212
|
-
# to be implemented by subclasses
|
213
|
-
def filename
|
214
|
-
raise NotImplementedError
|
214
|
+
Domain::ScriptConfig.new(content: hash, filename: filename)
|
215
215
|
end
|
216
216
|
|
217
217
|
def file_content_to_hash(file_content)
|
@@ -221,26 +221,22 @@ module Script
|
|
221
221
|
def hash_to_file_content(hash)
|
222
222
|
raise NotImplementedError
|
223
223
|
end
|
224
|
-
|
225
|
-
def missing_field_error
|
226
|
-
raise NotImplementedError
|
227
|
-
end
|
228
224
|
end
|
229
225
|
|
230
226
|
class ScriptConfigYmlRepository < ScriptConfigRepository
|
231
|
-
private
|
232
|
-
|
233
227
|
def filename
|
234
228
|
"script.config.yml"
|
235
229
|
end
|
236
230
|
|
231
|
+
private
|
232
|
+
|
237
233
|
def file_content_to_hash(file_content)
|
238
234
|
begin
|
239
235
|
hash = YAML.load(file_content)
|
240
236
|
rescue Psych::SyntaxError
|
241
|
-
raise
|
237
|
+
raise parse_error
|
242
238
|
end
|
243
|
-
raise
|
239
|
+
raise parse_error unless hash.is_a?(Hash)
|
244
240
|
hash
|
245
241
|
end
|
246
242
|
|
@@ -248,30 +244,34 @@ module Script
|
|
248
244
|
YAML.dump(hash)
|
249
245
|
end
|
250
246
|
|
251
|
-
def
|
252
|
-
Errors::
|
247
|
+
def parse_error
|
248
|
+
Errors::ScriptConfigParseError.new(filename: filename, serialization_format: "YAML")
|
253
249
|
end
|
254
250
|
end
|
255
251
|
|
256
252
|
class ScriptJsonRepository < ScriptConfigRepository
|
257
|
-
private
|
258
|
-
|
259
253
|
def filename
|
260
254
|
"script.json"
|
261
255
|
end
|
262
256
|
|
257
|
+
private
|
258
|
+
|
263
259
|
def file_content_to_hash(file_content)
|
264
|
-
|
265
|
-
|
266
|
-
|
260
|
+
begin
|
261
|
+
hash = JSON.parse(file_content)
|
262
|
+
rescue JSON::ParserError
|
263
|
+
raise parse_error
|
264
|
+
end
|
265
|
+
raise parse_error unless hash.is_a?(Hash)
|
266
|
+
hash
|
267
267
|
end
|
268
268
|
|
269
269
|
def hash_to_file_content(hash)
|
270
270
|
JSON.pretty_generate(hash)
|
271
271
|
end
|
272
272
|
|
273
|
-
def
|
274
|
-
Errors::
|
273
|
+
def parse_error
|
274
|
+
Errors::ScriptConfigParseError.new(filename: filename, serialization_format: "JSON")
|
275
275
|
end
|
276
276
|
end
|
277
277
|
end
|
@@ -46,20 +46,37 @@ module Script
|
|
46
46
|
|
47
47
|
if user_errors.any? { |e| e["tag"] == "already_exists_error" }
|
48
48
|
raise Errors::ScriptRepushError, uuid
|
49
|
+
elsif (e = user_errors.find { |err| err["tag"] == "configuration_definition_error" })
|
50
|
+
raise Errors::ScriptConfigurationDefinitionError.new(
|
51
|
+
message: e["message"],
|
52
|
+
filename: script_config.filename,
|
53
|
+
)
|
49
54
|
elsif (e = user_errors.any? { |err| err["tag"] == "configuration_definition_syntax_error" })
|
50
|
-
raise Errors::ScriptConfigSyntaxError
|
55
|
+
raise Errors::ScriptConfigSyntaxError, script_config.filename
|
51
56
|
elsif (e = user_errors.find { |err| err["tag"] == "configuration_definition_missing_keys_error" })
|
52
|
-
raise Errors::ScriptConfigMissingKeysError
|
57
|
+
raise Errors::ScriptConfigMissingKeysError.new(
|
58
|
+
missing_keys: e["message"],
|
59
|
+
filename: script_config.filename,
|
60
|
+
)
|
53
61
|
elsif (e = user_errors.find { |err| err["tag"] == "configuration_definition_invalid_value_error" })
|
54
|
-
raise Errors::ScriptConfigInvalidValueError
|
62
|
+
raise Errors::ScriptConfigInvalidValueError.new(
|
63
|
+
valid_input_modes: e["message"],
|
64
|
+
filename: script_config.filename,
|
65
|
+
)
|
55
66
|
elsif (e = user_errors.find do |err|
|
56
67
|
err["tag"] == "configuration_definition_schema_field_missing_keys_error"
|
57
68
|
end)
|
58
|
-
raise Errors::ScriptConfigFieldsMissingKeysError
|
69
|
+
raise Errors::ScriptConfigFieldsMissingKeysError.new(
|
70
|
+
missing_keys: e["message"],
|
71
|
+
filename: script_config.filename,
|
72
|
+
)
|
59
73
|
elsif (e = user_errors.find do |err|
|
60
74
|
err["tag"] == "configuration_definition_schema_field_invalid_value_error"
|
61
75
|
end)
|
62
|
-
raise Errors::ScriptConfigFieldsInvalidValueError
|
76
|
+
raise Errors::ScriptConfigFieldsInvalidValueError.new(
|
77
|
+
valid_types: e["message"],
|
78
|
+
filename: script_config.filename,
|
79
|
+
)
|
63
80
|
elsif user_errors.find { |err| %w(not_use_msgpack_error schema_version_argument_error).include?(err["tag"]) }
|
64
81
|
raise Domain::Errors::MetadataValidationError
|
65
82
|
else
|
@@ -47,41 +47,39 @@ module Script
|
|
47
47
|
invalid_language_cause: "Invalid language %s.",
|
48
48
|
invalid_language_help: "Allowed values: %s.",
|
49
49
|
|
50
|
-
|
51
|
-
|
50
|
+
missing_script_config_field_cause: "The %{filename} file is missing the required %{field} field.",
|
51
|
+
missing_script_config_field_help: "Add the field and try again.",
|
52
52
|
|
53
|
-
|
54
|
-
|
53
|
+
script_config_parse_error_cause: "The %{filename} file contains invalid %{serialization_format}.",
|
54
|
+
script_config_parse_error_help: "Fix the errors and try again.",
|
55
55
|
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
invalid_script_config_yml_definition_cause: "The script.config.yml file contains invalid YAML.",
|
60
|
-
invalid_script_config_yml_definition_help: "Fix the errors and try again.",
|
61
|
-
|
62
|
-
no_script_config_yml_file_cause: "The script.config.yml file is missing.",
|
63
|
-
no_script_config_yml_file_help: "Create this file and try again.",
|
56
|
+
no_script_config_file_cause: "The %{filename} file is missing.",
|
57
|
+
no_script_config_file_help: "Create this file and try again.",
|
64
58
|
|
65
59
|
app_not_connected_cause: "Script is not connected to an app.",
|
66
60
|
app_not_connected_help: "Run shopify connect or enter fields for api-key and api-secret.",
|
67
61
|
|
68
|
-
|
62
|
+
configuration_definition_error_cause: "In the %{filename} file, there was a problem with the "\
|
63
|
+
"configuration. %{message}",
|
64
|
+
configuration_definition_error_help: "Fix the error and try again.",
|
65
|
+
|
66
|
+
configuration_syntax_error_cause: "The %{filename} is not formatted properly.",
|
69
67
|
configuration_syntax_error_help: "Fix the errors and try again.",
|
70
68
|
|
71
|
-
configuration_missing_keys_error_cause: "The
|
69
|
+
configuration_missing_keys_error_cause: "The %{filename} file is missing required keys: "\
|
72
70
|
"%{missing_keys}.",
|
73
71
|
configuration_missing_keys_error_help: "Add the keys and try again.",
|
74
72
|
|
75
|
-
configuration_invalid_value_error_cause: "The
|
73
|
+
configuration_invalid_value_error_cause: "The %{filename} configuration only accepts "\
|
76
74
|
"one of the following types(s): %{valid_input_modes}.",
|
77
75
|
configuration_invalid_value_error_help: "Change the type and try again.",
|
78
76
|
|
79
|
-
configuration_schema_field_missing_keys_error_cause: "A configuration entry in the
|
77
|
+
configuration_schema_field_missing_keys_error_cause: "A configuration entry in the %{filename} file "\
|
80
78
|
"is missing required keys: %{missing_keys}.",
|
81
79
|
configuration_definition_schema_field_missing_keys_error_help: "Add the keys and try again.",
|
82
80
|
|
83
81
|
configuration_schema_field_invalid_value_error_cause: "The configuration entries in the "\
|
84
|
-
"
|
82
|
+
"%{filename} file only accept one of the following "\
|
85
83
|
"type(s): %{valid_types}.",
|
86
84
|
configuration_schema_field_invalid_value_error_help: "Change the types and try again.",
|
87
85
|
|
@@ -103,44 +103,52 @@ module Script
|
|
103
103
|
cause_of_error: ShopifyCLI::Context.message("script.error.metadata_not_found_cause"),
|
104
104
|
help_suggestion: ShopifyCLI::Context.message("script.error.metadata_not_found_help"),
|
105
105
|
}
|
106
|
+
when Layers::Domain::Errors::MissingScriptConfigFieldError
|
107
|
+
{
|
108
|
+
cause_of_error: ShopifyCLI::Context.message(
|
109
|
+
"script.error.missing_script_config_field_cause",
|
110
|
+
field: e.field,
|
111
|
+
filename: e.filename,
|
112
|
+
),
|
113
|
+
help_suggestion: ShopifyCLI::Context.message("script.error.missing_script_config_field_help"),
|
114
|
+
}
|
106
115
|
when Layers::Infrastructure::Errors::BuildError
|
107
116
|
{
|
108
117
|
cause_of_error: ShopifyCLI::Context.message("script.error.build_error_cause"),
|
109
118
|
help_suggestion: ShopifyCLI::Context.message("script.error.build_error_help"),
|
110
119
|
}
|
111
|
-
when Layers::Infrastructure::Errors::
|
112
|
-
{
|
113
|
-
cause_of_error: ShopifyCLI::Context.message("script.error.invalid_script_config_yml_definition_cause"),
|
114
|
-
help_suggestion: ShopifyCLI::Context.message("script.error.invalid_script_config_yml_definition_help"),
|
115
|
-
}
|
116
|
-
when Layers::Infrastructure::Errors::InvalidScriptJsonDefinitionError
|
117
|
-
{
|
118
|
-
cause_of_error: ShopifyCLI::Context.message("script.error.invalid_script_json_definition_cause"),
|
119
|
-
help_suggestion: ShopifyCLI::Context.message("script.error.invalid_script_json_definition_help"),
|
120
|
-
}
|
121
|
-
when Layers::Infrastructure::Errors::MissingScriptConfigYmlFieldError
|
122
|
-
{
|
123
|
-
cause_of_error: ShopifyCLI::Context.message("script.error.missing_script_config_yml_field_cause", e.field),
|
124
|
-
help_suggestion: ShopifyCLI::Context.message("script.error.missing_script_config_yml_field_help"),
|
125
|
-
}
|
126
|
-
when Layers::Infrastructure::Errors::MissingScriptConfigYmlFieldError
|
120
|
+
when Layers::Infrastructure::Errors::ScriptConfigParseError
|
127
121
|
{
|
128
|
-
cause_of_error: ShopifyCLI::Context.message(
|
129
|
-
|
122
|
+
cause_of_error: ShopifyCLI::Context.message(
|
123
|
+
"script.error.script_config_parse_error_cause",
|
124
|
+
filename: e.filename,
|
125
|
+
serialization_format: e.serialization_format,
|
126
|
+
),
|
127
|
+
help_suggestion: ShopifyCLI::Context.message("script.error.script_config_parse_error_help"),
|
130
128
|
}
|
131
|
-
when Layers::Infrastructure::Errors::
|
129
|
+
when Layers::Infrastructure::Errors::NoScriptConfigFileError
|
132
130
|
{
|
133
|
-
cause_of_error: ShopifyCLI::Context.message(
|
134
|
-
|
131
|
+
cause_of_error: ShopifyCLI::Context.message(
|
132
|
+
"script.error.no_script_config_file_cause",
|
133
|
+
filename: e.filename,
|
134
|
+
),
|
135
|
+
help_suggestion: ShopifyCLI::Context.message("script.error.no_script_config_file_help"),
|
135
136
|
}
|
136
|
-
when Layers::Infrastructure::Errors::
|
137
|
+
when Layers::Infrastructure::Errors::ScriptConfigurationDefinitionError
|
137
138
|
{
|
138
|
-
cause_of_error: ShopifyCLI::Context.message(
|
139
|
-
|
139
|
+
cause_of_error: ShopifyCLI::Context.message(
|
140
|
+
"script.error.configuration_definition_error_cause",
|
141
|
+
message: e.message,
|
142
|
+
filename: e.filename,
|
143
|
+
),
|
144
|
+
help_suggestion: ShopifyCLI::Context.message("script.error.configuration_definition_error_help"),
|
140
145
|
}
|
141
146
|
when Layers::Infrastructure::Errors::ScriptConfigSyntaxError
|
142
147
|
{
|
143
|
-
cause_of_error: ShopifyCLI::Context.message(
|
148
|
+
cause_of_error: ShopifyCLI::Context.message(
|
149
|
+
"script.error.configuration_syntax_error_cause",
|
150
|
+
filename: e.filename,
|
151
|
+
),
|
144
152
|
help_suggestion: ShopifyCLI::Context.message("script.error.configuration_syntax_error_help"),
|
145
153
|
}
|
146
154
|
when Layers::Infrastructure::Errors::ScriptEnvAppNotConnectedError
|
@@ -152,7 +160,8 @@ module Script
|
|
152
160
|
{
|
153
161
|
cause_of_error: ShopifyCLI::Context.message(
|
154
162
|
"script.error.configuration_missing_keys_error_cause",
|
155
|
-
missing_keys: e.missing_keys
|
163
|
+
missing_keys: e.missing_keys,
|
164
|
+
filename: e.filename,
|
156
165
|
),
|
157
166
|
help_suggestion: ShopifyCLI::Context.message("script.error.configuration_missing_keys_error_help"),
|
158
167
|
}
|
@@ -160,7 +169,8 @@ module Script
|
|
160
169
|
{
|
161
170
|
cause_of_error: ShopifyCLI::Context.message(
|
162
171
|
"script.error.configuration_invalid_value_error_cause",
|
163
|
-
valid_input_modes: e.valid_input_modes
|
172
|
+
valid_input_modes: e.valid_input_modes,
|
173
|
+
filename: e.filename,
|
164
174
|
),
|
165
175
|
help_suggestion: ShopifyCLI::Context.message("script.error.configuration_invalid_value_error_help"),
|
166
176
|
}
|
@@ -168,7 +178,8 @@ module Script
|
|
168
178
|
{
|
169
179
|
cause_of_error: ShopifyCLI::Context.message(
|
170
180
|
"script.error.configuration_schema_field_missing_keys_error_cause",
|
171
|
-
missing_keys: e.missing_keys
|
181
|
+
missing_keys: e.missing_keys,
|
182
|
+
filename: e.filename,
|
172
183
|
),
|
173
184
|
help_suggestion: ShopifyCLI::Context.message(
|
174
185
|
"script.error.configuration_definition_schema_field_missing_keys_error_help"
|
@@ -178,7 +189,8 @@ module Script
|
|
178
189
|
{
|
179
190
|
cause_of_error: ShopifyCLI::Context.message(
|
180
191
|
"script.error.configuration_schema_field_invalid_value_error_cause",
|
181
|
-
valid_types: e.valid_types
|
192
|
+
valid_types: e.valid_types,
|
193
|
+
filename: e.filename,
|
182
194
|
),
|
183
195
|
help_suggestion: ShopifyCLI::Context.message(
|
184
196
|
"script.error.configuration_schema_field_invalid_value_error_help"
|
@@ -1,6 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require "shopify_cli/theme/theme"
|
3
3
|
require "shopify_cli/theme/ignore_filter"
|
4
|
+
require "shopify_cli/theme/include_filter"
|
4
5
|
require "shopify_cli/theme/syncer"
|
5
6
|
|
6
7
|
module Theme
|
@@ -12,6 +13,7 @@ module Theme
|
|
12
13
|
parser.on("-t", "--theme=NAME_OR_ID") { |theme| flags[:theme] = theme }
|
13
14
|
parser.on("-l", "--live") { flags[:live] = true }
|
14
15
|
parser.on("-d", "--development") { flags[:development] = true }
|
16
|
+
parser.on("-o", "--only=PATTERN") { |pattern| flags[:includes] = pattern }
|
15
17
|
parser.on("-x", "--ignore=PATTERN") do |pattern|
|
16
18
|
flags[:ignores] ||= []
|
17
19
|
flags[:ignores] << pattern
|
@@ -24,10 +26,13 @@ module Theme
|
|
24
26
|
theme = find_theme(root, **options.flags)
|
25
27
|
return if theme.nil?
|
26
28
|
|
29
|
+
include_filter = ShopifyCLI::Theme::IncludeFilter.new(options.flags[:includes])
|
27
30
|
ignore_filter = ShopifyCLI::Theme::IgnoreFilter.from_path(root)
|
28
31
|
ignore_filter.add_patterns(options.flags[:ignores]) if options.flags[:ignores]
|
29
32
|
|
30
|
-
syncer = ShopifyCLI::Theme::Syncer.new(@ctx, theme: theme,
|
33
|
+
syncer = ShopifyCLI::Theme::Syncer.new(@ctx, theme: theme,
|
34
|
+
include_filter: include_filter,
|
35
|
+
ignore_filter: ignore_filter)
|
31
36
|
begin
|
32
37
|
syncer.start_threads
|
33
38
|
CLI::UI::Frame.open(@ctx.message("theme.pull.pulling", theme.name, theme.id, theme.shop)) do
|
@@ -2,6 +2,7 @@
|
|
2
2
|
require "shopify_cli/theme/theme"
|
3
3
|
require "shopify_cli/theme/development_theme"
|
4
4
|
require "shopify_cli/theme/ignore_filter"
|
5
|
+
require "shopify_cli/theme/include_filter"
|
5
6
|
require "shopify_cli/theme/syncer"
|
6
7
|
|
7
8
|
module Theme
|
@@ -17,6 +18,7 @@ module Theme
|
|
17
18
|
parser.on("-j", "--json") { flags[:json] = true }
|
18
19
|
parser.on("-a", "--allow-live") { flags[:allow_live] = true }
|
19
20
|
parser.on("-p", "--publish") { flags[:publish] = true }
|
21
|
+
parser.on("-o", "--only=PATTERN") { |pattern| flags[:includes] = pattern }
|
20
22
|
parser.on("-x", "--ignore=PATTERN") do |pattern|
|
21
23
|
flags[:ignores] ||= []
|
22
24
|
flags[:ignores] << pattern
|
@@ -35,10 +37,13 @@ module Theme
|
|
35
37
|
return unless CLI::UI::Prompt.confirm(question)
|
36
38
|
end
|
37
39
|
|
40
|
+
include_filter = ShopifyCLI::Theme::IncludeFilter.new(options.flags[:includes])
|
38
41
|
ignore_filter = ShopifyCLI::Theme::IgnoreFilter.from_path(root)
|
39
42
|
ignore_filter.add_patterns(options.flags[:ignores]) if options.flags[:ignores]
|
40
43
|
|
41
|
-
syncer = ShopifyCLI::Theme::Syncer.new(@ctx, theme: theme,
|
44
|
+
syncer = ShopifyCLI::Theme::Syncer.new(@ctx, theme: theme,
|
45
|
+
include_filter: include_filter,
|
46
|
+
ignore_filter: ignore_filter)
|
42
47
|
begin
|
43
48
|
syncer.start_threads
|
44
49
|
if options.flags[:json]
|
@@ -65,6 +65,8 @@ module Theme
|
|
65
65
|
{{command:-j, --json}} Output JSON instead of a UI.
|
66
66
|
{{command:-a, --allow-live}} Allow push to a live theme.
|
67
67
|
{{command:-p, --publish}} Publish as the live theme after uploading.
|
68
|
+
{{command:-o, --only}} Upload only the specified files.
|
69
|
+
{{command:-x, --ignore}} Skip uploading the specified files.
|
68
70
|
|
69
71
|
Run without options to select theme from a list.
|
70
72
|
HELP
|
@@ -200,6 +202,8 @@ module Theme
|
|
200
202
|
{{command:-l, --live}} Pull theme files from your remote live theme.
|
201
203
|
{{command:-d, --development}} Pull theme files from your remote development theme.
|
202
204
|
{{command:-n, --nodelete}} Runs the pull command without deleting local files.
|
205
|
+
{{command:-o, --only}} Download only the specified files.
|
206
|
+
{{command:-x, --ignore}} Skip downloading the specified files.
|
203
207
|
|
204
208
|
Run without options to select theme from a list.
|
205
209
|
HELP
|