shopify_app 17.0.2 → 17.1.1

Sign up to get free protection for your applications and to get access to all the features.
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"