shopify-cli 2.11.0 → 2.12.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 +29 -1
- data/Gemfile.lock +1 -1
- data/bin/shopify +13 -0
- data/docs/users/installation.md +1 -44
- data/lib/project_types/extension/commands/build.rb +0 -3
- data/lib/project_types/extension/commands/check.rb +0 -1
- data/lib/project_types/extension/commands/create.rb +0 -1
- data/lib/project_types/extension/commands/push.rb +13 -1
- data/lib/project_types/extension/commands/serve.rb +0 -1
- data/lib/project_types/extension/loaders/project.rb +28 -8
- data/lib/project_types/extension/messages/messages.rb +10 -2
- data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +114 -0
- data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +7 -1
- data/lib/project_types/script/cli.rb +2 -0
- data/lib/project_types/script/commands/create.rb +2 -2
- data/lib/project_types/script/commands/push.rb +4 -6
- data/lib/project_types/script/config/extension_points.yml +0 -4
- data/lib/project_types/script/forms/create.rb +1 -14
- data/lib/project_types/script/layers/application/connect_app.rb +3 -2
- data/lib/project_types/script/layers/application/create_script.rb +1 -1
- data/lib/project_types/script/layers/application/push_script.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/errors.rb +11 -0
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +2 -6
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb +30 -26
- data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +35 -9
- data/lib/project_types/script/layers/infrastructure/languages/tool_version_checker.rb +26 -0
- data/lib/project_types/script/layers/infrastructure/languages/typescript_project_creator.rb +3 -6
- data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +31 -27
- data/lib/project_types/script/layers/infrastructure/languages/wasm_task_runner.rb +3 -7
- data/lib/project_types/script/loaders/project.rb +8 -7
- data/lib/project_types/script/messages/messages.rb +14 -13
- data/lib/project_types/script/ui/error_handler.rb +13 -0
- data/lib/project_types/theme/commands/check.rb +0 -1
- data/lib/project_types/theme/commands/common/root_helper.rb +65 -0
- data/lib/project_types/theme/commands/delete.rb +0 -1
- data/lib/project_types/theme/commands/init.rb +2 -1
- data/lib/project_types/theme/commands/language_server.rb +0 -1
- data/lib/project_types/theme/commands/package.rb +0 -1
- data/lib/project_types/theme/commands/publish.rb +0 -1
- data/lib/project_types/theme/commands/pull.rb +18 -9
- data/lib/project_types/theme/commands/push.rb +16 -11
- data/lib/project_types/theme/commands/serve.rb +6 -3
- data/lib/project_types/theme/conversions/base_glob.rb +50 -0
- data/lib/project_types/theme/conversions/ignore_glob.rb +15 -0
- data/lib/project_types/theme/conversions/include_glob.rb +15 -0
- data/lib/project_types/theme/messages/messages.rb +5 -5
- data/lib/shopify_cli/command.rb +11 -3
- data/lib/shopify_cli/commands/app/create/node.rb +1 -0
- data/lib/shopify_cli/commands/app/create/php.rb +1 -0
- data/lib/shopify_cli/commands/app/create/rails.rb +2 -1
- data/lib/shopify_cli/commands/app/create.rb +0 -3
- data/lib/shopify_cli/commands/app/deploy.rb +1 -1
- data/lib/shopify_cli/commands/app/serve.rb +0 -1
- data/lib/shopify_cli/constants.rb +2 -2
- data/lib/shopify_cli/environment.rb +45 -45
- data/lib/shopify_cli/git.rb +9 -1
- data/lib/shopify_cli/messages/messages.rb +23 -2
- data/lib/shopify_cli/tasks/ensure_git_dependency.rb +14 -0
- data/lib/shopify_cli/tasks.rb +1 -0
- data/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb +63 -0
- data/lib/shopify_cli/theme/dev_server/hot_reload.rb +22 -6
- data/lib/shopify_cli/theme/dev_server/proxy.rb +18 -7
- data/lib/shopify_cli/theme/dev_server.rb +1 -3
- data/lib/shopify_cli/theme/development_theme.rb +11 -0
- data/lib/shopify_cli/theme/file.rb +4 -0
- data/lib/shopify_cli/theme/include_filter.rb +4 -2
- data/lib/shopify_cli/theme/syncer.rb +13 -4
- data/lib/shopify_cli/theme/theme.rb +0 -4
- data/lib/shopify_cli/version.rb +1 -1
- metadata +9 -2
@@ -4,17 +4,16 @@ module Script
|
|
4
4
|
module Layers
|
5
5
|
module Infrastructure
|
6
6
|
module Languages
|
7
|
-
class AssemblyScriptTaskRunner
|
7
|
+
class AssemblyScriptTaskRunner < TaskRunner
|
8
|
+
NODE_MIN_VERSION = "14.15.0"
|
9
|
+
NPM_MIN_VERSION = "5.2.0"
|
10
|
+
|
8
11
|
BYTECODE_FILE = "build/script.wasm"
|
9
12
|
METADATA_FILE = "build/metadata.json"
|
10
13
|
SCRIPT_SDK_BUILD = "npm run build"
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
def initialize(ctx, script_name)
|
15
|
-
@ctx = ctx
|
16
|
-
@script_name = script_name
|
17
|
-
end
|
14
|
+
NPM_SET_REGISTRY_COMMAND = "npm --userconfig ./.npmrc config set @shopify:registry https://registry.npmjs.com"
|
15
|
+
NPM_SET_ENGINE_STRICT_COMMAND = "npm --userconfig ./.npmrc config set engine-strict true"
|
16
|
+
NPM_INSTALL_COMMAND = "npm install --no-audit --no-optional --legacy-peer-deps --loglevel error"
|
18
17
|
|
19
18
|
def build
|
20
19
|
compile
|
@@ -22,10 +21,10 @@ module Script
|
|
22
21
|
end
|
23
22
|
|
24
23
|
def install_dependencies
|
25
|
-
|
24
|
+
run_cmd_with_env_check(NPM_INSTALL_COMMAND)
|
26
25
|
|
27
|
-
|
28
|
-
raise Errors::DependencyInstallError,
|
26
|
+
rescue Errors::SystemCallFailureError => e
|
27
|
+
raise Errors::DependencyInstallError, e.out
|
29
28
|
end
|
30
29
|
|
31
30
|
def dependencies_installed?
|
@@ -38,14 +37,32 @@ module Script
|
|
38
37
|
end
|
39
38
|
|
40
39
|
def library_version(library_name)
|
41
|
-
output = JSON.parse(
|
40
|
+
output = JSON.parse(run_cmd_with_env_check("npm -s list --json"))
|
42
41
|
library_version_from_npm_list(output, library_name)
|
43
42
|
rescue Errors::SystemCallFailureError => error
|
44
43
|
library_version_from_npm_list_error_output(error, library_name)
|
45
44
|
end
|
46
45
|
|
46
|
+
def set_npm_config
|
47
|
+
run_cmd_with_env_check(NPM_SET_REGISTRY_COMMAND)
|
48
|
+
run_cmd_with_env_check(NPM_SET_ENGINE_STRICT_COMMAND)
|
49
|
+
end
|
50
|
+
|
47
51
|
private
|
48
52
|
|
53
|
+
def ensure_environment
|
54
|
+
return if defined?(@environment_checked)
|
55
|
+
@environment_checked = true
|
56
|
+
|
57
|
+
ToolVersionChecker.check_node(minimum_version: NODE_MIN_VERSION)
|
58
|
+
ToolVersionChecker.check_npm(minimum_version: NPM_MIN_VERSION)
|
59
|
+
end
|
60
|
+
|
61
|
+
def run_cmd_with_env_check(cmd)
|
62
|
+
ensure_environment
|
63
|
+
CommandRunner.new(ctx: ctx).call(cmd)
|
64
|
+
end
|
65
|
+
|
49
66
|
def library_version_from_npm_list_error_output(error, library_name)
|
50
67
|
# npm list can return a failure status code, even when returning the correct data.
|
51
68
|
# This causes the CommandRunner to throw a SystemCallFailure error that contains the data.
|
@@ -64,22 +81,9 @@ module Script
|
|
64
81
|
end
|
65
82
|
end
|
66
83
|
|
67
|
-
def check_node_version!
|
68
|
-
output, status = @ctx.capture2e("node", "--version")
|
69
|
-
raise Errors::DependencyInstallError, output unless status.success?
|
70
|
-
|
71
|
-
require "semantic/semantic"
|
72
|
-
version = ::Semantic::Version.new(output[1..-1])
|
73
|
-
unless version >= ::Semantic::Version.new(AssemblyScriptProjectCreator::MIN_NODE_VERSION)
|
74
|
-
raise Errors::DependencyInstallError,
|
75
|
-
"Node version must be >= v#{AssemblyScriptProjectCreator::MIN_NODE_VERSION}. "\
|
76
|
-
"Current version: #{output.strip}."
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
84
|
def compile
|
81
85
|
check_compilation_dependencies!
|
82
|
-
|
86
|
+
run_cmd_with_env_check(SCRIPT_SDK_BUILD)
|
83
87
|
end
|
84
88
|
|
85
89
|
def check_compilation_dependencies!
|
@@ -5,15 +5,41 @@ module Script
|
|
5
5
|
module Infrastructure
|
6
6
|
module Languages
|
7
7
|
class TaskRunner
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
8
|
+
attr_reader :ctx
|
9
|
+
|
10
|
+
def self.for(ctx, language)
|
11
|
+
task_runners = {
|
12
|
+
"assemblyscript" => AssemblyScriptTaskRunner,
|
13
|
+
"typescript" => TypeScriptTaskRunner,
|
14
|
+
"wasm" => WasmTaskRunner,
|
15
|
+
}
|
16
|
+
|
17
|
+
raise Errors::TaskRunnerNotFoundError unless task_runners[language]
|
18
|
+
task_runners[language].new(ctx)
|
19
|
+
end
|
20
|
+
|
21
|
+
def initialize(ctx)
|
22
|
+
@ctx = ctx
|
23
|
+
end
|
24
|
+
|
25
|
+
def build
|
26
|
+
raise NotImplementedError
|
27
|
+
end
|
28
|
+
|
29
|
+
def dependencies_installed?
|
30
|
+
raise NotImplementedError
|
31
|
+
end
|
32
|
+
|
33
|
+
def install_dependencies
|
34
|
+
raise NotImplementedError
|
35
|
+
end
|
36
|
+
|
37
|
+
def metadata_file_location
|
38
|
+
raise NotImplementedError
|
39
|
+
end
|
40
|
+
|
41
|
+
def library_version(_library_name)
|
42
|
+
raise NotImplementedError
|
17
43
|
end
|
18
44
|
end
|
19
45
|
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Script
|
2
|
+
module Layers
|
3
|
+
module Infrastructure
|
4
|
+
module Languages
|
5
|
+
class ToolVersionChecker
|
6
|
+
class << self
|
7
|
+
def check_node(minimum_version:)
|
8
|
+
check_version("node", ShopifyCLI::Environment.node_version, minimum_version)
|
9
|
+
end
|
10
|
+
|
11
|
+
def check_npm(minimum_version:)
|
12
|
+
check_version("npm", ShopifyCLI::Environment.npm_version, minimum_version)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def check_version(tool, env_version, minimum_version)
|
18
|
+
return if env_version >= ::Semantic::Version.new(minimum_version)
|
19
|
+
raise Errors::InvalidEnvironmentError.new(tool, env_version, minimum_version)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -5,18 +5,15 @@ module Script
|
|
5
5
|
module Infrastructure
|
6
6
|
module Languages
|
7
7
|
class TypeScriptProjectCreator < ProjectCreator
|
8
|
-
MIN_NODE_VERSION = "14.15.0"
|
9
|
-
NPM_SET_REGISTRY_COMMAND = "npm --userconfig ./.npmrc config set @shopify:registry https://registry.npmjs.com"
|
10
|
-
NPM_SET_ENGINE_STRICT_COMMAND = "npm --userconfig ./.npmrc config set engine-strict true"
|
11
|
-
|
12
8
|
def self.config_file
|
13
9
|
"package.json"
|
14
10
|
end
|
15
11
|
|
16
12
|
def setup_dependencies
|
13
|
+
task_runner = Infrastructure::Languages::TypeScriptTaskRunner.new(ctx)
|
14
|
+
task_runner.set_npm_config
|
15
|
+
|
17
16
|
super
|
18
|
-
command_runner.call(NPM_SET_REGISTRY_COMMAND)
|
19
|
-
command_runner.call(NPM_SET_ENGINE_STRICT_COMMAND)
|
20
17
|
|
21
18
|
if ctx.file_exist?("yarn.lock")
|
22
19
|
ctx.rm("yarn.lock")
|
@@ -4,18 +4,17 @@ module Script
|
|
4
4
|
module Layers
|
5
5
|
module Infrastructure
|
6
6
|
module Languages
|
7
|
-
class TypeScriptTaskRunner
|
7
|
+
class TypeScriptTaskRunner < TaskRunner
|
8
|
+
NODE_MIN_VERSION = "14.15.0"
|
9
|
+
NPM_MIN_VERSION = "5.2.0"
|
10
|
+
|
8
11
|
BYTECODE_FILE = "build/index.wasm"
|
9
12
|
METADATA_FILE = "build/metadata.json"
|
10
13
|
SCRIPT_SDK_BUILD = "npm run build"
|
11
14
|
GEN_METADATA = "npm run gen-metadata"
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
def initialize(ctx, script_name)
|
16
|
-
@ctx = ctx
|
17
|
-
@script_name = script_name
|
18
|
-
end
|
15
|
+
NPM_SET_REGISTRY_COMMAND = "npm --userconfig ./.npmrc config set @shopify:registry https://registry.npmjs.com"
|
16
|
+
NPM_SET_ENGINE_STRICT_COMMAND = "npm --userconfig ./.npmrc config set engine-strict true"
|
17
|
+
NPM_INSTALL_COMMAND = "npm install --no-audit --no-optional --legacy-peer-deps --loglevel error"
|
19
18
|
|
20
19
|
def build
|
21
20
|
compile
|
@@ -23,10 +22,10 @@ module Script
|
|
23
22
|
end
|
24
23
|
|
25
24
|
def install_dependencies
|
26
|
-
|
25
|
+
run_cmd_with_env_check(NPM_INSTALL_COMMAND)
|
27
26
|
|
28
|
-
|
29
|
-
raise Errors::DependencyInstallError,
|
27
|
+
rescue Errors::SystemCallFailureError => e
|
28
|
+
raise Errors::DependencyInstallError, e.out
|
30
29
|
end
|
31
30
|
|
32
31
|
def dependencies_installed?
|
@@ -39,14 +38,32 @@ module Script
|
|
39
38
|
end
|
40
39
|
|
41
40
|
def library_version(library_name)
|
42
|
-
output = JSON.parse(
|
41
|
+
output = JSON.parse(run_cmd_with_env_check("npm -s list --json"))
|
43
42
|
library_version_from_npm_list(output, library_name)
|
44
43
|
rescue Errors::SystemCallFailureError => error
|
45
44
|
library_version_from_npm_list_error_output(error, library_name)
|
46
45
|
end
|
47
46
|
|
47
|
+
def set_npm_config
|
48
|
+
run_cmd_with_env_check(NPM_SET_REGISTRY_COMMAND)
|
49
|
+
run_cmd_with_env_check(NPM_SET_ENGINE_STRICT_COMMAND)
|
50
|
+
end
|
51
|
+
|
48
52
|
private
|
49
53
|
|
54
|
+
def ensure_environment
|
55
|
+
return if defined?(@environment_checked)
|
56
|
+
@environment_checked = true
|
57
|
+
|
58
|
+
ToolVersionChecker.check_node(minimum_version: NODE_MIN_VERSION)
|
59
|
+
ToolVersionChecker.check_npm(minimum_version: NPM_MIN_VERSION)
|
60
|
+
end
|
61
|
+
|
62
|
+
def run_cmd_with_env_check(cmd)
|
63
|
+
ensure_environment
|
64
|
+
CommandRunner.new(ctx: ctx).call(cmd)
|
65
|
+
end
|
66
|
+
|
50
67
|
def library_version_from_npm_list_error_output(error, library_name)
|
51
68
|
# npm list can return a failure status code, even when returning the correct data.
|
52
69
|
# This causes the CommandRunner to throw a SystemCallFailure error that contains the data.
|
@@ -65,23 +82,10 @@ module Script
|
|
65
82
|
end
|
66
83
|
end
|
67
84
|
|
68
|
-
def check_node_version!
|
69
|
-
output, status = @ctx.capture2e("node", "--version")
|
70
|
-
raise Errors::DependencyInstallError, output unless status.success?
|
71
|
-
|
72
|
-
require "semantic/semantic"
|
73
|
-
version = ::Semantic::Version.new(output[1..-1])
|
74
|
-
unless version >= ::Semantic::Version.new(TypeScriptProjectCreator::MIN_NODE_VERSION)
|
75
|
-
raise Errors::DependencyInstallError,
|
76
|
-
"Node version must be >= v#{TypeScriptProjectCreator::MIN_NODE_VERSION}. "\
|
77
|
-
"Current version: #{output.strip}."
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
85
|
def compile
|
82
86
|
check_compilation_dependencies!
|
83
|
-
|
84
|
-
|
87
|
+
run_cmd_with_env_check(SCRIPT_SDK_BUILD)
|
88
|
+
run_cmd_with_env_check(GEN_METADATA)
|
85
89
|
end
|
86
90
|
|
87
91
|
def check_compilation_dependencies!
|
@@ -4,19 +4,15 @@ module Script
|
|
4
4
|
module Layers
|
5
5
|
module Infrastructure
|
6
6
|
module Languages
|
7
|
-
class WasmTaskRunner
|
7
|
+
class WasmTaskRunner < TaskRunner
|
8
8
|
BYTECODE_FILE = "script.wasm"
|
9
|
-
attr_reader :ctx, :script_name
|
10
|
-
|
11
|
-
def initialize(ctx, script_name)
|
12
|
-
@ctx = ctx
|
13
|
-
@script_name = script_name
|
14
|
-
end
|
15
9
|
|
16
10
|
def dependencies_installed?
|
17
11
|
true
|
18
12
|
end
|
19
13
|
|
14
|
+
def install_dependencies; end
|
15
|
+
|
20
16
|
def library_version(_library_name)
|
21
17
|
nil
|
22
18
|
end
|
@@ -20,21 +20,22 @@ module Script
|
|
20
20
|
project.env = env
|
21
21
|
project
|
22
22
|
rescue SmartProperties::InitializationError, SmartProperties::InvalidValueError => error
|
23
|
-
handle_error(error, context: context
|
23
|
+
handle_error(error, context: context)
|
24
24
|
end
|
25
25
|
|
26
|
-
def self.handle_error(error, context
|
27
|
-
if
|
26
|
+
def self.handle_error(error, context:)
|
27
|
+
if ShopifyCLI::Environment.interactive?
|
28
28
|
properties_hash = { api_key: "SHOPIFY_API_KEY", secret: "SHOPIFY_API_SECRET" }
|
29
29
|
missing_env_variables = error.properties.map { |p| properties_hash[p.name] }.compact.join(", ")
|
30
|
-
|
31
|
-
|
30
|
+
message = context.message("script.error.missing_env_file_variables", missing_env_variables)
|
31
|
+
message += context.message("script.error.missing_env_file_variables_solution", ShopifyCLI::TOOL_NAME)
|
32
32
|
else
|
33
33
|
properties_hash = { api_key: "--api-key", secret: "--api-secret" }
|
34
34
|
missing_options = error.properties.map { |p| properties_hash[p.name] }.compact.join(", ")
|
35
|
-
|
36
|
-
|
35
|
+
message = context.message("script.error.missing_push_options_ci", missing_options)
|
36
|
+
message += context.message("script.error.missing_push_options_ci_solution", ShopifyCLI::TOOL_NAME)
|
37
37
|
end
|
38
|
+
raise ShopifyCLI::Abort, message
|
38
39
|
end
|
39
40
|
|
40
41
|
def self.env_file_exists?(directory)
|
@@ -113,6 +113,10 @@ module Script
|
|
113
113
|
dependency_install_cause: "Something went wrong while installing the needed dependencies.",
|
114
114
|
dependency_install_help: "Correct the errors.",
|
115
115
|
|
116
|
+
invalid_environment_cause: "Your environment %{tool} version, %{env_version}, "\
|
117
|
+
"is too low. It must be at least %{minimum_version}.",
|
118
|
+
invalid_environment_help: "Update %{tool}.",
|
119
|
+
|
116
120
|
failed_api_request_cause: "Something went wrong while communicating with Shopify.",
|
117
121
|
failed_api_request_help: "Try again.",
|
118
122
|
|
@@ -149,12 +153,14 @@ module Script
|
|
149
153
|
|
150
154
|
language_library_for_api_not_found_cause: "Script can’t be pushed because the %{language} library for API %{api} is missing.",
|
151
155
|
language_library_for_api_not_found_help: "Make sure extension_point.yml contains the correct API library.",
|
152
|
-
no_scripts_found_in_app: "The selected apps have no scripts.
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
156
|
+
no_scripts_found_in_app: "The selected apps have no scripts. Please, create them first on the partners' dashboard.",
|
157
|
+
missing_push_options_ci: "The following are missing: %s. ",
|
158
|
+
missing_push_options_ci_solution: "To add them to a CI environment:\n\t1. Run a connect command " \
|
159
|
+
"({{command:%1$s script connect}})\n\t2. Navigate to the .env file at the root of your project\n\t" \
|
160
|
+
"3. Copy the missing values and pass them through as arguments in {{command:%1$s script push}}",
|
161
|
+
missing_env_file_variables: "The following are missing in the .env file: %s. ",
|
162
|
+
missing_env_file_variables_solution: "To add it, connect your script with " \
|
163
|
+
"{{command:%1$s script connect}} ",
|
158
164
|
},
|
159
165
|
|
160
166
|
create: {
|
@@ -164,7 +170,7 @@ module Script
|
|
164
170
|
Options:
|
165
171
|
{{command:--name=NAME}} Script project name.
|
166
172
|
{{command:--api=TYPE}} Script API name. Supported values: %2$s.
|
167
|
-
{{command:--language=LANGUAGE}} Programming language. Supported values: %3$s.
|
173
|
+
{{command:--language=LANGUAGE}} Programming language. Defaults to wasm. Supported values: %3$s.
|
168
174
|
HELP
|
169
175
|
|
170
176
|
error: {
|
@@ -191,9 +197,7 @@ module Script
|
|
191
197
|
HELP
|
192
198
|
|
193
199
|
error: {
|
194
|
-
|
195
|
-
operation_failed_with_api_key: "Couldn't push script to app (API key: %{api_key}).",
|
196
|
-
operation_failed_no_api_key: "Couldn't push script to app.",
|
200
|
+
operation_failed: "Couldn't push script to app.",
|
197
201
|
},
|
198
202
|
|
199
203
|
script_pushed: "{{v}} Script pushed to app (API key: %{api_key}).",
|
@@ -206,8 +210,6 @@ module Script
|
|
206
210
|
HELP
|
207
211
|
error: {
|
208
212
|
operation_failed: "Couldn't connect script to app.",
|
209
|
-
missing_env_file_variables: "The following variables are missing in the .env file: %s."\
|
210
|
-
" To connect the script to an app, enter the value into the .env file or delete the .env file, and then run {{command:%s script connect}}",
|
211
213
|
},
|
212
214
|
},
|
213
215
|
javy: {
|
@@ -233,7 +235,6 @@ module Script
|
|
233
235
|
forms: {
|
234
236
|
create: {
|
235
237
|
select_extension_point: "Which Script API do you want to use?",
|
236
|
-
select_language: "Which language do you want to use?",
|
237
238
|
script_name: "What do you want to name your script?",
|
238
239
|
},
|
239
240
|
},
|
@@ -237,6 +237,19 @@ module Script
|
|
237
237
|
),
|
238
238
|
help_suggestion: ShopifyCLI::Context.message("script.error.graphql_error_help"),
|
239
239
|
}
|
240
|
+
when Layers::Infrastructure::Errors::InvalidEnvironmentError
|
241
|
+
{
|
242
|
+
cause_of_error: ShopifyCLI::Context.message(
|
243
|
+
"script.error.invalid_environment_cause",
|
244
|
+
tool: e.tool,
|
245
|
+
env_version: e.env_version,
|
246
|
+
minimum_version: e.minimum_version,
|
247
|
+
),
|
248
|
+
help_suggestion: ShopifyCLI::Context.message(
|
249
|
+
"script.error.invalid_environment_help",
|
250
|
+
tool: e.tool,
|
251
|
+
),
|
252
|
+
}
|
240
253
|
when Layers::Infrastructure::Errors::SystemCallFailureError
|
241
254
|
{
|
242
255
|
cause_of_error: ShopifyCLI::Context
|
@@ -0,0 +1,65 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Theme
|
4
|
+
class Command
|
5
|
+
module Common
|
6
|
+
module RootHelper
|
7
|
+
def root_value(options, name)
|
8
|
+
argv = default_argv(options)
|
9
|
+
command_index = argv.index(name.to_s)
|
10
|
+
|
11
|
+
return "." if command_index.nil?
|
12
|
+
|
13
|
+
next_index = command_index + 1
|
14
|
+
option_by_key = options_map(options)
|
15
|
+
|
16
|
+
while next_index < argv.size
|
17
|
+
element = argv[next_index]
|
18
|
+
option = option_by_key[element]
|
19
|
+
|
20
|
+
return element if option.nil?
|
21
|
+
|
22
|
+
# Skip the option argument
|
23
|
+
next_index += 1 unless option.arg.nil?
|
24
|
+
|
25
|
+
# PATTERN arguments take precedence over the `root`
|
26
|
+
if option.arg =~ /PATTERN/
|
27
|
+
next_index += 1 while option_argument?(argv, next_index, option_by_key)
|
28
|
+
next
|
29
|
+
end
|
30
|
+
|
31
|
+
next_index += 1
|
32
|
+
end
|
33
|
+
|
34
|
+
"."
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def default_argv(options)
|
40
|
+
options.parser.default_argv
|
41
|
+
end
|
42
|
+
|
43
|
+
def options_map(options)
|
44
|
+
map = {}
|
45
|
+
options_list(options).each do |option|
|
46
|
+
map[option.short.first] = option
|
47
|
+
map[option.long.first] = option
|
48
|
+
end
|
49
|
+
map
|
50
|
+
end
|
51
|
+
|
52
|
+
def options_list(options)
|
53
|
+
options.parser.top.list
|
54
|
+
end
|
55
|
+
|
56
|
+
def option_argument?(argv, next_index, option_by_key)
|
57
|
+
return false unless next_index < argv.size
|
58
|
+
|
59
|
+
element = argv[next_index]
|
60
|
+
option_by_key[element].nil?
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
@@ -3,13 +3,14 @@
|
|
3
3
|
module Theme
|
4
4
|
class Command
|
5
5
|
class Init < ShopifyCLI::Command::SubCommand
|
6
|
-
recommend_default_node_range
|
7
6
|
recommend_default_ruby_range
|
8
7
|
|
9
8
|
options do |parser, flags|
|
10
9
|
parser.on("-u", "--clone-url URL") { |url| flags[:clone_url] = url }
|
11
10
|
end
|
12
11
|
|
12
|
+
prerequisite_task :ensure_git_dependency
|
13
|
+
|
13
14
|
DEFAULT_CLONE_URL = "https://github.com/Shopify/dawn.git"
|
14
15
|
|
15
16
|
def call(args, _name)
|
@@ -1,38 +1,46 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require "shopify_cli/theme/theme"
|
3
|
+
require "shopify_cli/theme/development_theme"
|
3
4
|
require "shopify_cli/theme/ignore_filter"
|
4
5
|
require "shopify_cli/theme/include_filter"
|
5
6
|
require "shopify_cli/theme/syncer"
|
7
|
+
require "project_types/theme/commands/common/root_helper"
|
8
|
+
require "project_types/theme/conversions/include_glob"
|
9
|
+
require "project_types/theme/conversions/ignore_glob"
|
6
10
|
|
7
11
|
module Theme
|
8
12
|
class Command
|
9
13
|
class Pull < ShopifyCLI::Command::SubCommand
|
10
|
-
|
14
|
+
include Common::RootHelper
|
15
|
+
|
11
16
|
recommend_default_ruby_range
|
12
17
|
|
13
18
|
options do |parser, flags|
|
19
|
+
Conversions::IncludeGlob.register(parser)
|
20
|
+
Conversions::IgnoreGlob.register(parser)
|
21
|
+
|
14
22
|
parser.on("-n", "--nodelete") { flags[:nodelete] = true }
|
15
23
|
parser.on("-i", "--themeid=ID") { |theme_id| flags[:theme_id] = theme_id }
|
16
24
|
parser.on("-t", "--theme=NAME_OR_ID") { |theme| flags[:theme] = theme }
|
17
25
|
parser.on("-l", "--live") { flags[:live] = true }
|
18
26
|
parser.on("-d", "--development") { flags[:development] = true }
|
19
|
-
parser.on("-o", "--only=PATTERN") do |pattern|
|
27
|
+
parser.on("-o", "--only=PATTERN", Conversions::IncludeGlob) do |pattern|
|
20
28
|
flags[:includes] ||= []
|
21
|
-
flags[:includes]
|
29
|
+
flags[:includes] += pattern
|
22
30
|
end
|
23
|
-
parser.on("-x", "--ignore=PATTERN") do |pattern|
|
31
|
+
parser.on("-x", "--ignore=PATTERN", Conversions::IgnoreGlob) do |pattern|
|
24
32
|
flags[:ignores] ||= []
|
25
|
-
flags[:ignores]
|
33
|
+
flags[:ignores] += pattern
|
26
34
|
end
|
27
35
|
end
|
28
36
|
|
29
|
-
def call(
|
30
|
-
root =
|
37
|
+
def call(_args, name)
|
38
|
+
root = root_value(options, name)
|
31
39
|
delete = !options.flags[:nodelete]
|
32
40
|
theme = find_theme(root, **options.flags)
|
33
41
|
return if theme.nil?
|
34
42
|
|
35
|
-
include_filter = ShopifyCLI::Theme::IncludeFilter.new(options.flags[:includes])
|
43
|
+
include_filter = ShopifyCLI::Theme::IncludeFilter.new(root, options.flags[:includes])
|
36
44
|
ignore_filter = ShopifyCLI::Theme::IgnoreFilter.from_path(root)
|
37
45
|
ignore_filter.add_patterns(options.flags[:ignores]) if options.flags[:ignores]
|
38
46
|
|
@@ -74,7 +82,8 @@ module Theme
|
|
74
82
|
end
|
75
83
|
|
76
84
|
if development
|
77
|
-
|
85
|
+
dev_theme = ShopifyCLI::Theme::DevelopmentTheme.find(@ctx, root: root)
|
86
|
+
return dev_theme || @ctx.abort(@ctx.message("theme.pull.theme_not_found", "development"))
|
78
87
|
end
|
79
88
|
|
80
89
|
select_theme(root)
|