shopify-cli 1.6.0 → 1.9.1

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.
Files changed (206) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop_todo.yml +15 -2
  3. data/CHANGELOG.md +21 -0
  4. data/Gemfile +12 -12
  5. data/Gemfile.lock +14 -14
  6. data/Rakefile +32 -30
  7. data/bin/load_shopify.rb +6 -6
  8. data/bin/shopify +2 -2
  9. data/dev.yml +3 -0
  10. data/ext/shopify-cli/extconf.rb +7 -7
  11. data/lib/docgen/markdown.rb +12 -12
  12. data/lib/graphql/extension_create.graphql +17 -2
  13. data/lib/graphql/fetch_specifications.graphql +14 -0
  14. data/lib/{project_types/extension/graphql → graphql}/get_app_by_api_key.graphql +0 -0
  15. data/lib/project_types/extension/cli.rb +56 -55
  16. data/lib/project_types/extension/commands/build.rb +3 -3
  17. data/lib/project_types/extension/commands/create.rb +17 -10
  18. data/lib/project_types/extension/commands/extension_command.rb +14 -7
  19. data/lib/project_types/extension/commands/push.rb +10 -10
  20. data/lib/project_types/extension/commands/register.rb +22 -32
  21. data/lib/project_types/extension/commands/serve.rb +1 -7
  22. data/lib/project_types/extension/commands/tunnel.rb +12 -12
  23. data/lib/project_types/extension/extension_project.rb +22 -7
  24. data/lib/project_types/extension/extension_project_keys.rb +5 -4
  25. data/lib/project_types/extension/features/argo.rb +26 -42
  26. data/lib/project_types/extension/features/argo_config.rb +5 -5
  27. data/lib/project_types/extension/features/argo_dependencies.rb +5 -5
  28. data/lib/project_types/extension/features/argo_renderer_package.rb +47 -0
  29. data/lib/project_types/extension/features/argo_serve.rb +69 -0
  30. data/lib/project_types/extension/features/argo_setup.rb +3 -3
  31. data/lib/project_types/extension/features/argo_setup_steps.rb +4 -4
  32. data/lib/project_types/extension/forms/create.rb +28 -34
  33. data/lib/project_types/extension/forms/questions/ask_app.rb +53 -0
  34. data/lib/project_types/extension/forms/questions/ask_name.rb +40 -0
  35. data/lib/project_types/extension/forms/questions/ask_type.rb +47 -0
  36. data/lib/project_types/extension/messages/message_loading.rb +3 -1
  37. data/lib/project_types/extension/messages/messages.rb +55 -55
  38. data/lib/project_types/extension/models/lazy_specification_handler.rb +12 -0
  39. data/lib/project_types/extension/models/registration.rb +1 -0
  40. data/lib/project_types/extension/models/specification.rb +6 -2
  41. data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +1 -1
  42. data/lib/project_types/extension/models/specification_handlers/default.rb +10 -2
  43. data/lib/project_types/extension/models/specifications.rb +14 -3
  44. data/lib/project_types/extension/models/version.rb +1 -1
  45. data/lib/project_types/extension/tasks/configure_features.rb +7 -5
  46. data/lib/project_types/extension/tasks/converters/app_converter.rb +6 -6
  47. data/lib/project_types/extension/tasks/converters/registration_converter.rb +8 -6
  48. data/lib/project_types/extension/tasks/converters/validation_error_converter.rb +4 -4
  49. data/lib/project_types/extension/tasks/converters/version_converter.rb +7 -7
  50. data/lib/project_types/extension/tasks/create_extension.rb +4 -4
  51. data/lib/project_types/extension/tasks/fetch_specifications.rb +8 -28
  52. data/lib/project_types/extension/tasks/get_app.rb +4 -4
  53. data/lib/project_types/extension/tasks/get_apps.rb +3 -3
  54. data/lib/project_types/extension/tasks/update_draft.rb +4 -4
  55. data/lib/project_types/extension/tasks/user_errors.rb +4 -4
  56. data/lib/project_types/node/cli.rb +19 -19
  57. data/lib/project_types/node/commands/connect.rb +3 -3
  58. data/lib/project_types/node/commands/create.rb +40 -38
  59. data/lib/project_types/node/commands/deploy.rb +4 -4
  60. data/lib/project_types/node/commands/deploy/heroku.rb +24 -24
  61. data/lib/project_types/node/commands/generate.rb +2 -24
  62. data/lib/project_types/node/commands/open.rb +2 -2
  63. data/lib/project_types/node/commands/populate.rb +6 -6
  64. data/lib/project_types/node/commands/populate/customer.rb +5 -5
  65. data/lib/project_types/node/commands/populate/draft_order.rb +5 -5
  66. data/lib/project_types/node/commands/populate/product.rb +5 -5
  67. data/lib/project_types/node/commands/serve.rb +9 -9
  68. data/lib/project_types/node/commands/tunnel.rb +7 -7
  69. data/lib/project_types/node/forms/create.rb +17 -8
  70. data/lib/project_types/node/messages/messages.rb +8 -7
  71. data/lib/project_types/rails/cli.rb +21 -21
  72. data/lib/project_types/rails/commands/connect.rb +3 -3
  73. data/lib/project_types/rails/commands/create.rb +51 -48
  74. data/lib/project_types/rails/commands/deploy.rb +4 -4
  75. data/lib/project_types/rails/commands/deploy/heroku.rb +30 -30
  76. data/lib/project_types/rails/commands/generate.rb +7 -7
  77. data/lib/project_types/rails/commands/generate/webhook.rb +6 -6
  78. data/lib/project_types/rails/commands/open.rb +2 -2
  79. data/lib/project_types/rails/commands/populate.rb +6 -6
  80. data/lib/project_types/rails/commands/populate/customer.rb +5 -5
  81. data/lib/project_types/rails/commands/populate/draft_order.rb +5 -5
  82. data/lib/project_types/rails/commands/populate/product.rb +5 -5
  83. data/lib/project_types/rails/commands/serve.rb +11 -11
  84. data/lib/project_types/rails/commands/tunnel.rb +7 -7
  85. data/lib/project_types/rails/forms/create.rb +34 -24
  86. data/lib/project_types/rails/gem.rb +23 -23
  87. data/lib/project_types/rails/messages/messages.rb +9 -8
  88. data/lib/project_types/rails/ruby.rb +2 -2
  89. data/lib/project_types/script/cli.rb +36 -40
  90. data/lib/project_types/script/commands/create.rb +9 -13
  91. data/lib/project_types/script/commands/push.rb +6 -5
  92. data/lib/project_types/script/config/extension_points.yml +25 -10
  93. data/lib/project_types/script/errors.rb +1 -19
  94. data/lib/project_types/script/forms/create.rb +7 -18
  95. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +7 -5
  96. data/lib/project_types/script/graphql/script_service_proxy.graphql +1 -2
  97. data/lib/project_types/script/layers/application/build_script.rb +6 -8
  98. data/lib/project_types/script/layers/application/create_script.rb +34 -24
  99. data/lib/project_types/script/layers/application/extension_points.rb +3 -2
  100. data/lib/project_types/script/layers/application/project_dependencies.rb +4 -4
  101. data/lib/project_types/script/layers/application/push_script.rb +10 -15
  102. data/lib/project_types/script/layers/domain/config_ui.rb +16 -0
  103. data/lib/project_types/script/layers/domain/errors.rb +16 -0
  104. data/lib/project_types/script/layers/domain/extension_point.rb +60 -45
  105. data/lib/project_types/script/layers/domain/metadata.rb +18 -25
  106. data/lib/project_types/script/layers/domain/push_package.rb +9 -5
  107. data/lib/project_types/script/layers/domain/script_project.rb +38 -0
  108. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +39 -10
  109. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +9 -44
  110. data/lib/project_types/script/layers/infrastructure/errors.rb +50 -19
  111. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +2 -2
  112. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +16 -21
  113. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +4 -4
  114. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +2 -2
  115. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +179 -0
  116. data/lib/project_types/script/layers/infrastructure/script_service.rb +35 -78
  117. data/lib/project_types/script/messages/messages.rb +33 -57
  118. data/lib/project_types/script/ui/error_handler.rb +116 -88
  119. data/lib/project_types/script/ui/printing_spinner.rb +1 -1
  120. data/lib/project_types/script/ui/strict_spinner.rb +1 -1
  121. data/lib/project_types/theme/cli.rb +19 -19
  122. data/lib/project_types/theme/commands/connect.rb +12 -12
  123. data/lib/project_types/theme/commands/create.rb +11 -11
  124. data/lib/project_types/theme/commands/deploy.rb +8 -8
  125. data/lib/project_types/theme/commands/generate.rb +3 -3
  126. data/lib/project_types/theme/commands/generate/env.rb +15 -15
  127. data/lib/project_types/theme/commands/push.rb +15 -15
  128. data/lib/project_types/theme/commands/serve.rb +5 -5
  129. data/lib/project_types/theme/forms/connect.rb +4 -4
  130. data/lib/project_types/theme/forms/create.rb +5 -5
  131. data/lib/project_types/theme/tasks/ensure_themekit_installed.rb +22 -22
  132. data/lib/project_types/theme/themekit.rb +15 -15
  133. data/lib/rubygems_plugin.rb +3 -3
  134. data/lib/shopify-cli/admin_api.rb +11 -11
  135. data/lib/shopify-cli/admin_api/populate_resource_command.rb +17 -17
  136. data/lib/shopify-cli/admin_api/schema.rb +3 -3
  137. data/lib/shopify-cli/api.rb +10 -10
  138. data/lib/shopify-cli/command.rb +1 -1
  139. data/lib/shopify-cli/commands.rb +9 -9
  140. data/lib/shopify-cli/commands/config.rb +28 -52
  141. data/lib/shopify-cli/commands/connect.rb +10 -10
  142. data/lib/shopify-cli/commands/create.rb +5 -5
  143. data/lib/shopify-cli/commands/help.rb +6 -6
  144. data/lib/shopify-cli/commands/logout.rb +3 -3
  145. data/lib/shopify-cli/commands/system.rb +32 -32
  146. data/lib/shopify-cli/commands/version.rb +2 -2
  147. data/lib/shopify-cli/context.rb +51 -23
  148. data/lib/shopify-cli/core.rb +4 -4
  149. data/lib/shopify-cli/core/entry_point.rb +5 -5
  150. data/lib/shopify-cli/core/executor.rb +1 -1
  151. data/lib/shopify-cli/core/help_resolver.rb +2 -2
  152. data/lib/shopify-cli/core/monorail.rb +16 -16
  153. data/lib/shopify-cli/db.rb +2 -2
  154. data/lib/shopify-cli/feature.rb +1 -1
  155. data/lib/shopify-cli/form.rb +1 -1
  156. data/lib/shopify-cli/git.rb +17 -17
  157. data/lib/shopify-cli/helpers.rb +1 -1
  158. data/lib/shopify-cli/helpers/haikunator.rb +1 -1
  159. data/lib/shopify-cli/heroku.rb +28 -28
  160. data/lib/shopify-cli/http_request.rb +2 -2
  161. data/lib/shopify-cli/js_deps.rb +12 -12
  162. data/lib/shopify-cli/js_system.rb +7 -7
  163. data/lib/shopify-cli/lazy_delegator.rb +55 -0
  164. data/lib/shopify-cli/messages/messages.rb +7 -16
  165. data/lib/shopify-cli/method_object.rb +1 -1
  166. data/lib/shopify-cli/oauth.rb +27 -27
  167. data/lib/shopify-cli/oauth/servlet.rb +9 -9
  168. data/lib/shopify-cli/options.rb +3 -3
  169. data/lib/shopify-cli/packager.rb +25 -25
  170. data/lib/shopify-cli/partners_api.rb +16 -16
  171. data/lib/shopify-cli/partners_api/organizations.rb +10 -10
  172. data/lib/shopify-cli/process_supervision.rb +7 -7
  173. data/lib/shopify-cli/project.rb +16 -16
  174. data/lib/shopify-cli/project_type.rb +3 -3
  175. data/lib/shopify-cli/resolve_constant.rb +1 -1
  176. data/lib/shopify-cli/resources.rb +1 -1
  177. data/lib/shopify-cli/resources/env_file.rb +10 -10
  178. data/lib/shopify-cli/result.rb +11 -11
  179. data/lib/shopify-cli/shopifolk.rb +6 -9
  180. data/lib/shopify-cli/sub_command.rb +1 -1
  181. data/lib/shopify-cli/task.rb +3 -3
  182. data/lib/shopify-cli/tasks.rb +7 -7
  183. data/lib/shopify-cli/tasks/create_api_client.rb +5 -5
  184. data/lib/shopify-cli/tasks/ensure_dev_store.rb +12 -12
  185. data/lib/shopify-cli/tasks/ensure_env.rb +15 -15
  186. data/lib/shopify-cli/tasks/ensure_loopback_url.rb +4 -4
  187. data/lib/shopify-cli/tasks/select_org_and_shop.rb +19 -19
  188. data/lib/shopify-cli/tasks/update_dashboard_urls.rb +10 -10
  189. data/lib/shopify-cli/transform_data_structure.rb +86 -0
  190. data/lib/shopify-cli/tunnel.rb +30 -30
  191. data/lib/shopify-cli/version.rb +1 -1
  192. data/lib/shopify_cli.rb +56 -54
  193. data/shopify-cli.gemspec +6 -6
  194. data/vendor/deps/smart_properties/REVISION +1 -1
  195. data/vendor/deps/smart_properties/lib/smart_properties/property.rb +7 -1
  196. data/vendor/deps/smart_properties/lib/smart_properties/version.rb +1 -1
  197. data/vendor/gen/template/bin/update-deps +9 -9
  198. metadata +15 -11
  199. data/lib/project_types/extension/forms/register.rb +0 -47
  200. data/lib/project_types/script/commands/disable.rb +0 -25
  201. data/lib/project_types/script/commands/enable.rb +0 -78
  202. data/lib/project_types/script/graphql/shop_script_delete.graphql +0 -14
  203. data/lib/project_types/script/graphql/shop_script_update_or_create.graphql +0 -28
  204. data/lib/project_types/script/layers/application/disable_script.rb +0 -21
  205. data/lib/project_types/script/layers/application/enable_script.rb +0 -23
  206. data/lib/project_types/script/script_project.rb +0 -63
@@ -3,50 +3,44 @@
3
3
  module Extension
4
4
  module Forms
5
5
  class Create < ShopifyCli::Form
6
- flag_arguments :name, :type
6
+ flag_arguments :name, :type, :api_key
7
7
 
8
- def ask
9
- self.type = ask_type
10
- self.name = ask_name
11
- end
8
+ attr_reader :app
12
9
 
13
- def directory_name
14
- @directory_name ||= name.strip.gsub(/( )/, '_').downcase
15
- end
10
+ class ExtensionProjectDetails
11
+ include SmartProperties
16
12
 
17
- private
13
+ property :app, accepts: Models::App
14
+ property :name, accepts: String
15
+ property :type, accepts: Models::SpecificationHandlers::Default
18
16
 
19
- def ask_name
20
- ask_with_reprompt(
21
- initial_value: name,
22
- break_condition: -> (current_name) { Models::Registration.valid_title?(current_name) },
23
- prompt_message: ctx.message('create.ask_name'),
24
- reprompt_message: ctx.message('create.invalid_name', Models::Registration::MAX_TITLE_LENGTH)
25
- )
17
+ def complete?
18
+ !!(app && name && type)
19
+ end
26
20
  end
27
21
 
28
- def ask_type
29
- return Extension.specifications[type] if Extension.specifications.valid?(type)
30
- ctx.puts(ctx.message('create.invalid_type')) unless type.nil?
31
-
32
- CLI::UI::Prompt.ask(ctx.message('create.ask_type')) do |handler|
33
- Extension.specifications.each do |type|
34
- handler.option("#{type.name} #{type.tagline}") { type }
22
+ def ask
23
+ ShopifyCli::Result.wrap(ExtensionProjectDetails.new)
24
+ .then(&Questions::AskApp.new(ctx: ctx, api_key: api_key))
25
+ .then(&Questions::AskType.new(ctx: ctx, type: type))
26
+ .then(&Questions::AskName.new(ctx: ctx, name: name))
27
+ .unwrap { |e| raise e }
28
+ .tap do |project_details|
29
+ ctx.abort(ctx.message("create.incomplete_configuration")) unless project_details.complete?
30
+
31
+ self.app = project_details.app
32
+ self.type = project_details.type
33
+ self.name = project_details.name
35
34
  end
36
- end
37
35
  end
38
36
 
39
- def ask_with_reprompt(initial_value:, break_condition:, prompt_message:, reprompt_message:)
40
- value = initial_value
41
- reprompt = false
42
-
43
- until break_condition.call(value)
44
- ctx.puts(reprompt_message) if reprompt
45
- value = CLI::UI::Prompt.ask(prompt_message)&.strip
46
- reprompt = true
47
- end
48
- value
37
+ def directory_name
38
+ name.strip.gsub(/( )/, "_").downcase
49
39
  end
40
+
41
+ private
42
+
43
+ attr_writer :app
50
44
  end
51
45
  end
52
46
  end
@@ -0,0 +1,53 @@
1
+ module Extension
2
+ module Forms
3
+ module Questions
4
+ class AskApp
5
+ include ShopifyCli::MethodObject
6
+
7
+ property! :ctx
8
+ property :api_key
9
+ property! :prompt,
10
+ converts: :to_proc,
11
+ default: -> { CLI::UI::Prompt.method(:ask) }
12
+
13
+ def call(project_details)
14
+ project_details.tap(&method(:prompt_for_app))
15
+ end
16
+
17
+ private
18
+
19
+ def prompt_for_app(project_details)
20
+ project_details.app =
21
+ api_key.nil? ? choose_interactively(load_apps) : validate_app_ownership(api_key)
22
+ end
23
+
24
+ def validate_app_ownership(api_key)
25
+ found_app = Tasks::GetApp.call(context: ctx, api_key: api_key)
26
+ ctx.abort(ctx.message("create.invalid_api_key", api_key)) if found_app.nil?
27
+ found_app
28
+ end
29
+
30
+ def choose_interactively(apps)
31
+ prompt.call(ctx.message("create.ask_app")) do |handler|
32
+ apps.each do |app|
33
+ handler.option("#{app.title} by #{app.business_name}") { app }
34
+ end
35
+ end
36
+ end
37
+
38
+ def load_apps
39
+ ctx.puts(@ctx.message("create.loading_apps"))
40
+ apps = Tasks::GetApps.call(context: ctx)
41
+
42
+ apps.empty? ? abort_no_apps : apps
43
+ end
44
+
45
+ def abort_no_apps
46
+ ctx.puts(@ctx.message("create.no_apps"))
47
+ ctx.puts(@ctx.message("create.learn_about_apps"))
48
+ raise ShopifyCli::AbortSilent
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,40 @@
1
+ module Extension
2
+ module Forms
3
+ module Questions
4
+ class AskName
5
+ include ShopifyCli::MethodObject
6
+
7
+ property! :ctx
8
+ property :name
9
+ property :prompt,
10
+ accepts: ->(prompt) { prompt.respond_to?(:call) },
11
+ default: -> { CLI::UI::Prompt.method(:ask) }
12
+
13
+ def call(project_details)
14
+ project_details.name = ask_with_reprompt(
15
+ initial_value: name,
16
+ break_condition: -> (current_name) { Models::Registration.valid_title?(current_name) },
17
+ prompt_message: ctx.message("create.ask_name"),
18
+ reprompt_message: ctx.message("create.invalid_name", Models::Registration::MAX_TITLE_LENGTH)
19
+ )
20
+ project_details
21
+ end
22
+
23
+ private
24
+
25
+ def ask_with_reprompt(initial_value:, break_condition:, prompt_message:, reprompt_message:)
26
+ value = initial_value
27
+ reprompt = false
28
+
29
+ until break_condition.call(value)
30
+ ctx.puts(reprompt_message) if reprompt
31
+ value = prompt.call(prompt_message)&.strip
32
+ reprompt = true
33
+ end
34
+
35
+ value
36
+ end
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,47 @@
1
+ module Extension
2
+ module Forms
3
+ module Questions
4
+ class AskType
5
+ include ShopifyCli::MethodObject
6
+
7
+ property! :ctx
8
+ property :type
9
+ property :prompt,
10
+ converts: :to_proc,
11
+ default: -> { CLI::UI::Prompt.method(:ask) }
12
+
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
+
18
+ project_details.tap do |p|
19
+ p.type = type.nil? ? choose_type(specifications) : validate_given_type(specifications, type)
20
+ end
21
+ end
22
+
23
+ private
24
+
25
+ def validate_given_type(specifications, type)
26
+ return specifications[type] if specifications.valid?(type)
27
+ ctx.abort(ctx.message("create.invalid_type")) unless type.nil?
28
+ end
29
+
30
+ def choose_type(specifications)
31
+ abort_due_to_missing_specifications if specifications.none?
32
+
33
+ prompt.call(ctx.message("create.ask_type")) do |handler|
34
+ specifications.each do |type|
35
+ handler.option("#{type.name} #{type.tagline}") { type }
36
+ end
37
+ end
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
44
+ end
45
+ end
46
+ end
47
+ 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)
@@ -1,15 +1,15 @@
1
1
  # frozen_string_literal: true
2
- require 'shopify_cli'
2
+ require "shopify_cli"
3
3
 
4
4
  module Extension
5
5
  module Messages
6
6
  MESSAGES = {
7
7
  create: {
8
- ask_name: 'Extension name',
9
- invalid_name: 'Extension name must be under %s characters',
10
- ask_type: 'What type of extension are you creating?',
11
- invalid_type: 'Extension type is invalid.',
12
- setup_project_frame_title: 'Initializing project',
8
+ ask_name: "Extension name",
9
+ invalid_name: "Extension name must be under %s characters",
10
+ ask_type: "What type of extension are you creating?",
11
+ invalid_type: "Extension type is invalid.",
12
+ setup_project_frame_title: "Initializing project",
13
13
  ready_to_start: <<~MESSAGE,
14
14
  {{v}} A new folder was generated at {{green:./%s}}.
15
15
  {{*}} You’re ready to start building {{green:%s}}!
@@ -19,49 +19,52 @@ module Extension
19
19
  {{*}} Once you're ready to version and publish your extension,
20
20
  run {{command:shopify register}} to register this extension with one of your apps.
21
21
  MESSAGE
22
- try_again: '{{*}} Fix the errors and run {{command:shopify create extension}} again.',
22
+ try_again: "{{*}} Fix the errors and run {{command:shopify create extension}} again.",
23
23
  errors: {
24
- directory_exists: 'Directory ‘%s’ already exists. Please remove it or choose a new name for your project.',
24
+ directory_exists: "Directory ‘%s’ already exists. Please remove it or choose a new name for your project.",
25
25
  },
26
+ incomplete_configuration: "Cannot create extension due to missing configuration information",
27
+ invalid_api_key: "The API key %s does not match any of your apps.",
28
+ ask_app: "Which app would you like to register this extension with?",
29
+ no_apps: "{{x}} You don’t have any apps.",
30
+ learn_about_apps: "{{*}} Learn more about building apps at <https://shopify.dev/concepts/apps>, " \
31
+ "or try creating a new app using {{command:shopify create}}.",
32
+ loading_apps: "Loading your apps...",
33
+ no_available_extensions: "{{x}} There are no available extensions for this app.",
26
34
  },
27
35
  build: {
28
- frame_title: 'Building extension with: %s...',
29
- build_failure_message: 'Failed to build extension code.',
36
+ frame_title: "Building extension with: %s...",
37
+ build_failure_message: "Failed to build extension code.",
30
38
  },
31
39
  register: {
32
- frame_title: 'Registering Extension',
33
- waiting_text: 'Registering with Shopify...',
34
- already_registered: 'Extension is already registered.',
35
- loading_apps: 'Loading your apps...',
36
- ask_app: 'Which app would you like to register this extension with?',
37
- no_apps: '{{x}} You don’t have any apps.',
38
- learn_about_apps: '{{*}} Learn more about building apps at <https://shopify.dev/concepts/apps>, ' \
39
- 'or try creating a new app using {{command:shopify create}}.',
40
- invalid_api_key: 'The API key %s does not match any of your apps.',
41
- confirm_info: 'This will create a new extension registration for %s, which can’t be undone.',
42
- confirm_question: 'Would you like to register this extension with {{green:%s}}? (y/n)',
43
- confirm_abort: 'Extension was not registered.',
44
- success: '{{v}} Registered {{green:%s}} with {{green:%s}}.',
45
- success_info: '{{*}} Run {{command:shopify push}} to push your extension to Shopify.',
40
+ frame_title: "Registering Extension",
41
+ waiting_text: "Registering with Shopify...",
42
+ already_registered: "Extension is already registered.",
43
+ confirm_info: "This will create a new extension registration for %s, which can’t be undone.",
44
+ confirm_question: "Would you like to register this extension? (y/n)",
45
+ confirm_abort: "Extension was not registered.",
46
+ success: "{{v}} Registered {{green:%s}}.",
47
+ success_info: "{{*}} Run {{command:shopify push}} to push your extension to Shopify.",
46
48
  },
47
49
  push: {
48
- frame_title: 'Pushing your extension to Shopify',
49
- waiting_text: 'Pushing code to Shopify...',
50
- pushed_with_errors: '{{x}} Code pushed to Shopify with errors on %s.',
51
- push_with_errors_info: '{{*}} Fix these errors and run {{command:shopify push}} to revalidate your extension.',
52
- success_confirmation: '{{v}} Pushed {{green:%s}} to a draft on %s.',
53
- success_info: '{{*}} Visit %s to version and publish your extension.',
50
+ frame_title: "Pushing your extension to Shopify",
51
+ waiting_text: "Pushing code to Shopify...",
52
+ pushed_with_errors: "{{x}} Code pushed to Shopify with errors on %s.",
53
+ push_with_errors_info: "{{*}} Fix these errors and run {{command:shopify push}} to revalidate your extension.",
54
+ success_confirmation: "{{v}} Pushed {{green:%s}} to a draft on %s.",
55
+ success_info: "{{*}} Visit %s to version and publish your extension.",
54
56
  },
55
57
  serve: {
56
- frame_title: 'Serving extension...',
57
- serve_failure_message: 'Failed to run extension code.',
58
+ frame_title: "Serving extension...",
59
+ serve_failure_message: "Failed to run extension code.",
60
+ serve_missing_information: "Missing shop or api_key.",
58
61
  },
59
62
  tunnel: {
60
- missing_token: '{{x}} {{red:auth requires a token argument}}. '\
61
- 'Find it on your ngrok dashboard: {{underline:https://dashboard.ngrok.com/auth/your-authtoken}}.',
62
- invalid_port: '%s is not a valid port.',
63
- no_tunnel_running: 'No tunnel running.',
64
- tunnel_running_at: 'Tunnel running at: {{underline:%s}}',
63
+ missing_token: "{{x}} {{red:auth requires a token argument}}. "\
64
+ "Find it on your ngrok dashboard: {{underline:https://dashboard.ngrok.com/auth/your-authtoken}}.",
65
+ invalid_port: "%s is not a valid port.",
66
+ no_tunnel_running: "No tunnel running.",
67
+ tunnel_running_at: "Tunnel running at: {{underline:%s}}",
65
68
  help: <<~HELP,
66
69
  Start or stop an http tunnel to your local development extension using ngrok.
67
70
  Usage: {{command:%s tunnel [ auth | start | stop | status ]}}
@@ -69,7 +72,7 @@ module Extension
69
72
  extended_help: <<~HELP,
70
73
  {{bold:Subcommands:}}
71
74
 
72
- {{cyan:auth}}: Writes an ngrok auth token to ~/.ngrok2/ngrok.yml to connect with an ngrok account.
75
+ {{cyan:auth}}: Writes an ngrok auth token to ~/.ngrok2/ngrok.yml to connect with an ngrok account.
73
76
  Visit https://dashboard.ngrok.com/signup to sign up.
74
77
  Usage: {{command:%1$s tunnel auth <token>}}
75
78
 
@@ -87,48 +90,45 @@ module Extension
87
90
  },
88
91
  features: {
89
92
  argo: {
90
- missing_file_error: 'Could not find built extension file.',
91
- script_prepare_error: 'An error occurred while attempting to prepare your script.',
92
- initialization_error: '{{x}} There was an error while initializing the project.',
93
+ missing_file_error: "Could not find built extension file.",
94
+ script_prepare_error: "An error occurred while attempting to prepare your script.",
95
+ initialization_error: "{{x}} There was an error while initializing the project.",
93
96
  dependencies: {
94
97
  node: {
95
- node_not_installed: 'Node must be installed to create this extension.',
96
- version_too_low: 'Your node version %s does not meet the minimum required version %s',
98
+ node_not_installed: "Node must be installed to create this extension.",
99
+ version_too_low: "Your node version %s does not meet the minimum required version %s",
97
100
  },
98
- argo_missing_renderer_package_error: '%s Install the missing package and try again.',
99
- argo_renderer_package_invalid_version_error: <<~MESSAGE,
100
- The renderer package version is not a valid SemVer Version (http://semver.org)
101
- MESSAGE
101
+ argo_missing_renderer_package_error: "Extension template references invalid renderer package please contact Shopify for help.",
102
102
  yarn_install_error: "Something went wrong while running 'yarn install'. %s.",
103
- yarn_run_script_error: 'Something went wrong while running script. %s.',
103
+ yarn_run_script_error: "Something went wrong while running script. %s.",
104
104
  },
105
105
  config: {
106
- unpermitted_keys: '`%s` contains the following unpermitted keys: %s',
106
+ unpermitted_keys: "`%s` contains the following unpermitted keys: %s",
107
107
  },
108
108
  },
109
109
  },
110
110
  tasks: {
111
111
  errors: {
112
- parse_error: 'Unable to parse response from Partners Dashboard.',
112
+ parse_error: "Unable to parse response from Partners Dashboard.",
113
113
  },
114
114
  },
115
115
  errors: {
116
- unknown_type: 'Unknown extension type %s',
116
+ unknown_type: "Unknown extension type %s",
117
117
  },
118
118
  }
119
119
 
120
120
  TYPES = {
121
121
  product_subscription: {
122
- name: 'Product Subscription',
123
- tagline: '(limit 1 per app)',
122
+ name: "Product Subscription",
123
+ tagline: "(limit 1 per app)",
124
124
  overrides: {
125
125
  register: {
126
- confirm_info: 'You can only create one %s extension per app, which can’t be undone.',
126
+ confirm_info: "You can only create one %s extension per app, which can’t be undone.",
127
127
  },
128
128
  },
129
129
  },
130
130
  checkout_post_purchase: {
131
- name: 'Checkout Post Purchase',
131
+ name: "Checkout Post Purchase",
132
132
  },
133
133
  }
134
134
  end
@@ -0,0 +1,12 @@
1
+ module Extension
2
+ module Models
3
+ class LazySpecificationHandler < ShopifyCli::LazyDelegator
4
+ attr_reader :identifier
5
+
6
+ def initialize(identifier, &specification_handler_initializer)
7
+ super(&specification_handler_initializer)
8
+ @identifier = identifier
9
+ end
10
+ end
11
+ end
12
+ end
@@ -7,6 +7,7 @@ module Extension
7
7
  include SmartProperties
8
8
 
9
9
  property! :id, accepts: Integer
10
+ property! :uuid, accepts: String
10
11
  property! :type, accepts: String
11
12
  property! :title, accepts: String
12
13
  property! :draft_version, accepts: Extension::Models::Version
@@ -7,9 +7,11 @@ module Extension
7
7
  class Argo
8
8
  include SmartProperties
9
9
 
10
- property! :surface_area, converts: :to_str
10
+ property! :surface, converts: :to_str
11
11
  property! :renderer_package_name, converts: :to_str
12
12
  property! :git_template, converts: :to_str
13
+ property! :required_fields, accepts: Array, default: -> { [] }
14
+ property! :required_shop_beta_flags, accepts: Array, default: -> { [] }
13
15
  end
14
16
 
15
17
  def self.build(feature_set_attributes)
@@ -18,14 +20,16 @@ module Extension
18
20
  .call(identifier, namespace: Features)
19
21
  .rescue { OpenStruct }
20
22
  .then { |c| c.new(**feature_attributes) }
21
- .unwrap { |error| raise error }
23
+ .unwrap { |error| raise(error) }
22
24
  end
23
25
  end
24
26
  end
25
27
 
26
28
  property! :identifier
29
+ property :name, converts: :to_str
27
30
  property :graphql_identifier, converts: :to_str
28
31
  property! :features, converts: Features.method(:build), default: -> { [] }
32
+ property! :options, converts: ->(options) { OpenStruct.new(options) }, default: -> { OpenStruct.new }
29
33
 
30
34
  def graphql_identifier
31
35
  super || identifier