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
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require_relative "theme"
|
|
3
|
+
|
|
4
|
+
require "socket"
|
|
5
|
+
require "securerandom"
|
|
6
|
+
|
|
7
|
+
module ShopifyCLI
|
|
8
|
+
module Theme
|
|
9
|
+
API_NAME_LIMIT = 50
|
|
10
|
+
|
|
11
|
+
class DevelopmentTheme < Theme
|
|
12
|
+
def id
|
|
13
|
+
ShopifyCLI::DB.get(:development_theme_id)
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def name
|
|
17
|
+
existing_name = ShopifyCLI::DB.get(:development_theme_name)
|
|
18
|
+
# Up to version 2.3.0 (included) generated names stored locally
|
|
19
|
+
# could have more than 50 characters and the API rejected them.
|
|
20
|
+
# This code ensures we update the name for those users to ensure
|
|
21
|
+
# the name stays under the limit.
|
|
22
|
+
if existing_name.nil? || existing_name.length > API_NAME_LIMIT
|
|
23
|
+
generate_theme_name
|
|
24
|
+
else
|
|
25
|
+
existing_name
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def role
|
|
30
|
+
"development"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def ensure_exists!
|
|
34
|
+
if exists?
|
|
35
|
+
@ctx.debug("Using temporary development theme: ##{id} #{name}")
|
|
36
|
+
else
|
|
37
|
+
create
|
|
38
|
+
@ctx.debug("Created temporary development theme: #{@id}")
|
|
39
|
+
ShopifyCLI::DB.set(development_theme_id: @id)
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def exists?
|
|
44
|
+
return false unless id
|
|
45
|
+
|
|
46
|
+
ShopifyCLI::AdminAPI.rest_request(
|
|
47
|
+
@ctx,
|
|
48
|
+
shop: shop,
|
|
49
|
+
path: "themes/#{id}.json",
|
|
50
|
+
api_version: "unstable",
|
|
51
|
+
)
|
|
52
|
+
rescue ShopifyCLI::API::APIRequestNotFoundError
|
|
53
|
+
false
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def delete
|
|
57
|
+
super if exists?
|
|
58
|
+
ShopifyCLI::DB.del(:development_theme_id) if ShopifyCLI::DB.exists?(:development_theme_id)
|
|
59
|
+
ShopifyCLI::DB.del(:development_theme_name) if ShopifyCLI::DB.exists?(:development_theme_name)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def self.delete(ctx)
|
|
63
|
+
new(ctx).delete
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
private
|
|
67
|
+
|
|
68
|
+
def generate_theme_name
|
|
69
|
+
hostname = Socket.gethostname.split(".").shift
|
|
70
|
+
hash = SecureRandom.hex(3)
|
|
71
|
+
|
|
72
|
+
theme_name = "Development ()"
|
|
73
|
+
hostname_character_limit = API_NAME_LIMIT - theme_name.length - hash.length - 1
|
|
74
|
+
identifier = "#{hash}-#{hostname[0, hostname_character_limit]}"
|
|
75
|
+
theme_name = "Development (#{identifier})"
|
|
76
|
+
|
|
77
|
+
ShopifyCLI::DB.set(development_theme_name: theme_name)
|
|
78
|
+
|
|
79
|
+
theme_name
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
end
|
|
@@ -3,7 +3,7 @@ require "thread"
|
|
|
3
3
|
require "json"
|
|
4
4
|
require "base64"
|
|
5
5
|
|
|
6
|
-
module
|
|
6
|
+
module ShopifyCLI
|
|
7
7
|
module Theme
|
|
8
8
|
class Syncer
|
|
9
9
|
class Operation < Struct.new(:method, :file)
|
|
@@ -80,7 +80,7 @@ module ShopifyCli
|
|
|
80
80
|
end
|
|
81
81
|
|
|
82
82
|
def fetch_checksums!
|
|
83
|
-
_status, response =
|
|
83
|
+
_status, response = ShopifyCLI::AdminAPI.rest_request(
|
|
84
84
|
@ctx,
|
|
85
85
|
shop: @theme.shop,
|
|
86
86
|
path: "themes/#{@theme.id}/assets.json",
|
|
@@ -211,7 +211,7 @@ module ShopifyCli
|
|
|
211
211
|
used, total = limit.split("/").map(&:to_i)
|
|
212
212
|
backoff_if_near_limit!(used, total)
|
|
213
213
|
end
|
|
214
|
-
rescue
|
|
214
|
+
rescue ShopifyCLI::API::APIRequestError => e
|
|
215
215
|
report_error(
|
|
216
216
|
"{{red:ERROR}} {{blue:#{operation}}}:\n " +
|
|
217
217
|
parse_api_errors(e).join("\n ")
|
|
@@ -228,7 +228,7 @@ module ShopifyCli
|
|
|
228
228
|
asset[:attachment] = Base64.encode64(file.read)
|
|
229
229
|
end
|
|
230
230
|
|
|
231
|
-
_status, body, response =
|
|
231
|
+
_status, body, response = ShopifyCLI::AdminAPI.rest_request(
|
|
232
232
|
@ctx,
|
|
233
233
|
shop: @theme.shop,
|
|
234
234
|
path: "themes/#{@theme.id}/assets.json",
|
|
@@ -243,7 +243,7 @@ module ShopifyCli
|
|
|
243
243
|
end
|
|
244
244
|
|
|
245
245
|
def get(file)
|
|
246
|
-
_status, body, response =
|
|
246
|
+
_status, body, response = ShopifyCLI::AdminAPI.rest_request(
|
|
247
247
|
@ctx,
|
|
248
248
|
shop: @theme.shop,
|
|
249
249
|
path: "themes/#{@theme.id}/assets.json",
|
|
@@ -265,7 +265,7 @@ module ShopifyCli
|
|
|
265
265
|
end
|
|
266
266
|
|
|
267
267
|
def delete(file)
|
|
268
|
-
_status, _body, response =
|
|
268
|
+
_status, _body, response = ShopifyCLI::AdminAPI.rest_request(
|
|
269
269
|
@ctx,
|
|
270
270
|
shop: @theme.shop,
|
|
271
271
|
path: "themes/#{@theme.id}/assets.json",
|
|
@@ -4,7 +4,7 @@ require_relative "file"
|
|
|
4
4
|
require "pathname"
|
|
5
5
|
require "time"
|
|
6
6
|
|
|
7
|
-
module
|
|
7
|
+
module ShopifyCLI
|
|
8
8
|
module Theme
|
|
9
9
|
class InvalidThemeRole < StandardError; end
|
|
10
10
|
|
|
@@ -101,7 +101,7 @@ module ShopifyCli
|
|
|
101
101
|
def create
|
|
102
102
|
raise InvalidThemeRole, "Can't create live theme. Use publish." if live?
|
|
103
103
|
|
|
104
|
-
_status, body =
|
|
104
|
+
_status, body = ShopifyCLI::AdminAPI.rest_request(
|
|
105
105
|
@ctx,
|
|
106
106
|
shop: shop,
|
|
107
107
|
path: "themes.json",
|
|
@@ -144,11 +144,11 @@ module ShopifyCli
|
|
|
144
144
|
end
|
|
145
145
|
|
|
146
146
|
def current_development?
|
|
147
|
-
development? && id ==
|
|
147
|
+
development? && id == ShopifyCLI::DB.get(:development_theme_id)
|
|
148
148
|
end
|
|
149
149
|
|
|
150
150
|
def foreign_development?
|
|
151
|
-
development? && id !=
|
|
151
|
+
development? && id != ShopifyCLI::DB.get(:development_theme_id)
|
|
152
152
|
end
|
|
153
153
|
|
|
154
154
|
def to_h
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
|
|
2
|
-
module
|
|
2
|
+
module ShopifyCLI
|
|
3
3
|
##
|
|
4
4
|
# `TransformDataStructure` helps to standardize data structure access. It
|
|
5
5
|
# traverses nested data structures and can convert
|
|
@@ -22,13 +22,13 @@ module ShopifyCli
|
|
|
22
22
|
# Since `TransformDataStructure` is a method object, it can easily be chained:
|
|
23
23
|
#
|
|
24
24
|
# require 'open-uri'
|
|
25
|
-
#
|
|
25
|
+
# ShopifyCLI::Result
|
|
26
26
|
# .call { open("https://jsonplaceholder.typicode.com/todos/1") }
|
|
27
27
|
# .map(&TransformDataStructure.new(symbolize_keys: true, underscore_keys: true))
|
|
28
28
|
# .value # => { id: 1, user_id: 1, ... }
|
|
29
29
|
#
|
|
30
30
|
class TransformDataStructure
|
|
31
|
-
include
|
|
31
|
+
include ShopifyCLI::MethodObject
|
|
32
32
|
|
|
33
33
|
class << self
|
|
34
34
|
private
|
|
@@ -53,7 +53,7 @@ module ShopifyCli
|
|
|
53
53
|
result[transform_key(key)] = call(value).value
|
|
54
54
|
end
|
|
55
55
|
else
|
|
56
|
-
|
|
56
|
+
ShopifyCLI::Result.success(object)
|
|
57
57
|
end
|
|
58
58
|
end
|
|
59
59
|
|
|
@@ -4,7 +4,7 @@ require "shopify_cli"
|
|
|
4
4
|
require "forwardable"
|
|
5
5
|
require "uri"
|
|
6
6
|
|
|
7
|
-
module
|
|
7
|
+
module ShopifyCLI
|
|
8
8
|
##
|
|
9
9
|
# Wraps around ngrok functionality to allow you to spawn a ngrok proccess in the
|
|
10
10
|
# background and stop the process when you need to. It also allows control over
|
|
@@ -39,8 +39,8 @@ module ShopifyCli
|
|
|
39
39
|
# * `ctx` - running context from your command
|
|
40
40
|
#
|
|
41
41
|
def stop(ctx)
|
|
42
|
-
if
|
|
43
|
-
if
|
|
42
|
+
if ShopifyCLI::ProcessSupervision.running?(:ngrok)
|
|
43
|
+
if ShopifyCLI::ProcessSupervision.stop(:ngrok)
|
|
44
44
|
ctx.puts(ctx.message("core.tunnel.stopped"))
|
|
45
45
|
else
|
|
46
46
|
ctx.abort(ctx.message("core.tunnel.error.stop"))
|
|
@@ -75,7 +75,7 @@ module ShopifyCli
|
|
|
75
75
|
end
|
|
76
76
|
ctx.puts(ctx.message("core.tunnel.start", url))
|
|
77
77
|
ctx.puts(ctx.message("core.tunnel.will_timeout", seconds_to_hm(seconds_remaining)))
|
|
78
|
-
ctx.puts(ctx.message("core.tunnel.signup_suggestion",
|
|
78
|
+
ctx.puts(ctx.message("core.tunnel.signup_suggestion", ShopifyCLI::TOOL_NAME))
|
|
79
79
|
end
|
|
80
80
|
url
|
|
81
81
|
end
|
|
@@ -91,7 +91,7 @@ module ShopifyCli
|
|
|
91
91
|
#
|
|
92
92
|
def auth(ctx, token)
|
|
93
93
|
install(ctx)
|
|
94
|
-
ctx.system(File.join(
|
|
94
|
+
ctx.system(File.join(ShopifyCLI.cache_dir, "ngrok"), "authtoken", token)
|
|
95
95
|
end
|
|
96
96
|
|
|
97
97
|
##
|
|
@@ -145,28 +145,28 @@ module ShopifyCli
|
|
|
145
145
|
|
|
146
146
|
def install(ctx)
|
|
147
147
|
ngrok = "ngrok#{ctx.executable_file_extension}"
|
|
148
|
-
return if File.exist?(File.join(
|
|
148
|
+
return if File.exist?(File.join(ShopifyCLI.cache_dir, ngrok))
|
|
149
149
|
check_prereq_command(ctx, "curl")
|
|
150
150
|
check_prereq_command(ctx, ctx.linux? ? "unzip" : "tar")
|
|
151
151
|
spinner = CLI::UI::SpinGroup.new
|
|
152
152
|
spinner.add(ctx.message("core.tunnel.installing")) do
|
|
153
|
-
zip_dest = File.join(
|
|
153
|
+
zip_dest = File.join(ShopifyCLI.cache_dir, "ngrok.zip")
|
|
154
154
|
unless File.exist?(zip_dest)
|
|
155
|
-
ctx.system("curl", "-o", zip_dest, DOWNLOAD_URLS[ctx.os], chdir:
|
|
155
|
+
ctx.system("curl", "-o", zip_dest, DOWNLOAD_URLS[ctx.os], chdir: ShopifyCLI.cache_dir)
|
|
156
156
|
end
|
|
157
157
|
args = if ctx.linux?
|
|
158
158
|
%W(unzip -u #{zip_dest})
|
|
159
159
|
else
|
|
160
160
|
%W(tar -xf #{zip_dest})
|
|
161
161
|
end
|
|
162
|
-
ctx.system(*args, chdir:
|
|
162
|
+
ctx.system(*args, chdir: ShopifyCLI.cache_dir)
|
|
163
163
|
ctx.rm(zip_dest)
|
|
164
164
|
end
|
|
165
165
|
spinner.wait
|
|
166
166
|
|
|
167
167
|
# final check to see if ngrok is accessible
|
|
168
|
-
unless File.exist?(File.join(
|
|
169
|
-
ctx.abort(ctx.message("core.tunnel.error.ngrok", ngrok,
|
|
168
|
+
unless File.exist?(File.join(ShopifyCLI.cache_dir, ngrok))
|
|
169
|
+
ctx.abort(ctx.message("core.tunnel.error.ngrok", ngrok, ShopifyCLI.cache_dir))
|
|
170
170
|
end
|
|
171
171
|
end
|
|
172
172
|
|
|
@@ -178,7 +178,7 @@ module ShopifyCli
|
|
|
178
178
|
end
|
|
179
179
|
|
|
180
180
|
def ngrok_command(port)
|
|
181
|
-
"\"#{File.join(
|
|
181
|
+
"\"#{File.join(ShopifyCLI.cache_dir, "ngrok")}\" http -inspect=false -log=stdout -log-level=debug #{port}"
|
|
182
182
|
end
|
|
183
183
|
|
|
184
184
|
def seconds_to_hm(seconds)
|
|
@@ -186,14 +186,14 @@ module ShopifyCli
|
|
|
186
186
|
end
|
|
187
187
|
|
|
188
188
|
def start_ngrok(ctx, port)
|
|
189
|
-
process =
|
|
189
|
+
process = ShopifyCLI::ProcessSupervision.start(:ngrok, ngrok_command(port))
|
|
190
190
|
log = fetch_url(ctx, process.log_path)
|
|
191
191
|
seconds_remaining = (process.time.to_i + log.timeout) - Time.now.to_i
|
|
192
192
|
[log.url, log.account, seconds_remaining]
|
|
193
193
|
end
|
|
194
194
|
|
|
195
195
|
def restart_ngrok(ctx, port)
|
|
196
|
-
unless
|
|
196
|
+
unless ShopifyCLI::ProcessSupervision.stop(:ngrok)
|
|
197
197
|
ctx.abort(ctx.message("core.tunnel.error.stop"))
|
|
198
198
|
end
|
|
199
199
|
start_ngrok(ctx, port)
|
data/lib/shopify_cli.rb
CHANGED
|
@@ -24,7 +24,9 @@ end
|
|
|
24
24
|
require "cli/ui"
|
|
25
25
|
require "cli/kit"
|
|
26
26
|
require "smart_properties"
|
|
27
|
-
require_relative "
|
|
27
|
+
require_relative "shopify_cli/version"
|
|
28
|
+
require_relative "shopify_cli/migrator"
|
|
29
|
+
require_relative "shopify_cli/exception_reporter"
|
|
28
30
|
|
|
29
31
|
# Enable stdout routing. At this point all calls to STDOUT (and STDERR) will go through this class.
|
|
30
32
|
# See https://github.com/Shopify/cli-ui/blob/main/lib/cli/ui/stdout_router.rb for more info
|
|
@@ -36,7 +38,7 @@ CLI::UI::StdoutRouter.enable
|
|
|
36
38
|
#
|
|
37
39
|
# It is recommended to read through CLI Kit (https://github.com/shopify/cli-kit) and a CLI Kit example
|
|
38
40
|
# (https://github.com/Shopify/cli-kit-example) to fully understand how shopify-cli functions
|
|
39
|
-
module
|
|
41
|
+
module ShopifyCLI
|
|
40
42
|
extend CLI::Kit::Autocall
|
|
41
43
|
|
|
42
44
|
TOOL_NAME = "shopify"
|
|
@@ -75,64 +77,67 @@ module ShopifyCli
|
|
|
75
77
|
# application and CLI kit framework.
|
|
76
78
|
# To understand how this works, read https://github.com/Shopify/cli-kit/blob/main/lib/cli/kit.rb
|
|
77
79
|
|
|
78
|
-
#
|
|
80
|
+
# ShopifyCLI::Config
|
|
79
81
|
autocall(:Config) { CLI::Kit::Config.new(tool_name: TOOL_NAME) }
|
|
80
|
-
#
|
|
81
|
-
autocall(:Logger) { CLI::Kit::Logger.new(debug_log_file:
|
|
82
|
-
#
|
|
82
|
+
# ShopifyCLI::Logger
|
|
83
|
+
autocall(:Logger) { CLI::Kit::Logger.new(debug_log_file: ShopifyCLI.debug_log_file) }
|
|
84
|
+
# ShopifyCLI::Resolver
|
|
83
85
|
autocall(:Resolver) do
|
|
84
|
-
|
|
86
|
+
ShopifyCLI::Core::HelpResolver.new(
|
|
85
87
|
tool_name: TOOL_NAME,
|
|
86
|
-
command_registry:
|
|
88
|
+
command_registry: ShopifyCLI::Commands::Registry
|
|
87
89
|
)
|
|
88
90
|
end
|
|
89
|
-
#
|
|
91
|
+
# ShopifyCLI::ErrorHandler
|
|
90
92
|
autocall(:ErrorHandler) do
|
|
91
93
|
CLI::Kit::ErrorHandler.new(
|
|
92
|
-
log_file:
|
|
93
|
-
exception_reporter:
|
|
94
|
+
log_file: ShopifyCLI.log_file,
|
|
95
|
+
exception_reporter: ->() { ShopifyCLI::ExceptionReporter },
|
|
94
96
|
)
|
|
95
97
|
end
|
|
96
98
|
|
|
97
|
-
autoload :
|
|
98
|
-
autoload :
|
|
99
|
-
autoload :
|
|
100
|
-
autoload :
|
|
101
|
-
autoload :
|
|
102
|
-
autoload :
|
|
103
|
-
autoload :
|
|
104
|
-
autoload :
|
|
105
|
-
autoload :
|
|
106
|
-
autoload :
|
|
107
|
-
autoload :
|
|
108
|
-
autoload :
|
|
109
|
-
autoload :
|
|
110
|
-
autoload :
|
|
111
|
-
autoload :
|
|
112
|
-
autoload :
|
|
113
|
-
autoload :
|
|
114
|
-
autoload :
|
|
115
|
-
autoload :
|
|
116
|
-
autoload :
|
|
117
|
-
autoload :
|
|
118
|
-
autoload :
|
|
119
|
-
autoload :
|
|
120
|
-
autoload :
|
|
121
|
-
autoload :
|
|
122
|
-
autoload :
|
|
123
|
-
autoload :
|
|
124
|
-
autoload :
|
|
125
|
-
autoload :
|
|
126
|
-
autoload :
|
|
127
|
-
autoload :
|
|
128
|
-
autoload :
|
|
129
|
-
autoload :
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
99
|
+
autoload :Constants, "shopify_cli/constants"
|
|
100
|
+
autoload :Environment, "shopify_cli/environment"
|
|
101
|
+
autoload :AdminAPI, "shopify_cli/admin_api"
|
|
102
|
+
autoload :API, "shopify_cli/api"
|
|
103
|
+
autoload :Command, "shopify_cli/command"
|
|
104
|
+
autoload :Commands, "shopify_cli/commands"
|
|
105
|
+
autoload :Connect, "shopify_cli/connect"
|
|
106
|
+
autoload :Context, "shopify_cli/context"
|
|
107
|
+
autoload :Core, "shopify_cli/core"
|
|
108
|
+
autoload :DB, "shopify_cli/db"
|
|
109
|
+
autoload :Feature, "shopify_cli/feature"
|
|
110
|
+
autoload :Form, "shopify_cli/form"
|
|
111
|
+
autoload :Git, "shopify_cli/git"
|
|
112
|
+
autoload :Helpers, "shopify_cli/helpers"
|
|
113
|
+
autoload :Heroku, "shopify_cli/heroku"
|
|
114
|
+
autoload :IdentityAuth, "shopify_cli/identity_auth"
|
|
115
|
+
autoload :JsDeps, "shopify_cli/js_deps"
|
|
116
|
+
autoload :JsSystem, "shopify_cli/js_system"
|
|
117
|
+
autoload :PHPDeps, "shopify_cli/php_deps"
|
|
118
|
+
autoload :LazyDelegator, "shopify_cli/lazy_delegator"
|
|
119
|
+
autoload :MethodObject, "shopify_cli/method_object"
|
|
120
|
+
autoload :Options, "shopify_cli/options"
|
|
121
|
+
autoload :PartnersAPI, "shopify_cli/partners_api"
|
|
122
|
+
autoload :ProcessSupervision, "shopify_cli/process_supervision"
|
|
123
|
+
autoload :Project, "shopify_cli/project"
|
|
124
|
+
autoload :ProjectCommands, "shopify_cli/project_commands"
|
|
125
|
+
autoload :ProjectType, "shopify_cli/project_type"
|
|
126
|
+
autoload :ResolveConstant, "shopify_cli/resolve_constant"
|
|
127
|
+
autoload :Resources, "shopify_cli/resources"
|
|
128
|
+
autoload :Result, "shopify_cli/result"
|
|
129
|
+
autoload :Shopifolk, "shopify_cli/shopifolk"
|
|
130
|
+
autoload :SubCommand, "shopify_cli/sub_command"
|
|
131
|
+
autoload :Task, "shopify_cli/task"
|
|
132
|
+
autoload :Tasks, "shopify_cli/tasks"
|
|
133
|
+
autoload :TransformDataStructure, "shopify_cli/transform_data_structure"
|
|
134
|
+
autoload :Tunnel, "shopify_cli/tunnel"
|
|
135
|
+
|
|
136
|
+
require "shopify_cli/messages/messages"
|
|
137
|
+
Context.load_messages(ShopifyCLI::Messages::MESSAGES)
|
|
133
138
|
|
|
134
139
|
def self.cache_dir
|
|
135
|
-
cache_dir = if
|
|
140
|
+
cache_dir = if Environment.test?
|
|
136
141
|
TEMP_DIR
|
|
137
142
|
elsif ENV["LOCALAPPDATA"].nil?
|
|
138
143
|
File.join(File.expand_path(ENV.fetch("XDG_CACHE_HOME", "~/.cache")), TOOL_NAME)
|
|
@@ -147,7 +152,7 @@ module ShopifyCli
|
|
|
147
152
|
end
|
|
148
153
|
|
|
149
154
|
def self.tool_config_path
|
|
150
|
-
if
|
|
155
|
+
if Environment.test?
|
|
151
156
|
TEMP_DIR
|
|
152
157
|
elsif ENV["APPDATA"].nil?
|
|
153
158
|
File.join(File.expand_path(ENV.fetch("XDG_CONFIG_HOME", "~/.config")), TOOL_NAME)
|
|
@@ -166,6 +171,12 @@ module ShopifyCli
|
|
|
166
171
|
|
|
167
172
|
def self.sha
|
|
168
173
|
return @sha if defined?(@sha)
|
|
169
|
-
@sha = Git.sha(dir:
|
|
174
|
+
@sha = Git.sha(dir: ShopifyCLI::ROOT)
|
|
175
|
+
end
|
|
176
|
+
|
|
177
|
+
# Migrate runs migrations that migrate the state of the environment
|
|
178
|
+
# in which the CLI runs.
|
|
179
|
+
unless ShopifyCLI::Environment.test? || ShopifyCLI::Environment.development?
|
|
180
|
+
ShopifyCLI::Migrator.migrate
|
|
170
181
|
end
|
|
171
182
|
end
|
data/shopify-cli.gemspec
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
require_relative "lib/
|
|
1
|
+
require_relative "lib/shopify_cli/version"
|
|
2
2
|
|
|
3
3
|
Gem::Specification.new do |spec|
|
|
4
4
|
spec.name = "shopify-cli"
|
|
5
|
-
spec.version =
|
|
5
|
+
spec.version = ShopifyCLI::VERSION
|
|
6
6
|
spec.authors = ["Shopify"]
|
|
7
7
|
spec.email = ["dev-tools-education@shopify.com"]
|
|
8
8
|
spec.license = "MIT"
|
|
@@ -39,10 +39,18 @@ Gem::Specification.new do |spec|
|
|
|
39
39
|
# `/usr/local/bin/shopify` to that script, in order to "lock" the Ruby used to
|
|
40
40
|
# a single Ruby (useful for debugging in multi-Ruby environments)
|
|
41
41
|
|
|
42
|
-
spec.add_development_dependency("bundler", "~> 2.
|
|
42
|
+
spec.add_development_dependency("bundler", "~> 2.2.2")
|
|
43
43
|
spec.add_development_dependency("rake", "~> 12.3", ">= 12.3.3")
|
|
44
44
|
spec.add_development_dependency("minitest", "~> 5.0")
|
|
45
45
|
|
|
46
|
-
spec.add_dependency("
|
|
47
|
-
spec.add_dependency("
|
|
46
|
+
spec.add_dependency("bugsnag", "~> 6.22")
|
|
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
56
|
end
|
data/utilities/docker.rb
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
require "open3"
|
|
2
|
+
|
|
3
|
+
module Utilities
|
|
4
|
+
module Docker
|
|
5
|
+
Error = Class.new(StandardError)
|
|
6
|
+
|
|
7
|
+
class << self
|
|
8
|
+
def run_and_rm_container(*args)
|
|
9
|
+
build_image_if_needed
|
|
10
|
+
system(
|
|
11
|
+
"docker", "run",
|
|
12
|
+
"-t", "--rm",
|
|
13
|
+
"--volume", "#{Shellwords.escape(root_dir)}:/usr/src/app",
|
|
14
|
+
image_tag,
|
|
15
|
+
*args
|
|
16
|
+
) || abort
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
private
|
|
20
|
+
|
|
21
|
+
def root_dir
|
|
22
|
+
File.expand_path("..", __dir__)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def build_image_if_needed
|
|
26
|
+
unless image_exists?(image_tag)
|
|
27
|
+
system("docker", "build", root_dir, "-t", image_tag) || abort
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def image_tag
|
|
32
|
+
gemfile_lock_path = File.expand_path("./Gemfile.lock", root_dir)
|
|
33
|
+
image_sha = Digest::SHA256.hexdigest(File.read(gemfile_lock_path))
|
|
34
|
+
"shopify-cli-#{image_sha}"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def image_exists?(tag)
|
|
38
|
+
_, stat = Open3.capture2(
|
|
39
|
+
"docker", "inspect",
|
|
40
|
+
"--type=image",
|
|
41
|
+
tag
|
|
42
|
+
)
|
|
43
|
+
stat.success?
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|