shopify-cli 2.3.0 → 2.6.1
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/.github/CODEOWNERS +1 -0
- data/.github/workflows/shopify.yml +104 -0
- data/.gitignore +3 -0
- data/.rubocop.yml +14 -14
- data/.rubocop_todo.yml +3 -3
- data/CHANGELOG.md +26 -0
- data/CONTRIBUTING.md +23 -0
- data/Dockerfile +17 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +67 -24
- data/README.md +1 -1
- data/RELEASING.md +1 -1
- data/Rakefile +75 -18
- data/bin/console +11 -0
- data/bin/shopify +17 -4
- data/dev.yml +14 -1
- data/ext/shopify-cli/extconf.rb +2 -0
- data/ext/shopify-extensions/extconf.rb +21 -0
- data/ext/shopify-extensions/shopify_extensions.rb +152 -0
- data/ext/shopify-extensions/version +1 -0
- data/lib/project_types/extension/cli.rb +19 -3
- data/lib/project_types/extension/commands/build.rb +32 -3
- data/lib/project_types/extension/commands/check.rb +2 -2
- data/lib/project_types/extension/commands/connect.rb +1 -1
- data/lib/project_types/extension/commands/create.rb +59 -16
- data/lib/project_types/extension/commands/extension_command.rb +1 -1
- data/lib/project_types/extension/commands/info.rb +1 -1
- data/lib/project_types/extension/commands/push.rb +1 -1
- data/lib/project_types/extension/commands/register.rb +2 -2
- data/lib/project_types/extension/commands/serve.rb +5 -5
- data/lib/project_types/extension/commands/tunnel.rb +6 -6
- data/lib/project_types/extension/extension_project.rb +4 -4
- data/lib/project_types/extension/features/argo.rb +3 -3
- data/lib/project_types/extension/features/argo_config.rb +5 -5
- data/lib/project_types/extension/features/argo_serve.rb +21 -6
- data/lib/project_types/extension/features/argo_setup.rb +1 -1
- data/lib/project_types/extension/features/argo_setup_step.rb +1 -1
- data/lib/project_types/extension/features/argo_setup_steps.rb +2 -2
- data/lib/project_types/extension/forms/connect.rb +2 -2
- data/lib/project_types/extension/forms/create.rb +6 -3
- data/lib/project_types/extension/forms/questions/ask_app.rb +2 -2
- data/lib/project_types/extension/forms/questions/ask_name.rb +1 -1
- data/lib/project_types/extension/forms/questions/ask_registration.rb +2 -2
- data/lib/project_types/extension/forms/questions/ask_template.rb +44 -0
- data/lib/project_types/extension/forms/questions/ask_type.rb +2 -2
- data/lib/project_types/extension/messages/message_loading.rb +2 -2
- data/lib/project_types/extension/messages/messages.rb +3 -0
- data/lib/project_types/extension/models/development_server.rb +78 -0
- data/lib/project_types/extension/models/development_server_requirements.rb +35 -0
- data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
- data/lib/project_types/extension/models/server_config/base.rb +31 -0
- data/lib/project_types/extension/models/server_config/development.rb +23 -0
- data/lib/project_types/extension/models/server_config/development_entries.rb +38 -0
- data/lib/project_types/extension/models/server_config/development_renderer.rb +30 -0
- data/lib/project_types/extension/models/server_config/extension.rb +35 -0
- data/lib/project_types/extension/models/server_config/root.rb +18 -0
- data/lib/project_types/extension/models/server_config/user.rb +10 -0
- data/lib/project_types/extension/models/specification.rb +1 -1
- data/lib/project_types/extension/models/specification_handlers/default.rb +14 -2
- data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +1 -1
- data/lib/project_types/extension/models/specifications.rb +4 -4
- data/lib/project_types/extension/tasks/choose_next_available_port.rb +2 -2
- data/lib/project_types/extension/tasks/configure_features.rb +1 -1
- data/lib/project_types/extension/tasks/configure_options.rb +1 -1
- data/lib/project_types/extension/tasks/converters/product_converter.rb +1 -1
- data/lib/project_types/extension/tasks/converters/server_config_converter.rb +31 -0
- data/lib/project_types/extension/tasks/create_extension.rb +2 -2
- data/lib/project_types/extension/tasks/fetch_specifications.rb +2 -2
- data/lib/project_types/extension/tasks/find_npm_packages.rb +5 -5
- data/lib/project_types/extension/tasks/get_app.rb +2 -2
- data/lib/project_types/extension/tasks/get_apps.rb +2 -2
- data/lib/project_types/extension/tasks/get_extensions.rb +2 -2
- data/lib/project_types/extension/tasks/get_product.rb +2 -2
- data/lib/project_types/extension/tasks/load_server_config.rb +23 -0
- data/lib/project_types/extension/tasks/run_extension_command.rb +81 -0
- data/lib/project_types/extension/tasks/update_draft.rb +2 -2
- data/lib/project_types/node/cli.rb +3 -3
- data/lib/project_types/node/commands/connect.rb +4 -4
- data/lib/project_types/node/commands/create.rb +10 -14
- data/lib/project_types/node/commands/deploy/heroku.rb +4 -4
- data/lib/project_types/node/commands/deploy.rb +3 -3
- data/lib/project_types/node/commands/generate.rb +2 -2
- data/lib/project_types/node/commands/open.rb +3 -3
- data/lib/project_types/node/commands/serve.rb +15 -7
- data/lib/project_types/node/commands/tunnel.rb +6 -6
- data/lib/project_types/node/forms/create.rb +3 -3
- data/lib/project_types/node/messages/messages.rb +3 -0
- data/lib/project_types/php/cli.rb +27 -0
- data/lib/project_types/php/commands/connect.rb +19 -0
- data/lib/project_types/php/commands/create.rb +143 -0
- data/lib/project_types/php/commands/deploy/heroku.rb +129 -0
- data/lib/project_types/php/commands/deploy.rb +32 -0
- data/lib/project_types/php/commands/open.rb +16 -0
- data/lib/project_types/php/commands/serve.rb +51 -0
- data/lib/project_types/php/commands/tunnel.rb +37 -0
- data/lib/project_types/php/forms/create.rb +45 -0
- data/lib/project_types/php/messages/messages.rb +191 -0
- data/lib/project_types/rails/cli.rb +3 -3
- data/lib/project_types/rails/commands/connect.rb +4 -4
- data/lib/project_types/rails/commands/create.rb +12 -16
- data/lib/project_types/rails/commands/deploy/heroku.rb +4 -4
- data/lib/project_types/rails/commands/deploy.rb +3 -3
- data/lib/project_types/rails/commands/generate/webhook.rb +3 -3
- data/lib/project_types/rails/commands/generate.rb +3 -3
- data/lib/project_types/rails/commands/open.rb +3 -3
- data/lib/project_types/rails/commands/serve.rb +8 -8
- data/lib/project_types/rails/commands/tunnel.rb +6 -6
- data/lib/project_types/rails/forms/create.rb +3 -3
- data/lib/project_types/rails/gem.rb +1 -1
- data/lib/project_types/rails/ruby.rb +1 -1
- data/lib/project_types/script/cli.rb +16 -6
- data/lib/project_types/script/commands/create.rb +4 -2
- data/lib/project_types/script/commands/push.rb +2 -2
- data/lib/project_types/script/config/extension_points.yml +30 -29
- data/lib/project_types/script/forms/create.rb +1 -1
- data/lib/project_types/script/layers/application/create_script.rb +32 -12
- data/lib/project_types/script/layers/application/extension_points.rb +4 -4
- data/lib/project_types/script/layers/application/push_script.rb +13 -1
- data/lib/project_types/script/layers/domain/extension_point.rb +13 -45
- data/lib/project_types/script/layers/domain/push_package.rb +0 -12
- data/lib/project_types/script/layers/domain/script_project.rb +2 -2
- data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +57 -0
- data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +35 -0
- data/lib/project_types/script/layers/infrastructure/command_runner.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/errors.rb +5 -0
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +10 -90
- data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +76 -11
- data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/languages/typescript_project_creator.rb +33 -0
- data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +105 -0
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +6 -6
- data/lib/project_types/script/layers/infrastructure/script_service.rb +25 -144
- data/lib/project_types/script/layers/infrastructure/script_uploader.rb +27 -0
- data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
- data/lib/project_types/script/messages/messages.rb +4 -0
- data/lib/project_types/script/tasks/ensure_env.rb +7 -7
- data/lib/project_types/script/ui/error_handler.rb +84 -76
- data/lib/project_types/script/ui/printing_spinner.rb +1 -1
- data/lib/project_types/theme/cli.rb +3 -3
- data/lib/project_types/theme/commands/check.rb +3 -3
- data/lib/project_types/theme/commands/delete.rb +7 -7
- data/lib/project_types/theme/commands/init.rb +3 -3
- data/lib/project_types/theme/commands/language_server.rb +2 -2
- data/lib/project_types/theme/commands/package.rb +2 -2
- data/lib/project_types/theme/commands/publish.rb +5 -5
- data/lib/project_types/theme/commands/pull.rb +9 -9
- data/lib/project_types/theme/commands/push.rb +12 -12
- data/lib/project_types/theme/commands/serve.rb +4 -4
- data/lib/project_types/theme/forms/confirm_store.rb +1 -1
- data/lib/project_types/theme/forms/select.rb +2 -2
- data/lib/{shopify-cli → shopify_cli}/admin_api/populate_resource_command.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/admin_api/schema.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/admin_api.rb +27 -27
- data/lib/{shopify-cli → shopify_cli}/api.rb +12 -8
- data/lib/shopify_cli/command/app_sub_command.rb +16 -0
- data/lib/{shopify-cli → shopify_cli}/command.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/commands/config.rb +14 -14
- data/lib/{shopify-cli → shopify_cli}/commands/help.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/commands/login.rb +7 -7
- data/lib/shopify_cli/commands/logout.rb +39 -0
- data/lib/{shopify-cli → shopify_cli}/commands/populate/customer.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/commands/populate/draft_order.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/commands/populate/product.rb +4 -4
- data/lib/shopify_cli/commands/populate.rb +23 -0
- data/lib/shopify_cli/commands/store.rb +15 -0
- data/lib/{shopify-cli → shopify_cli}/commands/switch.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/commands/system.rb +10 -10
- data/lib/shopify_cli/commands/version.rb +15 -0
- data/lib/{shopify-cli → shopify_cli}/commands/whoami.rb +7 -7
- data/lib/shopify_cli/commands.rb +34 -0
- data/lib/{shopify-cli → shopify_cli}/connect.rb +3 -3
- data/lib/shopify_cli/constants.rb +54 -0
- data/lib/{shopify-cli → shopify_cli}/context.rb +6 -6
- data/lib/{shopify-cli → shopify_cli}/core/entry_point.rb +7 -7
- data/lib/{shopify-cli → shopify_cli}/core/executor.rb +8 -4
- data/lib/{shopify-cli → shopify_cli}/core/finalize.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/core/help_resolver.rb +2 -2
- data/lib/{shopify-cli → shopify_cli}/core/monorail.rb +8 -8
- data/lib/shopify_cli/core.rb +8 -0
- data/lib/{shopify-cli → shopify_cli}/db.rb +8 -8
- data/lib/shopify_cli/environment.rb +91 -0
- data/lib/shopify_cli/exception_reporter/permission_controller.rb +54 -0
- data/lib/shopify_cli/exception_reporter.rb +55 -0
- data/lib/{shopify-cli → shopify_cli}/feature.rb +8 -8
- data/lib/{shopify-cli → shopify_cli}/form.rb +2 -2
- data/lib/{shopify-cli → shopify_cli}/git.rb +38 -8
- data/lib/{shopify-cli → shopify_cli}/helpers/haikunator.rb +1 -1
- data/lib/shopify_cli/helpers.rb +5 -0
- data/lib/{shopify-cli → shopify_cli}/heroku.rb +38 -13
- data/lib/{shopify-cli → shopify_cli}/http_request.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/identity_auth/servlet.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/identity_auth.rb +24 -31
- data/lib/{shopify-cli → shopify_cli}/js_deps.rb +7 -7
- data/lib/{shopify-cli → shopify_cli}/js_system.rb +10 -10
- data/lib/{shopify-cli → shopify_cli}/lazy_delegator.rb +2 -2
- data/lib/{shopify-cli → shopify_cli}/messages/messages.rb +44 -2
- data/lib/{shopify-cli → shopify_cli}/method_object.rb +15 -8
- data/lib/shopify_cli/migrator/migration.rb +27 -0
- data/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +13 -0
- data/lib/shopify_cli/migrator.rb +48 -0
- data/lib/{shopify-cli → shopify_cli}/options.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/packager.rb +8 -8
- data/lib/{shopify-cli → shopify_cli}/partners_api/organizations.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/partners_api.rb +16 -40
- data/lib/shopify_cli/php_deps.rb +102 -0
- data/lib/{shopify-cli → shopify_cli}/process_supervision.rb +10 -8
- data/lib/{shopify-cli → shopify_cli}/project.rb +15 -15
- data/lib/{shopify-cli → shopify_cli}/project_commands.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/project_type.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/resolve_constant.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/resources/env_file.rb +1 -1
- data/lib/shopify_cli/resources.rb +5 -0
- data/lib/{shopify-cli → shopify_cli}/result.rb +11 -11
- data/lib/{shopify-cli → shopify_cli}/shopifolk.rb +6 -6
- data/lib/{shopify-cli → shopify_cli}/sub_command.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/task.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/tasks/confirm_store.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/tasks/create_api_client.rb +4 -4
- data/lib/shopify_cli/tasks/ensure_authenticated.rb +13 -0
- data/lib/{shopify-cli → shopify_cli}/tasks/ensure_dev_store.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/tasks/ensure_env.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/tasks/ensure_loopback_url.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/tasks/ensure_project_type.rb +3 -3
- data/lib/{shopify-cli → shopify_cli}/tasks/select_org_and_shop.rb +8 -8
- data/lib/{shopify-cli → shopify_cli}/tasks/update_dashboard_urls.rb +6 -6
- data/lib/{shopify-cli → shopify_cli}/tasks.rb +10 -10
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/certificate_manager.rb +5 -5
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/header_hash.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot-reload.js +0 -0
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/hot_reload.rb +5 -6
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/local_assets.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/proxy.rb +2 -2
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/sse.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/watcher.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server/web_server.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/dev_server.rb +3 -3
- data/lib/shopify_cli/theme/development_theme.rb +83 -0
- data/lib/{shopify-cli → shopify_cli}/theme/file.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/ignore_filter.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/mime_type.rb +1 -1
- data/lib/{shopify-cli → shopify_cli}/theme/syncer.rb +6 -6
- data/lib/{shopify-cli → shopify_cli}/theme/theme.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/transform_data_structure.rb +4 -4
- data/lib/{shopify-cli → shopify_cli}/tunnel.rb +14 -14
- data/lib/shopify_cli/version.rb +3 -0
- data/lib/shopify_cli.rb +61 -50
- data/shopify-cli.gemspec +13 -5
- data/utilities/docker.rb +47 -0
- data/utilities/utilities.rb +5 -0
- metadata +155 -97
- data/.github/workflows/build.yml +0 -28
- data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +0 -73
- data/lib/project_types/script/layers/infrastructure/languages/rust_task_runner.rb +0 -60
- data/lib/shopify-cli/commands/logout.rb +0 -39
- data/lib/shopify-cli/commands/populate.rb +0 -23
- data/lib/shopify-cli/commands/store.rb +0 -15
- data/lib/shopify-cli/commands/version.rb +0 -15
- data/lib/shopify-cli/commands.rb +0 -34
- data/lib/shopify-cli/core.rb +0 -8
- data/lib/shopify-cli/helpers.rb +0 -5
- data/lib/shopify-cli/resources.rb +0 -5
- data/lib/shopify-cli/tasks/ensure_authenticated.rb +0 -13
- data/lib/shopify-cli/theme/development_theme.rb +0 -69
- data/lib/shopify-cli/version.rb +0 -3
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module
|
|
1
|
+
module ShopifyCLI
|
|
2
2
|
class ProjectCommands < Command
|
|
3
3
|
def call(*)
|
|
4
4
|
@ctx.puts(self.class.help)
|
|
@@ -6,9 +6,9 @@ module ShopifyCli
|
|
|
6
6
|
|
|
7
7
|
def self.help
|
|
8
8
|
project_type = name.split("::")[0].downcase
|
|
9
|
-
|
|
9
|
+
ShopifyCLI::Context.message(
|
|
10
10
|
"#{project_type}.help",
|
|
11
|
-
|
|
11
|
+
ShopifyCLI::TOOL_NAME,
|
|
12
12
|
subcommand_registry.command_names.join(" | ")
|
|
13
13
|
)
|
|
14
14
|
end
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module
|
|
1
|
+
module ShopifyCLI
|
|
2
2
|
class ProjectType
|
|
3
3
|
extend Feature::Set
|
|
4
4
|
|
|
@@ -20,7 +20,7 @@ module ShopifyCli
|
|
|
20
20
|
end
|
|
21
21
|
|
|
22
22
|
def load_type(current_type, shallow = false)
|
|
23
|
-
filepath = File.join(
|
|
23
|
+
filepath = File.join(ShopifyCLI::ROOT, "lib", "project_types", current_type.to_s, "cli.rb")
|
|
24
24
|
return unless File.exist?(filepath)
|
|
25
25
|
@shallow_load = shallow
|
|
26
26
|
@current_type = current_type
|
|
@@ -31,7 +31,7 @@ module ShopifyCli
|
|
|
31
31
|
end
|
|
32
32
|
|
|
33
33
|
def load_all
|
|
34
|
-
Dir.glob(File.join(
|
|
34
|
+
Dir.glob(File.join(ShopifyCLI::ROOT, "lib", "project_types", "*", "cli.rb")).map do |filepath|
|
|
35
35
|
load_type(filepath.split(File::Separator)[-2].to_sym, true)
|
|
36
36
|
end
|
|
37
37
|
end
|
|
@@ -41,7 +41,7 @@ module ShopifyCli
|
|
|
41
41
|
end
|
|
42
42
|
|
|
43
43
|
def project_filepath(path)
|
|
44
|
-
File.join(
|
|
44
|
+
File.join(ShopifyCLI::PROJECT_TYPES_DIR, project_type.to_s, path)
|
|
45
45
|
end
|
|
46
46
|
|
|
47
47
|
def title(name)
|
|
@@ -50,7 +50,7 @@ module ShopifyCli
|
|
|
50
50
|
|
|
51
51
|
def register_task(task, name)
|
|
52
52
|
return if project_load_shallow
|
|
53
|
-
|
|
53
|
+
ShopifyCLI::Tasks.register(task, name)
|
|
54
54
|
end
|
|
55
55
|
|
|
56
56
|
def register_messages(messages)
|
|
@@ -4,13 +4,13 @@
|
|
|
4
4
|
# are resolved relative to `Kernal`, but the top-level namespace is
|
|
5
5
|
# configurable:
|
|
6
6
|
#
|
|
7
|
-
#
|
|
8
|
-
#
|
|
9
|
-
#
|
|
7
|
+
# ShopifyCLI::Resolve.call(:object).value # => Object
|
|
8
|
+
# ShopifyCLI::Resolve.call('minitest/test').value # => MiniTest::Test
|
|
9
|
+
# ShopifyCLI::Resolve.call(:test, namespace: MiniTest) # => MiniTest::Test
|
|
10
10
|
#
|
|
11
|
-
module
|
|
11
|
+
module ShopifyCLI
|
|
12
12
|
class ResolveConstant
|
|
13
|
-
include
|
|
13
|
+
include ShopifyCLI::MethodObject
|
|
14
14
|
property! :namespace, accepts: ->(ns) { ns.respond_to?(:const_get) }, default: -> { Kernel }
|
|
15
15
|
|
|
16
16
|
def call(name)
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
module
|
|
1
|
+
module ShopifyCLI
|
|
2
2
|
##
|
|
3
3
|
# This module defines two containers for wrapping the result of an action. One
|
|
4
4
|
# for signifying the successful execution of an action and one for signifying
|
|
@@ -261,8 +261,8 @@ module ShopifyCli
|
|
|
261
261
|
end
|
|
262
262
|
|
|
263
263
|
##
|
|
264
|
-
# raises an `
|
|
265
|
-
# `
|
|
264
|
+
# raises an `ShopifyCLI::Result::UnexpectedError` as a
|
|
265
|
+
# `ShopifyCLI::Result::Failure` does not carry a success value.
|
|
266
266
|
#
|
|
267
267
|
def value
|
|
268
268
|
raise UnexpectedFailure
|
|
@@ -342,7 +342,7 @@ module ShopifyCli
|
|
|
342
342
|
end
|
|
343
343
|
|
|
344
344
|
##
|
|
345
|
-
# wraps the given value into a `
|
|
345
|
+
# wraps the given value into a `ShopifyCLI::Result::Success` container
|
|
346
346
|
#
|
|
347
347
|
# #### Parameters
|
|
348
348
|
#
|
|
@@ -353,7 +353,7 @@ module ShopifyCli
|
|
|
353
353
|
end
|
|
354
354
|
|
|
355
355
|
##
|
|
356
|
-
# wraps the given value into a `
|
|
356
|
+
# wraps the given value into a `ShopifyCLI::Result::Failure` container
|
|
357
357
|
#
|
|
358
358
|
# #### Parameters
|
|
359
359
|
#
|
|
@@ -367,8 +367,8 @@ module ShopifyCli
|
|
|
367
367
|
# takes either a value or a block and chooses the appropriate result
|
|
368
368
|
# container based on the type of the value or the type of the block's return
|
|
369
369
|
# value. If the type is an exception, it is wrapped in a
|
|
370
|
-
# `
|
|
371
|
-
# `
|
|
370
|
+
# `ShopifyCLI::Result::Failure` and otherwise in a
|
|
371
|
+
# `ShopifyCLI::Result::Success`. If a block was provided instead of value, a
|
|
372
372
|
# `Proc` is returned and the result wrapping doesn't occur until the block
|
|
373
373
|
# is invoked.
|
|
374
374
|
#
|
|
@@ -384,12 +384,12 @@ module ShopifyCli
|
|
|
384
384
|
#
|
|
385
385
|
# #### Examples
|
|
386
386
|
#
|
|
387
|
-
# Result.wrap(1) # =>
|
|
388
|
-
# Result.wrap(RuntimeError.new) # =>
|
|
387
|
+
# Result.wrap(1) # => ShopifyCLI::Result::Success
|
|
388
|
+
# Result.wrap(RuntimeError.new) # => ShopifyCLI::Result::Failure
|
|
389
389
|
#
|
|
390
390
|
# Result.wrap { 1 } # => Proc
|
|
391
|
-
# Result.wrap { 1 }.call # =>
|
|
392
|
-
# Result.wrap { raise }.call # =>
|
|
391
|
+
# Result.wrap { 1 }.call # => ShopifyCLI::Result::Success
|
|
392
|
+
# Result.wrap { raise }.call # => ShopifyCLI::Result::Failure
|
|
393
393
|
#
|
|
394
394
|
# Result.wrap { |s| s.upcase }.call("hello").tap do |result|
|
|
395
395
|
# result # => Result::Success
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
module
|
|
1
|
+
module ShopifyCLI
|
|
2
2
|
##
|
|
3
|
-
#
|
|
3
|
+
# ShopifyCLI::Shopifolk contains the logic to determine if the user appears to be a Shopify staff
|
|
4
4
|
#
|
|
5
5
|
# The Shopifolk Feature flag will persist between runs so if the flag is enabled or disabled,
|
|
6
6
|
# it will still be in that same state until the next class invocation.
|
|
@@ -20,10 +20,10 @@ module ShopifyCli
|
|
|
20
20
|
#
|
|
21
21
|
# #### Example
|
|
22
22
|
#
|
|
23
|
-
#
|
|
23
|
+
# ShopifyCLI::Shopifolk.check
|
|
24
24
|
#
|
|
25
25
|
def check
|
|
26
|
-
|
|
26
|
+
ShopifyCLI::Shopifolk.new.shopifolk?
|
|
27
27
|
end
|
|
28
28
|
|
|
29
29
|
def act_as_shopify_organization
|
|
@@ -52,10 +52,10 @@ module ShopifyCli
|
|
|
52
52
|
return true if Feature.enabled?(FEATURE_NAME)
|
|
53
53
|
|
|
54
54
|
if shopifolk_by_gcloud? && shopifolk_by_dev?
|
|
55
|
-
|
|
55
|
+
ShopifyCLI::Feature.enable(FEATURE_NAME)
|
|
56
56
|
true
|
|
57
57
|
else
|
|
58
|
-
|
|
58
|
+
ShopifyCLI::Feature.disable(FEATURE_NAME)
|
|
59
59
|
false
|
|
60
60
|
end
|
|
61
61
|
end
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
module Tasks
|
|
5
|
-
class ConfirmStore <
|
|
5
|
+
class ConfirmStore < ShopifyCLI::Task
|
|
6
6
|
def call(ctx)
|
|
7
7
|
@ctx = ctx
|
|
8
|
-
store =
|
|
8
|
+
store = ShopifyCLI::AdminAPI.get_shop_or_abort(ctx)
|
|
9
9
|
if CLI::UI::Prompt.confirm(ctx.message("core.tasks.confirm_store.prompt", store), default: false)
|
|
10
10
|
ctx.puts(ctx.message("core.tasks.confirm_store.confirmation", store))
|
|
11
11
|
else
|
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
module Tasks
|
|
5
|
-
class CreateApiClient <
|
|
5
|
+
class CreateApiClient < ShopifyCLI::Task
|
|
6
6
|
VALID_APP_TYPES = %w(public custom)
|
|
7
7
|
DEFAULT_APP_URL = "https://shopify.github.io/shopify-cli/help/start-app/"
|
|
8
8
|
|
|
9
9
|
def call(ctx, org_id:, title:, type:)
|
|
10
|
-
resp =
|
|
10
|
+
resp = ShopifyCLI::PartnersAPI.query(
|
|
11
11
|
ctx,
|
|
12
12
|
"create_app",
|
|
13
13
|
org: org_id.to_i,
|
|
@@ -31,7 +31,7 @@ module ShopifyCli
|
|
|
31
31
|
ctx.abort(user_errors.map { |err| "#{err["field"]} #{err["message"]}" }.join(", "))
|
|
32
32
|
end
|
|
33
33
|
|
|
34
|
-
|
|
34
|
+
ShopifyCLI::Core::Monorail.metadata[:api_key] = resp.dig("data", "appCreate", "app", "apiKey")
|
|
35
35
|
|
|
36
36
|
resp.dig("data", "appCreate", "app")
|
|
37
37
|
end
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
require "shopify_cli"
|
|
2
|
+
|
|
3
|
+
module ShopifyCLI
|
|
4
|
+
module Tasks
|
|
5
|
+
class EnsureAuthenticated < ShopifyCLI::Task
|
|
6
|
+
def call(ctx)
|
|
7
|
+
ctx.abort(
|
|
8
|
+
ctx.message("core.identity_auth.login_prompt", ShopifyCLI::TOOL_NAME)
|
|
9
|
+
) unless ShopifyCLI::IdentityAuth::IDENTITY_ACCESS_TOKENS.all? { |key| ShopifyCLI::DB.exists?(key) }
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
module Tasks
|
|
5
|
-
class EnsureDevStore <
|
|
5
|
+
class EnsureDevStore < ShopifyCLI::Task
|
|
6
6
|
def call(ctx)
|
|
7
7
|
@ctx = ctx
|
|
8
8
|
return ctx.abort(ctx.message(
|
|
@@ -12,7 +12,7 @@ module ShopifyCli
|
|
|
12
12
|
return unless CLI::UI::Prompt.confirm(
|
|
13
13
|
ctx.message("core.tasks.ensure_dev_store.convert_to_dev_store", project.env.shop)
|
|
14
14
|
)
|
|
15
|
-
|
|
15
|
+
ShopifyCLI::PartnersAPI.query(ctx, "convert_dev_to_test_store", input: {
|
|
16
16
|
organizationID: shop["orgID"].to_i,
|
|
17
17
|
shopId: shop["shopId"],
|
|
18
18
|
})
|
|
@@ -22,13 +22,13 @@ module ShopifyCli
|
|
|
22
22
|
private
|
|
23
23
|
|
|
24
24
|
def project
|
|
25
|
-
@project ||=
|
|
25
|
+
@project ||= ShopifyCLI::Project.current
|
|
26
26
|
end
|
|
27
27
|
|
|
28
28
|
def shop
|
|
29
29
|
@shop ||= begin
|
|
30
30
|
current_domain = project.env.shop
|
|
31
|
-
|
|
31
|
+
ShopifyCLI::PartnersAPI::Organizations.fetch_all(@ctx).map do |org|
|
|
32
32
|
org["stores"].find do |store|
|
|
33
33
|
store["orgID"] = org["id"]
|
|
34
34
|
store["shopDomain"] == current_domain
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
module Tasks
|
|
5
|
-
class EnsureEnv <
|
|
5
|
+
class EnsureEnv < ShopifyCLI::Task
|
|
6
6
|
def call(ctx, regenerate: false, required: [:api_key, :secret])
|
|
7
7
|
@ctx = ctx
|
|
8
8
|
env_data =
|
|
@@ -50,7 +50,7 @@ module ShopifyCli
|
|
|
50
50
|
handler.option(@ctx.message("core.tasks.ensure_env.app_type.select_public")) { "public" }
|
|
51
51
|
handler.option(@ctx.message("core.tasks.ensure_env.app_type.select_custom")) { "custom" }
|
|
52
52
|
end
|
|
53
|
-
|
|
53
|
+
ShopifyCLI::Tasks::CreateApiClient.call(@ctx, org_id: org_id, title: title, type: type)
|
|
54
54
|
else
|
|
55
55
|
CLI::UI::Prompt.ask(@ctx.message("core.tasks.ensure_env.app_select")) do |handler|
|
|
56
56
|
apps.each { |app| handler.option(app["title"]) { app } }
|
|
@@ -1,16 +1,16 @@
|
|
|
1
|
-
module
|
|
1
|
+
module ShopifyCLI
|
|
2
2
|
module Tasks
|
|
3
|
-
class EnsureLoopbackURL <
|
|
3
|
+
class EnsureLoopbackURL < ShopifyCLI::Task
|
|
4
4
|
def call(ctx)
|
|
5
5
|
@ctx = ctx
|
|
6
6
|
api_key = Project.current.env.api_key
|
|
7
|
-
result =
|
|
7
|
+
result = ShopifyCLI::PartnersAPI.query(ctx, "get_app_urls", apiKey: api_key)
|
|
8
8
|
loopback = IdentityAuth::REDIRECT_HOST
|
|
9
9
|
app = result["data"]["app"]
|
|
10
10
|
urls = app["redirectUrlWhitelist"]
|
|
11
11
|
if urls.grep(/#{loopback}/).empty?
|
|
12
12
|
with_loopback = urls.push(loopback)
|
|
13
|
-
|
|
13
|
+
ShopifyCLI::PartnersAPI.query(@ctx, "update_dashboard_urls", input: {
|
|
14
14
|
redirectUrlWhitelist: with_loopback, apiKey: api_key
|
|
15
15
|
})
|
|
16
16
|
end
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
module Tasks
|
|
5
|
-
class EnsureProjectType <
|
|
5
|
+
class EnsureProjectType < ShopifyCLI::Task
|
|
6
6
|
def call(ctx, project_type)
|
|
7
|
-
return true if project_type.to_sym ==
|
|
7
|
+
return true if project_type.to_sym == ShopifyCLI::Project.current_project_type
|
|
8
8
|
ctx.abort(ctx.message("core.tasks.ensure_project_type.wrong_project_type", project_type))
|
|
9
9
|
end
|
|
10
10
|
end
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
module Tasks
|
|
5
|
-
class SelectOrgAndShop <
|
|
5
|
+
class SelectOrgAndShop < ShopifyCLI::Task
|
|
6
6
|
attr_reader :ctx
|
|
7
7
|
|
|
8
8
|
def call(ctx, organization_id: nil, shop_domain: nil)
|
|
@@ -12,7 +12,7 @@ module ShopifyCli
|
|
|
12
12
|
unless Shopifolk.acting_as_shopify_organization?
|
|
13
13
|
shop_domain ||= get_shop_domain(org)
|
|
14
14
|
end
|
|
15
|
-
|
|
15
|
+
ShopifyCLI::Core::Monorail.metadata[:organization_id] = org["id"].to_i
|
|
16
16
|
response(org["id"].to_i, shop_domain)
|
|
17
17
|
end
|
|
18
18
|
|
|
@@ -25,20 +25,20 @@ module ShopifyCli
|
|
|
25
25
|
end
|
|
26
26
|
|
|
27
27
|
def organizations
|
|
28
|
-
@organizations ||=
|
|
28
|
+
@organizations ||= ShopifyCLI::PartnersAPI::Organizations.fetch_all(ctx)
|
|
29
29
|
end
|
|
30
30
|
|
|
31
31
|
def get_organization(organization_id)
|
|
32
32
|
@organization ||= if !organization_id.nil?
|
|
33
|
-
org =
|
|
33
|
+
org = ShopifyCLI::PartnersAPI::Organizations.fetch(ctx, id: organization_id)
|
|
34
34
|
if org.nil?
|
|
35
|
-
ctx.puts(ctx.message("core.tasks.select_org_and_shop.authentication_issue",
|
|
35
|
+
ctx.puts(ctx.message("core.tasks.select_org_and_shop.authentication_issue", ShopifyCLI::TOOL_NAME))
|
|
36
36
|
ctx.abort(ctx.message("core.tasks.select_org_and_shop.error.organization_not_found"))
|
|
37
37
|
end
|
|
38
38
|
org
|
|
39
39
|
elsif organizations.count == 0
|
|
40
40
|
if Shopifolk.acting_as_shopify_organization?
|
|
41
|
-
ctx.abort(ctx.message("core.tasks.select_org_and_shop.error.shopifolk_notice",
|
|
41
|
+
ctx.abort(ctx.message("core.tasks.select_org_and_shop.error.shopifolk_notice", ShopifyCLI::TOOL_NAME))
|
|
42
42
|
else
|
|
43
43
|
ctx.abort(ctx.message("core.tasks.select_org_and_shop.error.no_organizations"))
|
|
44
44
|
end
|
|
@@ -64,7 +64,7 @@ module ShopifyCli
|
|
|
64
64
|
if valid_stores.count == 0
|
|
65
65
|
ctx.puts(ctx.message("core.tasks.select_org_and_shop.error.no_development_stores"))
|
|
66
66
|
ctx.puts(ctx.message("core.tasks.select_org_and_shop.create_store", organization["id"]))
|
|
67
|
-
ctx.puts(ctx.message("core.tasks.select_org_and_shop.authentication_issue",
|
|
67
|
+
ctx.puts(ctx.message("core.tasks.select_org_and_shop.authentication_issue", ShopifyCLI::TOOL_NAME))
|
|
68
68
|
elsif valid_stores.count == 1
|
|
69
69
|
domain = valid_stores.first["shopDomain"]
|
|
70
70
|
ctx.puts(ctx.message("core.tasks.select_org_and_shop.development_store", domain))
|
|
@@ -1,24 +1,24 @@
|
|
|
1
|
-
module
|
|
1
|
+
module ShopifyCLI
|
|
2
2
|
module Tasks
|
|
3
|
-
class UpdateDashboardURLS <
|
|
3
|
+
class UpdateDashboardURLS < ShopifyCLI::Task
|
|
4
4
|
NGROK_REGEX = /https:\/\/([a-z0-9\-]+\.ngrok\.io)(.*)/
|
|
5
5
|
|
|
6
6
|
def call(ctx, url:, callback_url:)
|
|
7
7
|
@ctx = ctx
|
|
8
|
-
project =
|
|
8
|
+
project = ShopifyCLI::Project.current
|
|
9
9
|
api_key = project.env.api_key
|
|
10
|
-
result =
|
|
10
|
+
result = ShopifyCLI::PartnersAPI.query(ctx, "get_app_urls", apiKey: api_key)
|
|
11
11
|
app = result["data"]["app"]
|
|
12
12
|
consent = check_application_url(app["applicationUrl"], url)
|
|
13
13
|
constructed_urls = construct_redirect_urls(app["redirectUrlWhitelist"], url, callback_url)
|
|
14
14
|
return if url == app["applicationUrl"]
|
|
15
|
-
|
|
15
|
+
ShopifyCLI::PartnersAPI.query(@ctx, "update_dashboard_urls", input: {
|
|
16
16
|
applicationUrl: consent ? url : app["applicationUrl"],
|
|
17
17
|
redirectUrlWhitelist: constructed_urls, apiKey: api_key
|
|
18
18
|
})
|
|
19
19
|
@ctx.puts(@ctx.message("core.tasks.update_dashboard_urls.updated"))
|
|
20
20
|
rescue
|
|
21
|
-
@ctx.puts(@ctx.message("core.tasks.update_dashboard_urls.update_error",
|
|
21
|
+
@ctx.puts(@ctx.message("core.tasks.update_dashboard_urls.update_error", ShopifyCLI::TOOL_NAME))
|
|
22
22
|
raise
|
|
23
23
|
end
|
|
24
24
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
require "shopify_cli"
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
module Tasks
|
|
5
5
|
class TaskRegistry
|
|
6
6
|
def initialize
|
|
@@ -30,14 +30,14 @@ module ShopifyCli
|
|
|
30
30
|
Registry.add(-> () { const_get(task) }, name)
|
|
31
31
|
end
|
|
32
32
|
|
|
33
|
-
register :ConfirmStore, :confirm_store, "
|
|
34
|
-
register :CreateApiClient, :create_api_client, "
|
|
35
|
-
register :EnsureAuthenticated, :ensure_authenticated, "
|
|
36
|
-
register :EnsureEnv, :ensure_env, "
|
|
37
|
-
register :EnsureLoopbackURL, :ensure_loopback_url, "
|
|
38
|
-
register :EnsureProjectType, :ensure_project_type, "
|
|
39
|
-
register :EnsureDevStore, :ensure_dev_store, "
|
|
40
|
-
register :SelectOrgAndShop, :select_org_and_shop, "
|
|
41
|
-
register :UpdateDashboardURLS, :update_dashboard_urls, "
|
|
33
|
+
register :ConfirmStore, :confirm_store, "shopify_cli/tasks/confirm_store"
|
|
34
|
+
register :CreateApiClient, :create_api_client, "shopify_cli/tasks/create_api_client"
|
|
35
|
+
register :EnsureAuthenticated, :ensure_authenticated, "shopify_cli/tasks/ensure_authenticated"
|
|
36
|
+
register :EnsureEnv, :ensure_env, "shopify_cli/tasks/ensure_env"
|
|
37
|
+
register :EnsureLoopbackURL, :ensure_loopback_url, "shopify_cli/tasks/ensure_loopback_url"
|
|
38
|
+
register :EnsureProjectType, :ensure_project_type, "shopify_cli/tasks/ensure_project_type"
|
|
39
|
+
register :EnsureDevStore, :ensure_dev_store, "shopify_cli/tasks/ensure_dev_store"
|
|
40
|
+
register :SelectOrgAndShop, :select_org_and_shop, "shopify_cli/tasks/select_org_and_shop"
|
|
41
|
+
register :UpdateDashboardURLS, :update_dashboard_urls, "shopify_cli/tasks/update_dashboard_urls"
|
|
42
42
|
end
|
|
43
43
|
end
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
require "openssl"
|
|
4
4
|
|
|
5
|
-
module
|
|
5
|
+
module ShopifyCLI
|
|
6
6
|
module Theme
|
|
7
7
|
module DevServer
|
|
8
8
|
class CertificateManager
|
|
@@ -19,13 +19,13 @@ module ShopifyCli
|
|
|
19
19
|
end
|
|
20
20
|
|
|
21
21
|
def find_or_create_certificates!
|
|
22
|
-
@private_key = if (private_key_pem =
|
|
22
|
+
@private_key = if (private_key_pem = ShopifyCLI::DB.get(:ssl_private_key))
|
|
23
23
|
OpenSSL::PKey::RSA.new(private_key_pem)
|
|
24
24
|
else
|
|
25
25
|
OpenSSL::PKey::RSA.new(2048)
|
|
26
26
|
end
|
|
27
27
|
|
|
28
|
-
@certificate = if (certificate_pem =
|
|
28
|
+
@certificate = if (certificate_pem = ShopifyCLI::DB.get(:ssl_certificate))
|
|
29
29
|
OpenSSL::X509::Certificate.new(certificate_pem)
|
|
30
30
|
else
|
|
31
31
|
x509_certificate = build_x509_certificate
|
|
@@ -35,8 +35,8 @@ module ShopifyCli
|
|
|
35
35
|
x509_certificate
|
|
36
36
|
end
|
|
37
37
|
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
ShopifyCLI::DB.set(ssl_certificate: certificate.to_pem)
|
|
39
|
+
ShopifyCLI::DB.set(ssl_private_key: private_key.to_pem)
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
private
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
module
|
|
3
|
+
module ShopifyCLI
|
|
4
4
|
module Theme
|
|
5
5
|
module DevServer
|
|
6
6
|
class HotReload
|
|
@@ -34,11 +34,10 @@ module ShopifyCli
|
|
|
34
34
|
files = (modified + added).reject { |file| @ignore_filter&.ignore?(file) }
|
|
35
35
|
.map { |file| @theme[file].relative_path }
|
|
36
36
|
|
|
37
|
-
|
|
38
|
-
modified: files
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
@ctx.debug("[HotReload] Modified #{files.join(", ")}")
|
|
37
|
+
unless files.empty?
|
|
38
|
+
@streams.broadcast(JSON.generate(modified: files))
|
|
39
|
+
@ctx.debug("[HotReload] Modified #{files.join(", ")}")
|
|
40
|
+
end
|
|
42
41
|
end
|
|
43
42
|
|
|
44
43
|
private
|
|
@@ -3,7 +3,7 @@ require "net/http"
|
|
|
3
3
|
require "stringio"
|
|
4
4
|
require "time"
|
|
5
5
|
|
|
6
|
-
module
|
|
6
|
+
module ShopifyCLI
|
|
7
7
|
module Theme
|
|
8
8
|
module DevServer
|
|
9
9
|
HOP_BY_HOP_HEADERS = [
|
|
@@ -79,7 +79,7 @@ module ShopifyCli
|
|
|
79
79
|
end
|
|
80
80
|
|
|
81
81
|
def bearer_token
|
|
82
|
-
|
|
82
|
+
ShopifyCLI::DB.get(:storefront_renderer_production_exchange_token) ||
|
|
83
83
|
raise(KeyError, "storefront_renderer_production_exchange_token missing")
|
|
84
84
|
end
|
|
85
85
|
|
|
@@ -14,7 +14,7 @@ require_relative "dev_server/certificate_manager"
|
|
|
14
14
|
|
|
15
15
|
require "pathname"
|
|
16
16
|
|
|
17
|
-
module
|
|
17
|
+
module ShopifyCLI
|
|
18
18
|
module Theme
|
|
19
19
|
module DevServer
|
|
20
20
|
class << self
|
|
@@ -80,8 +80,8 @@ module ShopifyCli
|
|
|
80
80
|
)
|
|
81
81
|
watcher.stop
|
|
82
82
|
|
|
83
|
-
rescue
|
|
84
|
-
|
|
83
|
+
rescue ShopifyCLI::API::APIRequestForbiddenError,
|
|
84
|
+
ShopifyCLI::API::APIRequestUnauthorizedError
|
|
85
85
|
@ctx.abort("You are not authorized to edit themes on #{theme.shop}.\n" \
|
|
86
86
|
"Make sure you are a user of that store, and allowed to edit themes.")
|
|
87
87
|
end
|