shopify-cli 2.7.1 → 2.7.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +10 -1
- data/Gemfile.lock +1 -1
- data/lib/project_types/extension/commands/build.rb +3 -8
- data/lib/project_types/extension/commands/create.rb +1 -3
- data/lib/project_types/extension/messages/messages.rb +0 -2
- data/lib/project_types/extension/models/development_server.rb +2 -2
- data/lib/project_types/rails/commands/create.rb +1 -3
- data/lib/project_types/script/cli.rb +5 -0
- data/lib/project_types/script/commands/create.rb +1 -3
- data/lib/project_types/script/commands/javy.rb +0 -2
- data/lib/project_types/script/commands/push.rb +2 -1
- data/lib/project_types/script/config/extension_points.yml +0 -26
- data/lib/project_types/script/forms/ask_app.rb +32 -0
- data/lib/project_types/script/forms/ask_org.rb +30 -0
- data/lib/project_types/script/forms/ask_script_uuid.rb +22 -0
- data/lib/project_types/script/forms/run_against_shopify_org.rb +14 -0
- data/lib/project_types/script/layers/application/build_script.rb +0 -1
- data/lib/project_types/script/layers/application/connect_app.rb +73 -0
- data/lib/project_types/script/layers/domain/script_project.rb +4 -0
- data/lib/project_types/script/layers/infrastructure/errors.rb +0 -1
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb +0 -4
- data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +0 -4
- data/lib/project_types/script/messages/messages.rb +0 -2
- data/lib/project_types/script/ui/error_handler.rb +0 -5
- data/lib/project_types/theme/commands/pull.rb +3 -0
- data/lib/project_types/theme/commands/push.rb +6 -1
- data/lib/project_types/theme/commands/serve.rb +1 -1
- data/lib/project_types/theme/messages/messages.rb +9 -0
- data/lib/project_types/theme/ui/sync_progress_bar.rb +2 -2
- data/lib/shopify_cli/command/project_command.rb +20 -7
- data/lib/shopify_cli/commands/app/create/node.rb +1 -3
- data/lib/shopify_cli/commands/app/create/rails.rb +1 -3
- data/lib/shopify_cli/constants.rb +3 -0
- data/lib/shopify_cli/context.rb +9 -0
- data/lib/shopify_cli/environment.rb +4 -0
- data/lib/shopify_cli/identity_auth.rb +18 -0
- data/lib/shopify_cli/messages/messages.rb +1 -0
- data/lib/shopify_cli/partners_api.rb +1 -8
- data/lib/shopify_cli/services/app/serve/node_service.rb +1 -1
- data/lib/shopify_cli/services/app/serve/rails_service.rb +1 -1
- data/lib/shopify_cli/tasks/ensure_authenticated.rb +9 -3
- data/lib/shopify_cli/theme/dev_server.rb +4 -4
- data/lib/shopify_cli/theme/syncer/error_reporter.rb +45 -0
- data/lib/shopify_cli/theme/syncer/operation.rb +56 -0
- data/lib/shopify_cli/theme/syncer/standard_reporter.rb +32 -0
- data/lib/shopify_cli/theme/syncer.rb +40 -39
- data/lib/shopify_cli/theme/theme.rb +31 -19
- data/lib/shopify_cli/tunnel.rb +8 -10
- data/lib/shopify_cli/version.rb +1 -1
- metadata +10 -3
- data/lib/project_types/script/tasks/ensure_env.rb +0 -106
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b15f9181fc2d774f3fcc0c7297881090097c32a873f5586a766a9f1af3ca4771
|
4
|
+
data.tar.gz: b05883edae91e131bbe30ea0fcf78fc7b7c31d775299ee37e7ce4b14b14f875a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fd64941e6aee6553c078d9cb52c9ff97d04f2975d396943cb94b009e862ea14e2be44632534786288fdc71075bea47337d474a63a87d889393ecb159848c5958
|
7
|
+
data.tar.gz: 24086b852a37609e95cc6a3f3c639b4d7b32c90b3b8b3db8154dd840f86f72b13b9c09b060e3f6da3dfeaa905e5a0c93c31c607c7ba7d7ea4d0029b80a90025e
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,14 @@
|
|
1
1
|
From version 2.6.0, the sections in this file adhere to the [keep a changelog](https://keepachangelog.com/en/1.0.0/) specification.
|
2
|
-
##
|
2
|
+
## Version 2.7.2
|
3
|
+
### Fixed
|
4
|
+
* [#1763](https://github.com/Shopify/shopify-cli/pull/1763): Fix: Tunnel --PORT parameter not working in Node.js app.
|
5
|
+
* [#1769](https://github.com/Shopify/shopify-cli/pull/1769): Fix `theme push --development --json` to output the proper exit code
|
6
|
+
* [#1766](https://github.com/Shopify/shopify-cli/pull/1766): Fix `theme serve` failing with the `--host` property
|
7
|
+
* [#1771](https://github.com/Shopify/shopify-cli/pull/1771): Fix `theme push --development --json` to output errors in the STDERR
|
8
|
+
* [#1778](https://github.com/Shopify/shopify-cli/pull/1778): Fix ngrok installation check on Windows
|
9
|
+
* [#1798](https://github.com/Shopify/shopify-cli/pull/1798): Add `--live` option to the `theme pull` and the `theme push` commands
|
10
|
+
* [#1788](https://github.com/Shopify/shopify-cli/pull/1788): Improve `theme serve` errors and add logs for successful operations
|
11
|
+
* [#1794](https://github.com/Shopify/shopify-cli/pull/1794): Fix bug where hidden subcommands appear in the help menu.
|
3
12
|
|
4
13
|
## Version 2.7.1
|
5
14
|
### Fixed
|
data/Gemfile.lock
CHANGED
@@ -24,21 +24,16 @@ module Extension
|
|
24
24
|
private
|
25
25
|
|
26
26
|
def run_new_flow(project)
|
27
|
-
Tasks::RunExtensionCommand.new(
|
27
|
+
output = Tasks::RunExtensionCommand.new(
|
28
28
|
type: project.specification_identifier.downcase,
|
29
29
|
command: "build",
|
30
30
|
config_file_name: specification_handler.server_config_file,
|
31
31
|
context: @ctx,
|
32
32
|
).call
|
33
33
|
|
34
|
-
@ctx.puts(
|
34
|
+
@ctx.puts(output)
|
35
35
|
rescue => error
|
36
|
-
|
37
|
-
@ctx.abort(@ctx.message("build.directory_not_found"))
|
38
|
-
else
|
39
|
-
@ctx.debug(error)
|
40
|
-
@ctx.abort(@ctx.message("build.build_failure_message"))
|
41
|
-
end
|
36
|
+
raise ShopifyCLI::Abort, error.message
|
42
37
|
end
|
43
38
|
|
44
39
|
def run_legacy_flow
|
@@ -3,9 +3,7 @@
|
|
3
3
|
module Extension
|
4
4
|
class Command
|
5
5
|
class Create < ShopifyCLI::Command::SubCommand
|
6
|
-
|
7
|
-
prerequisite_task :ensure_authenticated
|
8
|
-
end
|
6
|
+
prerequisite_task :ensure_authenticated
|
9
7
|
|
10
8
|
options do |parser, flags|
|
11
9
|
parser.on("--name=NAME") { |name| flags[:name] = name }
|
@@ -68,8 +68,6 @@ module Extension
|
|
68
68
|
HELP
|
69
69
|
frame_title: "Building extension with: %s…",
|
70
70
|
build_failure_message: "Failed to build extension code.",
|
71
|
-
build_success_message: "Build was successful!",
|
72
|
-
directory_not_found: "Build directory not found.",
|
73
71
|
},
|
74
72
|
register: {
|
75
73
|
help: <<~HELP,
|
@@ -33,8 +33,8 @@ module Extension
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def build(server_config)
|
36
|
-
|
37
|
-
return if status.success?
|
36
|
+
output, error, status = CLI::Kit::System.capture3(executable, "build", "-", stdin_data: server_config.to_yaml)
|
37
|
+
return output if status.success?
|
38
38
|
raise DevelopmentServerError, error
|
39
39
|
end
|
40
40
|
|
@@ -2,9 +2,7 @@
|
|
2
2
|
module Rails
|
3
3
|
class Command
|
4
4
|
class Create < ShopifyCLI::Command::AppSubCommand
|
5
|
-
|
6
|
-
prerequisite_task :ensure_authenticated
|
7
|
-
end
|
5
|
+
prerequisite_task :ensure_authenticated
|
8
6
|
|
9
7
|
USER_AGENT_CODE = <<~USERAGENT
|
10
8
|
module ShopifyAPI
|
@@ -19,6 +19,10 @@ module Script
|
|
19
19
|
|
20
20
|
# define/autoload project specific Forms
|
21
21
|
module Forms
|
22
|
+
autoload :AskOrg, Project.project_filepath("forms/ask_org")
|
23
|
+
autoload :AskApp, Project.project_filepath("forms/ask_app")
|
24
|
+
autoload :AskScriptUuid, Project.project_filepath("forms/ask_script_uuid")
|
25
|
+
autoload :RunAgainstShopifyOrg, Project.project_filepath("forms/run_against_shopify_org")
|
22
26
|
autoload :Create, Project.project_filepath("forms/create")
|
23
27
|
autoload :ScriptForm, Project.project_filepath("forms/script_form")
|
24
28
|
end
|
@@ -30,6 +34,7 @@ module Script
|
|
30
34
|
module Layers
|
31
35
|
module Application
|
32
36
|
autoload :BuildScript, Project.project_filepath("layers/application/build_script")
|
37
|
+
autoload :ConnectApp, Project.project_filepath("layers/application/connect_app")
|
33
38
|
autoload :CreateScript, Project.project_filepath("layers/application/create_script")
|
34
39
|
autoload :PushScript, Project.project_filepath("layers/application/push_script")
|
35
40
|
autoload :ExtensionPoints, Project.project_filepath("layers/application/extension_points")
|
@@ -3,9 +3,7 @@
|
|
3
3
|
module Script
|
4
4
|
class Command
|
5
5
|
class Create < ShopifyCLI::Command::SubCommand
|
6
|
-
|
7
|
-
prerequisite_task :ensure_authenticated
|
8
|
-
end
|
6
|
+
prerequisite_task :ensure_authenticated
|
9
7
|
|
10
8
|
options do |parser, flags|
|
11
9
|
parser.on("--name=NAME") { |name| flags[:name] = name }
|
@@ -7,8 +7,6 @@ module Script
|
|
7
7
|
class Javy < ShopifyCLI::Command::SubCommand
|
8
8
|
hidden_feature
|
9
9
|
|
10
|
-
prerequisite_task ensure_project_type: :script
|
11
|
-
|
12
10
|
options do |parser, flags|
|
13
11
|
parser.on("--in=IN") { |in_file| flags[:in_file] = in_file }
|
14
12
|
parser.on("--out=OUT") { |out_file| flags[:out_file] = out_file }
|
@@ -10,7 +10,8 @@ module Script
|
|
10
10
|
end
|
11
11
|
|
12
12
|
def call(_args, _name)
|
13
|
-
fresh_env =
|
13
|
+
fresh_env = Layers::Application::ConnectApp.call(ctx: @ctx)
|
14
|
+
|
14
15
|
force = options.flags.key?(:force) || !!fresh_env
|
15
16
|
|
16
17
|
api_key = Layers::Infrastructure::ScriptProjectRepository.new(ctx: @ctx).get.api_key
|
@@ -1,29 +1,3 @@
|
|
1
|
-
discount:
|
2
|
-
deprecated: true
|
3
|
-
libraries:
|
4
|
-
assemblyscript:
|
5
|
-
package: "@shopify/extension-point-as-discount"
|
6
|
-
unit_limit_per_order:
|
7
|
-
beta: true
|
8
|
-
libraries:
|
9
|
-
assemblyscript:
|
10
|
-
package: "@shopify/extension-point-as-unit-limit-per-order"
|
11
|
-
payment_filter:
|
12
|
-
deprecated: true
|
13
|
-
libraries:
|
14
|
-
assemblyscript:
|
15
|
-
package: "@shopify/extension-point-as-payment-filter"
|
16
|
-
shipping_filter:
|
17
|
-
deprecated: true
|
18
|
-
libraries:
|
19
|
-
assemblyscript:
|
20
|
-
package: "@shopify/extension-point-as-shipping-filter"
|
21
|
-
tax_filter:
|
22
|
-
beta: true
|
23
|
-
libraries:
|
24
|
-
assemblyscript:
|
25
|
-
repo: "https://github.com/Shopify/extension-points.git"
|
26
|
-
package: "@shopify/extension-point-as-tax-filter"
|
27
1
|
payment_methods:
|
28
2
|
domain: 'checkout'
|
29
3
|
libraries:
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Script
|
4
|
+
module Forms
|
5
|
+
class AskApp < ShopifyCLI::Form
|
6
|
+
attr_reader :app
|
7
|
+
|
8
|
+
def ask
|
9
|
+
apps = @xargs.fetch(:apps)
|
10
|
+
|
11
|
+
unless @xargs[:acting_as_shopify_organization]
|
12
|
+
apps = apps.select { |app| app["appType"] == "custom" }
|
13
|
+
end
|
14
|
+
|
15
|
+
raise Errors::NoExistingAppsError if apps.empty?
|
16
|
+
|
17
|
+
@app =
|
18
|
+
if apps.count > 1
|
19
|
+
CLI::UI::Prompt.ask(ctx.message("script.application.ensure_env.app_select")) do |handler|
|
20
|
+
apps.each do |app|
|
21
|
+
handler.option(app["title"]) { app }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
else
|
25
|
+
apps.first.tap do |app|
|
26
|
+
ctx.puts(ctx.message("script.application.ensure_env.app", app["title"]))
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Script
|
4
|
+
module Forms
|
5
|
+
class AskOrg < ShopifyCLI::Form
|
6
|
+
attr_reader :org
|
7
|
+
|
8
|
+
BUSINESS_NAME = "businessName"
|
9
|
+
ID = "id"
|
10
|
+
|
11
|
+
def ask
|
12
|
+
orgs = @xargs
|
13
|
+
@org =
|
14
|
+
if orgs.count == 1
|
15
|
+
orgs.first.tap do |org|
|
16
|
+
ctx.puts(ctx.message("script.application.ensure_env.organization", org[BUSINESS_NAME], org[ID]))
|
17
|
+
end
|
18
|
+
elsif orgs.count > 0
|
19
|
+
CLI::UI::Prompt.ask(ctx.message("script.application.ensure_env.organization_select")) do |handler|
|
20
|
+
orgs.each do |org|
|
21
|
+
handler.option("#{org[BUSINESS_NAME]} (#{org[ID]})") { org }
|
22
|
+
end
|
23
|
+
end
|
24
|
+
else
|
25
|
+
raise Errors::NoExistingOrganizationsError
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Script
|
4
|
+
module Forms
|
5
|
+
class AskScriptUuid < ShopifyCLI::Form
|
6
|
+
attr_reader :uuid
|
7
|
+
def ask
|
8
|
+
scripts = @xargs
|
9
|
+
|
10
|
+
return if scripts.empty? ||
|
11
|
+
!CLI::UI::Prompt.confirm(ctx.message("script.application.ensure_env.ask_connect_to_existing_script"))
|
12
|
+
|
13
|
+
@uuid =
|
14
|
+
CLI::UI::Prompt.ask(ctx.message("script.application.ensure_env.ask_which_script_to_connect_to")) do |handler|
|
15
|
+
scripts.each do |script|
|
16
|
+
handler.option("#{script["title"]} (#{script["uuid"]})") { script["uuid"] }
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Script
|
4
|
+
module Forms
|
5
|
+
class RunAgainstShopifyOrg < ShopifyCLI::Form
|
6
|
+
attr_reader :response
|
7
|
+
def ask
|
8
|
+
@ctx.puts(@ctx.message("core.tasks.select_org_and_shop.identified_as_shopify"))
|
9
|
+
message = @ctx.message("core.tasks.select_org_and_shop.first_party")
|
10
|
+
@response = CLI::UI::Prompt.confirm(message, default: false)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require "shopify_cli"
|
4
|
+
|
5
|
+
module Script
|
6
|
+
module Layers
|
7
|
+
module Application
|
8
|
+
class ConnectApp
|
9
|
+
class << self
|
10
|
+
def call(ctx:)
|
11
|
+
script_project_repo = Layers::Infrastructure::ScriptProjectRepository.new(ctx: ctx)
|
12
|
+
script_project = script_project_repo.get
|
13
|
+
return false if script_project.env_valid?
|
14
|
+
|
15
|
+
if ShopifyCLI::Shopifolk.check && Forms::RunAgainstShopifyOrg.ask(ctx, nil, nil).response
|
16
|
+
ShopifyCLI::Shopifolk.act_as_shopify_organization
|
17
|
+
end
|
18
|
+
|
19
|
+
org =
|
20
|
+
if partner_proxy_bypass
|
21
|
+
stubbed_org
|
22
|
+
else
|
23
|
+
orgs = ShopifyCLI::PartnersAPI::Organizations.fetch_with_app(ctx)
|
24
|
+
Forms::AskOrg.ask(ctx, orgs, nil).org
|
25
|
+
end
|
26
|
+
|
27
|
+
app = Forms::AskApp.ask(
|
28
|
+
ctx,
|
29
|
+
{
|
30
|
+
apps: org["apps"],
|
31
|
+
acting_as_shopify_organization: ShopifyCLI::Shopifolk.acting_as_shopify_organization?,
|
32
|
+
},
|
33
|
+
nil
|
34
|
+
).app
|
35
|
+
|
36
|
+
script_service = Layers::Infrastructure::ServiceLocator.script_service(ctx: ctx, api_key: app["apiKey"])
|
37
|
+
extension_point_type = script_project.extension_point_type
|
38
|
+
scripts = script_service.get_app_scripts(extension_point_type: extension_point_type)
|
39
|
+
|
40
|
+
uuid = Forms::AskScriptUuid.ask(ctx, scripts, nil).uuid
|
41
|
+
|
42
|
+
script_project_repo.create_env(
|
43
|
+
api_key: app["apiKey"],
|
44
|
+
secret: app["apiSecretKeys"].first["secret"],
|
45
|
+
uuid: uuid
|
46
|
+
)
|
47
|
+
|
48
|
+
true
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def partner_proxy_bypass
|
54
|
+
!ENV["BYPASS_PARTNERS_PROXY"].nil?
|
55
|
+
end
|
56
|
+
|
57
|
+
def stubbed_org
|
58
|
+
{
|
59
|
+
"apps" => [
|
60
|
+
{
|
61
|
+
"appType" => "custom",
|
62
|
+
"apiKey" => "stubbed-api-key",
|
63
|
+
"apiSecretKeys" => [{ "secret" => "stubbed-api-secret" }],
|
64
|
+
"title" => "Fake App (Not connected to Partners)",
|
65
|
+
},
|
66
|
+
],
|
67
|
+
}
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -109,7 +109,6 @@ module Script
|
|
109
109
|
class ScriptProjectAlreadyExistsError < ScriptProjectError; end
|
110
110
|
class TaskRunnerNotFoundError < ScriptProjectError; end
|
111
111
|
class BuildScriptNotFoundError < ScriptProjectError; end
|
112
|
-
class InvalidBuildScriptError < ScriptProjectError; end
|
113
112
|
|
114
113
|
class WebAssemblyBinaryNotFoundError < ScriptProjectError
|
115
114
|
def initialize
|
@@ -98,10 +98,6 @@ module Script
|
|
98
98
|
|
99
99
|
raise Errors::BuildScriptNotFoundError,
|
100
100
|
"Build script not found" if build_script.nil?
|
101
|
-
|
102
|
-
unless build_script.start_with?("shopify-scripts")
|
103
|
-
raise Errors::InvalidBuildScriptError, "Invalid build script"
|
104
|
-
end
|
105
101
|
end
|
106
102
|
|
107
103
|
def bytecode
|
@@ -100,10 +100,6 @@ module Script
|
|
100
100
|
|
101
101
|
raise Errors::BuildScriptNotFoundError,
|
102
102
|
"Build script not found" if build_script.nil?
|
103
|
-
|
104
|
-
unless build_script.start_with?("javy")
|
105
|
-
raise Errors::InvalidBuildScriptError, "Invalid build script"
|
106
|
-
end
|
107
103
|
end
|
108
104
|
|
109
105
|
def bytecode
|
@@ -115,8 +115,6 @@ module Script
|
|
115
115
|
script_repush_cause: "A version of this script already exists on the app.",
|
116
116
|
script_repush_help: "Use {{cyan:--force}} to replace the existing script.",
|
117
117
|
|
118
|
-
invalid_build_script: "The root package.json contains an invalid build command that " \
|
119
|
-
"is needed to compile your script to WebAssembly.",
|
120
118
|
build_script_not_found: "The root package.json is missing the build command that " \
|
121
119
|
"is needed to compile your script to WebAssembly.",
|
122
120
|
# rubocop:disable Layout/LineLength
|
@@ -201,11 +201,6 @@ module Script
|
|
201
201
|
cause_of_error: ShopifyCLI::Context.message("script.error.build_script_not_found"),
|
202
202
|
help_suggestion: ShopifyCLI::Context.message("script.error.build_script_suggestion"),
|
203
203
|
}
|
204
|
-
when Layers::Infrastructure::Errors::InvalidBuildScriptError
|
205
|
-
{
|
206
|
-
cause_of_error: ShopifyCLI::Context.message("script.error.invalid_build_script"),
|
207
|
-
help_suggestion: ShopifyCLI::Context.message("script.error.build_script_suggestion"),
|
208
|
-
}
|
209
204
|
when Layers::Infrastructure::Errors::WebAssemblyBinaryNotFoundError
|
210
205
|
{
|
211
206
|
cause_of_error: ShopifyCLI::Context.message("script.error.web_assembly_binary_not_found"),
|
@@ -9,6 +9,7 @@ module Theme
|
|
9
9
|
options do |parser, flags|
|
10
10
|
parser.on("-n", "--nodelete") { flags[:nodelete] = true }
|
11
11
|
parser.on("-i", "--themeid=ID") { |theme_id| flags[:theme_id] = theme_id }
|
12
|
+
parser.on("-l", "--live") { flags[:live] = true }
|
12
13
|
parser.on("-x", "--ignore=PATTERN") do |pattern|
|
13
14
|
flags[:ignores] ||= []
|
14
15
|
flags[:ignores] << pattern
|
@@ -21,6 +22,8 @@ module Theme
|
|
21
22
|
|
22
23
|
theme = if (theme_id = options.flags[:theme_id])
|
23
24
|
ShopifyCLI::Theme::Theme.new(@ctx, root: root, id: theme_id)
|
25
|
+
elsif options.flags[:live]
|
26
|
+
ShopifyCLI::Theme::Theme.live(@ctx, root: root)
|
24
27
|
else
|
25
28
|
form = Forms::Select.ask(
|
26
29
|
@ctx,
|
@@ -10,6 +10,7 @@ module Theme
|
|
10
10
|
options do |parser, flags|
|
11
11
|
parser.on("-n", "--nodelete") { flags[:nodelete] = true }
|
12
12
|
parser.on("-i", "--themeid=ID") { |theme_id| flags[:theme_id] = theme_id }
|
13
|
+
parser.on("-l", "--live") { flags[:live] = true }
|
13
14
|
parser.on("-d", "--development") { flags[:development] = true }
|
14
15
|
parser.on("-u", "--unpublished") { flags[:unpublished] = true }
|
15
16
|
parser.on("-j", "--json") { flags[:json] = true }
|
@@ -27,6 +28,8 @@ module Theme
|
|
27
28
|
|
28
29
|
theme = if (theme_id = options.flags[:theme_id])
|
29
30
|
ShopifyCLI::Theme::Theme.new(@ctx, root: root, id: theme_id)
|
31
|
+
elsif options.flags[:live]
|
32
|
+
ShopifyCLI::Theme::Theme.live(@ctx, root: root)
|
30
33
|
elsif options.flags[:development]
|
31
34
|
theme = ShopifyCLI::Theme::DevelopmentTheme.new(@ctx, root: root)
|
32
35
|
theme.ensure_exists!
|
@@ -47,7 +50,8 @@ module Theme
|
|
47
50
|
form.theme
|
48
51
|
end
|
49
52
|
|
50
|
-
|
53
|
+
is_confirm_required = !options.flags[:allow_live] && !options.flags[:live]
|
54
|
+
if theme.live? && is_confirm_required
|
51
55
|
return unless CLI::UI::Prompt.confirm(@ctx.message("theme.push.live"))
|
52
56
|
end
|
53
57
|
|
@@ -72,6 +76,7 @@ module Theme
|
|
72
76
|
@ctx.done(@ctx.message("theme.push.done", theme.preview_url, theme.editor_url))
|
73
77
|
end
|
74
78
|
end
|
79
|
+
raise ShopifyCLI::AbortSilent if syncer.has_any_error?
|
75
80
|
rescue ShopifyCLI::API::APIRequestNotFoundError
|
76
81
|
@ctx.abort(@ctx.message("theme.push.theme_not_found", theme.id))
|
77
82
|
ensure
|
@@ -15,7 +15,7 @@ module Theme
|
|
15
15
|
def call(*)
|
16
16
|
flags = options.flags.dup
|
17
17
|
host = flags[:host] || DEFAULT_HTTP_HOST
|
18
|
-
ShopifyCLI::Theme::DevServer.start(@ctx, ".",
|
18
|
+
ShopifyCLI::Theme::DevServer.start(@ctx, ".", host: host, **flags) do |syncer|
|
19
19
|
UI::SyncProgressBar.new(syncer).progress(:upload_theme!, delay_low_priority_files: true)
|
20
20
|
end
|
21
21
|
rescue ShopifyCLI::Theme::DevServer::AddressBindingError
|
@@ -58,6 +58,7 @@ module Theme
|
|
58
58
|
|
59
59
|
Options:
|
60
60
|
{{command:-i, --themeid=THEMEID}} Theme ID. Must be an existing theme on your store.
|
61
|
+
{{command:-l, --live}} Push to your remote live theme, and update your live store.
|
61
62
|
{{command:-d, --development}} Push to your remote development theme, and create it if needed.
|
62
63
|
{{command:-u, --unpublished}} Create a new unpublished theme and push to it.
|
63
64
|
{{command:-n, --nodelete}} Runs the push command without deleting remote files from Shopify.
|
@@ -99,6 +100,13 @@ module Theme
|
|
99
100
|
viewing_theme: "Viewing theme…",
|
100
101
|
syncing_theme: "Syncing theme #%s on %s",
|
101
102
|
open_fail: "Couldn't open the theme",
|
103
|
+
operation: {
|
104
|
+
status: {
|
105
|
+
error: "ERROR",
|
106
|
+
synced: "Synced",
|
107
|
+
fixed: "Fixed",
|
108
|
+
},
|
109
|
+
},
|
102
110
|
error: {
|
103
111
|
address_binding_error: "Couldn't bind to localhost."\
|
104
112
|
" To serve your theme, set a different address with {{command:%s theme serve --host=<address>}}",
|
@@ -181,6 +189,7 @@ module Theme
|
|
181
189
|
|
182
190
|
Options:
|
183
191
|
{{command:-i, --themeid=THEMEID}} The Theme ID. Must be an existing theme on your store.
|
192
|
+
{{command:-l, --live}} Pull theme files from your remote live theme.
|
184
193
|
{{command:-n, --nodelete}} Runs the pull command without deleting local files.
|
185
194
|
|
186
195
|
Run without options to select theme from a list.
|
@@ -6,14 +6,14 @@ module Theme
|
|
6
6
|
end
|
7
7
|
|
8
8
|
def progress(method, **args)
|
9
|
-
@syncer.
|
9
|
+
@syncer.lock_io!
|
10
10
|
CLI::UI::Progress.progress do |bar|
|
11
11
|
@syncer.public_send(method, **args) do |left, total|
|
12
12
|
bar.tick(set_percent: 1 - left.to_f / total)
|
13
13
|
end
|
14
14
|
bar.tick(set_percent: 1)
|
15
15
|
end
|
16
|
-
@syncer.
|
16
|
+
@syncer.unlock_io!
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -5,13 +5,26 @@ module ShopifyCLI
|
|
5
5
|
@ctx.puts(self.class.help)
|
6
6
|
end
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
8
|
+
class << self
|
9
|
+
def help
|
10
|
+
project_type = name.split("::")[0].downcase
|
11
|
+
ShopifyCLI::Context.message(
|
12
|
+
"#{project_type}.help",
|
13
|
+
ShopifyCLI::TOOL_NAME,
|
14
|
+
available_subcommands
|
15
|
+
)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def available_subcommands
|
21
|
+
subcommand_registry
|
22
|
+
.resolved_commands
|
23
|
+
.reject { |_name, command| command.hidden? }
|
24
|
+
.keys
|
25
|
+
.sort
|
26
|
+
.join(" | ")
|
27
|
+
end
|
15
28
|
end
|
16
29
|
end
|
17
30
|
end
|
@@ -3,9 +3,7 @@ module ShopifyCLI
|
|
3
3
|
class App
|
4
4
|
class Create
|
5
5
|
class Node < ShopifyCLI::Command::AppSubCommand
|
6
|
-
|
7
|
-
prerequisite_task :ensure_authenticated
|
8
|
-
end
|
6
|
+
prerequisite_task :ensure_authenticated
|
9
7
|
|
10
8
|
options do |parser, flags|
|
11
9
|
parser.on("--name=NAME") { |t| flags[:name] = t }
|
@@ -3,9 +3,7 @@ module ShopifyCLI
|
|
3
3
|
class App
|
4
4
|
class Create
|
5
5
|
class Rails < ShopifyCLI::Command::AppSubCommand
|
6
|
-
|
7
|
-
prerequisite_task :ensure_authenticated
|
8
|
-
end
|
6
|
+
prerequisite_task :ensure_authenticated
|
9
7
|
|
10
8
|
options do |parser, flags|
|
11
9
|
parser.on("--name=NAME") { |t| flags[:name] = t }
|
data/lib/shopify_cli/context.rb
CHANGED
@@ -357,6 +357,15 @@ module ShopifyCLI
|
|
357
357
|
Kernel.puts(CLI::UI.fmt(*args))
|
358
358
|
end
|
359
359
|
|
360
|
+
# a wrapper around $stderr.puts to allow for easy formatting
|
361
|
+
#
|
362
|
+
# #### Parameters
|
363
|
+
# * `text` - a string message to output
|
364
|
+
#
|
365
|
+
def error(text)
|
366
|
+
$stderr.puts(CLI::UI.fmt(text))
|
367
|
+
end
|
368
|
+
|
360
369
|
# a wrapper around Kernel.warn to allow for easy formatting
|
361
370
|
#
|
362
371
|
# #### Parameters
|