shopify-cli 2.6.3 → 2.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (200) hide show
  1. checksums.yaml +4 -4
  2. data/.devcontainer.json +5 -0
  3. data/.github/DESIGN.md +1 -1
  4. data/.github/ISSUE_TEMPLATE.md +7 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +15 -4
  6. data/.github/workflows/shopify.yml +3 -6
  7. data/.vscode/extensions.json +5 -0
  8. data/.vscode/settings.json +9 -0
  9. data/CHANGELOG.md +98 -104
  10. data/CONTRIBUTING.md +1 -21
  11. data/Codespace.dockerfile +35 -0
  12. data/Gemfile +2 -0
  13. data/Gemfile.lock +9 -5
  14. data/README.md +20 -99
  15. data/RELEASING.md +17 -30
  16. data/Rakefile +0 -5
  17. data/Tests.dockerfile +35 -0
  18. data/assets/logo.png +0 -0
  19. data/dev.yml +0 -3
  20. data/docs/README.md +13 -0
  21. data/docs/contributors/testing.md +27 -0
  22. data/docs/users/installation.md +46 -0
  23. data/{THEMEKIT_MIGRATION.md → docs/users/migrate-from-themekit.md} +1 -1
  24. data/lib/project_types/extension/cli.rb +7 -3
  25. data/lib/project_types/extension/commands/create.rb +6 -6
  26. data/lib/project_types/extension/commands/extension_command.rb +1 -1
  27. data/lib/project_types/extension/features/argo.rb +9 -10
  28. data/lib/project_types/extension/features/argo_serve.rb +9 -23
  29. data/lib/project_types/extension/forms/create.rb +1 -1
  30. data/lib/project_types/extension/forms/questions/ask_template.rb +3 -6
  31. data/lib/project_types/extension/messages/messages.rb +1 -0
  32. data/lib/project_types/extension/models/development_server_requirements.rb +2 -3
  33. data/lib/project_types/extension/models/server_config/app.rb +13 -0
  34. data/lib/project_types/extension/models/server_config/development.rb +5 -4
  35. data/lib/project_types/extension/models/server_config/development_renderer.rb +1 -1
  36. data/lib/project_types/extension/models/server_config/development_resource.rb +13 -0
  37. data/lib/project_types/extension/models/server_config/extension.rb +4 -0
  38. data/lib/project_types/extension/models/server_config/root.rb +4 -1
  39. data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +1 -1
  40. data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +1 -1
  41. data/lib/project_types/extension/tasks/convert_server_config.rb +65 -0
  42. data/lib/project_types/extension/tasks/ensure_resource_url.rb +39 -0
  43. data/lib/project_types/extension/tasks/find_package_from_json.rb +37 -0
  44. data/lib/project_types/extension/tasks/merge_server_config.rb +32 -0
  45. data/lib/project_types/extension/tasks/run_extension_command.rb +10 -9
  46. data/lib/project_types/node/cli.rb +0 -16
  47. data/lib/project_types/node/forms/create.rb +5 -5
  48. data/lib/project_types/node/messages/messages.rb +2 -149
  49. data/lib/project_types/php/cli.rb +0 -11
  50. data/lib/project_types/php/forms/create.rb +5 -6
  51. data/lib/project_types/php/messages/messages.rb +2 -164
  52. data/lib/project_types/rails/cli.rb +0 -16
  53. data/lib/project_types/rails/commands/create.rb +46 -17
  54. data/lib/project_types/rails/forms/create.rb +5 -7
  55. data/lib/project_types/rails/messages/messages.rb +6 -154
  56. data/lib/project_types/script/cli.rb +1 -1
  57. data/lib/project_types/script/commands/create.rb +5 -6
  58. data/lib/project_types/script/commands/push.rb +1 -1
  59. data/lib/project_types/script/config/extension_points.yml +10 -0
  60. data/lib/project_types/script/errors.rb +0 -18
  61. data/lib/project_types/script/graphql/app_script_set.graphql +2 -0
  62. data/lib/project_types/script/layers/application/build_script.rb +2 -1
  63. data/lib/project_types/script/layers/application/create_script.rb +2 -2
  64. data/lib/project_types/script/layers/application/push_script.rb +15 -1
  65. data/lib/project_types/script/layers/domain/push_package.rb +5 -2
  66. data/lib/project_types/script/layers/domain/script_json.rb +1 -1
  67. data/lib/project_types/script/layers/infrastructure/api_clients/partners_proxy_api_client.rb +0 -4
  68. data/lib/project_types/script/layers/infrastructure/errors.rb +17 -2
  69. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb +29 -13
  70. data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +29 -13
  71. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +4 -2
  72. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +3 -4
  73. data/lib/project_types/script/layers/infrastructure/script_service.rb +7 -2
  74. data/lib/project_types/script/messages/messages.rb +9 -22
  75. data/lib/project_types/script/ui/error_handler.rb +16 -26
  76. data/lib/project_types/theme/cli.rb +1 -1
  77. data/lib/project_types/theme/commands/check.rb +1 -1
  78. data/lib/project_types/theme/commands/delete.rb +1 -1
  79. data/lib/project_types/theme/commands/init.rb +1 -1
  80. data/lib/project_types/theme/commands/language_server.rb +1 -1
  81. data/lib/project_types/theme/commands/package.rb +1 -1
  82. data/lib/project_types/theme/commands/publish.rb +1 -1
  83. data/lib/project_types/theme/commands/pull.rb +1 -1
  84. data/lib/project_types/theme/commands/push.rb +1 -1
  85. data/lib/project_types/theme/commands/serve.rb +10 -2
  86. data/lib/project_types/theme/messages/messages.rb +10 -0
  87. data/lib/shopify_cli/admin_api/populate_resource_command.rb +1 -1
  88. data/lib/shopify_cli/api.rb +7 -2
  89. data/lib/shopify_cli/app_type_detector.rb +36 -0
  90. data/lib/shopify_cli/command/app_sub_command.rb +10 -0
  91. data/lib/shopify_cli/command/project_command.rb +18 -0
  92. data/lib/shopify_cli/command/sub_command.rb +19 -0
  93. data/lib/shopify_cli/command.rb +13 -3
  94. data/lib/shopify_cli/command_options/command_serve_options.rb +43 -0
  95. data/lib/shopify_cli/command_options.rb +7 -0
  96. data/lib/shopify_cli/commands/app/connect.rb +22 -0
  97. data/lib/shopify_cli/commands/app/create/node.rb +38 -0
  98. data/lib/shopify_cli/commands/app/create/php.rb +36 -0
  99. data/lib/shopify_cli/commands/app/create/rails.rb +40 -0
  100. data/lib/shopify_cli/commands/app/create.rb +28 -0
  101. data/lib/shopify_cli/commands/app/deploy.rb +49 -0
  102. data/lib/shopify_cli/commands/app/open.rb +19 -0
  103. data/lib/shopify_cli/commands/app/serve.rb +49 -0
  104. data/lib/shopify_cli/commands/app/tunnel.rb +43 -0
  105. data/lib/shopify_cli/commands/app.rb +29 -0
  106. data/lib/shopify_cli/commands/config.rb +2 -2
  107. data/lib/shopify_cli/commands/login.rb +3 -3
  108. data/lib/shopify_cli/commands/reporting.rb +38 -0
  109. data/lib/shopify_cli/commands/switch.rb +1 -1
  110. data/lib/shopify_cli/commands.rb +2 -0
  111. data/lib/shopify_cli/constants.rb +11 -3
  112. data/lib/shopify_cli/core/monorail.rb +9 -20
  113. data/lib/shopify_cli/environment.rb +15 -1
  114. data/lib/shopify_cli/exception_reporter.rb +29 -16
  115. data/lib/shopify_cli/git.rb +12 -1
  116. data/lib/shopify_cli/github/issue_url_generator.rb +19 -0
  117. data/lib/shopify_cli/github.rb +5 -0
  118. data/lib/shopify_cli/messages/messages.rb +295 -22
  119. data/lib/shopify_cli/migrator/migration.rb +1 -1
  120. data/lib/shopify_cli/migrator/migrations/1631709766_noop.rb +1 -1
  121. data/lib/shopify_cli/migrator/migrations/1633691650_merge_reporting_configuration.rb +41 -0
  122. data/lib/shopify_cli/migrator.rb +9 -11
  123. data/lib/shopify_cli/project.rb +5 -1
  124. data/lib/shopify_cli/project_commands.rb +1 -1
  125. data/lib/shopify_cli/reporting_configuration_controller.rb +64 -0
  126. data/lib/shopify_cli/services/app/connect_service.rb +25 -0
  127. data/lib/shopify_cli/services/app/create/node_service.rb +153 -0
  128. data/lib/shopify_cli/services/app/create/php_service.rb +152 -0
  129. data/lib/shopify_cli/services/app/create/rails_service.rb +213 -0
  130. data/lib/shopify_cli/services/app/deploy/heroku/node_service.rb +101 -0
  131. data/lib/shopify_cli/services/app/deploy/heroku/php_service.rb +135 -0
  132. data/lib/shopify_cli/services/app/deploy/heroku/rails_service.rb +120 -0
  133. data/lib/shopify_cli/services/app/open_service.rb +19 -0
  134. data/lib/shopify_cli/services/app/serve/node_service.rb +42 -0
  135. data/lib/shopify_cli/services/app/serve/php_service.rb +46 -0
  136. data/lib/shopify_cli/services/app/serve/rails_service.rb +48 -0
  137. data/lib/shopify_cli/services/app/tunnel/auth_service.rb +21 -0
  138. data/lib/shopify_cli/services/app/tunnel/start_service.rb +20 -0
  139. data/lib/shopify_cli/services/app/tunnel/stop_service.rb +20 -0
  140. data/lib/shopify_cli/services/base_service.rb +13 -0
  141. data/lib/shopify_cli/services/reporting_service.rb +16 -0
  142. data/lib/shopify_cli/services.rb +37 -0
  143. data/lib/shopify_cli/theme/dev_server/local_assets.rb +1 -1
  144. data/lib/shopify_cli/theme/dev_server/watcher.rb +2 -2
  145. data/lib/shopify_cli/theme/dev_server.rb +9 -2
  146. data/lib/shopify_cli/version.rb +1 -1
  147. data/lib/shopify_cli.rb +5 -2
  148. data/shopify-cli.gemspec +2 -13
  149. data/shopify-dev +18 -0
  150. data/utilities/constants.rb +7 -0
  151. data/utilities/docker/container.rb +104 -0
  152. data/utilities/docker.rb +45 -3
  153. data/utilities/utilities.rb +1 -0
  154. metadata +63 -54
  155. data/Dockerfile +0 -17
  156. data/docs/_config.yml +0 -2
  157. data/docs/app/node/commands/index.md +0 -4
  158. data/docs/app/node/index.md +0 -4
  159. data/docs/app/rails/commands/index.md +0 -4
  160. data/docs/app/rails/index.md +0 -4
  161. data/docs/core/index.md +0 -4
  162. data/docs/getting-started/index.md +0 -4
  163. data/docs/getting-started/install/index.md +0 -4
  164. data/docs/getting-started/migrate/index.md +0 -4
  165. data/docs/getting-started/uninstall/index.md +0 -4
  166. data/docs/getting-started/upgrade/index.md +0 -4
  167. data/docs/help/start-app/index.md +0 -4
  168. data/docs/index.md +0 -4
  169. data/ext/shopify-cli/extconf.rb +0 -60
  170. data/install.sh +0 -7
  171. data/lib/project_types/extension/tasks/converters/server_config_converter.rb +0 -31
  172. data/lib/project_types/extension/tasks/load_server_config.rb +0 -23
  173. data/lib/project_types/node/commands/connect.rb +0 -21
  174. data/lib/project_types/node/commands/create.rb +0 -125
  175. data/lib/project_types/node/commands/deploy/heroku.rb +0 -96
  176. data/lib/project_types/node/commands/deploy.rb +0 -32
  177. data/lib/project_types/node/commands/generate.rb +0 -22
  178. data/lib/project_types/node/commands/open.rb +0 -18
  179. data/lib/project_types/node/commands/serve.rb +0 -54
  180. data/lib/project_types/node/commands/tunnel.rb +0 -41
  181. data/lib/project_types/php/commands/connect.rb +0 -19
  182. data/lib/project_types/php/commands/create.rb +0 -143
  183. data/lib/project_types/php/commands/deploy/heroku.rb +0 -129
  184. data/lib/project_types/php/commands/deploy.rb +0 -32
  185. data/lib/project_types/php/commands/open.rb +0 -16
  186. data/lib/project_types/php/commands/serve.rb +0 -51
  187. data/lib/project_types/php/commands/tunnel.rb +0 -37
  188. data/lib/project_types/rails/commands/connect.rb +0 -21
  189. data/lib/project_types/rails/commands/deploy/heroku.rb +0 -115
  190. data/lib/project_types/rails/commands/deploy.rb +0 -32
  191. data/lib/project_types/rails/commands/generate/webhook.rb +0 -42
  192. data/lib/project_types/rails/commands/generate.rb +0 -60
  193. data/lib/project_types/rails/commands/open.rb +0 -18
  194. data/lib/project_types/rails/commands/serve.rb +0 -52
  195. data/lib/project_types/rails/commands/tunnel.rb +0 -41
  196. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +0 -0
  197. data/lib/shopify_cli/exception_reporter/permission_controller.rb +0 -54
  198. data/lib/shopify_cli/sub_command.rb +0 -17
  199. data/shopify.fish +0 -12
  200. data/shopify.sh +0 -11
@@ -7,7 +7,7 @@ module Script
7
7
  module Application
8
8
  class CreateScript
9
9
  class << self
10
- def call(ctx:, language:, sparse_checkout_branch:, script_name:, extension_point_type:, no_config_ui:)
10
+ def call(ctx:, language:, sparse_checkout_branch:, script_name:, extension_point_type:)
11
11
  raise Infrastructure::Errors::ScriptProjectAlreadyExistsError, script_name if ctx.dir_exist?(script_name)
12
12
 
13
13
  in_new_directory_context(ctx, script_name) do
@@ -36,7 +36,7 @@ module Script
36
36
  )
37
37
 
38
38
  install_dependencies(ctx, language, script_name, project_creator)
39
- script_project_repo.update_or_create_script_json(title: script_name, configuration_ui: !no_config_ui)
39
+ script_project_repo.update_or_create_script_json(title: script_name)
40
40
  project
41
41
  end
42
42
  end
@@ -11,14 +11,27 @@ module Script
11
11
  task_runner = Infrastructure::Languages::TaskRunner
12
12
  .for(ctx, script_project.language, script_project.script_name)
13
13
 
14
+ extension_point = ExtensionPoints.get(type: script_project.extension_point_type)
15
+ library_name = extension_point.libraries.for(script_project.language)&.package
16
+ raise Infrastructure::Errors::LanguageLibraryForAPINotFoundError.new(
17
+ language: script_project.language,
18
+ api: script_project.extension_point_type
19
+ ) unless library_name
20
+
21
+ library = {
22
+ language: script_project.language,
23
+ version: task_runner.library_version(library_name),
24
+ }
25
+
14
26
  ProjectDependencies.install(ctx: ctx, task_runner: task_runner)
15
- BuildScript.call(ctx: ctx, task_runner: task_runner, script_project: script_project)
27
+ BuildScript.call(ctx: ctx, task_runner: task_runner, script_project: script_project, library: library)
16
28
 
17
29
  UI::PrintingSpinner.spin(ctx, ctx.message("script.application.pushing")) do |p_ctx, spinner|
18
30
  package = Infrastructure::PushPackageRepository.new(ctx: p_ctx).get_push_package(
19
31
  script_project: script_project,
20
32
  compiled_type: task_runner.compiled_type,
21
33
  metadata: task_runner.metadata,
34
+ library: library,
22
35
  )
23
36
  script_service = Infrastructure::ServiceLocator.script_service(
24
37
  ctx: p_ctx,
@@ -32,6 +45,7 @@ module Script
32
45
  metadata: package.metadata,
33
46
  script_json: package.script_json,
34
47
  module_upload_url: module_upload_url,
48
+ library: package.library,
35
49
  )
36
50
  script_project_repo.update_env(uuid: uuid)
37
51
  spinner.update_title(p_ctx.message("script.application.pushed"))
@@ -10,7 +10,8 @@ module Script
10
10
  :script_json,
11
11
  :script_content,
12
12
  :compiled_type,
13
- :metadata
13
+ :metadata,
14
+ :library
14
15
 
15
16
  def initialize(
16
17
  id:,
@@ -19,7 +20,8 @@ module Script
19
20
  script_content:,
20
21
  compiled_type: nil,
21
22
  metadata:,
22
- script_json:
23
+ script_json:,
24
+ library:
23
25
  )
24
26
  @id = id
25
27
  @uuid = uuid
@@ -28,6 +30,7 @@ module Script
28
30
  @compiled_type = compiled_type
29
31
  @metadata = metadata
30
32
  @script_json = script_json
33
+ @library = library
31
34
  end
32
35
  end
33
36
  end
@@ -15,7 +15,7 @@ module Script
15
15
  @version = @content["version"].to_s
16
16
  @title = @content["title"]
17
17
  @description = @content["description"]
18
- @configuration_ui = @content["configurationUi"]
18
+ @configuration_ui = @content.fetch("configurationUi", true)
19
19
  @configuration = @content["configuration"]
20
20
  end
21
21
 
@@ -27,10 +27,6 @@ module Script
27
27
  case error_code(response["errors"])
28
28
  when "forbidden"
29
29
  raise Errors::ForbiddenError
30
- when "forbidden_on_shop"
31
- raise Errors::ShopAuthenticationError
32
- when "app_not_installed_on_shop"
33
- raise Errors::AppNotInstalledError
34
30
  else
35
31
  raise Errors::GraphqlError, response["errors"]
36
32
  end
@@ -4,7 +4,6 @@ module Script
4
4
  module Layers
5
5
  module Infrastructure
6
6
  module Errors
7
- class AppNotInstalledError < ScriptProjectError; end
8
7
  class BuildError < ScriptProjectError; end
9
8
  class ScriptJsonSyntaxError < ScriptProjectError; end
10
9
 
@@ -40,6 +39,23 @@ module Script
40
39
  end
41
40
  end
42
41
 
42
+ class APILibraryNotFoundError < ScriptProjectError
43
+ attr_reader :library_name
44
+ def initialize(library_name)
45
+ super()
46
+ @library_name = library_name
47
+ end
48
+ end
49
+
50
+ class LanguageLibraryForAPINotFoundError < ScriptProjectError
51
+ attr_reader :language, :api
52
+ def initialize(language:, api:)
53
+ super()
54
+ @language = language
55
+ @api = api
56
+ end
57
+ end
58
+
43
59
  class DependencyInstallError < ScriptProjectError; end
44
60
  class DeprecatedEPError < ScriptProjectError; end
45
61
  class EmptyResponseError < ScriptProjectError; end
@@ -84,7 +100,6 @@ module Script
84
100
  end
85
101
 
86
102
  class ScriptProjectAlreadyExistsError < ScriptProjectError; end
87
- class ShopAuthenticationError < ScriptProjectError; end
88
103
  class TaskRunnerNotFoundError < ScriptProjectError; end
89
104
  class BuildScriptNotFoundError < ScriptProjectError; end
90
105
  class InvalidBuildScriptError < ScriptProjectError; end
@@ -5,7 +5,7 @@ module Script
5
5
  module Infrastructure
6
6
  module Languages
7
7
  class AssemblyScriptTaskRunner
8
- BYTECODE_FILE = "build/%{name}.wasm"
8
+ BYTECODE_FILE = "build/script.wasm"
9
9
  METADATA_FILE = "build/metadata.json"
10
10
  SCRIPT_SDK_BUILD = "npm run build"
11
11
 
@@ -47,8 +47,33 @@ module Script
47
47
  Domain::Metadata.create_from_json(@ctx, raw_contents)
48
48
  end
49
49
 
50
+ def library_version(library_name)
51
+ output = JSON.parse(CommandRunner.new(ctx: ctx).call("npm -s list --json"))
52
+ library_version_from_npm_list(output, library_name)
53
+ rescue Errors::SystemCallFailureError => error
54
+ library_version_from_npm_list_error_output(error, library_name)
55
+ end
56
+
50
57
  private
51
58
 
59
+ def library_version_from_npm_list_error_output(error, library_name)
60
+ # npm list can return a failure status code, even when returning the correct data.
61
+ # This causes the CommandRunner to throw a SystemCallFailure error that contains the data.
62
+ # In here, we check that the output contains `npm list`'s structure and extract the version.
63
+ output = JSON.parse(error.out)
64
+ raise error unless output.key?("dependencies")
65
+
66
+ library_version_from_npm_list(output, library_name)
67
+ rescue JSON::ParserError
68
+ raise error
69
+ end
70
+
71
+ def library_version_from_npm_list(output, library_name)
72
+ output.dig("dependencies", library_name, "version").tap do |version|
73
+ raise Errors::APILibraryNotFoundError, library_name unless version
74
+ end
75
+ end
76
+
52
77
  def check_node_version!
53
78
  output, status = @ctx.capture2e("node", "--version")
54
79
  raise Errors::DependencyInstallError, output unless status.success?
@@ -80,19 +105,10 @@ module Script
80
105
  end
81
106
 
82
107
  def bytecode
83
- legacy_filename = format(BYTECODE_FILE, name: script_name)
84
- filename = format(BYTECODE_FILE, name: "script")
85
-
86
- bytecode_file = if ctx.file_exist?(filename)
87
- filename
88
- elsif ctx.file_exist?(legacy_filename)
89
- legacy_filename
90
- else
91
- raise Errors::WebAssemblyBinaryNotFoundError
92
- end
108
+ raise Errors::WebAssemblyBinaryNotFoundError unless ctx.file_exist?(BYTECODE_FILE)
93
109
 
94
- contents = ctx.binread(bytecode_file)
95
- ctx.rm(bytecode_file)
110
+ contents = ctx.binread(BYTECODE_FILE)
111
+ ctx.rm(BYTECODE_FILE)
96
112
 
97
113
  contents
98
114
  end
@@ -5,7 +5,7 @@ module Script
5
5
  module Infrastructure
6
6
  module Languages
7
7
  class TypeScriptTaskRunner
8
- BYTECODE_FILE = "build/%{name}.wasm"
8
+ BYTECODE_FILE = "build/index.wasm"
9
9
  METADATA_FILE = "build/metadata.json"
10
10
  SCRIPT_SDK_BUILD = "npm run build"
11
11
  GEN_METADATA = "npm run gen-metadata"
@@ -48,8 +48,33 @@ module Script
48
48
  Domain::Metadata.create_from_json(@ctx, raw_contents)
49
49
  end
50
50
 
51
+ def library_version(library_name)
52
+ output = JSON.parse(CommandRunner.new(ctx: ctx).call("npm -s list --json"))
53
+ library_version_from_npm_list(output, library_name)
54
+ rescue Errors::SystemCallFailureError => error
55
+ library_version_from_npm_list_error_output(error, library_name)
56
+ end
57
+
51
58
  private
52
59
 
60
+ def library_version_from_npm_list_error_output(error, library_name)
61
+ # npm list can return a failure status code, even when returning the correct data.
62
+ # This causes the CommandRunner to throw a SystemCallFailure error that contains the data.
63
+ # In here, we check that the output contains `npm list`'s structure and extract the version.
64
+ output = JSON.parse(error.out)
65
+ raise error unless output.key?("dependencies")
66
+
67
+ library_version_from_npm_list(output, library_name)
68
+ rescue JSON::ParserError
69
+ raise error
70
+ end
71
+
72
+ def library_version_from_npm_list(output, library_name)
73
+ output.dig("dependencies", library_name, "version").tap do |version|
74
+ raise Errors::APILibraryNotFoundError, library_name unless version
75
+ end
76
+ end
77
+
53
78
  def check_node_version!
54
79
  output, status = @ctx.capture2e("node", "--version")
55
80
  raise Errors::DependencyInstallError, output unless status.success?
@@ -82,19 +107,10 @@ module Script
82
107
  end
83
108
 
84
109
  def bytecode
85
- legacy_filename = format(BYTECODE_FILE, name: script_name)
86
- filename = format(BYTECODE_FILE, name: "index")
87
-
88
- bytecode_file = if ctx.file_exist?(filename)
89
- filename
90
- elsif ctx.file_exist?(legacy_filename)
91
- legacy_filename
92
- else
93
- raise Errors::WebAssemblyBinaryNotFoundError
94
- end
110
+ raise Errors::WebAssemblyBinaryNotFoundError unless ctx.file_exist?(BYTECODE_FILE)
95
111
 
96
- contents = ctx.binread(bytecode_file)
97
- ctx.rm(bytecode_file)
112
+ contents = ctx.binread(BYTECODE_FILE)
113
+ ctx.rm(BYTECODE_FILE)
98
114
 
99
115
  contents
100
116
  end
@@ -7,7 +7,7 @@ module Script
7
7
  include SmartProperties
8
8
  property! :ctx, accepts: ShopifyCLI::Context
9
9
 
10
- def create_push_package(script_project:, script_content:, compiled_type:, metadata:)
10
+ def create_push_package(script_project:, script_content:, compiled_type:, metadata:, library:)
11
11
  build_file_path = file_path(script_project.id, compiled_type)
12
12
  write_to_path(build_file_path, script_content)
13
13
 
@@ -19,10 +19,11 @@ module Script
19
19
  compiled_type: compiled_type,
20
20
  metadata: metadata,
21
21
  script_json: script_project.script_json,
22
+ library: library
22
23
  )
23
24
  end
24
25
 
25
- def get_push_package(script_project:, compiled_type:, metadata:)
26
+ def get_push_package(script_project:, compiled_type:, metadata:, library:)
26
27
  build_file_path = file_path(script_project.id, compiled_type)
27
28
  raise Domain::PushPackageNotFoundError unless ctx.file_exist?(build_file_path)
28
29
 
@@ -34,6 +35,7 @@ module Script
34
35
  script_content: script_content,
35
36
  metadata: metadata,
36
37
  script_json: script_project.script_json,
38
+ library: library
37
39
  )
38
40
  end
39
41
 
@@ -81,10 +81,10 @@ module Script
81
81
  )
82
82
  end
83
83
 
84
- def update_or_create_script_json(title:, configuration_ui: false)
84
+ def update_or_create_script_json(title:)
85
85
  script_json = ScriptJsonRepository
86
86
  .new(ctx: ctx)
87
- .update_or_create(title: title, configuration_ui: configuration_ui)
87
+ .update_or_create(title: title)
88
88
 
89
89
  Domain::ScriptProject.new(
90
90
  id: ctx.root,
@@ -148,11 +148,10 @@ module Script
148
148
  current_script_json || raise(Domain::Errors::NoScriptJsonFile)
149
149
  end
150
150
 
151
- def update_or_create(title:, configuration_ui:)
151
+ def update_or_create(title:)
152
152
  json = current_script_json&.content || {}
153
153
  json["version"] ||= "1"
154
154
  json["title"] = title
155
- json["configurationUi"] = !!configuration_ui
156
155
 
157
156
  ctx.write(SCRIPT_JSON_FILENAME, JSON.pretty_generate(json))
158
157
 
@@ -18,7 +18,8 @@ module Script
18
18
  force: false,
19
19
  metadata:,
20
20
  script_json:,
21
- module_upload_url:
21
+ module_upload_url:,
22
+ library:
22
23
  )
23
24
  query_name = "app_script_set"
24
25
  variables = {
@@ -33,6 +34,10 @@ module Script
33
34
  configurationUi: script_json.configuration_ui,
34
35
  configurationDefinition: script_json.configuration&.to_json,
35
36
  moduleUploadUrl: module_upload_url,
37
+ library: {
38
+ language: library[:language],
39
+ version: library[:version],
40
+ },
36
41
  }
37
42
  resp_hash = make_request(query_name: query_name, variables: variables)
38
43
  user_errors = resp_hash["data"]["appScriptSet"]["userErrors"]
@@ -41,7 +46,7 @@ module Script
41
46
 
42
47
  if user_errors.any? { |e| e["tag"] == "already_exists_error" }
43
48
  raise Errors::ScriptRepushError, uuid
44
- elsif (e = user_errors.any? { |err| err["tag"] == "configuration_syntax_error" })
49
+ elsif (e = user_errors.any? { |err| err["tag"] == "configuration_definition_syntax_error" })
45
50
  raise Errors::ScriptJsonSyntaxError
46
51
  elsif (e = user_errors.find { |err| err["tag"] == "configuration_definition_missing_keys_error" })
47
52
  raise Errors::ScriptJsonMissingKeysError, e["message"]
@@ -27,10 +27,6 @@ module Script
27
27
  "extension_point_type or script_name.",
28
28
  invalid_context_help: "Add these values and try again.",
29
29
 
30
- invalid_config_props_cause: "{{command:--config-props}} is formatted incorrectly.",
31
- invalid_config_props_help: "Try again using this format: "\
32
- "{{cyan:--config-props='name1:value1, name2:value2'}}",
33
-
34
30
  invalid_script_name_cause: "Invalid script name.",
35
31
  invalid_script_name_help: "Replace or remove unsupported characters. Valid characters "\
36
32
  "are numbers, letters, hyphens, or underscores.",
@@ -42,9 +38,6 @@ module Script
42
38
  no_existing_orgs_cause: "You don't have any partner organizations.",
43
39
  no_existing_orgs_help: "Visit https://partners.shopify.com/ to create a partners account.",
44
40
 
45
- no_existing_stores_cause: "You don't have any stores in your Partner Dashboard.",
46
- no_existing_stores_help: "Visit https://partners.shopify.com/%{organization_id}/stores/ to create one.",
47
-
48
41
  project_exists_cause: "A directory with this same name already exists.",
49
42
  project_exists_help: "Try again and enter a different name for the script.",
50
43
 
@@ -54,9 +47,6 @@ module Script
54
47
  invalid_language_cause: "Invalid language %s.",
55
48
  invalid_language_help: "Allowed values: %s.",
56
49
 
57
- invalid_config: "Can't change the configuration values because %1$s is missing or "\
58
- "it isn't formatted properly.",
59
-
60
50
  missing_script_json_field_cause: "The script.json file is missing the required %s field.",
61
51
  missing_script_json_field_help: "Add the field and try again.",
62
52
 
@@ -91,8 +81,8 @@ module Script
91
81
  system_call_failure_cause: "An error was returned while running {{command:%{cmd}}}.",
92
82
  system_call_failure_help: "Review the following error and try again.\n{{red:%{out}}}",
93
83
 
94
- metadata_validation_cause: "Invalid Script API metadata.",
95
- metadata_validation_help: "Ensure the 'shopify/scripts-toolchain-as' package is up to date.",
84
+ metadata_validation_cause: "The Script API metadata is incorrect.",
85
+ metadata_validation_help: "The 'schemaVersions.major' field contains an unsupported version.",
96
86
 
97
87
  metadata_schema_versions_missing: "Invalid Script metadata:" \
98
88
  " 'schemaVersions' field is missing",
@@ -107,7 +97,6 @@ module Script
107
97
  metadata_not_found_help: "Ensure the 'shopify/scripts-toolchain-as' package is up to date and " \
108
98
  "'package.json' contains a 'scripts/build' entry with a " \
109
99
  "'--metadata build/metadata.json' argument",
110
- app_not_installed_cause: "App not installed on store.",
111
100
 
112
101
  build_error_cause: "Something went wrong while building the script.",
113
102
  build_error_help: "Correct the errors and try again.",
@@ -126,9 +115,6 @@ module Script
126
115
  script_repush_cause: "A version of this script already exists on the app.",
127
116
  script_repush_help: "Use {{cyan:--force}} to replace the existing script.",
128
117
 
129
- shop_auth_cause: "Unable to authenticate with the store.",
130
- shop_auth_help: "Try again.",
131
-
132
118
  invalid_build_script: "The root package.json contains an invalid build command that " \
133
119
  "is needed to compile your script to WebAssembly.",
134
120
  build_script_not_found: "The root package.json is missing the build command that " \
@@ -148,6 +134,12 @@ module Script
148
134
 
149
135
  script_upload_cause: "Fail to upload script.",
150
136
  script_upload_help: "Try again.",
137
+
138
+ api_library_not_found_cause: "Script can't be created because API library %{library_name} is missing from the dependencies",
139
+ api_library_not_found_help: "This error can occur because the API library was removed from your system or there is a problem with dependencies in the repository.",
140
+
141
+ language_library_for_api_not_found_cause: "Script can’t be pushed because the %{language} library for API %{api} is missing.",
142
+ language_library_for_api_not_found_help: "Make sure extension_point.yml contains the correct API library.",
151
143
  },
152
144
 
153
145
  create: {
@@ -156,8 +148,7 @@ module Script
156
148
  Usage: {{command:%1$s script create}}
157
149
  Options:
158
150
  {{command:--name=NAME}} Script project name. Use any string.
159
- {{command:--extension-point=TYPE}} Script API name. Allowed values: %2$s.
160
- {{command:--no-config-ui}} Specify this option when you don’t want your script to render an interface in Shopify admin.
151
+ {{command:--api=TYPE}} Script API name. Allowed values: %2$s.
161
152
  HELP
162
153
 
163
154
  error: {
@@ -206,10 +197,6 @@ module Script
206
197
  built: "Built",
207
198
  pushing: "Pushing",
208
199
  pushed: "Pushed",
209
- disabling: "Disabling",
210
- disabled: "Disabled",
211
- enabling: "Enabling",
212
- enabled: "Enabled",
213
200
  ensure_env: {
214
201
  organization: "Partner organization {{green:%s (%s)}}.",
215
202
  organization_select: "Which partner organization do you want to use?",
@@ -44,15 +44,6 @@ module Script
44
44
  cause_of_error: ShopifyCLI::Context.message("script.error.invalid_context_cause"),
45
45
  help_suggestion: ShopifyCLI::Context.message("script.error.invalid_context_help"),
46
46
  }
47
- when Errors::InvalidConfigProps
48
- {
49
- cause_of_error: ShopifyCLI::Context.message("script.error.invalid_config_props_cause"),
50
- help_suggestion: ShopifyCLI::Context.message("script.error.invalid_config_props_help"),
51
- }
52
- when Errors::InvalidConfigYAMLError
53
- {
54
- cause_of_error: ShopifyCLI::Context.message("script.error.invalid_config", e.config_file),
55
- }
56
47
  when Layers::Infrastructure::Errors::InvalidLanguageError
57
48
  {
58
49
  cause_of_error: ShopifyCLI::Context.message("script.error.invalid_language_cause", e.language),
@@ -76,14 +67,6 @@ module Script
76
67
  cause_of_error: ShopifyCLI::Context.message("script.error.no_existing_orgs_cause"),
77
68
  help_suggestion: ShopifyCLI::Context.message("script.error.no_existing_orgs_help"),
78
69
  }
79
- when Errors::NoExistingStoresError
80
- {
81
- cause_of_error: ShopifyCLI::Context.message("script.error.no_existing_stores_cause"),
82
- help_suggestion: ShopifyCLI::Context.message(
83
- "script.error.no_existing_stores_help",
84
- organization_id: e.organization_id
85
- ),
86
- }
87
70
  when Layers::Infrastructure::Errors::ScriptProjectAlreadyExistsError
88
71
  {
89
72
  cause_of_error: ShopifyCLI::Context.message("script.error.project_exists_cause"),
@@ -135,10 +118,6 @@ module Script
135
118
  cause_of_error: ShopifyCLI::Context.message("script.error.no_script_json_file_cause"),
136
119
  help_suggestion: ShopifyCLI::Context.message("script.error.no_script_json_file_help"),
137
120
  }
138
- when Layers::Infrastructure::Errors::AppNotInstalledError
139
- {
140
- cause_of_error: ShopifyCLI::Context.message("script.error.app_not_installed_cause"),
141
- }
142
121
  when Layers::Infrastructure::Errors::BuildError
143
122
  {
144
123
  cause_of_error: ShopifyCLI::Context.message("script.error.build_error_cause"),
@@ -217,11 +196,6 @@ module Script
217
196
  cause_of_error: ShopifyCLI::Context.message("script.error.script_repush_cause"),
218
197
  help_suggestion: ShopifyCLI::Context.message("script.error.script_repush_help"),
219
198
  }
220
- when Layers::Infrastructure::Errors::ShopAuthenticationError
221
- {
222
- cause_of_error: ShopifyCLI::Context.message("script.error.shop_auth_cause"),
223
- help_suggestion: ShopifyCLI::Context.message("script.error.shop_auth_help"),
224
- }
225
199
  when Layers::Infrastructure::Errors::BuildScriptNotFoundError
226
200
  {
227
201
  cause_of_error: ShopifyCLI::Context.message("script.error.build_script_not_found"),
@@ -250,6 +224,22 @@ module Script
250
224
  cause_of_error: ShopifyCLI::Context.message("script.error.script_upload_cause"),
251
225
  help_suggestion: ShopifyCLI::Context.message("script.error.script_upload_help"),
252
226
  }
227
+ when Layers::Infrastructure::Errors::APILibraryNotFoundError
228
+ {
229
+ cause_of_error: ShopifyCLI::Context
230
+ .message("script.error.api_library_not_found_cause", library_name: e.library_name),
231
+ help_suggestion: ShopifyCLI::Context.message("script.error.api_library_not_found_help"),
232
+ }
233
+ when Layers::Infrastructure::Errors::LanguageLibraryForAPINotFoundError
234
+ {
235
+ cause_of_error: ShopifyCLI::Context
236
+ .message(
237
+ "script.error.language_library_for_api_not_found_cause",
238
+ language: e.language,
239
+ api: e.api
240
+ ),
241
+ help_suggestion: ShopifyCLI::Context.message("script.error.language_library_for_api_not_found_help"),
242
+ }
253
243
  end
254
244
  end
255
245
  end
@@ -5,7 +5,7 @@ module Theme
5
5
  register_messages(Theme::Messages::MESSAGES)
6
6
  end
7
7
 
8
- class Command < ShopifyCLI::ProjectCommands
8
+ class Command < ShopifyCLI::Command::ProjectCommand
9
9
  subcommand :Init, "init", Project.project_filepath("commands/init")
10
10
  subcommand :Serve, "serve", Project.project_filepath("commands/serve")
11
11
  subcommand :Pull, "pull", Project.project_filepath("commands/pull")
@@ -3,7 +3,7 @@ require "theme_check"
3
3
 
4
4
  module Theme
5
5
  class Command
6
- class Check < ShopifyCLI::SubCommand
6
+ class Check < ShopifyCLI::Command::SubCommand
7
7
  class Options < ShopifyCLI::Options
8
8
  def initialize(theme_check)
9
9
  super()
@@ -4,7 +4,7 @@ require "shopify_cli/theme/development_theme"
4
4
 
5
5
  module Theme
6
6
  class Command
7
- class Delete < ShopifyCLI::SubCommand
7
+ class Delete < ShopifyCLI::Command::SubCommand
8
8
  options do |parser, flags|
9
9
  parser.on("-d", "--development") { flags[:development] = true }
10
10
  parser.on("-a", "--show-all") { flags[:show_all] = true }
@@ -2,7 +2,7 @@
2
2
 
3
3
  module Theme
4
4
  class Command
5
- class Init < ShopifyCLI::SubCommand
5
+ class Init < ShopifyCLI::Command::SubCommand
6
6
  options do |parser, flags|
7
7
  parser.on("-u", "--clone-url URL") { |url| flags[:clone_url] = url }
8
8
  end
@@ -3,7 +3,7 @@ require "theme_check"
3
3
 
4
4
  module Theme
5
5
  class Command
6
- class LanguageServer < ShopifyCLI::SubCommand
6
+ class LanguageServer < ShopifyCLI::Command::SubCommand
7
7
  def call(*)
8
8
  ThemeCheck::LanguageServer.start
9
9
  end
@@ -4,7 +4,7 @@ require "json"
4
4
 
5
5
  module Theme
6
6
  class Command
7
- class Package < ShopifyCLI::SubCommand
7
+ class Package < ShopifyCLI::Command::SubCommand
8
8
  THEME_DIRECTORIES = %w[
9
9
  assets
10
10
  config
@@ -3,7 +3,7 @@ require "shopify_cli/theme/theme"
3
3
 
4
4
  module Theme
5
5
  class Command
6
- class Publish < ShopifyCLI::SubCommand
6
+ class Publish < ShopifyCLI::Command::SubCommand
7
7
  options do |parser, flags|
8
8
  parser.on("-f", "--force") { flags[:force] = true }
9
9
  end
@@ -5,7 +5,7 @@ require "shopify_cli/theme/syncer"
5
5
 
6
6
  module Theme
7
7
  class Command
8
- class Pull < ShopifyCLI::SubCommand
8
+ class Pull < ShopifyCLI::Command::SubCommand
9
9
  options do |parser, flags|
10
10
  parser.on("-n", "--nodelete") { flags[:nodelete] = true }
11
11
  parser.on("-i", "--themeid=ID") { |theme_id| flags[:theme_id] = theme_id }
@@ -6,7 +6,7 @@ require "shopify_cli/theme/syncer"
6
6
 
7
7
  module Theme
8
8
  class Command
9
- class Push < ShopifyCLI::SubCommand
9
+ class Push < ShopifyCLI::Command::SubCommand
10
10
  options do |parser, flags|
11
11
  parser.on("-n", "--nodelete") { flags[:nodelete] = true }
12
12
  parser.on("-i", "--themeid=ID") { |theme_id| flags[:theme_id] = theme_id }
@@ -3,16 +3,24 @@ require "shopify_cli/theme/dev_server"
3
3
 
4
4
  module Theme
5
5
  class Command
6
- class Serve < ShopifyCLI::SubCommand
6
+ class Serve < ShopifyCLI::Command::SubCommand
7
+ DEFAULT_HTTP_HOST = "127.0.0.1"
8
+
7
9
  options do |parser, flags|
10
+ parser.on("--host=HOST") { |host| flags[:host] = host.to_s }
8
11
  parser.on("--port=PORT") { |port| flags[:port] = port.to_i }
12
+ parser.on("--poll") { flags[:poll] = true }
9
13
  end
10
14
 
11
15
  def call(*)
12
16
  flags = options.flags.dup
13
- ShopifyCLI::Theme::DevServer.start(@ctx, ".", **flags) do |syncer|
17
+ host = flags[:host] || DEFAULT_HTTP_HOST
18
+ ShopifyCLI::Theme::DevServer.start(@ctx, ".", http_bind: host, **flags) do |syncer|
14
19
  UI::SyncProgressBar.new(syncer).progress(:upload_theme!, delay_low_priority_files: true)
15
20
  end
21
+ rescue ShopifyCLI::Theme::DevServer::AddressBindingError
22
+ raise ShopifyCLI::Abort,
23
+ ShopifyCLI::Context.message("theme.serve.error.address_binding_error", ShopifyCLI::TOOL_NAME)
16
24
  end
17
25
 
18
26
  def self.help