shopify_app 11.7.1 → 12.0.4
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.
- checksums.yaml +4 -4
 - data/CHANGELOG.md +25 -0
 - data/README.md +6 -0
 - data/app/assets/javascripts/shopify_app/itp_helper.js +6 -6
 - data/app/assets/javascripts/shopify_app/storage_access.js +35 -6
 - data/app/controllers/shopify_app/sessions_controller.rb +22 -9
 - data/app/views/shopify_app/sessions/enable_cookies.html.erb +1 -1
 - data/app/views/shopify_app/sessions/request_storage_access.html.erb +1 -1
 - data/config/locales/pt-BR.yml +1 -1
 - data/lib/generators/shopify_app/add_marketing_activity_extension/templates/marketing_activities_controller.rb +1 -5
 - data/lib/generators/shopify_app/home_controller/home_controller_generator.rb +0 -6
 - data/lib/generators/shopify_app/install/templates/embedded_app.html.erb +2 -2
 - data/lib/generators/shopify_app/install/templates/flash_messages.js +11 -2
 - data/lib/generators/shopify_app/install/templates/shopify_app.js +9 -3
 - data/lib/shopify_app/configuration.rb +1 -1
 - data/lib/shopify_app/controller_concerns/login_protection.rb +21 -3
 - data/lib/shopify_app/engine.rb +1 -1
 - data/lib/shopify_app/middleware/same_site_cookie_middleware.rb +20 -13
 - data/lib/shopify_app/version.rb +1 -1
 - data/package.json +2 -2
 - data/shopify_app.gemspec +1 -1
 - metadata +4 -5
 - data/lib/generators/shopify_app/home_controller/templates/shopify_app_ready_script.html.erb +0 -7
 
    
        checksums.yaml
    CHANGED
    
    | 
         @@ -1,7 +1,7 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            ---
         
     | 
| 
       2 
2 
     | 
    
         
             
            SHA256:
         
     | 
| 
       3 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       4 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 3 
     | 
    
         
            +
              metadata.gz: 97b51956c46bc3fa2f253b3a2a949bb65f338999b46cd28ec182c4774f6d2b01
         
     | 
| 
      
 4 
     | 
    
         
            +
              data.tar.gz: 1f8199a550dfd21035e620e052b636c3c8956ae820c47385a80cc58981a78802
         
     | 
| 
       5 
5 
     | 
    
         
             
            SHA512:
         
     | 
| 
       6 
     | 
    
         
            -
              metadata.gz:  
     | 
| 
       7 
     | 
    
         
            -
              data.tar.gz:  
     | 
| 
      
 6 
     | 
    
         
            +
              metadata.gz: 10004812203cadeaa93607ef0726bb0f96d541b363da568bb379260b9861773392050a42ab99fbabca69517d0851deb4263ba2de7f4f8c33865c6e83b2f71772
         
     | 
| 
      
 7 
     | 
    
         
            +
              data.tar.gz: a777827c69680e90cf514cd0409039d393c1f7a6c0c523f6d3a61b6dd01cd2e3bfcfbe5ea67aa42bd9e4c8b2a57cd53d9d27a6378833055d47bf4745c155fc2f
         
     | 
    
        data/CHANGELOG.md
    CHANGED
    
    | 
         @@ -1,3 +1,28 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            12.0.4
         
     | 
| 
      
 2 
     | 
    
         
            +
            ------
         
     | 
| 
      
 3 
     | 
    
         
            +
            * Reverts reverted PR (#895) #897
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            12.0.3
         
     | 
| 
      
 6 
     | 
    
         
            +
            ------
         
     | 
| 
      
 7 
     | 
    
         
            +
            * Moves samesite middleware higher in the stack #898
         
     | 
| 
      
 8 
     | 
    
         
            +
            * Fix issue where not redirecting user to granted storage page casues infinite loop #900
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            12.0.2
         
     | 
| 
      
 11 
     | 
    
         
            +
            ------
         
     | 
| 
      
 12 
     | 
    
         
            +
            * Reverts "Fix for return_to in safari after enable_cookies/granted_storage_access" introduced in 12.0.1
         
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            12.0.1
         
     | 
| 
      
 15 
     | 
    
         
            +
            ------
         
     | 
| 
      
 16 
     | 
    
         
            +
            * disable samesite cookie middleware in tests
         
     | 
| 
      
 17 
     | 
    
         
            +
            * middleware compatibility for ruby 2.3
         
     | 
| 
      
 18 
     | 
    
         
            +
            * samesite cookie fixes for javascript libraries
         
     | 
| 
      
 19 
     | 
    
         
            +
            * change generators to add AppBridge instead of EASDK
         
     | 
| 
      
 20 
     | 
    
         
            +
            * Fix for return_to in safari after enable_cookies/granted_storage_access
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            12.0.0
         
     | 
| 
      
 23 
     | 
    
         
            +
            -----
         
     | 
| 
      
 24 
     | 
    
         
            +
            * Updating shopify_api gem to 9.0.0
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
       1 
26 
     | 
    
         
             
            11.7.1
         
     | 
| 
       2 
27 
     | 
    
         
             
            -----
         
     | 
| 
       3 
28 
     | 
    
         
             
            * Fix to allow SessionStorage to be flexible on what model names that the are used for storing shop and user data
         
     | 
    
        data/README.md
    CHANGED
    
    | 
         @@ -439,6 +439,11 @@ end 
     | 
|
| 
       439 
439 
     | 
    
         
             
            Create your app proxy url in the [Shopify Partners' Dashboard][dashboard], making sure to point it to `https://your_app_website.com/app_proxy`.
         
     | 
| 
       440 
440 
     | 
    
         
             
            
         
     | 
| 
       441 
441 
     | 
    
         | 
| 
      
 442 
     | 
    
         
            +
            App Bridge
         
     | 
| 
      
 443 
     | 
    
         
            +
            ---
         
     | 
| 
      
 444 
     | 
    
         
            +
             
     | 
| 
      
 445 
     | 
    
         
            +
            A basic example of using [App Bridge][app-bridge] is included in the install generator. An app instance is automatically initialized in [shopify_app.js](https://github.com/Shopify/shopify_app/blob/master/lib/generators/shopify_app/install/templates/shopify_app.js) and [flash_messages.js](https://github.com/Shopify/shopify_app/blob/master/lib/generators/shopify_app/install/templates/flash_messages.js) converts Rails [flash messages](https://api.rubyonrails.org/classes/ActionDispatch/Flash.html) to App Bridge Toast actions automatically. By default, this library is included via [unpkg in the embedded_app layout](https://github.com/Shopify/shopify_app/blob/master/lib/generators/shopify_app/install/templates/embedded_app.html.erb#L27). For more advanced uses it is recommended to [install App Bridge via npm or yarn](https://help.shopify.com/en/api/embedded-apps/app-bridge/getting-started#set-up-shopify-app-bridge-in-your-app).
         
     | 
| 
      
 446 
     | 
    
         
            +
             
     | 
| 
       442 
447 
     | 
    
         
             
            Troubleshooting
         
     | 
| 
       443 
448 
     | 
    
         
             
            ---------------
         
     | 
| 
       444 
449 
     | 
    
         | 
| 
         @@ -537,3 +542,4 @@ is changed to 
     | 
|
| 
       537 
542 
     | 
    
         
             
            You will need to also follow the ShopifyAPI [upgrade guide](https://github.com/Shopify/shopify_api/blob/master/README.md#-breaking-change-notice-for-version-700-) to ensure your app is ready to work with api versioning.
         
     | 
| 
       538 
543 
     | 
    
         | 
| 
       539 
544 
     | 
    
         
             
            [dashboard]:https://partners.shopify.com
         
     | 
| 
      
 545 
     | 
    
         
            +
            [app-bridge]:https://help.shopify.com/en/api/embedded-apps/app-bridge
         
     | 
| 
         @@ -4,31 +4,31 @@ 
     | 
|
| 
       4 
4 
     | 
    
         
             
                this.itpAction = document.getElementById('TopLevelInteractionButton');
         
     | 
| 
       5 
5 
     | 
    
         
             
                this.redirectUrl = opts.redirectUrl;
         
     | 
| 
       6 
6 
     | 
    
         
             
              }
         
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
      
 7 
     | 
    
         
            +
             
     | 
| 
       8 
8 
     | 
    
         
             
              ITPHelper.prototype.redirect = function() {
         
     | 
| 
       9 
9 
     | 
    
         
             
                sessionStorage.setItem('shopify.top_level_interaction', true);
         
     | 
| 
       10 
10 
     | 
    
         
             
                window.location.href = this.redirectUrl;
         
     | 
| 
       11 
11 
     | 
    
         
             
              }
         
     | 
| 
       12 
     | 
    
         
            -
             
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
       13 
13 
     | 
    
         
             
              ITPHelper.prototype.userAgentIsAffected = function() {
         
     | 
| 
       14 
14 
     | 
    
         
             
                return Boolean(document.hasStorageAccess);
         
     | 
| 
       15 
15 
     | 
    
         
             
              }
         
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
      
 16 
     | 
    
         
            +
             
     | 
| 
       17 
17 
     | 
    
         
             
              ITPHelper.prototype.canPartitionCookies = function() {
         
     | 
| 
       18 
18 
     | 
    
         
             
                var versionRegEx = /Version\/12\.0\.?\d? Safari/;
         
     | 
| 
       19 
19 
     | 
    
         
             
                return versionRegEx.test(navigator.userAgent);
         
     | 
| 
       20 
20 
     | 
    
         
             
              }
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
       22 
22 
     | 
    
         
             
              ITPHelper.prototype.setUpContent = function(onClick) {
         
     | 
| 
       23 
23 
     | 
    
         
             
                this.itpContent.style.display = 'block';
         
     | 
| 
       24 
24 
     | 
    
         
             
                this.itpAction.addEventListener('click', this.redirect.bind(this));
         
     | 
| 
       25 
25 
     | 
    
         
             
              }
         
     | 
| 
       26 
     | 
    
         
            -
             
     | 
| 
      
 26 
     | 
    
         
            +
             
     | 
| 
       27 
27 
     | 
    
         
             
              ITPHelper.prototype.execute = function() {
         
     | 
| 
       28 
28 
     | 
    
         
             
                if (!this.itpContent) {
         
     | 
| 
       29 
29 
     | 
    
         
             
                  return;
         
     | 
| 
       30 
30 
     | 
    
         
             
                }
         
     | 
| 
       31 
     | 
    
         
            -
             
     | 
| 
      
 31 
     | 
    
         
            +
             
     | 
| 
       32 
32 
     | 
    
         
             
                if (this.userAgentIsAffected()) {
         
     | 
| 
       33 
33 
     | 
    
         
             
                  this.setUpContent();
         
     | 
| 
       34 
34 
     | 
    
         
             
                } else {
         
     | 
| 
         @@ -28,18 +28,47 @@ 
     | 
|
| 
       28 
28 
     | 
    
         
             
                window.parent.location.href = this.redirectData.myshopifyUrl + '/admin/apps';
         
     | 
| 
       29 
29 
     | 
    
         
             
              }
         
     | 
| 
       30 
30 
     | 
    
         | 
| 
       31 
     | 
    
         
            -
              StorageAccessHelper.prototype. 
     | 
| 
       32 
     | 
    
         
            -
                window.location.href = this.redirectData. 
     | 
| 
      
 31 
     | 
    
         
            +
              StorageAccessHelper.prototype.redirectToAppTargetUrl = function() {
         
     | 
| 
      
 32 
     | 
    
         
            +
                window.location.href = this.redirectData.appTargetUrl;
         
     | 
| 
      
 33 
     | 
    
         
            +
              }
         
     | 
| 
      
 34 
     | 
    
         
            +
             
     | 
| 
      
 35 
     | 
    
         
            +
              StorageAccessHelper.prototype.sameSiteNoneIncompatible = function(ua) {
         
     | 
| 
      
 36 
     | 
    
         
            +
                return ua.includes("iPhone OS 12_") || ua.includes("iPad; CPU OS 12_") || //iOS 12
         
     | 
| 
      
 37 
     | 
    
         
            +
                (ua.includes("UCBrowser/")
         
     | 
| 
      
 38 
     | 
    
         
            +
                    ? this.isOlderUcBrowser(ua) //UC Browser < 12.13.2
         
     | 
| 
      
 39 
     | 
    
         
            +
                    : (ua.includes("Chrome/5") || ua.includes("Chrome/6"))) ||
         
     | 
| 
      
 40 
     | 
    
         
            +
                ua.includes("Chromium/5") || ua.includes("Chromium/6") ||
         
     | 
| 
      
 41 
     | 
    
         
            +
                (ua.includes(" OS X 10_14_") &&
         
     | 
| 
      
 42 
     | 
    
         
            +
                    ((ua.includes("Version/") && ua.includes("Safari")) || //Safari on MacOS 10.14
         
     | 
| 
      
 43 
     | 
    
         
            +
                    ua.endsWith("(KHTML, like Gecko)"))); //Web view on MacOS 10.14
         
     | 
| 
      
 44 
     | 
    
         
            +
              }
         
     | 
| 
      
 45 
     | 
    
         
            +
             
     | 
| 
      
 46 
     | 
    
         
            +
              StorageAccessHelper.prototype.isOlderUcBrowser = function(ua) {
         
     | 
| 
      
 47 
     | 
    
         
            +
                var match = ua.match(/UCBrowser\/(\d+)\.(\d+)\.(\d+)\./);
         
     | 
| 
      
 48 
     | 
    
         
            +
                if (!match) return false;
         
     | 
| 
      
 49 
     | 
    
         
            +
                var major = parseInt(match[1]);
         
     | 
| 
      
 50 
     | 
    
         
            +
                var minor = parseInt(match[2]);
         
     | 
| 
      
 51 
     | 
    
         
            +
                var build = parseInt(match[3]);
         
     | 
| 
      
 52 
     | 
    
         
            +
                if (major != 12) return major < 12;
         
     | 
| 
      
 53 
     | 
    
         
            +
                if (minor != 13) return minor < 13;
         
     | 
| 
      
 54 
     | 
    
         
            +
                return build < 2;
         
     | 
| 
      
 55 
     | 
    
         
            +
              }
         
     | 
| 
      
 56 
     | 
    
         
            +
             
     | 
| 
      
 57 
     | 
    
         
            +
              StorageAccessHelper.prototype.setCookie = function(value) {
         
     | 
| 
      
 58 
     | 
    
         
            +
                if(!this.sameSiteNoneIncompatible(navigator.userAgent)) {
         
     | 
| 
      
 59 
     | 
    
         
            +
                  value += '; secure; SameSite=None'
         
     | 
| 
      
 60 
     | 
    
         
            +
                }
         
     | 
| 
      
 61 
     | 
    
         
            +
                document.cookie = value;
         
     | 
| 
       33 
62 
     | 
    
         
             
              }
         
     | 
| 
       34 
63 
     | 
    
         | 
| 
       35 
64 
     | 
    
         
             
              StorageAccessHelper.prototype.grantedStorageAccess = function() {
         
     | 
| 
       36 
65 
     | 
    
         
             
                try {
         
     | 
| 
       37 
66 
     | 
    
         
             
                  sessionStorage.setItem('shopify.granted_storage_access', true);
         
     | 
| 
       38 
     | 
    
         
            -
                   
     | 
| 
      
 67 
     | 
    
         
            +
                  this.setCookie('shopify.granted_storage_access=true');
         
     | 
| 
       39 
68 
     | 
    
         
             
                  if (!document.cookie) {
         
     | 
| 
       40 
69 
     | 
    
         
             
                    throw 'Cannot set third-party cookie.'
         
     | 
| 
       41 
70 
     | 
    
         
             
                  }
         
     | 
| 
       42 
     | 
    
         
            -
                  this. 
     | 
| 
      
 71 
     | 
    
         
            +
                  this.redirectToAppTargetUrl();
         
     | 
| 
       43 
72 
     | 
    
         
             
                } catch (error) {
         
     | 
| 
       44 
73 
     | 
    
         
             
                  console.warn('Third party cookies may be blocked.', error);
         
     | 
| 
       45 
74 
     | 
    
         
             
                  this.redirectToAppTLD(ACCESS_DENIED_STATUS);
         
     | 
| 
         @@ -61,7 +90,7 @@ 
     | 
|
| 
       61 
90 
     | 
    
         
             
              StorageAccessHelper.prototype.handleHasStorageAccess = function() {
         
     | 
| 
       62 
91 
     | 
    
         
             
                if (sessionStorage.getItem('shopify.granted_storage_access')) {
         
     | 
| 
       63 
92 
     | 
    
         
             
                  // If app was classified by ITP and used Storage Access API to acquire access
         
     | 
| 
       64 
     | 
    
         
            -
                  this. 
     | 
| 
      
 93 
     | 
    
         
            +
                  this.redirectToAppTargetUrl();
         
     | 
| 
       65 
94 
     | 
    
         
             
                } else {
         
     | 
| 
       66 
95 
     | 
    
         
             
                  // If app has not been classified by ITP and still has storage access
         
     | 
| 
       67 
96 
     | 
    
         
             
                  this.redirectToAppTLD(ACCESS_GRANTED_STATUS);
         
     | 
| 
         @@ -107,7 +136,7 @@ 
     | 
|
| 
       107 
136 
     | 
    
         
             
              }
         
     | 
| 
       108 
137 
     | 
    
         | 
| 
       109 
138 
     | 
    
         
             
              StorageAccessHelper.prototype.setCookieAndRedirect = function() {
         
     | 
| 
       110 
     | 
    
         
            -
                 
     | 
| 
      
 139 
     | 
    
         
            +
                this.setCookie('shopify.cookies_persist=true');
         
     | 
| 
       111 
140 
     | 
    
         
             
                var helper = this.setUpHelper();
         
     | 
| 
       112 
141 
     | 
    
         
             
                helper.redirect();
         
     | 
| 
       113 
142 
     | 
    
         
             
              }
         
     | 
| 
         @@ -20,11 +20,15 @@ module ShopifyApp 
     | 
|
| 
       20 
20 
     | 
    
         | 
| 
       21 
21 
     | 
    
         
             
                  render(:enable_cookies, layout: false, locals: {
         
     | 
| 
       22 
22 
     | 
    
         
             
                    does_not_have_storage_access_url: top_level_interaction_path(
         
     | 
| 
       23 
     | 
    
         
            -
                      shop: sanitized_shop_name
         
     | 
| 
      
 23 
     | 
    
         
            +
                      shop: sanitized_shop_name,
         
     | 
| 
      
 24 
     | 
    
         
            +
                      return_to: params[:return_to]
         
     | 
| 
       24 
25 
     | 
    
         
             
                    ),
         
     | 
| 
       25 
26 
     | 
    
         
             
                    has_storage_access_url: login_url_with_optional_shop(top_level: true),
         
     | 
| 
       26 
     | 
    
         
            -
                     
     | 
| 
       27 
     | 
    
         
            -
             
     | 
| 
      
 27 
     | 
    
         
            +
                    app_target_url: granted_storage_access_path(
         
     | 
| 
      
 28 
     | 
    
         
            +
                      shop: sanitized_shop_name,
         
     | 
| 
      
 29 
     | 
    
         
            +
                      return_to: params[:return_to]
         
     | 
| 
      
 30 
     | 
    
         
            +
                    ),
         
     | 
| 
      
 31 
     | 
    
         
            +
                    current_shopify_domain: current_shopify_domain
         
     | 
| 
       28 
32 
     | 
    
         
             
                  })
         
     | 
| 
       29 
33 
     | 
    
         
             
                end
         
     | 
| 
       30 
34 
     | 
    
         | 
| 
         @@ -38,8 +42,9 @@ module ShopifyApp 
     | 
|
| 
       38 
42 
     | 
    
         | 
| 
       39 
43 
     | 
    
         
             
                  session['shopify.granted_storage_access'] = true
         
     | 
| 
       40 
44 
     | 
    
         | 
| 
       41 
     | 
    
         
            -
                   
     | 
| 
       42 
     | 
    
         
            -
             
     | 
| 
      
 45 
     | 
    
         
            +
                  copy_return_to_param_to_session
         
     | 
| 
      
 46 
     | 
    
         
            +
             
     | 
| 
      
 47 
     | 
    
         
            +
                  redirect_to(return_address_with_params({ shop: @shop }))
         
     | 
| 
       43 
48 
     | 
    
         
             
                end
         
     | 
| 
       44 
49 
     | 
    
         | 
| 
       45 
50 
     | 
    
         
             
                def destroy
         
     | 
| 
         @@ -54,7 +59,7 @@ module ShopifyApp 
     | 
|
| 
       54 
59 
     | 
    
         
             
                  return render_invalid_shop_error unless sanitized_shop_name.present?
         
     | 
| 
       55 
60 
     | 
    
         
             
                  session['shopify.omniauth_params'] = { shop: sanitized_shop_name }
         
     | 
| 
       56 
61 
     | 
    
         | 
| 
       57 
     | 
    
         
            -
                   
     | 
| 
      
 62 
     | 
    
         
            +
                  copy_return_to_param_to_session
         
     | 
| 
       58 
63 
     | 
    
         | 
| 
       59 
64 
     | 
    
         
             
                  if user_agent_can_partition_cookies
         
     | 
| 
       60 
65 
     | 
    
         
             
                    authenticate_with_partitioning
         
     | 
| 
         @@ -93,6 +98,10 @@ module ShopifyApp 
     | 
|
| 
       93 
98 
     | 
    
         
             
                  true
         
     | 
| 
       94 
99 
     | 
    
         
             
                end
         
     | 
| 
       95 
100 
     | 
    
         | 
| 
      
 101 
     | 
    
         
            +
                def copy_return_to_param_to_session
         
     | 
| 
      
 102 
     | 
    
         
            +
                  session[:return_to] = params[:return_to] if params[:return_to]
         
     | 
| 
      
 103 
     | 
    
         
            +
                end
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
       96 
105 
     | 
    
         
             
                def render_invalid_shop_error
         
     | 
| 
       97 
106 
     | 
    
         
             
                  flash[:error] = I18n.t('invalid_shop_url')
         
     | 
| 
       98 
107 
     | 
    
         
             
                  redirect_to return_address
         
     | 
| 
         @@ -133,11 +142,15 @@ module ShopifyApp 
     | 
|
| 
       133 
142 
     | 
    
         
             
                    layout: false,
         
     | 
| 
       134 
143 
     | 
    
         
             
                    locals: {
         
     | 
| 
       135 
144 
     | 
    
         
             
                      does_not_have_storage_access_url: top_level_interaction_path(
         
     | 
| 
       136 
     | 
    
         
            -
                        shop: sanitized_shop_name
         
     | 
| 
      
 145 
     | 
    
         
            +
                        shop: sanitized_shop_name,
         
     | 
| 
      
 146 
     | 
    
         
            +
                        return_to: session[:return_to]
         
     | 
| 
       137 
147 
     | 
    
         
             
                      ),
         
     | 
| 
       138 
148 
     | 
    
         
             
                      has_storage_access_url: login_url_with_optional_shop(top_level: true),
         
     | 
| 
       139 
     | 
    
         
            -
                       
     | 
| 
       140 
     | 
    
         
            -
             
     | 
| 
      
 149 
     | 
    
         
            +
                      app_target_url: granted_storage_access_path(
         
     | 
| 
      
 150 
     | 
    
         
            +
                        shop: sanitized_shop_name,
         
     | 
| 
      
 151 
     | 
    
         
            +
                        return_to: session[:return_to]
         
     | 
| 
      
 152 
     | 
    
         
            +
                      ),
         
     | 
| 
      
 153 
     | 
    
         
            +
                      current_shopify_domain: current_shopify_domain
         
     | 
| 
       141 
154 
     | 
    
         
             
                    }
         
     | 
| 
       142 
155 
     | 
    
         
             
                  )
         
     | 
| 
       143 
156 
     | 
    
         
             
                end
         
     | 
| 
         @@ -32,7 +32,7 @@ 
     | 
|
| 
       32 
32 
     | 
    
         
             
                      myshopifyUrl: "https://#{current_shopify_domain}",
         
     | 
| 
       33 
33 
     | 
    
         
             
                      hasStorageAccessUrl: "#{has_storage_access_url}",
         
     | 
| 
       34 
34 
     | 
    
         
             
                      doesNotHaveStorageAccessUrl: "#{does_not_have_storage_access_url}",
         
     | 
| 
       35 
     | 
    
         
            -
                       
     | 
| 
      
 35 
     | 
    
         
            +
                      appTargetUrl: "#{app_target_url}"
         
     | 
| 
       36 
36 
     | 
    
         
             
                    },
         
     | 
| 
       37 
37 
     | 
    
         
             
                  },
         
     | 
| 
       38 
38 
     | 
    
         
             
                )
         
     | 
| 
         @@ -24,7 +24,7 @@ 
     | 
|
| 
       24 
24 
     | 
    
         
             
                                  myshopifyUrl: "https://#{current_shopify_domain}",
         
     | 
| 
       25 
25 
     | 
    
         
             
                                  hasStorageAccessUrl: "#{has_storage_access_url}",
         
     | 
| 
       26 
26 
     | 
    
         
             
                                  doesNotHaveStorageAccessUrl: "#{does_not_have_storage_access_url}",
         
     | 
| 
       27 
     | 
    
         
            -
                                   
     | 
| 
      
 27 
     | 
    
         
            +
                                  appTargetUrl: "#{app_target_url}"
         
     | 
| 
       28 
28 
     | 
    
         
             
                              },
         
     | 
| 
       29 
29 
     | 
    
         
             
                          },
         
     | 
| 
       30 
30 
     | 
    
         
             
                          )
         
     | 
    
        data/config/locales/pt-BR.yml
    CHANGED
    
    | 
         @@ -4,7 +4,7 @@ pt-BR: 
     | 
|
| 
       4 
4 
     | 
    
         
             
              could_not_log_in: Não foi possível fazer login na Shopify store
         
     | 
| 
       5 
5 
     | 
    
         
             
              invalid_shop_url: Domínio de loja inválido
         
     | 
| 
       6 
6 
     | 
    
         
             
              enable_cookies_heading: Habilitar cookies de %{app}
         
     | 
| 
       7 
     | 
    
         
            -
              enable_cookies_body: Você  
     | 
| 
      
 7 
     | 
    
         
            +
              enable_cookies_body: Você precisa habilitar manualmente os cookies neste navegador
         
     | 
| 
       8 
8 
     | 
    
         
             
                para usar %{app} dentro da Shopify.
         
     | 
| 
       9 
9 
     | 
    
         
             
              enable_cookies_footer: Os cookies permitem que o app o autentique armazenando temporariamente
         
     | 
| 
       10 
10 
     | 
    
         
             
                suas preferências e dados pessoais. Eles expiram depois de 30 dias.
         
     | 
| 
         @@ -3,11 +3,7 @@ 
     | 
|
| 
       3 
3 
     | 
    
         
             
            class MarketingActivitiesController < ShopifyApp::ExtensionVerificationController
         
     | 
| 
       4 
4 
     | 
    
         
             
              def preload_form_data
         
     | 
| 
       5 
5 
     | 
    
         
             
                preload_data = {
         
     | 
| 
       6 
     | 
    
         
            -
                  "form_data": {
         
     | 
| 
       7 
     | 
    
         
            -
                    "budget": {
         
     | 
| 
       8 
     | 
    
         
            -
                      "currency": "USD",
         
     | 
| 
       9 
     | 
    
         
            -
                    }
         
     | 
| 
       10 
     | 
    
         
            -
                  }
         
     | 
| 
      
 6 
     | 
    
         
            +
                  "form_data": {}
         
     | 
| 
       11 
7 
     | 
    
         
             
                }
         
     | 
| 
       12 
8 
     | 
    
         
             
                render(json: preload_data, status: :ok)
         
     | 
| 
       13 
9 
     | 
    
         
             
              end
         
     | 
| 
         @@ -11,12 +11,6 @@ module ShopifyApp 
     | 
|
| 
       11 
11 
     | 
    
         | 
| 
       12 
12 
     | 
    
         
             
                  def create_home_index_view
         
     | 
| 
       13 
13 
     | 
    
         
             
                    copy_file 'index.html.erb', 'app/views/home/index.html.erb'
         
     | 
| 
       14 
     | 
    
         
            -
                    if embedded_app?
         
     | 
| 
       15 
     | 
    
         
            -
                      prepend_to_file(
         
     | 
| 
       16 
     | 
    
         
            -
                        'app/views/home/index.html.erb',
         
     | 
| 
       17 
     | 
    
         
            -
                        File.read(File.expand_path(find_in_source_paths('shopify_app_ready_script.html.erb')))
         
     | 
| 
       18 
     | 
    
         
            -
                      )
         
     | 
| 
       19 
     | 
    
         
            -
                    end
         
     | 
| 
       20 
14 
     | 
    
         
             
                  end
         
     | 
| 
       21 
15 
     | 
    
         | 
| 
       22 
16 
     | 
    
         
             
                  def add_home_index_route
         
     | 
| 
         @@ -24,11 +24,11 @@ 
     | 
|
| 
       24 
24 
     | 
    
         | 
| 
       25 
25 
     | 
    
         
             
                <%= render 'layouts/flash_messages' %>
         
     | 
| 
       26 
26 
     | 
    
         | 
| 
       27 
     | 
    
         
            -
                <script src="https:// 
     | 
| 
      
 27 
     | 
    
         
            +
                <script src="https://unpkg.com/@shopify/app-bridge"></script>
         
     | 
| 
       28 
28 
     | 
    
         | 
| 
       29 
29 
     | 
    
         
             
                <%= content_tag(:div, nil, id: 'shopify-app-init', data: {
         
     | 
| 
       30 
30 
     | 
    
         
             
                  api_key: ShopifyApp.configuration.api_key,
         
     | 
| 
       31 
     | 
    
         
            -
                  shop_origin: ( 
     | 
| 
      
 31 
     | 
    
         
            +
                  shop_origin: (@shop_session.domain if @shop_session),
         
     | 
| 
       32 
32 
     | 
    
         
             
                  debug: Rails.env.development?
         
     | 
| 
       33 
33 
     | 
    
         
             
                } ) %>
         
     | 
| 
       34 
34 
     | 
    
         | 
| 
         @@ -4,12 +4,21 @@ if (!document.documentElement.hasAttribute("data-turbolinks-preview")) { 
     | 
|
| 
       4 
4 
     | 
    
         
             
              document.addEventListener(eventName, function flash() {
         
     | 
| 
       5 
5 
     | 
    
         
             
                var flashData = JSON.parse(document.getElementById('shopify-app-flash').dataset.flash);
         
     | 
| 
       6 
6 
     | 
    
         | 
| 
      
 7 
     | 
    
         
            +
                var Toast = window['app-bridge'].actions.Toast;
         
     | 
| 
      
 8 
     | 
    
         
            +
             
     | 
| 
       7 
9 
     | 
    
         
             
                if (flashData.notice) {
         
     | 
| 
       8 
     | 
    
         
            -
                   
     | 
| 
      
 10 
     | 
    
         
            +
                  Toast.create(app, {
         
     | 
| 
      
 11 
     | 
    
         
            +
                    message: flashData.notice,
         
     | 
| 
      
 12 
     | 
    
         
            +
                    duration: 5000,
         
     | 
| 
      
 13 
     | 
    
         
            +
                  }).dispatch(Toast.Action.SHOW);
         
     | 
| 
       9 
14 
     | 
    
         
             
                }
         
     | 
| 
       10 
15 
     | 
    
         | 
| 
       11 
16 
     | 
    
         
             
                if (flashData.error) {
         
     | 
| 
       12 
     | 
    
         
            -
                   
     | 
| 
      
 17 
     | 
    
         
            +
                  Toast.create(app, {
         
     | 
| 
      
 18 
     | 
    
         
            +
                    message: flashData.error,
         
     | 
| 
      
 19 
     | 
    
         
            +
                    duration: 5000,
         
     | 
| 
      
 20 
     | 
    
         
            +
                    isError: true,
         
     | 
| 
      
 21 
     | 
    
         
            +
                  }).dispatch(Toast.Action.SHOW);
         
     | 
| 
       13 
22 
     | 
    
         
             
                }
         
     | 
| 
       14 
23 
     | 
    
         | 
| 
       15 
24 
     | 
    
         
             
                document.removeEventListener(eventName, flash)
         
     | 
| 
         @@ -1,9 +1,15 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            document.addEventListener('DOMContentLoaded', () => {
         
     | 
| 
       2 
2 
     | 
    
         
             
              var data = document.getElementById('shopify-app-init').dataset;
         
     | 
| 
       3 
     | 
    
         
            -
               
     | 
| 
      
 3 
     | 
    
         
            +
              var AppBridge = window['app-bridge'];
         
     | 
| 
      
 4 
     | 
    
         
            +
              var createApp = AppBridge.default;
         
     | 
| 
      
 5 
     | 
    
         
            +
              window.app = createApp({
         
     | 
| 
       4 
6 
     | 
    
         
             
                apiKey: data.apiKey,
         
     | 
| 
       5 
7 
     | 
    
         
             
                shopOrigin: data.shopOrigin,
         
     | 
| 
       6 
     | 
    
         
            -
             
     | 
| 
       7 
     | 
    
         
            -
             
     | 
| 
      
 8 
     | 
    
         
            +
              });
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
              var actions = AppBridge.actions;
         
     | 
| 
      
 11 
     | 
    
         
            +
              var TitleBar = actions.TitleBar;
         
     | 
| 
      
 12 
     | 
    
         
            +
              TitleBar.create(app, {
         
     | 
| 
      
 13 
     | 
    
         
            +
                title: data.page,
         
     | 
| 
       8 
14 
     | 
    
         
             
              });
         
     | 
| 
       9 
15 
     | 
    
         
             
            });
         
     | 
| 
         @@ -63,8 +63,14 @@ module ShopifyApp 
     | 
|
| 
       63 
63 
     | 
    
         
             
                    head :unauthorized
         
     | 
| 
       64 
64 
     | 
    
         
             
                  else
         
     | 
| 
       65 
65 
     | 
    
         
             
                    if request.get?
         
     | 
| 
       66 
     | 
    
         
            -
                       
     | 
| 
      
 66 
     | 
    
         
            +
                      path = request.path
         
     | 
| 
      
 67 
     | 
    
         
            +
                      query = sanitized_params.to_query
         
     | 
| 
      
 68 
     | 
    
         
            +
                    else
         
     | 
| 
      
 69 
     | 
    
         
            +
                      referer = URI(request.referer || "/")
         
     | 
| 
      
 70 
     | 
    
         
            +
                      path = referer.path
         
     | 
| 
      
 71 
     | 
    
         
            +
                      query = "#{referer.query}&#{sanitized_params.to_query}"
         
     | 
| 
       67 
72 
     | 
    
         
             
                    end
         
     | 
| 
      
 73 
     | 
    
         
            +
                    session[:return_to] = "#{path}?#{query}"
         
     | 
| 
       68 
74 
     | 
    
         
             
                    redirect_to(login_url_with_optional_shop)
         
     | 
| 
       69 
75 
     | 
    
         
             
                  end
         
     | 
| 
       70 
76 
     | 
    
         
             
                end
         
     | 
| 
         @@ -94,8 +100,10 @@ module ShopifyApp 
     | 
|
| 
       94 
100 
     | 
    
         
             
                  query_params = {}
         
     | 
| 
       95 
101 
     | 
    
         
             
                  query_params[:shop] = sanitized_params[:shop] if params[:shop].present?
         
     | 
| 
       96 
102 
     | 
    
         | 
| 
       97 
     | 
    
         
            -
                   
     | 
| 
       98 
     | 
    
         
            -
             
     | 
| 
      
 103 
     | 
    
         
            +
                  return_to = session[:return_to] || params[:return_to]
         
     | 
| 
      
 104 
     | 
    
         
            +
             
     | 
| 
      
 105 
     | 
    
         
            +
                  if return_to.present? && return_to_param_required?
         
     | 
| 
      
 106 
     | 
    
         
            +
                    query_params[:return_to] = return_to
         
     | 
| 
       99 
107 
     | 
    
         
             
                  end
         
     | 
| 
       100 
108 
     | 
    
         | 
| 
       101 
109 
     | 
    
         
             
                  has_referer_shop_name = referer_sanitized_shop_name.present?
         
     | 
| 
         @@ -159,5 +167,15 @@ module ShopifyApp 
     | 
|
| 
       159 
167 
     | 
    
         
             
                def return_address
         
     | 
| 
       160 
168 
     | 
    
         
             
                  session.delete(:return_to) || ShopifyApp.configuration.root_url
         
     | 
| 
       161 
169 
     | 
    
         
             
                end
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
                def return_address_with_params(params)
         
     | 
| 
      
 172 
     | 
    
         
            +
                  uri = URI(return_address)
         
     | 
| 
      
 173 
     | 
    
         
            +
                  uri.query = CGI.parse(uri.query.to_s)
         
     | 
| 
      
 174 
     | 
    
         
            +
                    .symbolize_keys
         
     | 
| 
      
 175 
     | 
    
         
            +
                    .transform_values { |v| v.one? ? v.first : v }
         
     | 
| 
      
 176 
     | 
    
         
            +
                    .merge(params)
         
     | 
| 
      
 177 
     | 
    
         
            +
                    .to_query
         
     | 
| 
      
 178 
     | 
    
         
            +
                  uri.to_s
         
     | 
| 
      
 179 
     | 
    
         
            +
                end
         
     | 
| 
       162 
180 
     | 
    
         
             
              end
         
     | 
| 
       163 
181 
     | 
    
         
             
            end
         
     | 
    
        data/lib/shopify_app/engine.rb
    CHANGED
    
    | 
         @@ -14,7 +14,7 @@ module ShopifyApp 
     | 
|
| 
       14 
14 
     | 
    
         
             
                end
         
     | 
| 
       15 
15 
     | 
    
         | 
| 
       16 
16 
     | 
    
         
             
                initializer "shopify_app.middleware" do |app|
         
     | 
| 
       17 
     | 
    
         
            -
                  app.config.middleware. 
     | 
| 
      
 17 
     | 
    
         
            +
                  app.config.middleware.insert_after(::Rack::Runtime, ShopifyApp::SameSiteCookieMiddleware)
         
     | 
| 
       18 
18 
     | 
    
         
             
                end
         
     | 
| 
       19 
19 
     | 
    
         
             
              end
         
     | 
| 
       20 
20 
     | 
    
         
             
            end
         
     | 
| 
         @@ -1,25 +1,32 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            module ShopifyApp
         
     | 
| 
       2 
2 
     | 
    
         
             
              class SameSiteCookieMiddleware
         
     | 
| 
      
 3 
     | 
    
         
            +
                COOKIE_SEPARATOR = "\n"
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
       3 
5 
     | 
    
         
             
                def initialize(app)
         
     | 
| 
       4 
6 
     | 
    
         
             
                  @app = app
         
     | 
| 
       5 
7 
     | 
    
         
             
                end
         
     | 
| 
       6 
8 
     | 
    
         | 
| 
       7 
9 
     | 
    
         
             
                def call(env)
         
     | 
| 
       8 
     | 
    
         
            -
                   
     | 
| 
       9 
     | 
    
         
            -
                ensure
         
     | 
| 
      
 10 
     | 
    
         
            +
                  status, headers, body = @app.call(env)
         
     | 
| 
       10 
11 
     | 
    
         
             
                  user_agent = env['HTTP_USER_AGENT']
         
     | 
| 
       11 
12 
     | 
    
         | 
| 
       12 
     | 
    
         
            -
                  if headers && headers['Set-Cookie'] && 
     | 
| 
      
 13 
     | 
    
         
            +
                  if headers && headers['Set-Cookie'] &&
         
     | 
| 
      
 14 
     | 
    
         
            +
                      !SameSiteCookieMiddleware.same_site_none_incompatible?(user_agent) &&
         
     | 
| 
       13 
15 
     | 
    
         
             
                      ShopifyApp.configuration.enable_same_site_none
         
     | 
| 
       14 
16 
     | 
    
         | 
| 
       15 
     | 
    
         
            -
                     
     | 
| 
       16 
     | 
    
         
            -
             
     | 
| 
       17 
     | 
    
         
            -
             
     | 
| 
       18 
     | 
    
         
            -
                       
     | 
| 
       19 
     | 
    
         
            -
                         
     | 
| 
      
 17 
     | 
    
         
            +
                    set_cookies = headers['Set-Cookie']
         
     | 
| 
      
 18 
     | 
    
         
            +
                      .split(COOKIE_SEPARATOR)
         
     | 
| 
      
 19 
     | 
    
         
            +
                      .compact
         
     | 
| 
      
 20 
     | 
    
         
            +
                      .map do |cookie|
         
     | 
| 
      
 21 
     | 
    
         
            +
                        cookie << '; Secure' if not cookie =~ /;\s*secure/i
         
     | 
| 
      
 22 
     | 
    
         
            +
                        cookie << '; SameSite=None' unless cookie =~ /;\s*samesite=/i
         
     | 
| 
      
 23 
     | 
    
         
            +
                        cookie
         
     | 
| 
       20 
24 
     | 
    
         
             
                      end
         
     | 
| 
       21 
     | 
    
         
            -
             
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
                    headers['Set-Cookie'] = set_cookies.join(COOKIE_SEPARATOR)
         
     | 
| 
       22 
27 
     | 
    
         
             
                  end
         
     | 
| 
      
 28 
     | 
    
         
            +
             
     | 
| 
      
 29 
     | 
    
         
            +
                  [status, headers, body]
         
     | 
| 
       23 
30 
     | 
    
         
             
                end
         
     | 
| 
       24 
31 
     | 
    
         | 
| 
       25 
32 
     | 
    
         
             
                def self.same_site_none_incompatible?(user_agent)
         
     | 
| 
         @@ -31,8 +38,8 @@ module ShopifyApp 
     | 
|
| 
       31 
38 
     | 
    
         
             
                end
         
     | 
| 
       32 
39 
     | 
    
         | 
| 
       33 
40 
     | 
    
         
             
                def self.webkit_same_site_bug?(sniffer)
         
     | 
| 
       34 
     | 
    
         
            -
                  (sniffer.os == :ios && sniffer.os_version.match 
     | 
| 
       35 
     | 
    
         
            -
                    (sniffer.os == :mac && sniffer.browser == :safari && sniffer.os_version.match 
     | 
| 
      
 41 
     | 
    
         
            +
                  (sniffer.os == :ios && sniffer.os_version.match(/^([0-9]|1[12])[\.\_]/)) ||
         
     | 
| 
      
 42 
     | 
    
         
            +
                    (sniffer.os == :mac && sniffer.browser == :safari && sniffer.os_version.match(/^10[\.\_]14/))
         
     | 
| 
       36 
43 
     | 
    
         
             
                end
         
     | 
| 
       37 
44 
     | 
    
         | 
| 
       38 
45 
     | 
    
         
             
                def self.drops_unrecognized_same_site_cookies?(sniffer)
         
     | 
| 
         @@ -41,11 +48,11 @@ module ShopifyApp 
     | 
|
| 
       41 
48 
     | 
    
         
             
                end
         
     | 
| 
       42 
49 
     | 
    
         | 
| 
       43 
50 
     | 
    
         
             
                def self.chromium_based?(sniffer)
         
     | 
| 
       44 
     | 
    
         
            -
                  sniffer.browser_name.downcase.match 
     | 
| 
      
 51 
     | 
    
         
            +
                  sniffer.browser_name.downcase.match(/chrom(e|ium)/)
         
     | 
| 
       45 
52 
     | 
    
         
             
                end
         
     | 
| 
       46 
53 
     | 
    
         | 
| 
       47 
54 
     | 
    
         
             
                def self.uc_browser?(sniffer)
         
     | 
| 
       48 
     | 
    
         
            -
                  sniffer.user_agent.downcase.match 
     | 
| 
      
 55 
     | 
    
         
            +
                  sniffer.user_agent.downcase.match(/uc\s?browser/)
         
     | 
| 
       49 
56 
     | 
    
         
             
                end
         
     | 
| 
       50 
57 
     | 
    
         | 
| 
       51 
58 
     | 
    
         
             
                def self.uc_browser_version_at_least?(sniffer:, major:, minor:, build:)
         
     | 
    
        data/lib/shopify_app/version.rb
    CHANGED
    
    
    
        data/package.json
    CHANGED
    
    | 
         @@ -1,5 +1,6 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            {
         
     | 
| 
       2 
2 
     | 
    
         
             
              "name": "shopify_app",
         
     | 
| 
      
 3 
     | 
    
         
            +
              "version": "12.0.2",
         
     | 
| 
       3 
4 
     | 
    
         
             
              "repository": "git@github.com:Shopify/shopify_app.git",
         
     | 
| 
       4 
5 
     | 
    
         
             
              "author": "Shopify",
         
     | 
| 
       5 
6 
     | 
    
         
             
              "license": "MIT",
         
     | 
| 
         @@ -23,6 +24,5 @@ 
     | 
|
| 
       23 
24 
     | 
    
         
             
              },
         
     | 
| 
       24 
25 
     | 
    
         
             
              "scripts": {
         
     | 
| 
       25 
26 
     | 
    
         
             
                "test": "./node_modules/.bin/karma start --browsers ChromeHeadless --single-run"
         
     | 
| 
       26 
     | 
    
         
            -
              } 
     | 
| 
       27 
     | 
    
         
            -
              "version": "11.7.1"
         
     | 
| 
      
 27 
     | 
    
         
            +
              }
         
     | 
| 
       28 
28 
     | 
    
         
             
            }
         
     | 
    
        data/shopify_app.gemspec
    CHANGED
    
    | 
         @@ -12,7 +12,7 @@ Gem::Specification.new do |s| 
     | 
|
| 
       12 
12 
     | 
    
         | 
| 
       13 
13 
     | 
    
         
             
              s.add_runtime_dependency('browser_sniffer', '~> 1.1.3')
         
     | 
| 
       14 
14 
     | 
    
         
             
              s.add_runtime_dependency('rails', '> 5.2.1')
         
     | 
| 
       15 
     | 
    
         
            -
              s.add_runtime_dependency('shopify_api', '~>  
     | 
| 
      
 15 
     | 
    
         
            +
              s.add_runtime_dependency('shopify_api', '~> 9.0')
         
     | 
| 
       16 
16 
     | 
    
         
             
              s.add_runtime_dependency('omniauth-shopify-oauth2', '~> 2.2.0')
         
     | 
| 
       17 
17 
     | 
    
         | 
| 
       18 
18 
     | 
    
         
             
              s.add_development_dependency('rake')
         
     | 
    
        metadata
    CHANGED
    
    | 
         @@ -1,14 +1,14 @@ 
     | 
|
| 
       1 
1 
     | 
    
         
             
            --- !ruby/object:Gem::Specification
         
     | 
| 
       2 
2 
     | 
    
         
             
            name: shopify_app
         
     | 
| 
       3 
3 
     | 
    
         
             
            version: !ruby/object:Gem::Version
         
     | 
| 
       4 
     | 
    
         
            -
              version:  
     | 
| 
      
 4 
     | 
    
         
            +
              version: 12.0.4
         
     | 
| 
       5 
5 
     | 
    
         
             
            platform: ruby
         
     | 
| 
       6 
6 
     | 
    
         
             
            authors:
         
     | 
| 
       7 
7 
     | 
    
         
             
            - Shopify
         
     | 
| 
       8 
8 
     | 
    
         
             
            autorequire: 
         
     | 
| 
       9 
9 
     | 
    
         
             
            bindir: bin
         
     | 
| 
       10 
10 
     | 
    
         
             
            cert_chain: []
         
     | 
| 
       11 
     | 
    
         
            -
            date: 2020- 
     | 
| 
      
 11 
     | 
    
         
            +
            date: 2020-02-19 00:00:00.000000000 Z
         
     | 
| 
       12 
12 
     | 
    
         
             
            dependencies:
         
     | 
| 
       13 
13 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       14 
14 
     | 
    
         
             
              name: browser_sniffer
         
     | 
| 
         @@ -44,14 +44,14 @@ dependencies: 
     | 
|
| 
       44 
44 
     | 
    
         
             
                requirements:
         
     | 
| 
       45 
45 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       46 
46 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       47 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 47 
     | 
    
         
            +
                    version: '9.0'
         
     | 
| 
       48 
48 
     | 
    
         
             
              type: :runtime
         
     | 
| 
       49 
49 
     | 
    
         
             
              prerelease: false
         
     | 
| 
       50 
50 
     | 
    
         
             
              version_requirements: !ruby/object:Gem::Requirement
         
     | 
| 
       51 
51 
     | 
    
         
             
                requirements:
         
     | 
| 
       52 
52 
     | 
    
         
             
                - - "~>"
         
     | 
| 
       53 
53 
     | 
    
         
             
                  - !ruby/object:Gem::Version
         
     | 
| 
       54 
     | 
    
         
            -
                    version: ' 
     | 
| 
      
 54 
     | 
    
         
            +
                    version: '9.0'
         
     | 
| 
       55 
55 
     | 
    
         
             
            - !ruby/object:Gem::Dependency
         
     | 
| 
       56 
56 
     | 
    
         
             
              name: omniauth-shopify-oauth2
         
     | 
| 
       57 
57 
     | 
    
         
             
              requirement: !ruby/object:Gem::Requirement
         
     | 
| 
         @@ -298,7 +298,6 @@ files: 
     | 
|
| 
       298 
298 
     | 
    
         
             
            - lib/generators/shopify_app/home_controller/home_controller_generator.rb
         
     | 
| 
       299 
299 
     | 
    
         
             
            - lib/generators/shopify_app/home_controller/templates/home_controller.rb
         
     | 
| 
       300 
300 
     | 
    
         
             
            - lib/generators/shopify_app/home_controller/templates/index.html.erb
         
     | 
| 
       301 
     | 
    
         
            -
            - lib/generators/shopify_app/home_controller/templates/shopify_app_ready_script.html.erb
         
     | 
| 
       302 
301 
     | 
    
         
             
            - lib/generators/shopify_app/install/install_generator.rb
         
     | 
| 
       303 
302 
     | 
    
         
             
            - lib/generators/shopify_app/install/templates/_flash_messages.html.erb
         
     | 
| 
       304 
303 
     | 
    
         
             
            - lib/generators/shopify_app/install/templates/embedded_app.html.erb
         
     |