shopify_app 17.0.2 → 17.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/.github/ISSUE_TEMPLATE/bug-report.md +63 -0
  3. data/.github/ISSUE_TEMPLATE/config.yml +1 -0
  4. data/.github/ISSUE_TEMPLATE/feature-request.md +33 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +17 -1
  6. data/.github/workflows/build.yml +4 -1
  7. data/CHANGELOG.md +21 -0
  8. data/CONTRIBUTING.md +76 -0
  9. data/Gemfile.lock +62 -62
  10. data/README.md +72 -593
  11. data/app/controllers/concerns/shopify_app/ensure_authenticated_links.rb +4 -0
  12. data/app/controllers/concerns/shopify_app/shop_access_scopes_verification.rb +32 -0
  13. data/app/controllers/shopify_app/callback_controller.rb +24 -2
  14. data/app/controllers/shopify_app/sessions_controller.rb +13 -4
  15. data/docs/Quickstart.md +15 -77
  16. data/docs/Troubleshooting.md +96 -4
  17. data/docs/Upgrading.md +110 -0
  18. data/docs/shopify_app/authentication.md +124 -0
  19. data/docs/shopify_app/engine.md +82 -0
  20. data/docs/shopify_app/generators.md +127 -0
  21. data/docs/shopify_app/handling-access-scopes-changes.md +8 -0
  22. data/docs/shopify_app/script-tags.md +28 -0
  23. data/docs/shopify_app/session-repository.md +88 -0
  24. data/docs/shopify_app/testing.md +38 -0
  25. data/docs/shopify_app/webhooks.md +72 -0
  26. data/lib/generators/shopify_app/home_controller/templates/home_controller.rb +2 -0
  27. data/lib/generators/shopify_app/home_controller/templates/unauthenticated_home_controller.rb +1 -0
  28. data/lib/generators/shopify_app/install/install_generator.rb +30 -1
  29. data/lib/generators/shopify_app/install/templates/omniauth.rb +1 -0
  30. data/lib/generators/shopify_app/install/templates/shopify_app.rb.tt +20 -14
  31. data/lib/generators/shopify_app/install/templates/shopify_provider.rb.tt +8 -0
  32. data/lib/generators/shopify_app/shop_model/shop_model_generator.rb +27 -0
  33. data/lib/generators/shopify_app/shop_model/templates/db/migrate/add_shop_access_scopes_column.erb +5 -0
  34. data/lib/generators/shopify_app/shop_model/templates/shop.rb +1 -1
  35. data/lib/generators/shopify_app/shopify_app_generator.rb +1 -1
  36. data/lib/generators/shopify_app/user_model/templates/db/migrate/add_user_access_scopes_column.erb +5 -0
  37. data/lib/generators/shopify_app/user_model/templates/user.rb +1 -1
  38. data/lib/generators/shopify_app/user_model/user_model_generator.rb +27 -0
  39. data/lib/shopify_app.rb +10 -0
  40. data/lib/shopify_app/access_scopes/noop_strategy.rb +13 -0
  41. data/lib/shopify_app/access_scopes/shop_strategy.rb +24 -0
  42. data/lib/shopify_app/access_scopes/user_strategy.rb +41 -0
  43. data/lib/shopify_app/configuration.rb +22 -0
  44. data/lib/shopify_app/omniauth/omniauth_configuration.rb +64 -0
  45. data/lib/shopify_app/session/in_memory_shop_session_store.rb +9 -7
  46. data/lib/shopify_app/session/in_memory_user_session_store.rb +9 -7
  47. data/lib/shopify_app/session/shop_session_storage_with_scopes.rb +58 -0
  48. data/lib/shopify_app/session/user_session_storage_with_scopes.rb +58 -0
  49. data/lib/shopify_app/utils.rb +12 -0
  50. data/lib/shopify_app/version.rb +1 -1
  51. data/package.json +1 -1
  52. data/shopify_app.gemspec +1 -1
  53. data/yarn.lock +70 -101
  54. metadata +27 -8
  55. data/.github/ISSUE_TEMPLATE.md +0 -19
  56. data/docs/install-on-dev-shop.png +0 -0
  57. data/docs/test-your-app.png +0 -0
  58. data/lib/generators/shopify_app/install/templates/shopify_provider.rb +0 -20
@@ -9,6 +9,8 @@ module ShopifyApp
9
9
  attr_accessor :secret
10
10
  attr_accessor :old_secret
11
11
  attr_accessor :scope
12
+ attr_writer :shop_access_scopes
13
+ attr_writer :user_access_scopes
12
14
  attr_accessor :embedded_app
13
15
  alias_method :embedded_app?, :embedded_app
14
16
  attr_accessor :webhooks
@@ -16,6 +18,8 @@ module ShopifyApp
16
18
  attr_accessor :after_authenticate_job
17
19
  attr_accessor :api_version
18
20
 
21
+ attr_accessor :reauth_on_access_scope_changes
22
+
19
23
  # customise urls
20
24
  attr_accessor :root_url
21
25
  attr_writer :login_url
@@ -70,6 +74,16 @@ module ShopifyApp
70
74
  ShopifyApp::SessionRepository.shop_storage
71
75
  end
72
76
 
77
+ def shop_access_scopes_strategy
78
+ return ShopifyApp::AccessScopes::NoopStrategy unless reauth_on_access_scope_changes
79
+ ShopifyApp::AccessScopes::ShopStrategy
80
+ end
81
+
82
+ def user_access_scopes_strategy
83
+ return ShopifyApp::AccessScopes::NoopStrategy unless reauth_on_access_scope_changes
84
+ ShopifyApp::AccessScopes::UserStrategy
85
+ end
86
+
73
87
  def has_webhooks?
74
88
  webhooks.present?
75
89
  end
@@ -81,6 +95,14 @@ module ShopifyApp
81
95
  def enable_same_site_none
82
96
  !Rails.env.test? && (@enable_same_site_none.nil? ? embedded_app? : @enable_same_site_none)
83
97
  end
98
+
99
+ def shop_access_scopes
100
+ @shop_access_scopes || scope
101
+ end
102
+
103
+ def user_access_scopes
104
+ @user_access_scopes || scope
105
+ end
84
106
  end
85
107
 
86
108
  def self.configuration
@@ -0,0 +1,64 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyApp
4
+ class OmniAuthConfiguration
5
+ attr_reader :strategy, :request
6
+ attr_writer :client_options_site, :scopes, :per_user_permissions
7
+
8
+ def initialize(strategy, request)
9
+ @strategy = strategy
10
+ @request = request
11
+ end
12
+
13
+ def build_options
14
+ strategy.options[:client_options][:site] = client_options_site
15
+ strategy.options[:scope] = scopes
16
+ strategy.options[:old_client_secret] = ShopifyApp.configuration.old_secret
17
+ strategy.options[:per_user_permissions] = request_online_tokens?
18
+ end
19
+
20
+ private
21
+
22
+ def request_online_tokens?
23
+ return @per_user_permissions unless @per_user_permissions.nil?
24
+ default_request_online_tokens?
25
+ end
26
+
27
+ def scopes
28
+ @scopes || default_scopes
29
+ end
30
+
31
+ def client_options_site
32
+ @client_options_site || default_client_options_site
33
+ end
34
+
35
+ def default_scopes
36
+ if request_online_tokens?
37
+ ShopifyApp.configuration.user_access_scopes
38
+ else
39
+ ShopifyApp.configuration.shop_access_scopes
40
+ end
41
+ end
42
+
43
+ def default_client_options_site
44
+ return '' unless shop_domain.present?
45
+ "https://#{shopify_auth_params[:shop]}"
46
+ end
47
+
48
+ def default_request_online_tokens?
49
+ strategy.session[:user_tokens] && !update_shop_scopes?
50
+ end
51
+
52
+ def update_shop_scopes?
53
+ ShopifyApp.configuration.shop_access_scopes_strategy.update_access_scopes?(shop_domain)
54
+ end
55
+
56
+ def shop_domain
57
+ request.params['shop'] || (shopify_auth_params && shopify_auth_params['shop'])
58
+ end
59
+
60
+ def shopify_auth_params
61
+ strategy.session['shopify.omniauth_params']&.with_indifferent_access
62
+ end
63
+ end
64
+ end
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
  module ShopifyApp
3
3
  class InMemoryShopSessionStore < InMemorySessionStore
4
- def self.store(session, *args)
5
- id = super
6
- repo[session.domain] = session
7
- id
8
- end
4
+ class << self
5
+ def store(session, *args)
6
+ id = super
7
+ repo[session.domain] = session
8
+ id
9
+ end
9
10
 
10
- def self.retrieve_by_shopify_domain(shopify_domain)
11
- repo[shopify_domain]
11
+ def retrieve_by_shopify_domain(shopify_domain)
12
+ repo[shopify_domain]
13
+ end
12
14
  end
13
15
  end
14
16
  end
@@ -1,14 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
  module ShopifyApp
3
3
  class InMemoryUserSessionStore < InMemorySessionStore
4
- def self.store(session, user)
5
- id = super
6
- repo[user.shopify_user_id] = session
7
- id
8
- end
4
+ class << self
5
+ def store(session, user)
6
+ id = super
7
+ repo[user.shopify_user_id] = session
8
+ id
9
+ end
9
10
 
10
- def self.retrieve_by_shopify_user_id(user_id)
11
- repo[user_id]
11
+ def retrieve_by_shopify_user_id(user_id)
12
+ repo[user_id]
13
+ end
12
14
  end
13
15
  end
14
16
  end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ShopifyApp
4
+ module ShopSessionStorageWithScopes
5
+ extend ActiveSupport::Concern
6
+ include ::ShopifyApp::SessionStorage
7
+
8
+ included do
9
+ validates :shopify_domain, presence: true, uniqueness: { case_sensitive: false }
10
+ end
11
+
12
+ class_methods do
13
+ def store(auth_session, *_args)
14
+ shop = find_or_initialize_by(shopify_domain: auth_session.domain)
15
+ shop.shopify_token = auth_session.token
16
+ shop.access_scopes = auth_session.access_scopes
17
+
18
+ shop.save!
19
+ shop.id
20
+ end
21
+
22
+ def retrieve(id)
23
+ shop = find_by(id: id)
24
+ construct_session(shop)
25
+ end
26
+
27
+ def retrieve_by_shopify_domain(domain)
28
+ shop = find_by(shopify_domain: domain)
29
+ construct_session(shop)
30
+ end
31
+
32
+ private
33
+
34
+ def construct_session(shop)
35
+ return unless shop
36
+
37
+ ShopifyAPI::Session.new(
38
+ domain: shop.shopify_domain,
39
+ token: shop.shopify_token,
40
+ api_version: shop.api_version,
41
+ access_scopes: shop.access_scopes
42
+ )
43
+ end
44
+ end
45
+
46
+ def access_scopes=(scopes)
47
+ super(scopes)
48
+ rescue NotImplementedError, NoMethodError
49
+ raise NotImplementedError, "#access_scopes= must be defined to handle storing access scopes: #{scopes}"
50
+ end
51
+
52
+ def access_scopes
53
+ super
54
+ rescue NotImplementedError, NoMethodError
55
+ raise NotImplementedError, "#access_scopes= must be defined to hook into stored access scopes"
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+ module ShopifyApp
3
+ module UserSessionStorageWithScopes
4
+ extend ActiveSupport::Concern
5
+ include ::ShopifyApp::SessionStorage
6
+
7
+ included do
8
+ validates :shopify_domain, presence: true
9
+ end
10
+
11
+ class_methods do
12
+ def store(auth_session, user)
13
+ user = find_or_initialize_by(shopify_user_id: user[:id])
14
+ user.shopify_token = auth_session.token
15
+ user.shopify_domain = auth_session.domain
16
+ user.access_scopes = auth_session.access_scopes
17
+
18
+ user.save!
19
+ user.id
20
+ end
21
+
22
+ def retrieve(id)
23
+ user = find_by(id: id)
24
+ construct_session(user)
25
+ end
26
+
27
+ def retrieve_by_shopify_user_id(user_id)
28
+ user = find_by(shopify_user_id: user_id)
29
+ construct_session(user)
30
+ end
31
+
32
+ private
33
+
34
+ def construct_session(user)
35
+ return unless user
36
+
37
+ ShopifyAPI::Session.new(
38
+ domain: user.shopify_domain,
39
+ token: user.shopify_token,
40
+ api_version: user.api_version,
41
+ access_scopes: user.access_scopes
42
+ )
43
+ end
44
+ end
45
+
46
+ def access_scopes=(scopes)
47
+ super(scopes)
48
+ rescue NotImplementedError, NoMethodError
49
+ raise NotImplementedError, "#access_scopes= must be defined to handle storing access scopes: #{scopes}"
50
+ end
51
+
52
+ def access_scopes
53
+ super
54
+ rescue NotImplementedError, NoMethodError
55
+ raise NotImplementedError, "#access_scopes= must be defined to hook into stored access scopes"
56
+ end
57
+ end
58
+ end
@@ -20,5 +20,17 @@ module ShopifyApp
20
20
  rescue ActiveResource::ConnectionError
21
21
  logger.error("[ShopifyAPI::ApiVersion] Unable to fetch api_versions from Shopify")
22
22
  end
23
+
24
+ def self.shop_login_url(shop:, return_to:)
25
+ return ShopifyApp.configuration.login_url unless shop
26
+ url = URI(ShopifyApp.configuration.login_url)
27
+
28
+ url.query = URI.encode_www_form(
29
+ shop: shop,
30
+ return_to: return_to,
31
+ )
32
+
33
+ url.to_s
34
+ end
23
35
  end
24
36
  end
@@ -1,4 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
  module ShopifyApp
3
- VERSION = '17.0.2'
3
+ VERSION = '17.1.1'
4
4
  end
data/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "shopify_app",
3
- "version": "17.0.2",
3
+ "version": "17.1.1",
4
4
  "repository": "git@github.com:Shopify/shopify_app.git",
5
5
  "author": "Shopify",
6
6
  "license": "MIT",
data/shopify_app.gemspec CHANGED
@@ -15,7 +15,7 @@ Gem::Specification.new do |s|
15
15
 
16
16
  s.add_runtime_dependency('browser_sniffer', '~> 1.2.2')
17
17
  s.add_runtime_dependency('rails', '> 5.2.1', '< 6.1')
18
- s.add_runtime_dependency('shopify_api', '~> 9.1')
18
+ s.add_runtime_dependency('shopify_api', '~> 9.4')
19
19
  s.add_runtime_dependency('omniauth-shopify-oauth2', '~> 2.2.2')
20
20
  s.add_runtime_dependency('jwt', '~> 2.2.1')
21
21
  s.add_runtime_dependency('redirect_safely', '~> 1.0')
data/yarn.lock CHANGED
@@ -1347,11 +1347,6 @@ async-each@^1.0.1:
1347
1347
  resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz#b727dbf87d7651602f06f4d4ac387f47d91b0cbf"
1348
1348
  integrity sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==
1349
1349
 
1350
- async-limiter@~1.0.0:
1351
- version "1.0.1"
1352
- resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd"
1353
- integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==
1354
-
1355
1350
  atob@^2.1.2:
1356
1351
  version "2.1.2"
1357
1352
  resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9"
@@ -1419,10 +1414,10 @@ balanced-match@^1.0.0:
1419
1414
  resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
1420
1415
  integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
1421
1416
 
1422
- base64-arraybuffer@0.1.5:
1423
- version "0.1.5"
1424
- resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz#73926771923b5a19747ad666aa5cd4bf9c6e9ce8"
1425
- integrity sha1-c5JncZI7Whl0etZmqlzUv5xunOg=
1417
+ base64-arraybuffer@0.1.4:
1418
+ version "0.1.4"
1419
+ resolved "https://registry.yarnpkg.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz#9818c79e059b1355f97e0428a017c838e90ba812"
1420
+ integrity sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=
1426
1421
 
1427
1422
  base64-js@^1.0.2:
1428
1423
  version "1.3.1"
@@ -1447,13 +1442,6 @@ base@^0.11.1:
1447
1442
  mixin-deep "^1.2.0"
1448
1443
  pascalcase "^0.1.1"
1449
1444
 
1450
- better-assert@~1.0.0:
1451
- version "1.0.2"
1452
- resolved "https://registry.yarnpkg.com/better-assert/-/better-assert-1.0.2.tgz#40866b9e1b9e0b55b481894311e68faffaebc522"
1453
- integrity sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=
1454
- dependencies:
1455
- callsite "1.0.0"
1456
-
1457
1445
  big.js@^5.2.2:
1458
1446
  version "5.2.2"
1459
1447
  resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
@@ -1689,11 +1677,6 @@ cache-base@^1.0.1:
1689
1677
  union-value "^1.0.0"
1690
1678
  unset-value "^1.0.0"
1691
1679
 
1692
- callsite@1.0.0:
1693
- version "1.0.0"
1694
- resolved "https://registry.yarnpkg.com/callsite/-/callsite-1.0.0.tgz#280398e5d664bd74038b6f0905153e6e8af1bc20"
1695
- integrity sha1-KAOY5dZkvXQDi28JBRU+borxvCA=
1696
-
1697
1680
  camelcase@^5.0.0, camelcase@^5.3.1:
1698
1681
  version "5.3.1"
1699
1682
  resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320"
@@ -1954,10 +1937,10 @@ convert-source-map@^1.7.0:
1954
1937
  dependencies:
1955
1938
  safe-buffer "~5.1.1"
1956
1939
 
1957
- cookie@0.3.1:
1958
- version "0.3.1"
1959
- resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.3.1.tgz#e7e0a1f9ef43b4c8ba925c5c5a96e806d16873bb"
1960
- integrity sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=
1940
+ cookie@~0.4.1:
1941
+ version "0.4.1"
1942
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1"
1943
+ integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==
1961
1944
 
1962
1945
  copy-concurrently@^1.0.0:
1963
1946
  version "1.0.5"
@@ -2236,45 +2219,45 @@ end-of-stream@^1.0.0, end-of-stream@^1.1.0:
2236
2219
  dependencies:
2237
2220
  once "^1.4.0"
2238
2221
 
2239
- engine.io-client@~3.4.0:
2240
- version "3.4.3"
2241
- resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.4.3.tgz#192d09865403e3097e3575ebfeb3861c4d01a66c"
2242
- integrity sha512-0NGY+9hioejTEJCaSJZfWZLk4FPI9dN+1H1C4+wj2iuFba47UgZbJzfWs4aNFajnX/qAaYKbe2lLTfEEWzCmcw==
2222
+ engine.io-client@~3.5.0:
2223
+ version "3.5.0"
2224
+ resolved "https://registry.yarnpkg.com/engine.io-client/-/engine.io-client-3.5.0.tgz#fc1b4d9616288ce4f2daf06dcf612413dec941c7"
2225
+ integrity sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==
2243
2226
  dependencies:
2244
2227
  component-emitter "~1.3.0"
2245
2228
  component-inherit "0.0.3"
2246
- debug "~4.1.0"
2229
+ debug "~3.1.0"
2247
2230
  engine.io-parser "~2.2.0"
2248
2231
  has-cors "1.1.0"
2249
2232
  indexof "0.0.1"
2250
- parseqs "0.0.5"
2251
- parseuri "0.0.5"
2252
- ws "~6.1.0"
2233
+ parseqs "0.0.6"
2234
+ parseuri "0.0.6"
2235
+ ws "~7.4.2"
2253
2236
  xmlhttprequest-ssl "~1.5.4"
2254
2237
  yeast "0.1.2"
2255
2238
 
2256
2239
  engine.io-parser@~2.2.0:
2257
- version "2.2.0"
2258
- resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.0.tgz#312c4894f57d52a02b420868da7b5c1c84af80ed"
2259
- integrity sha512-6I3qD9iUxotsC5HEMuuGsKA0cXerGz+4uGcXQEkfBidgKf0amsjrrtwcbwK/nzpZBxclXlV7gGl9dgWvu4LF6w==
2240
+ version "2.2.1"
2241
+ resolved "https://registry.yarnpkg.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz#57ce5611d9370ee94f99641b589f94c97e4f5da7"
2242
+ integrity sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==
2260
2243
  dependencies:
2261
2244
  after "0.8.2"
2262
2245
  arraybuffer.slice "~0.0.7"
2263
- base64-arraybuffer "0.1.5"
2246
+ base64-arraybuffer "0.1.4"
2264
2247
  blob "0.0.5"
2265
2248
  has-binary2 "~1.0.2"
2266
2249
 
2267
- engine.io@~3.4.0:
2268
- version "3.4.2"
2269
- resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.4.2.tgz#8fc84ee00388e3e228645e0a7d3dfaeed5bd122c"
2270
- integrity sha512-b4Q85dFkGw+TqgytGPrGgACRUhsdKc9S9ErRAXpPGy/CXKs4tYoHDkvIRdsseAF7NjfVwjRFIn6KTnbw7LwJZg==
2250
+ engine.io@~3.5.0:
2251
+ version "3.5.0"
2252
+ resolved "https://registry.yarnpkg.com/engine.io/-/engine.io-3.5.0.tgz#9d6b985c8a39b1fe87cd91eb014de0552259821b"
2253
+ integrity sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==
2271
2254
  dependencies:
2272
2255
  accepts "~1.3.4"
2273
2256
  base64id "2.0.0"
2274
- cookie "0.3.1"
2257
+ cookie "~0.4.1"
2275
2258
  debug "~4.1.0"
2276
2259
  engine.io-parser "~2.2.0"
2277
- ws "^7.1.2"
2260
+ ws "~7.4.2"
2278
2261
 
2279
2262
  enhanced-resolve@^4.3.0:
2280
2263
  version "4.3.0"
@@ -3480,17 +3463,17 @@ miller-rabin@^4.0.0:
3480
3463
  bn.js "^4.0.0"
3481
3464
  brorand "^1.0.1"
3482
3465
 
3483
- mime-db@1.44.0:
3484
- version "1.44.0"
3485
- resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz#fa11c5eb0aca1334b4233cb4d52f10c5a6272f92"
3486
- integrity sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==
3466
+ mime-db@1.45.0:
3467
+ version "1.45.0"
3468
+ resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.45.0.tgz#cceeda21ccd7c3a745eba2decd55d4b73e7879ea"
3469
+ integrity sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==
3487
3470
 
3488
3471
  mime-types@~2.1.24:
3489
- version "2.1.27"
3490
- resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz#47949f98e279ea53119f5722e0f34e529bec009f"
3491
- integrity sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==
3472
+ version "2.1.28"
3473
+ resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.28.tgz#1160c4757eab2c5363888e005273ecf79d2a0ecd"
3474
+ integrity sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==
3492
3475
  dependencies:
3493
- mime-db "1.44.0"
3476
+ mime-db "1.45.0"
3494
3477
 
3495
3478
  mime@^2.4.4, mime@^2.4.5:
3496
3479
  version "2.4.6"
@@ -3610,11 +3593,16 @@ ms@2.0.0:
3610
3593
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
3611
3594
  integrity sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=
3612
3595
 
3613
- ms@2.1.2, ms@^2.1.1:
3596
+ ms@2.1.2:
3614
3597
  version "2.1.2"
3615
3598
  resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
3616
3599
  integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
3617
3600
 
3601
+ ms@^2.1.1:
3602
+ version "2.1.3"
3603
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
3604
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
3605
+
3618
3606
  nan@^2.12.1:
3619
3607
  version "2.14.1"
3620
3608
  resolved "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz#d7be34dfa3105b91494c3147089315eff8874b01"
@@ -3709,11 +3697,6 @@ object-assign@^4.1.1:
3709
3697
  resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
3710
3698
  integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
3711
3699
 
3712
- object-component@0.0.3:
3713
- version "0.0.3"
3714
- resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291"
3715
- integrity sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=
3716
-
3717
3700
  object-copy@^0.1.0:
3718
3701
  version "0.1.0"
3719
3702
  resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c"
@@ -3841,19 +3824,15 @@ parse-asn1@^5.0.0, parse-asn1@^5.1.5:
3841
3824
  pbkdf2 "^3.0.3"
3842
3825
  safe-buffer "^5.1.1"
3843
3826
 
3844
- parseqs@0.0.5:
3845
- version "0.0.5"
3846
- resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.5.tgz#d5208a3738e46766e291ba2ea173684921a8b89d"
3847
- integrity sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=
3848
- dependencies:
3849
- better-assert "~1.0.0"
3827
+ parseqs@0.0.6:
3828
+ version "0.0.6"
3829
+ resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5"
3830
+ integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==
3850
3831
 
3851
- parseuri@0.0.5:
3852
- version "0.0.5"
3853
- resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
3854
- integrity sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=
3855
- dependencies:
3856
- better-assert "~1.0.0"
3832
+ parseuri@0.0.6:
3833
+ version "0.0.6"
3834
+ resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.6.tgz#e1496e829e3ac2ff47f39a4dd044b32823c4a25a"
3835
+ integrity sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==
3857
3836
 
3858
3837
  parseurl@~1.3.3:
3859
3838
  version "1.3.3"
@@ -4436,32 +4415,29 @@ socket.io-adapter@~1.1.0:
4436
4415
  resolved "https://registry.yarnpkg.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz#ab3f0d6f66b8fc7fca3959ab5991f82221789be9"
4437
4416
  integrity sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==
4438
4417
 
4439
- socket.io-client@2.3.0:
4440
- version "2.3.0"
4441
- resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.3.0.tgz#14d5ba2e00b9bcd145ae443ab96b3f86cbcc1bb4"
4442
- integrity sha512-cEQQf24gET3rfhxZ2jJ5xzAOo/xhZwK+mOqtGRg5IowZsMgwvHwnf/mCRapAAkadhM26y+iydgwsXGObBB5ZdA==
4418
+ socket.io-client@2.4.0:
4419
+ version "2.4.0"
4420
+ resolved "https://registry.yarnpkg.com/socket.io-client/-/socket.io-client-2.4.0.tgz#aafb5d594a3c55a34355562fc8aea22ed9119a35"
4421
+ integrity sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==
4443
4422
  dependencies:
4444
4423
  backo2 "1.0.2"
4445
- base64-arraybuffer "0.1.5"
4446
4424
  component-bind "1.0.0"
4447
- component-emitter "1.2.1"
4448
- debug "~4.1.0"
4449
- engine.io-client "~3.4.0"
4425
+ component-emitter "~1.3.0"
4426
+ debug "~3.1.0"
4427
+ engine.io-client "~3.5.0"
4450
4428
  has-binary2 "~1.0.2"
4451
- has-cors "1.1.0"
4452
4429
  indexof "0.0.1"
4453
- object-component "0.0.3"
4454
- parseqs "0.0.5"
4455
- parseuri "0.0.5"
4430
+ parseqs "0.0.6"
4431
+ parseuri "0.0.6"
4456
4432
  socket.io-parser "~3.3.0"
4457
4433
  to-array "0.1.4"
4458
4434
 
4459
4435
  socket.io-parser@~3.3.0:
4460
- version "3.3.0"
4461
- resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.0.tgz#2b52a96a509fdf31440ba40fed6094c7d4f1262f"
4462
- integrity sha512-hczmV6bDgdaEbVqhAeVMM/jfUfzuEZHsQg6eOmLgJht6G3mPKMxYm75w2+qhAQZ+4X+1+ATZ+QFKeOZD5riHng==
4436
+ version "3.3.2"
4437
+ resolved "https://registry.yarnpkg.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz#ef872009d0adcf704f2fbe830191a14752ad50b6"
4438
+ integrity sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==
4463
4439
  dependencies:
4464
- component-emitter "1.2.1"
4440
+ component-emitter "~1.3.0"
4465
4441
  debug "~3.1.0"
4466
4442
  isarray "2.0.1"
4467
4443
 
@@ -4475,15 +4451,15 @@ socket.io-parser@~3.4.0:
4475
4451
  isarray "2.0.1"
4476
4452
 
4477
4453
  socket.io@^2.3.0:
4478
- version "2.3.0"
4479
- resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.3.0.tgz#cd762ed6a4faeca59bc1f3e243c0969311eb73fb"
4480
- integrity sha512-2A892lrj0GcgR/9Qk81EaY2gYhCBxurV0PfmmESO6p27QPrUK1J3zdns+5QPqvUYK2q657nSj0guoIil9+7eFg==
4454
+ version "2.4.1"
4455
+ resolved "https://registry.yarnpkg.com/socket.io/-/socket.io-2.4.1.tgz#95ad861c9a52369d7f1a68acf0d4a1b16da451d2"
4456
+ integrity sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==
4481
4457
  dependencies:
4482
4458
  debug "~4.1.0"
4483
- engine.io "~3.4.0"
4459
+ engine.io "~3.5.0"
4484
4460
  has-binary2 "~1.0.2"
4485
4461
  socket.io-adapter "~1.1.0"
4486
- socket.io-client "2.3.0"
4462
+ socket.io-client "2.4.0"
4487
4463
  socket.io-parser "~3.4.0"
4488
4464
 
4489
4465
  source-list-map@^2.0.0:
@@ -5123,17 +5099,10 @@ wrappy@1:
5123
5099
  resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
5124
5100
  integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
5125
5101
 
5126
- ws@^7.1.2:
5127
- version "7.3.1"
5128
- resolved "https://registry.yarnpkg.com/ws/-/ws-7.3.1.tgz#d0547bf67f7ce4f12a72dfe31262c68d7dc551c8"
5129
- integrity sha512-D3RuNkynyHmEJIpD2qrgVkc9DQ23OrN/moAwZX4L8DfvszsJxpjQuUq3LMx6HoYji9fbIOBY18XWBsAux1ZZUA==
5130
-
5131
- ws@~6.1.0:
5132
- version "6.1.4"
5133
- resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.4.tgz#5b5c8800afab925e94ccb29d153c8d02c1776ef9"
5134
- integrity sha512-eqZfL+NE/YQc1/ZynhojeV8q+H050oR8AZ2uIev7RU10svA9ZnJUddHcOUZTJLinZ9yEfdA2kSATS2qZK5fhJA==
5135
- dependencies:
5136
- async-limiter "~1.0.0"
5102
+ ws@~7.4.2:
5103
+ version "7.4.2"
5104
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.4.2.tgz#782100048e54eb36fe9843363ab1c68672b261dd"
5105
+ integrity sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==
5137
5106
 
5138
5107
  xmlhttprequest-ssl@~1.5.4:
5139
5108
  version "1.5.5"