shopify-cli 2.2.0 → 2.4.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/.github/CODEOWNERS +1 -0
- data/.github/ISSUE_TEMPLATE.md +0 -4
- data/.github/workflows/shopify.yml +106 -0
- data/.gitignore +2 -0
- data/CHANGELOG.md +23 -0
- data/CONTRIBUTING.md +23 -0
- data/Dockerfile +19 -0
- data/Gemfile +1 -0
- data/Gemfile.lock +50 -13
- data/Rakefile +66 -0
- data/dev.yml +11 -1
- 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 +14 -0
- data/lib/project_types/extension/commands/build.rb +30 -2
- data/lib/project_types/extension/commands/create.rb +25 -0
- data/lib/project_types/extension/commands/push.rb +0 -1
- data/lib/project_types/extension/features/argo.rb +1 -11
- data/lib/project_types/extension/forms/create.rb +4 -1
- data/lib/project_types/extension/forms/questions/ask_template.rb +44 -0
- data/lib/project_types/extension/messages/messages.rb +3 -0
- data/lib/project_types/extension/models/development_server.rb +35 -0
- data/lib/project_types/extension/models/development_server_requirements.rb +17 -0
- 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_handlers/checkout_post_purchase.rb +10 -0
- data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +1 -1
- data/lib/project_types/extension/tasks/choose_next_available_port.rb +1 -1
- data/lib/project_types/extension/tasks/run_extension_command.rb +58 -0
- data/lib/project_types/node/commands/create.rb +1 -5
- data/lib/project_types/rails/commands/create.rb +1 -5
- data/lib/project_types/script/cli.rb +2 -0
- data/lib/project_types/script/graphql/app_script_set.graphql +40 -0
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +0 -44
- data/lib/project_types/script/graphql/module_upload_url_generate.graphql +9 -0
- data/lib/project_types/script/layers/application/push_script.rb +10 -1
- data/lib/project_types/script/layers/domain/push_package.rb +1 -14
- data/lib/project_types/script/layers/infrastructure/api_clients.rb +89 -0
- data/lib/project_types/script/layers/infrastructure/errors.rb +2 -0
- data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_project_creator.rb +1 -1
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +0 -1
- data/lib/project_types/script/layers/infrastructure/script_service.rb +29 -94
- data/lib/project_types/script/layers/infrastructure/script_uploader.rb +27 -0
- data/lib/project_types/script/messages/messages.rb +3 -0
- data/lib/project_types/script/tasks/ensure_env.rb +2 -2
- data/lib/project_types/script/ui/error_handler.rb +6 -1
- data/lib/project_types/theme/commands/pull.rb +6 -0
- data/lib/project_types/theme/commands/push.rb +6 -0
- data/lib/shopify-cli/constants.rb +26 -0
- data/lib/shopify-cli/environment.rb +60 -0
- data/lib/shopify-cli/git.rb +2 -2
- data/lib/shopify-cli/identity_auth.rb +16 -23
- data/lib/shopify-cli/partners_api.rb +3 -27
- data/lib/shopify-cli/process_supervision.rb +14 -14
- data/lib/shopify-cli/theme/dev_server/header_hash.rb +4 -0
- data/lib/shopify-cli/theme/dev_server/hot_reload.rb +4 -5
- data/lib/shopify-cli/theme/dev_server/proxy.rb +13 -1
- data/lib/shopify-cli/theme/development_theme.rb +16 -2
- data/lib/shopify-cli/theme/file.rb +11 -3
- data/lib/shopify-cli/theme/ignore_filter.rb +7 -0
- data/lib/shopify-cli/theme/syncer.rb +1 -1
- data/lib/shopify-cli/version.rb +1 -1
- data/lib/shopify_cli.rb +4 -2
- data/shopify-cli.gemspec +3 -3
- metadata +31 -9
- data/.github/workflows/build.yml +0 -28
@@ -12,6 +12,34 @@ module Extension
|
|
12
12
|
NPM_BUILD_COMMAND = %w(run-script build)
|
13
13
|
|
14
14
|
def call(_args, _command_name)
|
15
|
+
project = ExtensionProject.current(force_reload: true)
|
16
|
+
return run_new_flow(project) if supports_development_server?(project.specification_identifier)
|
17
|
+
run_legacy_flow
|
18
|
+
end
|
19
|
+
|
20
|
+
def self.help
|
21
|
+
ShopifyCli::Context.new.message("build.help", ShopifyCli::TOOL_NAME)
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def run_new_flow(project)
|
27
|
+
Tasks::RunExtensionCommand.new(
|
28
|
+
type: project.specification_identifier.downcase,
|
29
|
+
command: "build"
|
30
|
+
).call
|
31
|
+
|
32
|
+
@ctx.puts(@ctx.message("build.build_success_message"))
|
33
|
+
rescue => error
|
34
|
+
if error.message.include?("no such file or directory")
|
35
|
+
@ctx.abort(@ctx.message("build.directory_not_found"))
|
36
|
+
else
|
37
|
+
@ctx.debug(error)
|
38
|
+
@ctx.abort(@ctx.message("build.build_failure_message"))
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def run_legacy_flow
|
15
43
|
system = ShopifyCli::JsSystem.new(ctx: @ctx)
|
16
44
|
|
17
45
|
CLI::UI::Frame.open(@ctx.message("build.frame_title", system.package_manager)) do
|
@@ -20,8 +48,8 @@ module Extension
|
|
20
48
|
end
|
21
49
|
end
|
22
50
|
|
23
|
-
def
|
24
|
-
|
51
|
+
def supports_development_server?(type)
|
52
|
+
Models::DevelopmentServerRequirements.supported?(type)
|
25
53
|
end
|
26
54
|
end
|
27
55
|
end
|
@@ -3,6 +3,10 @@
|
|
3
3
|
module Extension
|
4
4
|
class Command
|
5
5
|
class Create < ShopifyCli::SubCommand
|
6
|
+
DEVELOPMENT_SERVER_SUPPORTED_TYPES = [
|
7
|
+
"checkout_ui_extension",
|
8
|
+
]
|
9
|
+
|
6
10
|
prerequisite_task :ensure_authenticated
|
7
11
|
|
8
12
|
options do |parser, flags|
|
@@ -18,6 +22,8 @@ module Extension
|
|
18
22
|
@ctx.abort(message_for_extension["create.errors.directory_exists", form.directory_name])
|
19
23
|
end
|
20
24
|
|
25
|
+
return use_new_create_flow(form, message_for_extension) if supports_development_server?(form.type)
|
26
|
+
|
21
27
|
if form.type.create(form.directory_name, @ctx, getting_started: options.flags[:getting_started])
|
22
28
|
ExtensionProject.write_cli_file(context: @ctx, type: form.type.identifier)
|
23
29
|
ExtensionProject.write_env_file(
|
@@ -47,6 +53,25 @@ module Extension
|
|
47
53
|
|
48
54
|
yield form, form.type.method(:message_for_extension)
|
49
55
|
end
|
56
|
+
|
57
|
+
def supports_development_server?(type)
|
58
|
+
Models::DevelopmentServerRequirements.supported?(type.identifier)
|
59
|
+
end
|
60
|
+
|
61
|
+
def use_new_create_flow(form, msg)
|
62
|
+
Tasks::RunExtensionCommand.new(
|
63
|
+
root_dir: form.directory_name,
|
64
|
+
template: form.template,
|
65
|
+
type: form.type.identifier.downcase,
|
66
|
+
command: "create"
|
67
|
+
).call
|
68
|
+
|
69
|
+
@ctx.puts(msg["create.ready_to_start", form.directory_name, form.name])
|
70
|
+
@ctx.puts(msg["create.learn_more", form.type.name])
|
71
|
+
rescue => error
|
72
|
+
@ctx.debug(error)
|
73
|
+
@ctx.puts(msg["create.try_again"])
|
74
|
+
end
|
50
75
|
end
|
51
76
|
end
|
52
77
|
end
|
@@ -11,7 +11,6 @@ module Extension
|
|
11
11
|
def call(args, name)
|
12
12
|
Command::Register.new(@ctx).call(args, name) unless project.registered?
|
13
13
|
Command::Build.new(@ctx).call(args, name) unless specification_handler.specification.options[:skip_build]
|
14
|
-
|
15
14
|
CLI::UI::Frame.open(@ctx.message("push.frame_title")) do
|
16
15
|
updated_draft_version = update_draft
|
17
16
|
show_message(updated_draft_version)
|
@@ -19,16 +19,6 @@ module Extension
|
|
19
19
|
YARN_RUN_SCRIPT_NAME = %w(build).freeze
|
20
20
|
private_constant :YARN_INSTALL_COMMAND, :YARN_INSTALL_PARAMETERS, :YARN_RUN_COMMAND, :YARN_RUN_SCRIPT_NAME
|
21
21
|
|
22
|
-
UI_EXTENSIONS_CHECKOUT = "@shopify/checkout-ui-extensions"
|
23
|
-
UI_EXTENSIONS_ADMIN = "@shopify/admin-ui-extensions"
|
24
|
-
UI_EXTENSIONS_POST_PURCHASE = "@shopify/post-purchase-ui-extensions"
|
25
|
-
|
26
|
-
PACKAGE_NAMES = [
|
27
|
-
UI_EXTENSIONS_CHECKOUT,
|
28
|
-
UI_EXTENSIONS_ADMIN,
|
29
|
-
UI_EXTENSIONS_POST_PURCHASE,
|
30
|
-
].freeze
|
31
|
-
|
32
22
|
def create(directory_name, identifier, context)
|
33
23
|
Features::ArgoSetup.new(git_template: git_template).call(directory_name, identifier, context)
|
34
24
|
end
|
@@ -54,7 +44,7 @@ module Extension
|
|
54
44
|
def renderer_package(context)
|
55
45
|
js_system = ShopifyCli::JsSystem.new(ctx: context)
|
56
46
|
Tasks::FindNpmPackages
|
57
|
-
.exactly_one_of(
|
47
|
+
.exactly_one_of(renderer_package_name, js_system: js_system)
|
58
48
|
.unwrap { |err| raise err }
|
59
49
|
rescue Extension::PackageResolutionFailed
|
60
50
|
context.abort(
|
@@ -3,7 +3,7 @@
|
|
3
3
|
module Extension
|
4
4
|
module Forms
|
5
5
|
class Create < ShopifyCli::Form
|
6
|
-
flag_arguments :name, :type, :api_key
|
6
|
+
flag_arguments :name, :type, :api_key, :template
|
7
7
|
|
8
8
|
attr_reader :app
|
9
9
|
|
@@ -13,6 +13,7 @@ module Extension
|
|
13
13
|
property :app, accepts: Models::App
|
14
14
|
property :name, accepts: String
|
15
15
|
property :type, accepts: Models::SpecificationHandlers::Default
|
16
|
+
property :template, accepts: String
|
16
17
|
|
17
18
|
def complete?
|
18
19
|
!!(app && name && type)
|
@@ -23,6 +24,7 @@ module Extension
|
|
23
24
|
ShopifyCli::Result.wrap(ExtensionProjectDetails.new)
|
24
25
|
.then(&Questions::AskApp.new(ctx: ctx, api_key: api_key))
|
25
26
|
.then(&Questions::AskType.new(ctx: ctx, type: type))
|
27
|
+
.then(&Questions::AskTemplate.new(ctx: ctx))
|
26
28
|
.then(&Questions::AskName.new(ctx: ctx, name: name))
|
27
29
|
.unwrap { |e| raise e }
|
28
30
|
.tap do |project_details|
|
@@ -30,6 +32,7 @@ module Extension
|
|
30
32
|
|
31
33
|
self.app = project_details.app
|
32
34
|
self.type = project_details.type
|
35
|
+
self.template = project_details.template
|
33
36
|
self.name = project_details.name
|
34
37
|
end
|
35
38
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module Extension
|
2
|
+
module Forms
|
3
|
+
module Questions
|
4
|
+
class AskTemplate
|
5
|
+
include ShopifyCli::MethodObject
|
6
|
+
|
7
|
+
TEMPLATE_REQUIRED_TYPES = [
|
8
|
+
"checkout_ui_extension",
|
9
|
+
]
|
10
|
+
|
11
|
+
property! :ctx
|
12
|
+
property :prompt,
|
13
|
+
accepts: ->(prompt) { prompt.respond_to?(:call) },
|
14
|
+
default: -> { CLI::UI::Prompt.method(:ask) }
|
15
|
+
|
16
|
+
def call(project_details)
|
17
|
+
return project_details unless template_required?(project_details)
|
18
|
+
project_details.template = choose_interactively
|
19
|
+
project_details
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def template_required?(project_details)
|
25
|
+
return false unless extension_server_beta?
|
26
|
+
type = project_details&.type&.identifier
|
27
|
+
TEMPLATE_REQUIRED_TYPES.include?(type.downcase)
|
28
|
+
end
|
29
|
+
|
30
|
+
def extension_server_beta?
|
31
|
+
ShopifyCli::Shopifolk.check && ShopifyCli::Feature.enabled?(:extension_server_beta)
|
32
|
+
end
|
33
|
+
|
34
|
+
def choose_interactively
|
35
|
+
prompt.call(ctx.message("create.ask_template")) do |handler|
|
36
|
+
Models::ServerConfig::Development::VALID_TEMPLATES.each do |template|
|
37
|
+
handler.option(template) { template }
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -45,6 +45,7 @@ module Extension
|
|
45
45
|
"or try creating a new app using {{command:shopify [node|rails] create}}.",
|
46
46
|
loading_apps: "Loading your apps…",
|
47
47
|
no_available_extensions: "{{x}} There are no available extensions for this app.",
|
48
|
+
ask_template: "Select a template to use for your extension",
|
48
49
|
},
|
49
50
|
connect: {
|
50
51
|
connected: "Project now connected to {{green:%s: %s}}",
|
@@ -67,6 +68,8 @@ module Extension
|
|
67
68
|
HELP
|
68
69
|
frame_title: "Building extension with: %s…",
|
69
70
|
build_failure_message: "Failed to build extension code.",
|
71
|
+
build_success_message: "Build was successful!",
|
72
|
+
directory_not_found: "Build directory not found.",
|
70
73
|
},
|
71
74
|
register: {
|
72
75
|
help: <<~HELP,
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Extension
|
4
|
+
module Models
|
5
|
+
class DevelopmentServer
|
6
|
+
class DevelopmentServerError < StandardError; end
|
7
|
+
|
8
|
+
include SmartProperties
|
9
|
+
|
10
|
+
EXECUTABLE_PATH = "../../../../../ext/shopify-cli/shopify-extensions/shopify-extensions"
|
11
|
+
|
12
|
+
property! :executable, converts: :to_s, default: File.expand_path(EXECUTABLE_PATH, __FILE__)
|
13
|
+
|
14
|
+
def create(server_config)
|
15
|
+
CLI::Kit::System.capture3(executable, "create", "-", stdin_data: server_config.to_yaml)
|
16
|
+
rescue StandardError => error
|
17
|
+
raise error
|
18
|
+
end
|
19
|
+
|
20
|
+
def build(server_config)
|
21
|
+
_, error, pid = CLI::Kit::System.capture3(executable, "build", "-", stdin_data: server_config.to_yaml)
|
22
|
+
return if pid.success?
|
23
|
+
raise DevelopmentServerError, error
|
24
|
+
end
|
25
|
+
|
26
|
+
def serve
|
27
|
+
raise NotImplementedError
|
28
|
+
end
|
29
|
+
|
30
|
+
def version
|
31
|
+
raise NotImplementedError
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
require "shopify_cli"
|
3
|
+
|
4
|
+
module Extension
|
5
|
+
module Models
|
6
|
+
class DevelopmentServerRequirements
|
7
|
+
SUPPORTED_EXTENSION_TYPES = [
|
8
|
+
"checkout_ui_extension",
|
9
|
+
]
|
10
|
+
|
11
|
+
def self.supported?(type)
|
12
|
+
return false unless SUPPORTED_EXTENSION_TYPES.include?(type.downcase)
|
13
|
+
ShopifyCli::Shopifolk.check && ShopifyCli::Feature.enabled?(:extension_server_beta)
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Extension
|
4
|
+
module Models
|
5
|
+
module ServerConfig
|
6
|
+
class Base
|
7
|
+
def to_h
|
8
|
+
to_hash
|
9
|
+
end
|
10
|
+
|
11
|
+
def to_hash
|
12
|
+
is_hashable = ->(obj) { obj.respond_to?(:to_hash) }
|
13
|
+
is_collection_of_hashables = ->(obj) { obj.is_a?(Enumerable) && obj.all?(&is_hashable) }
|
14
|
+
|
15
|
+
self.class.properties.each.reduce({}) do |data, (_, property)|
|
16
|
+
data.merge(property.name.to_s => send(property.reader).yield_self do |value|
|
17
|
+
case value
|
18
|
+
when is_collection_of_hashables
|
19
|
+
value.map { |element| element.to_hash.transform_keys(&:to_s) }
|
20
|
+
when is_hashable
|
21
|
+
value.to_hash.transform_keys(&:to_s)
|
22
|
+
else
|
23
|
+
value
|
24
|
+
end
|
25
|
+
end)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Extension
|
2
|
+
module Models
|
3
|
+
module ServerConfig
|
4
|
+
class Development < Base
|
5
|
+
include SmartProperties
|
6
|
+
VALID_TEMPLATES = [
|
7
|
+
"javascript",
|
8
|
+
"javascript-react",
|
9
|
+
"typescript",
|
10
|
+
"typescript-react",
|
11
|
+
]
|
12
|
+
|
13
|
+
CURRENT_DIRECTORY = "."
|
14
|
+
|
15
|
+
property :root_dir, accepts: String, default: CURRENT_DIRECTORY
|
16
|
+
property! :build_dir, accepts: String, default: "build"
|
17
|
+
property :template, accepts: VALID_TEMPLATES
|
18
|
+
property :renderer, accepts: ServerConfig::DevelopmentRenderer
|
19
|
+
property :entries, accepts: ServerConfig::DevelopmentEntries
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Extension
|
4
|
+
module Models
|
5
|
+
module ServerConfig
|
6
|
+
class DevelopmentEntries < Base
|
7
|
+
include SmartProperties
|
8
|
+
|
9
|
+
JAVASCRIPT = "javascript"
|
10
|
+
JAVASCRIPT_REACT = "javascript-react"
|
11
|
+
TYPESCRIPT = "typescript"
|
12
|
+
TYPESCRIPT_REACT = "typescript-react"
|
13
|
+
|
14
|
+
VALID_ENTRY_POINTS = [
|
15
|
+
"src/index.js",
|
16
|
+
"src/index.jsx",
|
17
|
+
"src/index.ts",
|
18
|
+
"src/index.tsx",
|
19
|
+
]
|
20
|
+
|
21
|
+
property! :main, accepts: VALID_ENTRY_POINTS
|
22
|
+
|
23
|
+
def self.find(template)
|
24
|
+
case template
|
25
|
+
when JAVASCRIPT
|
26
|
+
new(main: "src/index.js")
|
27
|
+
when JAVASCRIPT_REACT
|
28
|
+
new(main: "src/index.jsx")
|
29
|
+
when TYPESCRIPT
|
30
|
+
new(main: "src/index.ts")
|
31
|
+
when TYPESCRIPT_REACT
|
32
|
+
new(main: "src/index.tsx")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Extension
|
4
|
+
module Models
|
5
|
+
module ServerConfig
|
6
|
+
class DevelopmentRenderer < Base
|
7
|
+
include SmartProperties
|
8
|
+
|
9
|
+
VALID_RENDERERS = [
|
10
|
+
"@shopify/admin-ui-extensions",
|
11
|
+
"@shopify/post-purchase-ui-extensions",
|
12
|
+
"@shopify/checkout-ui-extensions",
|
13
|
+
]
|
14
|
+
|
15
|
+
property! :name, accepts: VALID_RENDERERS
|
16
|
+
|
17
|
+
def self.find(type)
|
18
|
+
case type.downcase
|
19
|
+
when "admin_ui_extension"
|
20
|
+
new(name: "@shopify/admin-ui-extensions")
|
21
|
+
when "checkout_ui_extension"
|
22
|
+
new(name: "@shopify/checkout-ui-extensions")
|
23
|
+
when "checkout_post_purchase"
|
24
|
+
new(name: "@shopify/post-purchase-ui-extensions")
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require "securerandom"
|
2
|
+
|
3
|
+
module Extension
|
4
|
+
module Models
|
5
|
+
module ServerConfig
|
6
|
+
class Extension < Base
|
7
|
+
include SmartProperties
|
8
|
+
property! :uuid, accepts: String
|
9
|
+
property! :type, accepts: String
|
10
|
+
property! :user, accepts: ServerConfig::User
|
11
|
+
property! :development, accepts: ServerConfig::Development
|
12
|
+
|
13
|
+
def self.build(uuid: "", template:, type:, root_dir:)
|
14
|
+
renderer = ServerConfig::DevelopmentRenderer.find(type)
|
15
|
+
entry = ServerConfig::DevelopmentEntries.find(template)
|
16
|
+
new(
|
17
|
+
uuid: uuid.empty? ? generate_dev_uuid : uuid,
|
18
|
+
type: type.downcase,
|
19
|
+
user: ServerConfig::User.new,
|
20
|
+
development: ServerConfig::Development.new(
|
21
|
+
root_dir: root_dir,
|
22
|
+
template: template,
|
23
|
+
renderer: renderer,
|
24
|
+
entries: entry
|
25
|
+
)
|
26
|
+
)
|
27
|
+
end
|
28
|
+
|
29
|
+
def self.generate_dev_uuid
|
30
|
+
"dev-#{SecureRandom.uuid}"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Extension
|
4
|
+
module Models
|
5
|
+
module ServerConfig
|
6
|
+
class Root < Base
|
7
|
+
include SmartProperties
|
8
|
+
|
9
|
+
property! :port, accepts: Integer, default: 39351
|
10
|
+
property! :extensions, accepts: Array, default: -> { [] }
|
11
|
+
|
12
|
+
def to_yaml
|
13
|
+
to_h.to_yaml.gsub("---\n", "")
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -6,6 +6,7 @@ module Extension
|
|
6
6
|
module SpecificationHandlers
|
7
7
|
class CheckoutPostPurchase < Default
|
8
8
|
PERMITTED_CONFIG_KEYS = [:metafields]
|
9
|
+
RENDERER_PACKAGE_NAME = "@shopify/post-purchase-ui-extensions"
|
9
10
|
|
10
11
|
def config(context)
|
11
12
|
{
|
@@ -13,6 +14,15 @@ module Extension
|
|
13
14
|
**argo.config(context),
|
14
15
|
}
|
15
16
|
end
|
17
|
+
|
18
|
+
protected
|
19
|
+
|
20
|
+
def argo
|
21
|
+
Features::Argo.new(
|
22
|
+
git_template: specification.features.argo.git_template,
|
23
|
+
renderer_package_name: RENDERER_PACKAGE_NAME
|
24
|
+
)
|
25
|
+
end
|
16
26
|
end
|
17
27
|
end
|
18
28
|
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
|
2
|
+
# frozen_string_literal: true
|
3
|
+
require "shopify_cli"
|
4
|
+
|
5
|
+
module Extension
|
6
|
+
module Tasks
|
7
|
+
class RunExtensionCommand < ShopifyCli::Task
|
8
|
+
include SmartProperties
|
9
|
+
|
10
|
+
SUPPORTED_EXTENSION_TYPES = [
|
11
|
+
"checkout_ui_extension",
|
12
|
+
]
|
13
|
+
|
14
|
+
SUPPORTED_COMMANDS = [
|
15
|
+
"create",
|
16
|
+
"build",
|
17
|
+
]
|
18
|
+
|
19
|
+
property :root_dir, accepts: String
|
20
|
+
property :template, accepts: Models::ServerConfig::Development::VALID_TEMPLATES
|
21
|
+
property! :type, accepts: SUPPORTED_EXTENSION_TYPES
|
22
|
+
property! :command, accepts: SUPPORTED_COMMANDS
|
23
|
+
|
24
|
+
def call
|
25
|
+
ShopifyCli::Result
|
26
|
+
.call(&method(:build_extension))
|
27
|
+
.then(&method(:build_server_config))
|
28
|
+
.then(&method(:run_command))
|
29
|
+
.unwrap do |error|
|
30
|
+
raise error unless error.nil?
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
private
|
35
|
+
|
36
|
+
def build_extension
|
37
|
+
Models::ServerConfig::Extension.build(
|
38
|
+
template: template,
|
39
|
+
type: type,
|
40
|
+
root_dir: root_dir,
|
41
|
+
)
|
42
|
+
end
|
43
|
+
|
44
|
+
def build_server_config(extension)
|
45
|
+
Models::ServerConfig::Root.new(extensions: [extension])
|
46
|
+
end
|
47
|
+
|
48
|
+
def run_command(server_config)
|
49
|
+
case command
|
50
|
+
when "create"
|
51
|
+
Models::DevelopmentServer.new.create(server_config)
|
52
|
+
when "build"
|
53
|
+
Models::DevelopmentServer.new.build(server_config)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -46,7 +46,7 @@ module Node
|
|
46
46
|
scopes: "write_products,write_customers,write_draft_orders",
|
47
47
|
).write(@ctx)
|
48
48
|
|
49
|
-
partners_url = ShopifyCli::PartnersAPI.partners_url_for(form.organization_id, api_client["id"]
|
49
|
+
partners_url = ShopifyCli::PartnersAPI.partners_url_for(form.organization_id, api_client["id"])
|
50
50
|
|
51
51
|
@ctx.puts(@ctx.message("apps.create.info.created", form.title, partners_url))
|
52
52
|
@ctx.puts(@ctx.message("apps.create.info.serve", form.name, ShopifyCli::TOOL_NAME, "node"))
|
@@ -120,10 +120,6 @@ module Node
|
|
120
120
|
@ctx.debug(e)
|
121
121
|
end
|
122
122
|
end
|
123
|
-
|
124
|
-
def local_debug?
|
125
|
-
@ctx.getenv(ShopifyCli::PartnersAPI::LOCAL_DEBUG)
|
126
|
-
end
|
127
123
|
end
|
128
124
|
end
|
129
125
|
end
|
@@ -63,7 +63,7 @@ module Rails
|
|
63
63
|
scopes: "write_products,write_customers,write_draft_orders",
|
64
64
|
).write(@ctx)
|
65
65
|
|
66
|
-
partners_url = ShopifyCli::PartnersAPI.partners_url_for(form.organization_id, api_client["id"]
|
66
|
+
partners_url = ShopifyCli::PartnersAPI.partners_url_for(form.organization_id, api_client["id"])
|
67
67
|
|
68
68
|
@ctx.puts(@ctx.message("apps.create.info.created", form.title, partners_url))
|
69
69
|
@ctx.puts(@ctx.message("apps.create.info.serve", form.name, ShopifyCli::TOOL_NAME, "rails"))
|
@@ -178,10 +178,6 @@ module Rails
|
|
178
178
|
def install_gem(name, version = nil)
|
179
179
|
Gem.install(@ctx, name, version)
|
180
180
|
end
|
181
|
-
|
182
|
-
def local_debug?
|
183
|
-
@ctx.getenv(ShopifyCli::PartnersAPI::LOCAL_DEBUG)
|
184
|
-
end
|
185
181
|
end
|
186
182
|
end
|
187
183
|
end
|
@@ -45,12 +45,14 @@ module Script
|
|
45
45
|
end
|
46
46
|
|
47
47
|
module Infrastructure
|
48
|
+
autoload :ApiClients, Project.project_filepath("layers/infrastructure/api_clients")
|
48
49
|
autoload :Errors, Project.project_filepath("layers/infrastructure/errors")
|
49
50
|
autoload :CommandRunner, Project.project_filepath("layers/infrastructure/command_runner")
|
50
51
|
autoload :PushPackageRepository, Project.project_filepath("layers/infrastructure/push_package_repository")
|
51
52
|
autoload :ExtensionPointRepository, Project.project_filepath("layers/infrastructure/extension_point_repository")
|
52
53
|
autoload :ScriptProjectRepository, Project.project_filepath("layers/infrastructure/script_project_repository")
|
53
54
|
autoload :ScriptService, Project.project_filepath("layers/infrastructure/script_service")
|
55
|
+
autoload :ScriptUploader, Project.project_filepath("layers/infrastructure/script_uploader")
|
54
56
|
|
55
57
|
module Languages
|
56
58
|
autoload :AssemblyScriptProjectCreator,
|
@@ -0,0 +1,40 @@
|
|
1
|
+
mutation AppScriptSet(
|
2
|
+
$uuid: String
|
3
|
+
$extensionPointName: ExtensionPointName!,
|
4
|
+
$title: String!,
|
5
|
+
$description: String,
|
6
|
+
$force: Boolean,
|
7
|
+
$schemaMajorVersion: String,
|
8
|
+
$schemaMinorVersion: String,
|
9
|
+
$scriptJsonVersion: String!,
|
10
|
+
$configurationUi: Boolean!,
|
11
|
+
$configurationDefinition: String!,
|
12
|
+
$moduleUploadUrl: String!,
|
13
|
+
) {
|
14
|
+
appScriptSet(
|
15
|
+
uuid: $uuid
|
16
|
+
extensionPointName: $extensionPointName
|
17
|
+
title: $title
|
18
|
+
description: $description
|
19
|
+
force: $force
|
20
|
+
schemaMajorVersion: $schemaMajorVersion
|
21
|
+
schemaMinorVersion: $schemaMinorVersion,
|
22
|
+
scriptJsonVersion: $scriptJsonVersion,
|
23
|
+
configurationUi: $configurationUi,
|
24
|
+
configurationDefinition: $configurationDefinition,
|
25
|
+
moduleUploadUrl: $moduleUploadUrl,
|
26
|
+
) {
|
27
|
+
userErrors {
|
28
|
+
field
|
29
|
+
message
|
30
|
+
tag
|
31
|
+
}
|
32
|
+
appScript {
|
33
|
+
uuid
|
34
|
+
appKey
|
35
|
+
configSchema
|
36
|
+
extensionPointName
|
37
|
+
title
|
38
|
+
}
|
39
|
+
}
|
40
|
+
}
|