diff --git a/deploy.sh b/deploy.sh index 90ed596..7194123 100755 --- a/deploy.sh +++ b/deploy.sh @@ -1,8 +1,9 @@ set -e +npm install npm run production cd docs composer install npm install npm run production - cp -R build_production/* ../dist/tenancy/docs \ No newline at end of file + cp -R build_production/* ../dist/docs \ No newline at end of file diff --git a/dist/docs/1.x/application-testing/index.html b/dist/docs/1.x/application-testing/index.html new file mode 100644 index 0000000..1b114e2 --- /dev/null +++ b/dist/docs/1.x/application-testing/index.html @@ -0,0 +1,432 @@ + + + + + + + + + + + + + + + + + + + + Application Testing | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Application Testing

+

To test your application with this package installed, you can create tenants in the setUp() method of your test case:

+
protected function setUp(): void
+{
+    parent::setUp();
+
+    tenant()->create('test.localhost');
+    tenancy()->init('test.localhost');
+}
+

If you're using the database storage driver, you will also need to run the create_tenants_table migration:

+
protected function setUp(): void
+{
+    parent::setUp();
+
+    $this->call('migrate', [
+        '--path' => database_path('migrations'),
+        '--database' => 'sqlite',
+    ]);
+
+    tenant()->create('test.localhost');
+    tenancy()->init('test.localhost');
+}
+

If you're using the Redis storage driver, flush the database in setUp():

+
protected function setUp(): void
+{
+    parent::setUp();
+
+    // make sure you're using a different connection for testing to avoid losing data
+    Redis::connection('tenancyTesting')->flushdb();
+
+    tenant()->create('test.localhost');
+    tenancy()->init('test.localhost');
+}
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/configuration/index.html b/dist/docs/1.x/configuration/index.html new file mode 100644 index 0000000..5b35be0 --- /dev/null +++ b/dist/docs/1.x/configuration/index.html @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + Configuration | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Configuration

+

The config/tenancy.php file lets you configure how the package behaves.

+
+

Note: If the tenancy.php file doesn't exist in your config directory, you can publish it by running php artisan vendor:publish --provider='Stancl\Tenancy\TenancyServiceProvider' --tag=config

+
+

storage_driver, storage

+

This lets you configure the driver for tenant storage, i.e. what will be used to store information about your tenants. You can read more about this on the Storage Drivers page.

+

Available storage drivers:

+
    +
  • Stancl\Tenancy\StorageDrivers\RedisStorageDriver
  • +
  • Stancl\Tenancy\StorageDrivers\DatabaseStorageDriver
  • +
+

tenant_route_namespace

+

Controller namespace used for routes in routes/tenant.php. The default value is the same as the namespace for web.php routes.

+

exempt_domains

+

If a hostname from this array is visited, the tenant.php routes won't be registered, letting you use the same routes as in that file.

+

database

+

The application's default connection will be switched to a new one — tenant. This connection will be based on the connection specified in tenancy.database.based_on. The database name will be tenancy.database.prefix + tenant UUID + tenancy.database.suffix.

+

You can set the suffix to .sqlite if you're using sqlite and want the files to be with the .sqlite extension. Conversely, you can leave the suffix empty if you're using MySQL, for example.

+

redis

+

If tenancy.redis.tenancy is set to true, connections listed in tenancy.redis.prefixed_connections will be prefixed with config('tenancy.redis.prefix_base') . $uuid.

+
+

Note: You need phpredis for multi-tenant Redis.

+
+

cache

+

The CacheManager instance that's resolved when you use the Cache or the cache() helper will be replaced by Stancl\Tenancy\CacheManager. This class automatically uses tags. The tag will look like config('tenancy.cache.tag_base') . $uuid.

+

If you need to store something in global, non-tenant cache,

+

filesystem

+

The storage_path() will be suffixed with a directory named config('tenancy.filesystem.suffix_base') . $uuid.

+

The root of each disk listed in tenancy.filesystem.disks will be suffixed with config('tenancy.filesystem.suffix_base') . $uuid.

+

For disks listed in root_override, the root will be that string with %storage_path% replaced by storage_path() after tenancy has been initialized. All other disks will be simply suffixed with tenancy.filesystem.suffix_base + the tenant UUID.

+

Read more about this on the Filesystem Tenancy page.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/console-commands/index.html b/dist/docs/1.x/console-commands/index.html new file mode 100644 index 0000000..0b48254 --- /dev/null +++ b/dist/docs/1.x/console-commands/index.html @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + Console Commands | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Console Commands

+

The package comes with some artisan commands that will help you during development.

+

Migrate

+

The most important command. To use tenants, you have to be able to migrate their databases.

+

You can use the tenants:migrate command to migrate tenant's databases. You can also specify which tenants' databases should be migrated using the --tenants option.

+
php artisan tenants:migrate --tenants=8075a580-1cb8-11e9-8822-49c5d8f8ff23
+
+

Note: Tenant migrations must be located in database/migrations/tenant.

+
+

You can use these commands outside the command line as well. If you want to migrate a tenant's database in a controller, you can use the Artisan facade.

+
$tenant = tenant()->create('tenant1.localhost');
+
+\Artisan::call('tenants:migrate', [
+    '--tenants' => [$tenant['uuid']]
+]);
+

Rollback & seed

+
    +
  • Rollback: tenants:rollback
  • +
  • Seed: tenants:seed
  • +
+

Similarly to migrate, these commands accept a --tenants option.

+

Run

+

You can use the tenants:run command to run your own commands for tenants.

+

If your command's signature were email:send {--queue} {--subject=} {body}, you would run this command like this:

+
php artisan tenants:run email:send --tenants=8075a580-1cb8-11e9-8822-49c5d8f8ff23 --option="queue=1" --option="subject=New Feature" --argument="body=We have launched a new feature. ..."
+

Tenant list

+
php artisan tenants:list
+Listing all tenants.
+[Tenant] uuid: dbe0b330-1a6e-11e9-b4c3-354da4b4f339 @ localhost
+[Tenant] uuid: 49670df0-1a87-11e9-b7ba-cf5353777957 @ dev.localhost
+

Selectively clearing tenant cache

+

You can delete specific tenants' cache by using the --tags option on cache:clear:

+
php artisan cache:clear --tags=tenantdbe0b330-1a6e-11e9-b4c3-354da4b4f339
+

The tag is config('tenancy.cache.tag_base') . $uuid.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/creating-tenants/index.html b/dist/docs/1.x/creating-tenants/index.html new file mode 100644 index 0000000..f20b7ca --- /dev/null +++ b/dist/docs/1.x/creating-tenants/index.html @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + + + Creating Tenants | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Creating Tenants

+
+

Make sure your database is correctly configured before creating tenants.

+
+

To create a tenant, you can use

+
tenant()->create('tenant1.yourapp.com');
+
+

Tip: All domains under .localhost are routed to 127.0.0.1 on most operating systems. This is useful for development.

+
+

If you want to set some data while creating the tenant, you can pass an array with the data as the second argument:

+
tenant()->create('tenant2.yourapp.com', [
+    'plan' => 'free'
+]);
+

The create method returns an array with tenant information (uuid, domain and whatever else you supplied).

+
+

Note: Creating a tenant doesn't run migrations automatically. You have to do that yourself.

+
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/custom-database-names/index.html b/dist/docs/1.x/custom-database-names/index.html new file mode 100644 index 0000000..77b7395 --- /dev/null +++ b/dist/docs/1.x/custom-database-names/index.html @@ -0,0 +1,409 @@ + + + + + + + + + + + + + + + + + + + + Custom Database Names | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Custom Database Names

+

If you want to specify the tenant's database name, set the tenancy.database_name_key configuration key to the name of the key that is used to specify the database name in the tenant storage. You must use a name that you won't use for storing other data, so it's recommended to avoid names like database and use names like _stancl_tenancy_database_name instead. Then just give the key a value during the tenant creation process:

+
>>> tenant()->create('example.com', [
+    '_stancl_tenancy_database_name' => 'example_com'
+])
+=> [
+     "uuid" => "49670df0-1a87-11e9-b7ba-cf5353777957",
+     "domain" => "example.com",
+     "_stancl_tenancy_database_name" => "example_com",
+   ]
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/development/index.html b/dist/docs/1.x/development/index.html new file mode 100644 index 0000000..92ebef4 --- /dev/null +++ b/dist/docs/1.x/development/index.html @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + Development | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Development

+

Running tests

+

With Docker

+

If you have Docker installed, simply run ./test. When you're done testing, run docker-compose down to shut down the containers.

+

Without Docker

+

If you run the tests of this package, please make sure you don't store anything in Redis @ 127.0.0.1:6379 db#14. The contents of this database are flushed everytime the tests are run.

+

Some tests are run only if the CI, TRAVIS and CONTINUOUS_INTEGRATION environment variables are set to true. This is to avoid things like bloating your MySQL instance with test databases.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/difference-between-this-package-and-others/index.html b/dist/docs/1.x/difference-between-this-package-and-others/index.html new file mode 100644 index 0000000..46c3f00 --- /dev/null +++ b/dist/docs/1.x/difference-between-this-package-and-others/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + Difference Between This Package And Others | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Difference Between This Package And Others

+

A frequently asked question is the difference between this package and tenancy/multi-tenant.

+

Packages like tenancy/multi-tenant and tenancy/tenancy give you an API for making your application multi-tenant. They give you a tenant DB connection, traits to apply on your models, a guide on creating your own tenant-aware cache, etc.

+

This package makes your application multi-tenant automatically and attempts to make you not have to change (m)any things in your code.

+

Which one should you use?

+

Depends on what you prefer.

+

If you want full control and make your application multi-tenant yourself, use tenancy/multi-tenant.

+

If you want to focus on writing your application instead of tenancy implementations, use stancl/tenancy.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/digging-deeper/index.html b/dist/docs/1.x/digging-deeper/index.html new file mode 100644 index 0000000..e761171 --- /dev/null +++ b/dist/docs/1.x/digging-deeper/index.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + Digging Deeper | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + diff --git a/dist/docs/1.x/event-system/index.html b/dist/docs/1.x/event-system/index.html new file mode 100644 index 0000000..95def89 --- /dev/null +++ b/dist/docs/1.x/event-system/index.html @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + The Event System | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

The Event System

+

You can use event hooks to change the behavior of the tenancy boostrapping and tenancy ending processes.

+

The following events are available:

+
    +
  • boostrapping
  • +
  • boostrapped
  • +
  • ending
  • +
  • ended
  • +
+

Tenant-specific database connection example

+

You can hook into these events using Tenancy::<eventName>:

+
\Tenancy::boostrapping(function ($tenantManager) {
+    if ($tenantManager->tenant['uuid'] === 'someUUID') {
+        config(['database.connections.someDatabaseConnection' => $tenantManager->tenant['databaseConnection']]);
+        $tenantManager->database->useConnection('someDatabaseConnection');
+
+        return ['database'];
+    }
+});
+

The example above checks whether the current tenant has an uuid of someUUID. If yes, it creates a new database connection based on data stored in the tenant's storage. Then it changes the default database connection. Finally, it returns an array of the events that this callback prevents.

+

The following actions can be prevented:

+
    +
  • database connection switch: database
  • +
  • Redis prefix: redis
  • +
  • CacheManager switch: cache
  • +
  • Filesystem changes: filesystem
  • +
+

Tenant-specific configuration example

+

Another common use case for events is tenant-specific config:

+
\Tenancy::bootstrapped(function ($tenantManager) {
+    config(['some.api.key' => $tenantManager->tenant['api_key']);
+});
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/filesystem-tenancy/index.html b/dist/docs/1.x/filesystem-tenancy/index.html new file mode 100644 index 0000000..ede1fab --- /dev/null +++ b/dist/docs/1.x/filesystem-tenancy/index.html @@ -0,0 +1,423 @@ + + + + + + + + + + + + + + + + + + + + Filesystem Tenancy | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Filesystem Tenancy

+
+

Note: It's important to differentiate between storage_path() and the Storage facade. The Storage facade is what you use to put files into storage, i.e. Storage::disk('local')->put(). storage_path() is used to get the path to the storage directory.

+
+

The storage_path() will be suffixed with a directory named config('tenancy.filesystem.suffix_base') . $uuid.

+

The root of each disk listed in tenancy.filesystem.disks will be suffixed with config('tenancy.filesystem.suffix_base') . $uuid.

+

However, this alone would cause unwanted behavior. It would work for S3 and similar disks, but for local disks, this would result in /path_to_your_application/storage/app/tenant1e22e620-1cb8-11e9-93b6-8d1b78ac0bcd/. That's not what we want. We want /path_to_your_application/storage/tenant1e22e620-1cb8-11e9-93b6-8d1b78ac0bcd/app/.

+

That's what the root_override section is for. %storage_path% gets replaced by storage_path() after tenancy has been initialized. The roots of disks listed in the root_override section of the config will be replaced accordingly. All other disks will be simply suffixed with tenancy.filesystem.suffix_base + the tenant UUID.

+

Since storage_path() will be suffixed, your folder structure will look like this:

+

The folder structure

+

If you write to these directories, you will need to create them after you create the tenant. See the docs for PHP's mkdir.

+

Logs will be saved to storage/logs regardless of any changes to storage_path().

+

One thing that you will have to change if you use storage similarly to the example on the image is your use of the helper function asset() (that is, if you use it).

+

You need to make this change to your code:

+
-  asset("storage/images/products/$product_id.png");
++  tenant_asset("images/products/$product_id.png");
+

Note that all (public) tenant assets have to be in the app/public/ subdirectory of the tenant's storage directory, as shown in the image above.

+

This is what the backend of tenant_asset() returns:

+
// TenantAssetsController
+return response()->file(storage_path('app/public/' . $path));
+

With default filesystem configuration, these two commands are equivalent:

+
Storage::disk('public')->put($filename, $data);
+Storage::disk('local')->put("public/$filename", $data);
+

If you want to store something globally, simply create a new disk and don't add it to the tenancy.filesystem.disks config.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/getting-started/index.html b/dist/docs/1.x/getting-started/index.html new file mode 100644 index 0000000..c9f249a --- /dev/null +++ b/dist/docs/1.x/getting-started/index.html @@ -0,0 +1,422 @@ + + + + + + + + + + + + + + + + + + + + Getting Started | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Getting Started

+

stancl/tenancy is a Laravel multi-database tenancy package. It is designed in a way that requires you to make no changes to your codebase. Instead of applying traits on models and replacing every single reference to cache by a reference to a tenant-aware cache, the package lets you write your app without thinking about tenancy. It handles tenancy automatically.

+
+

Note: Filesystem is the only thing that can be a little problematic. Be sure to read that page.

+
+

How does it work?

+

A user visits client1.yourapp.com. The package identifies the tenant who this domain belongs to, and automatically does the following:

+
    +
  • switches database connection
  • +
  • replaces the default cache manager
  • +
  • switches Redis connection
  • +
  • changes filesystem root paths
  • +
+

The benefits of this being taken care of by the package are:

+
    +
  • separation of concerns: you should write your app, not tenancy implementations
  • +
  • reliability: you won't have to fear that you forgot to replace a reference to cache by a tenant-aware cache call. This is something you might worry about if you're implementing tenancy into an existing application.
  • +
+

What is multi-tenancy?

+

Multi-tenancy is the ability to provide your application to multiple customers (who have their own users and other resources) from a single instance of your application. Think Slack, Shopify, etc.

+

Multi-tenancy can be single-database and multi-database.

+

Single-database tenancy means that your application uses only a single database. The way this is usually implemented is that instead of having the id, title, user_id and body columns in your posts table, you will also have a tenant_id column. This approach works until you need custom databases for your clients. It's also easy to implement, it basically boils down to having your models use a trait which adds a global scope.

+

Multi-database tenancy, the type that this package provides, lets you use a separate database for each tenant. The benefits of this approach are scalability, compliance (some clients need to have the database on their server) and mitigation of risks such as showing the wrong tenant's data to a user. The downside is that this model is harder to implement, which is why this package exists.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/horizon/index.html b/dist/docs/1.x/horizon/index.html new file mode 100644 index 0000000..2016837 --- /dev/null +++ b/dist/docs/1.x/horizon/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + Horizon Integration | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Horizon Integration

+
+

Make sure your queue is correctly configured before using Horizon.

+
+

Jobs are automatically tagged with the tenant's uuid and domain:

+

UUID and domain tags

+

You can use these tags to monitor specific tenants' jobs:

+

Monitoring tags

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/https-certificates/index.html b/dist/docs/1.x/https-certificates/index.html new file mode 100644 index 0000000..7710b01 --- /dev/null +++ b/dist/docs/1.x/https-certificates/index.html @@ -0,0 +1,417 @@ + + + + + + + + + + + + + + + + + + + + HTTPS Certificates | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

HTTPS certificates

+

HTTPS certificates are very easy to deal with if you use the yourclient1.yourapp.com, yourclient2.yourapp.com model. You can use a wildcard HTTPS certificate.

+

If you use the model where second level domains are used, there are multiple ways you can solve this.

+

This guide focuses on nginx.

+

1. Use nginx with the lua module

+

Specifically, you're interested in the ssl_certificate_by_lua_block directive. Nginx doesn't support using variables such as the hostname in the ssl_certificate directive, which is why the lua module is needed.

+

This approach lets you use one server block for all tenants.

+

2. Add a simple server block for each tenant

+

You can store most of your config in a file, such as /etc/nginx/includes/tenant, and include this file into tenant server blocks.

+
server {
+  include includes/tenant;
+  server_name foo.bar;
+  # ssl_certificate /etc/foo/...;
+}
+

Generating certificates

+

You can generate a certificate using certbot. If you use the --nginx flag, you will need to run certbot as root. If you use the --webroot flag, you only need the user that runs it to have write access to the webroot directory (or perhaps webroot/.well-known is enough) and some certbot files (you can specify these using --work-dir, --config-dir and --logs-dir).

+

Creating this config dynamically from PHP is not easy, but is probably feasible. Giving www-data write access to /etc/nginx/sites-available/tenants.conf should work.

+

However, you still need to reload nginx configuration to apply the changes to configuration. This is problematic and I'm not sure if there is a simple and secure way to do this from PHP.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/index.html b/dist/docs/1.x/index.html new file mode 100644 index 0000000..6a49dfc --- /dev/null +++ b/dist/docs/1.x/index.html @@ -0,0 +1,8 @@ + + + + + + stancl/tenancy + + \ No newline at end of file diff --git a/dist/docs/1.x/installation/index.html b/dist/docs/1.x/installation/index.html new file mode 100644 index 0000000..4f8bc02 --- /dev/null +++ b/dist/docs/1.x/installation/index.html @@ -0,0 +1,427 @@ + + + + + + + + + + + + + + + + + + + + Installation | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Installation

+

Laravel 5.8 or higher is needed.

+

Require the package via composer

+

First you need to require the package using composer:

+
composer require stancl/tenancy
+

Automatic installation

+

To install the package, simply run

+
php artisan tenancy:install
+

You will be asked if you want to store your data in Redis or a relational database. You can read more about this on the Storage Drivers page.

+

This will do all the steps listed in the Manual installation section for you.

+

The only thing you have to do now is create a database/Redis connection. Read the Storage Drivers page for information about that.

+

Manual installation

+

If you prefer installing the package manually, you can do that too. It shouldn't take more than a minute either way.

+

Setting up middleware

+

Now open app/Http/Kernel.php and make the InitializeTenancy middleware top priority, so that it gets executed before anything else, making sure things like the database switch connections soon enough:

+
protected $middlewarePriority = [
+    \Stancl\Tenancy\Middleware\InitializeTenancy::class,
+    // ...
+];
+

Creating routes

+

The package lets you have tenant routes and "exempt" routes. Tenant routes are your application's routes. Exempt routes are routes exempt from tenancy — landing pages, sign up forms, and routes for managing tenants.

+

Routes in routes/web.php are exempt, whereas routes in routes/tenant.php have the InitializeTenancy middleware automatically applied on them.

+

So, to create tenant routes, put those routes in a new file called routes/tenant.php.

+

Configuration

+

Run the following:

+
php artisan vendor:publish --provider='Stancl\Tenancy\TenancyServiceProvider' --tag=config
+

This creates a config/tenancy.php. You can use it to configure how the package works.

+

Configuration is explained in detail on the Configuration page.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/integrations/index.html b/dist/docs/1.x/integrations/index.html new file mode 100644 index 0000000..033fc1f --- /dev/null +++ b/dist/docs/1.x/integrations/index.html @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + Integrations | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Integrations

+

This package naturally integrates well with Laravel packages, since it does not rely on you explicitly specifying database connections.

+

There are some exceptions, though. Telescope integration, for example, requires you to change the database connection in config/telescope.php to a non-default one, because the default connection is switched to the tenant connection. Some packages should use a central connection for data storage.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/jobs-queues/index.html b/dist/docs/1.x/jobs-queues/index.html new file mode 100644 index 0000000..ede6699 --- /dev/null +++ b/dist/docs/1.x/jobs-queues/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + Jobs & Queues | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Jobs & Queues

+

Jobs are automatically multi-tenant, which means that if a job is dispatched while tenant A is initialized, the job will operate with tenant A's database, cache, filesystem, and Redis.

+

However, if you're using the database or redis queue driver, you have to make a small tweak to your queue configuration.

+

Open config/queue.php and make sure your queue driver has an explicitly set connection. Otherwise it would use the default one, which would cause issues, since database.default is changed by the package and Redis connections are prefixed.

+

If you're using database, add a new line to queue.connections.database:

+
'connection' => 'mysql',
+

where 'mysql' is the name of your non-tenant database connection with a jobs table.

+

If you're using Redis, make sure its 'connection' is not in tenancy.redis.prefixed_connections.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/middleware-configuration/index.html b/dist/docs/1.x/middleware-configuration/index.html new file mode 100644 index 0000000..e70158f --- /dev/null +++ b/dist/docs/1.x/middleware-configuration/index.html @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + + Middleware Configuration | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Middleware Configuration

+

When a tenant route is visited and the tenant can't be identified, an exception is thrown. If you want to change this behavior, to a redirect for example, add this to your app/Providers/AppServiceProvider.php's boot() method:

+
// use Stancl\Tenancy\Middleware\InitializeTenancy;
+
+$this->app->bind(InitializeTenancy::class, function ($app) {
+    return new InitializeTenancy(function ($exception) {
+        // return redirect()->route('foo');
+    });
+});
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/misc-tips/index.html b/dist/docs/1.x/misc-tips/index.html new file mode 100644 index 0000000..2ea9621 --- /dev/null +++ b/dist/docs/1.x/misc-tips/index.html @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + + + Miscellaneous Tips | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Miscellaneous Tips

+

Tenant Redirect

+

A customer has signed up on your website, you have created a new tenant and now you want to redirect the customer to their website. You can use the tenant() method on Redirect, like this:

+
// tenant sign up controller
+return redirect()->route('dashboard')->tenant($tenant['domain']);
+

Custom ID scheme

+

If you don't want to use UUIDs and want to use something more human-readable (even domain concatenated with uuid, for example), you can create a custom class for this:

+
use Stancl\Tenancy\Interfaces\UniqueIdentifierGenerator;
+
+class MyUniqueIDGenerator implements UniqueIdentifierGenerator
+{
+    public static function handle(string $domain, array $data): string
+    {
+        return $domain . \Webpatser\Uuid\Uuid::generate(1, $domain);
+    }
+}
+

and then set the tenancy.unique_id_generator config to the full path to your class.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/stay-updated/index.html b/dist/docs/1.x/stay-updated/index.html new file mode 100644 index 0000000..d0faf79 --- /dev/null +++ b/dist/docs/1.x/stay-updated/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + Stay Updated | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Stay Updated

+

If you'd like to be notified about new versions, you can sign up for e-mail notifications or join our Telegram channel.

+

You can choose whether you want to receive emails about major versions and/or minor versions.

+
    +
  • Major versions include breaking changes. Composer won't know about these versions and won't update to them. Major versions will be released about once every 6 months.
  • +
  • Minor versions include backwards-compatible features and bug fixes.
  • +
+
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/storage-drivers/index.html b/dist/docs/1.x/storage-drivers/index.html new file mode 100644 index 0000000..30bb756 --- /dev/null +++ b/dist/docs/1.x/storage-drivers/index.html @@ -0,0 +1,429 @@ + + + + + + + + + + + + + + + + + + + + Storage Drivers | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Storage Drivers

+

Storage drivers are used to store a list of all tenants, their domains and any extra information you store about your tenants (e.g. their plan).

+

Currently, database and Redis storage drivers are available as part of the package. However, you can write your own (and contribute ❤️) storage drivers.

+

Database

+

The database storage driver lets you store tenant information in a relational database like MySQL, PostgreSQL and SQLite.

+

The benefit of this storage driver is that you don't have to use both Redis and a database for your data. Also you don't have to do as much configuration.

+

To use this driver, you need to have a tenants table. You may also use a custom database connection. By default, tenancy.storage.db.connection is set to central, which means that the central database connection will be used to store tenants. This connection is not automatically created, so you'd have to create it manually. You can create database connections in the config/database.php file.

+

If you'd like to use an existing connection, you can set this config to the name of the connection, e.g. mysql.

+

To create the tenants table, you can use the migration that comes with this package. If you haven't published it during installation, publish it now:

+
php artisan vendor:publish --provider='Stancl\Tenancy\TenancyServiceProvider' --tag=migrations
+

By default, all of your data will be stored in the JSON column data. If you want to store some data in a dedicated column (to leverage indexing, for example), add the column to the migration and to tenancy.custom_columns config.

+

Finally, run the migration:

+
php artisan migrate
+
+

If you use a non-default connection, such as central, you have to specify which DB to migrate using the --database option.

+

If you have existing migrations related to your app in database/migrations, move them to database/migrations/tenant. You can read more about tenant migrations here.

+
+

Redis

+

The Redis storage driver lets you store tenant information in Redis, a high-performance key-value store.

+

The benefit of this storage driver is its performance.

+

Note that you need to configure persistence on your Redis instance if you don't want to lose all information about tenants.

+

Read the Redis documentation page on persistence. You should definitely use AOF and if you want to be even more protected from data loss, you can use RDB in conjunction with AOF.

+

If your cache driver is Redis and you don't want to use AOF with it, run two Redis instances. Otherwise, just make sure you use a different database (number) for tenancy and for anything else.

+

To use this driver, create a new Redis connection in the database.redis configuration (config/database.php) called tenancy.

+
'tenancy' => [
+    'host' => env('TENANCY_REDIS_HOST', '127.0.0.1'),
+    'password' => env('TENANCY_REDIS_PASSWORD', null),
+    'port' => env('TENANCY_REDIS_PORT', 6380), // different port = separate Redis instance
+    'database' => env('TENANCY_REDIS_DB', 3), // alternatively, different database number
+],
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/telescope/index.html b/dist/docs/1.x/telescope/index.html new file mode 100644 index 0000000..d539c11 --- /dev/null +++ b/dist/docs/1.x/telescope/index.html @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + + + + + + Telescope Integration | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Telescope Integration

+

Requests in Telescope are automatically tagged with the tenant uuid and domain:

+

Telescope Request with tags

+

This lets you filter requests by uuid and domain:

+

Filtering by uuid +Filtering by domain

+

If you'd like to set Telescope tags in your own code, e.g. in your AppServiceProvider, replace your Telescope::tag() call like this:

+
\Tenancy::integrationEvent('telescope', function ($entry) {
+    return ['abc']; // your logic
+});
+

Tenancy tags merged with tag abc

+

Once Telescope 3 is released, you won't have to do this.

+

To have Telescope working, make sure your telescope.storage.database.connection points to a non-tenant connection. It's that way by default, so for most projects, Telescope should work out of the box.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/tenancy-initialization/index.html b/dist/docs/1.x/tenancy-initialization/index.html new file mode 100644 index 0000000..8e26c5e --- /dev/null +++ b/dist/docs/1.x/tenancy-initialization/index.html @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + + + Tenancy Initialization | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Tenancy Initialization

+

Tenancy can be initialized by calling tenancy()->init(). The InitializeTenancy middleware calls this method automatically.

+

You can end a tenancy session using tenancy()->end(). This is useful if you need to run multiple tenant sessions or a mixed tenant/non-tenant session in a single request/command.

+

The tenancy()->init() method calls bootstrap().

+

This method switches database connection, Redis connection (if Redis tenancy is enabled), cache and filesystem root paths.

+

This page goes through the code that actually makes this happen. You don't have to read this page to use the package, but it will give you insight into the magic that's happening in the background, so that you can be more confident in it.

+

Database tenancy

+

bootstrap() runs the following method:

+
public function switchDatabaseConnection()
+{
+    $this->database->connect($this->getDatabaseName());
+}
+

If tenancy.database_name_key is set and present in the current tenant's data, the getDatabaseName() returns the stored database_name. Otherwise it returns the prefix + uuid + suffix.

+
public function getDatabaseName($tenant = []): string
+{
+    $tenant = $tenant ?: $this->tenant;
+    if ($key = $this->app['config']['tenancy.database_name_key']) {
+        if (isset($tenant[$key])) {
+            return $tenant[$key];
+        }
+    }
+    return $this->app['config']['tenancy.database.prefix'] . $tenant['uuid'] . $this->app['config']['tenancy.database.suffix'];
+}
+

This is passed as an argument to the connect() method. This method creates a new database connection and sets it as the default one.

+
public function connect(string $database)
+{
+    $this->createTenantConnection($database);
+    $this->useConnection('tenant');
+}
+
+public function createTenantConnection(string $database_name)
+{
+    // Create the `tenant` database connection.
+    $based_on = config('tenancy.database.based_on') ?: config('database.default');
+    config()->set([
+        'database.connections.tenant' => config('database.connections.' . $based_on),
+    ]);
+    // Change DB name
+    $database_name = $this->getDriver() === 'sqlite' ? database_path($database_name) : $database_name;
+    config()->set(['database.connections.tenant.database' => $database_name]);
+}
+
+public function useConnection(string $connection)
+{
+    // $this->database = Illuminate\Database\DatabaseManager
+    $this->database->setDefaultConnection($connection);
+    $this->database->reconnect($connection);
+}
+

Redis tenancy

+

The bootstrap() method calls setPhpRedisPrefix() if tenancy.redis.tenancy is true.

+

This method cycles through the tenancy.redis.prefixed_connections and sets their prefix to tenancy.redis.prefix_base + uuid.

+
public function setPhpRedisPrefix($connections = ['default'])
+{
+    // [...]
+    foreach ($connections as $connection) {
+        $prefix = $this->app['config']['tenancy.redis.prefix_base'] . $this->tenant['uuid'];
+        $client = Redis::connection($connection)->client();
+        try {
+            // [...]
+            $client->setOption($client::OPT_PREFIX, $prefix);
+        } catch (\Throwable $t) {
+            throw new PhpRedisNotInstalledException();
+        }
+    }
+}
+

Cache tenancy

+

bootstrap() calls tagCache() which replaces the 'cache' key in the service container with a different CacheManager.

+
public function tagCache()
+{
+    // [...]
+    $this->app->extend('cache', function () {
+        return new \Stancl\Tenancy\CacheManager($this->app);
+    });
+}
+

This CacheManager forwards all calls to the inner store, but also adds tag which "scope" the cache and allow for selective cache clearing:

+
class CacheManager extends BaseCacheManager
+{
+    public function __call($method, $parameters)
+    {
+        $tags = [config('tenancy.cache.tag_base') . tenant('uuid')];
+        if ($method === 'tags') {
+            if (\count($parameters) !== 1) {
+                throw new \Exception("Method tags() takes exactly 1 argument. {count($parameters)} passed.");
+            }
+            $names = $parameters[0];
+            $names = (array) $names; // cache()->tags('foo') https://laravel.com/docs/5.7/cache#removing-tagged-cache-items
+            return $this->store()->tags(\array_merge($tags, $names));
+        }
+        return $this->store()->tags($tags)->$method(...$parameters);
+    }
+}
+

Filesystem tenancy

+

bootstrap() calls suffiexFilesystemRootPaths(). This method changes storage_path() and the roots of disks listed in config('tenancy.filesystem.disks). You can read more about this on the Filesystem Tenancy page.

+
public function suffixFilesystemRootPaths()
+{
+    // [...]
+    $suffix = $this->app['config']['tenancy.filesystem.suffix_base'] . tenant('uuid');
+    // storage_path()
+    $this->app->useStoragePath($old['path'] . "/{$suffix}");
+    // Storage facade
+    foreach ($this->app['config']['tenancy.filesystem.disks'] as $disk) {
+        // [...]
+        if ($root = \str_replace('%storage_path%', storage_path(), $this->app['config']["tenancy.filesystem.root_override.{$disk}"])) {
+            Storage::disk($disk)->getAdapter()->setPathPrefix($root);
+        } else {
+            $root = $this->app['config']["filesystems.disks.{$disk}.root"];
+            Storage::disk($disk)->getAdapter()->setPathPrefix($root . "/{$suffix}");
+        }
+    }
+    // [...]
+}
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/tenant-manager/index.html b/dist/docs/1.x/tenant-manager/index.html new file mode 100644 index 0000000..1d78d98 --- /dev/null +++ b/dist/docs/1.x/tenant-manager/index.html @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + + + + + Tenant Manager | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Tenant Manager

+

This page documents a couple of other TenantManager methods you may find useful.

+

Finding tenant using UUID

+

find() is an alias for getTenantById(). You may use the second argument to specify the key(s) as a string/array.

+
>>> tenant()->find('dbe0b330-1a6e-11e9-b4c3-354da4b4f339');
+=> [
+     "uuid" => "dbe0b330-1a6e-11e9-b4c3-354da4b4f339",
+     "domain" => "localhost",
+     "foo" => "bar",
+   ]
+>>> tenant()->find('dbe0b330-1a6e-11e9-b4c3-354da4b4f339', 'foo');
+=> [
+     "foo" => "bar",
+   ]
+>>> tenant()->getTenantById('dbe0b330-1a6e-11e9-b4c3-354da4b4f339', ['foo', 'domain']);
+=> [
+     "foo" => "bar",
+     "domain" => "localhost",
+   ]
+

Getting tenant ID by domain

+
>>> tenant()->getTenantIdByDomain('localhost');
+=> "b3ce3f90-1a88-11e9-a6b0-038c6337ae50"
+>>> tenant()->getIdByDomain('localhost');
+=> "b3ce3f90-1a88-11e9-a6b0-038c6337ae50"
+

Finding tenant by domain

+

You may use the second argument to specify the key(s) as a string/array.

+
>>> tenant()->findByDomain('localhost');
+=> [
+     "uuid" => "b3ce3f90-1a88-11e9-a6b0-038c6337ae50",
+     "domain" => "localhost",
+   ]
+

Accessing the array

+

You can access the public array tenant of TenantManager like this:

+
tenancy()->tenant
+

which is an array. If you want to get the value of a specific key from the array, you can use one of the helpers the key on the tenant array as an argument.

+
tenant('uuid'); // Does the same thing as tenant()->tenant['uuid']
+

Getting all tenants

+

This method returns a collection of arrays.

+
>>> tenant()->all();
+=> Illuminate\Support\Collection {#2980
+     all: [
+       [
+         "uuid" => "32e20780-1a88-11e9-a051-4b6489a7edac",
+         "domain" => "localhost",
+       ],
+       [
+         "uuid" => "49670df0-1a87-11e9-b7ba-cf5353777957",
+         "domain" => "dev.localhost",
+       ],
+     ],
+   }
+>>> tenant()->all()->pluck('domain');
+=> Illuminate\Support\Collection {#2983
+     all: [
+       "localhost",
+       "dev.localhost",
+     ],
+   }
+

Deleting a tenant

+
>>> tenant()->delete('dbe0b330-1a6e-11e9-b4c3-354da4b4f339');
+=> true
+>>> tenant()->delete(tenant()->getTenantIdByDomain('dev.localhost'));
+=> true
+>>> tenant()->delete(tenant()->findByDomain('localhost')['uuid']);
+=> true
+

This doesn't delete the tenant's database. If you want to delete it, save the database name prior to deleting the tenant. You can get the database name using getDatabaseName()

+
>>> tenant()->getDatabaseName(tenant()->findByDomain('laravel.localhost'))
+=> "tenant67412a60-1c01-11e9-a9e9-f799baa56fd9"
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/tenant-routes/index.html b/dist/docs/1.x/tenant-routes/index.html new file mode 100644 index 0000000..4f594e7 --- /dev/null +++ b/dist/docs/1.x/tenant-routes/index.html @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + + + Tenant Routes | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Tenant Routes

+

Routes within routes/tenant.php will have the web middleware group and the IntializeTenancy middleware automatically applied on them. This middleware attempts to identify the tenant based on the current hostname. Once the tenant is identified, the database connection, cache, filesystem root paths and, optionally, Redis connection, will be switched.

+

Just like routes/web.php, these routes use the App\Http\Controllers namespace.

+
+

If a tenant cannot be identified, anexception will be thrown. If you want to change this behavior (to a redirect, for example) read the Middleware Configuration page.

+
+

Exempt routes

+

Routes outside the routes/tenant.php file will not have the tenancy middleware automatically applied on them. You can apply this middleware manually, though.

+

If you want some of your, say, API routes to be multi-tenant, simply wrap them in a Route group with this middleware:

+
use Stancl\Tenancy\Middleware\InitializeTenancy;
+
+Route::middleware(InitializeTenancy::class)->group(function () {
+    // Route::get('/', 'HelloWorld');
+});
+

Using the same routes for tenant and non-tenant parts of the application

+

The Stancl\Tenancy\Middleware\PreventAccessFromTenantDomains middleware makes sure 404 is returned when a user attempts to visit a web route on a tenant (non-exempt) domain.

+

The install command applies this middleware to the web group. If you want to do this for another route group, add this middleware manually to that group. You can do this in app/Http/Kernel.php.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/tenant-storage/index.html b/dist/docs/1.x/tenant-storage/index.html new file mode 100644 index 0000000..4889ac3 --- /dev/null +++ b/dist/docs/1.x/tenant-storage/index.html @@ -0,0 +1,427 @@ + + + + + + + + + + + + + + + + + + + + Tenant Storage | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Tenant Storage

+

Tenant storage is where tenants' uuids and domains are stored. You can store things like the tenant's plan, subscription information, and tenant-specific application configuration in tenant storage. You can use these functions:

+
get (string|array $key, string $uuid = null) // $uuid defaults to the current tenant's UUID
+put (string|array $key, mixed $value = null, string $uuid = null) // if $key is array, make sure $value is null
+

To put something into the tenant storage, you can use put() or set().

+
tenancy()->put($key, $value);
+tenancy()->set($key, $value); // alias for put()
+tenancy()->put($key, $value, $uuid);
+tenancy()->put(['key1' => 'value1', 'key2' => 'value2']);
+tenancy()->put(['key1' => 'value1', 'key2' => 'value2'], null, $uuid);
+

To get something from the storage, you can use get():

+
tenancy()->get($key);
+tenancy()->get($key, $uuid);
+tenancy()->get(['key1', 'key2']);
+
+

Note: tenancy()->get(['key1', 'key2']) returns an array with values only

+
+

Note that $key has to be a string or an array with string keys. The value(s) can be of any data type. Example with arrays:

+
>>> tenant()->put('foo', ['a' => 'b', 'c' => 'd']);
+=> [ // put() returns the supplied value(s)
+     "a" => "b",
+     "c" => "d",
+   ]
+>>> tenant()->get('foo');
+=> [
+     "a" => "b",
+     "c" => "d",
+   ]
+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/usage/index.html b/dist/docs/1.x/usage/index.html new file mode 100644 index 0000000..82949a9 --- /dev/null +++ b/dist/docs/1.x/usage/index.html @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + Usage | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Usage

+

This chapter describes usage of the package. That includes creating tenants, deleting tenants, storing data in the tenant storage.

+

Most pages will use the tenancy() helper function. This package comes with two helpers - tenancy() and tenant(). They do the same thing, so you can use the one that reads better given its context.

+

tenant()->create() reads better than tenancy()->create(), but tenancy()->init() reads better than tenant()->init().

+

You can pass an argument to the helper function to get a value out of the tenant storage. tenant('plan') is identical to tenant()->get('plan').

+

The package also comes with two facades. Tenancy and Tenant. Use what feels the best.

+

Both the helpers and the facades resolve the TenantManager from the service container.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/1.x/writing-storage-drivers/index.html b/dist/docs/1.x/writing-storage-drivers/index.html new file mode 100644 index 0000000..347d4d6 --- /dev/null +++ b/dist/docs/1.x/writing-storage-drivers/index.html @@ -0,0 +1,464 @@ + + + + + + + + + + + + + + + + + + + + Writing Storage Drivers | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Writing Storage Drivers

+

If you don't want to use the provided DB/Redis storage drivers, you can write your own driver.

+

To create a driver, create a class that implements the Stancl\Tenancy\Interfaces\StorageDriver interface.

+

For historical reasons, the TenantManager will try to json encode/decode data coming from the storage driver. If you want to avoid this, set public $useJson = false;. That will make TenantManager encode/decode only put() and get() data, so that data types can be stored correctly.

+

The DB storage driver has public $useJson = false;, while the Redis storage driver doesn't use this property, so it's false by default.

+

Here's an example:

+

+namespace App\StorageDrivers\MongoDBStorageDriver;
+
+use Stancl\Tenancy\Interfaces\StorageDriver;
+
+class MongoDBStorageDriver implements StorageDriver
+{
+    public $useJson = false;
+
+    public function identifyTenant(string $domain): array
+    {
+        //
+    }
+
+    public function getAllTenants(array $uuids = []): array
+    {
+        //
+    }
+
+    public function getTenantById(string $uuid, array $fields = []): array
+    {
+        //
+    }
+
+    public function getTenantIdByDomain(string $domain): ?string
+    {
+        //
+    }
+
+    public function createTenant(string $domain, string $uuid): array
+    {
+        //
+    }
+
+    public function deleteTenant(string $uuid): bool
+    {
+        //
+    }
+
+    public function get(string $uuid, string $key)
+    {
+        //
+    }
+
+    public function getMany(string $uuid, array $keys): array
+    {
+        //
+    }
+
+    public function put(string $uuid, string $key, $value)
+    {
+        //
+    }
+
+    public function putMany(string $uuid, array $values): array
+    {
+        //
+    }
+}
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/application-testing/index.html b/dist/docs/2.x/application-testing/index.html new file mode 100644 index 0000000..4b1ae02 --- /dev/null +++ b/dist/docs/2.x/application-testing/index.html @@ -0,0 +1,432 @@ + + + + + + + + + + + + + + + + + + + + Application Testing | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Application Testing

+

To test your application with this package installed, you can create tenants in the setUp() method of your test case:

+
protected function setUp(): void
+{
+    parent::setUp();
+
+    tenant()->create('test.localhost');
+    tenancy()->init('test.localhost');
+}
+

If you're using the database storage driver, you will also need to run the create_tenants_table migration:

+
protected function setUp(): void
+{
+    parent::setUp();
+
+    $this->call('migrate', [
+        '--path' => database_path('migrations'),
+        '--database' => 'sqlite',
+    ]);
+
+    tenant()->create('test.localhost');
+    tenancy()->init('test.localhost');
+}
+

If you're using the Redis storage driver, flush the database in setUp():

+
protected function setUp(): void
+{
+    parent::setUp();
+
+    // make sure you're using a different connection for testing to avoid losing data
+    Redis::connection('tenancyTesting')->flushdb();
+
+    tenant()->create('test.localhost');
+    tenancy()->init('test.localhost');
+}
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/configuration/index.html b/dist/docs/2.x/configuration/index.html new file mode 100644 index 0000000..0f31988 --- /dev/null +++ b/dist/docs/2.x/configuration/index.html @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + Configuration | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Configuration

+

The config/tenancy.php file lets you configure how the package behaves.

+
+

Note: If the tenancy.php file doesn't exist in your config directory, you can publish it by running php artisan vendor:publish --provider='Stancl\Tenancy\TenancyServiceProvider' --tag=config

+
+

storage_driver, storage

+

This lets you configure the driver for tenant storage, i.e. what will be used to store information about your tenants. You can read more about this on the Storage Drivers page.

+

Available storage drivers:

+
    +
  • Stancl\Tenancy\StorageDrivers\RedisStorageDriver
  • +
  • Stancl\Tenancy\StorageDrivers\DatabaseStorageDriver
  • +
+

tenant_route_namespace

+

Controller namespace used for routes in routes/tenant.php. The default value is the same as the namespace for web.php routes.

+

exempt_domains

+

If a hostname from this array is visited, the tenant.php routes won't be registered, letting you use the same routes as in that file.

+

database

+

The application's default connection will be switched to a new one — tenant. This connection will be based on the connection specified in tenancy.database.based_on. The database name will be tenancy.database.prefix + tenant UUID + tenancy.database.suffix.

+

You can set the suffix to .sqlite if you're using sqlite and want the files to be with the .sqlite extension. Conversely, you can leave the suffix empty if you're using MySQL, for example.

+

redis

+

If tenancy.redis.tenancy is set to true, connections listed in tenancy.redis.prefixed_connections will be prefixed with config('tenancy.redis.prefix_base') . $uuid.

+
+

Note: You need phpredis for multi-tenant Redis.

+
+

cache

+

The CacheManager instance that's resolved when you use the Cache or the cache() helper will be replaced by Stancl\Tenancy\CacheManager. This class automatically uses tags. The tag will look like config('tenancy.cache.tag_base') . $uuid.

+

If you need to store something in global, non-tenant cache,

+

filesystem

+

The storage_path() will be suffixed with a directory named config('tenancy.filesystem.suffix_base') . $uuid.

+

The root of each disk listed in tenancy.filesystem.disks will be suffixed with config('tenancy.filesystem.suffix_base') . $uuid.

+

For disks listed in root_override, the root will be that string with %storage_path% replaced by storage_path() after tenancy has been initialized. All other disks will be simply suffixed with tenancy.filesystem.suffix_base + the tenant UUID.

+

Read more about this on the Filesystem Tenancy page.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/console-commands/index.html b/dist/docs/2.x/console-commands/index.html new file mode 100644 index 0000000..2dbce66 --- /dev/null +++ b/dist/docs/2.x/console-commands/index.html @@ -0,0 +1,433 @@ + + + + + + + + + + + + + + + + + + + + Console Commands | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Console Commands

+

The package comes with some artisan commands that will help you during development.

+

Migrate

+

The most important command. To use tenants, you have to be able to migrate their databases.

+

You can use the tenants:migrate command to migrate tenant's databases. You can also specify which tenants' databases should be migrated using the --tenants option.

+
php artisan tenants:migrate --tenants=8075a580-1cb8-11e9-8822-49c5d8f8ff23
+
+

Note: Tenant migrations must be located in database/migrations/tenant.

+
+

You can use these commands outside the command line as well. If you want to migrate a tenant's database in a controller, you can use the Artisan facade.

+
$tenant = tenant()->create('tenant1.localhost');
+
+\Artisan::call('tenants:migrate', [
+    '--tenants' => [$tenant['uuid']]
+]);
+

Rollback & seed

+
    +
  • Rollback: tenants:rollback
  • +
  • Seed: tenants:seed
  • +
+

Similarly to migrate, these commands accept a --tenants option.

+

Run

+

You can use the tenants:run command to run your own commands for tenants.

+

If your command's signature were email:send {--queue} {--subject=} {body}, you would run this command like this:

+
php artisan tenants:run email:send --tenants=8075a580-1cb8-11e9-8822-49c5d8f8ff23 --option="queue=1" --option="subject=New Feature" --argument="body=We have launched a new feature. ..."
+

Tenant list

+
php artisan tenants:list
+Listing all tenants.
+[Tenant] uuid: dbe0b330-1a6e-11e9-b4c3-354da4b4f339 @ localhost
+[Tenant] uuid: 49670df0-1a87-11e9-b7ba-cf5353777957 @ dev.localhost
+

Selectively clearing tenant cache

+

You can delete specific tenants' cache by using the --tags option on cache:clear:

+
php artisan cache:clear --tags=tenantdbe0b330-1a6e-11e9-b4c3-354da4b4f339
+

The tag is config('tenancy.cache.tag_base') . $uuid.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/creating-tenants/index.html b/dist/docs/2.x/creating-tenants/index.html new file mode 100644 index 0000000..e49c1b2 --- /dev/null +++ b/dist/docs/2.x/creating-tenants/index.html @@ -0,0 +1,417 @@ + + + + + + + + + + + + + + + + + + + + Creating Tenants | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Creating Tenants

+
+

Make sure your database is correctly configured before creating tenants.

+
+

To create a tenant, you can use

+
Tenant::new()->withDomains(['tenant1.yourapp.com'])->withData(['plan' => 'free'])->save();
+
+

Tip: All domains under .localhost are routed to 127.0.0.1 on most operating systems. This is useful for development.

+
+

The withDomains() and withData() methods are optional.

+

You can also create a tenant using the Tenant::create method:

+
$domains = ['tenant1.myapp.com', 'tenant1.com'];
+Tenant::create($domains, [
+    'plan' => 'free',
+]);
+
+

Note: Creating a tenant doesn't run migrations automatically. You have to do that yourself.

+
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/custom-database-names/index.html b/dist/docs/2.x/custom-database-names/index.html new file mode 100644 index 0000000..32e72fa --- /dev/null +++ b/dist/docs/2.x/custom-database-names/index.html @@ -0,0 +1,409 @@ + + + + + + + + + + + + + + + + + + + + Custom Database Names | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Custom Database Names

+

If you want to specify the tenant's database name, set the tenancy.database_name_key configuration key to the name of the key that is used to specify the database name in the tenant storage. You must use a name that you won't use for storing other data, so it's recommended to avoid names like database and use names like _stancl_tenancy_database_name instead. Then just give the key a value during the tenant creation process:

+
>>> tenant()->create('example.com', [
+    '_stancl_tenancy_database_name' => 'example_com'
+])
+=> [
+     "uuid" => "49670df0-1a87-11e9-b7ba-cf5353777957",
+     "domain" => "example.com",
+     "_stancl_tenancy_database_name" => "example_com",
+   ]
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/development/index.html b/dist/docs/2.x/development/index.html new file mode 100644 index 0000000..366cd77 --- /dev/null +++ b/dist/docs/2.x/development/index.html @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + Development | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Development

+

Running tests

+

With Docker

+

If you have Docker installed, simply run ./test. When you're done testing, run docker-compose down to shut down the containers.

+

Without Docker

+

If you run the tests of this package, please make sure you don't store anything in Redis @ 127.0.0.1:6379 db#14. The contents of this database are flushed everytime the tests are run.

+

Some tests are run only if the CI, TRAVIS and CONTINUOUS_INTEGRATION environment variables are set to true. This is to avoid things like bloating your MySQL instance with test databases.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/difference-between-this-package-and-others/index.html b/dist/docs/2.x/difference-between-this-package-and-others/index.html new file mode 100644 index 0000000..1badca3 --- /dev/null +++ b/dist/docs/2.x/difference-between-this-package-and-others/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + Difference Between This Package And Others | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Difference Between This Package And Others

+

A frequently asked question is the difference between this package and tenancy/multi-tenant.

+

Packages like tenancy/multi-tenant and tenancy/tenancy give you an API for making your application multi-tenant. They give you a tenant DB connection, traits to apply on your models, a guide on creating your own tenant-aware cache, etc.

+

This package makes your application multi-tenant automatically and attempts to make you not have to change (m)any things in your code.

+

Which one should you use?

+

Depends on what you prefer.

+

If you want full control and make your application multi-tenant yourself, use tenancy/multi-tenant.

+

If you want to focus on writing your application instead of tenancy implementations, use stancl/tenancy.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/digging-deeper/index.html b/dist/docs/2.x/digging-deeper/index.html new file mode 100644 index 0000000..7fff34a --- /dev/null +++ b/dist/docs/2.x/digging-deeper/index.html @@ -0,0 +1,400 @@ + + + + + + + + + + + + + + + + + + + + Digging Deeper | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+ +
+
+ + + + + + + + + diff --git a/dist/docs/2.x/event-system/index.html b/dist/docs/2.x/event-system/index.html new file mode 100644 index 0000000..f93689e --- /dev/null +++ b/dist/docs/2.x/event-system/index.html @@ -0,0 +1,431 @@ + + + + + + + + + + + + + + + + + + + + The Event System | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

The Event System

+

You can use event hooks to change the behavior of the tenancy boostrapping and tenancy ending processes.

+

The following events are available:

+
    +
  • boostrapping
  • +
  • boostrapped
  • +
  • ending
  • +
  • ended
  • +
+

Tenant-specific database connection example

+

You can hook into these events using Tenancy::<eventName>:

+
\Tenancy::boostrapping(function ($tenantManager) {
+    if ($tenantManager->tenant['uuid'] === 'someUUID') {
+        config(['database.connections.someDatabaseConnection' => $tenantManager->tenant['databaseConnection']]);
+        $tenantManager->database->useConnection('someDatabaseConnection');
+
+        return ['database'];
+    }
+});
+

The example above checks whether the current tenant has an uuid of someUUID. If yes, it creates a new database connection based on data stored in the tenant's storage. Then it changes the default database connection. Finally, it returns an array of the events that this callback prevents.

+

The following actions can be prevented:

+
    +
  • database connection switch: database
  • +
  • Redis prefix: redis
  • +
  • CacheManager switch: cache
  • +
  • Filesystem changes: filesystem
  • +
+

Tenant-specific configuration example

+

Another common use case for events is tenant-specific config:

+
\Tenancy::bootstrapped(function ($tenantManager) {
+    config(['some.api.key' => $tenantManager->tenant['api_key']);
+});
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/filesystem-tenancy/index.html b/dist/docs/2.x/filesystem-tenancy/index.html new file mode 100644 index 0000000..734f557 --- /dev/null +++ b/dist/docs/2.x/filesystem-tenancy/index.html @@ -0,0 +1,423 @@ + + + + + + + + + + + + + + + + + + + + Filesystem Tenancy | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Filesystem Tenancy

+
+

Note: It's important to differentiate between storage_path() and the Storage facade. The Storage facade is what you use to put files into storage, i.e. Storage::disk('local')->put(). storage_path() is used to get the path to the storage directory.

+
+

The storage_path() will be suffixed with a directory named config('tenancy.filesystem.suffix_base') . $uuid.

+

The root of each disk listed in tenancy.filesystem.disks will be suffixed with config('tenancy.filesystem.suffix_base') . $uuid.

+

However, this alone would cause unwanted behavior. It would work for S3 and similar disks, but for local disks, this would result in /path_to_your_application/storage/app/tenant1e22e620-1cb8-11e9-93b6-8d1b78ac0bcd/. That's not what we want. We want /path_to_your_application/storage/tenant1e22e620-1cb8-11e9-93b6-8d1b78ac0bcd/app/.

+

That's what the root_override section is for. %storage_path% gets replaced by storage_path() after tenancy has been initialized. The roots of disks listed in the root_override section of the config will be replaced accordingly. All other disks will be simply suffixed with tenancy.filesystem.suffix_base + the tenant UUID.

+

Since storage_path() will be suffixed, your folder structure will look like this:

+

The folder structure

+

If you write to these directories, you will need to create them after you create the tenant. See the docs for PHP's mkdir.

+

Logs will be saved to storage/logs regardless of any changes to storage_path().

+

One thing that you will have to change if you use storage similarly to the example on the image is your use of the helper function asset() (that is, if you use it).

+

You need to make this change to your code:

+
-  asset("storage/images/products/$product_id.png");
++  tenant_asset("images/products/$product_id.png");
+

Note that all (public) tenant assets have to be in the app/public/ subdirectory of the tenant's storage directory, as shown in the image above.

+

This is what the backend of tenant_asset() returns:

+
// TenantAssetsController
+return response()->file(storage_path('app/public/' . $path));
+

With default filesystem configuration, these two commands are equivalent:

+
Storage::disk('public')->put($filename, $data);
+Storage::disk('local')->put("public/$filename", $data);
+

If you want to store something globally, simply create a new disk and don't add it to the tenancy.filesystem.disks config.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/getting-started/index.html b/dist/docs/2.x/getting-started/index.html new file mode 100644 index 0000000..30ae495 --- /dev/null +++ b/dist/docs/2.x/getting-started/index.html @@ -0,0 +1,422 @@ + + + + + + + + + + + + + + + + + + + + Getting Started | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Getting Started

+

stancl/tenancy is a Laravel multi-database tenancy package. It is designed in a way that requires you to make no changes to your codebase. Instead of applying traits on models and replacing every single reference to cache by a reference to a tenant-aware cache, the package lets you write your app without thinking about tenancy. It handles tenancy automatically.

+
+

Note: Filesystem is the only thing that can be a little problematic. Be sure to read that page.

+
+

How does it work?

+

A user visits client1.yourapp.com. The package identifies the tenant who this domain belongs to, and automatically does the following:

+
    +
  • switches database connection
  • +
  • replaces the default cache manager
  • +
  • switches Redis connection
  • +
  • changes filesystem root paths
  • +
+

The benefits of this being taken care of by the package are:

+
    +
  • separation of concerns: you should write your app, not tenancy implementations
  • +
  • reliability: you won't have to fear that you forgot to replace a reference to cache by a tenant-aware cache call. This is something you might worry about if you're implementing tenancy into an existing application.
  • +
+

What is multi-tenancy?

+

Multi-tenancy is the ability to provide your application to multiple customers (who have their own users and other resources) from a single instance of your application. Think Slack, Shopify, etc.

+

Multi-tenancy can be single-database and multi-database.

+

Single-database tenancy means that your application uses only a single database. The way this is usually implemented is that instead of having the id, title, user_id and body columns in your posts table, you will also have a tenant_id column. This approach works until you need custom databases for your clients. It's also easy to implement, it basically boils down to having your models use a trait which adds a global scope.

+

Multi-database tenancy, the type that this package provides, lets you use a separate database for each tenant. The benefits of this approach are scalability, compliance (some clients need to have the database on their server) and mitigation of risks such as showing the wrong tenant's data to a user. The downside is that this model is harder to implement, which is why this package exists.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/horizon/index.html b/dist/docs/2.x/horizon/index.html new file mode 100644 index 0000000..4b00d27 --- /dev/null +++ b/dist/docs/2.x/horizon/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + Horizon Integration | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Horizon Integration

+
+

Make sure your queue is correctly configured before using Horizon.

+
+

Jobs are automatically tagged with the tenant's uuid and domain:

+

UUID and domain tags

+

You can use these tags to monitor specific tenants' jobs:

+

Monitoring tags

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/https-certificates/index.html b/dist/docs/2.x/https-certificates/index.html new file mode 100644 index 0000000..fea14d0 --- /dev/null +++ b/dist/docs/2.x/https-certificates/index.html @@ -0,0 +1,417 @@ + + + + + + + + + + + + + + + + + + + + HTTPS Certificates | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

HTTPS certificates

+

HTTPS certificates are very easy to deal with if you use the yourclient1.yourapp.com, yourclient2.yourapp.com model. You can use a wildcard HTTPS certificate.

+

If you use the model where second level domains are used, there are multiple ways you can solve this.

+

This guide focuses on nginx.

+

1. Use nginx with the lua module

+

Specifically, you're interested in the ssl_certificate_by_lua_block directive. Nginx doesn't support using variables such as the hostname in the ssl_certificate directive, which is why the lua module is needed.

+

This approach lets you use one server block for all tenants.

+

2. Add a simple server block for each tenant

+

You can store most of your config in a file, such as /etc/nginx/includes/tenant, and include this file into tenant server blocks.

+
server {
+  include includes/tenant;
+  server_name foo.bar;
+  # ssl_certificate /etc/foo/...;
+}
+

Generating certificates

+

You can generate a certificate using certbot. If you use the --nginx flag, you will need to run certbot as root. If you use the --webroot flag, you only need the user that runs it to have write access to the webroot directory (or perhaps webroot/.well-known is enough) and some certbot files (you can specify these using --work-dir, --config-dir and --logs-dir).

+

Creating this config dynamically from PHP is not easy, but is probably feasible. Giving www-data write access to /etc/nginx/sites-available/tenants.conf should work.

+

However, you still need to reload nginx configuration to apply the changes to configuration. This is problematic and I'm not sure if there is a simple and secure way to do this from PHP.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/index.html b/dist/docs/2.x/index.html new file mode 100644 index 0000000..6a49dfc --- /dev/null +++ b/dist/docs/2.x/index.html @@ -0,0 +1,8 @@ + + + + + + stancl/tenancy + + \ No newline at end of file diff --git a/dist/docs/2.x/installation/index.html b/dist/docs/2.x/installation/index.html new file mode 100644 index 0000000..b5d7273 --- /dev/null +++ b/dist/docs/2.x/installation/index.html @@ -0,0 +1,427 @@ + + + + + + + + + + + + + + + + + + + + Installation | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Installation

+

Laravel 5.8 or higher is needed.

+

Require the package via composer

+

First you need to require the package using composer:

+
composer require stancl/tenancy
+

Automatic installation

+

To install the package, simply run

+
php artisan tenancy:install
+

You will be asked if you want to store your data in Redis or a relational database. You can read more about this on the Storage Drivers page.

+

This will do all the steps listed in the Manual installation section for you.

+

The only thing you have to do now is create a database/Redis connection. Read the Storage Drivers page for information about that.

+

Manual installation

+

If you prefer installing the package manually, you can do that too. It shouldn't take more than a minute either way.

+

Setting up middleware

+

Now open app/Http/Kernel.php and make the InitializeTenancy middleware top priority, so that it gets executed before anything else, making sure things like the database switch connections soon enough:

+
protected $middlewarePriority = [
+    \Stancl\Tenancy\Middleware\InitializeTenancy::class,
+    // ...
+];
+

Creating routes

+

The package lets you have tenant routes and "exempt" routes. Tenant routes are your application's routes. Exempt routes are routes exempt from tenancy — landing pages, sign up forms, and routes for managing tenants.

+

Routes in routes/web.php are exempt, whereas routes in routes/tenant.php have the InitializeTenancy middleware automatically applied on them.

+

So, to create tenant routes, put those routes in a new file called routes/tenant.php.

+

Configuration

+

Run the following:

+
php artisan vendor:publish --provider='Stancl\Tenancy\TenancyServiceProvider' --tag=config
+

This creates a config/tenancy.php. You can use it to configure how the package works.

+

Configuration is explained in detail on the Configuration page.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/integrations/index.html b/dist/docs/2.x/integrations/index.html new file mode 100644 index 0000000..7ec5627 --- /dev/null +++ b/dist/docs/2.x/integrations/index.html @@ -0,0 +1,402 @@ + + + + + + + + + + + + + + + + + + + + Integrations | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Integrations

+

This package naturally integrates well with Laravel packages, since it does not rely on you explicitly specifying database connections.

+

There are some exceptions, though. Telescope integration, for example, requires you to change the database connection in config/telescope.php to a non-default one, because the default connection is switched to the tenant connection. Some packages should use a central connection for data storage.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/jobs-queues/index.html b/dist/docs/2.x/jobs-queues/index.html new file mode 100644 index 0000000..b218c73 --- /dev/null +++ b/dist/docs/2.x/jobs-queues/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + Jobs & Queues | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Jobs & Queues

+

Jobs are automatically multi-tenant, which means that if a job is dispatched while tenant A is initialized, the job will operate with tenant A's database, cache, filesystem, and Redis.

+

However, if you're using the database or redis queue driver, you have to make a small tweak to your queue configuration.

+

Open config/queue.php and make sure your queue driver has an explicitly set connection. Otherwise it would use the default one, which would cause issues, since database.default is changed by the package and Redis connections are prefixed.

+

If you're using database, add a new line to queue.connections.database:

+
'connection' => 'mysql',
+

where 'mysql' is the name of your non-tenant database connection with a jobs table.

+

If you're using Redis, make sure its 'connection' is not in tenancy.redis.prefixed_connections.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/middleware-configuration/index.html b/dist/docs/2.x/middleware-configuration/index.html new file mode 100644 index 0000000..a26dcbb --- /dev/null +++ b/dist/docs/2.x/middleware-configuration/index.html @@ -0,0 +1,408 @@ + + + + + + + + + + + + + + + + + + + + Middleware Configuration | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Middleware Configuration

+

When a tenant route is visited and the tenant can't be identified, an exception is thrown. If you want to change this behavior, to a redirect for example, add this to your app/Providers/AppServiceProvider.php's boot() method:

+
// use Stancl\Tenancy\Middleware\InitializeTenancy;
+
+$this->app->bind(InitializeTenancy::class, function ($app) {
+    return new InitializeTenancy(function ($exception) {
+        // return redirect()->route('foo');
+    });
+});
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/misc-tips/index.html b/dist/docs/2.x/misc-tips/index.html new file mode 100644 index 0000000..10efa27 --- /dev/null +++ b/dist/docs/2.x/misc-tips/index.html @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + + + Miscellaneous Tips | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Miscellaneous Tips

+

Tenant Redirect

+

A customer has signed up on your website, you have created a new tenant and now you want to redirect the customer to their website. You can use the tenant() method on Redirect, like this:

+
// tenant sign up controller
+return redirect()->route('dashboard')->tenant($tenant['domain']);
+

Custom ID scheme

+

If you don't want to use UUIDs and want to use something more human-readable (even domain concatenated with uuid, for example), you can create a custom class for this:

+
use Stancl\Tenancy\Interfaces\UniqueIdentifierGenerator;
+
+class MyUniqueIDGenerator implements UniqueIdentifierGenerator
+{
+    public static function handle(string $domain, array $data): string
+    {
+        return $domain . \Webpatser\Uuid\Uuid::generate(1, $domain);
+    }
+}
+

and then set the tenancy.unique_id_generator config to the full path to your class.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/stay-updated/index.html b/dist/docs/2.x/stay-updated/index.html new file mode 100644 index 0000000..40a2854 --- /dev/null +++ b/dist/docs/2.x/stay-updated/index.html @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + Stay Updated | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Stay Updated

+

If you'd like to be notified about new versions, you can sign up for e-mail notifications or join our Telegram channel.

+

You can choose whether you want to receive emails about major versions and/or minor versions.

+
    +
  • Major versions include breaking changes. Composer won't know about these versions and won't update to them. Major versions will be released about once every 6 months.
  • +
  • Minor versions include backwards-compatible features and bug fixes.
  • +
+
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/storage-drivers/index.html b/dist/docs/2.x/storage-drivers/index.html new file mode 100644 index 0000000..f01b508 --- /dev/null +++ b/dist/docs/2.x/storage-drivers/index.html @@ -0,0 +1,429 @@ + + + + + + + + + + + + + + + + + + + + Storage Drivers | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Storage Drivers

+

Storage drivers are used to store a list of all tenants, their domains and any extra information you store about your tenants (e.g. their plan).

+

Currently, database and Redis storage drivers are available as part of the package. However, you can write your own (and contribute ❤️) storage drivers.

+

Database

+

The database storage driver lets you store tenant information in a relational database like MySQL, PostgreSQL and SQLite.

+

The benefit of this storage driver is that you don't have to use both Redis and a database for your data. Also you don't have to do as much configuration.

+

To use this driver, you need to have a tenants table. You may also use a custom database connection. By default, tenancy.storage.db.connection is set to central, which means that the central database connection will be used to store tenants. This connection is not automatically created, so you'd have to create it manually. You can create database connections in the config/database.php file.

+

If you'd like to use an existing connection, you can set this config to the name of the connection, e.g. mysql.

+

To create the tenants table, you can use the migration that comes with this package. If you haven't published it during installation, publish it now:

+
php artisan vendor:publish --provider='Stancl\Tenancy\TenancyServiceProvider' --tag=migrations
+

By default, all of your data will be stored in the JSON column data. If you want to store some data in a dedicated column (to leverage indexing, for example), add the column to the migration and to tenancy.custom_columns config.

+

Finally, run the migration:

+
php artisan migrate
+
+

If you use a non-default connection, such as central, you have to specify which DB to migrate using the --database option.

+

If you have existing migrations related to your app in database/migrations, move them to database/migrations/tenant. You can read more about tenant migrations here.

+
+

Redis

+

The Redis storage driver lets you store tenant information in Redis, a high-performance key-value store.

+

The benefit of this storage driver is its performance.

+

Note that you need to configure persistence on your Redis instance if you don't want to lose all information about tenants.

+

Read the Redis documentation page on persistence. You should definitely use AOF and if you want to be even more protected from data loss, you can use RDB in conjunction with AOF.

+

If your cache driver is Redis and you don't want to use AOF with it, run two Redis instances. Otherwise, just make sure you use a different database (number) for tenancy and for anything else.

+

To use this driver, create a new Redis connection in the database.redis configuration (config/database.php) called tenancy.

+
'tenancy' => [
+    'host' => env('TENANCY_REDIS_HOST', '127.0.0.1'),
+    'password' => env('TENANCY_REDIS_PASSWORD', null),
+    'port' => env('TENANCY_REDIS_PORT', 6380), // different port = separate Redis instance
+    'database' => env('TENANCY_REDIS_DB', 3), // alternatively, different database number
+],
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/telescope/index.html b/dist/docs/2.x/telescope/index.html new file mode 100644 index 0000000..83d2458 --- /dev/null +++ b/dist/docs/2.x/telescope/index.html @@ -0,0 +1,412 @@ + + + + + + + + + + + + + + + + + + + + Telescope Integration | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Telescope Integration

+

Requests in Telescope are automatically tagged with the tenant uuid and domain:

+

Telescope Request with tags

+

This lets you filter requests by uuid and domain:

+

Filtering by uuid +Filtering by domain

+

If you'd like to set Telescope tags in your own code, e.g. in your AppServiceProvider, replace your Telescope::tag() call like this:

+
\Tenancy::integrationEvent('telescope', function ($entry) {
+    return ['abc']; // your logic
+});
+

Tenancy tags merged with tag abc

+

Once Telescope 3 is released, you won't have to do this.

+

To have Telescope working, make sure your telescope.storage.database.connection points to a non-tenant connection. It's that way by default, so for most projects, Telescope should work out of the box.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/tenancy-initialization/index.html b/dist/docs/2.x/tenancy-initialization/index.html new file mode 100644 index 0000000..2e59ed1 --- /dev/null +++ b/dist/docs/2.x/tenancy-initialization/index.html @@ -0,0 +1,510 @@ + + + + + + + + + + + + + + + + + + + + Tenancy Initialization | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Tenancy Initialization

+

Tenancy can be initialized by calling tenancy()->init(). The InitializeTenancy middleware calls this method automatically.

+

You can end a tenancy session using tenancy()->end(). This is useful if you need to run multiple tenant sessions or a mixed tenant/non-tenant session in a single request/command.

+

The tenancy()->init() method calls bootstrap().

+

This method switches database connection, Redis connection (if Redis tenancy is enabled), cache and filesystem root paths.

+

This page goes through the code that actually makes this happen. You don't have to read this page to use the package, but it will give you insight into the magic that's happening in the background, so that you can be more confident in it.

+

Database tenancy

+

bootstrap() runs the following method:

+
public function switchDatabaseConnection()
+{
+    $this->database->connect($this->getDatabaseName());
+}
+

If tenancy.database_name_key is set and present in the current tenant's data, the getDatabaseName() returns the stored database_name. Otherwise it returns the prefix + uuid + suffix.

+
public function getDatabaseName($tenant = []): string
+{
+    $tenant = $tenant ?: $this->tenant;
+    if ($key = $this->app['config']['tenancy.database_name_key']) {
+        if (isset($tenant[$key])) {
+            return $tenant[$key];
+        }
+    }
+    return $this->app['config']['tenancy.database.prefix'] . $tenant['uuid'] . $this->app['config']['tenancy.database.suffix'];
+}
+

This is passed as an argument to the connect() method. This method creates a new database connection and sets it as the default one.

+
public function connect(string $database)
+{
+    $this->createTenantConnection($database);
+    $this->useConnection('tenant');
+}
+
+public function createTenantConnection(string $database_name)
+{
+    // Create the `tenant` database connection.
+    $based_on = config('tenancy.database.based_on') ?: config('database.default');
+    config()->set([
+        'database.connections.tenant' => config('database.connections.' . $based_on),
+    ]);
+    // Change DB name
+    $database_name = $this->getDriver() === 'sqlite' ? database_path($database_name) : $database_name;
+    config()->set(['database.connections.tenant.database' => $database_name]);
+}
+
+public function useConnection(string $connection)
+{
+    // $this->database = Illuminate\Database\DatabaseManager
+    $this->database->setDefaultConnection($connection);
+    $this->database->reconnect($connection);
+}
+

Redis tenancy

+

The bootstrap() method calls setPhpRedisPrefix() if tenancy.redis.tenancy is true.

+

This method cycles through the tenancy.redis.prefixed_connections and sets their prefix to tenancy.redis.prefix_base + uuid.

+
public function setPhpRedisPrefix($connections = ['default'])
+{
+    // [...]
+    foreach ($connections as $connection) {
+        $prefix = $this->app['config']['tenancy.redis.prefix_base'] . $this->tenant['uuid'];
+        $client = Redis::connection($connection)->client();
+        try {
+            // [...]
+            $client->setOption($client::OPT_PREFIX, $prefix);
+        } catch (\Throwable $t) {
+            throw new PhpRedisNotInstalledException();
+        }
+    }
+}
+

Cache tenancy

+

bootstrap() calls tagCache() which replaces the 'cache' key in the service container with a different CacheManager.

+
public function tagCache()
+{
+    // [...]
+    $this->app->extend('cache', function () {
+        return new \Stancl\Tenancy\CacheManager($this->app);
+    });
+}
+

This CacheManager forwards all calls to the inner store, but also adds tag which "scope" the cache and allow for selective cache clearing:

+
class CacheManager extends BaseCacheManager
+{
+    public function __call($method, $parameters)
+    {
+        $tags = [config('tenancy.cache.tag_base') . tenant('uuid')];
+        if ($method === 'tags') {
+            if (\count($parameters) !== 1) {
+                throw new \Exception("Method tags() takes exactly 1 argument. {count($parameters)} passed.");
+            }
+            $names = $parameters[0];
+            $names = (array) $names; // cache()->tags('foo') https://laravel.com/docs/5.7/cache#removing-tagged-cache-items
+            return $this->store()->tags(\array_merge($tags, $names));
+        }
+        return $this->store()->tags($tags)->$method(...$parameters);
+    }
+}
+

Filesystem tenancy

+

bootstrap() calls suffiexFilesystemRootPaths(). This method changes storage_path() and the roots of disks listed in config('tenancy.filesystem.disks). You can read more about this on the Filesystem Tenancy page.

+
public function suffixFilesystemRootPaths()
+{
+    // [...]
+    $suffix = $this->app['config']['tenancy.filesystem.suffix_base'] . tenant('uuid');
+    // storage_path()
+    $this->app->useStoragePath($old['path'] . "/{$suffix}");
+    // Storage facade
+    foreach ($this->app['config']['tenancy.filesystem.disks'] as $disk) {
+        // [...]
+        if ($root = \str_replace('%storage_path%', storage_path(), $this->app['config']["tenancy.filesystem.root_override.{$disk}"])) {
+            Storage::disk($disk)->getAdapter()->setPathPrefix($root);
+        } else {
+            $root = $this->app['config']["filesystems.disks.{$disk}.root"];
+            Storage::disk($disk)->getAdapter()->setPathPrefix($root . "/{$suffix}");
+        }
+    }
+    // [...]
+}
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/tenant-manager/index.html b/dist/docs/2.x/tenant-manager/index.html new file mode 100644 index 0000000..4a6c86a --- /dev/null +++ b/dist/docs/2.x/tenant-manager/index.html @@ -0,0 +1,467 @@ + + + + + + + + + + + + + + + + + + + + Tenant Manager | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Tenant Manager

+

This page documents a couple of other TenantManager methods you may find useful.

+

Finding tenant using UUID

+

find() is an alias for getTenantById(). You may use the second argument to specify the key(s) as a string/array.

+
>>> tenant()->find('dbe0b330-1a6e-11e9-b4c3-354da4b4f339');
+=> [
+     "uuid" => "dbe0b330-1a6e-11e9-b4c3-354da4b4f339",
+     "domain" => "localhost",
+     "foo" => "bar",
+   ]
+>>> tenant()->find('dbe0b330-1a6e-11e9-b4c3-354da4b4f339', 'foo');
+=> [
+     "foo" => "bar",
+   ]
+>>> tenant()->getTenantById('dbe0b330-1a6e-11e9-b4c3-354da4b4f339', ['foo', 'domain']);
+=> [
+     "foo" => "bar",
+     "domain" => "localhost",
+   ]
+

Getting tenant ID by domain

+
>>> tenant()->getTenantIdByDomain('localhost');
+=> "b3ce3f90-1a88-11e9-a6b0-038c6337ae50"
+>>> tenant()->getIdByDomain('localhost');
+=> "b3ce3f90-1a88-11e9-a6b0-038c6337ae50"
+

Finding tenant by domain

+

You may use the second argument to specify the key(s) as a string/array.

+
>>> tenant()->findByDomain('localhost');
+=> [
+     "uuid" => "b3ce3f90-1a88-11e9-a6b0-038c6337ae50",
+     "domain" => "localhost",
+   ]
+

Accessing the array

+

You can access the public array tenant of TenantManager like this:

+
tenancy()->tenant
+

which is an array. If you want to get the value of a specific key from the array, you can use one of the helpers the key on the tenant array as an argument.

+
tenant('uuid'); // Does the same thing as tenant()->tenant['uuid']
+

Getting all tenants

+

This method returns a collection of arrays.

+
>>> tenant()->all();
+=> Illuminate\Support\Collection {#2980
+     all: [
+       [
+         "uuid" => "32e20780-1a88-11e9-a051-4b6489a7edac",
+         "domain" => "localhost",
+       ],
+       [
+         "uuid" => "49670df0-1a87-11e9-b7ba-cf5353777957",
+         "domain" => "dev.localhost",
+       ],
+     ],
+   }
+>>> tenant()->all()->pluck('domain');
+=> Illuminate\Support\Collection {#2983
+     all: [
+       "localhost",
+       "dev.localhost",
+     ],
+   }
+

Deleting a tenant

+
>>> tenant()->delete('dbe0b330-1a6e-11e9-b4c3-354da4b4f339');
+=> true
+>>> tenant()->delete(tenant()->getTenantIdByDomain('dev.localhost'));
+=> true
+>>> tenant()->delete(tenant()->findByDomain('localhost')['uuid']);
+=> true
+

This doesn't delete the tenant's database. If you want to delete it, save the database name prior to deleting the tenant. You can get the database name using getDatabaseName()

+
>>> tenant()->getDatabaseName(tenant()->findByDomain('laravel.localhost'))
+=> "tenant67412a60-1c01-11e9-a9e9-f799baa56fd9"
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/tenant-routes/index.html b/dist/docs/2.x/tenant-routes/index.html new file mode 100644 index 0000000..7deb4e9 --- /dev/null +++ b/dist/docs/2.x/tenant-routes/index.html @@ -0,0 +1,416 @@ + + + + + + + + + + + + + + + + + + + + Tenant Routes | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Tenant Routes

+

Routes within routes/tenant.php will have the web middleware group and the IntializeTenancy middleware automatically applied on them. This middleware attempts to identify the tenant based on the current hostname. Once the tenant is identified, the database connection, cache, filesystem root paths and, optionally, Redis connection, will be switched.

+

Just like routes/web.php, these routes use the App\Http\Controllers namespace.

+
+

If a tenant cannot be identified, anexception will be thrown. If you want to change this behavior (to a redirect, for example) read the Middleware Configuration page.

+
+

Exempt routes

+

Routes outside the routes/tenant.php file will not have the tenancy middleware automatically applied on them. You can apply this middleware manually, though.

+

If you want some of your, say, API routes to be multi-tenant, simply wrap them in a Route group with this middleware:

+
use Stancl\Tenancy\Middleware\InitializeTenancy;
+
+Route::middleware(InitializeTenancy::class)->group(function () {
+    // Route::get('/', 'HelloWorld');
+});
+

Using the same routes for tenant and non-tenant parts of the application

+

The Stancl\Tenancy\Middleware\PreventAccessFromTenantDomains middleware makes sure 404 is returned when a user attempts to visit a web route on a tenant (non-exempt) domain.

+

The install command applies this middleware to the web group. If you want to do this for another route group, add this middleware manually to that group. You can do this in app/Http/Kernel.php.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/tenant-storage/index.html b/dist/docs/2.x/tenant-storage/index.html new file mode 100644 index 0000000..3bb48fe --- /dev/null +++ b/dist/docs/2.x/tenant-storage/index.html @@ -0,0 +1,427 @@ + + + + + + + + + + + + + + + + + + + + Tenant Storage | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Tenant Storage

+

Tenant storage is where tenants' uuids and domains are stored. You can store things like the tenant's plan, subscription information, and tenant-specific application configuration in tenant storage. You can use these functions:

+
get (string|array $key, string $uuid = null) // $uuid defaults to the current tenant's UUID
+put (string|array $key, mixed $value = null, string $uuid = null) // if $key is array, make sure $value is null
+

To put something into the tenant storage, you can use put() or set().

+
tenancy()->put($key, $value);
+tenancy()->set($key, $value); // alias for put()
+tenancy()->put($key, $value, $uuid);
+tenancy()->put(['key1' => 'value1', 'key2' => 'value2']);
+tenancy()->put(['key1' => 'value1', 'key2' => 'value2'], null, $uuid);
+

To get something from the storage, you can use get():

+
tenancy()->get($key);
+tenancy()->get($key, $uuid);
+tenancy()->get(['key1', 'key2']);
+
+

Note: tenancy()->get(['key1', 'key2']) returns an array with values only

+
+

Note that $key has to be a string or an array with string keys. The value(s) can be of any data type. Example with arrays:

+
>>> tenant()->put('foo', ['a' => 'b', 'c' => 'd']);
+=> [ // put() returns the supplied value(s)
+     "a" => "b",
+     "c" => "d",
+   ]
+>>> tenant()->get('foo');
+=> [
+     "a" => "b",
+     "c" => "d",
+   ]
+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/usage/index.html b/dist/docs/2.x/usage/index.html new file mode 100644 index 0000000..a4202e9 --- /dev/null +++ b/dist/docs/2.x/usage/index.html @@ -0,0 +1,406 @@ + + + + + + + + + + + + + + + + + + + + Usage | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Usage

+

This chapter describes usage of the package. That includes creating tenants, deleting tenants, storing data in the tenant storage.

+

Most pages will use the tenancy() helper function. This package comes with two helpers - tenancy() and tenant(). They do the same thing, so you can use the one that reads better given its context.

+

tenant()->create() reads better than tenancy()->create(), but tenancy()->init() reads better than tenant()->init().

+

You can pass an argument to the helper function to get a value out of the tenant storage. tenant('plan') is identical to tenant()->get('plan').

+

The package also comes with two facades. Tenancy and Tenant. Use what feels the best.

+

Both the helpers and the facades resolve the TenantManager from the service container.

+
+
+
+ + + + + + + + + diff --git a/dist/docs/2.x/writing-storage-drivers/index.html b/dist/docs/2.x/writing-storage-drivers/index.html new file mode 100644 index 0000000..9a6e175 --- /dev/null +++ b/dist/docs/2.x/writing-storage-drivers/index.html @@ -0,0 +1,464 @@ + + + + + + + + + + + + + + + + + + + + Writing Storage Drivers | stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+
+ + +
+

Writing Storage Drivers

+

If you don't want to use the provided DB/Redis storage drivers, you can write your own driver.

+

To create a driver, create a class that implements the Stancl\Tenancy\Interfaces\StorageDriver interface.

+

For historical reasons, the TenantManager will try to json encode/decode data coming from the storage driver. If you want to avoid this, set public $useJson = false;. That will make TenantManager encode/decode only put() and get() data, so that data types can be stored correctly.

+

The DB storage driver has public $useJson = false;, while the Redis storage driver doesn't use this property, so it's false by default.

+

Here's an example:

+

+namespace App\StorageDrivers\MongoDBStorageDriver;
+
+use Stancl\Tenancy\Interfaces\StorageDriver;
+
+class MongoDBStorageDriver implements StorageDriver
+{
+    public $useJson = false;
+
+    public function identifyTenant(string $domain): array
+    {
+        //
+    }
+
+    public function getAllTenants(array $uuids = []): array
+    {
+        //
+    }
+
+    public function getTenantById(string $uuid, array $fields = []): array
+    {
+        //
+    }
+
+    public function getTenantIdByDomain(string $domain): ?string
+    {
+        //
+    }
+
+    public function createTenant(string $domain, string $uuid): array
+    {
+        //
+    }
+
+    public function deleteTenant(string $uuid): bool
+    {
+        //
+    }
+
+    public function get(string $uuid, string $key)
+    {
+        //
+    }
+
+    public function getMany(string $uuid, array $keys): array
+    {
+        //
+    }
+
+    public function put(string $uuid, string $key, $value)
+    {
+        //
+    }
+
+    public function putMany(string $uuid, array $values): array
+    {
+        //
+    }
+}
+
+
+
+ + + + + + + + + diff --git a/dist/docs/404/index.html b/dist/docs/404/index.html new file mode 100644 index 0000000..36b46fc --- /dev/null +++ b/dist/docs/404/index.html @@ -0,0 +1,100 @@ + + + + + + + + + + + + + + + + + + + + stancl/tenancy documentation + + + + + + + + + + + + + + + +
+
+

404

+ +

Page not found

+ +
+ +

+ Need to update this page? See the Jigsaw documentation. +

+
+
+ + + + + + + + diff --git a/dist/docs/assets/build/css/main.css b/dist/docs/assets/build/css/main.css new file mode 100644 index 0000000..26f71e4 --- /dev/null +++ b/dist/docs/assets/build/css/main.css @@ -0,0 +1,2 @@ +.hljs-comment,.hljs-quote{color:#696969}.hljs-deletion,.hljs-name,.hljs-regexp,.hljs-selector-class,.hljs-selector-id,.hljs-tag,.hljs-template-variable,.hljs-variable{color:#d91e18}.hljs-attribute,.hljs-built_in,.hljs-builtin-name,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-type{color:#aa5d00}.hljs-addition,.hljs-bullet,.hljs-string,.hljs-symbol{color:green}.hljs-section,.hljs-title{color:#007faa}.hljs-keyword,.hljs-selector-tag{color:#7928a1}.hljs{display:block;overflow-x:auto;background:#fefefe;color:#545454;padding:.5em}.hljs-emphasis{font-style:italic}.hljs-strong{font-weight:700}@media screen and (-ms-high-contrast:active){.hljs-addition,.hljs-attribute,.hljs-built_in,.hljs-builtin-name,.hljs-bullet,.hljs-comment,.hljs-link,.hljs-literal,.hljs-meta,.hljs-number,.hljs-params,.hljs-quote,.hljs-string,.hljs-symbol,.hljs-type{color:highlight}.hljs-keyword,.hljs-selector-tag{font-weight:700}} +/*! normalize.css v8.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin:.67em 0}hr{box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}[hidden],template{display:none}html{box-sizing:border-box;font-family:sans-serif}*,:after,:before{box-sizing:inherit}blockquote,dd,dl,figure,h1,h2,p,pre{margin:0}button{background:transparent;padding:0}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset{margin:0;padding:0}ol,ul{margin:0}*,:after,:before{border:0 solid #e2e8ee}img{border-style:solid}textarea{resize:vertical}img{max-width:100%;height:auto}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:inherit;opacity:.5}input::-moz-placeholder,textarea::-moz-placeholder{color:inherit;opacity:.5}input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:inherit;opacity:.5}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:inherit;opacity:.5}input::placeholder,textarea::placeholder{color:inherit;opacity:.5}[role=button],button{cursor:pointer}table{border-collapse:collapse}.container{width:100%}@media (min-width:576px){.container{max-width:576px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:992px){.container{max-width:992px}}@media (min-width:1200px){.container{max-width:1200px}}body{font-size:17px}a{font-weight:600;text-decoration:none;color:#0174d4}a:hover{color:#1a4d8c}blockquote{border-color:#6cb2eb;border-left-width:4px;font-weight:400;font-style:italic;margin-top:2rem;margin-bottom:2rem;padding-left:1.5rem;color:#606f7b;font-size:1.125rem}code{background-color:#e2e8ee;padding:1px .5rem;border-radius:.25rem;font-size:.925rem}code.hljs{background-color:transparent;padding:0}code.hljs .hljs-comment,code.hljs .hljs-keyword,code.hljs .hljs-meta{font-weight:400;font-style:normal}h1,h2{line-height:1.25;margin-bottom:1rem;margin-top:2rem;color:#1f2e41}h1:first-child,h2:first-child{margin-top:0}h1{font-weight:800;font-size:2.625rem}h2{font-weight:700;font-size:2.125rem}hr{border-bottom-width:1px;border-color:#bcdefa;margin-top:3rem;margin-bottom:3rem;border-radius:9999px}li ol,li ul{margin-top:0;margin-bottom:0}ol,ul{margin-top:1rem;margin-bottom:1rem}p,pre{margin-top:1.5rem;margin-bottom:1.5rem}pre{background-color:#ecf0f3;line-height:1.75;overflow-x:auto;padding:1rem;border-radius:.25rem;box-shadow:0 2px 4px 0 rgba(0,0,0,.1);font-size:1rem}pre code{background-color:transparent;display:block;padding:0}.nav-menu{background-color:#ecf0f3;margin:-3rem -2rem 2rem;padding:2rem 1rem 1rem;box-shadow:0 2px 4px 0 rgba(0,0,0,.1);width:auto}@media (min-width:992px){.nav-menu{margin-left:-1rem;margin-right:-1rem;background-color:transparent;display:block;border-bottom-width:0;margin-top:.25rem;padding-left:0;padding-right:1rem;padding-top:0;box-shadow:none;width:25%}}.nav-menu__item{display:block;list-style:none;padding:0;text-decoration:none;margin-bottom:.75rem;margin-top:0;color:#3e4852;font-size:.925rem}.docsearch-input{background-image:url(/assets/img/magnifying-glass.svg);background-position:.8em;background-repeat:no-repeat;text-indent:1.2em}@media (min-width:992px){.docsearch-input:focus{width:66.66667%}}@media (min-width:1200px){.docsearch-input:focus{width:50%}}.docsearch-input__wrapper{position:absolute;background-color:#fff;margin-top:1.75rem;left:0;top:0;padding-left:1rem;padding-right:1rem;width:100%;z-index:10}@media (min-width:768px){.docsearch-input__wrapper{margin-top:0;padding-left:0;padding-right:0;position:relative}}.algolia-autocomplete{text-align:right;width:100%}.list-reset{list-style:none;padding:0}.bg-grey-lightest{background-color:#f9f9f9}.bg-white{background-color:#fff}.bg-blue{background-color:#3490dc}.hover\:bg-blue-lightest:hover{background-color:#eff8ff}.border-collapse{border-collapse:collapse}.border-grey{border-color:#b8c2cc}.border-blue{border-color:#3490dc}.focus\:border-blue-light:focus{border-color:#6cb2eb}.rounded-full{border-radius:9999px}.border{border-width:1px}.border-b{border-bottom-width:1px}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.table{display:table}.table-cell{display:table-cell}.hidden{display:none}.flex{display:flex}.inline-flex{display:inline-flex}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.flex-1{flex:1 1 0%}.flex-auto{flex:1 1 auto}.flex-grow{flex-grow:1}.flex-shrink{flex-shrink:1}.font-sans{font-family:Nunito Sans,system-ui,BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.font-light{font-weight:300}.font-semibold{font-weight:600}.h-4{height:1rem}.h-8{height:2rem}.h-9{height:2.2rem}.h-10{height:2.5rem}.h-24{height:6rem}.h-full{height:100%}.leading-none{line-height:1}.leading-normal{line-height:1.6}.my-0{margin-top:0;margin-bottom:0}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-auto{margin-left:auto;margin-right:auto}.mb-2{margin-bottom:.5rem}.mr-3{margin-right:.75rem}.mr-4{margin-right:1rem}.mb-8{margin-bottom:2rem}.mt-12{margin-top:3rem}.mt-32{margin-top:8rem}.ml-auto{margin-left:auto}.max-w-sm{max-width:30rem}.max-w-4xl{max-width:90rem}.max-w-none{max-width:none}.min-h-screen{min-height:100vh}.-mt-px{margin-top:-1px}.focus\:outline-none:focus,.outline-none{outline:0}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.pb-0{padding-bottom:0}.pr-4{padding-right:1rem}.pl-4{padding-left:1rem}.pr-7{padding-right:1.75rem}.pb-16{padding-bottom:4rem}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.pin-t{top:0}.pin-r{right:0}.resize{resize:both}.shadow{box-shadow:0 2px 4px 0 rgba(0,0,0,.1)}.fill-current{fill:currentColor}.text-center{text-align:center}.text-right{text-align:right}.text-grey-darkest{color:#3e4852}.text-grey-darker{color:#606f7b}.text-grey-dark{color:#8795a1}.text-white{color:#fff}.text-blue-darkest{color:#24548f}.text-blue{color:#3490dc}.hover\:text-blue-dark:hover{color:#0174d4}.hover\:text-blue:hover{color:#3490dc}.text-sm{font-size:.925rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-3xl{font-size:1.75rem}.text-6xl{font-size:10rem}.italic{font-style:italic}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.capitalize{text-transform:capitalize}.underline{text-decoration:underline}.line-through{text-decoration:line-through}.visible{visibility:visible}.break-words{word-wrap:break-word}.w-4{width:1rem}.w-full{width:100%}.transition-fast{transition:all .2s ease-out}.transition{transition:all .5s ease-out}@media (min-width:768px){.md\:block{display:block}.md\:hidden{display:none}.md\:flex-row{flex-direction:row}.md\:h-10{height:2.5rem}.md\:mr-2{margin-right:.5rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:pl-10{padding-left:2.5rem}.md\:text-2xl{font-size:1.5rem}}@media (min-width:992px){.lg\:block{display:block}.lg\:hidden{display:none}.lg\:flex-row{flex-direction:row}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pl-4{padding-left:1rem}.lg\:w-1\/2{width:50%}.lg\:w-3\/5{width:60%}}@media (min-width:1200px){.xl\:w-1\/3{width:33.33333%}} \ No newline at end of file diff --git a/dist/docs/assets/build/css/main.css.map b/dist/docs/assets/build/css/main.css.map new file mode 100644 index 0000000..64018dc --- /dev/null +++ b/dist/docs/assets/build/css/main.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./source/_assets/sass/main.scss","webpack:///./node_modules/highlight.js/styles/github.css","webpack:///./source/_assets/sass/_base.scss","webpack:///./source/_assets/sass/_navigation.scss","webpack:///./"],"names":[],"mappings":"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","file":"css/main.css","sourcesContent":["@tailwind preflight;\n@tailwind components;\n\n// Code syntax highlighting,\n// powered by https://highlightjs.org\n@import '~highlight.js/styles/github';\n\n@import 'base';\n@import 'navigation';\n@import 'documentation';\n\n@tailwind utilities;\n\n\n\n// WEBPACK FOOTER //\n// ./source/_assets/sass/main.scss","/*\n\ngithub.com style (c) Vasily Polovnyov \n\n*/\n\n.hljs {\n display: block;\n overflow-x: auto;\n padding: 0.5em;\n color: #333;\n background: #f8f8f8;\n}\n\n.hljs-comment,\n.hljs-quote {\n color: #998;\n font-style: italic;\n}\n\n.hljs-keyword,\n.hljs-selector-tag,\n.hljs-subst {\n color: #333;\n font-weight: bold;\n}\n\n.hljs-number,\n.hljs-literal,\n.hljs-variable,\n.hljs-template-variable,\n.hljs-tag .hljs-attr {\n color: #008080;\n}\n\n.hljs-string,\n.hljs-doctag {\n color: #d14;\n}\n\n.hljs-title,\n.hljs-section,\n.hljs-selector-id {\n color: #900;\n font-weight: bold;\n}\n\n.hljs-subst {\n font-weight: normal;\n}\n\n.hljs-type,\n.hljs-class .hljs-title {\n color: #458;\n font-weight: bold;\n}\n\n.hljs-tag,\n.hljs-name,\n.hljs-attribute {\n color: #000080;\n font-weight: normal;\n}\n\n.hljs-regexp,\n.hljs-link {\n color: #009926;\n}\n\n.hljs-symbol,\n.hljs-bullet {\n color: #990073;\n}\n\n.hljs-built_in,\n.hljs-builtin-name {\n color: #0086b3;\n}\n\n.hljs-meta {\n color: #999;\n font-weight: bold;\n}\n\n.hljs-deletion {\n background: #fdd;\n}\n\n.hljs-addition {\n background: #dfd;\n}\n\n.hljs-emphasis {\n font-style: italic;\n}\n\n.hljs-strong {\n font-weight: bold;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./node_modules/highlight.js/styles/github.css","a {\n @apply .no-underline;\n @apply .text-blue;\n}\n\nbody {\n font-size: 17px;\n}\n\nblockquote {\n @apply .border-blue-light;\n @apply .border-l-4;\n @apply .font-normal;\n @apply .italic;\n @apply .my-8;\n @apply .pl-6;\n @apply .text-grey-darker;\n @apply .text-lg;\n}\n\ncode {\n font-size: 16px;\n @apply .bg-grey-light;\n @apply .px-2;\n @apply .py-px;\n @apply .rounded;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5,\nh6 {\n @apply .leading-tight;\n @apply .mb-4;\n @apply .mt-8;\n @apply .text-black;\n\n &:first-child {\n @apply .mt-0;\n }\n}\n\nh1 {\n @apply .font-extrabold;\n @apply .text-5xl;\n}\n\nh2 {\n @apply .font-bold;\n @apply .text-4xl;\n}\n\nh3 {\n @apply .font-bold;\n @apply .text-3xl;\n}\n\nh4 {\n @apply .font-normal;\n @apply .text-2xl;\n}\n\nh5 {\n @apply .font-normal;\n @apply .text-xl;\n}\n\nh6 {\n @apply .font-light;\n @apply .text-lg;\n}\n\nhr {\n @apply .border-b-2;\n @apply .border-grey-light;\n @apply .my-8;\n @apply .rounded-full;\n}\n\nli {\n ul,\n ol {\n @apply .my-0;\n }\n}\n\np {\n @apply .my-6;\n}\n\npre {\n @apply .bg-grey-lighter;\n @apply .leading-loose;\n @apply .my-6;\n @apply .overflow-x-auto;\n @apply .p-4;\n @apply .rounded;\n @apply .shadow;\n @apply .text-base;\n\n code {\n @apply .bg-transparent;\n @apply .block;\n @apply .p-0;\n }\n}\n\nul,\nol {\n @apply .my-4;\n}\n\ncode.hljs {\n @apply .bg-transparent;\n @apply .p-0;\n}\n\n\n\n// WEBPACK FOOTER //\n// ./source/_assets/sass/_base.scss",".docsearch {\n background: url('/assets/img/magnifying-glass.svg');\n background-position: 0.8em;\n background-repeat: no-repeat;\n text-indent: 1.2em;\n}\n\n@screen md {\n .docsearch:focus {\n @apply .w-1/2;\n\n text-indent: 1.5em;\n }\n}\n\n\n\n// WEBPACK FOOTER //\n// ./source/_assets/sass/_navigation.scss",null],"sourceRoot":""} \ No newline at end of file diff --git a/dist/docs/assets/build/js/main.js b/dist/docs/assets/build/js/main.js new file mode 100644 index 0000000..596bb2c --- /dev/null +++ b/dist/docs/assets/build/js/main.js @@ -0,0 +1,2 @@ +!function(e){var t={};function n(r){if(t[r])return t[r].exports;var i=t[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,n),i.l=!0,i.exports}n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var i in e)n.d(r,i,function(t){return e[t]}.bind(null,i));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/",n(n.s=0)}({"+Ewk":function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0}),t.default="2.6.3"},"+RWU":function(e,t,n){"use strict";e.exports=function(e,t,n){if("GET"!==t.method)return void n(new Error("Method "+t.method+" "+e+" is not supported by JSONP."));t.debug("JSONP: start");var s=!1,o=!1;i+=1;var a=document.getElementsByTagName("head")[0],c=document.createElement("script"),u="algoliaJSONP_"+i,l=!1;window[u]=function(e){!function(){try{delete window[u],delete window[u+"_loaded"]}catch(e){window[u]=window[u+"_loaded"]=void 0}}(),o?t.debug("JSONP: Late answer, ignoring"):(s=!0,d(),n(null,{body:e,responseText:JSON.stringify(e)}))},e+="&callback="+u,t.jsonBody&&t.jsonBody.params&&(e+="&"+t.jsonBody.params);var h=setTimeout(function(){t.debug("JSONP: Script timeout"),o=!0,d(),n(new r.RequestTimeout)},t.timeouts.complete);function p(){t.debug("JSONP: success"),l||o||(l=!0,s||(t.debug("JSONP: Fail. Script loaded but did not call the callback"),d(),n(new r.JSONPScriptFail)))}function d(){clearTimeout(h),c.onload=null,c.onreadystatechange=null,c.onerror=null,a.removeChild(c)}c.onreadystatechange=function(){"loaded"!==this.readyState&&"complete"!==this.readyState||p()},c.onload=p,c.onerror=function(){t.debug("JSONP: Script error"),l||o||(d(),n(new r.JSONPScriptError))},c.async=!0,c.defer=!0,c.src=e,a.appendChild(c)};var r=n("Z4lL"),i=0},"/kzE":function(e,t){var n;n=window,e.exports=function(e){var t,n,r=function(){var t,n,r,i,s,o,a=[],c=a.concat,u=a.filter,l=a.slice,h=e.document,p={},d={},f={"column-count":1,columns:1,"font-weight":1,"line-height":1,opacity:1,"z-index":1,zoom:1},g=/^\s*<(\w+|!)[^>]*>/,m=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,y=/^(?:body|html)$/i,b=/([A-Z])/g,_=["val","css","html","text","data","width","height","offset"],w=h.createElement("table"),x=h.createElement("tr"),E={tr:h.createElement("tbody"),tbody:w,thead:w,tfoot:w,td:x,th:x,"*":h.createElement("div")},S=/complete|loaded|interactive/,C=/^[\w-]*$/,O={},N=O.toString,A={},T=h.createElement("div"),k={tabindex:"tabIndex",readonly:"readOnly",for:"htmlFor",class:"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},R=Array.isArray||function(e){return e instanceof Array};function M(e){return null==e?String(e):O[N.call(e)]||"object"}function D(e){return"function"==M(e)}function I(e){return null!=e&&e==e.window}function L(e){return null!=e&&e.nodeType==e.DOCUMENT_NODE}function j(e){return"object"==M(e)}function P(e){return j(e)&&!I(e)&&Object.getPrototypeOf(e)==Object.prototype}function $(e){var t=!!e&&"length"in e&&e.length,n=r.type(e);return"function"!=n&&!I(e)&&("array"==n||0===t||"number"==typeof t&&t>0&&t-1 in e)}function B(e){return e.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function q(e){return e in d?d[e]:d[e]=new RegExp("(^|\\s)"+e+"(\\s|$)")}function U(e,t){return"number"!=typeof t||f[B(e)]?t:t+"px"}function H(e){return"children"in e?l.call(e.children):r.map(e.childNodes,function(e){if(1==e.nodeType)return e})}function F(e,t){var n,r=e?e.length:0;for(n=0;n")),n===t&&(n=g.test(e)&&RegExp.$1),n in E||(n="*"),(a=E[n]).innerHTML=""+e,s=r.each(l.call(a.childNodes),function(){a.removeChild(this)})),P(i)&&(o=r(s),r.each(i,function(e,t){_.indexOf(e)>-1?o[e](t):o.attr(e,t)})),s},A.Z=function(e,t){return new F(e,t)},A.isZ=function(e){return e instanceof A.Z},A.init=function(e,n){var i,s;if(!e)return A.Z();if("string"==typeof e)if("<"==(e=e.trim())[0]&&g.test(e))i=A.fragment(e,RegExp.$1,n),e=null;else{if(n!==t)return r(n).find(e);i=A.qsa(h,e)}else{if(D(e))return r(h).ready(e);if(A.isZ(e))return e;if(R(e))s=e,i=u.call(s,function(e){return null!=e});else if(j(e))i=[e],e=null;else if(g.test(e))i=A.fragment(e.trim(),RegExp.$1,n),e=null;else{if(n!==t)return r(n).find(e);i=A.qsa(h,e)}}return A.Z(i,e)},(r=function(e,t){return A.init(e,t)}).extend=function(e){var t,n=l.call(arguments,1);return"boolean"==typeof e&&(t=e,e=n.shift()),n.forEach(function(n){K(e,n,t)}),e},A.qsa=function(e,t){var n,r="#"==t[0],i=!r&&"."==t[0],s=r||i?t.slice(1):t,o=C.test(s);return e.getElementById&&o&&r?(n=e.getElementById(s))?[n]:[]:1!==e.nodeType&&9!==e.nodeType&&11!==e.nodeType?[]:l.call(o&&!r&&e.getElementsByClassName?i?e.getElementsByClassName(s):e.getElementsByTagName(t):e.querySelectorAll(t))},r.contains=h.documentElement.contains?function(e,t){return e!==t&&e.contains(t)}:function(e,t){for(;t&&(t=t.parentNode);)if(t===e)return!0;return!1},r.type=M,r.isFunction=D,r.isWindow=I,r.isArray=R,r.isPlainObject=P,r.isEmptyObject=function(e){var t;for(t in e)return!1;return!0},r.isNumeric=function(e){var t=Number(e),n=typeof e;return null!=e&&"boolean"!=n&&("string"!=n||e.length)&&!isNaN(t)&&isFinite(t)||!1},r.inArray=function(e,t,n){return a.indexOf.call(t,e,n)},r.camelCase=s,r.trim=function(e){return null==e?"":String.prototype.trim.call(e)},r.uuid=0,r.support={},r.expr={},r.noop=function(){},r.map=function(e,t){var n,i,s,o,a=[];if($(e))for(i=0;i0?r.fn.concat.apply([],o):o},r.each=function(e,t){var n,r;if($(e)){for(n=0;n=0?e:e+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(e){return a.every.call(this,function(t,n){return!1!==e.call(t,n,t)}),this},filter:function(e){return D(e)?this.not(this.not(e)):r(u.call(this,function(t){return A.matches(t,e)}))},add:function(e,t){return r(o(this.concat(r(e,t))))},is:function(e){return this.length>0&&A.matches(this[0],e)},not:function(e){var n=[];if(D(e)&&e.call!==t)this.each(function(t){e.call(this,t)||n.push(this)});else{var i="string"==typeof e?this.filter(e):$(e)&&D(e.item)?l.call(e):r(e);this.forEach(function(e){i.indexOf(e)<0&&n.push(e)})}return r(n)},has:function(e){return this.filter(function(){return j(e)?r.contains(this,e):r(this).find(e).size()})},eq:function(e){return-1===e?this.slice(e):this.slice(e,+e+1)},first:function(){var e=this[0];return e&&!j(e)?e:r(e)},last:function(){var e=this[this.length-1];return e&&!j(e)?e:r(e)},find:function(e){var t=this;return e?"object"==typeof e?r(e).filter(function(){var e=this;return a.some.call(t,function(t){return r.contains(t,e)})}):1==this.length?r(A.qsa(this[0],e)):this.map(function(){return A.qsa(this,e)}):r()},closest:function(e,t){var n=[],i="object"==typeof e&&r(e);return this.each(function(r,s){for(;s&&!(i?i.indexOf(s)>=0:A.matches(s,e));)s=s!==t&&!L(s)&&s.parentNode;s&&n.indexOf(s)<0&&n.push(s)}),r(n)},parents:function(e){for(var t=[],n=this;n.length>0;)n=r.map(n,function(e){if((e=e.parentNode)&&!L(e)&&t.indexOf(e)<0)return t.push(e),e});return z(t,e)},parent:function(e){return z(o(this.pluck("parentNode")),e)},children:function(e){return z(this.map(function(){return H(this)}),e)},contents:function(){return this.map(function(){return this.contentDocument||l.call(this.childNodes)})},siblings:function(e){return z(this.map(function(e,t){return u.call(H(t.parentNode),function(e){return e!==t})}),e)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(e){return r.map(this,function(t){return t[e]})},show:function(){return this.each(function(){var e,t,n;"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=(e=this.nodeName,p[e]||(t=h.createElement(e),h.body.appendChild(t),n=getComputedStyle(t,"").getPropertyValue("display"),t.parentNode.removeChild(t),"none"==n&&(n="block"),p[e]=n),p[e]))})},replaceWith:function(e){return this.before(e).remove()},wrap:function(e){var t=D(e);if(this[0]&&!t)var n=r(e).get(0),i=n.parentNode||this.length>1;return this.each(function(s){r(this).wrapAll(t?e.call(this,s):i?n.cloneNode(!0):n)})},wrapAll:function(e){if(this[0]){var t;for(r(this[0]).before(e=r(e));(t=e.children()).length;)e=t.first();r(e).append(this)}return this},wrapInner:function(e){var t=D(e);return this.each(function(n){var i=r(this),s=i.contents(),o=t?e.call(this,n):e;s.length?s.wrapAll(o):i.append(o)})},unwrap:function(){return this.parent().each(function(){r(this).replaceWith(r(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(e){return this.each(function(){var n=r(this);(e===t?"none"==n.css("display"):e)?n.show():n.hide()})},prev:function(e){return r(this.pluck("previousElementSibling")).filter(e||"*")},next:function(e){return r(this.pluck("nextElementSibling")).filter(e||"*")},html:function(e){return 0 in arguments?this.each(function(t){var n=this.innerHTML;r(this).empty().append(V(this,e,t,n))}):0 in this?this[0].innerHTML:null},text:function(e){return 0 in arguments?this.each(function(t){var n=V(this,e,t,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(e,r){var i;return"string"!=typeof e||1 in arguments?this.each(function(t){if(1===this.nodeType)if(j(e))for(n in e)G(this,n,e[n]);else G(this,e,V(this,r,t,this.getAttribute(e)))}):0 in this&&1==this[0].nodeType&&null!=(i=this[0].getAttribute(e))?i:t},removeAttr:function(e){return this.each(function(){1===this.nodeType&&e.split(" ").forEach(function(e){G(this,e)},this)})},prop:function(e,t){return e=k[e]||e,1 in arguments?this.each(function(n){this[e]=V(this,t,n,this[e])}):this[0]&&this[0][e]},removeProp:function(e){return e=k[e]||e,this.each(function(){delete this[e]})},data:function(e,n){var r="data-"+e.replace(b,"-$1").toLowerCase(),i=1 in arguments?this.attr(r,n):this.attr(r);return null!==i?W(i):t},val:function(e){return 0 in arguments?(null==e&&(e=""),this.each(function(t){this.value=V(this,e,t,this.value)})):this[0]&&(this[0].multiple?r(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=r(this),i=V(this,t,e,n.offset()),s=n.offsetParent().offset(),o={top:i.top-s.top,left:i.left-s.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(h.documentElement!==this[0]&&!r.contains(h.documentElement,this[0]))return{top:0,left:0};var n=this[0].getBoundingClientRect();return{left:n.left+e.pageXOffset,top:n.top+e.pageYOffset,width:Math.round(n.width),height:Math.round(n.height)}},css:function(e,t){if(arguments.length<2){var i=this[0];if("string"==typeof e){if(!i)return;return i.style[s(e)]||getComputedStyle(i,"").getPropertyValue(e)}if(R(e)){if(!i)return;var o={},a=getComputedStyle(i,"");return r.each(e,function(e,t){o[t]=i.style[s(t)]||a.getPropertyValue(t)}),o}}var c="";if("string"==M(e))t||0===t?c=B(e)+":"+U(e,t):this.each(function(){this.style.removeProperty(B(e))});else for(n in e)e[n]||0===e[n]?c+=B(n)+":"+U(n,e[n])+";":this.each(function(){this.style.removeProperty(B(n))});return this.each(function(){this.style.cssText+=";"+c})},index:function(e){return e?this.indexOf(r(e)[0]):this.parent().children().indexOf(this[0])},hasClass:function(e){return!!e&&a.some.call(this,function(e){return this.test(J(e))},q(e))},addClass:function(e){return e?this.each(function(t){if("className"in this){i=[];var n=J(this);V(this,e,t,n).split(/\s+/g).forEach(function(e){r(this).hasClass(e)||i.push(e)},this),i.length&&J(this,n+(n?" ":"")+i.join(" "))}}):this},removeClass:function(e){return this.each(function(n){if("className"in this){if(e===t)return J(this,"");i=J(this),V(this,e,n,i).split(/\s+/g).forEach(function(e){i=i.replace(q(e)," ")}),J(this,i.trim())}})},toggleClass:function(e,n){return e?this.each(function(i){var s=r(this);V(this,e,i,J(this)).split(/\s+/g).forEach(function(e){(n===t?!s.hasClass(e):n)?s.addClass(e):s.removeClass(e)})}):this},scrollTop:function(e){if(this.length){var n="scrollTop"in this[0];return e===t?n?this[0].scrollTop:this[0].pageYOffset:this.each(n?function(){this.scrollTop=e}:function(){this.scrollTo(this.scrollX,e)})}},scrollLeft:function(e){if(this.length){var n="scrollLeft"in this[0];return e===t?n?this[0].scrollLeft:this[0].pageXOffset:this.each(n?function(){this.scrollLeft=e}:function(){this.scrollTo(e,this.scrollY)})}},position:function(){if(this.length){var e=this[0],t=this.offsetParent(),n=this.offset(),i=y.test(t[0].nodeName)?{top:0,left:0}:t.offset();return n.top-=parseFloat(r(e).css("margin-top"))||0,n.left-=parseFloat(r(e).css("margin-left"))||0,i.top+=parseFloat(r(t[0]).css("border-top-width"))||0,i.left+=parseFloat(r(t[0]).css("border-left-width"))||0,{top:n.top-i.top,left:n.left-i.left}}},offsetParent:function(){return this.map(function(){for(var e=this.offsetParent||h.body;e&&!y.test(e.nodeName)&&"static"==r(e).css("position");)e=e.offsetParent;return e})}},r.fn.detach=r.fn.remove,["width","height"].forEach(function(e){var n=e.replace(/./,function(e){return e[0].toUpperCase()});r.fn[e]=function(i){var s,o=this[0];return i===t?I(o)?o["inner"+n]:L(o)?o.documentElement["scroll"+n]:(s=this.offset())&&s[e]:this.each(function(t){(o=r(this)).css(e,V(this,i,t,o[e]()))})}}),["after","prepend","before","append"].forEach(function(n,i){var s=i%2;r.fn[n]=function(){var n,o,a=r.map(arguments,function(e){var i=[];return"array"==(n=M(e))?(e.forEach(function(e){return e.nodeType!==t?i.push(e):r.zepto.isZ(e)?i=i.concat(e.get()):void(i=i.concat(A.fragment(e)))}),i):"object"==n||null==e?e:A.fragment(e)}),c=this.length>1;return a.length<1?this:this.each(function(t,n){o=s?n:n.parentNode,n=0==i?n.nextSibling:1==i?n.firstChild:2==i?n:null;var u=r.contains(h.documentElement,o);a.forEach(function(t){if(c)t=t.cloneNode(!0);else if(!o)return r(t).remove();o.insertBefore(t,n),u&&Z(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var n=t.ownerDocument?t.ownerDocument.defaultView:e;n.eval.call(n,t.innerHTML)}})})})},r.fn[s?n+"To":"insert"+(i?"Before":"After")]=function(e){return r(e)[n](this),this}}),A.Z.prototype=F.prototype=r.fn,A.uniq=o,A.deserializeValue=W,r.zepto=A,r}();return function(t){var n,r=1,i=Array.prototype.slice,s=t.isFunction,o=function(e){return"string"==typeof e},a={},c={},u="onfocusin"in e,l={focus:"focusin",blur:"focusout"},h={mouseenter:"mouseover",mouseleave:"mouseout"};function p(e){return e._zid||(e._zid=r++)}function d(e,t,n,r){if((t=f(t)).ns)var i=(s=t.ns,new RegExp("(?:^| )"+s.replace(" "," .* ?")+"(?: |$)"));var s;return(a[p(e)]||[]).filter(function(e){return e&&(!t.e||e.e==t.e)&&(!t.ns||i.test(e.ns))&&(!n||p(e.fn)===p(n))&&(!r||e.sel==r)})}function f(e){var t=(""+e).split(".");return{e:t[0],ns:t.slice(1).sort().join(" ")}}function g(e,t){return e.del&&!u&&e.e in l||!!t}function m(e){return h[e]||u&&l[e]||e}function v(e,r,i,s,o,c,u){var l=p(e),d=a[l]||(a[l]=[]);r.split(/\s/).forEach(function(r){if("ready"==r)return t(document).ready(i);var a=f(r);a.fn=i,a.sel=o,a.e in h&&(i=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return a.fn.apply(this,arguments)}),a.del=c;var l=c||i;a.proxy=function(t){if(!(t=E(t)).isImmediatePropagationStopped()){try{var r=Object.getOwnPropertyDescriptor(t,"data");r&&!r.writable||(t.data=s)}catch(t){}var i=l.apply(e,t._args==n?[t]:[t].concat(t._args));return!1===i&&(t.preventDefault(),t.stopPropagation()),i}},a.i=d.length,d.push(a),"addEventListener"in e&&e.addEventListener(m(a.e),a.proxy,g(a,u))})}function y(e,t,n,r,i){var s=p(e);(t||"").split(/\s/).forEach(function(t){d(e,t,n,r).forEach(function(t){delete a[s][t.i],"removeEventListener"in e&&e.removeEventListener(m(t.e),t.proxy,g(t,i))})})}c.click=c.mousedown=c.mouseup=c.mousemove="MouseEvents",t.event={add:v,remove:y},t.proxy=function(e,n){var r=2 in arguments&&i.call(arguments,2);if(s(e)){var a=function(){return e.apply(n,r?r.concat(i.call(arguments)):arguments)};return a._zid=p(e),a}if(o(n))return r?(r.unshift(e[n],e),t.proxy.apply(null,r)):t.proxy(e[n],e);throw new TypeError("expected function")},t.fn.bind=function(e,t,n){return this.on(e,t,n)},t.fn.unbind=function(e,t){return this.off(e,t)},t.fn.one=function(e,t,n,r){return this.on(e,t,n,r,1)};var b=function(){return!0},_=function(){return!1},w=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,x={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};function E(e,r){return!r&&e.isDefaultPrevented||(r||(r=e),t.each(x,function(t,n){var i=r[t];e[t]=function(){return this[n]=b,i&&i.apply(r,arguments)},e[n]=_}),e.timeStamp||(e.timeStamp=Date.now()),(r.defaultPrevented!==n?r.defaultPrevented:"returnValue"in r?!1===r.returnValue:r.getPreventDefault&&r.getPreventDefault())&&(e.isDefaultPrevented=b)),e}function S(e){var t,r={originalEvent:e};for(t in e)w.test(t)||e[t]===n||(r[t]=e[t]);return E(r,e)}t.fn.delegate=function(e,t,n){return this.on(t,e,n)},t.fn.undelegate=function(e,t,n){return this.off(t,e,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,r,a,c,u){var l,h,p=this;return e&&!o(e)?(t.each(e,function(e,t){p.on(e,r,a,t,u)}),p):(o(r)||s(c)||!1===c||(c=a,a=r,r=n),c!==n&&!1!==a||(c=a,a=n),!1===c&&(c=_),p.each(function(n,s){u&&(l=function(e){return y(s,e.type,c),c.apply(this,arguments)}),r&&(h=function(e){var n,o=t(e.target).closest(r,s).get(0);if(o&&o!==s)return n=t.extend(S(e),{currentTarget:o,liveFired:s}),(l||c).apply(o,[n].concat(i.call(arguments,1)))}),v(s,e,c,a,r,h||l)}))},t.fn.off=function(e,r,i){var a=this;return e&&!o(e)?(t.each(e,function(e,t){a.off(e,r,t)}),a):(o(r)||s(i)||!1===i||(i=r,r=n),!1===i&&(i=_),a.each(function(){y(this,e,i,r)}))},t.fn.trigger=function(e,n){return(e=o(e)||t.isPlainObject(e)?t.Event(e):E(e))._args=n,this.each(function(){e.type in l&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,n){var r,i;return this.each(function(s,a){(r=S(o(e)?t.Event(e):e))._args=n,r.target=a,t.each(d(a,e.type||e),function(e,t){if(i=t.proxy(r),r.isImmediatePropagationStopped())return!1})}),i},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(e,t){o(e)||(e=(t=e).type);var n=document.createEvent(c[e]||"Events"),r=!0;if(t)for(var i in t)"bubbles"==i?r=!!t[i]:n[i]=t[i];return n.initEvent(e,r,!0),E(n)}}(r),n=[],r.fn.remove=function(){return this.each(function(){this.parentNode&&("IMG"===this.tagName&&(n.push(this),this.src="data:image/gif;base64,R0lGODlhAQABAAD/ACwAAAAAAQABAAACADs=",t&&clearTimeout(t),t=setTimeout(function(){n=[]},6e4)),this.parentNode.removeChild(this))})},function(e){var t={},n=e.fn.data,r=e.camelCase,i=e.expando="Zepto"+ +new Date,s=[];function o(n,o,a){var c=n[i]||(n[i]=++e.uuid),u=t[c]||(t[c]=function(t){var n={};return e.each(t.attributes||s,function(t,i){0==i.name.indexOf("data-")&&(n[r(i.name.replace("data-",""))]=e.zepto.deserializeValue(i.value))}),n}(n));return void 0!==o&&(u[r(o)]=a),u}e.fn.data=function(s,a){return void 0===a?e.isPlainObject(s)?this.each(function(t,n){e.each(s,function(e,t){o(n,e,t)})}):0 in this?function(s,a){var c=s[i],u=c&&t[c];if(void 0===a)return u||o(s);if(u){if(a in u)return u[a];var l=r(a);if(l in u)return u[l]}return n.call(e(s),a)}(this[0],s):void 0:this.each(function(){o(this,s,a)})},e.data=function(t,n,r){return e(t).data(n,r)},e.hasData=function(n){var r=n[i],s=r&&t[r];return!!s&&!e.isEmptyObject(s)},e.fn.removeData=function(n){return"string"==typeof n&&(n=n.split(/\s+/)),this.each(function(){var s=this[i],o=s&&t[s];o&&e.each(n||o,function(e){delete o[n?r(this):e]})})},["remove","empty"].forEach(function(t){var n=e.fn[t];e.fn[t]=function(){var e=this.find("*");return"remove"===t&&(e=e.add(this)),e.removeData(),n.call(this)}})}(r),r}(n)},0:function(e,t,n){n("BSPe"),e.exports=n("olAV")},"0Ul8":function(e,t,n){(function(t){e.exports=c;var r=n("Z4lL"),i=n("c+Bx"),s=n("ilQL"),o=n("ef3p"),a=t.env.RESET_APP_DATA_TIMER&&parseInt(t.env.RESET_APP_DATA_TIMER,10)||12e4;function c(e,t,i){var s=n("8KqL")("algoliasearch"),o=n("sLmk"),a=n("49sm"),c=n("7Ule"),l="Usage: algoliasearch(applicationID, apiKey, opts)";if(!0!==i._allowEmptyCredentials&&!e)throw new r.AlgoliaSearchError("Please provide an application ID. "+l);if(!0!==i._allowEmptyCredentials&&!t)throw new r.AlgoliaSearchError("Please provide an API key. "+l);this.applicationID=e,this.apiKey=t,this.hosts={read:[],write:[]},i=i||{},this._timeouts=i.timeouts||{connect:1e3,read:2e3,write:3e4},i.timeout&&(this._timeouts.connect=this._timeouts.read=this._timeouts.write=i.timeout);var h=i.protocol||"https:";if(/:$/.test(h)||(h+=":"),"http:"!==h&&"https:"!==h)throw new r.AlgoliaSearchError("protocol must be `http:` or `https:` (was `"+i.protocol+"`)");if(this._checkAppIdData(),i.hosts)a(i.hosts)?(this.hosts.read=o(i.hosts),this.hosts.write=o(i.hosts)):(this.hosts.read=o(i.hosts.read),this.hosts.write=o(i.hosts.write));else{var p=c(this._shuffleResult,function(t){return e+"-"+t+".algolianet.com"}),d=(!1===i.dsn?"":"-dsn")+".algolia.net";this.hosts.read=[this.applicationID+d].concat(p),this.hosts.write=[this.applicationID+".algolia.net"].concat(p)}this.hosts.read=c(this.hosts.read,u(h)),this.hosts.write=c(this.hosts.write,u(h)),this.extraHeaders={},this.cache=i._cache||{},this._ua=i._ua,this._useCache=!(void 0!==i._useCache&&!i._cache)||i._useCache,this._useRequestCache=this._useCache&&i._useRequestCache,this._useFallback=void 0===i.useFallback||i.useFallback,this._setTimeout=i._setTimeout,s("init done, %j",this)}function u(e){return function(t){return e+"//"+t.toLowerCase()}}function l(e){if(void 0===Array.prototype.toJSON)return JSON.stringify(e);var t=Array.prototype.toJSON;delete Array.prototype.toJSON;var n=JSON.stringify(e);return Array.prototype.toJSON=t,n}function h(e){var t={};for(var n in e){var r;if(Object.prototype.hasOwnProperty.call(e,n))r="x-algolia-api-key"===n||"x-algolia-application-id"===n?"**hidden for security purposes**":e[n],t[n]=r}return t}c.prototype.initIndex=function(e){return new s(this,e)},c.prototype.setExtraHeader=function(e,t){this.extraHeaders[e.toLowerCase()]=t},c.prototype.getExtraHeader=function(e){return this.extraHeaders[e.toLowerCase()]},c.prototype.unsetExtraHeader=function(e){delete this.extraHeaders[e.toLowerCase()]},c.prototype.addAlgoliaAgent=function(e){var t="; "+e;-1===this._ua.indexOf(t)&&(this._ua+=t)},c.prototype._jsonRequest=function(e){this._checkAppIdData();var t,s,o,a=n("8KqL")("algoliasearch:"+e.url),c=e.additionalUA||"",u=e.cache,p=this,d=0,f=!1,g=p._useFallback&&p._request.fallback&&e.fallback;this.apiKey.length>500&&void 0!==e.body&&(void 0!==e.body.params||void 0!==e.body.requests)?(e.body.apiKey=this.apiKey,o=this._computeRequestHeaders({additionalUA:c,withApiKey:!1,headers:e.headers})):o=this._computeRequestHeaders({additionalUA:c,headers:e.headers}),void 0!==e.body&&(t=l(e.body)),a("request start");var m=[];function v(e,t,n){return p._useCache&&e&&t&&void 0!==t[n]}function y(t,n){if(v(p._useRequestCache,u,s)&&t.catch(function(){delete u[s]}),"function"!=typeof e.callback)return t.then(n);t.then(function(t){i(function(){e.callback(null,n(t))},p._setTimeout||setTimeout)},function(t){i(function(){e.callback(t)},p._setTimeout||setTimeout)})}if(p._useCache&&p._useRequestCache&&(s=e.url),p._useCache&&p._useRequestCache&&t&&(s+="_body_"+t),v(p._useRequestCache,u,s)){a("serving request from cache");var b=u[s];return y("function"!=typeof b.then?p._promise.resolve({responseText:b}):b,function(e){return JSON.parse(e.responseText)})}var _=function n(i,y){p._checkAppIdData();var b=new Date;if(p._useCache&&!p._useRequestCache&&(s=e.url),p._useCache&&!p._useRequestCache&&t&&(s+="_body_"+y.body),v(!p._useRequestCache,u,s)){a("serving response from cache");var _=u[s];return p._promise.resolve({body:JSON.parse(_),responseText:_})}if(d>=p.hosts[e.hostType].length)return!g||f?(a("could not get any response"),p._promise.reject(new r.AlgoliaSearchError("Cannot connect to the AlgoliaSearch API. Send an email to support@algolia.com to report and resolve the issue. Application id was: "+p.applicationID,{debugData:m}))):(a("switching to fallback"),d=0,y.method=e.fallback.method,y.url=e.fallback.url,y.jsonBody=e.fallback.body,y.jsonBody&&(y.body=l(y.jsonBody)),o=p._computeRequestHeaders({additionalUA:c,headers:e.headers}),y.timeouts=p._getTimeoutsForRequest(e.hostType),p._setHostIndexByType(0,e.hostType),f=!0,n(p._request.fallback,y));var w=p._getHostByType(e.hostType),x=w+y.url,E={body:y.body,jsonBody:y.jsonBody,method:y.method,headers:o,timeouts:y.timeouts,debug:a,forceAuthHeaders:y.forceAuthHeaders};return a("method: %s, url: %s, headers: %j, timeouts: %d",E.method,x,E.headers,E.timeouts),i===p._request.fallback&&a("using fallback"),i.call(p,x,E).then(function(e){var n=e&&e.body&&e.body.message&&e.body.status||e.statusCode||e&&e.body&&200;a("received response: statusCode: %s, computed statusCode: %d, headers: %j",e.statusCode,n,e.headers);var i=2===Math.floor(n/100),c=new Date;if(m.push({currentHost:w,headers:h(o),content:t||null,contentLength:void 0!==t?t.length:null,method:y.method,timeouts:y.timeouts,url:y.url,startTime:b,endTime:c,duration:c-b,statusCode:n}),i)return p._useCache&&!p._useRequestCache&&u&&(u[s]=e.responseText),{responseText:e.responseText,body:e.body};if(4!==Math.floor(n/100))return d+=1,S();a("unrecoverable error");var l=new r.AlgoliaSearchError(e.body&&e.body.message,{debugData:m,statusCode:n});return p._promise.reject(l)},function(s){a("error: %s, stack: %s",s.message,s.stack);var c=new Date;return m.push({currentHost:w,headers:h(o),content:t||null,contentLength:void 0!==t?t.length:null,method:y.method,timeouts:y.timeouts,url:y.url,startTime:b,endTime:c,duration:c-b}),s instanceof r.AlgoliaSearchError||(s=new r.Unknown(s&&s.message,s)),d+=1,s instanceof r.Unknown||s instanceof r.UnparsableJSON||d>=p.hosts[e.hostType].length&&(f||!g)?(s.debugData=m,p._promise.reject(s)):s instanceof r.RequestTimeout?(a("retrying request with higher timeout"),p._incrementHostIndex(e.hostType),p._incrementTimeoutMultipler(),y.timeouts=p._getTimeoutsForRequest(e.hostType),n(i,y)):S()});function S(){return a("retrying request"),p._incrementHostIndex(e.hostType),n(i,y)}}(p._request,{url:e.url,method:e.method,body:t,jsonBody:e.body,timeouts:p._getTimeoutsForRequest(e.hostType),forceAuthHeaders:e.forceAuthHeaders});return p._useCache&&p._useRequestCache&&u&&(u[s]=_),y(_,function(e){return e.body})},c.prototype._getSearchParams=function(e,t){if(null==e)return t;for(var n in e)null!==n&&void 0!==e[n]&&e.hasOwnProperty(n)&&(t+=""===t?"":"&",t+=n+"="+encodeURIComponent("[object Array]"===Object.prototype.toString.call(e[n])?l(e[n]):e[n]));return t},c.prototype._computeRequestHeaders=function(e){var t=n("v61W"),r={"x-algolia-agent":e.additionalUA?this._ua+"; "+e.additionalUA:this._ua,"x-algolia-application-id":this.applicationID};return!1!==e.withApiKey&&(r["x-algolia-api-key"]=this.apiKey),this.userToken&&(r["x-algolia-usertoken"]=this.userToken),this.securityTags&&(r["x-algolia-tagfilters"]=this.securityTags),t(this.extraHeaders,function(e,t){r[t]=e}),e.headers&&t(e.headers,function(e,t){r[t]=e}),r},c.prototype.search=function(e,t,r){var i=n("49sm"),s=n("7Ule");if(!i(e))throw new Error("Usage: client.search(arrayOfQueries[, callback])");"function"==typeof t?(r=t,t={}):void 0===t&&(t={});var o=this,a={requests:s(e,function(e){var t="";return void 0!==e.query&&(t+="query="+encodeURIComponent(e.query)),{indexName:e.indexName,params:o._getSearchParams(e.params,t)}})},c=s(a.requests,function(e,t){return t+"="+encodeURIComponent("/1/indexes/"+encodeURIComponent(e.indexName)+"?"+e.params)}).join("&");return void 0!==t.strategy&&(a.strategy=t.strategy),this._jsonRequest({cache:this.cache,method:"POST",url:"/1/indexes/*/queries",body:a,hostType:"read",fallback:{method:"GET",url:"/1/indexes/*",body:{params:c}},callback:r})},c.prototype.searchForFacetValues=function(e){var t=n("49sm"),r=n("7Ule"),i="Usage: client.searchForFacetValues([{indexName, params: {facetName, facetQuery, ...params}}, ...queries])";if(!t(e))throw new Error(i);var s=this;return s._promise.all(r(e,function(e){if(!e||void 0===e.indexName||void 0===e.params.facetName||void 0===e.params.facetQuery)throw new Error(i);var t=n("sLmk"),r=n("PGxr"),o=e.indexName,a=e.params,c=a.facetName,u=r(t(a),function(e){return"facetName"===e}),l=s._getSearchParams(u,"");return s._jsonRequest({cache:s.cache,method:"POST",url:"/1/indexes/"+encodeURIComponent(o)+"/facets/"+encodeURIComponent(c)+"/query",hostType:"read",body:{params:l}})}))},c.prototype.setSecurityTags=function(e){if("[object Array]"===Object.prototype.toString.call(e)){for(var t=[],n=0;na?this._resetInitialAppIdData(e):e},c.prototype._resetInitialAppIdData=function(e){var t=e||{};return t.hostIndexes={read:0,write:0},t.timeoutMultiplier=1,t.shuffleResult=t.shuffleResult||function(e){var t,n,r=e.length;for(;0!==r;)n=Math.floor(Math.random()*r),t=e[r-=1],e[r]=e[n],e[n]=t;return e}([1,2,3]),this._setAppIdData(t)},c.prototype._cacheAppIdData=function(e){this._hostIndexes=e.hostIndexes,this._timeoutMultiplier=e.timeoutMultiplier,this._shuffleResult=e.shuffleResult},c.prototype._partialAppIdDataUpdate=function(e){var t=n("v61W"),r=this._getAppIdData();return t(e,function(e,t){r[t]=e}),this._setAppIdData(r)},c.prototype._getHostByType=function(e){return this.hosts[e][this._getHostIndexByType(e)]},c.prototype._getTimeoutMultiplier=function(){return this._timeoutMultiplier},c.prototype._getHostIndexByType=function(e){return this._hostIndexes[e]},c.prototype._setHostIndexByType=function(e,t){var r=n("sLmk")(this._hostIndexes);return r[t]=e,this._partialAppIdDataUpdate({hostIndexes:r}),e},c.prototype._incrementHostIndex=function(e){return this._setHostIndexByType((this._getHostIndexByType(e)+1)%this.hosts[e].length,e)},c.prototype._incrementTimeoutMultipler=function(){var e=Math.max(this._timeoutMultiplier+1,4);return this._partialAppIdDataUpdate({timeoutMultiplier:e})},c.prototype._getTimeoutsForRequest=function(e){return{connect:this._timeouts.connect*this._timeoutMultiplier,complete:this._timeouts[e]*this._timeoutMultiplier}}}).call(this,n("8oxB"))},"1KsK":function(e,t,n){"use strict";var r=Object.prototype.toString;e.exports=function(e){var t=r.call(e),n="[object Arguments]"===t;return n||(n="[object Array]"!==t&&null!==e&&"object"==typeof e&&"number"==typeof e.length&&e.length>=0&&"[object Function]"===r.call(e.callee)),n}},"1seS":function(e,t,n){"use strict";var r=Array.prototype.slice,i=n("1KsK"),s=Object.keys,o=s?function(e){return s(e)}:n("sYn3"),a=Object.keys;o.shim=function(){Object.keys?function(){var e=Object.keys(arguments);return e&&e.length===arguments.length}(1,2)||(Object.keys=function(e){return i(e)?a(r.call(e)):a(e)}):Object.keys=o;return Object.keys||o},e.exports=o},"1wyU":function(e,t,n){"use strict";var r=n("cUo3"),i=/\s+/;function s(e,t,n,r){var s;if(!n)return this;for(t=t.split(i),n=r?function(e,t){return e.bind?e.bind(t):function(){e.apply(t,[].slice.call(arguments,0))}}(n,r):n,this._callbacks=this._callbacks||{};s=t.shift();)this._callbacks[s]=this._callbacks[s]||{sync:[],async:[]},this._callbacks[s][e].push(n);return this}function o(e,t,n){return function(){for(var r,i=0,s=e.length;!r&&i=3&&n[1]>20&&((t=t||{}).additionalUA="autocomplete.js "+i),function(n,i){e.search(n,t,function(e,t){e?r.error(e.message):i(t.hits,t)})}}},"7kYT":function(e,t,n){"use strict";var r=Function.prototype.bind;e.exports=function(e){var t=function(){for(var t=arguments.length,n=Array(t),i=0;i=31||"undefined"!=typeof navigator&&navigator.userAgent&&navigator.userAgent.toLowerCase().match(/applewebkit\/(\d+)/)},t.storage="undefined"!=typeof chrome&&void 0!==chrome.storage?chrome.storage.local:function(){try{return window.localStorage}catch(e){}}(),t.colors=["lightseagreen","forestgreen","goldenrod","dodgerblue","darkorchid","crimson"],t.formatters.j=function(e){try{return JSON.stringify(e)}catch(e){return"[UnexpectedJSONParseError]: "+e.message}},t.enable(i())}).call(this,n("8oxB"))},"8Pgg":function(e,t){e.exports=function(e){var t={className:"variable",variants:[{begin:/\$[\w\d#@][\w\d_]*/},{begin:/\$\{(.*?)}/}]},n={className:"string",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE,t,{className:"variable",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]}]};return{aliases:["sh","zsh"],lexemes:/\b-?[a-z\._]+\b/,keywords:{keyword:"if then else elif fi for while in do done case esac function",literal:"true false",built_in:"break cd continue eval exec exit export getopts hash pwd readonly return shift test times trap umask unset alias bind builtin caller command declare echo enable help let local logout mapfile printf read readarray source type typeset ulimit unalias set shopt autoload bg bindkey bye cap chdir clone comparguments compcall compctl compdescribe compfiles compgroups compquote comptags comptry compvalues dirs disable disown echotc echoti emulate fc fg float functions getcap getln history integer jobs kill limit log noglob popd print pushd pushln rehash sched setcap setopt stat suspend ttyctl unfunction unhash unlimit unsetopt vared wait whence where which zcompile zformat zftp zle zmodload zparseopts zprof zpty zregexparse zsocket zstyle ztcp",_:"-ne -eq -lt -gt -f -d -e -s -l -a"},contains:[{className:"meta",begin:/^#![^\n]+sh\s*$/,relevance:10},{className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0,contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0},e.HASH_COMMENT_MODE,n,{className:"string",begin:/'/,end:/'/},t]}}},"8oxB":function(e,t){var n,r,i=e.exports={};function s(){throw new Error("setTimeout has not been defined")}function o(){throw new Error("clearTimeout has not been defined")}function a(e){if(n===setTimeout)return setTimeout(e,0);if((n===s||!n)&&setTimeout)return n=setTimeout,setTimeout(e,0);try{return n(e,0)}catch(t){try{return n.call(null,e,0)}catch(t){return n.call(this,e,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:s}catch(e){n=s}try{r="function"==typeof clearTimeout?clearTimeout:o}catch(e){r=o}}();var c,u=[],l=!1,h=-1;function p(){l&&c&&(l=!1,c.length?u=c.concat(u):h=-1,u.length&&d())}function d(){if(!l){var e=a(p);l=!0;for(var t=u.length;t;){for(c=u,u=[];++h1)for(var n=1;n'),this.$menu.append(this.$empty),this.$empty.hide()),this.datasets=r.map(e.datasets,function(t){return function(e,t,n){return new c.Dataset(r.mixin({$menu:e,cssClasses:n},t))}(o.$menu,t,e.cssClasses)}),r.each(this.datasets,function(e){var t=e.getRoot();t&&0===t.parent().length&&o.$menu.append(t),e.onSync("rendered",o._onRendered,o)}),e.templates&&e.templates.footer&&(this.templates.footer=r.templatify(e.templates.footer),this.$menu.append(this.templates.footer()));var l=this;i.element(window).resize(function(){l._redraw()})}r.mixin(c.prototype,s,{_onSuggestionClick:function(e){this.trigger("suggestionClicked",i.element(e.currentTarget))},_onSuggestionMouseEnter:function(e){var t=i.element(e.currentTarget);if(!t.hasClass(r.className(this.cssClasses.prefix,this.cssClasses.cursor,!0))){this._removeCursor();var n=this;setTimeout(function(){n._setCursor(t,!1)},0)}},_onSuggestionMouseLeave:function(e){if(e.relatedTarget&&i.element(e.relatedTarget).closest("."+r.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).length>0)return;this._removeCursor(),this.trigger("cursorRemoved")},_onRendered:function(e,t){if(this.isEmpty=r.every(this.datasets,function(e){return e.isEmpty()}),this.isEmpty)if(t.length>=this.minLength&&this.trigger("empty"),this.$empty)if(t.length=this.minLength?this._show():this._hide());this.trigger("datasetRendered")},_hide:function(){this.$container.hide()},_show:function(){this.$container.css("display","block"),this._redraw(),this.trigger("shown")},_redraw:function(){this.isOpen&&this.appendTo&&this.trigger("redrawn")},_getSuggestions:function(){return this.$menu.find(r.className(this.cssClasses.prefix,this.cssClasses.suggestion))},_getCursor:function(){return this.$menu.find(r.className(this.cssClasses.prefix,this.cssClasses.cursor)).first()},_setCursor:function(e,t){e.first().addClass(r.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).attr("aria-selected","true"),this.trigger("cursorMoved",t)},_removeCursor:function(){this._getCursor().removeClass(r.className(this.cssClasses.prefix,this.cssClasses.cursor,!0)).removeAttr("aria-selected")},_moveCursor:function(e){var t,n,r,i;this.isOpen&&(n=this._getCursor(),t=this._getSuggestions(),this._removeCursor(),-1!==(r=((r=t.index(n)+e)+1)%(t.length+1)-1)?(r<-1&&(r=t.length-1),this._setCursor(i=t.eq(r),!0),this._ensureVisible(i)):this.trigger("cursorRemoved"))},_ensureVisible:function(e){var t,n,r,i;n=(t=e.position().top)+e.height()+parseInt(e.css("margin-top"),10)+parseInt(e.css("margin-bottom"),10),r=this.$menu.scrollTop(),i=this.$menu.height()+parseInt(this.$menu.css("padding-top"),10)+parseInt(this.$menu.css("padding-bottom"),10),t<0?this.$menu.scrollTop(r+t):i",subLanguage:"xml",relevance:0},{className:"bullet",begin:"^([*+-]|(\\d+\\.))\\s+"},{className:"strong",begin:"[*_]{2}.+?[*_]{2}"},{className:"emphasis",variants:[{begin:"\\*.+?\\*"},{begin:"_.+?_",relevance:0}]},{className:"quote",begin:"^>\\s+",end:"$"},{className:"code",variants:[{begin:"^```w*s*$",end:"^```s*$"},{begin:"`.+?`"},{begin:"^( {4}|\t)",end:"$",relevance:0}]},{begin:"^[-\\*]{3,}",end:"$"},{begin:"\\[.+?\\][\\(\\[].*?[\\)\\]]",returnBegin:!0,contains:[{className:"string",begin:"\\[",end:"\\]",excludeBegin:!0,returnEnd:!0,relevance:0},{className:"link",begin:"\\]\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0},{className:"symbol",begin:"\\]\\[",end:"\\]",excludeBegin:!0,excludeEnd:!0}],relevance:10},{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}}},BSPe:function(e,t,n){"use strict";n.r(t);var r=n("pw5m"),i=n.n(r);window.docsearch=n("UjO/"),i.a.registerLanguage("bash",n("8Pgg")),i.a.registerLanguage("css",n("7oys")),i.a.registerLanguage("html",n("jctj")),i.a.registerLanguage("javascript",n("TdF3")),i.a.registerLanguage("json",n("WtIr")),i.a.registerLanguage("markdown",n("BLBw")),i.a.registerLanguage("php",n("KQfT")),i.a.registerLanguage("scss",n("YROV")),i.a.registerLanguage("yaml",n("Lns6")),document.querySelectorAll("pre code").forEach(function(e){i.a.highlightBlock(e)})},BWnO:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r,i="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},s=n("imfo"),o=(r=s)&&r.__esModule?r:{default:r};var a={mergeKeyWithParent:function(e,t){if(void 0===e[t])return e;if("object"!==i(e[t]))return e;var n=o.default.extend({},e,e[t]);return delete n[t],n},groupBy:function(e,t){var n={};return o.default.each(e,function(e,r){if(void 0===r[t])throw new Error("[groupBy]: Object has no key "+t);var i=r[t];"string"==typeof i&&(i=i.toLowerCase()),Object.prototype.hasOwnProperty.call(n,i)||(n[i]=[]),n[i].push(r)}),n},values:function(e){return Object.keys(e).map(function(t){return e[t]})},flatten:function(e){var t=[];return e.forEach(function(e){Array.isArray(e)?e.forEach(function(e){t.push(e)}):t.push(e)}),t},flattenAndFlagFirst:function(e,t){var n=this.values(e).map(function(e){return e.map(function(e,n){return e[t]=0===n,e})});return this.flatten(n)},compact:function(e){var t=[];return e.forEach(function(e){e&&t.push(e)}),t},getHighlightedValue:function(e,t){return e._highlightResult&&e._highlightResult.hierarchy_camel&&e._highlightResult.hierarchy_camel[t]&&e._highlightResult.hierarchy_camel[t].matchLevel&&"none"!==e._highlightResult.hierarchy_camel[t].matchLevel&&e._highlightResult.hierarchy_camel[t].value?e._highlightResult.hierarchy_camel[t].value:e._highlightResult&&e._highlightResult&&e._highlightResult[t]&&e._highlightResult[t].value?e._highlightResult[t].value:e[t]},getSnippetedValue:function(e,t){if(!e._snippetResult||!e._snippetResult[t]||!e._snippetResult[t].value)return e[t];var n=e._snippetResult[t].value;return n[0]!==n[0].toUpperCase()&&(n="…"+n),-1===[".","!","?"].indexOf(n[n.length-1])&&(n+="…"),n},deepClone:function(e){return JSON.parse(JSON.stringify(e))}};t.default=a},BoXp:function(e,t,n){"use strict";e.exports={element:null}},BqH8:function(e,t,n){"use strict";(function(e){var n=e.MutationObserver||e.WebKitMutationObserver;t.test=function(){return n},t.install=function(t){var r=0,i=new n(t),s=e.document.createTextNode("");return i.observe(s,{characterData:!0}),function(){s.data=r=++r%2}}}).call(this,n("yLpj"))},DiRl:function(e,t,n){"use strict";e.exports="3.33.0"},E2g8:function(e,t,n){(function(t,n){var r;r=function(){"use strict";function e(e){return"function"==typeof e}var r=Array.isArray?Array.isArray:function(e){return"[object Array]"===Object.prototype.toString.call(e)},i=0,s=void 0,o=void 0,a=function(e,t){f[i]=e,f[i+1]=t,2===(i+=2)&&(o?o(g):_())},c="undefined"!=typeof window?window:void 0,u=c||{},l=u.MutationObserver||u.WebKitMutationObserver,h="undefined"==typeof self&&void 0!==t&&"[object process]"==={}.toString.call(t),p="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function d(){var e=setTimeout;return function(){return e(g,1)}}var f=new Array(1e3);function g(){for(var e=0;e0)return function(e){if((e=String(e)).length>100)return;var t=/^((?:\d+)?\.?\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|years?|yrs?|y)?$/i.exec(e);if(!t)return;var a=parseFloat(t[1]);switch((t[2]||"ms").toLowerCase()){case"years":case"year":case"yrs":case"yr":case"y":return a*o;case"days":case"day":case"d":return a*s;case"hours":case"hour":case"hrs":case"hr":case"h":return a*i;case"minutes":case"minute":case"mins":case"min":case"m":return a*r;case"seconds":case"second":case"secs":case"sec":case"s":return a*n;case"milliseconds":case"millisecond":case"msecs":case"msec":case"ms":return a;default:return}}(e);if("number"===u&&!1===isNaN(e))return t.long?a(c=e,s,"day")||a(c,i,"hour")||a(c,r,"minute")||a(c,n,"second")||c+" ms":function(e){if(e>=s)return Math.round(e/s)+"d";if(e>=i)return Math.round(e/i)+"h";if(e>=r)return Math.round(e/r)+"m";if(e>=n)return Math.round(e/n)+"s";return e+"ms"}(e);throw new Error("val is not a non-empty string or a valid number. val="+JSON.stringify(e))}},GlCl:function(e,t,n){"use strict";var r;r={9:"tab",27:"esc",37:"left",39:"right",13:"enter",38:"up",40:"down"};var i=n("jgMb"),s=n("BoXp"),o=n("1wyU");function a(e){var t,n,o,a,c,u=this;(e=e||{}).input||i.error("input is missing"),t=i.bind(this._onBlur,this),n=i.bind(this._onFocus,this),o=i.bind(this._onKeydown,this),a=i.bind(this._onInput,this),this.$hint=s.element(e.hint),this.$input=s.element(e.input).on("blur.aa",t).on("focus.aa",n).on("keydown.aa",o),0===this.$hint.length&&(this.setHint=this.getHint=this.clearHint=this.clearHintIfInvalid=i.noop),i.isMsie()?this.$input.on("keydown.aa keypress.aa cut.aa paste.aa",function(e){r[e.which||e.keyCode]||i.defer(i.bind(u._onInput,u,e))}):this.$input.on("input.aa",a),this.query=this.$input.val(),this.$overflowHelper=(c=this.$input,s.element('').css({position:"absolute",visibility:"hidden",whiteSpace:"pre",fontFamily:c.css("font-family"),fontSize:c.css("font-size"),fontStyle:c.css("font-style"),fontVariant:c.css("font-variant"),fontWeight:c.css("font-weight"),wordSpacing:c.css("word-spacing"),letterSpacing:c.css("letter-spacing"),textIndent:c.css("text-indent"),textRendering:c.css("text-rendering"),textTransform:c.css("text-transform")}).insertAfter(c))}function c(e){return e.altKey||e.ctrlKey||e.metaKey||e.shiftKey}a.normalizeQuery=function(e){return(e||"").replace(/^\s*/g,"").replace(/\s{2,}/g," ")},i.mixin(a.prototype,o,{_onBlur:function(){this.resetInputValue(),this.$input.removeAttr("aria-activedescendant"),this.trigger("blurred")},_onFocus:function(){this.trigger("focused")},_onKeydown:function(e){var t=r[e.which||e.keyCode];this._managePreventDefault(t,e),t&&this._shouldTrigger(t,e)&&this.trigger(t+"Keyed",e)},_onInput:function(){this._checkInputValue()},_managePreventDefault:function(e,t){var n,r,i;switch(e){case"tab":r=this.getHint(),i=this.getInputValue(),n=r&&r!==i&&!c(t);break;case"up":case"down":n=!c(t);break;default:n=!1}n&&t.preventDefault()},_shouldTrigger:function(e,t){var n;switch(e){case"tab":n=!c(t);break;default:n=!0}return n},_checkInputValue:function(){var e,t,n,r,i;e=this.getInputValue(),r=e,i=this.query,n=!(!(t=a.normalizeQuery(r)===a.normalizeQuery(i))||!this.query)&&this.query.length!==e.length,this.query=e,t?n&&this.trigger("whitespaceChanged",this.query):this.trigger("queryChanged",this.query)},focus:function(){this.$input.focus()},blur:function(){this.$input.blur()},getQuery:function(){return this.query},setQuery:function(e){this.query=e},getInputValue:function(){return this.$input.val()},setInputValue:function(e,t){void 0===e&&(e=this.query),this.$input.val(e),t?this.clearHint():this._checkInputValue()},expand:function(){this.$input.attr("aria-expanded","true")},collapse:function(){this.$input.attr("aria-expanded","false")},setActiveDescendant:function(e){this.$input.attr("aria-activedescendant",e)},removeActiveDescendant:function(){this.$input.removeAttr("aria-activedescendant")},resetInputValue:function(){this.setInputValue(this.query,!0)},getHint:function(){return this.$hint.val()},setHint:function(e){this.$hint.val(e)},clearHint:function(){this.setHint("")},clearHintIfInvalid:function(){var e,t,n;n=(e=this.getInputValue())!==(t=this.getHint())&&0===t.indexOf(e),""!==e&&n&&!this.hasOverflow()||this.clearHint()},getLanguageDirection:function(){return(this.$input.css("direction")||"ltr").toLowerCase()},hasOverflow:function(){var e=this.$input.width()-2;return this.$overflowHelper.text(this.getInputValue()),this.$overflowHelper.width()>=e},isCursorAtEnd:function(){var e,t,n;return e=this.$input.val().length,t=this.$input[0].selectionStart,i.isNumber(t)?t===e:!document.selection||((n=document.selection.createRange()).moveStart("character",-e),e===n.text.length)},destroy:function(){this.$hint.off(".aa"),this.$input.off(".aa"),this.$hint=this.$input=this.$overflowHelper=null}}),e.exports=a},JRE2:function(e,t){e.exports=function(e,t){var n=e.toLowerCase().replace(/[\.\(\)]/g,"");return"algoliasearch: `"+e+"` was replaced by `"+t+"`. Please see https://github.com/algolia/algoliasearch-client-javascript/wiki/Deprecated#"+n}},KQfT:function(e,t){e.exports=function(e){var t={begin:"\\$+[a-zA-Z_-ÿ][a-zA-Z0-9_-ÿ]*"},n={className:"meta",begin:/<\?(php)?|\?>/},r={className:"string",contains:[e.BACKSLASH_ESCAPE,n],variants:[{begin:'b"',end:'"'},{begin:"b'",end:"'"},e.inherit(e.APOS_STRING_MODE,{illegal:null}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null})]},i={variants:[e.BINARY_NUMBER_MODE,e.C_NUMBER_MODE]};return{aliases:["php","php3","php4","php5","php6","php7"],case_insensitive:!0,keywords:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",contains:[e.HASH_COMMENT_MODE,e.COMMENT("//","$",{contains:[n]}),e.COMMENT("/\\*","\\*/",{contains:[{className:"doctag",begin:"@[A-Za-z]+"}]}),e.COMMENT("__halt_compiler.+?;",!1,{endsWithParent:!0,keywords:"__halt_compiler",lexemes:e.UNDERSCORE_IDENT_RE}),{className:"string",begin:/<<<['"]?\w+['"]?$/,end:/^\w+;?$/,contains:[e.BACKSLASH_ESCAPE,{className:"subst",variants:[{begin:/\$\w+/},{begin:/\{\$/,end:/\}/}]}]},n,{className:"keyword",begin:/\$this\b/},t,{begin:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{className:"function",beginKeywords:"function",end:/[;{]/,excludeEnd:!0,illegal:"\\$|\\[|%",contains:[e.UNDERSCORE_TITLE_MODE,{className:"params",begin:"\\(",end:"\\)",contains:["self",t,e.C_BLOCK_COMMENT_MODE,r,i]}]},{className:"class",beginKeywords:"class interface",end:"{",excludeEnd:!0,illegal:/[:\(\$"]/,contains:[{beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"namespace",end:";",illegal:/[\.']/,contains:[e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"use",end:";",contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"=>"},r,i]}}},Lns6:function(e,t){e.exports=function(e){var t="[a-zA-Z_][\\w\\-]*",n={className:"attr",variants:[{begin:"^[ \\-]*"+t+":"},{begin:'^[ \\-]*"'+t+'":'},{begin:"^[ \\-]*'"+t+"':"}]},r={className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable",variants:[{begin:"{{",end:"}}"},{begin:"%{",end:"}"}]}]};return{case_insensitive:!0,aliases:["yml","YAML","yaml"],contains:[n,{className:"meta",begin:"^---s*$",relevance:10},{className:"string",begin:"[\\|>] *$",returnEnd:!0,contains:r.contains,end:n.variants[0].begin},{begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0,relevance:0},{className:"type",begin:"!"+e.UNDERSCORE_IDENT_RE},{className:"type",begin:"!!"+e.UNDERSCORE_IDENT_RE},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta",begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"^ *-",relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:"true false yes no null",keywords:{literal:"true false yes no null"}},e.C_NUMBER_MODE,r]}}},MYMM:function(e,t,n){var r=n("v61W");e.exports=function e(t){var n=Array.prototype.slice.call(arguments);return r(n,function(n){for(var r in n)n.hasOwnProperty(r)&&("object"==typeof t[r]&&"object"==typeof n[r]?t[r]=e({},t[r],n[r]):void 0!==n[r]&&(t[r]=n[r]))}),t}},P5ON:function(e,t,n){"use strict";var r=n("vgmO"),i=r.Promise||n("E2g8").Promise;e.exports=function(e,t){var s=n("P7XM"),o=n("Z4lL"),a=n("bQm7"),c=n("+RWU"),u=n("5b/b");function l(e,t,r){return(r=n("sLmk")(r||{}))._ua=r._ua||l.ua,new p(e,t,r)}t=t||"",l.version=n("DiRl"),l.ua="Algolia for JavaScript ("+l.version+"); "+t,l.initPlaces=u(l),r.__algolia={debug:n("8KqL"),algoliasearch:l};var h={hasXMLHttpRequest:"XMLHttpRequest"in r,hasXDomainRequest:"XDomainRequest"in r};function p(){e.apply(this,arguments)}return h.hasXMLHttpRequest&&(h.cors="withCredentials"in new XMLHttpRequest),s(p,e),p.prototype._request=function(e,t){return new i(function(n,r){if(h.cors||h.hasXDomainRequest){e=a(e,t.headers);var i,s,c=t.body,u=h.cors?new XMLHttpRequest:new XDomainRequest,l=!1;i=setTimeout(p,t.timeouts.connect),u.onprogress=function(){l||d()},"onreadystatechange"in u&&(u.onreadystatechange=function(){!l&&u.readyState>1&&d()}),u.onload=function(){if(s)return;var e;clearTimeout(i);try{e={body:JSON.parse(u.responseText),responseText:u.responseText,statusCode:u.status,headers:u.getAllResponseHeaders&&u.getAllResponseHeaders()||{}}}catch(t){e=new o.UnparsableJSON({more:u.responseText})}e instanceof o.UnparsableJSON?r(e):n(e)},u.onerror=function(e){if(s)return;clearTimeout(i),r(new o.Network({more:e}))},u instanceof XMLHttpRequest?(u.open(t.method,e,!0),t.forceAuthHeaders&&(u.setRequestHeader("x-algolia-application-id",t.headers["x-algolia-application-id"]),u.setRequestHeader("x-algolia-api-key",t.headers["x-algolia-api-key"]))):u.open(t.method,e),h.cors&&(c&&("POST"===t.method?u.setRequestHeader("content-type","application/x-www-form-urlencoded"):u.setRequestHeader("content-type","application/json")),u.setRequestHeader("accept","application/json")),c?u.send(c):u.send()}else r(new o.Network("CORS not supported"));function p(){s=!0,u.abort(),r(new o.RequestTimeout)}function d(){l=!0,clearTimeout(i),i=setTimeout(p,t.timeouts.complete)}})},p.prototype._request.fallback=function(e,t){return e=a(e,t.headers),new i(function(n,r){c(e,t,function(e,t){e?r(e):n(t)})})},p.prototype._promise={reject:function(e){return i.reject(e)},resolve:function(e){return i.resolve(e)},delay:function(e){return new i(function(t){setTimeout(t,e)})},all:function(e){return i.all(e)}},l}},P7XM:function(e,t){"function"==typeof Object.create?e.exports=function(e,t){e.super_=t,e.prototype=Object.create(t.prototype,{constructor:{value:e,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(e,t){e.super_=t;var n=function(){};n.prototype=t.prototype,e.prototype=new n,e.prototype.constructor=e}},PGxr:function(e,t,n){e.exports=function(e,t){var r=n("1seS"),i=n("v61W"),s={};return i(r(e),function(n){!0!==t(n)&&(s[n]=e[n])}),s}},PKsF:function(e,t,n){!function(e){var t=/\S/,n=/\"/g,r=/\n/g,i=/\r/g,s=/\\/g,o=/\u2028/,a=/\u2029/;function c(e){"}"===e.n.substr(e.n.length-1)&&(e.n=e.n.substring(0,e.n.length-1))}function u(e){return e.trim?e.trim():e.replace(/^\s*|\s*$/g,"")}function l(e,t,n){if(t.charAt(n)!=e.charAt(0))return!1;for(var r=1,i=e.length;r":7,"=":8,_v:9,"{":10,"&":11,_t:12},e.scan=function(n,r){var i=n.length,s=0,o=null,a=null,h="",p=[],d=!1,f=0,g=0,m="{{",v="}}";function y(){h.length>0&&(p.push({tag:"_t",text:new String(h)}),h="")}function b(n,r){if(y(),n&&function(){for(var n=!0,r=g;r"==i.tag&&(i.indent=p[s].text.toString()),p.splice(s,1));else r||p.push({tag:"\n"});d=!1,g=p.length}function _(e,t){var n="="+v,r=e.indexOf(n,t),i=u(e.substring(e.indexOf("=",t)+1,r)).split(" ");return m=i[0],v=i[i.length-1],r+n.length-1}for(r&&(r=r.split(" "),m=r[0],v=r[1]),f=0;f":y,"<":function(t,n){var r={partials:{},code:"",subs:{},inPartial:!0};e.walk(t.nodes,r);var i=n.partials[y(t,n)];i.subs=r.subs,i.partials=r.partials},$:function(t,n){var r={subs:{},code:"",partials:n.partials,prefix:t.n};e.walk(t.nodes,r),n.subs[t.n]=r.code,n.inPartial||(n.code+='t.sub("'+m(t.n)+'",c,p,i);')},"\n":function(e,t){t.code+=_('"\\n"'+(e.last?"":" + i"))},_v:function(e,t){t.code+="t.b(t.v(t."+v(e.n)+'("'+m(e.n)+'",c,p,0)));'},_t:function(e,t){t.code+=_('"'+m(e.text)+'"')},"{":b,"&":b},e.walk=function(t,n){for(var r,i=0,s=t.length;i0;){if(u=n.shift(),o&&"<"==o.tag&&!(u.tag in h))throw new Error("Illegal content in < super tag.");if(e.tags[u.tag]<=e.tags.$||p(u,s))i.push(u),u.nodes=t(n,u.tag,i,s);else{if("/"==u.tag){if(0===i.length)throw new Error("Closing tag without opener: /"+u.n);if(c=i.pop(),u.n!=c.n&&!d(u.n,c.n,s))throw new Error("Nesting error: "+c.n+" vs. "+u.n);return c.end=u.i,a}"\n"==u.tag&&(u.last=0==n.length||"\n"==n[0].tag)}a.push(u)}if(i.length>0)throw new Error("missing closing tag: "+i.pop().n);return a}(t,0,[],(r=r||{}).sectionTags||[])},e.cache={},e.cacheKey=function(e,t){return[e,!!t.asString,!!t.disableLambda,t.delimiters,!!t.modelGet].join("||")},e.compile=function(t,n){n=n||{};var r=e.cacheKey(t,n),i=this.cache[r];if(i){var s=i.partials;for(var o in s)delete s[o].instance;return i}return i=this.generate(this.parse(this.scan(t,n.delimiters),t,n),t,n),this.cache[r]=i}}(t)},Ruv9:function(e,t,n){var r=n("PKsF");r.Template=n("cK6b").Template,r.template=r.Template,e.exports=r},TdF3:function(e,t){e.exports=function(e){var t="[A-Za-z$_][0-9A-Za-z$_]*",n={keyword:"in of if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const export super debugger as async await static import from as",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document Symbol Set Map WeakSet WeakMap Proxy Reflect Promise"},r={className:"number",variants:[{begin:"\\b(0[bB][01]+)"},{begin:"\\b(0[oO][0-7]+)"},{begin:e.C_NUMBER_RE}],relevance:0},i={className:"subst",begin:"\\$\\{",end:"\\}",keywords:n,contains:[]},s={className:"string",begin:"`",end:"`",contains:[e.BACKSLASH_ESCAPE,i]};i.contains=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,s,r,e.REGEXP_MODE];var o=i.contains.concat([e.C_BLOCK_COMMENT_MODE,e.C_LINE_COMMENT_MODE]);return{aliases:["js","jsx"],keywords:n,contains:[{className:"meta",relevance:10,begin:/^\s*['"]use (strict|asm)['"]/},{className:"meta",begin:/^#!/,end:/$/},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,r,{begin:/[{,]\s*/,relevance:0,contains:[{begin:t+"\\s*:",returnBegin:!0,relevance:0,contains:[{className:"attr",begin:t,relevance:0}]}]},{begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*",keywords:"return throw case",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,e.REGEXP_MODE,{className:"function",begin:"(\\(.*?\\)|"+t+")\\s*=>",returnBegin:!0,end:"\\s*=>",contains:[{className:"params",variants:[{begin:t},{begin:/\(\s*\)/},{begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,contains:o}]}]},{begin://,subLanguage:"xml",contains:[{begin:/<\w+\s*\/>/,skip:!0},{begin:/<\w+/,end:/(\/\w+|\w+\/)>/,skip:!0,contains:[{begin:/<\w+\s*\/>/,skip:!0},"self"]}]}],relevance:0},{className:"function",beginKeywords:"function",end:/\{/,excludeEnd:!0,contains:[e.inherit(e.TITLE_MODE,{begin:t}),{className:"params",begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,contains:o}],illegal:/\[|%/},{begin:/\$[(.]/},e.METHOD_GUARD,{className:"class",beginKeywords:"class",end:/[{;=]/,excludeEnd:!0,illegal:/[:"\[\]]/,contains:[{beginKeywords:"extends"},e.UNDERSCORE_TITLE_MODE]},{beginKeywords:"constructor",end:/\{/,excludeEnd:!0}],illegal:/#(?!!)/}}},"UjO/":function(e,t,n){"use strict";var r,i=n("YQXE"),s=(r=i)&&r.__esModule?r:{default:r};e.exports=s.default},WtIr:function(e,t){e.exports=function(e){var t={literal:"true false null"},n=[e.QUOTE_STRING_MODE,e.C_NUMBER_MODE],r={end:",",endsWithParent:!0,excludeEnd:!0,contains:n,keywords:t},i={begin:"{",end:"}",contains:[{className:"attr",begin:/"/,end:/"/,contains:[e.BACKSLASH_ESCAPE],illegal:"\\n"},e.inherit(r,{begin:/:/})],illegal:"\\S"},s={begin:"\\[",end:"\\]",contains:[e.inherit(r)],illegal:"\\S"};return n.splice(n.length,0,i,s),{contains:n,keywords:t,illegal:"\\S"}}},X9Cu:function(e,t,n){"use strict";e.exports=function(e){var t=e.match(/Algolia for vanilla JavaScript (\d+\.)(\d+\.)(\d+)/);if(t)return[t[1],t[2],t[3]]}},YQXE:function(e,t,n){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var r=o(n("7kYT")),i=o(n("cq35")),s=o(n("+Ewk"));function o(e){return e&&e.__esModule?e:{default:e}}var a=(0,r.default)(i.default);a.version=s.default,t.default=a},YROV:function(e,t){e.exports=function(e){var t={className:"variable",begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b"},n={className:"number",begin:"#[0-9A-Fa-f]+"};e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,e.C_BLOCK_COMMENT_MODE;return{case_insensitive:!0,illegal:"[=/|']",contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"selector-id",begin:"\\#[A-Za-z0-9_-]+",relevance:0},{className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0},{className:"selector-attr",begin:"\\[",end:"\\]",illegal:"$"},{className:"selector-tag",begin:"\\b(a|abbr|acronym|address|area|article|aside|audio|b|base|big|blockquote|body|br|button|canvas|caption|cite|code|col|colgroup|command|datalist|dd|del|details|dfn|div|dl|dt|em|embed|fieldset|figcaption|figure|footer|form|frame|frameset|(h[1-6])|head|header|hgroup|hr|html|i|iframe|img|input|ins|kbd|keygen|label|legend|li|link|map|mark|meta|meter|nav|noframes|noscript|object|ol|optgroup|option|output|p|param|pre|progress|q|rp|rt|ruby|samp|script|section|select|small|span|strike|strong|style|sub|sup|table|tbody|td|textarea|tfoot|th|thead|time|title|tr|tt|ul|var|video)\\b",relevance:0},{begin:":(visited|valid|root|right|required|read-write|read-only|out-range|optional|only-of-type|only-child|nth-of-type|nth-last-of-type|nth-last-child|nth-child|not|link|left|last-of-type|last-child|lang|invalid|indeterminate|in-range|hover|focus|first-of-type|first-line|first-letter|first-child|first|enabled|empty|disabled|default|checked|before|after|active)"},{begin:"::(after|before|choices|first-letter|first-line|repeat-index|repeat-item|selection|value)"},t,{className:"attribute",begin:"\\b(z-index|word-wrap|word-spacing|word-break|width|widows|white-space|visibility|vertical-align|unicode-bidi|transition-timing-function|transition-property|transition-duration|transition-delay|transition|transform-style|transform-origin|transform|top|text-underline-position|text-transform|text-shadow|text-rendering|text-overflow|text-indent|text-decoration-style|text-decoration-line|text-decoration-color|text-decoration|text-align-last|text-align|tab-size|table-layout|right|resize|quotes|position|pointer-events|perspective-origin|perspective|page-break-inside|page-break-before|page-break-after|padding-top|padding-right|padding-left|padding-bottom|padding|overflow-y|overflow-x|overflow-wrap|overflow|outline-width|outline-style|outline-offset|outline-color|outline|orphans|order|opacity|object-position|object-fit|normal|none|nav-up|nav-right|nav-left|nav-index|nav-down|min-width|min-height|max-width|max-height|mask|marks|margin-top|margin-right|margin-left|margin-bottom|margin|list-style-type|list-style-position|list-style-image|list-style|line-height|letter-spacing|left|justify-content|initial|inherit|ime-mode|image-orientation|image-resolution|image-rendering|icon|hyphens|height|font-weight|font-variant-ligatures|font-variant|font-style|font-stretch|font-size-adjust|font-size|font-language-override|font-kerning|font-feature-settings|font-family|font|float|flex-wrap|flex-shrink|flex-grow|flex-flow|flex-direction|flex-basis|flex|filter|empty-cells|display|direction|cursor|counter-reset|counter-increment|content|column-width|column-span|column-rule-width|column-rule-style|column-rule-color|column-rule|column-gap|column-fill|column-count|columns|color|clip-path|clip|clear|caption-side|break-inside|break-before|break-after|box-sizing|box-shadow|box-decoration-break|bottom|border-width|border-top-width|border-top-style|border-top-right-radius|border-top-left-radius|border-top-color|border-top|border-style|border-spacing|border-right-width|border-right-style|border-right-color|border-right|border-radius|border-left-width|border-left-style|border-left-color|border-left|border-image-width|border-image-source|border-image-slice|border-image-repeat|border-image-outset|border-image|border-color|border-collapse|border-bottom-width|border-bottom-style|border-bottom-right-radius|border-bottom-left-radius|border-bottom-color|border-bottom|border|background-size|background-repeat|background-position|background-origin|background-image|background-color|background-clip|background-attachment|background-blend-mode|background|backface-visibility|auto|animation-timing-function|animation-play-state|animation-name|animation-iteration-count|animation-fill-mode|animation-duration|animation-direction|animation-delay|animation|align-self|align-items|align-content)\\b",illegal:"[^\\s]"},{begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b"},{begin:":",end:";",contains:[t,n,e.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,{className:"meta",begin:"!important"}]},{begin:"@",end:"[{;]",keywords:"mixin include extend for if else each while charset import debug media page content font-face namespace warn",contains:[t,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n,e.CSS_NUMBER_MODE,{begin:"\\s[A-Za-z0-9_.-]+",relevance:0}]}]}}},Z4lL:function(e,t,n){"use strict";var r=n("P7XM");function i(e,t){var r=n("v61W"),i=this;"function"==typeof Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):i.stack=(new Error).stack||"Cannot get a stacktrace, browser is too old",this.name="AlgoliaSearchError",this.message=e||"Unknown error",t&&r(t,function(e,t){i[t]=e})}function s(e,t){function n(){var n=Array.prototype.slice.call(arguments,0);"string"!=typeof n[0]&&n.unshift(t),i.apply(this,n),this.name="AlgoliaSearch"+e+"Error"}return r(n,i),n}r(i,Error),e.exports={AlgoliaSearchError:i,UnparsableJSON:s("UnparsableJSON","Could not parse the incoming response as JSON, see err.more for details"),RequestTimeout:s("RequestTimeout","Request timed out before getting a response"),Network:s("Network","Network issue, see err.more for details"),JSONPScriptFail:s("JSONPScriptFail","