shopify-cli 2.6.1 → 2.6.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/PULL_REQUEST_TEMPLATE.md +15 -4
- data/.github/workflows/shopify.yml +3 -6
- data/CHANGELOG.md +79 -97
- data/Dockerfile +12 -2
- data/Gemfile +1 -0
- data/Gemfile.lock +5 -3
- data/RELEASING.md +17 -30
- data/Rakefile +0 -5
- data/ext/shopify-cli/extconf.rb +0 -1
- data/lib/project_types/extension/features/argo.rb +8 -2
- data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +1 -1
- data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +1 -1
- data/lib/project_types/node/commands/serve.rb +7 -16
- data/lib/project_types/node/messages/messages.rb +0 -5
- data/lib/project_types/php/commands/serve.rb +6 -9
- data/lib/project_types/php/messages/messages.rb +1 -4
- data/lib/project_types/rails/commands/serve.rb +7 -8
- data/lib/project_types/rails/messages/messages.rb +1 -4
- data/lib/project_types/script/commands/create.rb +3 -1
- data/lib/project_types/script/config/extension_points.yml +7 -0
- data/lib/project_types/script/graphql/app_script_set.graphql +2 -0
- data/lib/project_types/script/layers/application/build_script.rb +2 -1
- data/lib/project_types/script/layers/application/push_script.rb +15 -1
- data/lib/project_types/script/layers/domain/push_package.rb +5 -2
- data/lib/project_types/script/layers/infrastructure/errors.rb +17 -0
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb +29 -13
- data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +4 -13
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +4 -2
- data/lib/project_types/script/layers/infrastructure/script_service.rb +6 -1
- data/lib/project_types/script/messages/messages.rb +6 -4
- data/lib/project_types/script/ui/error_handler.rb +16 -0
- data/lib/project_types/theme/commands/serve.rb +1 -0
- data/lib/project_types/theme/messages/messages.rb +5 -0
- data/lib/shopify_cli/app_type_detector.rb +32 -0
- data/lib/shopify_cli/command.rb +6 -1
- data/lib/shopify_cli/command_options/command_serve_options.rb +43 -0
- data/lib/shopify_cli/command_options.rb +7 -0
- data/lib/shopify_cli/commands/login.rb +3 -3
- data/lib/shopify_cli/commands/reporting.rb +38 -0
- data/lib/shopify_cli/commands/switch.rb +1 -1
- data/lib/shopify_cli/commands.rb +1 -0
- data/lib/shopify_cli/constants.rb +7 -3
- data/lib/shopify_cli/core/monorail.rb +9 -20
- data/lib/shopify_cli/environment.rb +15 -1
- data/lib/shopify_cli/exception_reporter.rb +25 -14
- data/lib/shopify_cli/messages/messages.rb +48 -19
- data/lib/shopify_cli/migrator/migration.rb +1 -1
- data/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +1 -1
- data/lib/shopify_cli/migrator/migrations/1633691650_merge_reporting_configuration.rb +41 -0
- data/lib/shopify_cli/reporting_configuration_controller.rb +64 -0
- data/lib/shopify_cli/services/base_service.rb +13 -0
- data/lib/shopify_cli/services/reporting_service.rb +16 -0
- data/lib/shopify_cli/services.rb +6 -0
- data/lib/shopify_cli/theme/dev_server/watcher.rb +2 -2
- data/lib/shopify_cli/theme/dev_server.rb +2 -2
- data/lib/shopify_cli/version.rb +1 -1
- data/lib/shopify_cli.rb +4 -0
- data/shopify-cli.gemspec +1 -8
- data/utilities/docker/container.rb +76 -0
- data/utilities/docker.rb +44 -3
- metadata +14 -5
- data/lib/shopify_cli/exception_reporter/permission_controller.rb +0 -54
@@ -15,10 +15,10 @@ module ShopifyCLI
|
|
15
15
|
|
16
16
|
module Config
|
17
17
|
module Sections
|
18
|
-
module
|
19
|
-
NAME = "
|
18
|
+
module Analytics
|
19
|
+
NAME = "analytics"
|
20
20
|
module Fields
|
21
|
-
|
21
|
+
ENABLED = "enabled"
|
22
22
|
end
|
23
23
|
end
|
24
24
|
end
|
@@ -39,7 +39,11 @@ module ShopifyCLI
|
|
39
39
|
|
40
40
|
# Environments
|
41
41
|
TEST = "SHOPIFY_CLI_TEST"
|
42
|
+
ACCEPTANCE_TEST = "SHOPIFY_CLI_ACCEPTANCE_TEST"
|
42
43
|
DEVELOPMENT = "SHOPIFY_CLI_DEVELOPMENT"
|
44
|
+
|
45
|
+
# Monorail
|
46
|
+
MONORAIL_REAL_EVENTS = "MONORAIL_REAL_EVENTS"
|
43
47
|
end
|
44
48
|
|
45
49
|
module Identity
|
@@ -16,9 +16,6 @@ module ShopifyCLI
|
|
16
16
|
attr_accessor :metadata
|
17
17
|
|
18
18
|
def log(name, args, &block) # rubocop:disable Lint/UnusedMethodArgument
|
19
|
-
prompt_for_consent
|
20
|
-
return yield unless enabled? && consented?
|
21
|
-
|
22
19
|
command, command_name = Commands::Registry.lookup_command(name)
|
23
20
|
final_command = [command_name]
|
24
21
|
if command
|
@@ -28,13 +25,18 @@ module ShopifyCLI
|
|
28
25
|
|
29
26
|
start_time = now_in_milliseconds
|
30
27
|
err = nil
|
28
|
+
|
31
29
|
begin
|
32
30
|
yield
|
33
31
|
rescue Exception => e # rubocop:disable Lint/RescueException
|
34
32
|
err = e
|
35
33
|
raise
|
36
34
|
ensure
|
37
|
-
|
35
|
+
# If there's an error, we don't prompt from here and we let the exception
|
36
|
+
# reporter do that.
|
37
|
+
if report?(prompt: err.nil?)
|
38
|
+
send_event(start_time, final_command, args - final_command, err&.message)
|
39
|
+
end
|
38
40
|
end
|
39
41
|
end
|
40
42
|
|
@@ -44,22 +46,9 @@ module ShopifyCLI
|
|
44
46
|
(Time.now.utc.to_f * 1000).to_i
|
45
47
|
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
(
|
50
|
-
end
|
51
|
-
|
52
|
-
def consented?
|
53
|
-
ShopifyCLI::Config.get_bool("analytics", "enabled")
|
54
|
-
end
|
55
|
-
|
56
|
-
def prompt_for_consent
|
57
|
-
return if Context.new.ci?
|
58
|
-
return unless enabled?
|
59
|
-
return if ShopifyCLI::Config.get_section("analytics").key?("enabled")
|
60
|
-
msg = Context.message("core.monorail.consent_prompt")
|
61
|
-
opt = CLI::UI::Prompt.confirm(msg)
|
62
|
-
ShopifyCLI::Config.set("analytics", "enabled", opt)
|
49
|
+
def report?(prompt:)
|
50
|
+
return true if Environment.send_monorail_events?
|
51
|
+
ReportingConfigurationController.check_or_prompt_report_automatically(source: :usage, prompt: prompt)
|
63
52
|
end
|
64
53
|
|
65
54
|
def send_event(start_time, commands, args, err = nil)
|
@@ -26,7 +26,7 @@ module ShopifyCLI
|
|
26
26
|
env_variable_truthy?(
|
27
27
|
Constants::EnvironmentVariables::STACKTRACE,
|
28
28
|
env_variables: env_variables
|
29
|
-
)
|
29
|
+
) || development?(env_variables: env_variables)
|
30
30
|
end
|
31
31
|
|
32
32
|
def self.test?(env_variables: ENV)
|
@@ -36,6 +36,13 @@ module ShopifyCLI
|
|
36
36
|
)
|
37
37
|
end
|
38
38
|
|
39
|
+
def self.acceptance_test?(env_variables: ENV)
|
40
|
+
env_variable_truthy?(
|
41
|
+
Constants::EnvironmentVariables::ACCEPTANCE_TEST,
|
42
|
+
env_variables: env_variables
|
43
|
+
)
|
44
|
+
end
|
45
|
+
|
39
46
|
def self.print_backtrace?(env_variables: ENV)
|
40
47
|
env_variable_truthy?(
|
41
48
|
Constants::EnvironmentVariables::BACKTRACE,
|
@@ -72,6 +79,13 @@ module ShopifyCLI
|
|
72
79
|
"#{spin_workspace}.#{spin_namespace}.#{spin_host}"
|
73
80
|
end
|
74
81
|
|
82
|
+
def self.send_monorail_events?(env_variables: ENV)
|
83
|
+
env_variable_truthy?(
|
84
|
+
Constants::EnvironmentVariables::MONORAIL_REAL_EVENTS,
|
85
|
+
env_variables: env_variables
|
86
|
+
)
|
87
|
+
end
|
88
|
+
|
75
89
|
def self.env_variable_truthy?(variable_name, env_variables: ENV)
|
76
90
|
TRUTHY_ENV_VARIABLE_VALUES.include?(env_variables[variable_name.to_s])
|
77
91
|
end
|
@@ -1,20 +1,23 @@
|
|
1
1
|
module ShopifyCLI
|
2
2
|
module ExceptionReporter
|
3
|
-
autoload :PermissionController, "shopify_cli/exception_reporter/permission_controller"
|
4
|
-
|
5
3
|
def self.report(error, _logs = nil, _api_key = nil, custom_metadata = {})
|
6
4
|
context = ShopifyCLI::Context.new
|
7
|
-
|
8
|
-
|
9
|
-
|
5
|
+
|
6
|
+
unless ShopifyCLI::Environment.development?
|
7
|
+
context.puts(context.message("core.error_reporting.unhandled_error.message"))
|
8
|
+
context.puts(context.message("core.error_reporting.unhandled_error.issue_message"))
|
9
|
+
end
|
10
|
+
|
11
|
+
# Stack trace hint
|
10
12
|
unless ShopifyCLI::Environment.print_stacktrace?
|
11
13
|
context.puts(context.message("core.error_reporting.unhandled_error.stacktrace_message",
|
12
14
|
"#{ShopifyCLI::Constants::EnvironmentVariables::STACKTRACE}=1"))
|
13
15
|
end
|
16
|
+
|
14
17
|
context.puts("\n")
|
15
18
|
|
16
19
|
return unless reportable_error?(error)
|
17
|
-
return unless report?
|
20
|
+
return unless report?(context: context)
|
18
21
|
|
19
22
|
ENV["BUGSNAG_DISABLE_AUTOCONFIGURE"] = "1"
|
20
23
|
require "bugsnag"
|
@@ -30,23 +33,31 @@ module ShopifyCLI
|
|
30
33
|
|
31
34
|
metadata = {}
|
32
35
|
metadata.merge!(custom_metadata)
|
33
|
-
|
36
|
+
Bugsnag.notify(error, metadata)
|
34
37
|
end
|
35
38
|
|
36
|
-
def self.report?
|
37
|
-
|
38
|
-
|
39
|
-
ExceptionReporter::PermissionController.can_report_automatically?
|
39
|
+
def self.report?(context:)
|
40
|
+
return true if ReportingConfigurationController.reporting_prompted? &&
|
41
|
+
ReportingConfigurationController.check_or_prompt_report_automatically(source: :uncaught_error)
|
40
42
|
|
41
|
-
report_error =
|
43
|
+
report_error = report_error?(context: context)
|
42
44
|
|
43
|
-
unless
|
44
|
-
|
45
|
+
unless ReportingConfigurationController.reporting_prompted?
|
46
|
+
ReportingConfigurationController.check_or_prompt_report_automatically(source: :uncaught_error)
|
45
47
|
end
|
46
48
|
|
47
49
|
report_error
|
48
50
|
end
|
49
51
|
|
52
|
+
def self.report_error?(context:)
|
53
|
+
return false if Environment.development?
|
54
|
+
|
55
|
+
CLI::UI::Prompt.ask(context.message("core.error_reporting.report_error.question")) do |handler|
|
56
|
+
handler.option(context.message("core.error_reporting.report_error.yes")) { |_| true }
|
57
|
+
handler.option(context.message("core.error_reporting.report_error.no")) { |_| false }
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
50
61
|
def self.reportable_error?(error)
|
51
62
|
is_abort = error.is_a?(ShopifyCLI::Abort) || error.is_a?(ShopifyCLI::AbortSilent)
|
52
63
|
!is_abort
|
@@ -14,6 +14,18 @@ module ShopifyCLI
|
|
14
14
|
},
|
15
15
|
},
|
16
16
|
core: {
|
17
|
+
app: {
|
18
|
+
serve: {
|
19
|
+
error: {
|
20
|
+
invalid_port: "%s is not a valid port.",
|
21
|
+
host_must_be_https: "HOST must be a HTTPS url.",
|
22
|
+
},
|
23
|
+
},
|
24
|
+
help: <<~HELP,
|
25
|
+
Create and manage embedded apps
|
26
|
+
Usage: {{command:%s app [ rails | node | php ] }}
|
27
|
+
HELP
|
28
|
+
},
|
17
29
|
error_reporting: {
|
18
30
|
unhandled_error: {
|
19
31
|
message: "{{x}} {{red:An unexpected error occured.}}",
|
@@ -21,16 +33,25 @@ module ShopifyCLI
|
|
21
33
|
" include the stack trace.}}",
|
22
34
|
stacktrace_message: "{{red:\tTo print the stack trace, add the environment variable %s.}}",
|
23
35
|
},
|
24
|
-
enable_automatic_reporting_prompt: {
|
25
|
-
question: "Automatically send error reports moving forward?",
|
26
|
-
yes: "Automatically send error reports to the Shopify team",
|
27
|
-
no: "Don't send error reports",
|
28
|
-
enabled: "Anonymized error reports will be sent to Shopify.",
|
29
|
-
},
|
30
36
|
report_error: {
|
31
|
-
question: "Send an error report to Shopify?",
|
32
|
-
yes: "
|
33
|
-
no: "
|
37
|
+
question: "Send an anonymized error report to Shopify?",
|
38
|
+
yes: "Yes, send",
|
39
|
+
no: "No, don't send",
|
40
|
+
},
|
41
|
+
},
|
42
|
+
analytics: {
|
43
|
+
enable_prompt: {
|
44
|
+
uncaught_error: {
|
45
|
+
question: "Automatically send reports from now on?",
|
46
|
+
yes: "Yes, automatically send anonymized reports to Shopify",
|
47
|
+
no: "No, don't send",
|
48
|
+
},
|
49
|
+
usage: {
|
50
|
+
question: "Automatically send anonymized usage and error reports to Shopify? We use these"\
|
51
|
+
" to make development on Shopify better.",
|
52
|
+
yes: "Yes, automatically send anonymized reports to Shopify",
|
53
|
+
no: "No, don't send",
|
54
|
+
},
|
34
55
|
},
|
35
56
|
},
|
36
57
|
connect: {
|
@@ -168,15 +189,6 @@ module ShopifyCLI
|
|
168
189
|
disabled_as_shopify_org: "Can't switch development stores logged in as {{green:Shopify partners org}}",
|
169
190
|
success: "Switched development store to {{green:%s}}",
|
170
191
|
},
|
171
|
-
|
172
|
-
monorail: {
|
173
|
-
consent_prompt: <<~MSG,
|
174
|
-
Would you like to enable anonymous usage reporting?
|
175
|
-
If you select “Yes”, we’ll collect data about which commands you use and which errors you encounter.
|
176
|
-
Sharing this anonymous data helps Shopify improve this tool.
|
177
|
-
MSG
|
178
|
-
},
|
179
|
-
|
180
192
|
identity_auth: {
|
181
193
|
error: {
|
182
194
|
timeout: "Timed out while waiting for response from Shopify",
|
@@ -493,7 +505,24 @@ module ShopifyCLI
|
|
493
505
|
|
494
506
|
MESSAGE
|
495
507
|
},
|
496
|
-
|
508
|
+
reporting: {
|
509
|
+
help: <<~HELP,
|
510
|
+
Turns anonymous reporting on or off.
|
511
|
+
Usage: {{command:%s reporting on}}
|
512
|
+
HELP
|
513
|
+
invalid_argument: <<~MESSAGE,
|
514
|
+
{{command:%s reporting %s}} is not supported. The valid values are {{command:on}} or {{command:off}}
|
515
|
+
MESSAGE
|
516
|
+
missing_argument: <<~MESSAGE,
|
517
|
+
{{command:%s reporting}} expects an argument {{command:on}} or {{command:off}}
|
518
|
+
MESSAGE
|
519
|
+
turned_on_message: <<~MESSAGE,
|
520
|
+
Anonymized reports will be sent to Shopify.
|
521
|
+
MESSAGE
|
522
|
+
turned_off_message: <<~MESSAGE,
|
523
|
+
Turn on automatic reporting later wtih {{command:%s reporting on}}.
|
524
|
+
MESSAGE
|
525
|
+
},
|
497
526
|
whoami: {
|
498
527
|
help: <<~HELP,
|
499
528
|
Identifies which partner organization or store you are currently logged into.
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module ShopifyCLI
|
4
|
+
module Migrator
|
5
|
+
module Migrations
|
6
|
+
# Before this migration, users configured automatic usage and error
|
7
|
+
# reporting independenty. We changed it to be a single configuration
|
8
|
+
# in the environment's configuration and therefore we need a migration
|
9
|
+
# to merge the configurations.
|
10
|
+
class MergeReportingConfiguration
|
11
|
+
def self.run
|
12
|
+
analytics_enabled = ShopifyCLI::Config.get_bool(
|
13
|
+
Constants::Config::Sections::Analytics::NAME,
|
14
|
+
Constants::Config::Sections::Analytics::Fields::ENABLED,
|
15
|
+
default: false
|
16
|
+
)
|
17
|
+
error_reporting_enabled = ShopifyCLI::Config.get_bool(
|
18
|
+
"error-tracking",
|
19
|
+
"automatic-reporting",
|
20
|
+
default: false
|
21
|
+
)
|
22
|
+
# Because we are merging configuration options, both need
|
23
|
+
# to be true to for the new flag to be true. Otherwise,
|
24
|
+
# we delete them and let the CLI prompt the user again.
|
25
|
+
should_merge_be_true = analytics_enabled && error_reporting_enabled
|
26
|
+
|
27
|
+
unless should_merge_be_true
|
28
|
+
ShopifyCLI::Config.unset(
|
29
|
+
Constants::Config::Sections::Analytics::NAME,
|
30
|
+
Constants::Config::Sections::Analytics::Fields::ENABLED
|
31
|
+
)
|
32
|
+
ShopifyCLI::Config.unset(
|
33
|
+
"error-tracking",
|
34
|
+
"automatic-reporting"
|
35
|
+
)
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,64 @@
|
|
1
|
+
module ShopifyCLI
|
2
|
+
module ReportingConfigurationController
|
3
|
+
def self.enable_reporting(enabled)
|
4
|
+
ShopifyCLI::Config.set(
|
5
|
+
Constants::Config::Sections::Analytics::NAME,
|
6
|
+
Constants::Config::Sections::Analytics::Fields::ENABLED,
|
7
|
+
enabled
|
8
|
+
)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.reporting_prompted?
|
12
|
+
ShopifyCLI::Config.get_section(Constants::Config::Sections::Analytics::NAME).key?(
|
13
|
+
Constants::Config::Sections::Analytics::Fields::ENABLED
|
14
|
+
)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.reporting_enabled?
|
18
|
+
ShopifyCLI::Config.get_bool(
|
19
|
+
Constants::Config::Sections::Analytics::NAME,
|
20
|
+
Constants::Config::Sections::Analytics::Fields::ENABLED,
|
21
|
+
default: false
|
22
|
+
)
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.check_or_prompt_report_automatically(source: :usage, prompt: true, context: ShopifyCLI::Context.new)
|
26
|
+
return false if ShopifyCLI::Environment.development? || ShopifyCLI::Environment.test?
|
27
|
+
|
28
|
+
# If the terminal is not interactive we can't prompt the user.
|
29
|
+
return false unless ShopifyCLI::Environment.interactive?
|
30
|
+
|
31
|
+
if reporting_prompted?
|
32
|
+
reporting_enabled?
|
33
|
+
elsif prompt
|
34
|
+
prompt_user(context: context, source: source)
|
35
|
+
else
|
36
|
+
false
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def self.prompt_user(context:, source:)
|
41
|
+
enable_automatic_tracking = CLI::UI::Prompt.ask(
|
42
|
+
context.message("core.analytics.enable_prompt.#{source}.question")
|
43
|
+
) do |handler|
|
44
|
+
handler.option(context.message("core.analytics.enable_prompt.#{source}.yes")) { |_| true }
|
45
|
+
handler.option(context.message("core.analytics.enable_prompt.#{source}.no")) { |_| false }
|
46
|
+
end
|
47
|
+
|
48
|
+
ShopifyCLI::Config.set(
|
49
|
+
Constants::Config::Sections::Analytics::NAME,
|
50
|
+
Constants::Config::Sections::Analytics::Fields::ENABLED,
|
51
|
+
enable_automatic_tracking
|
52
|
+
)
|
53
|
+
|
54
|
+
message = if enable_automatic_tracking
|
55
|
+
context.message("core.reporting.turned_on_message")
|
56
|
+
else
|
57
|
+
context.message("core.reporting.turned_off_message", ShopifyCLI::TOOL_NAME)
|
58
|
+
end
|
59
|
+
context.puts(message)
|
60
|
+
|
61
|
+
enable_automatic_tracking
|
62
|
+
end
|
63
|
+
end
|
64
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
module ShopifyCLI
|
2
|
+
module Services
|
3
|
+
class ReportingService < BaseService
|
4
|
+
attr_reader :enable
|
5
|
+
|
6
|
+
def initialize(enable:)
|
7
|
+
@enable = enable
|
8
|
+
super()
|
9
|
+
end
|
10
|
+
|
11
|
+
def call
|
12
|
+
ReportingConfigurationController.enable_reporting(enable)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -9,12 +9,12 @@ module ShopifyCLI
|
|
9
9
|
class Watcher
|
10
10
|
include Observable
|
11
11
|
|
12
|
-
def initialize(ctx, theme:, syncer:, ignore_filter: nil)
|
12
|
+
def initialize(ctx, theme:, syncer:, ignore_filter: nil, poll: false)
|
13
13
|
@ctx = ctx
|
14
14
|
@theme = theme
|
15
15
|
@syncer = syncer
|
16
16
|
@ignore_filter = ignore_filter
|
17
|
-
@listener = Listen.to(@theme.root) do |modified, added, removed|
|
17
|
+
@listener = Listen.to(@theme.root, force_polling: poll) do |modified, added, removed|
|
18
18
|
changed
|
19
19
|
notify_observers(modified, added, removed)
|
20
20
|
end
|
@@ -20,12 +20,12 @@ 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, poll: false)
|
24
24
|
@ctx = ctx
|
25
25
|
theme = DevelopmentTheme.new(ctx, root: root)
|
26
26
|
ignore_filter = IgnoreFilter.from_path(root)
|
27
27
|
@syncer = Syncer.new(ctx, theme: theme, ignore_filter: ignore_filter)
|
28
|
-
watcher = Watcher.new(ctx, theme: theme, syncer: @syncer, ignore_filter: ignore_filter)
|
28
|
+
watcher = Watcher.new(ctx, theme: theme, syncer: @syncer, ignore_filter: ignore_filter, poll: poll)
|
29
29
|
|
30
30
|
# Setup the middleware stack. Mimics Rack::Builder / config.ru, but in reverse order
|
31
31
|
@app = Proxy.new(ctx, theme: theme, syncer: @syncer)
|
data/lib/shopify_cli/version.rb
CHANGED
data/lib/shopify_cli.rb
CHANGED
@@ -96,11 +96,13 @@ module ShopifyCLI
|
|
96
96
|
)
|
97
97
|
end
|
98
98
|
|
99
|
+
autoload :AppTypeDetector, "shopify_cli/app_type_detector"
|
99
100
|
autoload :Constants, "shopify_cli/constants"
|
100
101
|
autoload :Environment, "shopify_cli/environment"
|
101
102
|
autoload :AdminAPI, "shopify_cli/admin_api"
|
102
103
|
autoload :API, "shopify_cli/api"
|
103
104
|
autoload :Command, "shopify_cli/command"
|
105
|
+
autoload :CommandOptions, "shopify_cli/command_options"
|
104
106
|
autoload :Commands, "shopify_cli/commands"
|
105
107
|
autoload :Connect, "shopify_cli/connect"
|
106
108
|
autoload :Context, "shopify_cli/context"
|
@@ -123,9 +125,11 @@ module ShopifyCLI
|
|
123
125
|
autoload :Project, "shopify_cli/project"
|
124
126
|
autoload :ProjectCommands, "shopify_cli/project_commands"
|
125
127
|
autoload :ProjectType, "shopify_cli/project_type"
|
128
|
+
autoload :ReportingConfigurationController, "shopify_cli/reporting_configuration_controller"
|
126
129
|
autoload :ResolveConstant, "shopify_cli/resolve_constant"
|
127
130
|
autoload :Resources, "shopify_cli/resources"
|
128
131
|
autoload :Result, "shopify_cli/result"
|
132
|
+
autoload :Services, "shopify_cli/services"
|
129
133
|
autoload :Shopifolk, "shopify_cli/shopifolk"
|
130
134
|
autoload :SubCommand, "shopify_cli/sub_command"
|
131
135
|
autoload :Task, "shopify_cli/task"
|
data/shopify-cli.gemspec
CHANGED
@@ -45,12 +45,5 @@ Gem::Specification.new do |spec|
|
|
45
45
|
|
46
46
|
spec.add_dependency("bugsnag", "~> 6.22")
|
47
47
|
spec.add_dependency("listen", "~> 3.7.0")
|
48
|
-
|
49
|
-
# Note: theme-check is _intentionally_ not specifying the third
|
50
|
-
# digit. We _want_ new features to make their way into new installs
|
51
|
-
# of the Shopify CLI. Otherwise updates need to be released twice.
|
52
|
-
#
|
53
|
-
# That is, DO USE ~> 1.X, DO NOT USE ~> 1.X.Y, this would unnecessarily
|
54
|
-
# fix the feature version.
|
55
|
-
spec.add_dependency("theme-check", "~> 1.7")
|
48
|
+
spec.add_dependency("theme-check", "~> 1.7.2")
|
56
49
|
end
|
@@ -0,0 +1,76 @@
|
|
1
|
+
require "open3"
|
2
|
+
|
3
|
+
module Utilities
|
4
|
+
module Docker
|
5
|
+
class Container
|
6
|
+
SHOPIFY_BIN_PATH = "/usr/src/app/bin/shopify"
|
7
|
+
|
8
|
+
Error = Class.new(StandardError)
|
9
|
+
|
10
|
+
attr_reader :id, :env, :cwd, :xdg_config_home, :xdg_cache_home
|
11
|
+
|
12
|
+
def initialize(id:, env:, cwd:)
|
13
|
+
@id = id
|
14
|
+
@cwd = cwd
|
15
|
+
@xdg_config_home = File.join(cwd, ".config")
|
16
|
+
@xdg_cache_home = File.join(cwd, ".cache")
|
17
|
+
@env = env.merge({
|
18
|
+
"XDG_CONFIG_HOME" => @xdg_config_home,
|
19
|
+
"XDG_CACHE_HOME" => @xdg_cache_home,
|
20
|
+
})
|
21
|
+
end
|
22
|
+
|
23
|
+
def remove
|
24
|
+
_, stderr, stat = Open3.capture3(
|
25
|
+
"docker", "rm", "-f", @id
|
26
|
+
)
|
27
|
+
raise Error, stderr unless stat.success?
|
28
|
+
end
|
29
|
+
|
30
|
+
def capture_shopify(*args)
|
31
|
+
capture(*([SHOPIFY_BIN_PATH] + args))
|
32
|
+
end
|
33
|
+
|
34
|
+
def capture(*args, relative_dir: nil)
|
35
|
+
command = ["docker", "exec"]
|
36
|
+
cwd = if relative_dir.nil?
|
37
|
+
@cwd
|
38
|
+
else
|
39
|
+
File.join(@cwd, relative_dir)
|
40
|
+
end
|
41
|
+
command += ["-w", cwd]
|
42
|
+
@env.each do |env_name, env_value|
|
43
|
+
command += ["--env", "#{env_name}=#{env_value}"]
|
44
|
+
end
|
45
|
+
command << @id
|
46
|
+
command += args
|
47
|
+
|
48
|
+
out, err, stat = Open3.capture3(*command)
|
49
|
+
raise Error, err unless stat.success?
|
50
|
+
out
|
51
|
+
end
|
52
|
+
|
53
|
+
def exec_shopify(*args, relative_dir: nil)
|
54
|
+
exec(*([SHOPIFY_BIN_PATH] + args), relative_dir: relative_dir)
|
55
|
+
end
|
56
|
+
|
57
|
+
def exec(*args, relative_dir: nil)
|
58
|
+
command = ["docker", "exec"]
|
59
|
+
cwd = if relative_dir.nil?
|
60
|
+
@cwd
|
61
|
+
else
|
62
|
+
File.join(@cwd, relative_dir)
|
63
|
+
end
|
64
|
+
command += ["-w", cwd]
|
65
|
+
@env.each do |env_name, env_value|
|
66
|
+
command += ["--env", "#{env_name}=#{env_value}"]
|
67
|
+
end
|
68
|
+
command << @id
|
69
|
+
command += args
|
70
|
+
|
71
|
+
out, stat = Open3.capture2e(*command)
|
72
|
+
raise Error, out unless stat.success?
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|