shopify_app 9.0.0 → 12.0.5

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 (79) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +0 -2
  3. data/CHANGELOG.md +145 -0
  4. data/README.md +180 -126
  5. data/app/assets/javascripts/shopify_app/itp_helper.js +6 -6
  6. data/app/assets/javascripts/shopify_app/storage_access.js +36 -7
  7. data/app/controllers/concerns/shopify_app/authenticated.rb +1 -1
  8. data/app/controllers/shopify_app/callback_controller.rb +14 -5
  9. data/app/controllers/shopify_app/extension_verification_controller.rb +20 -0
  10. data/app/controllers/shopify_app/sessions_controller.rb +44 -18
  11. data/app/views/shopify_app/sessions/enable_cookies.html.erb +3 -1
  12. data/app/views/shopify_app/sessions/request_storage_access.html.erb +2 -1
  13. data/app/views/shopify_app/sessions/top_level_interaction.html.erb +1 -0
  14. data/app/views/shopify_app/shared/redirect.html.erb +1 -0
  15. data/config/locales/cs.yml +23 -0
  16. data/config/locales/da.yml +20 -0
  17. data/config/locales/de.yml +5 -5
  18. data/config/locales/en.yml +1 -1
  19. data/config/locales/es.yml +3 -3
  20. data/config/locales/fi.yml +20 -0
  21. data/config/locales/fr.yml +3 -3
  22. data/config/locales/hi.yml +23 -0
  23. data/config/locales/it.yml +2 -3
  24. data/config/locales/ja.yml +1 -1
  25. data/config/locales/ko.yml +19 -0
  26. data/config/locales/ms.yml +22 -0
  27. data/config/locales/nb.yml +21 -0
  28. data/config/locales/nl.yml +3 -3
  29. data/config/locales/pl.yml +21 -0
  30. data/config/locales/pt-BR.yml +9 -10
  31. data/config/locales/pt-PT.yml +22 -0
  32. data/config/locales/sv.yml +21 -0
  33. data/config/locales/th.yml +20 -0
  34. data/config/locales/tr.yml +22 -0
  35. data/config/locales/zh-CN.yml +3 -3
  36. data/config/locales/zh-TW.yml +1 -2
  37. data/docs/Quickstart.md +44 -16
  38. data/docs/Releasing.md +0 -1
  39. data/docs/install-on-dev-shop.png +0 -0
  40. data/docs/test-your-app.png +0 -0
  41. data/karma.conf.js +1 -0
  42. data/lib/generators/shopify_app/add_after_authenticate_job/add_after_authenticate_job_generator.rb +2 -2
  43. data/lib/generators/shopify_app/add_marketing_activity_extension/add_marketing_activity_extension_generator.rb +39 -0
  44. data/lib/generators/shopify_app/add_marketing_activity_extension/templates/marketing_activities_controller.rb +62 -0
  45. data/lib/generators/shopify_app/home_controller/home_controller_generator.rb +0 -6
  46. data/lib/generators/shopify_app/install/install_generator.rb +27 -11
  47. data/lib/generators/shopify_app/install/templates/_flash_messages.html.erb +1 -17
  48. data/lib/generators/shopify_app/install/templates/embedded_app.html.erb +11 -10
  49. data/lib/generators/shopify_app/install/templates/flash_messages.js +26 -0
  50. data/lib/generators/shopify_app/install/templates/shopify_app.js +15 -0
  51. data/lib/generators/shopify_app/install/templates/shopify_app.rb +6 -3
  52. data/lib/generators/shopify_app/install/templates/shopify_app_index.js +2 -0
  53. data/lib/generators/shopify_app/install/templates/shopify_provider.rb +1 -0
  54. data/lib/generators/shopify_app/install/templates/user_agent.rb +5 -0
  55. data/lib/generators/shopify_app/user_model/templates/db/migrate/create_users.erb +16 -0
  56. data/lib/generators/shopify_app/user_model/templates/user.rb +7 -0
  57. data/lib/generators/shopify_app/user_model/templates/users.yml +4 -0
  58. data/lib/generators/shopify_app/user_model/user_model_generator.rb +38 -0
  59. data/lib/shopify_app.rb +46 -29
  60. data/lib/shopify_app/configuration.rb +24 -9
  61. data/lib/shopify_app/controller_concerns/login_protection.rb +53 -7
  62. data/lib/shopify_app/engine.rb +4 -0
  63. data/lib/shopify_app/managers/webhooks_manager.rb +1 -1
  64. data/lib/shopify_app/middleware/same_site_cookie_middleware.rb +33 -0
  65. data/lib/shopify_app/session/in_memory_session_store.rb +1 -1
  66. data/lib/shopify_app/session/session_repository.rb +2 -2
  67. data/lib/shopify_app/session/session_storage.rb +10 -22
  68. data/lib/shopify_app/session/storage_strategies/shop_storage_strategy.rb +23 -0
  69. data/lib/shopify_app/session/storage_strategies/user_storage_strategy.rb +24 -0
  70. data/lib/shopify_app/utils.rb +7 -0
  71. data/lib/shopify_app/version.rb +1 -1
  72. data/package-lock.json +7212 -11
  73. data/package.json +9 -9
  74. data/service.yml +1 -1
  75. data/shopify_app.gemspec +10 -5
  76. data/translation.yml +1 -1
  77. data/yarn.lock +2555 -1886
  78. metadata +115 -19
  79. data/lib/generators/shopify_app/home_controller/templates/shopify_app_ready_script.html.erb +0 -7
@@ -3,7 +3,6 @@ Releasing ShopifyApp
3
3
  1. Check the Semantic Versioning page for info on how to version the new release: http://semver.org
4
4
  2. Create a pull request with the following changes:
5
5
  * Update the version of ShopifyApp in lib/shopify_app/version.rb
6
- * Update the version in package.json
7
6
  * Add a CHANGELOG entry for the new release with the date
8
7
  * Change the title of the PR to something like: "Packaging for release X.Y.Z"
9
8
  3. Merge your pull request
Binary file
@@ -26,6 +26,7 @@ module.exports = function(config) {
26
26
  preprocessors: {
27
27
  'test/javascripts/**/*test.js': ['webpack'],
28
28
  },
29
+ webpack: {},
29
30
  reporters: karmaReporters,
30
31
  port: 9876,
31
32
  colors: true,
@@ -14,7 +14,7 @@ module ShopifyApp
14
14
 
15
15
  after_authenticate_job_config =
16
16
  " config.after_authenticate_job = "\
17
- "{ job: Shopify::AfterAuthenticateJob, inline: false }\n"
17
+ "{ job: \"Shopify::AfterAuthenticateJob\", inline: false }\n"
18
18
 
19
19
  inject_into_file(
20
20
  'config/initializers/shopify_app.rb',
@@ -23,7 +23,7 @@ module ShopifyApp
23
23
  )
24
24
 
25
25
  unless initializer.include?(after_authenticate_job_config)
26
- shell.say "Error adding after_authneticate_job to config. Add this line manually: #{after_authenticate_job_config}", :red
26
+ shell.say("Error adding after_authenticate_job to config. Add this line manually: #{after_authenticate_job_config}", :red)
27
27
  end
28
28
  end
29
29
 
@@ -0,0 +1,39 @@
1
+ require 'rails/generators/base'
2
+
3
+ module ShopifyApp
4
+ module Generators
5
+ class AddMarketingActivityExtensionGenerator < Rails::Generators::Base
6
+ source_root File.expand_path('../templates', __FILE__)
7
+
8
+ def generate_app_extension
9
+ template "marketing_activities_controller.rb", "app/controllers/marketing_activities_controller.rb"
10
+ generate_routes
11
+ end
12
+
13
+ private
14
+
15
+ def generate_routes
16
+ inject_into_file(
17
+ 'config/routes.rb',
18
+ optimize_indentation(routes, 2),
19
+ after: "root :to => 'home#index'\n"
20
+ )
21
+ end
22
+
23
+ def routes
24
+ <<~EOS
25
+
26
+ resource :marketing_activities, only: [:create, :update] do
27
+ patch :resume
28
+ patch :pause
29
+ patch :delete
30
+ post :republish
31
+ post :preload_form_data
32
+ post :preview
33
+ post :errors
34
+ end
35
+ EOS
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ class MarketingActivitiesController < ShopifyApp::ExtensionVerificationController
4
+ def preload_form_data
5
+ preload_data = {
6
+ "form_data": {}
7
+ }
8
+ render(json: preload_data, status: :ok)
9
+ end
10
+
11
+ def update
12
+ render(json: {}, status: :accepted)
13
+ end
14
+
15
+ def pause
16
+ render(json: {}, status: :accepted)
17
+ end
18
+
19
+ def resume
20
+ render(json: {}, status: :accepted)
21
+ end
22
+
23
+ def delete
24
+ render(json: {}, status: :accepted)
25
+ end
26
+
27
+ def preview
28
+ placeholder_img = "https://cdn.shopify.com/s/files/1/0533/2089/files/placeholder-images-image_small.png"
29
+ preview_response = {
30
+ "desktop": {
31
+ "preview_url": placeholder_img,
32
+ "content_type": "text/html",
33
+ "width": 360,
34
+ "height": 200
35
+ },
36
+ "mobile": {
37
+ "preview_url": placeholder_img,
38
+ "content_type": "text/html",
39
+ "width": 360,
40
+ "height": 200
41
+ }
42
+ }
43
+ render(json: preview_response, status: :ok)
44
+ end
45
+
46
+ def create
47
+ render(json: {}, status: :ok)
48
+ end
49
+
50
+ def republish
51
+ render(json: {}, status: :accepted)
52
+ end
53
+
54
+ def errors
55
+ request_id = params[:request_id]
56
+ message = params[:message]
57
+
58
+ Rails.logger.info("[Marketing Activity App Error Feedback] Request id: #{request_id}, message: #{message}")
59
+
60
+ render(json: {}, status: :ok)
61
+ end
62
+ 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
@@ -7,20 +7,14 @@ module ShopifyApp
7
7
  source_root File.expand_path('../templates', __FILE__)
8
8
 
9
9
  class_option :application_name, type: :array, default: ['My', 'Shopify', 'App']
10
- class_option :api_key, type: :string, default: '<api_key>'
11
- class_option :secret, type: :string, default: '<secret>'
12
- class_option :old_secret, type: :string, default: '<old_secret>'
13
10
  class_option :scope, type: :array, default: ['read_products']
14
11
  class_option :embedded, type: :string, default: 'true'
15
- class_option :api_version, type: :string, default: ShopifyAPI::ApiVersion.latest_stable_version.to_s
12
+ class_option :api_version, type: :string, default: nil
16
13
 
17
14
  def create_shopify_app_initializer
18
15
  @application_name = format_array_argument(options['application_name'])
19
- @api_key = options['api_key']
20
- @secret = options['secret']
21
- @old_secret = options['old_secret']
22
16
  @scope = format_array_argument(options['scope'])
23
- @api_version = options['api_version']
17
+ @api_version = options['api_version'] || ShopifyAPI::Meta.admin_versions.find(&:latest_supported).handle
24
18
 
25
19
  template 'shopify_app.rb', 'config/initializers/shopify_app.rb'
26
20
  end
@@ -42,16 +36,38 @@ module ShopifyApp
42
36
  end
43
37
 
44
38
  def create_embedded_app_layout
45
- if embedded_app?
46
- copy_file 'embedded_app.html.erb', 'app/views/layouts/embedded_app.html.erb'
47
- copy_file '_flash_messages.html.erb', 'app/views/layouts/_flash_messages.html.erb'
39
+ return unless embedded_app?
40
+
41
+ copy_file 'embedded_app.html.erb', 'app/views/layouts/embedded_app.html.erb'
42
+ copy_file '_flash_messages.html.erb', 'app/views/layouts/_flash_messages.html.erb'
43
+
44
+ if ShopifyApp.use_webpacker?
45
+ copy_file('shopify_app.js', 'app/javascript/shopify_app/shopify_app.js')
46
+ copy_file('flash_messages.js', 'app/javascript/shopify_app/flash_messages.js')
47
+ copy_file('shopify_app_index.js', 'app/javascript/shopify_app/index.js')
48
+ append_to_file('app/javascript/packs/application.js', 'require("shopify_app")')
49
+ else
50
+ copy_file('shopify_app.js', 'app/assets/javascripts/shopify_app.js')
51
+ copy_file('flash_messages.js', 'app/assets/javascripts/flash_messages.js')
48
52
  end
49
53
  end
50
54
 
55
+ def create_user_agent_initializer
56
+ template 'user_agent.rb', 'config/initializers/user_agent.rb'
57
+ end
58
+
51
59
  def mount_engine
52
60
  route "mount ShopifyApp::Engine, at: '/'"
53
61
  end
54
62
 
63
+ def insert_hosts_into_development_config
64
+ inject_into_file(
65
+ 'config/environments/development.rb',
66
+ " config.hosts = (config.hosts rescue []) << /\\h+.ngrok.io/\n",
67
+ after: "Rails.application.configure do\n"
68
+ )
69
+ end
70
+
55
71
  private
56
72
 
57
73
  def embedded_app?
@@ -1,19 +1,3 @@
1
1
  <% content_for :javascript do %>
2
- <script type="text/javascript">
3
- var eventName = typeof(Turbolinks) !== 'undefined' ? 'turbolinks:load' : 'DOMContentLoaded';
4
-
5
- if (!document.documentElement.hasAttribute("data-turbolinks-preview")) {
6
- document.addEventListener(eventName, function flash() {
7
- <% if flash[:notice] %>
8
- ShopifyApp.flashNotice(<%== flash[:notice].to_json %>);
9
- <% end %>
10
-
11
- <% if flash[:error] %>
12
- ShopifyApp.flashError(<%== flash[:error].to_json %>);
13
- <% end %>
14
-
15
- document.removeEventListener(eventName, flash)
16
- });
17
- }
18
- </script>
2
+ <%= content_tag(:div, nil, id: 'shopify-app-flash', data: { flash: { notice: flash[:notice], error: flash[:error] } }) %>
19
3
  <% end %>
@@ -5,7 +5,11 @@
5
5
  <% application_name = ShopifyApp.configuration.application_name %>
6
6
  <title><%= application_name %></title>
7
7
  <%= stylesheet_link_tag 'application' %>
8
- <%= javascript_include_tag 'application', "data-turbolinks-track" => true %>
8
+ <% if ShopifyApp.use_webpacker? %>
9
+ <%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
10
+ <% else %>
11
+ <%= javascript_include_tag 'application', "data-turbolinks-track" => true %>
12
+ <% end %>
9
13
  <%= csrf_meta_tags %>
10
14
  </head>
11
15
 
@@ -20,16 +24,13 @@
20
24
 
21
25
  <%= render 'layouts/flash_messages' %>
22
26
 
23
- <script src="https://cdn.shopify.com/s/assets/external/app.js?<%= Time.now.strftime('%Y%m%d%H') %>"></script>
27
+ <script src="https://unpkg.com/@shopify/app-bridge"></script>
24
28
 
25
- <script type="text/javascript">
26
- ShopifyApp.init({
27
- apiKey: "<%= ShopifyApp.configuration.api_key %>",
28
- shopOrigin: "<%= "https://#{ @shop_session.domain }" if @shop_session %>",
29
- debug: <%= Rails.env.development? ? 'true' : 'false' %>,
30
- forceRedirect: true
31
- });
32
- </script>
29
+ <%= content_tag(:div, nil, id: 'shopify-app-init', data: {
30
+ api_key: ShopifyApp.configuration.api_key,
31
+ shop_origin: (@shop_session.domain if @shop_session),
32
+ debug: Rails.env.development?
33
+ } ) %>
33
34
 
34
35
  <% if content_for?(:javascript) %>
35
36
  <div id="ContentForJavascript" data-turbolinks-temporary>
@@ -0,0 +1,26 @@
1
+ var eventName = typeof(Turbolinks) !== 'undefined' ? 'turbolinks:load' : 'DOMContentLoaded';
2
+
3
+ if (!document.documentElement.hasAttribute("data-turbolinks-preview")) {
4
+ document.addEventListener(eventName, function flash() {
5
+ var flashData = JSON.parse(document.getElementById('shopify-app-flash').dataset.flash);
6
+
7
+ var Toast = window['app-bridge'].actions.Toast;
8
+
9
+ if (flashData.notice) {
10
+ Toast.create(app, {
11
+ message: flashData.notice,
12
+ duration: 5000,
13
+ }).dispatch(Toast.Action.SHOW);
14
+ }
15
+
16
+ if (flashData.error) {
17
+ Toast.create(app, {
18
+ message: flashData.error,
19
+ duration: 5000,
20
+ isError: true,
21
+ }).dispatch(Toast.Action.SHOW);
22
+ }
23
+
24
+ document.removeEventListener(eventName, flash)
25
+ });
26
+ }
@@ -0,0 +1,15 @@
1
+ document.addEventListener('DOMContentLoaded', () => {
2
+ var data = document.getElementById('shopify-app-init').dataset;
3
+ var AppBridge = window['app-bridge'];
4
+ var createApp = AppBridge.default;
5
+ window.app = createApp({
6
+ apiKey: data.apiKey,
7
+ shopOrigin: data.shopOrigin,
8
+ });
9
+
10
+ var actions = AppBridge.actions;
11
+ var TitleBar = actions.TitleBar;
12
+ TitleBar.create(app, {
13
+ title: data.page,
14
+ });
15
+ });
@@ -1,12 +1,15 @@
1
1
  ShopifyApp.configure do |config|
2
2
  config.application_name = "<%= @application_name %>"
3
- config.api_key = "<%= @api_key %>"
4
- config.secret = "<%= @secret %>"
3
+ config.api_key = ENV['SHOPIFY_API_KEY']
4
+ config.secret = ENV['SHOPIFY_API_SECRET']
5
5
  config.old_secret = "<%= @old_secret %>"
6
6
  config.scope = "<%= @scope %>" # Consult this page for more scope options:
7
7
  # https://help.shopify.com/en/api/getting-started/authentication/oauth/scopes
8
8
  config.embedded_app = <%= embedded_app? %>
9
9
  config.after_authenticate_job = false
10
10
  config.api_version = "<%= @api_version %>"
11
- config.session_repository = ShopifyApp::InMemorySessionStore
11
+ config.session_repository = 'ShopifyApp::InMemorySessionStore'
12
12
  end
13
+
14
+ # ShopifyApp::Utils.fetch_known_api_versions # Uncomment to fetch known api versions from shopify servers on boot
15
+ # ShopifyAPI::ApiVersion.version_lookup_mode = :raise_on_unknown # Uncomment to raise an error if attempting to use an api version that was not previously known
@@ -0,0 +1,2 @@
1
+ require('./shopify_app')
2
+ require('./flash_messages')
@@ -4,6 +4,7 @@ provider :shopify,
4
4
  ShopifyApp.configuration.api_key,
5
5
  ShopifyApp.configuration.secret,
6
6
  scope: ShopifyApp.configuration.scope,
7
+ per_user_permissions: ShopifyApp.configuration.per_user_tokens,
7
8
  setup: lambda { |env|
8
9
  strategy = env['omniauth.strategy']
9
10
 
@@ -0,0 +1,5 @@
1
+ module ShopifyAPI
2
+ class Base < ActiveResource::Base
3
+ self.headers['User-Agent'] << " | ShopifyApp/#{ShopifyApp::VERSION}"
4
+ end
5
+ end
@@ -0,0 +1,16 @@
1
+ class CreateUsers < ActiveRecord::Migration[<%= rails_migration_version %>]
2
+ def self.up
3
+ create_table :users do |t|
4
+ t.bigint :shopify_user_id, null: false
5
+ t.string :shopify_domain, null: false
6
+ t.string :shopify_token, null: false
7
+ t.timestamps
8
+ end
9
+
10
+ add_index :users, :shopify_user_id, unique: true
11
+ end
12
+
13
+ def self.down
14
+ drop_table :users
15
+ end
16
+ end
@@ -0,0 +1,7 @@
1
+ class User < ActiveRecord::Base
2
+ include ShopifyApp::SessionStorage
3
+
4
+ def api_version
5
+ ShopifyApp.configuration.api_version
6
+ end
7
+ end
@@ -0,0 +1,4 @@
1
+ regular_user:
2
+ shopify_domain: 'regular-shop.myshopify.com'
3
+ shopify_token: 'token'
4
+ shopify_user_id: 1
@@ -0,0 +1,38 @@
1
+ require 'rails/generators/base'
2
+ require 'rails/generators/active_record'
3
+
4
+ module ShopifyApp
5
+ module Generators
6
+ class UserModelGenerator < Rails::Generators::Base
7
+ include Rails::Generators::Migration
8
+ source_root File.expand_path('../templates', __FILE__)
9
+
10
+ def create_user_model
11
+ copy_file 'user.rb', 'app/models/user.rb'
12
+ end
13
+
14
+ def create_user_migration
15
+ migration_template 'db/migrate/create_users.erb', 'db/migrate/create_users.rb'
16
+ end
17
+
18
+ def update_shopify_app_initializer
19
+ gsub_file 'config/initializers/shopify_app.rb', 'ShopifyApp::InMemorySessionStore', 'User'
20
+ end
21
+
22
+ def create_user_fixtures
23
+ copy_file 'users.yml', 'test/fixtures/users.yml'
24
+ end
25
+
26
+ private
27
+
28
+ def rails_migration_version
29
+ Rails.version.match(/\d\.\d/)[0]
30
+ end
31
+
32
+ # for generating a timestamp when using `create_migration`
33
+ def self.next_migration_number(dir)
34
+ ActiveRecord::Generators::Base.next_migration_number(dir)
35
+ end
36
+ end
37
+ end
38
+ end
@@ -4,32 +4,49 @@ require 'shopify_app/version'
4
4
  require 'shopify_api'
5
5
  require 'omniauth-shopify-oauth2'
6
6
 
7
- # config
8
- require 'shopify_app/configuration'
9
-
10
- # engine
11
- require 'shopify_app/engine'
12
-
13
- # utils
14
- require 'shopify_app/utils'
15
-
16
- # controller concerns
17
- require 'shopify_app/controller_concerns/localization'
18
- require 'shopify_app/controller_concerns/itp'
19
- require 'shopify_app/controller_concerns/login_protection'
20
- require 'shopify_app/controller_concerns/embedded_app'
21
- require 'shopify_app/controller_concerns/webhook_verification'
22
- require 'shopify_app/controller_concerns/app_proxy_verification'
23
-
24
- # jobs
25
- require 'shopify_app/jobs/webhooks_manager_job'
26
- require 'shopify_app/jobs/scripttags_manager_job'
27
-
28
- # managers
29
- require 'shopify_app/managers/webhooks_manager'
30
- require 'shopify_app/managers/scripttags_manager'
31
-
32
- # session
33
- require 'shopify_app/session/session_storage'
34
- require 'shopify_app/session/session_repository'
35
- require 'shopify_app/session/in_memory_session_store'
7
+ module ShopifyApp
8
+ def self.rails6?
9
+ Rails::VERSION::MAJOR >= 6
10
+ end
11
+
12
+ def self.use_webpacker?
13
+ rails6? &&
14
+ defined?(Webpacker) == 'constant' &&
15
+ !configuration.disable_webpacker
16
+ end
17
+
18
+ # config
19
+ require 'shopify_app/configuration'
20
+
21
+ # engine
22
+ require 'shopify_app/engine'
23
+
24
+ # utils
25
+ require 'shopify_app/utils'
26
+
27
+ # controller concerns
28
+ require 'shopify_app/controller_concerns/localization'
29
+ require 'shopify_app/controller_concerns/itp'
30
+ require 'shopify_app/controller_concerns/login_protection'
31
+ require 'shopify_app/controller_concerns/embedded_app'
32
+ require 'shopify_app/controller_concerns/webhook_verification'
33
+ require 'shopify_app/controller_concerns/app_proxy_verification'
34
+
35
+ # jobs
36
+ require 'shopify_app/jobs/webhooks_manager_job'
37
+ require 'shopify_app/jobs/scripttags_manager_job'
38
+
39
+ # managers
40
+ require 'shopify_app/managers/webhooks_manager'
41
+ require 'shopify_app/managers/scripttags_manager'
42
+
43
+ # middleware
44
+ require 'shopify_app/middleware/same_site_cookie_middleware'
45
+
46
+ # session
47
+ require 'shopify_app/session/storage_strategies/shop_storage_strategy'
48
+ require 'shopify_app/session/storage_strategies/user_storage_strategy'
49
+ require 'shopify_app/session/session_storage'
50
+ require 'shopify_app/session/session_repository'
51
+ require 'shopify_app/session/in_memory_session_store'
52
+ end