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
@@ -86,6 +86,10 @@ module ShopifyCLI
|
|
86
86
|
)
|
87
87
|
end
|
88
88
|
|
89
|
+
def self.auth_token(env_variables: ENV)
|
90
|
+
env_variables[Constants::EnvironmentVariables::AUTH_TOKEN]
|
91
|
+
end
|
92
|
+
|
89
93
|
def self.env_variable_truthy?(variable_name, env_variables: ENV)
|
90
94
|
TRUTHY_ENV_VARIABLE_VALUES.include?(env_variables[variable_name.to_s])
|
91
95
|
end
|
@@ -68,6 +68,24 @@ module ShopifyCLI
|
|
68
68
|
request_exchange_tokens
|
69
69
|
end
|
70
70
|
|
71
|
+
def self.fetch_or_auth_partners_token(ctx:)
|
72
|
+
env_var_auth_token = Environment.auth_token
|
73
|
+
return env_var_auth_token if env_var_auth_token
|
74
|
+
|
75
|
+
ShopifyCLI::DB.get(:partners_exchange_token) do
|
76
|
+
IdentityAuth.new(ctx: ctx).authenticate
|
77
|
+
ShopifyCLI::DB.get(:partners_exchange_token)
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
def self.environment_auth_token?
|
82
|
+
!!Environment.auth_token
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.authenticated?
|
86
|
+
environment_auth_token? || IDENTITY_ACCESS_TOKENS.all? { |key| ShopifyCLI::DB.exists?(key) }
|
87
|
+
end
|
88
|
+
|
71
89
|
def reauthenticate
|
72
90
|
return if refresh_exchange_tokens || refresh_access_tokens
|
73
91
|
ctx.abort(ctx.message("core.identity_auth.error.reauthenticate", ShopifyCLI::TOOL_NAME))
|
@@ -457,6 +457,7 @@ module ShopifyCLI
|
|
457
457
|
not_authenticated: "Failed to authenticate",
|
458
458
|
},
|
459
459
|
login_prompt: "Please ensure you've logged in with {{command:%s login}} and try again",
|
460
|
+
token_authentication: "%s environment variable. We'll authenticate using its value as a token.",
|
460
461
|
},
|
461
462
|
|
462
463
|
options: {
|
@@ -61,18 +61,11 @@ module ShopifyCLI
|
|
61
61
|
def api_client(ctx)
|
62
62
|
new(
|
63
63
|
ctx: ctx,
|
64
|
-
token:
|
64
|
+
token: IdentityAuth.fetch_or_auth_partners_token(ctx: ctx),
|
65
65
|
url: "https://#{Environment.partners_domain}/api/cli/graphql",
|
66
66
|
)
|
67
67
|
end
|
68
68
|
|
69
|
-
def access_token(ctx)
|
70
|
-
ShopifyCLI::DB.get(:partners_exchange_token) do
|
71
|
-
IdentityAuth.new(ctx: ctx).authenticate
|
72
|
-
ShopifyCLI::DB.get(:partners_exchange_token)
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
69
|
def auth_failure_info(ctx, error)
|
77
70
|
if error.response
|
78
71
|
headers = %w(www-authenticate x-request-id)
|
@@ -14,7 +14,7 @@ module ShopifyCLI
|
|
14
14
|
|
15
15
|
def call
|
16
16
|
project = ShopifyCLI::Project.current
|
17
|
-
url = host || ShopifyCLI::Tunnel.start(context)
|
17
|
+
url = host || ShopifyCLI::Tunnel.start(context, port: port)
|
18
18
|
raise ShopifyCLI::Abort,
|
19
19
|
context.message("core.app.serve.error.host_must_be_https") if url.match(/^https/i).nil?
|
20
20
|
project.env.update(context, :host, url)
|
@@ -14,7 +14,7 @@ module ShopifyCLI
|
|
14
14
|
|
15
15
|
def call
|
16
16
|
project = ShopifyCLI::Project.current
|
17
|
-
url = host || ShopifyCLI::Tunnel.start(context)
|
17
|
+
url = host || ShopifyCLI::Tunnel.start(context, port: port)
|
18
18
|
raise ShopifyCLI::Abort,
|
19
19
|
context.message("core.app.serve.error.host_must_be_https") if url.match(/^https/i).nil?
|
20
20
|
project.env.update(context, :host, url)
|
@@ -4,9 +4,15 @@ module ShopifyCLI
|
|
4
4
|
module Tasks
|
5
5
|
class EnsureAuthenticated < ShopifyCLI::Task
|
6
6
|
def call(ctx)
|
7
|
-
|
8
|
-
|
9
|
-
|
7
|
+
return if ShopifyCLI::Environment.acceptance_test?
|
8
|
+
unless ShopifyCLI::IdentityAuth.authenticated?
|
9
|
+
raise ShopifyCLI::Abort,
|
10
|
+
ctx.message("core.identity_auth.login_prompt", ShopifyCLI::TOOL_NAME)
|
11
|
+
end
|
12
|
+
if ShopifyCLI::IdentityAuth.environment_auth_token?
|
13
|
+
ctx.puts(ctx.message("core.identity_auth.token_authentication",
|
14
|
+
ShopifyCLI::Constants::EnvironmentVariables::AUTH_TOKEN))
|
15
|
+
end
|
10
16
|
end
|
11
17
|
end
|
12
18
|
end
|
@@ -24,7 +24,7 @@ module ShopifyCLI
|
|
24
24
|
class << self
|
25
25
|
attr_accessor :ctx
|
26
26
|
|
27
|
-
def start(ctx, root,
|
27
|
+
def start(ctx, root, host: "127.0.0.1", port: 9292, poll: false)
|
28
28
|
@ctx = ctx
|
29
29
|
theme = DevelopmentTheme.new(ctx, root: root)
|
30
30
|
ignore_filter = IgnoreFilter.from_path(root)
|
@@ -36,7 +36,7 @@ module ShopifyCLI
|
|
36
36
|
@app = LocalAssets.new(ctx, @app, theme: theme)
|
37
37
|
@app = HotReload.new(ctx, @app, theme: theme, watcher: watcher, ignore_filter: ignore_filter)
|
38
38
|
stopped = false
|
39
|
-
address = "http://#{
|
39
|
+
address = "http://#{host}:#{port}"
|
40
40
|
|
41
41
|
theme.ensure_exists!
|
42
42
|
|
@@ -70,7 +70,7 @@ module ShopifyCLI
|
|
70
70
|
watcher.start
|
71
71
|
WebServer.run(
|
72
72
|
@app,
|
73
|
-
BindAddress:
|
73
|
+
BindAddress: host,
|
74
74
|
Port: port,
|
75
75
|
Logger: logger,
|
76
76
|
AccessLog: [],
|
@@ -83,7 +83,7 @@ module ShopifyCLI
|
|
83
83
|
rescue Errno::EADDRINUSE
|
84
84
|
abort_address_already_in_use(address)
|
85
85
|
rescue Errno::EADDRNOTAVAIL
|
86
|
-
raise AddressBindingError, "Error binding to the address #{
|
86
|
+
raise AddressBindingError, "Error binding to the address #{host}."
|
87
87
|
end
|
88
88
|
|
89
89
|
def stop
|
@@ -0,0 +1,45 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ShopifyCLI
|
4
|
+
module Theme
|
5
|
+
class Syncer
|
6
|
+
##
|
7
|
+
# ShopifyCLI::Theme::Syncer::ErrorReporter allows delaying log of errors,
|
8
|
+
# mainly to not break the progress bar.
|
9
|
+
#
|
10
|
+
class ErrorReporter
|
11
|
+
attr_reader :ctx, :delayed_errors
|
12
|
+
|
13
|
+
def initialize(ctx)
|
14
|
+
@ctx = ctx
|
15
|
+
@has_any_error = false
|
16
|
+
@delay_errors = false
|
17
|
+
@delayed_errors = []
|
18
|
+
end
|
19
|
+
|
20
|
+
def disable!
|
21
|
+
@delay_errors = true
|
22
|
+
end
|
23
|
+
|
24
|
+
def enable!
|
25
|
+
@delay_errors = false
|
26
|
+
@delayed_errors.each { |error| report(error) }
|
27
|
+
@delayed_errors.clear
|
28
|
+
end
|
29
|
+
|
30
|
+
def report(error_message)
|
31
|
+
if @delay_errors
|
32
|
+
@delayed_errors << error_message
|
33
|
+
else
|
34
|
+
@has_any_error = true
|
35
|
+
@ctx.error(error_message)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def has_any_error?
|
40
|
+
@has_any_error
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ShopifyCLI
|
4
|
+
module Theme
|
5
|
+
class Syncer
|
6
|
+
class Operation
|
7
|
+
attr_accessor :method, :file
|
8
|
+
|
9
|
+
COLOR_BY_STATUS = {
|
10
|
+
error: :red,
|
11
|
+
synced: :green,
|
12
|
+
fixed: :cyan,
|
13
|
+
}
|
14
|
+
|
15
|
+
def initialize(ctx, method, file)
|
16
|
+
@ctx = ctx
|
17
|
+
@method = method
|
18
|
+
@file = file
|
19
|
+
end
|
20
|
+
|
21
|
+
def to_s
|
22
|
+
"#{method} #{file_path}"
|
23
|
+
end
|
24
|
+
|
25
|
+
def as_error_message
|
26
|
+
as_message_with(status: :error)
|
27
|
+
end
|
28
|
+
|
29
|
+
def as_synced_message
|
30
|
+
as_message_with(status: :synced)
|
31
|
+
end
|
32
|
+
|
33
|
+
def as_fix_message
|
34
|
+
as_message_with(status: :fixed)
|
35
|
+
end
|
36
|
+
|
37
|
+
def file_path
|
38
|
+
file&.relative_path.to_s
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def as_message_with(status:)
|
44
|
+
status_color = COLOR_BY_STATUS[status]
|
45
|
+
status_text = @ctx.message("theme.serve.operation.status.#{status}").ljust(6)
|
46
|
+
|
47
|
+
"#{timestamp} {{#{status_color}:#{status_text}}} {{>}} {{blue:#{self}}}"
|
48
|
+
end
|
49
|
+
|
50
|
+
def timestamp
|
51
|
+
Time.now.strftime("%T")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ShopifyCLI
|
4
|
+
module Theme
|
5
|
+
class Syncer
|
6
|
+
##
|
7
|
+
# ShopifyCLI::Theme::Syncer::StdReporter allows disabling/enabling
|
8
|
+
# messages reported in the standard output (ShopifyCLI::Context#puts).
|
9
|
+
#
|
10
|
+
class StandardReporter
|
11
|
+
attr_reader :ctx
|
12
|
+
|
13
|
+
def initialize(ctx)
|
14
|
+
@enabled = true
|
15
|
+
@ctx = ctx
|
16
|
+
end
|
17
|
+
|
18
|
+
def disable!
|
19
|
+
@enabled = false
|
20
|
+
end
|
21
|
+
|
22
|
+
def enable!
|
23
|
+
@enabled = true
|
24
|
+
end
|
25
|
+
|
26
|
+
def report(message)
|
27
|
+
ctx.puts(message) if @enabled
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -2,24 +2,31 @@
|
|
2
2
|
require "thread"
|
3
3
|
require "json"
|
4
4
|
require "base64"
|
5
|
+
require "forwardable"
|
6
|
+
|
7
|
+
require_relative "syncer/error_reporter"
|
8
|
+
require_relative "syncer/standard_reporter"
|
9
|
+
require_relative "syncer/operation"
|
5
10
|
|
6
11
|
module ShopifyCLI
|
7
12
|
module Theme
|
8
13
|
class Syncer
|
9
|
-
|
10
|
-
|
11
|
-
"#{method} #{file&.relative_path}"
|
12
|
-
end
|
13
|
-
end
|
14
|
+
extend Forwardable
|
15
|
+
|
14
16
|
API_VERSION = "unstable"
|
15
17
|
|
16
18
|
attr_reader :checksums
|
17
19
|
attr_accessor :ignore_filter
|
18
20
|
|
21
|
+
def_delegators :@error_reporter, :has_any_error?
|
22
|
+
|
19
23
|
def initialize(ctx, theme:, ignore_filter: nil)
|
20
24
|
@ctx = ctx
|
21
25
|
@theme = theme
|
22
26
|
@ignore_filter = ignore_filter
|
27
|
+
@error_reporter = ErrorReporter.new(ctx)
|
28
|
+
@standard_reporter = StandardReporter.new(ctx)
|
29
|
+
@reporters = [@error_reporter, @standard_reporter]
|
23
30
|
|
24
31
|
# Queue of `Operation`s waiting to be picked up from a thread for processing.
|
25
32
|
@queue = Queue.new
|
@@ -30,12 +37,19 @@ module ShopifyCLI
|
|
30
37
|
# Mutex used to pause all threads when backing-off when hitting API rate limits
|
31
38
|
@backoff_mutex = Mutex.new
|
32
39
|
|
33
|
-
# Allows delaying log of errors, mainly to not break the progress bar.
|
34
|
-
@delay_errors = false
|
35
|
-
@delayed_errors = []
|
36
|
-
|
37
40
|
# Latest theme assets checksums. Updated on each upload.
|
38
41
|
@checksums = {}
|
42
|
+
|
43
|
+
# Checksums of assets with errors.
|
44
|
+
@error_checksums = []
|
45
|
+
end
|
46
|
+
|
47
|
+
def lock_io!
|
48
|
+
@reporters.each { |reporter| reporter.disable! }
|
49
|
+
end
|
50
|
+
|
51
|
+
def unlock_io!
|
52
|
+
@reporters.each { |reporter| reporter.enable! }
|
39
53
|
end
|
40
54
|
|
41
55
|
def enqueue_updates(files)
|
@@ -103,25 +117,14 @@ module ShopifyCLI
|
|
103
117
|
break if operation.nil? # shutdown was called
|
104
118
|
perform(operation)
|
105
119
|
rescue Exception => e
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
)
|
120
|
+
error_suffix = ": #{e}"
|
121
|
+
error_suffix += + "\n\t#{e.backtrace.join("\n\t")}" if @ctx.debug?
|
122
|
+
report_error(operation, error_suffix)
|
110
123
|
end
|
111
124
|
end
|
112
125
|
end
|
113
126
|
end
|
114
127
|
|
115
|
-
def delay_errors!
|
116
|
-
@delay_errors = true
|
117
|
-
end
|
118
|
-
|
119
|
-
def report_errors!
|
120
|
-
@delay_errors = false
|
121
|
-
@delayed_errors.each { |error| report_error(error) }
|
122
|
-
@delayed_errors.clear
|
123
|
-
end
|
124
|
-
|
125
128
|
def upload_theme!(delay_low_priority_files: false, delete: true, &block)
|
126
129
|
fetch_checksums!
|
127
130
|
|
@@ -177,21 +180,27 @@ module ShopifyCLI
|
|
177
180
|
|
178
181
|
private
|
179
182
|
|
183
|
+
def report_error(operation, error_suffix = "")
|
184
|
+
@error_checksums << @checksums[operation.file_path]
|
185
|
+
@error_reporter.report("#{operation.as_error_message}#{error_suffix}")
|
186
|
+
end
|
187
|
+
|
180
188
|
def enqueue(method, file)
|
181
189
|
raise ArgumentError, "file required" unless file
|
182
190
|
|
183
|
-
operation = Operation.new(method, @theme[file])
|
191
|
+
operation = Operation.new(@ctx, method, @theme[file])
|
184
192
|
|
185
193
|
# Already enqueued
|
186
194
|
return if @pending.include?(operation)
|
187
195
|
|
188
|
-
if @ignore_filter&.ignore?(operation.
|
189
|
-
@ctx.debug("ignore #{operation.
|
196
|
+
if @ignore_filter&.ignore?(operation.file_path)
|
197
|
+
@ctx.debug("ignore #{operation.file_path}")
|
190
198
|
return
|
191
199
|
end
|
192
200
|
|
193
201
|
if [:update, :get].include?(method) && operation.file.exist? && !file_has_changed?(operation.file)
|
194
|
-
|
202
|
+
is_fixed = !!@error_checksums.delete(operation.file.checksum)
|
203
|
+
@standard_reporter.report(operation.as_fix_message) if is_fixed
|
195
204
|
return
|
196
205
|
end
|
197
206
|
|
@@ -206,16 +215,16 @@ module ShopifyCLI
|
|
206
215
|
|
207
216
|
response = send(operation.method, operation.file)
|
208
217
|
|
218
|
+
@standard_reporter.report(operation.as_synced_message)
|
219
|
+
|
209
220
|
# Check if the API told us we're near the rate limit
|
210
221
|
if !backingoff? && (limit = response["x-shopify-shop-api-call-limit"])
|
211
222
|
used, total = limit.split("/").map(&:to_i)
|
212
223
|
backoff_if_near_limit!(used, total)
|
213
224
|
end
|
214
225
|
rescue ShopifyCLI::API::APIRequestError => e
|
215
|
-
|
216
|
-
|
217
|
-
parse_api_errors(e).join("\n ")
|
218
|
-
)
|
226
|
+
error_suffix = ":\n " + parse_api_errors(e).join("\n ")
|
227
|
+
report_error(operation, error_suffix)
|
219
228
|
ensure
|
220
229
|
@pending.delete(operation)
|
221
230
|
end
|
@@ -295,14 +304,6 @@ module ShopifyCLI
|
|
295
304
|
file.checksum != @checksums[file.relative_path.to_s]
|
296
305
|
end
|
297
306
|
|
298
|
-
def report_error(error)
|
299
|
-
if @delay_errors
|
300
|
-
@delayed_errors << error
|
301
|
-
else
|
302
|
-
@ctx.puts(error)
|
303
|
-
end
|
304
|
-
end
|
305
|
-
|
306
307
|
def parse_api_errors(exception)
|
307
308
|
parsed_body = JSON.parse(exception&.response&.body)
|
308
309
|
message = parsed_body.dig("errors", "asset") || parsed_body["message"] || exception.message
|
@@ -162,26 +162,38 @@ module ShopifyCLI
|
|
162
162
|
}
|
163
163
|
end
|
164
164
|
|
165
|
-
|
166
|
-
|
167
|
-
ctx
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
165
|
+
class << self
|
166
|
+
def all(ctx, root: nil)
|
167
|
+
_status, body = fetch_themes(ctx)
|
168
|
+
|
169
|
+
body["themes"]
|
170
|
+
.sort_by { |theme_attrs| Time.parse(theme_attrs["updated_at"]) }
|
171
|
+
.reverse
|
172
|
+
.map { |theme_attrs| new(ctx, root: root, **allowed_attrs(theme_attrs)) }
|
173
|
+
end
|
174
|
+
|
175
|
+
def live(ctx, root: nil)
|
176
|
+
_status, body = fetch_themes(ctx)
|
172
177
|
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
178
|
+
body["themes"]
|
179
|
+
.find { |theme_attrs| theme_attrs["role"] == "main" }
|
180
|
+
.tap { |theme_attrs| break new(ctx, root: root, **allowed_attrs(theme_attrs)) }
|
181
|
+
end
|
182
|
+
|
183
|
+
private
|
184
|
+
|
185
|
+
def allowed_attrs(attrs)
|
186
|
+
attrs.slice("id", "name", "role").transform_keys(&:to_sym)
|
187
|
+
end
|
188
|
+
|
189
|
+
def fetch_themes(ctx)
|
190
|
+
AdminAPI.rest_request(
|
191
|
+
ctx,
|
192
|
+
shop: AdminAPI.get_shop_or_abort(ctx),
|
193
|
+
path: "themes.json",
|
194
|
+
api_version: "unstable",
|
195
|
+
)
|
196
|
+
end
|
185
197
|
end
|
186
198
|
|
187
199
|
private
|
data/lib/shopify_cli/tunnel.rb
CHANGED
@@ -87,7 +87,7 @@ module ShopifyCLI
|
|
87
87
|
#
|
88
88
|
def auth(ctx, token)
|
89
89
|
install(ctx)
|
90
|
-
ctx.system(ngrok_path, "authtoken", token)
|
90
|
+
ctx.system(ngrok_path(ctx), "authtoken", token)
|
91
91
|
end
|
92
92
|
|
93
93
|
##
|
@@ -150,7 +150,7 @@ module ShopifyCLI
|
|
150
150
|
|
151
151
|
def install(ctx)
|
152
152
|
ngrok = "ngrok#{ctx.executable_file_extension}"
|
153
|
-
return if File.exist?(ngrok_path)
|
153
|
+
return if File.exist?(ngrok_path(ctx))
|
154
154
|
check_prereq_command(ctx, "curl")
|
155
155
|
check_prereq_command(ctx, ctx.linux? ? "unzip" : "tar")
|
156
156
|
spinner = CLI::UI::SpinGroup.new
|
@@ -170,7 +170,7 @@ module ShopifyCLI
|
|
170
170
|
spinner.wait
|
171
171
|
|
172
172
|
# final check to see if ngrok is accessible
|
173
|
-
unless File.exist?(ngrok_path)
|
173
|
+
unless File.exist?(ngrok_path(ctx))
|
174
174
|
ctx.abort(ctx.message("core.tunnel.error.ngrok", ngrok, ShopifyCLI.cache_dir))
|
175
175
|
end
|
176
176
|
end
|
@@ -182,12 +182,9 @@ module ShopifyCLI
|
|
182
182
|
raise e.class, e.message
|
183
183
|
end
|
184
184
|
|
185
|
-
def ngrok_path
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
def ngrok_command(port)
|
190
|
-
"\"#{ngrok_path}\" http -inspect=false -log=stdout -log-level=debug #{port}"
|
185
|
+
def ngrok_path(ctx)
|
186
|
+
ngrok = "ngrok#{ctx.executable_file_extension}"
|
187
|
+
File.join(ShopifyCLI.cache_dir, ngrok)
|
191
188
|
end
|
192
189
|
|
193
190
|
def seconds_to_hm(seconds)
|
@@ -195,7 +192,8 @@ module ShopifyCLI
|
|
195
192
|
end
|
196
193
|
|
197
194
|
def start_ngrok(ctx, port)
|
198
|
-
|
195
|
+
ngrok_command = "\"#{ngrok_path(ctx)}\" http -inspect=false -log=stdout -log-level=debug #{port}"
|
196
|
+
process = ShopifyCLI::ProcessSupervision.start(:ngrok, ngrok_command)
|
199
197
|
log = fetch_url(ctx, process.log_path)
|
200
198
|
[log.url, log.account]
|
201
199
|
end
|
data/lib/shopify_cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: shopify-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.7.
|
4
|
+
version: 2.7.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Shopify
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -275,12 +275,17 @@ files:
|
|
275
275
|
- lib/project_types/script/commands/push.rb
|
276
276
|
- lib/project_types/script/config/extension_points.yml
|
277
277
|
- lib/project_types/script/errors.rb
|
278
|
+
- lib/project_types/script/forms/ask_app.rb
|
279
|
+
- lib/project_types/script/forms/ask_org.rb
|
280
|
+
- lib/project_types/script/forms/ask_script_uuid.rb
|
278
281
|
- lib/project_types/script/forms/create.rb
|
282
|
+
- lib/project_types/script/forms/run_against_shopify_org.rb
|
279
283
|
- lib/project_types/script/graphql/app_script_set.graphql
|
280
284
|
- lib/project_types/script/graphql/get_app_scripts.graphql
|
281
285
|
- lib/project_types/script/graphql/module_upload_url_generate.graphql
|
282
286
|
- lib/project_types/script/graphql/script_service_proxy.graphql
|
283
287
|
- lib/project_types/script/layers/application/build_script.rb
|
288
|
+
- lib/project_types/script/layers/application/connect_app.rb
|
284
289
|
- lib/project_types/script/layers/application/create_script.rb
|
285
290
|
- lib/project_types/script/layers/application/extension_points.rb
|
286
291
|
- lib/project_types/script/layers/application/project_dependencies.rb
|
@@ -308,7 +313,6 @@ files:
|
|
308
313
|
- lib/project_types/script/layers/infrastructure/script_uploader.rb
|
309
314
|
- lib/project_types/script/layers/infrastructure/service_locator.rb
|
310
315
|
- lib/project_types/script/messages/messages.rb
|
311
|
-
- lib/project_types/script/tasks/ensure_env.rb
|
312
316
|
- lib/project_types/script/ui/error_handler.rb
|
313
317
|
- lib/project_types/script/ui/printing_spinner.rb
|
314
318
|
- lib/project_types/script/ui/strict_spinner.rb
|
@@ -454,6 +458,9 @@ files:
|
|
454
458
|
- lib/shopify_cli/theme/ignore_filter.rb
|
455
459
|
- lib/shopify_cli/theme/mime_type.rb
|
456
460
|
- lib/shopify_cli/theme/syncer.rb
|
461
|
+
- lib/shopify_cli/theme/syncer/error_reporter.rb
|
462
|
+
- lib/shopify_cli/theme/syncer/operation.rb
|
463
|
+
- lib/shopify_cli/theme/syncer/standard_reporter.rb
|
457
464
|
- lib/shopify_cli/theme/theme.rb
|
458
465
|
- lib/shopify_cli/transform_data_structure.rb
|
459
466
|
- lib/shopify_cli/tunnel.rb
|