shopify-cli 2.1.0 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE.md +0 -4
  3. data/CHANGELOG.md +24 -0
  4. data/Gemfile.lock +4 -4
  5. data/lib/graphql/get_variant_id.graphql +16 -0
  6. data/lib/project_types/extension/cli.rb +9 -1
  7. data/lib/project_types/extension/commands/push.rb +0 -1
  8. data/lib/project_types/extension/commands/serve.rb +8 -2
  9. data/lib/project_types/extension/extension_project.rb +21 -1
  10. data/lib/project_types/extension/features/argo.rb +1 -11
  11. data/lib/project_types/extension/features/argo_runtime.rb +6 -38
  12. data/lib/project_types/extension/features/argo_serve.rb +30 -1
  13. data/lib/project_types/extension/features/runtimes/admin.rb +29 -0
  14. data/lib/project_types/extension/features/runtimes/base.rb +19 -0
  15. data/lib/project_types/extension/features/runtimes/checkout_post_purchase.rb +23 -0
  16. data/lib/project_types/extension/features/runtimes/checkout_ui_extension.rb +29 -0
  17. data/lib/project_types/extension/messages/messages.rb +9 -0
  18. data/lib/project_types/extension/models/product.rb +12 -0
  19. data/lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb +10 -0
  20. data/lib/project_types/extension/models/specification_handlers/checkout_ui_extension.rb +11 -3
  21. data/lib/project_types/extension/models/specification_handlers/default.rb +13 -4
  22. data/lib/project_types/extension/models/specification_handlers/theme_app_extension.rb +12 -0
  23. data/lib/project_types/extension/tasks/configure_features.rb +1 -0
  24. data/lib/project_types/extension/tasks/converters/product_converter.rb +21 -0
  25. data/lib/project_types/extension/tasks/get_product.rb +22 -0
  26. data/lib/project_types/script/commands/create.rb +1 -1
  27. data/lib/project_types/script/graphql/app_script_set.graphql +40 -0
  28. data/lib/project_types/script/graphql/app_script_update_or_create.graphql +0 -44
  29. data/lib/project_types/script/graphql/module_upload_url_generate.graphql +9 -0
  30. data/lib/project_types/script/layers/domain/push_package.rb +1 -2
  31. data/lib/project_types/script/layers/infrastructure/errors.rb +2 -0
  32. data/lib/project_types/script/layers/infrastructure/push_package_repository.rb +0 -1
  33. data/lib/project_types/script/layers/infrastructure/script_service.rb +95 -45
  34. data/lib/project_types/script/messages/messages.rb +3 -0
  35. data/lib/project_types/script/ui/error_handler.rb +5 -0
  36. data/lib/project_types/theme/commands/pull.rb +6 -0
  37. data/lib/project_types/theme/commands/push.rb +6 -0
  38. data/lib/project_types/theme/forms/select.rb +1 -1
  39. data/lib/shopify-cli/core/monorail.rb +2 -1
  40. data/lib/shopify-cli/process_supervision.rb +14 -14
  41. data/lib/shopify-cli/theme/dev_server/header_hash.rb +4 -0
  42. data/lib/shopify-cli/theme/dev_server/proxy.rb +13 -1
  43. data/lib/shopify-cli/theme/file.rb +11 -3
  44. data/lib/shopify-cli/theme/ignore_filter.rb +7 -0
  45. data/lib/shopify-cli/theme/syncer.rb +1 -1
  46. data/lib/shopify-cli/version.rb +1 -1
  47. data/shopify-cli.gemspec +1 -1
  48. metadata +14 -4
@@ -141,6 +141,9 @@ module Script
141
141
  web_assembly_binary_not_found_suggestion: "No WebAssembly binary found." \
142
142
  "Check that your build npm script outputs the generated binary to the root of the directory." \
143
143
  "Generated binary should match the script name: <script_name>.wasm",
144
+
145
+ script_upload_cause: "Fail to upload script.",
146
+ script_upload_help: "Try again.",
144
147
  },
145
148
 
146
149
  create: {
@@ -237,6 +237,11 @@ module Script
237
237
  cause_of_error: ShopifyCli::Context.message("script.error.web_assembly_binary_not_found"),
238
238
  help_suggestion: ShopifyCli::Context.message("script.error.web_assembly_binary_not_found_suggestion"),
239
239
  }
240
+ when Layers::Infrastructure::Errors::ScriptUploadError
241
+ {
242
+ cause_of_error: ShopifyCli::Context.message("script.error.script_upload_cause"),
243
+ help_suggestion: ShopifyCli::Context.message("script.error.script_upload_help"),
244
+ }
240
245
  end
241
246
  end
242
247
  end
@@ -9,6 +9,10 @@ module Theme
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 }
12
+ parser.on("-x", "--ignore=PATTERN") do |pattern|
13
+ flags[:ignores] ||= []
14
+ flags[:ignores] << pattern
15
+ end
12
16
  end
13
17
 
14
18
  def call(args, _name)
@@ -29,6 +33,8 @@ module Theme
29
33
  end
30
34
 
31
35
  ignore_filter = ShopifyCli::Theme::IgnoreFilter.from_path(root)
36
+ ignore_filter.add_patterns(options.flags[:ignores]) if options.flags[:ignores]
37
+
32
38
  syncer = ShopifyCli::Theme::Syncer.new(@ctx, theme: theme, ignore_filter: ignore_filter)
33
39
  begin
34
40
  syncer.start_threads
@@ -15,6 +15,10 @@ module Theme
15
15
  parser.on("-j", "--json") { flags[:json] = true }
16
16
  parser.on("-a", "--allow-live") { flags[:allow_live] = true }
17
17
  parser.on("-p", "--publish") { flags[:publish] = true }
18
+ parser.on("-x", "--ignore=PATTERN") do |pattern|
19
+ flags[:ignores] ||= []
20
+ flags[:ignores] << pattern
21
+ end
18
22
  end
19
23
 
20
24
  def call(args, _name)
@@ -48,6 +52,8 @@ module Theme
48
52
  end
49
53
 
50
54
  ignore_filter = ShopifyCli::Theme::IgnoreFilter.from_path(root)
55
+ ignore_filter.add_patterns(options.flags[:ignores]) if options.flags[:ignores]
56
+
51
57
  syncer = ShopifyCli::Theme::Syncer.new(@ctx, theme: theme, ignore_filter: ignore_filter)
52
58
  begin
53
59
  syncer.start_threads
@@ -43,7 +43,7 @@ module Theme
43
43
  when "development"
44
44
  "blue"
45
45
  else
46
- "grey"
46
+ "italic"
47
47
  end
48
48
 
49
49
  tags = ["{{#{color}:[#{theme.role}]}}"]
@@ -46,7 +46,7 @@ module ShopifyCli
46
46
 
47
47
  # we only want to send Monorail events in production or when explicitly developing
48
48
  def enabled?
49
- Context.new.system? || ENV["MONORAIL_REAL_EVENTS"] == "1"
49
+ (Context.new.system? || ENV["MONORAIL_REAL_EVENTS"] == "1") && !Context.new.ci?
50
50
  end
51
51
 
52
52
  def consented?
@@ -54,6 +54,7 @@ module ShopifyCli
54
54
  end
55
55
 
56
56
  def prompt_for_consent
57
+ return if Context.new.ci?
57
58
  return unless enabled?
58
59
  return if ShopifyCli::Config.get_section("analytics").key?("enabled")
59
60
  msg = Context.message("core.monorail.consent_prompt")
@@ -59,10 +59,20 @@ module ShopifyCli
59
59
  def start(identifier, args)
60
60
  return for_ident(identifier) if running?(identifier)
61
61
 
62
- # Windows doesn't support forking process without extra gems, so we resort to spawning a new child process -
63
- # that means that it dies along with the original process if it is interrupted. On UNIX, we fork the process so
64
- # that it doesn't have to be restarted on every run.
65
- if Context.new.windows?
62
+ # Some systems don't support forking process without extra gems, so we resort to spawning a new child process -
63
+ # that means that it dies along with the original process if it is interrupted. If possible, we fork the process
64
+ # so that it doesn't have to be restarted on every run.
65
+ if Process.respond_to?(:fork)
66
+ fork do
67
+ pid_file = new(identifier, pid: Process.pid)
68
+ pid_file.write
69
+ STDOUT.reopen(pid_file.log_path, "w")
70
+ STDERR.reopen(pid_file.log_path, "w")
71
+ STDIN.reopen("/dev/null", "r")
72
+ Process.setsid
73
+ exec(*args)
74
+ end
75
+ else
66
76
  pid_file = new(identifier)
67
77
 
68
78
  # Make sure the file exists and is empty, otherwise Windows fails
@@ -77,16 +87,6 @@ module ShopifyCli
77
87
  pid_file.write
78
88
 
79
89
  Process.detach(pid)
80
- else
81
- fork do
82
- pid_file = new(identifier, pid: Process.pid)
83
- pid_file.write
84
- STDOUT.reopen(pid_file.log_path, "w")
85
- STDERR.reopen(pid_file.log_path, "w")
86
- STDIN.reopen("/dev/null", "r")
87
- Process.setsid
88
- exec(*args)
89
- end
90
90
  end
91
91
 
92
92
  sleep(0.1)
@@ -47,6 +47,10 @@ module ShopifyCli
47
47
  super(k) || super(@names[k.downcase])
48
48
  end
49
49
 
50
+ def fetch(k, default = nil)
51
+ self[k] || super(@names[k.downcase], default)
52
+ end
53
+
50
54
  def []=(k, v)
51
55
  canonical = k.downcase.freeze
52
56
  # .delete is expensive, don't invoke it unless necessary
@@ -155,11 +155,16 @@ module ShopifyCli
155
155
  Time.now - @last_session_cookie_refresh >= SESSION_COOKIE_MAX_AGE
156
156
  end
157
157
 
158
+ def extract_secure_session_id_from_response_headers(headers)
159
+ return unless headers["set-cookie"]
160
+ headers["set-cookie"][SESSION_COOKIE_REGEXP, 1]
161
+ end
162
+
158
163
  def secure_session_id
159
164
  if secure_session_id_expired?
160
165
  @ctx.debug("Refreshing preview _secure_session_id cookie")
161
166
  response = request("HEAD", "/", query: { preview_theme_id: @theme.id })
162
- @secure_session_id = response["set-cookie"][SESSION_COOKIE_REGEXP, 1]
167
+ @secure_session_id = extract_secure_session_id_from_response_headers(response)
163
168
  @last_session_cookie_refresh = Time.now
164
169
  end
165
170
 
@@ -179,6 +184,13 @@ module ShopifyCli
179
184
  response_headers["location"].gsub!(%r{(https://#{@theme.shop})}, "http://127.0.0.1:9292")
180
185
  end
181
186
 
187
+ new_session_id = extract_secure_session_id_from_response_headers(response_headers)
188
+ if new_session_id
189
+ @ctx.debug("New _secure_session_id cookie from response")
190
+ @secure_session_id = new_session_id
191
+ @last_session_cookie_refresh = Time.now
192
+ end
193
+
182
194
  response_headers
183
195
  end
184
196
 
@@ -17,12 +17,20 @@ module ShopifyCli
17
17
  end
18
18
 
19
19
  def read
20
- path.read
20
+ if text?
21
+ path.read
22
+ else
23
+ path.read(mode: "rb")
24
+ end
21
25
  end
22
26
 
23
- def write(*args)
27
+ def write(content)
24
28
  path.parent.mkpath unless path.parent.directory?
25
- path.write(*args)
29
+ if text?
30
+ path.write(content)
31
+ else
32
+ path.write(content, 0, mode: "wb")
33
+ end
26
34
  end
27
35
 
28
36
  def delete
@@ -59,6 +59,13 @@ module ShopifyCli
59
59
  @globs = globs
60
60
  end
61
61
 
62
+ def add_patterns(patterns)
63
+ regexes, globs = patterns_to_regexes_and_globs(patterns)
64
+
65
+ @regexes += regexes
66
+ @globs += globs
67
+ end
68
+
62
69
  def match?(path)
63
70
  path = path.to_s
64
71
 
@@ -256,7 +256,7 @@ module ShopifyCli
256
256
 
257
257
  attachment = body.dig("asset", "attachment")
258
258
  value = if attachment
259
- file.write(Base64.decode64(attachment), 0, mode: "wb")
259
+ file.write(Base64.decode64(attachment))
260
260
  else
261
261
  file.write(body.dig("asset", "value"))
262
262
  end
@@ -1,3 +1,3 @@
1
1
  module ShopifyCli
2
- VERSION = "2.1.0"
2
+ VERSION = "2.3.0"
3
3
  end
data/shopify-cli.gemspec CHANGED
@@ -44,5 +44,5 @@ Gem::Specification.new do |spec|
44
44
  spec.add_development_dependency("minitest", "~> 5.0")
45
45
 
46
46
  spec.add_dependency("listen", "~> 3.5")
47
- spec.add_dependency("theme-check", "~> 1.1")
47
+ spec.add_dependency("theme-check", "~> 1.2")
48
48
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: shopify-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.0
4
+ version: 2.3.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-07-12 00:00:00.000000000 Z
11
+ date: 2021-08-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -78,14 +78,14 @@ dependencies:
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: '1.1'
81
+ version: '1.2'
82
82
  type: :runtime
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: '1.1'
88
+ version: '1.2'
89
89
  description: |
90
90
  Shopify CLI helps you build Shopify apps faster. It quickly scaffolds Node.js
91
91
  and Ruby on Rails embedded apps. It also automates many common tasks in the
@@ -159,6 +159,7 @@ files:
159
159
  - lib/graphql/find_organization.graphql
160
160
  - lib/graphql/get_app_by_api_key.graphql
161
161
  - lib/graphql/get_app_urls.graphql
162
+ - lib/graphql/get_variant_id.graphql
162
163
  - lib/graphql/update_dashboard_urls.graphql
163
164
  - lib/project_types/extension/cli.rb
164
165
  - lib/project_types/extension/commands/build.rb
@@ -182,6 +183,10 @@ files:
182
183
  - lib/project_types/extension/features/argo_setup.rb
183
184
  - lib/project_types/extension/features/argo_setup_step.rb
184
185
  - lib/project_types/extension/features/argo_setup_steps.rb
186
+ - lib/project_types/extension/features/runtimes/admin.rb
187
+ - lib/project_types/extension/features/runtimes/base.rb
188
+ - lib/project_types/extension/features/runtimes/checkout_post_purchase.rb
189
+ - lib/project_types/extension/features/runtimes/checkout_ui_extension.rb
185
190
  - lib/project_types/extension/forms/connect.rb
186
191
  - lib/project_types/extension/forms/create.rb
187
192
  - lib/project_types/extension/forms/questions/ask_app.rb
@@ -193,6 +198,7 @@ files:
193
198
  - lib/project_types/extension/models/app.rb
194
199
  - lib/project_types/extension/models/lazy_specification_handler.rb
195
200
  - lib/project_types/extension/models/npm_package.rb
201
+ - lib/project_types/extension/models/product.rb
196
202
  - lib/project_types/extension/models/registration.rb
197
203
  - lib/project_types/extension/models/specification.rb
198
204
  - lib/project_types/extension/models/specification_handlers/checkout_post_purchase.rb
@@ -206,6 +212,7 @@ files:
206
212
  - lib/project_types/extension/tasks/configure_features.rb
207
213
  - lib/project_types/extension/tasks/configure_options.rb
208
214
  - lib/project_types/extension/tasks/converters/app_converter.rb
215
+ - lib/project_types/extension/tasks/converters/product_converter.rb
209
216
  - lib/project_types/extension/tasks/converters/registration_converter.rb
210
217
  - lib/project_types/extension/tasks/converters/validation_error_converter.rb
211
218
  - lib/project_types/extension/tasks/converters/version_converter.rb
@@ -215,6 +222,7 @@ files:
215
222
  - lib/project_types/extension/tasks/get_app.rb
216
223
  - lib/project_types/extension/tasks/get_apps.rb
217
224
  - lib/project_types/extension/tasks/get_extensions.rb
225
+ - lib/project_types/extension/tasks/get_product.rb
218
226
  - lib/project_types/extension/tasks/update_draft.rb
219
227
  - lib/project_types/extension/tasks/user_errors.rb
220
228
  - lib/project_types/node/cli.rb
@@ -248,8 +256,10 @@ files:
248
256
  - lib/project_types/script/config/extension_points.yml
249
257
  - lib/project_types/script/errors.rb
250
258
  - lib/project_types/script/forms/create.rb
259
+ - lib/project_types/script/graphql/app_script_set.graphql
251
260
  - lib/project_types/script/graphql/app_script_update_or_create.graphql
252
261
  - lib/project_types/script/graphql/get_app_scripts.graphql
262
+ - lib/project_types/script/graphql/module_upload_url_generate.graphql
253
263
  - lib/project_types/script/graphql/script_service_proxy.graphql
254
264
  - lib/project_types/script/layers/application/build_script.rb
255
265
  - lib/project_types/script/layers/application/create_script.rb