@shopify/cli-kit 3.45.0 → 3.46.0-pre.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 (136) 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/public/common/version.d.ts +1 -1
  14. package/dist/public/common/version.js +1 -1
  15. package/dist/public/common/version.js.map +1 -1
  16. package/dist/tsconfig.tsbuildinfo +1 -1
  17. package/package.json +1 -1
  18. package/assets/cli-ruby/lib/project_types/extension/commands/build.rb +0 -51
  19. package/assets/cli-ruby/lib/project_types/extension/commands/check.rb +0 -51
  20. package/assets/cli-ruby/lib/project_types/extension/commands/connect.rb +0 -35
  21. package/assets/cli-ruby/lib/project_types/extension/commands/create.rb +0 -100
  22. package/assets/cli-ruby/lib/project_types/extension/commands/info.rb +0 -86
  23. package/assets/cli-ruby/lib/project_types/extension/commands/push.rb +0 -112
  24. package/assets/cli-ruby/lib/project_types/extension/commands/register.rb +0 -67
  25. package/assets/cli-ruby/lib/project_types/extension/commands/tunnel.rb +0 -73
  26. package/assets/cli-ruby/lib/project_types/extension/forms/connect.rb +0 -42
  27. package/assets/cli-ruby/lib/project_types/extension/forms/create.rb +0 -49
  28. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_app.rb +0 -53
  29. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_name.rb +0 -48
  30. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_registration.rb +0 -55
  31. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_template.rb +0 -37
  32. package/assets/cli-ruby/lib/project_types/extension/forms/questions/ask_type.rb +0 -47
  33. package/assets/cli-ruby/lib/project_types/extension/models/development_server.rb +0 -77
  34. package/assets/cli-ruby/lib/project_types/extension/models/development_server_requirements.rb +0 -56
  35. package/assets/cli-ruby/lib/project_types/extension/models/npm_package.rb +0 -44
  36. package/assets/cli-ruby/lib/project_types/extension/models/product.rb +0 -12
  37. package/assets/cli-ruby/lib/project_types/extension/models/registration.rb +0 -20
  38. package/assets/cli-ruby/lib/project_types/extension/models/server_config/app.rb +0 -13
  39. package/assets/cli-ruby/lib/project_types/extension/models/server_config/base.rb +0 -31
  40. package/assets/cli-ruby/lib/project_types/extension/models/server_config/capabilities.rb +0 -11
  41. package/assets/cli-ruby/lib/project_types/extension/models/server_config/development.rb +0 -33
  42. package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_entries.rb +0 -38
  43. package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_renderer.rb +0 -38
  44. package/assets/cli-ruby/lib/project_types/extension/models/server_config/development_resource.rb +0 -13
  45. package/assets/cli-ruby/lib/project_types/extension/models/server_config/extension.rb +0 -46
  46. package/assets/cli-ruby/lib/project_types/extension/models/server_config/root.rb +0 -21
  47. package/assets/cli-ruby/lib/project_types/extension/models/server_config/user.rb +0 -10
  48. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +0 -29
  49. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +0 -170
  50. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension.rb +0 -58
  51. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension_utils/script_config.rb +0 -33
  52. package/assets/cli-ruby/lib/project_types/extension/models/specification_handlers/web_pixel_extension_utils/script_config_repository.rb +0 -75
  53. package/assets/cli-ruby/lib/project_types/extension/tasks/choose_next_available_port.rb +0 -36
  54. package/assets/cli-ruby/lib/project_types/extension/tasks/convert_server_config.rb +0 -85
  55. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/app_converter.rb +0 -27
  56. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/product_converter.rb +0 -21
  57. package/assets/cli-ruby/lib/project_types/extension/tasks/converters/registration_converter.rb +0 -28
  58. package/assets/cli-ruby/lib/project_types/extension/tasks/create_extension.rb +0 -31
  59. package/assets/cli-ruby/lib/project_types/extension/tasks/ensure_resource_url.rb +0 -39
  60. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/base.rb +0 -15
  61. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/build.rb +0 -30
  62. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/create.rb +0 -30
  63. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/outdated_extension_detection.rb +0 -57
  64. package/assets/cli-ruby/lib/project_types/extension/tasks/execute_commands/serve.rb +0 -36
  65. package/assets/cli-ruby/lib/project_types/extension/tasks/find_npm_packages.rb +0 -106
  66. package/assets/cli-ruby/lib/project_types/extension/tasks/find_package_from_json.rb +0 -37
  67. package/assets/cli-ruby/lib/project_types/extension/tasks/get_app.rb +0 -22
  68. package/assets/cli-ruby/lib/project_types/extension/tasks/get_apps.rb +0 -26
  69. package/assets/cli-ruby/lib/project_types/extension/tasks/get_extensions.rb +0 -33
  70. package/assets/cli-ruby/lib/project_types/extension/tasks/get_product.rb +0 -22
  71. package/assets/cli-ruby/lib/project_types/extension/tasks/merge_server_config.rb +0 -47
  72. package/assets/cli-ruby/lib/project_types/extension/tasks/update_draft.rb +0 -29
  73. package/assets/cli-ruby/lib/project_types/extension/tasks/user_errors.rb +0 -45
  74. package/assets/cli-ruby/lib/shopify_cli/admin_api/populate_resource_command.rb +0 -166
  75. package/assets/cli-ruby/lib/shopify_cli/admin_api/schema.rb +0 -35
  76. package/assets/cli-ruby/lib/shopify_cli/app_type_detector.rb +0 -36
  77. package/assets/cli-ruby/lib/shopify_cli/assets/post_auth_page/index.html.erb +0 -34
  78. package/assets/cli-ruby/lib/shopify_cli/assets/post_auth_page/style.css +0 -58
  79. package/assets/cli-ruby/lib/shopify_cli/changelog.rb +0 -148
  80. package/assets/cli-ruby/lib/shopify_cli/command/app_sub_command.rb +0 -26
  81. package/assets/cli-ruby/lib/shopify_cli/command_options/command_serve_options.rb +0 -53
  82. package/assets/cli-ruby/lib/shopify_cli/command_options.rb +0 -7
  83. package/assets/cli-ruby/lib/shopify_cli/commands/app/connect.rb +0 -22
  84. package/assets/cli-ruby/lib/shopify_cli/commands/app/create/node.rb +0 -40
  85. package/assets/cli-ruby/lib/shopify_cli/commands/app/create/php.rb +0 -37
  86. package/assets/cli-ruby/lib/shopify_cli/commands/app/create/rails.rb +0 -42
  87. package/assets/cli-ruby/lib/shopify_cli/commands/app/create.rb +0 -28
  88. package/assets/cli-ruby/lib/shopify_cli/commands/app/deploy.rb +0 -51
  89. package/assets/cli-ruby/lib/shopify_cli/commands/app/open.rb +0 -19
  90. package/assets/cli-ruby/lib/shopify_cli/commands/app/serve.rb +0 -51
  91. package/assets/cli-ruby/lib/shopify_cli/commands/app/tunnel.rb +0 -43
  92. package/assets/cli-ruby/lib/shopify_cli/commands/app.rb +0 -29
  93. package/assets/cli-ruby/lib/shopify_cli/commands/config.rb +0 -76
  94. package/assets/cli-ruby/lib/shopify_cli/commands/help.rb +0 -52
  95. package/assets/cli-ruby/lib/shopify_cli/commands/login.rb +0 -98
  96. package/assets/cli-ruby/lib/shopify_cli/commands/logout.rb +0 -50
  97. package/assets/cli-ruby/lib/shopify_cli/commands/populate/customer.rb +0 -25
  98. package/assets/cli-ruby/lib/shopify_cli/commands/populate/draft_order.rb +0 -28
  99. package/assets/cli-ruby/lib/shopify_cli/commands/populate/product.rb +0 -24
  100. package/assets/cli-ruby/lib/shopify_cli/commands/populate.rb +0 -23
  101. package/assets/cli-ruby/lib/shopify_cli/commands/reporting.rb +0 -38
  102. package/assets/cli-ruby/lib/shopify_cli/commands/store.rb +0 -15
  103. package/assets/cli-ruby/lib/shopify_cli/commands/switch.rb +0 -39
  104. package/assets/cli-ruby/lib/shopify_cli/commands/system.rb +0 -165
  105. package/assets/cli-ruby/lib/shopify_cli/commands/version.rb +0 -15
  106. package/assets/cli-ruby/lib/shopify_cli/commands/whoami.rb +0 -28
  107. package/assets/cli-ruby/lib/shopify_cli/connect.rb +0 -32
  108. package/assets/cli-ruby/lib/shopify_cli/core/help_resolver.rb +0 -20
  109. package/assets/cli-ruby/lib/shopify_cli/heroku.rb +0 -140
  110. package/assets/cli-ruby/lib/shopify_cli/identity_auth/servlet.rb +0 -44
  111. package/assets/cli-ruby/lib/shopify_cli/js_deps.rb +0 -110
  112. package/assets/cli-ruby/lib/shopify_cli/packager.rb +0 -108
  113. package/assets/cli-ruby/lib/shopify_cli/php_deps.rb +0 -102
  114. package/assets/cli-ruby/lib/shopify_cli/process_supervision.rb +0 -228
  115. package/assets/cli-ruby/lib/shopify_cli/project_commands.rb +0 -16
  116. package/assets/cli-ruby/lib/shopify_cli/release.rb +0 -197
  117. package/assets/cli-ruby/lib/shopify_cli/sed.rb +0 -19
  118. package/assets/cli-ruby/lib/shopify_cli/services/app/connect_service.rb +0 -25
  119. package/assets/cli-ruby/lib/shopify_cli/services/app/create/node_service.rb +0 -143
  120. package/assets/cli-ruby/lib/shopify_cli/services/app/create/php_service.rb +0 -147
  121. package/assets/cli-ruby/lib/shopify_cli/services/app/create/rails_service.rb +0 -239
  122. package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/node_service.rb +0 -101
  123. package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/php_service.rb +0 -135
  124. package/assets/cli-ruby/lib/shopify_cli/services/app/deploy/heroku/rails_service.rb +0 -120
  125. package/assets/cli-ruby/lib/shopify_cli/services/app/open_service.rb +0 -19
  126. package/assets/cli-ruby/lib/shopify_cli/services/app/serve/node_service.rb +0 -19
  127. package/assets/cli-ruby/lib/shopify_cli/services/app/serve/php_service.rb +0 -23
  128. package/assets/cli-ruby/lib/shopify_cli/services/app/serve/rails_service.rb +0 -28
  129. package/assets/cli-ruby/lib/shopify_cli/services/app/serve/serve_service.rb +0 -57
  130. package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/auth_service.rb +0 -21
  131. package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/start_service.rb +0 -20
  132. package/assets/cli-ruby/lib/shopify_cli/services/app/tunnel/stop_service.rb +0 -20
  133. package/assets/cli-ruby/lib/shopify_cli/services/base_service.rb +0 -13
  134. package/assets/cli-ruby/lib/shopify_cli/services/reporting_service.rb +0 -16
  135. package/assets/cli-ruby/lib/shopify_cli/services.rb +0 -38
  136. package/assets/cli-ruby/lib/shopify_cli/tunnel.rb +0 -255
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- module ServerConfig
6
- class Root < Base
7
- include SmartProperties
8
-
9
- property :app, accepts: ServerConfig::App
10
- property! :extensions, accepts: Array, default: -> { [] }
11
- property! :port, accepts: Integer, default: 39351
12
- property :public_url, accepts: String
13
- property :store, accepts: String
14
-
15
- def to_yaml
16
- to_h.to_yaml.gsub("---\n", "")
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,10 +0,0 @@
1
- module Extension
2
- module Models
3
- module ServerConfig
4
- class User < Base
5
- include SmartProperties
6
- property! :metafields, accepts: Array, default: -> { [] }
7
- end
8
- end
9
- end
10
- end
@@ -1,29 +0,0 @@
1
- # frozen_string_literal: true
2
- require "base64"
3
-
4
- module Extension
5
- module Models
6
- module SpecificationHandlers
7
- class CheckoutPostPurchase < Default
8
- PERMITTED_CONFIG_KEYS = [:metafields]
9
- RENDERER_PACKAGE_NAME = "@shopify/post-purchase-ui-extensions"
10
-
11
- def config(context)
12
- {
13
- **Features::ArgoConfig.parse_yaml(context, PERMITTED_CONFIG_KEYS),
14
- **argo.config(context, include_renderer_version: false),
15
- }
16
- end
17
-
18
- protected
19
-
20
- def argo
21
- Features::Argo.new(
22
- git_template: specification.features.argo.git_template,
23
- renderer_package_name: RENDERER_PACKAGE_NAME
24
- )
25
- end
26
- end
27
- end
28
- end
29
- end
@@ -1,170 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- module SpecificationHandlers
6
- class CheckoutUiExtension < Default
7
- L10N_ERROR_PREFIX = "core.extension.push.checkout_ui_extension.localization.error"
8
- L10N_FILE_SIZE_LIMIT = 16 * 1024 # 16kb
9
- L10N_BUNDLE_SIZE_LIMIT = 256 * 1024 # 256kb
10
- LOCALE_CODE_FORMAT = %r{
11
- \A
12
- (?<language>[a-zA-Z]{2,3}) # Language tag
13
- (?:
14
- -
15
- (?<region>[a-zA-Z]{2}) # Optional region subtag
16
- )?
17
- \z}x
18
- PERMITTED_CONFIG_KEYS = [:extension_points, :metafields, :name, :capabilities]
19
-
20
- def config(context)
21
- {
22
- **Features::ArgoConfig.parse_yaml(context, PERMITTED_CONFIG_KEYS),
23
- **argo.config(context, include_renderer_version: false),
24
- **localization(context),
25
- }
26
- end
27
-
28
- def supplies_resource_url?
29
- true
30
- end
31
-
32
- def build_resource_url(context:, shop:)
33
- product = Tasks::GetProduct.call(context, shop)
34
- return unless product
35
- format("/cart/%<variant_id>d:%<quantity>d", variant_id: product.variant_id, quantity: 1)
36
- end
37
-
38
- private
39
-
40
- def localization(context)
41
- Dir.chdir(context.root) do
42
- locale_filenames = Dir["locales/*"].select { |filename| valid_l10n_file?(filename) }
43
- # Localization is optional
44
- return {} if locale_filenames.empty?
45
-
46
- validate_no_duplicate_locale(locale_filenames)
47
- validate_total_size(locale_filenames)
48
- default_locale = single_default_locale(locale_filenames)
49
-
50
- locale_filenames.map do |filename|
51
- locale = basename_for_locale_filename(filename)
52
- [locale.to_sym, read_locale_file(filename)]
53
- end
54
- .yield_self do |encoded_files_by_locale|
55
- {
56
- localization: {
57
- default_locale: default_locale,
58
- translations: encoded_files_by_locale.to_h,
59
- },
60
- }
61
- end
62
- end
63
- end
64
-
65
- def read_locale_file(filename)
66
- content = File.read(filename, mode: "rt", encoding: "bom|utf-8").strip
67
- raise_invalid_encoding_error(filename) unless content.valid_encoding?
68
- Base64.strict_encode64(content)
69
- rescue ArgumentError
70
- raise_invalid_encoding_error(filename)
71
- end
72
-
73
- def validate_no_duplicate_locale(locale_filenames)
74
- duplicate_locale = locale_filenames
75
- .map { |filename| basename_for_locale_filename(filename.downcase) }
76
- .group_by { |locale| locale }
77
- .detect { |_k, v| v.size > 1 }
78
- &.first
79
- raise(
80
- ShopifyCLI::Abort,
81
- ShopifyCLI::Context.message("#{L10N_ERROR_PREFIX}.duplicate_locale_code", duplicate_locale)
82
- ) unless duplicate_locale.nil?
83
- end
84
-
85
- def validate_total_size(locale_filenames)
86
- total_size = locale_filenames.sum { |filename| File.size(filename) }
87
- if total_size > L10N_BUNDLE_SIZE_LIMIT
88
- raise(
89
- ShopifyCLI::Abort,
90
- ShopifyCLI::Context.message(
91
- "#{L10N_ERROR_PREFIX}.bundle_too_large",
92
- CLI::Kit::Util.to_filesize(L10N_BUNDLE_SIZE_LIMIT)
93
- )
94
- )
95
- end
96
- end
97
-
98
- def single_default_locale(locale_filenames)
99
- default_locale_matches = locale_filenames.grep(/default/)
100
- if default_locale_matches.size != 1
101
- raise(ShopifyCLI::Abort, ShopifyCLI::Context.message("#{L10N_ERROR_PREFIX}.single_default_locale"))
102
- end
103
- basename_for_locale_filename(default_locale_matches.first)
104
- end
105
-
106
- def valid_l10n_file?(filename)
107
- return false unless File.file?(filename)
108
- return false unless File.dirname(filename) == "locales"
109
-
110
- validate_file_extension(filename)
111
- validate_file_locale_code(filename)
112
- validate_file_size(filename)
113
- validate_file_not_empty(filename)
114
-
115
- true
116
- end
117
-
118
- def validate_file_extension(filename)
119
- if File.extname(filename) != ".json"
120
- raise(
121
- ShopifyCLI::Abort, ShopifyCLI::Context.message("#{L10N_ERROR_PREFIX}.invalid_file_extension", filename)
122
- )
123
- end
124
- end
125
-
126
- def validate_file_locale_code(filename)
127
- unless valid_locale_code?(basename_for_locale_filename(filename))
128
- raise(
129
- ShopifyCLI::Abort, ShopifyCLI::Context.message("#{L10N_ERROR_PREFIX}.invalid_locale_code", filename)
130
- )
131
- end
132
- end
133
-
134
- def validate_file_size(filename)
135
- if File.size(filename) > L10N_FILE_SIZE_LIMIT
136
- raise(
137
- ShopifyCLI::Abort,
138
- ShopifyCLI::Context.message(
139
- "#{L10N_ERROR_PREFIX}.file_too_large",
140
- filename,
141
- CLI::Kit::Util.to_filesize(L10N_FILE_SIZE_LIMIT)
142
- )
143
- )
144
- end
145
- end
146
-
147
- def validate_file_not_empty(filename)
148
- if File.zero?(filename)
149
- raise(ShopifyCLI::Abort, ShopifyCLI::Context.message("#{L10N_ERROR_PREFIX}.file_empty", filename))
150
- end
151
- end
152
-
153
- def valid_locale_code?(locale_code)
154
- LOCALE_CODE_FORMAT.match?(locale_code)
155
- end
156
-
157
- def basename_for_locale_filename(filename)
158
- File.basename(File.basename(filename, ".json"), ".default")
159
- end
160
-
161
- def raise_invalid_encoding_error(filename)
162
- raise(
163
- ShopifyCLI::Abort,
164
- ShopifyCLI::Context.message("#{L10N_ERROR_PREFIX}.invalid_file_encoding", filename)
165
- )
166
- end
167
- end
168
- end
169
- end
170
- end
@@ -1,58 +0,0 @@
1
- # frozen_string_literal: true
2
- require "base64"
3
- require "fileutils"
4
- require "json"
5
- require_relative "web_pixel_extension_utils/script_config"
6
- require_relative "web_pixel_extension_utils/script_config_repository"
7
-
8
- module Extension
9
- module Models
10
- module SpecificationHandlers
11
- class WebPixelExtension < Default
12
- SCRIPT_FILE = "build/main.js"
13
-
14
- def name
15
- "Web Pixel Extension"
16
- end
17
-
18
- def read_configuration
19
- end
20
-
21
- def access_config_property(context, ext_config, key, &process_value)
22
- context.abort(context.message("core.extension.push.web_pixel_extension.error.missing_config_key_error",
23
- key)) unless ext_config.key?(key)
24
-
25
- begin
26
- process_value.nil? ? ext_config[key] : process_value.call(ext_config[key])
27
- rescue StandardError
28
- context.abort(context.message("core.extension.push.web_pixel_extension.error.invalid_config_value_error",
29
- key))
30
- end
31
- end
32
-
33
- def config(context)
34
- begin
35
- ext_config = WebPixelExtensionUtils::ScriptConfigYmlRepository.new(ctx: context).get!.content
36
- rescue StandardError
37
- context.abort(context.message("core.extension.push.web_pixel_extension.error.file_read_error",
38
- WebPixelExtensionUtils::ScriptConfigYmlRepository.filename))
39
- end
40
-
41
- begin
42
- script_contents = File.read(File.join(context.root, SCRIPT_FILE)).chomp
43
- rescue
44
- context.abort(context.message("core.extension.push.web_pixel_extension.error.file_read_error", SCRIPT_FILE))
45
- end
46
- {
47
- runtime_context: access_config_property(context, ext_config, "runtime_context"),
48
- serialized_script: Base64.strict_encode64(script_contents),
49
- runtime_configuration_definition: access_config_property(context, ext_config,
50
- "configuration", &:to_json),
51
- config_version: access_config_property(context, ext_config,
52
- "version", &:to_s),
53
- }
54
- end
55
- end
56
- end
57
- end
58
- end
@@ -1,33 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Extension
4
- module Models
5
- module SpecificationHandlers
6
- module WebPixelExtensionUtils
7
- class ScriptConfig
8
- attr_reader :content, :version, :configuration, :filename
9
-
10
- REQUIRED_FIELDS = %w(version)
11
-
12
- def initialize(content:, filename:)
13
- @filename = filename
14
- validate_content!(content)
15
- @content = content
16
- @version = @content["version"].to_s
17
- @configuration = @content["configuration"]
18
- end
19
-
20
- private
21
-
22
- def validate_content!(content)
23
- REQUIRED_FIELDS.each do |field|
24
- if content[field].nil?
25
- raise "invalid field:#{field}, filename:#{filename}"
26
- end
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
33
- end
@@ -1,75 +0,0 @@
1
- require_relative "script_config"
2
- module Extension
3
- module Models
4
- module SpecificationHandlers
5
- module WebPixelExtensionUtils
6
- class ScriptConfigRepository
7
- include SmartProperties
8
- property! :ctx, accepts: ShopifyCLI::Context
9
-
10
- def active?
11
- ctx.file_exist?(filename)
12
- end
13
-
14
- def get!
15
- raise RuntimeError.new("NoScriptConfigFile"), filename unless active?
16
-
17
- content = ctx.read(filename)
18
- hash = file_content_to_hash(content)
19
-
20
- from_h(hash)
21
- end
22
-
23
- def filename
24
- raise NotImplementedError
25
- end
26
-
27
- private
28
-
29
- def from_h(hash)
30
- Extension::Models::SpecificationHandlers::WebPixelExtensionUtils::ScriptConfig.new(content: hash,
31
- filename: filename)
32
- end
33
-
34
- def file_content_to_hash(file_content)
35
- raise NotImplementedError
36
- end
37
-
38
- def hash_to_file_content(hash)
39
- raise NotImplementedError
40
- end
41
- end
42
-
43
- class ScriptConfigYmlRepository < ScriptConfigRepository
44
- def self.filename
45
- "extension.config.yml"
46
- end
47
-
48
- def filename
49
- ScriptConfigYmlRepository.filename
50
- end
51
-
52
- private
53
-
54
- def file_content_to_hash(file_content)
55
- begin
56
- hash = YAML.load(file_content)
57
- rescue Psych::SyntaxError
58
- raise parse_error
59
- end
60
- raise parse_error unless hash.is_a?(Hash)
61
- hash
62
- end
63
-
64
- def hash_to_file_content(hash)
65
- YAML.dump(hash)
66
- end
67
-
68
- def parse_error
69
- RuntimeError.new("ScriptConfigParseError #{filename}, serialization_format: \"YAML\" ")
70
- end
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
- require "shopify_cli"
3
- require "socket"
4
-
5
- module Extension
6
- module Tasks
7
- class ChooseNextAvailablePort
8
- include ShopifyCLI::MethodObject
9
-
10
- property! :from
11
- property! :to, default: -> { from + 10 }
12
- property! :host, default: "127.0.0.1"
13
-
14
- def call
15
- available_port = port_range(from: from, to: to).find { |p| available?(host, p) }
16
- raise ArgumentError, "Ports between #{from} and #{to} are unavailable" if available_port.nil?
17
- available_port
18
- end
19
-
20
- private
21
-
22
- def port_range(from:, to:)
23
- (from..to)
24
- end
25
-
26
- def available?(host, port)
27
- Socket.tcp(host, port, connect_timeout: 1) do |socket|
28
- socket.close
29
- false
30
- end
31
- rescue Errno::ECONNREFUSED
32
- true
33
- end
34
- end
35
- end
36
- end
@@ -1,85 +0,0 @@
1
- # frozen_string_literal: true
2
- require "shopify_cli"
3
-
4
- module Extension
5
- module Tasks
6
- class ConvertServerConfig
7
- include SmartProperties
8
-
9
- property! :api_key, accepts: String
10
- property! :context, accepts: ShopifyCLI::Context
11
- property! :hash, accepts: Hash
12
- property! :port, accepts: Integer
13
- property! :registration_uuid, accepts: String
14
- property :resource_url, accepts: String
15
- property! :store, accepts: String
16
- property! :title, accepts: String
17
- property :tunnel_url, accepts: String
18
- property! :type, accepts: String
19
- property :metafields, accepts: Array
20
-
21
- DEFAULT_BUILD_DIR = "build"
22
-
23
- def self.call(*args)
24
- new(*args).call
25
- end
26
-
27
- def call
28
- context.abort(context.message("tasks.errors.parse_error")) if hash.nil?
29
-
30
- renderer = Models::ServerConfig::DevelopmentRenderer.find(type)
31
- extension = Models::ServerConfig::Extension.new(
32
- uuid: registration_uuid,
33
- type: type,
34
- user: Models::ServerConfig::User.new,
35
- development: Models::ServerConfig::Development.new(
36
- build_dir: hash.dig("development", "build_dir") || DEFAULT_BUILD_DIR,
37
- renderer: renderer,
38
- entries: Models::ServerConfig::DevelopmentEntries.new(
39
- main: hash.dig("development", "entries", "main") || determine_default_entry_main(project_directory),
40
- )
41
- ),
42
- extension_points: hash.dig("extension_points"),
43
- capabilities: Models::ServerConfig::Capabilities.new(
44
- network_access: hash.dig("capabilities", "network_access") || false
45
- ),
46
- version: renderer ? version(renderer.name, context) : nil,
47
- title: title,
48
- metafields: metafields
49
- )
50
-
51
- unless resource_url.nil?
52
- extension.development.resource = Models::ServerConfig::DevelopmentResource.new(url: resource_url)
53
- end
54
- server_config = Models::ServerConfig::Root.new(
55
- extensions: [extension],
56
- port: port,
57
- public_url: tunnel_url,
58
- store: store
59
- )
60
-
61
- unless api_key.nil?
62
- server_config.app = Models::ServerConfig::App.new(api_key: api_key)
63
- end
64
-
65
- server_config
66
- end
67
-
68
- def version(renderer, context)
69
- Tasks::FindPackageFromJson.call(renderer, context: context).version
70
- end
71
-
72
- private
73
-
74
- def determine_default_entry_main(project_directory)
75
- Dir.chdir(project_directory) do
76
- Dir["src/*"].lazy.grep(/index.[jt]sx?/).first
77
- end
78
- end
79
-
80
- def project_directory
81
- ExtensionProject.current.directory
82
- end
83
- end
84
- end
85
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
- require "shopify_cli"
3
-
4
- module Extension
5
- module Tasks
6
- module Converters
7
- module AppConverter
8
- API_KEY_FIELD = "apiKey"
9
- API_SECRET_KEYS_FIELD = "apiSecretKeys"
10
- API_SECRET_FIELD = "secret"
11
- TITLE_FIELD = "title"
12
- ORGANIZATION_NAME_FIELD = "businessName"
13
-
14
- def self.from_hash(hash, organization = {})
15
- return nil if hash.nil?
16
-
17
- Models::App.new(
18
- api_key: hash[API_KEY_FIELD],
19
- secret: hash[API_SECRET_KEYS_FIELD].first[API_SECRET_FIELD],
20
- title: hash[TITLE_FIELD],
21
- business_name: organization[ORGANIZATION_NAME_FIELD]
22
- )
23
- end
24
- end
25
- end
26
- end
27
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
- require "shopify_cli"
3
-
4
- module Extension
5
- module Tasks
6
- module Converters
7
- module ProductConverter
8
- VARIANT_PATH = ["data", "products", "edges", 0, "node", "variants", "edges", 0, "node", "id"]
9
-
10
- def self.from_hash(hash)
11
- return nil if hash.nil?
12
- variant = hash.dig(*VARIANT_PATH)
13
- return unless variant
14
- Models::Product.new(
15
- variant_id: ShopifyCLI::API.gid_to_id(variant)
16
- )
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,28 +0,0 @@
1
- # frozen_string_literal: true
2
- require "shopify_cli"
3
-
4
- module Extension
5
- module Tasks
6
- module Converters
7
- module RegistrationConverter
8
- ID_FIELD = "id"
9
- UUID_FIELD = "uuid"
10
- TYPE_FIELD = "type"
11
- TITLE_FIELD = "title"
12
- DRAFT_VERSION_FIELD = "draftVersion"
13
-
14
- def self.from_hash(context, hash)
15
- context.abort(context.message("tasks.errors.parse_error")) if hash.nil?
16
-
17
- Models::Registration.new(
18
- id: hash[ID_FIELD].to_i,
19
- uuid: hash[UUID_FIELD],
20
- type: hash[TYPE_FIELD],
21
- title: hash[TITLE_FIELD],
22
- draft_version: VersionConverter.from_hash(context, hash[DRAFT_VERSION_FIELD])
23
- )
24
- end
25
- end
26
- end
27
- end
28
- end
@@ -1,31 +0,0 @@
1
- # frozen_string_literal: true
2
- require "shopify_cli"
3
-
4
- module Extension
5
- module Tasks
6
- class CreateExtension < ShopifyCLI::Task
7
- include UserErrors
8
-
9
- GRAPHQL_FILE = "extension_create"
10
-
11
- RESPONSE_FIELD = %w(data extensionCreate)
12
- REGISTRATION_FIELD = "extensionRegistration"
13
-
14
- def call(context:, api_key:, type:, title:, config:, extension_context: nil)
15
- input = {
16
- api_key: api_key,
17
- type: type,
18
- title: title,
19
- config: JSON.generate(config),
20
- extension_context: extension_context,
21
- }
22
-
23
- response = ShopifyCLI::PartnersAPI.query(context, GRAPHQL_FILE, **input).dig(*RESPONSE_FIELD)
24
- context.abort(context.message("tasks.errors.parse_error")) if response.nil?
25
-
26
- abort_if_user_errors(context, response)
27
- Converters::RegistrationConverter.from_hash(context, response.dig(REGISTRATION_FIELD))
28
- end
29
- end
30
- end
31
- end
@@ -1,39 +0,0 @@
1
- # frozen_string_literal: true
2
- require "shopify_cli"
3
-
4
- module Extension
5
- module Tasks
6
- class EnsureResourceUrl < ShopifyCLI::Task
7
- include SmartProperties
8
-
9
- property! :context, accepts: ShopifyCLI::Context
10
- property! :specification_handler, accepts: Extension::Models::SpecificationHandlers::Default
11
-
12
- def self.call(*args)
13
- new(*args).call
14
- end
15
-
16
- def call
17
- project = ExtensionProject.current(force_reload: true)
18
-
19
- ShopifyCLI::Result
20
- .wrap(project.resource_url)
21
- .rescue { specification_handler.build_resource_url(shop: project.env.shop, context: context) }
22
- .then(&method(:persist_resource_url))
23
- .unwrap do |nil_or_exception|
24
- case nil_or_exception
25
- when nil
26
- context.warn(context.message("warnings.resource_url_auto_generation_failed", project.env.shop))
27
- else
28
- context.abort(nil_or_exception)
29
- end
30
- end
31
- end
32
-
33
- def persist_resource_url(resource_url)
34
- ExtensionProject.update_env_file(context: context, resource_url: resource_url)
35
- resource_url
36
- end
37
- end
38
- end
39
- end
@@ -1,15 +0,0 @@
1
- # frozen_string_literal: true
2
- require "shopify_cli"
3
-
4
- module Extension
5
- module Tasks
6
- module ExecuteCommands
7
- class Base
8
- include SmartProperties
9
-
10
- property! :type, accepts: Models::DevelopmentServerRequirements::SUPPORTED_EXTENSION_TYPES
11
- property! :context, accepts: ShopifyCLI::Context
12
- end
13
- end
14
- end
15
- end