shopify-cli 2.10.0 → 2.11.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (90) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug_report.yaml +117 -0
  3. data/.github/ISSUE_TEMPLATE/enhancement.yaml +38 -0
  4. data/.github/ISSUE_TEMPLATE/feature.yaml +47 -0
  5. data/.github/ISSUE_TEMPLATE.md +18 -0
  6. data/CHANGELOG.md +35 -3
  7. data/Gemfile.lock +1 -1
  8. data/dev.yml +3 -0
  9. data/lib/project_types/extension/commands/build.rb +3 -0
  10. data/lib/project_types/extension/commands/check.rb +3 -0
  11. data/lib/project_types/extension/commands/create.rb +3 -0
  12. data/lib/project_types/extension/commands/push.rb +16 -0
  13. data/lib/project_types/extension/commands/serve.rb +3 -0
  14. data/lib/project_types/extension/loaders/project.rb +28 -8
  15. data/lib/project_types/extension/messages/messages.rb +10 -2
  16. data/lib/project_types/extension/models/specification_handlers/default.rb +1 -1
  17. data/lib/project_types/extension/tasks/convert_server_config.rb +3 -1
  18. data/lib/project_types/script/cli.rb +5 -0
  19. data/lib/project_types/script/commands/connect.rb +3 -1
  20. data/lib/project_types/script/commands/create.rb +2 -0
  21. data/lib/project_types/script/commands/push.rb +6 -0
  22. data/lib/project_types/script/config/extension_points.yml +12 -0
  23. data/lib/project_types/script/graphql/app_script_set.graphql +2 -0
  24. data/lib/project_types/script/graphql/module_upload_url_generate.graphql +5 -1
  25. data/lib/project_types/script/layers/application/build_script.rb +6 -3
  26. data/lib/project_types/script/layers/application/create_script.rb +1 -1
  27. data/lib/project_types/script/layers/application/project_dependencies.rb +1 -1
  28. data/lib/project_types/script/layers/application/push_script.rb +39 -31
  29. data/lib/project_types/script/layers/domain/errors.rb +7 -1
  30. data/lib/project_types/script/layers/domain/extension_point.rb +2 -2
  31. data/lib/project_types/script/layers/domain/push_package.rb +0 -3
  32. data/lib/project_types/script/layers/domain/script_project.rb +1 -0
  33. data/lib/project_types/script/layers/infrastructure/errors.rb +13 -3
  34. data/lib/project_types/script/layers/infrastructure/languages/assemblyscript_task_runner.rb +3 -20
  35. data/lib/project_types/script/layers/infrastructure/languages/project_creator.rb +1 -0
  36. data/lib/project_types/script/layers/infrastructure/languages/task_runner.rb +35 -8
  37. data/lib/project_types/script/layers/infrastructure/languages/typescript_task_runner.rb +3 -20
  38. data/lib/project_types/script/layers/infrastructure/languages/wasm_project_creator.rb +15 -0
  39. data/lib/project_types/script/layers/infrastructure/languages/wasm_task_runner.rb +32 -0
  40. data/lib/project_types/script/layers/infrastructure/metadata_repository.rb +18 -0
  41. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +7 -8
  42. data/lib/project_types/script/layers/infrastructure/script_project_repository.rb +17 -26
  43. data/lib/project_types/script/layers/infrastructure/script_service.rb +15 -9
  44. data/lib/project_types/script/layers/infrastructure/script_uploader.rb +22 -9
  45. data/lib/project_types/script/loaders/project.rb +2 -1
  46. data/lib/project_types/script/messages/messages.rb +92 -84
  47. data/lib/project_types/script/ui/error_handler.rb +39 -14
  48. data/lib/project_types/theme/commands/check.rb +2 -0
  49. data/lib/project_types/theme/commands/delete.rb +2 -0
  50. data/lib/project_types/theme/commands/init.rb +2 -0
  51. data/lib/project_types/theme/commands/language_server.rb +2 -0
  52. data/lib/project_types/theme/commands/package.rb +2 -0
  53. data/lib/project_types/theme/commands/publish.rb +2 -0
  54. data/lib/project_types/theme/commands/pull.rb +6 -1
  55. data/lib/project_types/theme/commands/push.rb +6 -1
  56. data/lib/project_types/theme/commands/serve.rb +2 -0
  57. data/lib/shopify_cli/command/sub_command.rb +2 -0
  58. data/lib/shopify_cli/command.rb +72 -0
  59. data/lib/shopify_cli/commands/app/create/node.rb +3 -0
  60. data/lib/shopify_cli/commands/app/create/rails.rb +3 -0
  61. data/lib/shopify_cli/commands/app/deploy.rb +2 -0
  62. data/lib/shopify_cli/commands/app/serve.rb +2 -0
  63. data/lib/shopify_cli/constants.rb +13 -1
  64. data/lib/shopify_cli/environment.rb +55 -35
  65. data/lib/shopify_cli/exception_reporter.rb +9 -0
  66. data/lib/shopify_cli/github/issue_url_generator.rb +19 -8
  67. data/lib/shopify_cli/identity_auth/env_auth_token.rb +34 -0
  68. data/lib/shopify_cli/identity_auth.rb +33 -15
  69. data/lib/shopify_cli/messages/messages.rb +2 -1
  70. data/lib/shopify_cli/partners_api.rb +7 -2
  71. data/lib/shopify_cli/services/app/create/rails_service.rb +37 -13
  72. data/lib/shopify_cli/theme/dev_server/cdn_fonts.rb +28 -8
  73. data/lib/shopify_cli/theme/dev_server/hot_reload/remote_file_reloader.rb +63 -0
  74. data/lib/shopify_cli/theme/dev_server/hot_reload.rb +22 -6
  75. data/lib/shopify_cli/theme/dev_server/local_assets.rb +0 -4
  76. data/lib/shopify_cli/theme/dev_server/proxy.rb +4 -5
  77. data/lib/shopify_cli/theme/dev_server.rb +0 -2
  78. data/lib/shopify_cli/theme/file.rb +4 -0
  79. data/lib/shopify_cli/theme/include_filter.rb +39 -17
  80. data/lib/shopify_cli/utilities.rb +7 -0
  81. data/lib/shopify_cli/version.rb +1 -1
  82. data/lib/shopify_cli.rb +1 -0
  83. data/vendor/deps/cli-kit/lib/cli/kit/system.rb +11 -6
  84. data/vendor/deps/cli-kit/lib/cli/kit/util.rb +5 -1
  85. data/vendor/deps/cli-ui/lib/cli/ui/os.rb +6 -4
  86. data/vendor/lib/semantic/version.rb +0 -1
  87. metadata +11 -5
  88. data/lib/project_types/rails/commands/create.rb +0 -210
  89. data/lib/shopify_cli/theme/dev_server/cdn/cdn_helper.rb +0 -49
  90. data/lib/shopify_cli/theme/dev_server/cdn_assets.rb +0 -69
@@ -3,7 +3,7 @@ module Script
3
3
  module Application
4
4
  class ProjectDependencies
5
5
  def self.install(ctx:, task_runner:)
6
- CLI::UI::Frame.open(ctx.message("script.project_deps.checking_with_npm")) do
6
+ CLI::UI::Frame.open(ctx.message("script.project_deps.checking")) do
7
7
  begin
8
8
  if task_runner.dependencies_installed?
9
9
  ctx.puts(ctx.message("script.project_deps.none_required"))
@@ -10,48 +10,56 @@ module Script
10
10
  script_project = script_project_repo.get
11
11
  script_project.env = project.env
12
12
  task_runner = Infrastructure::Languages::TaskRunner
13
- .for(ctx, script_project.language, script_project.script_name)
13
+ .for(ctx, script_project.language)
14
14
 
15
15
  extension_point = ExtensionPoints.get(type: script_project.extension_point_type)
16
- library_name = extension_point.libraries.for(script_project.language)&.package
16
+
17
+ library = extension_point.libraries.for(script_project.language)
18
+
17
19
  raise Infrastructure::Errors::LanguageLibraryForAPINotFoundError.new(
18
20
  language: script_project.language,
19
21
  api: script_project.extension_point_type
20
- ) unless library_name
22
+ ) if library.nil? && (script_project.language != "wasm")
21
23
 
22
- library = {
24
+ library_name = library&.package
25
+ library_data = {
23
26
  language: script_project.language,
24
27
  version: task_runner.library_version(library_name),
25
- }
28
+ } if library_name
26
29
 
27
30
  ProjectDependencies.install(ctx: ctx, task_runner: task_runner)
28
- BuildScript.call(ctx: ctx, task_runner: task_runner, script_project: script_project, library: library)
29
-
30
- UI::PrintingSpinner.spin(ctx, ctx.message("script.application.pushing")) do |p_ctx, spinner|
31
- package = Infrastructure::PushPackageRepository.new(ctx: p_ctx).get_push_package(
32
- script_project: script_project,
33
- compiled_type: task_runner.compiled_type,
34
- metadata: task_runner.metadata,
35
- library: library,
36
- )
37
- script_service = Infrastructure::ServiceLocator.script_service(
38
- ctx: p_ctx,
39
- api_key: script_project.api_key
40
- )
41
- module_upload_url = Infrastructure::ScriptUploader.new(script_service).upload(package.script_content)
42
- uuid = script_service.set_app_script(
43
- uuid: package.uuid,
44
- extension_point_type: package.extension_point_type,
45
- force: force,
46
- metadata: package.metadata,
47
- script_config: package.script_config,
48
- module_upload_url: module_upload_url,
49
- library: package.library,
50
- )
51
- if ShopifyCLI::Environment.interactive?
52
- script_project_repo.update_env(uuid: uuid)
31
+ BuildScript.call(ctx: ctx, task_runner: task_runner, script_project: script_project, library: library_data)
32
+
33
+ metadata_file_location = task_runner.metadata_file_location
34
+ metadata = Infrastructure::MetadataRepository.new(ctx: ctx).get_metadata(metadata_file_location)
35
+
36
+ CLI::UI::Frame.open(ctx.message("script.application.pushing")) do
37
+ UI::PrintingSpinner.spin(ctx, ctx.message("script.application.pushing_script")) do |p_ctx, spinner|
38
+ package = Infrastructure::PushPackageRepository.new(ctx: p_ctx).get_push_package(
39
+ script_project: script_project,
40
+ metadata: metadata,
41
+ library: library_data,
42
+ )
43
+ script_service = Infrastructure::ServiceLocator.script_service(
44
+ ctx: p_ctx,
45
+ api_key: script_project.api_key
46
+ )
47
+ module_upload_url = Infrastructure::ScriptUploader.new(script_service).upload(package.script_content)
48
+ uuid = script_service.set_app_script(
49
+ uuid: package.uuid,
50
+ extension_point_type: package.extension_point_type,
51
+ force: force,
52
+ metadata: package.metadata,
53
+ script_config: package.script_config,
54
+ module_upload_url: module_upload_url,
55
+ library: package.library,
56
+ input_query: script_project.input_query,
57
+ )
58
+ if ShopifyCLI::Environment.interactive?
59
+ script_project_repo.update_env(uuid: uuid)
60
+ end
61
+ spinner.update_title(p_ctx.message("script.application.pushed"))
53
62
  end
54
- spinner.update_title(p_ctx.message("script.application.pushed"))
55
63
  end
56
64
  end
57
65
  end
@@ -32,7 +32,13 @@ module Script
32
32
  end
33
33
  end
34
34
 
35
- class MetadataNotFoundError < ScriptProjectError; end
35
+ class MetadataNotFoundError < ScriptProjectError
36
+ attr_reader :filename
37
+ def initialize(filename)
38
+ super()
39
+ @filename = filename
40
+ end
41
+ end
36
42
 
37
43
  class MetadataValidationError < ScriptProjectError; end
38
44
  end
@@ -42,8 +42,8 @@ module Script
42
42
  end
43
43
 
44
44
  def all
45
- @all ||= @config.map do |language, libray_config|
46
- ExtensionPointLibrary.new(language, libray_config)
45
+ @all ||= @config.map do |language, library_config|
46
+ ExtensionPointLibrary.new(language, library_config)
47
47
  end
48
48
  end
49
49
 
@@ -9,7 +9,6 @@ module Script
9
9
  :extension_point_type,
10
10
  :script_config,
11
11
  :script_content,
12
- :compiled_type,
13
12
  :metadata,
14
13
  :library
15
14
 
@@ -18,7 +17,6 @@ module Script
18
17
  uuid:,
19
18
  extension_point_type:,
20
19
  script_content:,
21
- compiled_type: nil,
22
20
  metadata:,
23
21
  script_config:,
24
22
  library:
@@ -27,7 +25,6 @@ module Script
27
25
  @uuid = uuid
28
26
  @extension_point_type = extension_point_type
29
27
  @script_content = script_content
30
- @compiled_type = compiled_type
31
28
  @metadata = metadata
32
29
  @script_config = script_config
33
30
  @library = library
@@ -16,6 +16,7 @@ module Script
16
16
  property! :language, accepts: String
17
17
 
18
18
  property :script_config, accepts: ScriptConfig
19
+ property :input_query, accepts: String
19
20
 
20
21
  def initialize(*)
21
22
  super
@@ -7,10 +7,11 @@ module Script
7
7
  class BuildError < ScriptProjectError; end
8
8
 
9
9
  class ScriptConfigurationDefinitionError < ScriptProjectError
10
- attr_reader :filename
11
- def initialize(message:, filename:)
10
+ attr_reader :filename, :messages
11
+ def initialize(messages:, filename:)
12
+ super()
13
+ @messages = messages
12
14
  @filename = filename
13
- super(message)
14
15
  end
15
16
  end
16
17
 
@@ -159,6 +160,15 @@ module Script
159
160
  class ScriptUploadError < ScriptProjectError; end
160
161
  class ProjectConfigNotFoundError < ScriptProjectError; end
161
162
  class InvalidProjectConfigError < ScriptProjectError; end
163
+
164
+ class ScriptTooLargeError < ScriptProjectError
165
+ attr_reader :max_size
166
+
167
+ def initialize(max_size)
168
+ super()
169
+ @max_size = max_size
170
+ end
171
+ end
162
172
  end
163
173
  end
164
174
  end
@@ -4,27 +4,16 @@ module Script
4
4
  module Layers
5
5
  module Infrastructure
6
6
  module Languages
7
- class AssemblyScriptTaskRunner
7
+ class AssemblyScriptTaskRunner < TaskRunner
8
8
  BYTECODE_FILE = "build/script.wasm"
9
9
  METADATA_FILE = "build/metadata.json"
10
10
  SCRIPT_SDK_BUILD = "npm run build"
11
11
 
12
- attr_reader :ctx, :script_name
13
-
14
- def initialize(ctx, script_name)
15
- @ctx = ctx
16
- @script_name = script_name
17
- end
18
-
19
12
  def build
20
13
  compile
21
14
  bytecode
22
15
  end
23
16
 
24
- def compiled_type
25
- "wasm"
26
- end
27
-
28
17
  def install_dependencies
29
18
  check_node_version!
30
19
 
@@ -37,14 +26,8 @@ module Script
37
26
  ctx.dir_exist?("node_modules")
38
27
  end
39
28
 
40
- def metadata
41
- unless @ctx.file_exist?(METADATA_FILE)
42
- msg = @ctx.message("script.error.metadata_not_found_cause", METADATA_FILE)
43
- raise Domain::Errors::MetadataNotFoundError, msg
44
- end
45
-
46
- raw_contents = File.read(METADATA_FILE)
47
- Domain::Metadata.create_from_json(@ctx, raw_contents)
29
+ def metadata_file_location
30
+ METADATA_FILE
48
31
  end
49
32
 
50
33
  def library_version(library_name)
@@ -28,6 +28,7 @@ module Script
28
28
  project_creators = {
29
29
  "assemblyscript" => AssemblyScriptProjectCreator,
30
30
  "typescript" => TypeScriptProjectCreator,
31
+ "wasm" => WasmProjectCreator,
31
32
  }
32
33
 
33
34
  raise Errors::ProjectCreatorNotFoundError unless project_creators[language]
@@ -5,14 +5,41 @@ module Script
5
5
  module Infrastructure
6
6
  module Languages
7
7
  class TaskRunner
8
- TASK_RUNNERS = {
9
- "assemblyscript" => AssemblyScriptTaskRunner,
10
- "typescript" => TypeScriptTaskRunner,
11
- }
12
-
13
- def self.for(ctx, language, script_name)
14
- raise Errors::TaskRunnerNotFoundError unless TASK_RUNNERS[language]
15
- TASK_RUNNERS[language].new(ctx, script_name)
8
+ attr_reader :ctx
9
+
10
+ def self.for(ctx, language)
11
+ task_runners = {
12
+ "assemblyscript" => AssemblyScriptTaskRunner,
13
+ "typescript" => TypeScriptTaskRunner,
14
+ "wasm" => WasmTaskRunner,
15
+ }
16
+
17
+ raise Errors::TaskRunnerNotFoundError unless task_runners[language]
18
+ task_runners[language].new(ctx)
19
+ end
20
+
21
+ def initialize(ctx)
22
+ @ctx = ctx
23
+ end
24
+
25
+ def build
26
+ raise NotImplementedError
27
+ end
28
+
29
+ def dependencies_installed?
30
+ raise NotImplementedError
31
+ end
32
+
33
+ def install_dependencies
34
+ raise NotImplementedError
35
+ end
36
+
37
+ def metadata_file_location
38
+ raise NotImplementedError
39
+ end
40
+
41
+ def library_version(_library_name)
42
+ raise NotImplementedError
16
43
  end
17
44
  end
18
45
  end
@@ -4,28 +4,17 @@ module Script
4
4
  module Layers
5
5
  module Infrastructure
6
6
  module Languages
7
- class TypeScriptTaskRunner
7
+ class TypeScriptTaskRunner < TaskRunner
8
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"
12
12
 
13
- attr_reader :ctx, :script_name
14
-
15
- def initialize(ctx, script_name)
16
- @ctx = ctx
17
- @script_name = script_name
18
- end
19
-
20
13
  def build
21
14
  compile
22
15
  bytecode
23
16
  end
24
17
 
25
- def compiled_type
26
- "wasm"
27
- end
28
-
29
18
  def install_dependencies
30
19
  check_node_version!
31
20
 
@@ -38,14 +27,8 @@ module Script
38
27
  ctx.dir_exist?("node_modules")
39
28
  end
40
29
 
41
- def metadata
42
- unless @ctx.file_exist?(METADATA_FILE)
43
- msg = @ctx.message("script.error.metadata_not_found_cause", METADATA_FILE)
44
- raise Domain::Errors::MetadataNotFoundError, msg
45
- end
46
-
47
- raw_contents = File.read(METADATA_FILE)
48
- Domain::Metadata.create_from_json(@ctx, raw_contents)
30
+ def metadata_file_location
31
+ METADATA_FILE
49
32
  end
50
33
 
51
34
  def library_version(library_name)
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Script
4
+ module Layers
5
+ module Infrastructure
6
+ module Languages
7
+ class WasmProjectCreator < ProjectCreator
8
+ def self.config_file
9
+ "script.config.yml"
10
+ end
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,32 @@
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 = "script.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
@@ -0,0 +1,18 @@
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
@@ -7,8 +7,8 @@ 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:, library:)
11
- build_file_path = file_path(script_project.id, compiled_type)
10
+ def create_push_package(script_project:, script_content:, metadata:, library:)
11
+ build_file_path = file_path(script_project.id)
12
12
  write_to_path(build_file_path, script_content)
13
13
 
14
14
  Domain::PushPackage.new(
@@ -16,16 +16,15 @@ module Script
16
16
  uuid: script_project.uuid,
17
17
  extension_point_type: script_project.extension_point_type,
18
18
  script_content: script_content,
19
- compiled_type: compiled_type,
20
19
  metadata: metadata,
21
20
  script_config: script_project.script_config,
22
21
  library: library
23
22
  )
24
23
  end
25
24
 
26
- def get_push_package(script_project:, compiled_type:, metadata:, library:)
27
- build_file_path = file_path(script_project.id, compiled_type)
28
- raise Domain::PushPackageNotFoundError unless ctx.file_exist?(build_file_path)
25
+ def get_push_package(script_project:, metadata:, library:)
26
+ build_file_path = file_path(script_project.id)
27
+ raise Domain::Errors::PushPackageNotFoundError unless ctx.file_exist?(build_file_path)
29
28
 
30
29
  script_content = ctx.binread(build_file_path)
31
30
  Domain::PushPackage.new(
@@ -46,8 +45,8 @@ module Script
46
45
  ctx.binwrite(path, content)
47
46
  end
48
47
 
49
- def file_path(path_to_script, compiled_type)
50
- "#{path_to_script}/build/script.#{compiled_type}"
48
+ def file_path(path_to_script)
49
+ "#{path_to_script}/build/script.wasm"
51
50
  end
52
51
  end
53
52
  end
@@ -10,6 +10,7 @@ module Script
10
10
  property :initial_directory, accepts: String
11
11
 
12
12
  MUTABLE_ENV_VALUES = %i(uuid)
13
+ INPUT_QUERY_PATH = "input.graphql"
13
14
 
14
15
  def create_project_directory
15
16
  raise Infrastructure::Errors::ScriptProjectAlreadyExistsError, directory if ctx.dir_exist?(directory)
@@ -38,13 +39,7 @@ module Script
38
39
  language: language
39
40
  )
40
41
 
41
- Domain::ScriptProject.new(
42
- id: ctx.root,
43
- env: project.env,
44
- script_name: script_name,
45
- extension_point_type: extension_point_type,
46
- language: language
47
- )
42
+ build_script_project(script_config: nil)
48
43
  end
49
44
 
50
45
  def get
@@ -56,7 +51,8 @@ module Script
56
51
  script_name: script_name,
57
52
  extension_point_type: extension_point_type,
58
53
  language: language,
59
- script_config: script_config_repository.get!
54
+ script_config: script_config_repository.get!,
55
+ input_query: read_input_query,
60
56
  )
61
57
  end
62
58
 
@@ -68,14 +64,7 @@ module Script
68
64
  end
69
65
  end
70
66
 
71
- Domain::ScriptProject.new(
72
- id: ctx.root,
73
- env: project.env,
74
- script_name: script_name,
75
- extension_point_type: extension_point_type,
76
- language: language,
77
- script_config: script_config_repository.get!,
78
- )
67
+ build_script_project
79
68
  end
80
69
 
81
70
  def create_env(api_key:, secret:, uuid:)
@@ -87,19 +76,19 @@ module Script
87
76
  }
88
77
  ).write(ctx)
89
78
 
90
- Domain::ScriptProject.new(
91
- id: ctx.root,
92
- env: project.env,
93
- script_name: script_name,
94
- extension_point_type: extension_point_type,
95
- language: language,
96
- script_config: script_config_repository.get!,
97
- )
79
+ build_script_project
98
80
  end
99
81
 
100
82
  def update_script_config(title:)
101
83
  script_config = script_config_repository.update!(title: title)
84
+ build_script_project(script_config: script_config)
85
+ end
86
+
87
+ private
102
88
 
89
+ def build_script_project(
90
+ script_config: script_config_repository.get!
91
+ )
103
92
  Domain::ScriptProject.new(
104
93
  id: ctx.root,
105
94
  env: project.env,
@@ -110,8 +99,6 @@ module Script
110
99
  )
111
100
  end
112
101
 
113
- private
114
-
115
102
  def change_directory(directory:)
116
103
  ctx.chdir(directory)
117
104
  end
@@ -173,6 +160,10 @@ module Script
173
160
  end
174
161
  end
175
162
 
163
+ def read_input_query
164
+ ctx.read(INPUT_QUERY_PATH) if ctx.file_exist?(INPUT_QUERY_PATH)
165
+ end
166
+
176
167
  class ScriptConfigRepository
177
168
  include SmartProperties
178
169
  property! :ctx, accepts: ShopifyCLI::Context
@@ -19,7 +19,8 @@ module Script
19
19
  metadata:,
20
20
  script_config:,
21
21
  module_upload_url:,
22
- library:
22
+ library:,
23
+ input_query: nil
23
24
  )
24
25
  query_name = "app_script_set"
25
26
  variables = {
@@ -34,11 +35,14 @@ module Script
34
35
  configurationUi: script_config.configuration_ui,
35
36
  configurationDefinition: script_config.configuration&.to_json,
36
37
  moduleUploadUrl: module_upload_url,
37
- library: {
38
- language: library[:language],
39
- version: library[:version],
40
- },
38
+ inputQuery: input_query,
41
39
  }
40
+
41
+ variables[:library] = {
42
+ language: library[:language],
43
+ version: library[:version],
44
+ } if library
45
+
42
46
  resp_hash = make_request(query_name: query_name, variables: variables)
43
47
  user_errors = resp_hash["data"]["appScriptSet"]["userErrors"]
44
48
 
@@ -46,9 +50,9 @@ module Script
46
50
 
47
51
  if user_errors.any? { |e| e["tag"] == "already_exists_error" }
48
52
  raise Errors::ScriptRepushError, uuid
49
- elsif (e = user_errors.find { |err| err["tag"] == "configuration_definition_error" })
53
+ elsif (errors = user_errors.select { |err| err["tag"] == "configuration_definition_error" }).any?
50
54
  raise Errors::ScriptConfigurationDefinitionError.new(
51
- message: e["message"],
55
+ messages: errors.map { |e| e["message"] },
52
56
  filename: script_config.filename,
53
57
  )
54
58
  elsif (e = user_errors.any? { |err| err["tag"] == "configuration_definition_syntax_error" })
@@ -91,14 +95,16 @@ module Script
91
95
  response["data"]["appScripts"]
92
96
  end
93
97
 
94
- def generate_module_upload_url
98
+ def generate_module_upload_details
95
99
  query_name = "module_upload_url_generate"
96
100
  variables = {}
97
101
  response = make_request(query_name: query_name, variables: variables)
98
102
  user_errors = response["data"]["moduleUploadUrlGenerate"]["userErrors"]
99
103
 
100
104
  raise Errors::GraphqlError, user_errors if user_errors.any?
101
- response["data"]["moduleUploadUrlGenerate"]["url"]
105
+
106
+ data = response["data"]["moduleUploadUrlGenerate"]["details"]
107
+ { url: data["url"], headers: data["headers"], max_size: data["humanizedMaxSize"] }
102
108
  end
103
109
 
104
110
  private
@@ -7,19 +7,32 @@ module Script
7
7
  end
8
8
 
9
9
  def upload(script_content)
10
- @script_service.generate_module_upload_url.tap do |url|
11
- url = URI(url)
10
+ upload_details = @script_service.generate_module_upload_details
11
+ url = URI(upload_details[:url])
12
12
 
13
- https = Net::HTTP.new(url.host, url.port)
14
- https.use_ssl = true
13
+ https = Net::HTTP.new(url.host, url.port)
14
+ https.use_ssl = true
15
15
 
16
- request = Net::HTTP::Put.new(url)
17
- request["Content-Type"] = "application/wasm"
18
- request.body = script_content
16
+ request = Net::HTTP::Put.new(url)
17
+ request["Content-Type"] = "application/wasm"
19
18
 
20
- response = https.request(request)
21
- raise Errors::ScriptUploadError unless response.code == "200"
19
+ upload_details[:headers].each do |header, value|
20
+ request[header] = value
22
21
  end
22
+
23
+ request.body = script_content
24
+
25
+ response = https.request(request)
26
+ raise Errors::ScriptTooLargeError, upload_details[:max_size] if script_too_large?(response)
27
+ raise Errors::ScriptUploadError unless response.code == "200"
28
+
29
+ upload_details[:url]
30
+ end
31
+
32
+ private
33
+
34
+ def script_too_large?(response)
35
+ response.code == "400" && response.body.include?("EntityTooLarge")
23
36
  end
24
37
  end
25
38
  end
@@ -32,7 +32,8 @@ module Script
32
32
  else
33
33
  properties_hash = { api_key: "--api-key", secret: "--api-secret" }
34
34
  missing_options = error.properties.map { |p| properties_hash[p.name] }.compact.join(", ")
35
- raise ShopifyCLI::Abort, context.message("script.error.missing_push_options", missing_options)
35
+ raise ShopifyCLI::Abort, context.message("script.error.missing_push_options", missing_options,
36
+ ShopifyCli::TOOL_NAME)
36
37
  end
37
38
  end
38
39