shopify-cli 2.15.1 → 2.15.4
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/.vscode/settings.json +1 -2
- data/CHANGELOG.md +68 -20
- data/Gemfile.lock +1 -1
- data/Rakefile +21 -0
- data/ext/javy/hashes/javy-arm-macos-v0.3.0.gz.sha256 +1 -0
- data/ext/javy/hashes/javy-x86_64-linux-v0.3.0.gz.sha256 +1 -0
- data/ext/javy/hashes/javy-x86_64-macos-v0.3.0.gz.sha256 +1 -0
- data/ext/javy/hashes/javy-x86_64-windows-v0.3.0.gz.sha256 +1 -0
- data/ext/javy/version +1 -1
- data/ext/shopify-extensions/version +1 -1
- data/lib/project_types/extension/cli.rb +4 -0
- data/lib/project_types/extension/commands/check.rb +6 -1
- data/lib/project_types/extension/forms/questions/ask_template.rb +1 -2
- data/lib/project_types/extension/messages/messages.rb +1 -3
- data/lib/project_types/extension/models/development_server_requirements.rb +1 -0
- data/lib/project_types/extension/models/specification_handlers/beacon_extension.rb +57 -0
- data/lib/project_types/extension/models/specification_handlers/beacon_extension_utils/script_config.rb +33 -0
- data/lib/project_types/extension/models/specification_handlers/beacon_extension_utils/script_config_repository.rb +75 -0
- data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +16 -1
- data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +4 -1
- data/lib/project_types/extension/tasks/configure_options.rb +2 -1
- data/lib/project_types/extension/tasks/convert_server_config.rb +13 -2
- data/lib/project_types/extension/tasks/merge_server_config.rb +5 -2
- data/lib/project_types/script/cli.rb +1 -0
- data/lib/project_types/script/layers/application/create_script.rb +14 -6
- data/lib/project_types/script/layers/infrastructure/errors.rb +17 -0
- data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +6 -21
- data/lib/project_types/script/layers/infrastructure/script_service.rb +2 -0
- data/lib/project_types/script/layers/infrastructure/sparse_checkout_details.rb +35 -0
- data/lib/project_types/script/messages/messages.rb +3 -0
- data/lib/project_types/script/ui/error_handler.rb +11 -0
- data/lib/project_types/theme/cli.rb +1 -0
- data/lib/project_types/theme/commands/check.rb +4 -1
- data/lib/project_types/theme/commands/open.rb +2 -2
- data/lib/project_types/theme/commands/push.rb +1 -3
- data/lib/project_types/theme/commands/serve.rb +1 -0
- data/lib/project_types/theme/commands/share.rb +56 -0
- data/lib/project_types/theme/messages/messages.rb +64 -11
- data/lib/shopify_cli/changelog.rb +97 -25
- data/lib/shopify_cli/command_options/command_serve_options.rb +10 -0
- data/lib/shopify_cli/commands/app/serve.rb +7 -7
- data/lib/shopify_cli/commands/login.rb +5 -2
- data/lib/shopify_cli/context.rb +13 -0
- data/lib/shopify_cli/git.rb +36 -0
- data/lib/shopify_cli/identity_auth.rb +24 -4
- data/lib/shopify_cli/messages/messages.rb +22 -11
- data/lib/shopify_cli/release.rb +120 -20
- data/lib/shopify_cli/services/app/create/rails_service.rb +9 -1
- data/lib/shopify_cli/services/app/serve/node_service.rb +2 -25
- data/lib/shopify_cli/services/app/serve/php_service.rb +2 -25
- data/lib/shopify_cli/services/app/serve/rails_service.rb +8 -28
- data/lib/shopify_cli/services/app/serve/serve_service.rb +57 -0
- data/lib/shopify_cli/services.rb +1 -0
- data/lib/shopify_cli/tasks/update_dashboard_urls.rb +7 -9
- data/lib/shopify_cli/theme/dev_server/hot-reload.js +40 -13
- data/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb +1 -1
- data/lib/shopify_cli/theme/dev_server/hot_reload/sections_index.rb +51 -0
- data/lib/shopify_cli/theme/dev_server/hot_reload.rb +6 -1
- data/lib/shopify_cli/theme/dev_server/local_assets.rb +1 -1
- data/lib/shopify_cli/theme/dev_server/remote_watcher/json_files_update_job.rb +35 -0
- data/lib/shopify_cli/theme/dev_server/remote_watcher.rb +44 -0
- data/lib/shopify_cli/theme/dev_server/watcher.rb +2 -8
- data/lib/shopify_cli/theme/dev_server.rb +18 -5
- data/lib/shopify_cli/theme/file.rb +15 -4
- data/lib/shopify_cli/theme/syncer/checksums.rb +60 -0
- data/lib/shopify_cli/theme/syncer/forms/apply_to_all.rb +39 -0
- data/lib/shopify_cli/theme/syncer/forms/apply_to_all_form.rb +35 -0
- data/lib/shopify_cli/theme/syncer/forms/base_strategy_form.rb +62 -0
- data/lib/shopify_cli/theme/syncer/forms/select_delete_strategy.rb +27 -0
- data/lib/shopify_cli/theme/syncer/forms/select_update_strategy.rb +28 -0
- data/lib/shopify_cli/theme/syncer/ignore_helper.rb +33 -0
- data/lib/shopify_cli/theme/syncer/json_delete_handler.rb +51 -0
- data/lib/shopify_cli/theme/syncer/json_update_handler.rb +82 -0
- data/lib/shopify_cli/theme/syncer/merger.rb +53 -0
- data/lib/shopify_cli/theme/syncer/operation.rb +1 -1
- data/lib/shopify_cli/theme/syncer.rb +79 -63
- data/lib/shopify_cli/theme/theme.rb +21 -7
- data/lib/shopify_cli/theme/theme_admin_api.rb +23 -8
- data/lib/shopify_cli/thread_pool/job.rb +10 -2
- data/lib/shopify_cli/thread_pool.rb +15 -3
- data/lib/shopify_cli/tunnel.rb +3 -13
- data/lib/shopify_cli/version.rb +1 -1
- data/vendor/deps/cli-ui/lib/cli/ui/os.rb +8 -0
- metadata +25 -2
|
@@ -8,12 +8,9 @@ module ShopifyCLI
|
|
|
8
8
|
|
|
9
9
|
recommend_default_ruby_range
|
|
10
10
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
end
|
|
15
|
-
parser.on("--port=PORT") { |port| flags[:port] = port }
|
|
16
|
-
end
|
|
11
|
+
parse_host_option
|
|
12
|
+
parse_port_option
|
|
13
|
+
parse_no_update_option
|
|
17
14
|
|
|
18
15
|
def call(*)
|
|
19
16
|
case detect_app
|
|
@@ -21,18 +18,21 @@ module ShopifyCLI
|
|
|
21
18
|
Services::App::Serve::RailsService.call(
|
|
22
19
|
host: host,
|
|
23
20
|
port: port,
|
|
21
|
+
no_update: no_update,
|
|
24
22
|
context: @ctx
|
|
25
23
|
)
|
|
26
24
|
when :node
|
|
27
25
|
Services::App::Serve::NodeService.call(
|
|
28
26
|
host: host,
|
|
29
27
|
port: port,
|
|
28
|
+
no_update: no_update,
|
|
30
29
|
context: @ctx
|
|
31
30
|
)
|
|
32
31
|
when :php
|
|
33
32
|
Services::App::Serve::PHPService.call(
|
|
34
33
|
host: host,
|
|
35
34
|
port: port,
|
|
35
|
+
no_update: no_update,
|
|
36
36
|
context: @ctx
|
|
37
37
|
)
|
|
38
38
|
end
|
|
@@ -43,7 +43,7 @@ module ShopifyCLI
|
|
|
43
43
|
end
|
|
44
44
|
|
|
45
45
|
def self.extended_help
|
|
46
|
-
ShopifyCLI::Context.message("app.
|
|
46
|
+
ShopifyCLI::Context.message("core.app.serve.extended_help")
|
|
47
47
|
end
|
|
48
48
|
end
|
|
49
49
|
end
|
|
@@ -30,7 +30,7 @@ module ShopifyCLI
|
|
|
30
30
|
if @ctx.ci? && (password = options.flags[:password] || @ctx.getenv("SHOPIFY_PASSWORD"))
|
|
31
31
|
ShopifyCLI::DB.set(shopify_exchange_token: password)
|
|
32
32
|
else
|
|
33
|
-
IdentityAuth.new(ctx: @ctx).authenticate
|
|
33
|
+
IdentityAuth.new(ctx: @ctx).authenticate(spinner: true)
|
|
34
34
|
org = select_organization
|
|
35
35
|
ShopifyCLI::DB.set(organization_id: org["id"].to_i) unless org.nil?
|
|
36
36
|
Whoami.call([], "whoami")
|
|
@@ -75,7 +75,10 @@ module ShopifyCLI
|
|
|
75
75
|
private
|
|
76
76
|
|
|
77
77
|
def select_organization
|
|
78
|
-
organizations =
|
|
78
|
+
organizations = []
|
|
79
|
+
CLI::UI::Spinner.spin(@ctx.message("core.login.spinner.loading_organizations")) do
|
|
80
|
+
organizations = ShopifyCLI::PartnersAPI::Organizations.fetch_all(@ctx)
|
|
81
|
+
end
|
|
79
82
|
|
|
80
83
|
if organizations.count == 0
|
|
81
84
|
nil
|
data/lib/shopify_cli/context.rb
CHANGED
|
@@ -4,6 +4,7 @@ require "fileutils"
|
|
|
4
4
|
require "rbconfig"
|
|
5
5
|
require "net/http"
|
|
6
6
|
require "json"
|
|
7
|
+
require "bundler"
|
|
7
8
|
|
|
8
9
|
module ShopifyCLI
|
|
9
10
|
##
|
|
@@ -642,6 +643,18 @@ module ShopifyCLI
|
|
|
642
643
|
end
|
|
643
644
|
end
|
|
644
645
|
|
|
646
|
+
# Uses bundle to grab the version of a gem
|
|
647
|
+
#
|
|
648
|
+
# #### Parameters
|
|
649
|
+
# - gem: the name of the gem to check
|
|
650
|
+
#
|
|
651
|
+
# #### Returns
|
|
652
|
+
# - version: a Semantic::Version object with the gem version
|
|
653
|
+
def ruby_gem_version(gem)
|
|
654
|
+
version = Bundler.load.specs.find { |s| s.name == gem }.version
|
|
655
|
+
::Semantic::Version.new(version.to_s)
|
|
656
|
+
end
|
|
657
|
+
|
|
645
658
|
private
|
|
646
659
|
|
|
647
660
|
def ctx_path(fname)
|
data/lib/shopify_cli/git.rb
CHANGED
|
@@ -102,6 +102,42 @@ module ShopifyCLI
|
|
|
102
102
|
branches
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
+
##
|
|
106
|
+
# Run git three-way file merge (it doesn't require an initialized git repository)
|
|
107
|
+
#
|
|
108
|
+
# #### Parameters
|
|
109
|
+
#
|
|
110
|
+
# * `current_file - string path of the current file
|
|
111
|
+
# * `base_file` - string path of the base file
|
|
112
|
+
# * `other_file` - string path of the other file
|
|
113
|
+
# * `opts` - list of "git merge-file" options. Valid values:
|
|
114
|
+
# - "-q" - do not warn about conflicts
|
|
115
|
+
# - "--diff3" - show conflicts
|
|
116
|
+
# - "--ours" - resolve conflicts favoring lines from `current_file`
|
|
117
|
+
# - "--theirs" - resolve conflicts favoring lines from `other_file`
|
|
118
|
+
# - "--union" - resolve conflicts favoring lines from both files
|
|
119
|
+
# - "-p" - send results to standard output instead of
|
|
120
|
+
# overwriting the `current_file`
|
|
121
|
+
# * `ctx` - the current running context of your command, defaults to a new context
|
|
122
|
+
#
|
|
123
|
+
# #### Returns
|
|
124
|
+
#
|
|
125
|
+
# * standard output from git
|
|
126
|
+
#
|
|
127
|
+
# #### Example
|
|
128
|
+
#
|
|
129
|
+
# output = ShopifyCLI::Git.merge_file(current_file, base_file, other_file, opts, ctx: ctx)
|
|
130
|
+
#
|
|
131
|
+
def merge_file(current_file, base_file, other_file, opts = [], ctx: Context.new)
|
|
132
|
+
output, status = ctx.capture2e("git", "merge-file", current_file, base_file, other_file, *opts)
|
|
133
|
+
|
|
134
|
+
unless status.success?
|
|
135
|
+
ctx.abort(ctx.message("core.git.error.merge_failed"))
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
output
|
|
139
|
+
end
|
|
140
|
+
|
|
105
141
|
##
|
|
106
142
|
# will initialize a new repo in the current directory. This will output
|
|
107
143
|
# if it was successful or not.
|
|
@@ -56,8 +56,10 @@ module ShopifyCLI
|
|
|
56
56
|
|
|
57
57
|
attr_accessor :response_query
|
|
58
58
|
|
|
59
|
-
def authenticate
|
|
60
|
-
return if
|
|
59
|
+
def authenticate(spinner: false)
|
|
60
|
+
return if with_spinner(spinner, ctx.message("core.login.spinner.initiating")) do
|
|
61
|
+
attempt_reauthenticate
|
|
62
|
+
end
|
|
61
63
|
|
|
62
64
|
initiate_authentication
|
|
63
65
|
|
|
@@ -66,7 +68,21 @@ module ShopifyCLI
|
|
|
66
68
|
rescue IdentityAuth::Timeout => e
|
|
67
69
|
ctx.abort(e.message)
|
|
68
70
|
end
|
|
69
|
-
|
|
71
|
+
with_spinner(spinner, ctx.message("core.login.spinner.finalizing")) do
|
|
72
|
+
request_exchange_tokens
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def with_spinner(spinner, message, &block)
|
|
77
|
+
result = nil
|
|
78
|
+
if spinner
|
|
79
|
+
CLI::UI::Spinner.spin(message) do
|
|
80
|
+
result = block.call
|
|
81
|
+
end
|
|
82
|
+
else
|
|
83
|
+
result = block.call
|
|
84
|
+
end
|
|
85
|
+
result
|
|
70
86
|
end
|
|
71
87
|
|
|
72
88
|
def fetch_or_auth_partners_token
|
|
@@ -100,10 +116,14 @@ module ShopifyCLI
|
|
|
100
116
|
end
|
|
101
117
|
|
|
102
118
|
def reauthenticate
|
|
103
|
-
return if
|
|
119
|
+
return if attempt_reauthenticate
|
|
104
120
|
ctx.abort(ctx.message("core.identity_auth.error.reauthenticate", ShopifyCLI::TOOL_NAME))
|
|
105
121
|
end
|
|
106
122
|
|
|
123
|
+
def attempt_reauthenticate
|
|
124
|
+
refresh_exchange_tokens || refresh_access_tokens
|
|
125
|
+
end
|
|
126
|
+
|
|
107
127
|
def code_challenge
|
|
108
128
|
@code_challenge ||= Base64.urlsafe_encode64(
|
|
109
129
|
OpenSSL::Digest::SHA256.digest(code_verifier),
|
|
@@ -18,6 +18,7 @@ module ShopifyCLI
|
|
|
18
18
|
missing_node: "Node.js is required to continue. Install Node.js here: https://nodejs.org/en/download.",
|
|
19
19
|
missing_npm: "npm is required to continue. Install npm here: https://www.npmjs.com/get-npm.",
|
|
20
20
|
missing_ruby: "Ruby is required to continue. Install Ruby here: https://www.ruby-lang.org/en/downloads.",
|
|
21
|
+
bundle_info_failure: "Error getting version for %s gem",
|
|
21
22
|
option_parser: {
|
|
22
23
|
invalid_option: "The option {{command:%s}} is not supported.",
|
|
23
24
|
invalid_option_store_equals: <<~MESSAGE,
|
|
@@ -263,6 +264,7 @@ module ShopifyCLI
|
|
|
263
264
|
{{bold:Options:}}
|
|
264
265
|
{{cyan:--host=HOST}}: Bypass running tunnel and use custom host. HOST must be HTTPS url.
|
|
265
266
|
{{cyan:--port=PORT}}: Use custom port.
|
|
267
|
+
{{cyan:--no-update}}: Skips the dashboard URL update step
|
|
266
268
|
HELP
|
|
267
269
|
open_info: <<~MESSAGE,
|
|
268
270
|
{{*}} To install and start using your app, open this URL in your browser:
|
|
@@ -283,6 +285,13 @@ module ShopifyCLI
|
|
|
283
285
|
},
|
|
284
286
|
extension: {
|
|
285
287
|
push: {
|
|
288
|
+
beacon_extension: {
|
|
289
|
+
error: {
|
|
290
|
+
file_read_error: "There was a problem reading %s",
|
|
291
|
+
missing_config_key_error: "Configuration is missing key: %s",
|
|
292
|
+
invalid_config_value_error: "Configuration value is invalid: %s",
|
|
293
|
+
},
|
|
294
|
+
},
|
|
286
295
|
checkout_ui_extension: {
|
|
287
296
|
localization: {
|
|
288
297
|
error: {
|
|
@@ -294,6 +303,7 @@ module ShopifyCLI
|
|
|
294
303
|
invalid_file_extension: "Invalid locale filename: `%s`; only .json files are allowed.",
|
|
295
304
|
invalid_locale_code: "Invalid locale filename: `%s`; locale code should be 2 or 3 letters,"\
|
|
296
305
|
" optionally followed by a two-letter region code, e.g. `fr-CA`.",
|
|
306
|
+
invalid_file_encoding: "Invalid file encoding for `%s`; file encoding should be UTF-8.",
|
|
297
307
|
single_default_locale: "There must be one and only one locale identified as the default locale,"\
|
|
298
308
|
" e.g. `en.default.json`",
|
|
299
309
|
},
|
|
@@ -388,6 +398,7 @@ module ShopifyCLI
|
|
|
388
398
|
sparse_checkout_not_set: "Sparse checkout set command failed.",
|
|
389
399
|
pull_failed: "Pull failed.",
|
|
390
400
|
pull_failed_bad_branch: "Pull failed. Branch %s cannot be found. Check the branch name and try again.",
|
|
401
|
+
merge_failed: "The file %s merge failed.",
|
|
391
402
|
},
|
|
392
403
|
|
|
393
404
|
cloning: "Cloning %s into %s…",
|
|
@@ -438,7 +449,7 @@ module ShopifyCLI
|
|
|
438
449
|
login: {
|
|
439
450
|
help: <<~HELP,
|
|
440
451
|
Log in to the Shopify CLI by authenticating with a store or partner organization
|
|
441
|
-
Usage: {{command:%s login [--store
|
|
452
|
+
Usage: {{command:%s login [--store STORE]}}
|
|
442
453
|
HELP
|
|
443
454
|
invalid_shop: <<~MESSAGE,
|
|
444
455
|
Invalid store provided (%s). Please provide the store in the following format: my-store.myshopify.com
|
|
@@ -446,6 +457,11 @@ module ShopifyCLI
|
|
|
446
457
|
shop_prompt: <<~PROMPT,
|
|
447
458
|
What store are you connecting to? (e.g. my-store.myshopify.com; do {{bold:NOT}} include protocol part, e.g., https://)
|
|
448
459
|
PROMPT
|
|
460
|
+
spinner: {
|
|
461
|
+
initiating: "Initiating authentication",
|
|
462
|
+
finalizing: "Finalizing authentication",
|
|
463
|
+
loading_organizations: "Loading available partner organizations",
|
|
464
|
+
},
|
|
449
465
|
},
|
|
450
466
|
|
|
451
467
|
logout: {
|
|
@@ -460,7 +476,7 @@ module ShopifyCLI
|
|
|
460
476
|
switch: {
|
|
461
477
|
help: <<~HELP,
|
|
462
478
|
Switch between development stores in your partner organization
|
|
463
|
-
Usage: {{command:%s switch [--store
|
|
479
|
+
Usage: {{command:%s switch [--store STORE]}}
|
|
464
480
|
HELP
|
|
465
481
|
disabled_as_shopify_org: "Can't switch development stores logged in as {{green:Shopify partners org}}",
|
|
466
482
|
success: "Switched development store to {{green:%s}}",
|
|
@@ -573,7 +589,7 @@ module ShopifyCLI
|
|
|
573
589
|
HELP
|
|
574
590
|
|
|
575
591
|
error: {
|
|
576
|
-
no_shop: "No store found. Please run {{command:%s login --store
|
|
592
|
+
no_shop: "No store found. Please run {{command:%s login --store STORE}} to login to a specific store",
|
|
577
593
|
},
|
|
578
594
|
|
|
579
595
|
customer: {
|
|
@@ -713,7 +729,6 @@ module ShopifyCLI
|
|
|
713
729
|
updated: "{{v}} Whitelist URLS updated in Partners Dashboard}}",
|
|
714
730
|
update_error:
|
|
715
731
|
"{{x}} error: For authentication issues, run {{command:%s logout}} to clear invalid credentials",
|
|
716
|
-
update_prompt: "Do you want to update your application url?",
|
|
717
732
|
},
|
|
718
733
|
select_org_and_shop: {
|
|
719
734
|
authentication_issue: "For authentication issues, run {{command:%s logout}} to clear invalid credentials",
|
|
@@ -745,16 +760,12 @@ module ShopifyCLI
|
|
|
745
760
|
" package manager for your system.",
|
|
746
761
|
ngrok: "Something went wrong with ngrok installation,"\
|
|
747
762
|
"please make sure %s exists within %s before trying again",
|
|
763
|
+
signup_required: "A free ngrok account is required: {{underline:https://ngrok.com/signup}}. After you "\
|
|
764
|
+
"signup, install your personal authorization token using {{command:%s app tunnel auth <token>}}.",
|
|
748
765
|
},
|
|
749
766
|
installing: "Installing ngrok…",
|
|
750
767
|
not_running: "{{green:x}} ngrok tunnel not running",
|
|
751
768
|
prereq_command_location: "%s @ %s",
|
|
752
|
-
signup_suggestion: <<~MESSAGE,
|
|
753
|
-
{{*}} To avoid tunnels that timeout, it is recommended to signup for a free ngrok
|
|
754
|
-
account at {{underline:https://ngrok.com/signup}}. After you signup, install your
|
|
755
|
-
personalized authorization token using {{command:%s app tunnel auth <token>}}.
|
|
756
|
-
MESSAGE
|
|
757
|
-
start: "{{v}} ngrok tunnel running at {{underline:%s}}",
|
|
758
769
|
start_with_account: "{{v}} ngrok tunnel running at {{underline:%s}}, with account %s",
|
|
759
770
|
stopped: "{{green:x}} ngrok tunnel stopped",
|
|
760
771
|
timed_out: "{{x}} ngrok tunnel has timed out, restarting…",
|
|
@@ -809,7 +820,7 @@ module ShopifyCLI
|
|
|
809
820
|
not_logged_in: <<~MESSAGE,
|
|
810
821
|
It doesn't appear that you're logged in. You must log into a partner organization or a store staff account.
|
|
811
822
|
|
|
812
|
-
If trying to log into a store staff account, please use {{command:%s login --store
|
|
823
|
+
If trying to log into a store staff account, please use {{command:%s login --store STORE}} to log in.
|
|
813
824
|
MESSAGE
|
|
814
825
|
logged_in_shop_only: <<~MESSAGE,
|
|
815
826
|
Logged into store {{green:%s}} as staff (no partner organizations available for this login)
|
data/lib/shopify_cli/release.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require "net/http"
|
|
2
|
+
require "fileutils"
|
|
1
3
|
require "shopify_cli/sed"
|
|
2
4
|
require "shopify_cli/changelog"
|
|
3
5
|
require "octokit"
|
|
@@ -15,20 +17,34 @@ module ShopifyCLI
|
|
|
15
17
|
create_release_branch
|
|
16
18
|
update_changelog
|
|
17
19
|
update_versions_in_files
|
|
18
|
-
|
|
20
|
+
commit_packaging
|
|
19
21
|
pr = create_pr
|
|
20
22
|
system("open #{pr["html_url"]}")
|
|
21
23
|
end
|
|
22
24
|
|
|
25
|
+
def package!
|
|
26
|
+
ensure_updated_main
|
|
27
|
+
ensure_correct_gem_version
|
|
28
|
+
Rake::Task["package"].invoke
|
|
29
|
+
update_homebrew
|
|
30
|
+
create_github_release
|
|
31
|
+
end
|
|
32
|
+
|
|
23
33
|
private
|
|
24
34
|
|
|
25
35
|
attr_reader :new_version, :changelog, :github
|
|
26
36
|
|
|
27
37
|
def ensure_updated_main
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
38
|
+
# We can't be sure what is the correct action to take if changes have been
|
|
39
|
+
# made but not committed. Ensure the user handles the situation before
|
|
40
|
+
# moving on.
|
|
41
|
+
unless %x(git status --porcelain).empty?
|
|
42
|
+
raise <<~MESSAGE
|
|
43
|
+
Uncommitted changes have been made to the repository.
|
|
44
|
+
Please make sure `git status` does not show any changes before continuing.
|
|
45
|
+
MESSAGE
|
|
31
46
|
end
|
|
47
|
+
system_or_fail("git checkout main", "check out main branch")
|
|
32
48
|
unless system("git pull")
|
|
33
49
|
raise "git pull failed, cannot be sure there aren't new commits!"
|
|
34
50
|
end
|
|
@@ -36,13 +52,11 @@ module ShopifyCLI
|
|
|
36
52
|
|
|
37
53
|
def create_release_branch
|
|
38
54
|
puts "Checking out release branch"
|
|
39
|
-
|
|
40
|
-
puts "Cannot check out release branch!"
|
|
41
|
-
end
|
|
55
|
+
system_or_fail("git checkout -b #{release_branch_name}", "check out release branch")
|
|
42
56
|
end
|
|
43
57
|
|
|
44
58
|
def update_changelog
|
|
45
|
-
if release_notes.empty?
|
|
59
|
+
if release_notes("Unreleased").empty?
|
|
46
60
|
puts "No unreleased CHANGELOG updates found!"
|
|
47
61
|
else
|
|
48
62
|
puts "Updating CHANGELOG"
|
|
@@ -63,32 +77,118 @@ module ShopifyCLI
|
|
|
63
77
|
)
|
|
64
78
|
end
|
|
65
79
|
|
|
66
|
-
def
|
|
80
|
+
def commit_packaging
|
|
67
81
|
puts "Committing"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
end
|
|
71
|
-
unless system("git push -u origin #{release_branch_name}")
|
|
72
|
-
puts "Failed to push branch!"
|
|
73
|
-
end
|
|
82
|
+
system_or_fail("git commit -am 'Packaging for release v#{new_version}'", "commit")
|
|
83
|
+
system_or_fail("git push -u origin #{release_branch_name}", "push branch")
|
|
74
84
|
end
|
|
75
85
|
|
|
76
86
|
def create_pr
|
|
87
|
+
repo = "Shopify/shopify-cli"
|
|
77
88
|
github.create_pull_request(
|
|
78
|
-
|
|
89
|
+
repo,
|
|
79
90
|
"main",
|
|
80
91
|
release_branch_name,
|
|
81
92
|
"Packaging for release v#{new_version}",
|
|
82
|
-
release_notes
|
|
83
|
-
).tap { |results| puts "Created PR ##{results["number"]}" }
|
|
93
|
+
release_notes(new_version)
|
|
94
|
+
).tap { |results| puts "Created #{repo} PR ##{results["number"]}" }
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def ensure_correct_gem_version
|
|
98
|
+
response = Net::HTTP.get(URI("https://rubygems.org/api/v1/versions/shopify-cli/latest.json"))
|
|
99
|
+
latest_version = JSON.parse(response)["version"]
|
|
100
|
+
unless latest_version == new_version
|
|
101
|
+
raise "Attempted to update to #{new_version}, but latest on RubyGems is #{latest_version}"
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def update_homebrew
|
|
106
|
+
ensure_updated_homebrew_repo
|
|
107
|
+
update_homebrew_repo
|
|
108
|
+
pr = create_homebrew_pr
|
|
109
|
+
system("open #{pr["html_url"]}")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
def ensure_updated_homebrew_repo
|
|
113
|
+
unless File.exist?(homebrew_path)
|
|
114
|
+
system_or_fail("/opt/dev/bin/dev clone homebrew-shopify", "clone homebrew-shopify repo")
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
Dir.chdir(homebrew_path) do
|
|
118
|
+
system_or_fail("git checkout master && git pull", "pull latest homebrew-shopify")
|
|
119
|
+
system_or_fail("git checkout -b #{homebrew_release_branch}", "check out homebrew branch")
|
|
120
|
+
end
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
def update_homebrew_repo
|
|
124
|
+
source_file = File.join(package_dir, "shopify-cli.rb")
|
|
125
|
+
FileUtils.copy(source_file, homebrew_path)
|
|
126
|
+
Dir.chdir(homebrew_path) do
|
|
127
|
+
system_or_fail("git commit -am '#{homebrew_update_message}'", "commit homebrew update")
|
|
128
|
+
system_or_fail("git push -u origin #{homebrew_release_branch}", "push homebrew branch")
|
|
129
|
+
end
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
def create_homebrew_pr
|
|
133
|
+
repo = "Shopify/homebrew-shopify"
|
|
134
|
+
github.create_pull_request(
|
|
135
|
+
repo,
|
|
136
|
+
"master",
|
|
137
|
+
homebrew_release_branch,
|
|
138
|
+
homebrew_update_message,
|
|
139
|
+
homebrew_release_notes
|
|
140
|
+
).tap { |results| puts "Created #{repo} PR ##{results["number"]}" }
|
|
141
|
+
end
|
|
142
|
+
|
|
143
|
+
def create_github_release
|
|
144
|
+
release = github.create_release(
|
|
145
|
+
"Shopify/shopify-cli",
|
|
146
|
+
"v#{new_version}",
|
|
147
|
+
{
|
|
148
|
+
name: "Version #{new_version}",
|
|
149
|
+
body: release_notes(new_version),
|
|
150
|
+
}
|
|
151
|
+
)
|
|
152
|
+
%w(.deb -1.noarch.rpm).each do |suffix|
|
|
153
|
+
github.upload_asset(
|
|
154
|
+
release["url"],
|
|
155
|
+
File.join(package_dir, "shopify-cli-#{new_version}#{suffix}")
|
|
156
|
+
)
|
|
157
|
+
end
|
|
158
|
+
system("open #{release["html_url"]}")
|
|
159
|
+
end
|
|
160
|
+
|
|
161
|
+
def homebrew_path
|
|
162
|
+
@homebrew_path ||= %x(/opt/dev/bin/dev project-path homebrew-shopify).chomp
|
|
163
|
+
end
|
|
164
|
+
|
|
165
|
+
def homebrew_update_message
|
|
166
|
+
@homebrew_update_message ||= "Update Shopify CLI to #{new_version}"
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
def package_dir
|
|
170
|
+
@package_dir ||= File.join(ShopifyCLI::ROOT, "packaging", "builds", new_version)
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def homebrew_release_branch
|
|
174
|
+
"release_#{new_version.split(".").join("_")}_of_shopify-cli"
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
def homebrew_release_notes
|
|
178
|
+
"I'm releasing a new version of the Shopify CLI, " \
|
|
179
|
+
"[#{new_version}](https://github.com/Shopify/shopify-cli/releases/tag/v#{new_version})"
|
|
84
180
|
end
|
|
85
181
|
|
|
86
182
|
def release_branch_name
|
|
87
183
|
@release_branch_name ||= "release_#{new_version.split(".").join("_")}"
|
|
88
184
|
end
|
|
89
185
|
|
|
90
|
-
def release_notes
|
|
91
|
-
|
|
186
|
+
def release_notes(version)
|
|
187
|
+
changelog.release_notes(version)
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
def system_or_fail(command, action)
|
|
191
|
+
raise "Failed to #{action}!" unless system(command)
|
|
92
192
|
end
|
|
93
193
|
end
|
|
94
194
|
end
|
|
@@ -109,7 +109,9 @@ module ShopifyCLI
|
|
|
109
109
|
|
|
110
110
|
def check_ruby
|
|
111
111
|
ruby_version = Environment.ruby_version(context: context)
|
|
112
|
-
return if ruby_version.satisfies?("~>2.5") ||
|
|
112
|
+
return if ruby_version.satisfies?("~>2.5") ||
|
|
113
|
+
ruby_version.satisfies?("~>3.0.0") ||
|
|
114
|
+
ruby_version.satisfies?("~>3.1.0")
|
|
113
115
|
context.abort(context.message("core.app.create.rails.error.invalid_ruby_version"))
|
|
114
116
|
end
|
|
115
117
|
|
|
@@ -205,6 +207,12 @@ module ShopifyCLI
|
|
|
205
207
|
end
|
|
206
208
|
|
|
207
209
|
def set_custom_ua
|
|
210
|
+
requires_ua_file = Dir.chdir(context.root) do
|
|
211
|
+
context.ruby_gem_version("shopify_app") < ::Semantic::Version.new("19.0.0")
|
|
212
|
+
end
|
|
213
|
+
|
|
214
|
+
return unless requires_ua_file
|
|
215
|
+
|
|
208
216
|
ua_path = File.join("config", "initializers", "user_agent.rb")
|
|
209
217
|
context.write(ua_path, USER_AGENT_CODE)
|
|
210
218
|
end
|
|
@@ -2,32 +2,9 @@ module ShopifyCLI
|
|
|
2
2
|
module Services
|
|
3
3
|
module App
|
|
4
4
|
module Serve
|
|
5
|
-
class NodeService <
|
|
6
|
-
attr_accessor :host, :port, :context
|
|
7
|
-
|
|
8
|
-
def initialize(host:, port:, context:)
|
|
9
|
-
@host = host
|
|
10
|
-
@port = port
|
|
11
|
-
@context = context
|
|
12
|
-
super()
|
|
13
|
-
end
|
|
14
|
-
|
|
5
|
+
class NodeService < ServeService
|
|
15
6
|
def call
|
|
16
|
-
|
|
17
|
-
url = host || ShopifyCLI::Tunnel.start(context, port: port)
|
|
18
|
-
raise ShopifyCLI::Abort,
|
|
19
|
-
context.message("core.app.serve.error.host_must_be_https") if url.match(/^https/i).nil?
|
|
20
|
-
project.env.update(context, :host, url)
|
|
21
|
-
ShopifyCLI::Tasks::UpdateDashboardURLS.call(
|
|
22
|
-
context,
|
|
23
|
-
url: url,
|
|
24
|
-
callback_url: "/auth/callback",
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
if project.env.shop
|
|
28
|
-
project_url = "#{project.env.host}/auth?shop=#{project.env.shop}"
|
|
29
|
-
context.puts("\n" + context.message("core.app.serve.open_info", project_url) + "\n")
|
|
30
|
-
end
|
|
7
|
+
generate_url
|
|
31
8
|
|
|
32
9
|
CLI::UI::Frame.open(context.message("core.app.serve.running_server")) do
|
|
33
10
|
env = project.env.to_h
|
|
@@ -2,32 +2,9 @@ module ShopifyCLI
|
|
|
2
2
|
module Services
|
|
3
3
|
module App
|
|
4
4
|
module Serve
|
|
5
|
-
class PHPService <
|
|
6
|
-
attr_accessor :host, :port, :context
|
|
7
|
-
|
|
8
|
-
def initialize(host:, port:, context:)
|
|
9
|
-
@host = host
|
|
10
|
-
@port = port
|
|
11
|
-
@context = context
|
|
12
|
-
super()
|
|
13
|
-
end
|
|
14
|
-
|
|
5
|
+
class PHPService < ServeService
|
|
15
6
|
def call
|
|
16
|
-
|
|
17
|
-
url = host || ShopifyCLI::Tunnel.start(context, port: port)
|
|
18
|
-
raise ShopifyCLI::Abort,
|
|
19
|
-
context.message("core.app.serve.error.host_must_be_https") if url.match(/^https/i).nil?
|
|
20
|
-
project.env.update(context, :host, url)
|
|
21
|
-
ShopifyCLI::Tasks::UpdateDashboardURLS.call(
|
|
22
|
-
context,
|
|
23
|
-
url: url,
|
|
24
|
-
callback_url: "/auth/callback",
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
if project.env.shop
|
|
28
|
-
project_url = "#{project.env.host}/login?shop=#{project.env.shop}"
|
|
29
|
-
context.puts("\n" + context.message("core.app.serve.open_info", project_url) + "\n")
|
|
30
|
-
end
|
|
7
|
+
generate_url
|
|
31
8
|
|
|
32
9
|
CLI::UI::Frame.open(context.message("core.app.serve.running_server")) do
|
|
33
10
|
if ShopifyCLI::ProcessSupervision.running?(:npm_watch)
|
|
@@ -2,38 +2,18 @@ module ShopifyCLI
|
|
|
2
2
|
module Services
|
|
3
3
|
module App
|
|
4
4
|
module Serve
|
|
5
|
-
class RailsService <
|
|
6
|
-
attr_accessor :host, :port, :context
|
|
7
|
-
|
|
8
|
-
def initialize(host:, port:, context:)
|
|
9
|
-
@host = host
|
|
10
|
-
@port = port
|
|
11
|
-
@context = context
|
|
12
|
-
super()
|
|
13
|
-
end
|
|
14
|
-
|
|
5
|
+
class RailsService < ServeService
|
|
15
6
|
def call
|
|
16
|
-
|
|
17
|
-
url = host || ShopifyCLI::Tunnel.start(context, port: port)
|
|
18
|
-
raise ShopifyCLI::Abort,
|
|
19
|
-
context.message("core.app.serve.error.host_must_be_https") if url.match(/^https/i).nil?
|
|
20
|
-
project.env.update(context, :host, url)
|
|
21
|
-
ShopifyCLI::Tasks::UpdateDashboardURLS.call(
|
|
22
|
-
context,
|
|
23
|
-
url: url,
|
|
24
|
-
callback_url: "/auth/shopify/callback",
|
|
25
|
-
)
|
|
26
|
-
|
|
27
|
-
if project.env.shop
|
|
28
|
-
project_url = "#{project.env.host}/login?shop=#{project.env.shop}"
|
|
29
|
-
context.puts("\n" + context.message("core.app.serve.open_info", project_url) + "\n")
|
|
30
|
-
end
|
|
7
|
+
generate_url
|
|
31
8
|
|
|
32
9
|
CLI::UI::Frame.open(context.message("core.app.serve.running_server")) do
|
|
33
|
-
|
|
34
|
-
env.
|
|
10
|
+
original_env = JSON.parse(ENV["ORIGINAL_ENV"] || "{}")
|
|
11
|
+
env = original_env.merge(ShopifyCLI::Project.current.env.to_h)
|
|
12
|
+
env.delete("HOST") if context.ruby_gem_version("shopify_app") < ::Semantic::Version.new("19.0.0")
|
|
35
13
|
env["PORT"] = port.to_s
|
|
36
|
-
env["GEM_PATH"] =
|
|
14
|
+
env["GEM_PATH"] =
|
|
15
|
+
[env["GEM_PATH"], Rails::Gem.gem_path(context)].compact
|
|
16
|
+
.join(CLI::UI::OS.current.path_separator)
|
|
37
17
|
if context.windows?
|
|
38
18
|
context.system("ruby bin\\rails server", env: env)
|
|
39
19
|
else
|