shopify-cli 2.25.0 → 2.27.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 (72) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +10 -0
  3. data/Gemfile.lock +1 -1
  4. data/dev.yml +0 -3
  5. data/lib/project_types/extension/models/specification_handlers/default.rb +6 -1
  6. data/lib/project_types/script/cli.rb +0 -79
  7. data/lib/project_types/script/commands/connect.rb +3 -8
  8. data/lib/project_types/script/commands/create.rb +4 -29
  9. data/lib/project_types/script/commands/javy.rb +3 -8
  10. data/lib/project_types/script/commands/push.rb +4 -41
  11. data/lib/project_types/script/messages/messages.rb +1 -258
  12. data/lib/project_types/theme/commands/common/shop_helper.rb +13 -0
  13. data/lib/project_types/theme/commands/delete.rb +4 -1
  14. data/lib/project_types/theme/commands/list.rb +3 -4
  15. data/lib/project_types/theme/commands/open.rb +4 -1
  16. data/lib/project_types/theme/commands/publish.rb +4 -1
  17. data/lib/project_types/theme/commands/pull.rb +3 -1
  18. data/lib/project_types/theme/commands/push.rb +3 -1
  19. data/lib/project_types/theme/commands/serve.rb +2 -1
  20. data/lib/project_types/theme/messages/messages.rb +5 -5
  21. data/lib/shopify_cli/messages/messages.rb +1 -1
  22. data/lib/shopify_cli/packager.rb +12 -3
  23. data/lib/shopify_cli/release.rb +4 -2
  24. data/lib/shopify_cli/version.rb +1 -1
  25. data/vendor/deps/cli-ui/lib/cli/ui/prompt/interactive_options.rb +1 -1
  26. metadata +3 -48
  27. data/lib/project_types/script/config/extension_points.yml +0 -45
  28. data/lib/project_types/script/errors.rb +0 -10
  29. data/lib/project_types/script/forms/ask_app.rb +0 -27
  30. data/lib/project_types/script/forms/ask_org.rb +0 -30
  31. data/lib/project_types/script/forms/ask_script_uuid.rb +0 -22
  32. data/lib/project_types/script/forms/create.rb +0 -33
  33. data/lib/project_types/script/forms/run_against_shopify_org.rb +0 -14
  34. data/lib/project_types/script/graphql/app_script_set.graphql +0 -46
  35. data/lib/project_types/script/graphql/get_app_scripts.graphql +0 -6
  36. data/lib/project_types/script/graphql/module_upload_url_generate.graphql +0 -13
  37. data/lib/project_types/script/graphql/script_service_proxy.graphql +0 -7
  38. data/lib/project_types/script/layers/application/build_script.rb +0 -25
  39. data/lib/project_types/script/layers/application/connect_app.rb +0 -86
  40. data/lib/project_types/script/layers/application/create_script.rb +0 -90
  41. data/lib/project_types/script/layers/application/extension_points.rb +0 -66
  42. data/lib/project_types/script/layers/application/project_dependencies.rb +0 -26
  43. data/lib/project_types/script/layers/application/push_script.rb +0 -74
  44. data/lib/project_types/script/layers/domain/app_bridge.rb +0 -16
  45. data/lib/project_types/script/layers/domain/errors.rb +0 -47
  46. data/lib/project_types/script/layers/domain/extension_point.rb +0 -81
  47. data/lib/project_types/script/layers/domain/metadata.rb +0 -46
  48. data/lib/project_types/script/layers/domain/push_package.rb +0 -41
  49. data/lib/project_types/script/layers/domain/script_config.rb +0 -32
  50. data/lib/project_types/script/layers/domain/script_project.rb +0 -61
  51. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +0 -53
  52. data/lib/project_types/script/layers/infrastructure/api_clients/script_service_api_client.rb +0 -35
  53. data/lib/project_types/script/layers/infrastructure/command_runner.rb +0 -19
  54. data/lib/project_types/script/layers/infrastructure/errors.rb +0 -211
  55. data/lib/project_types/script/layers/infrastructure/extension_point_repository.rb +0 -37
  56. data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +0 -62
  57. data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +0 -47
  58. data/lib/project_types/script/layers/infrastructure/languages/tool_version_checker.rb +0 -26
  59. data/lib/project_types/script/layers/infrastructure/languages/typescript_project_creator.rb +0 -45
  60. data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +0 -103
  61. data/lib/project_types/script/layers/infrastructure/languages/wasm_project_creator.rb +0 -12
  62. data/lib/project_types/script/layers/infrastructure/languages/wasm_task_runner.rb +0 -32
  63. data/lib/project_types/script/layers/infrastructure/metadata_repository.rb +0 -18
  64. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +0 -36
  65. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +0 -273
  66. data/lib/project_types/script/layers/infrastructure/script_service.rb +0 -135
  67. data/lib/project_types/script/layers/infrastructure/script_uploader.rb +0 -40
  68. data/lib/project_types/script/layers/infrastructure/service_locator.rb +0 -20
  69. data/lib/project_types/script/layers/infrastructure/sparse_checkout_details.rb +0 -35
  70. data/lib/project_types/script/ui/error_handler.rb +0 -331
  71. data/lib/project_types/script/ui/printing_spinner.rb +0 -75
  72. data/lib/project_types/script/ui/strict_spinner.rb +0 -20
@@ -1,211 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Script
4
- module Layers
5
- module Infrastructure
6
- module Errors
7
- class BuildError < ScriptProjectError; end
8
-
9
- class ScriptConfigurationDefinitionError < ScriptProjectError
10
- attr_reader :filename, :messages
11
- def initialize(messages:, filename:)
12
- super()
13
- @messages = messages
14
- @filename = filename
15
- end
16
- end
17
-
18
- class ScriptConfigSyntaxError < ScriptProjectError
19
- attr_reader :filename
20
- def initialize(filename)
21
- @filename = filename
22
- super()
23
- end
24
- end
25
-
26
- class ScriptConfigMissingKeysError < ScriptProjectError
27
- attr_reader :missing_keys, :filename
28
- def initialize(missing_keys:, filename:)
29
- super()
30
- @missing_keys = missing_keys
31
- @filename = filename
32
- end
33
- end
34
-
35
- class ScriptConfigInvalidValueError < ScriptProjectError
36
- attr_reader :valid_input_modes, :filename
37
- def initialize(valid_input_modes:, filename:)
38
- super()
39
- @valid_input_modes = valid_input_modes
40
- @filename = filename
41
- end
42
- end
43
-
44
- class ScriptConfigFieldsMissingKeysError < ScriptProjectError
45
- attr_reader :missing_keys, :filename
46
- def initialize(missing_keys:, filename:)
47
- super()
48
- @missing_keys = missing_keys
49
- @filename = filename
50
- end
51
- end
52
-
53
- class ScriptConfigFieldsInvalidValueError < ScriptProjectError
54
- attr_reader :valid_types, :filename
55
- def initialize(valid_types:, filename:)
56
- super()
57
- @valid_types = valid_types
58
- @filename = filename
59
- end
60
- end
61
-
62
- class ScriptEnvAppNotConnectedError < ScriptProjectError; end
63
-
64
- class ScriptConfigParseError < ScriptProjectError
65
- attr_reader :filename, :serialization_format
66
- def initialize(filename:, serialization_format:)
67
- super()
68
- @filename = filename
69
- @serialization_format = serialization_format
70
- end
71
- end
72
-
73
- class NoScriptConfigFileError < ScriptProjectError
74
- attr_reader :filename
75
- def initialize(filename)
76
- super()
77
- @filename = filename
78
- end
79
- end
80
-
81
- class APILibraryNotFoundError < ScriptProjectError
82
- attr_reader :library_name
83
- def initialize(library_name)
84
- super()
85
- @library_name = library_name
86
- end
87
- end
88
-
89
- class LanguageLibraryForAPINotFoundError < ScriptProjectError
90
- attr_reader :language, :api
91
- def initialize(language:, api:)
92
- super()
93
- @language = language
94
- @api = api
95
- end
96
- end
97
-
98
- class DeprecatedEPError < ScriptProjectError
99
- attr_reader(:extension_point)
100
- def initialize(extension_point)
101
- super()
102
- @extension_point = extension_point
103
- end
104
- end
105
-
106
- class DependencyInstallError < ScriptProjectError; end
107
- class EmptyResponseError < ScriptProjectError; end
108
-
109
- class InvalidEnvironmentError < ScriptProjectError
110
- attr_reader :tool, :env_version, :minimum_version
111
- def initialize(tool, env_version, minimum_version)
112
- super()
113
- @tool = tool
114
- @env_version = env_version
115
- @minimum_version = minimum_version
116
- end
117
- end
118
-
119
- class InvalidResponseError < ScriptProjectError; end
120
- class ForbiddenError < ScriptProjectError; end
121
- class InvalidContextError < ScriptProjectError; end
122
-
123
- class InvalidLanguageError < ScriptProjectError
124
- attr_reader :language, :extension_point_type
125
- def initialize(language, extension_point_type)
126
- super()
127
- @language = language
128
- @extension_point_type = extension_point_type
129
- end
130
- end
131
-
132
- class GraphqlError < ScriptProjectError
133
- attr_reader :errors
134
- def initialize(errors)
135
- @errors = errors
136
- super("GraphQL failed with errors: #{errors}")
137
- end
138
- end
139
-
140
- class SystemCallFailureError < ScriptProjectError
141
- attr_reader :out, :cmd
142
- def initialize(out:, cmd:)
143
- super(out)
144
- @out = out
145
- @cmd = cmd
146
- end
147
- end
148
-
149
- class ScriptRepushError < ScriptProjectError
150
- attr_reader :uuid
151
- def initialize(uuid)
152
- super()
153
- @uuid = uuid
154
- end
155
- end
156
-
157
- class ScriptProjectAlreadyExistsError < ScriptProjectError; end
158
- class BuildScriptNotFoundError < ScriptProjectError; end
159
-
160
- class WebAssemblyBinaryNotFoundError < ScriptProjectError
161
- def initialize
162
- super("WebAssembly binary not found")
163
- end
164
- end
165
-
166
- class InvalidProjectError < ScriptProjectError; end
167
-
168
- class ScriptUploadError < ScriptProjectError; end
169
- class ProjectConfigNotFoundError < ScriptProjectError; end
170
- class InvalidProjectConfigError < ScriptProjectError; end
171
-
172
- class ScriptTooLargeError < ScriptProjectError
173
- attr_reader :max_size
174
-
175
- def initialize(max_size)
176
- super()
177
- @max_size = max_size
178
- end
179
- end
180
-
181
- class InvalidInputQueryErrors < ScriptProjectError
182
- attr_reader :messages
183
-
184
- def initialize(messages)
185
- @messages = messages
186
- super()
187
- end
188
-
189
- def input_query_path
190
- ScriptProjectRepository::INPUT_QUERY_PATH
191
- end
192
-
193
- def message
194
- messages.join("\n")
195
- end
196
- end
197
-
198
- class InvalidAppBridgePathError < ScriptProjectError
199
- def initialize(path_type)
200
- @path_type = path_type
201
- super()
202
- end
203
-
204
- def path_key
205
- "app_bridge_#{@path_type}_path"
206
- end
207
- end
208
- end
209
- end
210
- end
211
- end
@@ -1,37 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Script
4
- module Layers
5
- module Infrastructure
6
- class ExtensionPointRepository
7
- def get_extension_point(type)
8
- Domain::ExtensionPoint.new(type, fetch_extension_point(type))
9
- end
10
-
11
- def extension_points
12
- extension_point_configs.map do |type, extension_point_config|
13
- Domain::ExtensionPoint.new(type, extension_point_config)
14
- end
15
- end
16
-
17
- def extension_point_types
18
- extension_point_configs.keys
19
- end
20
-
21
- private
22
-
23
- def fetch_extension_point(type)
24
- raise Domain::Errors::InvalidExtensionPointError, type unless extension_point_configs[type]
25
- extension_point_configs[type]
26
- end
27
-
28
- def extension_point_configs
29
- @extension_points ||= begin
30
- require "yaml"
31
- YAML.load_file(Project.project_filepath("config/extension_points.yml"))
32
- end
33
- end
34
- end
35
- end
36
- end
37
- end
@@ -1,62 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Script
4
- module Layers
5
- module Infrastructure
6
- module Languages
7
- class ProjectCreator
8
- include SmartProperties
9
- property! :ctx, accepts: ShopifyCLI::Context
10
- property! :type, accepts: String
11
- property! :project_name, accepts: String
12
- property! :path_to_project, accepts: String
13
- property! :sparse_checkout_details, accepts: SparseCheckoutDetails
14
-
15
- def self.for(
16
- ctx:,
17
- language:,
18
- type:,
19
- project_name:,
20
- path_to_project:,
21
- sparse_checkout_details:
22
- )
23
-
24
- project_creators = {
25
- "typescript" => TypeScriptProjectCreator,
26
- "wasm" => WasmProjectCreator,
27
- }
28
-
29
- project_creator = project_creators[language] || WasmProjectCreator
30
-
31
- project_creator.new(
32
- ctx: ctx,
33
- type: type,
34
- project_name: project_name,
35
- path_to_project: path_to_project,
36
- sparse_checkout_details: sparse_checkout_details,
37
- )
38
- end
39
-
40
- # the sparse checkout process is common to all script types
41
- def setup_dependencies
42
- sparse_checkout_details.setup(ctx)
43
- clean
44
- end
45
-
46
- private
47
-
48
- def clean
49
- source = File.join(path_to_project, sparse_checkout_details.path, ".")
50
- FileUtils.cp_r(source, path_to_project)
51
- ctx.rm_rf(sparse_checkout_details.path.split("/")[0])
52
- ctx.rm_rf(".git")
53
- end
54
-
55
- def command_runner
56
- @command_runner ||= CommandRunner.new(ctx: ctx)
57
- end
58
- end
59
- end
60
- end
61
- end
62
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Script
4
- module Layers
5
- module Infrastructure
6
- module Languages
7
- class TaskRunner
8
- attr_reader :ctx
9
-
10
- def self.for(ctx, language)
11
- task_runners = {
12
- "typescript" => TypeScriptTaskRunner,
13
- "wasm" => WasmTaskRunner,
14
- }
15
-
16
- task_runner = task_runners[language] || WasmTaskRunner
17
- task_runner.new(ctx)
18
- end
19
-
20
- def initialize(ctx)
21
- @ctx = ctx
22
- end
23
-
24
- def build
25
- raise NotImplementedError
26
- end
27
-
28
- def dependencies_installed?
29
- raise NotImplementedError
30
- end
31
-
32
- def install_dependencies
33
- raise NotImplementedError
34
- end
35
-
36
- def metadata_file_location
37
- raise NotImplementedError
38
- end
39
-
40
- def library_version(_library_name)
41
- raise NotImplementedError
42
- end
43
- end
44
- end
45
- end
46
- end
47
- end
@@ -1,26 +0,0 @@
1
- module Script
2
- module Layers
3
- module Infrastructure
4
- module Languages
5
- class ToolVersionChecker
6
- class << self
7
- def check_node(minimum_version:)
8
- check_version("node", ShopifyCLI::Environment.node_version, minimum_version)
9
- end
10
-
11
- def check_npm(minimum_version:)
12
- check_version("npm", ShopifyCLI::Environment.npm_version, minimum_version)
13
- end
14
-
15
- private
16
-
17
- def check_version(tool, env_version, minimum_version)
18
- return if env_version >= ::Semantic::Version.new(minimum_version)
19
- raise Errors::InvalidEnvironmentError.new(tool, env_version, minimum_version)
20
- end
21
- end
22
- end
23
- end
24
- end
25
- end
26
- end
@@ -1,45 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Script
4
- module Layers
5
- module Infrastructure
6
- module Languages
7
- class TypeScriptProjectCreator < ProjectCreator
8
- def setup_dependencies
9
- task_runner = Infrastructure::Languages::TypeScriptTaskRunner.new(ctx)
10
- task_runner.set_npm_config
11
-
12
- super
13
-
14
- if ctx.file_exist?("yarn.lock")
15
- ctx.rm("yarn.lock")
16
- end
17
-
18
- if ctx.file_exist?("package-lock.json")
19
- ctx.rm("package-lock.json")
20
- end
21
-
22
- update_package_json_name
23
- end
24
-
25
- private
26
-
27
- def update_package_json_name
28
- file_content = ctx.read("package.json")
29
- hash = file_content_to_hash(file_content)
30
- hash["name"] = project_name
31
- ctx.write("package.json", hash_to_file_content(hash))
32
- end
33
-
34
- def file_content_to_hash(content)
35
- JSON.parse(content)
36
- end
37
-
38
- def hash_to_file_content(hash)
39
- JSON.pretty_generate(hash)
40
- end
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,103 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Script
4
- module Layers
5
- module Infrastructure
6
- module Languages
7
- class TypeScriptTaskRunner < TaskRunner
8
- NODE_MIN_VERSION = "14.15.0"
9
- NPM_MIN_VERSION = "5.2.0"
10
-
11
- BYTECODE_FILE = "build/index.wasm"
12
- METADATA_FILE = "build/metadata.json"
13
- SCRIPT_SDK_BUILD = "npm run build"
14
- GEN_METADATA = "npm run gen-metadata"
15
- NPM_SET_REGISTRY_COMMAND = "npm --userconfig ./.npmrc config set @shopify:registry https://registry.npmjs.com"
16
- NPM_SET_ENGINE_STRICT_COMMAND = "npm --userconfig ./.npmrc config set engine-strict true"
17
- NPM_INSTALL_COMMAND = "npm install --no-audit --no-optional --legacy-peer-deps --loglevel error"
18
-
19
- def build
20
- compile
21
- rescue Errors::SystemCallFailureError => e
22
- raise Errors::BuildError, e.out
23
- end
24
-
25
- def install_dependencies
26
- run_cmd_with_env_check(NPM_INSTALL_COMMAND)
27
-
28
- rescue Errors::SystemCallFailureError => e
29
- raise Errors::DependencyInstallError, e.out
30
- end
31
-
32
- def dependencies_installed?
33
- # Assuming if node_modules folder exist at root of script folder, all deps are installed
34
- ctx.dir_exist?("node_modules")
35
- end
36
-
37
- def metadata_file_location
38
- METADATA_FILE
39
- end
40
-
41
- def library_version(library_name)
42
- output = JSON.parse(run_cmd_with_env_check("npm -s list --json"))
43
- library_version_from_npm_list(output, library_name)
44
- rescue Errors::SystemCallFailureError => error
45
- library_version_from_npm_list_error_output(error, library_name)
46
- end
47
-
48
- def set_npm_config
49
- run_cmd_with_env_check(NPM_SET_REGISTRY_COMMAND)
50
- run_cmd_with_env_check(NPM_SET_ENGINE_STRICT_COMMAND)
51
- end
52
-
53
- private
54
-
55
- def ensure_environment
56
- return if defined?(@environment_checked)
57
- @environment_checked = true
58
-
59
- ToolVersionChecker.check_node(minimum_version: NODE_MIN_VERSION)
60
- ToolVersionChecker.check_npm(minimum_version: NPM_MIN_VERSION)
61
- end
62
-
63
- def run_cmd_with_env_check(cmd)
64
- ensure_environment
65
- CommandRunner.new(ctx: ctx).call(cmd)
66
- end
67
-
68
- def library_version_from_npm_list_error_output(error, library_name)
69
- # npm list can return a failure status code, even when returning the correct data.
70
- # This causes the CommandRunner to throw a SystemCallFailure error that contains the data.
71
- # In here, we check that the output contains `npm list`'s structure and extract the version.
72
- output = JSON.parse(error.out)
73
- raise error unless output.key?("dependencies")
74
-
75
- library_version_from_npm_list(output, library_name)
76
- rescue JSON::ParserError
77
- raise error
78
- end
79
-
80
- def library_version_from_npm_list(output, library_name)
81
- output.dig("dependencies", library_name, "version").tap do |version|
82
- raise Errors::APILibraryNotFoundError, library_name unless version
83
- end
84
- end
85
-
86
- def compile
87
- check_compilation_dependencies!
88
- run_cmd_with_env_check(SCRIPT_SDK_BUILD)
89
- run_cmd_with_env_check(GEN_METADATA)
90
- end
91
-
92
- def check_compilation_dependencies!
93
- pkg = JSON.parse(File.read("package.json"))
94
- build_script = pkg.dig("scripts", "build")
95
-
96
- raise Errors::BuildScriptNotFoundError,
97
- "Build script not found" if build_script.nil?
98
- end
99
- end
100
- end
101
- end
102
- end
103
- end
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Script
4
- module Layers
5
- module Infrastructure
6
- module Languages
7
- class WasmProjectCreator < ProjectCreator
8
- end
9
- end
10
- end
11
- end
12
- end
@@ -1,32 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Script
4
- module Layers
5
- module Infrastructure
6
- module Languages
7
- class WasmTaskRunner < TaskRunner
8
- BYTECODE_FILE = "build/index.wasm"
9
-
10
- def dependencies_installed?
11
- true
12
- end
13
-
14
- def install_dependencies; end
15
-
16
- def library_version(_library_name)
17
- nil
18
- end
19
-
20
- def metadata_file_location
21
- "metadata.json"
22
- end
23
-
24
- def build
25
- raise Errors::WebAssemblyBinaryNotFoundError unless ctx.file_exist?(BYTECODE_FILE)
26
- ctx.binread(BYTECODE_FILE)
27
- end
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,18 +0,0 @@
1
-
2
- module Script
3
- module Layers
4
- module Infrastructure
5
- class MetadataRepository
6
- include SmartProperties
7
- property! :ctx, accepts: ShopifyCLI::Context
8
-
9
- def get_metadata(file_location)
10
- raise Domain::Errors::MetadataNotFoundError, file_location unless ctx.file_exist?(file_location)
11
-
12
- raw_contents = File.read(file_location)
13
- Domain::Metadata.create_from_json(ctx, raw_contents)
14
- end
15
- end
16
- end
17
- end
18
- end
@@ -1,36 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Script
4
- module Layers
5
- module Infrastructure
6
- class PushPackageRepository
7
- include SmartProperties
8
- property! :ctx, accepts: ShopifyCLI::Context
9
-
10
- def get_push_package(script_project:, metadata:, library:)
11
- build_file_path = file_path(script_project.id)
12
- raise Domain::Errors::PushPackageNotFoundError unless ctx.file_exist?(build_file_path)
13
-
14
- script_content = ctx.binread(build_file_path)
15
- Domain::PushPackage.new(
16
- id: build_file_path,
17
- uuid: script_project.uuid,
18
- extension_point_type: script_project.extension_point_type,
19
- title: script_project.title,
20
- description: script_project.description,
21
- script_content: script_content,
22
- metadata: metadata,
23
- script_config: script_project.script_config,
24
- library: library
25
- )
26
- end
27
-
28
- private
29
-
30
- def file_path(path_to_script)
31
- "#{path_to_script}/build/index.wasm"
32
- end
33
- end
34
- end
35
- end
36
- end