@shopify/cli-kit 3.45.1 → 3.46.0-pre.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 (159) hide show
  1. package/assets/cli-ruby/Gemfile +0 -1
  2. package/assets/cli-ruby/Rakefile +0 -76
  3. package/assets/cli-ruby/lib/project_types/extension/cli.rb +5 -86
  4. package/assets/cli-ruby/lib/shopify_cli/admin_api.rb +0 -3
  5. package/assets/cli-ruby/lib/shopify_cli/command/sub_command.rb +1 -2
  6. package/assets/cli-ruby/lib/shopify_cli/command.rb +0 -7
  7. package/assets/cli-ruby/lib/shopify_cli/commands.rb +0 -15
  8. package/assets/cli-ruby/lib/shopify_cli/core.rb +0 -1
  9. package/assets/cli-ruby/lib/shopify_cli/identity_auth.rb +0 -1
  10. package/assets/cli-ruby/lib/shopify_cli/theme/dev_server/proxy.rb +9 -1
  11. package/assets/cli-ruby/lib/shopify_cli.rb +1 -10
  12. package/assets/cli-ruby/test/test_helpers.rb +0 -2
  13. package/dist/private/node/ui/components/ConcurrentOutput.js.map +1 -1
  14. package/dist/private/node/ui/components/ConcurrentOutput.test.js +2 -2
  15. package/dist/private/node/ui/components/ConcurrentOutput.test.js.map +1 -1
  16. package/dist/private/node/ui/components/List.d.ts +2 -0
  17. package/dist/private/node/ui/components/List.js +5 -4
  18. package/dist/private/node/ui/components/List.js.map +1 -1
  19. package/dist/private/node/ui/components/Prompts/InfoTable.d.ts +10 -2
  20. package/dist/private/node/ui/components/Prompts/InfoTable.js +12 -8
  21. package/dist/private/node/ui/components/Prompts/InfoTable.js.map +1 -1
  22. package/dist/public/common/string.js +62 -0
  23. package/dist/public/common/string.js.map +1 -1
  24. package/dist/public/common/version.d.ts +1 -1
  25. package/dist/public/common/version.js +1 -1
  26. package/dist/public/common/version.js.map +1 -1
  27. package/dist/public/node/cli.d.ts +1 -0
  28. package/dist/public/node/cli.js +15 -1
  29. package/dist/public/node/cli.js.map +1 -1
  30. package/dist/public/node/fs.d.ts +7 -2
  31. package/dist/public/node/fs.js +4 -3
  32. package/dist/public/node/fs.js.map +1 -1
  33. package/dist/public/node/output.d.ts +3 -1
  34. package/dist/public/node/output.js +10 -2
  35. package/dist/public/node/output.js.map +1 -1
  36. package/dist/public/node/ui.d.ts +3 -2
  37. package/dist/public/node/ui.js +1 -1
  38. package/dist/public/node/ui.js.map +1 -1
  39. package/dist/tsconfig.tsbuildinfo +1 -1
  40. package/package.json +8 -8
  41. package/assets/cli-ruby/lib/project_types/extension/commands/build.rb +0 -51
  42. package/assets/cli-ruby/lib/project_types/extension/commands/check.rb +0 -51
  43. package/assets/cli-ruby/lib/project_types/extension/commands/connect.rb +0 -35
  44. package/assets/cli-ruby/lib/project_types/extension/commands/create.rb +0 -100
  45. package/assets/cli-ruby/lib/project_types/extension/commands/info.rb +0 -86
  46. package/assets/cli-ruby/lib/project_types/extension/commands/push.rb +0 -112
  47. package/assets/cli-ruby/lib/project_types/extension/commands/register.rb +0 -67
  48. package/assets/cli-ruby/lib/project_types/extension/commands/tunnel.rb +0 -73
  49. package/assets/cli-ruby/lib/project_types/extension/forms/connect.rb +0 -42
  50. package/assets/cli-ruby/lib/project_types/extension/forms/create.rb +0 -49
  51. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_app.rb +0 -53
  52. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_name.rb +0 -48
  53. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_registration.rb +0 -55
  54. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_template.rb +0 -37
  55. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_type.rb +0 -47
  56. package/assets/cli-ruby/lib/project_types/extension/models/development_server.rb +0 -77
  57. package/assets/cli-ruby/lib/project_types/extension/models/development_server_requirements.rb +0 -56
  58. package/assets/cli-ruby/lib/project_types/extension/models/npm_package.rb +0 -44
  59. package/assets/cli-ruby/lib/project_types/extension/models/product.rb +0 -12
  60. package/assets/cli-ruby/lib/project_types/extension/models/registration.rb +0 -20
  61. package/assets/cli-ruby/lib/project_types/extension/models/server_config/app.rb +0 -13
  62. package/assets/cli-ruby/lib/project_types/extension/models/server_config/base.rb +0 -31
  63. package/assets/cli-ruby/lib/project_types/extension/models/server_config/capabilities.rb +0 -11
  64. package/assets/cli-ruby/lib/project_types/extension/models/server_config/development.rb +0 -33
  65. package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_entries.rb +0 -38
  66. package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_renderer.rb +0 -38
  67. package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_resource.rb +0 -13
  68. package/assets/cli-ruby/lib/project_types/extension/models/server_config/extension.rb +0 -46
  69. package/assets/cli-ruby/lib/project_types/extension/models/server_config/root.rb +0 -21
  70. package/assets/cli-ruby/lib/project_types/extension/models/server_config/user.rb +0 -10
  71. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +0 -29
  72. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +0 -170
  73. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension.rb +0 -58
  74. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension_utils/script_config.rb +0 -33
  75. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension_utils/script_config_repository.rb +0 -75
  76. package/assets/cli-ruby/lib/project_types/extension/tasks/choose_next_available_port.rb +0 -36
  77. package/assets/cli-ruby/lib/project_types/extension/tasks/convert_server_config.rb +0 -85
  78. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/app_converter.rb +0 -27
  79. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/product_converter.rb +0 -21
  80. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/registration_converter.rb +0 -28
  81. package/assets/cli-ruby/lib/project_types/extension/tasks/create_extension.rb +0 -31
  82. package/assets/cli-ruby/lib/project_types/extension/tasks/ensure_resource_url.rb +0 -39
  83. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/base.rb +0 -15
  84. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/build.rb +0 -30
  85. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/create.rb +0 -30
  86. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/outdated_extension_detection.rb +0 -57
  87. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/serve.rb +0 -36
  88. package/assets/cli-ruby/lib/project_types/extension/tasks/find_npm_packages.rb +0 -106
  89. package/assets/cli-ruby/lib/project_types/extension/tasks/find_package_from_json.rb +0 -37
  90. package/assets/cli-ruby/lib/project_types/extension/tasks/get_app.rb +0 -22
  91. package/assets/cli-ruby/lib/project_types/extension/tasks/get_apps.rb +0 -26
  92. package/assets/cli-ruby/lib/project_types/extension/tasks/get_extensions.rb +0 -33
  93. package/assets/cli-ruby/lib/project_types/extension/tasks/get_product.rb +0 -22
  94. package/assets/cli-ruby/lib/project_types/extension/tasks/merge_server_config.rb +0 -47
  95. package/assets/cli-ruby/lib/project_types/extension/tasks/update_draft.rb +0 -29
  96. package/assets/cli-ruby/lib/project_types/extension/tasks/user_errors.rb +0 -45
  97. package/assets/cli-ruby/lib/shopify_cli/admin_api/populate_resource_command.rb +0 -166
  98. package/assets/cli-ruby/lib/shopify_cli/admin_api/schema.rb +0 -35
  99. package/assets/cli-ruby/lib/shopify_cli/app_type_detector.rb +0 -36
  100. package/assets/cli-ruby/lib/shopify_cli/assets/post_auth_page/index.html.erb +0 -34
  101. package/assets/cli-ruby/lib/shopify_cli/assets/post_auth_page/style.css +0 -58
  102. package/assets/cli-ruby/lib/shopify_cli/changelog.rb +0 -148
  103. package/assets/cli-ruby/lib/shopify_cli/command/app_sub_command.rb +0 -26
  104. package/assets/cli-ruby/lib/shopify_cli/command_options/command_serve_options.rb +0 -53
  105. package/assets/cli-ruby/lib/shopify_cli/command_options.rb +0 -7
  106. package/assets/cli-ruby/lib/shopify_cli/commands/app/connect.rb +0 -22
  107. package/assets/cli-ruby/lib/shopify_cli/commands/app/create/node.rb +0 -40
  108. package/assets/cli-ruby/lib/shopify_cli/commands/app/create/php.rb +0 -37
  109. package/assets/cli-ruby/lib/shopify_cli/commands/app/create/rails.rb +0 -42
  110. package/assets/cli-ruby/lib/shopify_cli/commands/app/create.rb +0 -28
  111. package/assets/cli-ruby/lib/shopify_cli/commands/app/deploy.rb +0 -51
  112. package/assets/cli-ruby/lib/shopify_cli/commands/app/open.rb +0 -19
  113. package/assets/cli-ruby/lib/shopify_cli/commands/app/serve.rb +0 -51
  114. package/assets/cli-ruby/lib/shopify_cli/commands/app/tunnel.rb +0 -43
  115. package/assets/cli-ruby/lib/shopify_cli/commands/app.rb +0 -29
  116. package/assets/cli-ruby/lib/shopify_cli/commands/config.rb +0 -76
  117. package/assets/cli-ruby/lib/shopify_cli/commands/help.rb +0 -52
  118. package/assets/cli-ruby/lib/shopify_cli/commands/login.rb +0 -98
  119. package/assets/cli-ruby/lib/shopify_cli/commands/logout.rb +0 -50
  120. package/assets/cli-ruby/lib/shopify_cli/commands/populate/customer.rb +0 -25
  121. package/assets/cli-ruby/lib/shopify_cli/commands/populate/draft_order.rb +0 -28
  122. package/assets/cli-ruby/lib/shopify_cli/commands/populate/product.rb +0 -24
  123. package/assets/cli-ruby/lib/shopify_cli/commands/populate.rb +0 -23
  124. package/assets/cli-ruby/lib/shopify_cli/commands/reporting.rb +0 -38
  125. package/assets/cli-ruby/lib/shopify_cli/commands/store.rb +0 -15
  126. package/assets/cli-ruby/lib/shopify_cli/commands/switch.rb +0 -39
  127. package/assets/cli-ruby/lib/shopify_cli/commands/system.rb +0 -165
  128. package/assets/cli-ruby/lib/shopify_cli/commands/version.rb +0 -15
  129. package/assets/cli-ruby/lib/shopify_cli/commands/whoami.rb +0 -28
  130. package/assets/cli-ruby/lib/shopify_cli/connect.rb +0 -32
  131. package/assets/cli-ruby/lib/shopify_cli/core/help_resolver.rb +0 -20
  132. package/assets/cli-ruby/lib/shopify_cli/heroku.rb +0 -140
  133. package/assets/cli-ruby/lib/shopify_cli/identity_auth/servlet.rb +0 -44
  134. package/assets/cli-ruby/lib/shopify_cli/js_deps.rb +0 -110
  135. package/assets/cli-ruby/lib/shopify_cli/packager.rb +0 -108
  136. package/assets/cli-ruby/lib/shopify_cli/php_deps.rb +0 -102
  137. package/assets/cli-ruby/lib/shopify_cli/process_supervision.rb +0 -228
  138. package/assets/cli-ruby/lib/shopify_cli/project_commands.rb +0 -16
  139. package/assets/cli-ruby/lib/shopify_cli/release.rb +0 -197
  140. package/assets/cli-ruby/lib/shopify_cli/sed.rb +0 -19
  141. package/assets/cli-ruby/lib/shopify_cli/services/app/connect_service.rb +0 -25
  142. package/assets/cli-ruby/lib/shopify_cli/services/app/create/node_service.rb +0 -143
  143. package/assets/cli-ruby/lib/shopify_cli/services/app/create/php_service.rb +0 -147
  144. package/assets/cli-ruby/lib/shopify_cli/services/app/create/rails_service.rb +0 -239
  145. package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/node_service.rb +0 -101
  146. package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/php_service.rb +0 -135
  147. package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/rails_service.rb +0 -120
  148. package/assets/cli-ruby/lib/shopify_cli/services/app/open_service.rb +0 -19
  149. package/assets/cli-ruby/lib/shopify_cli/services/app/serve/node_service.rb +0 -19
  150. package/assets/cli-ruby/lib/shopify_cli/services/app/serve/php_service.rb +0 -23
  151. package/assets/cli-ruby/lib/shopify_cli/services/app/serve/rails_service.rb +0 -28
  152. package/assets/cli-ruby/lib/shopify_cli/services/app/serve/serve_service.rb +0 -57
  153. package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/auth_service.rb +0 -21
  154. package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/start_service.rb +0 -20
  155. package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/stop_service.rb +0 -20
  156. package/assets/cli-ruby/lib/shopify_cli/services/base_service.rb +0 -13
  157. package/assets/cli-ruby/lib/shopify_cli/services/reporting_service.rb +0 -16
  158. package/assets/cli-ruby/lib/shopify_cli/services.rb +0 -38
  159. package/assets/cli-ruby/lib/shopify_cli/tunnel.rb +0 -255
@@ -1,49 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Forms
5
- class Create < ShopifyCLI::Form
6
- flag_arguments :name, :type, :api_key, :template
7
-
8
- attr_reader :app
9
-
10
- class ExtensionProjectDetails
11
- include SmartProperties
12
-
13
- property :app, accepts: Models::App
14
- property :name, accepts: String
15
- property :type, accepts: Models::SpecificationHandlers::Default
16
- property :template, accepts: String
17
-
18
- def complete?
19
- !!(app && name && type)
20
- end
21
- end
22
-
23
- def ask
24
- ShopifyCLI::Result.wrap(ExtensionProjectDetails.new)
25
- .then(&Questions::AskApp.new(ctx: ctx, api_key: api_key))
26
- .then(&Questions::AskType.new(ctx: ctx, type: type))
27
- .then(&Questions::AskTemplate.new(ctx: ctx, template: template))
28
- .then(&Questions::AskName.new(ctx: ctx, name: name))
29
- .unwrap { |e| raise e }
30
- .tap do |project_details|
31
- ctx.abort(ctx.message("create.incomplete_configuration")) unless project_details.complete?
32
-
33
- self.app = project_details.app
34
- self.type = project_details.type
35
- self.template = project_details.template
36
- self.name = project_details.name
37
- end
38
- end
39
-
40
- def directory_name
41
- name.strip.gsub(/( )/, "_").downcase
42
- end
43
-
44
- private
45
-
46
- attr_writer :app
47
- end
48
- end
49
- end
@@ -1,53 +0,0 @@
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
@@ -1,48 +0,0 @@
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
- if theme_app_extension?(project_details)
15
- project_details.name = name || "theme-app-extension"
16
- else
17
- project_details.name = ask_with_reprompt(
18
- initial_value: name,
19
- break_condition: -> (current_name) { Models::Registration.valid_title?(current_name) },
20
- prompt_message: ctx.message("create.ask_name"),
21
- reprompt_message: ctx.message("create.invalid_name", Models::Registration::MAX_TITLE_LENGTH)
22
- )
23
- end
24
- project_details
25
- end
26
-
27
- private
28
-
29
- def theme_app_extension?(project_details)
30
- project_details&.type&.identifier == "THEME_APP_EXTENSION"
31
- end
32
-
33
- def ask_with_reprompt(initial_value:, break_condition:, prompt_message:, reprompt_message:)
34
- value = initial_value
35
- reprompt = false
36
-
37
- until break_condition.call(value)
38
- ctx.puts(reprompt_message) if reprompt
39
- value = prompt.call(prompt_message)&.strip
40
- reprompt = true
41
- end
42
-
43
- value
44
- end
45
- end
46
- end
47
- end
48
- end
@@ -1,55 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Forms
5
- module Questions
6
- class AskRegistration
7
- include ShopifyCLI::MethodObject
8
-
9
- property! :ctx
10
- property! :type
11
- property! :prompt,
12
- converts: :to_proc,
13
- default: -> { CLI::UI::Prompt.method(:ask) }
14
-
15
- def call(project_details)
16
- project_details.tap(&method(:prompt_for_registration))
17
- end
18
-
19
- private
20
-
21
- def prompt_for_registration(project_details)
22
- apps_and_registrations = load_registrations(type)
23
- app, registration = choose_interactively(apps_and_registrations)
24
- project_details.app = app
25
- project_details.registration = registration
26
- end
27
-
28
- def choose_interactively(apps_and_registrations)
29
- prompt.call(ctx.message("connect.ask_registration")) do |handler|
30
- apps_and_registrations.each do |(app, extension)|
31
- handler.option("#{app.title} by #{app.business_name}: #{extension.title}") { [app, extension] }
32
- end
33
- end
34
- end
35
-
36
- def load_registrations(type)
37
- registrations = []
38
- loading_extensions = @ctx.message("connect.loading_extensions")
39
-
40
- CLI::UI::Spinner.spin(loading_extensions) do |_spinner|
41
- registrations += Tasks::GetExtensions.call(context: ctx, type: type)
42
- end
43
-
44
- registrations.empty? ? abort_no_registrations : registrations
45
- end
46
-
47
- def abort_no_registrations
48
- ctx.puts(@ctx.message("connect.no_extensions", type))
49
- ctx.puts(@ctx.message("connect.learn_about_extensions"))
50
- raise ShopifyCLI::AbortSilent
51
- end
52
- end
53
- end
54
- end
55
- end
@@ -1,37 +0,0 @@
1
- module Extension
2
- module Forms
3
- module Questions
4
- class AskTemplate
5
- include ShopifyCLI::MethodObject
6
-
7
- property! :ctx
8
- property :template, accepts: Models::ServerConfig::Development::VALID_TEMPLATES
9
- property :prompt,
10
- accepts: ->(prompt) { prompt.respond_to?(:call) },
11
- default: -> { CLI::UI::Prompt.method(:ask) }
12
-
13
- def call(project_details)
14
- if template_required?(project_details)
15
- project_details.template = template || choose_interactively(project_details)
16
- end
17
- project_details
18
- end
19
-
20
- private
21
-
22
- def template_required?(project_details)
23
- type = project_details&.type&.identifier
24
- Models::DevelopmentServerRequirements.supported?(type)
25
- end
26
-
27
- def choose_interactively(project_details)
28
- prompt.call(ctx.message("create.ask_template")) do |handler|
29
- Models::ServerConfig::Development.find(project_details&.type&.identifier).each do |template|
30
- handler.option(template) { template }
31
- end
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,47 +0,0 @@
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
@@ -1,77 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- class DevelopmentServer
6
- class DevelopmentServerError < StandardError; end
7
-
8
- include SmartProperties
9
-
10
- EXECUTABLE_DIRECTORY = File.join(ShopifyCLI::ROOT, "ext", "shopify-extensions")
11
-
12
- property :executable, converts: :to_s
13
-
14
- def executable
15
- super || begin
16
- case RbConfig::CONFIG.fetch("host_os")
17
- when /(linux)|(darwin)/
18
- File.join(EXECUTABLE_DIRECTORY, "shopify-extensions")
19
- else
20
- File.join(EXECUTABLE_DIRECTORY, "shopify-extensions.exe")
21
- end
22
- end
23
- end
24
-
25
- def executable_installed?
26
- File.exist?(executable)
27
- end
28
-
29
- def create(server_config)
30
- output, _ = CLI::Kit::System.capture2e(executable, "create", "-", stdin_data: server_config.to_yaml)
31
- output
32
- rescue StandardError => error
33
- raise error
34
- end
35
-
36
- def build(server_config)
37
- output, error, status = CLI::Kit::System.capture3(executable, "build", "-", stdin_data: server_config.to_yaml)
38
- return output if status.success?
39
- raise DevelopmentServerError, error
40
- end
41
-
42
- def serve(context, server_config)
43
- CLI::Kit::System.popen3(executable, "serve", "-") do |input, out, err, status|
44
- context.debug("Sending configuration data to extension development server …")
45
- input << server_config.to_yaml
46
- input.close
47
-
48
- forward_output_to_user(out, err, context)
49
-
50
- status.value
51
- end
52
- end
53
-
54
- def version
55
- raise NotImplementedError
56
- end
57
-
58
- private
59
-
60
- def forward_output_to_user(out, err, ctx)
61
- ctx.debug("Starting message processing threads to relay output produced by the extension development server …")
62
-
63
- Thread.new do
64
- while (line = out.gets)
65
- ctx.puts(line)
66
- end
67
- end
68
-
69
- Thread.new do
70
- while (error = err.gets)
71
- ctx.puts(error)
72
- end
73
- end
74
- end
75
- end
76
- end
77
- end
@@ -1,56 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require "shopify_cli"
4
-
5
- module Extension
6
- module Models
7
- class DevelopmentServerRequirements
8
- SUPPORTED_EXTENSION_TYPES = [
9
- "checkout_ui_extension",
10
- "checkout_post_purchase",
11
- "product_subscription",
12
- "web_pixel_extension",
13
- "pos_ui_extension",
14
- ]
15
-
16
- class << self
17
- def supported?(type)
18
- if type_supported?(type) && beta_enabled?
19
- return true if binary_installed?
20
- warn_about_missing_binary
21
- end
22
-
23
- false
24
- end
25
-
26
- def beta_enabled?
27
- ShopifyCLI::Feature.enabled?(:extension_server_beta)
28
- end
29
-
30
- def type_supported?(type)
31
- SUPPORTED_EXTENSION_TYPES.include?(type.downcase)
32
- end
33
-
34
- private
35
-
36
- def binary_installed?
37
- Models::DevelopmentServer.new.executable_installed?
38
- end
39
-
40
- def warn_about_missing_binary
41
- CLI::UI::Frame.open(message("errors.development_server_binary_not_found.title"), color: :yellow) do
42
- context.puts(message("errors.development_server_binary_not_found.message"))
43
- end
44
- end
45
-
46
- def message(key)
47
- context.message(key)
48
- end
49
-
50
- def context
51
- @context ||= ShopifyCLI::Context.new
52
- end
53
- end
54
- end
55
- end
56
- end
@@ -1,44 +0,0 @@
1
- require "semantic/semantic"
2
-
3
- module Extension
4
- module Models
5
- class NpmPackage
6
- include SmartProperties
7
- include Comparable
8
-
9
- property :name
10
- property :version
11
- property :scripts, accepts: Hash, default: -> { {} }
12
- property :dependencies, accepts: Hash, default: -> { {} }
13
- property :dev_dependencies, accepts: Hash, default: -> { {} }
14
-
15
- def initialize(**config)
16
- super(**config.select { |property_name, _| self.class.properties.key?(property_name) })
17
- end
18
-
19
- def self.parse(io)
20
- ShopifyCLI::Result.call { JSON.parse(io.read) }
21
- .then(&ShopifyCLI::TransformDataStructure.new(underscore_keys: true, symbolize_keys: true, shallow: true))
22
- .then { |specification| new(**specification) }
23
- .unwrap { |error| raise "Failed to parse NPM package specification: #{error}" }
24
- end
25
-
26
- def <=>(other)
27
- return nil unless name == other.name
28
- Semantic::Version.new(version) <=> Semantic::Version.new(other.version)
29
- end
30
-
31
- def script?(name)
32
- scripts.key?(name)
33
- end
34
-
35
- def dependency?(name)
36
- dependencies.key?(name)
37
- end
38
-
39
- def dev_dependency?(name)
40
- dev_dependencies.key?(name)
41
- end
42
- end
43
- end
44
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- class Product
6
- include SmartProperties
7
-
8
- property :variant_id, accepts: Integer, converts: :to_i
9
- property :quantity, accepts: Integer, default: 1
10
- end
11
- end
12
- end
@@ -1,20 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- class Registration
6
- MAX_TITLE_LENGTH = 50
7
- include SmartProperties
8
-
9
- property! :id, accepts: Integer
10
- property! :uuid, accepts: String
11
- property! :type, accepts: String
12
- property! :title, accepts: String
13
- property! :draft_version, accepts: Extension::Models::Version
14
-
15
- def self.valid_title?(title)
16
- !title.nil? && !title.strip.empty? && title.length <= MAX_TITLE_LENGTH
17
- end
18
- end
19
- end
20
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- module ServerConfig
6
- class App < Base
7
- include SmartProperties
8
-
9
- property! :api_key, accepts: String
10
- end
11
- end
12
- end
13
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- module ServerConfig
6
- class Base
7
- def to_h
8
- to_hash
9
- end
10
-
11
- def to_hash
12
- is_hashable = ->(obj) { obj.respond_to?(:to_hash) }
13
- is_collection_of_hashables = ->(obj) { obj.is_a?(Enumerable) && obj.all?(&is_hashable) }
14
-
15
- self.class.properties.each.reduce({}) do |data, (_, property)|
16
- data.merge(property.name.to_s => send(property.reader).yield_self do |value|
17
- case value
18
- when is_collection_of_hashables
19
- value.map { |element| element.to_hash.transform_keys(&:to_s) }
20
- when is_hashable
21
- value.to_hash.transform_keys(&:to_s)
22
- else
23
- value
24
- end
25
- end)
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
@@ -1,11 +0,0 @@
1
- module Extension
2
- module Models
3
- module ServerConfig
4
- class Capabilities < Base
5
- include SmartProperties
6
-
7
- property :network_access, accepts: [true, false], default: false
8
- end
9
- end
10
- end
11
- end
@@ -1,33 +0,0 @@
1
- module Extension
2
- module Models
3
- module ServerConfig
4
- class Development < Base
5
- include SmartProperties
6
- VALID_TEMPLATES = [
7
- "javascript",
8
- "javascript-react",
9
- "typescript",
10
- "typescript-react",
11
- ]
12
-
13
- CURRENT_DIRECTORY = "."
14
-
15
- property :root_dir, accepts: String, default: CURRENT_DIRECTORY
16
- property! :build_dir, accepts: String, default: "build"
17
- property :template, accepts: VALID_TEMPLATES
18
- property :renderer, accepts: ServerConfig::DevelopmentRenderer
19
- property :entries, accepts: ServerConfig::DevelopmentEntries
20
- property :resource, accepts: ServerConfig::DevelopmentResource
21
-
22
- def self.find(type)
23
- case type.downcase
24
- when "web_pixel_extension"
25
- ["javascript"]
26
- else
27
- VALID_TEMPLATES
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- module ServerConfig
6
- class DevelopmentEntries < Base
7
- include SmartProperties
8
-
9
- JAVASCRIPT = "javascript"
10
- JAVASCRIPT_REACT = "javascript-react"
11
- TYPESCRIPT = "typescript"
12
- TYPESCRIPT_REACT = "typescript-react"
13
-
14
- VALID_ENTRY_POINTS = [
15
- "src/index.js",
16
- "src/index.jsx",
17
- "src/index.ts",
18
- "src/index.tsx",
19
- ]
20
-
21
- property! :main, accepts: VALID_ENTRY_POINTS
22
-
23
- def self.find(template)
24
- case template
25
- when JAVASCRIPT
26
- new(main: "src/index.js")
27
- when JAVASCRIPT_REACT
28
- new(main: "src/index.jsx")
29
- when TYPESCRIPT
30
- new(main: "src/index.ts")
31
- when TYPESCRIPT_REACT
32
- new(main: "src/index.tsx")
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,38 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- module ServerConfig
6
- class DevelopmentRenderer < Base
7
- include SmartProperties
8
-
9
- VALID_RENDERERS = [
10
- "@shopify/admin-ui-extensions",
11
- "@shopify/post-purchase-ui-extensions",
12
- "@shopify/checkout-ui-extensions",
13
- "@shopify/retail-ui-extensions",
14
- ]
15
-
16
- property! :name, accepts: VALID_RENDERERS
17
- property! :version, accepts: String, default: "latest"
18
-
19
- def self.find(type)
20
- case type.downcase
21
- when "product_subscription"
22
- new(name: "@shopify/admin-ui-extensions", version: "^1.0.1")
23
- when "checkout_ui_extension"
24
- new(name: "@shopify/checkout-ui-extensions", version: "^0.15.0")
25
- when "checkout_post_purchase"
26
- new(name: "@shopify/post-purchase-ui-extensions", version: "^0.13.2")
27
- when "pos_ui_extension"
28
- new(name: "@shopify/retail-ui-extensions", version: "^0.12.0")
29
- when "web_pixel_extension"
30
- nil
31
- else
32
- raise ArgumentError, "Unknown extension type: #{type}"
33
- end
34
- end
35
- end
36
- end
37
- end
38
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- module ServerConfig
6
- class DevelopmentResource < Base
7
- include SmartProperties
8
-
9
- property! :url, accepts: String
10
- end
11
- end
12
- end
13
- end