shopify-cli 2.11.0 → 2.12.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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)
|