shopify-cli 2.7.2 → 2.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/CODEOWNERS +2 -2
- data/.github/workflows/shopify.yml +1 -1
- data/.gitignore +1 -0
- data/.ruby-version +1 -1
- data/CHANGELOG.md +52 -0
- data/Codespace.dockerfile +2 -2
- data/Gemfile.lock +4 -4
- data/RELEASING.md +4 -3
- data/Tests.dockerfile +2 -2
- data/dev.yml +3 -3
- data/ext/javy/hashes/javy-arm-macos-v0.1.0.gz.sha256 +1 -0
- data/ext/javy/hashes/javy-x86_64-linux-v0.1.0.gz.sha256 +1 -0
- data/ext/javy/hashes/javy-x86_64-macos-v0.1.0.gz.sha256 +1 -0
- data/ext/javy/hashes/javy-x86_64-windows-v0.1.0.gz.sha256 +1 -0
- data/ext/javy/javy.rb +31 -13
- 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/commands/create.rb +1 -1
- data/lib/project_types/rails/gem.rb +1 -2
- data/lib/project_types/script/cli.rb +8 -1
- 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/config/extension_points.yml +10 -2
- data/lib/project_types/script/graphql/app_script_set.graphql +2 -2
- data/lib/project_types/script/layers/application/connect_app.rb +15 -3
- data/lib/project_types/script/layers/application/create_script.rb +17 -17
- data/lib/project_types/script/layers/application/extension_points.rb +50 -26
- data/lib/project_types/script/layers/application/push_script.rb +6 -3
- data/lib/project_types/script/layers/domain/errors.rb +1 -4
- data/lib/project_types/script/layers/domain/extension_point.rb +14 -0
- data/lib/project_types/script/layers/domain/push_package.rb +3 -3
- data/lib/project_types/script/layers/domain/{script_json.rb → script_config.rb} +2 -2
- data/lib/project_types/script/layers/domain/script_project.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/errors.rb +30 -5
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +2 -2
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +125 -27
- data/lib/project_types/script/layers/infrastructure/script_service.rb +11 -11
- 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 +34 -3
- data/lib/project_types/script/ui/error_handler.rb +35 -15
- data/lib/project_types/theme/commands/pull.rb +39 -16
- data/lib/project_types/theme/commands/push.rb +60 -29
- data/lib/project_types/theme/commands/serve.rb +5 -0
- data/lib/project_types/theme/messages/messages.rb +30 -18
- data/lib/shopify_cli/command.rb +6 -0
- data/lib/shopify_cli/commands/login.rb +11 -5
- data/lib/shopify_cli/commands/switch.rb +1 -1
- data/lib/shopify_cli/constants.rb +5 -0
- data/lib/shopify_cli/context.rb +66 -11
- data/lib/shopify_cli/environment.rb +15 -4
- data/lib/shopify_cli/form.rb +2 -0
- data/lib/shopify_cli/git.rb +2 -0
- data/lib/shopify_cli/identity_auth.rb +1 -0
- data/lib/shopify_cli/messages/messages.rb +10 -2
- 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/services/app/create/rails_service.rb +1 -1
- data/lib/shopify_cli/theme/dev_server/cdn_fonts.rb +73 -0
- data/lib/shopify_cli/theme/dev_server/hot-reload.js +57 -10
- data/lib/shopify_cli/theme/dev_server/hot_reload.rb +18 -2
- 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/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/tunnel.rb +1 -0
- data/lib/shopify_cli/version.rb +1 -1
- data/lib/shopify_cli.rb +4 -0
- data/shopify-cli.gemspec +1 -1
- data/vendor/deps/cli-kit/lib/cli/kit/error_handler.rb +3 -1
- metadata +26 -7
- data/lib/graphql/all_orgs_with_extensions.graphql +0 -37
- data/lib/project_types/extension/tasks/run_extension_command.rb +0 -82
@@ -89,6 +89,9 @@ module Extension
|
|
89
89
|
help: <<~HELP,
|
90
90
|
Push the current extension to Shopify.
|
91
91
|
Usage: {{command:%s extension push}}
|
92
|
+
Options:
|
93
|
+
{{command:--api-key=API_KEY}} Connect your extension and app by inserting your app's API key (which you can get from your app setup page on shopify.dev).
|
94
|
+
{{command:--extension-id=EXTENSION_ID}} The id of the extension's registration.
|
92
95
|
HELP
|
93
96
|
frame_title: "Pushing your extension to Shopify",
|
94
97
|
waiting_text: "Pushing code to Shopify…",
|
@@ -173,6 +176,7 @@ module Extension
|
|
173
176
|
errors: {
|
174
177
|
unknown_type: "Unknown extension type %s",
|
175
178
|
package_not_found: "`%s` package not found.",
|
179
|
+
missing_api_key: "Missing api_key.",
|
176
180
|
module_not_found: "Unable to find module %s. Ensure your dependencies are up-to-date and try again.",
|
177
181
|
},
|
178
182
|
warnings: {
|
@@ -40,7 +40,7 @@ module Extension
|
|
40
40
|
|
41
41
|
def serve(context, server_config)
|
42
42
|
CLI::Kit::System.popen3(executable, "serve", "-") do |input, out, err, status|
|
43
|
-
context.
|
43
|
+
context.debug("Sending configuration data to extension development server …")
|
44
44
|
input << server_config.to_yaml
|
45
45
|
input.close
|
46
46
|
|
@@ -57,17 +57,15 @@ module Extension
|
|
57
57
|
private
|
58
58
|
|
59
59
|
def forward_output_to_user(out, err, ctx)
|
60
|
-
ctx.
|
60
|
+
ctx.debug("Starting message processing threads to relay output produced by the extension development server …")
|
61
61
|
|
62
62
|
Thread.new do
|
63
|
-
ctx.puts("Ready to process standard output")
|
64
63
|
while (line = out.gets)
|
65
64
|
ctx.puts(line)
|
66
65
|
end
|
67
66
|
end
|
68
67
|
|
69
68
|
Thread.new do
|
70
|
-
ctx.puts("Ready to process standard error")
|
71
69
|
while (error = err.gets)
|
72
70
|
ctx.puts(error)
|
73
71
|
end
|
@@ -9,11 +9,12 @@ module Extension
|
|
9
9
|
property! :api_key, accepts: String
|
10
10
|
property! :context, accepts: ShopifyCLI::Context
|
11
11
|
property! :hash, accepts: Hash
|
12
|
+
property :port, accepts: Integer, default: ShopifyCLI::Constants::Extension::DEFAULT_PORT
|
12
13
|
property! :registration_uuid, accepts: String
|
13
14
|
property :resource_url, accepts: String
|
14
15
|
property! :store, accepts: String
|
15
16
|
property! :title, accepts: String
|
16
|
-
property
|
17
|
+
property :tunnel_url, accepts: String
|
17
18
|
property! :type, accepts: String
|
18
19
|
|
19
20
|
def self.call(*args)
|
@@ -46,6 +47,7 @@ module Extension
|
|
46
47
|
end
|
47
48
|
server_config = Models::ServerConfig::Root.new(
|
48
49
|
extensions: [extension],
|
50
|
+
port: port,
|
49
51
|
public_url: tunnel_url,
|
50
52
|
store: store
|
51
53
|
)
|
@@ -0,0 +1,13 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "shopify_cli"
|
3
|
+
|
4
|
+
module Extension
|
5
|
+
module Tasks
|
6
|
+
module ExecuteCommands
|
7
|
+
class Base
|
8
|
+
include SmartProperties
|
9
|
+
property! :type, accepts: Models::DevelopmentServerRequirements::SUPPORTED_EXTENSION_TYPES
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "shopify_cli"
|
3
|
+
|
4
|
+
module Extension
|
5
|
+
module Tasks
|
6
|
+
module ExecuteCommands
|
7
|
+
class Build < Base
|
8
|
+
property! :context, accepts: ShopifyCLI::Context
|
9
|
+
property! :config_file_path, accepts: String
|
10
|
+
|
11
|
+
def call
|
12
|
+
ShopifyCLI::Result
|
13
|
+
.call(&method(:merge_server_config))
|
14
|
+
.then { |server_config| Models::DevelopmentServer.new.build(server_config) }
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def merge_server_config
|
20
|
+
Tasks::MergeServerConfig.call(
|
21
|
+
context: context,
|
22
|
+
file_path: config_file_path,
|
23
|
+
type: type
|
24
|
+
)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "shopify_cli"
|
3
|
+
|
4
|
+
module Extension
|
5
|
+
module Tasks
|
6
|
+
module ExecuteCommands
|
7
|
+
class Create < Base
|
8
|
+
property! :template, accepts: Models::ServerConfig::Development::VALID_TEMPLATES
|
9
|
+
property! :root_dir, accepts: String
|
10
|
+
|
11
|
+
def call
|
12
|
+
ShopifyCLI::Result.success(generate_config)
|
13
|
+
.then { |server_config| Models::DevelopmentServer.new.create(server_config) }
|
14
|
+
.unwrap do |error|
|
15
|
+
raise error unless error.nil?
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def generate_config
|
22
|
+
extension = Models::ServerConfig::Extension.build(
|
23
|
+
template: template,
|
24
|
+
type: type,
|
25
|
+
root_dir: root_dir,
|
26
|
+
)
|
27
|
+
|
28
|
+
Models::ServerConfig::Root.new(extensions: [extension])
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -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
|
@@ -156,10 +156,10 @@ module Rails
|
|
156
156
|
|
157
157
|
CLI::UI::Frame.open(@ctx.message("rails.create.generating_app", name)) do
|
158
158
|
new_command = %w(rails new)
|
159
|
+
new_command << name
|
159
160
|
new_command += DEFAULT_RAILS_FLAGS
|
160
161
|
new_command << "--database=#{db}"
|
161
162
|
new_command += options.flags[:rails_opts].split unless options.flags[:rails_opts].nil?
|
162
|
-
new_command << name
|
163
163
|
|
164
164
|
syscall(new_command)
|
165
165
|
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
|
|
@@ -46,7 +48,7 @@ module Script
|
|
46
48
|
autoload :PushPackage, Project.project_filepath("layers/domain/push_package")
|
47
49
|
autoload :Metadata, Project.project_filepath("layers/domain/metadata")
|
48
50
|
autoload :ExtensionPoint, Project.project_filepath("layers/domain/extension_point")
|
49
|
-
autoload :
|
51
|
+
autoload :ScriptConfig, Project.project_filepath("layers/domain/script_config")
|
50
52
|
autoload :ScriptProject, Project.project_filepath("layers/domain/script_project")
|
51
53
|
end
|
52
54
|
|
@@ -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
|
@@ -18,11 +18,19 @@ shipping_methods:
|
|
18
18
|
beta: true
|
19
19
|
package: "@shopify/scripts-checkout-apis"
|
20
20
|
repo: "https://github.com/Shopify/scripts-apis-examples"
|
21
|
-
|
21
|
+
merchandise_discount_types:
|
22
22
|
beta: true
|
23
23
|
domain: 'discounts'
|
24
24
|
libraries:
|
25
25
|
typescript:
|
26
26
|
beta: true
|
27
|
-
package: "@shopify/scripts-
|
27
|
+
package: "@shopify/scripts-discounts-apis"
|
28
|
+
repo: "https://github.com/Shopify/scripts-apis-examples"
|
29
|
+
delivery_discount_types:
|
30
|
+
beta: true
|
31
|
+
domain: 'discounts'
|
32
|
+
libraries:
|
33
|
+
typescript:
|
34
|
+
beta: true
|
35
|
+
package: "@shopify/scripts-discounts-apis"
|
28
36
|
repo: "https://github.com/Shopify/scripts-apis-examples"
|
@@ -6,7 +6,7 @@ mutation AppScriptSet(
|
|
6
6
|
$force: Boolean,
|
7
7
|
$schemaMajorVersion: String,
|
8
8
|
$schemaMinorVersion: String,
|
9
|
-
$
|
9
|
+
$scriptConfigVersion: String!,
|
10
10
|
$configurationUi: Boolean!,
|
11
11
|
$configurationDefinition: String!,
|
12
12
|
$moduleUploadUrl: String!,
|
@@ -20,7 +20,7 @@ mutation AppScriptSet(
|
|
20
20
|
force: $force
|
21
21
|
schemaMajorVersion: $schemaMajorVersion
|
22
22
|
schemaMinorVersion: $schemaMinorVersion,
|
23
|
-
|
23
|
+
scriptConfigVersion: $scriptConfigVersion,
|
24
24
|
configurationUi: $configurationUi,
|
25
25
|
configurationDefinition: $configurationDefinition,
|
26
26
|
moduleUploadUrl: $moduleUploadUrl,
|
@@ -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,
|
@@ -36,7 +39,7 @@ module Script
|
|
36
39
|
)
|
37
40
|
|
38
41
|
install_dependencies(ctx, language, script_name, project_creator)
|
39
|
-
script_project_repo.
|
42
|
+
script_project_repo.update_script_config(title: script_name)
|
40
43
|
project
|
41
44
|
end
|
42
45
|
end
|
@@ -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
|