shopify-cli 2.28.0 → 2.29.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e9563000eff4fb285eefdc448c66f51c45cb40b7119870a17994d87e0c037160
4
- data.tar.gz: 6cb8dbe46c0b825679e8a301206869d6cd523c4881235e220d966a753f477d5e
3
+ metadata.gz: 5f07c45a6fc9d6b93d9f2826a7ad9eb139842d8b7f35717ca5fb17291285c330
4
+ data.tar.gz: 774e222e76f9a8d30b68e8b0756ed4cecbc8281d302d94c131d072c123b19f8c
5
5
  SHA512:
6
- metadata.gz: 6f67ca0fc39a81731a425e5e7a8bd848d50f7ed698b31f6529b18af0365ab7ca2a8072cada700b0e98028c0d42b3b3cbfcae7108bc30a038d265f85d18b06ed8
7
- data.tar.gz: afc2b9be9d9b59eca388fe71946ed696ed1e7faf28833468217f0933af1f4fac9ea9f08613cf08ec2b379886b06702641703790762323b8f58e5a40fccff1cb1
6
+ metadata.gz: eab29689be4de3a23b0b9dd14401a130d6f37cc1064c02f16bbce0656d378d487666bd964dfa673b8fcc48344b01acf8d10899e4fb3755c7f5f46c5dd8c46385
7
+ data.tar.gz: 01d9830606768a70de1de312527875d997dce26f1913c44fd6ffd82407afc7962931fe38dd7568e49c899438e33bf3f1b465b6b5d73bb0585d25643c0d26d5a2
data/CHANGELOG.md CHANGED
@@ -2,6 +2,11 @@ From version 2.6.0, the sections in this file adhere to the [keep a changelog](h
2
2
 
3
3
  ## [Unreleased]
4
4
 
5
+ ## Version 2.29.0 - 2022-10-19
6
+
7
+ ### Added
8
+ * [#2664](https://github.com/Shopify/shopify-cli/pull/2664): Enable Theme Kit Access passwords
9
+
5
10
  ## Version 2.28.0 - 2022-10-17
6
11
 
7
12
  ### Fixed
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- shopify-cli (2.28.0)
4
+ shopify-cli (2.29.0)
5
5
  bugsnag (~> 6.22)
6
6
  listen (~> 3.7.0)
7
7
  theme-check (~> 1.11.0)
@@ -5,7 +5,7 @@ module Theme
5
5
  module Common
6
6
  module ShopHelper
7
7
  def shop
8
- ShopifyCLI::AdminAPI.get_shop_or_abort(@ctx)
8
+ ShopifyCLI::Theme::ThemeAdminAPI.new(@ctx).get_shop_or_abort
9
9
  end
10
10
  end
11
11
  end
@@ -59,7 +59,8 @@ module ShopifyCLI
59
59
 
60
60
  # Monorail
61
61
  MONORAIL_REAL_EVENTS = "MONORAIL_REAL_EVENTS"
62
- STORE = "SHOPIFY_CLI_STORE"
62
+
63
+ STORE = "SHOPIFY_SHOP"
63
64
  end
64
65
 
65
66
  module SupportedVersions
@@ -10,6 +10,8 @@ module ShopifyCLI
10
10
  Constants::EnvironmentVariables::SPIN_NAMESPACE,
11
11
  Constants::EnvironmentVariables::SPIN_HOST,
12
12
  ]
13
+ # https://github.com/Shopify/themekit-access/blob/4c3c917d78443160dcf24376a8b5ac6b9bef0bcd/app/models/password_token.rb#L8
14
+ THEME_ACCESS_PASSWORD_PREFIX = "shptka_"
13
15
 
14
16
  def self.ruby_version(context: Context.new)
15
17
  output, status = context.capture2e("ruby", "--version")
@@ -188,5 +190,9 @@ module ShopifyCLI
188
190
  env_variables: env_variables
189
191
  )
190
192
  end
193
+
194
+ def self.theme_access_password?
195
+ admin_auth_token&.start_with?(THEME_ACCESS_PASSWORD_PREFIX)
196
+ end
191
197
  end
192
198
  end
@@ -541,6 +541,9 @@ module ShopifyCLI
541
541
  forbidden: <<~FORBIDDEN,
542
542
  Command not allowed with current login. Please check your login details with {{command:%s whoami}}. You may need to request additional permissions for this action.
543
543
  FORBIDDEN
544
+ theme_access_invalid_password: "Invalid password. Please check that it was generated from Theme Access app"\
545
+ " for the current store.",
546
+ theme_access_no_store: "No store found. Please pass it through the environment variable SHOPIFY_SHOP",
544
547
  internal_server_error: "{{red:{{x}} An unexpected error occurred on Shopify.}}",
545
548
  internal_server_error_debug: "\n{{red:Response details:}}\n%s\n\n",
546
549
  invalid_url: "Invalid URL: %s",
@@ -69,11 +69,15 @@ module ShopifyCLI
69
69
  # Checksums of assets with errors.
70
70
  @error_checksums = []
71
71
 
72
+ # Do not use the throttler when --stable is passed or a Theme Access password is set
73
+ # (Theme Access API is not compatible yet with bulks)
74
+ throttler_enabled = !stable && !Environment.theme_access_password?
75
+
72
76
  # Initialize `api_client` on main thread
73
77
  @api_client = ThemeAdminAPIThrottler.new(
74
78
  @ctx,
75
79
  ThemeAdminAPI.new(@ctx, @theme.shop),
76
- !stable
80
+ throttler_enabled
77
81
  )
78
82
  end
79
83
 
@@ -0,0 +1,89 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "shopify_cli"
4
+
5
+ module ShopifyCLI
6
+ module Theme
7
+ ##
8
+ # ShopifyCLI::ThemeAccessAPI is a wrapper to use Shopify Theme Access API, which allows using passwords
9
+ # generated from Shopify Theme Access app to access the Shopify Admin API (for theme operations)
10
+ #
11
+ class ThemeAccessAPI < API
12
+ BASE_URL = "theme-kit-access.shopifyapps.com"
13
+
14
+ class << self
15
+ ##
16
+ # #### Parameters
17
+ # - `ctx`: running context from your command
18
+ # - `shop`: shop domain string for shop whose admin you are calling
19
+ # - `path`: path string (excluding prefixes and API version) for specific JSON that you are requesting
20
+ # ex. "data.json" instead of "/admin/api/unstable/data.json"
21
+ # - `body`: data string for corresponding REST request types
22
+ # - `method`: REST request string for the type of request; if nil, will perform GET request
23
+ # - `api_version`: an api version string to specify version. Default value: unstable
24
+ #
25
+ # #### Raises
26
+ #
27
+ # * http 404 will raise a ShopifyCLI::API::APIRequestNotFoundError
28
+ # * http 400..499 will raise a ShopifyCLI::API::APIRequestClientError
29
+ # * http 500..599 will raise a ShopifyCLI::API::APIRequestServerError
30
+ # * All other codes will raise ShopifyCLI::API::APIRequestUnexpectedError
31
+ #
32
+ # #### Returns
33
+ #
34
+ # * `resp` - JSON response array
35
+ #
36
+ # #### Example
37
+ #
38
+ # ThemeAccessAPI.rest_request(@ctx, shop: 'shop.myshopify.com', path: 'data.json')
39
+ #
40
+ def rest_request(ctx, shop:, path:, query: nil, body: nil, method: "GET", api_version: "unstable")
41
+ client = api_client(ctx, api_version, shop, path: path)
42
+ url = build_url(api_version, path, query)
43
+ client.request(url: url, body: body, headers: headers(shop), method: method)
44
+ rescue ShopifyCLI::API::APIRequestForbiddenError,
45
+ ShopifyCLI::API::APIRequestUnauthorizedError
46
+ ctx.abort(ctx.message("core.api.error.theme_access_invalid_password"))
47
+ end
48
+
49
+ def get_shop_or_abort(ctx)
50
+ env_store = Environment.store
51
+ return env_store unless env_store.nil?
52
+ ctx.abort(
53
+ ctx.message("core.api.error.theme_access_no_store")
54
+ )
55
+ end
56
+
57
+ private
58
+
59
+ def build_url(api_version, path, query = nil)
60
+ URI::HTTPS.build(
61
+ host: BASE_URL,
62
+ path: "/cli/admin/api/#{api_version}/#{path}",
63
+ query: query
64
+ ).to_s
65
+ end
66
+
67
+ def api_client(ctx, api_version, _shop, path: "graphql.json")
68
+ new(
69
+ ctx: ctx,
70
+ token: Environment.admin_auth_token,
71
+ url: build_url(api_version, path),
72
+ )
73
+ end
74
+
75
+ def headers(shop)
76
+ {
77
+ "X-Shopify-Shop" => shop,
78
+ }
79
+ end
80
+ end
81
+
82
+ def auth_headers(token)
83
+ {
84
+ "X-Shopify-Access-Token" => token,
85
+ }
86
+ end
87
+ end
88
+ end
89
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require_relative "theme_access_api"
4
+
3
5
  module ShopifyCLI
4
6
  module Theme
5
7
  class ThemeAdminAPI
@@ -29,11 +31,11 @@ module ShopifyCLI
29
31
  end
30
32
 
31
33
  def get_shop_or_abort # rubocop:disable Naming/AccessorMethodName
32
- ShopifyCLI::AdminAPI.get_shop_or_abort(@ctx)
34
+ api_client.get_shop_or_abort(@ctx)
33
35
  end
34
36
 
35
37
  def rest_request(**args)
36
- status, body, response = ShopifyCLI::AdminAPI.rest_request(
38
+ status, body, response = api_client.rest_request(
37
39
  @ctx,
38
40
  shop: @shop,
39
41
  api_version: API_VERSION,
@@ -67,6 +69,10 @@ module ShopifyCLI
67
69
 
68
70
  private
69
71
 
72
+ def api_client
73
+ @api_client ||= Environment.theme_access_password? ? ThemeAccessAPI : ShopifyCLI::AdminAPI
74
+ end
75
+
70
76
  def permission_error
71
77
  ensure_user_error = @ctx.message("theme.ensure_user_error", shop)
72
78
  ensure_user_try_this = @ctx.message("theme.ensure_user_try_this")
@@ -1,3 +1,3 @@
1
1
  module ShopifyCLI
2
- VERSION = "2.28.0"
2
+ VERSION = "2.29.0"
3
3
  end
data/lib/shopify_cli.rb CHANGED
@@ -97,18 +97,18 @@ module ShopifyCLI
97
97
  )
98
98
  end
99
99
 
100
- autoload :AppTypeDetector, "shopify_cli/app_type_detector"
101
- autoload :Constants, "shopify_cli/constants"
102
- autoload :Environment, "shopify_cli/environment"
103
100
  autoload :AdminAPI, "shopify_cli/admin_api"
104
101
  autoload :API, "shopify_cli/api"
102
+ autoload :AppTypeDetector, "shopify_cli/app_type_detector"
105
103
  autoload :Command, "shopify_cli/command"
106
104
  autoload :CommandOptions, "shopify_cli/command_options"
107
105
  autoload :Commands, "shopify_cli/commands"
108
106
  autoload :Connect, "shopify_cli/connect"
107
+ autoload :Constants, "shopify_cli/constants"
109
108
  autoload :Context, "shopify_cli/context"
110
109
  autoload :Core, "shopify_cli/core"
111
110
  autoload :DB, "shopify_cli/db"
111
+ autoload :Environment, "shopify_cli/environment"
112
112
  autoload :Feature, "shopify_cli/feature"
113
113
  autoload :Form, "shopify_cli/form"
114
114
  autoload :Git, "shopify_cli/git"
@@ -118,11 +118,11 @@ module ShopifyCLI
118
118
  autoload :IdentityAuth, "shopify_cli/identity_auth"
119
119
  autoload :JsDeps, "shopify_cli/js_deps"
120
120
  autoload :JsSystem, "shopify_cli/js_system"
121
- autoload :PHPDeps, "shopify_cli/php_deps"
122
121
  autoload :LazyDelegator, "shopify_cli/lazy_delegator"
123
122
  autoload :MethodObject, "shopify_cli/method_object"
124
123
  autoload :Options, "shopify_cli/options"
125
124
  autoload :PartnersAPI, "shopify_cli/partners_api"
125
+ autoload :PHPDeps, "shopify_cli/php_deps"
126
126
  autoload :ProcessSupervision, "shopify_cli/process_supervision"
127
127
  autoload :Project, "shopify_cli/project"
128
128
  autoload :ProjectType, "shopify_cli/project_type"
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.28.0
4
+ version: 2.29.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Shopify
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-10-17 00:00:00.000000000 Z
11
+ date: 2022-10-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -517,6 +517,7 @@ files:
517
517
  - lib/shopify_cli/theme/syncer/standard_reporter.rb
518
518
  - lib/shopify_cli/theme/syncer/unsupported_script_warning.rb
519
519
  - lib/shopify_cli/theme/theme.rb
520
+ - lib/shopify_cli/theme/theme_access_api.rb
520
521
  - lib/shopify_cli/theme/theme_admin_api.rb
521
522
  - lib/shopify_cli/theme/theme_admin_api_throttler.rb
522
523
  - lib/shopify_cli/theme/theme_admin_api_throttler/bulk.rb