shopify-cli 1.7.1 → 1.11.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/PULL_REQUEST_TEMPLATE.md +1 -0
- data/.github/workflows/build.yml +28 -0
- data/.rubocop_todo.yml +15 -2
- data/CHANGELOG.md +25 -0
- data/Gemfile.lock +15 -15
- data/README.md +2 -1
- data/dev.yml +3 -0
- data/lib/docgen/markdown.rb +1 -1
- data/lib/graphql/extension_create.graphql +17 -2
- data/lib/graphql/fetch_specifications.graphql +14 -0
- data/lib/project_types/extension/cli.rb +8 -10
- data/lib/project_types/extension/commands/create.rb +2 -2
- data/lib/project_types/extension/commands/extension_command.rb +10 -6
- data/lib/project_types/extension/commands/push.rb +2 -2
- data/lib/project_types/extension/commands/register.rb +6 -5
- data/lib/project_types/extension/commands/serve.rb +64 -22
- data/lib/project_types/extension/commands/tunnel.rb +3 -1
- data/lib/project_types/extension/extension_project.rb +20 -4
- data/lib/project_types/extension/extension_project_keys.rb +2 -1
- data/lib/project_types/extension/features/argo.rb +19 -44
- data/lib/project_types/extension/features/argo_runtime.rb +63 -0
- data/lib/project_types/extension/features/argo_serve.rb +79 -0
- data/lib/project_types/extension/features/argo_serve_options.rb +40 -0
- data/lib/project_types/extension/features/argo_setup.rb +1 -1
- data/lib/project_types/extension/forms/questions/ask_type.rb +16 -5
- data/lib/project_types/extension/messages/message_loading.rb +3 -1
- data/lib/project_types/extension/messages/messages.rb +9 -6
- data/lib/project_types/extension/models/npm_package.rb +14 -0
- data/lib/project_types/extension/models/registration.rb +1 -0
- data/lib/project_types/extension/models/specification.rb +7 -2
- data/lib/project_types/extension/models/specification_handlers/checkout_argo_extension.rb +18 -0
- data/lib/project_types/extension/models/specification_handlers/default.rb +35 -2
- data/lib/project_types/extension/models/specifications.rb +12 -1
- data/lib/project_types/extension/models/version.rb +1 -1
- data/lib/project_types/extension/tasks/choose_next_available_port.rb +36 -0
- data/lib/project_types/extension/tasks/configure_features.rb +5 -1
- data/lib/project_types/extension/tasks/converters/registration_converter.rb +2 -0
- data/lib/project_types/extension/tasks/fetch_specifications.rb +8 -28
- data/lib/project_types/extension/tasks/find_npm_packages.rb +106 -0
- data/lib/project_types/node/commands/generate.rb +0 -22
- data/lib/project_types/node/forms/create.rb +10 -1
- data/lib/project_types/node/messages/messages.rb +5 -4
- data/lib/project_types/rails/forms/create.rb +11 -1
- data/lib/project_types/rails/messages/messages.rb +5 -4
- data/lib/project_types/script/cli.rb +7 -8
- data/lib/project_types/script/commands/create.rb +0 -7
- data/lib/project_types/script/commands/push.rb +3 -3
- data/lib/project_types/script/config/extension_points.yml +17 -0
- data/lib/project_types/script/errors.rb +0 -19
- data/lib/project_types/script/forms/create.rb +3 -14
- data/lib/project_types/script/graphql/app_script_update_or_create.graphql +5 -5
- data/lib/project_types/script/graphql/get_app_scripts.graphql +6 -0
- data/lib/project_types/script/graphql/script_service_proxy.graphql +1 -2
- data/lib/project_types/script/layers/application/build_script.rb +1 -2
- data/lib/project_types/script/layers/application/create_script.rb +32 -49
- data/lib/project_types/script/layers/application/extension_points.rb +3 -2
- data/lib/project_types/script/layers/application/push_script.rb +5 -5
- data/lib/project_types/script/layers/domain/errors.rb +0 -2
- data/lib/project_types/script/layers/domain/extension_point.rb +60 -45
- data/lib/project_types/script/layers/domain/metadata.rb +18 -25
- data/lib/project_types/script/layers/domain/push_package.rb +4 -4
- data/lib/project_types/script/layers/domain/script_project.rb +54 -0
- data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +39 -14
- data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +14 -43
- data/lib/project_types/script/layers/infrastructure/command_runner.rb +19 -0
- data/lib/project_types/script/layers/infrastructure/errors.rb +40 -20
- data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +12 -13
- data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +9 -10
- data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +6 -7
- data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +172 -0
- data/lib/project_types/script/layers/infrastructure/script_service.rb +25 -76
- data/lib/project_types/script/messages/messages.rb +20 -53
- data/lib/project_types/script/tasks/ensure_env.rb +85 -0
- data/lib/project_types/script/ui/error_handler.rb +32 -41
- data/lib/shopify-cli/context.rb +28 -0
- data/lib/shopify-cli/js_system.rb +2 -2
- data/lib/shopify-cli/messages/messages.rb +50 -45
- data/lib/shopify-cli/method_object.rb +4 -4
- data/lib/shopify-cli/oauth.rb +9 -3
- data/lib/shopify-cli/packager.rb +1 -1
- data/lib/shopify-cli/partners_api/organizations.rb +3 -3
- data/lib/shopify-cli/resolve_constant.rb +1 -1
- data/lib/shopify-cli/resources/env_file.rb +1 -1
- data/lib/shopify-cli/tasks/ensure_dev_store.rb +1 -1
- data/lib/shopify-cli/tasks/select_org_and_shop.rb +6 -4
- data/lib/shopify-cli/transform_data_structure.rb +2 -2
- data/lib/shopify-cli/tunnel.rb +22 -1
- data/lib/shopify-cli/version.rb +1 -1
- data/lib/shopify_cli.rb +0 -1
- data/vendor/deps/smart_properties/REVISION +1 -1
- data/vendor/deps/smart_properties/lib/smart_properties/property.rb +7 -1
- data/vendor/deps/smart_properties/lib/smart_properties/version.rb +1 -1
- metadata +17 -12
- data/.travis.yml +0 -14
- data/lib/project_types/script/commands/disable.rb +0 -25
- data/lib/project_types/script/commands/enable.rb +0 -80
- data/lib/project_types/script/graphql/shop_script_delete.graphql +0 -14
- data/lib/project_types/script/graphql/shop_script_update_or_create.graphql +0 -28
- data/lib/project_types/script/layers/application/disable_script.rb +0 -21
- data/lib/project_types/script/layers/application/enable_script.rb +0 -23
- data/lib/project_types/script/layers/infrastructure/config_ui_repository.rb +0 -46
- data/lib/project_types/script/script_project.rb +0 -64
|
@@ -37,7 +37,9 @@ module Extension
|
|
|
37
37
|
private
|
|
38
38
|
|
|
39
39
|
def status
|
|
40
|
-
|
|
40
|
+
tunnel_urls = ShopifyCli::Tunnel.urls
|
|
41
|
+
tunnel_url = tunnel_urls.find { |url| url.start_with?("https://") }
|
|
42
|
+
tunnel_url = tunnel_urls.first if tunnel_url.nil?
|
|
41
43
|
|
|
42
44
|
if tunnel_url.nil?
|
|
43
45
|
@ctx.puts(@ctx.message("tunnel.no_tunnel_running"))
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
# frozen_string_literal: true
|
|
2
2
|
require "shopify_cli"
|
|
3
|
+
require "securerandom"
|
|
3
4
|
|
|
4
5
|
module Extension
|
|
5
6
|
class ExtensionProject < ShopifyCli::Project
|
|
@@ -9,20 +10,27 @@ module Extension
|
|
|
9
10
|
context,
|
|
10
11
|
project_type: :extension,
|
|
11
12
|
organization_id: nil,
|
|
12
|
-
"#{ExtensionProjectKeys::
|
|
13
|
+
"#{ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY}": type
|
|
13
14
|
)
|
|
14
15
|
end
|
|
15
16
|
|
|
16
|
-
def write_env_file(
|
|
17
|
+
def write_env_file(
|
|
18
|
+
context:, title:, api_key: "", api_secret: "", registration_id: nil, registration_uuid: nil
|
|
19
|
+
)
|
|
17
20
|
ShopifyCli::Resources::EnvFile.new(
|
|
18
21
|
api_key: api_key,
|
|
19
22
|
secret: api_secret,
|
|
20
23
|
extra: {
|
|
21
24
|
ExtensionProjectKeys::TITLE_KEY => title,
|
|
22
25
|
ExtensionProjectKeys::REGISTRATION_ID_KEY => registration_id,
|
|
26
|
+
ExtensionProjectKeys::REGISTRATION_UUID_KEY => registration_uuid || generate_temporary_uuid,
|
|
23
27
|
}.compact
|
|
24
28
|
).write(context)
|
|
25
29
|
|
|
30
|
+
reload
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def reload
|
|
26
34
|
current.reload unless project_empty?
|
|
27
35
|
end
|
|
28
36
|
|
|
@@ -45,8 +53,8 @@ module Extension
|
|
|
45
53
|
get_extra_field(ExtensionProjectKeys::TITLE_KEY)
|
|
46
54
|
end
|
|
47
55
|
|
|
48
|
-
def
|
|
49
|
-
config[ExtensionProjectKeys::
|
|
56
|
+
def specification_identifier
|
|
57
|
+
config[ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY]
|
|
50
58
|
end
|
|
51
59
|
|
|
52
60
|
def registration_id?
|
|
@@ -59,10 +67,18 @@ module Extension
|
|
|
59
67
|
get_extra_field(ExtensionProjectKeys::REGISTRATION_ID_KEY).to_i
|
|
60
68
|
end
|
|
61
69
|
|
|
70
|
+
def registration_uuid
|
|
71
|
+
get_extra_field(ExtensionProjectKeys::REGISTRATION_UUID_KEY)
|
|
72
|
+
end
|
|
73
|
+
|
|
62
74
|
def reload
|
|
63
75
|
@env = nil
|
|
64
76
|
end
|
|
65
77
|
|
|
78
|
+
def self.generate_temporary_uuid
|
|
79
|
+
"dev-#{SecureRandom.uuid}"
|
|
80
|
+
end
|
|
81
|
+
|
|
66
82
|
private
|
|
67
83
|
|
|
68
84
|
def get_extra_field(key)
|
|
@@ -4,7 +4,8 @@ require "shopify_cli"
|
|
|
4
4
|
module Extension
|
|
5
5
|
module ExtensionProjectKeys
|
|
6
6
|
REGISTRATION_ID_KEY = "EXTENSION_ID"
|
|
7
|
-
|
|
7
|
+
REGISTRATION_UUID_KEY = "EXTENSION_UUID"
|
|
8
|
+
SPECIFICATION_IDENTIFIER_KEY = "EXTENSION_TYPE"
|
|
8
9
|
TITLE_KEY = "EXTENSION_TITLE"
|
|
9
10
|
end
|
|
10
11
|
end
|
|
@@ -13,18 +13,22 @@ module Extension
|
|
|
13
13
|
|
|
14
14
|
SCRIPT_PATH = %w(build main.js).freeze
|
|
15
15
|
|
|
16
|
-
NPM_LIST_COMMAND = %w(list).freeze
|
|
17
|
-
YARN_LIST_COMMAND = %w(list --pattern).freeze
|
|
18
|
-
NPM_LIST_PARAMETERS = %w(--prod).freeze
|
|
19
|
-
YARN_LIST_PARAMETERS = %w(--production).freeze
|
|
20
|
-
private_constant :NPM_LIST_COMMAND, :YARN_LIST_COMMAND, :NPM_LIST_PARAMETERS, :YARN_LIST_PARAMETERS
|
|
21
|
-
|
|
22
16
|
YARN_INSTALL_COMMAND = %w(install).freeze
|
|
23
17
|
YARN_INSTALL_PARAMETERS = %w(--silent).freeze
|
|
24
18
|
YARN_RUN_COMMAND = %w(run).freeze
|
|
25
19
|
YARN_RUN_SCRIPT_NAME = %w(build).freeze
|
|
26
20
|
private_constant :YARN_INSTALL_COMMAND, :YARN_INSTALL_PARAMETERS, :YARN_RUN_COMMAND, :YARN_RUN_SCRIPT_NAME
|
|
27
21
|
|
|
22
|
+
ARGO_CHECKOUT = "@shopify/argo-checkout"
|
|
23
|
+
ARGO_ADMIN = "@shopify/argo-admin"
|
|
24
|
+
ARGO_POST_PURCHASE = "@shopify/argo-post-purchase"
|
|
25
|
+
|
|
26
|
+
PACKAGE_NAMES = [
|
|
27
|
+
ARGO_CHECKOUT,
|
|
28
|
+
ARGO_ADMIN,
|
|
29
|
+
ARGO_POST_PURCHASE,
|
|
30
|
+
].freeze
|
|
31
|
+
|
|
28
32
|
def create(directory_name, identifier, context)
|
|
29
33
|
Features::ArgoSetup.new(git_template: git_template).call(directory_name, identifier, context)
|
|
30
34
|
end
|
|
@@ -39,7 +43,7 @@ module Extension
|
|
|
39
43
|
context.abort(context.message("features.argo.missing_file_error")) unless File.exist?(filepath)
|
|
40
44
|
begin
|
|
41
45
|
{
|
|
42
|
-
renderer_version:
|
|
46
|
+
renderer_version: renderer_package(context).version,
|
|
43
47
|
serialized_script: Base64.strict_encode64(File.read(filepath).chomp),
|
|
44
48
|
}
|
|
45
49
|
rescue StandardError
|
|
@@ -47,47 +51,18 @@ module Extension
|
|
|
47
51
|
end
|
|
48
52
|
end
|
|
49
53
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
context.message("features.argo.dependencies.argo_renderer_package_invalid_version_error")
|
|
57
|
-
) if found_version.nil?
|
|
58
|
-
::Semantic::Version.new(found_version).to_s
|
|
59
|
-
rescue ArgumentError
|
|
54
|
+
def renderer_package(context)
|
|
55
|
+
js_system = ShopifyCli::JsSystem.new(ctx: context)
|
|
56
|
+
Tasks::FindNpmPackages
|
|
57
|
+
.exactly_one_of(*PACKAGE_NAMES, js_system: js_system)
|
|
58
|
+
.unwrap { |err| raise err }
|
|
59
|
+
rescue Extension::PackageResolutionFailed
|
|
60
60
|
context.abort(
|
|
61
|
-
context.message("features.argo.dependencies.
|
|
61
|
+
context.message("features.argo.dependencies.argo_missing_renderer_package_error")
|
|
62
62
|
)
|
|
63
63
|
end
|
|
64
64
|
|
|
65
|
-
|
|
66
|
-
packages = result.to_json.split('\n')
|
|
67
|
-
found_package = packages.find do |package|
|
|
68
|
-
package.match(/#{renderer_package_name}@/)
|
|
69
|
-
end
|
|
70
|
-
if found_package.nil?
|
|
71
|
-
error = "'#{renderer_package_name}' not found."
|
|
72
|
-
context.abort(
|
|
73
|
-
context.message("features.argo.dependencies.argo_missing_renderer_package_error", error)
|
|
74
|
-
)
|
|
75
|
-
end
|
|
76
|
-
found_package.split("@")[2]&.strip
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def run_list_command(context)
|
|
80
|
-
js_system = ShopifyCli::JsSystem.new(ctx: context)
|
|
81
|
-
result, error, status = js_system.call(
|
|
82
|
-
yarn: YARN_LIST_COMMAND + [renderer_package_name] + YARN_LIST_PARAMETERS,
|
|
83
|
-
npm: NPM_LIST_COMMAND + [renderer_package_name] + NPM_LIST_PARAMETERS,
|
|
84
|
-
capture_response: true
|
|
85
|
-
)
|
|
86
|
-
context.abort(
|
|
87
|
-
context.message("features.argo.dependencies.argo_missing_renderer_package_error", error)
|
|
88
|
-
) unless status.success?
|
|
89
|
-
result
|
|
90
|
-
end
|
|
65
|
+
private
|
|
91
66
|
|
|
92
67
|
def run_yarn_install(context, js_system)
|
|
93
68
|
_result, error, status = js_system.call(
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
module Extension
|
|
2
|
+
module Features
|
|
3
|
+
class ArgoRuntime
|
|
4
|
+
include SmartProperties
|
|
5
|
+
|
|
6
|
+
ARGO_RUN_PACKAGE_NAME = "@shopify/argo-run"
|
|
7
|
+
ARGO_ADMIN_CLI_PACKAGE_NAME = "@shopify/argo-admin-cli"
|
|
8
|
+
|
|
9
|
+
ARGO_RUN_0_4_0 = Models::NpmPackage.new(name: "@shopify/argo-run", version: "0.4.0")
|
|
10
|
+
ARGO_ADMIN_CLI_0_9_3 = Models::NpmPackage.new(name: "@shopify/argo-admin-cli", version: "0.9.3")
|
|
11
|
+
ARGO_ADMIN_CLI_0_11_0 = Models::NpmPackage.new(name: "@shopify/argo-admin-cli", version: "0.11.0")
|
|
12
|
+
|
|
13
|
+
property! :renderer, accepts: Models::NpmPackage
|
|
14
|
+
property! :cli, accepts: Models::NpmPackage
|
|
15
|
+
|
|
16
|
+
def accepts_port?
|
|
17
|
+
case cli
|
|
18
|
+
when admin?
|
|
19
|
+
cli >= ARGO_ADMIN_CLI_0_11_0
|
|
20
|
+
when checkout?
|
|
21
|
+
cli >= ARGO_RUN_0_4_0
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def accepts_tunnel_url?
|
|
26
|
+
case cli
|
|
27
|
+
when admin?
|
|
28
|
+
cli >= ARGO_ADMIN_CLI_0_11_0
|
|
29
|
+
when checkout?
|
|
30
|
+
cli >= ARGO_RUN_0_4_0
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def accepts_uuid?
|
|
35
|
+
case cli
|
|
36
|
+
when admin?
|
|
37
|
+
cli >= ARGO_ADMIN_CLI_0_11_0
|
|
38
|
+
else
|
|
39
|
+
false
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def accepts_argo_version?
|
|
44
|
+
case cli
|
|
45
|
+
when admin?
|
|
46
|
+
cli >= ARGO_ADMIN_CLI_0_9_3
|
|
47
|
+
else
|
|
48
|
+
false
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
private
|
|
53
|
+
|
|
54
|
+
def admin?
|
|
55
|
+
->(cli) { cli.name == ARGO_ADMIN_CLI_PACKAGE_NAME }
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def checkout?
|
|
59
|
+
->(cli) { cli.name == ARGO_RUN_PACKAGE_NAME }
|
|
60
|
+
end
|
|
61
|
+
end
|
|
62
|
+
end
|
|
63
|
+
end
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
module Extension
|
|
2
|
+
module Features
|
|
3
|
+
class ArgoServe
|
|
4
|
+
include SmartProperties
|
|
5
|
+
|
|
6
|
+
property! :specification_handler, accepts: Extension::Models::SpecificationHandlers::Default
|
|
7
|
+
property! :argo_runtime, accepts: Features::ArgoRuntime
|
|
8
|
+
property! :context, accepts: ShopifyCli::Context
|
|
9
|
+
property! :port, accepts: Integer, default: 39351
|
|
10
|
+
property :tunnel_url, accepts: String, default: ""
|
|
11
|
+
|
|
12
|
+
def call
|
|
13
|
+
validate_env!
|
|
14
|
+
|
|
15
|
+
CLI::UI::Frame.open(context.message("serve.frame_title")) do
|
|
16
|
+
success = call_js_system(yarn_command: yarn_serve_command, npm_command: npm_serve_command)
|
|
17
|
+
context.abort(context.message("serve.serve_failure_message")) unless success
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
private
|
|
22
|
+
|
|
23
|
+
def call_js_system(yarn_command:, npm_command:)
|
|
24
|
+
ShopifyCli::JsSystem.call(context, yarn: yarn_command, npm: npm_command)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def specification
|
|
28
|
+
specification_handler.specification
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def renderer_package
|
|
32
|
+
specification_handler.renderer_package(context)
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def required_fields
|
|
36
|
+
specification.features.argo.required_fields
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def serve_options
|
|
40
|
+
@options ||= Features::ArgoServeOptions.new(
|
|
41
|
+
argo_runtime: argo_runtime,
|
|
42
|
+
port: port,
|
|
43
|
+
context: context,
|
|
44
|
+
required_fields: required_fields,
|
|
45
|
+
renderer_package: renderer_package,
|
|
46
|
+
public_url: tunnel_url
|
|
47
|
+
)
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def yarn_serve_command
|
|
51
|
+
serve_options.yarn_serve_command
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def npm_serve_command
|
|
55
|
+
serve_options.npm_serve_command
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def validate_env!
|
|
59
|
+
ExtensionProject.reload
|
|
60
|
+
|
|
61
|
+
ShopifyCli::Shopifolk.check && ShopifyCli::Feature.enabled?(:argo_admin_beta)
|
|
62
|
+
|
|
63
|
+
return if required_fields.none?
|
|
64
|
+
|
|
65
|
+
ShopifyCli::Tasks::EnsureEnv.call(context, required: required_fields)
|
|
66
|
+
ShopifyCli::Tasks::EnsureDevStore.call(context) if required_fields.include?(:shop)
|
|
67
|
+
|
|
68
|
+
project = ExtensionProject.current
|
|
69
|
+
|
|
70
|
+
return if required_fields.all? do |field|
|
|
71
|
+
value = project.env.public_send(field)
|
|
72
|
+
value && !value.strip.empty?
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
context.abort(context.message("serve.serve_missing_information"))
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Extension
|
|
2
|
+
module Features
|
|
3
|
+
class ArgoServeOptions
|
|
4
|
+
include SmartProperties
|
|
5
|
+
|
|
6
|
+
property! :argo_runtime, accepts: Features::ArgoRuntime
|
|
7
|
+
property! :context, accepts: ShopifyCli::Context
|
|
8
|
+
property :port, accepts: Integer, default: 39351
|
|
9
|
+
property :public_url, accepts: String, default: ""
|
|
10
|
+
property! :required_fields, accepts: Array, default: -> { [] }
|
|
11
|
+
property! :renderer_package, accepts: Models::NpmPackage
|
|
12
|
+
|
|
13
|
+
YARN_SERVE_COMMAND = %w(server)
|
|
14
|
+
NPM_SERVE_COMMAND = %w(run-script server)
|
|
15
|
+
|
|
16
|
+
def yarn_serve_command
|
|
17
|
+
YARN_SERVE_COMMAND + options
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def npm_serve_command
|
|
21
|
+
NPM_SERVE_COMMAND + ["--"] + options
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
private
|
|
25
|
+
|
|
26
|
+
def options
|
|
27
|
+
project = ExtensionProject.current
|
|
28
|
+
|
|
29
|
+
@serve_options ||= [].tap do |options|
|
|
30
|
+
options << "--port=#{port}" if argo_runtime.accepts_port?
|
|
31
|
+
options << "--shop=#{project.env.shop}" if required_fields.include?(:shop)
|
|
32
|
+
options << "--apiKey=#{project.env.api_key}" if required_fields.include?(:api_key)
|
|
33
|
+
options << "--argoVersion=#{renderer_package.version}" if argo_runtime.accepts_argo_version?
|
|
34
|
+
options << "--uuid=#{project.registration_uuid}" if argo_runtime.accepts_uuid?
|
|
35
|
+
options << "--publicUrl=#{public_url}" if argo_runtime.accepts_tunnel_url?
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
@@ -11,25 +11,36 @@ module Extension
|
|
|
11
11
|
default: -> { CLI::UI::Prompt.method(:ask) }
|
|
12
12
|
|
|
13
13
|
def call(project_details)
|
|
14
|
+
specifications = Models::Specifications.new(
|
|
15
|
+
fetch_specifications: Tasks::FetchSpecifications.new(context: ctx, api_key: project_details.app.api_key)
|
|
16
|
+
)
|
|
17
|
+
|
|
14
18
|
project_details.tap do |p|
|
|
15
|
-
p.type = type.nil? ? choose_type : validate_given_type(type)
|
|
19
|
+
p.type = type.nil? ? choose_type(specifications) : validate_given_type(specifications, type)
|
|
16
20
|
end
|
|
17
21
|
end
|
|
18
22
|
|
|
19
23
|
private
|
|
20
24
|
|
|
21
|
-
def validate_given_type(type)
|
|
22
|
-
return
|
|
25
|
+
def validate_given_type(specifications, type)
|
|
26
|
+
return specifications[type] if specifications.valid?(type)
|
|
23
27
|
ctx.abort(ctx.message("create.invalid_type")) unless type.nil?
|
|
24
28
|
end
|
|
25
29
|
|
|
26
|
-
def choose_type
|
|
30
|
+
def choose_type(specifications)
|
|
31
|
+
abort_due_to_missing_specifications if specifications.none?
|
|
32
|
+
|
|
27
33
|
prompt.call(ctx.message("create.ask_type")) do |handler|
|
|
28
|
-
|
|
34
|
+
specifications.each do |type|
|
|
29
35
|
handler.option("#{type.name} #{type.tagline}") { type }
|
|
30
36
|
end
|
|
31
37
|
end
|
|
32
38
|
end
|
|
39
|
+
|
|
40
|
+
def abort_due_to_missing_specifications
|
|
41
|
+
ctx.puts(@ctx.message("create.no_available_extensions"))
|
|
42
|
+
raise ShopifyCli::AbortSilent
|
|
43
|
+
end
|
|
33
44
|
end
|
|
34
45
|
end
|
|
35
46
|
end
|
|
@@ -16,7 +16,9 @@ module Extension
|
|
|
16
16
|
|
|
17
17
|
def self.load_current_type_messages
|
|
18
18
|
return unless ShopifyCli::Project.has_current?
|
|
19
|
-
messages_for_type(
|
|
19
|
+
messages_for_type(
|
|
20
|
+
ShopifyCli::Project.current.config[Extension::ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY]
|
|
21
|
+
)
|
|
20
22
|
end
|
|
21
23
|
|
|
22
24
|
def self.messages_for_type(type_identifier)
|
|
@@ -30,6 +30,7 @@ module Extension
|
|
|
30
30
|
learn_about_apps: "{{*}} Learn more about building apps at <https://shopify.dev/concepts/apps>, " \
|
|
31
31
|
"or try creating a new app using {{command:shopify create}}.",
|
|
32
32
|
loading_apps: "Loading your apps...",
|
|
33
|
+
no_available_extensions: "{{x}} There are no available extensions for this app.",
|
|
33
34
|
},
|
|
34
35
|
build: {
|
|
35
36
|
frame_title: "Building extension with: %s...",
|
|
@@ -40,9 +41,9 @@ module Extension
|
|
|
40
41
|
waiting_text: "Registering with Shopify...",
|
|
41
42
|
already_registered: "Extension is already registered.",
|
|
42
43
|
confirm_info: "This will create a new extension registration for %s, which can’t be undone.",
|
|
43
|
-
confirm_question: "Would you like to register this extension
|
|
44
|
+
confirm_question: "Would you like to register this extension? (y/n)",
|
|
44
45
|
confirm_abort: "Extension was not registered.",
|
|
45
|
-
success: "{{v}} Registered {{green:%s}}
|
|
46
|
+
success: "{{v}} Registered {{green:%s}}.",
|
|
46
47
|
success_info: "{{*}} Run {{command:shopify push}} to push your extension to Shopify.",
|
|
47
48
|
},
|
|
48
49
|
push: {
|
|
@@ -55,7 +56,10 @@ module Extension
|
|
|
55
56
|
},
|
|
56
57
|
serve: {
|
|
57
58
|
frame_title: "Serving extension...",
|
|
59
|
+
no_available_ports_found: "No available ports found to run extension.",
|
|
58
60
|
serve_failure_message: "Failed to run extension code.",
|
|
61
|
+
serve_missing_information: "Missing shop or api_key.",
|
|
62
|
+
tunnel_already_running: "A tunnel running on another port has been detected. Close the tunnel and try again.",
|
|
59
63
|
},
|
|
60
64
|
tunnel: {
|
|
61
65
|
missing_token: "{{x}} {{red:auth requires a token argument}}. "\
|
|
@@ -96,10 +100,8 @@ module Extension
|
|
|
96
100
|
node_not_installed: "Node must be installed to create this extension.",
|
|
97
101
|
version_too_low: "Your node version %s does not meet the minimum required version %s",
|
|
98
102
|
},
|
|
99
|
-
argo_missing_renderer_package_error: "
|
|
100
|
-
|
|
101
|
-
The renderer package version is not a valid SemVer Version (http://semver.org)
|
|
102
|
-
MESSAGE
|
|
103
|
+
argo_missing_renderer_package_error: "Extension template references invalid renderer package "\
|
|
104
|
+
"please contact Shopify for help.",
|
|
103
105
|
yarn_install_error: "Something went wrong while running 'yarn install'. %s.",
|
|
104
106
|
yarn_run_script_error: "Something went wrong while running script. %s.",
|
|
105
107
|
},
|
|
@@ -115,6 +117,7 @@ module Extension
|
|
|
115
117
|
},
|
|
116
118
|
errors: {
|
|
117
119
|
unknown_type: "Unknown extension type %s",
|
|
120
|
+
package_not_found: "`%s` package not found.",
|
|
118
121
|
},
|
|
119
122
|
}
|
|
120
123
|
|