shopify-cli 2.4.0 → 2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/shopify.yml +0 -2
- data/.rubocop.yml +14 -14
- data/.rubocop_todo.yml +3 -3
- data/CHANGELOG.md +5 -0
- data/Dockerfile +1 -1
- data/Gemfile.lock +1 -1
- data/RELEASING.md +1 -1
- data/Rakefile +18 -18
- data/bin/shopify +3 -3
- data/lib/project_types/extension/cli.rb +3 -3
- data/lib/project_types/extension/commands/build.rb +2 -2
- 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 +41 -23
- 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 +2 -2
- data/lib/project_types/extension/features/argo_config.rb +5 -5
- data/lib/project_types/extension/features/argo_serve.rb +20 -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 +2 -2
- 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 +2 -2
- 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/models/development_server.rb +45 -6
- data/lib/project_types/extension/models/development_server_requirements.rb +22 -3
- data/lib/project_types/extension/models/lazy_specification_handler.rb +1 -1
- data/lib/project_types/extension/models/specification.rb +1 -1
- data/lib/project_types/extension/models/specification_handlers/default.rb +10 -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 +1 -1
- 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/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 +3 -3
- 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/run_extension_command.rb +10 -3
- 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 -10
- 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 +7 -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/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 -12
- 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 +11 -4
- data/lib/project_types/script/commands/create.rb +2 -2
- data/lib/project_types/script/commands/push.rb +2 -2
- data/lib/project_types/script/forms/create.rb +1 -1
- data/lib/project_types/script/layers/application/extension_points.rb +2 -2
- data/lib/project_types/script/layers/application/push_script.rb +4 -1
- 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 +55 -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/languages/assemblyscript_project_creator.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/languages/rust_project_creator.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +5 -5
- data/lib/project_types/script/layers/infrastructure/script_service.rb +4 -8
- data/lib/project_types/script/layers/infrastructure/service_locator.rb +20 -0
- data/lib/project_types/script/tasks/ensure_env.rb +6 -6
- data/lib/project_types/script/ui/error_handler.rb +75 -75
- 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 +8 -8
- 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 → shopify_cli}/constants.rb +1 -1
- 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 +3 -3
- 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 → shopify_cli}/environment.rb +1 -1
- 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 +6 -6
- 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 +8 -8
- 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 +17 -1
- data/lib/{shopify-cli → shopify_cli}/method_object.rb +4 -4
- 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 +13 -13
- 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 +1 -1
- 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 → shopify_cli}/theme/development_theme.rb +9 -9
- 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 +50 -49
- data/shopify-cli.gemspec +2 -2
- metadata +104 -91
- data/lib/project_types/script/layers/infrastructure/api_clients.rb +0 -89
- 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/version.rb +0 -3
@@ -7,11 +7,11 @@ module Extension
|
|
7
7
|
NPM_SERVE_COMMAND = %w(run-script server)
|
8
8
|
|
9
9
|
property! :specification_handler, accepts: Extension::Models::SpecificationHandlers::Default
|
10
|
-
property
|
11
|
-
property! :context, accepts:
|
10
|
+
property :argo_runtime, accepts: -> (runtime) { runtime.class < Features::Runtimes::Base }
|
11
|
+
property! :context, accepts: ShopifyCLI::Context
|
12
12
|
property! :port, accepts: Integer, default: 39351
|
13
13
|
property :tunnel_url, accepts: String, default: nil
|
14
|
-
property! :js_system, accepts: ->(jss) { jss.respond_to?(:call) }, default:
|
14
|
+
property! :js_system, accepts: ->(jss) { jss.respond_to?(:call) }, default: ShopifyCLI::JsSystem
|
15
15
|
property :resource_url, accepts: String, default: nil
|
16
16
|
|
17
17
|
def call
|
@@ -30,6 +30,7 @@ module Extension
|
|
30
30
|
private
|
31
31
|
|
32
32
|
def start_server
|
33
|
+
return new_serve_flow if supports_development_server?
|
33
34
|
js_system.call(context, yarn: yarn_serve_command, npm: npm_serve_command)
|
34
35
|
end
|
35
36
|
|
@@ -58,8 +59,8 @@ module Extension
|
|
58
59
|
|
59
60
|
return if required_fields.none?
|
60
61
|
|
61
|
-
|
62
|
-
|
62
|
+
ShopifyCLI::Tasks::EnsureEnv.call(context, required: required_fields)
|
63
|
+
ShopifyCLI::Tasks::EnsureDevStore.call(context) if required_fields.include?(:shop)
|
63
64
|
|
64
65
|
project = ExtensionProject.current
|
65
66
|
ensure_resource_resource_url! if specification_handler.supplies_resource_url?
|
@@ -90,7 +91,7 @@ module Extension
|
|
90
91
|
def ensure_resource_resource_url!
|
91
92
|
project = ExtensionProject.current(force_reload: true)
|
92
93
|
|
93
|
-
|
94
|
+
ShopifyCLI::Result
|
94
95
|
.wrap(project.resource_url)
|
95
96
|
.rescue { specification_handler.build_resource_url(shop: project.env.shop, context: context) }
|
96
97
|
.then(&method(:persist_resource_url))
|
@@ -108,6 +109,19 @@ module Extension
|
|
108
109
|
ExtensionProject.update_env_file(context: context, resource_url: resource_url)
|
109
110
|
resource_url
|
110
111
|
end
|
112
|
+
|
113
|
+
def new_serve_flow
|
114
|
+
Tasks::RunExtensionCommand.new(
|
115
|
+
type: specification_handler.specification.identifier,
|
116
|
+
command: "serve",
|
117
|
+
context: context,
|
118
|
+
port: port,
|
119
|
+
).call
|
120
|
+
end
|
121
|
+
|
122
|
+
def supports_development_server?
|
123
|
+
Models::DevelopmentServerRequirements.supported?(specification_handler.specification.identifier)
|
124
|
+
end
|
111
125
|
end
|
112
126
|
end
|
113
127
|
end
|
@@ -26,7 +26,7 @@ module Extension
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def run_install_steps(context, steps, identifier, directory_name)
|
29
|
-
system =
|
29
|
+
system = ShopifyCLI::JsSystem.new(ctx: context)
|
30
30
|
|
31
31
|
steps.inject(true) do |success, setup_step|
|
32
32
|
success && setup_step.call(context, identifier, directory_name, system)
|
@@ -11,7 +11,7 @@ module Extension
|
|
11
11
|
def call(context, identifier, directory_name, js_system)
|
12
12
|
step_result = step.call(context, identifier, directory_name, js_system)
|
13
13
|
can_fail? ? step_result : true
|
14
|
-
rescue
|
14
|
+
rescue ShopifyCLI::Abort => e
|
15
15
|
context.puts(e.message)
|
16
16
|
false
|
17
17
|
rescue StandardError => e
|
@@ -18,7 +18,7 @@ module Extension
|
|
18
18
|
def self.clone_template(git_template)
|
19
19
|
ArgoSetupStep.default do |context, _identifier, directory_name, _js_system|
|
20
20
|
begin
|
21
|
-
|
21
|
+
ShopifyCLI::Git.clone(git_template, directory_name, ctx: context)
|
22
22
|
context.root = File.join(context.root, directory_name)
|
23
23
|
rescue StandardError
|
24
24
|
context.puts("{{x}} Unable to clone the repository.")
|
@@ -28,7 +28,7 @@ module Extension
|
|
28
28
|
|
29
29
|
def self.install_dependencies
|
30
30
|
ArgoSetupStep.default do |context, _identifier, _directory_name, js_system|
|
31
|
-
|
31
|
+
ShopifyCLI::JsDeps.new(ctx: context, system: js_system).install
|
32
32
|
end
|
33
33
|
end
|
34
34
|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Extension
|
4
4
|
module Forms
|
5
|
-
class Connect <
|
5
|
+
class Connect < ShopifyCLI::Form
|
6
6
|
attr_reader :registration, :app
|
7
7
|
|
8
8
|
flag_arguments :type
|
@@ -19,7 +19,7 @@ module Extension
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def ask
|
22
|
-
|
22
|
+
ShopifyCLI::Result.wrap(ExtensionProjectDetails.new)
|
23
23
|
.then(&Questions::AskRegistration.new(ctx: ctx, type: type))
|
24
24
|
.unwrap { |e| raise e }
|
25
25
|
.tap do |project_details|
|
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
module Extension
|
4
4
|
module Forms
|
5
|
-
class Create <
|
5
|
+
class Create < ShopifyCLI::Form
|
6
6
|
flag_arguments :name, :type, :api_key, :template
|
7
7
|
|
8
8
|
attr_reader :app
|
@@ -21,7 +21,7 @@ module Extension
|
|
21
21
|
end
|
22
22
|
|
23
23
|
def ask
|
24
|
-
|
24
|
+
ShopifyCLI::Result.wrap(ExtensionProjectDetails.new)
|
25
25
|
.then(&Questions::AskApp.new(ctx: ctx, api_key: api_key))
|
26
26
|
.then(&Questions::AskType.new(ctx: ctx, type: type))
|
27
27
|
.then(&Questions::AskTemplate.new(ctx: ctx))
|
@@ -2,7 +2,7 @@ module Extension
|
|
2
2
|
module Forms
|
3
3
|
module Questions
|
4
4
|
class AskApp
|
5
|
-
include
|
5
|
+
include ShopifyCLI::MethodObject
|
6
6
|
|
7
7
|
property! :ctx
|
8
8
|
property :api_key
|
@@ -45,7 +45,7 @@ module Extension
|
|
45
45
|
def abort_no_apps
|
46
46
|
ctx.puts(@ctx.message("create.no_apps"))
|
47
47
|
ctx.puts(@ctx.message("create.learn_about_apps"))
|
48
|
-
raise
|
48
|
+
raise ShopifyCLI::AbortSilent
|
49
49
|
end
|
50
50
|
end
|
51
51
|
end
|
@@ -4,7 +4,7 @@ module Extension
|
|
4
4
|
module Forms
|
5
5
|
module Questions
|
6
6
|
class AskRegistration
|
7
|
-
include
|
7
|
+
include ShopifyCLI::MethodObject
|
8
8
|
|
9
9
|
property! :ctx
|
10
10
|
property! :type
|
@@ -43,7 +43,7 @@ module Extension
|
|
43
43
|
def abort_no_registrations
|
44
44
|
ctx.puts(@ctx.message("connect.no_extensions", type))
|
45
45
|
ctx.puts(@ctx.message("connect.learn_about_extensions"))
|
46
|
-
raise
|
46
|
+
raise ShopifyCLI::AbortSilent
|
47
47
|
end
|
48
48
|
end
|
49
49
|
end
|
@@ -2,7 +2,7 @@ module Extension
|
|
2
2
|
module Forms
|
3
3
|
module Questions
|
4
4
|
class AskTemplate
|
5
|
-
include
|
5
|
+
include ShopifyCLI::MethodObject
|
6
6
|
|
7
7
|
TEMPLATE_REQUIRED_TYPES = [
|
8
8
|
"checkout_ui_extension",
|
@@ -28,7 +28,7 @@ module Extension
|
|
28
28
|
end
|
29
29
|
|
30
30
|
def extension_server_beta?
|
31
|
-
|
31
|
+
ShopifyCLI::Shopifolk.check && ShopifyCLI::Feature.enabled?(:extension_server_beta)
|
32
32
|
end
|
33
33
|
|
34
34
|
def choose_interactively
|
@@ -2,7 +2,7 @@ module Extension
|
|
2
2
|
module Forms
|
3
3
|
module Questions
|
4
4
|
class AskType
|
5
|
-
include
|
5
|
+
include ShopifyCLI::MethodObject
|
6
6
|
|
7
7
|
property! :ctx
|
8
8
|
property :type
|
@@ -39,7 +39,7 @@ module Extension
|
|
39
39
|
|
40
40
|
def abort_due_to_missing_specifications
|
41
41
|
ctx.puts(@ctx.message("create.no_available_extensions"))
|
42
|
-
raise
|
42
|
+
raise ShopifyCLI::AbortSilent
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
@@ -15,9 +15,9 @@ module Extension
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def self.load_current_type_messages
|
18
|
-
return unless
|
18
|
+
return unless ShopifyCLI::Project.has_current?
|
19
19
|
messages_for_type(
|
20
|
-
|
20
|
+
ShopifyCLI::Project.current.config[Extension::ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY]
|
21
21
|
)
|
22
22
|
end
|
23
23
|
|
@@ -7,9 +7,20 @@ module Extension
|
|
7
7
|
|
8
8
|
include SmartProperties
|
9
9
|
|
10
|
-
|
10
|
+
EXECUTABLE_DIRECTORY = File.join(ShopifyCLI::ROOT, "ext", "shopify-extensions")
|
11
11
|
|
12
|
-
property
|
12
|
+
property :executable, converts: :to_s
|
13
|
+
|
14
|
+
def executable
|
15
|
+
super || begin
|
16
|
+
case RbConfig::CONFIG.fetch("host_os")
|
17
|
+
when /(linux)|(darwin)/
|
18
|
+
File.join(EXECUTABLE_DIRECTORY, "shopify-extensions")
|
19
|
+
else
|
20
|
+
File.join(EXECUTABLE_DIRECTORY, "shopify-extensions.exe")
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
13
24
|
|
14
25
|
def create(server_config)
|
15
26
|
CLI::Kit::System.capture3(executable, "create", "-", stdin_data: server_config.to_yaml)
|
@@ -18,18 +29,46 @@ module Extension
|
|
18
29
|
end
|
19
30
|
|
20
31
|
def build(server_config)
|
21
|
-
_, error,
|
22
|
-
return if
|
32
|
+
_, error, status = CLI::Kit::System.capture3(executable, "build", "-", stdin_data: server_config.to_yaml)
|
33
|
+
return if status.success?
|
23
34
|
raise DevelopmentServerError, error
|
24
35
|
end
|
25
36
|
|
26
|
-
def serve
|
27
|
-
|
37
|
+
def serve(context, server_config)
|
38
|
+
CLI::Kit::System.popen3(executable, "serve", "-") do |input, out, err, status|
|
39
|
+
context.puts("Sending configuration data …")
|
40
|
+
input << server_config.to_yaml
|
41
|
+
input.close
|
42
|
+
|
43
|
+
forward_output_to_user(out, err, context)
|
44
|
+
|
45
|
+
status.value
|
46
|
+
end
|
28
47
|
end
|
29
48
|
|
30
49
|
def version
|
31
50
|
raise NotImplementedError
|
32
51
|
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def forward_output_to_user(out, err, ctx)
|
56
|
+
ctx.puts("Starting monitoring threads …")
|
57
|
+
|
58
|
+
Thread.new do
|
59
|
+
ctx.puts("Ready to process standard output")
|
60
|
+
while (line = out.gets)
|
61
|
+
ctx.puts(line)
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
Thread.new do
|
66
|
+
ctx.puts("Ready to process standard error")
|
67
|
+
while (error = err.gets)
|
68
|
+
ctx.puts(error)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
33
72
|
end
|
34
73
|
end
|
35
74
|
end
|
@@ -8,9 +8,28 @@ module Extension
|
|
8
8
|
"checkout_ui_extension",
|
9
9
|
]
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
UNIX_NAME = "shopify-extensions"
|
12
|
+
WINDOWS_NAME = "shopify-extensions.exe"
|
13
|
+
|
14
|
+
class << self
|
15
|
+
def supported?(type)
|
16
|
+
binary_installed? && type_supported?(type) && beta_enabled?
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def binary_installed?
|
22
|
+
extension_dir = File.join(ShopifyCLI::ROOT, "ext", "shopify-extensions")
|
23
|
+
File.exist?(File.join(extension_dir, UNIX_NAME)) || File.exist?(File.join(extension_dir, WINDOWS_NAME))
|
24
|
+
end
|
25
|
+
|
26
|
+
def type_supported?(type)
|
27
|
+
SUPPORTED_EXTENSION_TYPES.include?(type.downcase)
|
28
|
+
end
|
29
|
+
|
30
|
+
def beta_enabled?
|
31
|
+
ShopifyCLI::Shopifolk.check && ShopifyCLI::Feature.enabled?(:extension_server_beta)
|
32
|
+
end
|
14
33
|
end
|
15
34
|
end
|
16
35
|
end
|
@@ -18,7 +18,7 @@ module Extension
|
|
18
18
|
def self.build(feature_set_attributes)
|
19
19
|
feature_set_attributes.each_with_object(OpenStruct.new) do |(identifier, feature_attributes), feature_set|
|
20
20
|
next if feature_attributes.nil?
|
21
|
-
feature_set[identifier] =
|
21
|
+
feature_set[identifier] = ShopifyCLI::ResolveConstant
|
22
22
|
.call(identifier, namespace: Features)
|
23
23
|
.rescue { OpenStruct }
|
24
24
|
.then { |c| c.new(**feature_attributes) }
|
@@ -43,10 +43,12 @@ module Extension
|
|
43
43
|
end
|
44
44
|
|
45
45
|
def choose_port?(context)
|
46
|
+
return true if supports_development_server?
|
46
47
|
argo_runtime(context).supports?(:port)
|
47
48
|
end
|
48
49
|
|
49
50
|
def establish_tunnel?(context)
|
51
|
+
return true if supports_development_server?
|
50
52
|
argo_runtime(context).supports?(:public_url)
|
51
53
|
end
|
52
54
|
|
@@ -66,6 +68,8 @@ module Extension
|
|
66
68
|
end
|
67
69
|
|
68
70
|
def argo_runtime(context)
|
71
|
+
return if supports_development_server?
|
72
|
+
|
69
73
|
@argo_runtime ||= Features::ArgoRuntime.find(
|
70
74
|
cli_package: cli_package(context),
|
71
75
|
identifier: identifier
|
@@ -76,7 +80,7 @@ module Extension
|
|
76
80
|
cli_package_name = specification.features.argo&.cli_package_name
|
77
81
|
return unless cli_package_name
|
78
82
|
|
79
|
-
js_system =
|
83
|
+
js_system = ShopifyCLI::JsSystem.new(ctx: context)
|
80
84
|
Tasks::FindNpmPackages.exactly_one_of(cli_package_name, js_system: js_system)
|
81
85
|
.unwrap { |_e| context.abort(context.message("errors.package_not_found", cli_package_name)) }
|
82
86
|
end
|
@@ -87,7 +91,7 @@ module Extension
|
|
87
91
|
if (str = messages.dig(*key_parts))
|
88
92
|
str % params
|
89
93
|
else
|
90
|
-
|
94
|
+
ShopifyCLI::Context.message(key, *params)
|
91
95
|
end
|
92
96
|
end
|
93
97
|
|
@@ -118,6 +122,10 @@ module Extension
|
|
118
122
|
def messages
|
119
123
|
@messages ||= Messages::TYPES[identifier.downcase.to_sym] || {}
|
120
124
|
end
|
125
|
+
|
126
|
+
def supports_development_server?
|
127
|
+
Models::DevelopmentServerRequirements.supported?(identifier)
|
128
|
+
end
|
121
129
|
end
|
122
130
|
end
|
123
131
|
end
|
@@ -15,7 +15,7 @@ module Extension
|
|
15
15
|
context.root = File.join(context.root, directory_name)
|
16
16
|
|
17
17
|
if getting_started
|
18
|
-
|
18
|
+
ShopifyCLI::Git.clone("https://github.com/Shopify/theme-extension-getting-started", context.root)
|
19
19
|
context.rm_r(".git")
|
20
20
|
else
|
21
21
|
FileUtils.makedirs(SUPPORTED_BUCKETS.map { |b| File.join(context.root, b) })
|
@@ -5,7 +5,7 @@ module Extension
|
|
5
5
|
|
6
6
|
property! :custom_handler_root,
|
7
7
|
accepts: ->(d) { File.directory?(d) },
|
8
|
-
default: -> { File.expand_path("lib/project_types/extension/models/specification_handlers",
|
8
|
+
default: -> { File.expand_path("lib/project_types/extension/models/specification_handlers", ShopifyCLI::ROOT) }
|
9
9
|
|
10
10
|
property! :custom_handler_namespace,
|
11
11
|
accepts: ->(m) { m.respond_to?(:const_get) },
|
@@ -39,9 +39,9 @@ module Extension
|
|
39
39
|
private
|
40
40
|
|
41
41
|
def fetch_specifications_and_build_handlers
|
42
|
-
|
42
|
+
ShopifyCLI::Result
|
43
43
|
.call(&fetch_specifications)
|
44
|
-
.map(&
|
44
|
+
.map(&ShopifyCLI::TransformDataStructure.new(symbolize_keys: true, underscore_keys: true))
|
45
45
|
.then(&method(:select_cli_extensions))
|
46
46
|
.then(&Tasks::ConfigureFeatures)
|
47
47
|
.then(&Tasks::ConfigureOptions)
|
@@ -61,7 +61,7 @@ module Extension
|
|
61
61
|
|
62
62
|
def instantiate_specification_handlers(specifications)
|
63
63
|
specifications.each_with_object({}) do |specification, handlers|
|
64
|
-
|
64
|
+
ShopifyCLI::ResolveConstant.call(specification.identifier, namespace: custom_handler_namespace)
|
65
65
|
.rescue { |error| error.is_a?(NameError) ? SpecificationHandlers::Default : raise(error) }
|
66
66
|
.then { |handler_class| handler_class.new(specification) }
|
67
67
|
.unwrap { |error| raise error }
|
@@ -3,7 +3,7 @@ require "shopify_cli"
|
|
3
3
|
|
4
4
|
module Extension
|
5
5
|
module Tasks
|
6
|
-
class CreateExtension <
|
6
|
+
class CreateExtension < ShopifyCLI::Task
|
7
7
|
include UserErrors
|
8
8
|
|
9
9
|
GRAPHQL_FILE = "extension_create"
|
@@ -20,7 +20,7 @@ module Extension
|
|
20
20
|
extension_context: extension_context,
|
21
21
|
}
|
22
22
|
|
23
|
-
response =
|
23
|
+
response = ShopifyCLI::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
|
24
24
|
context.abort(context.message("tasks.errors.parse_error")) if response.nil?
|
25
25
|
|
26
26
|
abort_if_user_errors(context, response)
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module Extension
|
2
2
|
module Tasks
|
3
3
|
class FetchSpecifications
|
4
|
-
include
|
4
|
+
include ShopifyCLI::MethodObject
|
5
5
|
|
6
6
|
property :context
|
7
7
|
property :api_key
|
8
8
|
|
9
9
|
def call
|
10
|
-
response =
|
10
|
+
response = ShopifyCLI::PartnersAPI
|
11
11
|
.query(context, "fetch_specifications", api_key: api_key)
|
12
12
|
.dig("data", "extensionSpecifications")
|
13
13
|
context.abort(context.message("tasks.errors.parse_error")) if response.nil?
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Extension
|
2
2
|
module Tasks
|
3
3
|
class FindNpmPackages
|
4
|
-
include
|
4
|
+
include ShopifyCLI::MethodObject
|
5
5
|
|
6
|
-
property! :js_system, accepts:
|
6
|
+
property! :js_system, accepts: ShopifyCLI::JsSystem
|
7
7
|
property! :production_only, accepts: [true, false], default: false, reader: :production_only?
|
8
8
|
|
9
9
|
def self.at_least_one_of(*package_names, **config)
|
@@ -69,7 +69,7 @@ module Extension
|
|
69
69
|
raise ArgumentError, "Expected a list of package names"
|
70
70
|
end
|
71
71
|
|
72
|
-
|
72
|
+
ShopifyCLI::Result
|
73
73
|
.call(&method(:list_packages))
|
74
74
|
.then(&method(:search_packages).curry[package_names])
|
75
75
|
.then(&method(:filter_duplicates))
|
@@ -3,7 +3,7 @@ require "shopify_cli"
|
|
3
3
|
|
4
4
|
module Extension
|
5
5
|
module Tasks
|
6
|
-
class GetApp <
|
6
|
+
class GetApp < ShopifyCLI::Task
|
7
7
|
GRAPHQL_FILE = "get_app_by_api_key"
|
8
8
|
|
9
9
|
RESPONSE_FIELD = %w(data)
|
@@ -12,7 +12,7 @@ module Extension
|
|
12
12
|
def call(context:, api_key:)
|
13
13
|
input = { api_key: api_key }
|
14
14
|
|
15
|
-
response =
|
15
|
+
response = ShopifyCLI::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
|
16
16
|
context.abort(context.message("tasks.errors.parse_error")) if response.nil?
|
17
17
|
|
18
18
|
Converters::AppConverter.from_hash(response.dig(APP_FIELD))
|
@@ -3,9 +3,9 @@ require "shopify_cli"
|
|
3
3
|
|
4
4
|
module Extension
|
5
5
|
module Tasks
|
6
|
-
class GetApps <
|
6
|
+
class GetApps < ShopifyCLI::Task
|
7
7
|
def call(context:)
|
8
|
-
organizations =
|
8
|
+
organizations = ShopifyCLI::PartnersAPI::Organizations.fetch_with_app(context)
|
9
9
|
apps_from_organizations(organizations)
|
10
10
|
end
|
11
11
|
|
@@ -3,9 +3,9 @@ require "shopify_cli"
|
|
3
3
|
|
4
4
|
module Extension
|
5
5
|
module Tasks
|
6
|
-
class GetExtensions <
|
6
|
+
class GetExtensions < ShopifyCLI::Task
|
7
7
|
def call(context:, type:)
|
8
|
-
organizations =
|
8
|
+
organizations = ShopifyCLI::PartnersAPI::Organizations.fetch_with_extensions(context, type)
|
9
9
|
extensions_from_organizations(organizations, context: context)
|
10
10
|
end
|
11
11
|
|
@@ -3,12 +3,12 @@ require "shopify_cli"
|
|
3
3
|
|
4
4
|
module Extension
|
5
5
|
module Tasks
|
6
|
-
class GetProduct <
|
6
|
+
class GetProduct < ShopifyCLI::Task
|
7
7
|
API_VERSION = "2021-07"
|
8
8
|
GRAPHQL_FILE = "get_variant_id"
|
9
9
|
|
10
10
|
def call(context, shop)
|
11
|
-
response =
|
11
|
+
response = ShopifyCLI::AdminAPI.query(
|
12
12
|
context,
|
13
13
|
GRAPHQL_FILE,
|
14
14
|
shop: shop,
|
@@ -4,7 +4,7 @@ require "shopify_cli"
|
|
4
4
|
|
5
5
|
module Extension
|
6
6
|
module Tasks
|
7
|
-
class RunExtensionCommand <
|
7
|
+
class RunExtensionCommand < ShopifyCLI::Task
|
8
8
|
include SmartProperties
|
9
9
|
|
10
10
|
SUPPORTED_EXTENSION_TYPES = [
|
@@ -14,15 +14,18 @@ module Extension
|
|
14
14
|
SUPPORTED_COMMANDS = [
|
15
15
|
"create",
|
16
16
|
"build",
|
17
|
+
"serve",
|
17
18
|
]
|
18
19
|
|
19
20
|
property :root_dir, accepts: String
|
20
21
|
property :template, accepts: Models::ServerConfig::Development::VALID_TEMPLATES
|
21
22
|
property! :type, accepts: SUPPORTED_EXTENSION_TYPES
|
22
23
|
property! :command, accepts: SUPPORTED_COMMANDS
|
24
|
+
property :context, accepts: ShopifyCLI::Context
|
25
|
+
property :port, accepts: Integer, default: 39351
|
23
26
|
|
24
27
|
def call
|
25
|
-
|
28
|
+
ShopifyCLI::Result
|
26
29
|
.call(&method(:build_extension))
|
27
30
|
.then(&method(:build_server_config))
|
28
31
|
.then(&method(:run_command))
|
@@ -42,7 +45,7 @@ module Extension
|
|
42
45
|
end
|
43
46
|
|
44
47
|
def build_server_config(extension)
|
45
|
-
Models::ServerConfig::Root.new(extensions: [extension])
|
48
|
+
Models::ServerConfig::Root.new(port: port, extensions: [extension])
|
46
49
|
end
|
47
50
|
|
48
51
|
def run_command(server_config)
|
@@ -51,6 +54,10 @@ module Extension
|
|
51
54
|
Models::DevelopmentServer.new.create(server_config)
|
52
55
|
when "build"
|
53
56
|
Models::DevelopmentServer.new.build(server_config)
|
57
|
+
when "serve"
|
58
|
+
Models::DevelopmentServer.new.serve(context, server_config)
|
59
|
+
else
|
60
|
+
raise NotImplementedError
|
54
61
|
end
|
55
62
|
end
|
56
63
|
end
|