shopify-cli 2.0.0 → 2.2.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 -0
- data/Gemfile.lock +4 -4
- data/README.md +3 -1
- data/RELEASING.md +2 -0
- data/THEMEKIT_MIGRATION.md +18 -0
- data/lib/graphql/api_versions.graphql +1 -1
- data/lib/graphql/get_variant_id.graphql +16 -0
- data/lib/project_types/extension/cli.rb +10 -1
- data/lib/project_types/extension/commands/check.rb +44 -0
- data/lib/project_types/extension/commands/serve.rb +8 -2
- data/lib/project_types/extension/extension_project.rb +39 -1
- data/lib/project_types/extension/extension_project_keys.rb +1 -0
- data/lib/project_types/extension/features/argo_runtime.rb +6 -38
- data/lib/project_types/extension/features/argo_serve.rb +30 -1
- data/lib/project_types/extension/features/runtimes/admin.rb +29 -0
- data/lib/project_types/extension/features/runtimes/base.rb +19 -0
- data/lib/project_types/extension/features/runtimes/checkout_post_purchase.rb +23 -0
- data/lib/project_types/extension/features/runtimes/checkout_ui_extension.rb +29 -0
- data/lib/project_types/extension/messages/messages.rb +19 -6
- data/lib/project_types/extension/models/product.rb +12 -0
- data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +10 -2
- data/lib/project_types/extension/models/specification_handlers/default.rb +13 -4
- data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +15 -0
- data/lib/project_types/extension/tasks/configure_features.rb +1 -0
- data/lib/project_types/extension/tasks/converters/product_converter.rb +21 -0
- data/lib/project_types/extension/tasks/get_product.rb +22 -0
- data/lib/project_types/node/messages/messages.rb +1 -1
- data/lib/project_types/rails/messages/messages.rb +18 -18
- data/lib/project_types/script/commands/create.rb +1 -1
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +3 -3
- data/lib/project_types/script/layers/infrastructure/script_service.rb +17 -2
- data/lib/project_types/theme/cli.rb +1 -0
- data/lib/project_types/theme/commands/init.rb +42 -0
- data/lib/project_types/theme/commands/serve.rb +3 -1
- data/lib/project_types/theme/forms/select.rb +1 -1
- data/lib/project_types/theme/messages/messages.rb +14 -3
- data/lib/shopify-cli/admin_api.rb +6 -2
- data/lib/shopify-cli/api.rb +2 -2
- data/lib/shopify-cli/context.rb +1 -1
- data/lib/shopify-cli/core/monorail.rb +8 -3
- data/lib/shopify-cli/http_request.rb +6 -0
- data/lib/shopify-cli/messages/messages.rb +9 -8
- data/lib/shopify-cli/packager.rb +5 -5
- data/lib/shopify-cli/theme/dev_server.rb +5 -5
- data/lib/shopify-cli/theme/dev_server/local_assets.rb +1 -1
- data/lib/shopify-cli/theme/file.rb +2 -2
- data/lib/shopify-cli/theme/syncer.rb +9 -5
- data/lib/shopify-cli/theme/theme.rb +5 -5
- data/lib/shopify-cli/tunnel.rb +1 -1
- data/lib/shopify-cli/version.rb +1 -1
- data/shopify-cli.gemspec +1 -1
- metadata +15 -4
@@ -34,7 +34,7 @@ module Script
|
|
34
34
|
end
|
35
35
|
|
36
36
|
def self.help
|
37
|
-
allowed_values = Script::Layers::Application::ExtensionPoints.
|
37
|
+
allowed_values = Script::Layers::Application::ExtensionPoints.available_types.map { |type| "{{cyan:#{type}}}" }
|
38
38
|
ShopifyCli::Context.message("script.create.help", ShopifyCli::TOOL_NAME, allowed_values.join(", "))
|
39
39
|
end
|
40
40
|
end
|
@@ -9,9 +9,9 @@ mutation AppScriptUpdateOrCreate(
|
|
9
9
|
$schemaMinorVersion: String,
|
10
10
|
$useMsgpack: Boolean,
|
11
11
|
$uuid: String,
|
12
|
-
$configurationUi: Boolean
|
13
|
-
$scriptJsonVersion: String
|
14
|
-
$configurationDefinition: String
|
12
|
+
$configurationUi: Boolean!,
|
13
|
+
$scriptJsonVersion: String!,
|
14
|
+
$configurationDefinition: String!,
|
15
15
|
) {
|
16
16
|
appScriptUpdateOrCreate(
|
17
17
|
extensionPointName: $extensionPointName
|
@@ -75,19 +75,30 @@ module Script
|
|
75
75
|
class ScriptServiceAPI < ShopifyCli::API
|
76
76
|
property(:api_key, accepts: String)
|
77
77
|
|
78
|
+
LOCAL_INSTANCE_URL = "https://script-service.myshopify.io"
|
79
|
+
|
78
80
|
def self.query(ctx, query_name, api_key: nil, variables: {})
|
79
81
|
api_client(ctx, api_key).query(query_name, variables: variables)
|
80
82
|
end
|
81
83
|
|
82
84
|
def self.api_client(ctx, api_key)
|
85
|
+
instance_url = spin_instance_url || LOCAL_INSTANCE_URL
|
83
86
|
new(
|
84
87
|
ctx: ctx,
|
85
|
-
url: "
|
88
|
+
url: "#{instance_url}/graphql",
|
86
89
|
token: "",
|
87
90
|
api_key: api_key
|
88
91
|
)
|
89
92
|
end
|
90
93
|
|
94
|
+
def self.spin_instance_url
|
95
|
+
workspace = ENV["SPIN_WORKSPACE"]
|
96
|
+
namespace = ENV["SPIN_NAMESPACE"]
|
97
|
+
return if workspace.nil? || namespace.nil?
|
98
|
+
|
99
|
+
"https://script-service.#{workspace}.#{namespace}.us.spin.dev"
|
100
|
+
end
|
101
|
+
|
91
102
|
def auth_headers(*)
|
92
103
|
tokens = { "APP_KEY" => api_key }.compact.to_json
|
93
104
|
{ "X-Shopify-Authenticated-Tokens" => tokens }
|
@@ -104,7 +115,7 @@ module Script
|
|
104
115
|
private_constant(:PartnersProxyAPI)
|
105
116
|
|
106
117
|
def script_service_request(query_name:, variables: nil, **options)
|
107
|
-
resp = if
|
118
|
+
resp = if bypass_partners_proxy
|
108
119
|
ScriptServiceAPI.query(ctx, query_name, variables: variables, **options)
|
109
120
|
else
|
110
121
|
proxy_through_partners(query_name: query_name, variables: variables, **options)
|
@@ -113,6 +124,10 @@ module Script
|
|
113
124
|
resp
|
114
125
|
end
|
115
126
|
|
127
|
+
def bypass_partners_proxy
|
128
|
+
!ENV["BYPASS_PARTNERS_PROXY"].nil?
|
129
|
+
end
|
130
|
+
|
116
131
|
def proxy_through_partners(query_name:, variables: nil, **options)
|
117
132
|
options[:variables] = variables.to_json if variables
|
118
133
|
resp = PartnersProxyAPI.query(ctx, query_name, **options)
|
@@ -6,6 +6,7 @@ module Theme
|
|
6
6
|
end
|
7
7
|
|
8
8
|
class Command < ShopifyCli::ProjectCommands
|
9
|
+
subcommand :Init, "init", Project.project_filepath("commands/init")
|
9
10
|
subcommand :Serve, "serve", Project.project_filepath("commands/serve")
|
10
11
|
subcommand :Pull, "pull", Project.project_filepath("commands/pull")
|
11
12
|
subcommand :Push, "push", Project.project_filepath("commands/push")
|
@@ -0,0 +1,42 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Theme
|
4
|
+
class Command
|
5
|
+
class Init < ShopifyCli::SubCommand
|
6
|
+
options do |parser, flags|
|
7
|
+
parser.on("-u", "--clone-url URL") { |url| flags[:clone_url] = url }
|
8
|
+
end
|
9
|
+
|
10
|
+
DEFAULT_CLONE_URL = "https://github.com/Shopify/dawn.git"
|
11
|
+
|
12
|
+
def call(args, _name)
|
13
|
+
name = args.first || ask_name
|
14
|
+
clone_url = options.flags[:clone_url] || DEFAULT_CLONE_URL
|
15
|
+
clone(clone_url, name)
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.help
|
19
|
+
ShopifyCli::Context.message("theme.init.help", ShopifyCli::TOOL_NAME, ShopifyCli::TOOL_NAME)
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def ask_name
|
25
|
+
CLI::UI::Prompt.ask(@ctx.message("theme.init.ask_name"))
|
26
|
+
end
|
27
|
+
|
28
|
+
def clone(url, name)
|
29
|
+
ShopifyCli::Git.clone(url, name)
|
30
|
+
|
31
|
+
@ctx.root = File.join(@ctx.root, name)
|
32
|
+
|
33
|
+
begin
|
34
|
+
@ctx.rm_r(".git")
|
35
|
+
@ctx.rm_r(".github")
|
36
|
+
rescue Errno::ENOENT => e
|
37
|
+
@ctx.debug(e)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
@@ -10,7 +10,9 @@ module Theme
|
|
10
10
|
|
11
11
|
def call(*)
|
12
12
|
flags = options.flags.dup
|
13
|
-
ShopifyCli::Theme::DevServer.start(@ctx, ".", **flags)
|
13
|
+
ShopifyCli::Theme::DevServer.start(@ctx, ".", **flags) do |syncer|
|
14
|
+
UI::SyncProgressBar.new(syncer).progress(:upload_theme!, delay_low_priority_files: true)
|
15
|
+
end
|
14
16
|
end
|
15
17
|
|
16
18
|
def self.help
|
@@ -8,6 +8,17 @@ module Theme
|
|
8
8
|
Usage: {{command:%1$s theme [ %2$s ]}}
|
9
9
|
HELP
|
10
10
|
|
11
|
+
init: {
|
12
|
+
help: <<~HELP,
|
13
|
+
{{command:%s theme init}}: Clones a Git repository to use as a starting point for building a new theme.
|
14
|
+
|
15
|
+
Usage: {{command:%s theme init [ NAME ]}}
|
16
|
+
|
17
|
+
Options:
|
18
|
+
{{command:-u, --clone-url=URL}} The Git URL to clone from. Defaults to Shopify's example theme, Dawn: https://github.com/Shopify/dawn.git
|
19
|
+
HELP
|
20
|
+
ask_name: "Theme name",
|
21
|
+
},
|
11
22
|
publish: {
|
12
23
|
confirmation: "This will change your live theme. Do you want to continue?",
|
13
24
|
deploying: "Deploying theme",
|
@@ -79,7 +90,7 @@ module Theme
|
|
79
90
|
Uploads the current theme as a development theme to the connected store, then prints theme editor and preview URLs to your terminal. While running, changes will push to the store in real time.
|
80
91
|
Usage: {{command:%s theme serve}}
|
81
92
|
HELP
|
82
|
-
serve: "Viewing theme
|
93
|
+
serve: "Viewing theme…",
|
83
94
|
open_fail: "Couldn't open the theme",
|
84
95
|
},
|
85
96
|
check: {
|
@@ -123,9 +134,9 @@ module Theme
|
|
123
134
|
},
|
124
135
|
language_server: {
|
125
136
|
help: <<~HELP,
|
126
|
-
{{command:%s theme language-server}}: Start a Language Server Protocol server.
|
137
|
+
{{command:%1$s theme language-server}}: Start a Language Server Protocol server.
|
127
138
|
|
128
|
-
Usage: {{command:%s theme language-server}}
|
139
|
+
Usage: {{command:%1$s theme language-server}}
|
129
140
|
HELP
|
130
141
|
},
|
131
142
|
pull: {
|
@@ -134,8 +134,12 @@ module ShopifyCli
|
|
134
134
|
)
|
135
135
|
CLI::Kit::Util.begin do
|
136
136
|
versions = client.query("api_versions")["data"]["publicApiVersions"]
|
137
|
-
|
138
|
-
|
137
|
+
# return the most recent supported version
|
138
|
+
versions
|
139
|
+
.select { |version| version["supported"] }
|
140
|
+
.map { |version| version["handle"] }
|
141
|
+
.sort
|
142
|
+
.reverse[0]
|
139
143
|
end.retry_after(API::APIRequestUnauthorizedError, retries: 1) do
|
140
144
|
ShopifyCli::IdentityAuth.new(ctx: ctx).reauthenticate
|
141
145
|
end
|
data/lib/shopify-cli/api.rb
CHANGED
@@ -81,7 +81,7 @@ module ShopifyCli
|
|
81
81
|
else
|
82
82
|
raise APIRequestUnexpectedError.new("#{response.code}\n#{response.body}", response: response)
|
83
83
|
end
|
84
|
-
rescue
|
84
|
+
rescue Errno::ETIMEDOUT, Timeout::Error
|
85
85
|
raise APIRequestTimeoutError.new("Timeout")
|
86
86
|
end.retry_after(APIRequestRetriableError, retries: 3) do |e|
|
87
87
|
sleep(1) if e.is_a?(APIRequestThrottledError)
|
@@ -108,7 +108,7 @@ module ShopifyCli
|
|
108
108
|
{
|
109
109
|
"User-Agent" => "Shopify CLI; v=#{ShopifyCli::VERSION}",
|
110
110
|
"Sec-CH-UA" => "Shopify CLI; v=#{ShopifyCli::VERSION} sha=#{ShopifyCli.sha}",
|
111
|
-
"Sec-CH-UA-PLATFORM" => ctx.os,
|
111
|
+
"Sec-CH-UA-PLATFORM" => ctx.os.to_s,
|
112
112
|
}.tap do |headers|
|
113
113
|
headers["X-Shopify-Cli-Employee"] = "1" if Shopifolk.acting_as_shopify_organization?
|
114
114
|
end.merge(auth_headers(token))
|
data/lib/shopify-cli/context.rb
CHANGED
@@ -46,7 +46,7 @@ module ShopifyCli
|
|
46
46
|
|
47
47
|
# we only want to send Monorail events in production or when explicitly developing
|
48
48
|
def enabled?
|
49
|
-
Context.new.system? || ENV["MONORAIL_REAL_EVENTS"] == "1"
|
49
|
+
(Context.new.system? || ENV["MONORAIL_REAL_EVENTS"] == "1") && !Context.new.ci?
|
50
50
|
end
|
51
51
|
|
52
52
|
def consented?
|
@@ -54,6 +54,7 @@ module ShopifyCli
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def prompt_for_consent
|
57
|
+
return if Context.new.ci?
|
57
58
|
return unless enabled?
|
58
59
|
return if ShopifyCli::Config.get_section("analytics").key?("enabled")
|
59
60
|
msg = Context.message("core.monorail.consent_prompt")
|
@@ -90,7 +91,7 @@ module ShopifyCli
|
|
90
91
|
{
|
91
92
|
schema_id: INVOCATIONS_SCHEMA,
|
92
93
|
payload: {
|
93
|
-
project_type:
|
94
|
+
project_type: project_type_from_dir_or_cmd(commands[0]).to_s,
|
94
95
|
command: commands.join(" "),
|
95
96
|
args: args.join(" "),
|
96
97
|
time_start: start_time,
|
@@ -104,7 +105,7 @@ module ShopifyCli
|
|
104
105
|
is_employee: ShopifyCli::Shopifolk.acting_as_shopify_organization?,
|
105
106
|
}.tap do |payload|
|
106
107
|
payload[:api_key] = metadata.delete(:api_key)
|
107
|
-
payload[:partner_id] = metadata.delete(:organization_id)
|
108
|
+
payload[:partner_id] = metadata.delete(:organization_id) || ShopifyCli::DB.get(:organization_id)
|
108
109
|
if Project.has_current?
|
109
110
|
project = Project.current(force_reload: true)
|
110
111
|
payload[:api_key] = project.env&.api_key
|
@@ -114,6 +115,10 @@ module ShopifyCli
|
|
114
115
|
end,
|
115
116
|
}
|
116
117
|
end
|
118
|
+
|
119
|
+
def project_type_from_dir_or_cmd(command)
|
120
|
+
Project.current_project_type || (command unless ShopifyCli::Commands.core_command?(command)) || nil
|
121
|
+
end
|
117
122
|
end
|
118
123
|
end
|
119
124
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "net/http"
|
2
|
+
require "openssl"
|
2
3
|
|
3
4
|
module ShopifyCli
|
4
5
|
class HttpRequest
|
@@ -24,8 +25,13 @@ module ShopifyCli
|
|
24
25
|
end
|
25
26
|
|
26
27
|
def request(uri, body, headers, req)
|
28
|
+
cert_store = OpenSSL::X509::Store.new
|
29
|
+
cert_store.set_default_paths
|
30
|
+
|
27
31
|
http = ::Net::HTTP.new(uri.host, uri.port)
|
28
32
|
http.use_ssl = true
|
33
|
+
http.cert_store = cert_store
|
34
|
+
http.verify_mode = OpenSSL::SSL::VERIFY_NONE if ENV["SSL_VERIFY_NONE"]
|
29
35
|
|
30
36
|
req.body = body unless body.nil?
|
31
37
|
req["Content-Type"] = "application/json"
|
@@ -28,7 +28,7 @@ module ShopifyCli
|
|
28
28
|
},
|
29
29
|
|
30
30
|
env_file: {
|
31
|
-
saving_header: "writing %s file
|
31
|
+
saving_header: "writing %s file…",
|
32
32
|
saving: "writing %s file",
|
33
33
|
saved: "%s saved to project root",
|
34
34
|
},
|
@@ -69,7 +69,7 @@ module ShopifyCli
|
|
69
69
|
no_commits_made: "No git commits have been made. Please make at least one commit.",
|
70
70
|
},
|
71
71
|
|
72
|
-
cloning: "Cloning %s into %s
|
72
|
+
cloning: "Cloning %s into %s…",
|
73
73
|
cloned: "{{v}} Cloned into %s",
|
74
74
|
},
|
75
75
|
|
@@ -103,9 +103,9 @@ module ShopifyCli
|
|
103
103
|
install_error: "An error occurred while installing dependencies",
|
104
104
|
},
|
105
105
|
|
106
|
-
installing: "Installing dependencies with %s
|
106
|
+
installing: "Installing dependencies with %s…",
|
107
107
|
installed: "Dependencies installed",
|
108
|
-
npm_installing_deps: "Installing %d dependencies
|
108
|
+
npm_installing_deps: "Installing %d dependencies…",
|
109
109
|
npm_installed_deps: "%d npm dependencies installed",
|
110
110
|
},
|
111
111
|
|
@@ -257,7 +257,7 @@ module ShopifyCli
|
|
257
257
|
count_help: "Number of resources to generate",
|
258
258
|
},
|
259
259
|
|
260
|
-
populating: "Populating %d %ss
|
260
|
+
populating: "Populating %d %ss…",
|
261
261
|
|
262
262
|
completion_message: <<~COMPLETION_MESSAGE,
|
263
263
|
Successfully added %d %s to {{green:%s}}
|
@@ -345,7 +345,7 @@ module ShopifyCli
|
|
345
345
|
confirm_store: {
|
346
346
|
prompt: "You are currently logged into {{green:%s}}. Do you want to proceed using this store?",
|
347
347
|
confirmation: "Proceeding using {{green:%s}}",
|
348
|
-
cancelling: "Cancelling
|
348
|
+
cancelling: "Cancelling…",
|
349
349
|
},
|
350
350
|
ensure_env: {
|
351
351
|
organization_select: "To which partner organization does this project belong?",
|
@@ -414,7 +414,9 @@ module ShopifyCli
|
|
414
414
|
"please make sure %s exists within %s before trying again",
|
415
415
|
},
|
416
416
|
|
417
|
+
installing: "Installing ngrok…",
|
417
418
|
not_running: "{{green:x}} ngrok tunnel not running",
|
419
|
+
prereq_command_location: "%s @ %s",
|
418
420
|
signup_suggestion: <<~MESSAGE,
|
419
421
|
{{*}} To avoid tunnels that timeout, it is recommended to signup for a free ngrok
|
420
422
|
account at {{underline:https://ngrok.com/signup}}. After you signup, install your
|
@@ -423,9 +425,8 @@ module ShopifyCli
|
|
423
425
|
start: "{{v}} ngrok tunnel running at {{underline:%s}}",
|
424
426
|
start_with_account: "{{v}} ngrok tunnel running at {{underline:%s}}, with account %s",
|
425
427
|
stopped: "{{green:x}} ngrok tunnel stopped",
|
426
|
-
timed_out: "{{x}} ngrok tunnel has timed out, restarting
|
428
|
+
timed_out: "{{x}} ngrok tunnel has timed out, restarting…",
|
427
429
|
will_timeout: "{{*}} This tunnel will timeout in {{red:%s}}",
|
428
|
-
prereq_command_location: "%s @ %s",
|
429
430
|
},
|
430
431
|
|
431
432
|
version: {
|
data/lib/shopify-cli/packager.rb
CHANGED
@@ -16,7 +16,7 @@ module ShopifyCli
|
|
16
16
|
|
17
17
|
puts "\nBuilding Debian package"
|
18
18
|
|
19
|
-
puts "Generating metadata files
|
19
|
+
puts "Generating metadata files…"
|
20
20
|
Dir.glob("#{debian_dir}/*").each { |file| File.delete(file) }
|
21
21
|
|
22
22
|
metadata_files = %w(control preinst prerm)
|
@@ -28,7 +28,7 @@ module ShopifyCli
|
|
28
28
|
File.open(file_path, "w", 0775) { |f| f.write(file_contents) }
|
29
29
|
end
|
30
30
|
|
31
|
-
puts "Building package
|
31
|
+
puts "Building package…"
|
32
32
|
Dir.chdir(root_dir)
|
33
33
|
raise "Failed to build package" unless system("dpkg-deb", "-b", "shopify-cli")
|
34
34
|
|
@@ -49,14 +49,14 @@ module ShopifyCli
|
|
49
49
|
spec_path = File.join(root_dir, "shopify-cli.spec")
|
50
50
|
puts "\nBuilding RPM package"
|
51
51
|
|
52
|
-
puts "Generating spec file
|
52
|
+
puts "Generating spec file…"
|
53
53
|
File.delete(spec_path) if File.exist?(spec_path)
|
54
54
|
|
55
55
|
spec_contents = File.read(File.join(root_dir, "shopify-cli.spec.base"))
|
56
56
|
spec_contents = spec_contents.gsub("SHOPIFY_CLI_VERSION", ShopifyCli::VERSION)
|
57
57
|
File.write(spec_path, spec_contents)
|
58
58
|
|
59
|
-
puts "Building package
|
59
|
+
puts "Building package…"
|
60
60
|
Dir.chdir(root_dir)
|
61
61
|
system("rpmbuild", "-bb", File.basename(spec_path))
|
62
62
|
|
@@ -72,7 +72,7 @@ module ShopifyCli
|
|
72
72
|
build_path = File.join(BUILDS_DIR, "shopify-cli.rb")
|
73
73
|
puts "\nBuilding Homebrew package"
|
74
74
|
|
75
|
-
puts "Generating formula
|
75
|
+
puts "Generating formula…"
|
76
76
|
File.delete(build_path) if File.exist?(build_path)
|
77
77
|
|
78
78
|
spec_contents = File.read(File.join(root_dir, "shopify-cli.base.rb"))
|
@@ -20,7 +20,7 @@ module ShopifyCli
|
|
20
20
|
class << self
|
21
21
|
attr_accessor :ctx
|
22
22
|
|
23
|
-
def start(ctx, root, port: 9292
|
23
|
+
def start(ctx, root, port: 9292)
|
24
24
|
@ctx = ctx
|
25
25
|
theme = DevelopmentTheme.new(ctx, root: root)
|
26
26
|
ignore_filter = IgnoreFilter.from_path(root)
|
@@ -43,10 +43,10 @@ module ShopifyCli
|
|
43
43
|
CLI::UI::Frame.open(@ctx.message("theme.serve.serve")) do
|
44
44
|
ctx.print_task("Syncing theme ##{theme.id} on #{theme.shop}")
|
45
45
|
@syncer.start_threads
|
46
|
-
if
|
47
|
-
@syncer
|
46
|
+
if block_given?
|
47
|
+
yield @syncer
|
48
48
|
else
|
49
|
-
@syncer.
|
49
|
+
@syncer.upload_theme!(delay_low_priority_files: true)
|
50
50
|
end
|
51
51
|
|
52
52
|
return if stopped
|
@@ -87,7 +87,7 @@ module ShopifyCli
|
|
87
87
|
end
|
88
88
|
|
89
89
|
def stop
|
90
|
-
@ctx.puts("Stopping
|
90
|
+
@ctx.puts("Stopping…")
|
91
91
|
@app.close
|
92
92
|
@syncer.shutdown
|
93
93
|
WebServer.shutdown
|
@@ -72,7 +72,7 @@ module ShopifyCli
|
|
72
72
|
def replace_asset_urls(body)
|
73
73
|
replaced_body = body.join.gsub(ASSET_REGEX) do |match|
|
74
74
|
path = Pathname.new(Regexp.last_match[1])
|
75
|
-
if @theme.
|
75
|
+
if @theme.static_asset_paths.include?(path)
|
76
76
|
"/#{path}"
|
77
77
|
else
|
78
78
|
match
|