shopify-cli 1.8.0 → 1.12.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.
Files changed (95) 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 +24 -1
  6. data/Gemfile.lock +4 -4
  7. data/README.md +2 -1
  8. data/dev.yml +3 -0
  9. data/lib/graphql/extension_create.graphql +17 -2
  10. data/lib/project_types/extension/cli.rb +8 -0
  11. data/lib/project_types/extension/commands/extension_command.rb +4 -4
  12. data/lib/project_types/extension/commands/push.rb +2 -2
  13. data/lib/project_types/extension/commands/register.rb +4 -3
  14. data/lib/project_types/extension/commands/serve.rb +62 -28
  15. data/lib/project_types/extension/commands/tunnel.rb +3 -1
  16. data/lib/project_types/extension/extension_project.rb +16 -4
  17. data/lib/project_types/extension/extension_project_keys.rb +2 -1
  18. data/lib/project_types/extension/features/argo.rb +19 -44
  19. data/lib/project_types/extension/features/argo_runtime.rb +84 -0
  20. data/lib/project_types/extension/features/argo_serve.rb +80 -0
  21. data/lib/project_types/extension/features/argo_serve_options.rb +41 -0
  22. data/lib/project_types/extension/features/argo_setup.rb +1 -1
  23. data/lib/project_types/extension/messages/message_loading.rb +3 -1
  24. data/lib/project_types/extension/messages/messages.rb +5 -4
  25. data/lib/project_types/extension/models/npm_package.rb +14 -0
  26. data/lib/project_types/extension/models/registration.rb +1 -0
  27. data/lib/project_types/extension/models/specification.rb +3 -0
  28. data/lib/project_types/extension/models/specification_handlers/checkout_argo_extension.rb +18 -0
  29. data/lib/project_types/extension/models/specification_handlers/default.rb +49 -1
  30. data/lib/project_types/extension/models/version.rb +1 -1
  31. data/lib/project_types/extension/tasks/choose_next_available_port.rb +36 -0
  32. data/lib/project_types/extension/tasks/configure_features.rb +4 -0
  33. data/lib/project_types/extension/tasks/converters/registration_converter.rb +2 -0
  34. data/lib/project_types/extension/tasks/find_npm_packages.rb +106 -0
  35. data/lib/project_types/node/commands/generate.rb +0 -22
  36. data/lib/project_types/node/messages/messages.rb +4 -4
  37. data/lib/project_types/rails/messages/messages.rb +4 -4
  38. data/lib/project_types/script/cli.rb +7 -8
  39. data/lib/project_types/script/commands/create.rb +0 -7
  40. data/lib/project_types/script/commands/push.rb +3 -3
  41. data/lib/project_types/script/config/extension_points.yml +4 -0
  42. data/lib/project_types/script/errors.rb +0 -19
  43. data/lib/project_types/script/forms/create.rb +3 -14
  44. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +5 -5
  45. data/lib/project_types/script/graphql/get_app_scripts.graphql +6 -0
  46. data/lib/project_types/script/graphql/script_service_proxy.graphql +1 -2
  47. data/lib/project_types/script/layers/application/build_script.rb +1 -2
  48. data/lib/project_types/script/layers/application/create_script.rb +30 -51
  49. data/lib/project_types/script/layers/application/extension_points.rb +3 -2
  50. data/lib/project_types/script/layers/application/push_script.rb +5 -5
  51. data/lib/project_types/script/layers/domain/errors.rb +0 -2
  52. data/lib/project_types/script/layers/domain/extension_point.rb +56 -46
  53. data/lib/project_types/script/layers/domain/metadata.rb +18 -25
  54. data/lib/project_types/script/layers/domain/push_package.rb +4 -4
  55. data/lib/project_types/script/layers/domain/script_project.rb +54 -0
  56. data/lib/project_types/script/layers/infrastructure/assemblyscript_project_creator.rb +15 -16
  57. data/lib/project_types/script/layers/infrastructure/assemblyscript_task_runner.rb +13 -7
  58. data/lib/project_types/script/layers/infrastructure/command_runner.rb +19 -0
  59. data/lib/project_types/script/layers/infrastructure/errors.rb +40 -11
  60. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +12 -13
  61. data/lib/project_types/script/layers/infrastructure/rust_project_creator.rb +9 -10
  62. data/lib/project_types/script/layers/infrastructure/rust_task_runner.rb +6 -7
  63. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +172 -0
  64. data/lib/project_types/script/layers/infrastructure/script_service.rb +21 -72
  65. data/lib/project_types/script/messages/messages.rb +20 -50
  66. data/lib/project_types/script/tasks/ensure_env.rb +85 -0
  67. data/lib/project_types/script/ui/error_handler.rb +32 -30
  68. data/lib/shopify-cli/context.rb +28 -0
  69. data/lib/shopify-cli/js_system.rb +2 -2
  70. data/lib/shopify-cli/messages/messages.rb +50 -45
  71. data/lib/shopify-cli/method_object.rb +4 -4
  72. data/lib/shopify-cli/oauth.rb +9 -3
  73. data/lib/shopify-cli/packager.rb +1 -1
  74. data/lib/shopify-cli/partners_api/organizations.rb +3 -3
  75. data/lib/shopify-cli/resolve_constant.rb +1 -1
  76. data/lib/shopify-cli/resources/env_file.rb +1 -1
  77. data/lib/shopify-cli/shopifolk.rb +1 -1
  78. data/lib/shopify-cli/tasks/select_org_and_shop.rb +6 -4
  79. data/lib/shopify-cli/transform_data_structure.rb +1 -1
  80. data/lib/shopify-cli/tunnel.rb +22 -1
  81. data/lib/shopify-cli/version.rb +1 -1
  82. data/lib/shopify_cli.rb +0 -1
  83. data/vendor/deps/smart_properties/REVISION +1 -1
  84. data/vendor/deps/smart_properties/lib/smart_properties/property.rb +7 -1
  85. data/vendor/deps/smart_properties/lib/smart_properties/version.rb +1 -1
  86. metadata +16 -12
  87. data/.travis.yml +0 -14
  88. data/lib/project_types/script/commands/disable.rb +0 -25
  89. data/lib/project_types/script/commands/enable.rb +0 -80
  90. data/lib/project_types/script/graphql/shop_script_delete.graphql +0 -14
  91. data/lib/project_types/script/graphql/shop_script_update_or_create.graphql +0 -28
  92. data/lib/project_types/script/layers/application/disable_script.rb +0 -21
  93. data/lib/project_types/script/layers/application/enable_script.rb +0 -23
  94. data/lib/project_types/script/layers/infrastructure/config_ui_repository.rb +0 -46
  95. data/lib/project_types/script/script_project.rb +0 -64
@@ -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,84 @@
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
+ property :beta_access, accepts: Array, default: -> { [] }
16
+
17
+ def accepts_port?
18
+ case cli
19
+ when admin?
20
+ cli >= ARGO_ADMIN_CLI_0_11_0
21
+ when checkout?
22
+ cli >= ARGO_RUN_0_4_0
23
+ end
24
+ end
25
+
26
+ def accepts_tunnel_url?
27
+ case cli
28
+ when admin?
29
+ cli >= ARGO_ADMIN_CLI_0_11_0
30
+ when checkout?
31
+ cli >= ARGO_RUN_0_4_0
32
+ end
33
+ end
34
+
35
+ def accepts_uuid?
36
+ case cli
37
+ when admin?
38
+ cli >= ARGO_ADMIN_CLI_0_11_0
39
+ else
40
+ false
41
+ end
42
+ end
43
+
44
+ def accepts_argo_version?
45
+ case cli
46
+ when admin?
47
+ cli >= ARGO_ADMIN_CLI_0_9_3
48
+ else
49
+ false
50
+ end
51
+ end
52
+
53
+ def accepts_shop?
54
+ return false unless beta_access.include?(:argo_admin_beta)
55
+ case cli
56
+ when admin?
57
+ cli >= ARGO_ADMIN_CLI_0_11_0
58
+ else
59
+ false
60
+ end
61
+ end
62
+
63
+ def accepts_api_key?
64
+ return false unless beta_access.include?(:argo_admin_beta)
65
+ case cli
66
+ when admin?
67
+ cli >= ARGO_ADMIN_CLI_0_11_0
68
+ else
69
+ false
70
+ end
71
+ end
72
+
73
+ private
74
+
75
+ def admin?
76
+ ->(cli) { cli.name == ARGO_ADMIN_CLI_PACKAGE_NAME }
77
+ end
78
+
79
+ def checkout?
80
+ ->(cli) { cli.name == ARGO_RUN_PACKAGE_NAME }
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,80 @@
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
+ property :beta_access, accepts: Array, default: -> { [] }
12
+
13
+ def call
14
+ validate_env!
15
+
16
+ CLI::UI::Frame.open(context.message("serve.frame_title")) do
17
+ success = call_js_system(yarn_command: yarn_serve_command, npm_command: npm_serve_command)
18
+ context.abort(context.message("serve.serve_failure_message")) unless success
19
+ end
20
+ end
21
+
22
+ private
23
+
24
+ def call_js_system(yarn_command:, npm_command:)
25
+ ShopifyCli::JsSystem.call(context, yarn: yarn_command, npm: npm_command)
26
+ end
27
+
28
+ def specification
29
+ specification_handler.specification
30
+ end
31
+
32
+ def renderer_package
33
+ specification_handler.renderer_package(context)
34
+ end
35
+
36
+ def required_fields
37
+ specification.features.argo.required_fields
38
+ end
39
+
40
+ def serve_options
41
+ @options ||= Features::ArgoServeOptions.new(
42
+ argo_runtime: argo_runtime,
43
+ port: port,
44
+ context: context,
45
+ required_fields: required_fields,
46
+ renderer_package: renderer_package,
47
+ public_url: tunnel_url
48
+ )
49
+ end
50
+
51
+ def yarn_serve_command
52
+ serve_options.yarn_serve_command
53
+ end
54
+
55
+ def npm_serve_command
56
+ serve_options.npm_serve_command
57
+ end
58
+
59
+ def validate_env!
60
+ ExtensionProject.reload
61
+
62
+ return if required_fields.none?
63
+
64
+ return unless beta_access.include?(:argo_admin_beta)
65
+
66
+ ShopifyCli::Tasks::EnsureEnv.call(context, required: required_fields)
67
+ ShopifyCli::Tasks::EnsureDevStore.call(context) if required_fields.include?(:shop)
68
+
69
+ project = ExtensionProject.current
70
+
71
+ return if required_fields.all? do |field|
72
+ value = project.env.public_send(field)
73
+ value && !value.strip.empty?
74
+ end
75
+
76
+ context.abort(context.message("serve.serve_missing_information"))
77
+ end
78
+ end
79
+ end
80
+ end
@@ -0,0 +1,41 @@
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
+ api_key = project.env.api_key
29
+
30
+ @serve_options ||= [].tap do |options|
31
+ options << "--port=#{port}" if argo_runtime.accepts_port?
32
+ options << "--shop=#{project.env.shop}" if required_fields.include?(:shop) && argo_runtime.accepts_shop?
33
+ options << "--apiKey=#{api_key}" if required_fields.include?(:api_key) && argo_runtime.accepts_api_key?
34
+ options << "--argoVersion=#{renderer_package.version}" if argo_runtime.accepts_argo_version?
35
+ options << "--uuid=#{project.registration_uuid}" if argo_runtime.accepts_uuid?
36
+ options << "--publicUrl=#{public_url}" if argo_runtime.accepts_tunnel_url?
37
+ end
38
+ end
39
+ end
40
+ end
41
+ 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 = [
@@ -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)
@@ -56,8 +56,10 @@ module Extension
56
56
  },
57
57
  serve: {
58
58
  frame_title: "Serving extension...",
59
+ no_available_ports_found: "No available ports found to run extension.",
59
60
  serve_failure_message: "Failed to run extension code.",
60
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.",
61
63
  },
62
64
  tunnel: {
63
65
  missing_token: "{{x}} {{red:auth requires a token argument}}. "\
@@ -98,10 +100,8 @@ module Extension
98
100
  node_not_installed: "Node must be installed to create this extension.",
99
101
  version_too_low: "Your node version %s does not meet the minimum required version %s",
100
102
  },
101
- argo_missing_renderer_package_error: "%s Install the missing package and try again.",
102
- argo_renderer_package_invalid_version_error: <<~MESSAGE,
103
- The renderer package version is not a valid SemVer Version (http://semver.org)
104
- MESSAGE
103
+ argo_missing_renderer_package_error: "Extension template references invalid renderer package "\
104
+ "please contact Shopify for help.",
105
105
  yarn_install_error: "Something went wrong while running 'yarn install'. %s.",
106
106
  yarn_run_script_error: "Something went wrong while running script. %s.",
107
107
  },
@@ -117,6 +117,7 @@ module Extension
117
117
  },
118
118
  errors: {
119
119
  unknown_type: "Unknown extension type %s",
120
+ package_not_found: "`%s` package not found.",
120
121
  },
121
122
  }
122
123
 
@@ -0,0 +1,14 @@
1
+ require "semantic/semantic"
2
+
3
+ module Extension
4
+ module Models
5
+ NpmPackage = Struct.new(:name, :version, keyword_init: true) do
6
+ include Comparable
7
+
8
+ def <=>(other)
9
+ return nil unless name == other.name
10
+ Semantic::Version.new(version) <=> Semantic::Version.new(other.version)
11
+ end
12
+ end
13
+ end
14
+ 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
@@ -10,6 +10,9 @@ module Extension
10
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: -> { [] }
15
+ property! :cli_package_name, accepts: String, converts: :to_str, default: ""
13
16
  end
14
17
 
15
18
  def self.build(feature_set_attributes)
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Extension
4
+ module Models
5
+ module SpecificationHandlers
6
+ class CheckoutArgoExtension < Default
7
+ PERMITTED_CONFIG_KEYS = [:metafields, :extension_points]
8
+
9
+ def config(context)
10
+ {
11
+ **Features::ArgoConfig.parse_yaml(context, PERMITTED_CONFIG_KEYS),
12
+ **argo.config(context),
13
+ }
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -42,12 +42,60 @@ module Extension
42
42
  []
43
43
  end
44
44
 
45
+ def choose_port?(context)
46
+ argo_runtime(context).accepts_port?
47
+ end
48
+
49
+ def establish_tunnel?(context)
50
+ argo_runtime(context).accepts_tunnel_url?
51
+ end
52
+
53
+ def serve(context:, port:, tunnel_url:)
54
+ Features::ArgoServe.new(
55
+ specification_handler: self,
56
+ argo_runtime: argo_runtime(context),
57
+ context: context,
58
+ port: port,
59
+ tunnel_url: tunnel_url,
60
+ beta_access: beta_access
61
+ ).call
62
+ end
63
+
64
+ def renderer_package(context)
65
+ argo.renderer_package(context)
66
+ end
67
+
68
+ def argo_runtime(context)
69
+ @argo_runtime ||= Features::ArgoRuntime.new(
70
+ renderer: renderer_package(context),
71
+ cli: cli_package(context),
72
+ beta_access: beta_access
73
+ )
74
+ end
75
+
76
+ def beta_access
77
+ argo_admin_beta? ? [:argo_admin_beta] : []
78
+ end
79
+
80
+ def argo_admin_beta?
81
+ ShopifyCli::Shopifolk.check && ShopifyCli::Feature.enabled?(:argo_admin_beta)
82
+ end
83
+
84
+ def cli_package(context)
85
+ cli_package_name = specification.features.argo&.cli_package_name
86
+ return unless cli_package_name
87
+
88
+ js_system = ShopifyCli::JsSystem.new(ctx: context)
89
+ Tasks::FindNpmPackages.exactly_one_of(cli_package_name, js_system: js_system)
90
+ .unwrap { |_e| context.abort(context.message("errors.package_not_found", cli_package_name)) }
91
+ end
92
+
45
93
  protected
46
94
 
47
95
  def argo
48
96
  Features::Argo.new(
49
97
  git_template: specification.features.argo.git_template,
50
- renderer_package_name: specification.features.argo.renderer_package_name,
98
+ renderer_package_name: specification.features.argo.renderer_package_name
51
99
  )
52
100
  end
53
101