shopify-cli 1.8.0 → 1.12.0

Sign up to get free protection for your applications and to get access to all the features.
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