shopify-cli 1.7.1 → 1.11.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +4 -4
  2. data/.github/PULL_REQUEST_TEMPLATE.md +1 -0
  3. data/.github/workflows/build.yml +28 -0
  4. data/.rubocop_todo.yml +15 -2
  5. data/CHANGELOG.md +25 -0
  6. data/Gemfile.lock +15 -15
  7. data/README.md +2 -1
  8. data/dev.yml +3 -0
  9. data/lib/docgen/markdown.rb +1 -1
  10. data/lib/graphql/extension_create.graphql +17 -2
  11. data/lib/graphql/fetch_specifications.graphql +14 -0
  12. data/lib/project_types/extension/cli.rb +8 -10
  13. data/lib/project_types/extension/commands/create.rb +2 -2
  14. data/lib/project_types/extension/commands/extension_command.rb +10 -6
  15. data/lib/project_types/extension/commands/push.rb +2 -2
  16. data/lib/project_types/extension/commands/register.rb +6 -5
  17. data/lib/project_types/extension/commands/serve.rb +64 -22
  18. data/lib/project_types/extension/commands/tunnel.rb +3 -1
  19. data/lib/project_types/extension/extension_project.rb +20 -4
  20. data/lib/project_types/extension/extension_project_keys.rb +2 -1
  21. data/lib/project_types/extension/features/argo.rb +19 -44
  22. data/lib/project_types/extension/features/argo_runtime.rb +63 -0
  23. data/lib/project_types/extension/features/argo_serve.rb +79 -0
  24. data/lib/project_types/extension/features/argo_serve_options.rb +40 -0
  25. data/lib/project_types/extension/features/argo_setup.rb +1 -1
  26. data/lib/project_types/extension/forms/questions/ask_type.rb +16 -5
  27. data/lib/project_types/extension/messages/message_loading.rb +3 -1
  28. data/lib/project_types/extension/messages/messages.rb +9 -6
  29. data/lib/project_types/extension/models/npm_package.rb +14 -0
  30. data/lib/project_types/extension/models/registration.rb +1 -0
  31. data/lib/project_types/extension/models/specification.rb +7 -2
  32. data/lib/project_types/extension/models/specification_handlers/checkout_argo_extension.rb +18 -0
  33. data/lib/project_types/extension/models/specification_handlers/default.rb +35 -2
  34. data/lib/project_types/extension/models/specifications.rb +12 -1
  35. data/lib/project_types/extension/models/version.rb +1 -1
  36. data/lib/project_types/extension/tasks/choose_next_available_port.rb +36 -0
  37. data/lib/project_types/extension/tasks/configure_features.rb +5 -1
  38. data/lib/project_types/extension/tasks/converters/registration_converter.rb +2 -0
  39. data/lib/project_types/extension/tasks/fetch_specifications.rb +8 -28
  40. data/lib/project_types/extension/tasks/find_npm_packages.rb +106 -0
  41. data/lib/project_types/node/commands/generate.rb +0 -22
  42. data/lib/project_types/node/forms/create.rb +10 -1
  43. data/lib/project_types/node/messages/messages.rb +5 -4
  44. data/lib/project_types/rails/forms/create.rb +11 -1
  45. data/lib/project_types/rails/messages/messages.rb +5 -4
  46. data/lib/project_types/script/cli.rb +7 -8
  47. data/lib/project_types/script/commands/create.rb +0 -7
  48. data/lib/project_types/script/commands/push.rb +3 -3
  49. data/lib/project_types/script/config/extension_points.yml +17 -0
  50. data/lib/project_types/script/errors.rb +0 -19
  51. data/lib/project_types/script/forms/create.rb +3 -14
  52. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +5 -5
  53. data/lib/project_types/script/graphql/get_app_scripts.graphql +6 -0
  54. data/lib/project_types/script/graphql/script_service_proxy.graphql +1 -2
  55. data/lib/project_types/script/layers/application/build_script.rb +1 -2
  56. data/lib/project_types/script/layers/application/create_script.rb +32 -49
  57. data/lib/project_types/script/layers/application/extension_points.rb +3 -2
  58. data/lib/project_types/script/layers/application/push_script.rb +5 -5
  59. data/lib/project_types/script/layers/domain/errors.rb +0 -2
  60. data/lib/project_types/script/layers/domain/extension_point.rb +60 -45
  61. data/lib/project_types/script/layers/domain/metadata.rb +18 -25
  62. data/lib/project_types/script/layers/domain/push_package.rb +4 -4
  63. data/lib/project_types/script/layers/domain/script_project.rb +54 -0
  64. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +39 -14
  65. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +14 -43
  66. data/lib/project_types/script/layers/infrastructure/command_runner.rb +19 -0
  67. data/lib/project_types/script/layers/infrastructure/errors.rb +40 -20
  68. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +12 -13
  69. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +9 -10
  70. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +6 -7
  71. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +172 -0
  72. data/lib/project_types/script/layers/infrastructure/script_service.rb +25 -76
  73. data/lib/project_types/script/messages/messages.rb +20 -53
  74. data/lib/project_types/script/tasks/ensure_env.rb +85 -0
  75. data/lib/project_types/script/ui/error_handler.rb +32 -41
  76. data/lib/shopify-cli/context.rb +28 -0
  77. data/lib/shopify-cli/js_system.rb +2 -2
  78. data/lib/shopify-cli/messages/messages.rb +50 -45
  79. data/lib/shopify-cli/method_object.rb +4 -4
  80. data/lib/shopify-cli/oauth.rb +9 -3
  81. data/lib/shopify-cli/packager.rb +1 -1
  82. data/lib/shopify-cli/partners_api/organizations.rb +3 -3
  83. data/lib/shopify-cli/resolve_constant.rb +1 -1
  84. data/lib/shopify-cli/resources/env_file.rb +1 -1
  85. data/lib/shopify-cli/tasks/ensure_dev_store.rb +1 -1
  86. data/lib/shopify-cli/tasks/select_org_and_shop.rb +6 -4
  87. data/lib/shopify-cli/transform_data_structure.rb +2 -2
  88. data/lib/shopify-cli/tunnel.rb +22 -1
  89. data/lib/shopify-cli/version.rb +1 -1
  90. data/lib/shopify_cli.rb +0 -1
  91. data/vendor/deps/smart_properties/REVISION +1 -1
  92. data/vendor/deps/smart_properties/lib/smart_properties/property.rb +7 -1
  93. data/vendor/deps/smart_properties/lib/smart_properties/version.rb +1 -1
  94. metadata +17 -12
  95. data/.travis.yml +0 -14
  96. data/lib/project_types/script/commands/disable.rb +0 -25
  97. data/lib/project_types/script/commands/enable.rb +0 -80
  98. data/lib/project_types/script/graphql/shop_script_delete.graphql +0 -14
  99. data/lib/project_types/script/graphql/shop_script_update_or_create.graphql +0 -28
  100. data/lib/project_types/script/layers/application/disable_script.rb +0 -21
  101. data/lib/project_types/script/layers/application/enable_script.rb +0 -23
  102. data/lib/project_types/script/layers/infrastructure/config_ui_repository.rb +0 -46
  103. 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
- tunnel_url = ShopifyCli::Tunnel.urls.first
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::EXTENSION_TYPE_KEY}": type
13
+ "#{ExtensionProjectKeys::SPECIFICATION_IDENTIFIER_KEY}": type
13
14
  )
14
15
  end
15
16
 
16
- def write_env_file(context:, title:, api_key: "", api_secret: "", registration_id: nil)
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 extension_type_identifier
49
- config[ExtensionProjectKeys::EXTENSION_TYPE_KEY]
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
- EXTENSION_TYPE_KEY = "EXTENSION_TYPE"
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: extract_argo_renderer_version(context),
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
- private
51
-
52
- def extract_argo_renderer_version(context)
53
- result = run_list_command(context)
54
- found_version = find_version_number(context, result)
55
- context.abort(
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.argo_renderer_package_invalid_version_error")
61
+ context.message("features.argo.dependencies.argo_missing_renderer_package_error")
62
62
  )
63
63
  end
64
64
 
65
- def find_version_number(context, result)
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
@@ -9,7 +9,7 @@ module Extension
9
9
  SCRIPTS_DIRECTORY = "scripts"
10
10
 
11
11
  property! :git_template, accepts: String
12
- property! :dependency_checks, default: []
12
+ property! :dependency_checks, default: -> { [] }
13
13
 
14
14
  def call(directory_name, identifier, context)
15
15
  steps = [
@@ -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 Extension.specifications[type] if Extension.specifications.valid?(type)
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
- Extension.specifications.each do |type|
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(ShopifyCli::Project.current.config[Extension::ExtensionProjectKeys::EXTENSION_TYPE_KEY])
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 with {{green:%s}}? (y/n)",
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}} with {{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: "%s Install the missing package and try again.",
100
- argo_renderer_package_invalid_version_error: <<~MESSAGE,
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