shopify-cli 2.7.3 → 2.10.0
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/.gitignore +1 -0
- data/CHANGELOG.md +44 -0
- data/Gemfile.lock +1 -1
- data/RELEASING.md +4 -3
- data/dev.yml +2 -2
- data/ext/javy/javy.rb +8 -9
- data/lib/graphql/get_extension_registrations.graphql +27 -0
- data/lib/project_types/extension/cli.rb +27 -2
- data/lib/project_types/extension/commands/build.rb +10 -10
- data/lib/project_types/extension/commands/create.rb +2 -3
- data/lib/project_types/extension/commands/push.rb +36 -8
- data/lib/project_types/extension/extension_project.rb +1 -1
- data/lib/project_types/extension/features/argo_serve.rb +6 -5
- data/lib/project_types/extension/forms/questions/ask_registration.rb +6 -2
- data/lib/project_types/extension/loaders/project.rb +29 -0
- data/lib/project_types/extension/loaders/specification_handler.rb +22 -0
- data/lib/project_types/extension/messages/messages.rb +4 -0
- data/lib/project_types/extension/models/app.rb +1 -1
- data/lib/project_types/extension/models/development_server.rb +2 -4
- data/lib/project_types/extension/models/specification_handlers/default.rb +4 -0
- data/lib/project_types/extension/tasks/convert_server_config.rb +3 -1
- data/lib/project_types/extension/tasks/execute_commands/base.rb +13 -0
- data/lib/project_types/extension/tasks/execute_commands/build.rb +29 -0
- data/lib/project_types/extension/tasks/execute_commands/create.rb +33 -0
- data/lib/project_types/extension/tasks/execute_commands/serve.rb +35 -0
- data/lib/project_types/extension/tasks/merge_server_config.rb +33 -22
- data/lib/project_types/rails/gem.rb +1 -2
- data/lib/project_types/script/cli.rb +7 -0
- data/lib/project_types/script/commands/connect.rb +19 -0
- data/lib/project_types/script/commands/create.rb +8 -2
- data/lib/project_types/script/commands/push.rb +35 -12
- data/lib/project_types/script/layers/application/connect_app.rb +15 -3
- data/lib/project_types/script/layers/application/create_script.rb +16 -16
- data/lib/project_types/script/layers/application/extension_points.rb +50 -26
- data/lib/project_types/script/layers/application/push_script.rb +5 -2
- data/lib/project_types/script/layers/domain/errors.rb +3 -2
- data/lib/project_types/script/layers/domain/extension_point.rb +14 -0
- data/lib/project_types/script/layers/domain/script_config.rb +6 -4
- data/lib/project_types/script/layers/infrastructure/errors.rb +38 -23
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +49 -28
- data/lib/project_types/script/layers/infrastructure/script_service.rb +22 -5
- data/lib/project_types/script/loaders/project.rb +44 -0
- data/lib/project_types/script/loaders/specification_handler.rb +22 -0
- data/lib/project_types/script/messages/messages.rb +39 -16
- data/lib/project_types/script/ui/error_handler.rb +46 -29
- data/lib/project_types/theme/commands/pull.rb +45 -17
- data/lib/project_types/theme/commands/push.rb +65 -28
- data/lib/project_types/theme/commands/serve.rb +5 -0
- data/lib/project_types/theme/messages/messages.rb +34 -18
- data/lib/shopify_cli/command.rb +6 -0
- data/lib/shopify_cli/commands/login.rb +1 -1
- data/lib/shopify_cli/commands/switch.rb +1 -1
- data/lib/shopify_cli/constants.rb +11 -2
- data/lib/shopify_cli/context.rb +66 -12
- data/lib/shopify_cli/core/executor.rb +4 -4
- data/lib/shopify_cli/environment.rb +50 -20
- data/lib/shopify_cli/form.rb +2 -0
- data/lib/shopify_cli/identity_auth.rb +4 -3
- data/lib/shopify_cli/messages/messages.rb +9 -1
- data/lib/shopify_cli/method_object.rb +21 -9
- data/lib/shopify_cli/partners_api/app_extensions/job.rb +36 -0
- data/lib/shopify_cli/partners_api/app_extensions.rb +46 -0
- data/lib/shopify_cli/partners_api/organizations.rb +2 -5
- data/lib/shopify_cli/partners_api.rb +1 -0
- data/lib/shopify_cli/project.rb +8 -7
- data/lib/shopify_cli/resources/env_file.rb +18 -6
- data/lib/shopify_cli/result.rb +61 -59
- data/lib/shopify_cli/task.rb +5 -3
- data/lib/shopify_cli/theme/dev_server/cdn/cdn_helper.rb +49 -0
- data/lib/shopify_cli/theme/dev_server/cdn_assets.rb +69 -0
- data/lib/shopify_cli/theme/dev_server/cdn_fonts.rb +8 -28
- data/lib/shopify_cli/theme/dev_server/hot-reload.js +34 -3
- data/lib/shopify_cli/theme/dev_server/hot_reload.rb +18 -2
- data/lib/shopify_cli/theme/dev_server/local_assets.rb +4 -0
- data/lib/shopify_cli/theme/dev_server/proxy/template_param_builder.rb +84 -0
- data/lib/shopify_cli/theme/dev_server/proxy.rb +10 -15
- data/lib/shopify_cli/theme/dev_server/reload_mode.rb +34 -0
- data/lib/shopify_cli/theme/dev_server.rb +8 -21
- data/lib/shopify_cli/theme/file.rb +2 -2
- data/lib/shopify_cli/theme/filter/path_matcher.rb +38 -0
- data/lib/shopify_cli/theme/ignore_filter.rb +14 -18
- data/lib/shopify_cli/theme/include_filter.rb +43 -0
- data/lib/shopify_cli/theme/syncer.rb +17 -2
- data/lib/shopify_cli/theme/theme.rb +26 -4
- data/lib/shopify_cli/thread_pool/job.rb +27 -0
- data/lib/shopify_cli/thread_pool.rb +37 -0
- data/lib/shopify_cli/version.rb +1 -1
- data/lib/shopify_cli.rb +6 -1
- data/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +3 -1
- data/vendor/deps/ruby2_keywords/LICENSE +22 -0
- data/vendor/deps/ruby2_keywords/README.md +67 -0
- data/vendor/deps/ruby2_keywords/Rakefile +54 -0
- data/vendor/deps/ruby2_keywords/lib/ruby2_keywords.rb +57 -0
- data/vendor/deps/ruby2_keywords/ruby2_keywords.gemspec +18 -0
- data/vendor/deps/ruby2_keywords/test/test_keyword.rb +41 -0
- metadata +28 -4
- data/lib/graphql/all_orgs_with_extensions.graphql +0 -37
- data/lib/project_types/extension/tasks/run_extension_command.rb +0 -82
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
require "shopify_cli"
|
|
3
|
+
|
|
4
|
+
module Extension
|
|
5
|
+
module Tasks
|
|
6
|
+
module ExecuteCommands
|
|
7
|
+
class Serve < Base
|
|
8
|
+
property! :context, accepts: ShopifyCLI::Context
|
|
9
|
+
property! :config_file_path, accepts: String
|
|
10
|
+
property :port, accepts: Integer, default: ShopifyCLI::Constants::Extension::DEFAULT_PORT
|
|
11
|
+
property :resource_url, accepts: String
|
|
12
|
+
property! :tunnel_url, accepts: String
|
|
13
|
+
|
|
14
|
+
def call
|
|
15
|
+
ShopifyCLI::Result
|
|
16
|
+
.call(&method(:merge_server_config))
|
|
17
|
+
.then { |server_config| Models::DevelopmentServer.new.serve(context, server_config) }
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
def merge_server_config
|
|
23
|
+
Tasks::MergeServerConfig.call(
|
|
24
|
+
context: context,
|
|
25
|
+
file_path: config_file_path,
|
|
26
|
+
port: port,
|
|
27
|
+
resource_url: resource_url,
|
|
28
|
+
tunnel_url: tunnel_url,
|
|
29
|
+
type: type
|
|
30
|
+
)
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -4,28 +4,39 @@ require "yaml"
|
|
|
4
4
|
|
|
5
5
|
module Extension
|
|
6
6
|
module Tasks
|
|
7
|
-
class MergeServerConfig
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
7
|
+
class MergeServerConfig
|
|
8
|
+
include SmartProperties
|
|
9
|
+
|
|
10
|
+
property! :context, accepts: ShopifyCLI::Context
|
|
11
|
+
property! :file_path, accepts: ->(path) { Pathname(path).yield_self { |pn| pn.absolute? && pn.file? } }
|
|
12
|
+
property :port, accepts: Integer, default: ShopifyCLI::Constants::Extension::DEFAULT_PORT
|
|
13
|
+
property :resource_url, accepts: String
|
|
14
|
+
property :tunnel_url, accepts: String
|
|
15
|
+
property! :type, accepts: Models::DevelopmentServerRequirements::SUPPORTED_EXTENSION_TYPES
|
|
16
|
+
|
|
17
|
+
def self.call(*args)
|
|
18
|
+
new(*args).call
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def call
|
|
22
|
+
config = YAML.load_file(file_path)
|
|
23
|
+
project = ExtensionProject.current
|
|
24
|
+
Tasks::ConvertServerConfig.call(
|
|
25
|
+
api_key: project.env.api_key,
|
|
26
|
+
context: context,
|
|
27
|
+
hash: config,
|
|
28
|
+
registration_uuid: project.registration_uuid,
|
|
29
|
+
resource_url: resource_url || project.resource_url,
|
|
30
|
+
store: project.env.shop || "",
|
|
31
|
+
title: project.title,
|
|
32
|
+
tunnel_url: tunnel_url,
|
|
33
|
+
type: type
|
|
34
|
+
)
|
|
35
|
+
rescue Psych::SyntaxError => e
|
|
36
|
+
raise(
|
|
37
|
+
ShopifyCLI::Abort,
|
|
38
|
+
ShopifyCLI::Context.message("core.yaml.error.invalid", file_name, e.message)
|
|
39
|
+
)
|
|
29
40
|
end
|
|
30
41
|
end
|
|
31
42
|
end
|
|
@@ -79,8 +79,7 @@ module Rails
|
|
|
79
79
|
def install!
|
|
80
80
|
spin = CLI::UI::SpinGroup.new
|
|
81
81
|
spin.add(ctx.message("rails.gem.installing", name)) do |spinner|
|
|
82
|
-
args =
|
|
83
|
-
args.push(name)
|
|
82
|
+
args = ["#{ENV["RUBY_BINDIR"]}gem", "install", name]
|
|
84
83
|
unless version.nil?
|
|
85
84
|
if ctx.windows? && version.include?("~")
|
|
86
85
|
args.push("-v", "\"#{version}\"")
|
|
@@ -13,6 +13,7 @@ module Script
|
|
|
13
13
|
hidden_feature(feature_set: :script_project)
|
|
14
14
|
subcommand :Create, "create", Project.project_filepath("commands/create")
|
|
15
15
|
subcommand :Push, "push", Project.project_filepath("commands/push")
|
|
16
|
+
subcommand :Connect, "connect", Project.project_filepath("commands/connect")
|
|
16
17
|
subcommand :Javy, "javy", Project.project_filepath("commands/javy")
|
|
17
18
|
end
|
|
18
19
|
ShopifyCLI::Commands.register("Script::Command", "script")
|
|
@@ -24,6 +25,7 @@ module Script
|
|
|
24
25
|
autoload :AskScriptUuid, Project.project_filepath("forms/ask_script_uuid")
|
|
25
26
|
autoload :RunAgainstShopifyOrg, Project.project_filepath("forms/run_against_shopify_org")
|
|
26
27
|
autoload :Create, Project.project_filepath("forms/create")
|
|
28
|
+
autoload :Connect, Project.project_filepath("forms/connect")
|
|
27
29
|
autoload :ScriptForm, Project.project_filepath("forms/script_form")
|
|
28
30
|
end
|
|
29
31
|
|
|
@@ -90,5 +92,10 @@ module Script
|
|
|
90
92
|
|
|
91
93
|
autoload :Errors, Project.project_filepath("errors")
|
|
92
94
|
|
|
95
|
+
module Loaders
|
|
96
|
+
autoload :Project, Script::Project.project_filepath("loaders/project")
|
|
97
|
+
autoload :SpecificationHandler, Script::Project.project_filepath("loaders/specification_handler")
|
|
98
|
+
end
|
|
99
|
+
|
|
93
100
|
class ScriptProjectError < StandardError; end
|
|
94
101
|
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
module Script
|
|
3
|
+
class Command
|
|
4
|
+
class Connect < ShopifyCLI::Command::SubCommand
|
|
5
|
+
prerequisite_task :ensure_authenticated
|
|
6
|
+
prerequisite_task ensure_project_type: :script
|
|
7
|
+
|
|
8
|
+
def call(_args, _)
|
|
9
|
+
Layers::Application::ConnectApp.call(ctx: @ctx, force: true)
|
|
10
|
+
rescue StandardError => e
|
|
11
|
+
UI::ErrorHandler.pretty_print_and_raise(e, failed_op: @ctx.message("script.connect.error.operation_failed"))
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def self.help
|
|
15
|
+
ShopifyCLI::Context.new.message("connect.help", ShopifyCLI::TOOL_NAME, ShopifyCLI::TOOL_NAME)
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -33,8 +33,14 @@ module Script
|
|
|
33
33
|
end
|
|
34
34
|
|
|
35
35
|
def self.help
|
|
36
|
-
|
|
37
|
-
|
|
36
|
+
allowed_apis = Layers::Application::ExtensionPoints.available_types.map { |type| "{{cyan:#{type}}}" }
|
|
37
|
+
allowed_languages = Layers::Application::ExtensionPoints.all_languages.map { |lang| "{{cyan:#{lang}}}" }
|
|
38
|
+
ShopifyCLI::Context.message(
|
|
39
|
+
"script.create.help",
|
|
40
|
+
ShopifyCLI::TOOL_NAME,
|
|
41
|
+
allowed_apis.join(", "),
|
|
42
|
+
allowed_languages.join(", ")
|
|
43
|
+
)
|
|
38
44
|
end
|
|
39
45
|
end
|
|
40
46
|
end
|
|
@@ -7,25 +7,48 @@ module Script
|
|
|
7
7
|
|
|
8
8
|
options do |parser, flags|
|
|
9
9
|
parser.on("--force") { |t| flags[:force] = t }
|
|
10
|
+
parser.on("--api-key=API_KEY") { |api_key| flags[:api_key] = api_key.gsub('"', "") }
|
|
11
|
+
parser.on("--api-secret=API_SECRET") { |api_secret| flags[:api_secret] = api_secret.gsub('"', "") }
|
|
12
|
+
parser.on("--uuid=UUID") do |uuid|
|
|
13
|
+
flags[:uuid] = uuid.gsub('""', "")
|
|
14
|
+
end
|
|
10
15
|
end
|
|
11
16
|
|
|
12
17
|
def call(_args, _name)
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
18
|
+
connect_to_app
|
|
19
|
+
project = load_project
|
|
20
|
+
push(project: project)
|
|
21
|
+
rescue StandardError => e
|
|
22
|
+
UI::ErrorHandler.pretty_print_and_raise(e,
|
|
23
|
+
failed_op: @ctx.message("script.push.error.operation_failed_no_api_key"))
|
|
24
|
+
end
|
|
16
25
|
|
|
17
|
-
|
|
18
|
-
|
|
26
|
+
def push(project:)
|
|
27
|
+
force = options.flags.key?(:force)
|
|
28
|
+
api_key = project.env[:api_key]
|
|
29
|
+
uuid = project.env[:extra]["UUID"]
|
|
19
30
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
msg = if api_key
|
|
24
|
-
@ctx.message("script.push.error.operation_failed_with_api_key", api_key: api_key)
|
|
31
|
+
if ShopifyCLI::Environment.interactive? || (uuid && !uuid.empty?)
|
|
32
|
+
Layers::Application::PushScript.call(ctx: @ctx, force: force, project: project)
|
|
33
|
+
@ctx.puts(@ctx.message("script.push.script_pushed", api_key: api_key))
|
|
25
34
|
else
|
|
26
|
-
@ctx.message("script.push.error.
|
|
35
|
+
raise ShopifyCLI::Abort, @ctx.message("script.push.error.operation_failed_no_uuid")
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def load_project
|
|
40
|
+
Script::Loaders::Project.load(
|
|
41
|
+
directory: Dir.pwd,
|
|
42
|
+
api_key: options.flags[:api_key],
|
|
43
|
+
api_secret: options.flags[:api_secret],
|
|
44
|
+
uuid: options.flags[:uuid]
|
|
45
|
+
)
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
def connect_to_app
|
|
49
|
+
if ShopifyCLI::Environment.interactive?
|
|
50
|
+
Layers::Application::ConnectApp.call(ctx: @ctx)
|
|
27
51
|
end
|
|
28
|
-
UI::ErrorHandler.pretty_print_and_raise(e, failed_op: msg)
|
|
29
52
|
end
|
|
30
53
|
|
|
31
54
|
def self.help
|
|
@@ -7,10 +7,11 @@ module Script
|
|
|
7
7
|
module Application
|
|
8
8
|
class ConnectApp
|
|
9
9
|
class << self
|
|
10
|
-
def call(ctx:)
|
|
10
|
+
def call(ctx:, force: false)
|
|
11
11
|
script_project_repo = Layers::Infrastructure::ScriptProjectRepository.new(ctx: ctx)
|
|
12
12
|
script_project = script_project_repo.get
|
|
13
|
-
|
|
13
|
+
|
|
14
|
+
return false if script_project.env_valid? && !force
|
|
14
15
|
|
|
15
16
|
if ShopifyCLI::Shopifolk.check && Forms::RunAgainstShopifyOrg.ask(ctx, nil, nil).response
|
|
16
17
|
ShopifyCLI::Shopifolk.act_as_shopify_organization
|
|
@@ -37,15 +38,26 @@ module Script
|
|
|
37
38
|
extension_point_type = script_project.extension_point_type
|
|
38
39
|
scripts = script_service.get_app_scripts(extension_point_type: extension_point_type)
|
|
39
40
|
|
|
40
|
-
uuid = Forms::AskScriptUuid.ask(ctx, scripts, nil)
|
|
41
|
+
uuid = Forms::AskScriptUuid.ask(ctx, scripts, nil)&.uuid
|
|
41
42
|
|
|
42
43
|
script_project_repo.create_env(
|
|
43
44
|
api_key: app["apiKey"],
|
|
44
45
|
secret: app["apiSecretKeys"].first["secret"],
|
|
45
46
|
uuid: uuid
|
|
46
47
|
)
|
|
48
|
+
ctx.done(ctx.message("script.connect.connected", app["title"]))
|
|
47
49
|
|
|
48
50
|
true
|
|
51
|
+
rescue SmartProperties::InitializationError, SmartProperties::InvalidValueError => error
|
|
52
|
+
handle_error(error, context: ctx)
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def handle_error(error, context:)
|
|
56
|
+
properties_hash = { api_key: "SHOPIFY_API_KEY", secret: "SHOPIFY_API_SECRET" }
|
|
57
|
+
missing_env_variables = error.properties.map { |p| properties_hash[p.name] }.compact.join(", ")
|
|
58
|
+
raise ShopifyCLI::Abort,
|
|
59
|
+
context.message("script.connect.error.missing_env_file_variables", missing_env_variables,
|
|
60
|
+
ShopifyCLI::TOOL_NAME)
|
|
49
61
|
end
|
|
50
62
|
|
|
51
63
|
private
|
|
@@ -8,11 +8,14 @@ module Script
|
|
|
8
8
|
class CreateScript
|
|
9
9
|
class << self
|
|
10
10
|
def call(ctx:, language:, sparse_checkout_branch:, script_name:, extension_point_type:)
|
|
11
|
-
|
|
11
|
+
script_project_repo = Infrastructure::ScriptProjectRepository.new(
|
|
12
|
+
ctx: ctx,
|
|
13
|
+
directory: script_name,
|
|
14
|
+
initial_directory: ctx.root
|
|
15
|
+
)
|
|
12
16
|
|
|
13
|
-
in_new_directory_context(
|
|
17
|
+
in_new_directory_context(script_project_repo) do
|
|
14
18
|
extension_point = ExtensionPoints.get(type: extension_point_type)
|
|
15
|
-
script_project_repo = Infrastructure::ScriptProjectRepository.new(ctx: ctx)
|
|
16
19
|
project = script_project_repo.create(
|
|
17
20
|
script_name: script_name,
|
|
18
21
|
extension_point_type: extension_point_type,
|
|
@@ -62,19 +65,16 @@ module Script
|
|
|
62
65
|
ProjectDependencies.install(ctx: ctx, task_runner: task_runner)
|
|
63
66
|
end
|
|
64
67
|
|
|
65
|
-
def in_new_directory_context(
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
ensure
|
|
76
|
-
ctx.chdir(initial_directory)
|
|
77
|
-
end
|
|
68
|
+
def in_new_directory_context(script_project_repo)
|
|
69
|
+
script_project_repo.create_project_directory
|
|
70
|
+
yield
|
|
71
|
+
rescue Infrastructure::Errors::ScriptProjectAlreadyExistsError
|
|
72
|
+
raise
|
|
73
|
+
rescue
|
|
74
|
+
script_project_repo.delete_project_directory
|
|
75
|
+
raise
|
|
76
|
+
ensure
|
|
77
|
+
script_project_repo.change_to_initial_directory
|
|
78
78
|
end
|
|
79
79
|
end
|
|
80
80
|
end
|
|
@@ -4,37 +4,61 @@ module Script
|
|
|
4
4
|
module Layers
|
|
5
5
|
module Application
|
|
6
6
|
class ExtensionPoints
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
class << self
|
|
8
|
+
def get(type:)
|
|
9
|
+
extension_point_repository.get_extension_point(type)
|
|
10
|
+
end
|
|
10
11
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
def types
|
|
13
|
+
extension_point_repository.extension_point_types
|
|
14
|
+
end
|
|
14
15
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
!ep.beta? || ShopifyCLI::Feature.enabled?(:scripts_beta_extension_points)
|
|
19
|
-
end.map(&:type)
|
|
20
|
-
end
|
|
16
|
+
def available_types
|
|
17
|
+
available_extension_points.map(&:type)
|
|
18
|
+
end
|
|
21
19
|
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
20
|
+
def deprecated_types
|
|
21
|
+
extension_point_repository
|
|
22
|
+
.extension_points
|
|
23
|
+
.select(&:deprecated?)
|
|
24
|
+
.map(&:type)
|
|
25
|
+
end
|
|
28
26
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
27
|
+
def all_languages
|
|
28
|
+
available_extension_points
|
|
29
|
+
.map { |ep| ep.library_languages(include_betas: include_beta_languages?) }
|
|
30
|
+
.flatten
|
|
31
|
+
.uniq
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def languages(type:)
|
|
35
|
+
get(type: type).library_languages(include_betas: include_beta_languages?)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def supported_language?(type:, language:)
|
|
39
|
+
languages(type: type).include?(language.downcase)
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def available_extension_points
|
|
45
|
+
extension_point_repository.extension_points.select do |ep|
|
|
46
|
+
next false if ep.deprecated?
|
|
47
|
+
ep.stable? || include_beta_extension_points?
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def extension_point_repository
|
|
52
|
+
Infrastructure::ExtensionPointRepository.new
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def include_beta_languages?
|
|
56
|
+
ShopifyCLI::Feature.enabled?(:scripts_beta_languages)
|
|
57
|
+
end
|
|
35
58
|
|
|
36
|
-
|
|
37
|
-
|
|
59
|
+
def include_beta_extension_points?
|
|
60
|
+
ShopifyCLI::Feature.enabled?(:scripts_beta_extension_points)
|
|
61
|
+
end
|
|
38
62
|
end
|
|
39
63
|
end
|
|
40
64
|
end
|
|
@@ -5,9 +5,10 @@ module Script
|
|
|
5
5
|
module Application
|
|
6
6
|
class PushScript
|
|
7
7
|
class << self
|
|
8
|
-
def call(ctx:, force:)
|
|
8
|
+
def call(ctx:, force:, project:)
|
|
9
9
|
script_project_repo = Infrastructure::ScriptProjectRepository.new(ctx: ctx)
|
|
10
10
|
script_project = script_project_repo.get
|
|
11
|
+
script_project.env = project.env
|
|
11
12
|
task_runner = Infrastructure::Languages::TaskRunner
|
|
12
13
|
.for(ctx, script_project.language, script_project.script_name)
|
|
13
14
|
|
|
@@ -47,7 +48,9 @@ module Script
|
|
|
47
48
|
module_upload_url: module_upload_url,
|
|
48
49
|
library: package.library,
|
|
49
50
|
)
|
|
50
|
-
|
|
51
|
+
if ShopifyCLI::Environment.interactive?
|
|
52
|
+
script_project_repo.update_env(uuid: uuid)
|
|
53
|
+
end
|
|
51
54
|
spinner.update_title(p_ctx.message("script.application.pushed"))
|
|
52
55
|
end
|
|
53
56
|
end
|
|
@@ -15,10 +15,11 @@ module Script
|
|
|
15
15
|
end
|
|
16
16
|
|
|
17
17
|
class MissingScriptConfigFieldError < ScriptProjectError
|
|
18
|
-
attr_reader :field
|
|
19
|
-
def initialize(field)
|
|
18
|
+
attr_reader :field, :filename
|
|
19
|
+
def initialize(field:, filename:)
|
|
20
20
|
super()
|
|
21
21
|
@field = field
|
|
22
|
+
@filename = filename
|
|
22
23
|
end
|
|
23
24
|
end
|
|
24
25
|
|
|
@@ -18,6 +18,10 @@ module Script
|
|
|
18
18
|
@beta
|
|
19
19
|
end
|
|
20
20
|
|
|
21
|
+
def stable?
|
|
22
|
+
!beta?
|
|
23
|
+
end
|
|
24
|
+
|
|
21
25
|
def deprecated?
|
|
22
26
|
@deprecated
|
|
23
27
|
end
|
|
@@ -26,6 +30,12 @@ module Script
|
|
|
26
30
|
@type.gsub("_", "-")
|
|
27
31
|
end
|
|
28
32
|
|
|
33
|
+
def library_languages(include_betas: false)
|
|
34
|
+
@libraries.all.map do |library|
|
|
35
|
+
include_betas || library.stable? ? library.language : nil
|
|
36
|
+
end.compact
|
|
37
|
+
end
|
|
38
|
+
|
|
29
39
|
class ExtensionPointLibraries
|
|
30
40
|
def initialize(config)
|
|
31
41
|
@config = config
|
|
@@ -57,6 +67,10 @@ module Script
|
|
|
57
67
|
@beta
|
|
58
68
|
end
|
|
59
69
|
|
|
70
|
+
def stable?
|
|
71
|
+
!beta?
|
|
72
|
+
end
|
|
73
|
+
|
|
60
74
|
def versioned?
|
|
61
75
|
@version
|
|
62
76
|
end
|
|
@@ -4,13 +4,13 @@ module Script
|
|
|
4
4
|
module Layers
|
|
5
5
|
module Domain
|
|
6
6
|
class ScriptConfig
|
|
7
|
-
attr_reader :content, :version, :title, :description, :configuration_ui, :configuration
|
|
7
|
+
attr_reader :content, :version, :title, :description, :configuration_ui, :configuration, :filename
|
|
8
8
|
|
|
9
9
|
REQUIRED_FIELDS = %w(version title)
|
|
10
10
|
|
|
11
|
-
def initialize(content:)
|
|
11
|
+
def initialize(content:, filename:)
|
|
12
|
+
@filename = filename
|
|
12
13
|
validate_content!(content)
|
|
13
|
-
|
|
14
14
|
@content = content
|
|
15
15
|
@version = @content["version"].to_s
|
|
16
16
|
@title = @content["title"]
|
|
@@ -23,7 +23,9 @@ module Script
|
|
|
23
23
|
|
|
24
24
|
def validate_content!(content)
|
|
25
25
|
REQUIRED_FIELDS.each do |field|
|
|
26
|
-
|
|
26
|
+
if content[field].nil?
|
|
27
|
+
raise Errors::MissingScriptConfigFieldError.new(field: field, filename: filename)
|
|
28
|
+
end
|
|
27
29
|
end
|
|
28
30
|
end
|
|
29
31
|
end
|
|
@@ -5,63 +5,78 @@ module Script
|
|
|
5
5
|
module Infrastructure
|
|
6
6
|
module Errors
|
|
7
7
|
class BuildError < ScriptProjectError; end
|
|
8
|
-
|
|
8
|
+
|
|
9
|
+
class ScriptConfigurationDefinitionError < ScriptProjectError
|
|
10
|
+
attr_reader :filename
|
|
11
|
+
def initialize(message:, filename:)
|
|
12
|
+
@filename = filename
|
|
13
|
+
super(message)
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
class ScriptConfigSyntaxError < ScriptProjectError
|
|
18
|
+
attr_reader :filename
|
|
19
|
+
def initialize(filename)
|
|
20
|
+
@filename = filename
|
|
21
|
+
super()
|
|
22
|
+
end
|
|
23
|
+
end
|
|
9
24
|
|
|
10
25
|
class ScriptConfigMissingKeysError < ScriptProjectError
|
|
11
|
-
attr_reader :missing_keys
|
|
12
|
-
def initialize(missing_keys)
|
|
26
|
+
attr_reader :missing_keys, :filename
|
|
27
|
+
def initialize(missing_keys:, filename:)
|
|
13
28
|
super()
|
|
14
29
|
@missing_keys = missing_keys
|
|
30
|
+
@filename = filename
|
|
15
31
|
end
|
|
16
32
|
end
|
|
17
33
|
|
|
18
34
|
class ScriptConfigInvalidValueError < ScriptProjectError
|
|
19
|
-
attr_reader :valid_input_modes
|
|
20
|
-
def initialize(valid_input_modes)
|
|
35
|
+
attr_reader :valid_input_modes, :filename
|
|
36
|
+
def initialize(valid_input_modes:, filename:)
|
|
21
37
|
super()
|
|
22
38
|
@valid_input_modes = valid_input_modes
|
|
39
|
+
@filename = filename
|
|
23
40
|
end
|
|
24
41
|
end
|
|
25
42
|
|
|
26
43
|
class ScriptConfigFieldsMissingKeysError < ScriptProjectError
|
|
27
|
-
attr_reader :missing_keys
|
|
28
|
-
def initialize(missing_keys)
|
|
44
|
+
attr_reader :missing_keys, :filename
|
|
45
|
+
def initialize(missing_keys:, filename:)
|
|
29
46
|
super()
|
|
30
47
|
@missing_keys = missing_keys
|
|
48
|
+
@filename = filename
|
|
31
49
|
end
|
|
32
50
|
end
|
|
33
51
|
|
|
34
52
|
class ScriptConfigFieldsInvalidValueError < ScriptProjectError
|
|
35
|
-
attr_reader :valid_types
|
|
36
|
-
def initialize(valid_types)
|
|
53
|
+
attr_reader :valid_types, :filename
|
|
54
|
+
def initialize(valid_types:, filename:)
|
|
37
55
|
super()
|
|
38
56
|
@valid_types = valid_types
|
|
57
|
+
@filename = filename
|
|
39
58
|
end
|
|
40
59
|
end
|
|
41
60
|
|
|
42
|
-
class
|
|
61
|
+
class ScriptEnvAppNotConnectedError < ScriptProjectError; end
|
|
43
62
|
|
|
44
|
-
class
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
attr_reader :field
|
|
48
|
-
def initialize(field)
|
|
63
|
+
class ScriptConfigParseError < ScriptProjectError
|
|
64
|
+
attr_reader :filename, :serialization_format
|
|
65
|
+
def initialize(filename:, serialization_format:)
|
|
49
66
|
super()
|
|
50
|
-
@
|
|
67
|
+
@filename = filename
|
|
68
|
+
@serialization_format = serialization_format
|
|
51
69
|
end
|
|
52
70
|
end
|
|
53
71
|
|
|
54
|
-
class
|
|
55
|
-
attr_reader :
|
|
56
|
-
def initialize(
|
|
72
|
+
class NoScriptConfigFileError < ScriptProjectError
|
|
73
|
+
attr_reader :filename
|
|
74
|
+
def initialize(filename)
|
|
57
75
|
super()
|
|
58
|
-
@
|
|
76
|
+
@filename = filename
|
|
59
77
|
end
|
|
60
78
|
end
|
|
61
79
|
|
|
62
|
-
class NoScriptConfigYmlFileError < ScriptProjectError; end
|
|
63
|
-
class NoScriptConfigFileError < ScriptProjectError; end
|
|
64
|
-
|
|
65
80
|
class APILibraryNotFoundError < ScriptProjectError
|
|
66
81
|
attr_reader :library_name
|
|
67
82
|
def initialize(library_name)
|