shopify_app 21.0.0 → 22.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (164) hide show
  1. checksums.yaml +4 -4
  2. data/.github/CODEOWNERS +1 -0
  3. data/.github/ISSUE_TEMPLATE/ENHANCEMENT.md +9 -0
  4. data/.github/ISSUE_TEMPLATE/bug-report.md +30 -47
  5. data/.github/ISSUE_TEMPLATE/feature-request.md +5 -29
  6. data/.github/workflows/build.yml +11 -12
  7. data/.github/workflows/release.yml +2 -2
  8. data/.github/workflows/remove-labels-on-activity.yml +1 -1
  9. data/.github/workflows/rubocop.yml +2 -3
  10. data/.nvmrc +1 -1
  11. data/.rubocop.yml +2 -1
  12. data/.ruby-version +1 -1
  13. data/.spin/rails/prepare-application +8 -0
  14. data/CHANGELOG.md +173 -7
  15. data/CODE_OF_CONDUCT.md +46 -0
  16. data/CONTRIBUTING.md +16 -6
  17. data/Gemfile +1 -0
  18. data/Gemfile.lock +160 -121
  19. data/README.md +67 -19
  20. data/SECURITY.md +1 -1
  21. data/app/assets/javascripts/shopify_app/redirect.js +3 -10
  22. data/app/controllers/concerns/shopify_app/ensure_authenticated_links.rb +9 -4
  23. data/app/controllers/concerns/shopify_app/ensure_has_session.rb +25 -0
  24. data/app/controllers/concerns/shopify_app/ensure_installed.rb +84 -0
  25. data/app/controllers/concerns/shopify_app/shop_access_scopes_verification.rb +5 -1
  26. data/app/controllers/shopify_app/authenticated_controller.rb +1 -1
  27. data/app/controllers/shopify_app/callback_controller.rb +101 -39
  28. data/app/controllers/shopify_app/extension_verification_controller.rb +4 -1
  29. data/app/controllers/shopify_app/sessions_controller.rb +37 -7
  30. data/app/controllers/shopify_app/webhooks_controller.rb +1 -1
  31. data/app/views/shopify_app/layouts/app_bridge.html.erb +17 -0
  32. data/app/views/shopify_app/sessions/patch_shopify_id_token.html.erb +0 -0
  33. data/app/views/shopify_app/shared/redirect.html.erb +10 -1
  34. data/config/locales/cs.yml +0 -18
  35. data/config/locales/da.yml +0 -15
  36. data/config/locales/de.yml +0 -17
  37. data/config/locales/en.yml +0 -11
  38. data/config/locales/es.yml +0 -17
  39. data/config/locales/fi.yml +0 -15
  40. data/config/locales/fr.yml +0 -18
  41. data/config/locales/it.yml +0 -16
  42. data/config/locales/ja.yml +0 -12
  43. data/config/locales/ko.yml +0 -14
  44. data/config/locales/nb.yml +0 -16
  45. data/config/locales/nl.yml +0 -16
  46. data/config/locales/pl.yml +0 -16
  47. data/config/locales/pt-BR.yml +0 -16
  48. data/config/locales/pt-PT.yml +0 -17
  49. data/config/locales/sv.yml +0 -16
  50. data/config/locales/th.yml +0 -15
  51. data/config/locales/tr.yml +0 -17
  52. data/config/locales/vi.yml +0 -17
  53. data/config/locales/zh-CN.yml +0 -11
  54. data/config/locales/zh-TW.yml +0 -11
  55. data/config/routes.rb +2 -1
  56. data/docs/Quickstart.md +14 -5
  57. data/docs/Troubleshooting.md +38 -25
  58. data/docs/Upgrading.md +103 -32
  59. data/docs/shopify_app/authentication.md +179 -58
  60. data/docs/shopify_app/controller-concerns.md +89 -0
  61. data/docs/shopify_app/engine.md +2 -11
  62. data/docs/shopify_app/generators.md +2 -2
  63. data/docs/shopify_app/logging.md +21 -0
  64. data/docs/shopify_app/sessions.md +358 -0
  65. data/docs/shopify_app/testing.md +32 -10
  66. data/docs/shopify_app/webhooks.md +97 -7
  67. data/karma.conf.js +6 -4
  68. data/lib/generators/shopify_app/add_after_authenticate_job/add_after_authenticate_job_generator.rb +6 -3
  69. data/lib/generators/shopify_app/add_after_authenticate_job/templates/after_authenticate_job.rb +1 -1
  70. data/lib/generators/shopify_app/add_app_uninstalled_job/add_app_uninstalled_job_generator.rb +15 -0
  71. data/lib/generators/shopify_app/add_app_uninstalled_job/templates/app_uninstalled_job.rb.tt +22 -0
  72. data/lib/generators/shopify_app/add_declarative_webhook/add_declarative_webhook_generator.rb +53 -0
  73. data/lib/generators/shopify_app/add_declarative_webhook/templates/webhook_controller.rb.tt +13 -0
  74. data/lib/generators/shopify_app/add_declarative_webhook/templates/webhook_job.rb.tt +15 -0
  75. data/lib/generators/shopify_app/add_privacy_jobs/add_privacy_jobs_generator.rb +23 -0
  76. data/lib/generators/shopify_app/add_privacy_jobs/templates/customers_data_request_job.rb.tt +22 -0
  77. data/lib/generators/shopify_app/add_privacy_jobs/templates/customers_redact_job.rb.tt +22 -0
  78. data/lib/generators/shopify_app/add_privacy_jobs/templates/shop_redact_job.rb.tt +22 -0
  79. data/lib/generators/shopify_app/add_webhook/add_webhook_generator.rb +8 -3
  80. data/lib/generators/shopify_app/add_webhook/templates/webhook_job.rb.tt +4 -2
  81. data/lib/generators/shopify_app/app_proxy_controller/app_proxy_controller_generator.rb +1 -1
  82. data/lib/generators/shopify_app/authenticated_controller/templates/authenticated_controller.rb +1 -1
  83. data/lib/generators/shopify_app/home_controller/templates/index.html.erb +1 -1
  84. data/lib/generators/shopify_app/home_controller/templates/unauthenticated_home_controller.rb +1 -1
  85. data/lib/generators/shopify_app/install/install_generator.rb +4 -4
  86. data/lib/generators/shopify_app/install/templates/shopify_app.rb.tt +13 -3
  87. data/lib/generators/shopify_app/rotate_shopify_token_job/templates/rotate_shopify_token.rake +1 -1
  88. data/lib/generators/shopify_app/rotate_shopify_token_job/templates/rotate_shopify_token_job.rb +1 -1
  89. data/lib/generators/shopify_app/routes/routes_generator.rb +1 -1
  90. data/lib/generators/shopify_app/shop_model/shop_model_generator.rb +1 -1
  91. data/lib/generators/shopify_app/shop_model/templates/db/migrate/add_shop_access_scopes_column.erb +1 -1
  92. data/lib/generators/shopify_app/shopify_app_generator.rb +2 -0
  93. data/lib/generators/shopify_app/user_model/templates/db/migrate/add_user_access_scopes_column.erb +1 -1
  94. data/lib/generators/shopify_app/user_model/templates/db/migrate/add_user_expires_at_column.erb +5 -0
  95. data/lib/generators/shopify_app/user_model/user_model_generator.rb +21 -1
  96. data/lib/shopify_app/access_scopes/noop_strategy.rb +4 -0
  97. data/lib/shopify_app/access_scopes/user_strategy.rb +9 -2
  98. data/lib/shopify_app/admin_api/with_token_refetch.rb +27 -0
  99. data/lib/shopify_app/auth/post_authenticate_tasks.rb +48 -0
  100. data/lib/shopify_app/auth/token_exchange.rb +73 -0
  101. data/lib/shopify_app/configuration.rb +82 -1
  102. data/lib/shopify_app/controller_concerns/app_proxy_verification.rb +3 -3
  103. data/lib/shopify_app/controller_concerns/csrf_protection.rb +2 -1
  104. data/lib/shopify_app/controller_concerns/embedded_app.rb +42 -3
  105. data/lib/shopify_app/controller_concerns/ensure_billing.rb +28 -12
  106. data/lib/shopify_app/controller_concerns/frame_ancestors.rb +1 -1
  107. data/lib/shopify_app/controller_concerns/localization.rb +11 -8
  108. data/lib/shopify_app/controller_concerns/login_protection.rb +83 -38
  109. data/lib/shopify_app/controller_concerns/payload_verification.rb +1 -1
  110. data/lib/shopify_app/controller_concerns/redirect_for_embedded.rb +15 -3
  111. data/lib/shopify_app/controller_concerns/sanitized_params.rb +5 -0
  112. data/lib/shopify_app/controller_concerns/token_exchange.rb +111 -0
  113. data/lib/shopify_app/controller_concerns/webhook_verification.rb +4 -1
  114. data/lib/shopify_app/controller_concerns/with_shopify_id_token.rb +48 -0
  115. data/lib/shopify_app/engine.rb +7 -8
  116. data/lib/shopify_app/logger.rb +28 -0
  117. data/lib/shopify_app/managers/webhooks_manager.rb +20 -10
  118. data/lib/shopify_app/middleware/jwt_middleware.rb +13 -9
  119. data/lib/shopify_app/session/in_memory_user_session_store.rb +1 -1
  120. data/lib/shopify_app/session/jwt.rb +11 -2
  121. data/lib/shopify_app/session/session_repository.rb +66 -14
  122. data/lib/shopify_app/session/session_storage.rb +2 -2
  123. data/lib/shopify_app/session/shop_session_storage.rb +5 -1
  124. data/lib/shopify_app/session/shop_session_storage_with_scopes.rb +5 -1
  125. data/lib/shopify_app/session/user_session_storage.rb +6 -2
  126. data/lib/shopify_app/session/user_session_storage_with_scopes.rb +27 -2
  127. data/lib/shopify_app/test_helpers/all.rb +1 -0
  128. data/lib/shopify_app/test_helpers/shopify_session_helper.rb +16 -0
  129. data/lib/shopify_app/utils.rb +82 -20
  130. data/lib/shopify_app/version.rb +1 -1
  131. data/lib/shopify_app.rb +12 -3
  132. data/package.json +5 -6
  133. data/service.yml +0 -2
  134. data/shopify_app.gemspec +6 -5
  135. data/translation.yml +1 -0
  136. data/yarn.lock +2139 -3910
  137. metadata +78 -58
  138. data/.github/workflows/stale.yml +0 -31
  139. data/app/assets/images/storage_access.svg +0 -1
  140. data/app/assets/javascripts/shopify_app/app_bridge_3.1.1.js +0 -10
  141. data/app/assets/javascripts/shopify_app/app_bridge_redirect.js +0 -22
  142. data/app/assets/javascripts/shopify_app/app_bridge_utils_3.1.1.js +0 -1
  143. data/app/assets/javascripts/shopify_app/enable_cookies.js +0 -3
  144. data/app/assets/javascripts/shopify_app/itp_helper.js +0 -40
  145. data/app/assets/javascripts/shopify_app/partition_cookies.js +0 -8
  146. data/app/assets/javascripts/shopify_app/post_redirect.js +0 -9
  147. data/app/assets/javascripts/shopify_app/request_storage_access.js +0 -3
  148. data/app/assets/javascripts/shopify_app/storage_access.js +0 -148
  149. data/app/assets/javascripts/shopify_app/storage_access_redirect.js +0 -17
  150. data/app/assets/javascripts/shopify_app/top_level.js +0 -2
  151. data/app/assets/javascripts/shopify_app/top_level_interaction.js +0 -11
  152. data/app/controllers/concerns/shopify_app/authenticated.rb +0 -19
  153. data/app/controllers/concerns/shopify_app/require_known_shop.rb +0 -48
  154. data/app/views/shopify_app/sessions/enable_cookies.html.erb +0 -70
  155. data/app/views/shopify_app/sessions/request_storage_access.html.erb +0 -68
  156. data/app/views/shopify_app/sessions/top_level_interaction.html.erb +0 -63
  157. data/app/views/shopify_app/shared/post_redirect_to_auth_shopify.html.erb +0 -13
  158. data/docs/shopify_app/script-tags.md +0 -28
  159. data/docs/shopify_app/session-repository.md +0 -88
  160. data/lib/generators/shopify_app/add_marketing_activity_extension/add_marketing_activity_extension_generator.rb +0 -41
  161. data/lib/generators/shopify_app/add_marketing_activity_extension/templates/marketing_activities_controller.rb +0 -62
  162. data/lib/shopify_app/controller_concerns/itp.rb +0 -45
  163. data/lib/shopify_app/jobs/scripttags_manager_job.rb +0 -16
  164. data/lib/shopify_app/managers/scripttags_manager.rb +0 -84
@@ -28,6 +28,10 @@ module ShopifyApp
28
28
  construct_session(user)
29
29
  end
30
30
 
31
+ def destroy_by_shopify_user_id(user_id)
32
+ destroy_by(shopify_user_id: user_id)
33
+ end
34
+
31
35
  private
32
36
 
33
37
  def construct_session(user)
@@ -41,13 +45,13 @@ module ShopifyApp
41
45
  email_verified: false,
42
46
  account_owner: false,
43
47
  locale: "",
44
- collaborator: false
48
+ collaborator: false,
45
49
  )
46
50
 
47
51
  ShopifyAPI::Auth::Session.new(
48
52
  shop: user.shopify_domain,
49
53
  access_token: user.shopify_token,
50
- associated_user: associated_user
54
+ associated_user: associated_user,
51
55
  )
52
56
  end
53
57
  end
@@ -15,6 +15,7 @@ module ShopifyApp
15
15
  user.shopify_token = auth_session.access_token
16
16
  user.shopify_domain = auth_session.shop
17
17
  user.access_scopes = auth_session.scope.to_s
18
+ user.expires_at = auth_session.expires
18
19
 
19
20
  user.save!
20
21
  user.id
@@ -30,6 +31,10 @@ module ShopifyApp
30
31
  construct_session(user)
31
32
  end
32
33
 
34
+ def destroy_by_shopify_user_id(user_id)
35
+ destroy_by(shopify_user_id: user_id)
36
+ end
37
+
33
38
  private
34
39
 
35
40
  def construct_session(user)
@@ -43,7 +48,7 @@ module ShopifyApp
43
48
  email_verified: false,
44
49
  account_owner: false,
45
50
  locale: "",
46
- collaborator: false
51
+ collaborator: false,
47
52
  )
48
53
 
49
54
  ShopifyAPI::Auth::Session.new(
@@ -51,7 +56,8 @@ module ShopifyApp
51
56
  access_token: user.shopify_token,
52
57
  scope: user.access_scopes,
53
58
  associated_user_scope: user.access_scopes,
54
- associated_user: associated_user
59
+ associated_user: associated_user,
60
+ expires: user.expires_at,
55
61
  )
56
62
  end
57
63
  end
@@ -67,5 +73,24 @@ module ShopifyApp
67
73
  rescue NotImplementedError, NoMethodError
68
74
  raise NotImplementedError, "#access_scopes= must be defined to hook into stored access scopes"
69
75
  end
76
+
77
+ def expires_at=(expires_at)
78
+ super
79
+ rescue NotImplementedError, NoMethodError
80
+ if ShopifyApp.configuration.check_session_expiry_date
81
+ raise NotImplementedError,
82
+ "#expires_at= must be defined to handle storing the session expiry date"
83
+ end
84
+ end
85
+
86
+ def expires_at
87
+ super
88
+ rescue NotImplementedError, NoMethodError
89
+ if ShopifyApp.configuration.check_session_expiry_date
90
+ raise NotImplementedError, "#expires_at must be defined to check the session expiry date"
91
+ end
92
+
93
+ nil
94
+ end
70
95
  end
71
96
  end
@@ -1,3 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "shopify_app/test_helpers/webhook_verification_helper"
4
+ require "shopify_app/test_helpers/shopify_session_helper"
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyApp
4
+ module TestHelpers
5
+ module ShopifySessionHelper
6
+ def setup_shopify_session(session_id:, shop_domain:)
7
+ ShopifyAPI::Auth::Session.new(id: session_id, shop: shop_domain).tap do |session|
8
+ ShopifyApp::SessionRepository.stubs(:load_session).returns(session)
9
+ ShopifyAPI::Utils::SessionUtils.stubs(:current_session_id).returns(session.id)
10
+ ShopifyAPI::Utils::SessionUtils.stubs(:session_id_from_shopify_id_token).returns(session.id)
11
+ ShopifyAPI::Context.activate_session(session)
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -2,30 +2,92 @@
2
2
 
3
3
  module ShopifyApp
4
4
  module Utils
5
- def self.sanitize_shop_domain(shop_domain)
6
- myshopify_domain = ShopifyApp.configuration.myshopify_domain
7
- name = shop_domain.to_s.downcase.strip
8
- name += ".#{myshopify_domain}" if !name.include?(myshopify_domain.to_s) && !name.include?(".")
9
- name.sub!(%r|https?://|, "")
10
-
11
- u = URI("http://#{name}")
12
- u.host if u.host&.match(/^[a-z0-9][a-z0-9\-]*[a-z0-9]\.#{Regexp.escape(myshopify_domain)}$/)
13
- rescue URI::InvalidURIError
14
- nil
15
- end
5
+ class << self
6
+ TRUSTED_SHOPIFY_DOMAINS = [
7
+ "shopify.com",
8
+ "myshopify.io",
9
+ "myshopify.com",
10
+ "spin.dev",
11
+ ].freeze
12
+
13
+ def sanitize_shop_domain(shop_domain)
14
+ uri = uri_from_shop_domain(shop_domain)
15
+ return nil if uri.nil? || uri.host.nil?
16
+
17
+ trusted_domains.each do |trusted_domain|
18
+ no_shop_name_in_subdomain = uri.host == trusted_domain
19
+ from_trusted_domain = trusted_domain == uri.domain
20
+
21
+ return myshopify_domain_from_unified_admin(uri) if unified_admin?(uri) && from_trusted_domain
22
+ return nil if no_shop_name_in_subdomain || uri.host&.empty?
23
+ return uri.host if from_trusted_domain
24
+ end
25
+ nil
26
+ end
27
+
28
+ def shop_login_url(shop:, host:, return_to:)
29
+ return ShopifyApp.configuration.login_url unless shop
30
+
31
+ url = URI(ShopifyApp.configuration.login_url)
32
+
33
+ url.query = URI.encode_www_form(
34
+ shop: shop,
35
+ host: host,
36
+ return_to: return_to,
37
+ )
38
+
39
+ url.to_s
40
+ end
41
+
42
+ def unified_admin_path(shop)
43
+ spin_env = ENV.fetch("SPIN_FQDN", nil)
44
+ if spin_env
45
+ "https://admin.web.#{spin_env}/store/#{shop}"
46
+ else
47
+ "https://admin.#{unified_admin_domain}/store/#{shop}"
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def myshopify_domain
54
+ ShopifyApp.configuration.myshopify_domain
55
+ end
56
+
57
+ def unified_admin_domain
58
+ ShopifyApp.configuration.unified_admin_domain
59
+ end
60
+
61
+ def trusted_domains
62
+ trusted_domains = TRUSTED_SHOPIFY_DOMAINS.dup
63
+ trusted_domains.append(myshopify_domain).uniq! if myshopify_domain
64
+ trusted_domains
65
+ end
66
+
67
+ def uri_from_shop_domain(shop_domain)
68
+ name = shop_domain.to_s.downcase.strip
69
+ name += ".#{myshopify_domain}" if !name.include?(myshopify_domain.to_s) && !name.include?(".")
70
+ uri = Addressable::URI.parse(name)
71
+
72
+ if uri.scheme.nil?
73
+ name = "https://" + name
74
+ uri = Addressable::URI.parse(name)
75
+ end
16
76
 
17
- def self.shop_login_url(shop:, host:, return_to:)
18
- return ShopifyApp.configuration.login_url unless shop
77
+ uri
78
+ rescue Addressable::URI::InvalidURIError
79
+ nil
80
+ end
19
81
 
20
- url = URI(ShopifyApp.configuration.login_url)
82
+ def unified_admin?(uri)
83
+ uri.host.split(".").first == "admin"
84
+ end
21
85
 
22
- url.query = URI.encode_www_form(
23
- shop: shop,
24
- host: host,
25
- return_to: return_to,
26
- )
86
+ def myshopify_domain_from_unified_admin(uri)
87
+ shop = uri.path.split("/").last
27
88
 
28
- url.to_s
89
+ "#{shop}.myshopify.com"
90
+ end
29
91
  end
30
92
  end
31
93
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ShopifyApp
4
- VERSION = "21.0.0"
4
+ VERSION = "22.5.0"
5
5
  end
data/lib/shopify_app.rb CHANGED
@@ -5,6 +5,7 @@ require "shopify_app/version"
5
5
  # deps
6
6
  require "shopify_api"
7
7
  require "redirect_safely"
8
+ require "addressable"
8
9
 
9
10
  module ShopifyApp
10
11
  def self.rails6?
@@ -37,11 +38,15 @@ module ShopifyApp
37
38
  # errors
38
39
  require "shopify_app/errors"
39
40
 
41
+ require "shopify_app/logger"
42
+
43
+ # Admin API helpers
44
+ require "shopify_app/admin_api/with_token_refetch"
45
+
40
46
  # controller concerns
41
47
  require "shopify_app/controller_concerns/csrf_protection"
42
48
  require "shopify_app/controller_concerns/localization"
43
49
  require "shopify_app/controller_concerns/frame_ancestors"
44
- require "shopify_app/controller_concerns/itp"
45
50
  require "shopify_app/controller_concerns/sanitized_params"
46
51
  require "shopify_app/controller_concerns/redirect_for_embedded"
47
52
  require "shopify_app/controller_concerns/login_protection"
@@ -50,14 +55,18 @@ module ShopifyApp
50
55
  require "shopify_app/controller_concerns/payload_verification"
51
56
  require "shopify_app/controller_concerns/app_proxy_verification"
52
57
  require "shopify_app/controller_concerns/webhook_verification"
58
+ require "shopify_app/controller_concerns/token_exchange"
59
+ require "shopify_app/controller_concerns/with_shopify_id_token"
60
+
61
+ # Auth helpers
62
+ require "shopify_app/auth/post_authenticate_tasks"
63
+ require "shopify_app/auth/token_exchange"
53
64
 
54
65
  # jobs
55
66
  require "shopify_app/jobs/webhooks_manager_job"
56
- require "shopify_app/jobs/scripttags_manager_job"
57
67
 
58
68
  # managers
59
69
  require "shopify_app/managers/webhooks_manager"
60
- require "shopify_app/managers/scripttags_manager"
61
70
 
62
71
  # middleware
63
72
  require "shopify_app/middleware/jwt_middleware"
data/package.json CHANGED
@@ -1,25 +1,24 @@
1
1
  {
2
2
  "name": "shopify_app",
3
- "version": "21.0.0",
3
+ "version": "22.5.0",
4
4
  "repository": "git@github.com:Shopify/shopify_app.git",
5
5
  "author": "Shopify",
6
6
  "license": "MIT",
7
- "dependencies": {},
8
7
  "devDependencies": {
9
8
  "babel-loader": "^8.0.6",
10
9
  "babel-preset-shopify": "^21.0.0",
11
10
  "chai": "^4.1.2",
12
- "karma": "^5.2.1",
11
+ "karma": "^6.4.2",
13
12
  "karma-chai-sinon": "^0.1.5",
14
13
  "karma-chrome-launcher": "^3.1.0",
15
14
  "karma-cli": "^2.0.0",
16
15
  "karma-mocha": "^2.0.1",
17
16
  "karma-mocha-clean-reporter": "^0.0.1",
18
- "karma-webpack": "^4.0.2",
19
- "mocha": "^8.1.3",
17
+ "karma-webpack": "^5.0.0",
18
+ "mocha": "^10.2.0",
20
19
  "sinon": "^9.0.3",
21
20
  "sinon-chai": "^3.2.0",
22
- "webpack": "^4.44.1"
21
+ "webpack": "^5.94.0"
23
22
  },
24
23
  "scripts": {
25
24
  "test": "./node_modules/.bin/karma start --browsers ChromeHeadless --single-run"
data/service.yml CHANGED
@@ -1,3 +1 @@
1
1
  audience: partner
2
- slack_channels:
3
- - shopify_app_gem
data/shopify_app.gemspec CHANGED
@@ -10,17 +10,18 @@ Gem::Specification.new do |s|
10
10
  s.author = "Shopify"
11
11
  s.summary = "This gem is used to get quickly started with the Shopify API"
12
12
 
13
- s.required_ruby_version = ">= 2.7"
13
+ s.required_ruby_version = ">= 3.0"
14
14
 
15
15
  s.metadata["allowed_push_host"] = "https://rubygems.org"
16
16
 
17
17
  s.add_runtime_dependency("activeresource") # TODO: Remove this once all active resource dependencies are removed
18
- s.add_runtime_dependency("browser_sniffer", "~> 2.0")
19
- s.add_runtime_dependency("jwt", ">= 2.2.3")
18
+ s.add_runtime_dependency("addressable", "~> 2.7")
20
19
  s.add_runtime_dependency("rails", "> 5.2.1")
21
20
  s.add_runtime_dependency("redirect_safely", "~> 1.0")
22
- s.add_runtime_dependency("shopify_api", "~> 12.0.0")
21
+ s.add_runtime_dependency("shopify_api", ">= 14.7.0", "< 15.0")
23
22
  s.add_runtime_dependency("sprockets-rails", ">= 2.0.0")
23
+ # Deprecated: move to development dependencies when releasing v23
24
+ s.add_runtime_dependency("jwt", ">= 2.2.3")
24
25
 
25
26
  s.add_development_dependency("byebug")
26
27
  s.add_development_dependency("minitest")
@@ -30,10 +31,10 @@ Gem::Specification.new do |s|
30
31
  s.add_development_dependency("pry-stack_explorer")
31
32
  s.add_development_dependency("rake")
32
33
  s.add_development_dependency("rb-readline")
34
+ s.add_development_dependency("ruby-lsp")
33
35
  s.add_development_dependency("sqlite3", "~> 1.4")
34
36
  s.add_development_dependency("webmock")
35
37
 
36
38
  s.files = %x(git ls-files).split("\n").reject { |f| f.match(%r{^(test|example)/}) }
37
- s.test_files = %x(git ls-files -- {test}/*).split("\n")
38
39
  s.require_paths = ["lib"]
39
40
  end
data/translation.yml CHANGED
@@ -1,5 +1,6 @@
1
1
  source_language: en
2
2
  target_languages: [cs, da, de, es, fi, fr, it, ja, ko, nb, nl, pl, pt-BR, pt-PT, sv, th, tr, vi, zh-CN, zh-TW]
3
+ async_pr_mode: per_pr
3
4
  components:
4
5
  - name: 'merchant'
5
6
  paths: