From 0bf92f0ab530230cb7d8ac6371fd67c536f8c73e Mon Sep 17 00:00:00 2001 From: aerosol Date: Mon, 8 Jan 2024 16:55:43 +0000 Subject: [PATCH] deploy: c87b165aefb1f45572fae39d3383896e370c82d8 --- .build | 5 +- 404.html | 2 +- Mix.Tasks.CancelSubscription.html | 2 +- Mix.Tasks.CleanClickhouse.html | 2 +- Mix.Tasks.CreateFreeSubscription.html | 2 +- Mix.Tasks.DownloadCountryDatabase.html | 2 +- Mix.Tasks.GenerateReferrerFavicons.html | 2 +- Mix.Tasks.PullSandboxSubscription.html | 2 +- Mix.Tasks.SendPageview.html | 2 +- ObanErrorReporter.html | 2 +- Plausible.AsyncInsertRepo.html | 18 +- Plausible.Auth.ApiKey.html | 2 +- Plausible.Auth.ApiKeyAdmin.html | 2 +- Plausible.Auth.EmailActivationCode.html | 2 +- Plausible.Auth.EmailVerification.html | 2 +- Plausible.Auth.GracePeriod.html | 2 +- Plausible.Auth.Invitation.html | 2 +- Plausible.Auth.Password.html | 2 +- Plausible.Auth.TOTP.EncryptedBinary.html | 2 +- Plausible.Auth.TOTP.RecoveryCode.html | 2 +- Plausible.Auth.TOTP.Vault.html | 2 +- Plausible.Auth.TOTP.html | 2 +- Plausible.Auth.Token.html | 2 +- Plausible.Auth.User.html | 2 +- Plausible.Auth.UserAdmin.html | 2 +- Plausible.Auth.html | 2 +- Plausible.Billing.Ecto.Feature.html | 2 +- Plausible.Billing.Ecto.FeatureList.html | 2 +- Plausible.Billing.Ecto.Limit.html | 2 +- Plausible.Billing.EnterprisePlan.html | 2 +- Plausible.Billing.EnterprisePlanAdmin.html | 2 +- Plausible.Billing.Feature.html | 2 +- Plausible.Billing.PaddleApi.html | 2 +- Plausible.Billing.Plans.html | 2 +- Plausible.Billing.Quota.html | 14 +- Plausible.Billing.SiteLocker.html | 2 +- Plausible.Billing.Subscription.Status.html | 2 +- Plausible.Billing.html | 2 +- Plausible.ChangesetHelpers.html | 2 +- Plausible.Cldr.AcceptLanguage.html | 250 +++++++++--------- Plausible.Cldr.Currency.html | 126 ++++----- Plausible.Cldr.Locale.html | 50 ++-- Plausible.Cldr.Number.Cardinal.html | 20 +- Plausible.Cldr.Number.Format.html | 50 ++-- Plausible.Cldr.Number.Formatter.Decimal.html | 2 +- Plausible.Cldr.Number.Ordinal.html | 20 +- Plausible.Cldr.Number.PluralRule.Range.html | 2 +- Plausible.Cldr.Number.Symbol.html | 16 +- Plausible.Cldr.Number.System.html | 56 ++-- Plausible.Cldr.Number.Transliterate.html | 22 +- Plausible.Cldr.Number.html | 178 ++++++------- Plausible.Cldr.Rbnf.NumberSystem.html | 14 +- Plausible.Cldr.Rbnf.Ordinal.html | 18 +- Plausible.Cldr.Rbnf.Spellout.html | 14 +- Plausible.Cldr.html | 138 +++++----- Plausible.ClickhouseEventV2.html | 2 +- Plausible.ClickhouseRepo.html | 18 +- Plausible.ClickhouseSessionV2.BoolUInt8.html | 2 +- Plausible.ClickhouseSessionV2.html | 2 +- Plausible.ConfigHelpers.html | 2 +- Plausible.DataCase.html | 2 +- Plausible.DataMigration.NumericIDs.html | 2 +- Plausible.DataMigration.Repo.html | 18 +- Plausible.DataMigration.html | 2 +- Plausible.DebugReplayInfo.html | 2 +- Plausible.Ecto.EventName.html | 2 +- Plausible.Factory.html | 2 +- Plausible.Funnel.Const.html | 2 +- Plausible.Funnel.Step.html | 2 +- Plausible.Funnel.html | 2 +- Plausible.Funnels.html | 2 +- Plausible.Geo.html | 66 ++--- Plausible.Goal.Revenue.html | 2 +- Plausible.Goal.html | 2 +- Plausible.Goals.html | 2 +- Plausible.Google.Api.Mock.html | 2 +- Plausible.Google.Api.html | 2 +- Plausible.Google.Buffer.html | 2 +- Plausible.Google.HTTP.html | 2 +- Plausible.Google.ReportRequest.html | 2 +- Plausible.HTTPClient.Interface.html | 2 +- Plausible.HTTPClient.Non200Error.html | 2 +- Plausible.HTTPClient.html | 2 +- Plausible.Helpers.JSON.html | 2 +- Plausible.ImportDeletionRepo.html | 18 +- Plausible.Imported.html | 2 +- Plausible.IngestRepo.html | 18 +- Plausible.Ingestion.Counters.Buffer.html | 2 +- Plausible.Ingestion.Counters.Record.html | 2 +- ...e.Ingestion.Counters.TelemetryHandler.html | 2 +- Plausible.Ingestion.Counters.html | 2 +- Plausible.Ingestion.Event.Revenue.html | 2 +- Plausible.Ingestion.Event.html | 2 +- Plausible.Ingestion.Request.Revenue.html | 2 +- Plausible.Ingestion.Request.html | 2 +- Plausible.Mailer.html | 2 +- Plausible.OpenTelemetry.Sampler.html | 2 +- Plausible.PaddleApi.Mock.html | 2 +- Plausible.Pagination.html | 2 +- Plausible.Plugins.API.CustomProps.html | 2 +- Plausible.Plugins.API.Goals.html | 2 +- Plausible.Plugins.API.SharedLinks.html | 2 +- Plausible.Plugins.API.Token.html | 2 +- Plausible.Plugins.API.Tokens.html | 2 +- ...sible.PromEx.Plugins.PlausibleMetrics.html | 2 +- Plausible.PromEx.html | 2 +- Plausible.Props.html | 2 +- Plausible.Purge.html | 2 +- Plausible.RateLimit.html | 2 +- Plausible.Release.html | 2 +- Plausible.Repo.html | 2 +- Plausible.Sentry.Client.html | 2 +- Plausible.SentryFilter.html | 2 +- Plausible.Session.CacheStore.html | 2 +- Plausible.Session.Salts.html | 2 +- Plausible.Site.Cache.Warmer.All.html | 2 +- ...ble.Site.Cache.Warmer.RecentlyUpdated.html | 2 +- Plausible.Site.Cache.Warmer.html | 2 +- Plausible.Site.Cache.html | 2 +- Plausible.Site.Domain.html | 2 +- Plausible.Site.GateKeeper.html | 2 +- Plausible.Site.GoogleAuth.html | 2 +- Plausible.Site.ImportedData.html | 2 +- Plausible.Site.Membership.html | 2 +- ...ble.Site.Memberships.AcceptInvitation.html | 2 +- ...ble.Site.Memberships.CreateInvitation.html | 2 +- ...ble.Site.Memberships.RejectInvitation.html | 2 +- ...ble.Site.Memberships.RemoveInvitation.html | 2 +- Plausible.Site.Memberships.html | 2 +- Plausible.Site.MonthlyReport.html | 2 +- Plausible.Site.Removal.html | 2 +- Plausible.Site.SharedLink.html | 2 +- Plausible.Site.SpikeNotification.html | 2 +- Plausible.Site.UserPreference.html | 2 +- Plausible.Site.WeeklyReport.html | 2 +- Plausible.Site.html | 2 +- Plausible.SiteAdmin.html | 2 +- Plausible.Sites.html | 2 +- Plausible.Stats.Aggregate.html | 2 +- Plausible.Stats.Base.html | 2 +- Plausible.Stats.Breakdown.html | 2 +- Plausible.Stats.Clickhouse.html | 2 +- Plausible.Stats.Compare.html | 2 +- Plausible.Stats.Comparisons.html | 2 +- Plausible.Stats.CurrentVisitors.html | 2 +- Plausible.Stats.CustomProps.html | 2 +- Plausible.Stats.EmailReport.html | 2 +- Plausible.Stats.FilterParser.html | 14 +- Plausible.Stats.FilterSuggestions.html | 2 +- Plausible.Stats.Filters.html | 2 +- Plausible.Stats.Fragments.html | 2 +- Plausible.Stats.Funnel.html | 2 +- Plausible.Stats.Goal.Revenue.html | 2 +- Plausible.Stats.Imported.html | 2 +- Plausible.Stats.Interval.html | 2 +- Plausible.Stats.Props.html | 2 +- Plausible.Stats.Query.html | 2 +- Plausible.Stats.Sampling.html | 2 +- Plausible.Stats.Timeseries.html | 2 +- Plausible.Stats.Util.html | 2 +- Plausible.Stats.html | 2 +- Plausible.Test.Support.HTML.html | 2 +- Plausible.Test.Support.HTTPMocker.html | 2 +- Plausible.TestUtils.html | 2 +- Plausible.Themes.html | 2 +- Plausible.Timezones.html | 2 +- Plausible.Users.html | 2 +- Plausible.Workers.AcceptTrafficUntil.html | 2 +- Plausible.Workers.CheckUsage.html | 2 +- Plausible.Workers.CleanInvitations.html | 2 +- ...Workers.ExpireDomainChangeTransitions.html | 2 +- Plausible.Workers.ImportGoogleAnalytics.html | 2 +- Plausible.Workers.LockSites.html | 2 +- Plausible.Workers.NotifyAnnualRenewal.html | 2 +- Plausible.Workers.RotateSalts.html | 2 +- Plausible.Workers.ScheduleEmailReports.html | 2 +- Plausible.Workers.SendCheckStatsEmails.html | 2 +- Plausible.Workers.SendEmailReport.html | 2 +- Plausible.Workers.SendSiteSetupEmails.html | 2 +- Plausible.Workers.SendTrialNotifications.html | 2 +- Plausible.Workers.SpikeNotifier.html | 2 +- Plausible.epub | Bin 605784 -> 603861 bytes Plausible.html | 2 +- PlausibleWeb.AdminController.html | 2 +- PlausibleWeb.Api.ExternalController.html | 2 +- PlausibleWeb.Api.ExternalSitesController.html | 2 +- PlausibleWeb.Api.ExternalStatsController.html | 2 +- PlausibleWeb.Api.Helpers.html | 2 +- PlausibleWeb.Api.InternalController.html | 2 +- PlausibleWeb.Api.PaddleController.html | 2 +- PlausibleWeb.Api.StatsController.html | 18 +- PlausibleWeb.AuthController.html | 2 +- PlausibleWeb.AuthPlug.html | 2 +- PlausibleWeb.AuthView.html | 2 +- PlausibleWeb.AuthorizeSiteAccess.html | 2 +- PlausibleWeb.AuthorizeSitesApiPlug.html | 2 +- PlausibleWeb.AuthorizeStatsApiPlug.html | 2 +- PlausibleWeb.AvatarController.html | 2 +- PlausibleWeb.BillingController.html | 2 +- PlausibleWeb.BillingView.html | 2 +- PlausibleWeb.CRMAuthPlug.html | 2 +- PlausibleWeb.Captcha.html | 2 +- ...leWeb.Components.Billing.PlanBenefits.html | 2 +- PlausibleWeb.Components.Generic.html | 2 +- PlausibleWeb.Components.Google.html | 2 +- PlausibleWeb.Components.Settings.html | 2 +- PlausibleWeb.Components.Site.Feature.html | 2 +- PlausibleWeb.Components.TwoFactor.html | 2 +- PlausibleWeb.ConnCase.html | 2 +- PlausibleWeb.ControllerHelpers.html | 2 +- PlausibleWeb.Controllers.API.Revenue.html | 2 +- PlausibleWeb.Dogfood.html | 2 +- PlausibleWeb.Email.html | 2 +- PlausibleWeb.EmailView.html | 2 +- PlausibleWeb.Endpoint.html | 10 +- PlausibleWeb.ErrorHelpers.html | 2 +- PlausibleWeb.ErrorReportController.html | 2 +- PlausibleWeb.ErrorView.html | 2 +- PlausibleWeb.Favicon.html | 2 +- PlausibleWeb.FirstLaunchPlug.Test.html | 2 +- PlausibleWeb.FirstLaunchPlug.html | 2 +- PlausibleWeb.FormHelpers.html | 2 +- PlausibleWeb.InvitationController.html | 2 +- PlausibleWeb.LastSeenPlug.html | 2 +- PlausibleWeb.LayoutView.JWT.html | 2 +- PlausibleWeb.LayoutView.html | 2 +- PlausibleWeb.Live.ChoosePlan.html | 34 +-- ...Live.Components.ComboBox.StaticSearch.html | 2 +- PlausibleWeb.Live.Components.ComboBox.html | 2 +- PlausibleWeb.Live.Components.Form.html | 2 +- PlausibleWeb.Live.Components.Pagination.html | 2 +- PlausibleWeb.Live.Components.Visitors.html | 2 +- PlausibleWeb.Live.Flash.html | 2 +- PlausibleWeb.Live.FunnelSettings.Form.html | 4 +- PlausibleWeb.Live.FunnelSettings.List.html | 2 +- PlausibleWeb.Live.FunnelSettings.html | 10 +- PlausibleWeb.Live.GoalSettings.Form.html | 46 +--- PlausibleWeb.Live.GoalSettings.List.html | 2 +- PlausibleWeb.Live.GoalSettings.html | 10 +- PlausibleWeb.Live.Plugins.API.Settings.html | 4 +- PlausibleWeb.Live.Plugins.API.TokenForm.html | 34 +-- PlausibleWeb.Live.PropsSettings.Form.html | 4 +- PlausibleWeb.Live.PropsSettings.List.html | 2 +- PlausibleWeb.Live.PropsSettings.html | 10 +- PlausibleWeb.Live.RegisterForm.html | 40 +-- PlausibleWeb.Live.ResetPasswordForm.html | 34 +-- PlausibleWeb.Live.SentryContext.html | 217 --------------- PlausibleWeb.Live.Sites.html | 18 +- PlausibleWeb.MJML.StatsReport.html | 2 +- PlausibleWeb.PageController.html | 2 +- PlausibleWeb.PageView.html | 2 +- ...b.Plugins.API.Controllers.CustomProps.html | 2 +- ...ibleWeb.Plugins.API.Controllers.Goals.html | 2 +- ...b.Plugins.API.Controllers.SharedLinks.html | 2 +- PlausibleWeb.Plugins.API.Errors.html | 2 +- PlausibleWeb.Plugins.API.Router.html | 2 +- ...API.Schemas.CustomProp.DisableRequest.html | 2 +- ....API.Schemas.CustomProp.EnableRequest.html | 2 +- ...s.API.Schemas.CustomProp.ListResponse.html | 2 +- ...bleWeb.Plugins.API.Schemas.CustomProp.html | 2 +- PlausibleWeb.Plugins.API.Schemas.Error.html | 2 +- ...chemas.Goal.CreateRequest.CustomEvent.html | 2 +- ...I.Schemas.Goal.CreateRequest.Pageview.html | 2 +- ...PI.Schemas.Goal.CreateRequest.Revenue.html | 2 +- ...lugins.API.Schemas.Goal.CreateRequest.html | 2 +- ....Plugins.API.Schemas.Goal.CustomEvent.html | 2 +- ...ns.API.Schemas.Goal.DeleteBulkRequest.html | 2 +- ...Plugins.API.Schemas.Goal.ListResponse.html | 2 +- ...Web.Plugins.API.Schemas.Goal.Pageview.html | 2 +- ...eWeb.Plugins.API.Schemas.Goal.Revenue.html | 2 +- ...ibleWeb.Plugins.API.Schemas.Goal.Type.html | 2 +- PlausibleWeb.Plugins.API.Schemas.Goal.html | 2 +- PlausibleWeb.Plugins.API.Schemas.Link.html | 2 +- ...sibleWeb.Plugins.API.Schemas.NotFound.html | 2 +- ...lugins.API.Schemas.PaginationMetadata.html | 2 +- ...b.Plugins.API.Schemas.PaymentRequired.html | 2 +- ....API.Schemas.SharedLink.CreateRequest.html | 2 +- ...s.API.Schemas.SharedLink.ListResponse.html | 2 +- ...bleWeb.Plugins.API.Schemas.SharedLink.html | 2 +- ...eWeb.Plugins.API.Schemas.Unauthorized.html | 2 +- ...ugins.API.Schemas.UnprocessableEntity.html | 2 +- PlausibleWeb.Plugins.API.Spec.html | 2 +- ...sibleWeb.Plugins.API.Views.CustomProp.html | 2 +- PlausibleWeb.Plugins.API.Views.Error.html | 2 +- PlausibleWeb.Plugins.API.Views.Goal.html | 2 +- ...sibleWeb.Plugins.API.Views.Pagination.html | 2 +- ...sibleWeb.Plugins.API.Views.SharedLink.html | 2 +- PlausibleWeb.Plugins.API.html | 2 +- PlausibleWeb.PluginsAPICase.html | 2 +- PlausibleWeb.Plugs.AuthorizePluginsAPI.html | 2 +- PlausibleWeb.Plugs.ErrorHandler.html | 2 +- ...bleWeb.Plugs.MaybeDisableRegistration.html | 2 +- PlausibleWeb.Plugs.NoRobots.html | 2 +- PlausibleWeb.RefInspector.html | 2 +- PlausibleWeb.RemoteIp.html | 2 +- PlausibleWeb.RequireAccountPlug.html | 2 +- PlausibleWeb.RequireLoggedOutPlug.html | 2 +- PlausibleWeb.Router.html | 2 +- PlausibleWeb.SessionTimeoutPlug.html | 2 +- PlausibleWeb.Site.MembershipController.html | 2 +- PlausibleWeb.Site.MembershipView.html | 2 +- PlausibleWeb.SiteController.html | 2 +- PlausibleWeb.SiteView.html | 2 +- PlausibleWeb.StatsController.html | 2 +- PlausibleWeb.StatsView.html | 2 +- PlausibleWeb.Tracker.html | 2 +- PlausibleWeb.TwoFactor.Session.html | 2 +- PlausibleWeb.UnsubscribeController.html | 2 +- PlausibleWeb.UnsubscribeView.html | 2 +- PlausibleWeb.html | 48 +--- account-locking.html | 2 +- api-reference.html | 12 +- contributing.html | 2 +- ...ta-7F0A356C.js => search_data-1EFECFFF.js} | 2 +- ...-19EA738B.js => sidebar_items-CA384A82.js} | 2 +- readme.html | 2 +- search.html | 4 +- 317 files changed, 924 insertions(+), 1344 deletions(-) delete mode 100644 PlausibleWeb.Live.SentryContext.html rename dist/{search_data-7F0A356C.js => search_data-1EFECFFF.js} (67%) rename dist/{sidebar_items-19EA738B.js => sidebar_items-CA384A82.js} (62%) diff --git a/.build b/.build index f5fd3aea0..6595d6e6f 100644 --- a/.build +++ b/.build @@ -242,7 +242,6 @@ PlausibleWeb.Live.PropsSettings.List.html PlausibleWeb.Live.PropsSettings.html PlausibleWeb.Live.RegisterForm.html PlausibleWeb.Live.ResetPasswordForm.html -PlausibleWeb.Live.SentryContext.html PlausibleWeb.Live.Sites.html PlausibleWeb.MJML.StatsReport.html PlausibleWeb.PageController.html @@ -337,8 +336,8 @@ dist/merriweather-latin-ext-300-normal-K6L27CZ5.woff2 dist/merriweather-vietnamese-300-italic-EHHNZPUO.woff2 dist/merriweather-vietnamese-300-normal-U376L4Z4.woff2 dist/remixicon-NKANDIL5.woff2 -dist/search_data-7F0A356C.js -dist/sidebar_items-19EA738B.js +dist/search_data-1EFECFFF.js +dist/sidebar_items-CA384A82.js index.html readme.html search.html diff --git a/404.html b/404.html index 192b77317..977adb104 100644 --- a/404.html +++ b/404.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.CancelSubscription.html b/Mix.Tasks.CancelSubscription.html index 59a1475e9..b552a451c 100644 --- a/Mix.Tasks.CancelSubscription.html +++ b/Mix.Tasks.CancelSubscription.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.CleanClickhouse.html b/Mix.Tasks.CleanClickhouse.html index 4b6422fe6..65b767313 100644 --- a/Mix.Tasks.CleanClickhouse.html +++ b/Mix.Tasks.CleanClickhouse.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.CreateFreeSubscription.html b/Mix.Tasks.CreateFreeSubscription.html index 1b9c4da3c..b2069c530 100644 --- a/Mix.Tasks.CreateFreeSubscription.html +++ b/Mix.Tasks.CreateFreeSubscription.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.DownloadCountryDatabase.html b/Mix.Tasks.DownloadCountryDatabase.html index 165e17693..c54d855aa 100644 --- a/Mix.Tasks.DownloadCountryDatabase.html +++ b/Mix.Tasks.DownloadCountryDatabase.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.GenerateReferrerFavicons.html b/Mix.Tasks.GenerateReferrerFavicons.html index c677a034e..f72879dea 100644 --- a/Mix.Tasks.GenerateReferrerFavicons.html +++ b/Mix.Tasks.GenerateReferrerFavicons.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.PullSandboxSubscription.html b/Mix.Tasks.PullSandboxSubscription.html index 0f05f6a25..819f9ee39 100644 --- a/Mix.Tasks.PullSandboxSubscription.html +++ b/Mix.Tasks.PullSandboxSubscription.html @@ -13,7 +13,7 @@ - + diff --git a/Mix.Tasks.SendPageview.html b/Mix.Tasks.SendPageview.html index a3d62fc14..7f4106a84 100644 --- a/Mix.Tasks.SendPageview.html +++ b/Mix.Tasks.SendPageview.html @@ -13,7 +13,7 @@ - + diff --git a/ObanErrorReporter.html b/ObanErrorReporter.html index 4921cc7f6..adbaba702 100644 --- a/ObanErrorReporter.html +++ b/ObanErrorReporter.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.AsyncInsertRepo.html b/Plausible.AsyncInsertRepo.html index 0cce33a32..2072ac8b9 100644 --- a/Plausible.AsyncInsertRepo.html +++ b/Plausible.AsyncInsertRepo.html @@ -13,7 +13,7 @@ - + @@ -1114,23 +1114,23 @@ pool to disconnect within the given interval.

See -

Similar to insert_all/2 but with the following differences:

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+

Similar to insert_all/2 but with the following differences:

  • accepts rows as streams or lists
  • sends rows as a chunked request
  • doesn't autogenerate ids or does any other preprocessing

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
 
-defmodule Demo do
+defmodule Demo do
   use Ecto.Schema
 
   @primary_key false
-  schema "ecto_ch_demo" do
+  schema "ecto_ch_demo" do
     field :a, Ch, type: "UInt64"
     field :b, :string
-  end
-end
+  end
+end
 
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
 
 # schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+
{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Auth.ApiKey.html b/Plausible.Auth.ApiKey.html index 6b3355179..ab7e2aa73 100644 --- a/Plausible.Auth.ApiKey.html +++ b/Plausible.Auth.ApiKey.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.ApiKeyAdmin.html b/Plausible.Auth.ApiKeyAdmin.html index 3a542e5c5..d3215ae4e 100644 --- a/Plausible.Auth.ApiKeyAdmin.html +++ b/Plausible.Auth.ApiKeyAdmin.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.EmailActivationCode.html b/Plausible.Auth.EmailActivationCode.html index 07a5f4fa2..277054193 100644 --- a/Plausible.Auth.EmailActivationCode.html +++ b/Plausible.Auth.EmailActivationCode.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.EmailVerification.html b/Plausible.Auth.EmailVerification.html index 7f7fadb16..1667b87ee 100644 --- a/Plausible.Auth.EmailVerification.html +++ b/Plausible.Auth.EmailVerification.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.GracePeriod.html b/Plausible.Auth.GracePeriod.html index c1a24a835..ef34ca7db 100644 --- a/Plausible.Auth.GracePeriod.html +++ b/Plausible.Auth.GracePeriod.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.Invitation.html b/Plausible.Auth.Invitation.html index dabe5442e..9d4708902 100644 --- a/Plausible.Auth.Invitation.html +++ b/Plausible.Auth.Invitation.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.Password.html b/Plausible.Auth.Password.html index cbeb593ff..e2c8f3714 100644 --- a/Plausible.Auth.Password.html +++ b/Plausible.Auth.Password.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.TOTP.EncryptedBinary.html b/Plausible.Auth.TOTP.EncryptedBinary.html index 5c9763bbf..250936192 100644 --- a/Plausible.Auth.TOTP.EncryptedBinary.html +++ b/Plausible.Auth.TOTP.EncryptedBinary.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.TOTP.RecoveryCode.html b/Plausible.Auth.TOTP.RecoveryCode.html index ca21f99ef..410a42250 100644 --- a/Plausible.Auth.TOTP.RecoveryCode.html +++ b/Plausible.Auth.TOTP.RecoveryCode.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.TOTP.Vault.html b/Plausible.Auth.TOTP.Vault.html index 3e82a6e21..fc5db286f 100644 --- a/Plausible.Auth.TOTP.Vault.html +++ b/Plausible.Auth.TOTP.Vault.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.TOTP.html b/Plausible.Auth.TOTP.html index 9d89d637a..9d60a89eb 100644 --- a/Plausible.Auth.TOTP.html +++ b/Plausible.Auth.TOTP.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.Token.html b/Plausible.Auth.Token.html index 545fa4ba0..3d3cc85e4 100644 --- a/Plausible.Auth.Token.html +++ b/Plausible.Auth.Token.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.User.html b/Plausible.Auth.User.html index 0bb9260cf..3c330e9d8 100644 --- a/Plausible.Auth.User.html +++ b/Plausible.Auth.User.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.UserAdmin.html b/Plausible.Auth.UserAdmin.html index 9b191af3f..0571af14e 100644 --- a/Plausible.Auth.UserAdmin.html +++ b/Plausible.Auth.UserAdmin.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Auth.html b/Plausible.Auth.html index ef097e986..f3f2a7057 100644 --- a/Plausible.Auth.html +++ b/Plausible.Auth.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.Ecto.Feature.html b/Plausible.Billing.Ecto.Feature.html index d27d0bcf0..0103b65b0 100644 --- a/Plausible.Billing.Ecto.Feature.html +++ b/Plausible.Billing.Ecto.Feature.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.Ecto.FeatureList.html b/Plausible.Billing.Ecto.FeatureList.html index a9023e85f..6a6331084 100644 --- a/Plausible.Billing.Ecto.FeatureList.html +++ b/Plausible.Billing.Ecto.FeatureList.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.Ecto.Limit.html b/Plausible.Billing.Ecto.Limit.html index a5d3274f7..ba14b7af1 100644 --- a/Plausible.Billing.Ecto.Limit.html +++ b/Plausible.Billing.Ecto.Limit.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.EnterprisePlan.html b/Plausible.Billing.EnterprisePlan.html index a1c7af93a..b1fb6800c 100644 --- a/Plausible.Billing.EnterprisePlan.html +++ b/Plausible.Billing.EnterprisePlan.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.EnterprisePlanAdmin.html b/Plausible.Billing.EnterprisePlanAdmin.html index e1646e573..620613ca0 100644 --- a/Plausible.Billing.EnterprisePlanAdmin.html +++ b/Plausible.Billing.EnterprisePlanAdmin.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.Feature.html b/Plausible.Billing.Feature.html index ec8b4f030..153f175c5 100644 --- a/Plausible.Billing.Feature.html +++ b/Plausible.Billing.Feature.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.PaddleApi.html b/Plausible.Billing.PaddleApi.html index a286abc35..a638cf78b 100644 --- a/Plausible.Billing.PaddleApi.html +++ b/Plausible.Billing.PaddleApi.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.Plans.html b/Plausible.Billing.Plans.html index c5da02da0..b34a52327 100644 --- a/Plausible.Billing.Plans.html +++ b/Plausible.Billing.Plans.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.Quota.html b/Plausible.Billing.Quota.html index 12b66fed4..738efb93f 100644 --- a/Plausible.Billing.Quota.html +++ b/Plausible.Billing.Quota.html @@ -13,7 +13,7 @@ - + @@ -690,12 +690,12 @@ this user owns + StatsAPI if the user has a configured Stats API key.

Give

Queries the ClickHouse database for the monthly pageview usage. If the given user's subscription is active, past_due, or a deleted (but not yet expired), a map -with the following structure is returned:

%{
-  current_cycle: usage_cycle(),
-  last_cycle: usage_cycle(),
-  penultimate_cycle: usage_cycle()
-}

In all other cases of the subscription status (or a free_10k subscription which -does not have a last_bill_date defined) - the following structure is returned:

%{last_30_days: usage_cycle()}

Given only a user as input, the usage is queried from across all the sites that the +with the following structure is returned:

%{
+  current_cycle: usage_cycle(),
+  last_cycle: usage_cycle(),
+  penultimate_cycle: usage_cycle()
+}

In all other cases of the subscription status (or a free_10k subscription which +does not have a last_bill_date defined) - the following structure is returned:

%{last_30_days: usage_cycle()}

Given only a user as input, the usage is queried from across all the sites that the user owns. Alternatively, given an optional argument of site_ids, the usage from across all those sites is queried instead.

diff --git a/Plausible.Billing.SiteLocker.html b/Plausible.Billing.SiteLocker.html index 5d295948a..f5d1f684d 100644 --- a/Plausible.Billing.SiteLocker.html +++ b/Plausible.Billing.SiteLocker.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.Subscription.Status.html b/Plausible.Billing.Subscription.Status.html index b9eb0b728..e97a7d04d 100644 --- a/Plausible.Billing.Subscription.Status.html +++ b/Plausible.Billing.Subscription.Status.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Billing.html b/Plausible.Billing.html index d0c3ef0a0..ddeb21c9b 100644 --- a/Plausible.Billing.html +++ b/Plausible.Billing.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ChangesetHelpers.html b/Plausible.ChangesetHelpers.html index 105db033f..21c91d76a 100644 --- a/Plausible.ChangesetHelpers.html +++ b/Plausible.ChangesetHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Cldr.AcceptLanguage.html b/Plausible.Cldr.AcceptLanguage.html index d16d7e5de..153cd2c10 100644 --- a/Plausible.Cldr.AcceptLanguage.html +++ b/Plausible.Cldr.AcceptLanguage.html @@ -13,7 +13,7 @@ - + @@ -119,7 +119,7 @@ Plausible the set of natural languages that are preferred as a response to the request. Language tags function are provided in Cldr.LanguageTag.

The format of an Accept-Language header is as follows in ABNF format:

   Accept-Language = "Accept-Language" ":"
                      1#( language-range [ ";" "q" "=" qvalue ] )
-   language-range  = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )

Each language-range MAY be given an associated quality value which represents an + language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )

Each language-range MAY be given an associated quality value which represents an estimate of the user's preference for the languages specified by that range. The quality value defaults to "q=1". For example,

   Accept-Language: da, en-gb;q=0.8, en;q=0.7

would mean: "I prefer Danish, but will accept British English and other types of English."

@@ -232,54 +232,54 @@ a configured iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr) -{:ok, - %Cldr.LanguageTag{ +
iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
    backend: TestBackend.Cldr,
    canonical_locale_name: "zh-TW",
    cldr_locale_name: :"zh-Hant",
-   language_subtags: [],
-   extensions: %{},
+   language_subtags: [],
+   extensions: %{},
    gettext_locale_name: nil,
    language: "zh",
-   locale: %{},
-   private_use: [],
+   locale: %{},
+   private_use: [],
    rbnf_locale_name: :"zh-Hant",
    requested_locale_name: "zh-TW",
    script: :Hant,
    territory: :TW,
-   transform: %{},
-   language_variants: []
- }}
+   transform: %{},
+   language_variants: []
+ }}
 
-iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.best_match("da;q=0.1,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ %Cldr.LanguageTag{
    backend: TestBackend.Cldr,
    canonical_locale_name: "zh-TW",
    cldr_locale_name: :"zh-Hant",
-   language_subtags: [],
-   extensions: %{},
+   language_subtags: [],
+   extensions: %{},
    gettext_locale_name: nil,
    language: "zh",
-   locale: %{},
-   private_use: [],
+   locale: %{},
+   private_use: [],
    rbnf_locale_name: :"zh-Hant",
    requested_locale_name: "zh-TW",
    script: :Hant,
    territory: :TW,
-   transform: %{},
-   language_variants: []
- }}
+   transform: %{},
+   language_variants: []
+ }}
 
-iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
-{:error,
- {Cldr.NoMatchingLocale,
-  "No configured locale could be matched to \"xx,yy;q=0.3\""}}
+iex> Plausible.Cldr.AcceptLanguage.best_match("xx,yy;q=0.3")
+{:error,
+ {Cldr.NoMatchingLocale,
+  "No configured locale could be matched to \"xx,yy;q=0.3\""}}
 
-iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag")
-{:error, {Cldr.LanguageTag.ParseError,
-  "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+
iex> Plausible.Cldr.AcceptLanguage.best_match("invalid_tag") +{:error, {Cldr.LanguageTag.ParseError, + "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
@@ -340,95 +340,95 @@ wuth an error tuple for each invalid tag added at the end of the list.

-
iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
-{:ok,
- [
-   {1.0,
-    %Cldr.LanguageTag{
+
iex> Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3", TestBackend.Cldr)
+{:ok,
+ [
+   {1.0,
+    %Cldr.LanguageTag{
       backend: TestBackend.Cldr,
       canonical_locale_name: "da",
       cldr_locale_name: :da,
-      language_subtags: [],
-      extensions: %{},
+      language_subtags: [],
+      extensions: %{},
       gettext_locale_name: nil,
       language: "da",
-      locale: %{},
-      private_use: [],
+      locale: %{},
+      private_use: [],
       rbnf_locale_name: :da,
       requested_locale_name: "da",
       script: :Latn,
       territory: :DK,
-      transform: %{},
-      language_variants: []
-    }},
-   {0.3,
-    %Cldr.LanguageTag{
+      transform: %{},
+      language_variants: []
+    }},
+   {0.3,
+    %Cldr.LanguageTag{
       backend: TestBackend.Cldr,
       canonical_locale_name: "zh-TW",
       cldr_locale_name: :"zh-Hant",
-      language_subtags: [],
-      extensions: %{},
+      language_subtags: [],
+      extensions: %{},
       gettext_locale_name: nil,
       language: "zh",
-      locale: %{},
-      private_use: [],
+      locale: %{},
+      private_use: [],
       rbnf_locale_name: :"zh-Hant",
       requested_locale_name: "zh-TW",
       script: :Hant,
       territory: :TW,
-      transform: %{},
-      language_variants: []
-    }}
- ]}
+      transform: %{},
+      language_variants: []
+    }}
+ ]}
 
-iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
-{:error,
- {Cldr.LanguageTag.ParseError,
-  "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
+iex> Plausible.Cldr.AcceptLanguage.parse("invalid_tag")
+{:error,
+ {Cldr.LanguageTag.ParseError,
+  "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
 
-iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
-{:ok,
- [
-   {1.0,
-    %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse("da,zh-TW;q=0.3,invalid_tag")
+{:ok,
+ [
+   {1.0,
+    %Cldr.LanguageTag{
       backend: TestBackend.Cldr,
       canonical_locale_name: "da",
       cldr_locale_name: :da,
-      language_subtags: [],
-      extensions: %{},
+      language_subtags: [],
+      extensions: %{},
       gettext_locale_name: nil,
       language: "da",
-      locale: %{},
-      private_use: [],
+      locale: %{},
+      private_use: [],
       rbnf_locale_name: :da,
       requested_locale_name: "da",
       script: :Latn,
       territory: :DK,
-      transform: %{},
-      language_variants: []
-    }},
-   {0.3,
-    %Cldr.LanguageTag{
+      transform: %{},
+      language_variants: []
+    }},
+   {0.3,
+    %Cldr.LanguageTag{
       backend: TestBackend.Cldr,
       canonical_locale_name: "zh-TW",
       cldr_locale_name: :"zh-Hant",
-      language_subtags: [],
-      extensions: %{},
+      language_subtags: [],
+      extensions: %{},
       gettext_locale_name: nil,
       language: "zh",
-      locale: %{},
-      private_use: [],
+      locale: %{},
+      private_use: [],
       rbnf_locale_name: :"zh-Hant",
       requested_locale_name: "zh-TW",
       script: :Hant,
       territory: :TW,
-      transform: %{},
-      language_variants: []
-    }},
-   {:error,
-    {Cldr.LanguageTag.ParseError,
-     "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
- ]}
+
transform: %{}, + language_variants: [] + }}, + {:error, + {Cldr.LanguageTag.ParseError, + "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}} + ]}
@@ -473,92 +473,92 @@ wuth an error tuple for each invalid tag added at the end of the list.

-
iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
-[
-  {1.0,
-   %Cldr.LanguageTag{
+
iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3")
+[
+  {1.0,
+   %Cldr.LanguageTag{
      backend: TestBackend.Cldr,
      canonical_locale_name: "da",
      cldr_locale_name: :da,
-     language_subtags: [],
-     extensions: %{},
+     language_subtags: [],
+     extensions: %{},
      gettext_locale_name: nil,
      language: "da",
-     locale: %{},
-     private_use: [],
+     locale: %{},
+     private_use: [],
      rbnf_locale_name: :da,
      requested_locale_name: "da",
      script: :Latn,
      territory: :DK,
-     transform: %{},
-     language_variants: []
-   }},
-  {0.3,
-   %Cldr.LanguageTag{
+     transform: %{},
+     language_variants: []
+   }},
+  {0.3,
+   %Cldr.LanguageTag{
      backend: TestBackend.Cldr,
      canonical_locale_name: "zh-TW",
      cldr_locale_name: :"zh-Hant",
-     language_subtags: [],
-     extensions: %{},
+     language_subtags: [],
+     extensions: %{},
      gettext_locale_name: nil,
      language: "zh",
-     locale: %{},
-     private_use: [],
+     locale: %{},
+     private_use: [],
      rbnf_locale_name: :"zh-Hant",
      requested_locale_name: "zh-TW",
      script: :Hant,
      territory: :TW,
-     transform: %{},
-     language_variants: []
-   }}
-]
+     transform: %{},
+     language_variants: []
+   }}
+]
 
 Plausible.Cldr.AcceptLanguage.parse! "invalid_tag"
 ** (Cldr.AcceptLanguageError) "Expected a BCP47 language tag. Could not parse the remaining "g" starting at position 11
     (ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1
 
-iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
-[
-  {1.0,
-   %Cldr.LanguageTag{
+iex> Plausible.Cldr.AcceptLanguage.parse!("da,zh-TW;q=0.3,invalid_tag")
+[
+  {1.0,
+   %Cldr.LanguageTag{
      backend: TestBackend.Cldr,
      canonical_locale_name: "da",
      cldr_locale_name: :da,
-     language_subtags: [],
-     extensions: %{},
+     language_subtags: [],
+     extensions: %{},
      gettext_locale_name: nil,
      language: "da",
-     locale: %{},
-     private_use: [],
+     locale: %{},
+     private_use: [],
      rbnf_locale_name: :da,
      requested_locale_name: "da",
      script: :Latn,
      territory: :DK,
-     transform: %{},
-     language_variants: []
-   }},
-  {0.3,
-   %Cldr.LanguageTag{
+     transform: %{},
+     language_variants: []
+   }},
+  {0.3,
+   %Cldr.LanguageTag{
      backend: TestBackend.Cldr,
      canonical_locale_name: "zh-TW",
      cldr_locale_name: :"zh-Hant",
-     language_subtags: [],
-     extensions: %{},
+     language_subtags: [],
+     extensions: %{},
      gettext_locale_name: nil,
      language: "zh",
-     locale: %{},
-     private_use: [],
+     locale: %{},
+     private_use: [],
      rbnf_locale_name: :"zh-Hant",
      requested_locale_name: "zh-TW",
      script: :Hant,
      territory: :TW,
-     transform: %{},
-     language_variants: []
-   }},
-  {:error,
-   {Cldr.LanguageTag.ParseError,
-    "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}}
-]
+
transform: %{}, + language_variants: [] + }}, + {:error, + {Cldr.LanguageTag.ParseError, + "Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11"}} +]
diff --git a/Plausible.Cldr.Currency.html b/Plausible.Cldr.Currency.html index ecc298cf8..e1044af88 100644 --- a/Plausible.Cldr.Currency.html +++ b/Plausible.Cldr.Currency.html @@ -13,7 +13,7 @@ - + @@ -390,11 +390,11 @@ The default is :all. See
FJD: %Cldr.Currency{ + %{

 FJD: %Cldr.Currency{
    cash_digits: 2,
    cash_rounding: 0,
    code: "FJD",
-   count: %{one: "Fijian dollar", other: "Fijian dollars"},
+   count: %{one: "Fijian dollar", other: "Fijian dollars"},
    digits: 2,
    from: nil,
    iso_digits: 2,
@@ -404,12 +404,12 @@ The default is :all. See symbol: "FJD",
    tender: true,
    to: nil
- },
- SUR: %Cldr.Currency{
+ },
+ SUR: %Cldr.Currency{
    cash_digits: 2,
    cash_rounding: 0,
    code: "SUR",
-   count: %{one: "Soviet rouble", other: "Soviet roubles"},
+   count: %{one: "Soviet rouble", other: "Soviet roubles"},
    digits: 2,
    from: nil,
    iso_digits: nil,
@@ -419,7 +419,7 @@ The default is :all. See symbol: "SUR",
    tender: true,
    to: nil
- },
+ },
  ...
 }}
@@ -470,11 +470,11 @@ The default is :all. See FJD: %Cldr.Currency{ + => %{

FJD: %Cldr.Currency{
   cash_digits: 2,
   cash_rounding: 0,
   code: "FJD",
-  count: %{one: "Fijian dollar", other: "Fijian dollars"},
+  count: %{one: "Fijian dollar", other: "Fijian dollars"},
   digits: 2,
   from: nil,
   iso_digits: 2,
@@ -484,12 +484,12 @@ The default is :all. See symbol: "FJD",
   tender: true,
   to: nil
-},
-SUR: %Cldr.Currency{
+},
+SUR: %Cldr.Currency{
   cash_digits: 2,
   cash_rounding: 0,
   code: "SUR",
-  count: %{one: "Soviet rouble", other: "Soviet roubles"},
+  count: %{one: "Soviet rouble", other: "Soviet roubles"},
   digits: 2,
   from: nil,
   iso_digits: nil,
@@ -499,7 +499,7 @@ The default is :all. See symbol: "SUR",
   tender: true,
   to: nil
-},
+},
 ...

}

@@ -557,13 +557,13 @@ or a -
iex> Plausible.Cldr.Currency.currency_for_code("AUD")
-{:ok,
-  %Cldr.Currency{
+
iex> Plausible.Cldr.Currency.currency_for_code("AUD")
+{:ok,
+  %Cldr.Currency{
     cash_digits: 2,
     cash_rounding: 0,
     code: "AUD",
-    count: %{one: "Australian dollar", other: "Australian dollars"},
+    count: %{one: "Australian dollar", other: "Australian dollars"},
     digits: 2,
     iso_digits: 2,
     name: "Australian Dollar",
@@ -571,15 +571,15 @@ or a rounding: 0,
     symbol: "A$",
     tender: true
-}}
+}}
 
-iex> Plausible.Cldr.Currency.currency_for_code("THB")
-{:ok,
-  %Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code("THB")
+{:ok,
+  %Cldr.Currency{
     cash_digits: 2,
     cash_rounding: 0,
     code: "THB",
-    count: %{one: "Thai baht", other: "Thai baht"},
+    count: %{one: "Thai baht", other: "Thai baht"},
     digits: 2,
     iso_digits: 2,
     name: "Thai Baht",
@@ -587,7 +587,7 @@ or a rounding: 0,
     symbol: "THB",
     tender: true
-}}
+}}
@@ -646,12 +646,12 @@ or a -
iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
-%Cldr.Currency{
+
iex> Plausible.Cldr.Currency.currency_for_code!("AUD")
+%Cldr.Currency{
   cash_digits: 2,
   cash_rounding: 0,
   code: "AUD",
-  count: %{one: "Australian dollar", other: "Australian dollars"},
+  count: %{one: "Australian dollar", other: "Australian dollars"},
   digits: 2,
   iso_digits: 2,
   name: "Australian Dollar",
@@ -659,14 +659,14 @@ or a rounding: 0,
   symbol: "A$",
   tender: true
-}
+}
 
-iex> Plausible.Cldr.Currency.currency_for_code!("THB")
-%Cldr.Currency{
+iex> Plausible.Cldr.Currency.currency_for_code!("THB")
+%Cldr.Currency{
   cash_digits: 2,
   cash_rounding: 0,
   code: "THB",
-  count: %{one: "Thai baht", other: "Thai baht"},
+  count: %{one: "Thai baht", other: "Thai baht"},
   digits: 2,
   iso_digits: 2,
   name: "Thai Baht",
@@ -674,7 +674,7 @@ or a rounding: 0,
   symbol: "THB",
   tender: true
-}
+}
@@ -715,11 +715,11 @@ or a -
iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
+
iex> {:ok, locale} = Plausible.Cldr.validate_locale "en"
 iex> Plausible.Cldr.Currency.currency_from_locale locale
 :USD
 
-iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
+iex> {:ok, locale} = Plausible.Cldr.validate_locale "en-AU"
 iex> Plausible.Cldr.Currency.currency_from_locale locale
 :AUD
 
@@ -768,13 +768,13 @@ or a 
 
 
iex> MyApp.Cldr.Currency.currency_history_for_locale "en"
-{:ok,
-    %{
-    USD: %{from: ~D[1792-01-01], to: nil},
-    USN: %{tender: false},
-    USS: %{from: nil, tender: false, to: ~D[2014-03-01]}
-  }
-}
+{:ok, + %{ + USD: %{from: ~D[1792-01-01], to: nil}, + USN: %{tender: false}, + USS: %{from: nil, tender: false, to: ~D[2014-03-01]} + } +}
@@ -834,8 +834,8 @@ The default is :all. See MyApp.Cldr.Currency.currency_strings "en" -=> {:ok, - %{ +=> {:ok, + %{ "mexican silver pesos" => :MXP, "sudanese dinar" => :SDD, "bad" => :BAD, @@ -845,7 +845,7 @@ The default is :all. See "guyanaese dollars" => :GYD, "equatorial guinean ekwele" => :GQE, ... - }} + }}
@@ -905,7 +905,7 @@ The default is :all. See MyApp.Cldr.Currency.currency_strings! "en" -=> %{ +=> %{ "mexican silver pesos" => :MXP, "sudanese dinar" => :SDD, "bad" => :BAD, @@ -915,7 +915,7 @@ The default is :all. See "guyanaese dollars" => :GYD, "equatorial guinean ekwele" => :GQE, ... - } + }
@@ -1004,7 +1004,7 @@ mapping is returned for that territory.

iex> Plausible.Cldr.Currency.current_territory_currencies() +
iex> Plausible.Cldr.Currency.current_territory_currencies()

@@ -1097,10 +1097,10 @@ currency code

iex> Plausible.Cldr.Currency.known_currency_code "AUD" -{:ok, :AUD} +{:ok, :AUD} iex> Plausible.Cldr.Currency.known_currency_code "GGG" -{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}} +{:error, {Cldr.UnknownCurrencyError, "The currency \"GGG\" is invalid"}}

@@ -1247,14 +1247,14 @@ such as 0.05. Optional.

iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0) -{:ok, - %Cldr.Currency{ +
iex> Plausible.Cldr.Currency.new(:XAE, name: "Custom Name", digits: 0)
+{:ok,
+ %Cldr.Currency{
    alt_code: :XAE,
    cash_digits: 0,
    cash_rounding: nil,
    code: :XAE,
-   count: %{other: "Custom Name"},
+   count: %{other: "Custom Name"},
    digits: 0,
    from: nil,
    iso_digits: 0,
@@ -1264,11 +1264,11 @@ such as 0.05. Optional.

symbol: "XAE", tender: false, to: nil - }} -iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name") -{:error, "Required options are missing. Required options are [:name, :digits]"} -iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0) -{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}

+
}} +iex> MyApp.Cldr.Currency.new(:XAH, name: "Custom Name") +{:error, "Required options are missing. Required options are [:name, :digits]"} +iex> Plausible.Cldr.Currency.new(:XAE, name: "XAE", digits: 0) +{:error, {Cldr.CurrencyAlreadyDefined, "Currency :XAE is already defined."}}

@@ -1327,19 +1327,19 @@ default is Plaus
iex> Plausible.Cldr.Currency.pluralize 1, :USD
-{:ok, "US dollar"}
+{:ok, "US dollar"}
 
 iex> Plausible.Cldr.Currency.pluralize 3, :USD
-{:ok, "US dollars"}
+{:ok, "US dollars"}
 
 iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "zh"
-{:ok, "美元"}
+{:ok, "美元"}
 
 iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: "fr"
-{:ok, "dollars des États-Unis"}
+{:ok, "dollars des États-Unis"}
 
 iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: "fr"
-{:ok, "dollar des États-Unis"}
+{:ok, "dollar des États-Unis"}
@@ -1382,7 +1382,7 @@ or a
iex> MyApp.Cldr.Currency.strings_for_currency :AUD, "en"
-["a$", "australian dollars", "aud", "australian dollar"]
+["a$", "australian dollars", "aud", "australian dollar"]
diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html index a92c4d748..7ab30f0ee 100644 --- a/Plausible.Cldr.Locale.html +++ b/Plausible.Cldr.Locale.html @@ -13,7 +13,7 @@ - + @@ -297,16 +297,16 @@ this specific locale..

iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA") -{:ok, [:"fr-CA", :fr, :und]} +
iex> Plausible.Cldr.Locale.fallback_locale_names(:"fr-CA")
+{:ok, [:"fr-CA", :fr, :und]}
 
 # Fallbacks are typically formed by progressively
 # stripping variant, territory and script from the
 # given locale name. But not always - there are
 # certain fallbacks that take a different path.
 
-iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)
-{:ok, [:nb, :no, :und]}
+
iex> Plausible.Cldr.Locale.fallback_locale_names(:nb) +{:ok, [:nb, :no, :und]}
@@ -360,20 +360,20 @@ this specific locale.

Plausible.Cldr.Locale.fallback_locales(:"fr-CA") -=> {:ok, - [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>, - #Cldr.LanguageTag<und [validated]>]} +
Plausible.Cldr.Locale.fallback_locales(:"fr-CA")
+=> {:ok,
+     [#Cldr.LanguageTag<fr-CA [validated]>, #Cldr.LanguageTag<fr [validated]>,
+      #Cldr.LanguageTag<und [validated]>]}
 
 # Fallbacks are typically formed by progressively
 # stripping variant, territory and script from the
 # given locale name. But not always - there are
 # certain fallbacks that take a different path.
 
-Plausible.Cldr.Locale.fallback_locales(:nb))
-=> {:ok,
-     [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>,
-      #Cldr.LanguageTag<und [validated]>]}
+
Plausible.Cldr.Locale.fallback_locales(:nb)) +=> {:ok, + [#Cldr.LanguageTag<nb [validated]>, #Cldr.LanguageTag<no [validated]>, + #Cldr.LanguageTag<und [validated]>]}

@@ -504,15 +504,15 @@ generic top-level domain names.

iex> Plausible.Cldr.Locale.locale_from_host "a.b.com.au" -Elixir.Plausible.Cldr.validate_locale(:"en-AU") +Elixir.Plausible.Cldr.validate_locale(:"en-AU") -iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv") -{:error, - {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}} +iex> Plausible.Cldr.Locale.locale_from_host("a.b.com.tv") +{:error, + {Cldr.UnknownLocaleError, "No locale was identified for territory \"tv\""}} -iex> Plausible.Cldr.Locale.locale_from_host("a.b.com") -{:error, - {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}} +iex> Plausible.Cldr.Locale.locale_from_host("a.b.com") +{:error, + {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}

@@ -654,12 +654,12 @@ be a territory.

iex> Cldr.Locale.territory_from_host("a.b.com.au") -{:ok, :AU} +
iex> Cldr.Locale.territory_from_host("a.b.com.au")
+{:ok, :AU}
 
-iex> Cldr.Locale.territory_from_host("a.b.com")
-{:error,
- {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}
+
iex> Cldr.Locale.territory_from_host("a.b.com") +{:error, + {Cldr.UnknownLocaleError, "No locale was identified for territory \"com\""}}

diff --git a/Plausible.Cldr.Number.Cardinal.html b/Plausible.Cldr.Number.Cardinal.html index 08fa8699b..a30cfb999 100644 --- a/Plausible.Cldr.Number.Cardinal.html +++ b/Plausible.Cldr.Number.Cardinal.html @@ -13,7 +13,7 @@ - + @@ -426,31 +426,31 @@ The valid substitution keys are :zero, iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"} +
iex> Plausible.Cldr.Number.Cardinal.pluralize 1, "en", %{one: "one"}
 "one"
 
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one"}
 nil
 
-iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 2, "en", %{one: "one", two: "two", other: "other"}
 "other"
 
-iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 22, "en", %{one: "one", two: "two", other: "other"}
 "other"
 
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), "en", %{one: "one"}
 "one"
 
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one"}
 nil
 
-iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), "en", %{one: "one", two: "two"}
 nil
 
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
 "few"
 
-iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
 "other"
diff --git a/Plausible.Cldr.Number.Format.html b/Plausible.Cldr.Number.Format.html index 9b256b077..26287efc5 100644 --- a/Plausible.Cldr.Number.Format.html +++ b/Plausible.Cldr.Number.Format.html @@ -13,7 +13,7 @@ - + @@ -439,7 +439,7 @@ to precompile all the known formats at compile time.

#=> Plausible.Cldr.Number.Format.Format.decimal_format_list -["#", "#,##,##0%", +["#", "#,##,##0%", "#,##,##0.###", "#,##,##0.00¤", "#,##,##0.00¤;(#,##,##0.00¤)", "#,##,##0 %", "#,##0%", "#,##0.###", "#,##0.00 ¤", "#,##0.00 ¤;(#,##0.00 ¤)", "#,##0.00¤", "#,##0.00¤;(#,##0.00¤)", @@ -449,7 +449,7 @@ to precompile all the known formats at compile time.

"000 B ¤", "000 E ¤", "000 K ¤", "000 MRD ¤", "000 Md ¤", "000 Mio'.' ¤", "000 Mio ¤", "000 Mld ¤", "000 Mln ¤", "000 Mn ¤", "000 Mrd'.' ¤", "000 Mrd ¤", "000 Mr ¤", "000 M ¤", "000 NT ¤", "000 N ¤", "000 Tn ¤", -"000 Tr ¤", ...] +"000 Tr ¤", ...]
@@ -497,8 +497,8 @@ the known formats at compile time. Its use is not otherwise recommended.

-
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
-{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
+
iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)
+{:ok, ["#,##0%", "#,##0.###", "#,##0.00", "#,##0.00;(#,##0.00)","#E0",
  "0 billion", "0 million", "0 thousand",
  "0 trillion", "00 billion", "00 million", "00 thousand", "00 trillion",
  "000 billion", "000 million", "000 thousand", "000 trillion", "000B", "000K",
@@ -506,7 +506,7 @@ the known formats at compile time. Its use is not otherwise recommended.

"¤#,##0.00", "¤#,##0.00;(¤#,##0.00)", "¤000B", "¤000K", "¤000M", "¤000T", "¤00B", "¤00K", "¤00M", "¤00T", "¤0B", "¤0K", "¤0M", "¤0T", "¤ #,##0.00", "¤ #,##0.00;(¤ #,##0.00)", "¤ 000B", "¤ 000K", "¤ 000M", - "¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}

+
"¤ 000T", "¤ 00B", "¤ 00K", "¤ 00M", "¤ 00T", "¤ 0B", "¤ 0K", "¤ 0M", "¤ 0T"]}
@@ -559,8 +559,8 @@ is Plausible.Cld Examples

-
iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
-{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
+
iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)
+{:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}
@@ -612,8 +612,8 @@ is Plausible.Cld Examples

-
iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
-%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
+
iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)
+%{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}
@@ -670,18 +670,18 @@ by percent: "#,##0 %", scientific: "#E0", standard: "#,##0.###" - currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]}, - {"10000", [one: "00 k ¤", other: "00 k ¤"]}, - {"100000", [one: "000 k ¤", other: "000 k ¤"]}, - {"1000000", [one: "0 M ¤", other: "0 M ¤"]}, - {"10000000", [one: "00 M ¤", other: "00 M ¤"]}, - {"100000000", [one: "000 M ¤", other: "000 M ¤"]}, - {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]}, - {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]}, - {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]}, - {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]}, - {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]}, - {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}], + currency_short: [{"1000", [one: "0 k ¤", other: "0 k ¤"]}, + {"10000", [one: "00 k ¤", other: "00 k ¤"]}, + {"100000", [one: "000 k ¤", other: "000 k ¤"]}, + {"1000000", [one: "0 M ¤", other: "0 M ¤"]}, + {"10000000", [one: "00 M ¤", other: "00 M ¤"]}, + {"100000000", [one: "000 M ¤", other: "000 M ¤"]}, + {"1000000000", [one: "0 Md ¤", other: "0 Md ¤"]}, + {"10000000000", [one: "00 Md ¤", other: "00 Md ¤"]}, + {"100000000000", [one: "000 Md ¤", other: "000 Md ¤"]}, + {"1000000000000", [one: "0 Bn ¤", other: "0 Bn ¤"]}, + {"10000000000000", [one: "00 Bn ¤", other: "00 Bn ¤"]}, + {"100000000000000", [one: "000 Bn ¤", other: "000 Bn ¤"]}], ... }
@@ -772,8 +772,8 @@ is Plausible.Cld Examples

-
iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
-{:ok, 1}
+
iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for("en")
+{:ok, 1}
@@ -825,7 +825,7 @@ is Plausible.Cld Examples -
iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
+
iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!("en")
 1
diff --git a/Plausible.Cldr.Number.Formatter.Decimal.html b/Plausible.Cldr.Number.Formatter.Decimal.html index 157809e8b..81a67832a 100644 --- a/Plausible.Cldr.Number.Formatter.Decimal.html +++ b/Plausible.Cldr.Number.Formatter.Decimal.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Cldr.Number.Ordinal.html b/Plausible.Cldr.Number.Ordinal.html index 876186fb4..04cf007f7 100644 --- a/Plausible.Cldr.Number.Ordinal.html +++ b/Plausible.Cldr.Number.Ordinal.html @@ -13,7 +13,7 @@ - + @@ -429,31 +429,31 @@ The valid substitution keys are :zero, iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"} +
iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: "one"}
 "one"
 
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one"}
 nil
 
-iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: "one", two: "two"}
 "two"
 
-iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: "one", two: "two", other: "other"}
 "two"
 
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: "one"}
 "one"
 
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one"}
 nil
 
-iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: "one", two: "two"}
 "two"
 
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "ar", %{one: "one", few: "few", other: "other"}
 "other"
 
-iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
+iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, "en", %{one: "one", few: "few", other: "other"}
 "other"
diff --git a/Plausible.Cldr.Number.PluralRule.Range.html b/Plausible.Cldr.Number.PluralRule.Range.html index 5af035663..1c3ff570c 100644 --- a/Plausible.Cldr.Number.PluralRule.Range.html +++ b/Plausible.Cldr.Number.PluralRule.Range.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html index 4ae0bdf4b..b3f6e39ee 100644 --- a/Plausible.Cldr.Number.Symbol.html +++ b/Plausible.Cldr.Number.Symbol.html @@ -13,7 +13,7 @@ - + @@ -349,9 +349,9 @@ is Plausible.Cld Example: -
iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
-{:ok, %{
-   latn: %Cldr.Number.Symbol{
+
iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)
+{:ok, %{
+   latn: %Cldr.Number.Symbol{
      decimal: ".",
      exponential: "E",
      group: ",",
@@ -364,8 +364,8 @@ is Plausible.Cld
      plus_sign: "+",
      superscripting_exponent: "×",
      time_separator: ":"
-   },
-   thai: %Cldr.Number.Symbol{
+   },
+   thai: %Cldr.Number.Symbol{
      decimal: ".",
      exponential: "E",
      group: ",",
@@ -378,8 +378,8 @@ is Plausible.Cld
      plus_sign: "+",
      superscripting_exponent: "×",
      time_separator: ":"
-   }
- }}
+
} + }}
diff --git a/Plausible.Cldr.Number.System.html b/Plausible.Cldr.Number.System.html index 45da7de55..7069274d8 100644 --- a/Plausible.Cldr.Number.System.html +++ b/Plausible.Cldr.Number.System.html @@ -13,7 +13,7 @@ - + @@ -288,23 +288,23 @@ it is returned as is.

iex> Plausible.Cldr.Number.System.number_system_for "th", :latn -{:ok, %{digits: "0123456789", type: :numeric}} +{:ok, %{digits: "0123456789", type: :numeric}} iex> Plausible.Cldr.Number.System.number_system_for "en", :default -{:ok, %{digits: "0123456789", type: :numeric}} +{:ok, %{digits: "0123456789", type: :numeric}} iex> Plausible.Cldr.Number.System.number_system_for "he", :traditional -{:ok, %{rules: "hebrew", type: :algorithmic}} +{:ok, %{rules: "hebrew", type: :algorithmic}} iex> Plausible.Cldr.Number.System.number_system_for "en", :native -{:ok, %{digits: "0123456789", type: :numeric}} +{:ok, %{digits: "0123456789", type: :numeric}} iex> Plausible.Cldr.Number.System.number_system_for "en", :finance -{ +{ :error, - {Cldr.UnknownNumberSystemError, - "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"} -} + {Cldr.UnknownNumberSystemError, + "The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}"} +}

@@ -395,10 +395,10 @@ or a
iex> Plausible.Cldr.Number.System.number_system_names_for "en"
-{:ok, [:latn]}
+{:ok, [:latn]}
 
 iex> Plausible.Cldr.Number.System.number_system_names_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -480,13 +480,13 @@ or a
iex> Plausible.Cldr.Number.System.number_systems_for "en"
-{:ok, %{default: :latn, native: :latn}}
+{:ok, %{default: :latn, native: :latn}}
 
 iex> Plausible.Cldr.Number.System.number_systems_for "th"
-{:ok, %{default: :latn, native: :thai}}
+{:ok, %{default: :latn, native: :thai}}
 
 iex> Plausible.Cldr.Number.System.number_systems_for "zz"
-{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
+{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
@@ -584,20 +584,20 @@ actual system name.

ex> Plausible.Cldr.Number.System.system_name_from(:default, "en") -{:ok, :latn} +
ex> Plausible.Cldr.Number.System.system_name_from(:default, "en")
+{:ok, :latn}
 
-iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from("latn", "en")
+{:ok, :latn}
 
-iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
-{:ok, :latn}
+iex> Plausible.Cldr.Number.System.system_name_from(:native, "en")
+{:ok, :latn}
 
-iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
-{
+iex> Plausible.Cldr.Number.System.system_name_from(:nope, "en")
+{
   :error,
-  {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"}
-}

Note that return value is not guaranteed to be a valid + {Cldr.UnknownNumberSystemError, "The number system :nope is unknown"} +}

Note that return value is not guaranteed to be a valid number system for the given locale as demonstrated in the third example.

@@ -644,16 +644,16 @@ is recommended.

iex> Plausible.Cldr.Number.System.to_system 123456, :hebr -{:ok, "קכ״ג׳תנ״ו"} +{:ok, "קכ״ג׳תנ״ו"} iex> Plausible.Cldr.Number.System.to_system 123, :hans -{:ok, "一百二十三"} +{:ok, "一百二十三"} iex> Plausible.Cldr.Number.System.to_system 123, :hant -{:ok, "一百二十三"} +{:ok, "一百二十三"} iex> Plausible.Cldr.Number.System.to_system 123, :hansfin -{:ok, "壹佰贰拾叁"} +{:ok, "壹佰贰拾叁"}
diff --git a/Plausible.Cldr.Number.Transliterate.html b/Plausible.Cldr.Number.Transliterate.html index 006c84b11..939dc4369 100644 --- a/Plausible.Cldr.Number.Transliterate.html +++ b/Plausible.Cldr.Number.Transliterate.html @@ -13,7 +13,7 @@ - + @@ -133,12 +133,12 @@ digits between number systems. For example from :arabic to :latn. Since genera transliteration map is slow, pairs of transliterations can be configured so that the transliteration map is created at compile time and therefore speeding up transliteration at run time.

To configure these transliteration pairs, add the to the use Cldr configuration -in a backend module:

defmodule MyApp.Cldr do
+in a backend module:

defmodule MyApp.Cldr do
   use Cldr,
-  locale: ["en", "fr", "th"],
+  locale: ["en", "fr", "th"],
   default_locale: "en",
-  precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]
-end

Where each tuple in the list configures one transliteration map. In this example, two maps are + precompile_transliterations: [{:latn, :thai}, {:arab, :thai}] +end

Where each tuple in the list configures one transliteration map. In this example, two maps are configured: from :latn to :thai and from :arab to :thai.

A list of configurable number systems is returned by Cldr.Number.System.systems_with_digits/0.

If a transliteration is requested between two number pairs that have not been configured for precompilation, a warning is logged.

@@ -252,22 +252,22 @@ and

-
iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
+
iex> Plausible.Cldr.Number.Transliterate.transliterate("123556")
 "123556"
 
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123,556.000", "fr", :default)
 "123 556,000"
 
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :default)
 "123556"
 
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", "thai")
 "๑๒๓๕๕๖"
 
-iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
+iex> Plausible.Cldr.Number.Transliterate.transliterate("123556", "th", :native)
 "๑๒๓๕๕๖"
 
-iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
+iex> Plausible.Cldr.Number.Transliterate.transliterate("Some number is: 123556", "th", "thai")
 "Some number is: ๑๒๓๕๕๖"
diff --git a/Plausible.Cldr.Number.html b/Plausible.Cldr.Number.html index ac06fde8b..0fc43e265 100644 --- a/Plausible.Cldr.Number.html +++ b/Plausible.Cldr.Number.html @@ -13,7 +13,7 @@ - + @@ -412,19 +412,19 @@ using the Elixir standard library functions.

-
iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
-{:ok, 1000.34}
+
iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de")
+{:ok, 1000.34}
 
-iex> Plausible.Cldr.Number.parse("-1_000_000.34")
-{:ok, -1000000.34}
+iex> Plausible.Cldr.Number.parse("-1_000_000.34")
+{:ok, -1000000.34}
 
-iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
-{:ok, 1000}
+iex> Plausible.Cldr.Number.parse("1.000", locale: "de", number: :integer)
+{:ok, 1000}
 
-iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer)
-{:error,
-  {Cldr.Number.ParseError,
-   "The string \"+1.000,34\" could not be parsed as a number"}}
+
iex> Plausible.Cldr.Number.parse("+1.000,34", locale: "de", number: :integer) +{:error, + {Cldr.Number.ParseError, + "The string \"+1.000,34\" could not be parsed as a number"}}
@@ -496,17 +496,17 @@ financial instruments.

-
iex> Plausible.Cldr.Number.scan("100 US dollars")
+
iex> Plausible.Cldr.Number.scan("100 US dollars")
 ...> |> Plausible.Cldr.Number.resolve_currencies
-[100, :USD]
+[100, :USD]
 
-iex> Plausible.Cldr.Number.scan("100 eurosports")
-...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
-[100, :EUR]
+iex> Plausible.Cldr.Number.scan("100 eurosports")
+...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)
+[100, :EUR]
 
-iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis")
-...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr")
-[100, :USD]
+
iex> Plausible.Cldr.Number.scan("100 dollars des États-Unis") +...> |> Plausible.Cldr.Number.resolve_currencies(locale: "fr") +[100, :USD]
@@ -583,19 +583,19 @@ financial instruments.

iex> Plausible.Cldr.Number.resolve_currency("US dollars") -[:USD] +
iex> Plausible.Cldr.Number.resolve_currency("US dollars")
+[:USD]
 
-iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
-[:EUR]
+iex> Plausible.Cldr.Number.resolve_currency("100 eurosports", fuzzy: 0.75)
+[:EUR]
 
-iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
-[:USD]
+iex> Plausible.Cldr.Number.resolve_currency("dollars des États-Unis", locale: "fr")
+[:USD]
 
-iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr")
-{:error,
- {Cldr.UnknownCurrencyError,
-  "The currency \"not a known currency\" is unknown or not supported"}}
+
iex> Plausible.Cldr.Number.resolve_currency("not a known currency", locale: "fr") +{:error, + {Cldr.UnknownCurrencyError, + "The currency \"not a known currency\" is unknown or not supported"}}

@@ -659,13 +659,13 @@ The default is options[:backend].get_locale()
iex> Plausible.Cldr.Number.resolve_per "11%"
-["11", :percent]
+["11", :percent]
 
 iex> Plausible.Cldr.Number.resolve_per "% of linguists"
-[:percent, " of linguists"]
+[:percent, " of linguists"]
 
 iex> Plausible.Cldr.Number.resolve_per "% of linguists %"
-[:percent, " of linguists ", :percent]
+[:percent, " of linguists ", :percent]
@@ -722,9 +722,9 @@ The default is options[:backend].get_locale() -
iex> Plausible.Cldr.Number.scan("100%")
-...> |> Plausible.Cldr.Number.resolve_pers()
-[100, :percent]
+
iex> Plausible.Cldr.Number.scan("100%")
+...> |> Plausible.Cldr.Number.resolve_pers()
+[100, :percent]
@@ -784,20 +784,20 @@ and any options provided are passed to that function.

iex> Plausible.Cldr.Number.scan("£1_000_000.34") -["£", 1000000.34] +
iex> Plausible.Cldr.Number.scan("£1_000_000.34")
+["£", 1000000.34]
 
-iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
-["I want £", 1000000, " dollars"]
+iex> Plausible.Cldr.Number.scan("I want £1_000_000 dollars")
+["I want £", 1000000, " dollars"]
 
-iex> Plausible.Cldr.Number.scan("The prize is 23")
-["The prize is ", 23]
+iex> Plausible.Cldr.Number.scan("The prize is 23")
+["The prize is ", 23]
 
-iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
-["The lottery number is ", 23, " for the next draw"]
+iex> Plausible.Cldr.Number.scan("The lottery number is 23 for the next draw")
+["The lottery number is ", 23, " for the next draw"]
 
-iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer)
-["The loss is ", -1000, " euros"]
+
iex> Plausible.Cldr.Number.scan("The loss is -1.000 euros", locale: "de", number: :integer) +["The loss is ", -1000, " euros"]

@@ -844,7 +844,7 @@ options.

iex> Plausible.Cldr.Number.to_approx_string 1234 -{:ok, "~1,234"} +{:ok, "~1,234"}

@@ -891,7 +891,7 @@ options.

iex> Plausible.Cldr.Number.to_at_least_string 1234 -{:ok, "1,234+"} +{:ok, "1,234+"}

@@ -938,7 +938,7 @@ options.

iex> Plausible.Cldr.Number.to_at_most_string 1234 -{:ok, "≤1,234"} +{:ok, "≤1,234"}

@@ -985,7 +985,7 @@ options.

iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
@@ -1104,21 +1104,21 @@ extensions.

iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn +applied to the symbol than the number. For example:

iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
 ...>   string, :currency_symbol -> "<span class=\"symbol\">" <> string <> "</span>"
 ...>   string, :number -> "<span class=\"number\">" <> string <> "</span>"
 ...>   string, :currency_space -> "<span>" <> string <> "</span>"
 ...>   string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}

It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3 +...> end) +{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}

It is also possible and recommended to use the Phoenix.HTML.Tag.content_tag/3 function if wrapping HTML tags since these will ensure HTML entities are -correctly encoded. For example:

iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
-...>   string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
-...>   string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
-...>   string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
+correctly encoded.  For example:

iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn
+...>   string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: "symbol")
+...>   string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: "number")
+...>   string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)
 ...>   string, _other -> string
-...> end)
-{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}

When formatting a number the format is parsed into format elements that might include +...> end) +{:ok, "<span class=\"symbol\">$</span><span class=\"number\">100.00</span>"}

When formatting a number the format is parsed into format elements that might include a currency symbol, a literal string, inserted text between a currency symbol and the currency amount, a percent sign, the number itself and several other elements. In some cases it is helpful to be apply specific formatting to each element. @@ -1139,80 +1139,80 @@ inserted in the final formatted number.

iex> Plausible.Cldr.Number.to_string 12345 -{:ok, "12,345"} +{:ok, "12,345"} iex> Plausible.Cldr.Number.to_string 12345, locale: "fr" -{:ok, "12 345"} +{:ok, "12 345"} iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es", minimum_grouping_digits: 1 -{:ok, "1.345,32 €"} +{:ok, "1.345,32 €"} iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: "es" -{:ok, "1345,32 €"} +{:ok, "1345,32 €"} iex> Plausible.Cldr.Number.to_string 12345, locale: "fr", currency: "USD" -{:ok, "12 345,00 $US"} +{:ok, "12 345,00 $US"} iex> Plausible.Cldr.Number.to_string 12345, format: "#E0" -{:ok, "1.2345E4"} +{:ok, "1.2345E4"} iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB" -{:ok, "THB 12,345.00"} +{:ok, "THB 12,345.00"} iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: "THB" -{:ok, "(THB 12,345.00)"} +{:ok, "(THB 12,345.00)"} iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB", ...> locale: "th" -{:ok, "฿12,345.00"} +{:ok, "฿12,345.00"} iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: "THB", ...> locale: "th", number_system: :native -{:ok, "฿๑๒,๓๔๕.๐๐"} +{:ok, "฿๑๒,๓๔๕.๐๐"} iex> Plausible.Cldr.Number.to_string 1244.30, format: :long -{:ok, "1 thousand"} +{:ok, "1 thousand"} iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: "USD" -{:ok, "1,244 US dollars"} +{:ok, "1,244 US dollars"} iex> Plausible.Cldr.Number.to_string 1244.30, format: :short -{:ok, "1K"} +{:ok, "1K"} iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: "EUR" -{:ok, "€1K"} +{:ok, "€1K"} iex> Plausible.Cldr.Number.to_string 1234, format: :spellout -{:ok, "one thousand two hundred thirty-four"} +{:ok, "one thousand two hundred thirty-four"} iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose -{:ok, "one thousand two hundred and thirty-four"} +{:ok, "one thousand two hundred and thirty-four"} iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year -{:ok, "nineteen eighty-nine"} +{:ok, "nineteen eighty-nine"} iex> Plausible.Cldr.Number.to_string 123, format: :ordinal -{:ok, "123rd"} +{:ok, "123rd"} iex> Plausible.Cldr.Number.to_string 123, format: :roman -{:ok, "CXXIII"} +{:ok, "CXXIII"} iex> Plausible.Cldr.Number.to_string 123, locale: "th-u-nu-thai" -{:ok, "๑๒๓"}

+{:ok, "๑๒๓"}

Errors

An error tuple {:error, reason} will be returned if an error is detected. -The two most likely causes of an error return are:

  • A format cannot be compiled. In this case the error tuple will look like:
    iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
-    {:error, {Cldr.FormatCompileError,
-      "Decimal format compiler: syntax error before: \"#\""}}
  • The format style requested is not defined for the locale and +The two most likely causes of an error return are:

    • A format cannot be compiled. In this case the error tuple will look like:
        iex> Plausible.Cldr.Number.to_string(12345, format: "0#")
    +    {:error, {Cldr.FormatCompileError,
    +      "Decimal format compiler: syntax error before: \"#\""}}
    • The format style requested is not defined for the locale and number_system. This happens typically when the number system is :algorithmic rather than the more common :numeric. In this case the error -return looks like:
        iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
    -    {:error, {Cldr.UnknownFormatError,
    -      "The locale :he with number system :hebr does not define a format :standard"}}
    +return looks like:
    iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr")
+    {:error, {Cldr.UnknownFormatError,
+      "The locale :he with number system :hebr does not define a format :standard"}}
@@ -1316,17 +1316,17 @@ returned by iex> Plausible.Cldr.Number.validate_number_system "en", :latn -{:ok, :latn} +{:ok, :latn} iex> Plausible.Cldr.Number.validate_number_system "en", :default -{:ok, :latn} +{:ok, :latn} iex> Plausible.Cldr.Number.validate_number_system "en", :unknown -{:error, - {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}} +{:error, + {Cldr.UnknownNumberSystemError, "The number system :unknown is unknown"}} iex> Plausible.Cldr.Number.validate_number_system "zz", :default -{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}} +{:error, {Cldr.InvalidLanguageError, "The language \"zz\" is invalid"}}
diff --git a/Plausible.Cldr.Rbnf.NumberSystem.html b/Plausible.Cldr.Rbnf.NumberSystem.html index ca23ef72a..df851766e 100644 --- a/Plausible.Cldr.Rbnf.NumberSystem.html +++ b/Plausible.Cldr.Rbnf.NumberSystem.html @@ -13,7 +13,7 @@ - + @@ -116,9 +116,9 @@ Plausible

Functions to implement the number system rule-based-number-format rules of CLDR.

These rules are defined only on the "und" locale and represent specialised number formatting.

The standard public API for RBNF is via the Cldr.Number.to_string/2 function.

The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:

iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository.  Available rules are identified by:

iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)
+...> |> Enum.sort()
+[
   :armenian_lower,
   :armenian_upper,
   :cyrillic_lower,
@@ -132,9 +132,9 @@ defined in the Unicode CLDR data repository.  Available rules are identified by:
   :roman_upper,
   :tamil,
   :zz_default
-]

A rule can then be invoked on an available rule_set. For example

iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
-"CXXIII"

This particular call is equivalent to the call through the public API of:

iex> Plausible.Cldr.Number.to_string(123, format: :roman)
-{:ok, "CXXIII"}
+
]

A rule can then be invoked on an available rule_set. For example

iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)
+"CXXIII"

This particular call is equivalent to the call through the public API of:

iex> Plausible.Cldr.Number.to_string(123, format: :roman)
+{:ok, "CXXIII"}
diff --git a/Plausible.Cldr.Rbnf.Ordinal.html b/Plausible.Cldr.Rbnf.Ordinal.html index f15e295cd..f86e25bf9 100644 --- a/Plausible.Cldr.Rbnf.Ordinal.html +++ b/Plausible.Cldr.Rbnf.Ordinal.html @@ -13,7 +13,7 @@ - + @@ -116,20 +116,20 @@ Plausible

Functions to implement the ordinal rule-based-number-format rules of CLDR.

As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.

The standard public API for RBNF is via the Cldr.Number.to_string/2 function.

The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:

iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
-[:digits_ordinal]
+defined in the Unicode CLDR data repository.  Available rules are identified by:

iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)
+[:digits_ordinal]
 
-iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
-...> |> Enum.sort()
-[
+iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets("fr")
+...> |> Enum.sort()
+[
   :digits_ordinal,
   :digits_ordinal_feminine,
   :digits_ordinal_feminine_plural,
   :digits_ordinal_masculine,
   :digits_ordinal_masculine_plural
-]

A rule can then be invoked on an available rule_set. For example

iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
-"123rd"

This call is equivalent to the call through the public API of:

iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
-{:ok, "123rd"}
+
]

A rule can then be invoked on an available rule_set. For example

iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)
+"123rd"

This call is equivalent to the call through the public API of:

iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)
+{:ok, "123rd"}
diff --git a/Plausible.Cldr.Rbnf.Spellout.html b/Plausible.Cldr.Rbnf.Spellout.html index a07f33037..252f7bcde 100644 --- a/Plausible.Cldr.Rbnf.Spellout.html +++ b/Plausible.Cldr.Rbnf.Spellout.html @@ -13,7 +13,7 @@ - + @@ -116,9 +116,9 @@ Plausible

Functions to implement the spellout rule-based-number-format rules of CLDR.

As CLDR notes, the data is incomplete or non-existent for many languages. It is considered complete for English however.

The standard public API for RBNF is via the Cldr.Number.to_string/2 function.

The functions on this module are defined at compile time based upon the RBNF rules -defined in the Unicode CLDR data repository. Available rules are identified by:

iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
-...> |> Enum.sort()
-[
+defined in the Unicode CLDR data repository.  Available rules are identified by:

iex> Plausible.Cldr.Rbnf.Spellout.rule_sets("en")
+...> |> Enum.sort()
+[
   :spellout_cardinal,
   :spellout_cardinal_verbose,
   :spellout_numbering,
@@ -126,9 +126,9 @@ defined in the Unicode CLDR data repository.  Available rules are identified by:
   :spellout_numbering_year,
   :spellout_ordinal,
   :spellout_ordinal_verbose
-]

A rule can then be invoked on an available rule_set. For example:

iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
-"one hundred twenty-third"

This call is equivalent to the call through the public API of:

iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
-{:ok, "one hundred twenty-three"}
+
]

A rule can then be invoked on an available rule_set. For example:

iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, "en")
+"one hundred twenty-third"

This call is equivalent to the call through the public API of:

iex> Plausible.Cldr.Number.to_string(123, format: :spellout)
+{:ok, "one hundred twenty-three"}
diff --git a/Plausible.Cldr.html b/Plausible.Cldr.html index d50fc1b89..b2e151434 100644 --- a/Plausible.Cldr.html +++ b/Plausible.Cldr.html @@ -13,7 +13,7 @@ - + @@ -518,24 +518,24 @@ Functions Example -
iex> Plausible.Cldr.default_locale()
-%Cldr.LanguageTag{
+
iex> Plausible.Cldr.default_locale()
+%Cldr.LanguageTag{
   backend: Plausible.Cldr,
   canonical_locale_name: "en-001",
   cldr_locale_name: :"en-001",
-  language_subtags: [],
-  extensions: %{},
+  language_subtags: [],
+  extensions: %{},
   gettext_locale_name: "en",
   language: "en",
-  locale: %{},
-  private_use: [],
+  locale: %{},
+  private_use: [],
   rbnf_locale_name: :en,
   requested_locale_name: "en-001",
   script: :Latn,
   territory: :"001",
-  transform: %{},
-  language_variants: []
-}
+
transform: %{}, + language_variants: [] +}
@@ -570,7 +570,7 @@ does not specify one and none can be inferred.

iex> Plausible.Cldr.default_territory() +
iex> Plausible.Cldr.default_territory()
 :"001"

@@ -633,13 +633,13 @@ is inserted between words or sentences. The valid options are
iex> Plausible.Cldr.ellipsis "And furthermore"
 "And furthermore…"
 
-iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja
+iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja
 "And furthermore…there is much to be done"
 
 iex> Plausible.Cldr.ellipsis "And furthermore", format: :word
 "And furthermore …"
 
-iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja, format: :word
+iex> Plausible.Cldr.ellipsis ["And furthermore", "there is much to be done"], locale: :ja, format: :word
 "And furthermore … there is much to be done"
@@ -675,23 +675,23 @@ take an optional locale parameter for which a locale is not supplied.

-
iex> Plausible.Cldr.put_locale("pl")
+
iex> Plausible.Cldr.put_locale("pl")
 iex> Plausible.Cldr.get_locale
-%Cldr.LanguageTag{
+%Cldr.LanguageTag{
    backend: Elixir.Plausible.Cldr,
    canonical_locale_name: "pl",
    cldr_locale_name: :pl,
-   extensions: %{},
+   extensions: %{},
    language: "pl",
-   locale: %{},
-   private_use: [],
+   locale: %{},
+   private_use: [],
    rbnf_locale_name: :pl,
    territory: :PL,
    requested_locale_name: "pl",
    script: :Latn,
-   transform: %{},
-   language_variants: []
- }
+
transform: %{}, + language_variants: [] + }
@@ -824,10 +824,10 @@ name is configured and available in Gettext.

iex> Plausible.Cldr.known_gettext_locale_name?("en") +
iex> Plausible.Cldr.known_gettext_locale_name?("en")
 true
 
-iex> Plausible.Cldr.known_gettext_locale_name?("!!")
+iex> Plausible.Cldr.known_gettext_locale_name?("!!")
 false

@@ -946,10 +946,10 @@ name is configured and available in Cldr.

iex> Plausible.Cldr.known_locale_name?(:en) +
iex> Plausible.Cldr.known_locale_name?(:en)
 true
 
-iex> Plausible.Cldr.known_locale_name?(:"!!")
+iex> Plausible.Cldr.known_locale_name?(:"!!")
 false
@@ -1004,7 +1004,7 @@ in this module or in

iex> Plausible.Cldr.known_number_system_types
-[:default, :finance, :native, :traditional]
+[:default, :finance, :native, :traditional]
@@ -1115,10 +1115,10 @@ rules based number formats (RBNF).

iex> Plausible.Cldr.known_rbnf_locale_name?(:en) +
iex> Plausible.Cldr.known_rbnf_locale_name?(:en)
 true
 
-iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
+iex> Plausible.Cldr.known_rbnf_locale_name?(:"!!")
 false

@@ -1239,29 +1239,29 @@ of a language tag.

Examples

-
iex> Plausible.Cldr.put_locale("en")
-{:ok,
- %Cldr.LanguageTag{
+
iex> Plausible.Cldr.put_locale("en")
+{:ok,
+ %Cldr.LanguageTag{
    backend: Plausible.Cldr,
    canonical_locale_name: "en",
    cldr_locale_name: :en,
-   language_subtags: [],
-   extensions: %{},
+   language_subtags: [],
+   extensions: %{},
    gettext_locale_name: "en",
    language: "en",
-   locale: %{},
-   private_use: [],
+   locale: %{},
+   private_use: [],
    rbnf_locale_name: :en,
    requested_locale_name: "en",
    script: :Latn,
    territory: :US,
-   transform: %{},
-   language_variants: []
- }}
+   transform: %{},
+   language_variants: []
+ }}
 
-iex> Plausible.Cldr.put_locale("invalid-locale!")
-{:error, {Cldr.LanguageTag.ParseError,
-  "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
+
iex> Plausible.Cldr.put_locale("invalid-locale!") +{:error, {Cldr.LanguageTag.ParseError, + "Expected a BCP47 language tag. Could not parse the remaining \"!\" starting at position 15"}}
@@ -1444,47 +1444,47 @@ of a language tag.

iex> Plausible.Cldr.validate_locale(:en) -{:ok, -%Cldr.LanguageTag{ +
iex> Plausible.Cldr.validate_locale(:en)
+{:ok,
+%Cldr.LanguageTag{
   backend: Plausible.Cldr,
   canonical_locale_name: "en",
   cldr_locale_name: :en,
-  extensions: %{},
+  extensions: %{},
   gettext_locale_name: "en",
   language: "en",
-  locale: %{},
-  private_use: [],
+  locale: %{},
+  private_use: [],
   rbnf_locale_name: :en,
   requested_locale_name: "en",
   script: :Latn,
   territory: :US,
-  transform: %{},
-  language_variants: []
-}}
+  transform: %{},
+  language_variants: []
+}}
 
 
-iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
-{:ok,
-%Cldr.LanguageTag{
+iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()
+{:ok,
+%Cldr.LanguageTag{
   backend: Plausible.Cldr,
   canonical_locale_name: "en-001",
   cldr_locale_name: :"en-001",
-  extensions: %{},
+  extensions: %{},
   gettext_locale_name: "en",
   language: "en",
-  locale: %{},
-  private_use: [],
+  locale: %{},
+  private_use: [],
   rbnf_locale_name: :en,
   requested_locale_name: "en-001",
   script: :Latn,
   territory: :"001",
-  transform: %{},
-  language_variants: []
-}}
+  transform: %{},
+  language_variants: []
+}}
 
-iex> Plausible.Cldr.validate_locale("zzz")
-{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}
+
iex> Plausible.Cldr.validate_locale("zzz") +{:error, {Cldr.InvalidLanguageError, "The language \"zzz\" is invalid"}}

@@ -1555,22 +1555,22 @@ of a language tag.

iex> Plausible.Cldr.validate_number_system_type :default -{:ok, :default} +{:ok, :default} iex> Plausible.Cldr.validate_number_system_type :traditional -{:ok, :traditional} +{:ok, :traditional} iex> Plausible.Cldr.validate_number_system_type :latn -{ +{ :error, - {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"} -} + {Cldr.UnknownNumberSystemTypeError, "The number system type :latn is unknown"} +} iex> Plausible.Cldr.validate_number_system_type "bork" -{ +{ :error, - {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"} -} + {Cldr.UnknownNumberSystemTypeError, "The number system type \"bork\" is invalid"} +}

diff --git a/Plausible.ClickhouseEventV2.html b/Plausible.ClickhouseEventV2.html index d13e68612..1a23b9ff0 100644 --- a/Plausible.ClickhouseEventV2.html +++ b/Plausible.ClickhouseEventV2.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html index 0eb56fab3..6be735dff 100644 --- a/Plausible.ClickhouseRepo.html +++ b/Plausible.ClickhouseRepo.html @@ -13,7 +13,7 @@ - + @@ -816,23 +816,23 @@ pool to disconnect within the given interval.

See -

Similar to insert_all/2 but with the following differences:

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+

Similar to insert_all/2 but with the following differences:

  • accepts rows as streams or lists
  • sends rows as a chunked request
  • doesn't autogenerate ids or does any other preprocessing

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
 
-defmodule Demo do
+defmodule Demo do
   use Ecto.Schema
 
   @primary_key false
-  schema "ecto_ch_demo" do
+  schema "ecto_ch_demo" do
     field :a, Ch, type: "UInt64"
     field :b, :string
-  end
-end
+  end
+end
 
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
 
 # schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+
{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.ClickhouseSessionV2.BoolUInt8.html b/Plausible.ClickhouseSessionV2.BoolUInt8.html index e876d8edf..7c7e60710 100644 --- a/Plausible.ClickhouseSessionV2.BoolUInt8.html +++ b/Plausible.ClickhouseSessionV2.BoolUInt8.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ClickhouseSessionV2.html b/Plausible.ClickhouseSessionV2.html index de143baf6..23792eff3 100644 --- a/Plausible.ClickhouseSessionV2.html +++ b/Plausible.ClickhouseSessionV2.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html index 8d7e9cb0e..47d081e8a 100644 --- a/Plausible.ConfigHelpers.html +++ b/Plausible.ConfigHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html index 466197795..160a7dfc0 100644 --- a/Plausible.DataCase.html +++ b/Plausible.DataCase.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.DataMigration.NumericIDs.html b/Plausible.DataMigration.NumericIDs.html index abde8e0a2..69be658a3 100644 --- a/Plausible.DataMigration.NumericIDs.html +++ b/Plausible.DataMigration.NumericIDs.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html index 99e2ba264..348644084 100644 --- a/Plausible.DataMigration.Repo.html +++ b/Plausible.DataMigration.Repo.html @@ -13,7 +13,7 @@ - + @@ -1123,23 +1123,23 @@ pool to disconnect within the given interval.

See -

Similar to insert_all/2 but with the following differences:

  • accepts rows as streams or lists
  • sends rows as a chunked request
  • doesn't autogenerate ids or does any other preprocessing

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+

Similar to insert_all/2 but with the following differences:

  • accepts rows as streams or lists
  • sends rows as a chunked request
  • doesn't autogenerate ids or does any other preprocessing

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
 
-defmodule Demo do
+defmodule Demo do
   use Ecto.Schema
 
   @primary_key false
-  schema "ecto_ch_demo" do
+  schema "ecto_ch_demo" do
     field :a, Ch, type: "UInt64"
     field :b, :string
-  end
-end
+  end
+end
 
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
 
 # schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+
{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.DataMigration.html b/Plausible.DataMigration.html index a543eb74d..cc0403e37 100644 --- a/Plausible.DataMigration.html +++ b/Plausible.DataMigration.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html index 1e4f16ba7..11fec1ac0 100644 --- a/Plausible.DebugReplayInfo.html +++ b/Plausible.DebugReplayInfo.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ecto.EventName.html b/Plausible.Ecto.EventName.html index 9f45a7d0d..3e134a5a9 100644 --- a/Plausible.Ecto.EventName.html +++ b/Plausible.Ecto.EventName.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Factory.html b/Plausible.Factory.html index 09f3ba486..653cdb6b5 100644 --- a/Plausible.Factory.html +++ b/Plausible.Factory.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html index 85a23ec2f..41ec39de8 100644 --- a/Plausible.Funnel.Const.html +++ b/Plausible.Funnel.Const.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Funnel.Step.html b/Plausible.Funnel.Step.html index 670cb3b8f..9cf4668ee 100644 --- a/Plausible.Funnel.Step.html +++ b/Plausible.Funnel.Step.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Funnel.html b/Plausible.Funnel.html index 770ab0074..3584f02ea 100644 --- a/Plausible.Funnel.html +++ b/Plausible.Funnel.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html index 87cd2391a..219643d57 100644 --- a/Plausible.Funnels.html +++ b/Plausible.Funnels.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Geo.html b/Plausible.Geo.html index b7c9aa758..6ac043eb5 100644 --- a/Plausible.Geo.html +++ b/Plausible.Geo.html @@ -13,7 +13,7 @@ - + @@ -231,8 +231,8 @@ Functions Examples -

In the case of a DB-IP database:

iex> database_type()
-"DBIP-City-Lite"

In the case of a MaxMind database:

iex> database_type()
+

In the case of a DB-IP database:

iex> database_type()
+"DBIP-City-Lite"

In the case of a MaxMind database:

iex> database_type()
 "GeoLite2-City"
@@ -272,8 +272,8 @@ asynchronously.

-

Loading from a local file:

iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
-:ok

Downloading a MaxMind DB (this license key is no longer active):

iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
+

Loading from a local file:

iex> load_db(path: "/etc/plausible/dbip-city.mmdb")
+:ok

Downloading a MaxMind DB (this license key is no longer active):

iex> load_db(license_key: "LNpsJCCKPis6XvBP", edition: "GeoLite2-City", async: true)
 :ok
@@ -302,21 +302,21 @@ asynchronously.

-
iex> lookup("8.7.6.5")
-%{
-  "city" => %{
+
iex> lookup("8.7.6.5")
+%{
+  "city" => %{
     "geoname_id" => 5349755,
-    "names" => %{
+    "names" => %{
       "de" => "Fontana",
       "en" => "Fontana",
       "ja" => "フォンタナ",
       "ru" => "Фонтана"
-    }
-  },
-  "continent" => %{
+    }
+  },
+  "continent" => %{
     "code" => "NA",
     "geoname_id" => 6255149,
-    "names" => %{
+    "names" => %{
       "de" => "Nordamerika",
       "en" => "North America",
       "es" => "Norteamérica",
@@ -325,12 +325,12 @@ asynchronously.

"pt-BR" => "América do Norte", "ru" => "Северная Америка", "zh-CN" => "北美洲" - } - }, - "country" => %{ + } + }, + "country" => %{ "geoname_id" => 6252001, "iso_code" => "US", - "names" => %{ + "names" => %{ "de" => "Vereinigte Staaten", "en" => "United States", "es" => "Estados Unidos", @@ -339,20 +339,20 @@ asynchronously.

"pt-BR" => "EUA", "ru" => "США", "zh-CN" => "美国" - } - }, - "location" => %{ + } + }, + "location" => %{ "accuracy_radius" => 50, "latitude" => 34.1211, "longitude" => -117.4362, "metro_code" => 803, "time_zone" => "America/Los_Angeles" - }, - "postal" => %{"code" => "92336"}, - "registered_country" => %{ + }, + "postal" => %{"code" => "92336"}, + "registered_country" => %{ "geoname_id" => 6252001, "iso_code" => "US", - "names" => %{ + "names" => %{ "de" => "Vereinigte Staaten", "en" => "United States", "es" => "Estados Unidos", @@ -361,13 +361,13 @@ asynchronously.

"pt-BR" => "EUA", "ru" => "США", "zh-CN" => "美国" - } - }, - "subdivisions" => [ - %{ + } + }, + "subdivisions" => [ + %{ "geoname_id" => 5332921, "iso_code" => "CA", - "names" => %{ + "names" => %{ "de" => "Kalifornien", "en" => "California", "es" => "California", @@ -376,10 +376,10 @@ asynchronously.

"pt-BR" => "Califórnia", "ru" => "Калифорния", "zh-CN" => "加州" - } - } - ] -}

+
} + } + ] +}
diff --git a/Plausible.Goal.Revenue.html b/Plausible.Goal.Revenue.html index 38aa988b4..3891fc5a3 100644 --- a/Plausible.Goal.Revenue.html +++ b/Plausible.Goal.Revenue.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Goal.html b/Plausible.Goal.html index af194308a..4e461989f 100644 --- a/Plausible.Goal.html +++ b/Plausible.Goal.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Goals.html b/Plausible.Goals.html index fbef54e3e..677aa190a 100644 --- a/Plausible.Goals.html +++ b/Plausible.Goals.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.Api.Mock.html b/Plausible.Google.Api.Mock.html index 65750a456..e24666f39 100644 --- a/Plausible.Google.Api.Mock.html +++ b/Plausible.Google.Api.Mock.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.Api.html b/Plausible.Google.Api.html index 760fa977c..f533bd2ab 100644 --- a/Plausible.Google.Api.html +++ b/Plausible.Google.Api.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.Buffer.html b/Plausible.Google.Buffer.html index 00699f1f5..047b6305d 100644 --- a/Plausible.Google.Buffer.html +++ b/Plausible.Google.Buffer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html index 8a0528c86..a4eb1c262 100644 --- a/Plausible.Google.HTTP.html +++ b/Plausible.Google.HTTP.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Google.ReportRequest.html b/Plausible.Google.ReportRequest.html index b0283c5f8..bfaf597f0 100644 --- a/Plausible.Google.ReportRequest.html +++ b/Plausible.Google.ReportRequest.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html index ed5170ee5..bdcf1ca8a 100644 --- a/Plausible.HTTPClient.Interface.html +++ b/Plausible.HTTPClient.Interface.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.HTTPClient.Non200Error.html b/Plausible.HTTPClient.Non200Error.html index 9db977fcc..c30da0168 100644 --- a/Plausible.HTTPClient.Non200Error.html +++ b/Plausible.HTTPClient.Non200Error.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.HTTPClient.html b/Plausible.HTTPClient.html index 69a21ae71..dfbf6092f 100644 --- a/Plausible.HTTPClient.html +++ b/Plausible.HTTPClient.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Helpers.JSON.html b/Plausible.Helpers.JSON.html index f07c660fe..602ce7b94 100644 --- a/Plausible.Helpers.JSON.html +++ b/Plausible.Helpers.JSON.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html index 428388b00..1b254c465 100644 --- a/Plausible.ImportDeletionRepo.html +++ b/Plausible.ImportDeletionRepo.html @@ -13,7 +13,7 @@ - + @@ -1114,23 +1114,23 @@ pool to disconnect within the given interval.

See -

Similar to insert_all/2 but with the following differences:

  • accepts rows as streams or lists
  • sends rows as a chunked request
  • doesn't autogenerate ids or does any other preprocessing

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+

Similar to insert_all/2 but with the following differences:

  • accepts rows as streams or lists
  • sends rows as a chunked request
  • doesn't autogenerate ids or does any other preprocessing

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
 
-defmodule Demo do
+defmodule Demo do
   use Ecto.Schema
 
   @primary_key false
-  schema "ecto_ch_demo" do
+  schema "ecto_ch_demo" do
     field :a, Ch, type: "UInt64"
     field :b, :string
-  end
-end
+  end
+end
 
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
 
 # schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+
{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Imported.html b/Plausible.Imported.html index accc4c508..b7f205f38 100644 --- a/Plausible.Imported.html +++ b/Plausible.Imported.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html index 5a2bd3d69..f93b8e403 100644 --- a/Plausible.IngestRepo.html +++ b/Plausible.IngestRepo.html @@ -13,7 +13,7 @@ - + @@ -1114,23 +1114,23 @@ pool to disconnect within the given interval.

See -

Similar to insert_all/2 but with the following differences:

  • accepts rows as streams or lists
  • sends rows as a chunked request
  • doesn't autogenerate ids or does any other preprocessing

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
+

Similar to insert_all/2 but with the following differences:

  • accepts rows as streams or lists
  • sends rows as a chunked request
  • doesn't autogenerate ids or does any other preprocessing

Example:

Repo.query!("create table ecto_ch_demo(a UInt64, b String) engine Null")
 
-defmodule Demo do
+defmodule Demo do
   use Ecto.Schema
 
   @primary_key false
-  schema "ecto_ch_demo" do
+  schema "ecto_ch_demo" do
     field :a, Ch, type: "UInt64"
     field :b, :string
-  end
-end
+  end
+end
 
-rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
-{100_000, nil} = Repo.insert_stream(Demo, rows)
+rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)
+{100_000, nil} = Repo.insert_stream(Demo, rows)
 
 # schemaless
-{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
+
{100_000, nil} = Repo.insert_stream("ecto_ch_demo", rows, types: [a: Ch.Types.u64(), b: :string])
diff --git a/Plausible.Ingestion.Counters.Buffer.html b/Plausible.Ingestion.Counters.Buffer.html index 1c2860c9a..0f2d898c1 100644 --- a/Plausible.Ingestion.Counters.Buffer.html +++ b/Plausible.Ingestion.Counters.Buffer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Counters.Record.html b/Plausible.Ingestion.Counters.Record.html index 777cf0570..6a21fe646 100644 --- a/Plausible.Ingestion.Counters.Record.html +++ b/Plausible.Ingestion.Counters.Record.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Counters.TelemetryHandler.html b/Plausible.Ingestion.Counters.TelemetryHandler.html index c8c59b183..72bc3fc03 100644 --- a/Plausible.Ingestion.Counters.TelemetryHandler.html +++ b/Plausible.Ingestion.Counters.TelemetryHandler.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Counters.html b/Plausible.Ingestion.Counters.html index 6cecb1584..786b78148 100644 --- a/Plausible.Ingestion.Counters.html +++ b/Plausible.Ingestion.Counters.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Event.Revenue.html b/Plausible.Ingestion.Event.Revenue.html index da48bb451..3d48bdc35 100644 --- a/Plausible.Ingestion.Event.Revenue.html +++ b/Plausible.Ingestion.Event.Revenue.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Event.html b/Plausible.Ingestion.Event.html index 82deeefa7..3e62ba3f1 100644 --- a/Plausible.Ingestion.Event.html +++ b/Plausible.Ingestion.Event.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html index 0715d7510..73836ea0a 100644 --- a/Plausible.Ingestion.Request.Revenue.html +++ b/Plausible.Ingestion.Request.Revenue.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Ingestion.Request.html b/Plausible.Ingestion.Request.html index 89653395c..94b6508a0 100644 --- a/Plausible.Ingestion.Request.html +++ b/Plausible.Ingestion.Request.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html index 7b00caa4b..4cea73fe4 100644 --- a/Plausible.Mailer.html +++ b/Plausible.Mailer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.OpenTelemetry.Sampler.html b/Plausible.OpenTelemetry.Sampler.html index 3934220b9..bf76e7bd5 100644 --- a/Plausible.OpenTelemetry.Sampler.html +++ b/Plausible.OpenTelemetry.Sampler.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.PaddleApi.Mock.html b/Plausible.PaddleApi.Mock.html index 41d84c215..4c5c61dde 100644 --- a/Plausible.PaddleApi.Mock.html +++ b/Plausible.PaddleApi.Mock.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Pagination.html b/Plausible.Pagination.html index 1f3a5d8b6..b6a53b136 100644 --- a/Plausible.Pagination.html +++ b/Plausible.Pagination.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Plugins.API.CustomProps.html b/Plausible.Plugins.API.CustomProps.html index d7661cd30..25db7cf02 100644 --- a/Plausible.Plugins.API.CustomProps.html +++ b/Plausible.Plugins.API.CustomProps.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Plugins.API.Goals.html b/Plausible.Plugins.API.Goals.html index 2896ba3a9..8dcf22fc1 100644 --- a/Plausible.Plugins.API.Goals.html +++ b/Plausible.Plugins.API.Goals.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Plugins.API.SharedLinks.html b/Plausible.Plugins.API.SharedLinks.html index d067537ab..07dd8f3a6 100644 --- a/Plausible.Plugins.API.SharedLinks.html +++ b/Plausible.Plugins.API.SharedLinks.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Plugins.API.Token.html b/Plausible.Plugins.API.Token.html index fb6d7e81a..4d624fcb9 100644 --- a/Plausible.Plugins.API.Token.html +++ b/Plausible.Plugins.API.Token.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Plugins.API.Tokens.html b/Plausible.Plugins.API.Tokens.html index ff40a7875..d1099ac28 100644 --- a/Plausible.Plugins.API.Tokens.html +++ b/Plausible.Plugins.API.Tokens.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.PromEx.Plugins.PlausibleMetrics.html b/Plausible.PromEx.Plugins.PlausibleMetrics.html index 6417ff3f0..5535722ed 100644 --- a/Plausible.PromEx.Plugins.PlausibleMetrics.html +++ b/Plausible.PromEx.Plugins.PlausibleMetrics.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.PromEx.html b/Plausible.PromEx.html index 0770470f1..17794a81b 100644 --- a/Plausible.PromEx.html +++ b/Plausible.PromEx.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Props.html b/Plausible.Props.html index 11bda5f74..74b89679b 100644 --- a/Plausible.Props.html +++ b/Plausible.Props.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Purge.html b/Plausible.Purge.html index 5521f8400..3f61c7699 100644 --- a/Plausible.Purge.html +++ b/Plausible.Purge.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html index 3d92961c9..9e8929208 100644 --- a/Plausible.RateLimit.html +++ b/Plausible.RateLimit.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Release.html b/Plausible.Release.html index d3b98700a..25ea8b0dc 100644 --- a/Plausible.Release.html +++ b/Plausible.Release.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Repo.html b/Plausible.Repo.html index 2b5788c8a..e75d4bffb 100644 --- a/Plausible.Repo.html +++ b/Plausible.Repo.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html index 43014811b..b5d36ac05 100644 --- a/Plausible.Sentry.Client.html +++ b/Plausible.Sentry.Client.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.SentryFilter.html b/Plausible.SentryFilter.html index 023867a20..5d464a3e1 100644 --- a/Plausible.SentryFilter.html +++ b/Plausible.SentryFilter.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Session.CacheStore.html b/Plausible.Session.CacheStore.html index 91701c85a..7458ed9ee 100644 --- a/Plausible.Session.CacheStore.html +++ b/Plausible.Session.CacheStore.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Session.Salts.html b/Plausible.Session.Salts.html index 419b0f102..c9fa49343 100644 --- a/Plausible.Session.Salts.html +++ b/Plausible.Session.Salts.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Cache.Warmer.All.html b/Plausible.Site.Cache.Warmer.All.html index e2263ab61..fa3608545 100644 --- a/Plausible.Site.Cache.Warmer.All.html +++ b/Plausible.Site.Cache.Warmer.All.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Cache.Warmer.RecentlyUpdated.html b/Plausible.Site.Cache.Warmer.RecentlyUpdated.html index c22168908..402850248 100644 --- a/Plausible.Site.Cache.Warmer.RecentlyUpdated.html +++ b/Plausible.Site.Cache.Warmer.RecentlyUpdated.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Cache.Warmer.html b/Plausible.Site.Cache.Warmer.html index e67a7fa54..4c62eef05 100644 --- a/Plausible.Site.Cache.Warmer.html +++ b/Plausible.Site.Cache.Warmer.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Cache.html b/Plausible.Site.Cache.html index 5bd305a68..1ff9a0564 100644 --- a/Plausible.Site.Cache.html +++ b/Plausible.Site.Cache.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Domain.html b/Plausible.Site.Domain.html index 223152f38..7a51688c3 100644 --- a/Plausible.Site.Domain.html +++ b/Plausible.Site.Domain.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.GateKeeper.html b/Plausible.Site.GateKeeper.html index 6fe669792..535de9aa3 100644 --- a/Plausible.Site.GateKeeper.html +++ b/Plausible.Site.GateKeeper.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.GoogleAuth.html b/Plausible.Site.GoogleAuth.html index 391f2f50e..0dee11dee 100644 --- a/Plausible.Site.GoogleAuth.html +++ b/Plausible.Site.GoogleAuth.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.ImportedData.html b/Plausible.Site.ImportedData.html index 2c5357c2d..7a0ca5846 100644 --- a/Plausible.Site.ImportedData.html +++ b/Plausible.Site.ImportedData.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Membership.html b/Plausible.Site.Membership.html index ee11fb90f..3182da349 100644 --- a/Plausible.Site.Membership.html +++ b/Plausible.Site.Membership.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Memberships.AcceptInvitation.html b/Plausible.Site.Memberships.AcceptInvitation.html index e933cc1b5..2277dab67 100644 --- a/Plausible.Site.Memberships.AcceptInvitation.html +++ b/Plausible.Site.Memberships.AcceptInvitation.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Memberships.CreateInvitation.html b/Plausible.Site.Memberships.CreateInvitation.html index d039e7c9d..3c4eb9bc2 100644 --- a/Plausible.Site.Memberships.CreateInvitation.html +++ b/Plausible.Site.Memberships.CreateInvitation.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Memberships.RejectInvitation.html b/Plausible.Site.Memberships.RejectInvitation.html index cb7f37c20..fab44e28d 100644 --- a/Plausible.Site.Memberships.RejectInvitation.html +++ b/Plausible.Site.Memberships.RejectInvitation.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Memberships.RemoveInvitation.html b/Plausible.Site.Memberships.RemoveInvitation.html index 05f9c4dbe..fb892803d 100644 --- a/Plausible.Site.Memberships.RemoveInvitation.html +++ b/Plausible.Site.Memberships.RemoveInvitation.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Memberships.html b/Plausible.Site.Memberships.html index 031ead9e3..c02ca28a3 100644 --- a/Plausible.Site.Memberships.html +++ b/Plausible.Site.Memberships.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.MonthlyReport.html b/Plausible.Site.MonthlyReport.html index 17ba818d6..e1d6a70b2 100644 --- a/Plausible.Site.MonthlyReport.html +++ b/Plausible.Site.MonthlyReport.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.Removal.html b/Plausible.Site.Removal.html index 4d851adb8..2e8c01bdd 100644 --- a/Plausible.Site.Removal.html +++ b/Plausible.Site.Removal.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.SharedLink.html b/Plausible.Site.SharedLink.html index 699b2649a..542213440 100644 --- a/Plausible.Site.SharedLink.html +++ b/Plausible.Site.SharedLink.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.SpikeNotification.html b/Plausible.Site.SpikeNotification.html index c0dd5065b..774e4b7e9 100644 --- a/Plausible.Site.SpikeNotification.html +++ b/Plausible.Site.SpikeNotification.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.UserPreference.html b/Plausible.Site.UserPreference.html index f8dd1e249..302d5e922 100644 --- a/Plausible.Site.UserPreference.html +++ b/Plausible.Site.UserPreference.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.WeeklyReport.html b/Plausible.Site.WeeklyReport.html index b3b316566..6fa074124 100644 --- a/Plausible.Site.WeeklyReport.html +++ b/Plausible.Site.WeeklyReport.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Site.html b/Plausible.Site.html index 4aa67b659..bac987219 100644 --- a/Plausible.Site.html +++ b/Plausible.Site.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html index 25f06d023..22eda83b5 100644 --- a/Plausible.SiteAdmin.html +++ b/Plausible.SiteAdmin.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Sites.html b/Plausible.Sites.html index 21a158408..d002aaa03 100644 --- a/Plausible.Sites.html +++ b/Plausible.Sites.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html index f5cefe8a3..7b6ee446b 100644 --- a/Plausible.Stats.Aggregate.html +++ b/Plausible.Stats.Aggregate.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Base.html b/Plausible.Stats.Base.html index 65d61438d..1f862d875 100644 --- a/Plausible.Stats.Base.html +++ b/Plausible.Stats.Base.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Breakdown.html b/Plausible.Stats.Breakdown.html index 8197ad8d2..673b034ae 100644 --- a/Plausible.Stats.Breakdown.html +++ b/Plausible.Stats.Breakdown.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html index fa5978e0f..e7c3c076c 100644 --- a/Plausible.Stats.Clickhouse.html +++ b/Plausible.Stats.Clickhouse.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html index 6f18b699a..4630ebf6b 100644 --- a/Plausible.Stats.Compare.html +++ b/Plausible.Stats.Compare.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Comparisons.html b/Plausible.Stats.Comparisons.html index 6caa69394..9a6f599e7 100644 --- a/Plausible.Stats.Comparisons.html +++ b/Plausible.Stats.Comparisons.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.CurrentVisitors.html b/Plausible.Stats.CurrentVisitors.html index 2ffad73ff..175cc0a6f 100644 --- a/Plausible.Stats.CurrentVisitors.html +++ b/Plausible.Stats.CurrentVisitors.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.CustomProps.html b/Plausible.Stats.CustomProps.html index b375c1dfd..a268e6ab6 100644 --- a/Plausible.Stats.CustomProps.html +++ b/Plausible.Stats.CustomProps.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.EmailReport.html b/Plausible.Stats.EmailReport.html index 36699c7ae..716cf0145 100644 --- a/Plausible.Stats.EmailReport.html +++ b/Plausible.Stats.EmailReport.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.FilterParser.html b/Plausible.Stats.FilterParser.html index 1e0ed9793..0ac818f96 100644 --- a/Plausible.Stats.FilterParser.html +++ b/Plausible.Stats.FilterParser.html @@ -13,7 +13,7 @@ - + @@ -178,14 +178,14 @@ Functions Examples: -
iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
-%{"page" => "/blog/**"}
+
iex> FilterParser.parse_filters("{\"page\":\"/blog/**\"}")
+%{"page" => "/blog/**"}
 
-iex> FilterParser.parse_filters("visit:browser!=Chrome")
-%{"visit:browser" => {:is_not, "Chrome"}}
+iex> FilterParser.parse_filters("visit:browser!=Chrome")
+%{"visit:browser" => {:is_not, "Chrome"}}
 
-iex> FilterParser.parse_filters(nil)
-%{}
+
iex> FilterParser.parse_filters(nil) +%{}
diff --git a/Plausible.Stats.FilterSuggestions.html b/Plausible.Stats.FilterSuggestions.html index d5d4c6934..c314df5a8 100644 --- a/Plausible.Stats.FilterSuggestions.html +++ b/Plausible.Stats.FilterSuggestions.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html index 7cea3b683..bf23b9cf0 100644 --- a/Plausible.Stats.Filters.html +++ b/Plausible.Stats.Filters.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Fragments.html b/Plausible.Stats.Fragments.html index 3896fac9c..933629484 100644 --- a/Plausible.Stats.Fragments.html +++ b/Plausible.Stats.Fragments.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Funnel.html b/Plausible.Stats.Funnel.html index a36e8519f..401583057 100644 --- a/Plausible.Stats.Funnel.html +++ b/Plausible.Stats.Funnel.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Goal.Revenue.html b/Plausible.Stats.Goal.Revenue.html index 107db6d11..f24a3444e 100644 --- a/Plausible.Stats.Goal.Revenue.html +++ b/Plausible.Stats.Goal.Revenue.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html index f9460d7a5..e989f000f 100644 --- a/Plausible.Stats.Imported.html +++ b/Plausible.Stats.Imported.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html index cbf2adc63..963a04fbe 100644 --- a/Plausible.Stats.Interval.html +++ b/Plausible.Stats.Interval.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Props.html b/Plausible.Stats.Props.html index c3c5d25a9..0c00091b3 100644 --- a/Plausible.Stats.Props.html +++ b/Plausible.Stats.Props.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Query.html b/Plausible.Stats.Query.html index e87b053aa..dbadeff70 100644 --- a/Plausible.Stats.Query.html +++ b/Plausible.Stats.Query.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html index 85c1f8521..ce28449da 100644 --- a/Plausible.Stats.Sampling.html +++ b/Plausible.Stats.Sampling.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html index 2ebee4abf..1d35e8973 100644 --- a/Plausible.Stats.Timeseries.html +++ b/Plausible.Stats.Timeseries.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.Util.html b/Plausible.Stats.Util.html index eb08adc22..a6f9f3f5a 100644 --- a/Plausible.Stats.Util.html +++ b/Plausible.Stats.Util.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Stats.html b/Plausible.Stats.html index 91c442490..d70e38b3c 100644 --- a/Plausible.Stats.html +++ b/Plausible.Stats.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html index 91efc51d4..d15bc6fc1 100644 --- a/Plausible.Test.Support.HTML.html +++ b/Plausible.Test.Support.HTML.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Test.Support.HTTPMocker.html b/Plausible.Test.Support.HTTPMocker.html index cd667f124..94df97fa4 100644 --- a/Plausible.Test.Support.HTTPMocker.html +++ b/Plausible.Test.Support.HTTPMocker.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.TestUtils.html b/Plausible.TestUtils.html index 099d7afb4..dd24ac03c 100644 --- a/Plausible.TestUtils.html +++ b/Plausible.TestUtils.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Themes.html b/Plausible.Themes.html index fe6d18792..1991fba2e 100644 --- a/Plausible.Themes.html +++ b/Plausible.Themes.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html index ab8209d16..179c4dfa1 100644 --- a/Plausible.Timezones.html +++ b/Plausible.Timezones.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Users.html b/Plausible.Users.html index 09f5425a1..947486b5c 100644 --- a/Plausible.Users.html +++ b/Plausible.Users.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.AcceptTrafficUntil.html b/Plausible.Workers.AcceptTrafficUntil.html index 752e0513b..79221029e 100644 --- a/Plausible.Workers.AcceptTrafficUntil.html +++ b/Plausible.Workers.AcceptTrafficUntil.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.CheckUsage.html b/Plausible.Workers.CheckUsage.html index 342bbf467..ba7a69ca6 100644 --- a/Plausible.Workers.CheckUsage.html +++ b/Plausible.Workers.CheckUsage.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.CleanInvitations.html b/Plausible.Workers.CleanInvitations.html index 15891846b..4284c011c 100644 --- a/Plausible.Workers.CleanInvitations.html +++ b/Plausible.Workers.CleanInvitations.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html index 951ffedc4..5b9f76f95 100644 --- a/Plausible.Workers.ExpireDomainChangeTransitions.html +++ b/Plausible.Workers.ExpireDomainChangeTransitions.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.ImportGoogleAnalytics.html b/Plausible.Workers.ImportGoogleAnalytics.html index e2058f5f8..240ff7292 100644 --- a/Plausible.Workers.ImportGoogleAnalytics.html +++ b/Plausible.Workers.ImportGoogleAnalytics.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html index a29aa1d07..29ebf1135 100644 --- a/Plausible.Workers.LockSites.html +++ b/Plausible.Workers.LockSites.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.NotifyAnnualRenewal.html b/Plausible.Workers.NotifyAnnualRenewal.html index bbdef5e5a..5017434b5 100644 --- a/Plausible.Workers.NotifyAnnualRenewal.html +++ b/Plausible.Workers.NotifyAnnualRenewal.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html index 72e674b75..99f1379ab 100644 --- a/Plausible.Workers.RotateSalts.html +++ b/Plausible.Workers.RotateSalts.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.ScheduleEmailReports.html b/Plausible.Workers.ScheduleEmailReports.html index 8c9b68fdd..8f161b637 100644 --- a/Plausible.Workers.ScheduleEmailReports.html +++ b/Plausible.Workers.ScheduleEmailReports.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SendCheckStatsEmails.html b/Plausible.Workers.SendCheckStatsEmails.html index 82007a8af..a8134ad90 100644 --- a/Plausible.Workers.SendCheckStatsEmails.html +++ b/Plausible.Workers.SendCheckStatsEmails.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SendEmailReport.html b/Plausible.Workers.SendEmailReport.html index 9eb92f076..6ad1969f4 100644 --- a/Plausible.Workers.SendEmailReport.html +++ b/Plausible.Workers.SendEmailReport.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SendSiteSetupEmails.html b/Plausible.Workers.SendSiteSetupEmails.html index 44a9c146e..10afa715c 100644 --- a/Plausible.Workers.SendSiteSetupEmails.html +++ b/Plausible.Workers.SendSiteSetupEmails.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SendTrialNotifications.html b/Plausible.Workers.SendTrialNotifications.html index 8f8422778..81a1124be 100644 --- a/Plausible.Workers.SendTrialNotifications.html +++ b/Plausible.Workers.SendTrialNotifications.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.Workers.SpikeNotifier.html b/Plausible.Workers.SpikeNotifier.html index a92c98cb1..981e881f7 100644 --- a/Plausible.Workers.SpikeNotifier.html +++ b/Plausible.Workers.SpikeNotifier.html @@ -13,7 +13,7 @@ - + diff --git a/Plausible.epub b/Plausible.epub index c19cabd2e96158b128f2d93eee9ad5c7e9ce799f..6f7ae94e6e8025580f7014831624187544e4f838 100644 GIT binary patch delta 142282 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⪼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 z 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�~o0KuaUfxUNzp{~HT|z%>jZqfftk zNr;uay+`I&mss)uUIt{=#!zG{ohMKL*+>BqFHrAsr zsq#SSOWv|I0MW|Xk9Lie8g*-s_84DC-@!~45#Xj}`E|=8AV57?+*5Z(2n|D>=eZWbt?+>Z_~_h!JTdQY z&xaXZPOcDb#TysTISbC$hllq)GgaUFwYMG*k!NooGd@EaKnI{(v0 z4fx6WKdU&fXb)>UQ!^0i2ZaSQ9pH z=+$g^w*p>TS{v+MFkaM6UK#@4dZq#T%Qz4X22^r=)_#}R;-K>cR|cz4`PPt2))_JQ zmz1TBkWXSOAm^|Ng1Ehi&+j7kDVgxD&ifB1`<^fLemhJ3Zoj2)A+}I%?4P{81_&O$ zWUpuSTX-8!oQ;);!uU@^-dotb*8~Lk?-+ zsBYOU1khrdMy@3De2$h*SDBe#4u752FSx8)AJN$}aVTC~cY_}PW zf{qS#@CQLG(2TupTiCYoFcT>FSQiSX5ueVIc?nPrSCu8lIoT9dHwNXYI)<@2ZVL;j z&0USML__wuqKZTP$CRbO46F`~X*a$Wg<8q35@cEY+S(Z!bKGziXp#hg1=)s~Bp-m` zJ1#@D34Qb}A~px}{)+rE^~pc<&a>qnVb_ zPo?lt_j^e-aVfB%`b3tI@bRa9#>QU~4_t>!YhuLoT3|Y2V89adXQ~y_*7vg}6ztL=D3B75nlcWnf3Bzxy=h;#o-Z zbop3f^4!$#n+`G5fw;!eTfYjj4cY@a$RCx0jae4#+_m--){-c;uiZx|^=CNSx(B`D z51_I4!!RoXo74=>$~_(w&t4FDPIE>`R?Ye)%Y+#NornGiW4Hjqk((rf>JZMK{VF$n zJiJ2%Y?~%dBVoP^i~!WJcj{+fDZEg-%?g2%L&WX2KxK9;#wZ%O(SOGiW!kK-c!lD{ zxoNlfH|6C-Ft4x1leMW!6E}!p1(2v581k5r3R$D)|B!>JLJ6H41R|p?q{`>wik2Fp zYx6f=wzhQLwrc`p?*bjjPn@-+H`(Te*P`Am;LB{(cGmF$J{P2nCK9{p?~Sl_sjX-ahx&lCz7(`b@7sV~2{_9kcj zLUnL`Zz>x2ToLB9g~!zDk}<()7nyDwZjh7RDd2N|-ng-lu^-UH>vrnx-T&No;Wd%b zuU?ytx@qUc(B%{D8dmibleN3>#ER(cZ+L_>ni&Sr;sK+X*`O0P+a3zGMYMlDNwt=}mM z<(3?tghhviK{|#Q=jj3l1U)kf@=sFR>VW96=TfAH%wUKpDp7&uzxrs|#>(a^}xvp30657;Xfv#Ou zYZbIOz_m4}t?>O6?b+1}3j#~b*vI$|m^kr6S4b952X4+o2K7pncS&BHH(cm#=4uwJ zi;`b#O@3(-ts!@zkF&O%<@avlIZwXvSfvN7VY@0ARKfFs+Db4(tk2J~uDYx%i);8Yc`ADsYfeCqPw8Rr3A?w(4Kq_g*=y>{Ko8?<#+Dy(YIj(IQ6@m z97?#$?ivt7HD*O8io!7D?U(*4c+rMkt!@YnL$?8N{&4!!|`c1Fv~6-FDfnOBILo; zNDehxjT%anmMH~}HZ=7_el^J==Lq?Kwn?Agt%*+Kq0ezc{W78Hsu7=khLb0nGo13p zO9S;x$JZrenF*1!>9S1BGF=R5L&MSnWhTQ2f9r3o5a&&Y3(zV^oAXfAjC!$TSS)|$ zxxV$`z7@}|q*9Ut;+> zk-;WgI}t{GaseS~?T;&veWimRz}|h4!|oHdkR=u zDy7HBq+GKD-Weu_ek0d2AGzBG*g=_j+fOk1`>BdsF~Xe7SElYBe&K!sZ&N<6*Roi0 zKhI7nmrE#S|2t&t;eC(aZnk*Gf7fR2PM&tT)oAQgeuE$N>#y1H2)K-}BPp+21!J+- zCc-Q}kbBdq%0QMhN2YcfAAusH6%xFEy<@|?k|Rq4^l`_=X|S~Y;*K59v3h4`c;wUD zBOY)qq*G*1$jM4pkM5Q7lV*SpaAG>0hW??wWfsj&EHfo$$li3);Pp=Td`_l-H3^V?ptcPcg5HM=9YWkTv2=Z&F*pmWzV`O- z{|y5H?7;1&xAc@Ex9P$gs+1Iod4ulfkyy?H`!Y7UiD`r?A)B&lUv>DnL9ALBwlJ+(Z~og@D@^Wjbt6(C}D{xb}g<|K01gXc4(|* zXh?MW5m`k#wL!Z2&2?D?%R?go%x{z5%(J6vvs#ka5pf4#q73m`GZDg+#azgy;(dK^ z3rS?z4(4p>+{6@A`ix$GdQq{n87kCIGbb(!mvLg!jQzQ0OC`g-J z!ze*cN0&69MWS{pSolOirrKkUd(q%)hNH@efUha9vYKUdz5l*F`%10nk2~oP26+Pw z*%bt5sS#bc(6Sj7!!q^t0QcD@<)^1&fpfIYsw{_%u;-p_BYLL7v4)Kk#lxOSs~|ZR z?;ufaJiBYYFj-5KU1gvRunRqKsaxrghDzcvYU9L^<1UpOWXUO(KC-qAWsctZ5oG7N zP#wwy-4zL2l_801b>lxyG9wek?jt)8+-BdMM`I4y4owd8NeUY(qv4J^D5W$+`qP(d zjm1!7y)Ty%Izr+%h^h8rmG?k9k0iDpIO$+`W}bPUnU`fq$Ed;s25f@54W+#TV5GHt zSql3k8q`Wg4_7)vAK2WJJ<_f;oo0&3A;J>%ntt%96)g;j*l}^jrM!)D;>5?gBKNp* z(lAOLA;TwyV6XsB@8zbkEi7}2qA}0Y1y);LEBEFALSHtZX7DZ>rEJ&B!pJ|$=a;#F z;EBA$nXb;*H}eDlCz4=w2uTd_Z$b4-iE_!j&`9nANbNnCv_s2TYNI+ahls<`l7!XaK?#Dz^X?9=v8zny?1&V zU|C&RW$!OzA}UUf(f6o>+luE>1oNL7nhI&%ng6a{~-ed9WcT#$f zY>0i;gHG8Iwoz&gOUOwGj5}R{L(Zz*W4UTPdyQ#P&ka-f6#_!_DGOiuE`hlANKQe> z05Ke?U|ua`An$^Y*XCT)tQ;(Re@=p`JI-=iwb(B}H;@RuD!;kUXRY)Qa{(=VjI`QL z$K0Ihr}V!lh@|J`J+}*oMOUtJl%7X~vcFWgev{BO>a}kqRruhwS!?CYUFTW7yE@sQ zuRhBpXXPzCf{%)cI@nA9ta%U_*WcRy8OcSEKG8*Q22+`J)c9ggWjJkZYg-gnSD#C+ zmfY_GsCk?z+jSi4!-T6aI$I)@%c6ii^%I%OGOR)>SdMPC2&KqsI!?CidVWSH-rjE) zZ;c-pbhx#Y!8$BADARuK6&exWtH2|<)#H~`G_5$-3o8jGBQ$*Z!sL$o_?(+DpZIZK z@c%*47T0#<`EzUbR=lp84l~c;g=P{lxd&F54Di!BmfeL#>#3^$rNTDHl2odcdI8; zks~K2cOPas8X9{;#HBo45C~2f|4o?H)3>pf@e5 zms)Z+lLAT1!LRFk+YLBY@wcnY)GJ_0=)+C+;YV2F3^4k>ptyt-k_fQXm_lymVuF!E z1{+7h5#{@P3NuF&<)DhU*T@Hw1SLm4byckYs}Rj2zXAh6sVxvS02+;iBioI1E-hb8 zV6W7-zYH4O3OQZHtN*lej;7i{RUi4V)BlhvH?K%Q_qV>`e_vIoR>}j2&5FP-l5n)S z1ET?5l8_Xs9A7S)#7*8Zw5n$S`*$YvxUwV z5J!feKQ{u$CL|63_1sV+;%a>5Wck|Emve2V+X6m{8?{6-EF!QJDKg9H0HODiPqmKF zu)##`(BYM7J$-Y{aHQ^#uT^M>UGR@kko%J789b;WJ6nB@bGnSd2W!sy3=}-n)!;w= zO4{)q)+ZL^Dd?o)uU!FTNs+p|oHvkTcw>n$P8xr@1TT;Py7TMJh3nH(c!4tETZzNW zdn?g&wE6XgQDNKRO(;bfjvTK3+f0w!jcGCeVw@H=7XnSRlECWenK9vHMt?5jv)jAO z6Qq++Z+GCI;|}DfiOAQK7%BR)R}Mp_78rOrnI!sVD$2pe3}j=8LHf@T-RE296;W!x zZK+Pc-MG>KFK44qm1;Mt)Oa= zWTTg-=8KKtKiBm-O9&e10IWcCxfP$1L*T7rHSD-zjV*I(u8#ho^e|QDXug#e_9$yH ztCooenSyypO&qUkc?kk&E#+*kiSQ;OIvA9&BYJNDZn1sSQdVOvSjd93@VOwBX9mjo zuF>p5TH>TCkAB>%DMq>fyUF!O7v~c@h#ivxO=j#2*R66|9jQC{QmjB5^-_0?!fZ}Q z$ShH17p`P5-fvUvkxGj#mOlBGjacwXMJ0*twjEGg+)d$j)Xt9Drv5`FE+Gw#nWMhb z$mDK7I@*>Fs$DpEl&<$2G>fi{Mz4dEHe6p|yg`R&FJ8wG@&%>Ijl2l#irnHy-W`gdH;Z_YM%6%zw=1)XrO z&hcvn1L;J*6Jkm!$u=@*YB^tUo0D6Z=_+@CdpLo?bdDB*My1cFO~P$eux!cQQ+(C4 z@ti_`0?CUUYZFjA5j&Y8JhUlM9>D<=sfs2dA9#Y(2OnWat896s19dublf}xW)vs>$ zrshtqr}ZQzKqWrhB^3yB)Lw&eU*Mc!{&3G8O7)2#lV>vx7;v7kfP?{aK^;A$GM5P8 z_>Y7!TNYyaXQjiwY|BaZ2_m13k?JX>lEEeVyTF7vL7$ydj6P4RwX&ApMtFp8O}V6< z8VGM*F-j&M7J1Xqc2yp;CHV8~Z{I342vCce<9$X#nGK9C+qr1oTXbVD@T@BFKGhSZ z0LAxpN4U%08f^dk9=c#Y;u`5Avw1DRqDfpzI;xWt$6G0N{3MBT>1Tip37DZ(ohHqv z;mUqI_B4z*g38wLTK3WB+Ir2RMxA{L4R$xBnjc(%Ah)yJy1i&Th?*`EL`T1`EM>0g z6GI%K(r0{OSE_`cKr3t;I_WKFM1H=MA#Pb0w zX7Fe043yR9RSZoEAvEXCyPLontA|5l@_2o9%@gE6t=VfoIn`< zRo80pFoHF`Gm;wHN6%RP+tf4KoyWtd5#jx264qzH=_` zGaX>GNlC}!%91TJF2QoLo72uzA~h_;ox}y6XI|!Dl6zb(KTBMZif3!Y@dNqL5XZM! zELLT3{Xjljsba{XjuI1i^!R|cO2e0`Lrxkdh^#!q=iA>Dd1v2&+rrt%yEfB>B8`Q@ zf6DhZk*UK~sESCk%*ilexVHU`FSC66KK`lpNPq`dO40R4vAvQi3=?(1(%e2Jw*1MH zu2D-zUEEv{XLj^g=S4XNqqIe2p*$53LlWQrXW(AGqhNaL3F}yrgxv;!Or6 zwEcwJR|H&Onf~OrC5nM;3nG}j%R!do1~9*$&yZ zuB6Henfzm(s=H#iMa);pH?fgO(AA8P_Jd>tF;&9W)0dLsMEBYQtFoHKl+?koUk~OV z>>}sPfC={n!OhC|={o@A)NMRehT!OjHcc<~K9|UjyspA749=7%K2jH-3O6Xenq)_R z2D12lI_nld$te$foYuEI5W?1F&G(ByIsYI&Gs)E-34M{eC2ep3SCUs7qs<|`?+aA@dZ`AYfJCuoy|O4R`|mnO3NQ}TMO5msni z)9mSA6?=?wBvV9jeTJ+Y%#%?<`pGZg6fYiee(e1XHP9yIny2fGSwwkhZF$hG^p)dZ zclA(D8c&}h$m86_IEfTU)*wQgX2)BB(0~8D-j3&=H$*tHNfqsQ%KIgw_*{~(r|?yG zHFPasPSj}OHe>g65s^bwe@n8~@``X?jTu)SD zo;pLbJ8hgV)$p)Fbk6JN$eTGWdH?M~Qoc}#w8mdpb`)uy5+;rFyPWMNFJjm|d*$^` zGGgP>4vS7$YH!Kda1{@AT>n6sdkPil&DY3CWzdgwAVeC_yFO_Mfya8*C?`Jj&q@Rr zJ>qWMGb-Ec938dPcTJ(#@tV~!ITBpPc9m@S%y@3i=-)&}Op2o^#x9q3F=7%sCW)|5 zYd14>5)#iGk(78*f2SLRd3_C+EdfL__(e>3yjzEf5oIYuSx~i%s(`v%&nA^pP3ddA z(!yZv0!lIfhX6|>hACN>IQns>Q{T^|M+IL4NZquLDyaZUI9ah9j7_HL)=lt+&fye> z7#T-W%S$C+;TiejdDs&T2t~9N{vl;X!((St(CI4*8@S_^l(oNvMiVL}h*QeW0~dN? zNeonjS5;I}lTpOqQ4+R)9m1KYvHJc?BDLKNSKAGc2V4OKj8j~UE9WNN)YlfH*8Q)} zz#IJBzH!v9S7d94LJB#b$;nMoO?sza82hq6u(@jPB9+sZSGKn_Z9jRo6SdL4w8vjo z#&(OI%;mc^L3k#aW&MC9wf7PkJFMz?f4x|_WmWm|SUcrR%K?5Brd4_)&9#PGBV<^( zE3X1jB!kyjX<*{5x3r=$a++Df5be2R^XEe~@1+=BNp7o5_I{Fm%<)O)TJO8j)#dN8 zF{PJdk1c$c*+mQl96~$#_=a=Umbn0*WmtF0IOgYd1nA$|Z|`Hn@AuKZFI2}_CyqYt zfbSlK&i}=2QuXZpnb7_Rw;7vEmIa`hs!%=+>oLB=Cb_H^Hb%y@#a#B(EOFUO!&fr1 z+=3u^Zr?vODo~3D;E_{DF3v?^kKc2T0$+9|=cgif^Gc+PQ~S2GzvBYwd3$0OfIMoX zQ7s4zIU>n_{9(EqFj^%9c6%&}7%#%?lM3<+;eqh+B!9egmcgdu=r0#4`wdvhrCKIy z&=D!JV6h~)ybdp%Hi$2GtLmk3mdQpH-v^<`29Aw?-Y!qI>=-ox%E6{_q{;Ar4Q9PA zlT9YO$DkTWBrT3W0rJph2U1Zt51mu^M^;VaBn%7(LVE!Cn>v7SJmJTEX(*s=akL*d z$X1pWognuQxefHD-Ad{pr6p=bt&Rk%MqR+g0GR5 zoT$>*BKtdk2H~^X)y&|>xUQVeMeIaxe?K0Rk30A63z>ci zHTeH=K0VS-DPYQ!FX?k)L}Gz;MMOa8Ps_W7n+r9{#`g&HEcM1AdN&b^l+=n!Ih<|G z)RY>?%KB7H9FOoL9*34UnZQODHAy`D@xCE;Nh^F1@}n&ivM)sr+GAD!ln}9^;MJ)@ zjF9w25)n3C&#lS-l(C8D6>QZcyN0XqYSh{0x)o}k4hwG zWOnCGiw8uh5vBSO_=`>=OEZzSUNU7^xF3|uohTmDnk2oM zaL-xLJeq6LH4El9mJ}QM<{c(U6_%9PKKuEumZg+C1WN(S7dB-{V96*lNtQ{JH1)KF zG+MgqX1Fpay`nTlBI@868gqp%FOZohgW;=M4zD2EavB)A6Icl%d@2b3$+HPapwr$(C zZA@&ZlT7SnV%xTD+qRR5F-dl==YIEx{s-M>R~=QgR-^^qrA#8j5Nvl^J+s+d1nf%$ zyhqz5F+H;;oDG+oo~IMzcFBkNB+do}@Y>v0%Rmu#ScmBJ8_i)WSTtyWt3v!Z7#T&` zd}xPsTTIf3iYNhGiP~vOzQSXZtd(km&B(&Ts>B@tV$Y9tt4DL}0xzh*xga75ttQY5 z(bmr_^Lp`p&gY*Z`C}t9FdU^?=Pr(`-2Na{p=EHP#uI2ixwumzY+Gq4ZT>GQj%mY9 zsic}$-+$o(zB-6TuMm#d$A}4A>60bjLpU2*p;I=4(9*C8f-!asUpPv+gsOnhDYUQmsr8fE zJnb4tQxHbN3KM-GBXfeMg=+pl9r`gV=5o+KDj}?|L9Ap)d;9i3vY2~qM`wHmezVIk z=p>@TV*w_5UB_*)x-;+Iez`g8`db0?rk}WBxlzavNar)gg&s||#|I%D-LE~Qg?5=) zo9*hZJ<|7jVz();1MC=d2Nn?~xBmw=jS9Jaw%P(_RzKcSB?JnDl?@|~ zR%gG1;vzjH8n2-tm!Ac7frN3Iu#H~KZ!t9E^{F%BleB4ec{MHz6FiKx`}ldMFcM~f zDqp%C9^+mS)Ah$1@QDT*x3PKD6(O3$tw%xP&+0WDa7K92>jY%4n*AL4>P+e9o;#Zx zv0EC#`@uj6#CT@peQ=&JlP}JdEqm2(d-L|B=4>}HLwq{vf-VL5pxI(F%)wSO*cBp2 zJ?!89EdQGE%LGSK57PgnGt*H0%>5Mra%ls`b*+SOqOG3glN&x+;1+Q$`I0>ij~2FHo-|<0|5adsn8vexs*`TTUsz~zOj{=wg1IdIR)--IPW~eX?cO5g z;}Vb;gPy0%Bmdaw$17Do60Q(mAr$#xVz#zg4)o@zf}D;$JqLwo`^MI{2rZvcvbLUy zSlc1vOV>E@7#B6!di$&Unc;j4P(Jx&=Ma7x6CkXgw>3grp@qkcBUwV#f}XNjfyG!{ zO&pHQemUjEX&cZX4JPF9Bh-u4TN~Wae;=X7RPDLKHq)!Ufc@u})hs=dPQ}I$Jd$d2 zupiy+z=lKZ5iRcLsv%ZzB{{TA<$|R!WHz4nK*1%_5j!u{uA-vqJVr+haQCT)S00kN zdw9TDzQ-s_#Ac9@xPi5yJ&A4Wsd{4svVmDcK>`;bSC7y`?pit$gDGMw(vG01fdU0g z4eUfwr}NJ|vM#!TuCp*JGLYAF0=tg5)2Yq0J-?gM(m>4nfrXsvyy9+0Y+57e~J|O3bN!i`OjV6C0c)} z*lDiw0{$TlGQbRHoC8-@y#(g(`8q+EEkp%R|3g|n*+JZg2$Im`4mX1AxGHH z_fnM~a@3)&B^#c)ksqb+FBFvt=-OdFR)aOW`8b3XLC1mG>i4%-tan%{C$_TaQ4V|m z#(fKI=(mJ$Xy4+*V0^P^(u9(r)1=kZWAzXM)EH`)ctC%)(Z~o_N3SW#Ks1$LfGe{U zv!9mXEd|)97>@)Z-zZgrne$~98<8y(%fu~yQMtv@${XA_5q-QunaH2$)0E^qAX!>% zX%}vf6CyflcT}9w;9VXaiy`1RYx)8ez0Q&%S}t8K<3gNp=qh^rJ14IMux7Sw=PFj| zKAnhm6M)w5VLh(>l0TNioVIObV~5Qcf5a};^gq6mF350w64KtN2h$5oC48rtb**ry z0aHV3xyBQI5~H-VBp9-BQ;GtDl8F*Qoo(UhiNS#g0}DK50Hyozo^UydB7|daI{BQo z3Gh@k6A)Pg7#mqVO}1)@MkveD2owf3qFm|;Qb3Tmfy17DmS%z1gh&axW~Ma_Niq4c z>M8dCt#-KzO8Keeo9P-v=2Z215IayTtLa>vL{Af_-F&CGxyZ=~0b}-?nZG60z0c0^ z+~r#?oNg|2u7#(J|EMbCJga*_Z8Km$SQoJwdTE{e-G^7#KqVnlBOfz#2N);;jO3%L z3ZT{U)}`bVTT@GHpr|y^d3LGGyDpw{>Zco2tGFsAL)>|0U8*2)s`l=kkeIb4GR{>f z*O}D$=0}+o!DU*sPzSk_$``Rh$Ka6c&X8&jT-{J5H=fD%FGh%a4`u>NIGQGAs7L`r zjY1ZaI;I$+Z-&(N)z^+@7&Jy&uSOVe77z}pBhvS;I7zb(6ncQYM!O=a7>1vMO-3o$ z%Ti9M1PD4ZolK@K>=cbNQ(THnsF03rzW2Tp-^H7VN0x<8>0txcBmjPZ6>Evu%60h8x;cSH9qo=mF%Q#}L*LfDOE`g0Hl$UerGm zDdxkW@m?p#JGWrvzhKfO$=D4%0s$OVV1^92xP_ksQYUi?{l$KGHei!NUwRV`Vhc;f z>@SwDIcC%}zcw{;8&<^ct!R%U7xT-H!HjFq1$OQIpD(o-AyPl{UW^^*J@QNWY_2mE zzo&w~j7hc?38Q3jUqLBz@19*Zs;s`P&4&YaluL^%@_FXMCsPuvOOfDWC;>55l8jPz zId2>pirTD@6vt+=u^sd)p}7JCF*E+MWc@XeTvEdESKJrXzi+rN?7+&&l??^$YtOK? ziu?DVteNVhKxr|<9E30CLYD&3%iSEj^IB+Wf7QkcT`w#A()DMkKX8A<*ow7n>)sf? zzB%w~YuK4U6wX{<@VpauQ~~7VJ-vaJ(7=@P=%xu9rEqpxc&86k<)48XM~Nz|hyeIcIy>9h!bE9{)i9!@OjuzF2ttL;(|RH((n+OVV*3`k2}v~7taYQ%bJ97JdBSJfNkH$AEFnzx=g%zFC z^()FuxC(h0^}ZaYOUY_*JBK|X+%AQ>kFQ)*ZVYTXf&JAR>XAuuLhdE)NYW$DMtyv& zRXNM05VK}0-ten9h#<;=DvUNjj>Q=f4Tu3g!b|-$fW!u9Qr7NXXZ#_k3>RYsen(-> zOs^2CKuXOEa)xa!m@R}!jx3UbHJyW_tC%|Ul$hfym5wcQ3oWFbqN1WG4`Y?%rqU)- za0Jm=*!VIm3tsiir()XASIt;@1=`pno>CPn&6#0F3ZYhAAq7$gW4G6K&@qW&AWGCb z)b1Z+$kPIhOVlD`WwO;&MmtMzC#}uDak1=<&a}SI!bGuqRltz%-+Uu!BW9;3OFl*H zoo(@Z;|mnD#7(BjCUKqK6BnH4?=AxubOTLRWeJN=^;+}RNP~0tmtV?TCEO_91Up?j z%h_;AgA!e`r2QX?DXWBfKddK(oQW&843(<_7|>O*99!rM1(3yv!;axScYrG^1e!7R z|LxD~7nO5+eOpMXam0nyqOv@o^^Rhdfx2+u?)l_DjL=~$YJ*)172ADj_yOip*kw0G`;>pGeHy0m$yITRsbwVHQ@A?YM3kCM; z^No^Dzp)n_>kKEj>yXz<)Z2d z5$xMEO2DtB_kGW;yj(j%_b=UTZ1w)p;~xeOAGb#q3}zi*s({jOL#uaswpW77Xy`_L ze4f))am!2oPIr-ivM!gQ&?9Ar=>VPU<~GMKgWpQa_Zw1Y3&&I@Xz@c$_EE$vt$H#g zZDt#rP4m95YQ`a(r==Jn=>FeWOF;ajcPkNsMh;lkDGV+eF3ngVQ?j0*rb589F7bUB z(6p5ptj8;mw(sdoxL}U}@qGr4OYAN*@xC#1V=D9$5aoOinX$o4(aX}58UV1#gLgd( z4t=l=Zzw(6whZJUz_ZrsWs`>osApy*aI&`9sfmi|N>|IL=C<3%k3_W-iNMP+nAVdz;>TH+1n#{0y1~Y;5uidi z4YTHhX1oUz8n_yF2@ZF{%+=zXM(MxRp5}%RA#Y4M_RhEKW_vT5&Bg)bWgps?kAEtv z*D;GL)FmJ5dQ*YuYG&Se%>$kp__obHRzwxmSG00B+}}v(zXf34LQL&9g(RR-S0oA3 z4fkbQb7|A(fY{#Q*^d8vLxIXO*ti^uiEGQmZ1?SZ0OGxs3TgHeoV|}f$sz3BwZjnhv3*cH+z@SSyocKT9;eK68B{sR5K{}b*1tp~qoGU*r@gC-<% zwbra6cThdkQ$?1Xs{;Rs6eFO-E6AGb6W)Ki1o{Tiw}NT+dTRqb$s;(+nJi*N`j~C0 zNIExb&+F(JK&^uRyQ7ythbtpKfc-C;f(qaOoP_L-GI{8h7%WaYuYAwH_O1C}D9BG2 z;Vx3ZY>vR<&+T=mfZuBwE&6Wm7m16ChjNa!$`q?iH~w$KOB2g($~a;sjj+K%_qqd`routJ<~PKO+Z2SPH62@AeJ@$! zxu@t&pB>-G1*)s9hw5j@0>0ruh)pemwmvH8Y7uomOQB>=@?I3S;f3v-2%_{vTbHhxcRxr z@9ET-ID9YY$H2mc`|HbhW=iQdyFh=IzOw;B>1{#xC~8X(%gw?r#K;oj>Y+pw|D^dg z3ZeDr3h9XTDse7YBD>%thhJ`kLOT;6ATAD(MwRF1rDEC~eVUwksuBTk zFN2RatdG`AtrccYm){Ybnc0K#uB7?!QPmL)Q5^`*_%RWEH}0yYT2={K?fgmo_mZgt zEq~P$c1FS(gzF|Z#!k^}j?PpH+VVdkEfR6ak<`T@Ti0%;S!<(LIdsG)w7WMulE;{A z(`Howqu4#GG_rqe&2TZrDwzYgp3MNjtFRIVQ2#b`B_9P-pK#$UQC-X{N+hT!+DPCIh8=CW1jwUa628JKGSyvJ5b?fSFM_c-I+i%FHE?vYZ3WTn zC=g>EVju&2zda}(B?q=UHxF#0{APdE(p;?DRY?ePm{6E*WjIz!?-(+=F0TN@WGX`R zFr&VLRHx5qCR<5KuOP7dYS2>Wg`&vjWcxu{8Q(F?^-3!P{}CH z__HDzHLQ6?sD%v?%qJ1&Q&b2@r5;zNU&%60vQBm81l+tvK(T7P?<7p;+*N5DLue$o z9u17Z1OI}&2o#f$BV`Vo45UVaGmc5r%b0@Vt76vbWYcOb`+W=3+4V0>6Rh!hWO)zP zf{jjyTI{8yry&fGRd_$sJPzL(Z0UzYn(Fz9+nmhqtq%r&I9z)hPY#yhhfl(t&oQmr-@**-S<Hm6S6rED+%1K#5(Gd+cA&v66Rdo=#4No8rPWl>v)}oqzr7Mq_67E&5pQ;klg|Y;y8+X?s=Ei( z*X-|e$umD*m-qHH5gC_m-e0UYEb>G-N`(Tql98O$crQAVV~cXh6JszW<0M&WPqB#m z(3`#L%@+X7QJlM%@_Lp^NrWD@f!*d)vo%YcR0$y9?~IM3f=ZRBR*sGITg&cb@xtb0 z@vV6x7=C=u`@J!+^-oHo^(SI51of3>5KkPAmL1?!2N4~mhf4W6UH8P_h@02UIZz%? zjEZb=gib`bCv&%Zmd)Gr^`Wv=Wu==Hf0$GSx|*}L)^H2lPiT9^EldzkWLG@m7t2FM z*ak&D-+qMQ!kgsBSfY8CnhS0@OdP@l@*yRcpa3NkF~YopC0s=^wI=bJQH&tL>MhRI zzzjG6@!X>n6+4Vj#XZ|83p=J$gkGH}R}oK;QtkJF{y`;VquN>wMtwL19WV=2-;rH2 zPcZtF|E?=)OP%AQ@IA0f7v*>-XvP#!0~*1zTKwB>2DR&g@fr<56hRn~rdE~&O10Gr z<~w@@9v)=m8(70s=u{5Ek{()hLMDL;s|JXAaQjOSYM+uKtJmdjOi}{U=iy5{&UZCzVZ?aC;->1dc$RkPFHjLdPfv70kq=<_Qure;(l2&UK= zp9*$&up%HkP(wv%T(9Q$VP2l$EMJRme`jaBy%uzj-p+WA=n|PrmPIt5$}~)Ien#%~ zlkP7IU=iHp19v*RKSGS(Ga&-xTVDXMvhm4ufo7LdW@l$rC{vvElqTvPGOtiuL)V*F z%f2ce?`trjxhmUQTByR^?^m_fWMP_>>f4|RJTo0j2MY0=r|83-IR8)cIlwAF@C-g{ zujmFP?xwxD*budmlXqv1dL+ulLo@ zC&v#Uc5LnU9D?*2H`C+Lb9&{&P(w8j<*CPXzht>f-ym?e{kQIA2Wb#J#hUIpDPDM>NE zRnRkQzlUMXpk9$_>);LnOkknX2|Dxy52eKsNO0y`#4FoG$}nPmLU9x-F>P>EVYz&+ z-R7hc5IiL&n^QHvH#emf_2+bTnV{CEd1{{FsASkx;joohRGF}OAd{syQ(P!&@J-V8 znOqs}V3`xsuouk|!;`|c*l;W-nzhwI{ zV+}i|7bacPB_G1HTeYT3f-=N_3)I!D6yVKh7(AX*uO7nJ_{UdkkD{IZ#f%7qY_B}f zzH31pR;EeoMRumrv~s<6lG3$V+(EIum`fupOc4mslNjM(n>bILuf&s};~M`?LQ!uC{_`-!;1q(aqNiNs`w z;MC0zrw4v`orG0KH6dN-?KY&HIzHLHzf)pHL<47y>sA_U3Y1vzCQuvPGTPE#YjO(wa=UXDy1c$>?xO8aV zA)5>5Ed)m{u{0KD7}KPUb&=TRT6I|~G}$RoG{ItKNDK+aN)z-9n{loi+|s{CoiH=a zRRZwCi$D^&FIoglPePdTp*a?Ji6qN_h1niUmSlb@b%yUy^ zsxH@=QwTD7nZaFbgSq%p%Zt-9(e5@7PtSZjVY_A)&>w{T$RpY z=}e2q@@i~_u4F*=D3#e7>N!PtMB3qtdoP-uc-Ra~G?e6W-8=}ec z_Upl~z^v)CmFOvencmPLxhXZsPwLt9^WR1!#_jJ`((dq)1{#qkqwg)YB~9P^tH2)q zEdJX4kV_B0U7gaX&GtD>FVClA=i5{NUX8|0fPLfU_x#n@OXjxazo^p>j!p-|hV^bh zA}1W2FrFzwZTGr9sBY`J-$&v4Cn0-h%%Dxz_O!T*Z-}EUupkO zbh7jFoZ0-a%F%dh9r2B|d5s1^T&))Tv>|_|U`74cgsN|j{oD0e(!J73L=``8FgDav zKicN^c-i_}7OfXjxQ3f?9zmaq0vZc;A;-22vV;eN#U&WMtrYm*51iv zjF@v^6!e=S_|^3ME4A7Wk{mEo)qnmq-v9UO?|h#?UDvUxU)7MgSL`7gZ4Dy`$oCM6 zzbPUyn8X1e&(NycotpexnjrcH$WQx1SPBYSFp}Gt5 zVZp!63v;&WcI+<2l9 zDh*UUq{mz(Es+n;=rPH8BL3G_!&_=-Buyk&uuw4Vj+s>S5qB`6097K(gDze{sK#mF zkxO@H`@_ZIDD;z0K6TC?k`_z6cMAFmywwTAjSLzTH+b0G+rQK-ltDZd6#z*FDDAvU zPDxU%?hLO+(ik4n^pHJgQCs=Us_7rVK~q41p93)6bCWftzs76@o7n?#I~^sytp#@x zfss$(bA6Ip?#efQF=(Cy^O*2@r=?8x99J`Dv{FEI`kd9uQ#7@faLS)gDb%jR6}r%D z8;+Y$nAMe3d!}Bliw+WleY#Tt>|4sNVBSzfTzUU1R7G16??f0)67NYD`K75AIgZ`m zckW4$$)fp4Xi}*WR|8IJVS*>Cs#C?Lwc+i)NCOQ({Y1iwj<6&1EHe%vf%g~CrF+Q4 ztWmbEnc)FDQAdmAg!IY9hnc`ytp}N)Oi}z zjAcS9o>PCS)|BG=1StllTnbN_8b^(Lc_5AFnzd=@zeS#UMGEG|`)1GC*mpRNW}S^O zv{D2T<8Y^{RN7Wn(&JsyD@rWSGnJRjyuV@iCOcE&Tc($uVCQ&+z{>_E{pbJK&jiS?CZ8E8yS0c7PR=e=vTGSk%*j$PD1-N zMIEoMNXnDAd;$}?cY%XjXnvYdFTCPfx{CC@+IG~%EmWvAodN4(1ENF#yHDsHr!15- zSR<>TbylQk<8_)}&B&;Z31>&FhWtj$4dw(buX!tCfLKhuZ?%Zjt(>X&e|mUcyE#j` zOoLe*xPpVL&$peB9|gMKtigBxuuWd=zD(wS8B~5R3O&SYQkx;EiM+1HZcA>C+*IZQ zY`sG9+_>EdzYk4cq$}$`j>=76#=lKp0OnUaDl&{-R|20YrZ4K@)ERq94iPK6|4-(y zO=iFO!$6r;b)3){5;7Zh&oZkarL%*y)e1ncX~}eBvWln=S4mwAf@A~~v%2}RJ!)(w zJNxF7l2r1bjuNUhuLf~{Js_6PG1`;J&0|S!eCfo*h*Z_{CXmSM;TZ5(Vs1w*?ns|j zT^ewGo#Kd$vIip|{j1b9mZDUvq)5S19lhm{j-g@RF!jb8E%LJN+9HavYnP!eA!Uyn z4PuvhzZLxcmBRp)8h%4G!SlW67b?6hfLLP)PcF>0Y!FYeYP!H0e z{%dhtrbx2(ZdU|a_?^rND!?t#kDVfQhW%gA&kI@rvt5#k6by-BEISG|Gu);mU1wKBn7!YFIEN9oFRx2^AaC*6_-;6bb|f zlq|;Ix8y`>Z`#z!U`Q%}+h+FSvvg&Z4x*V&?~Ma8G8H}X1CIv*gR~wwnUaUTHm7a> z2Z`3fe-nIF(KB6E!P7vRqz06!@F}=LcN8Bp4i;t_w4eUo$oTU)B6a*oJ$5D5bqe9B z56GJ`ws*@~CuTKP=PXYB+}1(9He+FB=C3zv^i0{KKiNZh{5}9hXFlbyY0k(|iTI^- zuWOt$r74G!Z1FcZUg`g(LpEWNqS0i5X#MmSITf(-#~^qVU$g5(;BR4cWPv7QVJAdF zc|UXDL_})kj9?E_Il4`tOTVm5^L&z(ZK{yQryEg1cu5&A*MNbV7fqd-fkp^C;Ryw-+;lo)$NZ4Kk)FS>PR& zQFx34LVTNe-EV;B2Sm0z@9Ct1AV)ZRN-jP0#o{RlVWJF<6;!HrwPi{-gVkGoo$MG) zI6dg|hyp;Y4dOX~1~P1RUUJGR+!m7s6T*xW9LkFi02s3mrQhOp@VLg9;n?tDDB%-C zkc3b%XO~7VwN+Vu75@aYY3%nU`(rajNu3jq%Qvo7O{#>W+mI=1LJ82bjB2poH_J$N zwDDYyF-(I@R6mrRLhhF)mQOyt=lUdx)HCUvTCeV%R zu;7{t4pmuv1m+nlZe;=wcWI5IT(#KoY@2C~D`d{Y^wVc%d(U&8yg&U%Lxvoio)5g9 zCND?3MCnCa-8&Ie`iyo3DxFT=wQ)Z?$FE8O@0o7f-8=!#U%P-*ok@Gd9mQX7=IC<2 z9Vl_hy6{JnE-9pH)D02E45@ps_R~49iqU3tsU(OR!-AOUTJP5}eJKrzt6JpLx~mDM zUY^^1YY8WN*Hpcv@oQUCA9O|(pNziT7S&$3)&&DUYH(h5d%FKHVp1iyPX?$Le0s1AR)UF-WE1o^*)jz&dD`L!Q|F_nCrM<0k$br>8t6FB!0m`~YVG(G@ z@i%GPy(K$;F}vZBqi`* zM2ZRzLuSDiMo&1s2*NLhVqyXugKL&WiZeB;I+Mt33`{n5O{;@LKg2odcZDTPE?blJ zjvzcW?`n3+_XGfJ)eDoq=~2a8Nq0QksZ>}Yf{*Nu%jha zN2e#7hCiZ#MAz`P6~=%XUj`}8=8*f`jZe&kNu~gsbFIMLC8|@xmBWTa61%_$580Tw z|6+R9;jl(Wxb{){wZSRzaPErtkDt`OaLCbky% z2){_ie7!-<_1iAWu%?@$6*AhaI94Q__)lM_{%*Z&uwlkaU`NkUVsY2Yg{uoL9JU-M zg81dBB!R1V$x%Xv7_r>iO_3myQPxS$Uvt*1P83?{vsE!+13Gl5G-+3I9)d1nu?+)k z(;W_v-)(b$=Q0AoYrDVJe|NfY=S?t!YvTyzCxs@GD4tt5o_|x> zceB!y^98O_$pVvjhQ3XJbT+|DP>+=fiG_eJo0P>iSUuAuI^^mId42YHTxECpn^xji z*ZbqtT{8T_1H3cYa8hdOhOxyInc>(C(bfIz2;vXVqgDeiTZdmlpj4d|I=KY=pt8d` z2jDo>@ug_PVb@nEAsI(S#xMMH$#<^gc5uIyH3)b7u6k6|l9SBzz(-zh0N|$dYk)R;y%>+&w80mxfioNA zb~|M2kuol&A}S=r-22&y&q~S}7|Qjh0HXC^4LZDwx{^_}; z*7e^8s_wF*=!GyZV{mhm%l^oiq&9q*qyS0)22fkSQq>C_}{CKy{8;v@^vj~pZ{}!YTNzU;6VDC zsh#6qRABjScei~U5>UEI_J=W50e3+mv&4ne7C7UNxn!bCJniSTzIF?c9KD5-L;*E36twb?pZk{Y zX=avSvoz&<+HRYUnjS!RP-bAl3ae%H2I&6R{c)6T>CtibGKx`tO`*~pLL(6D$JgSk zur9DikK?@{a<_3ZJv&HiaiWqMO_Oej3xtGldtDah7nH!bHajOM zcd63)R@Khd#IIfCZ{#iAtem-NTXCLutf}X62x}V|=s-8NM+yV$K@oNyl*+T3Vy!0)mno&!qNX|JgJ z`$kBTnKNKm2(%D?UFl?wQT4XO7epomxkcyU zkr|A?3oI6sX)12YN^DnCQe9)V{COGGRbMTCA=;XdZ?<$&wPzCV-m+A;mke5M5(VG;&y~ zCE--fsd3Yv#TR_gv9(=KQncOI!>iZZ71-Iz`xRayEC$&4q;%FsmYnp00}%=B0b|?G z;YjsXg`50EB}RGjUesI&sv1M*0vZUci8b*6y53|}oBFX#nFJ26*eBF)`aqKr@&TxS zfhytXdSym3kJTjb@zS9BbWW9B<+4GbL4HUs^~@>1fU$4O$cPt~MC*l|31UoEP{6Jd zf@%4i3c~MAFw}4Z!egz0AeolVY~z%SlLTKjd`* z)8fQ=$(n3sw*&qo-%6M3^U9Sg&Fjv_LLwlFiOL zQ;dm2<74;5zhWNee z{ViZ?@{YM0bMVcL{SMAk(+yn-tcZ(LrUXa|z^KwdV^O5ZnahZB>65*TlGF&7`Gvp@ zkCoKe{)A(Mk3megJ|A_d{Zz%=i1x_lvR6|#2$qST@E0b?^VC;Y3df}1V$@1>dyq+& z7R#YQv|$U;qJIAm>K7-4*^rJy4Ko;z$ds?I)i8t z0LiIwRJplnR9uI)RJmE#uU6_F*3~}d&_vnt&q1)H-dmyV&Auh#5pq|dWv2agJobJ8UOX`U=IPxOAc}e0r4iFt3Q{T z4i&3v2�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

K?M0`12^F%5RlNHX2d9g#l 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 - + diff --git a/PlausibleWeb.AdminController.html b/PlausibleWeb.AdminController.html index de18fffff..2aabac63b 100644 --- a/PlausibleWeb.AdminController.html +++ b/PlausibleWeb.AdminController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.ExternalController.html b/PlausibleWeb.Api.ExternalController.html index da07a39b9..221904a45 100644 --- a/PlausibleWeb.Api.ExternalController.html +++ b/PlausibleWeb.Api.ExternalController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.ExternalSitesController.html b/PlausibleWeb.Api.ExternalSitesController.html index be82f9c3d..6ea6edd38 100644 --- a/PlausibleWeb.Api.ExternalSitesController.html +++ b/PlausibleWeb.Api.ExternalSitesController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.ExternalStatsController.html b/PlausibleWeb.Api.ExternalStatsController.html index 86db73ed5..1018703b0 100644 --- a/PlausibleWeb.Api.ExternalStatsController.html +++ b/PlausibleWeb.Api.ExternalStatsController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.Helpers.html b/PlausibleWeb.Api.Helpers.html index 875fd0035..4461e76fa 100644 --- a/PlausibleWeb.Api.Helpers.html +++ b/PlausibleWeb.Api.Helpers.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.InternalController.html b/PlausibleWeb.Api.InternalController.html index 458382ad2..0d0b7ee16 100644 --- a/PlausibleWeb.Api.InternalController.html +++ b/PlausibleWeb.Api.InternalController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.PaddleController.html b/PlausibleWeb.Api.PaddleController.html index 2f927b25c..e59d72ccd 100644 --- a/PlausibleWeb.Api.PaddleController.html +++ b/PlausibleWeb.Api.PaddleController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Api.StatsController.html b/PlausibleWeb.Api.StatsController.html index d23f5e75f..4d93600a4 100644 --- a/PlausibleWeb.Api.StatsController.html +++ b/PlausibleWeb.Api.StatsController.html @@ -13,7 +13,7 @@ - + @@ -718,13 +718,13 @@ and month. The default depends on the Plausible.Query.from/2 for each default.

  • with_imported - boolean indicating whether to include Google Analytics -imported data or not. Defaults to false.

  • Full example:

    %{
    +imported data or not. Defaults to false.

    Full example:

    %{
       "from" => "2021-09-06",
       "interval" => "month",
       "metric" => "visitors",
       "period" => "custom",
       "to" => "2021-12-13"
    -}

    +}

    Response @@ -739,20 +739,20 @@ cut off by the requested date range or not. For example, if looking at a month week-by-week, some weeks may be cut off by the month boundaries. It's useful to adjust the graph display slightly in case the interval is not 'full' so that the user understands why the numbers might be lower for -those partial periods.

    Full example:

    %{
    -  "full_intervals" => %{
    +those partial periods.

    Full example:

    %{
    +  "full_intervals" => %{
         "2021-09-01" => false,
         "2021-10-01" => true,
         "2021-11-01" => true,
         "2021-12-01" => false
    -  },
    +  },
       "imported_source" => nil,
       "interval" => "month",
    -  "labels" => ["2021-09-01", "2021-10-01", "2021-11-01", "2021-12-01"],
    -  "plot" => [0, 0, 0, 0],
    +  "labels" => ["2021-09-01", "2021-10-01", "2021-11-01", "2021-12-01"],
    +  "plot" => [0, 0, 0, 0],
       "present_index" => nil,
       "with_imported" => false
    -}
    +
    }
    diff --git a/PlausibleWeb.AuthController.html b/PlausibleWeb.AuthController.html index 42ec40d75..099cfbea0 100644 --- a/PlausibleWeb.AuthController.html +++ b/PlausibleWeb.AuthController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthPlug.html b/PlausibleWeb.AuthPlug.html index a256ab307..aa83e1a96 100644 --- a/PlausibleWeb.AuthPlug.html +++ b/PlausibleWeb.AuthPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthView.html b/PlausibleWeb.AuthView.html index 1731b5c13..068f79623 100644 --- a/PlausibleWeb.AuthView.html +++ b/PlausibleWeb.AuthView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthorizeSiteAccess.html b/PlausibleWeb.AuthorizeSiteAccess.html index 78c087d54..deea66fe9 100644 --- a/PlausibleWeb.AuthorizeSiteAccess.html +++ b/PlausibleWeb.AuthorizeSiteAccess.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthorizeSitesApiPlug.html b/PlausibleWeb.AuthorizeSitesApiPlug.html index 74fff853c..e15370ba5 100644 --- a/PlausibleWeb.AuthorizeSitesApiPlug.html +++ b/PlausibleWeb.AuthorizeSitesApiPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AuthorizeStatsApiPlug.html b/PlausibleWeb.AuthorizeStatsApiPlug.html index 91e143f2f..eaab2bdab 100644 --- a/PlausibleWeb.AuthorizeStatsApiPlug.html +++ b/PlausibleWeb.AuthorizeStatsApiPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.AvatarController.html b/PlausibleWeb.AvatarController.html index f898070e2..b9f5c0dc3 100644 --- a/PlausibleWeb.AvatarController.html +++ b/PlausibleWeb.AvatarController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.BillingController.html b/PlausibleWeb.BillingController.html index eb44b2b90..11d530af8 100644 --- a/PlausibleWeb.BillingController.html +++ b/PlausibleWeb.BillingController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.BillingView.html b/PlausibleWeb.BillingView.html index d12c82e11..83e2a3da7 100644 --- a/PlausibleWeb.BillingView.html +++ b/PlausibleWeb.BillingView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.CRMAuthPlug.html b/PlausibleWeb.CRMAuthPlug.html index 8b54bb77f..20922a7c9 100644 --- a/PlausibleWeb.CRMAuthPlug.html +++ b/PlausibleWeb.CRMAuthPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Captcha.html b/PlausibleWeb.Captcha.html index 9b819835e..0072ddac4 100644 --- a/PlausibleWeb.Captcha.html +++ b/PlausibleWeb.Captcha.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Components.Billing.PlanBenefits.html b/PlausibleWeb.Components.Billing.PlanBenefits.html index 31fbb53c5..2ac4629d4 100644 --- a/PlausibleWeb.Components.Billing.PlanBenefits.html +++ b/PlausibleWeb.Components.Billing.PlanBenefits.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Components.Generic.html b/PlausibleWeb.Components.Generic.html index c1640d2dd..fa62b565e 100644 --- a/PlausibleWeb.Components.Generic.html +++ b/PlausibleWeb.Components.Generic.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Components.Google.html b/PlausibleWeb.Components.Google.html index d4fed0309..d39700f84 100644 --- a/PlausibleWeb.Components.Google.html +++ b/PlausibleWeb.Components.Google.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Components.Settings.html b/PlausibleWeb.Components.Settings.html index 30e809d88..a9da992d3 100644 --- a/PlausibleWeb.Components.Settings.html +++ b/PlausibleWeb.Components.Settings.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Components.Site.Feature.html b/PlausibleWeb.Components.Site.Feature.html index c65e0090a..a45d57bf1 100644 --- a/PlausibleWeb.Components.Site.Feature.html +++ b/PlausibleWeb.Components.Site.Feature.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Components.TwoFactor.html b/PlausibleWeb.Components.TwoFactor.html index 4217dc9eb..aab168527 100644 --- a/PlausibleWeb.Components.TwoFactor.html +++ b/PlausibleWeb.Components.TwoFactor.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.ConnCase.html b/PlausibleWeb.ConnCase.html index 8aa231824..b5bf592ba 100644 --- a/PlausibleWeb.ConnCase.html +++ b/PlausibleWeb.ConnCase.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.ControllerHelpers.html b/PlausibleWeb.ControllerHelpers.html index 9603be967..1e10cccd1 100644 --- a/PlausibleWeb.ControllerHelpers.html +++ b/PlausibleWeb.ControllerHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Controllers.API.Revenue.html b/PlausibleWeb.Controllers.API.Revenue.html index 1af476c89..0828ff8a4 100644 --- a/PlausibleWeb.Controllers.API.Revenue.html +++ b/PlausibleWeb.Controllers.API.Revenue.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Dogfood.html b/PlausibleWeb.Dogfood.html index 758e25b1a..fa6b75c66 100644 --- a/PlausibleWeb.Dogfood.html +++ b/PlausibleWeb.Dogfood.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Email.html b/PlausibleWeb.Email.html index 2957778e0..4f8d556d0 100644 --- a/PlausibleWeb.Email.html +++ b/PlausibleWeb.Email.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.EmailView.html b/PlausibleWeb.EmailView.html index dc96ae9a3..19dd8de3c 100644 --- a/PlausibleWeb.EmailView.html +++ b/PlausibleWeb.EmailView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Endpoint.html b/PlausibleWeb.Endpoint.html index 34f7aeebf..513f759aa 100644 --- a/PlausibleWeb.Endpoint.html +++ b/PlausibleWeb.Endpoint.html @@ -13,7 +13,7 @@ - + @@ -702,7 +702,7 @@ under a supervision tree.

    runtime_session(conn, opts)

    - + View Source @@ -724,7 +724,7 @@ under a supervision tree.

    runtime_session_opts()

    - + View Source @@ -768,7 +768,7 @@ under a supervision tree.

    secure_cookie?()

    - + View Source @@ -997,7 +997,7 @@ URL helpers.

    websocket_url()

    - + View Source diff --git a/PlausibleWeb.ErrorHelpers.html b/PlausibleWeb.ErrorHelpers.html index 789592b89..350966730 100644 --- a/PlausibleWeb.ErrorHelpers.html +++ b/PlausibleWeb.ErrorHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.ErrorReportController.html b/PlausibleWeb.ErrorReportController.html index 11b67cd9a..347439f27 100644 --- a/PlausibleWeb.ErrorReportController.html +++ b/PlausibleWeb.ErrorReportController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.ErrorView.html b/PlausibleWeb.ErrorView.html index 54029699f..7f1635ef9 100644 --- a/PlausibleWeb.ErrorView.html +++ b/PlausibleWeb.ErrorView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Favicon.html b/PlausibleWeb.Favicon.html index 09a3f29b0..d1cfda511 100644 --- a/PlausibleWeb.Favicon.html +++ b/PlausibleWeb.Favicon.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.FirstLaunchPlug.Test.html b/PlausibleWeb.FirstLaunchPlug.Test.html index a4b81f5e6..bf46afac1 100644 --- a/PlausibleWeb.FirstLaunchPlug.Test.html +++ b/PlausibleWeb.FirstLaunchPlug.Test.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.FirstLaunchPlug.html b/PlausibleWeb.FirstLaunchPlug.html index ef136b509..2cac0d51a 100644 --- a/PlausibleWeb.FirstLaunchPlug.html +++ b/PlausibleWeb.FirstLaunchPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.FormHelpers.html b/PlausibleWeb.FormHelpers.html index d8400cf2f..4d950be60 100644 --- a/PlausibleWeb.FormHelpers.html +++ b/PlausibleWeb.FormHelpers.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.InvitationController.html b/PlausibleWeb.InvitationController.html index af2b3c146..96d67327b 100644 --- a/PlausibleWeb.InvitationController.html +++ b/PlausibleWeb.InvitationController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.LastSeenPlug.html b/PlausibleWeb.LastSeenPlug.html index ce6d38881..77b2941ee 100644 --- a/PlausibleWeb.LastSeenPlug.html +++ b/PlausibleWeb.LastSeenPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.LayoutView.JWT.html b/PlausibleWeb.LayoutView.JWT.html index 45d5474f9..1adf083dd 100644 --- a/PlausibleWeb.LayoutView.JWT.html +++ b/PlausibleWeb.LayoutView.JWT.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.LayoutView.html b/PlausibleWeb.LayoutView.html index 6f15cb461..d648343a7 100644 --- a/PlausibleWeb.LayoutView.html +++ b/PlausibleWeb.LayoutView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.ChoosePlan.html b/PlausibleWeb.Live.ChoosePlan.html index 594e88a56..69ee92a7f 100644 --- a/PlausibleWeb.Live.ChoosePlan.html +++ b/PlausibleWeb.Live.ChoosePlan.html @@ -13,7 +13,7 @@ - + @@ -140,16 +140,6 @@ Plausible -
    - - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    - -
    -
    mount(params, map, socket) @@ -213,28 +203,6 @@ Functions

    Callback implementation for Phoenix.LiveView.handle_event/3.

    -
    - -
    - - - Link to this function - -

    handle_info(arg, socket)

    - - - - View Source - - - -
    - -
    - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    -
    -
    diff --git a/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html b/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html index 884bd8371..cf8172d68 100644 --- a/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html +++ b/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.Components.ComboBox.html b/PlausibleWeb.Live.Components.ComboBox.html index eedaf414e..7b8f795b7 100644 --- a/PlausibleWeb.Live.Components.ComboBox.html +++ b/PlausibleWeb.Live.Components.ComboBox.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.Components.Form.html b/PlausibleWeb.Live.Components.Form.html index ab88f8b2c..7bfacf8d2 100644 --- a/PlausibleWeb.Live.Components.Form.html +++ b/PlausibleWeb.Live.Components.Form.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.Components.Pagination.html b/PlausibleWeb.Live.Components.Pagination.html index d496762de..968485eec 100644 --- a/PlausibleWeb.Live.Components.Pagination.html +++ b/PlausibleWeb.Live.Components.Pagination.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.Components.Visitors.html b/PlausibleWeb.Live.Components.Visitors.html index 724fe4437..5135a8cce 100644 --- a/PlausibleWeb.Live.Components.Visitors.html +++ b/PlausibleWeb.Live.Components.Visitors.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.Flash.html b/PlausibleWeb.Live.Flash.html index c82401885..f2a5f0120 100644 --- a/PlausibleWeb.Live.Flash.html +++ b/PlausibleWeb.Live.Flash.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.FunnelSettings.Form.html b/PlausibleWeb.Live.FunnelSettings.Form.html index 32e20a05f..281c6f8c6 100644 --- a/PlausibleWeb.Live.FunnelSettings.Form.html +++ b/PlausibleWeb.Live.FunnelSettings.Form.html @@ -13,7 +13,7 @@ - + @@ -294,7 +294,7 @@ Functions

    handle_info(arg1, socket)

    - + View Source diff --git a/PlausibleWeb.Live.FunnelSettings.List.html b/PlausibleWeb.Live.FunnelSettings.List.html index 429a073eb..a13ccbcfa 100644 --- a/PlausibleWeb.Live.FunnelSettings.List.html +++ b/PlausibleWeb.Live.FunnelSettings.List.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.FunnelSettings.html b/PlausibleWeb.Live.FunnelSettings.html index ce77e7910..321d552f6 100644 --- a/PlausibleWeb.Live.FunnelSettings.html +++ b/PlausibleWeb.Live.FunnelSettings.html @@ -13,7 +13,7 @@ - + @@ -192,7 +192,7 @@ Functions

    handle_event(binary, arg2, socket)

    - + View Source @@ -214,7 +214,7 @@ Functions

    handle_info(arg1, socket)

    - + View Source @@ -236,7 +236,7 @@ Functions

    mount(params, map, socket)

    - + View Source @@ -258,7 +258,7 @@ Functions

    render(assigns)

    - + View Source diff --git a/PlausibleWeb.Live.GoalSettings.Form.html b/PlausibleWeb.Live.GoalSettings.Form.html index 38b3c69c6..cf15258e6 100644 --- a/PlausibleWeb.Live.GoalSettings.Form.html +++ b/PlausibleWeb.Live.GoalSettings.Form.html @@ -13,7 +13,7 @@ - + @@ -150,16 +150,6 @@ Plausible
    -
    - - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    - -
    -
    mount(params, map, socket) @@ -264,7 +254,7 @@ Functions

    handle_event(binary, arg2, socket)

    - + View Source @@ -277,28 +267,6 @@ Functions

    Callback implementation for Phoenix.LiveView.handle_event/3.

    -
    - -
    - - - Link to this function - -

    handle_info(arg, socket)

    - - - - View Source - - - -
    - -
    - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    -
    -
    @@ -308,7 +276,7 @@ Functions

    mount(params, map, socket)

    - + View Source @@ -358,7 +326,7 @@ Functions

    pageviews_tab(assigns)

    - + View Source @@ -380,7 +348,7 @@ Functions

    render(assigns)

    - + View Source @@ -402,7 +370,7 @@ Functions

    suggest_page_paths(input, options, site)

    - + View Source @@ -424,7 +392,7 @@ Functions

    tabs(assigns)

    - + View Source diff --git a/PlausibleWeb.Live.GoalSettings.List.html b/PlausibleWeb.Live.GoalSettings.List.html index 88c053afb..06f155eb8 100644 --- a/PlausibleWeb.Live.GoalSettings.List.html +++ b/PlausibleWeb.Live.GoalSettings.List.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.GoalSettings.html b/PlausibleWeb.Live.GoalSettings.html index bfcd07b08..471e9e5bf 100644 --- a/PlausibleWeb.Live.GoalSettings.html +++ b/PlausibleWeb.Live.GoalSettings.html @@ -13,7 +13,7 @@ - + @@ -192,7 +192,7 @@ Functions

    handle_event(binary, arg2, socket)

    - + View Source @@ -214,7 +214,7 @@ Functions

    handle_info(arg1, socket)

    - + View Source @@ -236,7 +236,7 @@ Functions

    mount(params, map, socket)

    - + View Source @@ -258,7 +258,7 @@ Functions

    render(assigns)

    - + View Source diff --git a/PlausibleWeb.Live.Plugins.API.Settings.html b/PlausibleWeb.Live.Plugins.API.Settings.html index 8f3e0a3a6..7c8fdb85b 100644 --- a/PlausibleWeb.Live.Plugins.API.Settings.html +++ b/PlausibleWeb.Live.Plugins.API.Settings.html @@ -13,7 +13,7 @@ - + @@ -214,7 +214,7 @@ Functions

    handle_info(arg1, socket)

    - + View Source diff --git a/PlausibleWeb.Live.Plugins.API.TokenForm.html b/PlausibleWeb.Live.Plugins.API.TokenForm.html index f7496427e..be0fcfd1d 100644 --- a/PlausibleWeb.Live.Plugins.API.TokenForm.html +++ b/PlausibleWeb.Live.Plugins.API.TokenForm.html @@ -13,7 +13,7 @@ - + @@ -140,16 +140,6 @@ Plausible
    -
    - - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    - -
    -
    mount(params, map, socket) @@ -205,28 +195,6 @@ Functions

    Callback implementation for Phoenix.LiveView.handle_event/3.

    -
    - -
    - - - Link to this function - -

    handle_info(arg, socket)

    - - - - View Source - - - -
    - -
    - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    -
    -
    diff --git a/PlausibleWeb.Live.PropsSettings.Form.html b/PlausibleWeb.Live.PropsSettings.Form.html index 83c45b88b..6dee81704 100644 --- a/PlausibleWeb.Live.PropsSettings.Form.html +++ b/PlausibleWeb.Live.PropsSettings.Form.html @@ -13,7 +13,7 @@ - + @@ -214,7 +214,7 @@ Functions

    handle_info(arg, socket)

    - + View Source diff --git a/PlausibleWeb.Live.PropsSettings.List.html b/PlausibleWeb.Live.PropsSettings.List.html index 35a4fc24c..082ebf46f 100644 --- a/PlausibleWeb.Live.PropsSettings.List.html +++ b/PlausibleWeb.Live.PropsSettings.List.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Live.PropsSettings.html b/PlausibleWeb.Live.PropsSettings.html index b26589822..f560415b8 100644 --- a/PlausibleWeb.Live.PropsSettings.html +++ b/PlausibleWeb.Live.PropsSettings.html @@ -13,7 +13,7 @@ - + @@ -192,7 +192,7 @@ Functions

    handle_event(binary, arg2, socket)

    - + View Source @@ -214,7 +214,7 @@ Functions

    handle_info(arg1, socket)

    - + View Source @@ -236,7 +236,7 @@ Functions

    mount(params, map, socket)

    - + View Source @@ -258,7 +258,7 @@ Functions

    render(assigns)

    - + View Source diff --git a/PlausibleWeb.Live.RegisterForm.html b/PlausibleWeb.Live.RegisterForm.html index 772e6c137..f78a13d18 100644 --- a/PlausibleWeb.Live.RegisterForm.html +++ b/PlausibleWeb.Live.RegisterForm.html @@ -13,7 +13,7 @@ - + @@ -140,16 +140,6 @@ Plausible
    -
    - - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    - -
    -
    mount(params, session, socket) @@ -192,7 +182,7 @@ Functions

    handle_event(binary, params, socket)

    - + View Source @@ -205,28 +195,6 @@ Functions

    Callback implementation for Phoenix.LiveView.handle_event/3.

    -
    - -
    - - - Link to this function - -

    handle_info(arg, socket)

    - - - - View Source - - - -
    - -
    - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    -
    -
    @@ -236,7 +204,7 @@ Functions

    mount(params, session, socket)

    - + View Source @@ -258,7 +226,7 @@ Functions

    render(assigns)

    - + View Source diff --git a/PlausibleWeb.Live.ResetPasswordForm.html b/PlausibleWeb.Live.ResetPasswordForm.html index 5e1838b8e..ec3f47598 100644 --- a/PlausibleWeb.Live.ResetPasswordForm.html +++ b/PlausibleWeb.Live.ResetPasswordForm.html @@ -13,7 +13,7 @@ - + @@ -140,16 +140,6 @@ Plausible
    -
    - - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    - -
    -
    mount(params, map, socket) @@ -205,28 +195,6 @@ Functions

    Callback implementation for Phoenix.LiveView.handle_event/3.

    -
    - -
    - - - Link to this function - -

    handle_info(arg, socket)

    - - - - View Source - - - -
    - -
    - -

    Callback implementation for Phoenix.LiveView.handle_info/2.

    -
    -
    diff --git a/PlausibleWeb.Live.SentryContext.html b/PlausibleWeb.Live.SentryContext.html deleted file mode 100644 index 446a8cd5a..000000000 --- a/PlausibleWeb.Live.SentryContext.html +++ /dev/null @@ -1,217 +0,0 @@ - - - - - - - - - - PlausibleWeb.Live.SentryContext — Plausible v0.0.1 - - - - - - - - - - - - - - - - -
    - - - - - -
    - -
    -
    - -

    - - - - - - View Source - - - PlausibleWeb.Live.SentryContext - (Plausible v0.0.1) - -

    - - -
    -

    This module tries to supply LiveViews with some common Sentry context -(without it, there is practically none).

    Use via use PlausibleWeb.Live.SentryContext in your LiveView module, -or preferably via use PlausibleWeb, :live_view.

    In case you have multiple LiveViews, there is use PlausibleWeb, live_view: :no_sentry_context -exposed that allows you to skip using this module. This is because -only the root LiveView has access to connect_info and an exception will be -thrown otherwise.

    -
    - - -
    -

    - - - Summary - -

    - - -
    - - -
    -

    - - -Functions - -

    -
    -
    - -
    - - - Link to this function - -

    on_mount(atom, params, session, socket)

    - - - - View Source - - - -
    - -
    - - -
    -
    - -
    -
    - - -
    -
    -
    -
    - - - - - - diff --git a/PlausibleWeb.Live.Sites.html b/PlausibleWeb.Live.Sites.html index 02fce479a..67a1fe83d 100644 --- a/PlausibleWeb.Live.Sites.html +++ b/PlausibleWeb.Live.Sites.html @@ -13,7 +13,7 @@ - + @@ -296,7 +296,7 @@ Functions

    ellipsis_menu(assigns)

    - + View Source @@ -318,7 +318,7 @@ Functions

    favicon(assigns)

    - + View Source @@ -340,7 +340,7 @@ Functions

    handle_event(binary, arg2, socket)

    - + View Source @@ -362,7 +362,7 @@ Functions

    handle_info(arg, socket)

    - + View Source @@ -384,7 +384,7 @@ Functions

    handle_params(params, uri, socket)

    - + View Source @@ -490,7 +490,7 @@ Functions

    mount(params, map, socket)

    - + View Source @@ -540,7 +540,7 @@ Functions

    render(assigns)

    - + View Source @@ -646,7 +646,7 @@ Functions

    upgrade_nag_screen(assigns)

    - + View Source diff --git a/PlausibleWeb.MJML.StatsReport.html b/PlausibleWeb.MJML.StatsReport.html index a26c23720..07e84f4e3 100644 --- a/PlausibleWeb.MJML.StatsReport.html +++ b/PlausibleWeb.MJML.StatsReport.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.PageController.html b/PlausibleWeb.PageController.html index eef0d6f9e..5280bebe1 100644 --- a/PlausibleWeb.PageController.html +++ b/PlausibleWeb.PageController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.PageView.html b/PlausibleWeb.PageView.html index 3c5f5be8c..30a2cbef6 100644 --- a/PlausibleWeb.PageView.html +++ b/PlausibleWeb.PageView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Controllers.CustomProps.html b/PlausibleWeb.Plugins.API.Controllers.CustomProps.html index b137655a8..e15c22aa4 100644 --- a/PlausibleWeb.Plugins.API.Controllers.CustomProps.html +++ b/PlausibleWeb.Plugins.API.Controllers.CustomProps.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Controllers.Goals.html b/PlausibleWeb.Plugins.API.Controllers.Goals.html index ebe5ae55f..8154d52fd 100644 --- a/PlausibleWeb.Plugins.API.Controllers.Goals.html +++ b/PlausibleWeb.Plugins.API.Controllers.Goals.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Controllers.SharedLinks.html b/PlausibleWeb.Plugins.API.Controllers.SharedLinks.html index 625fe893f..fa0f77f20 100644 --- a/PlausibleWeb.Plugins.API.Controllers.SharedLinks.html +++ b/PlausibleWeb.Plugins.API.Controllers.SharedLinks.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Errors.html b/PlausibleWeb.Plugins.API.Errors.html index 14afea31f..aee5c7ee6 100644 --- a/PlausibleWeb.Plugins.API.Errors.html +++ b/PlausibleWeb.Plugins.API.Errors.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Router.html b/PlausibleWeb.Plugins.API.Router.html index 5343161c5..840f190b2 100644 --- a/PlausibleWeb.Plugins.API.Router.html +++ b/PlausibleWeb.Plugins.API.Router.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html b/PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html index 2041ae6ea..3b1be2ca4 100644 --- a/PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html b/PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html index 82e7d5d85..905ca8698 100644 --- a/PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html b/PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html index 7311e5b81..f3635fb38 100644 --- a/PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html +++ b/PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.CustomProp.html b/PlausibleWeb.Plugins.API.Schemas.CustomProp.html index 6acb36373..a9b7b1d8b 100644 --- a/PlausibleWeb.Plugins.API.Schemas.CustomProp.html +++ b/PlausibleWeb.Plugins.API.Schemas.CustomProp.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Error.html b/PlausibleWeb.Plugins.API.Schemas.Error.html index e958ef1ee..be005e340 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Error.html +++ b/PlausibleWeb.Plugins.API.Schemas.Error.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html index c7eeecef9..cb7466a3a 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html index 51e060e28..166eee1c6 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html index 87288f253..8bbe3ccca 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html index a4fc87001..6531a3e35 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html index 4f1c47037..d2e2973fc 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html b/PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html index 73a629be3..587a33429 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html b/PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html index ebe1dc8b9..65ffdb9d7 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html b/PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html index 22fafd60f..6cbefd6df 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html b/PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html index 7cffa74fe..a94073929 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.Type.html b/PlausibleWeb.Plugins.API.Schemas.Goal.Type.html index e1b1825a3..5505b4ec9 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.Type.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.Type.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.html b/PlausibleWeb.Plugins.API.Schemas.Goal.html index 2aadb9609..a204c2f46 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Link.html b/PlausibleWeb.Plugins.API.Schemas.Link.html index fc2e5f70a..58c06ecca 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Link.html +++ b/PlausibleWeb.Plugins.API.Schemas.Link.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.NotFound.html b/PlausibleWeb.Plugins.API.Schemas.NotFound.html index 037643e65..949d3fb93 100644 --- a/PlausibleWeb.Plugins.API.Schemas.NotFound.html +++ b/PlausibleWeb.Plugins.API.Schemas.NotFound.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html b/PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html index 28a222a99..f8fa864d3 100644 --- a/PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html +++ b/PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html b/PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html index c9b945a17..6836a69c0 100644 --- a/PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html +++ b/PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html b/PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html index 1564ea5d4..27056acbb 100644 --- a/PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html b/PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html index 124da9127..c595760ed 100644 --- a/PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html +++ b/PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.SharedLink.html b/PlausibleWeb.Plugins.API.Schemas.SharedLink.html index 95129c2d2..7dd058189 100644 --- a/PlausibleWeb.Plugins.API.Schemas.SharedLink.html +++ b/PlausibleWeb.Plugins.API.Schemas.SharedLink.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Unauthorized.html b/PlausibleWeb.Plugins.API.Schemas.Unauthorized.html index 78c85b137..0cb1aa946 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Unauthorized.html +++ b/PlausibleWeb.Plugins.API.Schemas.Unauthorized.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html b/PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html index 1d7273286..b2b9856d7 100644 --- a/PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html +++ b/PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Spec.html b/PlausibleWeb.Plugins.API.Spec.html index 5ecd3134c..264346bd7 100644 --- a/PlausibleWeb.Plugins.API.Spec.html +++ b/PlausibleWeb.Plugins.API.Spec.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.CustomProp.html b/PlausibleWeb.Plugins.API.Views.CustomProp.html index 10be10857..0d0a93df2 100644 --- a/PlausibleWeb.Plugins.API.Views.CustomProp.html +++ b/PlausibleWeb.Plugins.API.Views.CustomProp.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.Error.html b/PlausibleWeb.Plugins.API.Views.Error.html index c3dc50f3f..894f082f7 100644 --- a/PlausibleWeb.Plugins.API.Views.Error.html +++ b/PlausibleWeb.Plugins.API.Views.Error.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.Goal.html b/PlausibleWeb.Plugins.API.Views.Goal.html index 2c45e511c..208774e0b 100644 --- a/PlausibleWeb.Plugins.API.Views.Goal.html +++ b/PlausibleWeb.Plugins.API.Views.Goal.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.Pagination.html b/PlausibleWeb.Plugins.API.Views.Pagination.html index 089bff9c1..65d8ca7d8 100644 --- a/PlausibleWeb.Plugins.API.Views.Pagination.html +++ b/PlausibleWeb.Plugins.API.Views.Pagination.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.SharedLink.html b/PlausibleWeb.Plugins.API.Views.SharedLink.html index 607e40c7a..b4507bb41 100644 --- a/PlausibleWeb.Plugins.API.Views.SharedLink.html +++ b/PlausibleWeb.Plugins.API.Views.SharedLink.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.html b/PlausibleWeb.Plugins.API.html index 1dfe62bc6..b607a60d2 100644 --- a/PlausibleWeb.Plugins.API.html +++ b/PlausibleWeb.Plugins.API.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.PluginsAPICase.html b/PlausibleWeb.PluginsAPICase.html index 44bbc6510..f7cc56c2c 100644 --- a/PlausibleWeb.PluginsAPICase.html +++ b/PlausibleWeb.PluginsAPICase.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugs.AuthorizePluginsAPI.html b/PlausibleWeb.Plugs.AuthorizePluginsAPI.html index e5f682c1b..6f89a7637 100644 --- a/PlausibleWeb.Plugs.AuthorizePluginsAPI.html +++ b/PlausibleWeb.Plugs.AuthorizePluginsAPI.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugs.ErrorHandler.html b/PlausibleWeb.Plugs.ErrorHandler.html index 94efeece9..93369122f 100644 --- a/PlausibleWeb.Plugs.ErrorHandler.html +++ b/PlausibleWeb.Plugs.ErrorHandler.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugs.MaybeDisableRegistration.html b/PlausibleWeb.Plugs.MaybeDisableRegistration.html index cf4f915c9..0fde2d1f6 100644 --- a/PlausibleWeb.Plugs.MaybeDisableRegistration.html +++ b/PlausibleWeb.Plugs.MaybeDisableRegistration.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Plugs.NoRobots.html b/PlausibleWeb.Plugs.NoRobots.html index fe623cd3b..e2a59aa64 100644 --- a/PlausibleWeb.Plugs.NoRobots.html +++ b/PlausibleWeb.Plugs.NoRobots.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.RefInspector.html b/PlausibleWeb.RefInspector.html index 492ba7835..3a246a89e 100644 --- a/PlausibleWeb.RefInspector.html +++ b/PlausibleWeb.RefInspector.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.RemoteIp.html b/PlausibleWeb.RemoteIp.html index 69469d9c7..d453b9adc 100644 --- a/PlausibleWeb.RemoteIp.html +++ b/PlausibleWeb.RemoteIp.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.RequireAccountPlug.html b/PlausibleWeb.RequireAccountPlug.html index 0815caf5d..7bead3aa5 100644 --- a/PlausibleWeb.RequireAccountPlug.html +++ b/PlausibleWeb.RequireAccountPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.RequireLoggedOutPlug.html b/PlausibleWeb.RequireLoggedOutPlug.html index 1d0dedcb8..78a91b906 100644 --- a/PlausibleWeb.RequireLoggedOutPlug.html +++ b/PlausibleWeb.RequireLoggedOutPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Router.html b/PlausibleWeb.Router.html index 3ab3585b5..712996eea 100644 --- a/PlausibleWeb.Router.html +++ b/PlausibleWeb.Router.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.SessionTimeoutPlug.html b/PlausibleWeb.SessionTimeoutPlug.html index b93c3265b..c7e78e10d 100644 --- a/PlausibleWeb.SessionTimeoutPlug.html +++ b/PlausibleWeb.SessionTimeoutPlug.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Site.MembershipController.html b/PlausibleWeb.Site.MembershipController.html index b4ba10850..536466991 100644 --- a/PlausibleWeb.Site.MembershipController.html +++ b/PlausibleWeb.Site.MembershipController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Site.MembershipView.html b/PlausibleWeb.Site.MembershipView.html index 9c7cbad88..c1ac0346e 100644 --- a/PlausibleWeb.Site.MembershipView.html +++ b/PlausibleWeb.Site.MembershipView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.SiteController.html b/PlausibleWeb.SiteController.html index de1801918..589510b73 100644 --- a/PlausibleWeb.SiteController.html +++ b/PlausibleWeb.SiteController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.SiteView.html b/PlausibleWeb.SiteView.html index f6502799b..cb524065e 100644 --- a/PlausibleWeb.SiteView.html +++ b/PlausibleWeb.SiteView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.StatsController.html b/PlausibleWeb.StatsController.html index 317a6ace7..dae02d326 100644 --- a/PlausibleWeb.StatsController.html +++ b/PlausibleWeb.StatsController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.StatsView.html b/PlausibleWeb.StatsView.html index 49956c22c..3b87490ce 100644 --- a/PlausibleWeb.StatsView.html +++ b/PlausibleWeb.StatsView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.Tracker.html b/PlausibleWeb.Tracker.html index 6f951d84c..e47829b01 100644 --- a/PlausibleWeb.Tracker.html +++ b/PlausibleWeb.Tracker.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.TwoFactor.Session.html b/PlausibleWeb.TwoFactor.Session.html index eecb3b37e..1e5f7520b 100644 --- a/PlausibleWeb.TwoFactor.Session.html +++ b/PlausibleWeb.TwoFactor.Session.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.UnsubscribeController.html b/PlausibleWeb.UnsubscribeController.html index d9f9cb944..6e4ba55a9 100644 --- a/PlausibleWeb.UnsubscribeController.html +++ b/PlausibleWeb.UnsubscribeController.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.UnsubscribeView.html b/PlausibleWeb.UnsubscribeView.html index 29055ff43..53df37e51 100644 --- a/PlausibleWeb.UnsubscribeView.html +++ b/PlausibleWeb.UnsubscribeView.html @@ -13,7 +13,7 @@ - + diff --git a/PlausibleWeb.html b/PlausibleWeb.html index 0d29f75a9..3bb6d12ae 100644 --- a/PlausibleWeb.html +++ b/PlausibleWeb.html @@ -13,7 +13,7 @@ - + @@ -152,14 +152,6 @@ Plausible
    -
    - - -
    -
    open_api_schema() @@ -222,7 +214,7 @@ Functions

    __using__(which)

    - + View Source @@ -246,7 +238,7 @@ Functions

    channel()

    - + View Source @@ -268,30 +260,6 @@ Functions

    controller()

    - - - View Source - - - -
    - -
    - - -
    -
    -
    - - - -
    - - - Link to this function - -

    live_view(opts \\ [])

    - View Source @@ -314,7 +282,7 @@ Functions

    open_api_schema()

    - + View Source @@ -336,7 +304,7 @@ Functions

    plugins_api_controller()

    - + View Source @@ -358,7 +326,7 @@ Functions

    plugins_api_view()

    - + View Source @@ -380,7 +348,7 @@ Functions

    router()

    - + View Source @@ -402,7 +370,7 @@ Functions

    view()

    - + View Source diff --git a/account-locking.html b/account-locking.html index a9a73a82c..8c4d28bf9 100644 --- a/account-locking.html +++ b/account-locking.html @@ -13,7 +13,7 @@ - + diff --git a/api-reference.html b/api-reference.html index b72314d58..1f354969f 100644 --- a/api-reference.html +++ b/api-reference.html @@ -13,7 +13,7 @@ - + @@ -2110,16 +2110,6 @@ and the number of steps they have.

    LiveView for password reset form.

    - -
    - - -

    This module tries to supply LiveViews with some common Sentry context -(without it, there is practically none).

    -
    diff --git a/contributing.html b/contributing.html index 150f41a97..d56e505e1 100644 --- a/contributing.html +++ b/contributing.html @@ -13,7 +13,7 @@ - + diff --git a/dist/search_data-7F0A356C.js b/dist/search_data-1EFECFFF.js similarity index 67% rename from dist/search_data-7F0A356C.js rename to dist/search_data-1EFECFFF.js index 822434d1e..7dadb1f56 100644 --- a/dist/search_data-7F0A356C.js +++ b/dist/search_data-1EFECFFF.js @@ -1 +1 @@ -searchData={"items":[{"type":"task","title":"mix cancel_subscription","doc":"This task is meant to replicate the behavior of cancelling\na subscription. On production, this action is initiated by\na Paddle webhook. Currently, only the subscription status\nis changed with that action.","ref":"Mix.Tasks.CancelSubscription.html"},{"type":"function","title":"Mix.Tasks.CancelSubscription.run/1","doc":"","ref":"Mix.Tasks.CancelSubscription.html#run/1"},{"type":"task","title":"mix clean_clickhouse","doc":"","ref":"Mix.Tasks.CleanClickhouse.html"},{"type":"function","title":"Mix.Tasks.CleanClickhouse.run/1","doc":"","ref":"Mix.Tasks.CleanClickhouse.html#run/1"},{"type":"task","title":"mix create_free_subscription","doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html"},{"type":"function","title":"Mix.Tasks.CreateFreeSubscription.execute/1","doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html#execute/1"},{"type":"function","title":"Mix.Tasks.CreateFreeSubscription.run/1","doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html#run/1"},{"type":"task","title":"mix download_country_database","doc":"This task downloads the Country Lite database from DB-IP for self-hosted or development purposes.\nPlausible Cloud runs a paid version of DB-IP with more detailed geolocation data.","ref":"Mix.Tasks.DownloadCountryDatabase.html"},{"type":"function","title":"Mix.Tasks.DownloadCountryDatabase.run/1","doc":"","ref":"Mix.Tasks.DownloadCountryDatabase.html#run/1"},{"type":"task","title":"mix generate_referrer_favicons","doc":"","ref":"Mix.Tasks.GenerateReferrerFavicons.html"},{"type":"function","title":"Mix.Tasks.GenerateReferrerFavicons.run/1","doc":"","ref":"Mix.Tasks.GenerateReferrerFavicons.html#run/1"},{"type":"task","title":"mix pull_sandbox_subscription","doc":"","ref":"Mix.Tasks.PullSandboxSubscription.html"},{"type":"function","title":"Mix.Tasks.PullSandboxSubscription.run/1","doc":"","ref":"Mix.Tasks.PullSandboxSubscription.html#run/1"},{"type":"task","title":"mix send_pageview","doc":"It's often necessary to generate fake events for development and testing purposes. This Mix Task provides a quick and easy\nway to generate a pageview or custom event, either in your development environment or a remote Plausible instance.\n\nSee Mix.Tasks.SendPageview.usage/1 for more detailed documentation.","ref":"Mix.Tasks.SendPageview.html"},{"type":"function","title":"Mix.Tasks.SendPageview.run/1","doc":"","ref":"Mix.Tasks.SendPageview.html#run/1"},{"type":"module","title":"ObanErrorReporter","doc":"","ref":"ObanErrorReporter.html"},{"type":"function","title":"ObanErrorReporter.handle_event/4","doc":"","ref":"ObanErrorReporter.html#handle_event/4"},{"type":"module","title":"Plausible","doc":"Build-related macros","ref":"Plausible.html"},{"type":"function","title":"Plausible.do_on_full_build/1","doc":"","ref":"Plausible.html#do_on_full_build/1"},{"type":"macro","title":"Plausible.full_build?/0","doc":"","ref":"Plausible.html#full_build?/0"},{"type":"macro","title":"Plausible.on_full_build/1","doc":"","ref":"Plausible.html#on_full_build/1"},{"type":"macro","title":"Plausible.small_build?/0","doc":"","ref":"Plausible.html#small_build?/0"},{"type":"module","title":"Plausible.AsyncInsertRepo","doc":"Clickhouse access with async inserts enabled","ref":"Plausible.AsyncInsertRepo.html"},{"type":"function","title":"Plausible.AsyncInsertRepo.aggregate/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#aggregate/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.aggregate/4","doc":"","ref":"Plausible.AsyncInsertRepo.html#aggregate/4"},{"type":"function","title":"Plausible.AsyncInsertRepo.all/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#all/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.checked_out?/0","doc":"","ref":"Plausible.AsyncInsertRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.AsyncInsertRepo.checkout/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#checkout/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.child_spec/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#child_spec/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.config/0","doc":"","ref":"Plausible.AsyncInsertRepo.html#config/0"},{"type":"function","title":"Plausible.AsyncInsertRepo.default_options/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#default_options/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.delete/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#delete/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.delete!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#delete!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.delete_all/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#delete_all/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.AsyncInsertRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.exists?/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#exists?/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.get/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#get/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.get!/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#get!/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.get_by/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#get_by/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.get_by!/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#get_by!/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.AsyncInsertRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert_all/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert_all/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert_or_update/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert_or_update!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.AsyncInsertRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.load/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#load/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.one/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#one/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.one!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#one!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.preload/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#preload/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.prepare_query/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.AsyncInsertRepo.html#query/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.AsyncInsertRepo.html#query!/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.reload/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#reload/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.reload!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#reload!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.start_link/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#start_link/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.stop/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#stop/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.stream/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#stream/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.AsyncInsertRepo.html#to_sql/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.update/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#update/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.update!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#update!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.update_all/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#update_all/3"},{"type":"module","title":"Plausible.Auth","doc":"","ref":"Plausible.Auth.html"},{"type":"function","title":"Plausible.Auth.create_api_key/3","doc":"","ref":"Plausible.Auth.html#create_api_key/3"},{"type":"function","title":"Plausible.Auth.create_user/3","doc":"","ref":"Plausible.Auth.html#create_user/3"},{"type":"function","title":"Plausible.Auth.delete_api_key/2","doc":"","ref":"Plausible.Auth.html#delete_api_key/2"},{"type":"function","title":"Plausible.Auth.delete_user/1","doc":"","ref":"Plausible.Auth.html#delete_user/1"},{"type":"function","title":"Plausible.Auth.enterprise_configured?/1","doc":"","ref":"Plausible.Auth.html#enterprise_configured?/1"},{"type":"function","title":"Plausible.Auth.find_api_key/1","doc":"","ref":"Plausible.Auth.html#find_api_key/1"},{"type":"function","title":"Plausible.Auth.find_user_by/1","doc":"","ref":"Plausible.Auth.html#find_user_by/1"},{"type":"function","title":"Plausible.Auth.has_active_sites?/2","doc":"","ref":"Plausible.Auth.html#has_active_sites?/2"},{"type":"function","title":"Plausible.Auth.is_super_admin?/1","doc":"","ref":"Plausible.Auth.html#is_super_admin?/1"},{"type":"function","title":"Plausible.Auth.user_owns_sites?/1","doc":"","ref":"Plausible.Auth.html#user_owns_sites?/1"},{"type":"module","title":"Plausible.Auth.ApiKey","doc":"","ref":"Plausible.Auth.ApiKey.html"},{"type":"function","title":"Plausible.Auth.ApiKey.changeset/2","doc":"","ref":"Plausible.Auth.ApiKey.html#changeset/2"},{"type":"function","title":"Plausible.Auth.ApiKey.do_hash/1","doc":"","ref":"Plausible.Auth.ApiKey.html#do_hash/1"},{"type":"function","title":"Plausible.Auth.ApiKey.process_key/1","doc":"","ref":"Plausible.Auth.ApiKey.html#process_key/1"},{"type":"function","title":"Plausible.Auth.ApiKey.update/2","doc":"","ref":"Plausible.Auth.ApiKey.html#update/2"},{"type":"type","title":"Plausible.Auth.ApiKey.t/0","doc":"","ref":"Plausible.Auth.ApiKey.html#t:t/0"},{"type":"module","title":"Plausible.Auth.ApiKeyAdmin","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.create_changeset/2","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#create_changeset/2"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.custom_index_query/3","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#custom_index_query/3"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.form_fields/1","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#form_fields/1"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.index/1","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#index/1"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.search_fields/1","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#search_fields/1"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.update_changeset/2","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#update_changeset/2"},{"type":"module","title":"Plausible.Auth.EmailActivationCode","doc":"Schema for email activation codes.","ref":"Plausible.Auth.EmailActivationCode.html"},{"type":"function","title":"Plausible.Auth.EmailActivationCode.generate_code/0","doc":"","ref":"Plausible.Auth.EmailActivationCode.html#generate_code/0"},{"type":"function","title":"Plausible.Auth.EmailActivationCode.new/2","doc":"","ref":"Plausible.Auth.EmailActivationCode.html#new/2"},{"type":"type","title":"Plausible.Auth.EmailActivationCode.t/0","doc":"","ref":"Plausible.Auth.EmailActivationCode.html#t:t/0"},{"type":"module","title":"Plausible.Auth.EmailVerification","doc":"API for verifying emails.","ref":"Plausible.Auth.EmailVerification.html"},{"type":"function","title":"Plausible.Auth.EmailVerification.any?/1","doc":"","ref":"Plausible.Auth.EmailVerification.html#any?/1"},{"type":"function","title":"Plausible.Auth.EmailVerification.expired?/1","doc":"","ref":"Plausible.Auth.EmailVerification.html#expired?/1"},{"type":"function","title":"Plausible.Auth.EmailVerification.issue_code/2","doc":"","ref":"Plausible.Auth.EmailVerification.html#issue_code/2"},{"type":"function","title":"Plausible.Auth.EmailVerification.verify_code/2","doc":"","ref":"Plausible.Auth.EmailVerification.html#verify_code/2"},{"type":"module","title":"Plausible.Auth.GracePeriod","doc":"This embedded schema stores information about the account locking grace\nperiod.\n\nUsers are given this 7-day grace period to upgrade their account after\noutgrowing their subscriptions. The actual account locking happens in\nbackground with `Plausible.Workers.LockSites`.\n\nThe grace period can also be manual, without an end date, being controlled\nmanually from the CRM, and not by the background site locker job. This is \nuseful for enterprise subscriptions.","ref":"Plausible.Auth.GracePeriod.html"},{"type":"function","title":"Plausible.Auth.GracePeriod.active?/1","doc":"Returns whether the grace period is still active for a User. Defaults to\nfalse if the user is nil or there is no grace period.","ref":"Plausible.Auth.GracePeriod.html#active?/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.end_changeset/1","doc":"Ends an existing grace period by `setting users.grace_period.is_over` to true.\nThis means the grace period has expired.","ref":"Plausible.Auth.GracePeriod.html#end_changeset/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.expired?/1","doc":"Returns whether the grace period has already expired for a User. Defaults to\nfalse if the user is nil or there is no grace period.","ref":"Plausible.Auth.GracePeriod.html#expired?/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.remove_changeset/1","doc":"Removes the grace period from the User completely.","ref":"Plausible.Auth.GracePeriod.html#remove_changeset/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.start_changeset/2","doc":"Starts a account locking grace period of 7 days by changing the User struct.","ref":"Plausible.Auth.GracePeriod.html#start_changeset/2"},{"type":"function","title":"Plausible.Auth.GracePeriod.start_manual_lock_changeset/2","doc":"Starts a manual account locking grace period by changing the User struct. \nManual locking means the grace period can only be removed manually from the\nCRM.","ref":"Plausible.Auth.GracePeriod.html#start_manual_lock_changeset/2"},{"type":"type","title":"Plausible.Auth.GracePeriod.t/0","doc":"","ref":"Plausible.Auth.GracePeriod.html#t:t/0"},{"type":"module","title":"Plausible.Auth.Invitation","doc":"","ref":"Plausible.Auth.Invitation.html"},{"type":"function","title":"Plausible.Auth.Invitation.new/1","doc":"","ref":"Plausible.Auth.Invitation.html#new/1"},{"type":"type","title":"Plausible.Auth.Invitation.t/0","doc":"","ref":"Plausible.Auth.Invitation.html#t:t/0"},{"type":"module","title":"Plausible.Auth.Password","doc":"","ref":"Plausible.Auth.Password.html"},{"type":"function","title":"Plausible.Auth.Password.dummy_calculation/0","doc":"","ref":"Plausible.Auth.Password.html#dummy_calculation/0"},{"type":"function","title":"Plausible.Auth.Password.hash/1","doc":"","ref":"Plausible.Auth.Password.html#hash/1"},{"type":"function","title":"Plausible.Auth.Password.match?/2","doc":"","ref":"Plausible.Auth.Password.html#match?/2"},{"type":"module","title":"Plausible.Auth.TOTP","doc":"TOTP auth context\n\nHandles all the aspects of TOTP setup, management and validation for users.","ref":"Plausible.Auth.TOTP.html"},{"type":"module","title":"Setup - Plausible.Auth.TOTP","doc":"TOTP setup is started with `initiate/1`. At this stage, a random secret\nbinary is generated for user and stored under `User.totp_secret`. The secret\nis additionally encrypted while stored in the database using `Cloak`. The\nvault for safe storage is configured in `Plausible.Auth.TOTP.Vault` via\na dedicated `Ecto` type defined in `Plausible.Auth.TOTP.EncryptedBinary`.\nThe function returns updated user along with TOTP URI and a readable form\nof secret. Both - the URI and readable secret - are meant for exposure \nin the user's setup screen. The URI should be encoded as a QR code.\n\nAfter initiation, user is expected to confirm valid setup with `enable/2`,\nproviding TOTP code from their authenticator app. After code validation \npasses successfully, the `User.totp_enabled` flag is set to `true`.\nFinally, the user must be immediately presented with a list of recovery codes\nreturned by the same call of `enable/2`. The codes should be presented\nin copy/paste friendly form, ideally also with a print-friendly view option.\n\nThe `initiate/1` and `enable/1` functions can be safely called multiple\ntimes, allowing user to abort and restart setup up to these stages.","ref":"Plausible.Auth.TOTP.html#module-setup"},{"type":"module","title":"Management - Plausible.Auth.TOTP","doc":"The state of TOTP for a particular user can be chcecked by calling\n`enabled?/1` or `initiated?/1`.\n\nTOTP can be disabled with `disable/2`. User is expected to provide their\ncurrent password for safety. Once disabled, all TOTP user settings are\ncleared and any remaining generated recovery codes are removed. The function\ncan be safely run more than once.\n\nIf the user needs to regenerate the recovery codes outside of setup procedure,\nthey must do it via `generate_recovery_codes/2`, providing their current\npassword for safety. They must be warned that any existing recovery codes\nwill be invalidated.","ref":"Plausible.Auth.TOTP.html#module-management"},{"type":"module","title":"Validation - Plausible.Auth.TOTP","doc":"After logging in, user's TOTP state must be checked with `enabled?/1`.\n\nIf enabled, user must be presented with TOTP code input form accepting\n6 digit characters. The code must be checked using `validate_code/2`.\n\nUser must have an option to alternatively input one of their recovery\ncodes. Those codes must be checked with `use_recovery_code/2`.","ref":"Plausible.Auth.TOTP.html#module-validation"},{"type":"module","title":"Code validity - Plausible.Auth.TOTP","doc":"In case of TOTP codes, a grace period of 30 seconds is applied, which\nallows user to use their current and previous TOTP code, assuming 30\nsecond validity window of each. This allows user to use code that was \nabout to expire before the submission. Regardless of that, each TOTP\ncode can be used only once. Validation procedure rejects repeat use\nof the same code for safety. It's done by tracking last time a TOTP\ncode was used successfully, stored under `User.totp_last_used_at`.\n\nIn case of recovery codes, each code is deleted immediately after use.\nThey are strictly one-time use only.","ref":"Plausible.Auth.TOTP.html#module-code-validity"},{"type":"module","title":"TOTP Token - Plausible.Auth.TOTP","doc":"TOTP token is an alternate method of authenticating user session.\nIt's main use case is \"trust this device\" functionality, where user\ncan decide to skip 2FA verification for a particular browser session \nfor next N days. The token should then be stored in an encrypted,\nsigned cookie with a proper expiration timestamp.\n\nThe token should be reset each time it either fails to match\nor when other credentials (like password) are reset. This should\neffectively invalidate all trusted devices for a given user.","ref":"Plausible.Auth.TOTP.html#module-totp-token"},{"type":"function","title":"Plausible.Auth.TOTP.disable/2","doc":"","ref":"Plausible.Auth.TOTP.html#disable/2"},{"type":"function","title":"Plausible.Auth.TOTP.enable/3","doc":"","ref":"Plausible.Auth.TOTP.html#enable/3"},{"type":"function","title":"Plausible.Auth.TOTP.enabled?/1","doc":"","ref":"Plausible.Auth.TOTP.html#enabled?/1"},{"type":"function","title":"Plausible.Auth.TOTP.generate_recovery_codes/1","doc":"","ref":"Plausible.Auth.TOTP.html#generate_recovery_codes/1"},{"type":"function","title":"Plausible.Auth.TOTP.generate_recovery_codes/2","doc":"","ref":"Plausible.Auth.TOTP.html#generate_recovery_codes/2"},{"type":"function","title":"Plausible.Auth.TOTP.initiate/1","doc":"","ref":"Plausible.Auth.TOTP.html#initiate/1"},{"type":"function","title":"Plausible.Auth.TOTP.initiated?/1","doc":"","ref":"Plausible.Auth.TOTP.html#initiated?/1"},{"type":"function","title":"Plausible.Auth.TOTP.reset_token/1","doc":"","ref":"Plausible.Auth.TOTP.html#reset_token/1"},{"type":"function","title":"Plausible.Auth.TOTP.use_recovery_code/2","doc":"","ref":"Plausible.Auth.TOTP.html#use_recovery_code/2"},{"type":"function","title":"Plausible.Auth.TOTP.validate_code/3","doc":"","ref":"Plausible.Auth.TOTP.html#validate_code/3"},{"type":"module","title":"Plausible.Auth.TOTP.EncryptedBinary","doc":"Defines an Ecto type so Cloak.Ecto can encrypt/decrypt a binary field.","ref":"Plausible.Auth.TOTP.EncryptedBinary.html"},{"type":"module","title":"Plausible.Auth.TOTP.RecoveryCode","doc":"Schema for TOTP recovery codes.","ref":"Plausible.Auth.TOTP.RecoveryCode.html"},{"type":"function","title":"Plausible.Auth.TOTP.RecoveryCode.changeset/2","doc":"","ref":"Plausible.Auth.TOTP.RecoveryCode.html#changeset/2"},{"type":"function","title":"Plausible.Auth.TOTP.RecoveryCode.changeset_to_map/2","doc":"","ref":"Plausible.Auth.TOTP.RecoveryCode.html#changeset_to_map/2"},{"type":"function","title":"Plausible.Auth.TOTP.RecoveryCode.generate_codes/1","doc":"Generates `count` unique recovery codes, each alphanumeric\nand 10 characters long.","ref":"Plausible.Auth.TOTP.RecoveryCode.html#generate_codes/1"},{"type":"function","title":"Plausible.Auth.TOTP.RecoveryCode.match?/2","doc":"","ref":"Plausible.Auth.TOTP.RecoveryCode.html#match?/2"},{"type":"type","title":"Plausible.Auth.TOTP.RecoveryCode.t/0","doc":"","ref":"Plausible.Auth.TOTP.RecoveryCode.html#t:t/0"},{"type":"module","title":"Plausible.Auth.TOTP.Vault","doc":"Provides a vault that will be used to encrypt/decrypt the TOTP secrets of users who enable it.","ref":"Plausible.Auth.TOTP.Vault.html"},{"type":"function","title":"Plausible.Auth.TOTP.Vault.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Auth.TOTP.Vault.html#child_spec/1"},{"type":"function","title":"Plausible.Auth.TOTP.Vault.start_link/1","doc":"","ref":"Plausible.Auth.TOTP.Vault.html#start_link/1"},{"type":"module","title":"Plausible.Auth.Token","doc":"","ref":"Plausible.Auth.Token.html"},{"type":"function","title":"Plausible.Auth.Token.sign_password_reset/1","doc":"","ref":"Plausible.Auth.Token.html#sign_password_reset/1"},{"type":"function","title":"Plausible.Auth.Token.sign_shared_link/1","doc":"","ref":"Plausible.Auth.Token.html#sign_shared_link/1"},{"type":"function","title":"Plausible.Auth.Token.verify_password_reset/1","doc":"","ref":"Plausible.Auth.Token.html#verify_password_reset/1"},{"type":"function","title":"Plausible.Auth.Token.verify_shared_link/1","doc":"","ref":"Plausible.Auth.Token.html#verify_shared_link/1"},{"type":"module","title":"Plausible.Auth.User","doc":"","ref":"Plausible.Auth.User.html"},{"type":"function","title":"Plausible.Auth.User.cancel_email_changeset/1","doc":"","ref":"Plausible.Auth.User.html#cancel_email_changeset/1"},{"type":"function","title":"Plausible.Auth.User.changeset/2","doc":"","ref":"Plausible.Auth.User.html#changeset/2"},{"type":"function","title":"Plausible.Auth.User.email_changeset/2","doc":"","ref":"Plausible.Auth.User.html#email_changeset/2"},{"type":"function","title":"Plausible.Auth.User.end_trial/1","doc":"","ref":"Plausible.Auth.User.html#end_trial/1"},{"type":"function","title":"Plausible.Auth.User.hash_password/1","doc":"","ref":"Plausible.Auth.User.html#hash_password/1"},{"type":"function","title":"Plausible.Auth.User.new/1","doc":"","ref":"Plausible.Auth.User.html#new/1"},{"type":"function","title":"Plausible.Auth.User.password_strength/1","doc":"","ref":"Plausible.Auth.User.html#password_strength/1"},{"type":"function","title":"Plausible.Auth.User.profile_img_url/1","doc":"","ref":"Plausible.Auth.User.html#profile_img_url/1"},{"type":"function","title":"Plausible.Auth.User.remove_trial_expiry/1","doc":"","ref":"Plausible.Auth.User.html#remove_trial_expiry/1"},{"type":"function","title":"Plausible.Auth.User.set_password/2","doc":"","ref":"Plausible.Auth.User.html#set_password/2"},{"type":"function","title":"Plausible.Auth.User.settings_changeset/2","doc":"","ref":"Plausible.Auth.User.html#settings_changeset/2"},{"type":"function","title":"Plausible.Auth.User.start_trial/1","doc":"","ref":"Plausible.Auth.User.html#start_trial/1"},{"type":"function","title":"Plausible.Auth.User.subscription_accept_traffic_until_offset_days/0","doc":"","ref":"Plausible.Auth.User.html#subscription_accept_traffic_until_offset_days/0"},{"type":"function","title":"Plausible.Auth.User.trial_accept_traffic_until_offset_days/0","doc":"","ref":"Plausible.Auth.User.html#trial_accept_traffic_until_offset_days/0"},{"type":"type","title":"Plausible.Auth.User.t/0","doc":"","ref":"Plausible.Auth.User.html#t:t/0"},{"type":"module","title":"Plausible.Auth.UserAdmin","doc":"","ref":"Plausible.Auth.UserAdmin.html"},{"type":"function","title":"Plausible.Auth.UserAdmin.custom_index_query/3","doc":"","ref":"Plausible.Auth.UserAdmin.html#custom_index_query/3"},{"type":"function","title":"Plausible.Auth.UserAdmin.delete/2","doc":"","ref":"Plausible.Auth.UserAdmin.html#delete/2"},{"type":"function","title":"Plausible.Auth.UserAdmin.form_fields/1","doc":"","ref":"Plausible.Auth.UserAdmin.html#form_fields/1"},{"type":"function","title":"Plausible.Auth.UserAdmin.index/1","doc":"","ref":"Plausible.Auth.UserAdmin.html#index/1"},{"type":"function","title":"Plausible.Auth.UserAdmin.resource_actions/1","doc":"","ref":"Plausible.Auth.UserAdmin.html#resource_actions/1"},{"type":"module","title":"Plausible.Billing","doc":"","ref":"Plausible.Billing.html"},{"type":"function","title":"Plausible.Billing.active_subscription_for/1","doc":"","ref":"Plausible.Billing.html#active_subscription_for/1"},{"type":"function","title":"Plausible.Billing.cancelled_subscription_notice_dismiss_id/1","doc":"","ref":"Plausible.Billing.html#cancelled_subscription_notice_dismiss_id/1"},{"type":"function","title":"Plausible.Billing.change_plan/2","doc":"","ref":"Plausible.Billing.html#change_plan/2"},{"type":"function","title":"Plausible.Billing.change_plan_preview/2","doc":"","ref":"Plausible.Billing.html#change_plan_preview/2"},{"type":"function","title":"Plausible.Billing.check_needs_to_upgrade/1","doc":"","ref":"Plausible.Billing.html#check_needs_to_upgrade/1"},{"type":"function","title":"Plausible.Billing.format_price/1","doc":"","ref":"Plausible.Billing.html#format_price/1"},{"type":"function","title":"Plausible.Billing.has_active_subscription?/1","doc":"","ref":"Plausible.Billing.html#has_active_subscription?/1"},{"type":"function","title":"Plausible.Billing.on_trial?/1","doc":"","ref":"Plausible.Billing.html#on_trial?/1"},{"type":"function","title":"Plausible.Billing.paddle_api/0","doc":"","ref":"Plausible.Billing.html#paddle_api/0"},{"type":"function","title":"Plausible.Billing.subscription_cancelled/1","doc":"","ref":"Plausible.Billing.html#subscription_cancelled/1"},{"type":"function","title":"Plausible.Billing.subscription_created/1","doc":"","ref":"Plausible.Billing.html#subscription_created/1"},{"type":"function","title":"Plausible.Billing.subscription_is_active?/1","doc":"","ref":"Plausible.Billing.html#subscription_is_active?/1"},{"type":"function","title":"Plausible.Billing.subscription_payment_succeeded/1","doc":"","ref":"Plausible.Billing.html#subscription_payment_succeeded/1"},{"type":"function","title":"Plausible.Billing.subscription_updated/1","doc":"","ref":"Plausible.Billing.html#subscription_updated/1"},{"type":"function","title":"Plausible.Billing.trial_days_left/1","doc":"","ref":"Plausible.Billing.html#trial_days_left/1"},{"type":"module","title":"Plausible.Billing.Ecto.Feature","doc":"Ecto type representing a feature. Features are cast and stored in the\ndatabase as strings and loaded as modules, for example: `\"props\"` is loaded\nas `Plausible.Billing.Feature.Props`.","ref":"Plausible.Billing.Ecto.Feature.html"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.cast/1","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#cast/1"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.dump/1","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#dump/1"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.embed_as/1","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#embed_as/1"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.equal?/2","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#equal?/2"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.load/1","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#load/1"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.type/0","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#type/0"},{"type":"module","title":"Plausible.Billing.Ecto.FeatureList","doc":"Ecto type representing a list of features. This is a proxy for \n`{:array, Plausible.Billing.Ecto.Feature}` and is required for Kaffy to\nrender the HTML input correctly.","ref":"Plausible.Billing.Ecto.FeatureList.html"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.cast/1","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#cast/1"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.dump/1","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#dump/1"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.embed_as/1","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#embed_as/1"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.equal?/2","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#equal?/2"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.load/1","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#load/1"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.render_form/5","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#render_form/5"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.type/0","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#type/0"},{"type":"module","title":"Plausible.Billing.Ecto.Limit","doc":"Ecto type representing a limit, that can be either a number or unlimited.\nUnlimited is dumped to the database as `-1` and loaded as `:unlimited` to\nkeep compatibility with the rest of the codebase.","ref":"Plausible.Billing.Ecto.Limit.html"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.cast/1","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#cast/1"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.dump/1","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#dump/1"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.embed_as/1","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#embed_as/1"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.equal?/2","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#equal?/2"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.load/1","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#load/1"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.render_form/5","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#render_form/5"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.type/0","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#type/0"},{"type":"module","title":"Plausible.Billing.EnterprisePlan","doc":"","ref":"Plausible.Billing.EnterprisePlan.html"},{"type":"function","title":"Plausible.Billing.EnterprisePlan.changeset/2","doc":"","ref":"Plausible.Billing.EnterprisePlan.html#changeset/2"},{"type":"module","title":"Plausible.Billing.EnterprisePlanAdmin","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.custom_index_query/3","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#custom_index_query/3"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.form_fields/1","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#form_fields/1"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.index/1","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#index/1"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.search_fields/1","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#search_fields/1"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.update_changeset/2","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#update_changeset/2"},{"type":"behaviour","title":"Plausible.Billing.Feature","doc":"This module provides an interface for managing features, e.g. Revenue Goals,\nFunnels and Custom Properties.\n\nFeature modules have functions for toggling the feature on/off and checking\nwhether the feature is available for a site/user.\n\nWhen defining new features, the following options are expected by the\n`__using__` macro:\n\n * `:name` - an atom representing the feature name in the plan JSON\n file (see also Plausible.Billing.Plan).\n\n * `:display_name` - human-readable display name of the feature\n\n * `:toggle_field` - the field in the %Plausible.Site{} schema that toggles\n the feature. If `nil` or not set, toggle/2 silently returns `:ok`\n\n * `:free` - if set to `true`, makes the `check_availability/1` function\n always return `:ok` (no matter the user's subscription status)\n\nFunctions defined by `__using__` can be overridden if needed.","ref":"Plausible.Billing.Feature.html"},{"type":"callback","title":"Plausible.Billing.Feature.check_availability/1","doc":"Checks whether the site owner or the user plan includes the given feature.","ref":"Plausible.Billing.Feature.html#c:check_availability/1"},{"type":"callback","title":"Plausible.Billing.Feature.display_name/0","doc":"Returns the human-readable display name of the feature.","ref":"Plausible.Billing.Feature.html#c:display_name/0"},{"type":"callback","title":"Plausible.Billing.Feature.enabled?/1","doc":"Checks whether a feature is enabled or not. Returns false when the feature is\ndisabled or the user does not have access to it.","ref":"Plausible.Billing.Feature.html#c:enabled?/1"},{"type":"callback","title":"Plausible.Billing.Feature.free?/0","doc":"Returns whether the feature is free to use or not.","ref":"Plausible.Billing.Feature.html#c:free?/0"},{"type":"function","title":"Plausible.Billing.Feature.list/0","doc":"Lists all available feature modules.","ref":"Plausible.Billing.Feature.html#list/0"},{"type":"callback","title":"Plausible.Billing.Feature.name/0","doc":"Returns the atom representing the feature name in the plan JSON file.","ref":"Plausible.Billing.Feature.html#c:name/0"},{"type":"callback","title":"Plausible.Billing.Feature.opted_out?/1","doc":"Returns whether the site explicitly opted out of the feature. This function\nis different from enabled/1, because enabled/1 returns false when the site\nowner does not have access to the feature.","ref":"Plausible.Billing.Feature.html#c:opted_out?/1"},{"type":"callback","title":"Plausible.Billing.Feature.toggle/2","doc":"Toggles the feature on and off for a site. Returns\n`{:error, :upgrade_required}` when toggling a feature the site owner does not\nhave access to.","ref":"Plausible.Billing.Feature.html#c:toggle/2"},{"type":"callback","title":"Plausible.Billing.Feature.toggle_field/0","doc":"Returns the %Plausible.Site{} field that toggles the feature on and off.","ref":"Plausible.Billing.Feature.html#c:toggle_field/0"},{"type":"type","title":"Plausible.Billing.Feature.t/0","doc":"","ref":"Plausible.Billing.Feature.html#t:t/0"},{"type":"module","title":"Plausible.Billing.PaddleApi","doc":"","ref":"Plausible.Billing.PaddleApi.html"},{"type":"function","title":"Plausible.Billing.PaddleApi.checkout_domain/0","doc":"","ref":"Plausible.Billing.PaddleApi.html#checkout_domain/0"},{"type":"function","title":"Plausible.Billing.PaddleApi.fetch_prices/1","doc":"","ref":"Plausible.Billing.PaddleApi.html#fetch_prices/1"},{"type":"function","title":"Plausible.Billing.PaddleApi.get_invoices/1","doc":"","ref":"Plausible.Billing.PaddleApi.html#get_invoices/1"},{"type":"function","title":"Plausible.Billing.PaddleApi.get_subscription/1","doc":"","ref":"Plausible.Billing.PaddleApi.html#get_subscription/1"},{"type":"function","title":"Plausible.Billing.PaddleApi.update_subscription/2","doc":"","ref":"Plausible.Billing.PaddleApi.html#update_subscription/2"},{"type":"function","title":"Plausible.Billing.PaddleApi.update_subscription_preview/2","doc":"","ref":"Plausible.Billing.PaddleApi.html#update_subscription_preview/2"},{"type":"function","title":"Plausible.Billing.PaddleApi.vendors_domain/0","doc":"","ref":"Plausible.Billing.PaddleApi.html#vendors_domain/0"},{"type":"module","title":"Plausible.Billing.Plans","doc":"","ref":"Plausible.Billing.Plans.html"},{"type":"function","title":"Plausible.Billing.Plans.all/0","doc":"","ref":"Plausible.Billing.Plans.html#all/0"},{"type":"function","title":"Plausible.Billing.Plans.available_plans_for/2","doc":"","ref":"Plausible.Billing.Plans.html#available_plans_for/2"},{"type":"function","title":"Plausible.Billing.Plans.business_plans_for/1","doc":"","ref":"Plausible.Billing.Plans.html#business_plans_for/1"},{"type":"function","title":"Plausible.Billing.Plans.business_tier?/1","doc":"","ref":"Plausible.Billing.Plans.html#business_tier?/1"},{"type":"function","title":"Plausible.Billing.Plans.business_tier_launch/0","doc":"","ref":"Plausible.Billing.Plans.html#business_tier_launch/0"},{"type":"function","title":"Plausible.Billing.Plans.find/1","doc":"","ref":"Plausible.Billing.Plans.html#find/1"},{"type":"function","title":"Plausible.Billing.Plans.get_price_for/1","doc":"","ref":"Plausible.Billing.Plans.html#get_price_for/1"},{"type":"function","title":"Plausible.Billing.Plans.get_regular_plan/2","doc":"","ref":"Plausible.Billing.Plans.html#get_regular_plan/2"},{"type":"function","title":"Plausible.Billing.Plans.get_subscription_plan/1","doc":"","ref":"Plausible.Billing.Plans.html#get_subscription_plan/1"},{"type":"function","title":"Plausible.Billing.Plans.growth_plans_for/1","doc":"Returns a list of growth plans available for the user to choose.\n\nAs new versions of plans are introduced, users who were on old plans can\nstill choose from old plans.","ref":"Plausible.Billing.Plans.html#growth_plans_for/1"},{"type":"function","title":"Plausible.Billing.Plans.latest_enterprise_plan_with_price/1","doc":"","ref":"Plausible.Billing.Plans.html#latest_enterprise_plan_with_price/1"},{"type":"function","title":"Plausible.Billing.Plans.subscription_interval/1","doc":"","ref":"Plausible.Billing.Plans.html#subscription_interval/1"},{"type":"function","title":"Plausible.Billing.Plans.suggest/2","doc":"Returns the most appropriate plan for a user based on their usage during a\ngiven cycle.\n\nIf the usage during the cycle exceeds the enterprise-level threshold, or if\nthe user already belongs to an enterprise plan, it suggests the :enterprise\nplan.\n\nOtherwise, it recommends the plan where the cycle usage falls just under the\nplan's limit from the available options for the user.","ref":"Plausible.Billing.Plans.html#suggest/2"},{"type":"function","title":"Plausible.Billing.Plans.suggest_tier/1","doc":"","ref":"Plausible.Billing.Plans.html#suggest_tier/1"},{"type":"function","title":"Plausible.Billing.Plans.with_prices/1","doc":"This function takes a list of plans as an argument, gathers all product\nIDs in a single list, and makes an API call to Paddle. After a successful\nresponse, fills in the `monthly_cost` and `yearly_cost` fields for each\ngiven plan and returns the new list of plans with completed information.","ref":"Plausible.Billing.Plans.html#with_prices/1"},{"type":"function","title":"Plausible.Billing.Plans.yearly_product_ids/0","doc":"List yearly plans product IDs.","ref":"Plausible.Billing.Plans.html#yearly_product_ids/0"},{"type":"module","title":"Plausible.Billing.Quota","doc":"This module provides functions to work with plans usage and limits.","ref":"Plausible.Billing.Quota.html"},{"type":"function","title":"Plausible.Billing.Quota.allowed_features_for/1","doc":"Returns a list of features the user can use. Trial users have the\nability to use all features during their trial.","ref":"Plausible.Billing.Quota.html#allowed_features_for/1"},{"type":"function","title":"Plausible.Billing.Quota.below_limit?/2","doc":"Returns whether the usage is below the limit or not.\nReturns false if usage is equal to the limit.","ref":"Plausible.Billing.Quota.html#below_limit?/2"},{"type":"function","title":"Plausible.Billing.Quota.ensure_can_add_new_site/1","doc":"Enterprise plans are always allowed to add more sites (even when\nover limit) to avoid service disruption. Their usage is checked\nin a background job instead (see `check_usage.ex`).","ref":"Plausible.Billing.Quota.html#ensure_can_add_new_site/1"},{"type":"function","title":"Plausible.Billing.Quota.ensure_within_plan_limits/3","doc":"Ensures that the given user (or the usage map) is within the limits\nof the given plan.\n\nAn `opts` argument can be passed with `ignore_pageview_limit: true`\nwhich bypasses the pageview limit check and returns `:ok` as long as\nthe other limits are not exceeded.","ref":"Plausible.Billing.Quota.html#ensure_within_plan_limits/3"},{"type":"function","title":"Plausible.Billing.Quota.features_usage/1","doc":"Given a user, this function returns the features used across all the sites\nthis user owns + StatsAPI if the user has a configured Stats API key.\n\nGiven a site, returns the features used by the site.","ref":"Plausible.Billing.Quota.html#features_usage/1"},{"type":"function","title":"Plausible.Billing.Quota.monthly_pageview_limit/1","doc":"","ref":"Plausible.Billing.Quota.html#monthly_pageview_limit/1"},{"type":"function","title":"Plausible.Billing.Quota.monthly_pageview_usage/2","doc":"Queries the ClickHouse database for the monthly pageview usage. If the given user's\nsubscription is `active`, `past_due`, or a `deleted` (but not yet expired), a map\nwith the following structure is returned:\n\n```elixir\n%{\n current_cycle: usage_cycle(),\n last_cycle: usage_cycle(),\n penultimate_cycle: usage_cycle()\n}\n```\n\nIn all other cases of the subscription status (or a `free_10k` subscription which\ndoes not have a `last_bill_date` defined) - the following structure is returned:\n\n```elixir\n%{last_30_days: usage_cycle()}\n```\n\nGiven only a user as input, the usage is queried from across all the sites that the\nuser owns. Alternatively, given an optional argument of `site_ids`, the usage from\nacross all those sites is queried instead.","ref":"Plausible.Billing.Quota.html#monthly_pageview_usage/2"},{"type":"function","title":"Plausible.Billing.Quota.site_limit/1","doc":"","ref":"Plausible.Billing.Quota.html#site_limit/1"},{"type":"function","title":"Plausible.Billing.Quota.site_usage/1","doc":"Returns the number of sites the given user owns.","ref":"Plausible.Billing.Quota.html#site_usage/1"},{"type":"function","title":"Plausible.Billing.Quota.team_member_limit/1","doc":"","ref":"Plausible.Billing.Quota.html#team_member_limit/1"},{"type":"function","title":"Plausible.Billing.Quota.team_member_usage/1","doc":"Returns the total count of team members associated with the user's sites.\n\n* The given user (i.e. the owner) is not counted as a team member.\n\n* Pending invitations are counted as team members even before accepted.\n\n* Users are counted uniquely - i.e. even if an account is associated with\n many sites owned by the given user, they still count as one team member.","ref":"Plausible.Billing.Quota.html#team_member_usage/1"},{"type":"function","title":"Plausible.Billing.Quota.usage/2","doc":"","ref":"Plausible.Billing.Quota.html#usage/2"},{"type":"function","title":"Plausible.Billing.Quota.usage_cycle/4","doc":"","ref":"Plausible.Billing.Quota.html#usage_cycle/4"},{"type":"function","title":"Plausible.Billing.Quota.within_limit?/2","doc":"Returns whether the usage is within the limit or not.\nReturns true if usage is equal to the limit.","ref":"Plausible.Billing.Quota.html#within_limit?/2"},{"type":"type","title":"Plausible.Billing.Quota.limit/0","doc":"","ref":"Plausible.Billing.Quota.html#t:limit/0"},{"type":"type","title":"Plausible.Billing.Quota.monthly_pageview_usage/0","doc":"","ref":"Plausible.Billing.Quota.html#t:monthly_pageview_usage/0"},{"type":"type","title":"Plausible.Billing.Quota.over_limits_error/0","doc":"","ref":"Plausible.Billing.Quota.html#t:over_limits_error/0"},{"type":"type","title":"Plausible.Billing.Quota.period/0","doc":"","ref":"Plausible.Billing.Quota.html#t:period/0"},{"type":"type","title":"Plausible.Billing.Quota.usage_cycle/0","doc":"","ref":"Plausible.Billing.Quota.html#t:usage_cycle/0"},{"type":"module","title":"Plausible.Billing.SiteLocker","doc":"","ref":"Plausible.Billing.SiteLocker.html"},{"type":"function","title":"Plausible.Billing.SiteLocker.send_grace_period_end_email/1","doc":"","ref":"Plausible.Billing.SiteLocker.html#send_grace_period_end_email/1"},{"type":"function","title":"Plausible.Billing.SiteLocker.set_lock_status_for/2","doc":"","ref":"Plausible.Billing.SiteLocker.html#set_lock_status_for/2"},{"type":"function","title":"Plausible.Billing.SiteLocker.update_sites_for/2","doc":"","ref":"Plausible.Billing.SiteLocker.html#update_sites_for/2"},{"type":"type","title":"Plausible.Billing.SiteLocker.lock_reason/0","doc":"","ref":"Plausible.Billing.SiteLocker.html#t:lock_reason/0"},{"type":"type","title":"Plausible.Billing.SiteLocker.update_opt/0","doc":"","ref":"Plausible.Billing.SiteLocker.html#t:update_opt/0"},{"type":"module","title":"Plausible.Billing.Subscription.Status","doc":"The subscription statuses are stored in Paddle. They can only be changed\nthrough Paddle webhooks, which always send the current subscription status\nvia the payload.\n\n* `active` - All good with the payments. Can access stats.\n\n* `past_due` - The payment has failed, but we're trying to charge the customer\n again. Access to stats is still granted. There will be three retries - after\n 3, 5, and 7 days have passed from the first failure. After a failure on the\n final retry, the subscription status will change to `paused`. As soon as the\n customer updates their billing details, Paddle will charge them again, and\n after a successful payment, the subscription will become `active` again.\n\n* `paused` - we've tried to charge the customer but all the retries have failed.\n Stats access restricted. As soon as the customer updates their billing details,\n Paddle will charge them again, and after a successful payment, the subscription\n will become `active` again.\n\n* `deleted` - The customer has triggered the cancel subscription action. Access\n to stats should be granted for the time the customer has already paid for. If\n they want to upgrade again, new billing details have to be provided.\n\nPaddle documentation links for reference:\n\n* Subscription statuses -\n https://developer.paddle.com/classic/reference/zg9joji1mzu0mdi2-subscription-status-reference\n\n* Payment failures -\n https://developer.paddle.com/classic/guides/zg9joji1mzu0mduy-payment-failures","ref":"Plausible.Billing.Subscription.Status.html"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.active/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#active/0"},{"type":"function","title":"Plausible.Billing.Subscription.Status.active?/1","doc":"","ref":"Plausible.Billing.Subscription.Status.html#active?/1"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.deleted/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#deleted/0"},{"type":"function","title":"Plausible.Billing.Subscription.Status.deleted?/1","doc":"","ref":"Plausible.Billing.Subscription.Status.html#deleted?/1"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.in?/2","doc":"","ref":"Plausible.Billing.Subscription.Status.html#in?/2"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.past_due/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#past_due/0"},{"type":"function","title":"Plausible.Billing.Subscription.Status.past_due?/1","doc":"","ref":"Plausible.Billing.Subscription.Status.html#past_due?/1"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.paused/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#paused/0"},{"type":"function","title":"Plausible.Billing.Subscription.Status.paused?/1","doc":"","ref":"Plausible.Billing.Subscription.Status.html#paused?/1"},{"type":"function","title":"Plausible.Billing.Subscription.Status.valid_statuses/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#valid_statuses/0"},{"type":"type","title":"Plausible.Billing.Subscription.Status.status/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#t:status/0"},{"type":"module","title":"Plausible.ChangesetHelpers","doc":"Helper function for working with Ecto changesets","ref":"Plausible.ChangesetHelpers.html"},{"type":"function","title":"Plausible.ChangesetHelpers.traverse_errors/1","doc":"","ref":"Plausible.ChangesetHelpers.html#traverse_errors/1"},{"type":"module","title":"Plausible.Cldr","doc":"Provides the core functions to retrieve and manage\nthe CLDR data that supports formatting and localisation.\n\nIt provides the core functions to access formatted\nCLDR data, set and retrieve a current locale and validate\ncertain core data types such as locales, currencies and\nterritories.","ref":"Plausible.Cldr.html"},{"type":"function","title":"Plausible.Cldr.available_locale_name?/1","doc":"","ref":"Plausible.Cldr.html#available_locale_name?/1"},{"type":"function","title":"Plausible.Cldr.default_locale/0","doc":"Returns the default `locale`.","ref":"Plausible.Cldr.html#default_locale/0"},{"type":"function","title":"Example - Plausible.Cldr.default_locale/0","doc":"iex> Plausible.Cldr.default_locale()\n %Cldr.LanguageTag{\n backend: Plausible.Cldr,\n canonical_locale_name: \"en-001\",\n cldr_locale_name: :\"en-001\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: \"en\",\n language: \"en\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :en,\n requested_locale_name: \"en-001\",\n script: :Latn,\n territory: :\"001\",\n transform: %{},\n language_variants: []\n }","ref":"Plausible.Cldr.html#default_locale/0-example"},{"type":"function","title":"Plausible.Cldr.default_territory/0","doc":"Returns the default territory when a locale\ndoes not specify one and none can be inferred.","ref":"Plausible.Cldr.html#default_territory/0"},{"type":"function","title":"Example - Plausible.Cldr.default_territory/0","doc":"iex> Plausible.Cldr.default_territory()\n :\"001\"","ref":"Plausible.Cldr.html#default_territory/0-example"},{"type":"function","title":"Plausible.Cldr.ellipsis/2","doc":"Add locale-specific ellipsis to a string.","ref":"Plausible.Cldr.html#ellipsis/2"},{"type":"function","title":"Arguments - Plausible.Cldr.ellipsis/2","doc":"* `string` is any `String.t` or a 2-element list\n of `String.t` between which the ellipsis is inserted.\n\n* `backend` is any module that includes `use Cldr` and therefore\n is a `Cldr` backend module. The default is `Cldr.default_backend!/0`.\n Note that `Cldr.default_backend!/0` will raise an exception if\n no `:default_backend` is configured under the `:ex_cldr` key in\n `config.exs`.\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.html#ellipsis/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.ellipsis/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/1`.\n The default is `Cldr.get_locale/0`.\n\n* `:location` determines where to place the ellipsis. The options are\n `:after` (the default for a single string argument), `:between`\n (the default and only valid location for an argument that is a list\n of two strings) and `:before`.\n\n* `:format` formats based upon whether the ellipsis\n is inserted between words or sentences. The valid options are\n `:word` or `:sentence`. The default is `:sentence`.","ref":"Plausible.Cldr.html#ellipsis/2-options"},{"type":"function","title":"Examples - Plausible.Cldr.ellipsis/2","doc":"iex> Plausible.Cldr.ellipsis \"And furthermore\"\n \"And furthermore…\"\n\n iex> Plausible.Cldr.ellipsis [\"And furthermore\", \"there is much to be done\"], locale: :ja\n \"And furthermore…there is much to be done\"\n\n iex> Plausible.Cldr.ellipsis \"And furthermore\", format: :word\n \"And furthermore …\"\n\n iex> Plausible.Cldr.ellipsis [\"And furthermore\", \"there is much to be done\"], locale: :ja, format: :word\n \"And furthermore … there is much to be done\"","ref":"Plausible.Cldr.html#ellipsis/2-examples"},{"type":"function","title":"Plausible.Cldr.get_locale/0","doc":"Return the current locale to be used for `Cldr` functions that\ntake an optional locale parameter for which a locale is not supplied.","ref":"Plausible.Cldr.html#get_locale/0"},{"type":"function","title":"Example - Plausible.Cldr.get_locale/0","doc":"iex> Plausible.Cldr.put_locale(\"pl\")\n iex> Plausible.Cldr.get_locale\n %Cldr.LanguageTag{\n backend: Elixir.Plausible.Cldr,\n canonical_locale_name: \"pl\",\n cldr_locale_name: :pl,\n extensions: %{},\n language: \"pl\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :pl,\n territory: :PL,\n requested_locale_name: \"pl\",\n script: :Latn,\n transform: %{},\n language_variants: []\n }","ref":"Plausible.Cldr.html#get_locale/0-example"},{"type":"function","title":"Plausible.Cldr.known_calendars/0","doc":"","ref":"Plausible.Cldr.html#known_calendars/0"},{"type":"function","title":"Plausible.Cldr.known_currencies/0","doc":"","ref":"Plausible.Cldr.html#known_currencies/0"},{"type":"function","title":"Plausible.Cldr.known_gettext_locale_name/1","doc":"Returns either the Gettext `locale_name` in Cldr format or\n`false` based upon whether the locale name is configured in\n`Gettext`.","ref":"Plausible.Cldr.html#known_gettext_locale_name/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_gettext_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_gettext_locale_names/0`","ref":"Plausible.Cldr.html#known_gettext_locale_name/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_gettext_locale_name/1","doc":"iex> Plausible.Cldr.known_gettext_locale_name \"en\"\n \"en\"\n\n iex> Plausible.Cldr.known_gettext_locale_name \"en-SA\"\n false","ref":"Plausible.Cldr.html#known_gettext_locale_name/1-examples"},{"type":"function","title":"Plausible.Cldr.known_gettext_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Gettext.","ref":"Plausible.Cldr.html#known_gettext_locale_name?/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_gettext_locale_name?/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_gettext_locale_name?/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_gettext_locale_name?/1","doc":"iex> Plausible.Cldr.known_gettext_locale_name?(\"en\")\n true\n\n iex> Plausible.Cldr.known_gettext_locale_name?(\"!!\")\n false","ref":"Plausible.Cldr.html#known_gettext_locale_name?/1-examples"},{"type":"function","title":"Plausible.Cldr.known_gettext_locale_names/0","doc":"Returns a list of Gettext locale names but in CLDR format with\nunderscore replaced by hyphen in order to facilitate comparisons\nwith `Cldr` locale names.","ref":"Plausible.Cldr.html#known_gettext_locale_names/0"},{"type":"function","title":"Plausible.Cldr.known_locale_name/1","doc":"Returns either the `locale_name` or `false` based upon\nwhether the locale name is configured in `Cldr`.\n\nThis is helpful when building a list of `or` expressions\nto return the first known locale name from a list.","ref":"Plausible.Cldr.html#known_locale_name/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_locale_name/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_locale_name/1","doc":"iex> Plausible.Cldr.known_locale_name :\"en-AU\"\n :\"en-AU\"\n\n iex> Plausible.Cldr.known_locale_name :\"en-SA\"\n false","ref":"Plausible.Cldr.html#known_locale_name/1-examples"},{"type":"function","title":"Plausible.Cldr.known_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Cldr.","ref":"Plausible.Cldr.html#known_locale_name?/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_locale_name?/1","doc":"* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_locale_name?/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_locale_name?/1","doc":"iex> Plausible.Cldr.known_locale_name?(:en)\n true\n\n iex> Plausible.Cldr.known_locale_name?(:\"!!\")\n false","ref":"Plausible.Cldr.html#known_locale_name?/1-examples"},{"type":"function","title":"Plausible.Cldr.known_locale_names/0","doc":"Returns a list of the known locale names.\n\nKnown locales are those locales which\nare the subset of all CLDR locales that\nhave been configured for use either\nin this module or in `Gettext`.","ref":"Plausible.Cldr.html#known_locale_names/0"},{"type":"function","title":"Plausible.Cldr.known_number_system_types/0","doc":"Returns a list of atoms representing the number systems types known to `Cldr`.","ref":"Plausible.Cldr.html#known_number_system_types/0"},{"type":"function","title":"Example - Plausible.Cldr.known_number_system_types/0","doc":"iex> Plausible.Cldr.known_number_system_types\n [:default, :finance, :native, :traditional]","ref":"Plausible.Cldr.html#known_number_system_types/0-example"},{"type":"function","title":"Plausible.Cldr.known_number_systems/0","doc":"","ref":"Plausible.Cldr.html#known_number_systems/0"},{"type":"function","title":"Plausible.Cldr.known_rbnf_locale_name/1","doc":"Returns either the RBNF `locale_name` or `false` based upon\nwhether the locale name is configured in `Cldr`\nand has RBNF rules defined.","ref":"Plausible.Cldr.html#known_rbnf_locale_name/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_rbnf_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_rbnf_locale_name/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_rbnf_locale_name/1","doc":"iex> Plausible.Cldr.known_rbnf_locale_name :en\n :en\n\n iex> Plausible.Cldr.known_rbnf_locale_name :\"en-SA\"\n false","ref":"Plausible.Cldr.html#known_rbnf_locale_name/1-examples"},{"type":"function","title":"Plausible.Cldr.known_rbnf_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Cldr and supports\nrules based number formats (RBNF).","ref":"Plausible.Cldr.html#known_rbnf_locale_name?/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_rbnf_locale_name?/1","doc":"* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_rbnf_locale_name?/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_rbnf_locale_name?/1","doc":"iex> Plausible.Cldr.known_rbnf_locale_name?(:en)\n true\n\n iex> Plausible.Cldr.known_rbnf_locale_name?(:\"!!\")\n false","ref":"Plausible.Cldr.html#known_rbnf_locale_name?/1-examples"},{"type":"function","title":"Plausible.Cldr.known_rbnf_locale_names/0","doc":"Returns a list of locale names which have rules-based number\nformats (RBNF).","ref":"Plausible.Cldr.html#known_rbnf_locale_names/0"},{"type":"function","title":"Plausible.Cldr.known_territories/0","doc":"","ref":"Plausible.Cldr.html#known_territories/0"},{"type":"function","title":"Plausible.Cldr.normalize_lenient_parse/3","doc":"Normalizes a string by applying transliteration\nof common symbols in numbers, currencies and dates","ref":"Plausible.Cldr.html#normalize_lenient_parse/3"},{"type":"function","title":"Plausible.Cldr.put_locale/1","doc":"Set the current locale to be used for `Cldr` functions that\ntake an optional locale parameter for which a locale is not supplied.","ref":"Plausible.Cldr.html#put_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.put_locale/1","doc":"* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`\n\nSee [rfc5646](https://tools.ietf.org/html/rfc5646) for the specification\nof a language tag.","ref":"Plausible.Cldr.html#put_locale/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.put_locale/1","doc":"iex> Plausible.Cldr.put_locale(\"en\")\n {:ok,\n %Cldr.LanguageTag{\n backend: Plausible.Cldr,\n canonical_locale_name: \"en\",\n cldr_locale_name: :en,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: \"en\",\n language: \"en\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :en,\n requested_locale_name: \"en\",\n script: :Latn,\n territory: :US,\n transform: %{},\n language_variants: []\n }}\n\n iex> Plausible.Cldr.put_locale(\"invalid-locale!\")\n {:error, {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"!\\\" starting at position 15\"}}","ref":"Plausible.Cldr.html#put_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.quote/2","doc":"Add locale-specific quotation marks around a string.","ref":"Plausible.Cldr.html#quote/2"},{"type":"function","title":"Arguments - Plausible.Cldr.quote/2","doc":"* `string` is any valid Elixir string\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.html#quote/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.quote/2","doc":"* `locale` is any valid locale name returned by `Cldr.known_locale_names/1`.\n The default is `Cldr.get_locale/0`","ref":"Plausible.Cldr.html#quote/2-options"},{"type":"function","title":"Examples - Plausible.Cldr.quote/2","doc":"iex> Plausible.Cldr.quote \"Quoted String\"\n \"“Quoted String”\"\n\n iex> Plausible.Cldr.quote \"Quoted String\", locale: :ja\n \"「Quoted String」\"","ref":"Plausible.Cldr.html#quote/2-examples"},{"type":"function","title":"Plausible.Cldr.unknown_locale_names/0","doc":"Returns a list of the locales names that are configured,\nbut not known in CLDR.\n\nSince there is a compile-time exception raised if there are\nany unknown locales this function should always\nreturn an empty list.","ref":"Plausible.Cldr.html#unknown_locale_names/0"},{"type":"function","title":"Plausible.Cldr.validate_calendar/1","doc":"","ref":"Plausible.Cldr.html#validate_calendar/1"},{"type":"function","title":"Plausible.Cldr.validate_currency/1","doc":"","ref":"Plausible.Cldr.html#validate_currency/1"},{"type":"function","title":"Plausible.Cldr.validate_locale/1","doc":"Normalise and validate a locale name.","ref":"Plausible.Cldr.html#validate_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.validate_locale/1","doc":"* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.html#validate_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.validate_locale/1","doc":"* `{:ok, language_tag}`\n\n* `{:error, reason}`","ref":"Plausible.Cldr.html#validate_locale/1-returns"},{"type":"function","title":"Notes - Plausible.Cldr.validate_locale/1","doc":"See [rfc5646](https://tools.ietf.org/html/rfc5646) for the specification\nof a language tag.","ref":"Plausible.Cldr.html#validate_locale/1-notes"},{"type":"function","title":"Examples - Plausible.Cldr.validate_locale/1","doc":"iex> Plausible.Cldr.validate_locale(:en)\n {:ok,\n %Cldr.LanguageTag{\n backend: Plausible.Cldr,\n canonical_locale_name: \"en\",\n cldr_locale_name: :en,\n extensions: %{},\n gettext_locale_name: \"en\",\n language: \"en\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :en,\n requested_locale_name: \"en\",\n script: :Latn,\n territory: :US,\n transform: %{},\n language_variants: []\n }}\n\n\n iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()\n {:ok,\n %Cldr.LanguageTag{\n backend: Plausible.Cldr,\n canonical_locale_name: \"en-001\",\n cldr_locale_name: :\"en-001\",\n extensions: %{},\n gettext_locale_name: \"en\",\n language: \"en\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :en,\n requested_locale_name: \"en-001\",\n script: :Latn,\n territory: :\"001\",\n transform: %{},\n language_variants: []\n }}\n\n iex> Plausible.Cldr.validate_locale(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Plausible.Cldr.html#validate_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.validate_number_system/1","doc":"","ref":"Plausible.Cldr.html#validate_number_system/1"},{"type":"function","title":"Plausible.Cldr.validate_number_system_type/1","doc":"Normalise and validate a number system type.","ref":"Plausible.Cldr.html#validate_number_system_type/1"},{"type":"function","title":"Arguments - Plausible.Cldr.validate_number_system_type/1","doc":"* `number_system_type` is any number system type returned by\n `Cldr.known_number_system_types/1`","ref":"Plausible.Cldr.html#validate_number_system_type/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.validate_number_system_type/1","doc":"* `{:ok, normalized_number_system_type}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.html#validate_number_system_type/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.validate_number_system_type/1","doc":"iex> Plausible.Cldr.validate_number_system_type :default\n {:ok, :default}\n\n iex> Plausible.Cldr.validate_number_system_type :traditional\n {:ok, :traditional}\n\n iex> Plausible.Cldr.validate_number_system_type :latn\n {\n :error,\n {Cldr.UnknownNumberSystemTypeError, \"The number system type :latn is unknown\"}\n }\n\n iex> Plausible.Cldr.validate_number_system_type \"bork\"\n {\n :error,\n {Cldr.UnknownNumberSystemTypeError, \"The number system type \\\"bork\\\" is invalid\"}\n }","ref":"Plausible.Cldr.html#validate_number_system_type/1-examples"},{"type":"function","title":"Plausible.Cldr.validate_territory/1","doc":"","ref":"Plausible.Cldr.html#validate_territory/1"},{"type":"function","title":"Plausible.Cldr.with_locale/2","doc":"Execute a function with a locale ensuring that the\ncurrent locale is restored after the function.","ref":"Plausible.Cldr.html#with_locale/2"},{"type":"function","title":"Arguments - Plausible.Cldr.with_locale/2","doc":"* `locale` is any valid locale name returned by `Cldr.known_locale_names/1`.\n\n* `fun` is any 0-arity function or function capture.","ref":"Plausible.Cldr.html#with_locale/2-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.with_locale/2","doc":"* The value returned by the function `fun/0` or\n\n* `{:error, {exception, reason}}` if the locale is invalid or\n\n* raises an exception if the current locale cannot be\n identified.","ref":"Plausible.Cldr.html#with_locale/2-returns"},{"type":"module","title":"Plausible.Cldr.AcceptLanguage","doc":"Parses HTTP `Accept-Language` header values as defined in\n[rfc2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4).\n\nThe Accept-Language request-header field is similar to Accept, but restricts\nthe set of natural languages that are preferred as a response to the request.\nLanguage tags function are provided in `Cldr.LanguageTag`.\n\nThe format of an `Accept-Language` header is as follows in `ABNF` format:\n\n Accept-Language = \"Accept-Language\" \":\"\n 1#( language-range [ \";\" \"q\" \"=\" qvalue ] )\n language-range = ( ( 1*8ALPHA *( \"-\" 1*8ALPHA ) ) | \"*\" )\n\nEach language-range MAY be given an associated quality value which represents an\nestimate of the user's preference for the languages specified by that range. The\nquality value defaults to \"q=1\". For example,\n\n Accept-Language: da, en-gb;q=0.8, en;q=0.7\n\nwould mean: \"I prefer Danish, but will accept British English and other types of English.\"","ref":"Plausible.Cldr.AcceptLanguage.html"},{"type":"function","title":"Plausible.Cldr.AcceptLanguage.best_match/1","doc":"Parse an `Accept-Language` string and return the best match for\na configured `Cldr` locale.","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1"},{"type":"function","title":"Arguments - Plausible.Cldr.AcceptLanguage.best_match/1","doc":"* `accept_langauge` is a string representing an accept language header","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.AcceptLanguage.best_match/1","doc":"* `{:ok, language_tag}` or\n\n* `{:error, reason}`","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.AcceptLanguage.best_match/1","doc":"iex> Plausible.Cldr.AcceptLanguage.best_match(\"da;q=0.1,zh-TW;q=0.3\", TestBackend.Cldr)\n {:ok,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }}\n\n iex> Plausible.Cldr.AcceptLanguage.best_match(\"da;q=0.1,zh-TW;q=0.3\", TestBackend.Cldr)\n {:ok,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }}\n\n iex> Plausible.Cldr.AcceptLanguage.best_match(\"xx,yy;q=0.3\")\n {:error,\n {Cldr.NoMatchingLocale,\n \"No configured locale could be matched to \\\"xx,yy;q=0.3\\\"\"}}\n\n iex> Plausible.Cldr.AcceptLanguage.best_match(\"invalid_tag\")\n {:error, {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"g\\\" starting at position 11\"}}","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1-examples"},{"type":"function","title":"Plausible.Cldr.AcceptLanguage.parse/1","doc":"Parses an `Accept-Language` header value in its string\nor tokenized form to return a tuple of the form\n`{:ok, [{quality, %Cldr.LanguageTag{}}, ...]}` sorted by quality.","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1"},{"type":"function","title":"Arguments - Plausible.Cldr.AcceptLanguage.parse/1","doc":"* `accept-language` is any string in the format defined by\n [rfc2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4)\n\n* `backend` is any module that includes `use Cldr` and therefore\n is a `Cldr` backend module","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.AcceptLanguage.parse/1","doc":"* `{:ok, [{quality, language_tag}, ...]}` or\n\n* `{:error, {Cldr.AcceptLanguageError, String.t}}`\n\nIf at least one valid language tag is found but errors are also\ndetected on one more more tags, an `{ok, list}` tuple is returned\nwuth an error tuple for each invalid tag added at the end of the list.","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1-returns"},{"type":"function","title":"Example - Plausible.Cldr.AcceptLanguage.parse/1","doc":"iex> Cldr.AcceptLanguage.parse(\"da,zh-TW;q=0.3\", TestBackend.Cldr)\n {:ok,\n [\n {1.0,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"da\",\n cldr_locale_name: :da,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"da\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :da,\n requested_locale_name: \"da\",\n script: :Latn,\n territory: :DK,\n transform: %{},\n language_variants: []\n }},\n {0.3,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }}\n ]}\n\n iex> Plausible.Cldr.AcceptLanguage.parse(\"invalid_tag\")\n {:error,\n {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"g\\\" starting at position 11\"}}\n\n iex> Plausible.Cldr.AcceptLanguage.parse(\"da,zh-TW;q=0.3,invalid_tag\")\n {:ok,\n [\n {1.0,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"da\",\n cldr_locale_name: :da,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"da\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :da,\n requested_locale_name: \"da\",\n script: :Latn,\n territory: :DK,\n transform: %{},\n language_variants: []\n }},\n {0.3,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }},\n {:error,\n {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"g\\\" starting at position 11\"}}\n ]}","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1-example"},{"type":"function","title":"Plausible.Cldr.AcceptLanguage.parse!/1","doc":"Parses an `Accept-Language` header value in its string\nor tokenized form to produce a list of tuples of the form\n`[{quality, %Cldr.LanguageTag{}}, ...]` sorted by quality\nin descending order.","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1"},{"type":"function","title":"Arguments - Plausible.Cldr.AcceptLanguage.parse!/1","doc":"* `accept-language` is any string in the format defined by [rfc2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4)","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.AcceptLanguage.parse!/1","doc":"* `{:ok, [{quality, language_tag}, ...]}` or\n\n* raises a `Cldr.AcceptLanguageError` exception\n\nIf at least one valid language tag is found but errors are also\ndetected on one more more tags, an `{ok, list}` tuple is returned\nwuth an error tuple for each invalid tag added at the end of the list.","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1-returns"},{"type":"function","title":"Example - Plausible.Cldr.AcceptLanguage.parse!/1","doc":"iex> Plausible.Cldr.AcceptLanguage.parse!(\"da,zh-TW;q=0.3\")\n [\n {1.0,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"da\",\n cldr_locale_name: :da,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"da\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :da,\n requested_locale_name: \"da\",\n script: :Latn,\n territory: :DK,\n transform: %{},\n language_variants: []\n }},\n {0.3,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }}\n ]\n\n Plausible.Cldr.AcceptLanguage.parse! \"invalid_tag\"\n ** (Cldr.AcceptLanguageError) \"Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11\n (ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1\n\n iex> Plausible.Cldr.AcceptLanguage.parse!(\"da,zh-TW;q=0.3,invalid_tag\")\n [\n {1.0,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"da\",\n cldr_locale_name: :da,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"da\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :da,\n requested_locale_name: \"da\",\n script: :Latn,\n territory: :DK,\n transform: %{},\n language_variants: []\n }},\n {0.3,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }},\n {:error,\n {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"g\\\" starting at position 11\"}}\n ]","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1-example"},{"type":"module","title":"Plausible.Cldr.Currency","doc":"","ref":"Plausible.Cldr.Currency.html"},{"type":"function","title":"Plausible.Cldr.Currency.currencies_for_locale/3","doc":"Returns a map of the metadata for all currencies for\na given locale.","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currencies_for_locale/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`\n\n* `currency_status` is `:all`, `:current`, `:historic`,\n `unannotated` or `:tender`; or a list of one or more status.\n The default is `:all`. See `Cldr.Currency.currency_filter/2`.","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currencies_for_locale/3","doc":"* `{:ok, currency_map}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currencies_for_locale/3","doc":"MyApp.Cldr.Currency.currencies_for_locale \"en\"\n => {:ok,\n %{\n FJD: %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"FJD\",\n count: %{one: \"Fijian dollar\", other: \"Fijian dollars\"},\n digits: 2,\n from: nil,\n iso_digits: 2,\n name: \"Fijian Dollar\",\n narrow_symbol: \"$\",\n rounding: 0,\n symbol: \"FJD\",\n tender: true,\n to: nil\n },\n SUR: %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"SUR\",\n count: %{one: \"Soviet rouble\", other: \"Soviet roubles\"},\n digits: 2,\n from: nil,\n iso_digits: nil,\n name: \"Soviet Rouble\",\n narrow_symbol: nil,\n rounding: 0,\n symbol: \"SUR\",\n tender: true,\n to: nil\n },\n ...\n }}","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3-example"},{"type":"function","title":"Plausible.Cldr.Currency.currencies_for_locale!/3","doc":"Returns a map of the metadata for all currencies for\na given locale and raises on error.","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currencies_for_locale!/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`\n\n* `currency_status` is `:all`, `:current`, `:historic`,\n `unannotated` or `:tender`; or a list of one or more status.\n The default is `:all`. See `Cldr.Currency.currency_filter/2`.","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currencies_for_locale!/3","doc":"* `{:ok, currency_map}` or\n\n* raises an exception","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currencies_for_locale!/3","doc":"MyApp.Cldr.Currency.currencies_for_locale! \"en\"\n => %{\n FJD: %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"FJD\",\n count: %{one: \"Fijian dollar\", other: \"Fijian dollars\"},\n digits: 2,\n from: nil,\n iso_digits: 2,\n name: \"Fijian Dollar\",\n narrow_symbol: \"$\",\n rounding: 0,\n symbol: \"FJD\",\n tender: true,\n to: nil\n },\n SUR: %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"SUR\",\n count: %{one: \"Soviet rouble\", other: \"Soviet roubles\"},\n digits: 2,\n from: nil,\n iso_digits: nil,\n name: \"Soviet Rouble\",\n narrow_symbol: nil,\n rounding: 0,\n symbol: \"SUR\",\n tender: true,\n to: nil\n },\n ...\n }","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3-example"},{"type":"function","title":"Plausible.Cldr.Currency.currency_for_code/2","doc":"Returns the currency metadata for the requested currency code.","ref":"Plausible.Cldr.Currency.html#currency_for_code/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_for_code/2","doc":"* `currency_or_currency_code` is a `binary` or `atom` representation\n of an ISO 4217 currency code, or a `%Cldr.Currency{}` struct.","ref":"Plausible.Cldr.Currency.html#currency_for_code/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Currency.currency_for_code/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`","ref":"Plausible.Cldr.Currency.html#currency_for_code/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_for_code/2","doc":"* A `{:ok, currency}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#currency_for_code/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.currency_for_code/2","doc":"iex> Plausible.Cldr.Currency.currency_for_code(\"AUD\")\n {:ok,\n %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"AUD\",\n count: %{one: \"Australian dollar\", other: \"Australian dollars\"},\n digits: 2,\n iso_digits: 2,\n name: \"Australian Dollar\",\n narrow_symbol: \"$\",\n rounding: 0,\n symbol: \"A$\",\n tender: true\n }}\n\n iex> Plausible.Cldr.Currency.currency_for_code(\"THB\")\n {:ok,\n %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"THB\",\n count: %{one: \"Thai baht\", other: \"Thai baht\"},\n digits: 2,\n iso_digits: 2,\n name: \"Thai Baht\",\n narrow_symbol: \"฿\",\n rounding: 0,\n symbol: \"THB\",\n tender: true\n }}","ref":"Plausible.Cldr.Currency.html#currency_for_code/2-examples"},{"type":"function","title":"Plausible.Cldr.Currency.currency_for_code!/2","doc":"Returns the currency metadata for the requested currency code.","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_for_code!/2","doc":"* `currency_or_currency_code` is a `binary` or `atom` representation\n of an ISO 4217 currency code, or a `%Cldr.Currency{}` struct.","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Currency.currency_for_code!/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_for_code!/2","doc":"* A `t:Cldr.Current.t/0` or\n\n* raises an exception","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.currency_for_code!/2","doc":"iex> Plausible.Cldr.Currency.currency_for_code!(\"AUD\")\n %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"AUD\",\n count: %{one: \"Australian dollar\", other: \"Australian dollars\"},\n digits: 2,\n iso_digits: 2,\n name: \"Australian Dollar\",\n narrow_symbol: \"$\",\n rounding: 0,\n symbol: \"A$\",\n tender: true\n }\n\n iex> Plausible.Cldr.Currency.currency_for_code!(\"THB\")\n %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"THB\",\n count: %{one: \"Thai baht\", other: \"Thai baht\"},\n digits: 2,\n iso_digits: 2,\n name: \"Thai Baht\",\n narrow_symbol: \"฿\",\n rounding: 0,\n symbol: \"THB\",\n tender: true\n }","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2-examples"},{"type":"function","title":"Plausible.Cldr.Currency.currency_from_locale/1","doc":"Returns the effective currency for a given locale","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_from_locale/1","doc":"* `locale` is a `Cldr.LanguageTag` struct returned by\n `Cldr.Locale.new!/2`","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_from_locale/1","doc":"* A ISO 4217 currency code as an upcased atom","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.currency_from_locale/1","doc":"iex> {:ok, locale} = Plausible.Cldr.validate_locale \"en\"\n iex> Plausible.Cldr.Currency.currency_from_locale locale\n :USD\n\n iex> {:ok, locale} = Plausible.Cldr.validate_locale \"en-AU\"\n iex> Plausible.Cldr.Currency.currency_from_locale locale\n :AUD\n\n iex> Plausible.Cldr.Currency.currency_from_locale \"en-GB\"\n :GBP","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.Currency.currency_history_for_locale/1","doc":"Returns a list of historic and the current\ncurrency for a given locale.","ref":"Plausible.Cldr.Currency.html#currency_history_for_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_history_for_locale/1","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Currency.html#currency_history_for_locale/1-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currency_history_for_locale/1","doc":"iex> MyApp.Cldr.Currency.currency_history_for_locale \"en\"\n {:ok,\n %{\n USD: %{from: ~D[1792-01-01], to: nil},\n USN: %{tender: false},\n USS: %{from: nil, tender: false, to: ~D[2014-03-01]}\n }\n }","ref":"Plausible.Cldr.Currency.html#currency_history_for_locale/1-example"},{"type":"function","title":"Plausible.Cldr.Currency.currency_strings/3","doc":"Returns a map that matches a currency string to a\ncurrency code.\n\nA currency string is a localised name or symbol\nrepresenting a currency in a locale-specific manner.","ref":"Plausible.Cldr.Currency.html#currency_strings/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_strings/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`\n\n* `currency_status` is `:all`, `:current`, `:historic`,\n `unannotated` or `:tender`; or a list of one or more status.\n The default is `:all`. See `Cldr.Currency.currency_filter/2`.","ref":"Plausible.Cldr.Currency.html#currency_strings/3-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_strings/3","doc":"* `{:ok, currency_string_map}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#currency_strings/3-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currency_strings/3","doc":"MyApp.Cldr.Currency.currency_strings \"en\"\n => {:ok,\n %{\n \"mexican silver pesos\" => :MXP,\n \"sudanese dinar\" => :SDD,\n \"bad\" => :BAD,\n \"rsd\" => :RSD,\n \"swazi lilangeni\" => :SZL,\n \"zairean new zaire\" => :ZRN,\n \"guyanaese dollars\" => :GYD,\n \"equatorial guinean ekwele\" => :GQE,\n ...\n }}","ref":"Plausible.Cldr.Currency.html#currency_strings/3-example"},{"type":"function","title":"Plausible.Cldr.Currency.currency_strings!/3","doc":"Returns a map that matches a currency string to a\ncurrency code or raises an exception.\n\nA currency string is a localised name or symbol\nrepresenting a currency in a locale-specific manner.","ref":"Plausible.Cldr.Currency.html#currency_strings!/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_strings!/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`\n\n* `currency_status` is `:all`, `:current`, `:historic`,\n `unannotated` or `:tender`; or a list of one or more status.\n The default is `:all`. See `Cldr.Currency.currency_filter/2`.","ref":"Plausible.Cldr.Currency.html#currency_strings!/3-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_strings!/3","doc":"* `{:ok, currency_string_map}` or\n\n* raises an exception","ref":"Plausible.Cldr.Currency.html#currency_strings!/3-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currency_strings!/3","doc":"MyApp.Cldr.Currency.currency_strings! \"en\"\n => %{\n \"mexican silver pesos\" => :MXP,\n \"sudanese dinar\" => :SDD,\n \"bad\" => :BAD,\n \"rsd\" => :RSD,\n \"swazi lilangeni\" => :SZL,\n \"zairean new zaire\" => :ZRN,\n \"guyanaese dollars\" => :GYD,\n \"equatorial guinean ekwele\" => :GQE,\n ...\n }","ref":"Plausible.Cldr.Currency.html#currency_strings!/3-example"},{"type":"function","title":"Plausible.Cldr.Currency.current_currency_from_locale/1","doc":"Returns the current currency for a given locale.\n\nThis function does not consider the `U` extenion\nparameters `cu` or `rg`. It is recommended to us\n`Cldr.Currency.currency_from_locale/1` in most\ncircumstances.","ref":"Plausible.Cldr.Currency.html#current_currency_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.current_currency_from_locale/1","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Currency.html#current_currency_from_locale/1-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Currency.current_currency_from_locale/1","doc":"iex> MyApp.Cldr.Currency.current_currency_from_locale \"en\"\n :USD\n\n iex> MyApp.Cldr.Currency.current_currency_from_locale \"en-AU\"\n :AUD","ref":"Plausible.Cldr.Currency.html#current_currency_from_locale/1-example"},{"type":"function","title":"Plausible.Cldr.Currency.current_territory_currencies/0","doc":"Returns a mapping from a territory code to its\ncurrent currency code.\n\nIf a territory has no current currency (like\nAntartica, territory code `:AQ`) then no\nmapping is returned for that territory.","ref":"Plausible.Cldr.Currency.html#current_territory_currencies/0"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.current_territory_currencies/0","doc":"* A map of `{territory_code => Cldr.Currency.t}`","ref":"Plausible.Cldr.Currency.html#current_territory_currencies/0-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.current_territory_currencies/0","doc":"iex> Plausible.Cldr.Currency.current_territory_currencies()","ref":"Plausible.Cldr.Currency.html#current_territory_currencies/0-example"},{"type":"function","title":"Plausible.Cldr.Currency.known_currencies/0","doc":"","ref":"Plausible.Cldr.Currency.html#known_currencies/0"},{"type":"function","title":"Plausible.Cldr.Currency.known_currency?/1","doc":"","ref":"Plausible.Cldr.Currency.html#known_currency?/1"},{"type":"function","title":"Plausible.Cldr.Currency.known_currency_code/1","doc":"Returns a 2-tuple indicating if the supplied currency code is known.","ref":"Plausible.Cldr.Currency.html#known_currency_code/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.known_currency_code/1","doc":"* `currency_code` is a `binary` or `atom` representing an ISO4217\n currency code","ref":"Plausible.Cldr.Currency.html#known_currency_code/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.known_currency_code/1","doc":"* `{:ok, currency_code}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#known_currency_code/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.known_currency_code/1","doc":"iex> Plausible.Cldr.Currency.known_currency_code \"AUD\"\n {:ok, :AUD}\n\n iex> Plausible.Cldr.Currency.known_currency_code \"GGG\"\n {:error, {Cldr.UnknownCurrencyError, \"The currency \\\"GGG\\\" is invalid\"}}","ref":"Plausible.Cldr.Currency.html#known_currency_code/1-examples"},{"type":"function","title":"Plausible.Cldr.Currency.known_currency_code?/1","doc":"Returns a boolean indicating if the supplied currency code is known.","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.known_currency_code?/1","doc":"* `currency_code` is a `binary` or `atom` representing an ISO4217\n currency code","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.known_currency_code?/1","doc":"* `true` or `false`","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.known_currency_code?/1","doc":"iex> Plausible.Cldr.Currency.known_currency_code? \"AUD\"\n true\n\n iex> Plausible.Cldr.Currency.known_currency_code? \"GGG\"\n false\n\n iex> Plausible.Cldr.Currency.known_currency_code? :XCV\n false","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1-examples"},{"type":"function","title":"Plausible.Cldr.Currency.known_currency_codes/0","doc":"Returns a list of all known currency codes.","ref":"Plausible.Cldr.Currency.html#known_currency_codes/0"},{"type":"function","title":"Example - Plausible.Cldr.Currency.known_currency_codes/0","doc":"iex> Plausible.Cldr.Currency.known_currency_codes","ref":"Plausible.Cldr.Currency.html#known_currency_codes/0-example"},{"type":"function","title":"Plausible.Cldr.Currency.new/2","doc":"Returns a `Currency` struct created from the arguments.","ref":"Plausible.Cldr.Currency.html#new/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.new/2","doc":"* `currency` is a private use currency code in a format defined by\n [ISO4217](https://en.wikipedia.org/wiki/ISO_4217)\n which is `X` followed by two alphanumeric characters.\n\n* `options` is a map of options representing the optional elements of\n the `Cldr.Currency.t` struct.","ref":"Plausible.Cldr.Currency.html#new/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Currency.new/2","doc":"* `:name` is the name of the currency. Required.\n* `:digits` is the precision of the currency. Required.\n* `:symbol` is the currency symbol. Optional.\n* `:narrow_symbol` is an alternative narrow symbol. Optional.\n* `:round_nearest` is the rounding precision such as `0.05`. Optional.\n* `:alt_code` is an alternative currency code for application use.\n* `:cash_digits` is the precision of the currency when used as cash. Optional.\n* `:cash_rounding_nearest` is the rounding precision when used as cash\n such as `0.05`. Optional.","ref":"Plausible.Cldr.Currency.html#new/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.new/2","doc":"* `{:ok, Cldr.Currency.t}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Currency.html#new/2-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.new/2","doc":"iex> Plausible.Cldr.Currency.new(:XAE, name: \"Custom Name\", digits: 0)\n {:ok,\n %Cldr.Currency{\n alt_code: :XAE,\n cash_digits: 0,\n cash_rounding: nil,\n code: :XAE,\n count: %{other: \"Custom Name\"},\n digits: 0,\n from: nil,\n iso_digits: 0,\n name: \"Custom Name\",\n narrow_symbol: nil,\n rounding: 0,\n symbol: \"XAE\",\n tender: false,\n to: nil\n }}\n iex> MyApp.Cldr.Currency.new(:XAH, name: \"Custom Name\")\n {:error, \"Required options are missing. Required options are [:name, :digits]\"}\n iex> Plausible.Cldr.Currency.new(:XAE, name: \"XAE\", digits: 0)\n {:error, {Cldr.CurrencyAlreadyDefined, \"Currency :XAE is already defined.\"}}","ref":"Plausible.Cldr.Currency.html#new/2-example"},{"type":"function","title":"Plausible.Cldr.Currency.pluralize/3","doc":"Returns the appropriate currency display name for the `currency`, based\non the plural rules in effect for the `locale`.","ref":"Plausible.Cldr.Currency.html#pluralize/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.pluralize/3","doc":"* `number` is an integer, float or `Decimal`\n\n* `currency` is any currency returned by `Cldr.Currency.known_currencies/0`\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Currency.html#pluralize/3-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Currency.pluralize/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`. The\n default is `Plausible.Cldr.get_locale/0`","ref":"Plausible.Cldr.Currency.html#pluralize/3-options"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.pluralize/3","doc":"* `{:ok, plural_string}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Currency.html#pluralize/3-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.pluralize/3","doc":"iex> Plausible.Cldr.Currency.pluralize 1, :USD\n {:ok, \"US dollar\"}\n\n iex> Plausible.Cldr.Currency.pluralize 3, :USD\n {:ok, \"US dollars\"}\n\n iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: \"zh\"\n {:ok, \"美元\"}\n\n iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: \"fr\"\n {:ok, \"dollars des États-Unis\"}\n\n iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: \"fr\"\n {:ok, \"dollar des États-Unis\"}","ref":"Plausible.Cldr.Currency.html#pluralize/3-examples"},{"type":"function","title":"Plausible.Cldr.Currency.strings_for_currency/2","doc":"Returns the strings associated with a currency\nin a given locale.","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.strings_for_currency/2","doc":"* `currency` is an ISO4217 currency code\n\n* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.strings_for_currency/2","doc":"* A list of strings or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.strings_for_currency/2","doc":"iex> MyApp.Cldr.Currency.strings_for_currency :AUD, \"en\"\n [\"a$\", \"australian dollars\", \"aud\", \"australian dollar\"]","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2-example"},{"type":"module","title":"Plausible.Cldr.Locale","doc":"Backend module that provides functions\nto define new locales and display human-readable\nlocale names for presentation purposes.","ref":"Plausible.Cldr.Locale.html"},{"type":"function","title":"Plausible.Cldr.Locale.fallback_locale_names/1","doc":"Returns the list of fallback locale names, starting\nwith the provided locale name.\n\nFallbacks are a list of locate names which can\nbe used to resolve translation or other localization\ndata if such localised data does not exist for\nthis specific locale..","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.fallback_locale_names/1","doc":"* `locale_name` is any locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.fallback_locale_names/1","doc":"* `{:ok, list_of_locale_names}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.fallback_locale_names/1","doc":"iex> Plausible.Cldr.Locale.fallback_locale_names(:\"fr-CA\")\n {:ok, [:\"fr-CA\", :fr, :und]}\n\n # Fallbacks are typically formed by progressively\n # stripping variant, territory and script from the\n # given locale name. But not always - there are\n # certain fallbacks that take a different path.\n\n iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)\n {:ok, [:nb, :no, :und]}","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.fallback_locales/1","doc":"Returns the list of fallback locales, starting\nwith the provided locale name.\n\nFallbacks are a list of locate names which can\nbe used to resolve translation or other localization\ndata if such localised data does not exist for\nthis specific locale.","ref":"Plausible.Cldr.Locale.html#fallback_locales/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.fallback_locales/1","doc":"* `locale_name` is any locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.Locale.html#fallback_locales/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.fallback_locales/1","doc":"* `{:ok, list_of_locales}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#fallback_locales/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.fallback_locales/1","doc":"Plausible.Cldr.Locale.fallback_locales(:\"fr-CA\")\n => {:ok,\n [#Cldr.LanguageTag , #Cldr.LanguageTag ,\n #Cldr.LanguageTag ]}\n\n # Fallbacks are typically formed by progressively\n # stripping variant, territory and script from the\n # given locale name. But not always - there are\n # certain fallbacks that take a different path.\n\n Plausible.Cldr.Locale.fallback_locales(:nb))\n => {:ok,\n [#Cldr.LanguageTag , #Cldr.LanguageTag ,\n #Cldr.LanguageTag ]}","ref":"Plausible.Cldr.Locale.html#fallback_locales/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.locale_for_territory/1","doc":"Returns the \"best fit\" locale for a given territory.\n\nUsing the population percentage data from CLDR, the\nlanguage most commonly spoken in the given territory\nis used to form a locale name which is then validated\nagainst the given backend.\n\nFirst a territory-specific locale is validated and if\nthat fails, the base language only is validate.\n\nFor example, if the territory is `AU` then then the\nlanguage most spoken is \"en\". First, the locale \"en-AU\"\nis validated and if that fails, \"en\" is validated.","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.locale_for_territory/1","doc":"* `territory` is any ISO 3166 Alpha-2 territory\n code that can be validated by `Cldr.validate_territory/1`","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.locale_for_territory/1","doc":"* `{:ok, language_tag}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.locale_for_territory/1","doc":"iex> Plausible.Cldr.Locale.locale_for_territory(:AU)\n Elixir.Plausible.Cldr.validate_locale(:\"en-AU\")\n\n iex> Plausible.Cldr.Locale.locale_for_territory(:US)\n Elixir.Plausible.Cldr.validate_locale(:\"en-US\")\n\n iex> Plausible.Cldr.Locale.locale_for_territory(:ZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZ is unknown\"}}","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.locale_from_host/2","doc":"Returns a \"best fit\" locale for a host name.","ref":"Plausible.Cldr.Locale.html#locale_from_host/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.locale_from_host/2","doc":"* `host` is any valid host name\n\n* `options` is a keyword list of options. The default\n is `[]`.","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Locale.locale_from_host/2","doc":"* `:tlds` is a list of territory codes as upper-cased\n atoms that are to be considered as top-level domains.\n See `Cldr.Locale.locale_from_host/2` for the default\n list.","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.locale_from_host/2","doc":"* `{:ok, langauge_tag}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-returns"},{"type":"function","title":"Notes - Plausible.Cldr.Locale.locale_from_host/2","doc":"Certain top-level domains have become associated with content\nunderlated to the territory for who the domain is registered.\nTherefore Google (and perhaps others) do not associate these\nTLDs as belonging to the territory but rather are considered\ngeneric top-level domain names.","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.locale_from_host/2","doc":"iex> Plausible.Cldr.Locale.locale_from_host \"a.b.com.au\"\n Elixir.Plausible.Cldr.validate_locale(:\"en-AU\")\n\n iex> Plausible.Cldr.Locale.locale_from_host(\"a.b.com.tv\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"tv\\\"\"}}\n\n iex> Plausible.Cldr.Locale.locale_from_host(\"a.b.com\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"com\\\"\"}}","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-examples"},{"type":"function","title":"Plausible.Cldr.Locale.new/1","doc":"","ref":"Plausible.Cldr.Locale.html#new/1"},{"type":"function","title":"Plausible.Cldr.Locale.new!/1","doc":"","ref":"Plausible.Cldr.Locale.html#new!/1"},{"type":"function","title":"Plausible.Cldr.Locale.script_direction_from_locale/1","doc":"Returns the script direction for a locale.","ref":"Plausible.Cldr.Locale.html#script_direction_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.script_direction_from_locale/1","doc":"* `language_tag` is any language tag returned by `Cldr.Locale.new/2`\n or any `locale_name` returned by `Cldr.known_locale_names/1`.","ref":"Plausible.Cldr.Locale.html#script_direction_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.script_direction_from_locale/1","doc":"* The script direction which is either `:ltr` (for left-to-right\n scripts) or `:rtl` (for right-to-left scripts).","ref":"Plausible.Cldr.Locale.html#script_direction_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.script_direction_from_locale/1","doc":"iex> Plausible.Cldr.Locale.script_direction_from_locale \"en-US\"\n :ltr\n\n iex> Plausible.Cldr.Locale.script_direction_from_locale :ar\n :rtl","ref":"Plausible.Cldr.Locale.html#script_direction_from_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.territory_from_host/1","doc":"Returns the last segment of a host that might\nbe a territory.","ref":"Plausible.Cldr.Locale.html#territory_from_host/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.territory_from_host/1","doc":"* `host` is any valid host name","ref":"Plausible.Cldr.Locale.html#territory_from_host/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.territory_from_host/1","doc":"* `{:ok, territory}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#territory_from_host/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.territory_from_host/1","doc":"iex> Cldr.Locale.territory_from_host(\"a.b.com.au\")\n {:ok, :AU}\n\n iex> Cldr.Locale.territory_from_host(\"a.b.com\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"com\\\"\"}}","ref":"Plausible.Cldr.Locale.html#territory_from_host/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.territory_from_locale/1","doc":"Returns the territory from a language tag or\nlocale name.","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.territory_from_locale/1","doc":"* `locale` is any language tag returned by\n `Plausible.Cldr.Locale.new/1`\n or a locale name in the list returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.territory_from_locale/1","doc":"* A territory code as an atom","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.territory_from_locale/1","doc":"iex> Plausible.Cldr.Locale.territory_from_locale \"en-US\"\n :US\n\n iex> Plausible.Cldr.Locale.territory_from_locale \"en-US-u-rg-GBzzzz\"\n :GB","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.timezone_from_locale/1","doc":"Returns the time zone from a language tag or\nlocale name.","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.timezone_from_locale/1","doc":"* `locale` is any language tag returned by\n `Plausible.Cldr.Locale.new/1`\n or a locale name in the list returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.timezone_from_locale/1","doc":"* A time zone ID as a string or\n\n* `:error` if no time zone can be determined","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.timezone_from_locale/1","doc":"iex> Plausible.Cldr.Locale.timezone_from_locale \"en-US-u-tz-ausyd\"\n \"Australia/Sydney\"","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1-examples"},{"type":"module","title":"Plausible.Cldr.Number","doc":"Formats numbers and currencies based upon CLDR's decimal formats specification.\n\nThe format specification is documentated in [Unicode TR35](http://unicode.org/reports/tr35/tr35-numbers.html#Number_Formats).\nThere are several classes of formatting including non-scientific, scientific,\nrules based (for spelling and ordinal formats), compact formats that display `1k`\nrather than `1,000` and so on. See `Cldr.Number.to_string/2` for specific formatting\noptions.\n\n#","ref":"Plausible.Cldr.Number.html"},{"type":"module","title":"Non-Scientific Notation Formatting - Plausible.Cldr.Number","doc":"The following description applies to formats that do not use scientific\nnotation or significant digits:\n\n* If the number of actual integer digits exceeds the maximum integer digits,\n then only the least significant digits are shown. For example, 1997 is\n formatted as \"97\" if the maximum integer digits is set to 2.\n\n* If the number of actual integer digits is less than the minimum integer\n digits, then leading zeros are added. For example, 1997 is formatted as\n \"01997\" if the minimum integer digits is set to 5.\n\n* If the number of actual fraction digits exceeds the maximum fraction\n digits, then half-even rounding it performed to the maximum fraction\n digits. For example, 0.125 is formatted as \"0.12\" if the maximum fraction\n digits is 2. This behavior can be changed by specifying a rounding\n increment and a rounding mode.\n\n* If the number of actual fraction digits is less than the minimum fraction\n digits, then trailing zeros are added. For example, 0.125 is formatted as\n \"0.1250\" if the minimum fraction digits is set to 4.\n\n* Trailing fractional zeros are not displayed if they occur j positions after\n the decimal, where j is less than the maximum fraction digits. For example,\n 0.10004 is formatted as \"0.1\" if the maximum fraction digits is four or\n less.\n\n#","ref":"Plausible.Cldr.Number.html#module-non-scientific-notation-formatting"},{"type":"module","title":"Scientific Notation Formatting - Plausible.Cldr.Number","doc":"Numbers in scientific notation are expressed as the product of a mantissa and\na power of ten, for example, 1234 can be expressed as 1.234 x 10^3. The\nmantissa is typically in the half-open interval [1.0, 10.0) or sometimes\n[0.0, 1.0), but it need not be. In a pattern, the exponent character\nimmediately followed by one or more digit characters indicates scientific\nnotation. Example: \"0.###E0\" formats the number 1234 as \"1.234E3\".\n\n* The number of digit characters after the exponent character gives the\n minimum exponent digit count. There is no maximum. Negative exponents are\n formatted using the localized minus sign, not the prefix and suffix from\n the pattern. This allows patterns such as \"0.###E0 m/s\". To prefix positive\n exponents with a localized plus sign, specify '+' between the exponent and\n the digits: \"0.###E+0\" will produce formats \"1E+1\", \"1E+0\", \"1E-1\", and so\n on. (In localized patterns, use the localized plus sign rather than '+'.)\n\n* The minimum number of integer digits is achieved by adjusting the exponent.\n Example: 0.00123 formatted with \"00.###E0\" yields \"12.3E-4\". This only\n happens if there is no maximum number of integer digits. If there is a\n maximum, then the minimum number of integer digits is fixed at one.\n\n* The maximum number of integer digits, if present, specifies the exponent\n grouping. The most common use of this is to generate engineering notation,\n in which the exponent is a multiple of three, for example, \"##0.###E0\". The\n number 12345 is formatted using \"##0.####E0\" as \"12.345E3\".\n\n* When using scientific notation, the formatter controls the digit counts\n using significant digits logic. The maximum number of significant digits\n limits the total number of integer and fraction digits that will be shown\n in the mantissa; it does not affect parsing. For example, 12345 formatted\n with \"##0.##E0\" is \"12.3E3\". Exponential patterns may not contain grouping\n separators.\n\n#","ref":"Plausible.Cldr.Number.html#module-scientific-notation-formatting"},{"type":"module","title":"Significant Digits - Plausible.Cldr.Number","doc":"There are two ways of controlling how many digits are shows: (a)\nsignificant digits counts, or (b) integer and fraction digit counts. Integer\nand fraction digit counts are described above. When a formatter is using\nsignificant digits counts, it uses however many integer and fraction digits\nare required to display the specified number of significant digits. It may\nignore min/max integer/fraction digits, or it may use them to the extent\npossible.","ref":"Plausible.Cldr.Number.html#module-significant-digits"},{"type":"function","title":"Plausible.Cldr.Number.parse/2","doc":"Parse a string locale-aware manner and return\na number.","ref":"Plausible.Cldr.Number.html#parse/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.parse/2","doc":"* `string` is any `String.t`\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#parse/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.parse/2","doc":"* `:number` is one of `:integer`, `:float`,\n `:decimal` or `nil`. The default is `nil`\n meaning that the type auto-detected as either\n an `integer` or a `float`.\n\n* `:locale` is any locale returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag.t`. The default is\n `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.html#parse/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Number.parse/2","doc":"* A number of the requested or default type or\n\n* `{:error, {exception, error}}` if no number could be determined","ref":"Plausible.Cldr.Number.html#parse/2-returns"},{"type":"function","title":"Notes - Plausible.Cldr.Number.parse/2","doc":"This function parses a string to return a number but\nin a locale-aware manner. It will normalise grouping\ncharacters and decimal separators, different forms of\nthe `+` and `-` symbols that appear in Unicode and\nstrips any `_` characters that might be used for\nformatting in a string. It then parses the number\nusing the Elixir standard library functions.","ref":"Plausible.Cldr.Number.html#parse/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Number.parse/2","doc":"iex> Plausible.Cldr.Number.parse(\"+1.000,34\", locale: \"de\")\n {:ok, 1000.34}\n\n iex> Plausible.Cldr.Number.parse(\"-1_000_000.34\")\n {:ok, -1000000.34}\n\n iex> Plausible.Cldr.Number.parse(\"1.000\", locale: \"de\", number: :integer)\n {:ok, 1000}\n\n iex> Plausible.Cldr.Number.parse(\"+1.000,34\", locale: \"de\", number: :integer)\n {:error,\n {Cldr.Number.ParseError,\n \"The string \\\"+1.000,34\\\" could not be parsed as a number\"}}","ref":"Plausible.Cldr.Number.html#parse/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.resolve_currencies/2","doc":"Resolve curencies from strings within\na list.","ref":"Plausible.Cldr.Number.html#resolve_currencies/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.resolve_currencies/2","doc":"* `list` is any list in which currency\n names and symbols are expected\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#resolve_currencies/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.resolve_currencies/2","doc":"* `:locale` is any valid locale returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n The default is `Plausible.Cldr.get_locale()`\n\n* `:only` is an `atom` or list of `atoms` representing the\n currencies or currency types to be considered for a match.\n The equates to a list of acceptable currencies for parsing.\n See the notes below for currency types.\n\n* `:except` is an `atom` or list of `atoms` representing the\n currencies or currency types to be not considered for a match.\n This equates to a list of unacceptable currencies for parsing.\n See the notes below for currency types.\n\n* `:fuzzy` is a float greater than `0.0` and less than or\n equal to `1.0` which is used as input to\n `String.jaro_distance/2` to determine is the provided\n currency string is *close enough* to a known currency\n string for it to identify definitively a currency code.\n It is recommended to use numbers greater than `0.8` in\n order to reduce false positives.","ref":"Plausible.Cldr.Number.html#resolve_currencies/2-options"},{"type":"function","title":"Notes - Plausible.Cldr.Number.resolve_currencies/2","doc":"The `:only` and `:except` options accept a list of\ncurrency codes and/or currency types. The following\ntypes are recognised.\n\nIf both `:only` and `:except` are specified,\nthe `:except` entries take priority - that means\nany entries in `:except` are removed from the `:only`\nentries.\n\n * `:all`, the default, considers all currencies\n\n * `:current` considers those currencies that have a `:to`\n date of nil and which also is a known ISO4217 currency\n\n * `:historic` is the opposite of `:current`\n\n * `:tender` considers currencies that are legal tender\n\n * `:unannotated` considers currencies that don't have\n \"(some string)\" in their names. These are usually\n financial instruments.","ref":"Plausible.Cldr.Number.html#resolve_currencies/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Number.resolve_currencies/2","doc":"iex> Plausible.Cldr.Number.scan(\"100 US dollars\")\n ...> |> Plausible.Cldr.Number.resolve_currencies\n [100, :USD]\n\n iex> Plausible.Cldr.Number.scan(\"100 eurosports\")\n ...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)\n [100, :EUR]\n\n iex> Plausible.Cldr.Number.scan(\"100 dollars des États-Unis\")\n ...> |> Plausible.Cldr.Number.resolve_currencies(locale: \"fr\")\n [100, :USD]","ref":"Plausible.Cldr.Number.html#resolve_currencies/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.resolve_currency/2","doc":"Resolve a currency from a string","ref":"Plausible.Cldr.Number.html#resolve_currency/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.resolve_currency/2","doc":"* `list` is any list in which currency\n names and symbols are expected\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#resolve_currency/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.resolve_currency/2","doc":"* `:locale` is any valid locale returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n The default is `Plausible.Cldr.get_locale()`\n\n* `:only` is an `atom` or list of `atoms` representing the\n currencies or currency types to be considered for a match.\n The equates to a list of acceptable currencies for parsing.\n See the notes below for currency types.\n\n* `:except` is an `atom` or list of `atoms` representing the\n currencies or currency types to be not considered for a match.\n This equates to a list of unacceptable currencies for parsing.\n See the notes below for currency types.\n\n* `:fuzzy` is a float greater than `0.0` and less than or\n equal to `1.0` which is used as input to\n `String.jaro_distance/2` to determine is the provided\n currency string is *close enough* to a known currency\n string for it to identify definitively a currency code.\n It is recommended to use numbers greater than `0.8` in\n order to reduce false positives.","ref":"Plausible.Cldr.Number.html#resolve_currency/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Number.resolve_currency/2","doc":"* An ISO4217 currency code as an atom or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.html#resolve_currency/2-returns"},{"type":"function","title":"Notes - Plausible.Cldr.Number.resolve_currency/2","doc":"The `:only` and `:except` options accept a list of\ncurrency codes and/or currency types. The following\ntypes are recognised.\n\nIf both `:only` and `:except` are specified,\nthe `:except` entries take priority - that means\nany entries in `:except` are removed from the `:only`\nentries.\n\n * `:all`, the default, considers all currencies\n\n * `:current` considers those currencies that have a `:to`\n date of nil and which also is a known ISO4217 currency\n\n * `:historic` is the opposite of `:current`\n\n * `:tender` considers currencies that are legal tender\n\n * `:unannotated` considers currencies that don't have\n \"(some string)\" in their names. These are usually\n financial instruments.","ref":"Plausible.Cldr.Number.html#resolve_currency/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Number.resolve_currency/2","doc":"iex> Plausible.Cldr.Number.resolve_currency(\"US dollars\")\n [:USD]\n\n iex> Plausible.Cldr.Number.resolve_currency(\"100 eurosports\", fuzzy: 0.75)\n [:EUR]\n\n iex> Plausible.Cldr.Number.resolve_currency(\"dollars des États-Unis\", locale: \"fr\")\n [:USD]\n\n iex> Plausible.Cldr.Number.resolve_currency(\"not a known currency\", locale: \"fr\")\n {:error,\n {Cldr.UnknownCurrencyError,\n \"The currency \\\"not a known currency\\\" is unknown or not supported\"}}","ref":"Plausible.Cldr.Number.html#resolve_currency/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.resolve_per/2","doc":"Resolve and tokenize percent or permille\nfrom the beginning and/or the end of a string","ref":"Plausible.Cldr.Number.html#resolve_per/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.resolve_per/2","doc":"* `list` is any list in which percent\n and permille symbols are expected\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#resolve_per/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.resolve_per/2","doc":"* `:locale` is any valid locale returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n The default is `options[:backend].get_locale()`","ref":"Plausible.Cldr.Number.html#resolve_per/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Number.resolve_per/2","doc":"* An `:percent` or `permille` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.html#resolve_per/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.resolve_per/2","doc":"iex> Plausible.Cldr.Number.resolve_per \"11%\"\n [\"11\", :percent]\n\n iex> Plausible.Cldr.Number.resolve_per \"% of linguists\"\n [:percent, \" of linguists\"]\n\n iex> Plausible.Cldr.Number.resolve_per \"% of linguists %\"\n [:percent, \" of linguists \", :percent]","ref":"Plausible.Cldr.Number.html#resolve_per/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.resolve_pers/2","doc":"Resolve and tokenize percent and permille\nsybols from strings within a list.\n\nPercent and permille symbols can be identified\nat the beginning and/or the end of a string.","ref":"Plausible.Cldr.Number.html#resolve_pers/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.resolve_pers/2","doc":"* `list` is any list in which percent and\n permille symbols are expected\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#resolve_pers/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.resolve_pers/2","doc":"* `:locale` is any valid locale returned by `Cldr.known_locale_names/1`\n or a `t:Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n The default is `options[:backend].get_locale()`","ref":"Plausible.Cldr.Number.html#resolve_pers/2-options"},{"type":"function","title":"Examples - Plausible.Cldr.Number.resolve_pers/2","doc":"iex> Plausible.Cldr.Number.scan(\"100%\")\n ...> |> Plausible.Cldr.Number.resolve_pers()\n [100, :percent]","ref":"Plausible.Cldr.Number.html#resolve_pers/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.scan/2","doc":"Scans a string locale-aware manner and returns\na list of strings and numbers.","ref":"Plausible.Cldr.Number.html#scan/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.scan/2","doc":"* `string` is any `String.t`\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#scan/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.scan/2","doc":"* `:number` is one of `:integer`, `:float`,\n `:decimal` or `nil`. The default is `nil`\n meaning that the type auto-detected as either\n an `integer` or a `float`.\n\n* `:locale` is any locale returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag.t`. The default is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.html#scan/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Number.scan/2","doc":"* A list of strings and numbers","ref":"Plausible.Cldr.Number.html#scan/2-returns"},{"type":"function","title":"Notes - Plausible.Cldr.Number.scan/2","doc":"Number parsing is performed by `Cldr.Number.Parser.parse/2`\nand any options provided are passed to that function.","ref":"Plausible.Cldr.Number.html#scan/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Number.scan/2","doc":"iex> Plausible.Cldr.Number.scan(\"£1_000_000.34\")\n [\"£\", 1000000.34]\n\n iex> Plausible.Cldr.Number.scan(\"I want £1_000_000 dollars\")\n [\"I want £\", 1000000, \" dollars\"]\n\n iex> Plausible.Cldr.Number.scan(\"The prize is 23\")\n [\"The prize is \", 23]\n\n iex> Plausible.Cldr.Number.scan(\"The lottery number is 23 for the next draw\")\n [\"The lottery number is \", 23, \" for the next draw\"]\n\n iex> Plausible.Cldr.Number.scan(\"The loss is -1.000 euros\", locale: \"de\", number: :integer)\n [\"The loss is \", -1000, \" euros\"]","ref":"Plausible.Cldr.Number.html#scan/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.to_approx_string/2","doc":"Formats a number and applies the `:approximately` format for\na locale and number system.","ref":"Plausible.Cldr.Number.html#to_approx_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_approx_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.\n See `Cldr.Number.to_string/3` for a description of the available\n options.","ref":"Plausible.Cldr.Number.html#to_approx_string/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.to_approx_string/2","doc":"iex> Plausible.Cldr.Number.to_approx_string 1234\n {:ok, \"~1,234\"}","ref":"Plausible.Cldr.Number.html#to_approx_string/2-example"},{"type":"function","title":"Plausible.Cldr.Number.to_at_least_string/2","doc":"Formats a number and applies the `:at_least` format for\na locale and number system.","ref":"Plausible.Cldr.Number.html#to_at_least_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_at_least_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.\n See `Plausible.Cldr.Number.to_string/2` for a description of the available\n options.","ref":"Plausible.Cldr.Number.html#to_at_least_string/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.to_at_least_string/2","doc":"iex> Plausible.Cldr.Number.to_at_least_string 1234\n {:ok, \"1,234+\"}","ref":"Plausible.Cldr.Number.html#to_at_least_string/2-example"},{"type":"function","title":"Plausible.Cldr.Number.to_at_most_string/2","doc":"Formats a number and applies the `:at_most` format for\na locale and number system.","ref":"Plausible.Cldr.Number.html#to_at_most_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_at_most_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.\n See `Cldr.Number.to_string/3` for a description of the available\n options.","ref":"Plausible.Cldr.Number.html#to_at_most_string/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.to_at_most_string/2","doc":"iex> Plausible.Cldr.Number.to_at_most_string 1234\n {:ok, \"≤1,234\"}","ref":"Plausible.Cldr.Number.html#to_at_most_string/2-example"},{"type":"function","title":"Plausible.Cldr.Number.to_range_string/2","doc":"Formats the first and last numbers of a range and applies\nthe `:range` format for a locale and number system.","ref":"Plausible.Cldr.Number.html#to_range_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_range_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.\n See `Cldr.Number.to_string/3` for a description of the available\n options.","ref":"Plausible.Cldr.Number.html#to_range_string/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.to_range_string/2","doc":"iex> Plausible.Cldr.Number.to_range_string 1234..5678\n {:ok, \"1,234–5,678\"}","ref":"Plausible.Cldr.Number.html#to_range_string/2-example"},{"type":"function","title":"Plausible.Cldr.Number.to_string/2","doc":"Returns a number formatted into a string according to a format pattern and options.","ref":"Plausible.Cldr.Number.html#to_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.","ref":"Plausible.Cldr.Number.html#to_string/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.to_string/2","doc":"* `format`: the format style or a format string defining how the number is\n formatted. See `Cldr.Number.Format` for how format strings can be constructed.\n See `Cldr.Number.Format.format_styles_for/3` to return available format styles\n for a locale. The default `format` is `:standard`.\n\n* If `:format` is set to `:long` or `:short` then the formatting depends on\n whether `:currency` is specified. If not specified then the number is\n formatted as `:decimal_long` or `:decimal_short`. If `:currency` is\n specified the number is formatted as `:currency_long` or\n `:currency_short` and `:fractional_digits` is set to 0 as a default.\n\n* `:format` may also be a format defined by CLDR's Rules Based Number\n Formats (RBNF). Further information is found in the module `Cldr.Rbnf`.\n The most commonly used formats in this category are to spell out the\n number in a the locales language. The applicable formats are `:spellout`,\n `:spellout_year`, `:ordinal`. A number can also be formatted as roman\n numbers by using the format `:roman` or `:roman_lower`.\n\n* `currency`: is the currency for which the number is formatted. For\n available currencies see `Cldr.Currency.known_currencies/0`. This option\n is required if `:format` is set to `:currency`. If `currency` is set\n and no `:format` is set, `:format` will be set to `:currency` as well.\n\n* `currency_symbol`: Allows overriding a currency symbol. The alternatives\n are:\n * `:iso` the ISO currency code will be used instead of the default\n currency symbol.\n * `:narrow` uses the narrow symbol defined for the locale. The same\n narrow symbol can be defined for more than one currency and therefore this\n should be used with care. If no narrow symbol is defined, the standard\n symbol is used.\n * `:symbol` uses the standard symbol defined in CLDR. A symbol is unique\n for each currency and can be safely used.\n * \"string\" uses `string` as the currency symbol\n * `:standard` (the default and recommended) uses the CLDR-defined symbol\n based upon the currency format for the locale.\n\n* `:cash`: a boolean which indicates whether a number being formatted as a\n `:currency` is to be considered a cash value or not. Currencies can be\n rounded differently depending on whether `:cash` is `true` or `false`.\n *This option is deprecated in favour of `currency_digits: :cash`.\n\n* `:currency_digits` indicates which of the rounding and digits should be\n used. The options are `:accounting` which is the default, `:cash` or\n `:iso`\n\n* `:rounding_mode`: determines how a number is rounded to meet the precision\n of the format requested. The available rounding modes are `:down`,\n :half_up, :half_even, :ceiling, :floor, :half_down, :up. The default is\n `:half_even`.\n\n* `:number_system`: determines which of the number systems for a locale\n should be used to define the separators and digits for the formatted\n number. If `number_system` is an `atom` then `number_system` is\n interpreted as a number system. If the `:number_system` is\n `binary` then it is interpreted as a number system name. See\n `Cldr.Number.System.number_system_names_for/2`. The default is `:default`.\n\n* `:locale`: determines the locale in which the number is formatted. See\n `Cldr.known_locale_names/0`. The default is`Cldr.get_locale/0` which is the\n locale currently in affect for this `Process` and which is set by\n `Cldr.put_locale/1`.\n\n* If `:fractional_digits` is set to a positive integer value then the number\n will be rounded to that number of digits and displayed accordingly - overriding\n settings that would be applied by default. For example, currencies have\n fractional digits defined reflecting each currencies minor unit. Setting\n `:fractional_digits` will override that setting.\n\n* If `:maximum_integer_digits` is set to a positive integer value then the\n number is left truncated before formatting. For example if the number `1234`\n is formatted with the option `maximum_integer_digits: 2`, the number is\n truncated to `34` and formatted.\n\n* If `:round_nearest` is set to a positive integer value then the number\n will be rounded to nearest increment of that value - overriding\n settings that would be applied by default.\n\n* `:minimum_grouping_digits` overrides the CLDR definition of minimum grouping\n digits. For example in the locale `es` the number `1234` is formatted by default\n as `1345` because the locale defines the `minimium_grouping_digits` as `2`. If\n `minimum_grouping_digits: 1` is set as an option the number is formatting as\n `1.345`. The `:minimum_grouping_digits` is added to the grouping defined by\n the number format. If the sum of these two digits is greater than the number\n of digits in the integer (or fractional) part of the number then no grouping\n is performed.\n\n* `:wrapper` is a 2-arity function that will be called for each number component\n with parameters `string` and `tag` where `tag` is one of `:number`,\n `:currency_symbol`, `:currency_space`, `:literal`, `:quote`, `:percent`,\n `:permille`, `:minus` or `:plus`. The function must return a string. The\n function can be used to wrap format elements in HTML or other tags.","ref":"Plausible.Cldr.Number.html#to_string/2-options"},{"type":"function","title":"Locale extensions affecting formatting - Plausible.Cldr.Number.to_string/2","doc":"A locale identifier can specify options that affect number formatting.\nThese options are:\n\n* `nu`: defines the number system to be used if none is specified by the `:number_system`\n option to `to_string/2`\n\nThis key is part of the [u extension](https://unicode.org/reports/tr35/#u_Extension) and\nthat document should be consulted for details on how to construct a locale identifier with these\nextensions.","ref":"Plausible.Cldr.Number.html#to_string/2-locale-extensions-affecting-formatting"},{"type":"function","title":"Wrapping format elements - Plausible.Cldr.Number.to_string/2","doc":"Wrapping elements is particularly useful when formatting a number with a\ncurrency symbol and the requirement is to have different HTML formatting\napplied to the symbol than the number. For example:\n\n iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn\n ...> string, :currency_symbol -> \" \" string \" \"\n ...> string, :number -> \" \" string \" \"\n ...> string, :currency_space -> \" \" string \" \"\n ...> string, _other -> string\n ...> end)\n {:ok, \" $ 100.00 \"}\n\nIt is also possible and recommended to use the `Phoenix.HTML.Tag.content_tag/3`\nfunction if wrapping HTML tags since these will ensure HTML entities are\ncorrectly encoded. For example:\n\n iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn\n ...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: \"symbol\")\n ...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: \"number\")\n ...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)\n ...> string, _other -> string\n ...> end)\n {:ok, \" $ 100.00 \"}\n\nWhen formatting a number the format is parsed into format elements that might include\na currency symbol, a literal string, inserted text between a currency symbol and the\ncurrency amount, a percent sign, the number itself and several other elements. In\nsome cases it is helpful to be apply specific formatting to each element.\nThis can be achieved by specifying a `:wrapper` option. This option takes a 2-arity\nfunction as an argument. For each element of the format the wrapper function is called\nwith two parameters: the format element as a string and an atom representing the\nelement type. The wrapper function is required to return a string that is then\ninserted in the final formatted number.","ref":"Plausible.Cldr.Number.html#to_string/2-wrapping-format-elements"},{"type":"function","title":"Returns - Plausible.Cldr.Number.to_string/2","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.html#to_string/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.to_string/2","doc":"iex> Plausible.Cldr.Number.to_string 12345\n {:ok, \"12,345\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, locale: \"fr\"\n {:ok, \"12 345\"}\n\n iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: \"es\", minimum_grouping_digits: 1\n {:ok, \"1.345,32 €\"}\n\n iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: \"es\"\n {:ok, \"1345,32 €\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, locale: \"fr\", currency: \"USD\"\n {:ok, \"12 345,00 $US\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, format: \"#E0\"\n {:ok, \"1.2345E4\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\"\n {:ok, \"THB 12,345.00\"}\n\n iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: \"THB\"\n {:ok, \"(THB 12,345.00)\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\",\n ...> locale: \"th\"\n {:ok, \"฿12,345.00\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\",\n ...> locale: \"th\", number_system: :native\n {:ok, \"฿๑๒,๓๔๕.๐๐\"}\n\n iex> Plausible.Cldr.Number.to_string 1244.30, format: :long\n {:ok, \"1 thousand\"}\n\n iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: \"USD\"\n {:ok, \"1,244 US dollars\"}\n\n iex> Plausible.Cldr.Number.to_string 1244.30, format: :short\n {:ok, \"1K\"}\n\n iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: \"EUR\"\n {:ok, \"€1K\"}\n\n iex> Plausible.Cldr.Number.to_string 1234, format: :spellout\n {:ok, \"one thousand two hundred thirty-four\"}\n\n iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose\n {:ok, \"one thousand two hundred and thirty-four\"}\n\n iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year\n {:ok, \"nineteen eighty-nine\"}\n\n iex> Plausible.Cldr.Number.to_string 123, format: :ordinal\n {:ok, \"123rd\"}\n\n iex> Plausible.Cldr.Number.to_string 123, format: :roman\n {:ok, \"CXXIII\"}\n\n iex> Plausible.Cldr.Number.to_string 123, locale: \"th-u-nu-thai\"\n {:ok, \"๑๒๓\"}","ref":"Plausible.Cldr.Number.html#to_string/2-examples"},{"type":"function","title":"Errors - Plausible.Cldr.Number.to_string/2","doc":"An error tuple `{:error, reason}` will be returned if an error is detected.\nThe two most likely causes of an error return are:\n\n * A format cannot be compiled. In this case the error tuple will look like:\n\n```\n iex> Plausible.Cldr.Number.to_string(12345, format: \"0#\")\n {:error, {Cldr.FormatCompileError,\n \"Decimal format compiler: syntax error before: \\\"#\\\"\"}}\n```\n\n * The format style requested is not defined for the `locale` and\n `number_system`. This happens typically when the number system is\n `:algorithmic` rather than the more common `:numeric`. In this case the error\n return looks like:\n\n```\n iex> Plausible.Cldr.Number.to_string(1234, locale: \"he\", number_system: \"hebr\")\n {:error, {Cldr.UnknownFormatError,\n \"The locale :he with number system :hebr does not define a format :standard\"}}\n```","ref":"Plausible.Cldr.Number.html#to_string/2-errors"},{"type":"function","title":"Plausible.Cldr.Number.to_string!/2","doc":"Same as the execution of `to_string/2` but raises an exception if an error would be\nreturned.","ref":"Plausible.Cldr.Number.html#to_string!/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_string!/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted. See\n `Plausible.Cldr.Number.to_string/2`","ref":"Plausible.Cldr.Number.html#to_string!/2-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.to_string!/2","doc":"* a formatted number as a string or\n\n* raises an exception","ref":"Plausible.Cldr.Number.html#to_string!/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.to_string!/2","doc":"iex> Plausible.Cldr.Number.to_string! 12345\n \"12,345\"\n\n iex> Plausible.Cldr.Number.to_string! 12345, locale: \"fr\"\n \"12 345\"","ref":"Plausible.Cldr.Number.html#to_string!/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.validate_number_system/2","doc":"Return a valid number system from a provided locale and number\nsystem name or type.\n\nThe number system or number system type must be valid for the\ngiven locale. If a number system type is provided, the\nunderlying number system is returned.","ref":"Plausible.Cldr.Number.html#validate_number_system/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.validate_number_system/2","doc":"* `locale` is any valid locale name returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n\n* `system_name` is any number system name returned by\n `Cldr.known_number_systems/0` or a number system type\n returned by `Cldr.known_number_system_types/0`","ref":"Plausible.Cldr.Number.html#validate_number_system/2-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.validate_number_system/2","doc":"iex> Plausible.Cldr.Number.validate_number_system \"en\", :latn\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.validate_number_system \"en\", :default\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.validate_number_system \"en\", :unknown\n {:error,\n {Cldr.UnknownNumberSystemError, \"The number system :unknown is unknown\"}}\n\n iex> Plausible.Cldr.Number.validate_number_system \"zz\", :default\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Plausible.Cldr.Number.html#validate_number_system/2-examples"},{"type":"module","title":"Plausible.Cldr.Number.Cardinal","doc":"Implements cardinal plural rules for numbers.","ref":"Plausible.Cldr.Number.Cardinal.html"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.available_locale_names/0","doc":"The locale names for which plural rules are defined.","ref":"Plausible.Cldr.Number.Cardinal.html#available_locale_names/0"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.known_locale_names/0","doc":"The configured locales for which plural rules are defined.\n\nReturns the intersection of `Plausible.Cldr.known_locale_names/0` and\nthe locales for which Cardinal plural rules are defined.\n\nThere are many `Cldr` locales which don't have their own plural\nrules so this list is the intersection of `Cldr`'s configured\nlocales and those that have rules.","ref":"Plausible.Cldr.Number.Cardinal.html#known_locale_names/0"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.plural_rule/3","doc":"Return the plural key for a given number in a given locale\n\nReturns which plural key (`:zero`, `:one`, `:two`, `:few`,\n`:many` or `:other`) a given number fits into within the\ncontext of a given locale.\n\nNote that these key names should not be interpreted\nliterally. For example, the key returned from\n`Cldr.Number.Ordinal.plural_rule(0, \"en\")` is actually\n`:other`, not `:zero`.\n\nThis key can then be used to format a number, date, time, unit,\nlist or other content in a plural-sensitive way.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rule/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Cardinal.plural_rule/3","doc":"* `number` is any `integer`, `float` or `Decimal`\n\n* `locale` is any locale returned by `Cldr.Locale.new!/2` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\n* `rounding` is one of `[:down, :up, :ceiling, :floor, :half_even, :half_up, :half_down]`. The\n default is `:half_even`.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rule/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Cardinal.plural_rule/3","doc":"iex> Plausible.Cldr.Number.Cardinal.plural_rule 0, \"fr\"\n :one\n\n iex> Plausible.Cldr.Number.Cardinal.plural_rule 0, \"en\"\n :other","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rule/3-examples"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.plural_rules/0","doc":"Returns all the plural rules defined in CLDR.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules/0"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.plural_rules_for/1","doc":"Return the plural rules for a locale.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Cardinal.plural_rules_for/1","doc":"* `locale` is any locale returned by `Plausible.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\nThe rules are returned in AST form after parsing.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules_for/1-arguments"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.pluralize/3","doc":"Pluralize a number using cardinal plural rules\nand a substitution map.","ref":"Plausible.Cldr.Number.Cardinal.html#pluralize/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Cardinal.pluralize/3","doc":"* `number` is an integer, float or Decimal\n\n* `locale` is any locale returned by `Plausible.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\n* `substitutions` is a map that maps plural keys to a string.\n The valid substitution keys are `:zero`, `:one`, `:two`,\n `:few`, `:many` and `:other`.\n\nSee also `Plausible.Cldr.Number.Cardinal.Cardinal.plural_rule/3`.","ref":"Plausible.Cldr.Number.Cardinal.html#pluralize/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Cardinal.pluralize/3","doc":"iex> Plausible.Cldr.Number.Cardinal.pluralize 1, \"en\", %{one: \"one\"}\n \"one\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 2, \"en\", %{one: \"one\"}\n nil\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 2, \"en\", %{one: \"one\", two: \"two\", other: \"other\"}\n \"other\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 22, \"en\", %{one: \"one\", two: \"two\", other: \"other\"}\n \"other\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), \"en\", %{one: \"one\"}\n \"one\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), \"en\", %{one: \"one\"}\n nil\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), \"en\", %{one: \"one\", two: \"two\"}\n nil\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, \"ar\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"few\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, \"en\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"","ref":"Plausible.Cldr.Number.Cardinal.html#pluralize/3-examples"},{"type":"module","title":"Plausible.Cldr.Number.Format","doc":"Functions to manage the collection of number patterns defined in Cldr.\n\nNumber patterns affect how numbers are interpreted in a localized context.\nHere are some examples, based on the French locale. The \".\" shows where the\ndecimal point should go. The \",\" shows where the thousands separator should\ngo. A \"0\" indicates zero-padding: if the number is too short, a zero (in the\nlocale's numeric set) will go there. A \"#\" indicates no padding: if the\nnumber is too short, nothing goes there. A \"¤\" shows where the currency sign\nwill go. The following illustrates the effects of different patterns for the\nFrench locale, with the number \"1234.567\". Notice how the pattern characters\n',' and '.' are replaced by the characters appropriate for the locale.","ref":"Plausible.Cldr.Number.Format.html"},{"type":"module","title":"Number Pattern Examples - Plausible.Cldr.Number.Format","doc":"| Pattern\t | Currency\t | Text |\n| ------------- | :-------------: | ----------: |\n| #,##0.##\t | n/a\t | 1 234,57 |\n| #,##0.###\t | n/a\t | 1 234,567 |\n| ###0.#####\t | n/a\t | 1234,567 |\n| ###0.0000#\t | n/a\t | 1234,5670 |\n| 00000.0000\t | n/a\t | 01234,5670 |\n| #,##0.00 ¤\t | EUR\t | 1 234,57 € |\n\nThe number of # placeholder characters before the decimal do not matter,\nsince no limit is placed on the maximum number of digits. There should,\nhowever, be at least one zero some place in the pattern. In currency formats,\nthe number of digits after the decimal also do not matter, since the\ninformation in the supplemental data (see Supplemental Currency Data) is used\nto override the number of decimal places — and the rounding — according to\nthe currency that is being formatted. That can be seen in the above chart,\nwith the difference between Yen and Euro formatting.\n\nDetails of the number formats are described in the\n[Unicode documentation](http://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns)","ref":"Plausible.Cldr.Number.Format.html#module-number-pattern-examples"},{"type":"function","title":"Plausible.Cldr.Number.Format.all_formats_for/1","doc":"Returns the decimal formats defined for a given locale.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.all_formats_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.all_formats_for/1","doc":"* `{:ok, map}` where map is a map of decimal formats\n keyed by number system or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.Format.html#all_formats_for/1-returns"},{"type":"function","title":"Plausible.Cldr.Number.Format.all_formats_for!/1","doc":"Returns the decimal formats defined for a given locale.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for!/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.all_formats_for!/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for!/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.all_formats_for!/1","doc":"* `{:ok, map}` where map is a map of decimal formats\n keyed by number system or\n\n* raises an exception\n\nSee `Plausible.Cldr.Number.Format.Number.Format.all_formats_for/1` for further information.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for!/1-returns"},{"type":"function","title":"Plausible.Cldr.Number.Format.currency_spacing/2","doc":"Returns the currency space for a given locale and\nnumber system.","ref":"Plausible.Cldr.Number.Format.html#currency_spacing/2"},{"type":"function","title":"Plausible.Cldr.Number.Format.decimal_format_list/0","doc":"Returns the list of decimal formats in the configured locales including\nthe list of locales configured for precompilation in `config.exs`.\n\nThis function exists to allow the decimal formatter\nto precompile all the known formats at compile time.","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list/0"},{"type":"function","title":"Example - Plausible.Cldr.Number.Format.decimal_format_list/0","doc":"#=> Plausible.Cldr.Number.Format.Format.decimal_format_list\n [\"#\", \"#,##,##0%\",\n \"#,##,##0.###\", \"#,##,##0.00¤\", \"#,##,##0.00¤;(#,##,##0.00¤)\",\n \"#,##,##0 %\", \"#,##0%\", \"#,##0.###\", \"#,##0.00 ¤\",\n \"#,##0.00 ¤;(#,##0.00 ¤)\", \"#,##0.00¤\", \"#,##0.00¤;(#,##0.00¤)\",\n \"#,##0 %\", \"#0%\", \"#0.######\", \"#0.00 ¤\", \"#E0\", \"%#,##0\", \"% #,##0\",\n \"0\", \"0.000000E+000\", \"0000 M ¤\", \"0000¤\", \"000G ¤\", \"000K ¤\", \"000M ¤\",\n \"000T ¤\", \"000mM ¤\", \"000m ¤\", \"000 Bio'.' ¤\", \"000 Bln ¤\", \"000 Bn ¤\",\n \"000 B ¤\", \"000 E ¤\", \"000 K ¤\", \"000 MRD ¤\", \"000 Md ¤\", \"000 Mio'.' ¤\",\n \"000 Mio ¤\", \"000 Mld ¤\", \"000 Mln ¤\", \"000 Mn ¤\", \"000 Mrd'.' ¤\",\n \"000 Mrd ¤\", \"000 Mr ¤\", \"000 M ¤\", \"000 NT ¤\", \"000 N ¤\", \"000 Tn ¤\",\n \"000 Tr ¤\", ...]","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list/0-example"},{"type":"function","title":"Plausible.Cldr.Number.Format.decimal_format_list_for/1","doc":"Returns the list of decimal formats for a configured locale.","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.decimal_format_list_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.\n\nThis function exists to allow the decimal formatter to precompile all\nthe known formats at compile time. Its use is not otherwise recommended.","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list_for/1-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.Format.decimal_format_list_for/1","doc":"iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)\n {:ok, [\"#,##0%\", \"#,##0.###\", \"#,##0.00\", \"#,##0.00;(#,##0.00)\",\"#E0\",\n \"0 billion\", \"0 million\", \"0 thousand\",\n \"0 trillion\", \"00 billion\", \"00 million\", \"00 thousand\", \"00 trillion\",\n \"000 billion\", \"000 million\", \"000 thousand\", \"000 trillion\", \"000B\", \"000K\",\n \"000M\", \"000T\", \"00B\", \"00K\", \"00M\", \"00T\", \"0B\", \"0K\", \"0M\", \"0T\",\n \"¤#,##0.00\", \"¤#,##0.00;(¤#,##0.00)\", \"¤000B\", \"¤000K\", \"¤000M\",\n \"¤000T\", \"¤00B\", \"¤00K\", \"¤00M\", \"¤00T\", \"¤0B\", \"¤0K\", \"¤0M\", \"¤0T\",\n \"¤ #,##0.00\", \"¤ #,##0.00;(¤ #,##0.00)\", \"¤ 000B\", \"¤ 000K\", \"¤ 000M\",\n \"¤ 000T\", \"¤ 00B\", \"¤ 00K\", \"¤ 00M\", \"¤ 00T\", \"¤ 0B\", \"¤ 0K\", \"¤ 0M\", \"¤ 0T\"]}","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list_for/1-example"},{"type":"function","title":"Plausible.Cldr.Number.Format.default_grouping_for/1","doc":"Returns the default grouping for a locale as a map.","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.default_grouping_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.default_grouping_for/1","doc":"* `{:ok, grouping}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Format.default_grouping_for/1","doc":"iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)\n {:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.Format.default_grouping_for!/1","doc":"Returns the default grouping for a locale\nor raises on error.","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.default_grouping_for!/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.default_grouping_for!/1","doc":"* `grouping` as a map or\n\n* raises an exception","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Format.default_grouping_for!/1","doc":"iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)\n %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.Format.formats_for/2","doc":"Return the predfined formats for a given `locale` and `number_system`.","ref":"Plausible.Cldr.Number.Format.html#formats_for/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.formats_for/2","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.\n\n* `number_system` is any valid number system or number system type returned\n by `Plausible.Cldr.Number.System.number_systems_for/1`.","ref":"Plausible.Cldr.Number.Format.html#formats_for/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.Format.formats_for/2","doc":"Plausible.Cldr.Number.Format.formats_for :fr, :native\n #=> %Cldr.Number.Format{\n accounting: \"#,##0.00 ¤;(#,##0.00 ¤)\",\n currency: \"#,##0.00 ¤\",\n percent: \"#,##0 %\",\n scientific: \"#E0\",\n standard: \"#,##0.###\"\n currency_short: [{\"1000\", [one: \"0 k ¤\", other: \"0 k ¤\"]},\n {\"10000\", [one: \"00 k ¤\", other: \"00 k ¤\"]},\n {\"100000\", [one: \"000 k ¤\", other: \"000 k ¤\"]},\n {\"1000000\", [one: \"0 M ¤\", other: \"0 M ¤\"]},\n {\"10000000\", [one: \"00 M ¤\", other: \"00 M ¤\"]},\n {\"100000000\", [one: \"000 M ¤\", other: \"000 M ¤\"]},\n {\"1000000000\", [one: \"0 Md ¤\", other: \"0 Md ¤\"]},\n {\"10000000000\", [one: \"00 Md ¤\", other: \"00 Md ¤\"]},\n {\"100000000000\", [one: \"000 Md ¤\", other: \"000 Md ¤\"]},\n {\"1000000000000\", [one: \"0 Bn ¤\", other: \"0 Bn ¤\"]},\n {\"10000000000000\", [one: \"00 Bn ¤\", other: \"00 Bn ¤\"]},\n {\"100000000000000\", [one: \"000 Bn ¤\", other: \"000 Bn ¤\"]}],\n ...\n }","ref":"Plausible.Cldr.Number.Format.html#formats_for/2-example"},{"type":"function","title":"Plausible.Cldr.Number.Format.formats_for!/2","doc":"","ref":"Plausible.Cldr.Number.Format.html#formats_for!/2"},{"type":"function","title":"Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"Returns the minimum grouping digits for a locale.","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"* `{:ok, minumum_digits}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for(\"en\")\n {:ok, 1}","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"Returns the minimum grouping digits for a locale\nor raises on error.","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"* `minumum_digits` or\n\n* raises an exception","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!(\"en\")\n 1","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-examples"},{"type":"module","title":"Plausible.Cldr.Number.Formatter.Decimal","doc":"","ref":"Plausible.Cldr.Number.Formatter.Decimal.html"},{"type":"function","title":"Plausible.Cldr.Number.Formatter.Decimal.metadata!/1","doc":"","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#metadata!/1"},{"type":"function","title":"Plausible.Cldr.Number.Formatter.Decimal.to_string/3","doc":"Formats a number according to a decimal format string.","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#to_string/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Formatter.Decimal.to_string/3","doc":"* `number` is an integer, float or Decimal\n\n* `format` is a format string. See `Plausible.Cldr.Number` for further information.\n\n* `options` is a map of options. See `Plausible.Cldr.Number.to_string/2`\n for further information.","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#to_string/3-arguments"},{"type":"module","title":"Plausible.Cldr.Number.Ordinal","doc":"Implements ordinal plural rules for numbers.","ref":"Plausible.Cldr.Number.Ordinal.html"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.available_locale_names/0","doc":"The locale names for which plural rules are defined.","ref":"Plausible.Cldr.Number.Ordinal.html#available_locale_names/0"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.known_locale_names/0","doc":"The configured locales for which plural rules are defined.\n\nReturns the intersection of `Plausible.Cldr.known_locale_names/0` and\nthe locales for which Ordinal plural rules are defined.\n\nThere are many `Cldr` locales which don't have their own plural\nrules so this list is the intersection of `Cldr`'s configured\nlocales and those that have rules.","ref":"Plausible.Cldr.Number.Ordinal.html#known_locale_names/0"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.plural_rule/3","doc":"Return the plural key for a given number in a given locale\n\nReturns which plural key (`:zero`, `:one`, `:two`, `:few`,\n`:many` or `:other`) a given number fits into within the\ncontext of a given locale.\n\nNote that these key names should not be interpreted\nliterally. For example, the key returned from\n`Cldr.Number.Ordinal.plural_rule(0, \"en\")` is actually\n`:other`, not `:zero`.\n\nThis key can then be used to format a number, date, time, unit,\nlist or other content in a plural-sensitive way.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rule/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Ordinal.plural_rule/3","doc":"* `number` is any `integer`, `float` or `Decimal`\n\n* `locale` is any locale returned by `Cldr.Locale.new!/2` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\n* `rounding` is one of `[:down, :up, :ceiling, :floor, :half_even, :half_up, :half_down]`. The\n default is `:half_even`.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rule/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Ordinal.plural_rule/3","doc":"iex> Plausible.Cldr.Number.Ordinal.plural_rule 0, \"fr\"\n :other\n\n iex> Plausible.Cldr.Number.Ordinal.plural_rule 1, \"en\"\n :one","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rule/3-examples"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.plural_rules/0","doc":"Returns all the plural rules defined in CLDR.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules/0"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.plural_rules_for/1","doc":"Return the plural rules for a locale.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Ordinal.plural_rules_for/1","doc":"* `locale` is any locale returned by `Plausible.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\nThe rules are returned in AST form after parsing.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules_for/1-arguments"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.pluralize/3","doc":"Pluralize a number using ordinal plural rules\nand a substitution map.","ref":"Plausible.Cldr.Number.Ordinal.html#pluralize/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Ordinal.pluralize/3","doc":"* `number` is an integer, float or Decimal or a `Range.t{}`. When a range, The\n is that in any usage, the start value is strictly less than the end value,\n and that no values are negative. Results for any cases that do not meet\n these criteria are undefined.\n\n* `locale` is any locale returned by `Plausible.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\n* `substitutions` is a map that maps plural keys to a string.\n The valid substitution keys are `:zero`, `:one`, `:two`,\n `:few`, `:many` and `:other`.\n\nSee also `Plausible.Cldr.Number.Ordinal.Ordinal.plural_rule/3`.","ref":"Plausible.Cldr.Number.Ordinal.html#pluralize/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Ordinal.pluralize/3","doc":"iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: \"one\"}\n \"one\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: \"one\"}\n nil\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: \"one\", two: \"two\"}\n \"two\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: \"one\", two: \"two\", other: \"other\"}\n \"two\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: \"one\"}\n \"one\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: \"one\"}\n nil\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: \"one\", two: \"two\"}\n \"two\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, \"ar\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, \"en\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"","ref":"Plausible.Cldr.Number.Ordinal.html#pluralize/3-examples"},{"type":"module","title":"Plausible.Cldr.Number.PluralRule.Range","doc":"Implements plural rules for ranges","ref":"Plausible.Cldr.Number.PluralRule.Range.html"},{"type":"function","title":"Plausible.Cldr.Number.PluralRule.Range.plural_rule/3","doc":"Returns a final plural type for a start-of-range plural\ntype, an end-of-range plural type and a locale.","ref":"Plausible.Cldr.Number.PluralRule.Range.html#plural_rule/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.PluralRule.Range.plural_rule/3","doc":"* `first` is a plural type for the start of a range\n\n* `last` is a plural type for the end of a range\n\n* `locale` is any `Cldr.LanguageTag.t` or a language name\n (not locale name)","ref":"Plausible.Cldr.Number.PluralRule.Range.html#plural_rule/3-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.PluralRule.Range.plural_rule/3","doc":"iex> Plausible.Cldr.Number.PluralRule.Range.plural_rule :other, :few, \"ar\"\n :few","ref":"Plausible.Cldr.Number.PluralRule.Range.html#plural_rule/3-example"},{"type":"module","title":"Plausible.Cldr.Number.Symbol","doc":"","ref":"Plausible.Cldr.Number.Symbol.html"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.all_decimal_symbols/0","doc":"Returns a list of all decimal symbols defined\nby the locales configured in this backend as\na list.","ref":"Plausible.Cldr.Number.Symbol.html#all_decimal_symbols/0"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.all_decimal_symbols_class/0","doc":"Returns a list of all decimal symbols defined\nby the locales configured in this backend as\na string.\n\nThis string can be used as a character class\nwhen builing a regular expression.","ref":"Plausible.Cldr.Number.Symbol.html#all_decimal_symbols_class/0"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.all_grouping_symbols/0","doc":"Returns a list of all grouping symbols defined\nby the locales configured in this backend as\na list.","ref":"Plausible.Cldr.Number.Symbol.html#all_grouping_symbols/0"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.all_grouping_symbols_class/0","doc":"Returns a list of all grouping symbols defined\nby the locales configured in this backend as\na string.\n\nThis string can be used as a character class\nwhen builing a regular expression.","ref":"Plausible.Cldr.Number.Symbol.html#all_grouping_symbols_class/0"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.number_symbols_for/1","doc":"Returns a map of `Cldr.Number.Symbol.t` structs of the number symbols for each\nof the number systems of a locale.","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/1"},{"type":"function","title":"Options - Plausible.Cldr.Number.Symbol.number_symbols_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/1-options"},{"type":"function","title":"Example: - Plausible.Cldr.Number.Symbol.number_symbols_for/1","doc":"iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)\n {:ok, %{\n latn: %Cldr.Number.Symbol{\n decimal: \".\",\n exponential: \"E\",\n group: \",\",\n infinity: \"∞\",\n list: \";\",\n minus_sign: \"-\",\n nan: \"NaN\",\n per_mille: \"‰\",\n percent_sign: \"%\",\n plus_sign: \"+\",\n superscripting_exponent: \"×\",\n time_separator: \":\"\n },\n thai: %Cldr.Number.Symbol{\n decimal: \".\",\n exponential: \"E\",\n group: \",\",\n infinity: \"∞\",\n list: \";\",\n minus_sign: \"-\",\n nan: \"NaN\",\n per_mille: \"‰\",\n percent_sign: \"%\",\n plus_sign: \"+\",\n superscripting_exponent: \"×\",\n time_separator: \":\"\n }\n }}","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/1-example"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.number_symbols_for/2","doc":"","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/2"},{"type":"module","title":"Plausible.Cldr.Number.System","doc":"","ref":"Plausible.Cldr.Number.System.html"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_for/2","doc":"Returns the actual number system from a number system type.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by ``Cldr.Locale.new!/2``\n\n* `system_name` is any number system name returned by\n `Cldr.known_number_systems/0` or a number system type\n returned by `Cldr.known_number_system_types/0`\n\nThis function will decode a number system type into the actual\nnumber system. If the number system provided can't be decoded\nit is returned as is.","ref":"Plausible.Cldr.Number.System.html#number_system_for/2"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.number_system_for/2","doc":"iex> Plausible.Cldr.Number.System.number_system_for \"th\", :latn\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Plausible.Cldr.Number.System.number_system_for \"en\", :default\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Plausible.Cldr.Number.System.number_system_for \"he\", :traditional\n {:ok, %{rules: \"hebrew\", type: :algorithmic}}\n\n iex> Plausible.Cldr.Number.System.number_system_for \"en\", :native\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Plausible.Cldr.Number.System.number_system_for \"en\", :finance\n {\n :error,\n {Cldr.UnknownNumberSystemError,\n \"The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}\"}\n }","ref":"Plausible.Cldr.Number.System.html#number_system_for/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_from_locale/1","doc":"Returns the number system from a language tag or\nlocale name.","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.System.number_system_from_locale/1","doc":"* `locale` is any language tag returned be `Cldr.Locale.new/2`\n or a locale name in the list returned by `Cldr.known_locale_names/1`","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.System.number_system_from_locale/1","doc":"* A number system name as an atom","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.number_system_from_locale/1","doc":"iex> Plausible.Cldr.Number.System.number_system_from_locale \"en-US-u-nu-thai\"\n :thai\n\n iex> Plausible.Cldr.Number.System.number_system_from_locale \"en-US\"\n :latn","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_names_for/1","doc":"Returns the number systems available for a locale\nor `{:error, message}` if the locale is not known.\n\n* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Number.System.html#number_system_names_for/1"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.number_system_names_for/1","doc":"iex> Plausible.Cldr.Number.System.number_system_names_for \"en\"\n {:ok, [:latn]}\n\n iex> Plausible.Cldr.Number.System.number_system_names_for \"zz\"\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Plausible.Cldr.Number.System.html#number_system_names_for/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_names_for!/1","doc":"","ref":"Plausible.Cldr.Number.System.html#number_system_names_for!/1"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_types_for/1","doc":"","ref":"Plausible.Cldr.Number.System.html#number_system_types_for/1"},{"type":"function","title":"Plausible.Cldr.Number.System.number_systems_for/1","doc":"Returns the number systems available for a locale\nor `{:error, message}` if the locale is not known.\n\n* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Number.System.html#number_systems_for/1"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.number_systems_for/1","doc":"iex> Plausible.Cldr.Number.System.number_systems_for \"en\"\n {:ok, %{default: :latn, native: :latn}}\n\n iex> Plausible.Cldr.Number.System.number_systems_for \"th\"\n {:ok, %{default: :latn, native: :thai}}\n\n iex> Plausible.Cldr.Number.System.number_systems_for \"zz\"\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Plausible.Cldr.Number.System.html#number_systems_for/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.number_systems_for!/1","doc":"","ref":"Plausible.Cldr.Number.System.html#number_systems_for!/1"},{"type":"function","title":"Plausible.Cldr.Number.System.number_systems_like/2","doc":"","ref":"Plausible.Cldr.Number.System.html#number_systems_like/2"},{"type":"function","title":"Plausible.Cldr.Number.System.system_name_from/2","doc":"Returns a number system name for a given locale and number system reference.\n\n* `system_name` is any number system name returned by\n `Plausible.Cldr.known_number_systems/0` or a number system type\n returned by `Plausible.Cldr.known_number_system_types/0`\n\n* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`\n\nNumber systems can be references in one of two ways:\n\n* As a number system type such as :default, :native, :traditional and\n :finance. This allows references to a number system for a locale in a\n consistent fashion for a given use\n\n* WIth the number system name directly, such as :latn, :arab or any of the\n other 70 or so\n\nThis function dereferences the supplied `system_name` and returns the\nactual system name.","ref":"Plausible.Cldr.Number.System.html#system_name_from/2"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.system_name_from/2","doc":"ex> Plausible.Cldr.Number.System.system_name_from(:default, \"en\")\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.System.system_name_from(\"latn\", \"en\")\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.System.system_name_from(:native, \"en\")\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.System.system_name_from(:nope, \"en\")\n {\n :error,\n {Cldr.UnknownNumberSystemError, \"The number system :nope is unknown\"}\n }\n\nNote that return value is not guaranteed to be a valid\nnumber system for the given locale as demonstrated in the third example.","ref":"Plausible.Cldr.Number.System.html#system_name_from/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.to_system/2","doc":"Converts a number into the representation of\na non-latin number system.\n\nThis function converts numbers to a known\nnumber system only, it does not provide number\nformatting.\n\n* `number` is a `float`, `integer` or `Decimal`\n\n* `system_name` is any number system name returned by\n `Cldr.known_number_systems/0` or a number system type\n returned by `Cldr.known_number_system_types/0`\n\nThere are two types of number systems in CLDR:\n\n* `:numeric` in which the number system defines\n a direct mapping between the latin digits `0..9`\n into a the number system equivalent. In this case,\n` to_system/2` invokes `Cldr.Number.Transliterate.transliterate_digits/3`\n for the given number.\n\n* `:algorithmic` in which the number system\n does not have the same structure as the `:latn`\n number system and therefore the conversion is\n done algorithmically. For CLDR the algorithm\n is implemented through `Cldr.Rbnf` rulesets.\n These rulesets are considered by CLDR to be\n less rigorous than the `:numeric` number systems\n and caution and testing for a specific use case\n is recommended.","ref":"Plausible.Cldr.Number.System.html#to_system/2"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.to_system/2","doc":"iex> Plausible.Cldr.Number.System.to_system 123456, :hebr\n {:ok, \"קכ״ג׳תנ״ו\"}\n\n iex> Plausible.Cldr.Number.System.to_system 123, :hans\n {:ok, \"一百二十三\"}\n\n iex> Plausible.Cldr.Number.System.to_system 123, :hant\n {:ok, \"一百二十三\"}\n\n iex> Plausible.Cldr.Number.System.to_system 123, :hansfin\n {:ok, \"壹佰贰拾叁\"}","ref":"Plausible.Cldr.Number.System.html#to_system/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.to_system!/2","doc":"Converts a number into the representation of\na non-latin number system. Returns a converted\nstring or raises on error.\n\n* `number` is a `float`, `integer` or `Decimal`\n\n* `system_name` is any number system name returned by\n `Plausible.Cldr.known_number_systems/0` or a number system type\n returned by `Plausible.Cldr.known_number_system_types/0`\n\nSee `Plausible.Cldr.Number.System.to_system/2` for further\ninformation.","ref":"Plausible.Cldr.Number.System.html#to_system!/2"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.to_system!/2","doc":"iex> Plausible.Cldr.Number.System.to_system! 123, :hans\n \"一百二十三\"\n\n iex> Plausible.Cldr.Number.System.to_system! 123, :hant\n \"一百二十三\"\n\n iex> Plausible.Cldr.Number.System.to_system! 123, :hansfin\n \"壹佰贰拾叁\"","ref":"Plausible.Cldr.Number.System.html#to_system!/2-examples"},{"type":"module","title":"Plausible.Cldr.Number.Transliterate","doc":"Transliteration for digits and separators.\n\nTransliterating a string is an expensive business. First the string has to\nbe exploded into its component graphemes. Then for each grapheme we have\nto map to the equivalent in the other `{locale, number_system}`. Then we\nhave to reassemble the string.\n\nEffort is made to short circuit where possible. Transliteration is not\nrequired for any `{locale, number_system}` that is the same as `{\"en\",\n\"latn\"}` since the implementation uses this combination for the placeholders during\nformatting already. When short circuiting is possible (typically the en-*\nlocales with \"latn\" number_system - the total number of short circuited\nlocales is 211 of the 537 in CLDR) the overall number formatting is twice as\nfast than when formal transliteration is required.\n\n#","ref":"Plausible.Cldr.Number.Transliterate.html"},{"type":"module","title":"Configuring precompilation of digit transliterations - Plausible.Cldr.Number.Transliterate","doc":"This module includes `Cldr.Number.Transliterate.transliterate_digits/3` which transliterates\ndigits between number systems. For example from :arabic to :latn. Since generating a\ntransliteration map is slow, pairs of transliterations can be configured so that the\ntransliteration map is created at compile time and therefore speeding up transliteration at\nrun time.\n\nTo configure these transliteration pairs, add the to the `use Cldr` configuration\nin a backend module:\n\n defmodule MyApp.Cldr do\n use Cldr,\n locale: [\"en\", \"fr\", \"th\"],\n default_locale: \"en\",\n precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]\n end\n\nWhere each tuple in the list configures one transliteration map. In this example, two maps are\nconfigured: from `:latn` to `:thai` and from `:arab` to `:thai`.\n\nA list of configurable number systems is returned by `Cldr.Number.System.systems_with_digits/0`.\n\nIf a transliteration is requested between two number pairs that have not been configured for\nprecompilation, a warning is logged.","ref":"Plausible.Cldr.Number.Transliterate.html#module-configuring-precompilation-of-digit-transliterations"},{"type":"function","title":"Plausible.Cldr.Number.Transliterate.transliterate/3","doc":"Transliterates from latin digits to another number system's digits.\n\nTransliterates the latin digits 0..9 to their equivalents in\nanother number system. Also transliterates the decimal and grouping\nseparators as well as the plus, minus and exponent symbols. Any other character\nin the string will be returned \"as is\".","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Transliterate.transliterate/3","doc":"* `sequence` is the string to be transliterated.\n\n* `locale` is any known locale, defaulting to `Plausible.Cldr.get_locale/0`.\n\n* `number_system` is any known number system. If expressed as a `string` it\n is the actual name of a known number system. If epressed as an `atom` it is\n used as a key to look up a number system for the locale (the usual keys are\n `:default` and `:native` but :traditional and :finance are also part of the\n standard). See `Plausible.Cldr.Number.System.number_systems_for/1` for a locale to\n see what number system types are defined. The default is `:default`.\n\nFor available number systems see `Cldr.Number.System.number_systems/0`\nand `Plausible.Cldr.Number.System.number_systems_for/1`. Also see\n`Plausible.Cldr.Number.Symbol.number_symbols_for/1`.","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Transliterate.transliterate/3","doc":"iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123556\")\n \"123556\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123,556.000\", \"fr\", :default)\n \"123 556,000\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", :default)\n \"123556\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", \"thai\")\n \"๑๒๓๕๕๖\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", :native)\n \"๑๒๓๕๕๖\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"Some number is: 123556\", \"th\", \"thai\")\n \"Some number is: ๑๒๓๕๕๖\"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate/3-examples"},{"type":"function","title":"Plausible.Cldr.Number.Transliterate.transliterate!/3","doc":"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate!/3"},{"type":"function","title":"Plausible.Cldr.Number.Transliterate.transliterate_digits/3","doc":"Transliterates digits from one number system to another number system\n\n* `digits` is binary representation of a number\n\n* `from_system` and `to_system` are number system names in atom form. See\n`Cldr.Number.System.systems_with_digits/0` for available number systems.","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate_digits/3"},{"type":"function","title":"Example - Plausible.Cldr.Number.Transliterate.transliterate_digits/3","doc":"iex> Plausible.Cldr.Number.Transliterate.transliterate_digits \"٠١٢٣٤٥٦٧٨٩\", :arab, :latn\n \"0123456789\"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate_digits/3-example"},{"type":"module","title":"Plausible.Cldr.Rbnf.NumberSystem","doc":"Functions to implement the number system rule-based-number-format rules of CLDR.\n\nThese rules are defined only on the \"und\" locale and represent specialised\nnumber formatting.\n\nThe standard public API for RBNF is via the `Cldr.Number.to_string/2` function.\n\nThe functions on this module are defined at compile time based upon the RBNF rules\ndefined in the Unicode CLDR data repository. Available rules are identified by:\n\n iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)\n ...> |> Enum.sort()\n [\n :armenian_lower,\n :armenian_upper,\n :cyrillic_lower,\n :ethiopic,\n :georgian,\n :greek_lower,\n :greek_upper,\n :hebrew,\n :hebrew_item,\n :roman_lower,\n :roman_upper,\n :tamil,\n :zz_default\n ]\n\nA rule can then be invoked on an available rule_set. For example\n\n iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)\n \"CXXIII\"\n\nThis particular call is equivalent to the call through the public API of:\n\n iex> Plausible.Cldr.Number.to_string(123, format: :roman)\n {:ok, \"CXXIII\"}","ref":"Plausible.Cldr.Rbnf.NumberSystem.html"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.all_rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#all_rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_lower/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_lower/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_lower/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_lower/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_upper/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_upper/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_upper/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_upper/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_1_10/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_1_10/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_final/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_final/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_post/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_post/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_thousands/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_thousands/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p1/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p1/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p2/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p2/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p3/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p3/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.georgian/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#georgian/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.georgian/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#georgian/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_lower/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_lower/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_lower/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_lower/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_numeral_majuscules/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_numeral_majuscules/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_numeral_minuscules/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_numeral_minuscules/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_upper/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_upper/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_upper/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_upper/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_0_99/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_0_99/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item_hundreds/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item_hundreds/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_thousands/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_thousands/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_lower/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_lower/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_lower/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_lower/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_upper/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_upper/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_upper/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_upper/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.rule_sets/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#rule_sets/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil_thousands/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil_thousands/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.zz_default/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#zz_default/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.zz_default/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#zz_default/2"},{"type":"module","title":"Plausible.Cldr.Rbnf.Ordinal","doc":"Functions to implement the ordinal rule-based-number-format rules of CLDR.\n\nAs CLDR notes, the data is incomplete or non-existent for many languages. It\nis considered complete for English however.\n\nThe standard public API for RBNF is via the `Cldr.Number.to_string/2` function.\n\nThe functions on this module are defined at compile time based upon the RBNF rules\ndefined in the Unicode CLDR data repository. Available rules are identified by:\n\n iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)\n [:digits_ordinal]\n\n iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(\"fr\")\n ...> |> Enum.sort()\n [\n :digits_ordinal,\n :digits_ordinal_feminine,\n :digits_ordinal_feminine_plural,\n :digits_ordinal_masculine,\n :digits_ordinal_masculine_plural\n ]\n\nA rule can then be invoked on an available rule_set. For example\n\n iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)\n \"123rd\"\n\nThis call is equivalent to the call through the public API of:\n\n iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)\n {:ok, \"123rd\"}","ref":"Plausible.Cldr.Rbnf.Ordinal.html"},{"type":"function","title":"Plausible.Cldr.Rbnf.Ordinal.all_rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#all_rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.Ordinal.digits_ordinal/2","doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#digits_ordinal/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Ordinal.rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.Ordinal.rule_sets/1","doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#rule_sets/1"},{"type":"module","title":"Plausible.Cldr.Rbnf.Spellout","doc":"Functions to implement the spellout rule-based-number-format rules of CLDR.\n\nAs CLDR notes, the data is incomplete or non-existent for many languages. It\nis considered complete for English however.\n\nThe standard public API for RBNF is via the `Cldr.Number.to_string/2` function.\n\nThe functions on this module are defined at compile time based upon the RBNF rules\ndefined in the Unicode CLDR data repository. Available rules are identified by:\n\n iex> Plausible.Cldr.Rbnf.Spellout.rule_sets(\"en\")\n ...> |> Enum.sort()\n [\n :spellout_cardinal,\n :spellout_cardinal_verbose,\n :spellout_numbering,\n :spellout_numbering_verbose,\n :spellout_numbering_year,\n :spellout_ordinal,\n :spellout_ordinal_verbose\n ]\n\nA rule can then be invoked on an available rule_set. For example:\n\n iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, \"en\")\n \"one hundred twenty-third\"\n\nThis call is equivalent to the call through the public API of:\n\n iex> Plausible.Cldr.Number.to_string(123, format: :spellout)\n {:ok, \"one hundred twenty-three\"}","ref":"Plausible.Cldr.Rbnf.Spellout.html"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.all_rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#all_rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.and/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#and/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.and_o/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#and_o/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.commas/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#commas/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.commas_o/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#commas_o/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.r2d_year/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#r2d_year/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.rule_sets/1","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#rule_sets/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_cardinal/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_cardinal/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_cardinal_verbose/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_cardinal_verbose/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering_verbose/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering_verbose/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering_year/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering_year/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_ordinal/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_ordinal/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_ordinal_verbose/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_ordinal_verbose/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.th/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#th/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.tieth/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#tieth/2"},{"type":"module","title":"Plausible.ClickhouseEventV2","doc":"Event schema for when NumericIDs migration is complete","ref":"Plausible.ClickhouseEventV2.html"},{"type":"function","title":"Plausible.ClickhouseEventV2.new/1","doc":"","ref":"Plausible.ClickhouseEventV2.html#new/1"},{"type":"module","title":"Plausible.ClickhouseRepo","doc":"","ref":"Plausible.ClickhouseRepo.html"},{"type":"function","title":"Plausible.ClickhouseRepo.aggregate/3","doc":"","ref":"Plausible.ClickhouseRepo.html#aggregate/3"},{"type":"function","title":"Plausible.ClickhouseRepo.aggregate/4","doc":"","ref":"Plausible.ClickhouseRepo.html#aggregate/4"},{"type":"function","title":"Plausible.ClickhouseRepo.all/2","doc":"","ref":"Plausible.ClickhouseRepo.html#all/2"},{"type":"function","title":"Plausible.ClickhouseRepo.checked_out?/0","doc":"","ref":"Plausible.ClickhouseRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.ClickhouseRepo.checkout/2","doc":"","ref":"Plausible.ClickhouseRepo.html#checkout/2"},{"type":"function","title":"Plausible.ClickhouseRepo.child_spec/1","doc":"","ref":"Plausible.ClickhouseRepo.html#child_spec/1"},{"type":"function","title":"Plausible.ClickhouseRepo.config/0","doc":"","ref":"Plausible.ClickhouseRepo.html#config/0"},{"type":"function","title":"Plausible.ClickhouseRepo.default_options/1","doc":"","ref":"Plausible.ClickhouseRepo.html#default_options/1"},{"type":"function","title":"Plausible.ClickhouseRepo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.ClickhouseRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.ClickhouseRepo.exists?/2","doc":"","ref":"Plausible.ClickhouseRepo.html#exists?/2"},{"type":"function","title":"Plausible.ClickhouseRepo.get/3","doc":"","ref":"Plausible.ClickhouseRepo.html#get/3"},{"type":"function","title":"Plausible.ClickhouseRepo.get!/3","doc":"","ref":"Plausible.ClickhouseRepo.html#get!/3"},{"type":"function","title":"Plausible.ClickhouseRepo.get_by/3","doc":"","ref":"Plausible.ClickhouseRepo.html#get_by/3"},{"type":"function","title":"Plausible.ClickhouseRepo.get_by!/3","doc":"","ref":"Plausible.ClickhouseRepo.html#get_by!/3"},{"type":"function","title":"Plausible.ClickhouseRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.ClickhouseRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.ClickhouseRepo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.ClickhouseRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.ClickhouseRepo.load/2","doc":"","ref":"Plausible.ClickhouseRepo.html#load/2"},{"type":"function","title":"Plausible.ClickhouseRepo.one/2","doc":"","ref":"Plausible.ClickhouseRepo.html#one/2"},{"type":"function","title":"Plausible.ClickhouseRepo.one!/2","doc":"","ref":"Plausible.ClickhouseRepo.html#one!/2"},{"type":"function","title":"Plausible.ClickhouseRepo.parallel_tasks/1","doc":"","ref":"Plausible.ClickhouseRepo.html#parallel_tasks/1"},{"type":"function","title":"Plausible.ClickhouseRepo.preload/3","doc":"","ref":"Plausible.ClickhouseRepo.html#preload/3"},{"type":"function","title":"Plausible.ClickhouseRepo.prepare_query/3","doc":"","ref":"Plausible.ClickhouseRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.ClickhouseRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.ClickhouseRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.ClickhouseRepo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.ClickhouseRepo.html#query/3"},{"type":"function","title":"Plausible.ClickhouseRepo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.ClickhouseRepo.html#query!/3"},{"type":"function","title":"Plausible.ClickhouseRepo.reload/2","doc":"","ref":"Plausible.ClickhouseRepo.html#reload/2"},{"type":"function","title":"Plausible.ClickhouseRepo.reload!/2","doc":"","ref":"Plausible.ClickhouseRepo.html#reload!/2"},{"type":"function","title":"Plausible.ClickhouseRepo.start_link/1","doc":"","ref":"Plausible.ClickhouseRepo.html#start_link/1"},{"type":"function","title":"Plausible.ClickhouseRepo.stop/1","doc":"","ref":"Plausible.ClickhouseRepo.html#stop/1"},{"type":"function","title":"Plausible.ClickhouseRepo.stream/2","doc":"","ref":"Plausible.ClickhouseRepo.html#stream/2"},{"type":"function","title":"Plausible.ClickhouseRepo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.ClickhouseRepo.html#to_sql/2"},{"type":"module","title":"Plausible.ClickhouseSessionV2","doc":"Session schema for when NumericIDs migration is complete","ref":"Plausible.ClickhouseSessionV2.html"},{"type":"function","title":"Plausible.ClickhouseSessionV2.random_uint64/0","doc":"","ref":"Plausible.ClickhouseSessionV2.html#random_uint64/0"},{"type":"module","title":"Plausible.ClickhouseSessionV2.BoolUInt8","doc":"Custom type to cast Bool as UInt8","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html"},{"type":"function","title":"Plausible.ClickhouseSessionV2.BoolUInt8.embed_as/1","doc":"","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html#embed_as/1"},{"type":"function","title":"Plausible.ClickhouseSessionV2.BoolUInt8.equal?/2","doc":"","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html#equal?/2"},{"type":"module","title":"Plausible.ConfigHelpers","doc":"","ref":"Plausible.ConfigHelpers.html"},{"type":"function","title":"Plausible.ConfigHelpers.get_int_from_path_or_env/3","doc":"","ref":"Plausible.ConfigHelpers.html#get_int_from_path_or_env/3"},{"type":"function","title":"Plausible.ConfigHelpers.get_var_from_path_or_env/3","doc":"","ref":"Plausible.ConfigHelpers.html#get_var_from_path_or_env/3"},{"type":"module","title":"Plausible.DataCase","doc":"This module defines the setup for tests requiring\naccess to the application's data layer.\n\nYou may define functions here to be used as helpers in\nyour tests.\n\nFinally, if the test case interacts with the database,\nit cannot be async. For this reason, every test runs\ninside a transaction which is reset at the beginning\nof the test unless the test case is marked as async.","ref":"Plausible.DataCase.html"},{"type":"module","title":"Plausible.DataMigration","doc":"Base module for coordinated Clickhouse data migrations\nrun via remote shell or otherwise (TBD).","ref":"Plausible.DataMigration.html"},{"type":"module","title":"Plausible.DataMigration.NumericIDs","doc":"Numeric IDs migration, SQL files available at:\npriv/data_migrations/NumericIDs/sql","ref":"Plausible.DataMigration.NumericIDs.html"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.confirm/3","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run/1","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run/1"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run_sql/2","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql/2"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run_sql_confirm/2","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql_confirm/2"},{"type":"module","title":"Plausible.DataMigration.Repo","doc":"Ecto.Repo for Clickhouse data migrations, to be started manually,\noutside of the main application supervision tree.","ref":"Plausible.DataMigration.Repo.html"},{"type":"function","title":"Plausible.DataMigration.Repo.aggregate/3","doc":"","ref":"Plausible.DataMigration.Repo.html#aggregate/3"},{"type":"function","title":"Plausible.DataMigration.Repo.aggregate/4","doc":"","ref":"Plausible.DataMigration.Repo.html#aggregate/4"},{"type":"function","title":"Plausible.DataMigration.Repo.all/2","doc":"","ref":"Plausible.DataMigration.Repo.html#all/2"},{"type":"function","title":"Plausible.DataMigration.Repo.checked_out?/0","doc":"","ref":"Plausible.DataMigration.Repo.html#checked_out?/0"},{"type":"function","title":"Plausible.DataMigration.Repo.checkout/2","doc":"","ref":"Plausible.DataMigration.Repo.html#checkout/2"},{"type":"function","title":"Plausible.DataMigration.Repo.child_spec/1","doc":"","ref":"Plausible.DataMigration.Repo.html#child_spec/1"},{"type":"function","title":"Plausible.DataMigration.Repo.config/0","doc":"","ref":"Plausible.DataMigration.Repo.html#config/0"},{"type":"function","title":"Plausible.DataMigration.Repo.default_options/1","doc":"","ref":"Plausible.DataMigration.Repo.html#default_options/1"},{"type":"function","title":"Plausible.DataMigration.Repo.delete/2","doc":"","ref":"Plausible.DataMigration.Repo.html#delete/2"},{"type":"function","title":"Plausible.DataMigration.Repo.delete!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#delete!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.delete_all/2","doc":"","ref":"Plausible.DataMigration.Repo.html#delete_all/2"},{"type":"function","title":"Plausible.DataMigration.Repo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.DataMigration.Repo.html#disconnect_all/2"},{"type":"function","title":"Plausible.DataMigration.Repo.exists?/2","doc":"","ref":"Plausible.DataMigration.Repo.html#exists?/2"},{"type":"function","title":"Plausible.DataMigration.Repo.get/3","doc":"","ref":"Plausible.DataMigration.Repo.html#get/3"},{"type":"function","title":"Plausible.DataMigration.Repo.get!/3","doc":"","ref":"Plausible.DataMigration.Repo.html#get!/3"},{"type":"function","title":"Plausible.DataMigration.Repo.get_by/3","doc":"","ref":"Plausible.DataMigration.Repo.html#get_by/3"},{"type":"function","title":"Plausible.DataMigration.Repo.get_by!/3","doc":"","ref":"Plausible.DataMigration.Repo.html#get_by!/3"},{"type":"function","title":"Plausible.DataMigration.Repo.get_dynamic_repo/0","doc":"","ref":"Plausible.DataMigration.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.DataMigration.Repo.insert/2","doc":"","ref":"Plausible.DataMigration.Repo.html#insert/2"},{"type":"function","title":"Plausible.DataMigration.Repo.insert!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#insert!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.insert_all/3","doc":"","ref":"Plausible.DataMigration.Repo.html#insert_all/3"},{"type":"function","title":"Plausible.DataMigration.Repo.insert_or_update/2","doc":"","ref":"Plausible.DataMigration.Repo.html#insert_or_update/2"},{"type":"function","title":"Plausible.DataMigration.Repo.insert_or_update!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.DataMigration.Repo.html#insert_stream/3"},{"type":"function","title":"Plausible.DataMigration.Repo.load/2","doc":"","ref":"Plausible.DataMigration.Repo.html#load/2"},{"type":"function","title":"Plausible.DataMigration.Repo.one/2","doc":"","ref":"Plausible.DataMigration.Repo.html#one/2"},{"type":"function","title":"Plausible.DataMigration.Repo.one!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#one!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.preload/3","doc":"","ref":"Plausible.DataMigration.Repo.html#preload/3"},{"type":"function","title":"Plausible.DataMigration.Repo.prepare_query/3","doc":"","ref":"Plausible.DataMigration.Repo.html#prepare_query/3"},{"type":"function","title":"Plausible.DataMigration.Repo.put_dynamic_repo/1","doc":"","ref":"Plausible.DataMigration.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.DataMigration.Repo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.DataMigration.Repo.html#query/3"},{"type":"function","title":"Plausible.DataMigration.Repo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.DataMigration.Repo.html#query!/3"},{"type":"function","title":"Plausible.DataMigration.Repo.reload/2","doc":"","ref":"Plausible.DataMigration.Repo.html#reload/2"},{"type":"function","title":"Plausible.DataMigration.Repo.reload!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#reload!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.start/2","doc":"","ref":"Plausible.DataMigration.Repo.html#start/2"},{"type":"function","title":"Plausible.DataMigration.Repo.start_link/1","doc":"","ref":"Plausible.DataMigration.Repo.html#start_link/1"},{"type":"function","title":"Plausible.DataMigration.Repo.stop/1","doc":"","ref":"Plausible.DataMigration.Repo.html#stop/1"},{"type":"function","title":"Plausible.DataMigration.Repo.stream/2","doc":"","ref":"Plausible.DataMigration.Repo.html#stream/2"},{"type":"function","title":"Plausible.DataMigration.Repo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.DataMigration.Repo.html#to_sql/2"},{"type":"function","title":"Plausible.DataMigration.Repo.update/2","doc":"","ref":"Plausible.DataMigration.Repo.html#update/2"},{"type":"function","title":"Plausible.DataMigration.Repo.update!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#update!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.update_all/3","doc":"","ref":"Plausible.DataMigration.Repo.html#update_all/3"},{"type":"module","title":"Plausible.DebugReplayInfo","doc":"Function execution context (with arguments) to Sentry reports.","ref":"Plausible.DebugReplayInfo.html"},{"type":"function","title":"Plausible.DebugReplayInfo.deserialize/1","doc":"","ref":"Plausible.DebugReplayInfo.html#deserialize/1"},{"type":"macro","title":"Plausible.DebugReplayInfo.include_sentry_replay_info/0","doc":"","ref":"Plausible.DebugReplayInfo.html#include_sentry_replay_info/0"},{"type":"module","title":"Plausible.Ecto.EventName","doc":"Custom type for event name. Accepts Strings and Integers and stores them as String. Returns\n cast error if any other type is provided. Accepting integers is important for 404 tracking.","ref":"Plausible.Ecto.EventName.html"},{"type":"function","title":"Plausible.Ecto.EventName.cast/1","doc":"","ref":"Plausible.Ecto.EventName.html#cast/1"},{"type":"function","title":"Plausible.Ecto.EventName.dump/1","doc":"","ref":"Plausible.Ecto.EventName.html#dump/1"},{"type":"function","title":"Plausible.Ecto.EventName.embed_as/1","doc":"","ref":"Plausible.Ecto.EventName.html#embed_as/1"},{"type":"function","title":"Plausible.Ecto.EventName.equal?/2","doc":"","ref":"Plausible.Ecto.EventName.html#equal?/2"},{"type":"function","title":"Plausible.Ecto.EventName.load/1","doc":"","ref":"Plausible.Ecto.EventName.html#load/1"},{"type":"function","title":"Plausible.Ecto.EventName.type/0","doc":"","ref":"Plausible.Ecto.EventName.html#type/0"},{"type":"module","title":"Plausible.Factory","doc":"","ref":"Plausible.Factory.html"},{"type":"function","title":"Plausible.Factory.api_key_factory/0","doc":"","ref":"Plausible.Factory.html#api_key_factory/0"},{"type":"function","title":"Plausible.Factory.build/2","doc":"","ref":"Plausible.Factory.html#build/2"},{"type":"function","title":"Plausible.Factory.build_list/3","doc":"","ref":"Plausible.Factory.html#build_list/3"},{"type":"function","title":"Plausible.Factory.build_pair/2","doc":"","ref":"Plausible.Factory.html#build_pair/2"},{"type":"function","title":"Plausible.Factory.business_subscription_factory/0","doc":"","ref":"Plausible.Factory.html#business_subscription_factory/0"},{"type":"function","title":"Plausible.Factory.ch_session_factory/0","doc":"","ref":"Plausible.Factory.html#ch_session_factory/0"},{"type":"function","title":"Plausible.Factory.create/1","doc":"","ref":"Plausible.Factory.html#create/1"},{"type":"function","title":"Plausible.Factory.create/2","doc":"","ref":"Plausible.Factory.html#create/2"},{"type":"function","title":"Plausible.Factory.create_list/3","doc":"","ref":"Plausible.Factory.html#create_list/3"},{"type":"function","title":"Plausible.Factory.create_pair/2","doc":"","ref":"Plausible.Factory.html#create_pair/2"},{"type":"function","title":"Plausible.Factory.enterprise_plan_factory/0","doc":"","ref":"Plausible.Factory.html#enterprise_plan_factory/0"},{"type":"function","title":"Plausible.Factory.event_factory/0","doc":"","ref":"Plausible.Factory.html#event_factory/0"},{"type":"function","title":"Plausible.Factory.factory/1","doc":"Raises a helpful error if no factory is defined.","ref":"Plausible.Factory.html#factory/1"},{"type":"function","title":"Plausible.Factory.goal_factory/0","doc":"","ref":"Plausible.Factory.html#goal_factory/0"},{"type":"function","title":"Plausible.Factory.google_auth_factory/0","doc":"","ref":"Plausible.Factory.html#google_auth_factory/0"},{"type":"function","title":"Plausible.Factory.growth_subscription_factory/0","doc":"","ref":"Plausible.Factory.html#growth_subscription_factory/0"},{"type":"function","title":"Plausible.Factory.imported_browsers_factory/0","doc":"","ref":"Plausible.Factory.html#imported_browsers_factory/0"},{"type":"function","title":"Plausible.Factory.imported_devices_factory/0","doc":"","ref":"Plausible.Factory.html#imported_devices_factory/0"},{"type":"function","title":"Plausible.Factory.imported_entry_pages_factory/0","doc":"","ref":"Plausible.Factory.html#imported_entry_pages_factory/0"},{"type":"function","title":"Plausible.Factory.imported_exit_pages_factory/0","doc":"","ref":"Plausible.Factory.html#imported_exit_pages_factory/0"},{"type":"function","title":"Plausible.Factory.imported_locations_factory/0","doc":"","ref":"Plausible.Factory.html#imported_locations_factory/0"},{"type":"function","title":"Plausible.Factory.imported_operating_systems_factory/0","doc":"","ref":"Plausible.Factory.html#imported_operating_systems_factory/0"},{"type":"function","title":"Plausible.Factory.imported_pages_factory/0","doc":"","ref":"Plausible.Factory.html#imported_pages_factory/0"},{"type":"function","title":"Plausible.Factory.imported_sources_factory/0","doc":"","ref":"Plausible.Factory.html#imported_sources_factory/0"},{"type":"function","title":"Plausible.Factory.imported_visitors_factory/0","doc":"","ref":"Plausible.Factory.html#imported_visitors_factory/0"},{"type":"function","title":"Plausible.Factory.insert/1","doc":"","ref":"Plausible.Factory.html#insert/1"},{"type":"function","title":"Plausible.Factory.insert/2","doc":"","ref":"Plausible.Factory.html#insert/2"},{"type":"function","title":"Plausible.Factory.insert/3","doc":"","ref":"Plausible.Factory.html#insert/3"},{"type":"function","title":"Plausible.Factory.insert_list/3","doc":"","ref":"Plausible.Factory.html#insert_list/3"},{"type":"function","title":"Plausible.Factory.insert_list/4","doc":"","ref":"Plausible.Factory.html#insert_list/4"},{"type":"function","title":"Plausible.Factory.insert_pair/2","doc":"","ref":"Plausible.Factory.html#insert_pair/2"},{"type":"function","title":"Plausible.Factory.insert_pair/3","doc":"","ref":"Plausible.Factory.html#insert_pair/3"},{"type":"function","title":"Plausible.Factory.invitation_factory/0","doc":"","ref":"Plausible.Factory.html#invitation_factory/0"},{"type":"function","title":"Plausible.Factory.monthly_report_factory/0","doc":"","ref":"Plausible.Factory.html#monthly_report_factory/0"},{"type":"function","title":"Plausible.Factory.pageview_factory/0","doc":"","ref":"Plausible.Factory.html#pageview_factory/0"},{"type":"function","title":"Plausible.Factory.params_for/2","doc":"","ref":"Plausible.Factory.html#params_for/2"},{"type":"function","title":"Plausible.Factory.params_with_assocs/2","doc":"","ref":"Plausible.Factory.html#params_with_assocs/2"},{"type":"function","title":"Plausible.Factory.shared_link_factory/0","doc":"","ref":"Plausible.Factory.html#shared_link_factory/0"},{"type":"function","title":"Plausible.Factory.site_factory/1","doc":"","ref":"Plausible.Factory.html#site_factory/1"},{"type":"function","title":"Plausible.Factory.site_membership_factory/0","doc":"","ref":"Plausible.Factory.html#site_membership_factory/0"},{"type":"function","title":"Plausible.Factory.spike_notification_factory/0","doc":"","ref":"Plausible.Factory.html#spike_notification_factory/0"},{"type":"function","title":"Plausible.Factory.string_params_for/2","doc":"","ref":"Plausible.Factory.html#string_params_for/2"},{"type":"function","title":"Plausible.Factory.string_params_with_assocs/2","doc":"","ref":"Plausible.Factory.html#string_params_with_assocs/2"},{"type":"function","title":"Plausible.Factory.subscription_factory/0","doc":"","ref":"Plausible.Factory.html#subscription_factory/0"},{"type":"function","title":"Plausible.Factory.user_factory/1","doc":"","ref":"Plausible.Factory.html#user_factory/1"},{"type":"function","title":"Plausible.Factory.weekly_report_factory/0","doc":"","ref":"Plausible.Factory.html#weekly_report_factory/0"},{"type":"module","title":"Plausible.Funnel","doc":"A funnel is a marketing term used to capture and describe the journey\nthat users go through, from initial step to conversion.\nA funnel consists of several steps (here: 2..8).\n\nThis module defines the database schema for storing funnels\nand changeset helpers for enumerating the steps within.\n\nEach step references a goal (either a Custom Event or Visit)\n- see: `Plausible.Goal`.","ref":"Plausible.Funnel.html"},{"type":"function","title":"Plausible.Funnel.changeset/2","doc":"","ref":"Plausible.Funnel.html#changeset/2"},{"type":"macro","title":"Plausible.Funnel.max_steps/0","doc":"","ref":"Plausible.Funnel.html#max_steps/0"},{"type":"macro","title":"Plausible.Funnel.min_steps/0","doc":"","ref":"Plausible.Funnel.html#min_steps/0"},{"type":"function","title":"Plausible.Funnel.put_step_orders/1","doc":"","ref":"Plausible.Funnel.html#put_step_orders/1"},{"type":"type","title":"Plausible.Funnel.t/0","doc":"","ref":"Plausible.Funnel.html#t:t/0"},{"type":"module","title":"Plausible.Funnel.Const","doc":"Compile-time convience constants for funnel characteristics.","ref":"Plausible.Funnel.Const.html"},{"type":"macro","title":"Plausible.Funnel.Const.max_steps/0","doc":"","ref":"Plausible.Funnel.Const.html#max_steps/0"},{"type":"macro","title":"Plausible.Funnel.Const.min_steps/0","doc":"","ref":"Plausible.Funnel.Const.html#min_steps/0"},{"type":"module","title":"Plausible.Funnel.Step","doc":"This module defines the database schema for a single Funnel step.\nSee: `Plausible.Funnel` for more information.","ref":"Plausible.Funnel.Step.html"},{"type":"function","title":"Plausible.Funnel.Step.changeset/2","doc":"","ref":"Plausible.Funnel.Step.html#changeset/2"},{"type":"type","title":"Plausible.Funnel.Step.t/0","doc":"","ref":"Plausible.Funnel.Step.html#t:t/0"},{"type":"module","title":"Plausible.Funnels","doc":"This module implements contextual Funnel interface, allowing listing,\ncreating and deleting funnel definitions.\n\nFor brief explanation of what a Funnel is, please see `Plausible.Funnel` schema.\nSee `Plausible.Stats.Funnel` for the evaluation logic.","ref":"Plausible.Funnels.html"},{"type":"function","title":"Plausible.Funnels.create/3","doc":"","ref":"Plausible.Funnels.html#create/3"},{"type":"function","title":"Plausible.Funnels.create_changeset/3","doc":"","ref":"Plausible.Funnels.html#create_changeset/3"},{"type":"function","title":"Plausible.Funnels.delete/2","doc":"","ref":"Plausible.Funnels.html#delete/2"},{"type":"function","title":"Plausible.Funnels.ephemeral_definition/3","doc":"","ref":"Plausible.Funnels.html#ephemeral_definition/3"},{"type":"function","title":"Plausible.Funnels.get/2","doc":"","ref":"Plausible.Funnels.html#get/2"},{"type":"function","title":"Plausible.Funnels.list/1","doc":"","ref":"Plausible.Funnels.html#list/1"},{"type":"module","title":"Plausible.Geo","doc":"This module provides an API for fetching IP geolocation.","ref":"Plausible.Geo.html"},{"type":"function","title":"Plausible.Geo.await_loader/0","doc":"Waits for the database to start after calling `load_db/1` with the async option.","ref":"Plausible.Geo.html#await_loader/0"},{"type":"function","title":"Plausible.Geo.database_type/0","doc":"Returns geodatabase type.\n\nUsed for deciding whether to show the DB-IP disclaimer or not.","ref":"Plausible.Geo.html#database_type/0"},{"type":"function","title":"Examples - Plausible.Geo.database_type/0","doc":"In the case of a DB-IP database:\n\n iex> database_type()\n \"DBIP-City-Lite\"\n\n In the case of a MaxMind database:\n\n iex> database_type()\n \"GeoLite2-City\"","ref":"Plausible.Geo.html#database_type/0-examples"},{"type":"function","title":"Plausible.Geo.load_db/1","doc":"Starts the geodatabase loading process. Two modes are supported: local file\nand MaxMind license key.","ref":"Plausible.Geo.html#load_db/1"},{"type":"function","title":"Options - Plausible.Geo.load_db/1","doc":"* `:path` - the path to the .mmdb database local file. When present,\n `:license_key` and `:edition` are not required.\n\n * `:license_key` - the [license key](https://support.maxmind.com/hc/en-us/articles/4407111582235-Generate-a-License-Key)\n from MaxMind to authenticate requests to MaxMind.\n\n * `:edition` - the name of the MaxMind database to be downloaded from MaxMind\n servers. Defaults to `GeoLite2-City`.\n\n * `:async` - when used, configures the database loading to run\n asynchronously.","ref":"Plausible.Geo.html#load_db/1-options"},{"type":"function","title":"Examples - Plausible.Geo.load_db/1","doc":"Loading from a local file:\n\n iex> load_db(path: \"/etc/plausible/dbip-city.mmdb\")\n :ok\n\n Downloading a MaxMind DB (this license key is no longer active):\n\n iex> load_db(license_key: \"LNpsJCCKPis6XvBP\", edition: \"GeoLite2-City\", async: true)\n :ok","ref":"Plausible.Geo.html#load_db/1-examples"},{"type":"function","title":"Plausible.Geo.lookup/1","doc":"Looks up geo info about an IP address.","ref":"Plausible.Geo.html#lookup/1"},{"type":"function","title":"Examples - Plausible.Geo.lookup/1","doc":"iex> lookup(\"8.7.6.5\")\n %{\n \"city\" => %{\n \"geoname_id\" => 5349755,\n \"names\" => %{\n \"de\" => \"Fontana\",\n \"en\" => \"Fontana\",\n \"ja\" => \"フォンタナ\",\n \"ru\" => \"Фонтана\"\n }\n },\n \"continent\" => %{\n \"code\" => \"NA\",\n \"geoname_id\" => 6255149,\n \"names\" => %{\n \"de\" => \"Nordamerika\",\n \"en\" => \"North America\",\n \"es\" => \"Norteamérica\",\n \"fr\" => \"Amérique du Nord\",\n \"ja\" => \"北アメリカ\",\n \"pt-BR\" => \"América do Norte\",\n \"ru\" => \"Северная Америка\",\n \"zh-CN\" => \"北美洲\"\n }\n },\n \"country\" => %{\n \"geoname_id\" => 6252001,\n \"iso_code\" => \"US\",\n \"names\" => %{\n \"de\" => \"Vereinigte Staaten\",\n \"en\" => \"United States\",\n \"es\" => \"Estados Unidos\",\n \"fr\" => \"États Unis\",\n \"ja\" => \"アメリカ\",\n \"pt-BR\" => \"EUA\",\n \"ru\" => \"США\",\n \"zh-CN\" => \"美国\"\n }\n },\n \"location\" => %{\n \"accuracy_radius\" => 50,\n \"latitude\" => 34.1211,\n \"longitude\" => -117.4362,\n \"metro_code\" => 803,\n \"time_zone\" => \"America/Los_Angeles\"\n },\n \"postal\" => %{\"code\" => \"92336\"},\n \"registered_country\" => %{\n \"geoname_id\" => 6252001,\n \"iso_code\" => \"US\",\n \"names\" => %{\n \"de\" => \"Vereinigte Staaten\",\n \"en\" => \"United States\",\n \"es\" => \"Estados Unidos\",\n \"fr\" => \"États Unis\",\n \"ja\" => \"アメリカ\",\n \"pt-BR\" => \"EUA\",\n \"ru\" => \"США\",\n \"zh-CN\" => \"美国\"\n }\n },\n \"subdivisions\" => [\n %{\n \"geoname_id\" => 5332921,\n \"iso_code\" => \"CA\",\n \"names\" => %{\n \"de\" => \"Kalifornien\",\n \"en\" => \"California\",\n \"es\" => \"California\",\n \"fr\" => \"Californie\",\n \"ja\" => \"カリフォルニア州\",\n \"pt-BR\" => \"Califórnia\",\n \"ru\" => \"Калифорния\",\n \"zh-CN\" => \"加州\"\n }\n }\n ]\n }","ref":"Plausible.Geo.html#lookup/1-examples"},{"type":"module","title":"Plausible.Goal","doc":"","ref":"Plausible.Goal.html"},{"type":"function","title":"Plausible.Goal.changeset/2","doc":"","ref":"Plausible.Goal.html#changeset/2"},{"type":"type","title":"Plausible.Goal.t/0","doc":"","ref":"Plausible.Goal.html#t:t/0"},{"type":"module","title":"Plausible.Goal.Revenue","doc":"Currency specific functions for revenue goals","ref":"Plausible.Goal.Revenue.html"},{"type":"function","title":"Plausible.Goal.Revenue.currency_options/0","doc":"","ref":"Plausible.Goal.Revenue.html#currency_options/0"},{"type":"function","title":"Plausible.Goal.Revenue.revenue?/1","doc":"","ref":"Plausible.Goal.Revenue.html#revenue?/1"},{"type":"function","title":"Plausible.Goal.Revenue.valid_currencies/0","doc":"","ref":"Plausible.Goal.Revenue.html#valid_currencies/0"},{"type":"module","title":"Plausible.Goals","doc":"","ref":"Plausible.Goals.html"},{"type":"function","title":"Plausible.Goals.count/1","doc":"","ref":"Plausible.Goals.html#count/1"},{"type":"function","title":"Plausible.Goals.create/3","doc":"Creates a Goal for a site.\n\nIf the created goal is a revenue goal, it sets site.updated_at to be\nrefreshed by the sites cache, as revenue goals are used during ingestion.","ref":"Plausible.Goals.html#create/3"},{"type":"function","title":"Plausible.Goals.delete/2","doc":"If a goal belongs to funnel(s), we need to inspect their number of steps.\n\nIf it exceeds the minimum allowed (defined via `Plausible.Funnel.min_steps/0`),\nthe funnel will be reduced (i.e. a step associated with the goal to be deleted\nis removed), so that the minimum number of steps is preserved. This is done\nimplicitly, by postgres, as per on_delete: :delete_all.\n\nOtherwise, for associated funnel(s) consisting of minimum number steps only,\nfunnel record(s) are removed completely along with the targeted goal.","ref":"Plausible.Goals.html#delete/2"},{"type":"function","title":"Plausible.Goals.find_or_create/2","doc":"","ref":"Plausible.Goals.html#find_or_create/2"},{"type":"function","title":"Plausible.Goals.for_site/2","doc":"","ref":"Plausible.Goals.html#for_site/2"},{"type":"function","title":"Plausible.Goals.for_site_query/2","doc":"","ref":"Plausible.Goals.html#for_site_query/2"},{"type":"module","title":"Plausible.Google.Api","doc":"","ref":"Plausible.Google.Api.html"},{"type":"function","title":"Plausible.Google.Api.fetch_and_persist/3","doc":"","ref":"Plausible.Google.Api.html#fetch_and_persist/3"},{"type":"function","title":"Plausible.Google.Api.fetch_stats/3","doc":"","ref":"Plausible.Google.Api.html#fetch_stats/3"},{"type":"function","title":"Plausible.Google.Api.fetch_verified_properties/1","doc":"","ref":"Plausible.Google.Api.html#fetch_verified_properties/1"},{"type":"function","title":"Plausible.Google.Api.get_view/2","doc":"Returns a single Google Analytics view if the user has access to it.","ref":"Plausible.Google.Api.html#get_view/2"},{"type":"function","title":"Plausible.Google.Api.import_analytics/4","doc":"Imports stats from a Google Analytics UA view to a Plausible site.\n\nThis function fetches Google Analytics reports in batches of 7500 per\nrequest. The batches are then buffered to Clickhouse by the\n`Plausible.Google.Buffer` process.\n\nRequests to Google Analytics can fail, and are retried at most\n5 times with an exponential backoff. Returns `:ok` when\nimporting has finished or `{:error, term()}` when a request to GA failed too \nmany times.\n\nUseful links:\n\n- [Feature documentation](https://plausible.io/docs/google-analytics-import)\n- [GA API reference](https://developers.google.com/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet#ReportRequest)\n- [GA Dimensions reference](https://ga-dev-tools.web.app/dimensions-metrics-explorer)","ref":"Plausible.Google.Api.html#import_analytics/4"},{"type":"function","title":"Plausible.Google.Api.import_authorize_url/2","doc":"","ref":"Plausible.Google.Api.html#import_authorize_url/2"},{"type":"function","title":"Plausible.Google.Api.list_views/1","doc":"Lists Google Analytics views grouped by hostname.","ref":"Plausible.Google.Api.html#list_views/1"},{"type":"function","title":"Plausible.Google.Api.search_console_authorize_url/2","doc":"","ref":"Plausible.Google.Api.html#search_console_authorize_url/2"},{"type":"type","title":"Plausible.Google.Api.google_analytics_view/0","doc":"","ref":"Plausible.Google.Api.html#t:google_analytics_view/0"},{"type":"type","title":"Plausible.Google.Api.import_auth/0","doc":"","ref":"Plausible.Google.Api.html#t:import_auth/0"},{"type":"module","title":"Plausible.Google.Api.Mock","doc":"","ref":"Plausible.Google.Api.Mock.html"},{"type":"function","title":"Plausible.Google.Api.Mock.fetch_stats/3","doc":"","ref":"Plausible.Google.Api.Mock.html#fetch_stats/3"},{"type":"module","title":"Plausible.Google.Buffer","doc":"This GenServer inserts records into Clickhouse `imported_*` tables. Multiple buffers are\nautomatically created for each table. Records are flushed when the table buffer reaches the\nmaximum size, defined by `max_buffer_size/0`.","ref":"Plausible.Google.Buffer.html"},{"type":"function","title":"Plausible.Google.Buffer.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Google.Buffer.html#child_spec/1"},{"type":"function","title":"Plausible.Google.Buffer.flush/2","doc":"Flushes all table buffers to Clickhouse.","ref":"Plausible.Google.Buffer.html#flush/2"},{"type":"function","title":"Plausible.Google.Buffer.handle_continue/2","doc":"","ref":"Plausible.Google.Buffer.html#handle_continue/2"},{"type":"function","title":"Plausible.Google.Buffer.init/1","doc":"","ref":"Plausible.Google.Buffer.html#init/1"},{"type":"function","title":"Plausible.Google.Buffer.insert_many/3","doc":"Puts the given records into the table buffer.","ref":"Plausible.Google.Buffer.html#insert_many/3"},{"type":"function","title":"Plausible.Google.Buffer.size/2","doc":"Returns the total count of items in the given table buffer.","ref":"Plausible.Google.Buffer.html#size/2"},{"type":"function","title":"Plausible.Google.Buffer.start_link/0","doc":"","ref":"Plausible.Google.Buffer.html#start_link/0"},{"type":"function","title":"Plausible.Google.Buffer.stop/1","doc":"","ref":"Plausible.Google.Buffer.html#stop/1"},{"type":"module","title":"Plausible.Google.HTTP","doc":"","ref":"Plausible.Google.HTTP.html"},{"type":"function","title":"Plausible.Google.HTTP.fetch_access_token/1","doc":"","ref":"Plausible.Google.HTTP.html#fetch_access_token/1"},{"type":"function","title":"Plausible.Google.HTTP.get_analytics_start_date/2","doc":"","ref":"Plausible.Google.HTTP.html#get_analytics_start_date/2"},{"type":"function","title":"Plausible.Google.HTTP.get_report/1","doc":"","ref":"Plausible.Google.HTTP.html#get_report/1"},{"type":"function","title":"Plausible.Google.HTTP.list_sites/1","doc":"","ref":"Plausible.Google.HTTP.html#list_sites/1"},{"type":"function","title":"Plausible.Google.HTTP.list_stats/5","doc":"","ref":"Plausible.Google.HTTP.html#list_stats/5"},{"type":"function","title":"Plausible.Google.HTTP.list_views_for_user/1","doc":"","ref":"Plausible.Google.HTTP.html#list_views_for_user/1"},{"type":"function","title":"Plausible.Google.HTTP.refresh_auth_token/1","doc":"","ref":"Plausible.Google.HTTP.html#refresh_auth_token/1"},{"type":"module","title":"Plausible.Google.ReportRequest","doc":"","ref":"Plausible.Google.ReportRequest.html"},{"type":"function","title":"Plausible.Google.ReportRequest.full_report/0","doc":"","ref":"Plausible.Google.ReportRequest.html#full_report/0"},{"type":"type","title":"Plausible.Google.ReportRequest.t/0","doc":"","ref":"Plausible.Google.ReportRequest.html#t:t/0"},{"type":"module","title":"Plausible.HTTPClient","doc":"HTTP Client built on top of Finch.\n\nBy default, request parameters are json-encoded.\n\nIf a raw binary value is supplied, no encoding is performed.\nIf x-www-form-urlencoded content-type is set in headers,\nURL encoding is invoked.","ref":"Plausible.HTTPClient.html"},{"type":"function","title":"Plausible.HTTPClient.get/3","doc":"Make a GET request","ref":"Plausible.HTTPClient.html#get/3"},{"type":"function","title":"Plausible.HTTPClient.impl/0","doc":"","ref":"Plausible.HTTPClient.html#impl/0"},{"type":"function","title":"Plausible.HTTPClient.post/4","doc":"Make a POST request","ref":"Plausible.HTTPClient.html#post/4"},{"type":"behaviour","title":"Plausible.HTTPClient.Interface","doc":"","ref":"Plausible.HTTPClient.Interface.html"},{"type":"callback","title":"Plausible.HTTPClient.Interface.get/1","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/1"},{"type":"callback","title":"Plausible.HTTPClient.Interface.get/2","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/2"},{"type":"callback","title":"Plausible.HTTPClient.Interface.get/3","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/3"},{"type":"callback","title":"Plausible.HTTPClient.Interface.post/3","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:post/3"},{"type":"callback","title":"Plausible.HTTPClient.Interface.post/4","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:post/4"},{"type":"type","title":"Plausible.HTTPClient.Interface.finch_request_opts/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:finch_request_opts/0"},{"type":"type","title":"Plausible.HTTPClient.Interface.headers/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:headers/0"},{"type":"type","title":"Plausible.HTTPClient.Interface.params/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:params/0"},{"type":"type","title":"Plausible.HTTPClient.Interface.response/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:response/0"},{"type":"type","title":"Plausible.HTTPClient.Interface.url/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:url/0"},{"type":"module","title":"Plausible.HTTPClient.Non200Error","doc":"","ref":"Plausible.HTTPClient.Non200Error.html"},{"type":"function","title":"Plausible.HTTPClient.Non200Error.new/1","doc":"","ref":"Plausible.HTTPClient.Non200Error.html#new/1"},{"type":"type","title":"Plausible.HTTPClient.Non200Error.t/0","doc":"","ref":"Plausible.HTTPClient.Non200Error.html#t:t/0"},{"type":"module","title":"Plausible.Helpers.JSON","doc":"Common helpers for JSON handling","ref":"Plausible.Helpers.JSON.html"},{"type":"function","title":"Plausible.Helpers.JSON.decode_or_fallback/1","doc":"","ref":"Plausible.Helpers.JSON.html#decode_or_fallback/1"},{"type":"module","title":"Plausible.ImportDeletionRepo","doc":"A dedicated repo for import related mutations","ref":"Plausible.ImportDeletionRepo.html"},{"type":"function","title":"Plausible.ImportDeletionRepo.aggregate/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#aggregate/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.aggregate/4","doc":"","ref":"Plausible.ImportDeletionRepo.html#aggregate/4"},{"type":"function","title":"Plausible.ImportDeletionRepo.all/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#all/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.checked_out?/0","doc":"","ref":"Plausible.ImportDeletionRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.ImportDeletionRepo.checkout/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#checkout/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.child_spec/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#child_spec/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.config/0","doc":"","ref":"Plausible.ImportDeletionRepo.html#config/0"},{"type":"function","title":"Plausible.ImportDeletionRepo.default_options/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#default_options/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.delete/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#delete/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.delete!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#delete!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.delete_all/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#delete_all/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.ImportDeletionRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.exists?/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#exists?/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.get/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#get/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.get!/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#get!/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.get_by/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#get_by/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.get_by!/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#get_by!/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.ImportDeletionRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert_all/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert_all/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert_or_update/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert_or_update!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.ImportDeletionRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.load/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#load/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.one/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#one/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.one!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#one!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.preload/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#preload/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.prepare_query/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.ImportDeletionRepo.html#query/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.ImportDeletionRepo.html#query!/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.reload/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#reload/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.reload!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#reload!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.start_link/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#start_link/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.stop/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#stop/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.stream/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#stream/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.ImportDeletionRepo.html#to_sql/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.update/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#update/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.update!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#update!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.update_all/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#update_all/3"},{"type":"module","title":"Plausible.Imported","doc":"","ref":"Plausible.Imported.html"},{"type":"function","title":"Plausible.Imported.forget/1","doc":"","ref":"Plausible.Imported.html#forget/1"},{"type":"function","title":"Plausible.Imported.from_google_analytics/3","doc":"","ref":"Plausible.Imported.html#from_google_analytics/3"},{"type":"function","title":"Plausible.Imported.tables/0","doc":"","ref":"Plausible.Imported.html#tables/0"},{"type":"module","title":"Plausible.IngestRepo","doc":"Write-centric Clickhouse access interface","ref":"Plausible.IngestRepo.html"},{"type":"function","title":"Plausible.IngestRepo.aggregate/3","doc":"","ref":"Plausible.IngestRepo.html#aggregate/3"},{"type":"function","title":"Plausible.IngestRepo.aggregate/4","doc":"","ref":"Plausible.IngestRepo.html#aggregate/4"},{"type":"function","title":"Plausible.IngestRepo.all/2","doc":"","ref":"Plausible.IngestRepo.html#all/2"},{"type":"function","title":"Plausible.IngestRepo.checked_out?/0","doc":"","ref":"Plausible.IngestRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.IngestRepo.checkout/2","doc":"","ref":"Plausible.IngestRepo.html#checkout/2"},{"type":"function","title":"Plausible.IngestRepo.child_spec/1","doc":"","ref":"Plausible.IngestRepo.html#child_spec/1"},{"type":"function","title":"Plausible.IngestRepo.config/0","doc":"","ref":"Plausible.IngestRepo.html#config/0"},{"type":"function","title":"Plausible.IngestRepo.default_options/1","doc":"","ref":"Plausible.IngestRepo.html#default_options/1"},{"type":"function","title":"Plausible.IngestRepo.delete/2","doc":"","ref":"Plausible.IngestRepo.html#delete/2"},{"type":"function","title":"Plausible.IngestRepo.delete!/2","doc":"","ref":"Plausible.IngestRepo.html#delete!/2"},{"type":"function","title":"Plausible.IngestRepo.delete_all/2","doc":"","ref":"Plausible.IngestRepo.html#delete_all/2"},{"type":"function","title":"Plausible.IngestRepo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.IngestRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.IngestRepo.exists?/2","doc":"","ref":"Plausible.IngestRepo.html#exists?/2"},{"type":"function","title":"Plausible.IngestRepo.get/3","doc":"","ref":"Plausible.IngestRepo.html#get/3"},{"type":"function","title":"Plausible.IngestRepo.get!/3","doc":"","ref":"Plausible.IngestRepo.html#get!/3"},{"type":"function","title":"Plausible.IngestRepo.get_by/3","doc":"","ref":"Plausible.IngestRepo.html#get_by/3"},{"type":"function","title":"Plausible.IngestRepo.get_by!/3","doc":"","ref":"Plausible.IngestRepo.html#get_by!/3"},{"type":"function","title":"Plausible.IngestRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.IngestRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.IngestRepo.insert/2","doc":"","ref":"Plausible.IngestRepo.html#insert/2"},{"type":"function","title":"Plausible.IngestRepo.insert!/2","doc":"","ref":"Plausible.IngestRepo.html#insert!/2"},{"type":"function","title":"Plausible.IngestRepo.insert_all/3","doc":"","ref":"Plausible.IngestRepo.html#insert_all/3"},{"type":"function","title":"Plausible.IngestRepo.insert_or_update/2","doc":"","ref":"Plausible.IngestRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.IngestRepo.insert_or_update!/2","doc":"","ref":"Plausible.IngestRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.IngestRepo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.IngestRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.IngestRepo.load/2","doc":"","ref":"Plausible.IngestRepo.html#load/2"},{"type":"function","title":"Plausible.IngestRepo.one/2","doc":"","ref":"Plausible.IngestRepo.html#one/2"},{"type":"function","title":"Plausible.IngestRepo.one!/2","doc":"","ref":"Plausible.IngestRepo.html#one!/2"},{"type":"function","title":"Plausible.IngestRepo.preload/3","doc":"","ref":"Plausible.IngestRepo.html#preload/3"},{"type":"function","title":"Plausible.IngestRepo.prepare_query/3","doc":"","ref":"Plausible.IngestRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.IngestRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.IngestRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.IngestRepo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.IngestRepo.html#query/3"},{"type":"function","title":"Plausible.IngestRepo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.IngestRepo.html#query!/3"},{"type":"function","title":"Plausible.IngestRepo.reload/2","doc":"","ref":"Plausible.IngestRepo.html#reload/2"},{"type":"function","title":"Plausible.IngestRepo.reload!/2","doc":"","ref":"Plausible.IngestRepo.html#reload!/2"},{"type":"function","title":"Plausible.IngestRepo.start_link/1","doc":"","ref":"Plausible.IngestRepo.html#start_link/1"},{"type":"function","title":"Plausible.IngestRepo.stop/1","doc":"","ref":"Plausible.IngestRepo.html#stop/1"},{"type":"function","title":"Plausible.IngestRepo.stream/2","doc":"","ref":"Plausible.IngestRepo.html#stream/2"},{"type":"function","title":"Plausible.IngestRepo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.IngestRepo.html#to_sql/2"},{"type":"function","title":"Plausible.IngestRepo.update/2","doc":"","ref":"Plausible.IngestRepo.html#update/2"},{"type":"function","title":"Plausible.IngestRepo.update!/2","doc":"","ref":"Plausible.IngestRepo.html#update!/2"},{"type":"function","title":"Plausible.IngestRepo.update_all/3","doc":"","ref":"Plausible.IngestRepo.html#update_all/3"},{"type":"module","title":"Plausible.Ingestion.Counters","doc":"This is instrumentation necessary for keeping track of per-domain\ninternal metrics. Due to metric labels cardinality (domain x metric_name),\nthese statistics are not suitable for prometheus/grafana exposure,\nhence an internal storage is used.\n\nThe module installs `Counters.TelemetryHandler` and periodically\nflushes the internal counter aggregates via `Counters.Buffer` interface.\n\nThe underlying database schema is running `SummingMergeTree` engine.\nTo take advantage of automatic roll-ups it provides, upon dispatching the\nbuffered records to Clickhouse this module transforms each `event_timebucket`\naggregate into a 1-minute resolution.\n\nClickhouse connection is set to insert counters asynchronously every time\na pool checkout is made. Those properties are reverted once the insert is done\n(or naturally, if the connection crashes).","ref":"Plausible.Ingestion.Counters.html"},{"type":"function","title":"Plausible.Ingestion.Counters.child_spec/1","doc":"","ref":"Plausible.Ingestion.Counters.html#child_spec/1"},{"type":"function","title":"Plausible.Ingestion.Counters.enabled?/0","doc":"","ref":"Plausible.Ingestion.Counters.html#enabled?/0"},{"type":"function","title":"Plausible.Ingestion.Counters.stop/1","doc":"","ref":"Plausible.Ingestion.Counters.html#stop/1"},{"type":"module","title":"Plausible.Ingestion.Counters.Buffer","doc":"A buffer aggregating counters for internal metrics, within 10 seconds time buckets.\n\nSee `Plausible.Ingestion.Counters` for integration.\n\nFlushing is by default possible only once the 10s bucket is complete\n(its window has moved). This is to avoid race conditions \nwhen clearing up the buffer on dequeue - because there is no atomic \"get and delete\",\nand items are buffered concurrently, there is a gap between get and delete\nin which items written may disappear otherwise.\n\n`aggregate_bucket_fn` and `flush_boundary_fn` control that semantics and\nare configurable only for test purposes.","ref":"Plausible.Ingestion.Counters.Buffer.html"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.aggregate/4","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#aggregate/4"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.bucket_10s/1","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#bucket_10s/1"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.flush/2","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#flush/2"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.new/2","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#new/2"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.previous_10s/1","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#previous_10s/1"},{"type":"type","title":"Plausible.Ingestion.Counters.Buffer.bucket_fn_opt/0","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:bucket_fn_opt/0"},{"type":"type","title":"Plausible.Ingestion.Counters.Buffer.t/0","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:t/0"},{"type":"type","title":"Plausible.Ingestion.Counters.Buffer.unix_timestamp/0","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:unix_timestamp/0"},{"type":"module","title":"Plausible.Ingestion.Counters.Record","doc":"Clickhouse schema for storing ingest counter metrics","ref":"Plausible.Ingestion.Counters.Record.html"},{"type":"type","title":"Plausible.Ingestion.Counters.Record.t/0","doc":"","ref":"Plausible.Ingestion.Counters.Record.html#t:t/0"},{"type":"module","title":"Plausible.Ingestion.Counters.TelemetryHandler","doc":"Subscribes to telemetry events emitted by `Plausible.Ingestion.Event`.\nEvery time a request derived event is either dispatched to clickhouse or dropped,\na telemetry event is emitted respectively. That event is captured here,\nits metadata is extracted and sent for internal stats aggregation via\n`Counters.Buffer` interface.","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html"},{"type":"function","title":"Plausible.Ingestion.Counters.TelemetryHandler.handle_event/4","doc":"","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html#handle_event/4"},{"type":"function","title":"Plausible.Ingestion.Counters.TelemetryHandler.install/1","doc":"","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html#install/1"},{"type":"module","title":"Plausible.Ingestion.Event","doc":"This module exposes the `build_and_buffer/1` function capable of\nturning %Plausible.Ingestion.Request{} into a series of events that in turn\nare uniformly either buffered in batches (to Clickhouse) or dropped\n(e.g. due to spam blocklist) from the processing pipeline.","ref":"Plausible.Ingestion.Event.html"},{"type":"function","title":"Plausible.Ingestion.Event.build_and_buffer/1","doc":"","ref":"Plausible.Ingestion.Event.html#build_and_buffer/1"},{"type":"function","title":"Plausible.Ingestion.Event.emit_telemetry_buffered/1","doc":"","ref":"Plausible.Ingestion.Event.html#emit_telemetry_buffered/1"},{"type":"function","title":"Plausible.Ingestion.Event.emit_telemetry_dropped/2","doc":"","ref":"Plausible.Ingestion.Event.html#emit_telemetry_dropped/2"},{"type":"function","title":"Plausible.Ingestion.Event.telemetry_event_buffered/0","doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_event_buffered/0"},{"type":"function","title":"Plausible.Ingestion.Event.telemetry_event_dropped/0","doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_event_dropped/0"},{"type":"type","title":"Plausible.Ingestion.Event.drop_reason/0","doc":"","ref":"Plausible.Ingestion.Event.html#t:drop_reason/0"},{"type":"type","title":"Plausible.Ingestion.Event.t/0","doc":"","ref":"Plausible.Ingestion.Event.html#t:t/0"},{"type":"module","title":"Plausible.Ingestion.Event.Revenue","doc":"Revenue specific functions for the ingestion scope","ref":"Plausible.Ingestion.Event.Revenue.html"},{"type":"function","title":"Plausible.Ingestion.Event.Revenue.get_revenue_attrs/1","doc":"","ref":"Plausible.Ingestion.Event.Revenue.html#get_revenue_attrs/1"},{"type":"module","title":"Plausible.Ingestion.Request","doc":"The %Plausible.Ingestion.Request{} struct stores all needed fields\nto create an event downstream. Pre-eliminary validation is made\nto detect user errors early.","ref":"Plausible.Ingestion.Request.html"},{"type":"function","title":"Plausible.Ingestion.Request.build/2","doc":"Builds and initially validates %Plausible.Ingestion.Request{} struct from %Plug.Conn{}.","ref":"Plausible.Ingestion.Request.html#build/2"},{"type":"function","title":"Plausible.Ingestion.Request.sanitize_hostname/1","doc":"Removes the \"www\" part of a hostname.","ref":"Plausible.Ingestion.Request.html#sanitize_hostname/1"},{"type":"type","title":"Plausible.Ingestion.Request.t/0","doc":"","ref":"Plausible.Ingestion.Request.html#t:t/0"},{"type":"module","title":"Plausible.Ingestion.Request.Revenue","doc":"Revenue specific functions for the ingestion scope","ref":"Plausible.Ingestion.Request.Revenue.html"},{"type":"function","title":"Plausible.Ingestion.Request.Revenue.put_revenue_source/2","doc":"","ref":"Plausible.Ingestion.Request.Revenue.html#put_revenue_source/2"},{"type":"module","title":"Plausible.Mailer","doc":"","ref":"Plausible.Mailer.html"},{"type":"function","title":"Plausible.Mailer.deliver/1","doc":"","ref":"Plausible.Mailer.html#deliver/1"},{"type":"function","title":"Plausible.Mailer.deliver_later/2","doc":"","ref":"Plausible.Mailer.html#deliver_later/2"},{"type":"function","title":"Plausible.Mailer.deliver_later!/2","doc":"","ref":"Plausible.Mailer.html#deliver_later!/2"},{"type":"function","title":"Plausible.Mailer.deliver_now/2","doc":"","ref":"Plausible.Mailer.html#deliver_now/2"},{"type":"function","title":"Plausible.Mailer.deliver_now!/2","doc":"","ref":"Plausible.Mailer.html#deliver_now!/2"},{"type":"function","title":"Plausible.Mailer.send/1","doc":"","ref":"Plausible.Mailer.html#send/1"},{"type":"type","title":"Plausible.Mailer.result/0","doc":"","ref":"Plausible.Mailer.html#t:result/0"},{"type":"module","title":"Plausible.OpenTelemetry.Sampler","doc":"[Custom OpenTelemetry sampler](https://hexdocs.pm/opentelemetry/readme.html#samplers)\nimplementation that ignores particular traces to reduce noise. Ingestion\nHTTP requests and queries to Oban tables are ignored, for example.\n\nFor non-ignored traces, implements trace ID ratio-based sampling following the method\nfrom [built-in sampler](https://github.com/open-telemetry/opentelemetry-erlang/blob/main/apps/opentelemetry/src/otel_sampler_trace_id_ratio_based.erl).","ref":"Plausible.OpenTelemetry.Sampler.html"},{"type":"module","title":"Plausible.PaddleApi.Mock","doc":"","ref":"Plausible.PaddleApi.Mock.html"},{"type":"function","title":"Plausible.PaddleApi.Mock.fetch_prices/1","doc":"","ref":"Plausible.PaddleApi.Mock.html#fetch_prices/1"},{"type":"function","title":"Plausible.PaddleApi.Mock.get_invoices/1","doc":"","ref":"Plausible.PaddleApi.Mock.html#get_invoices/1"},{"type":"function","title":"Plausible.PaddleApi.Mock.get_subscription/1","doc":"","ref":"Plausible.PaddleApi.Mock.html#get_subscription/1"},{"type":"function","title":"Plausible.PaddleApi.Mock.update_subscription/2","doc":"","ref":"Plausible.PaddleApi.Mock.html#update_subscription/2"},{"type":"function","title":"Plausible.PaddleApi.Mock.update_subscription_preview/2","doc":"","ref":"Plausible.PaddleApi.Mock.html#update_subscription_preview/2"},{"type":"module","title":"Plausible.Pagination","doc":"Cursor-based pagination.","ref":"Plausible.Pagination.html"},{"type":"function","title":"Plausible.Pagination.paginate/4","doc":"","ref":"Plausible.Pagination.html#paginate/4"},{"type":"module","title":"Plausible.Plugins.API.CustomProps","doc":"Plugins API context module for Custom Props.\nAll high level Custom Props operations should be implemented here.","ref":"Plausible.Plugins.API.CustomProps.html"},{"type":"function","title":"Plausible.Plugins.API.CustomProps.disable/2","doc":"","ref":"Plausible.Plugins.API.CustomProps.html#disable/2"},{"type":"function","title":"Plausible.Plugins.API.CustomProps.enable/2","doc":"","ref":"Plausible.Plugins.API.CustomProps.html#enable/2"},{"type":"module","title":"Plausible.Plugins.API.Goals","doc":"Plugins API context module for Goals.\nAll high level Goal operations should be implemented here.","ref":"Plausible.Plugins.API.Goals.html"},{"type":"function","title":"Plausible.Plugins.API.Goals.create/2","doc":"","ref":"Plausible.Plugins.API.Goals.html#create/2"},{"type":"function","title":"Plausible.Plugins.API.Goals.delete/2","doc":"","ref":"Plausible.Plugins.API.Goals.html#delete/2"},{"type":"function","title":"Plausible.Plugins.API.Goals.get/2","doc":"","ref":"Plausible.Plugins.API.Goals.html#get/2"},{"type":"function","title":"Plausible.Plugins.API.Goals.get_goals/2","doc":"","ref":"Plausible.Plugins.API.Goals.html#get_goals/2"},{"type":"type","title":"Plausible.Plugins.API.Goals.create_request/0","doc":"","ref":"Plausible.Plugins.API.Goals.html#t:create_request/0"},{"type":"module","title":"Plausible.Plugins.API.SharedLinks","doc":"Plugins API context module for Shared Links.\nAll high level Shared Links operations should be implemented here.","ref":"Plausible.Plugins.API.SharedLinks.html"},{"type":"function","title":"Plausible.Plugins.API.SharedLinks.get/2","doc":"","ref":"Plausible.Plugins.API.SharedLinks.html#get/2"},{"type":"function","title":"Plausible.Plugins.API.SharedLinks.get_or_create/3","doc":"","ref":"Plausible.Plugins.API.SharedLinks.html#get_or_create/3"},{"type":"function","title":"Plausible.Plugins.API.SharedLinks.get_shared_links/2","doc":"","ref":"Plausible.Plugins.API.SharedLinks.html#get_shared_links/2"},{"type":"module","title":"Plausible.Plugins.API.Token","doc":"Ecto schema for Plugins API Tokens.\nTokens are stored hashed and require a description.\n\nTokens are considered secret, although the Plugins API\nby nature will expose very little, if any, destructive/insecure operations.\n\nThe raw token version is meant to be presented to the user upon creation.\nIt is prefixed with a plain text identifier allowing source scanning\nfor leaked secrets.","ref":"Plausible.Plugins.API.Token.html"},{"type":"function","title":"Plausible.Plugins.API.Token.generate/1","doc":"","ref":"Plausible.Plugins.API.Token.html#generate/1"},{"type":"function","title":"Plausible.Plugins.API.Token.hash/1","doc":"","ref":"Plausible.Plugins.API.Token.html#hash/1"},{"type":"function","title":"Plausible.Plugins.API.Token.insert_changeset/3","doc":"","ref":"Plausible.Plugins.API.Token.html#insert_changeset/3"},{"type":"function","title":"Plausible.Plugins.API.Token.last_used_humanize/1","doc":"","ref":"Plausible.Plugins.API.Token.html#last_used_humanize/1"},{"type":"function","title":"Plausible.Plugins.API.Token.prefix/0","doc":"Raw tokens are prefixed so that tools like\nhttps://docs.github.com/en/code-security/secret-scanning/about-secret-scanning\ncan scan repositories for accidental secret commits.","ref":"Plausible.Plugins.API.Token.html#prefix/0"},{"type":"type","title":"Plausible.Plugins.API.Token.t/0","doc":"","ref":"Plausible.Plugins.API.Token.html#t:t/0"},{"type":"module","title":"Plausible.Plugins.API.Tokens","doc":"Context module for Plugins API Tokens.\nExposes high-level operation for token-based authentication flows.","ref":"Plausible.Plugins.API.Tokens.html"},{"type":"function","title":"Plausible.Plugins.API.Tokens.any?/1","doc":"","ref":"Plausible.Plugins.API.Tokens.html#any?/1"},{"type":"function","title":"Plausible.Plugins.API.Tokens.create/3","doc":"","ref":"Plausible.Plugins.API.Tokens.html#create/3"},{"type":"function","title":"Plausible.Plugins.API.Tokens.delete/2","doc":"","ref":"Plausible.Plugins.API.Tokens.html#delete/2"},{"type":"function","title":"Plausible.Plugins.API.Tokens.find/1","doc":"","ref":"Plausible.Plugins.API.Tokens.html#find/1"},{"type":"function","title":"Plausible.Plugins.API.Tokens.list/1","doc":"","ref":"Plausible.Plugins.API.Tokens.html#list/1"},{"type":"function","title":"Plausible.Plugins.API.Tokens.update_last_seen/2","doc":"","ref":"Plausible.Plugins.API.Tokens.html#update_last_seen/2"},{"type":"module","title":"Plausible.PromEx","doc":"","ref":"Plausible.PromEx.html"},{"type":"function","title":"Plausible.PromEx.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.PromEx.html#child_spec/1"},{"type":"module","title":"Plausible.PromEx.Plugins.PlausibleMetrics","doc":"Custom PromEx plugin for instrumenting code within Plausible app.","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html"},{"type":"function","title":"Plausible.PromEx.Plugins.PlausibleMetrics.execute_cache_metrics/0","doc":"Add telemetry events for Cachex user agents and sessions","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#execute_cache_metrics/0"},{"type":"function","title":"Plausible.PromEx.Plugins.PlausibleMetrics.execute_write_buffer_metrics/0","doc":"Add telemetry events for Session and Event write buffers","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#execute_write_buffer_metrics/0"},{"type":"module","title":"Plausible.Props","doc":"Context module for handling custom event props.","ref":"Plausible.Props.html"},{"type":"function","title":"Plausible.Props.allow/2","doc":"Allows a prop key or a list of props keys to be included in ClickHouse\nqueries. Allowing prop keys does not affect ingestion, as we don't want any\ndata to be dropped or lost.","ref":"Plausible.Props.html#allow/2"},{"type":"function","title":"Plausible.Props.allow_changeset/2","doc":"","ref":"Plausible.Props.html#allow_changeset/2"},{"type":"function","title":"Plausible.Props.allow_existing_props/1","doc":"Allows the 300 most frequent props keys for a specific site over\nthe past 6 months.","ref":"Plausible.Props.html#allow_existing_props/1"},{"type":"function","title":"Plausible.Props.configured?/1","doc":"Returns whether the site has configured custom props or not.","ref":"Plausible.Props.html#configured?/1"},{"type":"function","title":"Plausible.Props.disallow/2","doc":"Removes previously allowed prop key(s) from the allow list. This means this\nprop key won't be included in ClickHouse queries. This doesn't drop any\nClickHouse data, nor affects ingestion.","ref":"Plausible.Props.html#disallow/2"},{"type":"function","title":"Plausible.Props.ensure_prop_key_accessible/2","doc":"","ref":"Plausible.Props.html#ensure_prop_key_accessible/2"},{"type":"function","title":"Plausible.Props.internal_keys/0","doc":"Lists prop keys used internally.\n\nThese props should be allowed by default, and should not be displayed in the\nprops settings page. For example, `url` is a special prop key used for file\ndownloads and outbound links. It doesn't make sense to remove this prop key\nfrom the allow list, or to suggest users to add this prop key.","ref":"Plausible.Props.html#internal_keys/0"},{"type":"function","title":"Plausible.Props.max_prop_key_length/0","doc":"","ref":"Plausible.Props.html#max_prop_key_length/0"},{"type":"function","title":"Plausible.Props.max_prop_value_length/0","doc":"","ref":"Plausible.Props.html#max_prop_value_length/0"},{"type":"function","title":"Plausible.Props.max_props/0","doc":"","ref":"Plausible.Props.html#max_props/0"},{"type":"function","title":"Plausible.Props.suggest_keys_to_allow/2","doc":"Queries the events table to fetch the 300 most frequent prop keys\nfor a specific site over the past 6 months, excluding keys that are already\nallowed.","ref":"Plausible.Props.html#suggest_keys_to_allow/2"},{"type":"type","title":"Plausible.Props.prop/0","doc":"","ref":"Plausible.Props.html#t:prop/0"},{"type":"module","title":"Plausible.Purge","doc":"Deletes data from a site.\n\nStats are stored on Clickhouse, and unlike other databases data deletion is\ndone asynchronously.\n\nAll import tables have MergeTree's deduplication mechanism _disabled_ by setting\n`replicated_deduplication_window` from default 100 to 0. When enabled, every insert\ninto a given table is compared against hashes of 100 previous inserts (as complete\nparts, not concrete rows) and ignored when match is found. The prupose of that\nmechanism is making inserts of exact same batches idempotent when retrying them\nshortly after - for instance due to timeout, when the client can't easily tell if\nprevious insert succeeded or not. Deduplication, however, only considers inserts,\nnot mutations. Deletions do not affect stored hashes, so further inserts of parts\nthat were deleted will still be treated as duplicates. That's why this feature\nis disabled for import tables.\n\nAlthough deletions are asynchronous, the parts to delete are \"remembered\", so there's\nno risk of overlapping deletion causing problems with import following right after it.\n\nIMPORTANT: Deletion requires revision if/when import tables get moved to sharded CH\ncluster setup. Mutation queries, which have to be run with `ON CLUSTER` in such setup,\ndispatch independent queries across shards and those queries can start at different\ntimes. This in turn means risk of deletions corrupting data of follow-up inserts\nin some edge cases. Ideally, imported entries should be unique for a given import\n- an extra `import_id` column can be introduced, holding identifier. Last processed\nimport identifier should be stored with other site data and should be used for scoping\nimported stats queries. No longer used imports can then be safely removed fully\nasynchronously.\n\n- [Clickhouse `ALTER TABLE ... DELETE` Statement](https://clickhouse.com/docs/en/sql-reference/statements/alter/delete)\n- [Synchronicity of `ALTER` Queries](https://clickhouse.com/docs/en/sql-reference/statements/alter/#synchronicity-of-alter-queries)","ref":"Plausible.Purge.html"},{"type":"function","title":"Plausible.Purge.delete_imported_stats!/1","doc":"Deletes imported stats from Google Analytics, and clears the\n`stats_start_date` field.","ref":"Plausible.Purge.html#delete_imported_stats!/1"},{"type":"function","title":"Plausible.Purge.delete_native_stats!/1","doc":"Move stats pointers so that no historical stats are available.","ref":"Plausible.Purge.html#delete_native_stats!/1"},{"type":"function","title":"Plausible.Purge.reset!/1","doc":"","ref":"Plausible.Purge.html#reset!/1"},{"type":"module","title":"Plausible.RateLimit","doc":"Thin wrapper around `:ets.update_counter/4` and a\nclean-up process to act as a rate limiter.","ref":"Plausible.RateLimit.html"},{"type":"function","title":"Plausible.RateLimit.check_rate/5","doc":"Checks the rate-limit for a key.","ref":"Plausible.RateLimit.html#check_rate/5"},{"type":"function","title":"Plausible.RateLimit.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.RateLimit.html#child_spec/1"},{"type":"function","title":"Plausible.RateLimit.start_link/1","doc":"Starts the process that creates and cleans the ETS table.\n\nAccepts the following options:\n - `GenServer.options()`\n - `:table` for the ETS table name, defaults to `Elixir.Plausible.RateLimit`\n - `:clean_period` for how often to perform garbage collection","ref":"Plausible.RateLimit.html#start_link/1"},{"type":"module","title":"Plausible.Release","doc":"","ref":"Plausible.Release.html"},{"type":"function","title":"Plausible.Release.configure_ref_inspector/0","doc":"","ref":"Plausible.Release.html#configure_ref_inspector/0"},{"type":"function","title":"Plausible.Release.configure_ua_inspector/0","doc":"","ref":"Plausible.Release.html#configure_ua_inspector/0"},{"type":"function","title":"Plausible.Release.createdb/0","doc":"","ref":"Plausible.Release.html#createdb/0"},{"type":"function","title":"Plausible.Release.dump_plans/0","doc":"","ref":"Plausible.Release.html#dump_plans/0"},{"type":"function","title":"Plausible.Release.migrate/0","doc":"","ref":"Plausible.Release.html#migrate/0"},{"type":"function","title":"Plausible.Release.pending_migrations/0","doc":"","ref":"Plausible.Release.html#pending_migrations/0"},{"type":"function","title":"Plausible.Release.rollback/0","doc":"","ref":"Plausible.Release.html#rollback/0"},{"type":"function","title":"Plausible.Release.seed/0","doc":"","ref":"Plausible.Release.html#seed/0"},{"type":"function","title":"Plausible.Release.should_be_first_launch?/0","doc":"","ref":"Plausible.Release.html#should_be_first_launch?/0"},{"type":"module","title":"Plausible.Repo","doc":"","ref":"Plausible.Repo.html"},{"type":"function","title":"Plausible.Repo.aggregate/3","doc":"","ref":"Plausible.Repo.html#aggregate/3"},{"type":"function","title":"Plausible.Repo.aggregate/4","doc":"","ref":"Plausible.Repo.html#aggregate/4"},{"type":"function","title":"Plausible.Repo.all/2","doc":"","ref":"Plausible.Repo.html#all/2"},{"type":"function","title":"Plausible.Repo.checked_out?/0","doc":"","ref":"Plausible.Repo.html#checked_out?/0"},{"type":"function","title":"Plausible.Repo.checkout/2","doc":"","ref":"Plausible.Repo.html#checkout/2"},{"type":"function","title":"Plausible.Repo.child_spec/1","doc":"","ref":"Plausible.Repo.html#child_spec/1"},{"type":"function","title":"Plausible.Repo.config/0","doc":"","ref":"Plausible.Repo.html#config/0"},{"type":"function","title":"Plausible.Repo.default_options/1","doc":"","ref":"Plausible.Repo.html#default_options/1"},{"type":"function","title":"Plausible.Repo.delete/2","doc":"","ref":"Plausible.Repo.html#delete/2"},{"type":"function","title":"Plausible.Repo.delete!/2","doc":"","ref":"Plausible.Repo.html#delete!/2"},{"type":"function","title":"Plausible.Repo.delete_all/2","doc":"","ref":"Plausible.Repo.html#delete_all/2"},{"type":"function","title":"Plausible.Repo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.Repo.html#disconnect_all/2"},{"type":"function","title":"Plausible.Repo.exists?/2","doc":"","ref":"Plausible.Repo.html#exists?/2"},{"type":"function","title":"Plausible.Repo.explain/3","doc":"A convenience function for SQL-based repositories that executes an EXPLAIN statement or similar\ndepending on the adapter to obtain statistics for the given query.\n\nSee `Ecto.Adapters.SQL.explain/4` for more information.","ref":"Plausible.Repo.html#explain/3"},{"type":"function","title":"Plausible.Repo.get/3","doc":"","ref":"Plausible.Repo.html#get/3"},{"type":"function","title":"Plausible.Repo.get!/3","doc":"","ref":"Plausible.Repo.html#get!/3"},{"type":"function","title":"Plausible.Repo.get_by/3","doc":"","ref":"Plausible.Repo.html#get_by/3"},{"type":"function","title":"Plausible.Repo.get_by!/3","doc":"","ref":"Plausible.Repo.html#get_by!/3"},{"type":"function","title":"Plausible.Repo.get_dynamic_repo/0","doc":"","ref":"Plausible.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.Repo.in_transaction?/0","doc":"","ref":"Plausible.Repo.html#in_transaction?/0"},{"type":"function","title":"Plausible.Repo.insert/2","doc":"","ref":"Plausible.Repo.html#insert/2"},{"type":"function","title":"Plausible.Repo.insert!/2","doc":"","ref":"Plausible.Repo.html#insert!/2"},{"type":"function","title":"Plausible.Repo.insert_all/3","doc":"","ref":"Plausible.Repo.html#insert_all/3"},{"type":"function","title":"Plausible.Repo.insert_or_update/2","doc":"","ref":"Plausible.Repo.html#insert_or_update/2"},{"type":"function","title":"Plausible.Repo.insert_or_update!/2","doc":"","ref":"Plausible.Repo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.Repo.load/2","doc":"","ref":"Plausible.Repo.html#load/2"},{"type":"function","title":"Plausible.Repo.one/2","doc":"","ref":"Plausible.Repo.html#one/2"},{"type":"function","title":"Plausible.Repo.one!/2","doc":"","ref":"Plausible.Repo.html#one!/2"},{"type":"function","title":"Plausible.Repo.paginate/2","doc":"","ref":"Plausible.Repo.html#paginate/2"},{"type":"function","title":"Plausible.Repo.preload/3","doc":"","ref":"Plausible.Repo.html#preload/3"},{"type":"function","title":"Plausible.Repo.prepare_query/3","doc":"","ref":"Plausible.Repo.html#prepare_query/3"},{"type":"function","title":"Plausible.Repo.put_dynamic_repo/1","doc":"","ref":"Plausible.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.Repo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.Repo.html#query/3"},{"type":"function","title":"Plausible.Repo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.Repo.html#query!/3"},{"type":"function","title":"Plausible.Repo.query_many/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query.\n\nSee `Ecto.Adapters.SQL.query_many/4` for more information.","ref":"Plausible.Repo.html#query_many/3"},{"type":"function","title":"Plausible.Repo.query_many!/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query.\n\nSee `Ecto.Adapters.SQL.query_many!/4` for more information.","ref":"Plausible.Repo.html#query_many!/3"},{"type":"function","title":"Plausible.Repo.reload/2","doc":"","ref":"Plausible.Repo.html#reload/2"},{"type":"function","title":"Plausible.Repo.reload!/2","doc":"","ref":"Plausible.Repo.html#reload!/2"},{"type":"function","title":"Plausible.Repo.rollback/1","doc":"","ref":"Plausible.Repo.html#rollback/1"},{"type":"function","title":"Plausible.Repo.scrivener_defaults/0","doc":"","ref":"Plausible.Repo.html#scrivener_defaults/0"},{"type":"function","title":"Plausible.Repo.start_link/1","doc":"","ref":"Plausible.Repo.html#start_link/1"},{"type":"function","title":"Plausible.Repo.stop/1","doc":"","ref":"Plausible.Repo.html#stop/1"},{"type":"function","title":"Plausible.Repo.stream/2","doc":"","ref":"Plausible.Repo.html#stream/2"},{"type":"function","title":"Plausible.Repo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.Repo.html#to_sql/2"},{"type":"function","title":"Plausible.Repo.transaction/2","doc":"","ref":"Plausible.Repo.html#transaction/2"},{"type":"function","title":"Plausible.Repo.update/2","doc":"","ref":"Plausible.Repo.html#update/2"},{"type":"function","title":"Plausible.Repo.update!/2","doc":"","ref":"Plausible.Repo.html#update!/2"},{"type":"function","title":"Plausible.Repo.update_all/3","doc":"","ref":"Plausible.Repo.html#update_all/3"},{"type":"module","title":"Plausible.Sentry.Client","doc":"","ref":"Plausible.Sentry.Client.html"},{"type":"function","title":"Plausible.Sentry.Client.child_spec/0","doc":"The Sentry.HTTPClient behaviour requires a child spec to be supplied.\nIn this case we don't want Sentry to manage our Finch instances, hence it's fed\nwith a dummy module for the sake of the contract.\n\nXXX: Submit a Sentry PR making the child spec callback optional.","ref":"Plausible.Sentry.Client.html#child_spec/0"},{"type":"function","title":"Plausible.Sentry.Client.post/3","doc":"","ref":"Plausible.Sentry.Client.html#post/3"},{"type":"module","title":"Plausible.SentryFilter","doc":"Sentry callbacks for filtering and grouping events","ref":"Plausible.SentryFilter.html"},{"type":"function","title":"Plausible.SentryFilter.before_send/1","doc":"","ref":"Plausible.SentryFilter.html#before_send/1"},{"type":"function","title":"Plausible.SentryFilter.exclude_exception?/2","doc":"","ref":"Plausible.SentryFilter.html#exclude_exception?/2"},{"type":"module","title":"Plausible.Session.CacheStore","doc":"","ref":"Plausible.Session.CacheStore.html"},{"type":"function","title":"Plausible.Session.CacheStore.on_event/3","doc":"","ref":"Plausible.Session.CacheStore.html#on_event/3"},{"type":"module","title":"Plausible.Session.Salts","doc":"","ref":"Plausible.Session.Salts.html"},{"type":"function","title":"Plausible.Session.Salts.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Session.Salts.html#child_spec/1"},{"type":"function","title":"Plausible.Session.Salts.fetch/0","doc":"","ref":"Plausible.Session.Salts.html#fetch/0"},{"type":"function","title":"Plausible.Session.Salts.rotate/0","doc":"","ref":"Plausible.Session.Salts.html#rotate/0"},{"type":"function","title":"Plausible.Session.Salts.start_link/1","doc":"","ref":"Plausible.Session.Salts.html#start_link/1"},{"type":"module","title":"Plausible.Site","doc":"Site schema","ref":"Plausible.Site.html"},{"type":"function","title":"Plausible.Site.changeset/2","doc":"","ref":"Plausible.Site.html#changeset/2"},{"type":"function","title":"Plausible.Site.crm_changeset/2","doc":"","ref":"Plausible.Site.html#crm_changeset/2"},{"type":"function","title":"Plausible.Site.import_failure/1","doc":"","ref":"Plausible.Site.html#import_failure/1"},{"type":"function","title":"Plausible.Site.import_success/1","doc":"","ref":"Plausible.Site.html#import_success/1"},{"type":"function","title":"Plausible.Site.local_start_date/1","doc":"Returns the date of the first recorded stat in the timezone configured by the user.\nThis function does 2 transformations:\n UTC %NaiveDateTime{} -> Local %DateTime{} -> Local %Date","ref":"Plausible.Site.html#local_start_date/1"},{"type":"function","title":"Examples - Plausible.Site.local_start_date/1","doc":"iex> Plausible.Site.local_start_date(%Plausible.Site{stats_start_date: nil})\n nil\n\n iex> utc_start = ~N[2022-09-28 00:00:00]\n iex> tz = \"Europe/Helsinki\"\n iex> site = %Plausible.Site{stats_start_date: utc_start, timezone: tz}\n iex> Plausible.Site.local_start_date(site)\n ~D[2022-09-28]\n\n iex> utc_start = ~N[2022-09-28 00:00:00]\n iex> tz = \"America/Los_Angeles\"\n iex> site = %Plausible.Site{stats_start_date: utc_start, timezone: tz}\n iex> Plausible.Site.local_start_date(site)\n ~D[2022-09-27]","ref":"Plausible.Site.html#local_start_date/1-examples"},{"type":"function","title":"Plausible.Site.make_private/1","doc":"","ref":"Plausible.Site.html#make_private/1"},{"type":"function","title":"Plausible.Site.make_public/1","doc":"","ref":"Plausible.Site.html#make_public/1"},{"type":"function","title":"Plausible.Site.new/1","doc":"","ref":"Plausible.Site.html#new/1"},{"type":"function","title":"Plausible.Site.remove_imported_data/1","doc":"","ref":"Plausible.Site.html#remove_imported_data/1"},{"type":"function","title":"Plausible.Site.set_imported_source/2","doc":"","ref":"Plausible.Site.html#set_imported_source/2"},{"type":"function","title":"Plausible.Site.set_native_stats_start_at/2","doc":"","ref":"Plausible.Site.html#set_native_stats_start_at/2"},{"type":"function","title":"Plausible.Site.set_stats_start_date/2","doc":"","ref":"Plausible.Site.html#set_stats_start_date/2"},{"type":"function","title":"Plausible.Site.start_import/5","doc":"","ref":"Plausible.Site.html#start_import/5"},{"type":"function","title":"Plausible.Site.tz_offset/2","doc":"","ref":"Plausible.Site.html#tz_offset/2"},{"type":"function","title":"Plausible.Site.update_changeset/3","doc":"","ref":"Plausible.Site.html#update_changeset/3"},{"type":"type","title":"Plausible.Site.t/0","doc":"","ref":"Plausible.Site.html#t:t/0"},{"type":"module","title":"Plausible.Site.Cache","doc":"A \"sites by domain\" caching interface.\n\nServes as a thin wrapper around Cachex, but the underlying\nimplementation can be transparently swapped.\n\nEven though the Cachex process is started, cache access is disabled\nduring tests via the `:sites_by_domain_cache_enabled` application env key.\nThis can be overridden on case by case basis, using the child specs options.\n\nNOTE: the cache allows lookups by both `domain` and `domain_changed_from`\nfields - this is to allow traffic from sites whose domains changed within a certain\ngrace period (see: `Plausible.Site.Transfer`).\n\nWhen Cache is disabled via application env, the `get/1` function\nfalls back to pure database lookups. This should help with introducing\ncached lookups in existing code, so that no existing tests should break.\n\nTo differentiate cached Site structs from those retrieved directly from the\ndatabase, a virtual schema field `from_cache?: true` is set.\nThis indicates the `Plausible.Site` struct is incomplete in comparison to its\ndatabase counterpart -- to spare bandwidth and query execution time,\nonly selected database columns are retrieved and cached.\n\nThere are two modes of refreshing the cache: `:all` and `:updated_recently`.\n\n * `:all` means querying the database for all Site entries and should be done\n periodically (via `Cache.Warmer`). All stale Cache entries are cleared\n upon persisting the new batch.\n\n * `:updated_recently` attempts to re-query sites updated within the last\n 15 minutes only, to account for most recent changes. This refresh\n is lighter on the database and is meant to be executed more frequently\n (via `Cache.Warmer.RecentlyUpdated`).\n\nRefreshing the cache emits telemetry event defined as per `telemetry_event_refresh/2`.\n\nThe `@cached_schema_fields` attribute defines the list of DB columns\nqueried on each cache refresh.\n\nAlso see tests for more comprehensive examples.","ref":"Plausible.Site.Cache.html"},{"type":"function","title":"Plausible.Site.Cache.child_spec/1","doc":"","ref":"Plausible.Site.Cache.html#child_spec/1"},{"type":"function","title":"Plausible.Site.Cache.enabled?/0","doc":"","ref":"Plausible.Site.Cache.html#enabled?/0"},{"type":"function","title":"Plausible.Site.Cache.get/2","doc":"","ref":"Plausible.Site.Cache.html#get/2"},{"type":"function","title":"Plausible.Site.Cache.get_site_id/2","doc":"","ref":"Plausible.Site.Cache.html#get_site_id/2"},{"type":"function","title":"Plausible.Site.Cache.hit_rate/1","doc":"","ref":"Plausible.Site.Cache.html#hit_rate/1"},{"type":"function","title":"Plausible.Site.Cache.merge/2","doc":"","ref":"Plausible.Site.Cache.html#merge/2"},{"type":"function","title":"Plausible.Site.Cache.name/0","doc":"","ref":"Plausible.Site.Cache.html#name/0"},{"type":"function","title":"Plausible.Site.Cache.ready?/1","doc":"Ensures the cache has non-zero size unless no sites exist.\nUseful for orchestrating app startup to prevent the service\ngoing up asynchronously with an empty cache.","ref":"Plausible.Site.Cache.html#ready?/1"},{"type":"function","title":"Plausible.Site.Cache.refresh_all/1","doc":"","ref":"Plausible.Site.Cache.html#refresh_all/1"},{"type":"function","title":"Plausible.Site.Cache.refresh_updated_recently/1","doc":"","ref":"Plausible.Site.Cache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Site.Cache.size/1","doc":"","ref":"Plausible.Site.Cache.html#size/1"},{"type":"function","title":"Plausible.Site.Cache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Site.Cache.html#telemetry_event_refresh/2"},{"type":"function","title":"Plausible.Site.Cache.touch_site!/2","doc":"","ref":"Plausible.Site.Cache.html#touch_site!/2"},{"type":"type","title":"Plausible.Site.Cache.t/0","doc":"","ref":"Plausible.Site.Cache.html#t:t/0"},{"type":"module","title":"Plausible.Site.Cache.Warmer","doc":"A periodic cache warmer.\nQueries all Sites from Postgres, every `interval` and pre-populates the cache.\nAfter each run the process is hibernated, triggering garbage collection.\n\nCurrently Cachex is used, but the underlying implementation can be transparently swapped.\n\nChild specification options available:\n\n * `interval` - the number of milliseconds for each warm-up cycle, defaults\n to `:sites_by_domain_cache_refresh_interval` application env value\n with random jitter added, for which the maximum is stored under\n `:sites_by_domain_cache_refresh_interval_max_jitter` key.\n * `cache_name` - defaults to Cache.name() but can be overriden for testing\n * `force_start?` - enforcess process startup for testing, even if it's barred\n by `Cache.enabled?`. This is useful for avoiding issues with DB ownership\n and async tests.\n * `warmer_fn` - used for testing, a custom function to retrieve the items meant\n to be cached during the warm-up cycle.\n\nSee tests for more comprehensive examples.","ref":"Plausible.Site.Cache.Warmer.html"},{"type":"function","title":"Plausible.Site.Cache.Warmer.child_spec/1","doc":"","ref":"Plausible.Site.Cache.Warmer.html#child_spec/1"},{"type":"function","title":"Plausible.Site.Cache.Warmer.interval/0","doc":"","ref":"Plausible.Site.Cache.Warmer.html#interval/0"},{"type":"module","title":"Plausible.Site.Cache.Warmer.All","doc":"A Cache.Warmer adapter that refreshes the Sites Cache fully.\nThis module exists only to make it explicit what the warmer\nrefreshes, to be used in the supervisor tree.","ref":"Plausible.Site.Cache.Warmer.All.html"},{"type":"function","title":"Plausible.Site.Cache.Warmer.All.child_spec/1","doc":"","ref":"Plausible.Site.Cache.Warmer.All.html#child_spec/1"},{"type":"module","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated","doc":"A Cache.Warmer adapter that only refreshes the Cache\nwith recently updated sites every 30 seconds.","ref":"Plausible.Site.Cache.Warmer.RecentlyUpdated.html"},{"type":"function","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated.child_spec/1","doc":"","ref":"Plausible.Site.Cache.Warmer.RecentlyUpdated.html#child_spec/1"},{"type":"module","title":"Plausible.Site.Domain","doc":"Basic interface for domain changes.\n\nOnce `Plausible.DataMigration.NumericIDs` schema migration is ready, \ndomain change operation will be enabled, accessible to the users.\n\nWe will set a transition period of 72 hours\nduring which, both old and new domains, will be accepted as traffic\nidentifiers to the same site. \n\nA periodic worker will call the `expire/0` function to end it where applicable.\nSee: `Plausible.Workers.ExpireDomainChangeTransitions`.\n\nThe underlying changeset for domain change (see: `Plausible.Site`) relies\non database trigger installed via `Plausible.Repo.Migrations.AllowDomainChange`\nPostgres migration. The trigger checks if either `domain` or `domain_changed_from`\nexist to ensure unicity.","ref":"Plausible.Site.Domain.html"},{"type":"function","title":"Plausible.Site.Domain.change/3","doc":"","ref":"Plausible.Site.Domain.html#change/3"},{"type":"function","title":"Plausible.Site.Domain.expire_change_transitions/1","doc":"","ref":"Plausible.Site.Domain.html#expire_change_transitions/1"},{"type":"module","title":"Plausible.Site.GateKeeper","doc":"Thin wrapper around `Plausible.RateLimit` for gate keeping domain-specific events\nduring the ingestion phase. When the site is allowed, gate keeping\ncheck returns `:allow`, otherwise a `:deny` tagged tuple is returned\nwith one of the following policy markers:\n * `:not_found` (indicates site not found in cache)\n * `:block` (indicates disabled sites)\n * `:throttle` (indicates rate limiting)\n\nRate Limiting buckets are configured per site (externally via the CRM).\nSee: `Plausible.Site`\n\nTo look up each site's configuration, the RateLimiter fetches\na Site by domain using `Plausible.Cache` interface.\n\nThe module defines two policies outside the regular bucket inspection:\n * when the the site is not found in cache: not_found\n * when the underlying rate limiting mechanism returns\n an internal error: :allow","ref":"Plausible.Site.GateKeeper.html"},{"type":"function","title":"Plausible.Site.GateKeeper.check/2","doc":"","ref":"Plausible.Site.GateKeeper.html#check/2"},{"type":"function","title":"Plausible.Site.GateKeeper.key/1","doc":"","ref":"Plausible.Site.GateKeeper.html#key/1"},{"type":"type","title":"Plausible.Site.GateKeeper.policy/0","doc":"","ref":"Plausible.Site.GateKeeper.html#t:policy/0"},{"type":"type","title":"Plausible.Site.GateKeeper.t/0","doc":"","ref":"Plausible.Site.GateKeeper.html#t:t/0"},{"type":"module","title":"Plausible.Site.GoogleAuth","doc":"","ref":"Plausible.Site.GoogleAuth.html"},{"type":"function","title":"Plausible.Site.GoogleAuth.changeset/2","doc":"","ref":"Plausible.Site.GoogleAuth.html#changeset/2"},{"type":"function","title":"Plausible.Site.GoogleAuth.set_property/2","doc":"","ref":"Plausible.Site.GoogleAuth.html#set_property/2"},{"type":"module","title":"Plausible.Site.ImportedData","doc":"Embedded schema for Google Analytics imports","ref":"Plausible.Site.ImportedData.html"},{"type":"module","title":"Plausible.Site.Membership","doc":"","ref":"Plausible.Site.Membership.html"},{"type":"function","title":"Plausible.Site.Membership.new/2","doc":"","ref":"Plausible.Site.Membership.html#new/2"},{"type":"function","title":"Plausible.Site.Membership.set_role/2","doc":"","ref":"Plausible.Site.Membership.html#set_role/2"},{"type":"type","title":"Plausible.Site.Membership.role/0","doc":"","ref":"Plausible.Site.Membership.html#t:role/0"},{"type":"type","title":"Plausible.Site.Membership.t/0","doc":"","ref":"Plausible.Site.Membership.html#t:t/0"},{"type":"module","title":"Plausible.Site.Memberships","doc":"API for site memberships and invitations","ref":"Plausible.Site.Memberships.html"},{"type":"function","title":"Plausible.Site.Memberships.accept_invitation/2","doc":"","ref":"Plausible.Site.Memberships.html#accept_invitation/2"},{"type":"function","title":"Plausible.Site.Memberships.any?/1","doc":"","ref":"Plausible.Site.Memberships.html#any?/1"},{"type":"function","title":"Plausible.Site.Memberships.any_or_pending?/1","doc":"","ref":"Plausible.Site.Memberships.html#any_or_pending?/1"},{"type":"function","title":"Plausible.Site.Memberships.bulk_create_invitation/5","doc":"","ref":"Plausible.Site.Memberships.html#bulk_create_invitation/5"},{"type":"function","title":"Plausible.Site.Memberships.bulk_transfer_ownership_direct/2","doc":"","ref":"Plausible.Site.Memberships.html#bulk_transfer_ownership_direct/2"},{"type":"function","title":"Plausible.Site.Memberships.create_invitation/4","doc":"","ref":"Plausible.Site.Memberships.html#create_invitation/4"},{"type":"function","title":"Plausible.Site.Memberships.pending?/1","doc":"","ref":"Plausible.Site.Memberships.html#pending?/1"},{"type":"function","title":"Plausible.Site.Memberships.pending_ownerships?/1","doc":"","ref":"Plausible.Site.Memberships.html#pending_ownerships?/1"},{"type":"function","title":"Plausible.Site.Memberships.reject_invitation/2","doc":"","ref":"Plausible.Site.Memberships.html#reject_invitation/2"},{"type":"function","title":"Plausible.Site.Memberships.remove_invitation/2","doc":"","ref":"Plausible.Site.Memberships.html#remove_invitation/2"},{"type":"function","title":"Plausible.Site.Memberships.transfer_ownership/2","doc":"","ref":"Plausible.Site.Memberships.html#transfer_ownership/2"},{"type":"module","title":"Plausible.Site.Memberships.AcceptInvitation","doc":"Service for accepting invitations, including ownership transfers.\n\nAccepting invitation accounts for the fact that it's possible\nthat accepting user has an existing membership for the site and\nacts permissively to not unnecessarily disrupt the flow while\nalso maintaining integrity of site memberships. This also applies\nto cases where users update their email address between issuing\nthe invitation and accepting it.","ref":"Plausible.Site.Memberships.AcceptInvitation.html"},{"type":"function","title":"Plausible.Site.Memberships.AcceptInvitation.accept_invitation/2","doc":"","ref":"Plausible.Site.Memberships.AcceptInvitation.html#accept_invitation/2"},{"type":"function","title":"Plausible.Site.Memberships.AcceptInvitation.transfer_ownership/2","doc":"","ref":"Plausible.Site.Memberships.AcceptInvitation.html#transfer_ownership/2"},{"type":"module","title":"Plausible.Site.Memberships.CreateInvitation","doc":"Service for inviting new or existing users to a sites, including ownershhip\ntransfers.","ref":"Plausible.Site.Memberships.CreateInvitation.html"},{"type":"function","title":"Plausible.Site.Memberships.CreateInvitation.bulk_create_invitation/5","doc":"","ref":"Plausible.Site.Memberships.CreateInvitation.html#bulk_create_invitation/5"},{"type":"function","title":"Plausible.Site.Memberships.CreateInvitation.bulk_transfer_ownership_direct/2","doc":"","ref":"Plausible.Site.Memberships.CreateInvitation.html#bulk_transfer_ownership_direct/2"},{"type":"function","title":"Plausible.Site.Memberships.CreateInvitation.create_invitation/4","doc":"Invites a new team member to the given site. Returns a\n%Plausible.Auth.Invitation{} struct and sends the invitee an email to accept\nthis invitation.\n\nThe inviter must have enough permissions to invite the new team member,\notherwise this function returns `{:error, :forbidden}`.\n\nIf the new team member role is `:owner`, this function handles the invitation\nas an ownership transfer and requires the inviter to be the owner of the site.","ref":"Plausible.Site.Memberships.CreateInvitation.html#create_invitation/4"},{"type":"type","title":"Plausible.Site.Memberships.CreateInvitation.invite_error/0","doc":"","ref":"Plausible.Site.Memberships.CreateInvitation.html#t:invite_error/0"},{"type":"module","title":"Plausible.Site.Memberships.RejectInvitation","doc":"Service for rejecting invitations.","ref":"Plausible.Site.Memberships.RejectInvitation.html"},{"type":"function","title":"Plausible.Site.Memberships.RejectInvitation.reject_invitation/2","doc":"","ref":"Plausible.Site.Memberships.RejectInvitation.html#reject_invitation/2"},{"type":"module","title":"Plausible.Site.Memberships.RemoveInvitation","doc":"Service for removing invitations.","ref":"Plausible.Site.Memberships.RemoveInvitation.html"},{"type":"function","title":"Plausible.Site.Memberships.RemoveInvitation.remove_invitation/2","doc":"","ref":"Plausible.Site.Memberships.RemoveInvitation.html#remove_invitation/2"},{"type":"module","title":"Plausible.Site.MonthlyReport","doc":"","ref":"Plausible.Site.MonthlyReport.html"},{"type":"function","title":"Plausible.Site.MonthlyReport.add_recipient/2","doc":"","ref":"Plausible.Site.MonthlyReport.html#add_recipient/2"},{"type":"function","title":"Plausible.Site.MonthlyReport.changeset/2","doc":"","ref":"Plausible.Site.MonthlyReport.html#changeset/2"},{"type":"function","title":"Plausible.Site.MonthlyReport.remove_recipient/2","doc":"","ref":"Plausible.Site.MonthlyReport.html#remove_recipient/2"},{"type":"module","title":"Plausible.Site.Removal","doc":"A site deletion service stub.","ref":"Plausible.Site.Removal.html"},{"type":"function","title":"Plausible.Site.Removal.run/1","doc":"","ref":"Plausible.Site.Removal.html#run/1"},{"type":"module","title":"Plausible.Site.SharedLink","doc":"","ref":"Plausible.Site.SharedLink.html"},{"type":"function","title":"Plausible.Site.SharedLink.changeset/2","doc":"","ref":"Plausible.Site.SharedLink.html#changeset/2"},{"type":"type","title":"Plausible.Site.SharedLink.t/0","doc":"","ref":"Plausible.Site.SharedLink.html#t:t/0"},{"type":"module","title":"Plausible.Site.SpikeNotification","doc":"","ref":"Plausible.Site.SpikeNotification.html"},{"type":"function","title":"Plausible.Site.SpikeNotification.add_recipient/2","doc":"","ref":"Plausible.Site.SpikeNotification.html#add_recipient/2"},{"type":"function","title":"Plausible.Site.SpikeNotification.changeset/2","doc":"","ref":"Plausible.Site.SpikeNotification.html#changeset/2"},{"type":"function","title":"Plausible.Site.SpikeNotification.remove_recipient/2","doc":"","ref":"Plausible.Site.SpikeNotification.html#remove_recipient/2"},{"type":"function","title":"Plausible.Site.SpikeNotification.was_sent/1","doc":"","ref":"Plausible.Site.SpikeNotification.html#was_sent/1"},{"type":"module","title":"Plausible.Site.UserPreference","doc":"User-specific site preferences schema","ref":"Plausible.Site.UserPreference.html"},{"type":"function","title":"Plausible.Site.UserPreference.changeset/3","doc":"","ref":"Plausible.Site.UserPreference.html#changeset/3"},{"type":"macro","title":"Plausible.Site.UserPreference.options/0","doc":"","ref":"Plausible.Site.UserPreference.html#options/0"},{"type":"type","title":"Plausible.Site.UserPreference.t/0","doc":"","ref":"Plausible.Site.UserPreference.html#t:t/0"},{"type":"module","title":"Plausible.Site.WeeklyReport","doc":"","ref":"Plausible.Site.WeeklyReport.html"},{"type":"function","title":"Plausible.Site.WeeklyReport.add_recipient/2","doc":"","ref":"Plausible.Site.WeeklyReport.html#add_recipient/2"},{"type":"function","title":"Plausible.Site.WeeklyReport.changeset/2","doc":"","ref":"Plausible.Site.WeeklyReport.html#changeset/2"},{"type":"function","title":"Plausible.Site.WeeklyReport.remove_recipient/2","doc":"","ref":"Plausible.Site.WeeklyReport.html#remove_recipient/2"},{"type":"module","title":"Plausible.SiteAdmin","doc":"","ref":"Plausible.SiteAdmin.html"},{"type":"function","title":"Plausible.SiteAdmin.create_changeset/2","doc":"","ref":"Plausible.SiteAdmin.html#create_changeset/2"},{"type":"function","title":"Plausible.SiteAdmin.custom_index_query/3","doc":"","ref":"Plausible.SiteAdmin.html#custom_index_query/3"},{"type":"function","title":"Plausible.SiteAdmin.form_fields/1","doc":"","ref":"Plausible.SiteAdmin.html#form_fields/1"},{"type":"function","title":"Plausible.SiteAdmin.get_struct_fields/1","doc":"","ref":"Plausible.SiteAdmin.html#get_struct_fields/1"},{"type":"function","title":"Plausible.SiteAdmin.index/1","doc":"","ref":"Plausible.SiteAdmin.html#index/1"},{"type":"function","title":"Plausible.SiteAdmin.list_actions/1","doc":"","ref":"Plausible.SiteAdmin.html#list_actions/1"},{"type":"function","title":"Plausible.SiteAdmin.ordering/1","doc":"","ref":"Plausible.SiteAdmin.html#ordering/1"},{"type":"function","title":"Plausible.SiteAdmin.search_fields/1","doc":"","ref":"Plausible.SiteAdmin.html#search_fields/1"},{"type":"function","title":"Plausible.SiteAdmin.update_changeset/2","doc":"","ref":"Plausible.SiteAdmin.html#update_changeset/2"},{"type":"module","title":"Plausible.Sites","doc":"Sites context functions.","ref":"Plausible.Sites.html"},{"type":"function","title":"Plausible.Sites.create/2","doc":"","ref":"Plausible.Sites.html#create/2"},{"type":"function","title":"Plausible.Sites.create_shared_link/3","doc":"","ref":"Plausible.Sites.html#create_shared_link/3"},{"type":"function","title":"Plausible.Sites.get_by_domain/1","doc":"","ref":"Plausible.Sites.html#get_by_domain/1"},{"type":"function","title":"Plausible.Sites.get_by_domain!/1","doc":"","ref":"Plausible.Sites.html#get_by_domain!/1"},{"type":"function","title":"Plausible.Sites.get_for_user/3","doc":"","ref":"Plausible.Sites.html#get_for_user/3"},{"type":"function","title":"Plausible.Sites.get_for_user!/3","doc":"","ref":"Plausible.Sites.html#get_for_user!/3"},{"type":"function","title":"Plausible.Sites.has_admin_access?/2","doc":"","ref":"Plausible.Sites.html#has_admin_access?/2"},{"type":"function","title":"Plausible.Sites.has_goals?/1","doc":"","ref":"Plausible.Sites.html#has_goals?/1"},{"type":"function","title":"Plausible.Sites.has_stats?/1","doc":"","ref":"Plausible.Sites.html#has_stats?/1"},{"type":"function","title":"Plausible.Sites.is_member?/2","doc":"","ref":"Plausible.Sites.html#is_member?/2"},{"type":"function","title":"Plausible.Sites.list/3","doc":"","ref":"Plausible.Sites.html#list/3"},{"type":"function","title":"Plausible.Sites.list_with_invitations/3","doc":"","ref":"Plausible.Sites.html#list_with_invitations/3"},{"type":"function","title":"Plausible.Sites.locked?/1","doc":"","ref":"Plausible.Sites.html#locked?/1"},{"type":"function","title":"Plausible.Sites.owned_site_ids/1","doc":"","ref":"Plausible.Sites.html#owned_site_ids/1"},{"type":"function","title":"Plausible.Sites.owned_sites_count/1","doc":"","ref":"Plausible.Sites.html#owned_sites_count/1"},{"type":"function","title":"Plausible.Sites.owned_sites_domains/1","doc":"","ref":"Plausible.Sites.html#owned_sites_domains/1"},{"type":"function","title":"Plausible.Sites.role/2","doc":"","ref":"Plausible.Sites.html#role/2"},{"type":"function","title":"Plausible.Sites.set_option/4","doc":"","ref":"Plausible.Sites.html#set_option/4"},{"type":"function","title":"Plausible.Sites.shared_link_url/2","doc":"","ref":"Plausible.Sites.html#shared_link_url/2"},{"type":"function","title":"Plausible.Sites.stats_start_date/1","doc":"Returns the date of the first event of the given site, or `nil` if the site\ndoes not have stats yet.\n\nIf this is the first time the function is called for the site, it queries\nClickhouse and saves the date in the sites table.","ref":"Plausible.Sites.html#stats_start_date/1"},{"type":"function","title":"Plausible.Sites.toggle_pin/2","doc":"","ref":"Plausible.Sites.html#toggle_pin/2"},{"type":"type","title":"Plausible.Sites.list_opt/0","doc":"","ref":"Plausible.Sites.html#t:list_opt/0"},{"type":"module","title":"Plausible.Stats","doc":"","ref":"Plausible.Stats.html"},{"type":"function","title":"Plausible.Stats.aggregate/3","doc":"","ref":"Plausible.Stats.html#aggregate/3"},{"type":"function","title":"Plausible.Stats.breakdown/5","doc":"","ref":"Plausible.Stats.html#breakdown/5"},{"type":"function","title":"Plausible.Stats.current_visitors/1","doc":"","ref":"Plausible.Stats.html#current_visitors/1"},{"type":"function","title":"Plausible.Stats.filter_suggestions/4","doc":"","ref":"Plausible.Stats.html#filter_suggestions/4"},{"type":"function","title":"Plausible.Stats.funnel/3","doc":"","ref":"Plausible.Stats.html#funnel/3"},{"type":"function","title":"Plausible.Stats.timeseries/3","doc":"","ref":"Plausible.Stats.html#timeseries/3"},{"type":"module","title":"Plausible.Stats.Aggregate","doc":"","ref":"Plausible.Stats.Aggregate.html"},{"type":"function","title":"Plausible.Stats.Aggregate.aggregate/3","doc":"","ref":"Plausible.Stats.Aggregate.html#aggregate/3"},{"type":"module","title":"Plausible.Stats.Base","doc":"","ref":"Plausible.Stats.Base.html"},{"type":"function","title":"Plausible.Stats.Base.apply_entry_prop_filter/3","doc":"","ref":"Plausible.Stats.Base.html#apply_entry_prop_filter/3"},{"type":"function","title":"Plausible.Stats.Base.base_event_query/2","doc":"","ref":"Plausible.Stats.Base.html#base_event_query/2"},{"type":"function","title":"Plausible.Stats.Base.dynamic_filter_condition/3","doc":"","ref":"Plausible.Stats.Base.html#dynamic_filter_condition/3"},{"type":"function","title":"Plausible.Stats.Base.filter_by_entry_props/2","doc":"","ref":"Plausible.Stats.Base.html#filter_by_entry_props/2"},{"type":"function","title":"Plausible.Stats.Base.filter_converted_sessions/3","doc":"","ref":"Plausible.Stats.Base.html#filter_converted_sessions/3"},{"type":"function","title":"Plausible.Stats.Base.page_regex/1","doc":"","ref":"Plausible.Stats.Base.html#page_regex/1"},{"type":"function","title":"Plausible.Stats.Base.query_events/2","doc":"","ref":"Plausible.Stats.Base.html#query_events/2"},{"type":"function","title":"Plausible.Stats.Base.query_sessions/2","doc":"","ref":"Plausible.Stats.Base.html#query_sessions/2"},{"type":"function","title":"Plausible.Stats.Base.select_event_metrics/2","doc":"","ref":"Plausible.Stats.Base.html#select_event_metrics/2"},{"type":"function","title":"Plausible.Stats.Base.select_session_metrics/3","doc":"","ref":"Plausible.Stats.Base.html#select_session_metrics/3"},{"type":"function","title":"Plausible.Stats.Base.utc_boundaries/2","doc":"","ref":"Plausible.Stats.Base.html#utc_boundaries/2"},{"type":"module","title":"Plausible.Stats.Breakdown","doc":"","ref":"Plausible.Stats.Breakdown.html"},{"type":"function","title":"Plausible.Stats.Breakdown.breakdown/5","doc":"","ref":"Plausible.Stats.Breakdown.html#breakdown/5"},{"type":"module","title":"Plausible.Stats.Clickhouse","doc":"","ref":"Plausible.Stats.Clickhouse.html"},{"type":"function","title":"Plausible.Stats.Clickhouse.current_visitors/2","doc":"","ref":"Plausible.Stats.Clickhouse.html#current_visitors/2"},{"type":"function","title":"Plausible.Stats.Clickhouse.empty_24h_visitors_hourly_intervals/2","doc":"","ref":"Plausible.Stats.Clickhouse.html#empty_24h_visitors_hourly_intervals/2"},{"type":"function","title":"Plausible.Stats.Clickhouse.has_pageviews?/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#has_pageviews?/1"},{"type":"function","title":"Plausible.Stats.Clickhouse.imported_pageview_count/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#imported_pageview_count/1"},{"type":"function","title":"Plausible.Stats.Clickhouse.last_24h_visitors_hourly_intervals/2","doc":"","ref":"Plausible.Stats.Clickhouse.html#last_24h_visitors_hourly_intervals/2"},{"type":"function","title":"Plausible.Stats.Clickhouse.pageview_start_date_local/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#pageview_start_date_local/1"},{"type":"function","title":"Plausible.Stats.Clickhouse.top_sources/6","doc":"","ref":"Plausible.Stats.Clickhouse.html#top_sources/6"},{"type":"function","title":"Plausible.Stats.Clickhouse.usage_breakdown/2","doc":"","ref":"Plausible.Stats.Clickhouse.html#usage_breakdown/2"},{"type":"module","title":"Plausible.Stats.Compare","doc":"","ref":"Plausible.Stats.Compare.html"},{"type":"function","title":"Plausible.Stats.Compare.calculate_change/3","doc":"","ref":"Plausible.Stats.Compare.html#calculate_change/3"},{"type":"function","title":"Plausible.Stats.Compare.percent_change/2","doc":"","ref":"Plausible.Stats.Compare.html#percent_change/2"},{"type":"module","title":"Plausible.Stats.Comparisons","doc":"This module provides functions for comparing query periods.\n\nIt allows you to compare a given period with a previous period or with the\nsame period from the previous year. For example, you can compare this month's\nmain graph with last month or with the same month from last year.","ref":"Plausible.Stats.Comparisons.html"},{"type":"function","title":"Plausible.Stats.Comparisons.compare/4","doc":"Generates a comparison query based on the source query and comparison mode.\n\nThe mode parameter specifies the type of comparison and can be one of the\nfollowing:\n\n * `\"previous_period\"` - shifts back the query by the same number of days the\n source query has.\n\n * `\"year_over_year\"` - shifts back the query by 1 year.\n\n * `\"custom\"` - compares the query using a custom date range. See options for\n more details.\n\nThe comparison query returned by the function has its end date restricted to\nthe current day. This can be overriden by the `now` option, described below.","ref":"Plausible.Stats.Comparisons.html#compare/4"},{"type":"function","title":"Options - Plausible.Stats.Comparisons.compare/4","doc":"* `:now` - a `NaiveDateTime` struct with the current date and time. This is\n optional and used for testing purposes.\n\n * `:from` - a ISO-8601 date string used when mode is `\"custom\"`.\n\n * `:to` - a ISO-8601 date string used when mode is `\"custom\"`. Must be\n after `from`.\n\n * `:match_day_of_week?` - determines whether the comparison query should be\n adjusted to match the day of the week of the source query. When this option\n is set to true, the comparison query is shifted to start on the same day of\n the week as the source query, rather than on the exact same date. For\n example, if the source query starts on Sunday, January 1st, 2023 and the\n `year_over_year` comparison query is configured to `match_day_of_week?`,\n it will be shifted to start on Sunday, January 2nd, 2022 instead of\n January 1st. Defaults to false.","ref":"Plausible.Stats.Comparisons.html#compare/4-options"},{"type":"type","title":"Plausible.Stats.Comparisons.mode/0","doc":"","ref":"Plausible.Stats.Comparisons.html#t:mode/0"},{"type":"module","title":"Plausible.Stats.CurrentVisitors","doc":"","ref":"Plausible.Stats.CurrentVisitors.html"},{"type":"function","title":"Plausible.Stats.CurrentVisitors.current_visitors/1","doc":"","ref":"Plausible.Stats.CurrentVisitors.html#current_visitors/1"},{"type":"module","title":"Plausible.Stats.CustomProps","doc":"Module for querying user defined 'custom properties'.","ref":"Plausible.Stats.CustomProps.html"},{"type":"function","title":"Plausible.Stats.CustomProps.fetch_prop_names/2","doc":"","ref":"Plausible.Stats.CustomProps.html#fetch_prop_names/2"},{"type":"function","title":"Plausible.Stats.CustomProps.maybe_allowed_props_only/2","doc":"","ref":"Plausible.Stats.CustomProps.html#maybe_allowed_props_only/2"},{"type":"function","title":"Plausible.Stats.CustomProps.props_for_all_event_names/2","doc":"Returns a breakdown of event names with all existing custom\nproperties for each event name.","ref":"Plausible.Stats.CustomProps.html#props_for_all_event_names/2"},{"type":"module","title":"Plausible.Stats.EmailReport","doc":"This module exposes a `get/2` function that returns a map\nof stats needed for email reports. These stats include:\n\n* Total pageviews\n* Unique visitors\n* Bounce rate\n* A list of Top 5 sources (excluding \"Direct / None\")\n* A list of Top 5 pages\n\nwhere total pageviews, unique visitors, and bounce rate\nalso include the change compared to previous period.","ref":"Plausible.Stats.EmailReport.html"},{"type":"function","title":"Plausible.Stats.EmailReport.get/2","doc":"","ref":"Plausible.Stats.EmailReport.html#get/2"},{"type":"module","title":"Plausible.Stats.FilterParser","doc":"A module for parsing filters used in stat queries.","ref":"Plausible.Stats.FilterParser.html"},{"type":"function","title":"Plausible.Stats.FilterParser.parse_filters/1","doc":"Parses different filter formats.\n\nDepending on the format and type of the `filters` argument, returns:\n\n * a decoded map, when `filters` is encoded JSON\n * a parsed filter map, when `filters` is a filter expression string\n * the same map, when `filters` is a map\n\nReturns an empty map when argument type is unexpected (e.g. `nil`).\n\n#","ref":"Plausible.Stats.FilterParser.html#parse_filters/1"},{"type":"function","title":"Examples: - Plausible.Stats.FilterParser.parse_filters/1","doc":"iex> FilterParser.parse_filters(\"{\\\"page\\\":\\\"/blog/**\\\"}\")\n %{\"page\" => \"/blog/**\"}\n\n iex> FilterParser.parse_filters(\"visit:browser!=Chrome\")\n %{\"visit:browser\" => {:is_not, \"Chrome\"}}\n\n iex> FilterParser.parse_filters(nil)\n %{}","ref":"Plausible.Stats.FilterParser.html#parse_filters/1-examples"},{"type":"module","title":"Plausible.Stats.FilterSuggestions","doc":"","ref":"Plausible.Stats.FilterSuggestions.html"},{"type":"function","title":"Plausible.Stats.FilterSuggestions.filter_suggestions/4","doc":"","ref":"Plausible.Stats.FilterSuggestions.html#filter_suggestions/4"},{"type":"module","title":"Plausible.Stats.Filters","doc":"","ref":"Plausible.Stats.Filters.html"},{"type":"function","title":"Plausible.Stats.Filters.add_prefix/1","doc":"","ref":"Plausible.Stats.Filters.html#add_prefix/1"},{"type":"function","title":"Plausible.Stats.Filters.visit_props/0","doc":"","ref":"Plausible.Stats.Filters.html#visit_props/0"},{"type":"module","title":"Plausible.Stats.Fragments","doc":"","ref":"Plausible.Stats.Fragments.html"},{"type":"macro","title":"Plausible.Stats.Fragments.bounce_rate/0","doc":"","ref":"Plausible.Stats.Fragments.html#bounce_rate/0"},{"type":"macro","title":"Plausible.Stats.Fragments.coalesce_string/2","doc":"","ref":"Plausible.Stats.Fragments.html#coalesce_string/2"},{"type":"macro","title":"Plausible.Stats.Fragments.sample_percent/0","doc":"","ref":"Plausible.Stats.Fragments.html#sample_percent/0"},{"type":"macro","title":"Plausible.Stats.Fragments.to_timezone/2","doc":"Converts time or date and time to the specified timezone.\n\nReference: https://clickhouse.com/docs/en/sql-reference/functions/date-time-functions/#totimezone","ref":"Plausible.Stats.Fragments.html#to_timezone/2"},{"type":"macro","title":"Plausible.Stats.Fragments.total/0","doc":"","ref":"Plausible.Stats.Fragments.html#total/0"},{"type":"macro","title":"Plausible.Stats.Fragments.uniq/1","doc":"","ref":"Plausible.Stats.Fragments.html#uniq/1"},{"type":"macro","title":"Plausible.Stats.Fragments.visit_duration/0","doc":"","ref":"Plausible.Stats.Fragments.html#visit_duration/0"},{"type":"macro","title":"Plausible.Stats.Fragments.weekstart_not_before/2","doc":"Returns the weekstart for `date`. If the weekstart is before the `not_before`\nboundary, `not_before` is returned.","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/2"},{"type":"macro","title":"Examples - Plausible.Stats.Fragments.weekstart_not_before/2","doc":"In this pseudo-code example, the fragment returns the weekstart. The\n`not_before` boundary is set to the past Saturday, which is before the\nweekstart, therefore the cap does not apply.\n\n iex> this_wednesday = ~D[2022-11-09]\n ...> past_saturday = ~D[2022-11-05]\n ...> weekstart_not_before(this_wednesday, past_saturday)\n ~D[2022-11-07]\n\n\nIn this other example, the fragment returns Tuesday and not the weekstart.\nThe `not_before` boundary is set to Tuesday, which is past the weekstart,\ntherefore the cap applies.\n\n iex> this_wednesday = ~D[2022-11-09]\n ...> this_tuesday = ~D[2022-11-08]\n ...> weekstart_not_before(this_wednesday, this_tuesday)\n ~D[2022-11-08]","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/2-examples"},{"type":"macro","title":"Plausible.Stats.Fragments.weekstart_not_before/3","doc":"Same as Plausible.Stats.Fragments.weekstart_not_before/2 but converts dates to\nthe specified timezone.","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/3"},{"type":"module","title":"Plausible.Stats.Funnel","doc":"Module responsible for funnel evaluation, i.e. building and executing\nClickHouse funnel query based on `Plausible.Funnel` definition.","ref":"Plausible.Stats.Funnel.html"},{"type":"function","title":"Plausible.Stats.Funnel.funnel/3","doc":"","ref":"Plausible.Stats.Funnel.html#funnel/3"},{"type":"module","title":"Plausible.Stats.Goal.Revenue","doc":"Revenue specific functions for the stats scope","ref":"Plausible.Stats.Goal.Revenue.html"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.average_revenue_query/1","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#average_revenue_query/1"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.cast_revenue_metrics_to_money/2","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#cast_revenue_metrics_to_money/2"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.get_revenue_tracking_currency/3","doc":"Returns the common currency for the goal filters in a query. If there are no\ngoal filters, multiple currencies or the site owner does not have access to\nrevenue goals, `nil` is returned and revenue metrics are dropped.\n\nAggregating revenue data works only for same currency goals. If the query is\nfiltered by goals with different currencies, for example, one USD and other\nEUR, revenue metrics are dropped.","ref":"Plausible.Stats.Goal.Revenue.html#get_revenue_tracking_currency/3"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.revenue_metrics/0","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#revenue_metrics/0"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.total_revenue_query/1","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#total_revenue_query/1"},{"type":"module","title":"Plausible.Stats.Imported","doc":"","ref":"Plausible.Stats.Imported.html"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported/5","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported/5"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_timeseries/4","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_timeseries/4"},{"type":"module","title":"Plausible.Stats.Interval","doc":"Collection of functions to work with intervals.\n\nThe interval of a query defines the granularity of the data. You can think of\nit as a `GROUP BY` clause. Possible values are `minute`, `hour`, `date`,\n`week`, and `month`.","ref":"Plausible.Stats.Interval.html"},{"type":"function","title":"Plausible.Stats.Interval.default_for_date_range/1","doc":"Returns the suggested interval for the given `Date.Range` struct.","ref":"Plausible.Stats.Interval.html#default_for_date_range/1"},{"type":"function","title":"Plausible.Stats.Interval.default_for_period/1","doc":"Returns the suggested interval for the given time period.","ref":"Plausible.Stats.Interval.html#default_for_period/1"},{"type":"function","title":"Plausible.Stats.Interval.list/0","doc":"","ref":"Plausible.Stats.Interval.html#list/0"},{"type":"function","title":"Plausible.Stats.Interval.valid?/1","doc":"","ref":"Plausible.Stats.Interval.html#valid?/1"},{"type":"function","title":"Plausible.Stats.Interval.valid_by_period/1","doc":"","ref":"Plausible.Stats.Interval.html#valid_by_period/1"},{"type":"function","title":"Plausible.Stats.Interval.valid_for_period?/3","doc":"Returns whether the given interval is valid for a time period.\n\nIntervals longer than periods are not supported, e.g. current month stats with\na month interval, or today stats with a week interval.\n\nThere are two dynamic states:\n* `custom` period is only applicable with `month` or `week` intervals,\n if the `opts[:from]` and `opts[:to]` range difference exceeds 12 months\n* `all` period's interval options depend on particular site's `stats_start_date`\n - daily interval is excluded if the all-time range exceeds 12 months","ref":"Plausible.Stats.Interval.html#valid_for_period?/3"},{"type":"type","title":"Plausible.Stats.Interval.opt/0","doc":"","ref":"Plausible.Stats.Interval.html#t:opt/0"},{"type":"type","title":"Plausible.Stats.Interval.opts/0","doc":"","ref":"Plausible.Stats.Interval.html#t:opts/0"},{"type":"type","title":"Plausible.Stats.Interval.t/0","doc":"","ref":"Plausible.Stats.Interval.html#t:t/0"},{"type":"module","title":"Plausible.Stats.Props","doc":"","ref":"Plausible.Stats.Props.html"},{"type":"function","title":"Plausible.Stats.Props.event_props/0","doc":"","ref":"Plausible.Stats.Props.html#event_props/0"},{"type":"function","title":"Plausible.Stats.Props.valid_prop?/1","doc":"","ref":"Plausible.Stats.Props.html#valid_prop?/1"},{"type":"module","title":"Plausible.Stats.Query","doc":"","ref":"Plausible.Stats.Query.html"},{"type":"function","title":"Plausible.Stats.Query.from/2","doc":"","ref":"Plausible.Stats.Query.html#from/2"},{"type":"function","title":"Plausible.Stats.Query.get_filter_by_prefix/2","doc":"","ref":"Plausible.Stats.Query.html#get_filter_by_prefix/2"},{"type":"function","title":"Plausible.Stats.Query.has_event_filters?/1","doc":"","ref":"Plausible.Stats.Query.html#has_event_filters?/1"},{"type":"function","title":"Plausible.Stats.Query.include_imported?/3","doc":"","ref":"Plausible.Stats.Query.html#include_imported?/3"},{"type":"function","title":"Plausible.Stats.Query.put_filter/3","doc":"","ref":"Plausible.Stats.Query.html#put_filter/3"},{"type":"function","title":"Plausible.Stats.Query.remove_event_filters/2","doc":"","ref":"Plausible.Stats.Query.html#remove_event_filters/2"},{"type":"function","title":"Plausible.Stats.Query.trace/1","doc":"","ref":"Plausible.Stats.Query.html#trace/1"},{"type":"type","title":"Plausible.Stats.Query.t/0","doc":"","ref":"Plausible.Stats.Query.html#t:t/0"},{"type":"module","title":"Plausible.Stats.Sampling","doc":"Sampling related functions","ref":"Plausible.Stats.Sampling.html"},{"type":"function","title":"Plausible.Stats.Sampling.add_query_hint/1","doc":"","ref":"Plausible.Stats.Sampling.html#add_query_hint/1"},{"type":"function","title":"Plausible.Stats.Sampling.add_query_hint/2","doc":"","ref":"Plausible.Stats.Sampling.html#add_query_hint/2"},{"type":"function","title":"Plausible.Stats.Sampling.put_threshold/2","doc":"","ref":"Plausible.Stats.Sampling.html#put_threshold/2"},{"type":"module","title":"Plausible.Stats.Timeseries","doc":"","ref":"Plausible.Stats.Timeseries.html"},{"type":"function","title":"Plausible.Stats.Timeseries.timeseries/3","doc":"","ref":"Plausible.Stats.Timeseries.html#timeseries/3"},{"type":"type","title":"Plausible.Stats.Timeseries.results/0","doc":"","ref":"Plausible.Stats.Timeseries.html#t:results/0"},{"type":"module","title":"Plausible.Stats.Util","doc":"Utilities for modifying stat results","ref":"Plausible.Stats.Util.html"},{"type":"function","title":"Plausible.Stats.Util.remove_internal_visits_metric/1","doc":"","ref":"Plausible.Stats.Util.html#remove_internal_visits_metric/1"},{"type":"function","title":"Plausible.Stats.Util.remove_internal_visits_metric/2","doc":"`__internal_visits` is fetched when querying bounce rate and visit duration, as it\nis needed to calculate these from imported data. This function removes that metric\nfrom all entries in the results list.","ref":"Plausible.Stats.Util.html#remove_internal_visits_metric/2"},{"type":"module","title":"Plausible.Test.Support.HTML","doc":"Floki wrappers to help make assertions about HTML/DOM structures","ref":"Plausible.Test.Support.HTML.html"},{"type":"function","title":"Plausible.Test.Support.HTML.class_of_element/2","doc":"","ref":"Plausible.Test.Support.HTML.html#class_of_element/2"},{"type":"function","title":"Plausible.Test.Support.HTML.element_exists?/2","doc":"","ref":"Plausible.Test.Support.HTML.html#element_exists?/2"},{"type":"function","title":"Plausible.Test.Support.HTML.find/2","doc":"","ref":"Plausible.Test.Support.HTML.html#find/2"},{"type":"function","title":"Plausible.Test.Support.HTML.form_exists?/2","doc":"","ref":"Plausible.Test.Support.HTML.html#form_exists?/2"},{"type":"function","title":"Plausible.Test.Support.HTML.name_of/1","doc":"","ref":"Plausible.Test.Support.HTML.html#name_of/1"},{"type":"function","title":"Plausible.Test.Support.HTML.submit_button/2","doc":"","ref":"Plausible.Test.Support.HTML.html#submit_button/2"},{"type":"function","title":"Plausible.Test.Support.HTML.text/1","doc":"","ref":"Plausible.Test.Support.HTML.html#text/1"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_attr/2","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/2"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_attr/3","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/3"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_element/2","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_element/2"},{"type":"module","title":"Plausible.Test.Support.HTTPMocker","doc":"Currently only supports post request, it's a drop-in replacement\nfor our exvcr usage that wasn't ever needed (e.g. we had no way to\nre-record the cassettes anyway).","ref":"Plausible.Test.Support.HTTPMocker.html"},{"type":"module","title":"Plausible.TestUtils","doc":"","ref":"Plausible.TestUtils.html"},{"type":"function","title":"Plausible.TestUtils.add_imported_data/1","doc":"","ref":"Plausible.TestUtils.html#add_imported_data/1"},{"type":"function","title":"Plausible.TestUtils.await_clickhouse_count/2","doc":"","ref":"Plausible.TestUtils.html#await_clickhouse_count/2"},{"type":"function","title":"Plausible.TestUtils.create_api_key/1","doc":"","ref":"Plausible.TestUtils.html#create_api_key/1"},{"type":"function","title":"Plausible.TestUtils.create_events/1","doc":"","ref":"Plausible.TestUtils.html#create_events/1"},{"type":"function","title":"Plausible.TestUtils.create_new_site/1","doc":"","ref":"Plausible.TestUtils.html#create_new_site/1"},{"type":"function","title":"Plausible.TestUtils.create_pageviews/1","doc":"","ref":"Plausible.TestUtils.html#create_pageviews/1"},{"type":"function","title":"Plausible.TestUtils.create_sessions/1","doc":"","ref":"Plausible.TestUtils.html#create_sessions/1"},{"type":"function","title":"Plausible.TestUtils.create_site/1","doc":"","ref":"Plausible.TestUtils.html#create_site/1"},{"type":"function","title":"Plausible.TestUtils.create_user/1","doc":"","ref":"Plausible.TestUtils.html#create_user/1"},{"type":"function","title":"Plausible.TestUtils.eventually/3","doc":"","ref":"Plausible.TestUtils.html#eventually/3"},{"type":"function","title":"Plausible.TestUtils.generate_usage_for/3","doc":"","ref":"Plausible.TestUtils.html#generate_usage_for/3"},{"type":"function","title":"Plausible.TestUtils.init_session/1","doc":"","ref":"Plausible.TestUtils.html#init_session/1"},{"type":"function","title":"Plausible.TestUtils.log_in/1","doc":"","ref":"Plausible.TestUtils.html#log_in/1"},{"type":"macro","title":"Plausible.TestUtils.patch_env/2","doc":"","ref":"Plausible.TestUtils.html#patch_env/2"},{"type":"function","title":"Plausible.TestUtils.populate_stats/1","doc":"","ref":"Plausible.TestUtils.html#populate_stats/1"},{"type":"function","title":"Plausible.TestUtils.populate_stats/2","doc":"","ref":"Plausible.TestUtils.html#populate_stats/2"},{"type":"function","title":"Plausible.TestUtils.random_ip/0","doc":"","ref":"Plausible.TestUtils.html#random_ip/0"},{"type":"function","title":"Plausible.TestUtils.relative_time/1","doc":"","ref":"Plausible.TestUtils.html#relative_time/1"},{"type":"macro","title":"Plausible.TestUtils.setup_patch_env/2","doc":"","ref":"Plausible.TestUtils.html#setup_patch_env/2"},{"type":"function","title":"Plausible.TestUtils.to_naive_truncate/1","doc":"","ref":"Plausible.TestUtils.html#to_naive_truncate/1"},{"type":"function","title":"Plausible.TestUtils.use_api_key/1","doc":"","ref":"Plausible.TestUtils.html#use_api_key/1"},{"type":"module","title":"Plausible.Themes","doc":"","ref":"Plausible.Themes.html"},{"type":"function","title":"Plausible.Themes.options/0","doc":"","ref":"Plausible.Themes.html#options/0"},{"type":"module","title":"Plausible.Timezones","doc":"","ref":"Plausible.Timezones.html"},{"type":"function","title":"Plausible.Timezones.options/1","doc":"","ref":"Plausible.Timezones.html#options/1"},{"type":"function","title":"Plausible.Timezones.to_date_in_timezone/2","doc":"","ref":"Plausible.Timezones.html#to_date_in_timezone/2"},{"type":"function","title":"Plausible.Timezones.to_utc_datetime/2","doc":"","ref":"Plausible.Timezones.html#to_utc_datetime/2"},{"type":"module","title":"Plausible.Users","doc":"User context","ref":"Plausible.Users.html"},{"type":"function","title":"Plausible.Users.accept_traffic_until/1","doc":"","ref":"Plausible.Users.html#accept_traffic_until/1"},{"type":"function","title":"Plausible.Users.allow_next_upgrade_override/1","doc":"","ref":"Plausible.Users.html#allow_next_upgrade_override/1"},{"type":"function","title":"Plausible.Users.has_email_code?/1","doc":"","ref":"Plausible.Users.html#has_email_code?/1"},{"type":"function","title":"Plausible.Users.maybe_reset_next_upgrade_override/1","doc":"","ref":"Plausible.Users.html#maybe_reset_next_upgrade_override/1"},{"type":"function","title":"Plausible.Users.update_accept_traffic_until/1","doc":"","ref":"Plausible.Users.html#update_accept_traffic_until/1"},{"type":"function","title":"Plausible.Users.with_subscription/1","doc":"","ref":"Plausible.Users.html#with_subscription/1"},{"type":"module","title":"Plausible.Workers.AcceptTrafficUntil","doc":"A worker meant to be run once a day that sends out e-mail notifications to site\nowners assuming:\n - their sites still receive traffic (i.e. have stats for yesterday)\n - `site.accept_traffic_until` is approaching either tomorrow or exactly in 7 days\n\nUsers having no sites or sites that receive no traffic, won't be notified.\nWe make a tiny effort here to make sure we send the same notification at most once a day.","ref":"Plausible.Workers.AcceptTrafficUntil.html"},{"type":"module","title":"Plausible.Workers.CheckUsage","doc":"","ref":"Plausible.Workers.CheckUsage.html"},{"type":"function","title":"Plausible.Workers.CheckUsage.check_enterprise_subscriber/2","doc":"","ref":"Plausible.Workers.CheckUsage.html#check_enterprise_subscriber/2"},{"type":"macro","title":"Plausible.Workers.CheckUsage.day_of_month/1","doc":"","ref":"Plausible.Workers.CheckUsage.html#day_of_month/1"},{"type":"function","title":"Plausible.Workers.CheckUsage.exceeds_last_two_usage_cycles?/2","doc":"","ref":"Plausible.Workers.CheckUsage.html#exceeds_last_two_usage_cycles?/2"},{"type":"macro","title":"Plausible.Workers.CheckUsage.last_day_of_month/1","doc":"","ref":"Plausible.Workers.CheckUsage.html#last_day_of_month/1"},{"type":"macro","title":"Plausible.Workers.CheckUsage.least/2","doc":"","ref":"Plausible.Workers.CheckUsage.html#least/2"},{"type":"macro","title":"Plausible.Workers.CheckUsage.yesterday/0","doc":"","ref":"Plausible.Workers.CheckUsage.html#yesterday/0"},{"type":"module","title":"Plausible.Workers.CleanInvitations","doc":"","ref":"Plausible.Workers.CleanInvitations.html"},{"type":"module","title":"Plausible.Workers.ExpireDomainChangeTransitions","doc":"Periodic worker that expires domain change transition period.\nOld domains are frozen for a given time, so users can still access them\nbefore redeploying their scripts and integrations.","ref":"Plausible.Workers.ExpireDomainChangeTransitions.html"},{"type":"module","title":"Plausible.Workers.ImportGoogleAnalytics","doc":"","ref":"Plausible.Workers.ImportGoogleAnalytics.html"},{"type":"function","title":"Plausible.Workers.ImportGoogleAnalytics.import_failed/1","doc":"","ref":"Plausible.Workers.ImportGoogleAnalytics.html#import_failed/1"},{"type":"module","title":"Plausible.Workers.LockSites","doc":"","ref":"Plausible.Workers.LockSites.html"},{"type":"module","title":"Plausible.Workers.NotifyAnnualRenewal","doc":"","ref":"Plausible.Workers.NotifyAnnualRenewal.html"},{"type":"function","title":"Plausible.Workers.NotifyAnnualRenewal.perform/1","doc":"Sends a notification at most 7 days and at least 1 day before the renewal of an annual subscription","ref":"Plausible.Workers.NotifyAnnualRenewal.html#perform/1"},{"type":"module","title":"Plausible.Workers.RotateSalts","doc":"","ref":"Plausible.Workers.RotateSalts.html"},{"type":"module","title":"Plausible.Workers.ScheduleEmailReports","doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html"},{"type":"function","title":"Plausible.Workers.ScheduleEmailReports.first_of_month_9am/1","doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html#first_of_month_9am/1"},{"type":"function","title":"Plausible.Workers.ScheduleEmailReports.monday_9am/1","doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html#monday_9am/1"},{"type":"function","title":"Plausible.Workers.ScheduleEmailReports.perform/1","doc":"Email reports should be sent on Monday at 9am according to the timezone\nof a site. This job runs every day at midnight to ensure that all sites\nhave a scheduled job for email reports.","ref":"Plausible.Workers.ScheduleEmailReports.html#perform/1"},{"type":"module","title":"Plausible.Workers.SendCheckStatsEmails","doc":"","ref":"Plausible.Workers.SendCheckStatsEmails.html"},{"type":"module","title":"Plausible.Workers.SendEmailReport","doc":"","ref":"Plausible.Workers.SendEmailReport.html"},{"type":"module","title":"Plausible.Workers.SendSiteSetupEmails","doc":"","ref":"Plausible.Workers.SendSiteSetupEmails.html"},{"type":"module","title":"Plausible.Workers.SendTrialNotifications","doc":"","ref":"Plausible.Workers.SendTrialNotifications.html"},{"type":"module","title":"Plausible.Workers.SpikeNotifier","doc":"","ref":"Plausible.Workers.SpikeNotifier.html"},{"type":"module","title":"PlausibleWeb","doc":"","ref":"PlausibleWeb.html"},{"type":"macro","title":"PlausibleWeb.__using__/1","doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"PlausibleWeb.html#__using__/1"},{"type":"function","title":"PlausibleWeb.channel/0","doc":"","ref":"PlausibleWeb.html#channel/0"},{"type":"function","title":"PlausibleWeb.controller/0","doc":"","ref":"PlausibleWeb.html#controller/0"},{"type":"function","title":"PlausibleWeb.live_view/1","doc":"","ref":"PlausibleWeb.html#live_view/1"},{"type":"function","title":"PlausibleWeb.open_api_schema/0","doc":"","ref":"PlausibleWeb.html#open_api_schema/0"},{"type":"function","title":"PlausibleWeb.plugins_api_controller/0","doc":"","ref":"PlausibleWeb.html#plugins_api_controller/0"},{"type":"function","title":"PlausibleWeb.plugins_api_view/0","doc":"","ref":"PlausibleWeb.html#plugins_api_view/0"},{"type":"function","title":"PlausibleWeb.router/0","doc":"","ref":"PlausibleWeb.html#router/0"},{"type":"function","title":"PlausibleWeb.view/0","doc":"","ref":"PlausibleWeb.html#view/0"},{"type":"module","title":"PlausibleWeb.AdminController","doc":"","ref":"PlausibleWeb.AdminController.html"},{"type":"function","title":"PlausibleWeb.AdminController.usage/2","doc":"","ref":"PlausibleWeb.AdminController.html#usage/2"},{"type":"module","title":"PlausibleWeb.Api.ExternalController","doc":"","ref":"PlausibleWeb.Api.ExternalController.html"},{"type":"function","title":"PlausibleWeb.Api.ExternalController.error/2","doc":"","ref":"PlausibleWeb.Api.ExternalController.html#error/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalController.event/2","doc":"","ref":"PlausibleWeb.Api.ExternalController.html#event/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalController.health/2","doc":"","ref":"PlausibleWeb.Api.ExternalController.html#health/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalController.info/2","doc":"","ref":"PlausibleWeb.Api.ExternalController.html#info/2"},{"type":"module","title":"PlausibleWeb.Api.ExternalSitesController","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.create_site/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#create_site/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.delete_goal/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#delete_goal/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.delete_site/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#delete_site/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.find_or_create_goal/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#find_or_create_goal/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.find_or_create_shared_link/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#find_or_create_shared_link/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.get_site/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#get_site/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.update_site/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#update_site/2"},{"type":"module","title":"PlausibleWeb.Api.ExternalStatsController","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html"},{"type":"function","title":"PlausibleWeb.Api.ExternalStatsController.aggregate/2","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#aggregate/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalStatsController.breakdown/2","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#breakdown/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalStatsController.realtime_visitors/2","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#realtime_visitors/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalStatsController.timeseries/2","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#timeseries/2"},{"type":"module","title":"PlausibleWeb.Api.Helpers","doc":"","ref":"PlausibleWeb.Api.Helpers.html"},{"type":"function","title":"PlausibleWeb.Api.Helpers.bad_request/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#bad_request/2"},{"type":"function","title":"PlausibleWeb.Api.Helpers.not_found/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#not_found/2"},{"type":"function","title":"PlausibleWeb.Api.Helpers.payment_required/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#payment_required/2"},{"type":"function","title":"PlausibleWeb.Api.Helpers.too_many_requests/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#too_many_requests/2"},{"type":"function","title":"PlausibleWeb.Api.Helpers.unauthorized/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#unauthorized/2"},{"type":"module","title":"PlausibleWeb.Api.InternalController","doc":"","ref":"PlausibleWeb.Api.InternalController.html"},{"type":"function","title":"PlausibleWeb.Api.InternalController.disable_feature/2","doc":"","ref":"PlausibleWeb.Api.InternalController.html#disable_feature/2"},{"type":"function","title":"PlausibleWeb.Api.InternalController.domain_status/2","doc":"","ref":"PlausibleWeb.Api.InternalController.html#domain_status/2"},{"type":"function","title":"PlausibleWeb.Api.InternalController.sites/2","doc":"","ref":"PlausibleWeb.Api.InternalController.html#sites/2"},{"type":"module","title":"PlausibleWeb.Api.PaddleController","doc":"","ref":"PlausibleWeb.Api.PaddleController.html"},{"type":"function","title":"PlausibleWeb.Api.PaddleController.verified_signature?/1","doc":"","ref":"PlausibleWeb.Api.PaddleController.html#verified_signature?/1"},{"type":"function","title":"PlausibleWeb.Api.PaddleController.verify_signature/2","doc":"","ref":"PlausibleWeb.Api.PaddleController.html#verify_signature/2"},{"type":"function","title":"PlausibleWeb.Api.PaddleController.webhook/2","doc":"","ref":"PlausibleWeb.Api.PaddleController.html#webhook/2"},{"type":"module","title":"PlausibleWeb.Api.StatsController","doc":"","ref":"PlausibleWeb.Api.StatsController.html"},{"type":"function","title":"PlausibleWeb.Api.StatsController.all_custom_prop_values/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#all_custom_prop_values/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.browser_versions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#browser_versions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.browsers/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#browsers/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.cities/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#cities/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.conversions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#conversions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.countries/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#countries/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.current_visitors/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#current_visitors/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.custom_prop_values/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#custom_prop_values/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.entry_pages/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#entry_pages/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.exit_pages/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#exit_pages/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.filter_suggestions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#filter_suggestions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.format_money/1","doc":"","ref":"PlausibleWeb.Api.StatsController.html#format_money/1"},{"type":"function","title":"PlausibleWeb.Api.StatsController.format_revenue_metric/1","doc":"","ref":"PlausibleWeb.Api.StatsController.html#format_revenue_metric/1"},{"type":"function","title":"PlausibleWeb.Api.StatsController.funnel/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#funnel/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.main_graph/2","doc":"Returns a time-series based on given parameters.","ref":"PlausibleWeb.Api.StatsController.html#main_graph/2"},{"type":"function","title":"Parameters - PlausibleWeb.Api.StatsController.main_graph/2","doc":"This API accepts the following parameters:\n\n * `period` - x-axis of the graph, e.g. `12mo`, `day`, `custom`.\n\n * `metric` - y-axis of the graph, e.g. `visits`, `visitors`, `pageviews`.\n See the Stats API [\"Metrics\"](https://plausible.io/docs/stats-api#metrics)\n section for more details. Defaults to `visitors`.\n\n * `interval` - granularity of the time-series data. You can think of it as\n a `GROUP BY` clause. Possible values are `minute`, `hour`, `date`, `week`,\n and `month`. The default depends on the `period` parameter. Check\n `Plausible.Query.from/2` for each default.\n\n * `filters` - optional filters to drill down data. See the Stats API\n [\"Filtering\"](https://plausible.io/docs/stats-api#filtering) section for\n more details.\n\n * `with_imported` - boolean indicating whether to include Google Analytics\n imported data or not. Defaults to `false`.\n\nFull example:\n```elixir\n%{\n \"from\" => \"2021-09-06\",\n \"interval\" => \"month\",\n \"metric\" => \"visitors\",\n \"period\" => \"custom\",\n \"to\" => \"2021-12-13\"\n}\n```","ref":"PlausibleWeb.Api.StatsController.html#main_graph/2-parameters"},{"type":"function","title":"Response - PlausibleWeb.Api.StatsController.main_graph/2","doc":"Returns a map with the following keys:\n\n * `plot` - list of values for the requested metric representing the y-axis\n of the graph.\n\n * `labels` - list of date times representing the x-axis of the graph.\n\n * `present_index` - index of the element representing the current date in\n `labels` and `plot` lists.\n\n * `interval` - the interval used for querying.\n\n * `with_imported` - boolean indicating whether the Google Analytics data\n was queried or not.\n\n * `imported_source` - the source of the imported data, when applicable.\n Currently only Google Analytics is supported.\n\n * `full_intervals` - map of dates indicating whether the interval has been\n cut off by the requested date range or not. For example, if looking at a\n month week-by-week, some weeks may be cut off by the month boundaries.\n It's useful to adjust the graph display slightly in case the interval is\n not 'full' so that the user understands why the numbers might be lower for\n those partial periods.\n\nFull example:\n```elixir\n%{\n \"full_intervals\" => %{\n \"2021-09-01\" => false,\n \"2021-10-01\" => true,\n \"2021-11-01\" => true,\n \"2021-12-01\" => false\n },\n \"imported_source\" => nil,\n \"interval\" => \"month\",\n \"labels\" => [\"2021-09-01\", \"2021-10-01\", \"2021-11-01\", \"2021-12-01\"],\n \"plot\" => [0, 0, 0, 0],\n \"present_index\" => nil,\n \"with_imported\" => false\n}\n```","ref":"PlausibleWeb.Api.StatsController.html#main_graph/2-response"},{"type":"function","title":"PlausibleWeb.Api.StatsController.operating_system_versions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#operating_system_versions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.operating_systems/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#operating_systems/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.pages/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#pages/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.referrer_drilldown/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#referrer_drilldown/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.referrers/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#referrers/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.regions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#regions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.screen_sizes/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#screen_sizes/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.sources/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#sources/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.top_stats/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#top_stats/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_campaigns/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_campaigns/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_contents/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_contents/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_mediums/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_mediums/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_sources/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_sources/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_terms/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_terms/2"},{"type":"module","title":"PlausibleWeb.AuthController","doc":"","ref":"PlausibleWeb.AuthController.html"},{"type":"function","title":"PlausibleWeb.AuthController.activate/2","doc":"","ref":"PlausibleWeb.AuthController.html#activate/2"},{"type":"function","title":"PlausibleWeb.AuthController.activate_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#activate_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.cancel_update_email/2","doc":"","ref":"PlausibleWeb.AuthController.html#cancel_update_email/2"},{"type":"function","title":"PlausibleWeb.AuthController.create_api_key/2","doc":"","ref":"PlausibleWeb.AuthController.html#create_api_key/2"},{"type":"function","title":"PlausibleWeb.AuthController.delete_api_key/2","doc":"","ref":"PlausibleWeb.AuthController.html#delete_api_key/2"},{"type":"function","title":"PlausibleWeb.AuthController.delete_me/2","doc":"","ref":"PlausibleWeb.AuthController.html#delete_me/2"},{"type":"function","title":"PlausibleWeb.AuthController.disable_2fa/2","doc":"","ref":"PlausibleWeb.AuthController.html#disable_2fa/2"},{"type":"function","title":"PlausibleWeb.AuthController.generate_2fa_recovery_codes/2","doc":"","ref":"PlausibleWeb.AuthController.html#generate_2fa_recovery_codes/2"},{"type":"function","title":"PlausibleWeb.AuthController.google_auth_callback/2","doc":"","ref":"PlausibleWeb.AuthController.html#google_auth_callback/2"},{"type":"function","title":"PlausibleWeb.AuthController.initiate_2fa_setup/2","doc":"","ref":"PlausibleWeb.AuthController.html#initiate_2fa_setup/2"},{"type":"function","title":"PlausibleWeb.AuthController.login/2","doc":"","ref":"PlausibleWeb.AuthController.html#login/2"},{"type":"function","title":"PlausibleWeb.AuthController.login_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#login_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.logout/2","doc":"","ref":"PlausibleWeb.AuthController.html#logout/2"},{"type":"function","title":"PlausibleWeb.AuthController.new_api_key/2","doc":"","ref":"PlausibleWeb.AuthController.html#new_api_key/2"},{"type":"function","title":"PlausibleWeb.AuthController.password_reset/2","doc":"","ref":"PlausibleWeb.AuthController.html#password_reset/2"},{"type":"function","title":"PlausibleWeb.AuthController.password_reset_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.password_reset_request/2","doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_request/2"},{"type":"function","title":"PlausibleWeb.AuthController.password_reset_request_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_request_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.register/2","doc":"","ref":"PlausibleWeb.AuthController.html#register/2"},{"type":"function","title":"PlausibleWeb.AuthController.register_from_invitation/2","doc":"","ref":"PlausibleWeb.AuthController.html#register_from_invitation/2"},{"type":"function","title":"PlausibleWeb.AuthController.request_activation_code/2","doc":"","ref":"PlausibleWeb.AuthController.html#request_activation_code/2"},{"type":"function","title":"PlausibleWeb.AuthController.save_settings/2","doc":"","ref":"PlausibleWeb.AuthController.html#save_settings/2"},{"type":"function","title":"PlausibleWeb.AuthController.update_email/2","doc":"","ref":"PlausibleWeb.AuthController.html#update_email/2"},{"type":"function","title":"PlausibleWeb.AuthController.user_settings/2","doc":"","ref":"PlausibleWeb.AuthController.html#user_settings/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_recovery_code/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_recovery_code/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_recovery_code_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_recovery_code_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_setup/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_setup/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_setup_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_setup_form/2"},{"type":"module","title":"PlausibleWeb.AuthPlug","doc":"","ref":"PlausibleWeb.AuthPlug.html"},{"type":"function","title":"PlausibleWeb.AuthPlug.call/2","doc":"","ref":"PlausibleWeb.AuthPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.AuthPlug.init/1","doc":"","ref":"PlausibleWeb.AuthPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.AuthView","doc":"","ref":"PlausibleWeb.AuthView.html"},{"type":"function","title":"PlausibleWeb.AuthView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.AuthView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.AuthView.activate.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#activate.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.delimit_integer/1","doc":"","ref":"PlausibleWeb.AuthView.html#delimit_integer/1"},{"type":"function","title":"PlausibleWeb.AuthView.format_invoices/1","doc":"","ref":"PlausibleWeb.AuthView.html#format_invoices/1"},{"type":"function","title":"PlausibleWeb.AuthView.generate_2fa_recovery_codes.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#generate_2fa_recovery_codes.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.initiate_2fa_setup.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#initiate_2fa_setup.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.login_form.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#login_form.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.new_api_key.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#new_api_key.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.password_reset_form.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_form.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.password_reset_request_form.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_request_form.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.password_reset_request_success.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_request_success.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.present_subscription_status/1","doc":"","ref":"PlausibleWeb.AuthView.html#present_subscription_status/1"},{"type":"function","title":"PlausibleWeb.AuthView.register_success.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#register_success.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.AuthView.html#render/2"},{"type":"function","title":"PlausibleWeb.AuthView.subscription_colors/1","doc":"","ref":"PlausibleWeb.AuthView.html#subscription_colors/1"},{"type":"function","title":"PlausibleWeb.AuthView.subscription_interval/1","doc":"","ref":"PlausibleWeb.AuthView.html#subscription_interval/1"},{"type":"function","title":"PlausibleWeb.AuthView.subscription_quota/2","doc":"","ref":"PlausibleWeb.AuthView.html#subscription_quota/2"},{"type":"function","title":"PlausibleWeb.AuthView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.AuthView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.AuthView.user_settings.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#user_settings.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.verify_2fa.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#verify_2fa.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.verify_2fa_recovery_code.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#verify_2fa_recovery_code.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.verify_2fa_setup.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#verify_2fa_setup.html/1"},{"type":"module","title":"PlausibleWeb.AuthorizeSiteAccess","doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html"},{"type":"function","title":"PlausibleWeb.AuthorizeSiteAccess.call/2","doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html#call/2"},{"type":"function","title":"PlausibleWeb.AuthorizeSiteAccess.init/1","doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html#init/1"},{"type":"module","title":"PlausibleWeb.AuthorizeSitesApiPlug","doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html"},{"type":"function","title":"PlausibleWeb.AuthorizeSitesApiPlug.call/2","doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.AuthorizeSitesApiPlug.init/1","doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.AuthorizeStatsApiPlug","doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html"},{"type":"function","title":"PlausibleWeb.AuthorizeStatsApiPlug.call/2","doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.AuthorizeStatsApiPlug.init/1","doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.AvatarController","doc":"This module proxies requests to BASE_URL/avatar/:hash to www.gravatar.com/avatar/:hash.\n\nThe purpose is to make use of Gravatar's convenient avatar service without exposing information\nthat could be used for tracking the Plausible user. Compared to requesting the Gravatar directly\nfrom the browser, this proxy module protects the Plausible user from disclosing to Gravatar:\n1. The client IP address\n2. User-Agent\n3. Referer header which can be used to track which site the user is visiting (i.e. plausible.io or self-hosted URL)\n\nThe downside is the added latency from the request having to go through the Plausible server, rather than contacting the\nlocal CDN server operated by Gravatar's service.","ref":"PlausibleWeb.AvatarController.html"},{"type":"function","title":"PlausibleWeb.AvatarController.avatar/2","doc":"","ref":"PlausibleWeb.AvatarController.html#avatar/2"},{"type":"module","title":"PlausibleWeb.BillingController","doc":"","ref":"PlausibleWeb.BillingController.html"},{"type":"function","title":"PlausibleWeb.BillingController.change_plan/2","doc":"","ref":"PlausibleWeb.BillingController.html#change_plan/2"},{"type":"function","title":"PlausibleWeb.BillingController.change_plan_preview/2","doc":"","ref":"PlausibleWeb.BillingController.html#change_plan_preview/2"},{"type":"function","title":"PlausibleWeb.BillingController.choose_plan/2","doc":"","ref":"PlausibleWeb.BillingController.html#choose_plan/2"},{"type":"function","title":"PlausibleWeb.BillingController.ping_subscription/2","doc":"","ref":"PlausibleWeb.BillingController.html#ping_subscription/2"},{"type":"function","title":"PlausibleWeb.BillingController.upgrade_success/2","doc":"","ref":"PlausibleWeb.BillingController.html#upgrade_success/2"},{"type":"function","title":"PlausibleWeb.BillingController.upgrade_to_enterprise_plan/2","doc":"","ref":"PlausibleWeb.BillingController.html#upgrade_to_enterprise_plan/2"},{"type":"module","title":"PlausibleWeb.BillingView","doc":"","ref":"PlausibleWeb.BillingView.html"},{"type":"function","title":"PlausibleWeb.BillingView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.BillingView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.BillingView.change_enterprise_plan_contact_us.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#change_enterprise_plan_contact_us.html/1"},{"type":"function","title":"PlausibleWeb.BillingView.change_plan_preview.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#change_plan_preview.html/1"},{"type":"function","title":"PlausibleWeb.BillingView.choose_plan.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#choose_plan.html/1"},{"type":"function","title":"PlausibleWeb.BillingView.present_currency/1","doc":"","ref":"PlausibleWeb.BillingView.html#present_currency/1"},{"type":"function","title":"PlausibleWeb.BillingView.present_date/1","doc":"","ref":"PlausibleWeb.BillingView.html#present_date/1"},{"type":"function","title":"PlausibleWeb.BillingView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.BillingView.html#render/2"},{"type":"function","title":"PlausibleWeb.BillingView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.BillingView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.BillingView.upgrade_success.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#upgrade_success.html/1"},{"type":"function","title":"PlausibleWeb.BillingView.upgrade_to_enterprise_plan.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#upgrade_to_enterprise_plan.html/1"},{"type":"module","title":"PlausibleWeb.CRMAuthPlug","doc":"","ref":"PlausibleWeb.CRMAuthPlug.html"},{"type":"function","title":"PlausibleWeb.CRMAuthPlug.call/2","doc":"","ref":"PlausibleWeb.CRMAuthPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.CRMAuthPlug.init/1","doc":"","ref":"PlausibleWeb.CRMAuthPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.Captcha","doc":"","ref":"PlausibleWeb.Captcha.html"},{"type":"function","title":"PlausibleWeb.Captcha.enabled?/0","doc":"","ref":"PlausibleWeb.Captcha.html#enabled?/0"},{"type":"function","title":"PlausibleWeb.Captcha.sitekey/0","doc":"","ref":"PlausibleWeb.Captcha.html#sitekey/0"},{"type":"function","title":"PlausibleWeb.Captcha.verify/1","doc":"","ref":"PlausibleWeb.Captcha.html#verify/1"},{"type":"module","title":"PlausibleWeb.Components.Billing.PlanBenefits","doc":"This module exposes functions for rendering and returning plan\nbenefits for Growth, Business, and Enterprise plans.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html"},{"type":"function","title":"PlausibleWeb.Components.Billing.PlanBenefits.for_business/2","doc":"Returns Business benefits for the given Business plan.\n\nA second argument is also required - list of Growth benefits. This\nis because we don't want to list the same benefits in both Growth\nand Business. Everything in Growth is also included in Business.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#for_business/2"},{"type":"function","title":"PlausibleWeb.Components.Billing.PlanBenefits.for_enterprise/1","doc":"This function only takes a list of business benefits. Since all\nlimits and features of enterprise plans are configurable, we can\nsay on the upgrade page that enterprise plans include everything\nin Business.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#for_enterprise/1"},{"type":"function","title":"PlausibleWeb.Components.Billing.PlanBenefits.for_growth/1","doc":"This function takes a growth plan and returns a list representing\nthe different benefits a user gets when subscribing to this plan.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#for_growth/1"},{"type":"function","title":"PlausibleWeb.Components.Billing.PlanBenefits.render/1","doc":"This function takes a list of benefits returned by either one of:\n\n* `for_growth/1`\n* `for_business/2`\n* `for_enterprise/1`.\n\nand renders them as HTML.\n\nThe benefits in the given list can be either strings or functions\nreturning a Phoenix component. This allows, for example, to render\nlinks within the plan benefit text.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Billing.PlanBenefits.render/1","doc":"* `benefits` (`:list`) (required)\n* `class` (`:string`) - Defaults to `nil`.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#render/1-attributes"},{"type":"module","title":"PlausibleWeb.Components.Generic","doc":"Generic reusable components","ref":"PlausibleWeb.Components.Generic.html"},{"type":"function","title":"PlausibleWeb.Components.Generic.button/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.button/1","doc":"* `type` (`:string`) - Defaults to `\"button\"`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* `disabled` (`:boolean`) - Defaults to `false`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#button/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.button/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#button/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.button_link/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#button_link/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.button_link/1","doc":"* `href` (`:string`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#button_link/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.button_link/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#button_link/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.docs_info/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#docs_info/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.docs_info/1","doc":"* `slug` (`:string`) (required)","ref":"PlausibleWeb.Components.Generic.html#docs_info/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.Generic.dropdown/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#dropdown/1"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.dropdown/1","doc":"* `button` (required) - Accepts attributes:\n\n * `class` (`:string`)\n* `panel` (required) - Accepts attributes:\n\n * `class` (`:string`)","ref":"PlausibleWeb.Components.Generic.html#dropdown/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.dropdown_link/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#dropdown_link/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.dropdown_link/1","doc":"* `href` (`:string`) (required)\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#dropdown_link/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.dropdown_link/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#dropdown_link/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.notice/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#notice/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.notice/1","doc":"* `title` (`:any`) - Defaults to `nil`.\n* `size` (`:atom`) - Defaults to `:sm`.\n* `theme` (`:atom`) - Defaults to `:yellow`.\n* `dismissable_id` (`:any`) - Defaults to `nil`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#notice/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.notice/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#notice/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.spinner/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#spinner/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.spinner/1","doc":"* `class` (`:any`) - Defaults to `\"\"`.","ref":"PlausibleWeb.Components.Generic.html#spinner/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.Generic.styled_link/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#styled_link/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.styled_link/1","doc":"* `id` (`:any`) - Defaults to `nil`.\n* `href` (`:string`) (required)\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* `class` (`:string`) - Defaults to `\"\"`.","ref":"PlausibleWeb.Components.Generic.html#styled_link/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.styled_link/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#styled_link/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.unstyled_link/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#unstyled_link/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.unstyled_link/1","doc":"* `href` (`:string`) (required)\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* `id` (`:any`) - Defaults to `nil`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#unstyled_link/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.unstyled_link/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#unstyled_link/1-slots"},{"type":"module","title":"PlausibleWeb.Components.Google","doc":"Google-related components","ref":"PlausibleWeb.Components.Google.html"},{"type":"function","title":"PlausibleWeb.Components.Google.button/1","doc":"","ref":"PlausibleWeb.Components.Google.html#button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Google.button/1","doc":"* `to` (`:string`) (required)\n* `id` (`:string`) (required)","ref":"PlausibleWeb.Components.Google.html#button/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.Google.logo/1","doc":"","ref":"PlausibleWeb.Components.Google.html#logo/1"},{"type":"module","title":"PlausibleWeb.Components.Settings","doc":"An umbrella module for the Integrations settings section","ref":"PlausibleWeb.Components.Settings.html"},{"type":"function","title":"PlausibleWeb.Components.Settings.settings_google_import/1","doc":"","ref":"PlausibleWeb.Components.Settings.html#settings_google_import/1"},{"type":"function","title":"PlausibleWeb.Components.Settings.settings_search_console/1","doc":"","ref":"PlausibleWeb.Components.Settings.html#settings_search_console/1"},{"type":"module","title":"PlausibleWeb.Components.Site.Feature","doc":"Phoenix Component for rendering a user-facing feature toggle\ncapable of flipping booleans in `Plausible.Site` via the `toggle_feature` controller action.","ref":"PlausibleWeb.Components.Site.Feature.html"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Components.Site.Feature.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Components.Site.Feature.html#render/2"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.target/4","doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#target/4"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.Components.Site.Feature.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.toggle/1","doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#toggle/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Site.Feature.toggle/1","doc":"* `site` (`Plausible.Site`) (required)\n* `feature_mod` (`:atom`) (required) - Must be one of `Plausible.Billing.Feature.Goals`, `Plausible.Billing.Feature.StatsAPI`, `Plausible.Billing.Feature.Props`, `Plausible.Billing.Feature.Funnels`, or `Plausible.Billing.Feature.RevenueGoals`.\n* `conn` (`Plug.Conn`) (required)","ref":"PlausibleWeb.Components.Site.Feature.html#toggle/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Site.Feature.toggle/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Site.Feature.html#toggle/1-slots"},{"type":"module","title":"PlausibleWeb.Components.TwoFactor","doc":"Reusable components specific to 2FA","ref":"PlausibleWeb.Components.TwoFactor.html"},{"type":"function","title":"PlausibleWeb.Components.TwoFactor.modal/1","doc":"","ref":"PlausibleWeb.Components.TwoFactor.html#modal/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.TwoFactor.modal/1","doc":"* `id` (`:string`) (required)\n* `state_param` (`:string`) (required)\n* `form_data` (`:any`) (required)\n* `form_target` (`:string`) (required)\n* `onsubmit` (`:string`) - Defaults to `nil`.\n* `title` (`:string`) (required)","ref":"PlausibleWeb.Components.TwoFactor.html#modal/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.TwoFactor.modal/1","doc":"* `icon` (required)\n* `inner_block` (required)\n* `buttons` (required)","ref":"PlausibleWeb.Components.TwoFactor.html#modal/1-slots"},{"type":"function","title":"PlausibleWeb.Components.TwoFactor.qr_code/1","doc":"","ref":"PlausibleWeb.Components.TwoFactor.html#qr_code/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.TwoFactor.qr_code/1","doc":"* `text` (`:string`) (required)\n* `scale` (`:integer`) - Defaults to `4`.","ref":"PlausibleWeb.Components.TwoFactor.html#qr_code/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.TwoFactor.verify_2fa_input/1","doc":"","ref":"PlausibleWeb.Components.TwoFactor.html#verify_2fa_input/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.TwoFactor.verify_2fa_input/1","doc":"* `id` (`:string`) - Defaults to `\"verify-button\"`.\n* `form` (`:any`) (required)\n* `field` (`:any`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.","ref":"PlausibleWeb.Components.TwoFactor.html#verify_2fa_input/1-attributes"},{"type":"module","title":"PlausibleWeb.ConnCase","doc":"This module defines the test case to be used by\ntests that require setting up a connection.\n\nSuch tests rely on `Phoenix.ConnTest` and also\nimport other functionality to make it easier\nto build common data structures and query the data layer.\n\nFinally, if the test case interacts with the database,\nit cannot be async. For this reason, every test runs\ninside a transaction which is reset at the beginning\nof the test unless the test case is marked as async.","ref":"PlausibleWeb.ConnCase.html"},{"type":"module","title":"PlausibleWeb.ControllerHelpers","doc":"","ref":"PlausibleWeb.ControllerHelpers.html"},{"type":"function","title":"PlausibleWeb.ControllerHelpers.render_error/2","doc":"","ref":"PlausibleWeb.ControllerHelpers.html#render_error/2"},{"type":"function","title":"PlausibleWeb.ControllerHelpers.render_error/3","doc":"","ref":"PlausibleWeb.ControllerHelpers.html#render_error/3"},{"type":"module","title":"PlausibleWeb.Controllers.API.Revenue","doc":"Revenue specific functions for the API scope","ref":"PlausibleWeb.Controllers.API.Revenue.html"},{"type":"function","title":"PlausibleWeb.Controllers.API.Revenue.format_money/1","doc":"","ref":"PlausibleWeb.Controllers.API.Revenue.html#format_money/1"},{"type":"function","title":"PlausibleWeb.Controllers.API.Revenue.format_revenue_metric/1","doc":"","ref":"PlausibleWeb.Controllers.API.Revenue.html#format_revenue_metric/1"},{"type":"module","title":"PlausibleWeb.Dogfood","doc":"Plausible tracking itself functions","ref":"PlausibleWeb.Dogfood.html"},{"type":"function","title":"PlausibleWeb.Dogfood.api_destination/0","doc":"Temporary override to do more testing of the new ingest.plausible.io endpoint for accepting events. In staging and locally\nwill fall back to staging.plausible.io/api/event and localhost:8000/api/event respectively.","ref":"PlausibleWeb.Dogfood.html#api_destination/0"},{"type":"function","title":"PlausibleWeb.Dogfood.domain/1","doc":"","ref":"PlausibleWeb.Dogfood.html#domain/1"},{"type":"function","title":"PlausibleWeb.Dogfood.script_url/0","doc":"","ref":"PlausibleWeb.Dogfood.html#script_url/0"},{"type":"module","title":"PlausibleWeb.Email","doc":"","ref":"PlausibleWeb.Email.html"},{"type":"function","title":"PlausibleWeb.Email.activation_email/2","doc":"","ref":"PlausibleWeb.Email.html#activation_email/2"},{"type":"function","title":"PlausibleWeb.Email.approaching_accept_traffic_until/1","doc":"","ref":"PlausibleWeb.Email.html#approaching_accept_traffic_until/1"},{"type":"function","title":"PlausibleWeb.Email.approaching_accept_traffic_until_tomorrow/1","doc":"","ref":"PlausibleWeb.Email.html#approaching_accept_traffic_until_tomorrow/1"},{"type":"function","title":"PlausibleWeb.Email.base_email/0","doc":"","ref":"PlausibleWeb.Email.html#base_email/0"},{"type":"function","title":"PlausibleWeb.Email.base_email/1","doc":"","ref":"PlausibleWeb.Email.html#base_email/1"},{"type":"function","title":"PlausibleWeb.Email.cancellation_email/1","doc":"","ref":"PlausibleWeb.Email.html#cancellation_email/1"},{"type":"function","title":"PlausibleWeb.Email.check_stats_email/1","doc":"","ref":"PlausibleWeb.Email.html#check_stats_email/1"},{"type":"function","title":"PlausibleWeb.Email.create_site_email/1","doc":"","ref":"PlausibleWeb.Email.html#create_site_email/1"},{"type":"function","title":"PlausibleWeb.Email.dashboard_locked/3","doc":"","ref":"PlausibleWeb.Email.html#dashboard_locked/3"},{"type":"function","title":"PlausibleWeb.Email.enterprise_over_limit_internal_email/4","doc":"","ref":"PlausibleWeb.Email.html#enterprise_over_limit_internal_email/4"},{"type":"function","title":"PlausibleWeb.Email.error_report/3","doc":"","ref":"PlausibleWeb.Email.html#error_report/3"},{"type":"function","title":"PlausibleWeb.Email.existing_user_invitation/1","doc":"","ref":"PlausibleWeb.Email.html#existing_user_invitation/1"},{"type":"function","title":"PlausibleWeb.Email.import_failure/2","doc":"","ref":"PlausibleWeb.Email.html#import_failure/2"},{"type":"function","title":"PlausibleWeb.Email.import_success/2","doc":"","ref":"PlausibleWeb.Email.html#import_success/2"},{"type":"function","title":"PlausibleWeb.Email.invitation_accepted/1","doc":"","ref":"PlausibleWeb.Email.html#invitation_accepted/1"},{"type":"function","title":"PlausibleWeb.Email.invitation_rejected/1","doc":"","ref":"PlausibleWeb.Email.html#invitation_rejected/1"},{"type":"function","title":"PlausibleWeb.Email.mailer_email_from/0","doc":"","ref":"PlausibleWeb.Email.html#mailer_email_from/0"},{"type":"function","title":"PlausibleWeb.Email.new_user_invitation/1","doc":"","ref":"PlausibleWeb.Email.html#new_user_invitation/1"},{"type":"function","title":"PlausibleWeb.Email.over_limit_email/3","doc":"","ref":"PlausibleWeb.Email.html#over_limit_email/3"},{"type":"function","title":"PlausibleWeb.Email.ownership_transfer_accepted/1","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_accepted/1"},{"type":"function","title":"PlausibleWeb.Email.ownership_transfer_rejected/1","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_rejected/1"},{"type":"function","title":"PlausibleWeb.Email.ownership_transfer_request/2","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_request/2"},{"type":"function","title":"PlausibleWeb.Email.password_reset_email/2","doc":"","ref":"PlausibleWeb.Email.html#password_reset_email/2"},{"type":"function","title":"PlausibleWeb.Email.priority_email/0","doc":"Unlike the default 'base' emails, priority emails cannot be unsubscribed from. This is achieved\n by sending them through a dedicated 'priority' message stream in Postmark.","ref":"PlausibleWeb.Email.html#priority_email/0"},{"type":"function","title":"PlausibleWeb.Email.priority_email/1","doc":"","ref":"PlausibleWeb.Email.html#priority_email/1"},{"type":"function","title":"PlausibleWeb.Email.render/3","doc":"Render an Phoenix template and set the body on the email.\n\nPass an atom as the template name (:welcome_email) to render HTML *and* plain\ntext emails. Use a string if you only want to render one type, e.g.\n\"welcome_email.text\" or \"welcome_email.html\". Scroll to the top for more examples.","ref":"PlausibleWeb.Email.html#render/3"},{"type":"function","title":"PlausibleWeb.Email.site_member_removed/1","doc":"","ref":"PlausibleWeb.Email.html#site_member_removed/1"},{"type":"function","title":"PlausibleWeb.Email.site_setup_help/2","doc":"","ref":"PlausibleWeb.Email.html#site_setup_help/2"},{"type":"function","title":"PlausibleWeb.Email.site_setup_success/2","doc":"","ref":"PlausibleWeb.Email.html#site_setup_success/2"},{"type":"function","title":"PlausibleWeb.Email.spike_notification/5","doc":"","ref":"PlausibleWeb.Email.html#spike_notification/5"},{"type":"function","title":"PlausibleWeb.Email.stats_report/2","doc":"","ref":"PlausibleWeb.Email.html#stats_report/2"},{"type":"function","title":"PlausibleWeb.Email.trial_one_week_reminder/1","doc":"","ref":"PlausibleWeb.Email.html#trial_one_week_reminder/1"},{"type":"function","title":"PlausibleWeb.Email.trial_over_email/1","doc":"","ref":"PlausibleWeb.Email.html#trial_over_email/1"},{"type":"function","title":"PlausibleWeb.Email.trial_upgrade_email/3","doc":"","ref":"PlausibleWeb.Email.html#trial_upgrade_email/3"},{"type":"function","title":"PlausibleWeb.Email.two_factor_disabled_email/1","doc":"","ref":"PlausibleWeb.Email.html#two_factor_disabled_email/1"},{"type":"function","title":"PlausibleWeb.Email.two_factor_enabled_email/1","doc":"","ref":"PlausibleWeb.Email.html#two_factor_enabled_email/1"},{"type":"function","title":"PlausibleWeb.Email.welcome_email/1","doc":"","ref":"PlausibleWeb.Email.html#welcome_email/1"},{"type":"function","title":"PlausibleWeb.Email.yearly_expiration_notification/1","doc":"","ref":"PlausibleWeb.Email.html#yearly_expiration_notification/1"},{"type":"function","title":"PlausibleWeb.Email.yearly_renewal_notification/1","doc":"","ref":"PlausibleWeb.Email.html#yearly_renewal_notification/1"},{"type":"module","title":"PlausibleWeb.EmailView","doc":"","ref":"PlausibleWeb.EmailView.html"},{"type":"function","title":"PlausibleWeb.EmailView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.EmailView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.EmailView.activation_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#activation_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.approaching_accept_traffic_until.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#approaching_accept_traffic_until.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.cancellation_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#cancellation_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.check_stats_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#check_stats_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.create_site_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#create_site_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.dashboard_locked.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#dashboard_locked.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.date_format/1","doc":"","ref":"PlausibleWeb.EmailView.html#date_format/1"},{"type":"function","title":"PlausibleWeb.EmailView.enterprise_over_limit_internal.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#enterprise_over_limit_internal.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.error_report_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#error_report_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.existing_user_invitation.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#existing_user_invitation.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.google_analytics_import.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#google_analytics_import.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.greet_recipient/1","doc":"","ref":"PlausibleWeb.EmailView.html#greet_recipient/1"},{"type":"function","title":"PlausibleWeb.EmailView.invitation_accepted.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#invitation_accepted.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.invitation_rejected.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#invitation_rejected.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.new_user_invitation.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#new_user_invitation.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.over_limit.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#over_limit.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.ownership_transfer_accepted.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_accepted.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.ownership_transfer_rejected.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_rejected.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.ownership_transfer_request.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_request.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.password_reset_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#password_reset_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.plausible_url/0","doc":"","ref":"PlausibleWeb.EmailView.html#plausible_url/0"},{"type":"function","title":"PlausibleWeb.EmailView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.EmailView.html#render/2"},{"type":"function","title":"PlausibleWeb.EmailView.sentry_link/2","doc":"","ref":"PlausibleWeb.EmailView.html#sentry_link/2"},{"type":"function","title":"PlausibleWeb.EmailView.site_member_removed.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#site_member_removed.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.site_setup_help_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#site_setup_help_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.site_setup_success_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#site_setup_success_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.spike_notification.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#spike_notification.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.EmailView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.EmailView.trial_one_week_reminder.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#trial_one_week_reminder.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.trial_over_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#trial_over_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.trial_upgrade_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#trial_upgrade_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.two_factor_disabled_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#two_factor_disabled_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.two_factor_enabled_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#two_factor_enabled_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.welcome_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#welcome_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.yearly_expiration_notification.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#yearly_expiration_notification.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.yearly_renewal_notification.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#yearly_renewal_notification.html/1"},{"type":"module","title":"PlausibleWeb.Endpoint","doc":"","ref":"PlausibleWeb.Endpoint.html"},{"type":"function","title":"PlausibleWeb.Endpoint.broadcast/3","doc":"","ref":"PlausibleWeb.Endpoint.html#broadcast/3"},{"type":"function","title":"PlausibleWeb.Endpoint.broadcast!/3","doc":"","ref":"PlausibleWeb.Endpoint.html#broadcast!/3"},{"type":"function","title":"PlausibleWeb.Endpoint.broadcast_from/4","doc":"","ref":"PlausibleWeb.Endpoint.html#broadcast_from/4"},{"type":"function","title":"PlausibleWeb.Endpoint.broadcast_from!/4","doc":"","ref":"PlausibleWeb.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"PlausibleWeb.Endpoint.call/2","doc":"","ref":"PlausibleWeb.Endpoint.html#call/2"},{"type":"function","title":"PlausibleWeb.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"PlausibleWeb.Endpoint.html#child_spec/1"},{"type":"function","title":"PlausibleWeb.Endpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"PlausibleWeb.Endpoint.html#config/2"},{"type":"function","title":"PlausibleWeb.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"PlausibleWeb.Endpoint.html#config_change/2"},{"type":"function","title":"PlausibleWeb.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"PlausibleWeb.Endpoint.html#host/0"},{"type":"function","title":"PlausibleWeb.Endpoint.init/1","doc":"","ref":"PlausibleWeb.Endpoint.html#init/1"},{"type":"function","title":"PlausibleWeb.Endpoint.local_broadcast/3","doc":"","ref":"PlausibleWeb.Endpoint.html#local_broadcast/3"},{"type":"function","title":"PlausibleWeb.Endpoint.local_broadcast_from/4","doc":"","ref":"PlausibleWeb.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"PlausibleWeb.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"PlausibleWeb.Endpoint.html#path/1"},{"type":"function","title":"PlausibleWeb.Endpoint.runtime_session/2","doc":"","ref":"PlausibleWeb.Endpoint.html#runtime_session/2"},{"type":"function","title":"PlausibleWeb.Endpoint.runtime_session_opts/0","doc":"","ref":"PlausibleWeb.Endpoint.html#runtime_session_opts/0"},{"type":"function","title":"PlausibleWeb.Endpoint.script_name/0","doc":"Generates the script name.","ref":"PlausibleWeb.Endpoint.html#script_name/0"},{"type":"function","title":"PlausibleWeb.Endpoint.secure_cookie?/0","doc":"","ref":"PlausibleWeb.Endpoint.html#secure_cookie?/0"},{"type":"function","title":"PlausibleWeb.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"PlausibleWeb.Endpoint.html#start_link/1"},{"type":"function","title":"PlausibleWeb.Endpoint.static_integrity/1","doc":"Generates a base64-encoded cryptographic hash (sha512) to a static file\nin `priv/static`. Meant to be used for Subresource Integrity with CDNs.","ref":"PlausibleWeb.Endpoint.html#static_integrity/1"},{"type":"function","title":"PlausibleWeb.Endpoint.static_lookup/1","doc":"Returns a two item tuple with the first item being the `static_path`\nand the second item being the `static_integrity`.","ref":"PlausibleWeb.Endpoint.html#static_lookup/1"},{"type":"function","title":"PlausibleWeb.Endpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"PlausibleWeb.Endpoint.html#static_path/1"},{"type":"function","title":"PlausibleWeb.Endpoint.static_url/0","doc":"Generates the static URL without any path information.\n\nIt uses the configuration under `:static_url` to generate\nsuch. It falls back to `:url` if `:static_url` is not set.","ref":"PlausibleWeb.Endpoint.html#static_url/0"},{"type":"function","title":"PlausibleWeb.Endpoint.struct_url/0","doc":"Generates the endpoint base URL but as a `URI` struct.\n\nIt uses the configuration under `:url` to generate such.\nUseful for manipulating the URL data and passing it to\nURL helpers.","ref":"PlausibleWeb.Endpoint.html#struct_url/0"},{"type":"function","title":"PlausibleWeb.Endpoint.subscribe/2","doc":"","ref":"PlausibleWeb.Endpoint.html#subscribe/2"},{"type":"function","title":"PlausibleWeb.Endpoint.unsubscribe/1","doc":"","ref":"PlausibleWeb.Endpoint.html#unsubscribe/1"},{"type":"function","title":"PlausibleWeb.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"PlausibleWeb.Endpoint.html#url/0"},{"type":"function","title":"PlausibleWeb.Endpoint.websocket_url/0","doc":"","ref":"PlausibleWeb.Endpoint.html#websocket_url/0"},{"type":"module","title":"PlausibleWeb.ErrorHelpers","doc":"","ref":"PlausibleWeb.ErrorHelpers.html"},{"type":"function","title":"PlausibleWeb.ErrorHelpers.error_tag/2","doc":"","ref":"PlausibleWeb.ErrorHelpers.html#error_tag/2"},{"type":"function","title":"PlausibleWeb.ErrorHelpers.translate_error/1","doc":"","ref":"PlausibleWeb.ErrorHelpers.html#translate_error/1"},{"type":"module","title":"PlausibleWeb.ErrorReportController","doc":"","ref":"PlausibleWeb.ErrorReportController.html"},{"type":"function","title":"PlausibleWeb.ErrorReportController.submit_error_report/2","doc":"","ref":"PlausibleWeb.ErrorReportController.html#submit_error_report/2"},{"type":"module","title":"PlausibleWeb.ErrorView","doc":"","ref":"PlausibleWeb.ErrorView.html"},{"type":"function","title":"PlausibleWeb.ErrorView.404_error.html/1","doc":"","ref":"PlausibleWeb.ErrorView.html#404_error.html/1"},{"type":"function","title":"PlausibleWeb.ErrorView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.ErrorView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.ErrorView.generic_error.html/1","doc":"","ref":"PlausibleWeb.ErrorView.html#generic_error.html/1"},{"type":"function","title":"PlausibleWeb.ErrorView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.ErrorView.html#render/2"},{"type":"function","title":"PlausibleWeb.ErrorView.server_error.html/1","doc":"","ref":"PlausibleWeb.ErrorView.html#server_error.html/1"},{"type":"function","title":"PlausibleWeb.ErrorView.server_error_report_thanks.html/1","doc":"","ref":"PlausibleWeb.ErrorView.html#server_error_report_thanks.html/1"},{"type":"function","title":"PlausibleWeb.ErrorView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.ErrorView.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Favicon","doc":"A Plug that fetches favicon images from DuckDuckGo and returns them\nto the Plausible frontend.\n\nThe proxying is there so we can reduce the number of third-party domains that\nthe browser clients need to connect to. Our goal is to have 0 third-party domain\nconnections on the website for privacy reasons.\n\nThis module also maps between categorized sources and their respective URLs for favicons.\nWhat does that mean exactly? During ingestion we use `PlausibleWeb.RefInspector.parse/1` to\ncategorize our referrer sources like so:\n\ngoogle.com -> Google\ngoogle.co.uk -> Google\ngoogle.com.au -> Google\n\nSo when we show Google as a source in the dashboard, the request to this plug will come as:\nhttps://plausible/io/favicon/sources/Google\n\nNow, when we want to show a favicon for Google, we need to convert Google -> google.com or\nsome other hostname owned by Google:\nhttps://icons.duckduckgo.com/ip3/google.com.ico\n\nThe mapping from source category -> source hostname is stored in \"priv/referer_favicon_domains.json\" and\nmanaged by `Mix.Tasks.GenerateReferrerFavicons.run/1`","ref":"PlausibleWeb.Favicon.html"},{"type":"function","title":"PlausibleWeb.Favicon.call/2","doc":"Proxies HTTP request to DuckDuckGo favicon service. Swallows hop-by-hop HTTP\nheaders that should not be forwarded as defined in [RFC 2616](https://www.rfc-editor.org/rfc/rfc2616#section-13.5.1)","ref":"PlausibleWeb.Favicon.html#call/2"},{"type":"function","title":"Placeholder - PlausibleWeb.Favicon.call/2","doc":"Cases where we show a placeholder icon instead:\n\n1. In case of network error to DuckDuckGo\n2. In case of non-2xx status code from DuckDuckGo\n3. In case of broken image response body from DuckDuckGo\n\nI'm not sure why DDG sometimes returns a broken PNG image in their response\nbut we filter that out. When the icon request fails, we show a placeholder\nfavicon instead. The placeholder is an emoji from\n[https://favicon.io/emoji-favicons/](https://favicon.io/emoji-favicons/)\n\nDuckDuckGo favicon service has some issues with [SVG favicons](https://css-tricks.com/svg-favicons-and-all-the-fun-things-we-can-do-with-them/).\nFor some reason, they return them with `content-type=image/x-icon` whereas SVG\nicons should be returned with `content-type=image/svg+xml`. This Plug detects\nwhen the response body starts with ` People. It's important to enforce permissions in this controller.\n\n Owner - Can manage users, can trigger a 'transfer ownership' request\n Admin - Can manage users\n Viewer - Can not access user management settings\n Anyone - Can accept invitations\n\n Everything else should be explicitly disallowed.","ref":"PlausibleWeb.Site.MembershipController.html"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.invite_member/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#invite_member/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.invite_member_form/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#invite_member_form/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.remove_member/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#remove_member/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.transfer_ownership/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#transfer_ownership/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.transfer_ownership_form/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#transfer_ownership_form/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.update_role/2","doc":"Updates the role of a user. The user being updated could be the same or different from the user taking\n the action. When updating the role, it's important to enforce permissions:\n\n Owner - Can update anyone's role except for themselves. If they want to change their own role, they have to use the 'transfer ownership' feature.\n Admin - Can update anyone's role except for owners. Can downgrade their own access to 'viewer'. Can promote a viewer to admin.","ref":"PlausibleWeb.Site.MembershipController.html#update_role/2"},{"type":"module","title":"PlausibleWeb.Site.MembershipView","doc":"","ref":"PlausibleWeb.Site.MembershipView.html"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Site.MembershipView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.invite_member_form.html/1","doc":"","ref":"PlausibleWeb.Site.MembershipView.html#invite_member_form.html/1"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Site.MembershipView.html#render/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.Site.MembershipView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.transfer_ownership_form.html/1","doc":"","ref":"PlausibleWeb.Site.MembershipView.html#transfer_ownership_form.html/1"},{"type":"module","title":"PlausibleWeb.SiteController","doc":"","ref":"PlausibleWeb.SiteController.html"},{"type":"function","title":"PlausibleWeb.SiteController.add_monthly_report_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_monthly_report_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.add_snippet/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_snippet/2"},{"type":"function","title":"PlausibleWeb.SiteController.add_snippet_after_domain_change/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_snippet_after_domain_change/2"},{"type":"function","title":"PlausibleWeb.SiteController.add_spike_notification_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_spike_notification_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.add_weekly_report_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_weekly_report_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.change_domain/2","doc":"","ref":"PlausibleWeb.SiteController.html#change_domain/2"},{"type":"function","title":"PlausibleWeb.SiteController.change_domain_submit/2","doc":"","ref":"PlausibleWeb.SiteController.html#change_domain_submit/2"},{"type":"function","title":"PlausibleWeb.SiteController.create_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#create_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.create_site/2","doc":"","ref":"PlausibleWeb.SiteController.html#create_site/2"},{"type":"function","title":"PlausibleWeb.SiteController.delete_google_auth/2","doc":"","ref":"PlausibleWeb.SiteController.html#delete_google_auth/2"},{"type":"function","title":"PlausibleWeb.SiteController.delete_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#delete_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.delete_site/2","doc":"","ref":"PlausibleWeb.SiteController.html#delete_site/2"},{"type":"function","title":"PlausibleWeb.SiteController.disable_monthly_report/2","doc":"","ref":"PlausibleWeb.SiteController.html#disable_monthly_report/2"},{"type":"function","title":"PlausibleWeb.SiteController.disable_spike_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#disable_spike_notification/2"},{"type":"function","title":"PlausibleWeb.SiteController.disable_weekly_report/2","doc":"","ref":"PlausibleWeb.SiteController.html#disable_weekly_report/2"},{"type":"function","title":"PlausibleWeb.SiteController.edit_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#edit_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.enable_monthly_report/2","doc":"","ref":"PlausibleWeb.SiteController.html#enable_monthly_report/2"},{"type":"function","title":"PlausibleWeb.SiteController.enable_spike_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#enable_spike_notification/2"},{"type":"function","title":"PlausibleWeb.SiteController.enable_weekly_report/2","doc":"","ref":"PlausibleWeb.SiteController.html#enable_weekly_report/2"},{"type":"function","title":"PlausibleWeb.SiteController.forget_imported/2","doc":"","ref":"PlausibleWeb.SiteController.html#forget_imported/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google_confirm/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_confirm/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google_user_metric_notice/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_user_metric_notice/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google_view_id/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_view_id/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google_view_id_form/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_view_id_form/2"},{"type":"function","title":"PlausibleWeb.SiteController.make_private/2","doc":"","ref":"PlausibleWeb.SiteController.html#make_private/2"},{"type":"function","title":"PlausibleWeb.SiteController.make_public/2","doc":"","ref":"PlausibleWeb.SiteController.html#make_public/2"},{"type":"function","title":"PlausibleWeb.SiteController.new/2","doc":"","ref":"PlausibleWeb.SiteController.html#new/2"},{"type":"function","title":"PlausibleWeb.SiteController.new_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#new_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.remove_monthly_report_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#remove_monthly_report_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.remove_spike_notification_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#remove_spike_notification_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.remove_weekly_report_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#remove_weekly_report_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.reset_stats/2","doc":"","ref":"PlausibleWeb.SiteController.html#reset_stats/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_danger_zone/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_danger_zone/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_email_reports/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_email_reports/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_funnels/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_funnels/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_general/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_general/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_goals/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_goals/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_integrations/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_integrations/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_people/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_people/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_props/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_props/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_visibility/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_visibility/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_feature_visibility/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_feature_visibility/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_google_auth/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_google_auth/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_settings/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_settings/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_spike_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_spike_notification/2"},{"type":"module","title":"PlausibleWeb.SiteView","doc":"","ref":"PlausibleWeb.SiteView.html"},{"type":"function","title":"PlausibleWeb.SiteView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.SiteView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.SiteView.change_domain.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#change_domain.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.edit_shared_link.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#edit_shared_link.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.import_from_google_confirm.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_confirm.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.import_from_google_user_metric_form.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_user_metric_form.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.import_from_google_view_id_form.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_view_id_form.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.new.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#new.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.new_shared_link.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#new_shared_link.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.plausible_url/0","doc":"","ref":"PlausibleWeb.SiteView.html#plausible_url/0"},{"type":"function","title":"PlausibleWeb.SiteView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.SiteView.html#render/2"},{"type":"function","title":"PlausibleWeb.SiteView.render_snippet/1","doc":"","ref":"PlausibleWeb.SiteView.html#render_snippet/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_danger_zone.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_danger_zone.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_email_reports.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_email_reports.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_funnels.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_funnels.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_general.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_general.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_goals.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_goals.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_google_import.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_google_import.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_integrations.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_integrations.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_people.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_people.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_props.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_props.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_search_console.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_search_console.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_visibility.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_visibility.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.shared_link_dest/2","doc":"","ref":"PlausibleWeb.SiteView.html#shared_link_dest/2"},{"type":"function","title":"PlausibleWeb.SiteView.snippet.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#snippet.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.snippet_after_domain_change.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#snippet_after_domain_change.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.SiteView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.SiteView.with_indefinite_article/1","doc":"","ref":"PlausibleWeb.SiteView.html#with_indefinite_article/1"},{"type":"module","title":"PlausibleWeb.StatsController","doc":"This controller is responsible for rendering stats dashboards.\n\nThe stats dashboards are currently the only part of the app that uses client-side\nrendering. Since the dashboards are heavily interactive, they are built with React\nwhich is an appropriate choice for highly interactive browser UIs.\n\n \nsequenceDiagram\n Browser->>StatsController: GET /mydomain.com\n StatsController-->>Browser: StatsView.render(\"stats.html\")\n Note left of Browser: ReactDom.render(Dashboard)\n\n Browser -) Api.StatsController: GET /api/stats/mydomain.com/top-stats\n Api.StatsController --) Browser: {\"top_stats\": [...]}\n Note left of Browser: TopStats.render()\n\n Browser -) Api.StatsController: GET /api/stats/mydomain.com/main-graph\n Api.StatsController --) Browser: [{\"plot\": [...], \"labels\": [...]}, ...]\n Note left of Browser: VisitorGraph.render()\n\n Browser -) Api.StatsController: GET /api/stats/mydomain.com/sources\n Api.StatsController --) Browser: [{\"name\": \"Google\", \"visitors\": 292150}, ...]\n Note left of Browser: Sources.render()\n\n Note over Browser,StatsController: And so on, for all reports in the viewport\n \n\nThis reasoning for this sequence is as follows:\n 1. First paint is fast because it doesn't do any data aggregation yet - good UX\n 2. The basic structure of the dashboard is rendered with spinners before reports are ready - good UX\n 2. Rendering on the frontend allows for maximum interactivity. Re-rendering and re-fetching can be as granular as needed.\n 3. Routing on the frontend allows the user to navigate the dashboard without reloading the page and losing context\n 4. Rendering on the frontend allows caching results in the browser to reduce pressure on backends and storage\n 3.1 No client-side caching has been implemented yet. This is still theoretical. See https://github.com/plausible/analytics/discussions/1278\n 3.2 This is a big potential opportunity, because analytics data is mostly immutable. Clients can cache all historical data.\n 5. Since frontend rendering & navigation is harder to build and maintain than regular server-rendered HTML, we don't use SPA-style rendering anywhere else\n .The only place currently where the benefits outweigh the costs is the dashboard.","ref":"PlausibleWeb.StatsController.html"},{"type":"function","title":"PlausibleWeb.StatsController.authenticate_shared_link/2","doc":"","ref":"PlausibleWeb.StatsController.html#authenticate_shared_link/2"},{"type":"function","title":"PlausibleWeb.StatsController.csv_export/2","doc":"The export is limited to 300 entries for other reports and 100 entries for pages because bigger result sets\nstart causing failures. Since we request data like time on page or bounce_rate for pages in a separate query\nusing the IN filter, it causes the requests to balloon in payload size.","ref":"PlausibleWeb.StatsController.html#csv_export/2"},{"type":"function","title":"PlausibleWeb.StatsController.shared_link/2","doc":"Authorizes and renders a shared link:\n 1. Shared link with no password protection: needs to just make sure the shared link entry is still\n in our database. This check makes sure shared link access can be revoked by the site admins. If the\n shared link exists, render it directly.\n\n 2. Shared link with password protection: Same checks as without the password, but an extra step is taken to\n protect the page with a password. When the user passes the password challenge, a cookie is set with Plausible.Auth.Token.sign_shared_link().\n The cookie allows the user to access the dashboard for 24 hours without entering the password again.\n\n #","ref":"PlausibleWeb.StatsController.html#shared_link/2"},{"type":"function","title":"Backwards compatibility - PlausibleWeb.StatsController.shared_link/2","doc":"The URL format for shared links was changed in [this pull request](https://github.com/plausible/analytics/pull/752) in order\n to make the URLs easier to bookmark. The old format is supported along with the new in order to not break old links.\n\n See: https://plausible.io/docs/shared-links","ref":"PlausibleWeb.StatsController.html#shared_link/2-backwards-compatibility"},{"type":"function","title":"PlausibleWeb.StatsController.stats/2","doc":"","ref":"PlausibleWeb.StatsController.html#stats/2"},{"type":"module","title":"PlausibleWeb.StatsView","doc":"","ref":"PlausibleWeb.StatsView.html"},{"type":"function","title":"PlausibleWeb.StatsView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.StatsView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.StatsView.large_number_format/1","doc":"","ref":"PlausibleWeb.StatsView.html#large_number_format/1"},{"type":"function","title":"PlausibleWeb.StatsView.plausible_url/0","doc":"","ref":"PlausibleWeb.StatsView.html#plausible_url/0"},{"type":"function","title":"PlausibleWeb.StatsView.pretty_stats_url/1","doc":"Returns a readable stats URL.\n\nNative Phoenix router functions percent-encode all diacritics, resulting in\nugly URLs, e.g. `https://plausible.io/café.com` transforms into\n`https://plausible.io/caf%C3%A9.com`.\n\nThis function encodes only the slash (`/`) character from the site's domain.","ref":"PlausibleWeb.StatsView.html#pretty_stats_url/1"},{"type":"function","title":"Examples - PlausibleWeb.StatsView.pretty_stats_url/1","doc":"iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: \"user.gittea.io/repo\"})\n \"http://localhost:8000/user.gittea.io%2Frepo\"\n\n iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: \"anakin.test\"})\n \"http://localhost:8000/anakin.test\"\n\n iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: \"café.test\"})\n \"http://localhost:8000/café.test\"","ref":"PlausibleWeb.StatsView.html#pretty_stats_url/1-examples"},{"type":"function","title":"PlausibleWeb.StatsView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.StatsView.html#render/2"},{"type":"function","title":"PlausibleWeb.StatsView.shared_link_password.html/1","doc":"","ref":"PlausibleWeb.StatsView.html#shared_link_password.html/1"},{"type":"function","title":"PlausibleWeb.StatsView.site_locked.html/1","doc":"","ref":"PlausibleWeb.StatsView.html#site_locked.html/1"},{"type":"function","title":"PlausibleWeb.StatsView.stats.html/1","doc":"","ref":"PlausibleWeb.StatsView.html#stats.html/1"},{"type":"function","title":"PlausibleWeb.StatsView.stats_container_class/1","doc":"","ref":"PlausibleWeb.StatsView.html#stats_container_class/1"},{"type":"function","title":"PlausibleWeb.StatsView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.StatsView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.StatsView.waiting_first_pageview.html/1","doc":"","ref":"PlausibleWeb.StatsView.html#waiting_first_pageview.html/1"},{"type":"module","title":"PlausibleWeb.Tracker","doc":"","ref":"PlausibleWeb.Tracker.html"},{"type":"function","title":"PlausibleWeb.Tracker.call/2","doc":"","ref":"PlausibleWeb.Tracker.html#call/2"},{"type":"function","title":"PlausibleWeb.Tracker.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"PlausibleWeb.Tracker.html#child_spec/1"},{"type":"function","title":"PlausibleWeb.Tracker.init/1","doc":"","ref":"PlausibleWeb.Tracker.html#init/1"},{"type":"module","title":"PlausibleWeb.TwoFactor.Session","doc":"Functions for managing session data related to Two-Factor\nAuthentication.","ref":"PlausibleWeb.TwoFactor.Session.html"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.clear_2fa_user/1","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#clear_2fa_user/1"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.clear_remember_2fa/1","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#clear_remember_2fa/1"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.get_2fa_user/1","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#get_2fa_user/1"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.maybe_set_remember_2fa/3","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#maybe_set_remember_2fa/3"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.remember_2fa?/2","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#remember_2fa?/2"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.remember_2fa_days/0","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#remember_2fa_days/0"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.set_2fa_user/2","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#set_2fa_user/2"},{"type":"module","title":"PlausibleWeb.UnsubscribeController","doc":"","ref":"PlausibleWeb.UnsubscribeController.html"},{"type":"function","title":"PlausibleWeb.UnsubscribeController.monthly_report/2","doc":"","ref":"PlausibleWeb.UnsubscribeController.html#monthly_report/2"},{"type":"function","title":"PlausibleWeb.UnsubscribeController.weekly_report/2","doc":"","ref":"PlausibleWeb.UnsubscribeController.html#weekly_report/2"},{"type":"module","title":"PlausibleWeb.UnsubscribeView","doc":"","ref":"PlausibleWeb.UnsubscribeView.html"},{"type":"function","title":"PlausibleWeb.UnsubscribeView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.UnsubscribeView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.UnsubscribeView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.UnsubscribeView.html#render/2"},{"type":"function","title":"PlausibleWeb.UnsubscribeView.success.html/1","doc":"","ref":"PlausibleWeb.UnsubscribeView.html#success.html/1"},{"type":"function","title":"PlausibleWeb.UnsubscribeView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.UnsubscribeView.html#template_not_found/2"},{"type":"extras","title":"Introduction","doc":"# Plausible Analytics\n\n \n \n \n \n \n \n Simple Metrics |\n Lightweight Script |\n Privacy Focused |\n Open Source |\n Docs |\n Contributing \n \n \n\n[Plausible Analytics](https://plausible.io/) is an easy to use, lightweight (< 1 KB), open source and privacy-friendly alternative to Google Analytics. It doesn’t use cookies and is fully compliant with GDPR, CCPA and PECR. You can self-host or have us run Plausible for you in the cloud. Here's [the live demo of our own website stats](https://plausible.io/plausible.io). Made and hosted in the EU 🇪🇺\n\nWe are dedicated to making web analytics more privacy-friendly. Our mission is to reduce corporate surveillance by providing an alternative web analytics tool which doesn’t come from the AdTech world. We are completely independent and solely funded by our subscribers.\n\n![Plausible Analytics](https://plausible.io/docs/img/plausible-analytics.png)","ref":"readme.html"},{"type":"extras","title":"Why Plausible? - Introduction","doc":"Here's what makes Plausible a great Google Analytics alternative and why we're trusted by 11,000+ paying subscribers to deliver their website and business insights:\n\n- **Clutter Free**: Plausible Analytics provides [simple web analytics](https://plausible.io/simple-web-analytics) and it cuts through the noise. No layers of menus, no need for custom reports. Get all the important insights on one single page. No training necessary.\n- **GDPR/CCPA/PECR compliant**: Measure traffic, not individuals. No personal data or IP addresses are ever stored in our database. We don't use cookies or any other persistent identifiers. [Read more about our data policy](https://plausible.io/data-policy)\n- **Lightweight**: Plausible Analytics works by loading a script on your website, like Google Analytics. Our script is [45x smaller](https://plausible.io/lightweight-web-analytics), making your website quicker to load. You can also send events directly to our [events API](https://plausible.io/docs/events-api).\n- **Email or Slack reports**: Keep an eye on your traffic with weekly and/or monthly email or Slack reports. You can also get traffic spike notifications.\n- **Invite team members and share stats**: You have the option to be transparent and open your web analytics to everyone. Your website stats are private by default but you can choose to make them public so anyone with your custom link can view them. You can [invite team members](https://plausible.io/docs/users-roles) and assign user roles too.\n- **Define key goals and track conversions**: Create custom events with custom dimensions to track conversions and attribution to understand and identify the trends that matter. Includes easy ways to track outbound link clicks, file downloads and 404 error pages.\n- **Search keywords**: Integrate your dashboard with Google Search Console to get the most accurate reporting on your search keywords.\n- **SPA support**: Plausible is built with modern web frameworks in mind and it works automatically with any pushState based router on the frontend. We also support frameworks that use the URL hash for routing. See [our documentation](https://plausible.io/docs/hash-based-routing).\n- **Smooth transition from Google Analytics**: There's a realtime dashboard, entry pages report and integration with Search Console. You can track your paid campaigns and conversions. You can invite team members. You can even [import your historical Google Analytics stats](https://plausible.io/docs/google-analytics-import). Learn how to [get the most out of your Plausible experience](https://plausible.io/docs/your-plausible-experience) and join thousands who have already migrated from Google Analytics.\n\nInterested to learn more? [Read more on our website](https://plausible.io), learn more about the team and the goals of the project on [our about page](https://plausible.io/about) or explore [the documentation](https://plausible.io/docs).","ref":"readme.html#why-plausible"},{"type":"extras","title":"Why is Plausible Analytics Cloud not free like Google Analytics? - Introduction","doc":"Plausible Analytics is an independently owned and actively developed project. To keep the project development going, to stay in business, to continue putting effort into building a better product and to cover our costs, we need to charge a fee.\n\nGoogle Analytics is free because Google has built their company and their wealth by collecting and analyzing huge amounts of personal information from web users and using these personal and behavioral insights to sell advertisements.\n\nPlausible has no part in that business model. No personal data is being collected and analyzed either. With Plausible, you 100% own and control all of your website data. This data is not being shared with or sold to any third-parties.\n\nWe choose the subscription business model rather than the business model of surveillance capitalism. See reasons why we believe you should [stop using Google Analytics on your website](https://plausible.io/blog/remove-google-analytics).","ref":"readme.html#why-is-plausible-analytics-cloud-not-free-like-google-analytics"},{"type":"extras","title":"Getting started with Plausible - Introduction","doc":"The easiest way to get started with Plausible is with [our official managed service in the cloud](https://plausible.io/#pricing). It takes 2 minutes to start counting your stats with a worldwide CDN, high availability, backups, security and maintenance all done for you by us.\n\nIn order to be compliant with the GDPR and the Schrems II ruling, all visitor data for our managed service in the cloud is exclusively processed on servers and cloud infrastructure owned and operated by European providers. Your website data never leaves the EU.\n\nOur managed hosting can save a substantial amount of developer time and resources. For most sites this ends up being the best value option and the revenue goes to funding the maintenance and further development of Plausible. So you’ll be supporting open source software and getting a great service!\n\n#","ref":"readme.html#getting-started-with-plausible"},{"type":"extras","title":"Can Plausible Analytics be self-hosted? - Introduction","doc":"Plausible is [open source web analytics](https://plausible.io/open-source-website-analytics) and we have a free as in beer [self-hosted solution](https://plausible.io/self-hosted-web-analytics). Here are the differences between Plausible Analytics managed hosting in the cloud and the self-hosting:\n\n| | Plausible Cloud | Self-Hosting |\n| ------------- | ------------- | ------------- |\n| **Infrastructure management** | Easy and convenient. It takes 2 minutes to start counting your stats with a worldwide CDN, high availability, backups, security and maintenance all done for you by us. We manage everything so you don’t have to worry about anything and can focus on your stats. | You do it all yourself. You need to get a server and you need to manage your infrastructure. You are responsible for installation, maintenance, upgrades, server capacity, uptime, backup, security, stability, consistency, loading time and so on.|\n| **Release schedule** | Continuously developed and improved with new features and updates multiple times per week. | [It's a long term release](https://plausible.io/blog/building-open-source) published twice per year so latest features and improvements won't be immediately available.|\n| **Premium features** | All features available as listed in [our pricing plans](https://plausible.io/#pricing). | Selected premium features such as funnels and ecommerce revenue goals are not available as we aim to ensure a protective barrier around our cloud offering.|\n| **Bot filtering** | Advanced bot filtering for more accurate stats. Our algorithm detects and excludes non-human traffic patterns. We also exclude known bots by the User-Agent header and filter out traffic from data centers and referrer spam domains. | Basic bot filtering that targets the most common non-human traffic based on the User-Agent header and referrer spam domains.|\n| **Server location** | All visitor data is exclusively processed on EU-owned cloud infrastructure. We keep your site data on a secure, encrypted and green energy powered server in Germany. This ensures that your site data is protected by the strict European Union data privacy laws and ensures compliance with GDPR. Your website data never leaves the EU. | You have full control and can host your instance on any server in any country that you wish. Host it on a server in your basement or host it with any cloud provider wherever you want, even those that are not GDPR compliant.|\n| **Data portability** | You see all your site stats and metrics on our modern-looking, simple to use and fast loading dashboard. You can only see the stats aggregated in the dashboard. You can download the stats using the [CSV export](https://plausible.io/docs/export-stats), [stats API](https://plausible.io/docs/stats-api) or tools such as the [Data Studio Connector](https://plausible.io/docs/integration-guides#google-data-studio). | Do you want access to the raw data? Self-hosting gives you that option. You can take the data directly from the ClickHouse database. |\n| **Premium support** | Real support delivered by real human beings who build and maintain Plausible. | Premium support is not included. Self-hosting is community supported only.|\n| **Costs** | There's a cost associated with providing an analytics service so we charge a subscription fee. We choose the subscription business model rather than the business model of surveillance capitalism. Your money funds further development of Plausible. | You need to pay for your server, CDN, backups and whatever other cost there is associated with running the infrastructure. You never have to pay any fees to us. Your money goes to 3rd party companies with no connection to us.|\n\nInterested in self-hosting Plausible on your server? Take a look at our [self-hosting installation instructions](https://plausible.io/docs/self-hosting).\n\nPlausible Self-Hosted is a community supported project and there are no guarantees that you will get support from the creators of Plausible to troubleshoot your self-hosting issues. There is a [community supported forum](https://github.com/plausible/analytics/discussions/categories/self-hosted-support) where you can ask for help.\n\nOur only source of funding is our premium, managed service for running Plausible in the cloud. If you're looking for an alternative way to support the project, we've put together some sponsorship packages. If you choose to self-host Plausible you can [become a sponsor](https://github.com/sponsors/plausible) which is a great way to give back to the community and to contribute to the long-term sustainability of the project.","ref":"readme.html#can-plausible-analytics-be-self-hosted"},{"type":"extras","title":"Technology - Introduction","doc":"Plausible Analytics is a standard Elixir/Phoenix application backed by a PostgreSQL database for general data and a Clickhouse\ndatabase for stats. On the frontend we use [TailwindCSS](https://tailwindcss.com/) for styling and React to make the dashboard interactive.","ref":"readme.html#technology"},{"type":"extras","title":"Contributors - Introduction","doc":"For anyone wishing to contribute to Plausible, we recommend taking a look at [our contributor guide](https://github.com/plausible/analytics/blob/master/CONTRIBUTING.md).","ref":"readme.html#contributors"},{"type":"extras","title":"Feedback & Roadmap - Introduction","doc":"We welcome feedback from our community. We have a public roadmap driven by the features suggested by the community members. Take a look at our [feedback board](https://plausible.io/feedback). Please let us know if you have any requests and vote on open issues so we can better prioritize.\n\nTo stay up to date with all the latest news and product updates, make sure to follow us on [X (formerly Twitter)](https://twitter.com/plausiblehq), [LinkedIn](https://www.linkedin.com/company/plausible-analytics/) or [Mastodon](https://fosstodon.org/@plausible).","ref":"readme.html#feedback-roadmap"},{"type":"extras","title":"License & Trademarks - Introduction","doc":"Plausible is open source under the GNU Affero General Public License Version 3 (AGPLv3) or any later version. You can [find it here](https://github.com/plausible/analytics/blob/master/LICENSE.md).\n\nTo avoid issues with AGPL virality, we've released the JavaScript tracker which gets included on your website under the MIT license. You can [find it here](https://github.com/plausible/analytics/blob/master/tracker/LICENSE.md).\n\nCopyright (c) 2018-present Plausible Insights OÜ. Plausible Analytics name and logo are trademarks of Plausible Insights OÜ. Please see our [trademark guidelines](https://plausible.io/trademark) for info on acceptable usage.","ref":"readme.html#license-trademarks"},{"type":"extras","title":"Contributing","doc":"# Contributing\n\nWe welcome everyone to contribute to Plausible. This document is to help you on setting up your environment, finding a task, and opening pull requests.","ref":"contributing.html"},{"type":"extras","title":"Development setup - Contributing","doc":"The easiest way to get up and running is to [install](https://docs.docker.com/get-docker/) and use Docker for running both Postgres and Clickhouse.\n\nMake sure Docker, Elixir, Erlang and Node.js are all installed on your development machine. The [`.tool-versions`](https://github.com/plausible/analytics/blob/master/.tool-versions) file is available to use with [asdf](https://github.com/asdf-vm/asdf) or similar tools.\n\n#","ref":"contributing.html#development-setup"},{"type":"extras","title":"Start the environment - Contributing","doc":"1. Run both `make postgres` and `make clickhouse`.\n2. You can set up everything with `make install`, alternatively run each command separately:\n 1. Run `mix deps.get`. This will download the required Elixir dependencies.\n 2. Run `mix ecto.create`. This will create the required databases in both Postgres and Clickhouse.\n 3. Run `mix ecto.migrate` to build the database schema.\n 4. Run `mix run priv/repo/seeds.exs` to seed the database. Check the [Seeds](#Seeds) section for more.\n 5. Run `npm ci --prefix assets` to install the required client-side dependencies.\n 6. Run `npm ci --prefix tracker` to install the required tracker dependencies.\n 7. Run `mix assets.setup` to install Tailwind and Esbuild\n 8. Run `npm run deploy --prefix tracker` to generate tracker files in `priv/tracker/js`\n 9. Run `mix download_country_database` to fetch geolocation database\n3. Run `make server` or `mix phx.server` to start the Phoenix server.\n4. The system is now available on `localhost:8000`.\n\n#","ref":"contributing.html#start-the-environment"},{"type":"extras","title":"Seeds - Contributing","doc":"You can optionally seed your database to automatically create an account and a site with stats:\n\n1. Run `mix run priv/repo/seeds.exs` to seed the database.\n2. Start the server with `make server` and navigate to `http://localhost:8000/login`.\n3. Log in with the following e-mail and password combination: `user@plausible.test` and `plausible`.\n4. You should now have a `dummy.site` site with generated stats.\n\nAlternatively, you can manually create a new account:\n\n1. Navigate to `http://localhost:8000/register` and fill in the form.\n2. Fill in the rest of the forms and for the domain use `dummy.site`\n3. Skip the JS snippet and click start collecting data.\n4. Run `mix send_pageview` from the terminal to generate a fake pageview event for the dummy site.\n5. You should now be all set!\n\n#","ref":"contributing.html#seeds"},{"type":"extras","title":"Stopping Docker containers - Contributing","doc":"1. Stop and remove the Postgres container with `make postgres-stop`.\n2. Stop and remove the Clickhouse container with `make clickhouse-stop`.\n\nVolumes are preserved. You'll find that the Postgres and Clickhouse state are retained when you bring them up again the next time: no need to re-register and so on.\n\nNote: Since we are deleting the containers, be careful when deleting volumes with `docker volume prune`. You might accidentally delete the database and would have to go through re-registration process.\n\n#","ref":"contributing.html#stopping-docker-containers"},{"type":"extras","title":"Pre-commit hooks - Contributing","doc":"`pre-commit` requires Python to be available locally and covers Elixir, JavaScript, and CSS. Set up with `pip install --user pre-commit` followed by `pre-commit install`. Conversely, if the prompts are far too bothersome, remove with `pre-commit uninstall`.","ref":"contributing.html#pre-commit-hooks"},{"type":"extras","title":"Finding a task - Contributing","doc":"Bugs can be found in our [issue tracker](https://github.com/plausible/analytics/issues). Issues are usually up for grabs.\n\nNew features need to be discussed with the core team and the community first. If you're tackling a feature, please make sure it has been already discussed in the [Discussions tab](https://github.com/plausible/analytics/discussions). We kindly ask contributors to use the discussion comment section to propose a solution before opening a pull request.\n\nPull requests without an associated issue or discussion may still be merged, but we will focus on changes that have already been talked through.","ref":"contributing.html#finding-a-task"},{"type":"extras","title":"Account locking","doc":"# Account locking\nThis document explains the account locking feature from a technical perspective. Account locking happens when users have outgrown their accounts, and despite e-mail and dashboard alerts, don't upgrade after a grace period.","ref":"account-locking.html"},{"type":"extras","title":"Usage alert and grace period - Account locking","doc":"The `Plausible.Workers.CheckUsage` daily background job alerts users they have reached their subscription limits. This runs for outgrown users one day after their last billing date.\n\nWhen users reach the number of sites limit, or use >110% of their pageview limit for 2 consecutive billing cycles, the background job sends them an e-mail alert. The e-mail suggests a suitable subscription plan based on usage. For enterprise users, only an internal e-mail is sent to `enterprise@plausible.io`.\n\nThe user is given 7 days to upgrade their account after the alert, and this is called grace period. The background starts this grace period by adding a `users.grace_period` JSON to the user record:\n\n```json\n// SELECT grace_period FROM users LIMIT 1\n\n{\n \"id\": \"1aa855bd-022d-4dfc-b572-6853442c3f19\",\n \"is_over\": true,\n \"end_date\": \"2022-03-09\",\n \"allowance_required\": 100,\n \"manual_lock\": false\n}\n```\n\n\nDuring this period, the following alert pops up on the dashboard for both standard and enterprise users:\n\n![](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN4GLWMwCrTuTcf31kYE9%2Fuploads%2FmsLk4CdSHKzU8TbfvaPq%2FPasted%20image%2020220909120933.png?alt=media&token=76f247a1-28cf-4d88-a0fa-06547268aee9)\n\nIf the user upgrades to a suitable plan, the grace period is removed (check `Plausible.Billing.subscription_updated/1`), otherwise [Account locking](#Account\\ locking) follows. For enterprise users, the grace period has a manual lock flag set to true, meaning enterprise accounts can only be locked/unlocked through the internal CRM.","ref":"account-locking.html#usage-alert-and-grace-period"},{"type":"extras","title":"Account locking - Account locking","doc":"The grace period is checked daily by the `Plausible.Workers.LockSites` background job.\n\nFor users that expired their grace period, `sites.locked` is is set to `true`, restricting access to dashboards. This does not stop event ingestion, so users can have their stats up to date when they finally upgrade.\n\n![](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN4GLWMwCrTuTcf31kYE9%2Fuploads%2FAplurtG7UsGXMskZOlUO%2FPasted%20image%2020220909122622.png?alt=media&token=5c8156d7-d4a7-4c99-8bac-2f1e9b7d4cae)","ref":"account-locking.html#account-locking"}],"content_type":"text/markdown"} \ No newline at end of file +searchData={"items":[{"type":"task","title":"mix cancel_subscription","doc":"This task is meant to replicate the behavior of cancelling\na subscription. On production, this action is initiated by\na Paddle webhook. Currently, only the subscription status\nis changed with that action.","ref":"Mix.Tasks.CancelSubscription.html"},{"type":"function","title":"Mix.Tasks.CancelSubscription.run/1","doc":"","ref":"Mix.Tasks.CancelSubscription.html#run/1"},{"type":"task","title":"mix clean_clickhouse","doc":"","ref":"Mix.Tasks.CleanClickhouse.html"},{"type":"function","title":"Mix.Tasks.CleanClickhouse.run/1","doc":"","ref":"Mix.Tasks.CleanClickhouse.html#run/1"},{"type":"task","title":"mix create_free_subscription","doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html"},{"type":"function","title":"Mix.Tasks.CreateFreeSubscription.execute/1","doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html#execute/1"},{"type":"function","title":"Mix.Tasks.CreateFreeSubscription.run/1","doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html#run/1"},{"type":"task","title":"mix download_country_database","doc":"This task downloads the Country Lite database from DB-IP for self-hosted or development purposes.\nPlausible Cloud runs a paid version of DB-IP with more detailed geolocation data.","ref":"Mix.Tasks.DownloadCountryDatabase.html"},{"type":"function","title":"Mix.Tasks.DownloadCountryDatabase.run/1","doc":"","ref":"Mix.Tasks.DownloadCountryDatabase.html#run/1"},{"type":"task","title":"mix generate_referrer_favicons","doc":"","ref":"Mix.Tasks.GenerateReferrerFavicons.html"},{"type":"function","title":"Mix.Tasks.GenerateReferrerFavicons.run/1","doc":"","ref":"Mix.Tasks.GenerateReferrerFavicons.html#run/1"},{"type":"task","title":"mix pull_sandbox_subscription","doc":"","ref":"Mix.Tasks.PullSandboxSubscription.html"},{"type":"function","title":"Mix.Tasks.PullSandboxSubscription.run/1","doc":"","ref":"Mix.Tasks.PullSandboxSubscription.html#run/1"},{"type":"task","title":"mix send_pageview","doc":"It's often necessary to generate fake events for development and testing purposes. This Mix Task provides a quick and easy\nway to generate a pageview or custom event, either in your development environment or a remote Plausible instance.\n\nSee Mix.Tasks.SendPageview.usage/1 for more detailed documentation.","ref":"Mix.Tasks.SendPageview.html"},{"type":"function","title":"Mix.Tasks.SendPageview.run/1","doc":"","ref":"Mix.Tasks.SendPageview.html#run/1"},{"type":"module","title":"ObanErrorReporter","doc":"","ref":"ObanErrorReporter.html"},{"type":"function","title":"ObanErrorReporter.handle_event/4","doc":"","ref":"ObanErrorReporter.html#handle_event/4"},{"type":"module","title":"Plausible","doc":"Build-related macros","ref":"Plausible.html"},{"type":"function","title":"Plausible.do_on_full_build/1","doc":"","ref":"Plausible.html#do_on_full_build/1"},{"type":"macro","title":"Plausible.full_build?/0","doc":"","ref":"Plausible.html#full_build?/0"},{"type":"macro","title":"Plausible.on_full_build/1","doc":"","ref":"Plausible.html#on_full_build/1"},{"type":"macro","title":"Plausible.small_build?/0","doc":"","ref":"Plausible.html#small_build?/0"},{"type":"module","title":"Plausible.AsyncInsertRepo","doc":"Clickhouse access with async inserts enabled","ref":"Plausible.AsyncInsertRepo.html"},{"type":"function","title":"Plausible.AsyncInsertRepo.aggregate/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#aggregate/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.aggregate/4","doc":"","ref":"Plausible.AsyncInsertRepo.html#aggregate/4"},{"type":"function","title":"Plausible.AsyncInsertRepo.all/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#all/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.checked_out?/0","doc":"","ref":"Plausible.AsyncInsertRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.AsyncInsertRepo.checkout/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#checkout/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.child_spec/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#child_spec/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.config/0","doc":"","ref":"Plausible.AsyncInsertRepo.html#config/0"},{"type":"function","title":"Plausible.AsyncInsertRepo.default_options/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#default_options/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.delete/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#delete/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.delete!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#delete!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.delete_all/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#delete_all/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.AsyncInsertRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.exists?/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#exists?/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.get/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#get/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.get!/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#get!/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.get_by/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#get_by/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.get_by!/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#get_by!/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.AsyncInsertRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert_all/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert_all/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert_or_update/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert_or_update!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.AsyncInsertRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.load/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#load/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.one/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#one/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.one!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#one!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.preload/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#preload/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.prepare_query/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.AsyncInsertRepo.html#query/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.AsyncInsertRepo.html#query!/3"},{"type":"function","title":"Plausible.AsyncInsertRepo.reload/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#reload/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.reload!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#reload!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.start_link/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#start_link/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.stop/1","doc":"","ref":"Plausible.AsyncInsertRepo.html#stop/1"},{"type":"function","title":"Plausible.AsyncInsertRepo.stream/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#stream/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.AsyncInsertRepo.html#to_sql/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.update/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#update/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.update!/2","doc":"","ref":"Plausible.AsyncInsertRepo.html#update!/2"},{"type":"function","title":"Plausible.AsyncInsertRepo.update_all/3","doc":"","ref":"Plausible.AsyncInsertRepo.html#update_all/3"},{"type":"module","title":"Plausible.Auth","doc":"","ref":"Plausible.Auth.html"},{"type":"function","title":"Plausible.Auth.create_api_key/3","doc":"","ref":"Plausible.Auth.html#create_api_key/3"},{"type":"function","title":"Plausible.Auth.create_user/3","doc":"","ref":"Plausible.Auth.html#create_user/3"},{"type":"function","title":"Plausible.Auth.delete_api_key/2","doc":"","ref":"Plausible.Auth.html#delete_api_key/2"},{"type":"function","title":"Plausible.Auth.delete_user/1","doc":"","ref":"Plausible.Auth.html#delete_user/1"},{"type":"function","title":"Plausible.Auth.enterprise_configured?/1","doc":"","ref":"Plausible.Auth.html#enterprise_configured?/1"},{"type":"function","title":"Plausible.Auth.find_api_key/1","doc":"","ref":"Plausible.Auth.html#find_api_key/1"},{"type":"function","title":"Plausible.Auth.find_user_by/1","doc":"","ref":"Plausible.Auth.html#find_user_by/1"},{"type":"function","title":"Plausible.Auth.has_active_sites?/2","doc":"","ref":"Plausible.Auth.html#has_active_sites?/2"},{"type":"function","title":"Plausible.Auth.is_super_admin?/1","doc":"","ref":"Plausible.Auth.html#is_super_admin?/1"},{"type":"function","title":"Plausible.Auth.user_owns_sites?/1","doc":"","ref":"Plausible.Auth.html#user_owns_sites?/1"},{"type":"module","title":"Plausible.Auth.ApiKey","doc":"","ref":"Plausible.Auth.ApiKey.html"},{"type":"function","title":"Plausible.Auth.ApiKey.changeset/2","doc":"","ref":"Plausible.Auth.ApiKey.html#changeset/2"},{"type":"function","title":"Plausible.Auth.ApiKey.do_hash/1","doc":"","ref":"Plausible.Auth.ApiKey.html#do_hash/1"},{"type":"function","title":"Plausible.Auth.ApiKey.process_key/1","doc":"","ref":"Plausible.Auth.ApiKey.html#process_key/1"},{"type":"function","title":"Plausible.Auth.ApiKey.update/2","doc":"","ref":"Plausible.Auth.ApiKey.html#update/2"},{"type":"type","title":"Plausible.Auth.ApiKey.t/0","doc":"","ref":"Plausible.Auth.ApiKey.html#t:t/0"},{"type":"module","title":"Plausible.Auth.ApiKeyAdmin","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.create_changeset/2","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#create_changeset/2"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.custom_index_query/3","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#custom_index_query/3"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.form_fields/1","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#form_fields/1"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.index/1","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#index/1"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.search_fields/1","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#search_fields/1"},{"type":"function","title":"Plausible.Auth.ApiKeyAdmin.update_changeset/2","doc":"","ref":"Plausible.Auth.ApiKeyAdmin.html#update_changeset/2"},{"type":"module","title":"Plausible.Auth.EmailActivationCode","doc":"Schema for email activation codes.","ref":"Plausible.Auth.EmailActivationCode.html"},{"type":"function","title":"Plausible.Auth.EmailActivationCode.generate_code/0","doc":"","ref":"Plausible.Auth.EmailActivationCode.html#generate_code/0"},{"type":"function","title":"Plausible.Auth.EmailActivationCode.new/2","doc":"","ref":"Plausible.Auth.EmailActivationCode.html#new/2"},{"type":"type","title":"Plausible.Auth.EmailActivationCode.t/0","doc":"","ref":"Plausible.Auth.EmailActivationCode.html#t:t/0"},{"type":"module","title":"Plausible.Auth.EmailVerification","doc":"API for verifying emails.","ref":"Plausible.Auth.EmailVerification.html"},{"type":"function","title":"Plausible.Auth.EmailVerification.any?/1","doc":"","ref":"Plausible.Auth.EmailVerification.html#any?/1"},{"type":"function","title":"Plausible.Auth.EmailVerification.expired?/1","doc":"","ref":"Plausible.Auth.EmailVerification.html#expired?/1"},{"type":"function","title":"Plausible.Auth.EmailVerification.issue_code/2","doc":"","ref":"Plausible.Auth.EmailVerification.html#issue_code/2"},{"type":"function","title":"Plausible.Auth.EmailVerification.verify_code/2","doc":"","ref":"Plausible.Auth.EmailVerification.html#verify_code/2"},{"type":"module","title":"Plausible.Auth.GracePeriod","doc":"This embedded schema stores information about the account locking grace\nperiod.\n\nUsers are given this 7-day grace period to upgrade their account after\noutgrowing their subscriptions. The actual account locking happens in\nbackground with `Plausible.Workers.LockSites`.\n\nThe grace period can also be manual, without an end date, being controlled\nmanually from the CRM, and not by the background site locker job. This is \nuseful for enterprise subscriptions.","ref":"Plausible.Auth.GracePeriod.html"},{"type":"function","title":"Plausible.Auth.GracePeriod.active?/1","doc":"Returns whether the grace period is still active for a User. Defaults to\nfalse if the user is nil or there is no grace period.","ref":"Plausible.Auth.GracePeriod.html#active?/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.end_changeset/1","doc":"Ends an existing grace period by `setting users.grace_period.is_over` to true.\nThis means the grace period has expired.","ref":"Plausible.Auth.GracePeriod.html#end_changeset/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.expired?/1","doc":"Returns whether the grace period has already expired for a User. Defaults to\nfalse if the user is nil or there is no grace period.","ref":"Plausible.Auth.GracePeriod.html#expired?/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.remove_changeset/1","doc":"Removes the grace period from the User completely.","ref":"Plausible.Auth.GracePeriod.html#remove_changeset/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.start_changeset/2","doc":"Starts a account locking grace period of 7 days by changing the User struct.","ref":"Plausible.Auth.GracePeriod.html#start_changeset/2"},{"type":"function","title":"Plausible.Auth.GracePeriod.start_manual_lock_changeset/2","doc":"Starts a manual account locking grace period by changing the User struct. \nManual locking means the grace period can only be removed manually from the\nCRM.","ref":"Plausible.Auth.GracePeriod.html#start_manual_lock_changeset/2"},{"type":"type","title":"Plausible.Auth.GracePeriod.t/0","doc":"","ref":"Plausible.Auth.GracePeriod.html#t:t/0"},{"type":"module","title":"Plausible.Auth.Invitation","doc":"","ref":"Plausible.Auth.Invitation.html"},{"type":"function","title":"Plausible.Auth.Invitation.new/1","doc":"","ref":"Plausible.Auth.Invitation.html#new/1"},{"type":"type","title":"Plausible.Auth.Invitation.t/0","doc":"","ref":"Plausible.Auth.Invitation.html#t:t/0"},{"type":"module","title":"Plausible.Auth.Password","doc":"","ref":"Plausible.Auth.Password.html"},{"type":"function","title":"Plausible.Auth.Password.dummy_calculation/0","doc":"","ref":"Plausible.Auth.Password.html#dummy_calculation/0"},{"type":"function","title":"Plausible.Auth.Password.hash/1","doc":"","ref":"Plausible.Auth.Password.html#hash/1"},{"type":"function","title":"Plausible.Auth.Password.match?/2","doc":"","ref":"Plausible.Auth.Password.html#match?/2"},{"type":"module","title":"Plausible.Auth.TOTP","doc":"TOTP auth context\n\nHandles all the aspects of TOTP setup, management and validation for users.","ref":"Plausible.Auth.TOTP.html"},{"type":"module","title":"Setup - Plausible.Auth.TOTP","doc":"TOTP setup is started with `initiate/1`. At this stage, a random secret\nbinary is generated for user and stored under `User.totp_secret`. The secret\nis additionally encrypted while stored in the database using `Cloak`. The\nvault for safe storage is configured in `Plausible.Auth.TOTP.Vault` via\na dedicated `Ecto` type defined in `Plausible.Auth.TOTP.EncryptedBinary`.\nThe function returns updated user along with TOTP URI and a readable form\nof secret. Both - the URI and readable secret - are meant for exposure \nin the user's setup screen. The URI should be encoded as a QR code.\n\nAfter initiation, user is expected to confirm valid setup with `enable/2`,\nproviding TOTP code from their authenticator app. After code validation \npasses successfully, the `User.totp_enabled` flag is set to `true`.\nFinally, the user must be immediately presented with a list of recovery codes\nreturned by the same call of `enable/2`. The codes should be presented\nin copy/paste friendly form, ideally also with a print-friendly view option.\n\nThe `initiate/1` and `enable/1` functions can be safely called multiple\ntimes, allowing user to abort and restart setup up to these stages.","ref":"Plausible.Auth.TOTP.html#module-setup"},{"type":"module","title":"Management - Plausible.Auth.TOTP","doc":"The state of TOTP for a particular user can be chcecked by calling\n`enabled?/1` or `initiated?/1`.\n\nTOTP can be disabled with `disable/2`. User is expected to provide their\ncurrent password for safety. Once disabled, all TOTP user settings are\ncleared and any remaining generated recovery codes are removed. The function\ncan be safely run more than once.\n\nIf the user needs to regenerate the recovery codes outside of setup procedure,\nthey must do it via `generate_recovery_codes/2`, providing their current\npassword for safety. They must be warned that any existing recovery codes\nwill be invalidated.","ref":"Plausible.Auth.TOTP.html#module-management"},{"type":"module","title":"Validation - Plausible.Auth.TOTP","doc":"After logging in, user's TOTP state must be checked with `enabled?/1`.\n\nIf enabled, user must be presented with TOTP code input form accepting\n6 digit characters. The code must be checked using `validate_code/2`.\n\nUser must have an option to alternatively input one of their recovery\ncodes. Those codes must be checked with `use_recovery_code/2`.","ref":"Plausible.Auth.TOTP.html#module-validation"},{"type":"module","title":"Code validity - Plausible.Auth.TOTP","doc":"In case of TOTP codes, a grace period of 30 seconds is applied, which\nallows user to use their current and previous TOTP code, assuming 30\nsecond validity window of each. This allows user to use code that was \nabout to expire before the submission. Regardless of that, each TOTP\ncode can be used only once. Validation procedure rejects repeat use\nof the same code for safety. It's done by tracking last time a TOTP\ncode was used successfully, stored under `User.totp_last_used_at`.\n\nIn case of recovery codes, each code is deleted immediately after use.\nThey are strictly one-time use only.","ref":"Plausible.Auth.TOTP.html#module-code-validity"},{"type":"module","title":"TOTP Token - Plausible.Auth.TOTP","doc":"TOTP token is an alternate method of authenticating user session.\nIt's main use case is \"trust this device\" functionality, where user\ncan decide to skip 2FA verification for a particular browser session \nfor next N days. The token should then be stored in an encrypted,\nsigned cookie with a proper expiration timestamp.\n\nThe token should be reset each time it either fails to match\nor when other credentials (like password) are reset. This should\neffectively invalidate all trusted devices for a given user.","ref":"Plausible.Auth.TOTP.html#module-totp-token"},{"type":"function","title":"Plausible.Auth.TOTP.disable/2","doc":"","ref":"Plausible.Auth.TOTP.html#disable/2"},{"type":"function","title":"Plausible.Auth.TOTP.enable/3","doc":"","ref":"Plausible.Auth.TOTP.html#enable/3"},{"type":"function","title":"Plausible.Auth.TOTP.enabled?/1","doc":"","ref":"Plausible.Auth.TOTP.html#enabled?/1"},{"type":"function","title":"Plausible.Auth.TOTP.generate_recovery_codes/1","doc":"","ref":"Plausible.Auth.TOTP.html#generate_recovery_codes/1"},{"type":"function","title":"Plausible.Auth.TOTP.generate_recovery_codes/2","doc":"","ref":"Plausible.Auth.TOTP.html#generate_recovery_codes/2"},{"type":"function","title":"Plausible.Auth.TOTP.initiate/1","doc":"","ref":"Plausible.Auth.TOTP.html#initiate/1"},{"type":"function","title":"Plausible.Auth.TOTP.initiated?/1","doc":"","ref":"Plausible.Auth.TOTP.html#initiated?/1"},{"type":"function","title":"Plausible.Auth.TOTP.reset_token/1","doc":"","ref":"Plausible.Auth.TOTP.html#reset_token/1"},{"type":"function","title":"Plausible.Auth.TOTP.use_recovery_code/2","doc":"","ref":"Plausible.Auth.TOTP.html#use_recovery_code/2"},{"type":"function","title":"Plausible.Auth.TOTP.validate_code/3","doc":"","ref":"Plausible.Auth.TOTP.html#validate_code/3"},{"type":"module","title":"Plausible.Auth.TOTP.EncryptedBinary","doc":"Defines an Ecto type so Cloak.Ecto can encrypt/decrypt a binary field.","ref":"Plausible.Auth.TOTP.EncryptedBinary.html"},{"type":"module","title":"Plausible.Auth.TOTP.RecoveryCode","doc":"Schema for TOTP recovery codes.","ref":"Plausible.Auth.TOTP.RecoveryCode.html"},{"type":"function","title":"Plausible.Auth.TOTP.RecoveryCode.changeset/2","doc":"","ref":"Plausible.Auth.TOTP.RecoveryCode.html#changeset/2"},{"type":"function","title":"Plausible.Auth.TOTP.RecoveryCode.changeset_to_map/2","doc":"","ref":"Plausible.Auth.TOTP.RecoveryCode.html#changeset_to_map/2"},{"type":"function","title":"Plausible.Auth.TOTP.RecoveryCode.generate_codes/1","doc":"Generates `count` unique recovery codes, each alphanumeric\nand 10 characters long.","ref":"Plausible.Auth.TOTP.RecoveryCode.html#generate_codes/1"},{"type":"function","title":"Plausible.Auth.TOTP.RecoveryCode.match?/2","doc":"","ref":"Plausible.Auth.TOTP.RecoveryCode.html#match?/2"},{"type":"type","title":"Plausible.Auth.TOTP.RecoveryCode.t/0","doc":"","ref":"Plausible.Auth.TOTP.RecoveryCode.html#t:t/0"},{"type":"module","title":"Plausible.Auth.TOTP.Vault","doc":"Provides a vault that will be used to encrypt/decrypt the TOTP secrets of users who enable it.","ref":"Plausible.Auth.TOTP.Vault.html"},{"type":"function","title":"Plausible.Auth.TOTP.Vault.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Auth.TOTP.Vault.html#child_spec/1"},{"type":"function","title":"Plausible.Auth.TOTP.Vault.start_link/1","doc":"","ref":"Plausible.Auth.TOTP.Vault.html#start_link/1"},{"type":"module","title":"Plausible.Auth.Token","doc":"","ref":"Plausible.Auth.Token.html"},{"type":"function","title":"Plausible.Auth.Token.sign_password_reset/1","doc":"","ref":"Plausible.Auth.Token.html#sign_password_reset/1"},{"type":"function","title":"Plausible.Auth.Token.sign_shared_link/1","doc":"","ref":"Plausible.Auth.Token.html#sign_shared_link/1"},{"type":"function","title":"Plausible.Auth.Token.verify_password_reset/1","doc":"","ref":"Plausible.Auth.Token.html#verify_password_reset/1"},{"type":"function","title":"Plausible.Auth.Token.verify_shared_link/1","doc":"","ref":"Plausible.Auth.Token.html#verify_shared_link/1"},{"type":"module","title":"Plausible.Auth.User","doc":"","ref":"Plausible.Auth.User.html"},{"type":"function","title":"Plausible.Auth.User.cancel_email_changeset/1","doc":"","ref":"Plausible.Auth.User.html#cancel_email_changeset/1"},{"type":"function","title":"Plausible.Auth.User.changeset/2","doc":"","ref":"Plausible.Auth.User.html#changeset/2"},{"type":"function","title":"Plausible.Auth.User.email_changeset/2","doc":"","ref":"Plausible.Auth.User.html#email_changeset/2"},{"type":"function","title":"Plausible.Auth.User.end_trial/1","doc":"","ref":"Plausible.Auth.User.html#end_trial/1"},{"type":"function","title":"Plausible.Auth.User.hash_password/1","doc":"","ref":"Plausible.Auth.User.html#hash_password/1"},{"type":"function","title":"Plausible.Auth.User.new/1","doc":"","ref":"Plausible.Auth.User.html#new/1"},{"type":"function","title":"Plausible.Auth.User.password_strength/1","doc":"","ref":"Plausible.Auth.User.html#password_strength/1"},{"type":"function","title":"Plausible.Auth.User.profile_img_url/1","doc":"","ref":"Plausible.Auth.User.html#profile_img_url/1"},{"type":"function","title":"Plausible.Auth.User.remove_trial_expiry/1","doc":"","ref":"Plausible.Auth.User.html#remove_trial_expiry/1"},{"type":"function","title":"Plausible.Auth.User.set_password/2","doc":"","ref":"Plausible.Auth.User.html#set_password/2"},{"type":"function","title":"Plausible.Auth.User.settings_changeset/2","doc":"","ref":"Plausible.Auth.User.html#settings_changeset/2"},{"type":"function","title":"Plausible.Auth.User.start_trial/1","doc":"","ref":"Plausible.Auth.User.html#start_trial/1"},{"type":"function","title":"Plausible.Auth.User.subscription_accept_traffic_until_offset_days/0","doc":"","ref":"Plausible.Auth.User.html#subscription_accept_traffic_until_offset_days/0"},{"type":"function","title":"Plausible.Auth.User.trial_accept_traffic_until_offset_days/0","doc":"","ref":"Plausible.Auth.User.html#trial_accept_traffic_until_offset_days/0"},{"type":"type","title":"Plausible.Auth.User.t/0","doc":"","ref":"Plausible.Auth.User.html#t:t/0"},{"type":"module","title":"Plausible.Auth.UserAdmin","doc":"","ref":"Plausible.Auth.UserAdmin.html"},{"type":"function","title":"Plausible.Auth.UserAdmin.custom_index_query/3","doc":"","ref":"Plausible.Auth.UserAdmin.html#custom_index_query/3"},{"type":"function","title":"Plausible.Auth.UserAdmin.delete/2","doc":"","ref":"Plausible.Auth.UserAdmin.html#delete/2"},{"type":"function","title":"Plausible.Auth.UserAdmin.form_fields/1","doc":"","ref":"Plausible.Auth.UserAdmin.html#form_fields/1"},{"type":"function","title":"Plausible.Auth.UserAdmin.index/1","doc":"","ref":"Plausible.Auth.UserAdmin.html#index/1"},{"type":"function","title":"Plausible.Auth.UserAdmin.resource_actions/1","doc":"","ref":"Plausible.Auth.UserAdmin.html#resource_actions/1"},{"type":"module","title":"Plausible.Billing","doc":"","ref":"Plausible.Billing.html"},{"type":"function","title":"Plausible.Billing.active_subscription_for/1","doc":"","ref":"Plausible.Billing.html#active_subscription_for/1"},{"type":"function","title":"Plausible.Billing.cancelled_subscription_notice_dismiss_id/1","doc":"","ref":"Plausible.Billing.html#cancelled_subscription_notice_dismiss_id/1"},{"type":"function","title":"Plausible.Billing.change_plan/2","doc":"","ref":"Plausible.Billing.html#change_plan/2"},{"type":"function","title":"Plausible.Billing.change_plan_preview/2","doc":"","ref":"Plausible.Billing.html#change_plan_preview/2"},{"type":"function","title":"Plausible.Billing.check_needs_to_upgrade/1","doc":"","ref":"Plausible.Billing.html#check_needs_to_upgrade/1"},{"type":"function","title":"Plausible.Billing.format_price/1","doc":"","ref":"Plausible.Billing.html#format_price/1"},{"type":"function","title":"Plausible.Billing.has_active_subscription?/1","doc":"","ref":"Plausible.Billing.html#has_active_subscription?/1"},{"type":"function","title":"Plausible.Billing.on_trial?/1","doc":"","ref":"Plausible.Billing.html#on_trial?/1"},{"type":"function","title":"Plausible.Billing.paddle_api/0","doc":"","ref":"Plausible.Billing.html#paddle_api/0"},{"type":"function","title":"Plausible.Billing.subscription_cancelled/1","doc":"","ref":"Plausible.Billing.html#subscription_cancelled/1"},{"type":"function","title":"Plausible.Billing.subscription_created/1","doc":"","ref":"Plausible.Billing.html#subscription_created/1"},{"type":"function","title":"Plausible.Billing.subscription_is_active?/1","doc":"","ref":"Plausible.Billing.html#subscription_is_active?/1"},{"type":"function","title":"Plausible.Billing.subscription_payment_succeeded/1","doc":"","ref":"Plausible.Billing.html#subscription_payment_succeeded/1"},{"type":"function","title":"Plausible.Billing.subscription_updated/1","doc":"","ref":"Plausible.Billing.html#subscription_updated/1"},{"type":"function","title":"Plausible.Billing.trial_days_left/1","doc":"","ref":"Plausible.Billing.html#trial_days_left/1"},{"type":"module","title":"Plausible.Billing.Ecto.Feature","doc":"Ecto type representing a feature. Features are cast and stored in the\ndatabase as strings and loaded as modules, for example: `\"props\"` is loaded\nas `Plausible.Billing.Feature.Props`.","ref":"Plausible.Billing.Ecto.Feature.html"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.cast/1","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#cast/1"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.dump/1","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#dump/1"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.embed_as/1","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#embed_as/1"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.equal?/2","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#equal?/2"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.load/1","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#load/1"},{"type":"function","title":"Plausible.Billing.Ecto.Feature.type/0","doc":"","ref":"Plausible.Billing.Ecto.Feature.html#type/0"},{"type":"module","title":"Plausible.Billing.Ecto.FeatureList","doc":"Ecto type representing a list of features. This is a proxy for \n`{:array, Plausible.Billing.Ecto.Feature}` and is required for Kaffy to\nrender the HTML input correctly.","ref":"Plausible.Billing.Ecto.FeatureList.html"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.cast/1","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#cast/1"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.dump/1","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#dump/1"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.embed_as/1","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#embed_as/1"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.equal?/2","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#equal?/2"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.load/1","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#load/1"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.render_form/5","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#render_form/5"},{"type":"function","title":"Plausible.Billing.Ecto.FeatureList.type/0","doc":"","ref":"Plausible.Billing.Ecto.FeatureList.html#type/0"},{"type":"module","title":"Plausible.Billing.Ecto.Limit","doc":"Ecto type representing a limit, that can be either a number or unlimited.\nUnlimited is dumped to the database as `-1` and loaded as `:unlimited` to\nkeep compatibility with the rest of the codebase.","ref":"Plausible.Billing.Ecto.Limit.html"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.cast/1","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#cast/1"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.dump/1","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#dump/1"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.embed_as/1","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#embed_as/1"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.equal?/2","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#equal?/2"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.load/1","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#load/1"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.render_form/5","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#render_form/5"},{"type":"function","title":"Plausible.Billing.Ecto.Limit.type/0","doc":"","ref":"Plausible.Billing.Ecto.Limit.html#type/0"},{"type":"module","title":"Plausible.Billing.EnterprisePlan","doc":"","ref":"Plausible.Billing.EnterprisePlan.html"},{"type":"function","title":"Plausible.Billing.EnterprisePlan.changeset/2","doc":"","ref":"Plausible.Billing.EnterprisePlan.html#changeset/2"},{"type":"module","title":"Plausible.Billing.EnterprisePlanAdmin","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.custom_index_query/3","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#custom_index_query/3"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.form_fields/1","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#form_fields/1"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.index/1","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#index/1"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.search_fields/1","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#search_fields/1"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.update_changeset/2","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#update_changeset/2"},{"type":"behaviour","title":"Plausible.Billing.Feature","doc":"This module provides an interface for managing features, e.g. Revenue Goals,\nFunnels and Custom Properties.\n\nFeature modules have functions for toggling the feature on/off and checking\nwhether the feature is available for a site/user.\n\nWhen defining new features, the following options are expected by the\n`__using__` macro:\n\n * `:name` - an atom representing the feature name in the plan JSON\n file (see also Plausible.Billing.Plan).\n\n * `:display_name` - human-readable display name of the feature\n\n * `:toggle_field` - the field in the %Plausible.Site{} schema that toggles\n the feature. If `nil` or not set, toggle/2 silently returns `:ok`\n\n * `:free` - if set to `true`, makes the `check_availability/1` function\n always return `:ok` (no matter the user's subscription status)\n\nFunctions defined by `__using__` can be overridden if needed.","ref":"Plausible.Billing.Feature.html"},{"type":"callback","title":"Plausible.Billing.Feature.check_availability/1","doc":"Checks whether the site owner or the user plan includes the given feature.","ref":"Plausible.Billing.Feature.html#c:check_availability/1"},{"type":"callback","title":"Plausible.Billing.Feature.display_name/0","doc":"Returns the human-readable display name of the feature.","ref":"Plausible.Billing.Feature.html#c:display_name/0"},{"type":"callback","title":"Plausible.Billing.Feature.enabled?/1","doc":"Checks whether a feature is enabled or not. Returns false when the feature is\ndisabled or the user does not have access to it.","ref":"Plausible.Billing.Feature.html#c:enabled?/1"},{"type":"callback","title":"Plausible.Billing.Feature.free?/0","doc":"Returns whether the feature is free to use or not.","ref":"Plausible.Billing.Feature.html#c:free?/0"},{"type":"function","title":"Plausible.Billing.Feature.list/0","doc":"Lists all available feature modules.","ref":"Plausible.Billing.Feature.html#list/0"},{"type":"callback","title":"Plausible.Billing.Feature.name/0","doc":"Returns the atom representing the feature name in the plan JSON file.","ref":"Plausible.Billing.Feature.html#c:name/0"},{"type":"callback","title":"Plausible.Billing.Feature.opted_out?/1","doc":"Returns whether the site explicitly opted out of the feature. This function\nis different from enabled/1, because enabled/1 returns false when the site\nowner does not have access to the feature.","ref":"Plausible.Billing.Feature.html#c:opted_out?/1"},{"type":"callback","title":"Plausible.Billing.Feature.toggle/2","doc":"Toggles the feature on and off for a site. Returns\n`{:error, :upgrade_required}` when toggling a feature the site owner does not\nhave access to.","ref":"Plausible.Billing.Feature.html#c:toggle/2"},{"type":"callback","title":"Plausible.Billing.Feature.toggle_field/0","doc":"Returns the %Plausible.Site{} field that toggles the feature on and off.","ref":"Plausible.Billing.Feature.html#c:toggle_field/0"},{"type":"type","title":"Plausible.Billing.Feature.t/0","doc":"","ref":"Plausible.Billing.Feature.html#t:t/0"},{"type":"module","title":"Plausible.Billing.PaddleApi","doc":"","ref":"Plausible.Billing.PaddleApi.html"},{"type":"function","title":"Plausible.Billing.PaddleApi.checkout_domain/0","doc":"","ref":"Plausible.Billing.PaddleApi.html#checkout_domain/0"},{"type":"function","title":"Plausible.Billing.PaddleApi.fetch_prices/1","doc":"","ref":"Plausible.Billing.PaddleApi.html#fetch_prices/1"},{"type":"function","title":"Plausible.Billing.PaddleApi.get_invoices/1","doc":"","ref":"Plausible.Billing.PaddleApi.html#get_invoices/1"},{"type":"function","title":"Plausible.Billing.PaddleApi.get_subscription/1","doc":"","ref":"Plausible.Billing.PaddleApi.html#get_subscription/1"},{"type":"function","title":"Plausible.Billing.PaddleApi.update_subscription/2","doc":"","ref":"Plausible.Billing.PaddleApi.html#update_subscription/2"},{"type":"function","title":"Plausible.Billing.PaddleApi.update_subscription_preview/2","doc":"","ref":"Plausible.Billing.PaddleApi.html#update_subscription_preview/2"},{"type":"function","title":"Plausible.Billing.PaddleApi.vendors_domain/0","doc":"","ref":"Plausible.Billing.PaddleApi.html#vendors_domain/0"},{"type":"module","title":"Plausible.Billing.Plans","doc":"","ref":"Plausible.Billing.Plans.html"},{"type":"function","title":"Plausible.Billing.Plans.all/0","doc":"","ref":"Plausible.Billing.Plans.html#all/0"},{"type":"function","title":"Plausible.Billing.Plans.available_plans_for/2","doc":"","ref":"Plausible.Billing.Plans.html#available_plans_for/2"},{"type":"function","title":"Plausible.Billing.Plans.business_plans_for/1","doc":"","ref":"Plausible.Billing.Plans.html#business_plans_for/1"},{"type":"function","title":"Plausible.Billing.Plans.business_tier?/1","doc":"","ref":"Plausible.Billing.Plans.html#business_tier?/1"},{"type":"function","title":"Plausible.Billing.Plans.business_tier_launch/0","doc":"","ref":"Plausible.Billing.Plans.html#business_tier_launch/0"},{"type":"function","title":"Plausible.Billing.Plans.find/1","doc":"","ref":"Plausible.Billing.Plans.html#find/1"},{"type":"function","title":"Plausible.Billing.Plans.get_price_for/1","doc":"","ref":"Plausible.Billing.Plans.html#get_price_for/1"},{"type":"function","title":"Plausible.Billing.Plans.get_regular_plan/2","doc":"","ref":"Plausible.Billing.Plans.html#get_regular_plan/2"},{"type":"function","title":"Plausible.Billing.Plans.get_subscription_plan/1","doc":"","ref":"Plausible.Billing.Plans.html#get_subscription_plan/1"},{"type":"function","title":"Plausible.Billing.Plans.growth_plans_for/1","doc":"Returns a list of growth plans available for the user to choose.\n\nAs new versions of plans are introduced, users who were on old plans can\nstill choose from old plans.","ref":"Plausible.Billing.Plans.html#growth_plans_for/1"},{"type":"function","title":"Plausible.Billing.Plans.latest_enterprise_plan_with_price/1","doc":"","ref":"Plausible.Billing.Plans.html#latest_enterprise_plan_with_price/1"},{"type":"function","title":"Plausible.Billing.Plans.subscription_interval/1","doc":"","ref":"Plausible.Billing.Plans.html#subscription_interval/1"},{"type":"function","title":"Plausible.Billing.Plans.suggest/2","doc":"Returns the most appropriate plan for a user based on their usage during a\ngiven cycle.\n\nIf the usage during the cycle exceeds the enterprise-level threshold, or if\nthe user already belongs to an enterprise plan, it suggests the :enterprise\nplan.\n\nOtherwise, it recommends the plan where the cycle usage falls just under the\nplan's limit from the available options for the user.","ref":"Plausible.Billing.Plans.html#suggest/2"},{"type":"function","title":"Plausible.Billing.Plans.suggest_tier/1","doc":"","ref":"Plausible.Billing.Plans.html#suggest_tier/1"},{"type":"function","title":"Plausible.Billing.Plans.with_prices/1","doc":"This function takes a list of plans as an argument, gathers all product\nIDs in a single list, and makes an API call to Paddle. After a successful\nresponse, fills in the `monthly_cost` and `yearly_cost` fields for each\ngiven plan and returns the new list of plans with completed information.","ref":"Plausible.Billing.Plans.html#with_prices/1"},{"type":"function","title":"Plausible.Billing.Plans.yearly_product_ids/0","doc":"List yearly plans product IDs.","ref":"Plausible.Billing.Plans.html#yearly_product_ids/0"},{"type":"module","title":"Plausible.Billing.Quota","doc":"This module provides functions to work with plans usage and limits.","ref":"Plausible.Billing.Quota.html"},{"type":"function","title":"Plausible.Billing.Quota.allowed_features_for/1","doc":"Returns a list of features the user can use. Trial users have the\nability to use all features during their trial.","ref":"Plausible.Billing.Quota.html#allowed_features_for/1"},{"type":"function","title":"Plausible.Billing.Quota.below_limit?/2","doc":"Returns whether the usage is below the limit or not.\nReturns false if usage is equal to the limit.","ref":"Plausible.Billing.Quota.html#below_limit?/2"},{"type":"function","title":"Plausible.Billing.Quota.ensure_can_add_new_site/1","doc":"Enterprise plans are always allowed to add more sites (even when\nover limit) to avoid service disruption. Their usage is checked\nin a background job instead (see `check_usage.ex`).","ref":"Plausible.Billing.Quota.html#ensure_can_add_new_site/1"},{"type":"function","title":"Plausible.Billing.Quota.ensure_within_plan_limits/3","doc":"Ensures that the given user (or the usage map) is within the limits\nof the given plan.\n\nAn `opts` argument can be passed with `ignore_pageview_limit: true`\nwhich bypasses the pageview limit check and returns `:ok` as long as\nthe other limits are not exceeded.","ref":"Plausible.Billing.Quota.html#ensure_within_plan_limits/3"},{"type":"function","title":"Plausible.Billing.Quota.features_usage/1","doc":"Given a user, this function returns the features used across all the sites\nthis user owns + StatsAPI if the user has a configured Stats API key.\n\nGiven a site, returns the features used by the site.","ref":"Plausible.Billing.Quota.html#features_usage/1"},{"type":"function","title":"Plausible.Billing.Quota.monthly_pageview_limit/1","doc":"","ref":"Plausible.Billing.Quota.html#monthly_pageview_limit/1"},{"type":"function","title":"Plausible.Billing.Quota.monthly_pageview_usage/2","doc":"Queries the ClickHouse database for the monthly pageview usage. If the given user's\nsubscription is `active`, `past_due`, or a `deleted` (but not yet expired), a map\nwith the following structure is returned:\n\n```elixir\n%{\n current_cycle: usage_cycle(),\n last_cycle: usage_cycle(),\n penultimate_cycle: usage_cycle()\n}\n```\n\nIn all other cases of the subscription status (or a `free_10k` subscription which\ndoes not have a `last_bill_date` defined) - the following structure is returned:\n\n```elixir\n%{last_30_days: usage_cycle()}\n```\n\nGiven only a user as input, the usage is queried from across all the sites that the\nuser owns. Alternatively, given an optional argument of `site_ids`, the usage from\nacross all those sites is queried instead.","ref":"Plausible.Billing.Quota.html#monthly_pageview_usage/2"},{"type":"function","title":"Plausible.Billing.Quota.site_limit/1","doc":"","ref":"Plausible.Billing.Quota.html#site_limit/1"},{"type":"function","title":"Plausible.Billing.Quota.site_usage/1","doc":"Returns the number of sites the given user owns.","ref":"Plausible.Billing.Quota.html#site_usage/1"},{"type":"function","title":"Plausible.Billing.Quota.team_member_limit/1","doc":"","ref":"Plausible.Billing.Quota.html#team_member_limit/1"},{"type":"function","title":"Plausible.Billing.Quota.team_member_usage/1","doc":"Returns the total count of team members associated with the user's sites.\n\n* The given user (i.e. the owner) is not counted as a team member.\n\n* Pending invitations are counted as team members even before accepted.\n\n* Users are counted uniquely - i.e. even if an account is associated with\n many sites owned by the given user, they still count as one team member.","ref":"Plausible.Billing.Quota.html#team_member_usage/1"},{"type":"function","title":"Plausible.Billing.Quota.usage/2","doc":"","ref":"Plausible.Billing.Quota.html#usage/2"},{"type":"function","title":"Plausible.Billing.Quota.usage_cycle/4","doc":"","ref":"Plausible.Billing.Quota.html#usage_cycle/4"},{"type":"function","title":"Plausible.Billing.Quota.within_limit?/2","doc":"Returns whether the usage is within the limit or not.\nReturns true if usage is equal to the limit.","ref":"Plausible.Billing.Quota.html#within_limit?/2"},{"type":"type","title":"Plausible.Billing.Quota.limit/0","doc":"","ref":"Plausible.Billing.Quota.html#t:limit/0"},{"type":"type","title":"Plausible.Billing.Quota.monthly_pageview_usage/0","doc":"","ref":"Plausible.Billing.Quota.html#t:monthly_pageview_usage/0"},{"type":"type","title":"Plausible.Billing.Quota.over_limits_error/0","doc":"","ref":"Plausible.Billing.Quota.html#t:over_limits_error/0"},{"type":"type","title":"Plausible.Billing.Quota.period/0","doc":"","ref":"Plausible.Billing.Quota.html#t:period/0"},{"type":"type","title":"Plausible.Billing.Quota.usage_cycle/0","doc":"","ref":"Plausible.Billing.Quota.html#t:usage_cycle/0"},{"type":"module","title":"Plausible.Billing.SiteLocker","doc":"","ref":"Plausible.Billing.SiteLocker.html"},{"type":"function","title":"Plausible.Billing.SiteLocker.send_grace_period_end_email/1","doc":"","ref":"Plausible.Billing.SiteLocker.html#send_grace_period_end_email/1"},{"type":"function","title":"Plausible.Billing.SiteLocker.set_lock_status_for/2","doc":"","ref":"Plausible.Billing.SiteLocker.html#set_lock_status_for/2"},{"type":"function","title":"Plausible.Billing.SiteLocker.update_sites_for/2","doc":"","ref":"Plausible.Billing.SiteLocker.html#update_sites_for/2"},{"type":"type","title":"Plausible.Billing.SiteLocker.lock_reason/0","doc":"","ref":"Plausible.Billing.SiteLocker.html#t:lock_reason/0"},{"type":"type","title":"Plausible.Billing.SiteLocker.update_opt/0","doc":"","ref":"Plausible.Billing.SiteLocker.html#t:update_opt/0"},{"type":"module","title":"Plausible.Billing.Subscription.Status","doc":"The subscription statuses are stored in Paddle. They can only be changed\nthrough Paddle webhooks, which always send the current subscription status\nvia the payload.\n\n* `active` - All good with the payments. Can access stats.\n\n* `past_due` - The payment has failed, but we're trying to charge the customer\n again. Access to stats is still granted. There will be three retries - after\n 3, 5, and 7 days have passed from the first failure. After a failure on the\n final retry, the subscription status will change to `paused`. As soon as the\n customer updates their billing details, Paddle will charge them again, and\n after a successful payment, the subscription will become `active` again.\n\n* `paused` - we've tried to charge the customer but all the retries have failed.\n Stats access restricted. As soon as the customer updates their billing details,\n Paddle will charge them again, and after a successful payment, the subscription\n will become `active` again.\n\n* `deleted` - The customer has triggered the cancel subscription action. Access\n to stats should be granted for the time the customer has already paid for. If\n they want to upgrade again, new billing details have to be provided.\n\nPaddle documentation links for reference:\n\n* Subscription statuses -\n https://developer.paddle.com/classic/reference/zg9joji1mzu0mdi2-subscription-status-reference\n\n* Payment failures -\n https://developer.paddle.com/classic/guides/zg9joji1mzu0mduy-payment-failures","ref":"Plausible.Billing.Subscription.Status.html"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.active/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#active/0"},{"type":"function","title":"Plausible.Billing.Subscription.Status.active?/1","doc":"","ref":"Plausible.Billing.Subscription.Status.html#active?/1"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.deleted/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#deleted/0"},{"type":"function","title":"Plausible.Billing.Subscription.Status.deleted?/1","doc":"","ref":"Plausible.Billing.Subscription.Status.html#deleted?/1"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.in?/2","doc":"","ref":"Plausible.Billing.Subscription.Status.html#in?/2"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.past_due/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#past_due/0"},{"type":"function","title":"Plausible.Billing.Subscription.Status.past_due?/1","doc":"","ref":"Plausible.Billing.Subscription.Status.html#past_due?/1"},{"type":"macro","title":"Plausible.Billing.Subscription.Status.paused/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#paused/0"},{"type":"function","title":"Plausible.Billing.Subscription.Status.paused?/1","doc":"","ref":"Plausible.Billing.Subscription.Status.html#paused?/1"},{"type":"function","title":"Plausible.Billing.Subscription.Status.valid_statuses/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#valid_statuses/0"},{"type":"type","title":"Plausible.Billing.Subscription.Status.status/0","doc":"","ref":"Plausible.Billing.Subscription.Status.html#t:status/0"},{"type":"module","title":"Plausible.ChangesetHelpers","doc":"Helper function for working with Ecto changesets","ref":"Plausible.ChangesetHelpers.html"},{"type":"function","title":"Plausible.ChangesetHelpers.traverse_errors/1","doc":"","ref":"Plausible.ChangesetHelpers.html#traverse_errors/1"},{"type":"module","title":"Plausible.Cldr","doc":"Provides the core functions to retrieve and manage\nthe CLDR data that supports formatting and localisation.\n\nIt provides the core functions to access formatted\nCLDR data, set and retrieve a current locale and validate\ncertain core data types such as locales, currencies and\nterritories.","ref":"Plausible.Cldr.html"},{"type":"function","title":"Plausible.Cldr.available_locale_name?/1","doc":"","ref":"Plausible.Cldr.html#available_locale_name?/1"},{"type":"function","title":"Plausible.Cldr.default_locale/0","doc":"Returns the default `locale`.","ref":"Plausible.Cldr.html#default_locale/0"},{"type":"function","title":"Example - Plausible.Cldr.default_locale/0","doc":"iex> Plausible.Cldr.default_locale()\n %Cldr.LanguageTag{\n backend: Plausible.Cldr,\n canonical_locale_name: \"en-001\",\n cldr_locale_name: :\"en-001\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: \"en\",\n language: \"en\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :en,\n requested_locale_name: \"en-001\",\n script: :Latn,\n territory: :\"001\",\n transform: %{},\n language_variants: []\n }","ref":"Plausible.Cldr.html#default_locale/0-example"},{"type":"function","title":"Plausible.Cldr.default_territory/0","doc":"Returns the default territory when a locale\ndoes not specify one and none can be inferred.","ref":"Plausible.Cldr.html#default_territory/0"},{"type":"function","title":"Example - Plausible.Cldr.default_territory/0","doc":"iex> Plausible.Cldr.default_territory()\n :\"001\"","ref":"Plausible.Cldr.html#default_territory/0-example"},{"type":"function","title":"Plausible.Cldr.ellipsis/2","doc":"Add locale-specific ellipsis to a string.","ref":"Plausible.Cldr.html#ellipsis/2"},{"type":"function","title":"Arguments - Plausible.Cldr.ellipsis/2","doc":"* `string` is any `String.t` or a 2-element list\n of `String.t` between which the ellipsis is inserted.\n\n* `backend` is any module that includes `use Cldr` and therefore\n is a `Cldr` backend module. The default is `Cldr.default_backend!/0`.\n Note that `Cldr.default_backend!/0` will raise an exception if\n no `:default_backend` is configured under the `:ex_cldr` key in\n `config.exs`.\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.html#ellipsis/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.ellipsis/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/1`.\n The default is `Cldr.get_locale/0`.\n\n* `:location` determines where to place the ellipsis. The options are\n `:after` (the default for a single string argument), `:between`\n (the default and only valid location for an argument that is a list\n of two strings) and `:before`.\n\n* `:format` formats based upon whether the ellipsis\n is inserted between words or sentences. The valid options are\n `:word` or `:sentence`. The default is `:sentence`.","ref":"Plausible.Cldr.html#ellipsis/2-options"},{"type":"function","title":"Examples - Plausible.Cldr.ellipsis/2","doc":"iex> Plausible.Cldr.ellipsis \"And furthermore\"\n \"And furthermore…\"\n\n iex> Plausible.Cldr.ellipsis [\"And furthermore\", \"there is much to be done\"], locale: :ja\n \"And furthermore…there is much to be done\"\n\n iex> Plausible.Cldr.ellipsis \"And furthermore\", format: :word\n \"And furthermore …\"\n\n iex> Plausible.Cldr.ellipsis [\"And furthermore\", \"there is much to be done\"], locale: :ja, format: :word\n \"And furthermore … there is much to be done\"","ref":"Plausible.Cldr.html#ellipsis/2-examples"},{"type":"function","title":"Plausible.Cldr.get_locale/0","doc":"Return the current locale to be used for `Cldr` functions that\ntake an optional locale parameter for which a locale is not supplied.","ref":"Plausible.Cldr.html#get_locale/0"},{"type":"function","title":"Example - Plausible.Cldr.get_locale/0","doc":"iex> Plausible.Cldr.put_locale(\"pl\")\n iex> Plausible.Cldr.get_locale\n %Cldr.LanguageTag{\n backend: Elixir.Plausible.Cldr,\n canonical_locale_name: \"pl\",\n cldr_locale_name: :pl,\n extensions: %{},\n language: \"pl\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :pl,\n territory: :PL,\n requested_locale_name: \"pl\",\n script: :Latn,\n transform: %{},\n language_variants: []\n }","ref":"Plausible.Cldr.html#get_locale/0-example"},{"type":"function","title":"Plausible.Cldr.known_calendars/0","doc":"","ref":"Plausible.Cldr.html#known_calendars/0"},{"type":"function","title":"Plausible.Cldr.known_currencies/0","doc":"","ref":"Plausible.Cldr.html#known_currencies/0"},{"type":"function","title":"Plausible.Cldr.known_gettext_locale_name/1","doc":"Returns either the Gettext `locale_name` in Cldr format or\n`false` based upon whether the locale name is configured in\n`Gettext`.","ref":"Plausible.Cldr.html#known_gettext_locale_name/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_gettext_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_gettext_locale_names/0`","ref":"Plausible.Cldr.html#known_gettext_locale_name/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_gettext_locale_name/1","doc":"iex> Plausible.Cldr.known_gettext_locale_name \"en\"\n \"en\"\n\n iex> Plausible.Cldr.known_gettext_locale_name \"en-SA\"\n false","ref":"Plausible.Cldr.html#known_gettext_locale_name/1-examples"},{"type":"function","title":"Plausible.Cldr.known_gettext_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Gettext.","ref":"Plausible.Cldr.html#known_gettext_locale_name?/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_gettext_locale_name?/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_gettext_locale_name?/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_gettext_locale_name?/1","doc":"iex> Plausible.Cldr.known_gettext_locale_name?(\"en\")\n true\n\n iex> Plausible.Cldr.known_gettext_locale_name?(\"!!\")\n false","ref":"Plausible.Cldr.html#known_gettext_locale_name?/1-examples"},{"type":"function","title":"Plausible.Cldr.known_gettext_locale_names/0","doc":"Returns a list of Gettext locale names but in CLDR format with\nunderscore replaced by hyphen in order to facilitate comparisons\nwith `Cldr` locale names.","ref":"Plausible.Cldr.html#known_gettext_locale_names/0"},{"type":"function","title":"Plausible.Cldr.known_locale_name/1","doc":"Returns either the `locale_name` or `false` based upon\nwhether the locale name is configured in `Cldr`.\n\nThis is helpful when building a list of `or` expressions\nto return the first known locale name from a list.","ref":"Plausible.Cldr.html#known_locale_name/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_locale_name/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_locale_name/1","doc":"iex> Plausible.Cldr.known_locale_name :\"en-AU\"\n :\"en-AU\"\n\n iex> Plausible.Cldr.known_locale_name :\"en-SA\"\n false","ref":"Plausible.Cldr.html#known_locale_name/1-examples"},{"type":"function","title":"Plausible.Cldr.known_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Cldr.","ref":"Plausible.Cldr.html#known_locale_name?/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_locale_name?/1","doc":"* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_locale_name?/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_locale_name?/1","doc":"iex> Plausible.Cldr.known_locale_name?(:en)\n true\n\n iex> Plausible.Cldr.known_locale_name?(:\"!!\")\n false","ref":"Plausible.Cldr.html#known_locale_name?/1-examples"},{"type":"function","title":"Plausible.Cldr.known_locale_names/0","doc":"Returns a list of the known locale names.\n\nKnown locales are those locales which\nare the subset of all CLDR locales that\nhave been configured for use either\nin this module or in `Gettext`.","ref":"Plausible.Cldr.html#known_locale_names/0"},{"type":"function","title":"Plausible.Cldr.known_number_system_types/0","doc":"Returns a list of atoms representing the number systems types known to `Cldr`.","ref":"Plausible.Cldr.html#known_number_system_types/0"},{"type":"function","title":"Example - Plausible.Cldr.known_number_system_types/0","doc":"iex> Plausible.Cldr.known_number_system_types\n [:default, :finance, :native, :traditional]","ref":"Plausible.Cldr.html#known_number_system_types/0-example"},{"type":"function","title":"Plausible.Cldr.known_number_systems/0","doc":"","ref":"Plausible.Cldr.html#known_number_systems/0"},{"type":"function","title":"Plausible.Cldr.known_rbnf_locale_name/1","doc":"Returns either the RBNF `locale_name` or `false` based upon\nwhether the locale name is configured in `Cldr`\nand has RBNF rules defined.","ref":"Plausible.Cldr.html#known_rbnf_locale_name/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_rbnf_locale_name/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_rbnf_locale_name/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_rbnf_locale_name/1","doc":"iex> Plausible.Cldr.known_rbnf_locale_name :en\n :en\n\n iex> Plausible.Cldr.known_rbnf_locale_name :\"en-SA\"\n false","ref":"Plausible.Cldr.html#known_rbnf_locale_name/1-examples"},{"type":"function","title":"Plausible.Cldr.known_rbnf_locale_name?/1","doc":"Returns a boolean indicating if the specified locale\nname is configured and available in Cldr and supports\nrules based number formats (RBNF).","ref":"Plausible.Cldr.html#known_rbnf_locale_name?/1"},{"type":"function","title":"Arguments - Plausible.Cldr.known_rbnf_locale_name?/1","doc":"* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.html#known_rbnf_locale_name?/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.known_rbnf_locale_name?/1","doc":"iex> Plausible.Cldr.known_rbnf_locale_name?(:en)\n true\n\n iex> Plausible.Cldr.known_rbnf_locale_name?(:\"!!\")\n false","ref":"Plausible.Cldr.html#known_rbnf_locale_name?/1-examples"},{"type":"function","title":"Plausible.Cldr.known_rbnf_locale_names/0","doc":"Returns a list of locale names which have rules-based number\nformats (RBNF).","ref":"Plausible.Cldr.html#known_rbnf_locale_names/0"},{"type":"function","title":"Plausible.Cldr.known_territories/0","doc":"","ref":"Plausible.Cldr.html#known_territories/0"},{"type":"function","title":"Plausible.Cldr.normalize_lenient_parse/3","doc":"Normalizes a string by applying transliteration\nof common symbols in numbers, currencies and dates","ref":"Plausible.Cldr.html#normalize_lenient_parse/3"},{"type":"function","title":"Plausible.Cldr.put_locale/1","doc":"Set the current locale to be used for `Cldr` functions that\ntake an optional locale parameter for which a locale is not supplied.","ref":"Plausible.Cldr.html#put_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.put_locale/1","doc":"* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `t:Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`\n\nSee [rfc5646](https://tools.ietf.org/html/rfc5646) for the specification\nof a language tag.","ref":"Plausible.Cldr.html#put_locale/1-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.put_locale/1","doc":"iex> Plausible.Cldr.put_locale(\"en\")\n {:ok,\n %Cldr.LanguageTag{\n backend: Plausible.Cldr,\n canonical_locale_name: \"en\",\n cldr_locale_name: :en,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: \"en\",\n language: \"en\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :en,\n requested_locale_name: \"en\",\n script: :Latn,\n territory: :US,\n transform: %{},\n language_variants: []\n }}\n\n iex> Plausible.Cldr.put_locale(\"invalid-locale!\")\n {:error, {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"!\\\" starting at position 15\"}}","ref":"Plausible.Cldr.html#put_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.quote/2","doc":"Add locale-specific quotation marks around a string.","ref":"Plausible.Cldr.html#quote/2"},{"type":"function","title":"Arguments - Plausible.Cldr.quote/2","doc":"* `string` is any valid Elixir string\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.html#quote/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.quote/2","doc":"* `locale` is any valid locale name returned by `Cldr.known_locale_names/1`.\n The default is `Cldr.get_locale/0`","ref":"Plausible.Cldr.html#quote/2-options"},{"type":"function","title":"Examples - Plausible.Cldr.quote/2","doc":"iex> Plausible.Cldr.quote \"Quoted String\"\n \"“Quoted String”\"\n\n iex> Plausible.Cldr.quote \"Quoted String\", locale: :ja\n \"「Quoted String」\"","ref":"Plausible.Cldr.html#quote/2-examples"},{"type":"function","title":"Plausible.Cldr.unknown_locale_names/0","doc":"Returns a list of the locales names that are configured,\nbut not known in CLDR.\n\nSince there is a compile-time exception raised if there are\nany unknown locales this function should always\nreturn an empty list.","ref":"Plausible.Cldr.html#unknown_locale_names/0"},{"type":"function","title":"Plausible.Cldr.validate_calendar/1","doc":"","ref":"Plausible.Cldr.html#validate_calendar/1"},{"type":"function","title":"Plausible.Cldr.validate_currency/1","doc":"","ref":"Plausible.Cldr.html#validate_currency/1"},{"type":"function","title":"Plausible.Cldr.validate_locale/1","doc":"Normalise and validate a locale name.","ref":"Plausible.Cldr.html#validate_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.validate_locale/1","doc":"* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.html#validate_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.validate_locale/1","doc":"* `{:ok, language_tag}`\n\n* `{:error, reason}`","ref":"Plausible.Cldr.html#validate_locale/1-returns"},{"type":"function","title":"Notes - Plausible.Cldr.validate_locale/1","doc":"See [rfc5646](https://tools.ietf.org/html/rfc5646) for the specification\nof a language tag.","ref":"Plausible.Cldr.html#validate_locale/1-notes"},{"type":"function","title":"Examples - Plausible.Cldr.validate_locale/1","doc":"iex> Plausible.Cldr.validate_locale(:en)\n {:ok,\n %Cldr.LanguageTag{\n backend: Plausible.Cldr,\n canonical_locale_name: \"en\",\n cldr_locale_name: :en,\n extensions: %{},\n gettext_locale_name: \"en\",\n language: \"en\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :en,\n requested_locale_name: \"en\",\n script: :Latn,\n territory: :US,\n transform: %{},\n language_variants: []\n }}\n\n\n iex> Plausible.Cldr.validate_locale Plausible.Cldr.default_locale()\n {:ok,\n %Cldr.LanguageTag{\n backend: Plausible.Cldr,\n canonical_locale_name: \"en-001\",\n cldr_locale_name: :\"en-001\",\n extensions: %{},\n gettext_locale_name: \"en\",\n language: \"en\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :en,\n requested_locale_name: \"en-001\",\n script: :Latn,\n territory: :\"001\",\n transform: %{},\n language_variants: []\n }}\n\n iex> Plausible.Cldr.validate_locale(\"zzz\")\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zzz\\\" is invalid\"}}","ref":"Plausible.Cldr.html#validate_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.validate_number_system/1","doc":"","ref":"Plausible.Cldr.html#validate_number_system/1"},{"type":"function","title":"Plausible.Cldr.validate_number_system_type/1","doc":"Normalise and validate a number system type.","ref":"Plausible.Cldr.html#validate_number_system_type/1"},{"type":"function","title":"Arguments - Plausible.Cldr.validate_number_system_type/1","doc":"* `number_system_type` is any number system type returned by\n `Cldr.known_number_system_types/1`","ref":"Plausible.Cldr.html#validate_number_system_type/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.validate_number_system_type/1","doc":"* `{:ok, normalized_number_system_type}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.html#validate_number_system_type/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.validate_number_system_type/1","doc":"iex> Plausible.Cldr.validate_number_system_type :default\n {:ok, :default}\n\n iex> Plausible.Cldr.validate_number_system_type :traditional\n {:ok, :traditional}\n\n iex> Plausible.Cldr.validate_number_system_type :latn\n {\n :error,\n {Cldr.UnknownNumberSystemTypeError, \"The number system type :latn is unknown\"}\n }\n\n iex> Plausible.Cldr.validate_number_system_type \"bork\"\n {\n :error,\n {Cldr.UnknownNumberSystemTypeError, \"The number system type \\\"bork\\\" is invalid\"}\n }","ref":"Plausible.Cldr.html#validate_number_system_type/1-examples"},{"type":"function","title":"Plausible.Cldr.validate_territory/1","doc":"","ref":"Plausible.Cldr.html#validate_territory/1"},{"type":"function","title":"Plausible.Cldr.with_locale/2","doc":"Execute a function with a locale ensuring that the\ncurrent locale is restored after the function.","ref":"Plausible.Cldr.html#with_locale/2"},{"type":"function","title":"Arguments - Plausible.Cldr.with_locale/2","doc":"* `locale` is any valid locale name returned by `Cldr.known_locale_names/1`.\n\n* `fun` is any 0-arity function or function capture.","ref":"Plausible.Cldr.html#with_locale/2-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.with_locale/2","doc":"* The value returned by the function `fun/0` or\n\n* `{:error, {exception, reason}}` if the locale is invalid or\n\n* raises an exception if the current locale cannot be\n identified.","ref":"Plausible.Cldr.html#with_locale/2-returns"},{"type":"module","title":"Plausible.Cldr.AcceptLanguage","doc":"Parses HTTP `Accept-Language` header values as defined in\n[rfc2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4).\n\nThe Accept-Language request-header field is similar to Accept, but restricts\nthe set of natural languages that are preferred as a response to the request.\nLanguage tags function are provided in `Cldr.LanguageTag`.\n\nThe format of an `Accept-Language` header is as follows in `ABNF` format:\n\n Accept-Language = \"Accept-Language\" \":\"\n 1#( language-range [ \";\" \"q\" \"=\" qvalue ] )\n language-range = ( ( 1*8ALPHA *( \"-\" 1*8ALPHA ) ) | \"*\" )\n\nEach language-range MAY be given an associated quality value which represents an\nestimate of the user's preference for the languages specified by that range. The\nquality value defaults to \"q=1\". For example,\n\n Accept-Language: da, en-gb;q=0.8, en;q=0.7\n\nwould mean: \"I prefer Danish, but will accept British English and other types of English.\"","ref":"Plausible.Cldr.AcceptLanguage.html"},{"type":"function","title":"Plausible.Cldr.AcceptLanguage.best_match/1","doc":"Parse an `Accept-Language` string and return the best match for\na configured `Cldr` locale.","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1"},{"type":"function","title":"Arguments - Plausible.Cldr.AcceptLanguage.best_match/1","doc":"* `accept_langauge` is a string representing an accept language header","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.AcceptLanguage.best_match/1","doc":"* `{:ok, language_tag}` or\n\n* `{:error, reason}`","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.AcceptLanguage.best_match/1","doc":"iex> Plausible.Cldr.AcceptLanguage.best_match(\"da;q=0.1,zh-TW;q=0.3\", TestBackend.Cldr)\n {:ok,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }}\n\n iex> Plausible.Cldr.AcceptLanguage.best_match(\"da;q=0.1,zh-TW;q=0.3\", TestBackend.Cldr)\n {:ok,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }}\n\n iex> Plausible.Cldr.AcceptLanguage.best_match(\"xx,yy;q=0.3\")\n {:error,\n {Cldr.NoMatchingLocale,\n \"No configured locale could be matched to \\\"xx,yy;q=0.3\\\"\"}}\n\n iex> Plausible.Cldr.AcceptLanguage.best_match(\"invalid_tag\")\n {:error, {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"g\\\" starting at position 11\"}}","ref":"Plausible.Cldr.AcceptLanguage.html#best_match/1-examples"},{"type":"function","title":"Plausible.Cldr.AcceptLanguage.parse/1","doc":"Parses an `Accept-Language` header value in its string\nor tokenized form to return a tuple of the form\n`{:ok, [{quality, %Cldr.LanguageTag{}}, ...]}` sorted by quality.","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1"},{"type":"function","title":"Arguments - Plausible.Cldr.AcceptLanguage.parse/1","doc":"* `accept-language` is any string in the format defined by\n [rfc2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4)\n\n* `backend` is any module that includes `use Cldr` and therefore\n is a `Cldr` backend module","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.AcceptLanguage.parse/1","doc":"* `{:ok, [{quality, language_tag}, ...]}` or\n\n* `{:error, {Cldr.AcceptLanguageError, String.t}}`\n\nIf at least one valid language tag is found but errors are also\ndetected on one more more tags, an `{ok, list}` tuple is returned\nwuth an error tuple for each invalid tag added at the end of the list.","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1-returns"},{"type":"function","title":"Example - Plausible.Cldr.AcceptLanguage.parse/1","doc":"iex> Cldr.AcceptLanguage.parse(\"da,zh-TW;q=0.3\", TestBackend.Cldr)\n {:ok,\n [\n {1.0,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"da\",\n cldr_locale_name: :da,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"da\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :da,\n requested_locale_name: \"da\",\n script: :Latn,\n territory: :DK,\n transform: %{},\n language_variants: []\n }},\n {0.3,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }}\n ]}\n\n iex> Plausible.Cldr.AcceptLanguage.parse(\"invalid_tag\")\n {:error,\n {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"g\\\" starting at position 11\"}}\n\n iex> Plausible.Cldr.AcceptLanguage.parse(\"da,zh-TW;q=0.3,invalid_tag\")\n {:ok,\n [\n {1.0,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"da\",\n cldr_locale_name: :da,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"da\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :da,\n requested_locale_name: \"da\",\n script: :Latn,\n territory: :DK,\n transform: %{},\n language_variants: []\n }},\n {0.3,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }},\n {:error,\n {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"g\\\" starting at position 11\"}}\n ]}","ref":"Plausible.Cldr.AcceptLanguage.html#parse/1-example"},{"type":"function","title":"Plausible.Cldr.AcceptLanguage.parse!/1","doc":"Parses an `Accept-Language` header value in its string\nor tokenized form to produce a list of tuples of the form\n`[{quality, %Cldr.LanguageTag{}}, ...]` sorted by quality\nin descending order.","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1"},{"type":"function","title":"Arguments - Plausible.Cldr.AcceptLanguage.parse!/1","doc":"* `accept-language` is any string in the format defined by [rfc2616](https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4)","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.AcceptLanguage.parse!/1","doc":"* `{:ok, [{quality, language_tag}, ...]}` or\n\n* raises a `Cldr.AcceptLanguageError` exception\n\nIf at least one valid language tag is found but errors are also\ndetected on one more more tags, an `{ok, list}` tuple is returned\nwuth an error tuple for each invalid tag added at the end of the list.","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1-returns"},{"type":"function","title":"Example - Plausible.Cldr.AcceptLanguage.parse!/1","doc":"iex> Plausible.Cldr.AcceptLanguage.parse!(\"da,zh-TW;q=0.3\")\n [\n {1.0,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"da\",\n cldr_locale_name: :da,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"da\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :da,\n requested_locale_name: \"da\",\n script: :Latn,\n territory: :DK,\n transform: %{},\n language_variants: []\n }},\n {0.3,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }}\n ]\n\n Plausible.Cldr.AcceptLanguage.parse! \"invalid_tag\"\n ** (Cldr.AcceptLanguageError) \"Expected a BCP47 language tag. Could not parse the remaining \"g\" starting at position 11\n (ex_cldr) lib/cldr/accept_language.ex:304: Cldr.AcceptLanguage.parse!/1\n\n iex> Plausible.Cldr.AcceptLanguage.parse!(\"da,zh-TW;q=0.3,invalid_tag\")\n [\n {1.0,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"da\",\n cldr_locale_name: :da,\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"da\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :da,\n requested_locale_name: \"da\",\n script: :Latn,\n territory: :DK,\n transform: %{},\n language_variants: []\n }},\n {0.3,\n %Cldr.LanguageTag{\n backend: TestBackend.Cldr,\n canonical_locale_name: \"zh-TW\",\n cldr_locale_name: :\"zh-Hant\",\n language_subtags: [],\n extensions: %{},\n gettext_locale_name: nil,\n language: \"zh\",\n locale: %{},\n private_use: [],\n rbnf_locale_name: :\"zh-Hant\",\n requested_locale_name: \"zh-TW\",\n script: :Hant,\n territory: :TW,\n transform: %{},\n language_variants: []\n }},\n {:error,\n {Cldr.LanguageTag.ParseError,\n \"Expected a BCP47 language tag. Could not parse the remaining \\\"g\\\" starting at position 11\"}}\n ]","ref":"Plausible.Cldr.AcceptLanguage.html#parse!/1-example"},{"type":"module","title":"Plausible.Cldr.Currency","doc":"","ref":"Plausible.Cldr.Currency.html"},{"type":"function","title":"Plausible.Cldr.Currency.currencies_for_locale/3","doc":"Returns a map of the metadata for all currencies for\na given locale.","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currencies_for_locale/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`\n\n* `currency_status` is `:all`, `:current`, `:historic`,\n `unannotated` or `:tender`; or a list of one or more status.\n The default is `:all`. See `Cldr.Currency.currency_filter/2`.","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currencies_for_locale/3","doc":"* `{:ok, currency_map}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currencies_for_locale/3","doc":"MyApp.Cldr.Currency.currencies_for_locale \"en\"\n => {:ok,\n %{\n FJD: %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"FJD\",\n count: %{one: \"Fijian dollar\", other: \"Fijian dollars\"},\n digits: 2,\n from: nil,\n iso_digits: 2,\n name: \"Fijian Dollar\",\n narrow_symbol: \"$\",\n rounding: 0,\n symbol: \"FJD\",\n tender: true,\n to: nil\n },\n SUR: %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"SUR\",\n count: %{one: \"Soviet rouble\", other: \"Soviet roubles\"},\n digits: 2,\n from: nil,\n iso_digits: nil,\n name: \"Soviet Rouble\",\n narrow_symbol: nil,\n rounding: 0,\n symbol: \"SUR\",\n tender: true,\n to: nil\n },\n ...\n }}","ref":"Plausible.Cldr.Currency.html#currencies_for_locale/3-example"},{"type":"function","title":"Plausible.Cldr.Currency.currencies_for_locale!/3","doc":"Returns a map of the metadata for all currencies for\na given locale and raises on error.","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currencies_for_locale!/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`\n\n* `currency_status` is `:all`, `:current`, `:historic`,\n `unannotated` or `:tender`; or a list of one or more status.\n The default is `:all`. See `Cldr.Currency.currency_filter/2`.","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currencies_for_locale!/3","doc":"* `{:ok, currency_map}` or\n\n* raises an exception","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currencies_for_locale!/3","doc":"MyApp.Cldr.Currency.currencies_for_locale! \"en\"\n => %{\n FJD: %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"FJD\",\n count: %{one: \"Fijian dollar\", other: \"Fijian dollars\"},\n digits: 2,\n from: nil,\n iso_digits: 2,\n name: \"Fijian Dollar\",\n narrow_symbol: \"$\",\n rounding: 0,\n symbol: \"FJD\",\n tender: true,\n to: nil\n },\n SUR: %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"SUR\",\n count: %{one: \"Soviet rouble\", other: \"Soviet roubles\"},\n digits: 2,\n from: nil,\n iso_digits: nil,\n name: \"Soviet Rouble\",\n narrow_symbol: nil,\n rounding: 0,\n symbol: \"SUR\",\n tender: true,\n to: nil\n },\n ...\n }","ref":"Plausible.Cldr.Currency.html#currencies_for_locale!/3-example"},{"type":"function","title":"Plausible.Cldr.Currency.currency_for_code/2","doc":"Returns the currency metadata for the requested currency code.","ref":"Plausible.Cldr.Currency.html#currency_for_code/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_for_code/2","doc":"* `currency_or_currency_code` is a `binary` or `atom` representation\n of an ISO 4217 currency code, or a `%Cldr.Currency{}` struct.","ref":"Plausible.Cldr.Currency.html#currency_for_code/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Currency.currency_for_code/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`","ref":"Plausible.Cldr.Currency.html#currency_for_code/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_for_code/2","doc":"* A `{:ok, currency}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#currency_for_code/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.currency_for_code/2","doc":"iex> Plausible.Cldr.Currency.currency_for_code(\"AUD\")\n {:ok,\n %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"AUD\",\n count: %{one: \"Australian dollar\", other: \"Australian dollars\"},\n digits: 2,\n iso_digits: 2,\n name: \"Australian Dollar\",\n narrow_symbol: \"$\",\n rounding: 0,\n symbol: \"A$\",\n tender: true\n }}\n\n iex> Plausible.Cldr.Currency.currency_for_code(\"THB\")\n {:ok,\n %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"THB\",\n count: %{one: \"Thai baht\", other: \"Thai baht\"},\n digits: 2,\n iso_digits: 2,\n name: \"Thai Baht\",\n narrow_symbol: \"฿\",\n rounding: 0,\n symbol: \"THB\",\n tender: true\n }}","ref":"Plausible.Cldr.Currency.html#currency_for_code/2-examples"},{"type":"function","title":"Plausible.Cldr.Currency.currency_for_code!/2","doc":"Returns the currency metadata for the requested currency code.","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_for_code!/2","doc":"* `currency_or_currency_code` is a `binary` or `atom` representation\n of an ISO 4217 currency code, or a `%Cldr.Currency{}` struct.","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Currency.currency_for_code!/2","doc":"* `:locale` is any valid locale name returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_for_code!/2","doc":"* A `t:Cldr.Current.t/0` or\n\n* raises an exception","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.currency_for_code!/2","doc":"iex> Plausible.Cldr.Currency.currency_for_code!(\"AUD\")\n %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"AUD\",\n count: %{one: \"Australian dollar\", other: \"Australian dollars\"},\n digits: 2,\n iso_digits: 2,\n name: \"Australian Dollar\",\n narrow_symbol: \"$\",\n rounding: 0,\n symbol: \"A$\",\n tender: true\n }\n\n iex> Plausible.Cldr.Currency.currency_for_code!(\"THB\")\n %Cldr.Currency{\n cash_digits: 2,\n cash_rounding: 0,\n code: \"THB\",\n count: %{one: \"Thai baht\", other: \"Thai baht\"},\n digits: 2,\n iso_digits: 2,\n name: \"Thai Baht\",\n narrow_symbol: \"฿\",\n rounding: 0,\n symbol: \"THB\",\n tender: true\n }","ref":"Plausible.Cldr.Currency.html#currency_for_code!/2-examples"},{"type":"function","title":"Plausible.Cldr.Currency.currency_from_locale/1","doc":"Returns the effective currency for a given locale","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_from_locale/1","doc":"* `locale` is a `Cldr.LanguageTag` struct returned by\n `Cldr.Locale.new!/2`","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_from_locale/1","doc":"* A ISO 4217 currency code as an upcased atom","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.currency_from_locale/1","doc":"iex> {:ok, locale} = Plausible.Cldr.validate_locale \"en\"\n iex> Plausible.Cldr.Currency.currency_from_locale locale\n :USD\n\n iex> {:ok, locale} = Plausible.Cldr.validate_locale \"en-AU\"\n iex> Plausible.Cldr.Currency.currency_from_locale locale\n :AUD\n\n iex> Plausible.Cldr.Currency.currency_from_locale \"en-GB\"\n :GBP","ref":"Plausible.Cldr.Currency.html#currency_from_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.Currency.currency_history_for_locale/1","doc":"Returns a list of historic and the current\ncurrency for a given locale.","ref":"Plausible.Cldr.Currency.html#currency_history_for_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_history_for_locale/1","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Currency.html#currency_history_for_locale/1-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currency_history_for_locale/1","doc":"iex> MyApp.Cldr.Currency.currency_history_for_locale \"en\"\n {:ok,\n %{\n USD: %{from: ~D[1792-01-01], to: nil},\n USN: %{tender: false},\n USS: %{from: nil, tender: false, to: ~D[2014-03-01]}\n }\n }","ref":"Plausible.Cldr.Currency.html#currency_history_for_locale/1-example"},{"type":"function","title":"Plausible.Cldr.Currency.currency_strings/3","doc":"Returns a map that matches a currency string to a\ncurrency code.\n\nA currency string is a localised name or symbol\nrepresenting a currency in a locale-specific manner.","ref":"Plausible.Cldr.Currency.html#currency_strings/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_strings/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`\n\n* `currency_status` is `:all`, `:current`, `:historic`,\n `unannotated` or `:tender`; or a list of one or more status.\n The default is `:all`. See `Cldr.Currency.currency_filter/2`.","ref":"Plausible.Cldr.Currency.html#currency_strings/3-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_strings/3","doc":"* `{:ok, currency_string_map}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#currency_strings/3-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currency_strings/3","doc":"MyApp.Cldr.Currency.currency_strings \"en\"\n => {:ok,\n %{\n \"mexican silver pesos\" => :MXP,\n \"sudanese dinar\" => :SDD,\n \"bad\" => :BAD,\n \"rsd\" => :RSD,\n \"swazi lilangeni\" => :SZL,\n \"zairean new zaire\" => :ZRN,\n \"guyanaese dollars\" => :GYD,\n \"equatorial guinean ekwele\" => :GQE,\n ...\n }}","ref":"Plausible.Cldr.Currency.html#currency_strings/3-example"},{"type":"function","title":"Plausible.Cldr.Currency.currency_strings!/3","doc":"Returns a map that matches a currency string to a\ncurrency code or raises an exception.\n\nA currency string is a localised name or symbol\nrepresenting a currency in a locale-specific manner.","ref":"Plausible.Cldr.Currency.html#currency_strings!/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.currency_strings!/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`\n\n* `currency_status` is `:all`, `:current`, `:historic`,\n `unannotated` or `:tender`; or a list of one or more status.\n The default is `:all`. See `Cldr.Currency.currency_filter/2`.","ref":"Plausible.Cldr.Currency.html#currency_strings!/3-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.currency_strings!/3","doc":"* `{:ok, currency_string_map}` or\n\n* raises an exception","ref":"Plausible.Cldr.Currency.html#currency_strings!/3-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.currency_strings!/3","doc":"MyApp.Cldr.Currency.currency_strings! \"en\"\n => %{\n \"mexican silver pesos\" => :MXP,\n \"sudanese dinar\" => :SDD,\n \"bad\" => :BAD,\n \"rsd\" => :RSD,\n \"swazi lilangeni\" => :SZL,\n \"zairean new zaire\" => :ZRN,\n \"guyanaese dollars\" => :GYD,\n \"equatorial guinean ekwele\" => :GQE,\n ...\n }","ref":"Plausible.Cldr.Currency.html#currency_strings!/3-example"},{"type":"function","title":"Plausible.Cldr.Currency.current_currency_from_locale/1","doc":"Returns the current currency for a given locale.\n\nThis function does not consider the `U` extenion\nparameters `cu` or `rg`. It is recommended to us\n`Cldr.Currency.currency_from_locale/1` in most\ncircumstances.","ref":"Plausible.Cldr.Currency.html#current_currency_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.current_currency_from_locale/1","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Currency.html#current_currency_from_locale/1-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Currency.current_currency_from_locale/1","doc":"iex> MyApp.Cldr.Currency.current_currency_from_locale \"en\"\n :USD\n\n iex> MyApp.Cldr.Currency.current_currency_from_locale \"en-AU\"\n :AUD","ref":"Plausible.Cldr.Currency.html#current_currency_from_locale/1-example"},{"type":"function","title":"Plausible.Cldr.Currency.current_territory_currencies/0","doc":"Returns a mapping from a territory code to its\ncurrent currency code.\n\nIf a territory has no current currency (like\nAntartica, territory code `:AQ`) then no\nmapping is returned for that territory.","ref":"Plausible.Cldr.Currency.html#current_territory_currencies/0"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.current_territory_currencies/0","doc":"* A map of `{territory_code => Cldr.Currency.t}`","ref":"Plausible.Cldr.Currency.html#current_territory_currencies/0-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.current_territory_currencies/0","doc":"iex> Plausible.Cldr.Currency.current_territory_currencies()","ref":"Plausible.Cldr.Currency.html#current_territory_currencies/0-example"},{"type":"function","title":"Plausible.Cldr.Currency.known_currencies/0","doc":"","ref":"Plausible.Cldr.Currency.html#known_currencies/0"},{"type":"function","title":"Plausible.Cldr.Currency.known_currency?/1","doc":"","ref":"Plausible.Cldr.Currency.html#known_currency?/1"},{"type":"function","title":"Plausible.Cldr.Currency.known_currency_code/1","doc":"Returns a 2-tuple indicating if the supplied currency code is known.","ref":"Plausible.Cldr.Currency.html#known_currency_code/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.known_currency_code/1","doc":"* `currency_code` is a `binary` or `atom` representing an ISO4217\n currency code","ref":"Plausible.Cldr.Currency.html#known_currency_code/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.known_currency_code/1","doc":"* `{:ok, currency_code}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#known_currency_code/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.known_currency_code/1","doc":"iex> Plausible.Cldr.Currency.known_currency_code \"AUD\"\n {:ok, :AUD}\n\n iex> Plausible.Cldr.Currency.known_currency_code \"GGG\"\n {:error, {Cldr.UnknownCurrencyError, \"The currency \\\"GGG\\\" is invalid\"}}","ref":"Plausible.Cldr.Currency.html#known_currency_code/1-examples"},{"type":"function","title":"Plausible.Cldr.Currency.known_currency_code?/1","doc":"Returns a boolean indicating if the supplied currency code is known.","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.known_currency_code?/1","doc":"* `currency_code` is a `binary` or `atom` representing an ISO4217\n currency code","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.known_currency_code?/1","doc":"* `true` or `false`","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.known_currency_code?/1","doc":"iex> Plausible.Cldr.Currency.known_currency_code? \"AUD\"\n true\n\n iex> Plausible.Cldr.Currency.known_currency_code? \"GGG\"\n false\n\n iex> Plausible.Cldr.Currency.known_currency_code? :XCV\n false","ref":"Plausible.Cldr.Currency.html#known_currency_code?/1-examples"},{"type":"function","title":"Plausible.Cldr.Currency.known_currency_codes/0","doc":"Returns a list of all known currency codes.","ref":"Plausible.Cldr.Currency.html#known_currency_codes/0"},{"type":"function","title":"Example - Plausible.Cldr.Currency.known_currency_codes/0","doc":"iex> Plausible.Cldr.Currency.known_currency_codes","ref":"Plausible.Cldr.Currency.html#known_currency_codes/0-example"},{"type":"function","title":"Plausible.Cldr.Currency.new/2","doc":"Returns a `Currency` struct created from the arguments.","ref":"Plausible.Cldr.Currency.html#new/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.new/2","doc":"* `currency` is a private use currency code in a format defined by\n [ISO4217](https://en.wikipedia.org/wiki/ISO_4217)\n which is `X` followed by two alphanumeric characters.\n\n* `options` is a map of options representing the optional elements of\n the `Cldr.Currency.t` struct.","ref":"Plausible.Cldr.Currency.html#new/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Currency.new/2","doc":"* `:name` is the name of the currency. Required.\n* `:digits` is the precision of the currency. Required.\n* `:symbol` is the currency symbol. Optional.\n* `:narrow_symbol` is an alternative narrow symbol. Optional.\n* `:round_nearest` is the rounding precision such as `0.05`. Optional.\n* `:alt_code` is an alternative currency code for application use.\n* `:cash_digits` is the precision of the currency when used as cash. Optional.\n* `:cash_rounding_nearest` is the rounding precision when used as cash\n such as `0.05`. Optional.","ref":"Plausible.Cldr.Currency.html#new/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.new/2","doc":"* `{:ok, Cldr.Currency.t}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Currency.html#new/2-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.new/2","doc":"iex> Plausible.Cldr.Currency.new(:XAE, name: \"Custom Name\", digits: 0)\n {:ok,\n %Cldr.Currency{\n alt_code: :XAE,\n cash_digits: 0,\n cash_rounding: nil,\n code: :XAE,\n count: %{other: \"Custom Name\"},\n digits: 0,\n from: nil,\n iso_digits: 0,\n name: \"Custom Name\",\n narrow_symbol: nil,\n rounding: 0,\n symbol: \"XAE\",\n tender: false,\n to: nil\n }}\n iex> MyApp.Cldr.Currency.new(:XAH, name: \"Custom Name\")\n {:error, \"Required options are missing. Required options are [:name, :digits]\"}\n iex> Plausible.Cldr.Currency.new(:XAE, name: \"XAE\", digits: 0)\n {:error, {Cldr.CurrencyAlreadyDefined, \"Currency :XAE is already defined.\"}}","ref":"Plausible.Cldr.Currency.html#new/2-example"},{"type":"function","title":"Plausible.Cldr.Currency.pluralize/3","doc":"Returns the appropriate currency display name for the `currency`, based\non the plural rules in effect for the `locale`.","ref":"Plausible.Cldr.Currency.html#pluralize/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.pluralize/3","doc":"* `number` is an integer, float or `Decimal`\n\n* `currency` is any currency returned by `Cldr.Currency.known_currencies/0`\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Currency.html#pluralize/3-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Currency.pluralize/3","doc":"* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`. The\n default is `Plausible.Cldr.get_locale/0`","ref":"Plausible.Cldr.Currency.html#pluralize/3-options"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.pluralize/3","doc":"* `{:ok, plural_string}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Currency.html#pluralize/3-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Currency.pluralize/3","doc":"iex> Plausible.Cldr.Currency.pluralize 1, :USD\n {:ok, \"US dollar\"}\n\n iex> Plausible.Cldr.Currency.pluralize 3, :USD\n {:ok, \"US dollars\"}\n\n iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: \"zh\"\n {:ok, \"美元\"}\n\n iex> Plausible.Cldr.Currency.pluralize 12, :USD, locale: \"fr\"\n {:ok, \"dollars des États-Unis\"}\n\n iex> Plausible.Cldr.Currency.pluralize 1, :USD, locale: \"fr\"\n {:ok, \"dollar des États-Unis\"}","ref":"Plausible.Cldr.Currency.html#pluralize/3-examples"},{"type":"function","title":"Plausible.Cldr.Currency.strings_for_currency/2","doc":"Returns the strings associated with a currency\nin a given locale.","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Currency.strings_for_currency/2","doc":"* `currency` is an ISO4217 currency code\n\n* `locale` is any valid locale name returned by `MyApp.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `MyApp.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Currency.strings_for_currency/2","doc":"* A list of strings or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2-returns"},{"type":"function","title":"Example - Plausible.Cldr.Currency.strings_for_currency/2","doc":"iex> MyApp.Cldr.Currency.strings_for_currency :AUD, \"en\"\n [\"a$\", \"australian dollars\", \"aud\", \"australian dollar\"]","ref":"Plausible.Cldr.Currency.html#strings_for_currency/2-example"},{"type":"module","title":"Plausible.Cldr.Locale","doc":"Backend module that provides functions\nto define new locales and display human-readable\nlocale names for presentation purposes.","ref":"Plausible.Cldr.Locale.html"},{"type":"function","title":"Plausible.Cldr.Locale.fallback_locale_names/1","doc":"Returns the list of fallback locale names, starting\nwith the provided locale name.\n\nFallbacks are a list of locate names which can\nbe used to resolve translation or other localization\ndata if such localised data does not exist for\nthis specific locale..","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.fallback_locale_names/1","doc":"* `locale_name` is any locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.fallback_locale_names/1","doc":"* `{:ok, list_of_locale_names}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.fallback_locale_names/1","doc":"iex> Plausible.Cldr.Locale.fallback_locale_names(:\"fr-CA\")\n {:ok, [:\"fr-CA\", :fr, :und]}\n\n # Fallbacks are typically formed by progressively\n # stripping variant, territory and script from the\n # given locale name. But not always - there are\n # certain fallbacks that take a different path.\n\n iex> Plausible.Cldr.Locale.fallback_locale_names(:nb)\n {:ok, [:nb, :no, :und]}","ref":"Plausible.Cldr.Locale.html#fallback_locale_names/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.fallback_locales/1","doc":"Returns the list of fallback locales, starting\nwith the provided locale name.\n\nFallbacks are a list of locate names which can\nbe used to resolve translation or other localization\ndata if such localised data does not exist for\nthis specific locale.","ref":"Plausible.Cldr.Locale.html#fallback_locales/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.fallback_locales/1","doc":"* `locale_name` is any locale name returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.Locale.html#fallback_locales/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.fallback_locales/1","doc":"* `{:ok, list_of_locales}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#fallback_locales/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.fallback_locales/1","doc":"Plausible.Cldr.Locale.fallback_locales(:\"fr-CA\")\n => {:ok,\n [#Cldr.LanguageTag , #Cldr.LanguageTag ,\n #Cldr.LanguageTag ]}\n\n # Fallbacks are typically formed by progressively\n # stripping variant, territory and script from the\n # given locale name. But not always - there are\n # certain fallbacks that take a different path.\n\n Plausible.Cldr.Locale.fallback_locales(:nb))\n => {:ok,\n [#Cldr.LanguageTag , #Cldr.LanguageTag ,\n #Cldr.LanguageTag ]}","ref":"Plausible.Cldr.Locale.html#fallback_locales/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.locale_for_territory/1","doc":"Returns the \"best fit\" locale for a given territory.\n\nUsing the population percentage data from CLDR, the\nlanguage most commonly spoken in the given territory\nis used to form a locale name which is then validated\nagainst the given backend.\n\nFirst a territory-specific locale is validated and if\nthat fails, the base language only is validate.\n\nFor example, if the territory is `AU` then then the\nlanguage most spoken is \"en\". First, the locale \"en-AU\"\nis validated and if that fails, \"en\" is validated.","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.locale_for_territory/1","doc":"* `territory` is any ISO 3166 Alpha-2 territory\n code that can be validated by `Cldr.validate_territory/1`","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.locale_for_territory/1","doc":"* `{:ok, language_tag}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.locale_for_territory/1","doc":"iex> Plausible.Cldr.Locale.locale_for_territory(:AU)\n Elixir.Plausible.Cldr.validate_locale(:\"en-AU\")\n\n iex> Plausible.Cldr.Locale.locale_for_territory(:US)\n Elixir.Plausible.Cldr.validate_locale(:\"en-US\")\n\n iex> Plausible.Cldr.Locale.locale_for_territory(:ZZ)\n {:error, {Cldr.UnknownTerritoryError, \"The territory :ZZ is unknown\"}}","ref":"Plausible.Cldr.Locale.html#locale_for_territory/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.locale_from_host/2","doc":"Returns a \"best fit\" locale for a host name.","ref":"Plausible.Cldr.Locale.html#locale_from_host/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.locale_from_host/2","doc":"* `host` is any valid host name\n\n* `options` is a keyword list of options. The default\n is `[]`.","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Locale.locale_from_host/2","doc":"* `:tlds` is a list of territory codes as upper-cased\n atoms that are to be considered as top-level domains.\n See `Cldr.Locale.locale_from_host/2` for the default\n list.","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.locale_from_host/2","doc":"* `{:ok, langauge_tag}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-returns"},{"type":"function","title":"Notes - Plausible.Cldr.Locale.locale_from_host/2","doc":"Certain top-level domains have become associated with content\nunderlated to the territory for who the domain is registered.\nTherefore Google (and perhaps others) do not associate these\nTLDs as belonging to the territory but rather are considered\ngeneric top-level domain names.","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.locale_from_host/2","doc":"iex> Plausible.Cldr.Locale.locale_from_host \"a.b.com.au\"\n Elixir.Plausible.Cldr.validate_locale(:\"en-AU\")\n\n iex> Plausible.Cldr.Locale.locale_from_host(\"a.b.com.tv\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"tv\\\"\"}}\n\n iex> Plausible.Cldr.Locale.locale_from_host(\"a.b.com\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"com\\\"\"}}","ref":"Plausible.Cldr.Locale.html#locale_from_host/2-examples"},{"type":"function","title":"Plausible.Cldr.Locale.new/1","doc":"","ref":"Plausible.Cldr.Locale.html#new/1"},{"type":"function","title":"Plausible.Cldr.Locale.new!/1","doc":"","ref":"Plausible.Cldr.Locale.html#new!/1"},{"type":"function","title":"Plausible.Cldr.Locale.script_direction_from_locale/1","doc":"Returns the script direction for a locale.","ref":"Plausible.Cldr.Locale.html#script_direction_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.script_direction_from_locale/1","doc":"* `language_tag` is any language tag returned by `Cldr.Locale.new/2`\n or any `locale_name` returned by `Cldr.known_locale_names/1`.","ref":"Plausible.Cldr.Locale.html#script_direction_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.script_direction_from_locale/1","doc":"* The script direction which is either `:ltr` (for left-to-right\n scripts) or `:rtl` (for right-to-left scripts).","ref":"Plausible.Cldr.Locale.html#script_direction_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.script_direction_from_locale/1","doc":"iex> Plausible.Cldr.Locale.script_direction_from_locale \"en-US\"\n :ltr\n\n iex> Plausible.Cldr.Locale.script_direction_from_locale :ar\n :rtl","ref":"Plausible.Cldr.Locale.html#script_direction_from_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.territory_from_host/1","doc":"Returns the last segment of a host that might\nbe a territory.","ref":"Plausible.Cldr.Locale.html#territory_from_host/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.territory_from_host/1","doc":"* `host` is any valid host name","ref":"Plausible.Cldr.Locale.html#territory_from_host/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.territory_from_host/1","doc":"* `{:ok, territory}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.Locale.html#territory_from_host/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.territory_from_host/1","doc":"iex> Cldr.Locale.territory_from_host(\"a.b.com.au\")\n {:ok, :AU}\n\n iex> Cldr.Locale.territory_from_host(\"a.b.com\")\n {:error,\n {Cldr.UnknownLocaleError, \"No locale was identified for territory \\\"com\\\"\"}}","ref":"Plausible.Cldr.Locale.html#territory_from_host/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.territory_from_locale/1","doc":"Returns the territory from a language tag or\nlocale name.","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.territory_from_locale/1","doc":"* `locale` is any language tag returned by\n `Plausible.Cldr.Locale.new/1`\n or a locale name in the list returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.territory_from_locale/1","doc":"* A territory code as an atom","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.territory_from_locale/1","doc":"iex> Plausible.Cldr.Locale.territory_from_locale \"en-US\"\n :US\n\n iex> Plausible.Cldr.Locale.territory_from_locale \"en-US-u-rg-GBzzzz\"\n :GB","ref":"Plausible.Cldr.Locale.html#territory_from_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.Locale.timezone_from_locale/1","doc":"Returns the time zone from a language tag or\nlocale name.","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Locale.timezone_from_locale/1","doc":"* `locale` is any language tag returned by\n `Plausible.Cldr.Locale.new/1`\n or a locale name in the list returned by\n `Plausible.Cldr.known_locale_names/0`","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Locale.timezone_from_locale/1","doc":"* A time zone ID as a string or\n\n* `:error` if no time zone can be determined","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Locale.timezone_from_locale/1","doc":"iex> Plausible.Cldr.Locale.timezone_from_locale \"en-US-u-tz-ausyd\"\n \"Australia/Sydney\"","ref":"Plausible.Cldr.Locale.html#timezone_from_locale/1-examples"},{"type":"module","title":"Plausible.Cldr.Number","doc":"Formats numbers and currencies based upon CLDR's decimal formats specification.\n\nThe format specification is documentated in [Unicode TR35](http://unicode.org/reports/tr35/tr35-numbers.html#Number_Formats).\nThere are several classes of formatting including non-scientific, scientific,\nrules based (for spelling and ordinal formats), compact formats that display `1k`\nrather than `1,000` and so on. See `Cldr.Number.to_string/2` for specific formatting\noptions.\n\n#","ref":"Plausible.Cldr.Number.html"},{"type":"module","title":"Non-Scientific Notation Formatting - Plausible.Cldr.Number","doc":"The following description applies to formats that do not use scientific\nnotation or significant digits:\n\n* If the number of actual integer digits exceeds the maximum integer digits,\n then only the least significant digits are shown. For example, 1997 is\n formatted as \"97\" if the maximum integer digits is set to 2.\n\n* If the number of actual integer digits is less than the minimum integer\n digits, then leading zeros are added. For example, 1997 is formatted as\n \"01997\" if the minimum integer digits is set to 5.\n\n* If the number of actual fraction digits exceeds the maximum fraction\n digits, then half-even rounding it performed to the maximum fraction\n digits. For example, 0.125 is formatted as \"0.12\" if the maximum fraction\n digits is 2. This behavior can be changed by specifying a rounding\n increment and a rounding mode.\n\n* If the number of actual fraction digits is less than the minimum fraction\n digits, then trailing zeros are added. For example, 0.125 is formatted as\n \"0.1250\" if the minimum fraction digits is set to 4.\n\n* Trailing fractional zeros are not displayed if they occur j positions after\n the decimal, where j is less than the maximum fraction digits. For example,\n 0.10004 is formatted as \"0.1\" if the maximum fraction digits is four or\n less.\n\n#","ref":"Plausible.Cldr.Number.html#module-non-scientific-notation-formatting"},{"type":"module","title":"Scientific Notation Formatting - Plausible.Cldr.Number","doc":"Numbers in scientific notation are expressed as the product of a mantissa and\na power of ten, for example, 1234 can be expressed as 1.234 x 10^3. The\nmantissa is typically in the half-open interval [1.0, 10.0) or sometimes\n[0.0, 1.0), but it need not be. In a pattern, the exponent character\nimmediately followed by one or more digit characters indicates scientific\nnotation. Example: \"0.###E0\" formats the number 1234 as \"1.234E3\".\n\n* The number of digit characters after the exponent character gives the\n minimum exponent digit count. There is no maximum. Negative exponents are\n formatted using the localized minus sign, not the prefix and suffix from\n the pattern. This allows patterns such as \"0.###E0 m/s\". To prefix positive\n exponents with a localized plus sign, specify '+' between the exponent and\n the digits: \"0.###E+0\" will produce formats \"1E+1\", \"1E+0\", \"1E-1\", and so\n on. (In localized patterns, use the localized plus sign rather than '+'.)\n\n* The minimum number of integer digits is achieved by adjusting the exponent.\n Example: 0.00123 formatted with \"00.###E0\" yields \"12.3E-4\". This only\n happens if there is no maximum number of integer digits. If there is a\n maximum, then the minimum number of integer digits is fixed at one.\n\n* The maximum number of integer digits, if present, specifies the exponent\n grouping. The most common use of this is to generate engineering notation,\n in which the exponent is a multiple of three, for example, \"##0.###E0\". The\n number 12345 is formatted using \"##0.####E0\" as \"12.345E3\".\n\n* When using scientific notation, the formatter controls the digit counts\n using significant digits logic. The maximum number of significant digits\n limits the total number of integer and fraction digits that will be shown\n in the mantissa; it does not affect parsing. For example, 12345 formatted\n with \"##0.##E0\" is \"12.3E3\". Exponential patterns may not contain grouping\n separators.\n\n#","ref":"Plausible.Cldr.Number.html#module-scientific-notation-formatting"},{"type":"module","title":"Significant Digits - Plausible.Cldr.Number","doc":"There are two ways of controlling how many digits are shows: (a)\nsignificant digits counts, or (b) integer and fraction digit counts. Integer\nand fraction digit counts are described above. When a formatter is using\nsignificant digits counts, it uses however many integer and fraction digits\nare required to display the specified number of significant digits. It may\nignore min/max integer/fraction digits, or it may use them to the extent\npossible.","ref":"Plausible.Cldr.Number.html#module-significant-digits"},{"type":"function","title":"Plausible.Cldr.Number.parse/2","doc":"Parse a string locale-aware manner and return\na number.","ref":"Plausible.Cldr.Number.html#parse/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.parse/2","doc":"* `string` is any `String.t`\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#parse/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.parse/2","doc":"* `:number` is one of `:integer`, `:float`,\n `:decimal` or `nil`. The default is `nil`\n meaning that the type auto-detected as either\n an `integer` or a `float`.\n\n* `:locale` is any locale returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag.t`. The default is\n `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.html#parse/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Number.parse/2","doc":"* A number of the requested or default type or\n\n* `{:error, {exception, error}}` if no number could be determined","ref":"Plausible.Cldr.Number.html#parse/2-returns"},{"type":"function","title":"Notes - Plausible.Cldr.Number.parse/2","doc":"This function parses a string to return a number but\nin a locale-aware manner. It will normalise grouping\ncharacters and decimal separators, different forms of\nthe `+` and `-` symbols that appear in Unicode and\nstrips any `_` characters that might be used for\nformatting in a string. It then parses the number\nusing the Elixir standard library functions.","ref":"Plausible.Cldr.Number.html#parse/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Number.parse/2","doc":"iex> Plausible.Cldr.Number.parse(\"+1.000,34\", locale: \"de\")\n {:ok, 1000.34}\n\n iex> Plausible.Cldr.Number.parse(\"-1_000_000.34\")\n {:ok, -1000000.34}\n\n iex> Plausible.Cldr.Number.parse(\"1.000\", locale: \"de\", number: :integer)\n {:ok, 1000}\n\n iex> Plausible.Cldr.Number.parse(\"+1.000,34\", locale: \"de\", number: :integer)\n {:error,\n {Cldr.Number.ParseError,\n \"The string \\\"+1.000,34\\\" could not be parsed as a number\"}}","ref":"Plausible.Cldr.Number.html#parse/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.resolve_currencies/2","doc":"Resolve curencies from strings within\na list.","ref":"Plausible.Cldr.Number.html#resolve_currencies/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.resolve_currencies/2","doc":"* `list` is any list in which currency\n names and symbols are expected\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#resolve_currencies/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.resolve_currencies/2","doc":"* `:locale` is any valid locale returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n The default is `Plausible.Cldr.get_locale()`\n\n* `:only` is an `atom` or list of `atoms` representing the\n currencies or currency types to be considered for a match.\n The equates to a list of acceptable currencies for parsing.\n See the notes below for currency types.\n\n* `:except` is an `atom` or list of `atoms` representing the\n currencies or currency types to be not considered for a match.\n This equates to a list of unacceptable currencies for parsing.\n See the notes below for currency types.\n\n* `:fuzzy` is a float greater than `0.0` and less than or\n equal to `1.0` which is used as input to\n `String.jaro_distance/2` to determine is the provided\n currency string is *close enough* to a known currency\n string for it to identify definitively a currency code.\n It is recommended to use numbers greater than `0.8` in\n order to reduce false positives.","ref":"Plausible.Cldr.Number.html#resolve_currencies/2-options"},{"type":"function","title":"Notes - Plausible.Cldr.Number.resolve_currencies/2","doc":"The `:only` and `:except` options accept a list of\ncurrency codes and/or currency types. The following\ntypes are recognised.\n\nIf both `:only` and `:except` are specified,\nthe `:except` entries take priority - that means\nany entries in `:except` are removed from the `:only`\nentries.\n\n * `:all`, the default, considers all currencies\n\n * `:current` considers those currencies that have a `:to`\n date of nil and which also is a known ISO4217 currency\n\n * `:historic` is the opposite of `:current`\n\n * `:tender` considers currencies that are legal tender\n\n * `:unannotated` considers currencies that don't have\n \"(some string)\" in their names. These are usually\n financial instruments.","ref":"Plausible.Cldr.Number.html#resolve_currencies/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Number.resolve_currencies/2","doc":"iex> Plausible.Cldr.Number.scan(\"100 US dollars\")\n ...> |> Plausible.Cldr.Number.resolve_currencies\n [100, :USD]\n\n iex> Plausible.Cldr.Number.scan(\"100 eurosports\")\n ...> |> Plausible.Cldr.Number.resolve_currencies(fuzzy: 0.75)\n [100, :EUR]\n\n iex> Plausible.Cldr.Number.scan(\"100 dollars des États-Unis\")\n ...> |> Plausible.Cldr.Number.resolve_currencies(locale: \"fr\")\n [100, :USD]","ref":"Plausible.Cldr.Number.html#resolve_currencies/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.resolve_currency/2","doc":"Resolve a currency from a string","ref":"Plausible.Cldr.Number.html#resolve_currency/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.resolve_currency/2","doc":"* `list` is any list in which currency\n names and symbols are expected\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#resolve_currency/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.resolve_currency/2","doc":"* `:locale` is any valid locale returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n The default is `Plausible.Cldr.get_locale()`\n\n* `:only` is an `atom` or list of `atoms` representing the\n currencies or currency types to be considered for a match.\n The equates to a list of acceptable currencies for parsing.\n See the notes below for currency types.\n\n* `:except` is an `atom` or list of `atoms` representing the\n currencies or currency types to be not considered for a match.\n This equates to a list of unacceptable currencies for parsing.\n See the notes below for currency types.\n\n* `:fuzzy` is a float greater than `0.0` and less than or\n equal to `1.0` which is used as input to\n `String.jaro_distance/2` to determine is the provided\n currency string is *close enough* to a known currency\n string for it to identify definitively a currency code.\n It is recommended to use numbers greater than `0.8` in\n order to reduce false positives.","ref":"Plausible.Cldr.Number.html#resolve_currency/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Number.resolve_currency/2","doc":"* An ISO4217 currency code as an atom or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.html#resolve_currency/2-returns"},{"type":"function","title":"Notes - Plausible.Cldr.Number.resolve_currency/2","doc":"The `:only` and `:except` options accept a list of\ncurrency codes and/or currency types. The following\ntypes are recognised.\n\nIf both `:only` and `:except` are specified,\nthe `:except` entries take priority - that means\nany entries in `:except` are removed from the `:only`\nentries.\n\n * `:all`, the default, considers all currencies\n\n * `:current` considers those currencies that have a `:to`\n date of nil and which also is a known ISO4217 currency\n\n * `:historic` is the opposite of `:current`\n\n * `:tender` considers currencies that are legal tender\n\n * `:unannotated` considers currencies that don't have\n \"(some string)\" in their names. These are usually\n financial instruments.","ref":"Plausible.Cldr.Number.html#resolve_currency/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Number.resolve_currency/2","doc":"iex> Plausible.Cldr.Number.resolve_currency(\"US dollars\")\n [:USD]\n\n iex> Plausible.Cldr.Number.resolve_currency(\"100 eurosports\", fuzzy: 0.75)\n [:EUR]\n\n iex> Plausible.Cldr.Number.resolve_currency(\"dollars des États-Unis\", locale: \"fr\")\n [:USD]\n\n iex> Plausible.Cldr.Number.resolve_currency(\"not a known currency\", locale: \"fr\")\n {:error,\n {Cldr.UnknownCurrencyError,\n \"The currency \\\"not a known currency\\\" is unknown or not supported\"}}","ref":"Plausible.Cldr.Number.html#resolve_currency/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.resolve_per/2","doc":"Resolve and tokenize percent or permille\nfrom the beginning and/or the end of a string","ref":"Plausible.Cldr.Number.html#resolve_per/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.resolve_per/2","doc":"* `list` is any list in which percent\n and permille symbols are expected\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#resolve_per/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.resolve_per/2","doc":"* `:locale` is any valid locale returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n The default is `options[:backend].get_locale()`","ref":"Plausible.Cldr.Number.html#resolve_per/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Number.resolve_per/2","doc":"* An `:percent` or `permille` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.html#resolve_per/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.resolve_per/2","doc":"iex> Plausible.Cldr.Number.resolve_per \"11%\"\n [\"11\", :percent]\n\n iex> Plausible.Cldr.Number.resolve_per \"% of linguists\"\n [:percent, \" of linguists\"]\n\n iex> Plausible.Cldr.Number.resolve_per \"% of linguists %\"\n [:percent, \" of linguists \", :percent]","ref":"Plausible.Cldr.Number.html#resolve_per/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.resolve_pers/2","doc":"Resolve and tokenize percent and permille\nsybols from strings within a list.\n\nPercent and permille symbols can be identified\nat the beginning and/or the end of a string.","ref":"Plausible.Cldr.Number.html#resolve_pers/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.resolve_pers/2","doc":"* `list` is any list in which percent and\n permille symbols are expected\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#resolve_pers/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.resolve_pers/2","doc":"* `:locale` is any valid locale returned by `Cldr.known_locale_names/1`\n or a `t:Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n The default is `options[:backend].get_locale()`","ref":"Plausible.Cldr.Number.html#resolve_pers/2-options"},{"type":"function","title":"Examples - Plausible.Cldr.Number.resolve_pers/2","doc":"iex> Plausible.Cldr.Number.scan(\"100%\")\n ...> |> Plausible.Cldr.Number.resolve_pers()\n [100, :percent]","ref":"Plausible.Cldr.Number.html#resolve_pers/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.scan/2","doc":"Scans a string locale-aware manner and returns\na list of strings and numbers.","ref":"Plausible.Cldr.Number.html#scan/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.scan/2","doc":"* `string` is any `String.t`\n\n* `options` is a keyword list of options","ref":"Plausible.Cldr.Number.html#scan/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.scan/2","doc":"* `:number` is one of `:integer`, `:float`,\n `:decimal` or `nil`. The default is `nil`\n meaning that the type auto-detected as either\n an `integer` or a `float`.\n\n* `:locale` is any locale returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag.t`. The default is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.html#scan/2-options"},{"type":"function","title":"Returns - Plausible.Cldr.Number.scan/2","doc":"* A list of strings and numbers","ref":"Plausible.Cldr.Number.html#scan/2-returns"},{"type":"function","title":"Notes - Plausible.Cldr.Number.scan/2","doc":"Number parsing is performed by `Cldr.Number.Parser.parse/2`\nand any options provided are passed to that function.","ref":"Plausible.Cldr.Number.html#scan/2-notes"},{"type":"function","title":"Examples - Plausible.Cldr.Number.scan/2","doc":"iex> Plausible.Cldr.Number.scan(\"£1_000_000.34\")\n [\"£\", 1000000.34]\n\n iex> Plausible.Cldr.Number.scan(\"I want £1_000_000 dollars\")\n [\"I want £\", 1000000, \" dollars\"]\n\n iex> Plausible.Cldr.Number.scan(\"The prize is 23\")\n [\"The prize is \", 23]\n\n iex> Plausible.Cldr.Number.scan(\"The lottery number is 23 for the next draw\")\n [\"The lottery number is \", 23, \" for the next draw\"]\n\n iex> Plausible.Cldr.Number.scan(\"The loss is -1.000 euros\", locale: \"de\", number: :integer)\n [\"The loss is \", -1000, \" euros\"]","ref":"Plausible.Cldr.Number.html#scan/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.to_approx_string/2","doc":"Formats a number and applies the `:approximately` format for\na locale and number system.","ref":"Plausible.Cldr.Number.html#to_approx_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_approx_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.\n See `Cldr.Number.to_string/3` for a description of the available\n options.","ref":"Plausible.Cldr.Number.html#to_approx_string/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.to_approx_string/2","doc":"iex> Plausible.Cldr.Number.to_approx_string 1234\n {:ok, \"~1,234\"}","ref":"Plausible.Cldr.Number.html#to_approx_string/2-example"},{"type":"function","title":"Plausible.Cldr.Number.to_at_least_string/2","doc":"Formats a number and applies the `:at_least` format for\na locale and number system.","ref":"Plausible.Cldr.Number.html#to_at_least_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_at_least_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.\n See `Plausible.Cldr.Number.to_string/2` for a description of the available\n options.","ref":"Plausible.Cldr.Number.html#to_at_least_string/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.to_at_least_string/2","doc":"iex> Plausible.Cldr.Number.to_at_least_string 1234\n {:ok, \"1,234+\"}","ref":"Plausible.Cldr.Number.html#to_at_least_string/2-example"},{"type":"function","title":"Plausible.Cldr.Number.to_at_most_string/2","doc":"Formats a number and applies the `:at_most` format for\na locale and number system.","ref":"Plausible.Cldr.Number.html#to_at_most_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_at_most_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.\n See `Cldr.Number.to_string/3` for a description of the available\n options.","ref":"Plausible.Cldr.Number.html#to_at_most_string/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.to_at_most_string/2","doc":"iex> Plausible.Cldr.Number.to_at_most_string 1234\n {:ok, \"≤1,234\"}","ref":"Plausible.Cldr.Number.html#to_at_most_string/2-example"},{"type":"function","title":"Plausible.Cldr.Number.to_range_string/2","doc":"Formats the first and last numbers of a range and applies\nthe `:range` format for a locale and number system.","ref":"Plausible.Cldr.Number.html#to_range_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_range_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.\n See `Cldr.Number.to_string/3` for a description of the available\n options.","ref":"Plausible.Cldr.Number.html#to_range_string/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.to_range_string/2","doc":"iex> Plausible.Cldr.Number.to_range_string 1234..5678\n {:ok, \"1,234–5,678\"}","ref":"Plausible.Cldr.Number.html#to_range_string/2-example"},{"type":"function","title":"Plausible.Cldr.Number.to_string/2","doc":"Returns a number formatted into a string according to a format pattern and options.","ref":"Plausible.Cldr.Number.html#to_string/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_string/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted.","ref":"Plausible.Cldr.Number.html#to_string/2-arguments"},{"type":"function","title":"Options - Plausible.Cldr.Number.to_string/2","doc":"* `format`: the format style or a format string defining how the number is\n formatted. See `Cldr.Number.Format` for how format strings can be constructed.\n See `Cldr.Number.Format.format_styles_for/3` to return available format styles\n for a locale. The default `format` is `:standard`.\n\n* If `:format` is set to `:long` or `:short` then the formatting depends on\n whether `:currency` is specified. If not specified then the number is\n formatted as `:decimal_long` or `:decimal_short`. If `:currency` is\n specified the number is formatted as `:currency_long` or\n `:currency_short` and `:fractional_digits` is set to 0 as a default.\n\n* `:format` may also be a format defined by CLDR's Rules Based Number\n Formats (RBNF). Further information is found in the module `Cldr.Rbnf`.\n The most commonly used formats in this category are to spell out the\n number in a the locales language. The applicable formats are `:spellout`,\n `:spellout_year`, `:ordinal`. A number can also be formatted as roman\n numbers by using the format `:roman` or `:roman_lower`.\n\n* `currency`: is the currency for which the number is formatted. For\n available currencies see `Cldr.Currency.known_currencies/0`. This option\n is required if `:format` is set to `:currency`. If `currency` is set\n and no `:format` is set, `:format` will be set to `:currency` as well.\n\n* `currency_symbol`: Allows overriding a currency symbol. The alternatives\n are:\n * `:iso` the ISO currency code will be used instead of the default\n currency symbol.\n * `:narrow` uses the narrow symbol defined for the locale. The same\n narrow symbol can be defined for more than one currency and therefore this\n should be used with care. If no narrow symbol is defined, the standard\n symbol is used.\n * `:symbol` uses the standard symbol defined in CLDR. A symbol is unique\n for each currency and can be safely used.\n * \"string\" uses `string` as the currency symbol\n * `:standard` (the default and recommended) uses the CLDR-defined symbol\n based upon the currency format for the locale.\n\n* `:cash`: a boolean which indicates whether a number being formatted as a\n `:currency` is to be considered a cash value or not. Currencies can be\n rounded differently depending on whether `:cash` is `true` or `false`.\n *This option is deprecated in favour of `currency_digits: :cash`.\n\n* `:currency_digits` indicates which of the rounding and digits should be\n used. The options are `:accounting` which is the default, `:cash` or\n `:iso`\n\n* `:rounding_mode`: determines how a number is rounded to meet the precision\n of the format requested. The available rounding modes are `:down`,\n :half_up, :half_even, :ceiling, :floor, :half_down, :up. The default is\n `:half_even`.\n\n* `:number_system`: determines which of the number systems for a locale\n should be used to define the separators and digits for the formatted\n number. If `number_system` is an `atom` then `number_system` is\n interpreted as a number system. If the `:number_system` is\n `binary` then it is interpreted as a number system name. See\n `Cldr.Number.System.number_system_names_for/2`. The default is `:default`.\n\n* `:locale`: determines the locale in which the number is formatted. See\n `Cldr.known_locale_names/0`. The default is`Cldr.get_locale/0` which is the\n locale currently in affect for this `Process` and which is set by\n `Cldr.put_locale/1`.\n\n* If `:fractional_digits` is set to a positive integer value then the number\n will be rounded to that number of digits and displayed accordingly - overriding\n settings that would be applied by default. For example, currencies have\n fractional digits defined reflecting each currencies minor unit. Setting\n `:fractional_digits` will override that setting.\n\n* If `:maximum_integer_digits` is set to a positive integer value then the\n number is left truncated before formatting. For example if the number `1234`\n is formatted with the option `maximum_integer_digits: 2`, the number is\n truncated to `34` and formatted.\n\n* If `:round_nearest` is set to a positive integer value then the number\n will be rounded to nearest increment of that value - overriding\n settings that would be applied by default.\n\n* `:minimum_grouping_digits` overrides the CLDR definition of minimum grouping\n digits. For example in the locale `es` the number `1234` is formatted by default\n as `1345` because the locale defines the `minimium_grouping_digits` as `2`. If\n `minimum_grouping_digits: 1` is set as an option the number is formatting as\n `1.345`. The `:minimum_grouping_digits` is added to the grouping defined by\n the number format. If the sum of these two digits is greater than the number\n of digits in the integer (or fractional) part of the number then no grouping\n is performed.\n\n* `:wrapper` is a 2-arity function that will be called for each number component\n with parameters `string` and `tag` where `tag` is one of `:number`,\n `:currency_symbol`, `:currency_space`, `:literal`, `:quote`, `:percent`,\n `:permille`, `:minus` or `:plus`. The function must return a string. The\n function can be used to wrap format elements in HTML or other tags.","ref":"Plausible.Cldr.Number.html#to_string/2-options"},{"type":"function","title":"Locale extensions affecting formatting - Plausible.Cldr.Number.to_string/2","doc":"A locale identifier can specify options that affect number formatting.\nThese options are:\n\n* `nu`: defines the number system to be used if none is specified by the `:number_system`\n option to `to_string/2`\n\nThis key is part of the [u extension](https://unicode.org/reports/tr35/#u_Extension) and\nthat document should be consulted for details on how to construct a locale identifier with these\nextensions.","ref":"Plausible.Cldr.Number.html#to_string/2-locale-extensions-affecting-formatting"},{"type":"function","title":"Wrapping format elements - Plausible.Cldr.Number.to_string/2","doc":"Wrapping elements is particularly useful when formatting a number with a\ncurrency symbol and the requirement is to have different HTML formatting\napplied to the symbol than the number. For example:\n\n iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn\n ...> string, :currency_symbol -> \" \" string \" \"\n ...> string, :number -> \" \" string \" \"\n ...> string, :currency_space -> \" \" string \" \"\n ...> string, _other -> string\n ...> end)\n {:ok, \" $ 100.00 \"}\n\nIt is also possible and recommended to use the `Phoenix.HTML.Tag.content_tag/3`\nfunction if wrapping HTML tags since these will ensure HTML entities are\ncorrectly encoded. For example:\n\n iex> Cldr.Number.to_string(100, format: :currency, currency: :USD, wrapper: fn\n ...> string, :currency_symbol -> Phoenix.HTML.Tag.content_tag(:span, string, class: \"symbol\")\n ...> string, :number -> Phoenix.HTML.Tag.content_tag(:span, string, class: \"number\")\n ...> string, :currency_space -> Phoenix.HTML.Tag.content_tag(:span, string)\n ...> string, _other -> string\n ...> end)\n {:ok, \" $ 100.00 \"}\n\nWhen formatting a number the format is parsed into format elements that might include\na currency symbol, a literal string, inserted text between a currency symbol and the\ncurrency amount, a percent sign, the number itself and several other elements. In\nsome cases it is helpful to be apply specific formatting to each element.\nThis can be achieved by specifying a `:wrapper` option. This option takes a 2-arity\nfunction as an argument. For each element of the format the wrapper function is called\nwith two parameters: the format element as a string and an atom representing the\nelement type. The wrapper function is required to return a string that is then\ninserted in the final formatted number.","ref":"Plausible.Cldr.Number.html#to_string/2-wrapping-format-elements"},{"type":"function","title":"Returns - Plausible.Cldr.Number.to_string/2","doc":"* `{:ok, string}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.html#to_string/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.to_string/2","doc":"iex> Plausible.Cldr.Number.to_string 12345\n {:ok, \"12,345\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, locale: \"fr\"\n {:ok, \"12 345\"}\n\n iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: \"es\", minimum_grouping_digits: 1\n {:ok, \"1.345,32 €\"}\n\n iex> Plausible.Cldr.Number.to_string 1345.32, currency: :EUR, locale: \"es\"\n {:ok, \"1345,32 €\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, locale: \"fr\", currency: \"USD\"\n {:ok, \"12 345,00 $US\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, format: \"#E0\"\n {:ok, \"1.2345E4\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\"\n {:ok, \"THB 12,345.00\"}\n\n iex> Plausible.Cldr.Number.to_string -12345, format: :accounting, currency: \"THB\"\n {:ok, \"(THB 12,345.00)\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\",\n ...> locale: \"th\"\n {:ok, \"฿12,345.00\"}\n\n iex> Plausible.Cldr.Number.to_string 12345, format: :accounting, currency: \"THB\",\n ...> locale: \"th\", number_system: :native\n {:ok, \"฿๑๒,๓๔๕.๐๐\"}\n\n iex> Plausible.Cldr.Number.to_string 1244.30, format: :long\n {:ok, \"1 thousand\"}\n\n iex> Plausible.Cldr.Number.to_string 1244.30, format: :long, currency: \"USD\"\n {:ok, \"1,244 US dollars\"}\n\n iex> Plausible.Cldr.Number.to_string 1244.30, format: :short\n {:ok, \"1K\"}\n\n iex> Plausible.Cldr.Number.to_string 1244.30, format: :short, currency: \"EUR\"\n {:ok, \"€1K\"}\n\n iex> Plausible.Cldr.Number.to_string 1234, format: :spellout\n {:ok, \"one thousand two hundred thirty-four\"}\n\n iex> Plausible.Cldr.Number.to_string 1234, format: :spellout_verbose\n {:ok, \"one thousand two hundred and thirty-four\"}\n\n iex> Plausible.Cldr.Number.to_string 1989, format: :spellout_year\n {:ok, \"nineteen eighty-nine\"}\n\n iex> Plausible.Cldr.Number.to_string 123, format: :ordinal\n {:ok, \"123rd\"}\n\n iex> Plausible.Cldr.Number.to_string 123, format: :roman\n {:ok, \"CXXIII\"}\n\n iex> Plausible.Cldr.Number.to_string 123, locale: \"th-u-nu-thai\"\n {:ok, \"๑๒๓\"}","ref":"Plausible.Cldr.Number.html#to_string/2-examples"},{"type":"function","title":"Errors - Plausible.Cldr.Number.to_string/2","doc":"An error tuple `{:error, reason}` will be returned if an error is detected.\nThe two most likely causes of an error return are:\n\n * A format cannot be compiled. In this case the error tuple will look like:\n\n```\n iex> Plausible.Cldr.Number.to_string(12345, format: \"0#\")\n {:error, {Cldr.FormatCompileError,\n \"Decimal format compiler: syntax error before: \\\"#\\\"\"}}\n```\n\n * The format style requested is not defined for the `locale` and\n `number_system`. This happens typically when the number system is\n `:algorithmic` rather than the more common `:numeric`. In this case the error\n return looks like:\n\n```\n iex> Plausible.Cldr.Number.to_string(1234, locale: \"he\", number_system: \"hebr\")\n {:error, {Cldr.UnknownFormatError,\n \"The locale :he with number system :hebr does not define a format :standard\"}}\n```","ref":"Plausible.Cldr.Number.html#to_string/2-errors"},{"type":"function","title":"Plausible.Cldr.Number.to_string!/2","doc":"Same as the execution of `to_string/2` but raises an exception if an error would be\nreturned.","ref":"Plausible.Cldr.Number.html#to_string!/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.to_string!/2","doc":"* `number` is an integer, float or Decimal to be formatted\n\n* `options` is a keyword list defining how the number is to be formatted. See\n `Plausible.Cldr.Number.to_string/2`","ref":"Plausible.Cldr.Number.html#to_string!/2-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.to_string!/2","doc":"* a formatted number as a string or\n\n* raises an exception","ref":"Plausible.Cldr.Number.html#to_string!/2-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.to_string!/2","doc":"iex> Plausible.Cldr.Number.to_string! 12345\n \"12,345\"\n\n iex> Plausible.Cldr.Number.to_string! 12345, locale: \"fr\"\n \"12 345\"","ref":"Plausible.Cldr.Number.html#to_string!/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.validate_number_system/2","doc":"Return a valid number system from a provided locale and number\nsystem name or type.\n\nThe number system or number system type must be valid for the\ngiven locale. If a number system type is provided, the\nunderlying number system is returned.","ref":"Plausible.Cldr.Number.html#validate_number_system/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.validate_number_system/2","doc":"* `locale` is any valid locale name returned by `Cldr.known_locale_names/1`\n or a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`\n\n* `system_name` is any number system name returned by\n `Cldr.known_number_systems/0` or a number system type\n returned by `Cldr.known_number_system_types/0`","ref":"Plausible.Cldr.Number.html#validate_number_system/2-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.validate_number_system/2","doc":"iex> Plausible.Cldr.Number.validate_number_system \"en\", :latn\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.validate_number_system \"en\", :default\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.validate_number_system \"en\", :unknown\n {:error,\n {Cldr.UnknownNumberSystemError, \"The number system :unknown is unknown\"}}\n\n iex> Plausible.Cldr.Number.validate_number_system \"zz\", :default\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Plausible.Cldr.Number.html#validate_number_system/2-examples"},{"type":"module","title":"Plausible.Cldr.Number.Cardinal","doc":"Implements cardinal plural rules for numbers.","ref":"Plausible.Cldr.Number.Cardinal.html"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.available_locale_names/0","doc":"The locale names for which plural rules are defined.","ref":"Plausible.Cldr.Number.Cardinal.html#available_locale_names/0"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.known_locale_names/0","doc":"The configured locales for which plural rules are defined.\n\nReturns the intersection of `Plausible.Cldr.known_locale_names/0` and\nthe locales for which Cardinal plural rules are defined.\n\nThere are many `Cldr` locales which don't have their own plural\nrules so this list is the intersection of `Cldr`'s configured\nlocales and those that have rules.","ref":"Plausible.Cldr.Number.Cardinal.html#known_locale_names/0"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.plural_rule/3","doc":"Return the plural key for a given number in a given locale\n\nReturns which plural key (`:zero`, `:one`, `:two`, `:few`,\n`:many` or `:other`) a given number fits into within the\ncontext of a given locale.\n\nNote that these key names should not be interpreted\nliterally. For example, the key returned from\n`Cldr.Number.Ordinal.plural_rule(0, \"en\")` is actually\n`:other`, not `:zero`.\n\nThis key can then be used to format a number, date, time, unit,\nlist or other content in a plural-sensitive way.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rule/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Cardinal.plural_rule/3","doc":"* `number` is any `integer`, `float` or `Decimal`\n\n* `locale` is any locale returned by `Cldr.Locale.new!/2` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\n* `rounding` is one of `[:down, :up, :ceiling, :floor, :half_even, :half_up, :half_down]`. The\n default is `:half_even`.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rule/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Cardinal.plural_rule/3","doc":"iex> Plausible.Cldr.Number.Cardinal.plural_rule 0, \"fr\"\n :one\n\n iex> Plausible.Cldr.Number.Cardinal.plural_rule 0, \"en\"\n :other","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rule/3-examples"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.plural_rules/0","doc":"Returns all the plural rules defined in CLDR.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules/0"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.plural_rules_for/1","doc":"Return the plural rules for a locale.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Cardinal.plural_rules_for/1","doc":"* `locale` is any locale returned by `Plausible.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\nThe rules are returned in AST form after parsing.","ref":"Plausible.Cldr.Number.Cardinal.html#plural_rules_for/1-arguments"},{"type":"function","title":"Plausible.Cldr.Number.Cardinal.pluralize/3","doc":"Pluralize a number using cardinal plural rules\nand a substitution map.","ref":"Plausible.Cldr.Number.Cardinal.html#pluralize/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Cardinal.pluralize/3","doc":"* `number` is an integer, float or Decimal\n\n* `locale` is any locale returned by `Plausible.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\n* `substitutions` is a map that maps plural keys to a string.\n The valid substitution keys are `:zero`, `:one`, `:two`,\n `:few`, `:many` and `:other`.\n\nSee also `Plausible.Cldr.Number.Cardinal.Cardinal.plural_rule/3`.","ref":"Plausible.Cldr.Number.Cardinal.html#pluralize/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Cardinal.pluralize/3","doc":"iex> Plausible.Cldr.Number.Cardinal.pluralize 1, \"en\", %{one: \"one\"}\n \"one\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 2, \"en\", %{one: \"one\"}\n nil\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 2, \"en\", %{one: \"one\", two: \"two\", other: \"other\"}\n \"other\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 22, \"en\", %{one: \"one\", two: \"two\", other: \"other\"}\n \"other\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(1), \"en\", %{one: \"one\"}\n \"one\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), \"en\", %{one: \"one\"}\n nil\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize Decimal.new(2), \"en\", %{one: \"one\", two: \"two\"}\n nil\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, \"ar\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"few\"\n\n iex> Plausible.Cldr.Number.Cardinal.pluralize 1..10, \"en\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"","ref":"Plausible.Cldr.Number.Cardinal.html#pluralize/3-examples"},{"type":"module","title":"Plausible.Cldr.Number.Format","doc":"Functions to manage the collection of number patterns defined in Cldr.\n\nNumber patterns affect how numbers are interpreted in a localized context.\nHere are some examples, based on the French locale. The \".\" shows where the\ndecimal point should go. The \",\" shows where the thousands separator should\ngo. A \"0\" indicates zero-padding: if the number is too short, a zero (in the\nlocale's numeric set) will go there. A \"#\" indicates no padding: if the\nnumber is too short, nothing goes there. A \"¤\" shows where the currency sign\nwill go. The following illustrates the effects of different patterns for the\nFrench locale, with the number \"1234.567\". Notice how the pattern characters\n',' and '.' are replaced by the characters appropriate for the locale.","ref":"Plausible.Cldr.Number.Format.html"},{"type":"module","title":"Number Pattern Examples - Plausible.Cldr.Number.Format","doc":"| Pattern\t | Currency\t | Text |\n| ------------- | :-------------: | ----------: |\n| #,##0.##\t | n/a\t | 1 234,57 |\n| #,##0.###\t | n/a\t | 1 234,567 |\n| ###0.#####\t | n/a\t | 1234,567 |\n| ###0.0000#\t | n/a\t | 1234,5670 |\n| 00000.0000\t | n/a\t | 01234,5670 |\n| #,##0.00 ¤\t | EUR\t | 1 234,57 € |\n\nThe number of # placeholder characters before the decimal do not matter,\nsince no limit is placed on the maximum number of digits. There should,\nhowever, be at least one zero some place in the pattern. In currency formats,\nthe number of digits after the decimal also do not matter, since the\ninformation in the supplemental data (see Supplemental Currency Data) is used\nto override the number of decimal places — and the rounding — according to\nthe currency that is being formatted. That can be seen in the above chart,\nwith the difference between Yen and Euro formatting.\n\nDetails of the number formats are described in the\n[Unicode documentation](http://unicode.org/reports/tr35/tr35-numbers.html#Number_Format_Patterns)","ref":"Plausible.Cldr.Number.Format.html#module-number-pattern-examples"},{"type":"function","title":"Plausible.Cldr.Number.Format.all_formats_for/1","doc":"Returns the decimal formats defined for a given locale.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.all_formats_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.all_formats_for/1","doc":"* `{:ok, map}` where map is a map of decimal formats\n keyed by number system or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.Format.html#all_formats_for/1-returns"},{"type":"function","title":"Plausible.Cldr.Number.Format.all_formats_for!/1","doc":"Returns the decimal formats defined for a given locale.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for!/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.all_formats_for!/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for!/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.all_formats_for!/1","doc":"* `{:ok, map}` where map is a map of decimal formats\n keyed by number system or\n\n* raises an exception\n\nSee `Plausible.Cldr.Number.Format.Number.Format.all_formats_for/1` for further information.","ref":"Plausible.Cldr.Number.Format.html#all_formats_for!/1-returns"},{"type":"function","title":"Plausible.Cldr.Number.Format.currency_spacing/2","doc":"Returns the currency space for a given locale and\nnumber system.","ref":"Plausible.Cldr.Number.Format.html#currency_spacing/2"},{"type":"function","title":"Plausible.Cldr.Number.Format.decimal_format_list/0","doc":"Returns the list of decimal formats in the configured locales including\nthe list of locales configured for precompilation in `config.exs`.\n\nThis function exists to allow the decimal formatter\nto precompile all the known formats at compile time.","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list/0"},{"type":"function","title":"Example - Plausible.Cldr.Number.Format.decimal_format_list/0","doc":"#=> Plausible.Cldr.Number.Format.Format.decimal_format_list\n [\"#\", \"#,##,##0%\",\n \"#,##,##0.###\", \"#,##,##0.00¤\", \"#,##,##0.00¤;(#,##,##0.00¤)\",\n \"#,##,##0 %\", \"#,##0%\", \"#,##0.###\", \"#,##0.00 ¤\",\n \"#,##0.00 ¤;(#,##0.00 ¤)\", \"#,##0.00¤\", \"#,##0.00¤;(#,##0.00¤)\",\n \"#,##0 %\", \"#0%\", \"#0.######\", \"#0.00 ¤\", \"#E0\", \"%#,##0\", \"% #,##0\",\n \"0\", \"0.000000E+000\", \"0000 M ¤\", \"0000¤\", \"000G ¤\", \"000K ¤\", \"000M ¤\",\n \"000T ¤\", \"000mM ¤\", \"000m ¤\", \"000 Bio'.' ¤\", \"000 Bln ¤\", \"000 Bn ¤\",\n \"000 B ¤\", \"000 E ¤\", \"000 K ¤\", \"000 MRD ¤\", \"000 Md ¤\", \"000 Mio'.' ¤\",\n \"000 Mio ¤\", \"000 Mld ¤\", \"000 Mln ¤\", \"000 Mn ¤\", \"000 Mrd'.' ¤\",\n \"000 Mrd ¤\", \"000 Mr ¤\", \"000 M ¤\", \"000 NT ¤\", \"000 N ¤\", \"000 Tn ¤\",\n \"000 Tr ¤\", ...]","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list/0-example"},{"type":"function","title":"Plausible.Cldr.Number.Format.decimal_format_list_for/1","doc":"Returns the list of decimal formats for a configured locale.","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.decimal_format_list_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.\n\nThis function exists to allow the decimal formatter to precompile all\nthe known formats at compile time. Its use is not otherwise recommended.","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list_for/1-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.Format.decimal_format_list_for/1","doc":"iex> Plausible.Cldr.Number.Format.decimal_format_list_for(:en)\n {:ok, [\"#,##0%\", \"#,##0.###\", \"#,##0.00\", \"#,##0.00;(#,##0.00)\",\"#E0\",\n \"0 billion\", \"0 million\", \"0 thousand\",\n \"0 trillion\", \"00 billion\", \"00 million\", \"00 thousand\", \"00 trillion\",\n \"000 billion\", \"000 million\", \"000 thousand\", \"000 trillion\", \"000B\", \"000K\",\n \"000M\", \"000T\", \"00B\", \"00K\", \"00M\", \"00T\", \"0B\", \"0K\", \"0M\", \"0T\",\n \"¤#,##0.00\", \"¤#,##0.00;(¤#,##0.00)\", \"¤000B\", \"¤000K\", \"¤000M\",\n \"¤000T\", \"¤00B\", \"¤00K\", \"¤00M\", \"¤00T\", \"¤0B\", \"¤0K\", \"¤0M\", \"¤0T\",\n \"¤ #,##0.00\", \"¤ #,##0.00;(¤ #,##0.00)\", \"¤ 000B\", \"¤ 000K\", \"¤ 000M\",\n \"¤ 000T\", \"¤ 00B\", \"¤ 00K\", \"¤ 00M\", \"¤ 00T\", \"¤ 0B\", \"¤ 0K\", \"¤ 0M\", \"¤ 0T\"]}","ref":"Plausible.Cldr.Number.Format.html#decimal_format_list_for/1-example"},{"type":"function","title":"Plausible.Cldr.Number.Format.default_grouping_for/1","doc":"Returns the default grouping for a locale as a map.","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.default_grouping_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.default_grouping_for/1","doc":"* `{:ok, grouping}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Format.default_grouping_for/1","doc":"iex> Plausible.Cldr.Number.Format.default_grouping_for(:en)\n {:ok, %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}}","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.Format.default_grouping_for!/1","doc":"Returns the default grouping for a locale\nor raises on error.","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.default_grouping_for!/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.default_grouping_for!/1","doc":"* `grouping` as a map or\n\n* raises an exception","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Format.default_grouping_for!/1","doc":"iex> Plausible.Cldr.Number.Format.default_grouping_for!(:en)\n %{fraction: %{first: 0, rest: 0}, integer: %{first: 3, rest: 3}}","ref":"Plausible.Cldr.Number.Format.html#default_grouping_for!/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.Format.formats_for/2","doc":"Return the predfined formats for a given `locale` and `number_system`.","ref":"Plausible.Cldr.Number.Format.html#formats_for/2"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.formats_for/2","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.\n\n* `number_system` is any valid number system or number system type returned\n by `Plausible.Cldr.Number.System.number_systems_for/1`.","ref":"Plausible.Cldr.Number.Format.html#formats_for/2-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.Format.formats_for/2","doc":"Plausible.Cldr.Number.Format.formats_for :fr, :native\n #=> %Cldr.Number.Format{\n accounting: \"#,##0.00 ¤;(#,##0.00 ¤)\",\n currency: \"#,##0.00 ¤\",\n percent: \"#,##0 %\",\n scientific: \"#E0\",\n standard: \"#,##0.###\"\n currency_short: [{\"1000\", [one: \"0 k ¤\", other: \"0 k ¤\"]},\n {\"10000\", [one: \"00 k ¤\", other: \"00 k ¤\"]},\n {\"100000\", [one: \"000 k ¤\", other: \"000 k ¤\"]},\n {\"1000000\", [one: \"0 M ¤\", other: \"0 M ¤\"]},\n {\"10000000\", [one: \"00 M ¤\", other: \"00 M ¤\"]},\n {\"100000000\", [one: \"000 M ¤\", other: \"000 M ¤\"]},\n {\"1000000000\", [one: \"0 Md ¤\", other: \"0 Md ¤\"]},\n {\"10000000000\", [one: \"00 Md ¤\", other: \"00 Md ¤\"]},\n {\"100000000000\", [one: \"000 Md ¤\", other: \"000 Md ¤\"]},\n {\"1000000000000\", [one: \"0 Bn ¤\", other: \"0 Bn ¤\"]},\n {\"10000000000000\", [one: \"00 Bn ¤\", other: \"00 Bn ¤\"]},\n {\"100000000000000\", [one: \"000 Bn ¤\", other: \"000 Bn ¤\"]}],\n ...\n }","ref":"Plausible.Cldr.Number.Format.html#formats_for/2-example"},{"type":"function","title":"Plausible.Cldr.Number.Format.formats_for!/2","doc":"","ref":"Plausible.Cldr.Number.Format.html#formats_for!/2"},{"type":"function","title":"Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"Returns the minimum grouping digits for a locale.","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"* `{:ok, minumum_digits}` or\n\n* `{:error, {exception, message}}`","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Format.minimum_grouping_digits_for/1","doc":"iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for(\"en\")\n {:ok, 1}","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"Returns the minimum grouping digits for a locale\nor raises on error.","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"* `minumum_digits` or\n\n* raises an exception","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Format.minimum_grouping_digits_for!/1","doc":"iex> Plausible.Cldr.Number.Format.minimum_grouping_digits_for!(\"en\")\n 1","ref":"Plausible.Cldr.Number.Format.html#minimum_grouping_digits_for!/1-examples"},{"type":"module","title":"Plausible.Cldr.Number.Formatter.Decimal","doc":"","ref":"Plausible.Cldr.Number.Formatter.Decimal.html"},{"type":"function","title":"Plausible.Cldr.Number.Formatter.Decimal.metadata!/1","doc":"","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#metadata!/1"},{"type":"function","title":"Plausible.Cldr.Number.Formatter.Decimal.to_string/3","doc":"Formats a number according to a decimal format string.","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#to_string/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Formatter.Decimal.to_string/3","doc":"* `number` is an integer, float or Decimal\n\n* `format` is a format string. See `Plausible.Cldr.Number` for further information.\n\n* `options` is a map of options. See `Plausible.Cldr.Number.to_string/2`\n for further information.","ref":"Plausible.Cldr.Number.Formatter.Decimal.html#to_string/3-arguments"},{"type":"module","title":"Plausible.Cldr.Number.Ordinal","doc":"Implements ordinal plural rules for numbers.","ref":"Plausible.Cldr.Number.Ordinal.html"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.available_locale_names/0","doc":"The locale names for which plural rules are defined.","ref":"Plausible.Cldr.Number.Ordinal.html#available_locale_names/0"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.known_locale_names/0","doc":"The configured locales for which plural rules are defined.\n\nReturns the intersection of `Plausible.Cldr.known_locale_names/0` and\nthe locales for which Ordinal plural rules are defined.\n\nThere are many `Cldr` locales which don't have their own plural\nrules so this list is the intersection of `Cldr`'s configured\nlocales and those that have rules.","ref":"Plausible.Cldr.Number.Ordinal.html#known_locale_names/0"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.plural_rule/3","doc":"Return the plural key for a given number in a given locale\n\nReturns which plural key (`:zero`, `:one`, `:two`, `:few`,\n`:many` or `:other`) a given number fits into within the\ncontext of a given locale.\n\nNote that these key names should not be interpreted\nliterally. For example, the key returned from\n`Cldr.Number.Ordinal.plural_rule(0, \"en\")` is actually\n`:other`, not `:zero`.\n\nThis key can then be used to format a number, date, time, unit,\nlist or other content in a plural-sensitive way.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rule/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Ordinal.plural_rule/3","doc":"* `number` is any `integer`, `float` or `Decimal`\n\n* `locale` is any locale returned by `Cldr.Locale.new!/2` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\n* `rounding` is one of `[:down, :up, :ceiling, :floor, :half_even, :half_up, :half_down]`. The\n default is `:half_even`.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rule/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Ordinal.plural_rule/3","doc":"iex> Plausible.Cldr.Number.Ordinal.plural_rule 0, \"fr\"\n :other\n\n iex> Plausible.Cldr.Number.Ordinal.plural_rule 1, \"en\"\n :one","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rule/3-examples"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.plural_rules/0","doc":"Returns all the plural rules defined in CLDR.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules/0"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.plural_rules_for/1","doc":"Return the plural rules for a locale.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules_for/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Ordinal.plural_rules_for/1","doc":"* `locale` is any locale returned by `Plausible.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\nThe rules are returned in AST form after parsing.","ref":"Plausible.Cldr.Number.Ordinal.html#plural_rules_for/1-arguments"},{"type":"function","title":"Plausible.Cldr.Number.Ordinal.pluralize/3","doc":"Pluralize a number using ordinal plural rules\nand a substitution map.","ref":"Plausible.Cldr.Number.Ordinal.html#pluralize/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Ordinal.pluralize/3","doc":"* `number` is an integer, float or Decimal or a `Range.t{}`. When a range, The\n is that in any usage, the start value is strictly less than the end value,\n and that no values are negative. Results for any cases that do not meet\n these criteria are undefined.\n\n* `locale` is any locale returned by `Plausible.Cldr.Locale.new!/1` or any\n `locale_name` returned by `Plausible.Cldr.known_locale_names/0`\n\n* `substitutions` is a map that maps plural keys to a string.\n The valid substitution keys are `:zero`, `:one`, `:two`,\n `:few`, `:many` and `:other`.\n\nSee also `Plausible.Cldr.Number.Ordinal.Ordinal.plural_rule/3`.","ref":"Plausible.Cldr.Number.Ordinal.html#pluralize/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Ordinal.pluralize/3","doc":"iex> Plausible.Cldr.Number.Ordinal.pluralize 1, :en, %{one: \"one\"}\n \"one\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: \"one\"}\n nil\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 2, :en, %{one: \"one\", two: \"two\"}\n \"two\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 22, :en, %{one: \"one\", two: \"two\", other: \"other\"}\n \"two\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(1), :en, %{one: \"one\"}\n \"one\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: \"one\"}\n nil\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize Decimal.new(2), :en, %{one: \"one\", two: \"two\"}\n \"two\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, \"ar\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"\n\n iex> Plausible.Cldr.Number.Ordinal.pluralize 1..10, \"en\", %{one: \"one\", few: \"few\", other: \"other\"}\n \"other\"","ref":"Plausible.Cldr.Number.Ordinal.html#pluralize/3-examples"},{"type":"module","title":"Plausible.Cldr.Number.PluralRule.Range","doc":"Implements plural rules for ranges","ref":"Plausible.Cldr.Number.PluralRule.Range.html"},{"type":"function","title":"Plausible.Cldr.Number.PluralRule.Range.plural_rule/3","doc":"Returns a final plural type for a start-of-range plural\ntype, an end-of-range plural type and a locale.","ref":"Plausible.Cldr.Number.PluralRule.Range.html#plural_rule/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.PluralRule.Range.plural_rule/3","doc":"* `first` is a plural type for the start of a range\n\n* `last` is a plural type for the end of a range\n\n* `locale` is any `Cldr.LanguageTag.t` or a language name\n (not locale name)","ref":"Plausible.Cldr.Number.PluralRule.Range.html#plural_rule/3-arguments"},{"type":"function","title":"Example - Plausible.Cldr.Number.PluralRule.Range.plural_rule/3","doc":"iex> Plausible.Cldr.Number.PluralRule.Range.plural_rule :other, :few, \"ar\"\n :few","ref":"Plausible.Cldr.Number.PluralRule.Range.html#plural_rule/3-example"},{"type":"module","title":"Plausible.Cldr.Number.Symbol","doc":"","ref":"Plausible.Cldr.Number.Symbol.html"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.all_decimal_symbols/0","doc":"Returns a list of all decimal symbols defined\nby the locales configured in this backend as\na list.","ref":"Plausible.Cldr.Number.Symbol.html#all_decimal_symbols/0"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.all_decimal_symbols_class/0","doc":"Returns a list of all decimal symbols defined\nby the locales configured in this backend as\na string.\n\nThis string can be used as a character class\nwhen builing a regular expression.","ref":"Plausible.Cldr.Number.Symbol.html#all_decimal_symbols_class/0"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.all_grouping_symbols/0","doc":"Returns a list of all grouping symbols defined\nby the locales configured in this backend as\na list.","ref":"Plausible.Cldr.Number.Symbol.html#all_grouping_symbols/0"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.all_grouping_symbols_class/0","doc":"Returns a list of all grouping symbols defined\nby the locales configured in this backend as\na string.\n\nThis string can be used as a character class\nwhen builing a regular expression.","ref":"Plausible.Cldr.Number.Symbol.html#all_grouping_symbols_class/0"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.number_symbols_for/1","doc":"Returns a map of `Cldr.Number.Symbol.t` structs of the number symbols for each\nof the number systems of a locale.","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/1"},{"type":"function","title":"Options - Plausible.Cldr.Number.Symbol.number_symbols_for/1","doc":"* `locale` is any valid locale name returned by\n `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by\n `Plausible.Cldr.Locale.new!/1`. The default\n is `Plausible.Cldr.get_locale/0`.","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/1-options"},{"type":"function","title":"Example: - Plausible.Cldr.Number.Symbol.number_symbols_for/1","doc":"iex> Plausible.Cldr.Number.Symbol.number_symbols_for(:th)\n {:ok, %{\n latn: %Cldr.Number.Symbol{\n decimal: \".\",\n exponential: \"E\",\n group: \",\",\n infinity: \"∞\",\n list: \";\",\n minus_sign: \"-\",\n nan: \"NaN\",\n per_mille: \"‰\",\n percent_sign: \"%\",\n plus_sign: \"+\",\n superscripting_exponent: \"×\",\n time_separator: \":\"\n },\n thai: %Cldr.Number.Symbol{\n decimal: \".\",\n exponential: \"E\",\n group: \",\",\n infinity: \"∞\",\n list: \";\",\n minus_sign: \"-\",\n nan: \"NaN\",\n per_mille: \"‰\",\n percent_sign: \"%\",\n plus_sign: \"+\",\n superscripting_exponent: \"×\",\n time_separator: \":\"\n }\n }}","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/1-example"},{"type":"function","title":"Plausible.Cldr.Number.Symbol.number_symbols_for/2","doc":"","ref":"Plausible.Cldr.Number.Symbol.html#number_symbols_for/2"},{"type":"module","title":"Plausible.Cldr.Number.System","doc":"","ref":"Plausible.Cldr.Number.System.html"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_for/2","doc":"Returns the actual number system from a number system type.\n\n* `locale` is any valid locale name returned by `Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by ``Cldr.Locale.new!/2``\n\n* `system_name` is any number system name returned by\n `Cldr.known_number_systems/0` or a number system type\n returned by `Cldr.known_number_system_types/0`\n\nThis function will decode a number system type into the actual\nnumber system. If the number system provided can't be decoded\nit is returned as is.","ref":"Plausible.Cldr.Number.System.html#number_system_for/2"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.number_system_for/2","doc":"iex> Plausible.Cldr.Number.System.number_system_for \"th\", :latn\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Plausible.Cldr.Number.System.number_system_for \"en\", :default\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Plausible.Cldr.Number.System.number_system_for \"he\", :traditional\n {:ok, %{rules: \"hebrew\", type: :algorithmic}}\n\n iex> Plausible.Cldr.Number.System.number_system_for \"en\", :native\n {:ok, %{digits: \"0123456789\", type: :numeric}}\n\n iex> Plausible.Cldr.Number.System.number_system_for \"en\", :finance\n {\n :error,\n {Cldr.UnknownNumberSystemError,\n \"The number system :finance is unknown for the locale named :en. Valid number systems are %{default: :latn, native: :latn}\"}\n }","ref":"Plausible.Cldr.Number.System.html#number_system_for/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_from_locale/1","doc":"Returns the number system from a language tag or\nlocale name.","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.System.number_system_from_locale/1","doc":"* `locale` is any language tag returned be `Cldr.Locale.new/2`\n or a locale name in the list returned by `Cldr.known_locale_names/1`","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.Number.System.number_system_from_locale/1","doc":"* A number system name as an atom","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1-returns"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.number_system_from_locale/1","doc":"iex> Plausible.Cldr.Number.System.number_system_from_locale \"en-US-u-nu-thai\"\n :thai\n\n iex> Plausible.Cldr.Number.System.number_system_from_locale \"en-US\"\n :latn","ref":"Plausible.Cldr.Number.System.html#number_system_from_locale/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_names_for/1","doc":"Returns the number systems available for a locale\nor `{:error, message}` if the locale is not known.\n\n* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Number.System.html#number_system_names_for/1"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.number_system_names_for/1","doc":"iex> Plausible.Cldr.Number.System.number_system_names_for \"en\"\n {:ok, [:latn]}\n\n iex> Plausible.Cldr.Number.System.number_system_names_for \"zz\"\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Plausible.Cldr.Number.System.html#number_system_names_for/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_names_for!/1","doc":"","ref":"Plausible.Cldr.Number.System.html#number_system_names_for!/1"},{"type":"function","title":"Plausible.Cldr.Number.System.number_system_types_for/1","doc":"","ref":"Plausible.Cldr.Number.System.html#number_system_types_for/1"},{"type":"function","title":"Plausible.Cldr.Number.System.number_systems_for/1","doc":"Returns the number systems available for a locale\nor `{:error, message}` if the locale is not known.\n\n* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`","ref":"Plausible.Cldr.Number.System.html#number_systems_for/1"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.number_systems_for/1","doc":"iex> Plausible.Cldr.Number.System.number_systems_for \"en\"\n {:ok, %{default: :latn, native: :latn}}\n\n iex> Plausible.Cldr.Number.System.number_systems_for \"th\"\n {:ok, %{default: :latn, native: :thai}}\n\n iex> Plausible.Cldr.Number.System.number_systems_for \"zz\"\n {:error, {Cldr.InvalidLanguageError, \"The language \\\"zz\\\" is invalid\"}}","ref":"Plausible.Cldr.Number.System.html#number_systems_for/1-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.number_systems_for!/1","doc":"","ref":"Plausible.Cldr.Number.System.html#number_systems_for!/1"},{"type":"function","title":"Plausible.Cldr.Number.System.number_systems_like/2","doc":"","ref":"Plausible.Cldr.Number.System.html#number_systems_like/2"},{"type":"function","title":"Plausible.Cldr.Number.System.system_name_from/2","doc":"Returns a number system name for a given locale and number system reference.\n\n* `system_name` is any number system name returned by\n `Plausible.Cldr.known_number_systems/0` or a number system type\n returned by `Plausible.Cldr.known_number_system_types/0`\n\n* `locale` is any valid locale name returned by `Plausible.Cldr.known_locale_names/0`\n or a `Cldr.LanguageTag` struct returned by `Plausible.Cldr.Locale.new!/1`\n\nNumber systems can be references in one of two ways:\n\n* As a number system type such as :default, :native, :traditional and\n :finance. This allows references to a number system for a locale in a\n consistent fashion for a given use\n\n* WIth the number system name directly, such as :latn, :arab or any of the\n other 70 or so\n\nThis function dereferences the supplied `system_name` and returns the\nactual system name.","ref":"Plausible.Cldr.Number.System.html#system_name_from/2"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.system_name_from/2","doc":"ex> Plausible.Cldr.Number.System.system_name_from(:default, \"en\")\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.System.system_name_from(\"latn\", \"en\")\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.System.system_name_from(:native, \"en\")\n {:ok, :latn}\n\n iex> Plausible.Cldr.Number.System.system_name_from(:nope, \"en\")\n {\n :error,\n {Cldr.UnknownNumberSystemError, \"The number system :nope is unknown\"}\n }\n\nNote that return value is not guaranteed to be a valid\nnumber system for the given locale as demonstrated in the third example.","ref":"Plausible.Cldr.Number.System.html#system_name_from/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.to_system/2","doc":"Converts a number into the representation of\na non-latin number system.\n\nThis function converts numbers to a known\nnumber system only, it does not provide number\nformatting.\n\n* `number` is a `float`, `integer` or `Decimal`\n\n* `system_name` is any number system name returned by\n `Cldr.known_number_systems/0` or a number system type\n returned by `Cldr.known_number_system_types/0`\n\nThere are two types of number systems in CLDR:\n\n* `:numeric` in which the number system defines\n a direct mapping between the latin digits `0..9`\n into a the number system equivalent. In this case,\n` to_system/2` invokes `Cldr.Number.Transliterate.transliterate_digits/3`\n for the given number.\n\n* `:algorithmic` in which the number system\n does not have the same structure as the `:latn`\n number system and therefore the conversion is\n done algorithmically. For CLDR the algorithm\n is implemented through `Cldr.Rbnf` rulesets.\n These rulesets are considered by CLDR to be\n less rigorous than the `:numeric` number systems\n and caution and testing for a specific use case\n is recommended.","ref":"Plausible.Cldr.Number.System.html#to_system/2"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.to_system/2","doc":"iex> Plausible.Cldr.Number.System.to_system 123456, :hebr\n {:ok, \"קכ״ג׳תנ״ו\"}\n\n iex> Plausible.Cldr.Number.System.to_system 123, :hans\n {:ok, \"一百二十三\"}\n\n iex> Plausible.Cldr.Number.System.to_system 123, :hant\n {:ok, \"一百二十三\"}\n\n iex> Plausible.Cldr.Number.System.to_system 123, :hansfin\n {:ok, \"壹佰贰拾叁\"}","ref":"Plausible.Cldr.Number.System.html#to_system/2-examples"},{"type":"function","title":"Plausible.Cldr.Number.System.to_system!/2","doc":"Converts a number into the representation of\na non-latin number system. Returns a converted\nstring or raises on error.\n\n* `number` is a `float`, `integer` or `Decimal`\n\n* `system_name` is any number system name returned by\n `Plausible.Cldr.known_number_systems/0` or a number system type\n returned by `Plausible.Cldr.known_number_system_types/0`\n\nSee `Plausible.Cldr.Number.System.to_system/2` for further\ninformation.","ref":"Plausible.Cldr.Number.System.html#to_system!/2"},{"type":"function","title":"Examples - Plausible.Cldr.Number.System.to_system!/2","doc":"iex> Plausible.Cldr.Number.System.to_system! 123, :hans\n \"一百二十三\"\n\n iex> Plausible.Cldr.Number.System.to_system! 123, :hant\n \"一百二十三\"\n\n iex> Plausible.Cldr.Number.System.to_system! 123, :hansfin\n \"壹佰贰拾叁\"","ref":"Plausible.Cldr.Number.System.html#to_system!/2-examples"},{"type":"module","title":"Plausible.Cldr.Number.Transliterate","doc":"Transliteration for digits and separators.\n\nTransliterating a string is an expensive business. First the string has to\nbe exploded into its component graphemes. Then for each grapheme we have\nto map to the equivalent in the other `{locale, number_system}`. Then we\nhave to reassemble the string.\n\nEffort is made to short circuit where possible. Transliteration is not\nrequired for any `{locale, number_system}` that is the same as `{\"en\",\n\"latn\"}` since the implementation uses this combination for the placeholders during\nformatting already. When short circuiting is possible (typically the en-*\nlocales with \"latn\" number_system - the total number of short circuited\nlocales is 211 of the 537 in CLDR) the overall number formatting is twice as\nfast than when formal transliteration is required.\n\n#","ref":"Plausible.Cldr.Number.Transliterate.html"},{"type":"module","title":"Configuring precompilation of digit transliterations - Plausible.Cldr.Number.Transliterate","doc":"This module includes `Cldr.Number.Transliterate.transliterate_digits/3` which transliterates\ndigits between number systems. For example from :arabic to :latn. Since generating a\ntransliteration map is slow, pairs of transliterations can be configured so that the\ntransliteration map is created at compile time and therefore speeding up transliteration at\nrun time.\n\nTo configure these transliteration pairs, add the to the `use Cldr` configuration\nin a backend module:\n\n defmodule MyApp.Cldr do\n use Cldr,\n locale: [\"en\", \"fr\", \"th\"],\n default_locale: \"en\",\n precompile_transliterations: [{:latn, :thai}, {:arab, :thai}]\n end\n\nWhere each tuple in the list configures one transliteration map. In this example, two maps are\nconfigured: from `:latn` to `:thai` and from `:arab` to `:thai`.\n\nA list of configurable number systems is returned by `Cldr.Number.System.systems_with_digits/0`.\n\nIf a transliteration is requested between two number pairs that have not been configured for\nprecompilation, a warning is logged.","ref":"Plausible.Cldr.Number.Transliterate.html#module-configuring-precompilation-of-digit-transliterations"},{"type":"function","title":"Plausible.Cldr.Number.Transliterate.transliterate/3","doc":"Transliterates from latin digits to another number system's digits.\n\nTransliterates the latin digits 0..9 to their equivalents in\nanother number system. Also transliterates the decimal and grouping\nseparators as well as the plus, minus and exponent symbols. Any other character\nin the string will be returned \"as is\".","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate/3"},{"type":"function","title":"Arguments - Plausible.Cldr.Number.Transliterate.transliterate/3","doc":"* `sequence` is the string to be transliterated.\n\n* `locale` is any known locale, defaulting to `Plausible.Cldr.get_locale/0`.\n\n* `number_system` is any known number system. If expressed as a `string` it\n is the actual name of a known number system. If epressed as an `atom` it is\n used as a key to look up a number system for the locale (the usual keys are\n `:default` and `:native` but :traditional and :finance are also part of the\n standard). See `Plausible.Cldr.Number.System.number_systems_for/1` for a locale to\n see what number system types are defined. The default is `:default`.\n\nFor available number systems see `Cldr.Number.System.number_systems/0`\nand `Plausible.Cldr.Number.System.number_systems_for/1`. Also see\n`Plausible.Cldr.Number.Symbol.number_symbols_for/1`.","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate/3-arguments"},{"type":"function","title":"Examples - Plausible.Cldr.Number.Transliterate.transliterate/3","doc":"iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123556\")\n \"123556\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123,556.000\", \"fr\", :default)\n \"123 556,000\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", :default)\n \"123556\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", \"thai\")\n \"๑๒๓๕๕๖\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"123556\", \"th\", :native)\n \"๑๒๓๕๕๖\"\n\n iex> Plausible.Cldr.Number.Transliterate.transliterate(\"Some number is: 123556\", \"th\", \"thai\")\n \"Some number is: ๑๒๓๕๕๖\"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate/3-examples"},{"type":"function","title":"Plausible.Cldr.Number.Transliterate.transliterate!/3","doc":"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate!/3"},{"type":"function","title":"Plausible.Cldr.Number.Transliterate.transliterate_digits/3","doc":"Transliterates digits from one number system to another number system\n\n* `digits` is binary representation of a number\n\n* `from_system` and `to_system` are number system names in atom form. See\n`Cldr.Number.System.systems_with_digits/0` for available number systems.","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate_digits/3"},{"type":"function","title":"Example - Plausible.Cldr.Number.Transliterate.transliterate_digits/3","doc":"iex> Plausible.Cldr.Number.Transliterate.transliterate_digits \"٠١٢٣٤٥٦٧٨٩\", :arab, :latn\n \"0123456789\"","ref":"Plausible.Cldr.Number.Transliterate.html#transliterate_digits/3-example"},{"type":"module","title":"Plausible.Cldr.Rbnf.NumberSystem","doc":"Functions to implement the number system rule-based-number-format rules of CLDR.\n\nThese rules are defined only on the \"und\" locale and represent specialised\nnumber formatting.\n\nThe standard public API for RBNF is via the `Cldr.Number.to_string/2` function.\n\nThe functions on this module are defined at compile time based upon the RBNF rules\ndefined in the Unicode CLDR data repository. Available rules are identified by:\n\n iex> Plausible.Cldr.Rbnf.NumberSystem.rule_sets(:und)\n ...> |> Enum.sort()\n [\n :armenian_lower,\n :armenian_upper,\n :cyrillic_lower,\n :ethiopic,\n :georgian,\n :greek_lower,\n :greek_upper,\n :hebrew,\n :hebrew_item,\n :roman_lower,\n :roman_upper,\n :tamil,\n :zz_default\n ]\n\nA rule can then be invoked on an available rule_set. For example\n\n iex> Plausible.Cldr.Rbnf.NumberSystem.roman_upper(123, :und)\n \"CXXIII\"\n\nThis particular call is equivalent to the call through the public API of:\n\n iex> Plausible.Cldr.Number.to_string(123, format: :roman)\n {:ok, \"CXXIII\"}","ref":"Plausible.Cldr.Rbnf.NumberSystem.html"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.all_rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#all_rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_lower/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_lower/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_lower/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_lower/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_upper/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_upper/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.armenian_upper/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#armenian_upper/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_1_10/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_1_10/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_final/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_final/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_post/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_post/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.cyrillic_lower_thousands/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#cyrillic_lower_thousands/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p1/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p1/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p2/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p2/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p3/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p3/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.ethiopic_p/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#ethiopic_p/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.georgian/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#georgian/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.georgian/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#georgian/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_lower/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_lower/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_lower/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_lower/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_numeral_majuscules/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_numeral_majuscules/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_numeral_minuscules/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_numeral_minuscules/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_upper/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_upper/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.greek_upper/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#greek_upper/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_0_99/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_0_99/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_item_hundreds/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_item_hundreds/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.hebrew_thousands/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#hebrew_thousands/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_lower/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_lower/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_lower/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_lower/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_upper/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_upper/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.roman_upper/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#roman_upper/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.rule_sets/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#rule_sets/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.tamil_thousands/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#tamil_thousands/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.zz_default/1","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#zz_default/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.NumberSystem.zz_default/2","doc":"","ref":"Plausible.Cldr.Rbnf.NumberSystem.html#zz_default/2"},{"type":"module","title":"Plausible.Cldr.Rbnf.Ordinal","doc":"Functions to implement the ordinal rule-based-number-format rules of CLDR.\n\nAs CLDR notes, the data is incomplete or non-existent for many languages. It\nis considered complete for English however.\n\nThe standard public API for RBNF is via the `Cldr.Number.to_string/2` function.\n\nThe functions on this module are defined at compile time based upon the RBNF rules\ndefined in the Unicode CLDR data repository. Available rules are identified by:\n\n iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(:en)\n [:digits_ordinal]\n\n iex> Plausible.Cldr.Rbnf.Ordinal.rule_sets(\"fr\")\n ...> |> Enum.sort()\n [\n :digits_ordinal,\n :digits_ordinal_feminine,\n :digits_ordinal_feminine_plural,\n :digits_ordinal_masculine,\n :digits_ordinal_masculine_plural\n ]\n\nA rule can then be invoked on an available rule_set. For example\n\n iex> Plausible.Cldr.Rbnf.Ordinal.digits_ordinal(123, :en)\n \"123rd\"\n\nThis call is equivalent to the call through the public API of:\n\n iex> Plausible.Cldr.Number.to_string(123, format: :ordinal)\n {:ok, \"123rd\"}","ref":"Plausible.Cldr.Rbnf.Ordinal.html"},{"type":"function","title":"Plausible.Cldr.Rbnf.Ordinal.all_rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#all_rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.Ordinal.digits_ordinal/2","doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#digits_ordinal/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Ordinal.rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.Ordinal.rule_sets/1","doc":"","ref":"Plausible.Cldr.Rbnf.Ordinal.html#rule_sets/1"},{"type":"module","title":"Plausible.Cldr.Rbnf.Spellout","doc":"Functions to implement the spellout rule-based-number-format rules of CLDR.\n\nAs CLDR notes, the data is incomplete or non-existent for many languages. It\nis considered complete for English however.\n\nThe standard public API for RBNF is via the `Cldr.Number.to_string/2` function.\n\nThe functions on this module are defined at compile time based upon the RBNF rules\ndefined in the Unicode CLDR data repository. Available rules are identified by:\n\n iex> Plausible.Cldr.Rbnf.Spellout.rule_sets(\"en\")\n ...> |> Enum.sort()\n [\n :spellout_cardinal,\n :spellout_cardinal_verbose,\n :spellout_numbering,\n :spellout_numbering_verbose,\n :spellout_numbering_year,\n :spellout_ordinal,\n :spellout_ordinal_verbose\n ]\n\nA rule can then be invoked on an available rule_set. For example:\n\n iex> Plausible.Cldr.Rbnf.Spellout.spellout_ordinal(123, \"en\")\n \"one hundred twenty-third\"\n\nThis call is equivalent to the call through the public API of:\n\n iex> Plausible.Cldr.Number.to_string(123, format: :spellout)\n {:ok, \"one hundred twenty-three\"}","ref":"Plausible.Cldr.Rbnf.Spellout.html"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.all_rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#all_rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.and/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#and/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.and_o/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#and_o/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.commas/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#commas/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.commas_o/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#commas_o/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.r2d_year/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#r2d_year/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.rule_sets/0","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#rule_sets/0"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.rule_sets/1","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#rule_sets/1"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_cardinal/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_cardinal/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_cardinal_verbose/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_cardinal_verbose/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering_verbose/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering_verbose/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_numbering_year/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_numbering_year/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_ordinal/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_ordinal/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.spellout_ordinal_verbose/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#spellout_ordinal_verbose/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.th/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#th/2"},{"type":"function","title":"Plausible.Cldr.Rbnf.Spellout.tieth/2","doc":"","ref":"Plausible.Cldr.Rbnf.Spellout.html#tieth/2"},{"type":"module","title":"Plausible.ClickhouseEventV2","doc":"Event schema for when NumericIDs migration is complete","ref":"Plausible.ClickhouseEventV2.html"},{"type":"function","title":"Plausible.ClickhouseEventV2.new/1","doc":"","ref":"Plausible.ClickhouseEventV2.html#new/1"},{"type":"module","title":"Plausible.ClickhouseRepo","doc":"","ref":"Plausible.ClickhouseRepo.html"},{"type":"function","title":"Plausible.ClickhouseRepo.aggregate/3","doc":"","ref":"Plausible.ClickhouseRepo.html#aggregate/3"},{"type":"function","title":"Plausible.ClickhouseRepo.aggregate/4","doc":"","ref":"Plausible.ClickhouseRepo.html#aggregate/4"},{"type":"function","title":"Plausible.ClickhouseRepo.all/2","doc":"","ref":"Plausible.ClickhouseRepo.html#all/2"},{"type":"function","title":"Plausible.ClickhouseRepo.checked_out?/0","doc":"","ref":"Plausible.ClickhouseRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.ClickhouseRepo.checkout/2","doc":"","ref":"Plausible.ClickhouseRepo.html#checkout/2"},{"type":"function","title":"Plausible.ClickhouseRepo.child_spec/1","doc":"","ref":"Plausible.ClickhouseRepo.html#child_spec/1"},{"type":"function","title":"Plausible.ClickhouseRepo.config/0","doc":"","ref":"Plausible.ClickhouseRepo.html#config/0"},{"type":"function","title":"Plausible.ClickhouseRepo.default_options/1","doc":"","ref":"Plausible.ClickhouseRepo.html#default_options/1"},{"type":"function","title":"Plausible.ClickhouseRepo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.ClickhouseRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.ClickhouseRepo.exists?/2","doc":"","ref":"Plausible.ClickhouseRepo.html#exists?/2"},{"type":"function","title":"Plausible.ClickhouseRepo.get/3","doc":"","ref":"Plausible.ClickhouseRepo.html#get/3"},{"type":"function","title":"Plausible.ClickhouseRepo.get!/3","doc":"","ref":"Plausible.ClickhouseRepo.html#get!/3"},{"type":"function","title":"Plausible.ClickhouseRepo.get_by/3","doc":"","ref":"Plausible.ClickhouseRepo.html#get_by/3"},{"type":"function","title":"Plausible.ClickhouseRepo.get_by!/3","doc":"","ref":"Plausible.ClickhouseRepo.html#get_by!/3"},{"type":"function","title":"Plausible.ClickhouseRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.ClickhouseRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.ClickhouseRepo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.ClickhouseRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.ClickhouseRepo.load/2","doc":"","ref":"Plausible.ClickhouseRepo.html#load/2"},{"type":"function","title":"Plausible.ClickhouseRepo.one/2","doc":"","ref":"Plausible.ClickhouseRepo.html#one/2"},{"type":"function","title":"Plausible.ClickhouseRepo.one!/2","doc":"","ref":"Plausible.ClickhouseRepo.html#one!/2"},{"type":"function","title":"Plausible.ClickhouseRepo.parallel_tasks/1","doc":"","ref":"Plausible.ClickhouseRepo.html#parallel_tasks/1"},{"type":"function","title":"Plausible.ClickhouseRepo.preload/3","doc":"","ref":"Plausible.ClickhouseRepo.html#preload/3"},{"type":"function","title":"Plausible.ClickhouseRepo.prepare_query/3","doc":"","ref":"Plausible.ClickhouseRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.ClickhouseRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.ClickhouseRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.ClickhouseRepo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.ClickhouseRepo.html#query/3"},{"type":"function","title":"Plausible.ClickhouseRepo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.ClickhouseRepo.html#query!/3"},{"type":"function","title":"Plausible.ClickhouseRepo.reload/2","doc":"","ref":"Plausible.ClickhouseRepo.html#reload/2"},{"type":"function","title":"Plausible.ClickhouseRepo.reload!/2","doc":"","ref":"Plausible.ClickhouseRepo.html#reload!/2"},{"type":"function","title":"Plausible.ClickhouseRepo.start_link/1","doc":"","ref":"Plausible.ClickhouseRepo.html#start_link/1"},{"type":"function","title":"Plausible.ClickhouseRepo.stop/1","doc":"","ref":"Plausible.ClickhouseRepo.html#stop/1"},{"type":"function","title":"Plausible.ClickhouseRepo.stream/2","doc":"","ref":"Plausible.ClickhouseRepo.html#stream/2"},{"type":"function","title":"Plausible.ClickhouseRepo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.ClickhouseRepo.html#to_sql/2"},{"type":"module","title":"Plausible.ClickhouseSessionV2","doc":"Session schema for when NumericIDs migration is complete","ref":"Plausible.ClickhouseSessionV2.html"},{"type":"function","title":"Plausible.ClickhouseSessionV2.random_uint64/0","doc":"","ref":"Plausible.ClickhouseSessionV2.html#random_uint64/0"},{"type":"module","title":"Plausible.ClickhouseSessionV2.BoolUInt8","doc":"Custom type to cast Bool as UInt8","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html"},{"type":"function","title":"Plausible.ClickhouseSessionV2.BoolUInt8.embed_as/1","doc":"","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html#embed_as/1"},{"type":"function","title":"Plausible.ClickhouseSessionV2.BoolUInt8.equal?/2","doc":"","ref":"Plausible.ClickhouseSessionV2.BoolUInt8.html#equal?/2"},{"type":"module","title":"Plausible.ConfigHelpers","doc":"","ref":"Plausible.ConfigHelpers.html"},{"type":"function","title":"Plausible.ConfigHelpers.get_int_from_path_or_env/3","doc":"","ref":"Plausible.ConfigHelpers.html#get_int_from_path_or_env/3"},{"type":"function","title":"Plausible.ConfigHelpers.get_var_from_path_or_env/3","doc":"","ref":"Plausible.ConfigHelpers.html#get_var_from_path_or_env/3"},{"type":"module","title":"Plausible.DataCase","doc":"This module defines the setup for tests requiring\naccess to the application's data layer.\n\nYou may define functions here to be used as helpers in\nyour tests.\n\nFinally, if the test case interacts with the database,\nit cannot be async. For this reason, every test runs\ninside a transaction which is reset at the beginning\nof the test unless the test case is marked as async.","ref":"Plausible.DataCase.html"},{"type":"module","title":"Plausible.DataMigration","doc":"Base module for coordinated Clickhouse data migrations\nrun via remote shell or otherwise (TBD).","ref":"Plausible.DataMigration.html"},{"type":"module","title":"Plausible.DataMigration.NumericIDs","doc":"Numeric IDs migration, SQL files available at:\npriv/data_migrations/NumericIDs/sql","ref":"Plausible.DataMigration.NumericIDs.html"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.confirm/3","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run/1","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run/1"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run_sql/2","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql/2"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run_sql_confirm/2","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql_confirm/2"},{"type":"module","title":"Plausible.DataMigration.Repo","doc":"Ecto.Repo for Clickhouse data migrations, to be started manually,\noutside of the main application supervision tree.","ref":"Plausible.DataMigration.Repo.html"},{"type":"function","title":"Plausible.DataMigration.Repo.aggregate/3","doc":"","ref":"Plausible.DataMigration.Repo.html#aggregate/3"},{"type":"function","title":"Plausible.DataMigration.Repo.aggregate/4","doc":"","ref":"Plausible.DataMigration.Repo.html#aggregate/4"},{"type":"function","title":"Plausible.DataMigration.Repo.all/2","doc":"","ref":"Plausible.DataMigration.Repo.html#all/2"},{"type":"function","title":"Plausible.DataMigration.Repo.checked_out?/0","doc":"","ref":"Plausible.DataMigration.Repo.html#checked_out?/0"},{"type":"function","title":"Plausible.DataMigration.Repo.checkout/2","doc":"","ref":"Plausible.DataMigration.Repo.html#checkout/2"},{"type":"function","title":"Plausible.DataMigration.Repo.child_spec/1","doc":"","ref":"Plausible.DataMigration.Repo.html#child_spec/1"},{"type":"function","title":"Plausible.DataMigration.Repo.config/0","doc":"","ref":"Plausible.DataMigration.Repo.html#config/0"},{"type":"function","title":"Plausible.DataMigration.Repo.default_options/1","doc":"","ref":"Plausible.DataMigration.Repo.html#default_options/1"},{"type":"function","title":"Plausible.DataMigration.Repo.delete/2","doc":"","ref":"Plausible.DataMigration.Repo.html#delete/2"},{"type":"function","title":"Plausible.DataMigration.Repo.delete!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#delete!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.delete_all/2","doc":"","ref":"Plausible.DataMigration.Repo.html#delete_all/2"},{"type":"function","title":"Plausible.DataMigration.Repo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.DataMigration.Repo.html#disconnect_all/2"},{"type":"function","title":"Plausible.DataMigration.Repo.exists?/2","doc":"","ref":"Plausible.DataMigration.Repo.html#exists?/2"},{"type":"function","title":"Plausible.DataMigration.Repo.get/3","doc":"","ref":"Plausible.DataMigration.Repo.html#get/3"},{"type":"function","title":"Plausible.DataMigration.Repo.get!/3","doc":"","ref":"Plausible.DataMigration.Repo.html#get!/3"},{"type":"function","title":"Plausible.DataMigration.Repo.get_by/3","doc":"","ref":"Plausible.DataMigration.Repo.html#get_by/3"},{"type":"function","title":"Plausible.DataMigration.Repo.get_by!/3","doc":"","ref":"Plausible.DataMigration.Repo.html#get_by!/3"},{"type":"function","title":"Plausible.DataMigration.Repo.get_dynamic_repo/0","doc":"","ref":"Plausible.DataMigration.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.DataMigration.Repo.insert/2","doc":"","ref":"Plausible.DataMigration.Repo.html#insert/2"},{"type":"function","title":"Plausible.DataMigration.Repo.insert!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#insert!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.insert_all/3","doc":"","ref":"Plausible.DataMigration.Repo.html#insert_all/3"},{"type":"function","title":"Plausible.DataMigration.Repo.insert_or_update/2","doc":"","ref":"Plausible.DataMigration.Repo.html#insert_or_update/2"},{"type":"function","title":"Plausible.DataMigration.Repo.insert_or_update!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.DataMigration.Repo.html#insert_stream/3"},{"type":"function","title":"Plausible.DataMigration.Repo.load/2","doc":"","ref":"Plausible.DataMigration.Repo.html#load/2"},{"type":"function","title":"Plausible.DataMigration.Repo.one/2","doc":"","ref":"Plausible.DataMigration.Repo.html#one/2"},{"type":"function","title":"Plausible.DataMigration.Repo.one!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#one!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.preload/3","doc":"","ref":"Plausible.DataMigration.Repo.html#preload/3"},{"type":"function","title":"Plausible.DataMigration.Repo.prepare_query/3","doc":"","ref":"Plausible.DataMigration.Repo.html#prepare_query/3"},{"type":"function","title":"Plausible.DataMigration.Repo.put_dynamic_repo/1","doc":"","ref":"Plausible.DataMigration.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.DataMigration.Repo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.DataMigration.Repo.html#query/3"},{"type":"function","title":"Plausible.DataMigration.Repo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.DataMigration.Repo.html#query!/3"},{"type":"function","title":"Plausible.DataMigration.Repo.reload/2","doc":"","ref":"Plausible.DataMigration.Repo.html#reload/2"},{"type":"function","title":"Plausible.DataMigration.Repo.reload!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#reload!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.start/2","doc":"","ref":"Plausible.DataMigration.Repo.html#start/2"},{"type":"function","title":"Plausible.DataMigration.Repo.start_link/1","doc":"","ref":"Plausible.DataMigration.Repo.html#start_link/1"},{"type":"function","title":"Plausible.DataMigration.Repo.stop/1","doc":"","ref":"Plausible.DataMigration.Repo.html#stop/1"},{"type":"function","title":"Plausible.DataMigration.Repo.stream/2","doc":"","ref":"Plausible.DataMigration.Repo.html#stream/2"},{"type":"function","title":"Plausible.DataMigration.Repo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.DataMigration.Repo.html#to_sql/2"},{"type":"function","title":"Plausible.DataMigration.Repo.update/2","doc":"","ref":"Plausible.DataMigration.Repo.html#update/2"},{"type":"function","title":"Plausible.DataMigration.Repo.update!/2","doc":"","ref":"Plausible.DataMigration.Repo.html#update!/2"},{"type":"function","title":"Plausible.DataMigration.Repo.update_all/3","doc":"","ref":"Plausible.DataMigration.Repo.html#update_all/3"},{"type":"module","title":"Plausible.DebugReplayInfo","doc":"Function execution context (with arguments) to Sentry reports.","ref":"Plausible.DebugReplayInfo.html"},{"type":"function","title":"Plausible.DebugReplayInfo.deserialize/1","doc":"","ref":"Plausible.DebugReplayInfo.html#deserialize/1"},{"type":"macro","title":"Plausible.DebugReplayInfo.include_sentry_replay_info/0","doc":"","ref":"Plausible.DebugReplayInfo.html#include_sentry_replay_info/0"},{"type":"module","title":"Plausible.Ecto.EventName","doc":"Custom type for event name. Accepts Strings and Integers and stores them as String. Returns\n cast error if any other type is provided. Accepting integers is important for 404 tracking.","ref":"Plausible.Ecto.EventName.html"},{"type":"function","title":"Plausible.Ecto.EventName.cast/1","doc":"","ref":"Plausible.Ecto.EventName.html#cast/1"},{"type":"function","title":"Plausible.Ecto.EventName.dump/1","doc":"","ref":"Plausible.Ecto.EventName.html#dump/1"},{"type":"function","title":"Plausible.Ecto.EventName.embed_as/1","doc":"","ref":"Plausible.Ecto.EventName.html#embed_as/1"},{"type":"function","title":"Plausible.Ecto.EventName.equal?/2","doc":"","ref":"Plausible.Ecto.EventName.html#equal?/2"},{"type":"function","title":"Plausible.Ecto.EventName.load/1","doc":"","ref":"Plausible.Ecto.EventName.html#load/1"},{"type":"function","title":"Plausible.Ecto.EventName.type/0","doc":"","ref":"Plausible.Ecto.EventName.html#type/0"},{"type":"module","title":"Plausible.Factory","doc":"","ref":"Plausible.Factory.html"},{"type":"function","title":"Plausible.Factory.api_key_factory/0","doc":"","ref":"Plausible.Factory.html#api_key_factory/0"},{"type":"function","title":"Plausible.Factory.build/2","doc":"","ref":"Plausible.Factory.html#build/2"},{"type":"function","title":"Plausible.Factory.build_list/3","doc":"","ref":"Plausible.Factory.html#build_list/3"},{"type":"function","title":"Plausible.Factory.build_pair/2","doc":"","ref":"Plausible.Factory.html#build_pair/2"},{"type":"function","title":"Plausible.Factory.business_subscription_factory/0","doc":"","ref":"Plausible.Factory.html#business_subscription_factory/0"},{"type":"function","title":"Plausible.Factory.ch_session_factory/0","doc":"","ref":"Plausible.Factory.html#ch_session_factory/0"},{"type":"function","title":"Plausible.Factory.create/1","doc":"","ref":"Plausible.Factory.html#create/1"},{"type":"function","title":"Plausible.Factory.create/2","doc":"","ref":"Plausible.Factory.html#create/2"},{"type":"function","title":"Plausible.Factory.create_list/3","doc":"","ref":"Plausible.Factory.html#create_list/3"},{"type":"function","title":"Plausible.Factory.create_pair/2","doc":"","ref":"Plausible.Factory.html#create_pair/2"},{"type":"function","title":"Plausible.Factory.enterprise_plan_factory/0","doc":"","ref":"Plausible.Factory.html#enterprise_plan_factory/0"},{"type":"function","title":"Plausible.Factory.event_factory/0","doc":"","ref":"Plausible.Factory.html#event_factory/0"},{"type":"function","title":"Plausible.Factory.factory/1","doc":"Raises a helpful error if no factory is defined.","ref":"Plausible.Factory.html#factory/1"},{"type":"function","title":"Plausible.Factory.goal_factory/0","doc":"","ref":"Plausible.Factory.html#goal_factory/0"},{"type":"function","title":"Plausible.Factory.google_auth_factory/0","doc":"","ref":"Plausible.Factory.html#google_auth_factory/0"},{"type":"function","title":"Plausible.Factory.growth_subscription_factory/0","doc":"","ref":"Plausible.Factory.html#growth_subscription_factory/0"},{"type":"function","title":"Plausible.Factory.imported_browsers_factory/0","doc":"","ref":"Plausible.Factory.html#imported_browsers_factory/0"},{"type":"function","title":"Plausible.Factory.imported_devices_factory/0","doc":"","ref":"Plausible.Factory.html#imported_devices_factory/0"},{"type":"function","title":"Plausible.Factory.imported_entry_pages_factory/0","doc":"","ref":"Plausible.Factory.html#imported_entry_pages_factory/0"},{"type":"function","title":"Plausible.Factory.imported_exit_pages_factory/0","doc":"","ref":"Plausible.Factory.html#imported_exit_pages_factory/0"},{"type":"function","title":"Plausible.Factory.imported_locations_factory/0","doc":"","ref":"Plausible.Factory.html#imported_locations_factory/0"},{"type":"function","title":"Plausible.Factory.imported_operating_systems_factory/0","doc":"","ref":"Plausible.Factory.html#imported_operating_systems_factory/0"},{"type":"function","title":"Plausible.Factory.imported_pages_factory/0","doc":"","ref":"Plausible.Factory.html#imported_pages_factory/0"},{"type":"function","title":"Plausible.Factory.imported_sources_factory/0","doc":"","ref":"Plausible.Factory.html#imported_sources_factory/0"},{"type":"function","title":"Plausible.Factory.imported_visitors_factory/0","doc":"","ref":"Plausible.Factory.html#imported_visitors_factory/0"},{"type":"function","title":"Plausible.Factory.insert/1","doc":"","ref":"Plausible.Factory.html#insert/1"},{"type":"function","title":"Plausible.Factory.insert/2","doc":"","ref":"Plausible.Factory.html#insert/2"},{"type":"function","title":"Plausible.Factory.insert/3","doc":"","ref":"Plausible.Factory.html#insert/3"},{"type":"function","title":"Plausible.Factory.insert_list/3","doc":"","ref":"Plausible.Factory.html#insert_list/3"},{"type":"function","title":"Plausible.Factory.insert_list/4","doc":"","ref":"Plausible.Factory.html#insert_list/4"},{"type":"function","title":"Plausible.Factory.insert_pair/2","doc":"","ref":"Plausible.Factory.html#insert_pair/2"},{"type":"function","title":"Plausible.Factory.insert_pair/3","doc":"","ref":"Plausible.Factory.html#insert_pair/3"},{"type":"function","title":"Plausible.Factory.invitation_factory/0","doc":"","ref":"Plausible.Factory.html#invitation_factory/0"},{"type":"function","title":"Plausible.Factory.monthly_report_factory/0","doc":"","ref":"Plausible.Factory.html#monthly_report_factory/0"},{"type":"function","title":"Plausible.Factory.pageview_factory/0","doc":"","ref":"Plausible.Factory.html#pageview_factory/0"},{"type":"function","title":"Plausible.Factory.params_for/2","doc":"","ref":"Plausible.Factory.html#params_for/2"},{"type":"function","title":"Plausible.Factory.params_with_assocs/2","doc":"","ref":"Plausible.Factory.html#params_with_assocs/2"},{"type":"function","title":"Plausible.Factory.shared_link_factory/0","doc":"","ref":"Plausible.Factory.html#shared_link_factory/0"},{"type":"function","title":"Plausible.Factory.site_factory/1","doc":"","ref":"Plausible.Factory.html#site_factory/1"},{"type":"function","title":"Plausible.Factory.site_membership_factory/0","doc":"","ref":"Plausible.Factory.html#site_membership_factory/0"},{"type":"function","title":"Plausible.Factory.spike_notification_factory/0","doc":"","ref":"Plausible.Factory.html#spike_notification_factory/0"},{"type":"function","title":"Plausible.Factory.string_params_for/2","doc":"","ref":"Plausible.Factory.html#string_params_for/2"},{"type":"function","title":"Plausible.Factory.string_params_with_assocs/2","doc":"","ref":"Plausible.Factory.html#string_params_with_assocs/2"},{"type":"function","title":"Plausible.Factory.subscription_factory/0","doc":"","ref":"Plausible.Factory.html#subscription_factory/0"},{"type":"function","title":"Plausible.Factory.user_factory/1","doc":"","ref":"Plausible.Factory.html#user_factory/1"},{"type":"function","title":"Plausible.Factory.weekly_report_factory/0","doc":"","ref":"Plausible.Factory.html#weekly_report_factory/0"},{"type":"module","title":"Plausible.Funnel","doc":"A funnel is a marketing term used to capture and describe the journey\nthat users go through, from initial step to conversion.\nA funnel consists of several steps (here: 2..8).\n\nThis module defines the database schema for storing funnels\nand changeset helpers for enumerating the steps within.\n\nEach step references a goal (either a Custom Event or Visit)\n- see: `Plausible.Goal`.","ref":"Plausible.Funnel.html"},{"type":"function","title":"Plausible.Funnel.changeset/2","doc":"","ref":"Plausible.Funnel.html#changeset/2"},{"type":"macro","title":"Plausible.Funnel.max_steps/0","doc":"","ref":"Plausible.Funnel.html#max_steps/0"},{"type":"macro","title":"Plausible.Funnel.min_steps/0","doc":"","ref":"Plausible.Funnel.html#min_steps/0"},{"type":"function","title":"Plausible.Funnel.put_step_orders/1","doc":"","ref":"Plausible.Funnel.html#put_step_orders/1"},{"type":"type","title":"Plausible.Funnel.t/0","doc":"","ref":"Plausible.Funnel.html#t:t/0"},{"type":"module","title":"Plausible.Funnel.Const","doc":"Compile-time convience constants for funnel characteristics.","ref":"Plausible.Funnel.Const.html"},{"type":"macro","title":"Plausible.Funnel.Const.max_steps/0","doc":"","ref":"Plausible.Funnel.Const.html#max_steps/0"},{"type":"macro","title":"Plausible.Funnel.Const.min_steps/0","doc":"","ref":"Plausible.Funnel.Const.html#min_steps/0"},{"type":"module","title":"Plausible.Funnel.Step","doc":"This module defines the database schema for a single Funnel step.\nSee: `Plausible.Funnel` for more information.","ref":"Plausible.Funnel.Step.html"},{"type":"function","title":"Plausible.Funnel.Step.changeset/2","doc":"","ref":"Plausible.Funnel.Step.html#changeset/2"},{"type":"type","title":"Plausible.Funnel.Step.t/0","doc":"","ref":"Plausible.Funnel.Step.html#t:t/0"},{"type":"module","title":"Plausible.Funnels","doc":"This module implements contextual Funnel interface, allowing listing,\ncreating and deleting funnel definitions.\n\nFor brief explanation of what a Funnel is, please see `Plausible.Funnel` schema.\nSee `Plausible.Stats.Funnel` for the evaluation logic.","ref":"Plausible.Funnels.html"},{"type":"function","title":"Plausible.Funnels.create/3","doc":"","ref":"Plausible.Funnels.html#create/3"},{"type":"function","title":"Plausible.Funnels.create_changeset/3","doc":"","ref":"Plausible.Funnels.html#create_changeset/3"},{"type":"function","title":"Plausible.Funnels.delete/2","doc":"","ref":"Plausible.Funnels.html#delete/2"},{"type":"function","title":"Plausible.Funnels.ephemeral_definition/3","doc":"","ref":"Plausible.Funnels.html#ephemeral_definition/3"},{"type":"function","title":"Plausible.Funnels.get/2","doc":"","ref":"Plausible.Funnels.html#get/2"},{"type":"function","title":"Plausible.Funnels.list/1","doc":"","ref":"Plausible.Funnels.html#list/1"},{"type":"module","title":"Plausible.Geo","doc":"This module provides an API for fetching IP geolocation.","ref":"Plausible.Geo.html"},{"type":"function","title":"Plausible.Geo.await_loader/0","doc":"Waits for the database to start after calling `load_db/1` with the async option.","ref":"Plausible.Geo.html#await_loader/0"},{"type":"function","title":"Plausible.Geo.database_type/0","doc":"Returns geodatabase type.\n\nUsed for deciding whether to show the DB-IP disclaimer or not.","ref":"Plausible.Geo.html#database_type/0"},{"type":"function","title":"Examples - Plausible.Geo.database_type/0","doc":"In the case of a DB-IP database:\n\n iex> database_type()\n \"DBIP-City-Lite\"\n\n In the case of a MaxMind database:\n\n iex> database_type()\n \"GeoLite2-City\"","ref":"Plausible.Geo.html#database_type/0-examples"},{"type":"function","title":"Plausible.Geo.load_db/1","doc":"Starts the geodatabase loading process. Two modes are supported: local file\nand MaxMind license key.","ref":"Plausible.Geo.html#load_db/1"},{"type":"function","title":"Options - Plausible.Geo.load_db/1","doc":"* `:path` - the path to the .mmdb database local file. When present,\n `:license_key` and `:edition` are not required.\n\n * `:license_key` - the [license key](https://support.maxmind.com/hc/en-us/articles/4407111582235-Generate-a-License-Key)\n from MaxMind to authenticate requests to MaxMind.\n\n * `:edition` - the name of the MaxMind database to be downloaded from MaxMind\n servers. Defaults to `GeoLite2-City`.\n\n * `:async` - when used, configures the database loading to run\n asynchronously.","ref":"Plausible.Geo.html#load_db/1-options"},{"type":"function","title":"Examples - Plausible.Geo.load_db/1","doc":"Loading from a local file:\n\n iex> load_db(path: \"/etc/plausible/dbip-city.mmdb\")\n :ok\n\n Downloading a MaxMind DB (this license key is no longer active):\n\n iex> load_db(license_key: \"LNpsJCCKPis6XvBP\", edition: \"GeoLite2-City\", async: true)\n :ok","ref":"Plausible.Geo.html#load_db/1-examples"},{"type":"function","title":"Plausible.Geo.lookup/1","doc":"Looks up geo info about an IP address.","ref":"Plausible.Geo.html#lookup/1"},{"type":"function","title":"Examples - Plausible.Geo.lookup/1","doc":"iex> lookup(\"8.7.6.5\")\n %{\n \"city\" => %{\n \"geoname_id\" => 5349755,\n \"names\" => %{\n \"de\" => \"Fontana\",\n \"en\" => \"Fontana\",\n \"ja\" => \"フォンタナ\",\n \"ru\" => \"Фонтана\"\n }\n },\n \"continent\" => %{\n \"code\" => \"NA\",\n \"geoname_id\" => 6255149,\n \"names\" => %{\n \"de\" => \"Nordamerika\",\n \"en\" => \"North America\",\n \"es\" => \"Norteamérica\",\n \"fr\" => \"Amérique du Nord\",\n \"ja\" => \"北アメリカ\",\n \"pt-BR\" => \"América do Norte\",\n \"ru\" => \"Северная Америка\",\n \"zh-CN\" => \"北美洲\"\n }\n },\n \"country\" => %{\n \"geoname_id\" => 6252001,\n \"iso_code\" => \"US\",\n \"names\" => %{\n \"de\" => \"Vereinigte Staaten\",\n \"en\" => \"United States\",\n \"es\" => \"Estados Unidos\",\n \"fr\" => \"États Unis\",\n \"ja\" => \"アメリカ\",\n \"pt-BR\" => \"EUA\",\n \"ru\" => \"США\",\n \"zh-CN\" => \"美国\"\n }\n },\n \"location\" => %{\n \"accuracy_radius\" => 50,\n \"latitude\" => 34.1211,\n \"longitude\" => -117.4362,\n \"metro_code\" => 803,\n \"time_zone\" => \"America/Los_Angeles\"\n },\n \"postal\" => %{\"code\" => \"92336\"},\n \"registered_country\" => %{\n \"geoname_id\" => 6252001,\n \"iso_code\" => \"US\",\n \"names\" => %{\n \"de\" => \"Vereinigte Staaten\",\n \"en\" => \"United States\",\n \"es\" => \"Estados Unidos\",\n \"fr\" => \"États Unis\",\n \"ja\" => \"アメリカ\",\n \"pt-BR\" => \"EUA\",\n \"ru\" => \"США\",\n \"zh-CN\" => \"美国\"\n }\n },\n \"subdivisions\" => [\n %{\n \"geoname_id\" => 5332921,\n \"iso_code\" => \"CA\",\n \"names\" => %{\n \"de\" => \"Kalifornien\",\n \"en\" => \"California\",\n \"es\" => \"California\",\n \"fr\" => \"Californie\",\n \"ja\" => \"カリフォルニア州\",\n \"pt-BR\" => \"Califórnia\",\n \"ru\" => \"Калифорния\",\n \"zh-CN\" => \"加州\"\n }\n }\n ]\n }","ref":"Plausible.Geo.html#lookup/1-examples"},{"type":"module","title":"Plausible.Goal","doc":"","ref":"Plausible.Goal.html"},{"type":"function","title":"Plausible.Goal.changeset/2","doc":"","ref":"Plausible.Goal.html#changeset/2"},{"type":"type","title":"Plausible.Goal.t/0","doc":"","ref":"Plausible.Goal.html#t:t/0"},{"type":"module","title":"Plausible.Goal.Revenue","doc":"Currency specific functions for revenue goals","ref":"Plausible.Goal.Revenue.html"},{"type":"function","title":"Plausible.Goal.Revenue.currency_options/0","doc":"","ref":"Plausible.Goal.Revenue.html#currency_options/0"},{"type":"function","title":"Plausible.Goal.Revenue.revenue?/1","doc":"","ref":"Plausible.Goal.Revenue.html#revenue?/1"},{"type":"function","title":"Plausible.Goal.Revenue.valid_currencies/0","doc":"","ref":"Plausible.Goal.Revenue.html#valid_currencies/0"},{"type":"module","title":"Plausible.Goals","doc":"","ref":"Plausible.Goals.html"},{"type":"function","title":"Plausible.Goals.count/1","doc":"","ref":"Plausible.Goals.html#count/1"},{"type":"function","title":"Plausible.Goals.create/3","doc":"Creates a Goal for a site.\n\nIf the created goal is a revenue goal, it sets site.updated_at to be\nrefreshed by the sites cache, as revenue goals are used during ingestion.","ref":"Plausible.Goals.html#create/3"},{"type":"function","title":"Plausible.Goals.delete/2","doc":"If a goal belongs to funnel(s), we need to inspect their number of steps.\n\nIf it exceeds the minimum allowed (defined via `Plausible.Funnel.min_steps/0`),\nthe funnel will be reduced (i.e. a step associated with the goal to be deleted\nis removed), so that the minimum number of steps is preserved. This is done\nimplicitly, by postgres, as per on_delete: :delete_all.\n\nOtherwise, for associated funnel(s) consisting of minimum number steps only,\nfunnel record(s) are removed completely along with the targeted goal.","ref":"Plausible.Goals.html#delete/2"},{"type":"function","title":"Plausible.Goals.find_or_create/2","doc":"","ref":"Plausible.Goals.html#find_or_create/2"},{"type":"function","title":"Plausible.Goals.for_site/2","doc":"","ref":"Plausible.Goals.html#for_site/2"},{"type":"function","title":"Plausible.Goals.for_site_query/2","doc":"","ref":"Plausible.Goals.html#for_site_query/2"},{"type":"module","title":"Plausible.Google.Api","doc":"","ref":"Plausible.Google.Api.html"},{"type":"function","title":"Plausible.Google.Api.fetch_and_persist/3","doc":"","ref":"Plausible.Google.Api.html#fetch_and_persist/3"},{"type":"function","title":"Plausible.Google.Api.fetch_stats/3","doc":"","ref":"Plausible.Google.Api.html#fetch_stats/3"},{"type":"function","title":"Plausible.Google.Api.fetch_verified_properties/1","doc":"","ref":"Plausible.Google.Api.html#fetch_verified_properties/1"},{"type":"function","title":"Plausible.Google.Api.get_view/2","doc":"Returns a single Google Analytics view if the user has access to it.","ref":"Plausible.Google.Api.html#get_view/2"},{"type":"function","title":"Plausible.Google.Api.import_analytics/4","doc":"Imports stats from a Google Analytics UA view to a Plausible site.\n\nThis function fetches Google Analytics reports in batches of 7500 per\nrequest. The batches are then buffered to Clickhouse by the\n`Plausible.Google.Buffer` process.\n\nRequests to Google Analytics can fail, and are retried at most\n5 times with an exponential backoff. Returns `:ok` when\nimporting has finished or `{:error, term()}` when a request to GA failed too \nmany times.\n\nUseful links:\n\n- [Feature documentation](https://plausible.io/docs/google-analytics-import)\n- [GA API reference](https://developers.google.com/analytics/devguides/reporting/core/v4/rest/v4/reports/batchGet#ReportRequest)\n- [GA Dimensions reference](https://ga-dev-tools.web.app/dimensions-metrics-explorer)","ref":"Plausible.Google.Api.html#import_analytics/4"},{"type":"function","title":"Plausible.Google.Api.import_authorize_url/2","doc":"","ref":"Plausible.Google.Api.html#import_authorize_url/2"},{"type":"function","title":"Plausible.Google.Api.list_views/1","doc":"Lists Google Analytics views grouped by hostname.","ref":"Plausible.Google.Api.html#list_views/1"},{"type":"function","title":"Plausible.Google.Api.search_console_authorize_url/2","doc":"","ref":"Plausible.Google.Api.html#search_console_authorize_url/2"},{"type":"type","title":"Plausible.Google.Api.google_analytics_view/0","doc":"","ref":"Plausible.Google.Api.html#t:google_analytics_view/0"},{"type":"type","title":"Plausible.Google.Api.import_auth/0","doc":"","ref":"Plausible.Google.Api.html#t:import_auth/0"},{"type":"module","title":"Plausible.Google.Api.Mock","doc":"","ref":"Plausible.Google.Api.Mock.html"},{"type":"function","title":"Plausible.Google.Api.Mock.fetch_stats/3","doc":"","ref":"Plausible.Google.Api.Mock.html#fetch_stats/3"},{"type":"module","title":"Plausible.Google.Buffer","doc":"This GenServer inserts records into Clickhouse `imported_*` tables. Multiple buffers are\nautomatically created for each table. Records are flushed when the table buffer reaches the\nmaximum size, defined by `max_buffer_size/0`.","ref":"Plausible.Google.Buffer.html"},{"type":"function","title":"Plausible.Google.Buffer.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Google.Buffer.html#child_spec/1"},{"type":"function","title":"Plausible.Google.Buffer.flush/2","doc":"Flushes all table buffers to Clickhouse.","ref":"Plausible.Google.Buffer.html#flush/2"},{"type":"function","title":"Plausible.Google.Buffer.handle_continue/2","doc":"","ref":"Plausible.Google.Buffer.html#handle_continue/2"},{"type":"function","title":"Plausible.Google.Buffer.init/1","doc":"","ref":"Plausible.Google.Buffer.html#init/1"},{"type":"function","title":"Plausible.Google.Buffer.insert_many/3","doc":"Puts the given records into the table buffer.","ref":"Plausible.Google.Buffer.html#insert_many/3"},{"type":"function","title":"Plausible.Google.Buffer.size/2","doc":"Returns the total count of items in the given table buffer.","ref":"Plausible.Google.Buffer.html#size/2"},{"type":"function","title":"Plausible.Google.Buffer.start_link/0","doc":"","ref":"Plausible.Google.Buffer.html#start_link/0"},{"type":"function","title":"Plausible.Google.Buffer.stop/1","doc":"","ref":"Plausible.Google.Buffer.html#stop/1"},{"type":"module","title":"Plausible.Google.HTTP","doc":"","ref":"Plausible.Google.HTTP.html"},{"type":"function","title":"Plausible.Google.HTTP.fetch_access_token/1","doc":"","ref":"Plausible.Google.HTTP.html#fetch_access_token/1"},{"type":"function","title":"Plausible.Google.HTTP.get_analytics_start_date/2","doc":"","ref":"Plausible.Google.HTTP.html#get_analytics_start_date/2"},{"type":"function","title":"Plausible.Google.HTTP.get_report/1","doc":"","ref":"Plausible.Google.HTTP.html#get_report/1"},{"type":"function","title":"Plausible.Google.HTTP.list_sites/1","doc":"","ref":"Plausible.Google.HTTP.html#list_sites/1"},{"type":"function","title":"Plausible.Google.HTTP.list_stats/5","doc":"","ref":"Plausible.Google.HTTP.html#list_stats/5"},{"type":"function","title":"Plausible.Google.HTTP.list_views_for_user/1","doc":"","ref":"Plausible.Google.HTTP.html#list_views_for_user/1"},{"type":"function","title":"Plausible.Google.HTTP.refresh_auth_token/1","doc":"","ref":"Plausible.Google.HTTP.html#refresh_auth_token/1"},{"type":"module","title":"Plausible.Google.ReportRequest","doc":"","ref":"Plausible.Google.ReportRequest.html"},{"type":"function","title":"Plausible.Google.ReportRequest.full_report/0","doc":"","ref":"Plausible.Google.ReportRequest.html#full_report/0"},{"type":"type","title":"Plausible.Google.ReportRequest.t/0","doc":"","ref":"Plausible.Google.ReportRequest.html#t:t/0"},{"type":"module","title":"Plausible.HTTPClient","doc":"HTTP Client built on top of Finch.\n\nBy default, request parameters are json-encoded.\n\nIf a raw binary value is supplied, no encoding is performed.\nIf x-www-form-urlencoded content-type is set in headers,\nURL encoding is invoked.","ref":"Plausible.HTTPClient.html"},{"type":"function","title":"Plausible.HTTPClient.get/3","doc":"Make a GET request","ref":"Plausible.HTTPClient.html#get/3"},{"type":"function","title":"Plausible.HTTPClient.impl/0","doc":"","ref":"Plausible.HTTPClient.html#impl/0"},{"type":"function","title":"Plausible.HTTPClient.post/4","doc":"Make a POST request","ref":"Plausible.HTTPClient.html#post/4"},{"type":"behaviour","title":"Plausible.HTTPClient.Interface","doc":"","ref":"Plausible.HTTPClient.Interface.html"},{"type":"callback","title":"Plausible.HTTPClient.Interface.get/1","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/1"},{"type":"callback","title":"Plausible.HTTPClient.Interface.get/2","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/2"},{"type":"callback","title":"Plausible.HTTPClient.Interface.get/3","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:get/3"},{"type":"callback","title":"Plausible.HTTPClient.Interface.post/3","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:post/3"},{"type":"callback","title":"Plausible.HTTPClient.Interface.post/4","doc":"","ref":"Plausible.HTTPClient.Interface.html#c:post/4"},{"type":"type","title":"Plausible.HTTPClient.Interface.finch_request_opts/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:finch_request_opts/0"},{"type":"type","title":"Plausible.HTTPClient.Interface.headers/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:headers/0"},{"type":"type","title":"Plausible.HTTPClient.Interface.params/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:params/0"},{"type":"type","title":"Plausible.HTTPClient.Interface.response/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:response/0"},{"type":"type","title":"Plausible.HTTPClient.Interface.url/0","doc":"","ref":"Plausible.HTTPClient.Interface.html#t:url/0"},{"type":"module","title":"Plausible.HTTPClient.Non200Error","doc":"","ref":"Plausible.HTTPClient.Non200Error.html"},{"type":"function","title":"Plausible.HTTPClient.Non200Error.new/1","doc":"","ref":"Plausible.HTTPClient.Non200Error.html#new/1"},{"type":"type","title":"Plausible.HTTPClient.Non200Error.t/0","doc":"","ref":"Plausible.HTTPClient.Non200Error.html#t:t/0"},{"type":"module","title":"Plausible.Helpers.JSON","doc":"Common helpers for JSON handling","ref":"Plausible.Helpers.JSON.html"},{"type":"function","title":"Plausible.Helpers.JSON.decode_or_fallback/1","doc":"","ref":"Plausible.Helpers.JSON.html#decode_or_fallback/1"},{"type":"module","title":"Plausible.ImportDeletionRepo","doc":"A dedicated repo for import related mutations","ref":"Plausible.ImportDeletionRepo.html"},{"type":"function","title":"Plausible.ImportDeletionRepo.aggregate/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#aggregate/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.aggregate/4","doc":"","ref":"Plausible.ImportDeletionRepo.html#aggregate/4"},{"type":"function","title":"Plausible.ImportDeletionRepo.all/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#all/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.checked_out?/0","doc":"","ref":"Plausible.ImportDeletionRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.ImportDeletionRepo.checkout/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#checkout/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.child_spec/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#child_spec/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.config/0","doc":"","ref":"Plausible.ImportDeletionRepo.html#config/0"},{"type":"function","title":"Plausible.ImportDeletionRepo.default_options/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#default_options/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.delete/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#delete/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.delete!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#delete!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.delete_all/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#delete_all/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.ImportDeletionRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.exists?/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#exists?/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.get/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#get/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.get!/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#get!/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.get_by/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#get_by/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.get_by!/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#get_by!/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.ImportDeletionRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert_all/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert_all/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert_or_update/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert_or_update!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.ImportDeletionRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.load/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#load/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.one/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#one/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.one!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#one!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.preload/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#preload/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.prepare_query/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.ImportDeletionRepo.html#query/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.ImportDeletionRepo.html#query!/3"},{"type":"function","title":"Plausible.ImportDeletionRepo.reload/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#reload/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.reload!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#reload!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.start_link/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#start_link/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.stop/1","doc":"","ref":"Plausible.ImportDeletionRepo.html#stop/1"},{"type":"function","title":"Plausible.ImportDeletionRepo.stream/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#stream/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.ImportDeletionRepo.html#to_sql/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.update/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#update/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.update!/2","doc":"","ref":"Plausible.ImportDeletionRepo.html#update!/2"},{"type":"function","title":"Plausible.ImportDeletionRepo.update_all/3","doc":"","ref":"Plausible.ImportDeletionRepo.html#update_all/3"},{"type":"module","title":"Plausible.Imported","doc":"","ref":"Plausible.Imported.html"},{"type":"function","title":"Plausible.Imported.forget/1","doc":"","ref":"Plausible.Imported.html#forget/1"},{"type":"function","title":"Plausible.Imported.from_google_analytics/3","doc":"","ref":"Plausible.Imported.html#from_google_analytics/3"},{"type":"function","title":"Plausible.Imported.tables/0","doc":"","ref":"Plausible.Imported.html#tables/0"},{"type":"module","title":"Plausible.IngestRepo","doc":"Write-centric Clickhouse access interface","ref":"Plausible.IngestRepo.html"},{"type":"function","title":"Plausible.IngestRepo.aggregate/3","doc":"","ref":"Plausible.IngestRepo.html#aggregate/3"},{"type":"function","title":"Plausible.IngestRepo.aggregate/4","doc":"","ref":"Plausible.IngestRepo.html#aggregate/4"},{"type":"function","title":"Plausible.IngestRepo.all/2","doc":"","ref":"Plausible.IngestRepo.html#all/2"},{"type":"function","title":"Plausible.IngestRepo.checked_out?/0","doc":"","ref":"Plausible.IngestRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.IngestRepo.checkout/2","doc":"","ref":"Plausible.IngestRepo.html#checkout/2"},{"type":"function","title":"Plausible.IngestRepo.child_spec/1","doc":"","ref":"Plausible.IngestRepo.html#child_spec/1"},{"type":"function","title":"Plausible.IngestRepo.config/0","doc":"","ref":"Plausible.IngestRepo.html#config/0"},{"type":"function","title":"Plausible.IngestRepo.default_options/1","doc":"","ref":"Plausible.IngestRepo.html#default_options/1"},{"type":"function","title":"Plausible.IngestRepo.delete/2","doc":"","ref":"Plausible.IngestRepo.html#delete/2"},{"type":"function","title":"Plausible.IngestRepo.delete!/2","doc":"","ref":"Plausible.IngestRepo.html#delete!/2"},{"type":"function","title":"Plausible.IngestRepo.delete_all/2","doc":"","ref":"Plausible.IngestRepo.html#delete_all/2"},{"type":"function","title":"Plausible.IngestRepo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.IngestRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.IngestRepo.exists?/2","doc":"","ref":"Plausible.IngestRepo.html#exists?/2"},{"type":"function","title":"Plausible.IngestRepo.get/3","doc":"","ref":"Plausible.IngestRepo.html#get/3"},{"type":"function","title":"Plausible.IngestRepo.get!/3","doc":"","ref":"Plausible.IngestRepo.html#get!/3"},{"type":"function","title":"Plausible.IngestRepo.get_by/3","doc":"","ref":"Plausible.IngestRepo.html#get_by/3"},{"type":"function","title":"Plausible.IngestRepo.get_by!/3","doc":"","ref":"Plausible.IngestRepo.html#get_by!/3"},{"type":"function","title":"Plausible.IngestRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.IngestRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.IngestRepo.insert/2","doc":"","ref":"Plausible.IngestRepo.html#insert/2"},{"type":"function","title":"Plausible.IngestRepo.insert!/2","doc":"","ref":"Plausible.IngestRepo.html#insert!/2"},{"type":"function","title":"Plausible.IngestRepo.insert_all/3","doc":"","ref":"Plausible.IngestRepo.html#insert_all/3"},{"type":"function","title":"Plausible.IngestRepo.insert_or_update/2","doc":"","ref":"Plausible.IngestRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.IngestRepo.insert_or_update!/2","doc":"","ref":"Plausible.IngestRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.IngestRepo.insert_stream/3","doc":"Similar to `insert_all/2` but with the following differences:\n\n - accepts rows as streams or lists\n - sends rows as a chunked request\n - doesn't autogenerate ids or does any other preprocessing\n\nExample:\n\n Repo.query!(\"create table ecto_ch_demo(a UInt64, b String) engine Null\")\n\n defmodule Demo do\n use Ecto.Schema\n\n @primary_key false\n schema \"ecto_ch_demo\" do\n field :a, Ch, type: \"UInt64\"\n field :b, :string\n end\n end\n\n rows = Stream.map(1..100_000, fn i -> %{a: i, b: to_string(i)} end)\n {100_000, nil} = Repo.insert_stream(Demo, rows)\n\n # schemaless\n {100_000, nil} = Repo.insert_stream(\"ecto_ch_demo\", rows, types: [a: Ch.Types.u64(), b: :string])","ref":"Plausible.IngestRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.IngestRepo.load/2","doc":"","ref":"Plausible.IngestRepo.html#load/2"},{"type":"function","title":"Plausible.IngestRepo.one/2","doc":"","ref":"Plausible.IngestRepo.html#one/2"},{"type":"function","title":"Plausible.IngestRepo.one!/2","doc":"","ref":"Plausible.IngestRepo.html#one!/2"},{"type":"function","title":"Plausible.IngestRepo.preload/3","doc":"","ref":"Plausible.IngestRepo.html#preload/3"},{"type":"function","title":"Plausible.IngestRepo.prepare_query/3","doc":"","ref":"Plausible.IngestRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.IngestRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.IngestRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.IngestRepo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.IngestRepo.html#query/3"},{"type":"function","title":"Plausible.IngestRepo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.IngestRepo.html#query!/3"},{"type":"function","title":"Plausible.IngestRepo.reload/2","doc":"","ref":"Plausible.IngestRepo.html#reload/2"},{"type":"function","title":"Plausible.IngestRepo.reload!/2","doc":"","ref":"Plausible.IngestRepo.html#reload!/2"},{"type":"function","title":"Plausible.IngestRepo.start_link/1","doc":"","ref":"Plausible.IngestRepo.html#start_link/1"},{"type":"function","title":"Plausible.IngestRepo.stop/1","doc":"","ref":"Plausible.IngestRepo.html#stop/1"},{"type":"function","title":"Plausible.IngestRepo.stream/2","doc":"","ref":"Plausible.IngestRepo.html#stream/2"},{"type":"function","title":"Plausible.IngestRepo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.IngestRepo.html#to_sql/2"},{"type":"function","title":"Plausible.IngestRepo.update/2","doc":"","ref":"Plausible.IngestRepo.html#update/2"},{"type":"function","title":"Plausible.IngestRepo.update!/2","doc":"","ref":"Plausible.IngestRepo.html#update!/2"},{"type":"function","title":"Plausible.IngestRepo.update_all/3","doc":"","ref":"Plausible.IngestRepo.html#update_all/3"},{"type":"module","title":"Plausible.Ingestion.Counters","doc":"This is instrumentation necessary for keeping track of per-domain\ninternal metrics. Due to metric labels cardinality (domain x metric_name),\nthese statistics are not suitable for prometheus/grafana exposure,\nhence an internal storage is used.\n\nThe module installs `Counters.TelemetryHandler` and periodically\nflushes the internal counter aggregates via `Counters.Buffer` interface.\n\nThe underlying database schema is running `SummingMergeTree` engine.\nTo take advantage of automatic roll-ups it provides, upon dispatching the\nbuffered records to Clickhouse this module transforms each `event_timebucket`\naggregate into a 1-minute resolution.\n\nClickhouse connection is set to insert counters asynchronously every time\na pool checkout is made. Those properties are reverted once the insert is done\n(or naturally, if the connection crashes).","ref":"Plausible.Ingestion.Counters.html"},{"type":"function","title":"Plausible.Ingestion.Counters.child_spec/1","doc":"","ref":"Plausible.Ingestion.Counters.html#child_spec/1"},{"type":"function","title":"Plausible.Ingestion.Counters.enabled?/0","doc":"","ref":"Plausible.Ingestion.Counters.html#enabled?/0"},{"type":"function","title":"Plausible.Ingestion.Counters.stop/1","doc":"","ref":"Plausible.Ingestion.Counters.html#stop/1"},{"type":"module","title":"Plausible.Ingestion.Counters.Buffer","doc":"A buffer aggregating counters for internal metrics, within 10 seconds time buckets.\n\nSee `Plausible.Ingestion.Counters` for integration.\n\nFlushing is by default possible only once the 10s bucket is complete\n(its window has moved). This is to avoid race conditions \nwhen clearing up the buffer on dequeue - because there is no atomic \"get and delete\",\nand items are buffered concurrently, there is a gap between get and delete\nin which items written may disappear otherwise.\n\n`aggregate_bucket_fn` and `flush_boundary_fn` control that semantics and\nare configurable only for test purposes.","ref":"Plausible.Ingestion.Counters.Buffer.html"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.aggregate/4","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#aggregate/4"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.bucket_10s/1","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#bucket_10s/1"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.flush/2","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#flush/2"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.new/2","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#new/2"},{"type":"function","title":"Plausible.Ingestion.Counters.Buffer.previous_10s/1","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#previous_10s/1"},{"type":"type","title":"Plausible.Ingestion.Counters.Buffer.bucket_fn_opt/0","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:bucket_fn_opt/0"},{"type":"type","title":"Plausible.Ingestion.Counters.Buffer.t/0","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:t/0"},{"type":"type","title":"Plausible.Ingestion.Counters.Buffer.unix_timestamp/0","doc":"","ref":"Plausible.Ingestion.Counters.Buffer.html#t:unix_timestamp/0"},{"type":"module","title":"Plausible.Ingestion.Counters.Record","doc":"Clickhouse schema for storing ingest counter metrics","ref":"Plausible.Ingestion.Counters.Record.html"},{"type":"type","title":"Plausible.Ingestion.Counters.Record.t/0","doc":"","ref":"Plausible.Ingestion.Counters.Record.html#t:t/0"},{"type":"module","title":"Plausible.Ingestion.Counters.TelemetryHandler","doc":"Subscribes to telemetry events emitted by `Plausible.Ingestion.Event`.\nEvery time a request derived event is either dispatched to clickhouse or dropped,\na telemetry event is emitted respectively. That event is captured here,\nits metadata is extracted and sent for internal stats aggregation via\n`Counters.Buffer` interface.","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html"},{"type":"function","title":"Plausible.Ingestion.Counters.TelemetryHandler.handle_event/4","doc":"","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html#handle_event/4"},{"type":"function","title":"Plausible.Ingestion.Counters.TelemetryHandler.install/1","doc":"","ref":"Plausible.Ingestion.Counters.TelemetryHandler.html#install/1"},{"type":"module","title":"Plausible.Ingestion.Event","doc":"This module exposes the `build_and_buffer/1` function capable of\nturning %Plausible.Ingestion.Request{} into a series of events that in turn\nare uniformly either buffered in batches (to Clickhouse) or dropped\n(e.g. due to spam blocklist) from the processing pipeline.","ref":"Plausible.Ingestion.Event.html"},{"type":"function","title":"Plausible.Ingestion.Event.build_and_buffer/1","doc":"","ref":"Plausible.Ingestion.Event.html#build_and_buffer/1"},{"type":"function","title":"Plausible.Ingestion.Event.emit_telemetry_buffered/1","doc":"","ref":"Plausible.Ingestion.Event.html#emit_telemetry_buffered/1"},{"type":"function","title":"Plausible.Ingestion.Event.emit_telemetry_dropped/2","doc":"","ref":"Plausible.Ingestion.Event.html#emit_telemetry_dropped/2"},{"type":"function","title":"Plausible.Ingestion.Event.telemetry_event_buffered/0","doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_event_buffered/0"},{"type":"function","title":"Plausible.Ingestion.Event.telemetry_event_dropped/0","doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_event_dropped/0"},{"type":"type","title":"Plausible.Ingestion.Event.drop_reason/0","doc":"","ref":"Plausible.Ingestion.Event.html#t:drop_reason/0"},{"type":"type","title":"Plausible.Ingestion.Event.t/0","doc":"","ref":"Plausible.Ingestion.Event.html#t:t/0"},{"type":"module","title":"Plausible.Ingestion.Event.Revenue","doc":"Revenue specific functions for the ingestion scope","ref":"Plausible.Ingestion.Event.Revenue.html"},{"type":"function","title":"Plausible.Ingestion.Event.Revenue.get_revenue_attrs/1","doc":"","ref":"Plausible.Ingestion.Event.Revenue.html#get_revenue_attrs/1"},{"type":"module","title":"Plausible.Ingestion.Request","doc":"The %Plausible.Ingestion.Request{} struct stores all needed fields\nto create an event downstream. Pre-eliminary validation is made\nto detect user errors early.","ref":"Plausible.Ingestion.Request.html"},{"type":"function","title":"Plausible.Ingestion.Request.build/2","doc":"Builds and initially validates %Plausible.Ingestion.Request{} struct from %Plug.Conn{}.","ref":"Plausible.Ingestion.Request.html#build/2"},{"type":"function","title":"Plausible.Ingestion.Request.sanitize_hostname/1","doc":"Removes the \"www\" part of a hostname.","ref":"Plausible.Ingestion.Request.html#sanitize_hostname/1"},{"type":"type","title":"Plausible.Ingestion.Request.t/0","doc":"","ref":"Plausible.Ingestion.Request.html#t:t/0"},{"type":"module","title":"Plausible.Ingestion.Request.Revenue","doc":"Revenue specific functions for the ingestion scope","ref":"Plausible.Ingestion.Request.Revenue.html"},{"type":"function","title":"Plausible.Ingestion.Request.Revenue.put_revenue_source/2","doc":"","ref":"Plausible.Ingestion.Request.Revenue.html#put_revenue_source/2"},{"type":"module","title":"Plausible.Mailer","doc":"","ref":"Plausible.Mailer.html"},{"type":"function","title":"Plausible.Mailer.deliver/1","doc":"","ref":"Plausible.Mailer.html#deliver/1"},{"type":"function","title":"Plausible.Mailer.deliver_later/2","doc":"","ref":"Plausible.Mailer.html#deliver_later/2"},{"type":"function","title":"Plausible.Mailer.deliver_later!/2","doc":"","ref":"Plausible.Mailer.html#deliver_later!/2"},{"type":"function","title":"Plausible.Mailer.deliver_now/2","doc":"","ref":"Plausible.Mailer.html#deliver_now/2"},{"type":"function","title":"Plausible.Mailer.deliver_now!/2","doc":"","ref":"Plausible.Mailer.html#deliver_now!/2"},{"type":"function","title":"Plausible.Mailer.send/1","doc":"","ref":"Plausible.Mailer.html#send/1"},{"type":"type","title":"Plausible.Mailer.result/0","doc":"","ref":"Plausible.Mailer.html#t:result/0"},{"type":"module","title":"Plausible.OpenTelemetry.Sampler","doc":"[Custom OpenTelemetry sampler](https://hexdocs.pm/opentelemetry/readme.html#samplers)\nimplementation that ignores particular traces to reduce noise. Ingestion\nHTTP requests and queries to Oban tables are ignored, for example.\n\nFor non-ignored traces, implements trace ID ratio-based sampling following the method\nfrom [built-in sampler](https://github.com/open-telemetry/opentelemetry-erlang/blob/main/apps/opentelemetry/src/otel_sampler_trace_id_ratio_based.erl).","ref":"Plausible.OpenTelemetry.Sampler.html"},{"type":"module","title":"Plausible.PaddleApi.Mock","doc":"","ref":"Plausible.PaddleApi.Mock.html"},{"type":"function","title":"Plausible.PaddleApi.Mock.fetch_prices/1","doc":"","ref":"Plausible.PaddleApi.Mock.html#fetch_prices/1"},{"type":"function","title":"Plausible.PaddleApi.Mock.get_invoices/1","doc":"","ref":"Plausible.PaddleApi.Mock.html#get_invoices/1"},{"type":"function","title":"Plausible.PaddleApi.Mock.get_subscription/1","doc":"","ref":"Plausible.PaddleApi.Mock.html#get_subscription/1"},{"type":"function","title":"Plausible.PaddleApi.Mock.update_subscription/2","doc":"","ref":"Plausible.PaddleApi.Mock.html#update_subscription/2"},{"type":"function","title":"Plausible.PaddleApi.Mock.update_subscription_preview/2","doc":"","ref":"Plausible.PaddleApi.Mock.html#update_subscription_preview/2"},{"type":"module","title":"Plausible.Pagination","doc":"Cursor-based pagination.","ref":"Plausible.Pagination.html"},{"type":"function","title":"Plausible.Pagination.paginate/4","doc":"","ref":"Plausible.Pagination.html#paginate/4"},{"type":"module","title":"Plausible.Plugins.API.CustomProps","doc":"Plugins API context module for Custom Props.\nAll high level Custom Props operations should be implemented here.","ref":"Plausible.Plugins.API.CustomProps.html"},{"type":"function","title":"Plausible.Plugins.API.CustomProps.disable/2","doc":"","ref":"Plausible.Plugins.API.CustomProps.html#disable/2"},{"type":"function","title":"Plausible.Plugins.API.CustomProps.enable/2","doc":"","ref":"Plausible.Plugins.API.CustomProps.html#enable/2"},{"type":"module","title":"Plausible.Plugins.API.Goals","doc":"Plugins API context module for Goals.\nAll high level Goal operations should be implemented here.","ref":"Plausible.Plugins.API.Goals.html"},{"type":"function","title":"Plausible.Plugins.API.Goals.create/2","doc":"","ref":"Plausible.Plugins.API.Goals.html#create/2"},{"type":"function","title":"Plausible.Plugins.API.Goals.delete/2","doc":"","ref":"Plausible.Plugins.API.Goals.html#delete/2"},{"type":"function","title":"Plausible.Plugins.API.Goals.get/2","doc":"","ref":"Plausible.Plugins.API.Goals.html#get/2"},{"type":"function","title":"Plausible.Plugins.API.Goals.get_goals/2","doc":"","ref":"Plausible.Plugins.API.Goals.html#get_goals/2"},{"type":"type","title":"Plausible.Plugins.API.Goals.create_request/0","doc":"","ref":"Plausible.Plugins.API.Goals.html#t:create_request/0"},{"type":"module","title":"Plausible.Plugins.API.SharedLinks","doc":"Plugins API context module for Shared Links.\nAll high level Shared Links operations should be implemented here.","ref":"Plausible.Plugins.API.SharedLinks.html"},{"type":"function","title":"Plausible.Plugins.API.SharedLinks.get/2","doc":"","ref":"Plausible.Plugins.API.SharedLinks.html#get/2"},{"type":"function","title":"Plausible.Plugins.API.SharedLinks.get_or_create/3","doc":"","ref":"Plausible.Plugins.API.SharedLinks.html#get_or_create/3"},{"type":"function","title":"Plausible.Plugins.API.SharedLinks.get_shared_links/2","doc":"","ref":"Plausible.Plugins.API.SharedLinks.html#get_shared_links/2"},{"type":"module","title":"Plausible.Plugins.API.Token","doc":"Ecto schema for Plugins API Tokens.\nTokens are stored hashed and require a description.\n\nTokens are considered secret, although the Plugins API\nby nature will expose very little, if any, destructive/insecure operations.\n\nThe raw token version is meant to be presented to the user upon creation.\nIt is prefixed with a plain text identifier allowing source scanning\nfor leaked secrets.","ref":"Plausible.Plugins.API.Token.html"},{"type":"function","title":"Plausible.Plugins.API.Token.generate/1","doc":"","ref":"Plausible.Plugins.API.Token.html#generate/1"},{"type":"function","title":"Plausible.Plugins.API.Token.hash/1","doc":"","ref":"Plausible.Plugins.API.Token.html#hash/1"},{"type":"function","title":"Plausible.Plugins.API.Token.insert_changeset/3","doc":"","ref":"Plausible.Plugins.API.Token.html#insert_changeset/3"},{"type":"function","title":"Plausible.Plugins.API.Token.last_used_humanize/1","doc":"","ref":"Plausible.Plugins.API.Token.html#last_used_humanize/1"},{"type":"function","title":"Plausible.Plugins.API.Token.prefix/0","doc":"Raw tokens are prefixed so that tools like\nhttps://docs.github.com/en/code-security/secret-scanning/about-secret-scanning\ncan scan repositories for accidental secret commits.","ref":"Plausible.Plugins.API.Token.html#prefix/0"},{"type":"type","title":"Plausible.Plugins.API.Token.t/0","doc":"","ref":"Plausible.Plugins.API.Token.html#t:t/0"},{"type":"module","title":"Plausible.Plugins.API.Tokens","doc":"Context module for Plugins API Tokens.\nExposes high-level operation for token-based authentication flows.","ref":"Plausible.Plugins.API.Tokens.html"},{"type":"function","title":"Plausible.Plugins.API.Tokens.any?/1","doc":"","ref":"Plausible.Plugins.API.Tokens.html#any?/1"},{"type":"function","title":"Plausible.Plugins.API.Tokens.create/3","doc":"","ref":"Plausible.Plugins.API.Tokens.html#create/3"},{"type":"function","title":"Plausible.Plugins.API.Tokens.delete/2","doc":"","ref":"Plausible.Plugins.API.Tokens.html#delete/2"},{"type":"function","title":"Plausible.Plugins.API.Tokens.find/1","doc":"","ref":"Plausible.Plugins.API.Tokens.html#find/1"},{"type":"function","title":"Plausible.Plugins.API.Tokens.list/1","doc":"","ref":"Plausible.Plugins.API.Tokens.html#list/1"},{"type":"function","title":"Plausible.Plugins.API.Tokens.update_last_seen/2","doc":"","ref":"Plausible.Plugins.API.Tokens.html#update_last_seen/2"},{"type":"module","title":"Plausible.PromEx","doc":"","ref":"Plausible.PromEx.html"},{"type":"function","title":"Plausible.PromEx.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.PromEx.html#child_spec/1"},{"type":"module","title":"Plausible.PromEx.Plugins.PlausibleMetrics","doc":"Custom PromEx plugin for instrumenting code within Plausible app.","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html"},{"type":"function","title":"Plausible.PromEx.Plugins.PlausibleMetrics.execute_cache_metrics/0","doc":"Add telemetry events for Cachex user agents and sessions","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#execute_cache_metrics/0"},{"type":"function","title":"Plausible.PromEx.Plugins.PlausibleMetrics.execute_write_buffer_metrics/0","doc":"Add telemetry events for Session and Event write buffers","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#execute_write_buffer_metrics/0"},{"type":"module","title":"Plausible.Props","doc":"Context module for handling custom event props.","ref":"Plausible.Props.html"},{"type":"function","title":"Plausible.Props.allow/2","doc":"Allows a prop key or a list of props keys to be included in ClickHouse\nqueries. Allowing prop keys does not affect ingestion, as we don't want any\ndata to be dropped or lost.","ref":"Plausible.Props.html#allow/2"},{"type":"function","title":"Plausible.Props.allow_changeset/2","doc":"","ref":"Plausible.Props.html#allow_changeset/2"},{"type":"function","title":"Plausible.Props.allow_existing_props/1","doc":"Allows the 300 most frequent props keys for a specific site over\nthe past 6 months.","ref":"Plausible.Props.html#allow_existing_props/1"},{"type":"function","title":"Plausible.Props.configured?/1","doc":"Returns whether the site has configured custom props or not.","ref":"Plausible.Props.html#configured?/1"},{"type":"function","title":"Plausible.Props.disallow/2","doc":"Removes previously allowed prop key(s) from the allow list. This means this\nprop key won't be included in ClickHouse queries. This doesn't drop any\nClickHouse data, nor affects ingestion.","ref":"Plausible.Props.html#disallow/2"},{"type":"function","title":"Plausible.Props.ensure_prop_key_accessible/2","doc":"","ref":"Plausible.Props.html#ensure_prop_key_accessible/2"},{"type":"function","title":"Plausible.Props.internal_keys/0","doc":"Lists prop keys used internally.\n\nThese props should be allowed by default, and should not be displayed in the\nprops settings page. For example, `url` is a special prop key used for file\ndownloads and outbound links. It doesn't make sense to remove this prop key\nfrom the allow list, or to suggest users to add this prop key.","ref":"Plausible.Props.html#internal_keys/0"},{"type":"function","title":"Plausible.Props.max_prop_key_length/0","doc":"","ref":"Plausible.Props.html#max_prop_key_length/0"},{"type":"function","title":"Plausible.Props.max_prop_value_length/0","doc":"","ref":"Plausible.Props.html#max_prop_value_length/0"},{"type":"function","title":"Plausible.Props.max_props/0","doc":"","ref":"Plausible.Props.html#max_props/0"},{"type":"function","title":"Plausible.Props.suggest_keys_to_allow/2","doc":"Queries the events table to fetch the 300 most frequent prop keys\nfor a specific site over the past 6 months, excluding keys that are already\nallowed.","ref":"Plausible.Props.html#suggest_keys_to_allow/2"},{"type":"type","title":"Plausible.Props.prop/0","doc":"","ref":"Plausible.Props.html#t:prop/0"},{"type":"module","title":"Plausible.Purge","doc":"Deletes data from a site.\n\nStats are stored on Clickhouse, and unlike other databases data deletion is\ndone asynchronously.\n\nAll import tables have MergeTree's deduplication mechanism _disabled_ by setting\n`replicated_deduplication_window` from default 100 to 0. When enabled, every insert\ninto a given table is compared against hashes of 100 previous inserts (as complete\nparts, not concrete rows) and ignored when match is found. The prupose of that\nmechanism is making inserts of exact same batches idempotent when retrying them\nshortly after - for instance due to timeout, when the client can't easily tell if\nprevious insert succeeded or not. Deduplication, however, only considers inserts,\nnot mutations. Deletions do not affect stored hashes, so further inserts of parts\nthat were deleted will still be treated as duplicates. That's why this feature\nis disabled for import tables.\n\nAlthough deletions are asynchronous, the parts to delete are \"remembered\", so there's\nno risk of overlapping deletion causing problems with import following right after it.\n\nIMPORTANT: Deletion requires revision if/when import tables get moved to sharded CH\ncluster setup. Mutation queries, which have to be run with `ON CLUSTER` in such setup,\ndispatch independent queries across shards and those queries can start at different\ntimes. This in turn means risk of deletions corrupting data of follow-up inserts\nin some edge cases. Ideally, imported entries should be unique for a given import\n- an extra `import_id` column can be introduced, holding identifier. Last processed\nimport identifier should be stored with other site data and should be used for scoping\nimported stats queries. No longer used imports can then be safely removed fully\nasynchronously.\n\n- [Clickhouse `ALTER TABLE ... DELETE` Statement](https://clickhouse.com/docs/en/sql-reference/statements/alter/delete)\n- [Synchronicity of `ALTER` Queries](https://clickhouse.com/docs/en/sql-reference/statements/alter/#synchronicity-of-alter-queries)","ref":"Plausible.Purge.html"},{"type":"function","title":"Plausible.Purge.delete_imported_stats!/1","doc":"Deletes imported stats from Google Analytics, and clears the\n`stats_start_date` field.","ref":"Plausible.Purge.html#delete_imported_stats!/1"},{"type":"function","title":"Plausible.Purge.delete_native_stats!/1","doc":"Move stats pointers so that no historical stats are available.","ref":"Plausible.Purge.html#delete_native_stats!/1"},{"type":"function","title":"Plausible.Purge.reset!/1","doc":"","ref":"Plausible.Purge.html#reset!/1"},{"type":"module","title":"Plausible.RateLimit","doc":"Thin wrapper around `:ets.update_counter/4` and a\nclean-up process to act as a rate limiter.","ref":"Plausible.RateLimit.html"},{"type":"function","title":"Plausible.RateLimit.check_rate/5","doc":"Checks the rate-limit for a key.","ref":"Plausible.RateLimit.html#check_rate/5"},{"type":"function","title":"Plausible.RateLimit.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.RateLimit.html#child_spec/1"},{"type":"function","title":"Plausible.RateLimit.start_link/1","doc":"Starts the process that creates and cleans the ETS table.\n\nAccepts the following options:\n - `GenServer.options()`\n - `:table` for the ETS table name, defaults to `Elixir.Plausible.RateLimit`\n - `:clean_period` for how often to perform garbage collection","ref":"Plausible.RateLimit.html#start_link/1"},{"type":"module","title":"Plausible.Release","doc":"","ref":"Plausible.Release.html"},{"type":"function","title":"Plausible.Release.configure_ref_inspector/0","doc":"","ref":"Plausible.Release.html#configure_ref_inspector/0"},{"type":"function","title":"Plausible.Release.configure_ua_inspector/0","doc":"","ref":"Plausible.Release.html#configure_ua_inspector/0"},{"type":"function","title":"Plausible.Release.createdb/0","doc":"","ref":"Plausible.Release.html#createdb/0"},{"type":"function","title":"Plausible.Release.dump_plans/0","doc":"","ref":"Plausible.Release.html#dump_plans/0"},{"type":"function","title":"Plausible.Release.migrate/0","doc":"","ref":"Plausible.Release.html#migrate/0"},{"type":"function","title":"Plausible.Release.pending_migrations/0","doc":"","ref":"Plausible.Release.html#pending_migrations/0"},{"type":"function","title":"Plausible.Release.rollback/0","doc":"","ref":"Plausible.Release.html#rollback/0"},{"type":"function","title":"Plausible.Release.seed/0","doc":"","ref":"Plausible.Release.html#seed/0"},{"type":"function","title":"Plausible.Release.should_be_first_launch?/0","doc":"","ref":"Plausible.Release.html#should_be_first_launch?/0"},{"type":"module","title":"Plausible.Repo","doc":"","ref":"Plausible.Repo.html"},{"type":"function","title":"Plausible.Repo.aggregate/3","doc":"","ref":"Plausible.Repo.html#aggregate/3"},{"type":"function","title":"Plausible.Repo.aggregate/4","doc":"","ref":"Plausible.Repo.html#aggregate/4"},{"type":"function","title":"Plausible.Repo.all/2","doc":"","ref":"Plausible.Repo.html#all/2"},{"type":"function","title":"Plausible.Repo.checked_out?/0","doc":"","ref":"Plausible.Repo.html#checked_out?/0"},{"type":"function","title":"Plausible.Repo.checkout/2","doc":"","ref":"Plausible.Repo.html#checkout/2"},{"type":"function","title":"Plausible.Repo.child_spec/1","doc":"","ref":"Plausible.Repo.html#child_spec/1"},{"type":"function","title":"Plausible.Repo.config/0","doc":"","ref":"Plausible.Repo.html#config/0"},{"type":"function","title":"Plausible.Repo.default_options/1","doc":"","ref":"Plausible.Repo.html#default_options/1"},{"type":"function","title":"Plausible.Repo.delete/2","doc":"","ref":"Plausible.Repo.html#delete/2"},{"type":"function","title":"Plausible.Repo.delete!/2","doc":"","ref":"Plausible.Repo.html#delete!/2"},{"type":"function","title":"Plausible.Repo.delete_all/2","doc":"","ref":"Plausible.Repo.html#delete_all/2"},{"type":"function","title":"Plausible.Repo.disconnect_all/2","doc":"A convenience function for SQL-based repositories that forces all connections in the\npool to disconnect within the given interval.\n\nSee `Ecto.Adapters.SQL.disconnect_all/3` for more information.","ref":"Plausible.Repo.html#disconnect_all/2"},{"type":"function","title":"Plausible.Repo.exists?/2","doc":"","ref":"Plausible.Repo.html#exists?/2"},{"type":"function","title":"Plausible.Repo.explain/3","doc":"A convenience function for SQL-based repositories that executes an EXPLAIN statement or similar\ndepending on the adapter to obtain statistics for the given query.\n\nSee `Ecto.Adapters.SQL.explain/4` for more information.","ref":"Plausible.Repo.html#explain/3"},{"type":"function","title":"Plausible.Repo.get/3","doc":"","ref":"Plausible.Repo.html#get/3"},{"type":"function","title":"Plausible.Repo.get!/3","doc":"","ref":"Plausible.Repo.html#get!/3"},{"type":"function","title":"Plausible.Repo.get_by/3","doc":"","ref":"Plausible.Repo.html#get_by/3"},{"type":"function","title":"Plausible.Repo.get_by!/3","doc":"","ref":"Plausible.Repo.html#get_by!/3"},{"type":"function","title":"Plausible.Repo.get_dynamic_repo/0","doc":"","ref":"Plausible.Repo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.Repo.in_transaction?/0","doc":"","ref":"Plausible.Repo.html#in_transaction?/0"},{"type":"function","title":"Plausible.Repo.insert/2","doc":"","ref":"Plausible.Repo.html#insert/2"},{"type":"function","title":"Plausible.Repo.insert!/2","doc":"","ref":"Plausible.Repo.html#insert!/2"},{"type":"function","title":"Plausible.Repo.insert_all/3","doc":"","ref":"Plausible.Repo.html#insert_all/3"},{"type":"function","title":"Plausible.Repo.insert_or_update/2","doc":"","ref":"Plausible.Repo.html#insert_or_update/2"},{"type":"function","title":"Plausible.Repo.insert_or_update!/2","doc":"","ref":"Plausible.Repo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.Repo.load/2","doc":"","ref":"Plausible.Repo.html#load/2"},{"type":"function","title":"Plausible.Repo.one/2","doc":"","ref":"Plausible.Repo.html#one/2"},{"type":"function","title":"Plausible.Repo.one!/2","doc":"","ref":"Plausible.Repo.html#one!/2"},{"type":"function","title":"Plausible.Repo.paginate/2","doc":"","ref":"Plausible.Repo.html#paginate/2"},{"type":"function","title":"Plausible.Repo.preload/3","doc":"","ref":"Plausible.Repo.html#preload/3"},{"type":"function","title":"Plausible.Repo.prepare_query/3","doc":"","ref":"Plausible.Repo.html#prepare_query/3"},{"type":"function","title":"Plausible.Repo.put_dynamic_repo/1","doc":"","ref":"Plausible.Repo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.Repo.query/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query/4` for more information.","ref":"Plausible.Repo.html#query/3"},{"type":"function","title":"Plausible.Repo.query!/3","doc":"A convenience function for SQL-based repositories that executes the given query.\n\nSee `Ecto.Adapters.SQL.query!/4` for more information.","ref":"Plausible.Repo.html#query!/3"},{"type":"function","title":"Plausible.Repo.query_many/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query.\n\nSee `Ecto.Adapters.SQL.query_many/4` for more information.","ref":"Plausible.Repo.html#query_many/3"},{"type":"function","title":"Plausible.Repo.query_many!/3","doc":"A convenience function for SQL-based repositories that executes the given multi-result query.\n\nSee `Ecto.Adapters.SQL.query_many!/4` for more information.","ref":"Plausible.Repo.html#query_many!/3"},{"type":"function","title":"Plausible.Repo.reload/2","doc":"","ref":"Plausible.Repo.html#reload/2"},{"type":"function","title":"Plausible.Repo.reload!/2","doc":"","ref":"Plausible.Repo.html#reload!/2"},{"type":"function","title":"Plausible.Repo.rollback/1","doc":"","ref":"Plausible.Repo.html#rollback/1"},{"type":"function","title":"Plausible.Repo.scrivener_defaults/0","doc":"","ref":"Plausible.Repo.html#scrivener_defaults/0"},{"type":"function","title":"Plausible.Repo.start_link/1","doc":"","ref":"Plausible.Repo.html#start_link/1"},{"type":"function","title":"Plausible.Repo.stop/1","doc":"","ref":"Plausible.Repo.html#stop/1"},{"type":"function","title":"Plausible.Repo.stream/2","doc":"","ref":"Plausible.Repo.html#stream/2"},{"type":"function","title":"Plausible.Repo.to_sql/2","doc":"A convenience function for SQL-based repositories that translates the given query to SQL.\n\nSee `Ecto.Adapters.SQL.to_sql/3` for more information.","ref":"Plausible.Repo.html#to_sql/2"},{"type":"function","title":"Plausible.Repo.transaction/2","doc":"","ref":"Plausible.Repo.html#transaction/2"},{"type":"function","title":"Plausible.Repo.update/2","doc":"","ref":"Plausible.Repo.html#update/2"},{"type":"function","title":"Plausible.Repo.update!/2","doc":"","ref":"Plausible.Repo.html#update!/2"},{"type":"function","title":"Plausible.Repo.update_all/3","doc":"","ref":"Plausible.Repo.html#update_all/3"},{"type":"module","title":"Plausible.Sentry.Client","doc":"","ref":"Plausible.Sentry.Client.html"},{"type":"function","title":"Plausible.Sentry.Client.child_spec/0","doc":"The Sentry.HTTPClient behaviour requires a child spec to be supplied.\nIn this case we don't want Sentry to manage our Finch instances, hence it's fed\nwith a dummy module for the sake of the contract.\n\nXXX: Submit a Sentry PR making the child spec callback optional.","ref":"Plausible.Sentry.Client.html#child_spec/0"},{"type":"function","title":"Plausible.Sentry.Client.post/3","doc":"","ref":"Plausible.Sentry.Client.html#post/3"},{"type":"module","title":"Plausible.SentryFilter","doc":"Sentry callbacks for filtering and grouping events","ref":"Plausible.SentryFilter.html"},{"type":"function","title":"Plausible.SentryFilter.before_send/1","doc":"","ref":"Plausible.SentryFilter.html#before_send/1"},{"type":"function","title":"Plausible.SentryFilter.exclude_exception?/2","doc":"","ref":"Plausible.SentryFilter.html#exclude_exception?/2"},{"type":"module","title":"Plausible.Session.CacheStore","doc":"","ref":"Plausible.Session.CacheStore.html"},{"type":"function","title":"Plausible.Session.CacheStore.on_event/3","doc":"","ref":"Plausible.Session.CacheStore.html#on_event/3"},{"type":"module","title":"Plausible.Session.Salts","doc":"","ref":"Plausible.Session.Salts.html"},{"type":"function","title":"Plausible.Session.Salts.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Session.Salts.html#child_spec/1"},{"type":"function","title":"Plausible.Session.Salts.fetch/0","doc":"","ref":"Plausible.Session.Salts.html#fetch/0"},{"type":"function","title":"Plausible.Session.Salts.rotate/0","doc":"","ref":"Plausible.Session.Salts.html#rotate/0"},{"type":"function","title":"Plausible.Session.Salts.start_link/1","doc":"","ref":"Plausible.Session.Salts.html#start_link/1"},{"type":"module","title":"Plausible.Site","doc":"Site schema","ref":"Plausible.Site.html"},{"type":"function","title":"Plausible.Site.changeset/2","doc":"","ref":"Plausible.Site.html#changeset/2"},{"type":"function","title":"Plausible.Site.crm_changeset/2","doc":"","ref":"Plausible.Site.html#crm_changeset/2"},{"type":"function","title":"Plausible.Site.import_failure/1","doc":"","ref":"Plausible.Site.html#import_failure/1"},{"type":"function","title":"Plausible.Site.import_success/1","doc":"","ref":"Plausible.Site.html#import_success/1"},{"type":"function","title":"Plausible.Site.local_start_date/1","doc":"Returns the date of the first recorded stat in the timezone configured by the user.\nThis function does 2 transformations:\n UTC %NaiveDateTime{} -> Local %DateTime{} -> Local %Date","ref":"Plausible.Site.html#local_start_date/1"},{"type":"function","title":"Examples - Plausible.Site.local_start_date/1","doc":"iex> Plausible.Site.local_start_date(%Plausible.Site{stats_start_date: nil})\n nil\n\n iex> utc_start = ~N[2022-09-28 00:00:00]\n iex> tz = \"Europe/Helsinki\"\n iex> site = %Plausible.Site{stats_start_date: utc_start, timezone: tz}\n iex> Plausible.Site.local_start_date(site)\n ~D[2022-09-28]\n\n iex> utc_start = ~N[2022-09-28 00:00:00]\n iex> tz = \"America/Los_Angeles\"\n iex> site = %Plausible.Site{stats_start_date: utc_start, timezone: tz}\n iex> Plausible.Site.local_start_date(site)\n ~D[2022-09-27]","ref":"Plausible.Site.html#local_start_date/1-examples"},{"type":"function","title":"Plausible.Site.make_private/1","doc":"","ref":"Plausible.Site.html#make_private/1"},{"type":"function","title":"Plausible.Site.make_public/1","doc":"","ref":"Plausible.Site.html#make_public/1"},{"type":"function","title":"Plausible.Site.new/1","doc":"","ref":"Plausible.Site.html#new/1"},{"type":"function","title":"Plausible.Site.remove_imported_data/1","doc":"","ref":"Plausible.Site.html#remove_imported_data/1"},{"type":"function","title":"Plausible.Site.set_imported_source/2","doc":"","ref":"Plausible.Site.html#set_imported_source/2"},{"type":"function","title":"Plausible.Site.set_native_stats_start_at/2","doc":"","ref":"Plausible.Site.html#set_native_stats_start_at/2"},{"type":"function","title":"Plausible.Site.set_stats_start_date/2","doc":"","ref":"Plausible.Site.html#set_stats_start_date/2"},{"type":"function","title":"Plausible.Site.start_import/5","doc":"","ref":"Plausible.Site.html#start_import/5"},{"type":"function","title":"Plausible.Site.tz_offset/2","doc":"","ref":"Plausible.Site.html#tz_offset/2"},{"type":"function","title":"Plausible.Site.update_changeset/3","doc":"","ref":"Plausible.Site.html#update_changeset/3"},{"type":"type","title":"Plausible.Site.t/0","doc":"","ref":"Plausible.Site.html#t:t/0"},{"type":"module","title":"Plausible.Site.Cache","doc":"A \"sites by domain\" caching interface.\n\nServes as a thin wrapper around Cachex, but the underlying\nimplementation can be transparently swapped.\n\nEven though the Cachex process is started, cache access is disabled\nduring tests via the `:sites_by_domain_cache_enabled` application env key.\nThis can be overridden on case by case basis, using the child specs options.\n\nNOTE: the cache allows lookups by both `domain` and `domain_changed_from`\nfields - this is to allow traffic from sites whose domains changed within a certain\ngrace period (see: `Plausible.Site.Transfer`).\n\nWhen Cache is disabled via application env, the `get/1` function\nfalls back to pure database lookups. This should help with introducing\ncached lookups in existing code, so that no existing tests should break.\n\nTo differentiate cached Site structs from those retrieved directly from the\ndatabase, a virtual schema field `from_cache?: true` is set.\nThis indicates the `Plausible.Site` struct is incomplete in comparison to its\ndatabase counterpart -- to spare bandwidth and query execution time,\nonly selected database columns are retrieved and cached.\n\nThere are two modes of refreshing the cache: `:all` and `:updated_recently`.\n\n * `:all` means querying the database for all Site entries and should be done\n periodically (via `Cache.Warmer`). All stale Cache entries are cleared\n upon persisting the new batch.\n\n * `:updated_recently` attempts to re-query sites updated within the last\n 15 minutes only, to account for most recent changes. This refresh\n is lighter on the database and is meant to be executed more frequently\n (via `Cache.Warmer.RecentlyUpdated`).\n\nRefreshing the cache emits telemetry event defined as per `telemetry_event_refresh/2`.\n\nThe `@cached_schema_fields` attribute defines the list of DB columns\nqueried on each cache refresh.\n\nAlso see tests for more comprehensive examples.","ref":"Plausible.Site.Cache.html"},{"type":"function","title":"Plausible.Site.Cache.child_spec/1","doc":"","ref":"Plausible.Site.Cache.html#child_spec/1"},{"type":"function","title":"Plausible.Site.Cache.enabled?/0","doc":"","ref":"Plausible.Site.Cache.html#enabled?/0"},{"type":"function","title":"Plausible.Site.Cache.get/2","doc":"","ref":"Plausible.Site.Cache.html#get/2"},{"type":"function","title":"Plausible.Site.Cache.get_site_id/2","doc":"","ref":"Plausible.Site.Cache.html#get_site_id/2"},{"type":"function","title":"Plausible.Site.Cache.hit_rate/1","doc":"","ref":"Plausible.Site.Cache.html#hit_rate/1"},{"type":"function","title":"Plausible.Site.Cache.merge/2","doc":"","ref":"Plausible.Site.Cache.html#merge/2"},{"type":"function","title":"Plausible.Site.Cache.name/0","doc":"","ref":"Plausible.Site.Cache.html#name/0"},{"type":"function","title":"Plausible.Site.Cache.ready?/1","doc":"Ensures the cache has non-zero size unless no sites exist.\nUseful for orchestrating app startup to prevent the service\ngoing up asynchronously with an empty cache.","ref":"Plausible.Site.Cache.html#ready?/1"},{"type":"function","title":"Plausible.Site.Cache.refresh_all/1","doc":"","ref":"Plausible.Site.Cache.html#refresh_all/1"},{"type":"function","title":"Plausible.Site.Cache.refresh_updated_recently/1","doc":"","ref":"Plausible.Site.Cache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Site.Cache.size/1","doc":"","ref":"Plausible.Site.Cache.html#size/1"},{"type":"function","title":"Plausible.Site.Cache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Site.Cache.html#telemetry_event_refresh/2"},{"type":"function","title":"Plausible.Site.Cache.touch_site!/2","doc":"","ref":"Plausible.Site.Cache.html#touch_site!/2"},{"type":"type","title":"Plausible.Site.Cache.t/0","doc":"","ref":"Plausible.Site.Cache.html#t:t/0"},{"type":"module","title":"Plausible.Site.Cache.Warmer","doc":"A periodic cache warmer.\nQueries all Sites from Postgres, every `interval` and pre-populates the cache.\nAfter each run the process is hibernated, triggering garbage collection.\n\nCurrently Cachex is used, but the underlying implementation can be transparently swapped.\n\nChild specification options available:\n\n * `interval` - the number of milliseconds for each warm-up cycle, defaults\n to `:sites_by_domain_cache_refresh_interval` application env value\n with random jitter added, for which the maximum is stored under\n `:sites_by_domain_cache_refresh_interval_max_jitter` key.\n * `cache_name` - defaults to Cache.name() but can be overriden for testing\n * `force_start?` - enforcess process startup for testing, even if it's barred\n by `Cache.enabled?`. This is useful for avoiding issues with DB ownership\n and async tests.\n * `warmer_fn` - used for testing, a custom function to retrieve the items meant\n to be cached during the warm-up cycle.\n\nSee tests for more comprehensive examples.","ref":"Plausible.Site.Cache.Warmer.html"},{"type":"function","title":"Plausible.Site.Cache.Warmer.child_spec/1","doc":"","ref":"Plausible.Site.Cache.Warmer.html#child_spec/1"},{"type":"function","title":"Plausible.Site.Cache.Warmer.interval/0","doc":"","ref":"Plausible.Site.Cache.Warmer.html#interval/0"},{"type":"module","title":"Plausible.Site.Cache.Warmer.All","doc":"A Cache.Warmer adapter that refreshes the Sites Cache fully.\nThis module exists only to make it explicit what the warmer\nrefreshes, to be used in the supervisor tree.","ref":"Plausible.Site.Cache.Warmer.All.html"},{"type":"function","title":"Plausible.Site.Cache.Warmer.All.child_spec/1","doc":"","ref":"Plausible.Site.Cache.Warmer.All.html#child_spec/1"},{"type":"module","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated","doc":"A Cache.Warmer adapter that only refreshes the Cache\nwith recently updated sites every 30 seconds.","ref":"Plausible.Site.Cache.Warmer.RecentlyUpdated.html"},{"type":"function","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated.child_spec/1","doc":"","ref":"Plausible.Site.Cache.Warmer.RecentlyUpdated.html#child_spec/1"},{"type":"module","title":"Plausible.Site.Domain","doc":"Basic interface for domain changes.\n\nOnce `Plausible.DataMigration.NumericIDs` schema migration is ready, \ndomain change operation will be enabled, accessible to the users.\n\nWe will set a transition period of 72 hours\nduring which, both old and new domains, will be accepted as traffic\nidentifiers to the same site. \n\nA periodic worker will call the `expire/0` function to end it where applicable.\nSee: `Plausible.Workers.ExpireDomainChangeTransitions`.\n\nThe underlying changeset for domain change (see: `Plausible.Site`) relies\non database trigger installed via `Plausible.Repo.Migrations.AllowDomainChange`\nPostgres migration. The trigger checks if either `domain` or `domain_changed_from`\nexist to ensure unicity.","ref":"Plausible.Site.Domain.html"},{"type":"function","title":"Plausible.Site.Domain.change/3","doc":"","ref":"Plausible.Site.Domain.html#change/3"},{"type":"function","title":"Plausible.Site.Domain.expire_change_transitions/1","doc":"","ref":"Plausible.Site.Domain.html#expire_change_transitions/1"},{"type":"module","title":"Plausible.Site.GateKeeper","doc":"Thin wrapper around `Plausible.RateLimit` for gate keeping domain-specific events\nduring the ingestion phase. When the site is allowed, gate keeping\ncheck returns `:allow`, otherwise a `:deny` tagged tuple is returned\nwith one of the following policy markers:\n * `:not_found` (indicates site not found in cache)\n * `:block` (indicates disabled sites)\n * `:throttle` (indicates rate limiting)\n\nRate Limiting buckets are configured per site (externally via the CRM).\nSee: `Plausible.Site`\n\nTo look up each site's configuration, the RateLimiter fetches\na Site by domain using `Plausible.Cache` interface.\n\nThe module defines two policies outside the regular bucket inspection:\n * when the the site is not found in cache: not_found\n * when the underlying rate limiting mechanism returns\n an internal error: :allow","ref":"Plausible.Site.GateKeeper.html"},{"type":"function","title":"Plausible.Site.GateKeeper.check/2","doc":"","ref":"Plausible.Site.GateKeeper.html#check/2"},{"type":"function","title":"Plausible.Site.GateKeeper.key/1","doc":"","ref":"Plausible.Site.GateKeeper.html#key/1"},{"type":"type","title":"Plausible.Site.GateKeeper.policy/0","doc":"","ref":"Plausible.Site.GateKeeper.html#t:policy/0"},{"type":"type","title":"Plausible.Site.GateKeeper.t/0","doc":"","ref":"Plausible.Site.GateKeeper.html#t:t/0"},{"type":"module","title":"Plausible.Site.GoogleAuth","doc":"","ref":"Plausible.Site.GoogleAuth.html"},{"type":"function","title":"Plausible.Site.GoogleAuth.changeset/2","doc":"","ref":"Plausible.Site.GoogleAuth.html#changeset/2"},{"type":"function","title":"Plausible.Site.GoogleAuth.set_property/2","doc":"","ref":"Plausible.Site.GoogleAuth.html#set_property/2"},{"type":"module","title":"Plausible.Site.ImportedData","doc":"Embedded schema for Google Analytics imports","ref":"Plausible.Site.ImportedData.html"},{"type":"module","title":"Plausible.Site.Membership","doc":"","ref":"Plausible.Site.Membership.html"},{"type":"function","title":"Plausible.Site.Membership.new/2","doc":"","ref":"Plausible.Site.Membership.html#new/2"},{"type":"function","title":"Plausible.Site.Membership.set_role/2","doc":"","ref":"Plausible.Site.Membership.html#set_role/2"},{"type":"type","title":"Plausible.Site.Membership.role/0","doc":"","ref":"Plausible.Site.Membership.html#t:role/0"},{"type":"type","title":"Plausible.Site.Membership.t/0","doc":"","ref":"Plausible.Site.Membership.html#t:t/0"},{"type":"module","title":"Plausible.Site.Memberships","doc":"API for site memberships and invitations","ref":"Plausible.Site.Memberships.html"},{"type":"function","title":"Plausible.Site.Memberships.accept_invitation/2","doc":"","ref":"Plausible.Site.Memberships.html#accept_invitation/2"},{"type":"function","title":"Plausible.Site.Memberships.any?/1","doc":"","ref":"Plausible.Site.Memberships.html#any?/1"},{"type":"function","title":"Plausible.Site.Memberships.any_or_pending?/1","doc":"","ref":"Plausible.Site.Memberships.html#any_or_pending?/1"},{"type":"function","title":"Plausible.Site.Memberships.bulk_create_invitation/5","doc":"","ref":"Plausible.Site.Memberships.html#bulk_create_invitation/5"},{"type":"function","title":"Plausible.Site.Memberships.bulk_transfer_ownership_direct/2","doc":"","ref":"Plausible.Site.Memberships.html#bulk_transfer_ownership_direct/2"},{"type":"function","title":"Plausible.Site.Memberships.create_invitation/4","doc":"","ref":"Plausible.Site.Memberships.html#create_invitation/4"},{"type":"function","title":"Plausible.Site.Memberships.pending?/1","doc":"","ref":"Plausible.Site.Memberships.html#pending?/1"},{"type":"function","title":"Plausible.Site.Memberships.pending_ownerships?/1","doc":"","ref":"Plausible.Site.Memberships.html#pending_ownerships?/1"},{"type":"function","title":"Plausible.Site.Memberships.reject_invitation/2","doc":"","ref":"Plausible.Site.Memberships.html#reject_invitation/2"},{"type":"function","title":"Plausible.Site.Memberships.remove_invitation/2","doc":"","ref":"Plausible.Site.Memberships.html#remove_invitation/2"},{"type":"function","title":"Plausible.Site.Memberships.transfer_ownership/2","doc":"","ref":"Plausible.Site.Memberships.html#transfer_ownership/2"},{"type":"module","title":"Plausible.Site.Memberships.AcceptInvitation","doc":"Service for accepting invitations, including ownership transfers.\n\nAccepting invitation accounts for the fact that it's possible\nthat accepting user has an existing membership for the site and\nacts permissively to not unnecessarily disrupt the flow while\nalso maintaining integrity of site memberships. This also applies\nto cases where users update their email address between issuing\nthe invitation and accepting it.","ref":"Plausible.Site.Memberships.AcceptInvitation.html"},{"type":"function","title":"Plausible.Site.Memberships.AcceptInvitation.accept_invitation/2","doc":"","ref":"Plausible.Site.Memberships.AcceptInvitation.html#accept_invitation/2"},{"type":"function","title":"Plausible.Site.Memberships.AcceptInvitation.transfer_ownership/2","doc":"","ref":"Plausible.Site.Memberships.AcceptInvitation.html#transfer_ownership/2"},{"type":"module","title":"Plausible.Site.Memberships.CreateInvitation","doc":"Service for inviting new or existing users to a sites, including ownershhip\ntransfers.","ref":"Plausible.Site.Memberships.CreateInvitation.html"},{"type":"function","title":"Plausible.Site.Memberships.CreateInvitation.bulk_create_invitation/5","doc":"","ref":"Plausible.Site.Memberships.CreateInvitation.html#bulk_create_invitation/5"},{"type":"function","title":"Plausible.Site.Memberships.CreateInvitation.bulk_transfer_ownership_direct/2","doc":"","ref":"Plausible.Site.Memberships.CreateInvitation.html#bulk_transfer_ownership_direct/2"},{"type":"function","title":"Plausible.Site.Memberships.CreateInvitation.create_invitation/4","doc":"Invites a new team member to the given site. Returns a\n%Plausible.Auth.Invitation{} struct and sends the invitee an email to accept\nthis invitation.\n\nThe inviter must have enough permissions to invite the new team member,\notherwise this function returns `{:error, :forbidden}`.\n\nIf the new team member role is `:owner`, this function handles the invitation\nas an ownership transfer and requires the inviter to be the owner of the site.","ref":"Plausible.Site.Memberships.CreateInvitation.html#create_invitation/4"},{"type":"type","title":"Plausible.Site.Memberships.CreateInvitation.invite_error/0","doc":"","ref":"Plausible.Site.Memberships.CreateInvitation.html#t:invite_error/0"},{"type":"module","title":"Plausible.Site.Memberships.RejectInvitation","doc":"Service for rejecting invitations.","ref":"Plausible.Site.Memberships.RejectInvitation.html"},{"type":"function","title":"Plausible.Site.Memberships.RejectInvitation.reject_invitation/2","doc":"","ref":"Plausible.Site.Memberships.RejectInvitation.html#reject_invitation/2"},{"type":"module","title":"Plausible.Site.Memberships.RemoveInvitation","doc":"Service for removing invitations.","ref":"Plausible.Site.Memberships.RemoveInvitation.html"},{"type":"function","title":"Plausible.Site.Memberships.RemoveInvitation.remove_invitation/2","doc":"","ref":"Plausible.Site.Memberships.RemoveInvitation.html#remove_invitation/2"},{"type":"module","title":"Plausible.Site.MonthlyReport","doc":"","ref":"Plausible.Site.MonthlyReport.html"},{"type":"function","title":"Plausible.Site.MonthlyReport.add_recipient/2","doc":"","ref":"Plausible.Site.MonthlyReport.html#add_recipient/2"},{"type":"function","title":"Plausible.Site.MonthlyReport.changeset/2","doc":"","ref":"Plausible.Site.MonthlyReport.html#changeset/2"},{"type":"function","title":"Plausible.Site.MonthlyReport.remove_recipient/2","doc":"","ref":"Plausible.Site.MonthlyReport.html#remove_recipient/2"},{"type":"module","title":"Plausible.Site.Removal","doc":"A site deletion service stub.","ref":"Plausible.Site.Removal.html"},{"type":"function","title":"Plausible.Site.Removal.run/1","doc":"","ref":"Plausible.Site.Removal.html#run/1"},{"type":"module","title":"Plausible.Site.SharedLink","doc":"","ref":"Plausible.Site.SharedLink.html"},{"type":"function","title":"Plausible.Site.SharedLink.changeset/2","doc":"","ref":"Plausible.Site.SharedLink.html#changeset/2"},{"type":"type","title":"Plausible.Site.SharedLink.t/0","doc":"","ref":"Plausible.Site.SharedLink.html#t:t/0"},{"type":"module","title":"Plausible.Site.SpikeNotification","doc":"","ref":"Plausible.Site.SpikeNotification.html"},{"type":"function","title":"Plausible.Site.SpikeNotification.add_recipient/2","doc":"","ref":"Plausible.Site.SpikeNotification.html#add_recipient/2"},{"type":"function","title":"Plausible.Site.SpikeNotification.changeset/2","doc":"","ref":"Plausible.Site.SpikeNotification.html#changeset/2"},{"type":"function","title":"Plausible.Site.SpikeNotification.remove_recipient/2","doc":"","ref":"Plausible.Site.SpikeNotification.html#remove_recipient/2"},{"type":"function","title":"Plausible.Site.SpikeNotification.was_sent/1","doc":"","ref":"Plausible.Site.SpikeNotification.html#was_sent/1"},{"type":"module","title":"Plausible.Site.UserPreference","doc":"User-specific site preferences schema","ref":"Plausible.Site.UserPreference.html"},{"type":"function","title":"Plausible.Site.UserPreference.changeset/3","doc":"","ref":"Plausible.Site.UserPreference.html#changeset/3"},{"type":"macro","title":"Plausible.Site.UserPreference.options/0","doc":"","ref":"Plausible.Site.UserPreference.html#options/0"},{"type":"type","title":"Plausible.Site.UserPreference.t/0","doc":"","ref":"Plausible.Site.UserPreference.html#t:t/0"},{"type":"module","title":"Plausible.Site.WeeklyReport","doc":"","ref":"Plausible.Site.WeeklyReport.html"},{"type":"function","title":"Plausible.Site.WeeklyReport.add_recipient/2","doc":"","ref":"Plausible.Site.WeeklyReport.html#add_recipient/2"},{"type":"function","title":"Plausible.Site.WeeklyReport.changeset/2","doc":"","ref":"Plausible.Site.WeeklyReport.html#changeset/2"},{"type":"function","title":"Plausible.Site.WeeklyReport.remove_recipient/2","doc":"","ref":"Plausible.Site.WeeklyReport.html#remove_recipient/2"},{"type":"module","title":"Plausible.SiteAdmin","doc":"","ref":"Plausible.SiteAdmin.html"},{"type":"function","title":"Plausible.SiteAdmin.create_changeset/2","doc":"","ref":"Plausible.SiteAdmin.html#create_changeset/2"},{"type":"function","title":"Plausible.SiteAdmin.custom_index_query/3","doc":"","ref":"Plausible.SiteAdmin.html#custom_index_query/3"},{"type":"function","title":"Plausible.SiteAdmin.form_fields/1","doc":"","ref":"Plausible.SiteAdmin.html#form_fields/1"},{"type":"function","title":"Plausible.SiteAdmin.get_struct_fields/1","doc":"","ref":"Plausible.SiteAdmin.html#get_struct_fields/1"},{"type":"function","title":"Plausible.SiteAdmin.index/1","doc":"","ref":"Plausible.SiteAdmin.html#index/1"},{"type":"function","title":"Plausible.SiteAdmin.list_actions/1","doc":"","ref":"Plausible.SiteAdmin.html#list_actions/1"},{"type":"function","title":"Plausible.SiteAdmin.ordering/1","doc":"","ref":"Plausible.SiteAdmin.html#ordering/1"},{"type":"function","title":"Plausible.SiteAdmin.search_fields/1","doc":"","ref":"Plausible.SiteAdmin.html#search_fields/1"},{"type":"function","title":"Plausible.SiteAdmin.update_changeset/2","doc":"","ref":"Plausible.SiteAdmin.html#update_changeset/2"},{"type":"module","title":"Plausible.Sites","doc":"Sites context functions.","ref":"Plausible.Sites.html"},{"type":"function","title":"Plausible.Sites.create/2","doc":"","ref":"Plausible.Sites.html#create/2"},{"type":"function","title":"Plausible.Sites.create_shared_link/3","doc":"","ref":"Plausible.Sites.html#create_shared_link/3"},{"type":"function","title":"Plausible.Sites.get_by_domain/1","doc":"","ref":"Plausible.Sites.html#get_by_domain/1"},{"type":"function","title":"Plausible.Sites.get_by_domain!/1","doc":"","ref":"Plausible.Sites.html#get_by_domain!/1"},{"type":"function","title":"Plausible.Sites.get_for_user/3","doc":"","ref":"Plausible.Sites.html#get_for_user/3"},{"type":"function","title":"Plausible.Sites.get_for_user!/3","doc":"","ref":"Plausible.Sites.html#get_for_user!/3"},{"type":"function","title":"Plausible.Sites.has_admin_access?/2","doc":"","ref":"Plausible.Sites.html#has_admin_access?/2"},{"type":"function","title":"Plausible.Sites.has_goals?/1","doc":"","ref":"Plausible.Sites.html#has_goals?/1"},{"type":"function","title":"Plausible.Sites.has_stats?/1","doc":"","ref":"Plausible.Sites.html#has_stats?/1"},{"type":"function","title":"Plausible.Sites.is_member?/2","doc":"","ref":"Plausible.Sites.html#is_member?/2"},{"type":"function","title":"Plausible.Sites.list/3","doc":"","ref":"Plausible.Sites.html#list/3"},{"type":"function","title":"Plausible.Sites.list_with_invitations/3","doc":"","ref":"Plausible.Sites.html#list_with_invitations/3"},{"type":"function","title":"Plausible.Sites.locked?/1","doc":"","ref":"Plausible.Sites.html#locked?/1"},{"type":"function","title":"Plausible.Sites.owned_site_ids/1","doc":"","ref":"Plausible.Sites.html#owned_site_ids/1"},{"type":"function","title":"Plausible.Sites.owned_sites_count/1","doc":"","ref":"Plausible.Sites.html#owned_sites_count/1"},{"type":"function","title":"Plausible.Sites.owned_sites_domains/1","doc":"","ref":"Plausible.Sites.html#owned_sites_domains/1"},{"type":"function","title":"Plausible.Sites.role/2","doc":"","ref":"Plausible.Sites.html#role/2"},{"type":"function","title":"Plausible.Sites.set_option/4","doc":"","ref":"Plausible.Sites.html#set_option/4"},{"type":"function","title":"Plausible.Sites.shared_link_url/2","doc":"","ref":"Plausible.Sites.html#shared_link_url/2"},{"type":"function","title":"Plausible.Sites.stats_start_date/1","doc":"Returns the date of the first event of the given site, or `nil` if the site\ndoes not have stats yet.\n\nIf this is the first time the function is called for the site, it queries\nClickhouse and saves the date in the sites table.","ref":"Plausible.Sites.html#stats_start_date/1"},{"type":"function","title":"Plausible.Sites.toggle_pin/2","doc":"","ref":"Plausible.Sites.html#toggle_pin/2"},{"type":"type","title":"Plausible.Sites.list_opt/0","doc":"","ref":"Plausible.Sites.html#t:list_opt/0"},{"type":"module","title":"Plausible.Stats","doc":"","ref":"Plausible.Stats.html"},{"type":"function","title":"Plausible.Stats.aggregate/3","doc":"","ref":"Plausible.Stats.html#aggregate/3"},{"type":"function","title":"Plausible.Stats.breakdown/5","doc":"","ref":"Plausible.Stats.html#breakdown/5"},{"type":"function","title":"Plausible.Stats.current_visitors/1","doc":"","ref":"Plausible.Stats.html#current_visitors/1"},{"type":"function","title":"Plausible.Stats.filter_suggestions/4","doc":"","ref":"Plausible.Stats.html#filter_suggestions/4"},{"type":"function","title":"Plausible.Stats.funnel/3","doc":"","ref":"Plausible.Stats.html#funnel/3"},{"type":"function","title":"Plausible.Stats.timeseries/3","doc":"","ref":"Plausible.Stats.html#timeseries/3"},{"type":"module","title":"Plausible.Stats.Aggregate","doc":"","ref":"Plausible.Stats.Aggregate.html"},{"type":"function","title":"Plausible.Stats.Aggregate.aggregate/3","doc":"","ref":"Plausible.Stats.Aggregate.html#aggregate/3"},{"type":"module","title":"Plausible.Stats.Base","doc":"","ref":"Plausible.Stats.Base.html"},{"type":"function","title":"Plausible.Stats.Base.apply_entry_prop_filter/3","doc":"","ref":"Plausible.Stats.Base.html#apply_entry_prop_filter/3"},{"type":"function","title":"Plausible.Stats.Base.base_event_query/2","doc":"","ref":"Plausible.Stats.Base.html#base_event_query/2"},{"type":"function","title":"Plausible.Stats.Base.dynamic_filter_condition/3","doc":"","ref":"Plausible.Stats.Base.html#dynamic_filter_condition/3"},{"type":"function","title":"Plausible.Stats.Base.filter_by_entry_props/2","doc":"","ref":"Plausible.Stats.Base.html#filter_by_entry_props/2"},{"type":"function","title":"Plausible.Stats.Base.filter_converted_sessions/3","doc":"","ref":"Plausible.Stats.Base.html#filter_converted_sessions/3"},{"type":"function","title":"Plausible.Stats.Base.page_regex/1","doc":"","ref":"Plausible.Stats.Base.html#page_regex/1"},{"type":"function","title":"Plausible.Stats.Base.query_events/2","doc":"","ref":"Plausible.Stats.Base.html#query_events/2"},{"type":"function","title":"Plausible.Stats.Base.query_sessions/2","doc":"","ref":"Plausible.Stats.Base.html#query_sessions/2"},{"type":"function","title":"Plausible.Stats.Base.select_event_metrics/2","doc":"","ref":"Plausible.Stats.Base.html#select_event_metrics/2"},{"type":"function","title":"Plausible.Stats.Base.select_session_metrics/3","doc":"","ref":"Plausible.Stats.Base.html#select_session_metrics/3"},{"type":"function","title":"Plausible.Stats.Base.utc_boundaries/2","doc":"","ref":"Plausible.Stats.Base.html#utc_boundaries/2"},{"type":"module","title":"Plausible.Stats.Breakdown","doc":"","ref":"Plausible.Stats.Breakdown.html"},{"type":"function","title":"Plausible.Stats.Breakdown.breakdown/5","doc":"","ref":"Plausible.Stats.Breakdown.html#breakdown/5"},{"type":"module","title":"Plausible.Stats.Clickhouse","doc":"","ref":"Plausible.Stats.Clickhouse.html"},{"type":"function","title":"Plausible.Stats.Clickhouse.current_visitors/2","doc":"","ref":"Plausible.Stats.Clickhouse.html#current_visitors/2"},{"type":"function","title":"Plausible.Stats.Clickhouse.empty_24h_visitors_hourly_intervals/2","doc":"","ref":"Plausible.Stats.Clickhouse.html#empty_24h_visitors_hourly_intervals/2"},{"type":"function","title":"Plausible.Stats.Clickhouse.has_pageviews?/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#has_pageviews?/1"},{"type":"function","title":"Plausible.Stats.Clickhouse.imported_pageview_count/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#imported_pageview_count/1"},{"type":"function","title":"Plausible.Stats.Clickhouse.last_24h_visitors_hourly_intervals/2","doc":"","ref":"Plausible.Stats.Clickhouse.html#last_24h_visitors_hourly_intervals/2"},{"type":"function","title":"Plausible.Stats.Clickhouse.pageview_start_date_local/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#pageview_start_date_local/1"},{"type":"function","title":"Plausible.Stats.Clickhouse.top_sources/6","doc":"","ref":"Plausible.Stats.Clickhouse.html#top_sources/6"},{"type":"function","title":"Plausible.Stats.Clickhouse.usage_breakdown/2","doc":"","ref":"Plausible.Stats.Clickhouse.html#usage_breakdown/2"},{"type":"module","title":"Plausible.Stats.Compare","doc":"","ref":"Plausible.Stats.Compare.html"},{"type":"function","title":"Plausible.Stats.Compare.calculate_change/3","doc":"","ref":"Plausible.Stats.Compare.html#calculate_change/3"},{"type":"function","title":"Plausible.Stats.Compare.percent_change/2","doc":"","ref":"Plausible.Stats.Compare.html#percent_change/2"},{"type":"module","title":"Plausible.Stats.Comparisons","doc":"This module provides functions for comparing query periods.\n\nIt allows you to compare a given period with a previous period or with the\nsame period from the previous year. For example, you can compare this month's\nmain graph with last month or with the same month from last year.","ref":"Plausible.Stats.Comparisons.html"},{"type":"function","title":"Plausible.Stats.Comparisons.compare/4","doc":"Generates a comparison query based on the source query and comparison mode.\n\nThe mode parameter specifies the type of comparison and can be one of the\nfollowing:\n\n * `\"previous_period\"` - shifts back the query by the same number of days the\n source query has.\n\n * `\"year_over_year\"` - shifts back the query by 1 year.\n\n * `\"custom\"` - compares the query using a custom date range. See options for\n more details.\n\nThe comparison query returned by the function has its end date restricted to\nthe current day. This can be overriden by the `now` option, described below.","ref":"Plausible.Stats.Comparisons.html#compare/4"},{"type":"function","title":"Options - Plausible.Stats.Comparisons.compare/4","doc":"* `:now` - a `NaiveDateTime` struct with the current date and time. This is\n optional and used for testing purposes.\n\n * `:from` - a ISO-8601 date string used when mode is `\"custom\"`.\n\n * `:to` - a ISO-8601 date string used when mode is `\"custom\"`. Must be\n after `from`.\n\n * `:match_day_of_week?` - determines whether the comparison query should be\n adjusted to match the day of the week of the source query. When this option\n is set to true, the comparison query is shifted to start on the same day of\n the week as the source query, rather than on the exact same date. For\n example, if the source query starts on Sunday, January 1st, 2023 and the\n `year_over_year` comparison query is configured to `match_day_of_week?`,\n it will be shifted to start on Sunday, January 2nd, 2022 instead of\n January 1st. Defaults to false.","ref":"Plausible.Stats.Comparisons.html#compare/4-options"},{"type":"type","title":"Plausible.Stats.Comparisons.mode/0","doc":"","ref":"Plausible.Stats.Comparisons.html#t:mode/0"},{"type":"module","title":"Plausible.Stats.CurrentVisitors","doc":"","ref":"Plausible.Stats.CurrentVisitors.html"},{"type":"function","title":"Plausible.Stats.CurrentVisitors.current_visitors/1","doc":"","ref":"Plausible.Stats.CurrentVisitors.html#current_visitors/1"},{"type":"module","title":"Plausible.Stats.CustomProps","doc":"Module for querying user defined 'custom properties'.","ref":"Plausible.Stats.CustomProps.html"},{"type":"function","title":"Plausible.Stats.CustomProps.fetch_prop_names/2","doc":"","ref":"Plausible.Stats.CustomProps.html#fetch_prop_names/2"},{"type":"function","title":"Plausible.Stats.CustomProps.maybe_allowed_props_only/2","doc":"","ref":"Plausible.Stats.CustomProps.html#maybe_allowed_props_only/2"},{"type":"function","title":"Plausible.Stats.CustomProps.props_for_all_event_names/2","doc":"Returns a breakdown of event names with all existing custom\nproperties for each event name.","ref":"Plausible.Stats.CustomProps.html#props_for_all_event_names/2"},{"type":"module","title":"Plausible.Stats.EmailReport","doc":"This module exposes a `get/2` function that returns a map\nof stats needed for email reports. These stats include:\n\n* Total pageviews\n* Unique visitors\n* Bounce rate\n* A list of Top 5 sources (excluding \"Direct / None\")\n* A list of Top 5 pages\n\nwhere total pageviews, unique visitors, and bounce rate\nalso include the change compared to previous period.","ref":"Plausible.Stats.EmailReport.html"},{"type":"function","title":"Plausible.Stats.EmailReport.get/2","doc":"","ref":"Plausible.Stats.EmailReport.html#get/2"},{"type":"module","title":"Plausible.Stats.FilterParser","doc":"A module for parsing filters used in stat queries.","ref":"Plausible.Stats.FilterParser.html"},{"type":"function","title":"Plausible.Stats.FilterParser.parse_filters/1","doc":"Parses different filter formats.\n\nDepending on the format and type of the `filters` argument, returns:\n\n * a decoded map, when `filters` is encoded JSON\n * a parsed filter map, when `filters` is a filter expression string\n * the same map, when `filters` is a map\n\nReturns an empty map when argument type is unexpected (e.g. `nil`).\n\n#","ref":"Plausible.Stats.FilterParser.html#parse_filters/1"},{"type":"function","title":"Examples: - Plausible.Stats.FilterParser.parse_filters/1","doc":"iex> FilterParser.parse_filters(\"{\\\"page\\\":\\\"/blog/**\\\"}\")\n %{\"page\" => \"/blog/**\"}\n\n iex> FilterParser.parse_filters(\"visit:browser!=Chrome\")\n %{\"visit:browser\" => {:is_not, \"Chrome\"}}\n\n iex> FilterParser.parse_filters(nil)\n %{}","ref":"Plausible.Stats.FilterParser.html#parse_filters/1-examples"},{"type":"module","title":"Plausible.Stats.FilterSuggestions","doc":"","ref":"Plausible.Stats.FilterSuggestions.html"},{"type":"function","title":"Plausible.Stats.FilterSuggestions.filter_suggestions/4","doc":"","ref":"Plausible.Stats.FilterSuggestions.html#filter_suggestions/4"},{"type":"module","title":"Plausible.Stats.Filters","doc":"","ref":"Plausible.Stats.Filters.html"},{"type":"function","title":"Plausible.Stats.Filters.add_prefix/1","doc":"","ref":"Plausible.Stats.Filters.html#add_prefix/1"},{"type":"function","title":"Plausible.Stats.Filters.visit_props/0","doc":"","ref":"Plausible.Stats.Filters.html#visit_props/0"},{"type":"module","title":"Plausible.Stats.Fragments","doc":"","ref":"Plausible.Stats.Fragments.html"},{"type":"macro","title":"Plausible.Stats.Fragments.bounce_rate/0","doc":"","ref":"Plausible.Stats.Fragments.html#bounce_rate/0"},{"type":"macro","title":"Plausible.Stats.Fragments.coalesce_string/2","doc":"","ref":"Plausible.Stats.Fragments.html#coalesce_string/2"},{"type":"macro","title":"Plausible.Stats.Fragments.sample_percent/0","doc":"","ref":"Plausible.Stats.Fragments.html#sample_percent/0"},{"type":"macro","title":"Plausible.Stats.Fragments.to_timezone/2","doc":"Converts time or date and time to the specified timezone.\n\nReference: https://clickhouse.com/docs/en/sql-reference/functions/date-time-functions/#totimezone","ref":"Plausible.Stats.Fragments.html#to_timezone/2"},{"type":"macro","title":"Plausible.Stats.Fragments.total/0","doc":"","ref":"Plausible.Stats.Fragments.html#total/0"},{"type":"macro","title":"Plausible.Stats.Fragments.uniq/1","doc":"","ref":"Plausible.Stats.Fragments.html#uniq/1"},{"type":"macro","title":"Plausible.Stats.Fragments.visit_duration/0","doc":"","ref":"Plausible.Stats.Fragments.html#visit_duration/0"},{"type":"macro","title":"Plausible.Stats.Fragments.weekstart_not_before/2","doc":"Returns the weekstart for `date`. If the weekstart is before the `not_before`\nboundary, `not_before` is returned.","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/2"},{"type":"macro","title":"Examples - Plausible.Stats.Fragments.weekstart_not_before/2","doc":"In this pseudo-code example, the fragment returns the weekstart. The\n`not_before` boundary is set to the past Saturday, which is before the\nweekstart, therefore the cap does not apply.\n\n iex> this_wednesday = ~D[2022-11-09]\n ...> past_saturday = ~D[2022-11-05]\n ...> weekstart_not_before(this_wednesday, past_saturday)\n ~D[2022-11-07]\n\n\nIn this other example, the fragment returns Tuesday and not the weekstart.\nThe `not_before` boundary is set to Tuesday, which is past the weekstart,\ntherefore the cap applies.\n\n iex> this_wednesday = ~D[2022-11-09]\n ...> this_tuesday = ~D[2022-11-08]\n ...> weekstart_not_before(this_wednesday, this_tuesday)\n ~D[2022-11-08]","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/2-examples"},{"type":"macro","title":"Plausible.Stats.Fragments.weekstart_not_before/3","doc":"Same as Plausible.Stats.Fragments.weekstart_not_before/2 but converts dates to\nthe specified timezone.","ref":"Plausible.Stats.Fragments.html#weekstart_not_before/3"},{"type":"module","title":"Plausible.Stats.Funnel","doc":"Module responsible for funnel evaluation, i.e. building and executing\nClickHouse funnel query based on `Plausible.Funnel` definition.","ref":"Plausible.Stats.Funnel.html"},{"type":"function","title":"Plausible.Stats.Funnel.funnel/3","doc":"","ref":"Plausible.Stats.Funnel.html#funnel/3"},{"type":"module","title":"Plausible.Stats.Goal.Revenue","doc":"Revenue specific functions for the stats scope","ref":"Plausible.Stats.Goal.Revenue.html"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.average_revenue_query/1","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#average_revenue_query/1"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.cast_revenue_metrics_to_money/2","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#cast_revenue_metrics_to_money/2"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.get_revenue_tracking_currency/3","doc":"Returns the common currency for the goal filters in a query. If there are no\ngoal filters, multiple currencies or the site owner does not have access to\nrevenue goals, `nil` is returned and revenue metrics are dropped.\n\nAggregating revenue data works only for same currency goals. If the query is\nfiltered by goals with different currencies, for example, one USD and other\nEUR, revenue metrics are dropped.","ref":"Plausible.Stats.Goal.Revenue.html#get_revenue_tracking_currency/3"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.revenue_metrics/0","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#revenue_metrics/0"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.total_revenue_query/1","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#total_revenue_query/1"},{"type":"module","title":"Plausible.Stats.Imported","doc":"","ref":"Plausible.Stats.Imported.html"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported/5","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported/5"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_timeseries/4","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_timeseries/4"},{"type":"module","title":"Plausible.Stats.Interval","doc":"Collection of functions to work with intervals.\n\nThe interval of a query defines the granularity of the data. You can think of\nit as a `GROUP BY` clause. Possible values are `minute`, `hour`, `date`,\n`week`, and `month`.","ref":"Plausible.Stats.Interval.html"},{"type":"function","title":"Plausible.Stats.Interval.default_for_date_range/1","doc":"Returns the suggested interval for the given `Date.Range` struct.","ref":"Plausible.Stats.Interval.html#default_for_date_range/1"},{"type":"function","title":"Plausible.Stats.Interval.default_for_period/1","doc":"Returns the suggested interval for the given time period.","ref":"Plausible.Stats.Interval.html#default_for_period/1"},{"type":"function","title":"Plausible.Stats.Interval.list/0","doc":"","ref":"Plausible.Stats.Interval.html#list/0"},{"type":"function","title":"Plausible.Stats.Interval.valid?/1","doc":"","ref":"Plausible.Stats.Interval.html#valid?/1"},{"type":"function","title":"Plausible.Stats.Interval.valid_by_period/1","doc":"","ref":"Plausible.Stats.Interval.html#valid_by_period/1"},{"type":"function","title":"Plausible.Stats.Interval.valid_for_period?/3","doc":"Returns whether the given interval is valid for a time period.\n\nIntervals longer than periods are not supported, e.g. current month stats with\na month interval, or today stats with a week interval.\n\nThere are two dynamic states:\n* `custom` period is only applicable with `month` or `week` intervals,\n if the `opts[:from]` and `opts[:to]` range difference exceeds 12 months\n* `all` period's interval options depend on particular site's `stats_start_date`\n - daily interval is excluded if the all-time range exceeds 12 months","ref":"Plausible.Stats.Interval.html#valid_for_period?/3"},{"type":"type","title":"Plausible.Stats.Interval.opt/0","doc":"","ref":"Plausible.Stats.Interval.html#t:opt/0"},{"type":"type","title":"Plausible.Stats.Interval.opts/0","doc":"","ref":"Plausible.Stats.Interval.html#t:opts/0"},{"type":"type","title":"Plausible.Stats.Interval.t/0","doc":"","ref":"Plausible.Stats.Interval.html#t:t/0"},{"type":"module","title":"Plausible.Stats.Props","doc":"","ref":"Plausible.Stats.Props.html"},{"type":"function","title":"Plausible.Stats.Props.event_props/0","doc":"","ref":"Plausible.Stats.Props.html#event_props/0"},{"type":"function","title":"Plausible.Stats.Props.valid_prop?/1","doc":"","ref":"Plausible.Stats.Props.html#valid_prop?/1"},{"type":"module","title":"Plausible.Stats.Query","doc":"","ref":"Plausible.Stats.Query.html"},{"type":"function","title":"Plausible.Stats.Query.from/2","doc":"","ref":"Plausible.Stats.Query.html#from/2"},{"type":"function","title":"Plausible.Stats.Query.get_filter_by_prefix/2","doc":"","ref":"Plausible.Stats.Query.html#get_filter_by_prefix/2"},{"type":"function","title":"Plausible.Stats.Query.has_event_filters?/1","doc":"","ref":"Plausible.Stats.Query.html#has_event_filters?/1"},{"type":"function","title":"Plausible.Stats.Query.include_imported?/3","doc":"","ref":"Plausible.Stats.Query.html#include_imported?/3"},{"type":"function","title":"Plausible.Stats.Query.put_filter/3","doc":"","ref":"Plausible.Stats.Query.html#put_filter/3"},{"type":"function","title":"Plausible.Stats.Query.remove_event_filters/2","doc":"","ref":"Plausible.Stats.Query.html#remove_event_filters/2"},{"type":"function","title":"Plausible.Stats.Query.trace/1","doc":"","ref":"Plausible.Stats.Query.html#trace/1"},{"type":"type","title":"Plausible.Stats.Query.t/0","doc":"","ref":"Plausible.Stats.Query.html#t:t/0"},{"type":"module","title":"Plausible.Stats.Sampling","doc":"Sampling related functions","ref":"Plausible.Stats.Sampling.html"},{"type":"function","title":"Plausible.Stats.Sampling.add_query_hint/1","doc":"","ref":"Plausible.Stats.Sampling.html#add_query_hint/1"},{"type":"function","title":"Plausible.Stats.Sampling.add_query_hint/2","doc":"","ref":"Plausible.Stats.Sampling.html#add_query_hint/2"},{"type":"function","title":"Plausible.Stats.Sampling.put_threshold/2","doc":"","ref":"Plausible.Stats.Sampling.html#put_threshold/2"},{"type":"module","title":"Plausible.Stats.Timeseries","doc":"","ref":"Plausible.Stats.Timeseries.html"},{"type":"function","title":"Plausible.Stats.Timeseries.timeseries/3","doc":"","ref":"Plausible.Stats.Timeseries.html#timeseries/3"},{"type":"type","title":"Plausible.Stats.Timeseries.results/0","doc":"","ref":"Plausible.Stats.Timeseries.html#t:results/0"},{"type":"module","title":"Plausible.Stats.Util","doc":"Utilities for modifying stat results","ref":"Plausible.Stats.Util.html"},{"type":"function","title":"Plausible.Stats.Util.remove_internal_visits_metric/1","doc":"","ref":"Plausible.Stats.Util.html#remove_internal_visits_metric/1"},{"type":"function","title":"Plausible.Stats.Util.remove_internal_visits_metric/2","doc":"`__internal_visits` is fetched when querying bounce rate and visit duration, as it\nis needed to calculate these from imported data. This function removes that metric\nfrom all entries in the results list.","ref":"Plausible.Stats.Util.html#remove_internal_visits_metric/2"},{"type":"module","title":"Plausible.Test.Support.HTML","doc":"Floki wrappers to help make assertions about HTML/DOM structures","ref":"Plausible.Test.Support.HTML.html"},{"type":"function","title":"Plausible.Test.Support.HTML.class_of_element/2","doc":"","ref":"Plausible.Test.Support.HTML.html#class_of_element/2"},{"type":"function","title":"Plausible.Test.Support.HTML.element_exists?/2","doc":"","ref":"Plausible.Test.Support.HTML.html#element_exists?/2"},{"type":"function","title":"Plausible.Test.Support.HTML.find/2","doc":"","ref":"Plausible.Test.Support.HTML.html#find/2"},{"type":"function","title":"Plausible.Test.Support.HTML.form_exists?/2","doc":"","ref":"Plausible.Test.Support.HTML.html#form_exists?/2"},{"type":"function","title":"Plausible.Test.Support.HTML.name_of/1","doc":"","ref":"Plausible.Test.Support.HTML.html#name_of/1"},{"type":"function","title":"Plausible.Test.Support.HTML.submit_button/2","doc":"","ref":"Plausible.Test.Support.HTML.html#submit_button/2"},{"type":"function","title":"Plausible.Test.Support.HTML.text/1","doc":"","ref":"Plausible.Test.Support.HTML.html#text/1"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_attr/2","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/2"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_attr/3","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/3"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_element/2","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_element/2"},{"type":"module","title":"Plausible.Test.Support.HTTPMocker","doc":"Currently only supports post request, it's a drop-in replacement\nfor our exvcr usage that wasn't ever needed (e.g. we had no way to\nre-record the cassettes anyway).","ref":"Plausible.Test.Support.HTTPMocker.html"},{"type":"module","title":"Plausible.TestUtils","doc":"","ref":"Plausible.TestUtils.html"},{"type":"function","title":"Plausible.TestUtils.add_imported_data/1","doc":"","ref":"Plausible.TestUtils.html#add_imported_data/1"},{"type":"function","title":"Plausible.TestUtils.await_clickhouse_count/2","doc":"","ref":"Plausible.TestUtils.html#await_clickhouse_count/2"},{"type":"function","title":"Plausible.TestUtils.create_api_key/1","doc":"","ref":"Plausible.TestUtils.html#create_api_key/1"},{"type":"function","title":"Plausible.TestUtils.create_events/1","doc":"","ref":"Plausible.TestUtils.html#create_events/1"},{"type":"function","title":"Plausible.TestUtils.create_new_site/1","doc":"","ref":"Plausible.TestUtils.html#create_new_site/1"},{"type":"function","title":"Plausible.TestUtils.create_pageviews/1","doc":"","ref":"Plausible.TestUtils.html#create_pageviews/1"},{"type":"function","title":"Plausible.TestUtils.create_sessions/1","doc":"","ref":"Plausible.TestUtils.html#create_sessions/1"},{"type":"function","title":"Plausible.TestUtils.create_site/1","doc":"","ref":"Plausible.TestUtils.html#create_site/1"},{"type":"function","title":"Plausible.TestUtils.create_user/1","doc":"","ref":"Plausible.TestUtils.html#create_user/1"},{"type":"function","title":"Plausible.TestUtils.eventually/3","doc":"","ref":"Plausible.TestUtils.html#eventually/3"},{"type":"function","title":"Plausible.TestUtils.generate_usage_for/3","doc":"","ref":"Plausible.TestUtils.html#generate_usage_for/3"},{"type":"function","title":"Plausible.TestUtils.init_session/1","doc":"","ref":"Plausible.TestUtils.html#init_session/1"},{"type":"function","title":"Plausible.TestUtils.log_in/1","doc":"","ref":"Plausible.TestUtils.html#log_in/1"},{"type":"macro","title":"Plausible.TestUtils.patch_env/2","doc":"","ref":"Plausible.TestUtils.html#patch_env/2"},{"type":"function","title":"Plausible.TestUtils.populate_stats/1","doc":"","ref":"Plausible.TestUtils.html#populate_stats/1"},{"type":"function","title":"Plausible.TestUtils.populate_stats/2","doc":"","ref":"Plausible.TestUtils.html#populate_stats/2"},{"type":"function","title":"Plausible.TestUtils.random_ip/0","doc":"","ref":"Plausible.TestUtils.html#random_ip/0"},{"type":"function","title":"Plausible.TestUtils.relative_time/1","doc":"","ref":"Plausible.TestUtils.html#relative_time/1"},{"type":"macro","title":"Plausible.TestUtils.setup_patch_env/2","doc":"","ref":"Plausible.TestUtils.html#setup_patch_env/2"},{"type":"function","title":"Plausible.TestUtils.to_naive_truncate/1","doc":"","ref":"Plausible.TestUtils.html#to_naive_truncate/1"},{"type":"function","title":"Plausible.TestUtils.use_api_key/1","doc":"","ref":"Plausible.TestUtils.html#use_api_key/1"},{"type":"module","title":"Plausible.Themes","doc":"","ref":"Plausible.Themes.html"},{"type":"function","title":"Plausible.Themes.options/0","doc":"","ref":"Plausible.Themes.html#options/0"},{"type":"module","title":"Plausible.Timezones","doc":"","ref":"Plausible.Timezones.html"},{"type":"function","title":"Plausible.Timezones.options/1","doc":"","ref":"Plausible.Timezones.html#options/1"},{"type":"function","title":"Plausible.Timezones.to_date_in_timezone/2","doc":"","ref":"Plausible.Timezones.html#to_date_in_timezone/2"},{"type":"function","title":"Plausible.Timezones.to_utc_datetime/2","doc":"","ref":"Plausible.Timezones.html#to_utc_datetime/2"},{"type":"module","title":"Plausible.Users","doc":"User context","ref":"Plausible.Users.html"},{"type":"function","title":"Plausible.Users.accept_traffic_until/1","doc":"","ref":"Plausible.Users.html#accept_traffic_until/1"},{"type":"function","title":"Plausible.Users.allow_next_upgrade_override/1","doc":"","ref":"Plausible.Users.html#allow_next_upgrade_override/1"},{"type":"function","title":"Plausible.Users.has_email_code?/1","doc":"","ref":"Plausible.Users.html#has_email_code?/1"},{"type":"function","title":"Plausible.Users.maybe_reset_next_upgrade_override/1","doc":"","ref":"Plausible.Users.html#maybe_reset_next_upgrade_override/1"},{"type":"function","title":"Plausible.Users.update_accept_traffic_until/1","doc":"","ref":"Plausible.Users.html#update_accept_traffic_until/1"},{"type":"function","title":"Plausible.Users.with_subscription/1","doc":"","ref":"Plausible.Users.html#with_subscription/1"},{"type":"module","title":"Plausible.Workers.AcceptTrafficUntil","doc":"A worker meant to be run once a day that sends out e-mail notifications to site\nowners assuming:\n - their sites still receive traffic (i.e. have stats for yesterday)\n - `site.accept_traffic_until` is approaching either tomorrow or exactly in 7 days\n\nUsers having no sites or sites that receive no traffic, won't be notified.\nWe make a tiny effort here to make sure we send the same notification at most once a day.","ref":"Plausible.Workers.AcceptTrafficUntil.html"},{"type":"module","title":"Plausible.Workers.CheckUsage","doc":"","ref":"Plausible.Workers.CheckUsage.html"},{"type":"function","title":"Plausible.Workers.CheckUsage.check_enterprise_subscriber/2","doc":"","ref":"Plausible.Workers.CheckUsage.html#check_enterprise_subscriber/2"},{"type":"macro","title":"Plausible.Workers.CheckUsage.day_of_month/1","doc":"","ref":"Plausible.Workers.CheckUsage.html#day_of_month/1"},{"type":"function","title":"Plausible.Workers.CheckUsage.exceeds_last_two_usage_cycles?/2","doc":"","ref":"Plausible.Workers.CheckUsage.html#exceeds_last_two_usage_cycles?/2"},{"type":"macro","title":"Plausible.Workers.CheckUsage.last_day_of_month/1","doc":"","ref":"Plausible.Workers.CheckUsage.html#last_day_of_month/1"},{"type":"macro","title":"Plausible.Workers.CheckUsage.least/2","doc":"","ref":"Plausible.Workers.CheckUsage.html#least/2"},{"type":"macro","title":"Plausible.Workers.CheckUsage.yesterday/0","doc":"","ref":"Plausible.Workers.CheckUsage.html#yesterday/0"},{"type":"module","title":"Plausible.Workers.CleanInvitations","doc":"","ref":"Plausible.Workers.CleanInvitations.html"},{"type":"module","title":"Plausible.Workers.ExpireDomainChangeTransitions","doc":"Periodic worker that expires domain change transition period.\nOld domains are frozen for a given time, so users can still access them\nbefore redeploying their scripts and integrations.","ref":"Plausible.Workers.ExpireDomainChangeTransitions.html"},{"type":"module","title":"Plausible.Workers.ImportGoogleAnalytics","doc":"","ref":"Plausible.Workers.ImportGoogleAnalytics.html"},{"type":"function","title":"Plausible.Workers.ImportGoogleAnalytics.import_failed/1","doc":"","ref":"Plausible.Workers.ImportGoogleAnalytics.html#import_failed/1"},{"type":"module","title":"Plausible.Workers.LockSites","doc":"","ref":"Plausible.Workers.LockSites.html"},{"type":"module","title":"Plausible.Workers.NotifyAnnualRenewal","doc":"","ref":"Plausible.Workers.NotifyAnnualRenewal.html"},{"type":"function","title":"Plausible.Workers.NotifyAnnualRenewal.perform/1","doc":"Sends a notification at most 7 days and at least 1 day before the renewal of an annual subscription","ref":"Plausible.Workers.NotifyAnnualRenewal.html#perform/1"},{"type":"module","title":"Plausible.Workers.RotateSalts","doc":"","ref":"Plausible.Workers.RotateSalts.html"},{"type":"module","title":"Plausible.Workers.ScheduleEmailReports","doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html"},{"type":"function","title":"Plausible.Workers.ScheduleEmailReports.first_of_month_9am/1","doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html#first_of_month_9am/1"},{"type":"function","title":"Plausible.Workers.ScheduleEmailReports.monday_9am/1","doc":"","ref":"Plausible.Workers.ScheduleEmailReports.html#monday_9am/1"},{"type":"function","title":"Plausible.Workers.ScheduleEmailReports.perform/1","doc":"Email reports should be sent on Monday at 9am according to the timezone\nof a site. This job runs every day at midnight to ensure that all sites\nhave a scheduled job for email reports.","ref":"Plausible.Workers.ScheduleEmailReports.html#perform/1"},{"type":"module","title":"Plausible.Workers.SendCheckStatsEmails","doc":"","ref":"Plausible.Workers.SendCheckStatsEmails.html"},{"type":"module","title":"Plausible.Workers.SendEmailReport","doc":"","ref":"Plausible.Workers.SendEmailReport.html"},{"type":"module","title":"Plausible.Workers.SendSiteSetupEmails","doc":"","ref":"Plausible.Workers.SendSiteSetupEmails.html"},{"type":"module","title":"Plausible.Workers.SendTrialNotifications","doc":"","ref":"Plausible.Workers.SendTrialNotifications.html"},{"type":"module","title":"Plausible.Workers.SpikeNotifier","doc":"","ref":"Plausible.Workers.SpikeNotifier.html"},{"type":"module","title":"PlausibleWeb","doc":"","ref":"PlausibleWeb.html"},{"type":"macro","title":"PlausibleWeb.__using__/1","doc":"When used, dispatch to the appropriate controller/view/etc.","ref":"PlausibleWeb.html#__using__/1"},{"type":"function","title":"PlausibleWeb.channel/0","doc":"","ref":"PlausibleWeb.html#channel/0"},{"type":"function","title":"PlausibleWeb.controller/0","doc":"","ref":"PlausibleWeb.html#controller/0"},{"type":"function","title":"PlausibleWeb.open_api_schema/0","doc":"","ref":"PlausibleWeb.html#open_api_schema/0"},{"type":"function","title":"PlausibleWeb.plugins_api_controller/0","doc":"","ref":"PlausibleWeb.html#plugins_api_controller/0"},{"type":"function","title":"PlausibleWeb.plugins_api_view/0","doc":"","ref":"PlausibleWeb.html#plugins_api_view/0"},{"type":"function","title":"PlausibleWeb.router/0","doc":"","ref":"PlausibleWeb.html#router/0"},{"type":"function","title":"PlausibleWeb.view/0","doc":"","ref":"PlausibleWeb.html#view/0"},{"type":"module","title":"PlausibleWeb.AdminController","doc":"","ref":"PlausibleWeb.AdminController.html"},{"type":"function","title":"PlausibleWeb.AdminController.usage/2","doc":"","ref":"PlausibleWeb.AdminController.html#usage/2"},{"type":"module","title":"PlausibleWeb.Api.ExternalController","doc":"","ref":"PlausibleWeb.Api.ExternalController.html"},{"type":"function","title":"PlausibleWeb.Api.ExternalController.error/2","doc":"","ref":"PlausibleWeb.Api.ExternalController.html#error/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalController.event/2","doc":"","ref":"PlausibleWeb.Api.ExternalController.html#event/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalController.health/2","doc":"","ref":"PlausibleWeb.Api.ExternalController.html#health/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalController.info/2","doc":"","ref":"PlausibleWeb.Api.ExternalController.html#info/2"},{"type":"module","title":"PlausibleWeb.Api.ExternalSitesController","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.create_site/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#create_site/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.delete_goal/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#delete_goal/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.delete_site/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#delete_site/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.find_or_create_goal/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#find_or_create_goal/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.find_or_create_shared_link/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#find_or_create_shared_link/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.get_site/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#get_site/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.update_site/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#update_site/2"},{"type":"module","title":"PlausibleWeb.Api.ExternalStatsController","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html"},{"type":"function","title":"PlausibleWeb.Api.ExternalStatsController.aggregate/2","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#aggregate/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalStatsController.breakdown/2","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#breakdown/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalStatsController.realtime_visitors/2","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#realtime_visitors/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalStatsController.timeseries/2","doc":"","ref":"PlausibleWeb.Api.ExternalStatsController.html#timeseries/2"},{"type":"module","title":"PlausibleWeb.Api.Helpers","doc":"","ref":"PlausibleWeb.Api.Helpers.html"},{"type":"function","title":"PlausibleWeb.Api.Helpers.bad_request/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#bad_request/2"},{"type":"function","title":"PlausibleWeb.Api.Helpers.not_found/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#not_found/2"},{"type":"function","title":"PlausibleWeb.Api.Helpers.payment_required/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#payment_required/2"},{"type":"function","title":"PlausibleWeb.Api.Helpers.too_many_requests/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#too_many_requests/2"},{"type":"function","title":"PlausibleWeb.Api.Helpers.unauthorized/2","doc":"","ref":"PlausibleWeb.Api.Helpers.html#unauthorized/2"},{"type":"module","title":"PlausibleWeb.Api.InternalController","doc":"","ref":"PlausibleWeb.Api.InternalController.html"},{"type":"function","title":"PlausibleWeb.Api.InternalController.disable_feature/2","doc":"","ref":"PlausibleWeb.Api.InternalController.html#disable_feature/2"},{"type":"function","title":"PlausibleWeb.Api.InternalController.domain_status/2","doc":"","ref":"PlausibleWeb.Api.InternalController.html#domain_status/2"},{"type":"function","title":"PlausibleWeb.Api.InternalController.sites/2","doc":"","ref":"PlausibleWeb.Api.InternalController.html#sites/2"},{"type":"module","title":"PlausibleWeb.Api.PaddleController","doc":"","ref":"PlausibleWeb.Api.PaddleController.html"},{"type":"function","title":"PlausibleWeb.Api.PaddleController.verified_signature?/1","doc":"","ref":"PlausibleWeb.Api.PaddleController.html#verified_signature?/1"},{"type":"function","title":"PlausibleWeb.Api.PaddleController.verify_signature/2","doc":"","ref":"PlausibleWeb.Api.PaddleController.html#verify_signature/2"},{"type":"function","title":"PlausibleWeb.Api.PaddleController.webhook/2","doc":"","ref":"PlausibleWeb.Api.PaddleController.html#webhook/2"},{"type":"module","title":"PlausibleWeb.Api.StatsController","doc":"","ref":"PlausibleWeb.Api.StatsController.html"},{"type":"function","title":"PlausibleWeb.Api.StatsController.all_custom_prop_values/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#all_custom_prop_values/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.browser_versions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#browser_versions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.browsers/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#browsers/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.cities/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#cities/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.conversions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#conversions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.countries/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#countries/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.current_visitors/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#current_visitors/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.custom_prop_values/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#custom_prop_values/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.entry_pages/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#entry_pages/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.exit_pages/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#exit_pages/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.filter_suggestions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#filter_suggestions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.format_money/1","doc":"","ref":"PlausibleWeb.Api.StatsController.html#format_money/1"},{"type":"function","title":"PlausibleWeb.Api.StatsController.format_revenue_metric/1","doc":"","ref":"PlausibleWeb.Api.StatsController.html#format_revenue_metric/1"},{"type":"function","title":"PlausibleWeb.Api.StatsController.funnel/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#funnel/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.main_graph/2","doc":"Returns a time-series based on given parameters.","ref":"PlausibleWeb.Api.StatsController.html#main_graph/2"},{"type":"function","title":"Parameters - PlausibleWeb.Api.StatsController.main_graph/2","doc":"This API accepts the following parameters:\n\n * `period` - x-axis of the graph, e.g. `12mo`, `day`, `custom`.\n\n * `metric` - y-axis of the graph, e.g. `visits`, `visitors`, `pageviews`.\n See the Stats API [\"Metrics\"](https://plausible.io/docs/stats-api#metrics)\n section for more details. Defaults to `visitors`.\n\n * `interval` - granularity of the time-series data. You can think of it as\n a `GROUP BY` clause. Possible values are `minute`, `hour`, `date`, `week`,\n and `month`. The default depends on the `period` parameter. Check\n `Plausible.Query.from/2` for each default.\n\n * `filters` - optional filters to drill down data. See the Stats API\n [\"Filtering\"](https://plausible.io/docs/stats-api#filtering) section for\n more details.\n\n * `with_imported` - boolean indicating whether to include Google Analytics\n imported data or not. Defaults to `false`.\n\nFull example:\n```elixir\n%{\n \"from\" => \"2021-09-06\",\n \"interval\" => \"month\",\n \"metric\" => \"visitors\",\n \"period\" => \"custom\",\n \"to\" => \"2021-12-13\"\n}\n```","ref":"PlausibleWeb.Api.StatsController.html#main_graph/2-parameters"},{"type":"function","title":"Response - PlausibleWeb.Api.StatsController.main_graph/2","doc":"Returns a map with the following keys:\n\n * `plot` - list of values for the requested metric representing the y-axis\n of the graph.\n\n * `labels` - list of date times representing the x-axis of the graph.\n\n * `present_index` - index of the element representing the current date in\n `labels` and `plot` lists.\n\n * `interval` - the interval used for querying.\n\n * `with_imported` - boolean indicating whether the Google Analytics data\n was queried or not.\n\n * `imported_source` - the source of the imported data, when applicable.\n Currently only Google Analytics is supported.\n\n * `full_intervals` - map of dates indicating whether the interval has been\n cut off by the requested date range or not. For example, if looking at a\n month week-by-week, some weeks may be cut off by the month boundaries.\n It's useful to adjust the graph display slightly in case the interval is\n not 'full' so that the user understands why the numbers might be lower for\n those partial periods.\n\nFull example:\n```elixir\n%{\n \"full_intervals\" => %{\n \"2021-09-01\" => false,\n \"2021-10-01\" => true,\n \"2021-11-01\" => true,\n \"2021-12-01\" => false\n },\n \"imported_source\" => nil,\n \"interval\" => \"month\",\n \"labels\" => [\"2021-09-01\", \"2021-10-01\", \"2021-11-01\", \"2021-12-01\"],\n \"plot\" => [0, 0, 0, 0],\n \"present_index\" => nil,\n \"with_imported\" => false\n}\n```","ref":"PlausibleWeb.Api.StatsController.html#main_graph/2-response"},{"type":"function","title":"PlausibleWeb.Api.StatsController.operating_system_versions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#operating_system_versions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.operating_systems/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#operating_systems/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.pages/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#pages/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.referrer_drilldown/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#referrer_drilldown/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.referrers/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#referrers/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.regions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#regions/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.screen_sizes/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#screen_sizes/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.sources/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#sources/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.top_stats/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#top_stats/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_campaigns/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_campaigns/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_contents/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_contents/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_mediums/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_mediums/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_sources/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_sources/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.utm_terms/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#utm_terms/2"},{"type":"module","title":"PlausibleWeb.AuthController","doc":"","ref":"PlausibleWeb.AuthController.html"},{"type":"function","title":"PlausibleWeb.AuthController.activate/2","doc":"","ref":"PlausibleWeb.AuthController.html#activate/2"},{"type":"function","title":"PlausibleWeb.AuthController.activate_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#activate_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.cancel_update_email/2","doc":"","ref":"PlausibleWeb.AuthController.html#cancel_update_email/2"},{"type":"function","title":"PlausibleWeb.AuthController.create_api_key/2","doc":"","ref":"PlausibleWeb.AuthController.html#create_api_key/2"},{"type":"function","title":"PlausibleWeb.AuthController.delete_api_key/2","doc":"","ref":"PlausibleWeb.AuthController.html#delete_api_key/2"},{"type":"function","title":"PlausibleWeb.AuthController.delete_me/2","doc":"","ref":"PlausibleWeb.AuthController.html#delete_me/2"},{"type":"function","title":"PlausibleWeb.AuthController.disable_2fa/2","doc":"","ref":"PlausibleWeb.AuthController.html#disable_2fa/2"},{"type":"function","title":"PlausibleWeb.AuthController.generate_2fa_recovery_codes/2","doc":"","ref":"PlausibleWeb.AuthController.html#generate_2fa_recovery_codes/2"},{"type":"function","title":"PlausibleWeb.AuthController.google_auth_callback/2","doc":"","ref":"PlausibleWeb.AuthController.html#google_auth_callback/2"},{"type":"function","title":"PlausibleWeb.AuthController.initiate_2fa_setup/2","doc":"","ref":"PlausibleWeb.AuthController.html#initiate_2fa_setup/2"},{"type":"function","title":"PlausibleWeb.AuthController.login/2","doc":"","ref":"PlausibleWeb.AuthController.html#login/2"},{"type":"function","title":"PlausibleWeb.AuthController.login_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#login_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.logout/2","doc":"","ref":"PlausibleWeb.AuthController.html#logout/2"},{"type":"function","title":"PlausibleWeb.AuthController.new_api_key/2","doc":"","ref":"PlausibleWeb.AuthController.html#new_api_key/2"},{"type":"function","title":"PlausibleWeb.AuthController.password_reset/2","doc":"","ref":"PlausibleWeb.AuthController.html#password_reset/2"},{"type":"function","title":"PlausibleWeb.AuthController.password_reset_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.password_reset_request/2","doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_request/2"},{"type":"function","title":"PlausibleWeb.AuthController.password_reset_request_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#password_reset_request_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.register/2","doc":"","ref":"PlausibleWeb.AuthController.html#register/2"},{"type":"function","title":"PlausibleWeb.AuthController.register_from_invitation/2","doc":"","ref":"PlausibleWeb.AuthController.html#register_from_invitation/2"},{"type":"function","title":"PlausibleWeb.AuthController.request_activation_code/2","doc":"","ref":"PlausibleWeb.AuthController.html#request_activation_code/2"},{"type":"function","title":"PlausibleWeb.AuthController.save_settings/2","doc":"","ref":"PlausibleWeb.AuthController.html#save_settings/2"},{"type":"function","title":"PlausibleWeb.AuthController.update_email/2","doc":"","ref":"PlausibleWeb.AuthController.html#update_email/2"},{"type":"function","title":"PlausibleWeb.AuthController.user_settings/2","doc":"","ref":"PlausibleWeb.AuthController.html#user_settings/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_recovery_code/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_recovery_code/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_recovery_code_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_recovery_code_form/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_setup/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_setup/2"},{"type":"function","title":"PlausibleWeb.AuthController.verify_2fa_setup_form/2","doc":"","ref":"PlausibleWeb.AuthController.html#verify_2fa_setup_form/2"},{"type":"module","title":"PlausibleWeb.AuthPlug","doc":"","ref":"PlausibleWeb.AuthPlug.html"},{"type":"function","title":"PlausibleWeb.AuthPlug.call/2","doc":"","ref":"PlausibleWeb.AuthPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.AuthPlug.init/1","doc":"","ref":"PlausibleWeb.AuthPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.AuthView","doc":"","ref":"PlausibleWeb.AuthView.html"},{"type":"function","title":"PlausibleWeb.AuthView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.AuthView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.AuthView.activate.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#activate.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.delimit_integer/1","doc":"","ref":"PlausibleWeb.AuthView.html#delimit_integer/1"},{"type":"function","title":"PlausibleWeb.AuthView.format_invoices/1","doc":"","ref":"PlausibleWeb.AuthView.html#format_invoices/1"},{"type":"function","title":"PlausibleWeb.AuthView.generate_2fa_recovery_codes.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#generate_2fa_recovery_codes.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.initiate_2fa_setup.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#initiate_2fa_setup.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.login_form.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#login_form.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.new_api_key.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#new_api_key.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.password_reset_form.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_form.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.password_reset_request_form.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_request_form.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.password_reset_request_success.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#password_reset_request_success.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.present_subscription_status/1","doc":"","ref":"PlausibleWeb.AuthView.html#present_subscription_status/1"},{"type":"function","title":"PlausibleWeb.AuthView.register_success.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#register_success.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.AuthView.html#render/2"},{"type":"function","title":"PlausibleWeb.AuthView.subscription_colors/1","doc":"","ref":"PlausibleWeb.AuthView.html#subscription_colors/1"},{"type":"function","title":"PlausibleWeb.AuthView.subscription_interval/1","doc":"","ref":"PlausibleWeb.AuthView.html#subscription_interval/1"},{"type":"function","title":"PlausibleWeb.AuthView.subscription_quota/2","doc":"","ref":"PlausibleWeb.AuthView.html#subscription_quota/2"},{"type":"function","title":"PlausibleWeb.AuthView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.AuthView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.AuthView.user_settings.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#user_settings.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.verify_2fa.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#verify_2fa.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.verify_2fa_recovery_code.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#verify_2fa_recovery_code.html/1"},{"type":"function","title":"PlausibleWeb.AuthView.verify_2fa_setup.html/1","doc":"","ref":"PlausibleWeb.AuthView.html#verify_2fa_setup.html/1"},{"type":"module","title":"PlausibleWeb.AuthorizeSiteAccess","doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html"},{"type":"function","title":"PlausibleWeb.AuthorizeSiteAccess.call/2","doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html#call/2"},{"type":"function","title":"PlausibleWeb.AuthorizeSiteAccess.init/1","doc":"","ref":"PlausibleWeb.AuthorizeSiteAccess.html#init/1"},{"type":"module","title":"PlausibleWeb.AuthorizeSitesApiPlug","doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html"},{"type":"function","title":"PlausibleWeb.AuthorizeSitesApiPlug.call/2","doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.AuthorizeSitesApiPlug.init/1","doc":"","ref":"PlausibleWeb.AuthorizeSitesApiPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.AuthorizeStatsApiPlug","doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html"},{"type":"function","title":"PlausibleWeb.AuthorizeStatsApiPlug.call/2","doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.AuthorizeStatsApiPlug.init/1","doc":"","ref":"PlausibleWeb.AuthorizeStatsApiPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.AvatarController","doc":"This module proxies requests to BASE_URL/avatar/:hash to www.gravatar.com/avatar/:hash.\n\nThe purpose is to make use of Gravatar's convenient avatar service without exposing information\nthat could be used for tracking the Plausible user. Compared to requesting the Gravatar directly\nfrom the browser, this proxy module protects the Plausible user from disclosing to Gravatar:\n1. The client IP address\n2. User-Agent\n3. Referer header which can be used to track which site the user is visiting (i.e. plausible.io or self-hosted URL)\n\nThe downside is the added latency from the request having to go through the Plausible server, rather than contacting the\nlocal CDN server operated by Gravatar's service.","ref":"PlausibleWeb.AvatarController.html"},{"type":"function","title":"PlausibleWeb.AvatarController.avatar/2","doc":"","ref":"PlausibleWeb.AvatarController.html#avatar/2"},{"type":"module","title":"PlausibleWeb.BillingController","doc":"","ref":"PlausibleWeb.BillingController.html"},{"type":"function","title":"PlausibleWeb.BillingController.change_plan/2","doc":"","ref":"PlausibleWeb.BillingController.html#change_plan/2"},{"type":"function","title":"PlausibleWeb.BillingController.change_plan_preview/2","doc":"","ref":"PlausibleWeb.BillingController.html#change_plan_preview/2"},{"type":"function","title":"PlausibleWeb.BillingController.choose_plan/2","doc":"","ref":"PlausibleWeb.BillingController.html#choose_plan/2"},{"type":"function","title":"PlausibleWeb.BillingController.ping_subscription/2","doc":"","ref":"PlausibleWeb.BillingController.html#ping_subscription/2"},{"type":"function","title":"PlausibleWeb.BillingController.upgrade_success/2","doc":"","ref":"PlausibleWeb.BillingController.html#upgrade_success/2"},{"type":"function","title":"PlausibleWeb.BillingController.upgrade_to_enterprise_plan/2","doc":"","ref":"PlausibleWeb.BillingController.html#upgrade_to_enterprise_plan/2"},{"type":"module","title":"PlausibleWeb.BillingView","doc":"","ref":"PlausibleWeb.BillingView.html"},{"type":"function","title":"PlausibleWeb.BillingView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.BillingView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.BillingView.change_enterprise_plan_contact_us.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#change_enterprise_plan_contact_us.html/1"},{"type":"function","title":"PlausibleWeb.BillingView.change_plan_preview.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#change_plan_preview.html/1"},{"type":"function","title":"PlausibleWeb.BillingView.choose_plan.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#choose_plan.html/1"},{"type":"function","title":"PlausibleWeb.BillingView.present_currency/1","doc":"","ref":"PlausibleWeb.BillingView.html#present_currency/1"},{"type":"function","title":"PlausibleWeb.BillingView.present_date/1","doc":"","ref":"PlausibleWeb.BillingView.html#present_date/1"},{"type":"function","title":"PlausibleWeb.BillingView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.BillingView.html#render/2"},{"type":"function","title":"PlausibleWeb.BillingView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.BillingView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.BillingView.upgrade_success.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#upgrade_success.html/1"},{"type":"function","title":"PlausibleWeb.BillingView.upgrade_to_enterprise_plan.html/1","doc":"","ref":"PlausibleWeb.BillingView.html#upgrade_to_enterprise_plan.html/1"},{"type":"module","title":"PlausibleWeb.CRMAuthPlug","doc":"","ref":"PlausibleWeb.CRMAuthPlug.html"},{"type":"function","title":"PlausibleWeb.CRMAuthPlug.call/2","doc":"","ref":"PlausibleWeb.CRMAuthPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.CRMAuthPlug.init/1","doc":"","ref":"PlausibleWeb.CRMAuthPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.Captcha","doc":"","ref":"PlausibleWeb.Captcha.html"},{"type":"function","title":"PlausibleWeb.Captcha.enabled?/0","doc":"","ref":"PlausibleWeb.Captcha.html#enabled?/0"},{"type":"function","title":"PlausibleWeb.Captcha.sitekey/0","doc":"","ref":"PlausibleWeb.Captcha.html#sitekey/0"},{"type":"function","title":"PlausibleWeb.Captcha.verify/1","doc":"","ref":"PlausibleWeb.Captcha.html#verify/1"},{"type":"module","title":"PlausibleWeb.Components.Billing.PlanBenefits","doc":"This module exposes functions for rendering and returning plan\nbenefits for Growth, Business, and Enterprise plans.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html"},{"type":"function","title":"PlausibleWeb.Components.Billing.PlanBenefits.for_business/2","doc":"Returns Business benefits for the given Business plan.\n\nA second argument is also required - list of Growth benefits. This\nis because we don't want to list the same benefits in both Growth\nand Business. Everything in Growth is also included in Business.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#for_business/2"},{"type":"function","title":"PlausibleWeb.Components.Billing.PlanBenefits.for_enterprise/1","doc":"This function only takes a list of business benefits. Since all\nlimits and features of enterprise plans are configurable, we can\nsay on the upgrade page that enterprise plans include everything\nin Business.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#for_enterprise/1"},{"type":"function","title":"PlausibleWeb.Components.Billing.PlanBenefits.for_growth/1","doc":"This function takes a growth plan and returns a list representing\nthe different benefits a user gets when subscribing to this plan.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#for_growth/1"},{"type":"function","title":"PlausibleWeb.Components.Billing.PlanBenefits.render/1","doc":"This function takes a list of benefits returned by either one of:\n\n* `for_growth/1`\n* `for_business/2`\n* `for_enterprise/1`.\n\nand renders them as HTML.\n\nThe benefits in the given list can be either strings or functions\nreturning a Phoenix component. This allows, for example, to render\nlinks within the plan benefit text.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Billing.PlanBenefits.render/1","doc":"* `benefits` (`:list`) (required)\n* `class` (`:string`) - Defaults to `nil`.","ref":"PlausibleWeb.Components.Billing.PlanBenefits.html#render/1-attributes"},{"type":"module","title":"PlausibleWeb.Components.Generic","doc":"Generic reusable components","ref":"PlausibleWeb.Components.Generic.html"},{"type":"function","title":"PlausibleWeb.Components.Generic.button/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.button/1","doc":"* `type` (`:string`) - Defaults to `\"button\"`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* `disabled` (`:boolean`) - Defaults to `false`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#button/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.button/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#button/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.button_link/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#button_link/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.button_link/1","doc":"* `href` (`:string`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#button_link/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.button_link/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#button_link/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.docs_info/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#docs_info/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.docs_info/1","doc":"* `slug` (`:string`) (required)","ref":"PlausibleWeb.Components.Generic.html#docs_info/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.Generic.dropdown/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#dropdown/1"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.dropdown/1","doc":"* `button` (required) - Accepts attributes:\n\n * `class` (`:string`)\n* `panel` (required) - Accepts attributes:\n\n * `class` (`:string`)","ref":"PlausibleWeb.Components.Generic.html#dropdown/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.dropdown_link/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#dropdown_link/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.dropdown_link/1","doc":"* `href` (`:string`) (required)\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#dropdown_link/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.dropdown_link/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#dropdown_link/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.notice/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#notice/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.notice/1","doc":"* `title` (`:any`) - Defaults to `nil`.\n* `size` (`:atom`) - Defaults to `:sm`.\n* `theme` (`:atom`) - Defaults to `:yellow`.\n* `dismissable_id` (`:any`) - Defaults to `nil`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#notice/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.notice/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#notice/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.spinner/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#spinner/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.spinner/1","doc":"* `class` (`:any`) - Defaults to `\"\"`.","ref":"PlausibleWeb.Components.Generic.html#spinner/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.Generic.styled_link/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#styled_link/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.styled_link/1","doc":"* `id` (`:any`) - Defaults to `nil`.\n* `href` (`:string`) (required)\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* `class` (`:string`) - Defaults to `\"\"`.","ref":"PlausibleWeb.Components.Generic.html#styled_link/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.styled_link/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#styled_link/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.unstyled_link/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#unstyled_link/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.unstyled_link/1","doc":"* `href` (`:string`) (required)\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* `id` (`:any`) - Defaults to `nil`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#unstyled_link/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.unstyled_link/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#unstyled_link/1-slots"},{"type":"module","title":"PlausibleWeb.Components.Google","doc":"Google-related components","ref":"PlausibleWeb.Components.Google.html"},{"type":"function","title":"PlausibleWeb.Components.Google.button/1","doc":"","ref":"PlausibleWeb.Components.Google.html#button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Google.button/1","doc":"* `to` (`:string`) (required)\n* `id` (`:string`) (required)","ref":"PlausibleWeb.Components.Google.html#button/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.Google.logo/1","doc":"","ref":"PlausibleWeb.Components.Google.html#logo/1"},{"type":"module","title":"PlausibleWeb.Components.Settings","doc":"An umbrella module for the Integrations settings section","ref":"PlausibleWeb.Components.Settings.html"},{"type":"function","title":"PlausibleWeb.Components.Settings.settings_google_import/1","doc":"","ref":"PlausibleWeb.Components.Settings.html#settings_google_import/1"},{"type":"function","title":"PlausibleWeb.Components.Settings.settings_search_console/1","doc":"","ref":"PlausibleWeb.Components.Settings.html#settings_search_console/1"},{"type":"module","title":"PlausibleWeb.Components.Site.Feature","doc":"Phoenix Component for rendering a user-facing feature toggle\ncapable of flipping booleans in `Plausible.Site` via the `toggle_feature` controller action.","ref":"PlausibleWeb.Components.Site.Feature.html"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Components.Site.Feature.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Components.Site.Feature.html#render/2"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.target/4","doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#target/4"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.Components.Site.Feature.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.Components.Site.Feature.toggle/1","doc":"","ref":"PlausibleWeb.Components.Site.Feature.html#toggle/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Site.Feature.toggle/1","doc":"* `site` (`Plausible.Site`) (required)\n* `feature_mod` (`:atom`) (required) - Must be one of `Plausible.Billing.Feature.Goals`, `Plausible.Billing.Feature.StatsAPI`, `Plausible.Billing.Feature.Props`, `Plausible.Billing.Feature.Funnels`, or `Plausible.Billing.Feature.RevenueGoals`.\n* `conn` (`Plug.Conn`) (required)","ref":"PlausibleWeb.Components.Site.Feature.html#toggle/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Site.Feature.toggle/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Site.Feature.html#toggle/1-slots"},{"type":"module","title":"PlausibleWeb.Components.TwoFactor","doc":"Reusable components specific to 2FA","ref":"PlausibleWeb.Components.TwoFactor.html"},{"type":"function","title":"PlausibleWeb.Components.TwoFactor.modal/1","doc":"","ref":"PlausibleWeb.Components.TwoFactor.html#modal/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.TwoFactor.modal/1","doc":"* `id` (`:string`) (required)\n* `state_param` (`:string`) (required)\n* `form_data` (`:any`) (required)\n* `form_target` (`:string`) (required)\n* `onsubmit` (`:string`) - Defaults to `nil`.\n* `title` (`:string`) (required)","ref":"PlausibleWeb.Components.TwoFactor.html#modal/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.TwoFactor.modal/1","doc":"* `icon` (required)\n* `inner_block` (required)\n* `buttons` (required)","ref":"PlausibleWeb.Components.TwoFactor.html#modal/1-slots"},{"type":"function","title":"PlausibleWeb.Components.TwoFactor.qr_code/1","doc":"","ref":"PlausibleWeb.Components.TwoFactor.html#qr_code/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.TwoFactor.qr_code/1","doc":"* `text` (`:string`) (required)\n* `scale` (`:integer`) - Defaults to `4`.","ref":"PlausibleWeb.Components.TwoFactor.html#qr_code/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.TwoFactor.verify_2fa_input/1","doc":"","ref":"PlausibleWeb.Components.TwoFactor.html#verify_2fa_input/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.TwoFactor.verify_2fa_input/1","doc":"* `id` (`:string`) - Defaults to `\"verify-button\"`.\n* `form` (`:any`) (required)\n* `field` (`:any`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.","ref":"PlausibleWeb.Components.TwoFactor.html#verify_2fa_input/1-attributes"},{"type":"module","title":"PlausibleWeb.ConnCase","doc":"This module defines the test case to be used by\ntests that require setting up a connection.\n\nSuch tests rely on `Phoenix.ConnTest` and also\nimport other functionality to make it easier\nto build common data structures and query the data layer.\n\nFinally, if the test case interacts with the database,\nit cannot be async. For this reason, every test runs\ninside a transaction which is reset at the beginning\nof the test unless the test case is marked as async.","ref":"PlausibleWeb.ConnCase.html"},{"type":"module","title":"PlausibleWeb.ControllerHelpers","doc":"","ref":"PlausibleWeb.ControllerHelpers.html"},{"type":"function","title":"PlausibleWeb.ControllerHelpers.render_error/2","doc":"","ref":"PlausibleWeb.ControllerHelpers.html#render_error/2"},{"type":"function","title":"PlausibleWeb.ControllerHelpers.render_error/3","doc":"","ref":"PlausibleWeb.ControllerHelpers.html#render_error/3"},{"type":"module","title":"PlausibleWeb.Controllers.API.Revenue","doc":"Revenue specific functions for the API scope","ref":"PlausibleWeb.Controllers.API.Revenue.html"},{"type":"function","title":"PlausibleWeb.Controllers.API.Revenue.format_money/1","doc":"","ref":"PlausibleWeb.Controllers.API.Revenue.html#format_money/1"},{"type":"function","title":"PlausibleWeb.Controllers.API.Revenue.format_revenue_metric/1","doc":"","ref":"PlausibleWeb.Controllers.API.Revenue.html#format_revenue_metric/1"},{"type":"module","title":"PlausibleWeb.Dogfood","doc":"Plausible tracking itself functions","ref":"PlausibleWeb.Dogfood.html"},{"type":"function","title":"PlausibleWeb.Dogfood.api_destination/0","doc":"Temporary override to do more testing of the new ingest.plausible.io endpoint for accepting events. In staging and locally\nwill fall back to staging.plausible.io/api/event and localhost:8000/api/event respectively.","ref":"PlausibleWeb.Dogfood.html#api_destination/0"},{"type":"function","title":"PlausibleWeb.Dogfood.domain/1","doc":"","ref":"PlausibleWeb.Dogfood.html#domain/1"},{"type":"function","title":"PlausibleWeb.Dogfood.script_url/0","doc":"","ref":"PlausibleWeb.Dogfood.html#script_url/0"},{"type":"module","title":"PlausibleWeb.Email","doc":"","ref":"PlausibleWeb.Email.html"},{"type":"function","title":"PlausibleWeb.Email.activation_email/2","doc":"","ref":"PlausibleWeb.Email.html#activation_email/2"},{"type":"function","title":"PlausibleWeb.Email.approaching_accept_traffic_until/1","doc":"","ref":"PlausibleWeb.Email.html#approaching_accept_traffic_until/1"},{"type":"function","title":"PlausibleWeb.Email.approaching_accept_traffic_until_tomorrow/1","doc":"","ref":"PlausibleWeb.Email.html#approaching_accept_traffic_until_tomorrow/1"},{"type":"function","title":"PlausibleWeb.Email.base_email/0","doc":"","ref":"PlausibleWeb.Email.html#base_email/0"},{"type":"function","title":"PlausibleWeb.Email.base_email/1","doc":"","ref":"PlausibleWeb.Email.html#base_email/1"},{"type":"function","title":"PlausibleWeb.Email.cancellation_email/1","doc":"","ref":"PlausibleWeb.Email.html#cancellation_email/1"},{"type":"function","title":"PlausibleWeb.Email.check_stats_email/1","doc":"","ref":"PlausibleWeb.Email.html#check_stats_email/1"},{"type":"function","title":"PlausibleWeb.Email.create_site_email/1","doc":"","ref":"PlausibleWeb.Email.html#create_site_email/1"},{"type":"function","title":"PlausibleWeb.Email.dashboard_locked/3","doc":"","ref":"PlausibleWeb.Email.html#dashboard_locked/3"},{"type":"function","title":"PlausibleWeb.Email.enterprise_over_limit_internal_email/4","doc":"","ref":"PlausibleWeb.Email.html#enterprise_over_limit_internal_email/4"},{"type":"function","title":"PlausibleWeb.Email.error_report/3","doc":"","ref":"PlausibleWeb.Email.html#error_report/3"},{"type":"function","title":"PlausibleWeb.Email.existing_user_invitation/1","doc":"","ref":"PlausibleWeb.Email.html#existing_user_invitation/1"},{"type":"function","title":"PlausibleWeb.Email.import_failure/2","doc":"","ref":"PlausibleWeb.Email.html#import_failure/2"},{"type":"function","title":"PlausibleWeb.Email.import_success/2","doc":"","ref":"PlausibleWeb.Email.html#import_success/2"},{"type":"function","title":"PlausibleWeb.Email.invitation_accepted/1","doc":"","ref":"PlausibleWeb.Email.html#invitation_accepted/1"},{"type":"function","title":"PlausibleWeb.Email.invitation_rejected/1","doc":"","ref":"PlausibleWeb.Email.html#invitation_rejected/1"},{"type":"function","title":"PlausibleWeb.Email.mailer_email_from/0","doc":"","ref":"PlausibleWeb.Email.html#mailer_email_from/0"},{"type":"function","title":"PlausibleWeb.Email.new_user_invitation/1","doc":"","ref":"PlausibleWeb.Email.html#new_user_invitation/1"},{"type":"function","title":"PlausibleWeb.Email.over_limit_email/3","doc":"","ref":"PlausibleWeb.Email.html#over_limit_email/3"},{"type":"function","title":"PlausibleWeb.Email.ownership_transfer_accepted/1","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_accepted/1"},{"type":"function","title":"PlausibleWeb.Email.ownership_transfer_rejected/1","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_rejected/1"},{"type":"function","title":"PlausibleWeb.Email.ownership_transfer_request/2","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_request/2"},{"type":"function","title":"PlausibleWeb.Email.password_reset_email/2","doc":"","ref":"PlausibleWeb.Email.html#password_reset_email/2"},{"type":"function","title":"PlausibleWeb.Email.priority_email/0","doc":"Unlike the default 'base' emails, priority emails cannot be unsubscribed from. This is achieved\n by sending them through a dedicated 'priority' message stream in Postmark.","ref":"PlausibleWeb.Email.html#priority_email/0"},{"type":"function","title":"PlausibleWeb.Email.priority_email/1","doc":"","ref":"PlausibleWeb.Email.html#priority_email/1"},{"type":"function","title":"PlausibleWeb.Email.render/3","doc":"Render an Phoenix template and set the body on the email.\n\nPass an atom as the template name (:welcome_email) to render HTML *and* plain\ntext emails. Use a string if you only want to render one type, e.g.\n\"welcome_email.text\" or \"welcome_email.html\". Scroll to the top for more examples.","ref":"PlausibleWeb.Email.html#render/3"},{"type":"function","title":"PlausibleWeb.Email.site_member_removed/1","doc":"","ref":"PlausibleWeb.Email.html#site_member_removed/1"},{"type":"function","title":"PlausibleWeb.Email.site_setup_help/2","doc":"","ref":"PlausibleWeb.Email.html#site_setup_help/2"},{"type":"function","title":"PlausibleWeb.Email.site_setup_success/2","doc":"","ref":"PlausibleWeb.Email.html#site_setup_success/2"},{"type":"function","title":"PlausibleWeb.Email.spike_notification/5","doc":"","ref":"PlausibleWeb.Email.html#spike_notification/5"},{"type":"function","title":"PlausibleWeb.Email.stats_report/2","doc":"","ref":"PlausibleWeb.Email.html#stats_report/2"},{"type":"function","title":"PlausibleWeb.Email.trial_one_week_reminder/1","doc":"","ref":"PlausibleWeb.Email.html#trial_one_week_reminder/1"},{"type":"function","title":"PlausibleWeb.Email.trial_over_email/1","doc":"","ref":"PlausibleWeb.Email.html#trial_over_email/1"},{"type":"function","title":"PlausibleWeb.Email.trial_upgrade_email/3","doc":"","ref":"PlausibleWeb.Email.html#trial_upgrade_email/3"},{"type":"function","title":"PlausibleWeb.Email.two_factor_disabled_email/1","doc":"","ref":"PlausibleWeb.Email.html#two_factor_disabled_email/1"},{"type":"function","title":"PlausibleWeb.Email.two_factor_enabled_email/1","doc":"","ref":"PlausibleWeb.Email.html#two_factor_enabled_email/1"},{"type":"function","title":"PlausibleWeb.Email.welcome_email/1","doc":"","ref":"PlausibleWeb.Email.html#welcome_email/1"},{"type":"function","title":"PlausibleWeb.Email.yearly_expiration_notification/1","doc":"","ref":"PlausibleWeb.Email.html#yearly_expiration_notification/1"},{"type":"function","title":"PlausibleWeb.Email.yearly_renewal_notification/1","doc":"","ref":"PlausibleWeb.Email.html#yearly_renewal_notification/1"},{"type":"module","title":"PlausibleWeb.EmailView","doc":"","ref":"PlausibleWeb.EmailView.html"},{"type":"function","title":"PlausibleWeb.EmailView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.EmailView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.EmailView.activation_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#activation_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.approaching_accept_traffic_until.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#approaching_accept_traffic_until.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.cancellation_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#cancellation_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.check_stats_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#check_stats_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.create_site_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#create_site_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.dashboard_locked.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#dashboard_locked.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.date_format/1","doc":"","ref":"PlausibleWeb.EmailView.html#date_format/1"},{"type":"function","title":"PlausibleWeb.EmailView.enterprise_over_limit_internal.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#enterprise_over_limit_internal.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.error_report_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#error_report_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.existing_user_invitation.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#existing_user_invitation.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.google_analytics_import.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#google_analytics_import.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.greet_recipient/1","doc":"","ref":"PlausibleWeb.EmailView.html#greet_recipient/1"},{"type":"function","title":"PlausibleWeb.EmailView.invitation_accepted.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#invitation_accepted.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.invitation_rejected.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#invitation_rejected.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.new_user_invitation.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#new_user_invitation.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.over_limit.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#over_limit.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.ownership_transfer_accepted.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_accepted.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.ownership_transfer_rejected.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_rejected.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.ownership_transfer_request.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#ownership_transfer_request.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.password_reset_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#password_reset_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.plausible_url/0","doc":"","ref":"PlausibleWeb.EmailView.html#plausible_url/0"},{"type":"function","title":"PlausibleWeb.EmailView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.EmailView.html#render/2"},{"type":"function","title":"PlausibleWeb.EmailView.sentry_link/2","doc":"","ref":"PlausibleWeb.EmailView.html#sentry_link/2"},{"type":"function","title":"PlausibleWeb.EmailView.site_member_removed.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#site_member_removed.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.site_setup_help_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#site_setup_help_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.site_setup_success_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#site_setup_success_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.spike_notification.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#spike_notification.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.EmailView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.EmailView.trial_one_week_reminder.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#trial_one_week_reminder.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.trial_over_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#trial_over_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.trial_upgrade_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#trial_upgrade_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.two_factor_disabled_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#two_factor_disabled_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.two_factor_enabled_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#two_factor_enabled_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.welcome_email.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#welcome_email.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.yearly_expiration_notification.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#yearly_expiration_notification.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.yearly_renewal_notification.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#yearly_renewal_notification.html/1"},{"type":"module","title":"PlausibleWeb.Endpoint","doc":"","ref":"PlausibleWeb.Endpoint.html"},{"type":"function","title":"PlausibleWeb.Endpoint.broadcast/3","doc":"","ref":"PlausibleWeb.Endpoint.html#broadcast/3"},{"type":"function","title":"PlausibleWeb.Endpoint.broadcast!/3","doc":"","ref":"PlausibleWeb.Endpoint.html#broadcast!/3"},{"type":"function","title":"PlausibleWeb.Endpoint.broadcast_from/4","doc":"","ref":"PlausibleWeb.Endpoint.html#broadcast_from/4"},{"type":"function","title":"PlausibleWeb.Endpoint.broadcast_from!/4","doc":"","ref":"PlausibleWeb.Endpoint.html#broadcast_from!/4"},{"type":"function","title":"PlausibleWeb.Endpoint.call/2","doc":"","ref":"PlausibleWeb.Endpoint.html#call/2"},{"type":"function","title":"PlausibleWeb.Endpoint.child_spec/1","doc":"Returns the child specification to start the endpoint\nunder a supervision tree.","ref":"PlausibleWeb.Endpoint.html#child_spec/1"},{"type":"function","title":"PlausibleWeb.Endpoint.config/2","doc":"Returns the endpoint configuration for `key`\n\nReturns `default` if the key does not exist.","ref":"PlausibleWeb.Endpoint.html#config/2"},{"type":"function","title":"PlausibleWeb.Endpoint.config_change/2","doc":"Reloads the configuration given the application environment changes.","ref":"PlausibleWeb.Endpoint.html#config_change/2"},{"type":"function","title":"PlausibleWeb.Endpoint.host/0","doc":"Returns the host for the given endpoint.","ref":"PlausibleWeb.Endpoint.html#host/0"},{"type":"function","title":"PlausibleWeb.Endpoint.init/1","doc":"","ref":"PlausibleWeb.Endpoint.html#init/1"},{"type":"function","title":"PlausibleWeb.Endpoint.local_broadcast/3","doc":"","ref":"PlausibleWeb.Endpoint.html#local_broadcast/3"},{"type":"function","title":"PlausibleWeb.Endpoint.local_broadcast_from/4","doc":"","ref":"PlausibleWeb.Endpoint.html#local_broadcast_from/4"},{"type":"function","title":"PlausibleWeb.Endpoint.path/1","doc":"Generates the path information when routing to this endpoint.","ref":"PlausibleWeb.Endpoint.html#path/1"},{"type":"function","title":"PlausibleWeb.Endpoint.runtime_session/2","doc":"","ref":"PlausibleWeb.Endpoint.html#runtime_session/2"},{"type":"function","title":"PlausibleWeb.Endpoint.runtime_session_opts/0","doc":"","ref":"PlausibleWeb.Endpoint.html#runtime_session_opts/0"},{"type":"function","title":"PlausibleWeb.Endpoint.script_name/0","doc":"Generates the script name.","ref":"PlausibleWeb.Endpoint.html#script_name/0"},{"type":"function","title":"PlausibleWeb.Endpoint.secure_cookie?/0","doc":"","ref":"PlausibleWeb.Endpoint.html#secure_cookie?/0"},{"type":"function","title":"PlausibleWeb.Endpoint.start_link/1","doc":"Starts the endpoint supervision tree.\n\nAll other options are merged into the endpoint configuration.","ref":"PlausibleWeb.Endpoint.html#start_link/1"},{"type":"function","title":"PlausibleWeb.Endpoint.static_integrity/1","doc":"Generates a base64-encoded cryptographic hash (sha512) to a static file\nin `priv/static`. Meant to be used for Subresource Integrity with CDNs.","ref":"PlausibleWeb.Endpoint.html#static_integrity/1"},{"type":"function","title":"PlausibleWeb.Endpoint.static_lookup/1","doc":"Returns a two item tuple with the first item being the `static_path`\nand the second item being the `static_integrity`.","ref":"PlausibleWeb.Endpoint.html#static_lookup/1"},{"type":"function","title":"PlausibleWeb.Endpoint.static_path/1","doc":"Generates a route to a static file in `priv/static`.","ref":"PlausibleWeb.Endpoint.html#static_path/1"},{"type":"function","title":"PlausibleWeb.Endpoint.static_url/0","doc":"Generates the static URL without any path information.\n\nIt uses the configuration under `:static_url` to generate\nsuch. It falls back to `:url` if `:static_url` is not set.","ref":"PlausibleWeb.Endpoint.html#static_url/0"},{"type":"function","title":"PlausibleWeb.Endpoint.struct_url/0","doc":"Generates the endpoint base URL but as a `URI` struct.\n\nIt uses the configuration under `:url` to generate such.\nUseful for manipulating the URL data and passing it to\nURL helpers.","ref":"PlausibleWeb.Endpoint.html#struct_url/0"},{"type":"function","title":"PlausibleWeb.Endpoint.subscribe/2","doc":"","ref":"PlausibleWeb.Endpoint.html#subscribe/2"},{"type":"function","title":"PlausibleWeb.Endpoint.unsubscribe/1","doc":"","ref":"PlausibleWeb.Endpoint.html#unsubscribe/1"},{"type":"function","title":"PlausibleWeb.Endpoint.url/0","doc":"Generates the endpoint base URL without any path information.\n\nIt uses the configuration under `:url` to generate such.","ref":"PlausibleWeb.Endpoint.html#url/0"},{"type":"function","title":"PlausibleWeb.Endpoint.websocket_url/0","doc":"","ref":"PlausibleWeb.Endpoint.html#websocket_url/0"},{"type":"module","title":"PlausibleWeb.ErrorHelpers","doc":"","ref":"PlausibleWeb.ErrorHelpers.html"},{"type":"function","title":"PlausibleWeb.ErrorHelpers.error_tag/2","doc":"","ref":"PlausibleWeb.ErrorHelpers.html#error_tag/2"},{"type":"function","title":"PlausibleWeb.ErrorHelpers.translate_error/1","doc":"","ref":"PlausibleWeb.ErrorHelpers.html#translate_error/1"},{"type":"module","title":"PlausibleWeb.ErrorReportController","doc":"","ref":"PlausibleWeb.ErrorReportController.html"},{"type":"function","title":"PlausibleWeb.ErrorReportController.submit_error_report/2","doc":"","ref":"PlausibleWeb.ErrorReportController.html#submit_error_report/2"},{"type":"module","title":"PlausibleWeb.ErrorView","doc":"","ref":"PlausibleWeb.ErrorView.html"},{"type":"function","title":"PlausibleWeb.ErrorView.404_error.html/1","doc":"","ref":"PlausibleWeb.ErrorView.html#404_error.html/1"},{"type":"function","title":"PlausibleWeb.ErrorView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.ErrorView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.ErrorView.generic_error.html/1","doc":"","ref":"PlausibleWeb.ErrorView.html#generic_error.html/1"},{"type":"function","title":"PlausibleWeb.ErrorView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.ErrorView.html#render/2"},{"type":"function","title":"PlausibleWeb.ErrorView.server_error.html/1","doc":"","ref":"PlausibleWeb.ErrorView.html#server_error.html/1"},{"type":"function","title":"PlausibleWeb.ErrorView.server_error_report_thanks.html/1","doc":"","ref":"PlausibleWeb.ErrorView.html#server_error_report_thanks.html/1"},{"type":"function","title":"PlausibleWeb.ErrorView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.ErrorView.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Favicon","doc":"A Plug that fetches favicon images from DuckDuckGo and returns them\nto the Plausible frontend.\n\nThe proxying is there so we can reduce the number of third-party domains that\nthe browser clients need to connect to. Our goal is to have 0 third-party domain\nconnections on the website for privacy reasons.\n\nThis module also maps between categorized sources and their respective URLs for favicons.\nWhat does that mean exactly? During ingestion we use `PlausibleWeb.RefInspector.parse/1` to\ncategorize our referrer sources like so:\n\ngoogle.com -> Google\ngoogle.co.uk -> Google\ngoogle.com.au -> Google\n\nSo when we show Google as a source in the dashboard, the request to this plug will come as:\nhttps://plausible/io/favicon/sources/Google\n\nNow, when we want to show a favicon for Google, we need to convert Google -> google.com or\nsome other hostname owned by Google:\nhttps://icons.duckduckgo.com/ip3/google.com.ico\n\nThe mapping from source category -> source hostname is stored in \"priv/referer_favicon_domains.json\" and\nmanaged by `Mix.Tasks.GenerateReferrerFavicons.run/1`","ref":"PlausibleWeb.Favicon.html"},{"type":"function","title":"PlausibleWeb.Favicon.call/2","doc":"Proxies HTTP request to DuckDuckGo favicon service. Swallows hop-by-hop HTTP\nheaders that should not be forwarded as defined in [RFC 2616](https://www.rfc-editor.org/rfc/rfc2616#section-13.5.1)","ref":"PlausibleWeb.Favicon.html#call/2"},{"type":"function","title":"Placeholder - PlausibleWeb.Favicon.call/2","doc":"Cases where we show a placeholder icon instead:\n\n1. In case of network error to DuckDuckGo\n2. In case of non-2xx status code from DuckDuckGo\n3. In case of broken image response body from DuckDuckGo\n\nI'm not sure why DDG sometimes returns a broken PNG image in their response\nbut we filter that out. When the icon request fails, we show a placeholder\nfavicon instead. The placeholder is an emoji from\n[https://favicon.io/emoji-favicons/](https://favicon.io/emoji-favicons/)\n\nDuckDuckGo favicon service has some issues with [SVG favicons](https://css-tricks.com/svg-favicons-and-all-the-fun-things-we-can-do-with-them/).\nFor some reason, they return them with `content-type=image/x-icon` whereas SVG\nicons should be returned with `content-type=image/svg+xml`. This Plug detects\nwhen the response body starts with ` People. It's important to enforce permissions in this controller.\n\n Owner - Can manage users, can trigger a 'transfer ownership' request\n Admin - Can manage users\n Viewer - Can not access user management settings\n Anyone - Can accept invitations\n\n Everything else should be explicitly disallowed.","ref":"PlausibleWeb.Site.MembershipController.html"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.invite_member/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#invite_member/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.invite_member_form/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#invite_member_form/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.remove_member/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#remove_member/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.transfer_ownership/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#transfer_ownership/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.transfer_ownership_form/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#transfer_ownership_form/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipController.update_role/2","doc":"Updates the role of a user. The user being updated could be the same or different from the user taking\n the action. When updating the role, it's important to enforce permissions:\n\n Owner - Can update anyone's role except for themselves. If they want to change their own role, they have to use the 'transfer ownership' feature.\n Admin - Can update anyone's role except for owners. Can downgrade their own access to 'viewer'. Can promote a viewer to admin.","ref":"PlausibleWeb.Site.MembershipController.html#update_role/2"},{"type":"module","title":"PlausibleWeb.Site.MembershipView","doc":"","ref":"PlausibleWeb.Site.MembershipView.html"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Site.MembershipView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.invite_member_form.html/1","doc":"","ref":"PlausibleWeb.Site.MembershipView.html#invite_member_form.html/1"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Site.MembershipView.html#render/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.Site.MembershipView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.Site.MembershipView.transfer_ownership_form.html/1","doc":"","ref":"PlausibleWeb.Site.MembershipView.html#transfer_ownership_form.html/1"},{"type":"module","title":"PlausibleWeb.SiteController","doc":"","ref":"PlausibleWeb.SiteController.html"},{"type":"function","title":"PlausibleWeb.SiteController.add_monthly_report_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_monthly_report_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.add_snippet/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_snippet/2"},{"type":"function","title":"PlausibleWeb.SiteController.add_snippet_after_domain_change/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_snippet_after_domain_change/2"},{"type":"function","title":"PlausibleWeb.SiteController.add_spike_notification_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_spike_notification_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.add_weekly_report_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_weekly_report_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.change_domain/2","doc":"","ref":"PlausibleWeb.SiteController.html#change_domain/2"},{"type":"function","title":"PlausibleWeb.SiteController.change_domain_submit/2","doc":"","ref":"PlausibleWeb.SiteController.html#change_domain_submit/2"},{"type":"function","title":"PlausibleWeb.SiteController.create_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#create_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.create_site/2","doc":"","ref":"PlausibleWeb.SiteController.html#create_site/2"},{"type":"function","title":"PlausibleWeb.SiteController.delete_google_auth/2","doc":"","ref":"PlausibleWeb.SiteController.html#delete_google_auth/2"},{"type":"function","title":"PlausibleWeb.SiteController.delete_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#delete_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.delete_site/2","doc":"","ref":"PlausibleWeb.SiteController.html#delete_site/2"},{"type":"function","title":"PlausibleWeb.SiteController.disable_monthly_report/2","doc":"","ref":"PlausibleWeb.SiteController.html#disable_monthly_report/2"},{"type":"function","title":"PlausibleWeb.SiteController.disable_spike_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#disable_spike_notification/2"},{"type":"function","title":"PlausibleWeb.SiteController.disable_weekly_report/2","doc":"","ref":"PlausibleWeb.SiteController.html#disable_weekly_report/2"},{"type":"function","title":"PlausibleWeb.SiteController.edit_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#edit_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.enable_monthly_report/2","doc":"","ref":"PlausibleWeb.SiteController.html#enable_monthly_report/2"},{"type":"function","title":"PlausibleWeb.SiteController.enable_spike_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#enable_spike_notification/2"},{"type":"function","title":"PlausibleWeb.SiteController.enable_weekly_report/2","doc":"","ref":"PlausibleWeb.SiteController.html#enable_weekly_report/2"},{"type":"function","title":"PlausibleWeb.SiteController.forget_imported/2","doc":"","ref":"PlausibleWeb.SiteController.html#forget_imported/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google_confirm/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_confirm/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google_user_metric_notice/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_user_metric_notice/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google_view_id/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_view_id/2"},{"type":"function","title":"PlausibleWeb.SiteController.import_from_google_view_id_form/2","doc":"","ref":"PlausibleWeb.SiteController.html#import_from_google_view_id_form/2"},{"type":"function","title":"PlausibleWeb.SiteController.make_private/2","doc":"","ref":"PlausibleWeb.SiteController.html#make_private/2"},{"type":"function","title":"PlausibleWeb.SiteController.make_public/2","doc":"","ref":"PlausibleWeb.SiteController.html#make_public/2"},{"type":"function","title":"PlausibleWeb.SiteController.new/2","doc":"","ref":"PlausibleWeb.SiteController.html#new/2"},{"type":"function","title":"PlausibleWeb.SiteController.new_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#new_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.remove_monthly_report_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#remove_monthly_report_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.remove_spike_notification_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#remove_spike_notification_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.remove_weekly_report_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#remove_weekly_report_recipient/2"},{"type":"function","title":"PlausibleWeb.SiteController.reset_stats/2","doc":"","ref":"PlausibleWeb.SiteController.html#reset_stats/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_danger_zone/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_danger_zone/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_email_reports/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_email_reports/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_funnels/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_funnels/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_general/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_general/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_goals/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_goals/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_integrations/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_integrations/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_people/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_people/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_props/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_props/2"},{"type":"function","title":"PlausibleWeb.SiteController.settings_visibility/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_visibility/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_feature_visibility/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_feature_visibility/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_google_auth/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_google_auth/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_settings/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_settings/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_shared_link/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_shared_link/2"},{"type":"function","title":"PlausibleWeb.SiteController.update_spike_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_spike_notification/2"},{"type":"module","title":"PlausibleWeb.SiteView","doc":"","ref":"PlausibleWeb.SiteView.html"},{"type":"function","title":"PlausibleWeb.SiteView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.SiteView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.SiteView.change_domain.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#change_domain.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.edit_shared_link.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#edit_shared_link.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.import_from_google_confirm.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_confirm.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.import_from_google_user_metric_form.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_user_metric_form.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.import_from_google_view_id_form.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#import_from_google_view_id_form.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.new.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#new.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.new_shared_link.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#new_shared_link.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.plausible_url/0","doc":"","ref":"PlausibleWeb.SiteView.html#plausible_url/0"},{"type":"function","title":"PlausibleWeb.SiteView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.SiteView.html#render/2"},{"type":"function","title":"PlausibleWeb.SiteView.render_snippet/1","doc":"","ref":"PlausibleWeb.SiteView.html#render_snippet/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_danger_zone.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_danger_zone.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_email_reports.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_email_reports.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_funnels.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_funnels.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_general.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_general.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_goals.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_goals.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_google_import.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_google_import.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_integrations.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_integrations.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_people.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_people.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_props.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_props.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_search_console.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_search_console.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.settings_visibility.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_visibility.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.shared_link_dest/2","doc":"","ref":"PlausibleWeb.SiteView.html#shared_link_dest/2"},{"type":"function","title":"PlausibleWeb.SiteView.snippet.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#snippet.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.snippet_after_domain_change.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#snippet_after_domain_change.html/1"},{"type":"function","title":"PlausibleWeb.SiteView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.SiteView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.SiteView.with_indefinite_article/1","doc":"","ref":"PlausibleWeb.SiteView.html#with_indefinite_article/1"},{"type":"module","title":"PlausibleWeb.StatsController","doc":"This controller is responsible for rendering stats dashboards.\n\nThe stats dashboards are currently the only part of the app that uses client-side\nrendering. Since the dashboards are heavily interactive, they are built with React\nwhich is an appropriate choice for highly interactive browser UIs.\n\n \nsequenceDiagram\n Browser->>StatsController: GET /mydomain.com\n StatsController-->>Browser: StatsView.render(\"stats.html\")\n Note left of Browser: ReactDom.render(Dashboard)\n\n Browser -) Api.StatsController: GET /api/stats/mydomain.com/top-stats\n Api.StatsController --) Browser: {\"top_stats\": [...]}\n Note left of Browser: TopStats.render()\n\n Browser -) Api.StatsController: GET /api/stats/mydomain.com/main-graph\n Api.StatsController --) Browser: [{\"plot\": [...], \"labels\": [...]}, ...]\n Note left of Browser: VisitorGraph.render()\n\n Browser -) Api.StatsController: GET /api/stats/mydomain.com/sources\n Api.StatsController --) Browser: [{\"name\": \"Google\", \"visitors\": 292150}, ...]\n Note left of Browser: Sources.render()\n\n Note over Browser,StatsController: And so on, for all reports in the viewport\n \n\nThis reasoning for this sequence is as follows:\n 1. First paint is fast because it doesn't do any data aggregation yet - good UX\n 2. The basic structure of the dashboard is rendered with spinners before reports are ready - good UX\n 2. Rendering on the frontend allows for maximum interactivity. Re-rendering and re-fetching can be as granular as needed.\n 3. Routing on the frontend allows the user to navigate the dashboard without reloading the page and losing context\n 4. Rendering on the frontend allows caching results in the browser to reduce pressure on backends and storage\n 3.1 No client-side caching has been implemented yet. This is still theoretical. See https://github.com/plausible/analytics/discussions/1278\n 3.2 This is a big potential opportunity, because analytics data is mostly immutable. Clients can cache all historical data.\n 5. Since frontend rendering & navigation is harder to build and maintain than regular server-rendered HTML, we don't use SPA-style rendering anywhere else\n .The only place currently where the benefits outweigh the costs is the dashboard.","ref":"PlausibleWeb.StatsController.html"},{"type":"function","title":"PlausibleWeb.StatsController.authenticate_shared_link/2","doc":"","ref":"PlausibleWeb.StatsController.html#authenticate_shared_link/2"},{"type":"function","title":"PlausibleWeb.StatsController.csv_export/2","doc":"The export is limited to 300 entries for other reports and 100 entries for pages because bigger result sets\nstart causing failures. Since we request data like time on page or bounce_rate for pages in a separate query\nusing the IN filter, it causes the requests to balloon in payload size.","ref":"PlausibleWeb.StatsController.html#csv_export/2"},{"type":"function","title":"PlausibleWeb.StatsController.shared_link/2","doc":"Authorizes and renders a shared link:\n 1. Shared link with no password protection: needs to just make sure the shared link entry is still\n in our database. This check makes sure shared link access can be revoked by the site admins. If the\n shared link exists, render it directly.\n\n 2. Shared link with password protection: Same checks as without the password, but an extra step is taken to\n protect the page with a password. When the user passes the password challenge, a cookie is set with Plausible.Auth.Token.sign_shared_link().\n The cookie allows the user to access the dashboard for 24 hours without entering the password again.\n\n #","ref":"PlausibleWeb.StatsController.html#shared_link/2"},{"type":"function","title":"Backwards compatibility - PlausibleWeb.StatsController.shared_link/2","doc":"The URL format for shared links was changed in [this pull request](https://github.com/plausible/analytics/pull/752) in order\n to make the URLs easier to bookmark. The old format is supported along with the new in order to not break old links.\n\n See: https://plausible.io/docs/shared-links","ref":"PlausibleWeb.StatsController.html#shared_link/2-backwards-compatibility"},{"type":"function","title":"PlausibleWeb.StatsController.stats/2","doc":"","ref":"PlausibleWeb.StatsController.html#stats/2"},{"type":"module","title":"PlausibleWeb.StatsView","doc":"","ref":"PlausibleWeb.StatsView.html"},{"type":"function","title":"PlausibleWeb.StatsView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.StatsView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.StatsView.large_number_format/1","doc":"","ref":"PlausibleWeb.StatsView.html#large_number_format/1"},{"type":"function","title":"PlausibleWeb.StatsView.plausible_url/0","doc":"","ref":"PlausibleWeb.StatsView.html#plausible_url/0"},{"type":"function","title":"PlausibleWeb.StatsView.pretty_stats_url/1","doc":"Returns a readable stats URL.\n\nNative Phoenix router functions percent-encode all diacritics, resulting in\nugly URLs, e.g. `https://plausible.io/café.com` transforms into\n`https://plausible.io/caf%C3%A9.com`.\n\nThis function encodes only the slash (`/`) character from the site's domain.","ref":"PlausibleWeb.StatsView.html#pretty_stats_url/1"},{"type":"function","title":"Examples - PlausibleWeb.StatsView.pretty_stats_url/1","doc":"iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: \"user.gittea.io/repo\"})\n \"http://localhost:8000/user.gittea.io%2Frepo\"\n\n iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: \"anakin.test\"})\n \"http://localhost:8000/anakin.test\"\n\n iex> PlausibleWeb.StatsView.pretty_stats_url(%Plausible.Site{domain: \"café.test\"})\n \"http://localhost:8000/café.test\"","ref":"PlausibleWeb.StatsView.html#pretty_stats_url/1-examples"},{"type":"function","title":"PlausibleWeb.StatsView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.StatsView.html#render/2"},{"type":"function","title":"PlausibleWeb.StatsView.shared_link_password.html/1","doc":"","ref":"PlausibleWeb.StatsView.html#shared_link_password.html/1"},{"type":"function","title":"PlausibleWeb.StatsView.site_locked.html/1","doc":"","ref":"PlausibleWeb.StatsView.html#site_locked.html/1"},{"type":"function","title":"PlausibleWeb.StatsView.stats.html/1","doc":"","ref":"PlausibleWeb.StatsView.html#stats.html/1"},{"type":"function","title":"PlausibleWeb.StatsView.stats_container_class/1","doc":"","ref":"PlausibleWeb.StatsView.html#stats_container_class/1"},{"type":"function","title":"PlausibleWeb.StatsView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.StatsView.html#template_not_found/2"},{"type":"function","title":"PlausibleWeb.StatsView.waiting_first_pageview.html/1","doc":"","ref":"PlausibleWeb.StatsView.html#waiting_first_pageview.html/1"},{"type":"module","title":"PlausibleWeb.Tracker","doc":"","ref":"PlausibleWeb.Tracker.html"},{"type":"function","title":"PlausibleWeb.Tracker.call/2","doc":"","ref":"PlausibleWeb.Tracker.html#call/2"},{"type":"function","title":"PlausibleWeb.Tracker.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"PlausibleWeb.Tracker.html#child_spec/1"},{"type":"function","title":"PlausibleWeb.Tracker.init/1","doc":"","ref":"PlausibleWeb.Tracker.html#init/1"},{"type":"module","title":"PlausibleWeb.TwoFactor.Session","doc":"Functions for managing session data related to Two-Factor\nAuthentication.","ref":"PlausibleWeb.TwoFactor.Session.html"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.clear_2fa_user/1","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#clear_2fa_user/1"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.clear_remember_2fa/1","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#clear_remember_2fa/1"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.get_2fa_user/1","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#get_2fa_user/1"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.maybe_set_remember_2fa/3","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#maybe_set_remember_2fa/3"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.remember_2fa?/2","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#remember_2fa?/2"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.remember_2fa_days/0","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#remember_2fa_days/0"},{"type":"function","title":"PlausibleWeb.TwoFactor.Session.set_2fa_user/2","doc":"","ref":"PlausibleWeb.TwoFactor.Session.html#set_2fa_user/2"},{"type":"module","title":"PlausibleWeb.UnsubscribeController","doc":"","ref":"PlausibleWeb.UnsubscribeController.html"},{"type":"function","title":"PlausibleWeb.UnsubscribeController.monthly_report/2","doc":"","ref":"PlausibleWeb.UnsubscribeController.html#monthly_report/2"},{"type":"function","title":"PlausibleWeb.UnsubscribeController.weekly_report/2","doc":"","ref":"PlausibleWeb.UnsubscribeController.html#weekly_report/2"},{"type":"module","title":"PlausibleWeb.UnsubscribeView","doc":"","ref":"PlausibleWeb.UnsubscribeView.html"},{"type":"function","title":"PlausibleWeb.UnsubscribeView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.UnsubscribeView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.UnsubscribeView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.UnsubscribeView.html#render/2"},{"type":"function","title":"PlausibleWeb.UnsubscribeView.success.html/1","doc":"","ref":"PlausibleWeb.UnsubscribeView.html#success.html/1"},{"type":"function","title":"PlausibleWeb.UnsubscribeView.template_not_found/2","doc":"Callback invoked when no template is found.\nBy default it raises but can be customized\nto render a particular template.","ref":"PlausibleWeb.UnsubscribeView.html#template_not_found/2"},{"type":"extras","title":"Introduction","doc":"# Plausible Analytics\n\n \n \n \n \n \n \n Simple Metrics |\n Lightweight Script |\n Privacy Focused |\n Open Source |\n Docs |\n Contributing \n \n \n\n[Plausible Analytics](https://plausible.io/) is an easy to use, lightweight (< 1 KB), open source and privacy-friendly alternative to Google Analytics. It doesn’t use cookies and is fully compliant with GDPR, CCPA and PECR. You can self-host or have us run Plausible for you in the cloud. Here's [the live demo of our own website stats](https://plausible.io/plausible.io). Made and hosted in the EU 🇪🇺\n\nWe are dedicated to making web analytics more privacy-friendly. Our mission is to reduce corporate surveillance by providing an alternative web analytics tool which doesn’t come from the AdTech world. We are completely independent and solely funded by our subscribers.\n\n![Plausible Analytics](https://plausible.io/docs/img/plausible-analytics.png)","ref":"readme.html"},{"type":"extras","title":"Why Plausible? - Introduction","doc":"Here's what makes Plausible a great Google Analytics alternative and why we're trusted by 11,000+ paying subscribers to deliver their website and business insights:\n\n- **Clutter Free**: Plausible Analytics provides [simple web analytics](https://plausible.io/simple-web-analytics) and it cuts through the noise. No layers of menus, no need for custom reports. Get all the important insights on one single page. No training necessary.\n- **GDPR/CCPA/PECR compliant**: Measure traffic, not individuals. No personal data or IP addresses are ever stored in our database. We don't use cookies or any other persistent identifiers. [Read more about our data policy](https://plausible.io/data-policy)\n- **Lightweight**: Plausible Analytics works by loading a script on your website, like Google Analytics. Our script is [45x smaller](https://plausible.io/lightweight-web-analytics), making your website quicker to load. You can also send events directly to our [events API](https://plausible.io/docs/events-api).\n- **Email or Slack reports**: Keep an eye on your traffic with weekly and/or monthly email or Slack reports. You can also get traffic spike notifications.\n- **Invite team members and share stats**: You have the option to be transparent and open your web analytics to everyone. Your website stats are private by default but you can choose to make them public so anyone with your custom link can view them. You can [invite team members](https://plausible.io/docs/users-roles) and assign user roles too.\n- **Define key goals and track conversions**: Create custom events with custom dimensions to track conversions and attribution to understand and identify the trends that matter. Includes easy ways to track outbound link clicks, file downloads and 404 error pages.\n- **Search keywords**: Integrate your dashboard with Google Search Console to get the most accurate reporting on your search keywords.\n- **SPA support**: Plausible is built with modern web frameworks in mind and it works automatically with any pushState based router on the frontend. We also support frameworks that use the URL hash for routing. See [our documentation](https://plausible.io/docs/hash-based-routing).\n- **Smooth transition from Google Analytics**: There's a realtime dashboard, entry pages report and integration with Search Console. You can track your paid campaigns and conversions. You can invite team members. You can even [import your historical Google Analytics stats](https://plausible.io/docs/google-analytics-import). Learn how to [get the most out of your Plausible experience](https://plausible.io/docs/your-plausible-experience) and join thousands who have already migrated from Google Analytics.\n\nInterested to learn more? [Read more on our website](https://plausible.io), learn more about the team and the goals of the project on [our about page](https://plausible.io/about) or explore [the documentation](https://plausible.io/docs).","ref":"readme.html#why-plausible"},{"type":"extras","title":"Why is Plausible Analytics Cloud not free like Google Analytics? - Introduction","doc":"Plausible Analytics is an independently owned and actively developed project. To keep the project development going, to stay in business, to continue putting effort into building a better product and to cover our costs, we need to charge a fee.\n\nGoogle Analytics is free because Google has built their company and their wealth by collecting and analyzing huge amounts of personal information from web users and using these personal and behavioral insights to sell advertisements.\n\nPlausible has no part in that business model. No personal data is being collected and analyzed either. With Plausible, you 100% own and control all of your website data. This data is not being shared with or sold to any third-parties.\n\nWe choose the subscription business model rather than the business model of surveillance capitalism. See reasons why we believe you should [stop using Google Analytics on your website](https://plausible.io/blog/remove-google-analytics).","ref":"readme.html#why-is-plausible-analytics-cloud-not-free-like-google-analytics"},{"type":"extras","title":"Getting started with Plausible - Introduction","doc":"The easiest way to get started with Plausible is with [our official managed service in the cloud](https://plausible.io/#pricing). It takes 2 minutes to start counting your stats with a worldwide CDN, high availability, backups, security and maintenance all done for you by us.\n\nIn order to be compliant with the GDPR and the Schrems II ruling, all visitor data for our managed service in the cloud is exclusively processed on servers and cloud infrastructure owned and operated by European providers. Your website data never leaves the EU.\n\nOur managed hosting can save a substantial amount of developer time and resources. For most sites this ends up being the best value option and the revenue goes to funding the maintenance and further development of Plausible. So you’ll be supporting open source software and getting a great service!\n\n#","ref":"readme.html#getting-started-with-plausible"},{"type":"extras","title":"Can Plausible Analytics be self-hosted? - Introduction","doc":"Plausible is [open source web analytics](https://plausible.io/open-source-website-analytics) and we have a free as in beer [self-hosted solution](https://plausible.io/self-hosted-web-analytics). Here are the differences between Plausible Analytics managed hosting in the cloud and the self-hosting:\n\n| | Plausible Cloud | Self-Hosting |\n| ------------- | ------------- | ------------- |\n| **Infrastructure management** | Easy and convenient. It takes 2 minutes to start counting your stats with a worldwide CDN, high availability, backups, security and maintenance all done for you by us. We manage everything so you don’t have to worry about anything and can focus on your stats. | You do it all yourself. You need to get a server and you need to manage your infrastructure. You are responsible for installation, maintenance, upgrades, server capacity, uptime, backup, security, stability, consistency, loading time and so on.|\n| **Release schedule** | Continuously developed and improved with new features and updates multiple times per week. | [It's a long term release](https://plausible.io/blog/building-open-source) published twice per year so latest features and improvements won't be immediately available.|\n| **Premium features** | All features available as listed in [our pricing plans](https://plausible.io/#pricing). | Selected premium features such as funnels and ecommerce revenue goals are not available as we aim to ensure a protective barrier around our cloud offering.|\n| **Bot filtering** | Advanced bot filtering for more accurate stats. Our algorithm detects and excludes non-human traffic patterns. We also exclude known bots by the User-Agent header and filter out traffic from data centers and referrer spam domains. | Basic bot filtering that targets the most common non-human traffic based on the User-Agent header and referrer spam domains.|\n| **Server location** | All visitor data is exclusively processed on EU-owned cloud infrastructure. We keep your site data on a secure, encrypted and green energy powered server in Germany. This ensures that your site data is protected by the strict European Union data privacy laws and ensures compliance with GDPR. Your website data never leaves the EU. | You have full control and can host your instance on any server in any country that you wish. Host it on a server in your basement or host it with any cloud provider wherever you want, even those that are not GDPR compliant.|\n| **Data portability** | You see all your site stats and metrics on our modern-looking, simple to use and fast loading dashboard. You can only see the stats aggregated in the dashboard. You can download the stats using the [CSV export](https://plausible.io/docs/export-stats), [stats API](https://plausible.io/docs/stats-api) or tools such as the [Data Studio Connector](https://plausible.io/docs/integration-guides#google-data-studio). | Do you want access to the raw data? Self-hosting gives you that option. You can take the data directly from the ClickHouse database. |\n| **Premium support** | Real support delivered by real human beings who build and maintain Plausible. | Premium support is not included. Self-hosting is community supported only.|\n| **Costs** | There's a cost associated with providing an analytics service so we charge a subscription fee. We choose the subscription business model rather than the business model of surveillance capitalism. Your money funds further development of Plausible. | You need to pay for your server, CDN, backups and whatever other cost there is associated with running the infrastructure. You never have to pay any fees to us. Your money goes to 3rd party companies with no connection to us.|\n\nInterested in self-hosting Plausible on your server? Take a look at our [self-hosting installation instructions](https://plausible.io/docs/self-hosting).\n\nPlausible Self-Hosted is a community supported project and there are no guarantees that you will get support from the creators of Plausible to troubleshoot your self-hosting issues. There is a [community supported forum](https://github.com/plausible/analytics/discussions/categories/self-hosted-support) where you can ask for help.\n\nOur only source of funding is our premium, managed service for running Plausible in the cloud. If you're looking for an alternative way to support the project, we've put together some sponsorship packages. If you choose to self-host Plausible you can [become a sponsor](https://github.com/sponsors/plausible) which is a great way to give back to the community and to contribute to the long-term sustainability of the project.","ref":"readme.html#can-plausible-analytics-be-self-hosted"},{"type":"extras","title":"Technology - Introduction","doc":"Plausible Analytics is a standard Elixir/Phoenix application backed by a PostgreSQL database for general data and a Clickhouse\ndatabase for stats. On the frontend we use [TailwindCSS](https://tailwindcss.com/) for styling and React to make the dashboard interactive.","ref":"readme.html#technology"},{"type":"extras","title":"Contributors - Introduction","doc":"For anyone wishing to contribute to Plausible, we recommend taking a look at [our contributor guide](https://github.com/plausible/analytics/blob/master/CONTRIBUTING.md).","ref":"readme.html#contributors"},{"type":"extras","title":"Feedback & Roadmap - Introduction","doc":"We welcome feedback from our community. We have a public roadmap driven by the features suggested by the community members. Take a look at our [feedback board](https://plausible.io/feedback). Please let us know if you have any requests and vote on open issues so we can better prioritize.\n\nTo stay up to date with all the latest news and product updates, make sure to follow us on [X (formerly Twitter)](https://twitter.com/plausiblehq), [LinkedIn](https://www.linkedin.com/company/plausible-analytics/) or [Mastodon](https://fosstodon.org/@plausible).","ref":"readme.html#feedback-roadmap"},{"type":"extras","title":"License & Trademarks - Introduction","doc":"Plausible is open source under the GNU Affero General Public License Version 3 (AGPLv3) or any later version. You can [find it here](https://github.com/plausible/analytics/blob/master/LICENSE.md).\n\nTo avoid issues with AGPL virality, we've released the JavaScript tracker which gets included on your website under the MIT license. You can [find it here](https://github.com/plausible/analytics/blob/master/tracker/LICENSE.md).\n\nCopyright (c) 2018-present Plausible Insights OÜ. Plausible Analytics name and logo are trademarks of Plausible Insights OÜ. Please see our [trademark guidelines](https://plausible.io/trademark) for info on acceptable usage.","ref":"readme.html#license-trademarks"},{"type":"extras","title":"Contributing","doc":"# Contributing\n\nWe welcome everyone to contribute to Plausible. This document is to help you on setting up your environment, finding a task, and opening pull requests.","ref":"contributing.html"},{"type":"extras","title":"Development setup - Contributing","doc":"The easiest way to get up and running is to [install](https://docs.docker.com/get-docker/) and use Docker for running both Postgres and Clickhouse.\n\nMake sure Docker, Elixir, Erlang and Node.js are all installed on your development machine. The [`.tool-versions`](https://github.com/plausible/analytics/blob/master/.tool-versions) file is available to use with [asdf](https://github.com/asdf-vm/asdf) or similar tools.\n\n#","ref":"contributing.html#development-setup"},{"type":"extras","title":"Start the environment - Contributing","doc":"1. Run both `make postgres` and `make clickhouse`.\n2. You can set up everything with `make install`, alternatively run each command separately:\n 1. Run `mix deps.get`. This will download the required Elixir dependencies.\n 2. Run `mix ecto.create`. This will create the required databases in both Postgres and Clickhouse.\n 3. Run `mix ecto.migrate` to build the database schema.\n 4. Run `mix run priv/repo/seeds.exs` to seed the database. Check the [Seeds](#Seeds) section for more.\n 5. Run `npm ci --prefix assets` to install the required client-side dependencies.\n 6. Run `npm ci --prefix tracker` to install the required tracker dependencies.\n 7. Run `mix assets.setup` to install Tailwind and Esbuild\n 8. Run `npm run deploy --prefix tracker` to generate tracker files in `priv/tracker/js`\n 9. Run `mix download_country_database` to fetch geolocation database\n3. Run `make server` or `mix phx.server` to start the Phoenix server.\n4. The system is now available on `localhost:8000`.\n\n#","ref":"contributing.html#start-the-environment"},{"type":"extras","title":"Seeds - Contributing","doc":"You can optionally seed your database to automatically create an account and a site with stats:\n\n1. Run `mix run priv/repo/seeds.exs` to seed the database.\n2. Start the server with `make server` and navigate to `http://localhost:8000/login`.\n3. Log in with the following e-mail and password combination: `user@plausible.test` and `plausible`.\n4. You should now have a `dummy.site` site with generated stats.\n\nAlternatively, you can manually create a new account:\n\n1. Navigate to `http://localhost:8000/register` and fill in the form.\n2. Fill in the rest of the forms and for the domain use `dummy.site`\n3. Skip the JS snippet and click start collecting data.\n4. Run `mix send_pageview` from the terminal to generate a fake pageview event for the dummy site.\n5. You should now be all set!\n\n#","ref":"contributing.html#seeds"},{"type":"extras","title":"Stopping Docker containers - Contributing","doc":"1. Stop and remove the Postgres container with `make postgres-stop`.\n2. Stop and remove the Clickhouse container with `make clickhouse-stop`.\n\nVolumes are preserved. You'll find that the Postgres and Clickhouse state are retained when you bring them up again the next time: no need to re-register and so on.\n\nNote: Since we are deleting the containers, be careful when deleting volumes with `docker volume prune`. You might accidentally delete the database and would have to go through re-registration process.\n\n#","ref":"contributing.html#stopping-docker-containers"},{"type":"extras","title":"Pre-commit hooks - Contributing","doc":"`pre-commit` requires Python to be available locally and covers Elixir, JavaScript, and CSS. Set up with `pip install --user pre-commit` followed by `pre-commit install`. Conversely, if the prompts are far too bothersome, remove with `pre-commit uninstall`.","ref":"contributing.html#pre-commit-hooks"},{"type":"extras","title":"Finding a task - Contributing","doc":"Bugs can be found in our [issue tracker](https://github.com/plausible/analytics/issues). Issues are usually up for grabs.\n\nNew features need to be discussed with the core team and the community first. If you're tackling a feature, please make sure it has been already discussed in the [Discussions tab](https://github.com/plausible/analytics/discussions). We kindly ask contributors to use the discussion comment section to propose a solution before opening a pull request.\n\nPull requests without an associated issue or discussion may still be merged, but we will focus on changes that have already been talked through.","ref":"contributing.html#finding-a-task"},{"type":"extras","title":"Account locking","doc":"# Account locking\nThis document explains the account locking feature from a technical perspective. Account locking happens when users have outgrown their accounts, and despite e-mail and dashboard alerts, don't upgrade after a grace period.","ref":"account-locking.html"},{"type":"extras","title":"Usage alert and grace period - Account locking","doc":"The `Plausible.Workers.CheckUsage` daily background job alerts users they have reached their subscription limits. This runs for outgrown users one day after their last billing date.\n\nWhen users reach the number of sites limit, or use >110% of their pageview limit for 2 consecutive billing cycles, the background job sends them an e-mail alert. The e-mail suggests a suitable subscription plan based on usage. For enterprise users, only an internal e-mail is sent to `enterprise@plausible.io`.\n\nThe user is given 7 days to upgrade their account after the alert, and this is called grace period. The background starts this grace period by adding a `users.grace_period` JSON to the user record:\n\n```json\n// SELECT grace_period FROM users LIMIT 1\n\n{\n \"id\": \"1aa855bd-022d-4dfc-b572-6853442c3f19\",\n \"is_over\": true,\n \"end_date\": \"2022-03-09\",\n \"allowance_required\": 100,\n \"manual_lock\": false\n}\n```\n\n\nDuring this period, the following alert pops up on the dashboard for both standard and enterprise users:\n\n![](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN4GLWMwCrTuTcf31kYE9%2Fuploads%2FmsLk4CdSHKzU8TbfvaPq%2FPasted%20image%2020220909120933.png?alt=media&token=76f247a1-28cf-4d88-a0fa-06547268aee9)\n\nIf the user upgrades to a suitable plan, the grace period is removed (check `Plausible.Billing.subscription_updated/1`), otherwise [Account locking](#Account\\ locking) follows. For enterprise users, the grace period has a manual lock flag set to true, meaning enterprise accounts can only be locked/unlocked through the internal CRM.","ref":"account-locking.html#usage-alert-and-grace-period"},{"type":"extras","title":"Account locking - Account locking","doc":"The grace period is checked daily by the `Plausible.Workers.LockSites` background job.\n\nFor users that expired their grace period, `sites.locked` is is set to `true`, restricting access to dashboards. This does not stop event ingestion, so users can have their stats up to date when they finally upgrade.\n\n![](https://files.gitbook.com/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FN4GLWMwCrTuTcf31kYE9%2Fuploads%2FAplurtG7UsGXMskZOlUO%2FPasted%20image%2020220909122622.png?alt=media&token=5c8156d7-d4a7-4c99-8bac-2f1e9b7d4cae)","ref":"account-locking.html#account-locking"}],"content_type":"text/markdown"} \ No newline at end of file diff --git a/dist/sidebar_items-19EA738B.js b/dist/sidebar_items-CA384A82.js similarity index 62% rename from dist/sidebar_items-19EA738B.js rename to dist/sidebar_items-CA384A82.js index f5e132d2c..f3a9d4806 100644 --- a/dist/sidebar_items-19EA738B.js +++ b/dist/sidebar_items-CA384A82.js @@ -1 +1 @@ -sidebarNodes={"modules":[{"id":"ObanErrorReporter","deprecated":false,"group":"","title":"ObanErrorReporter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","deprecated":false,"title":"handle_event(list, measure, meta, _)","anchor":"handle_event/4"}],"key":"functions"}]},{"id":"Plausible","deprecated":false,"group":"","title":"Plausible","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"do_on_full_build/1","deprecated":false,"title":"do_on_full_build(list)","anchor":"do_on_full_build/1"},{"id":"full_build?/0","deprecated":false,"title":"full_build?()","anchor":"full_build?/0"},{"id":"on_full_build/1","deprecated":false,"title":"on_full_build(clauses)","anchor":"on_full_build/1"},{"id":"small_build?/0","deprecated":false,"title":"small_build?()","anchor":"small_build?/0"}],"key":"functions"}]},{"id":"Plausible.AsyncInsertRepo","deprecated":false,"group":"","title":"Plausible.AsyncInsertRepo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.Auth","deprecated":false,"group":"","title":"Plausible.Auth","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_api_key/3","deprecated":false,"title":"create_api_key(user, name, key)","anchor":"create_api_key/3"},{"id":"create_user/3","deprecated":false,"title":"create_user(name, email, pwd)","anchor":"create_user/3"},{"id":"delete_api_key/2","deprecated":false,"title":"delete_api_key(user, id)","anchor":"delete_api_key/2"},{"id":"delete_user/1","deprecated":false,"title":"delete_user(user)","anchor":"delete_user/1"},{"id":"enterprise_configured?/1","deprecated":false,"title":"enterprise_configured?(user)","anchor":"enterprise_configured?/1"},{"id":"find_api_key/1","deprecated":false,"title":"find_api_key(raw_key)","anchor":"find_api_key/1"},{"id":"find_user_by/1","deprecated":false,"title":"find_user_by(opts)","anchor":"find_user_by/1"},{"id":"has_active_sites?/2","deprecated":false,"title":"has_active_sites?(user, roles \\\\ [:owner, :admin, :viewer])","anchor":"has_active_sites?/2"},{"id":"is_super_admin?/1","deprecated":false,"title":"is_super_admin?(user_id)","anchor":"is_super_admin?/1"},{"id":"user_owns_sites?/1","deprecated":false,"title":"user_owns_sites?(user)","anchor":"user_owns_sites?/1"}],"key":"functions"}]},{"id":"Plausible.Auth.ApiKey","deprecated":false,"group":"","title":"Plausible.Auth.ApiKey","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(schema, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"do_hash/1","deprecated":false,"title":"do_hash(key)","anchor":"do_hash/1"},{"id":"process_key/1","deprecated":false,"title":"process_key(changeset)","anchor":"process_key/1"},{"id":"update/2","deprecated":false,"title":"update(schema, attrs \\\\ %{})","anchor":"update/2"}],"key":"functions"}]},{"id":"Plausible.Auth.ApiKeyAdmin","deprecated":false,"group":"","title":"Plausible.Auth.ApiKeyAdmin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(schema, attrs)","anchor":"create_changeset/2"},{"id":"custom_index_query/3","deprecated":false,"title":"custom_index_query(conn, schema, query)","anchor":"custom_index_query/3"},{"id":"form_fields/1","deprecated":false,"title":"form_fields(_)","anchor":"form_fields/1"},{"id":"index/1","deprecated":false,"title":"index(_)","anchor":"index/1"},{"id":"search_fields/1","deprecated":false,"title":"search_fields(schema)","anchor":"search_fields/1"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(schema, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Auth.EmailActivationCode","deprecated":false,"group":"","title":"Plausible.Auth.EmailActivationCode","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"generate_code/0","deprecated":false,"title":"generate_code()","anchor":"generate_code/0"},{"id":"new/2","deprecated":false,"title":"new(user, now)","anchor":"new/2"}],"key":"functions"}]},{"id":"Plausible.Auth.EmailVerification","deprecated":false,"group":"","title":"Plausible.Auth.EmailVerification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"any?/1","deprecated":false,"title":"any?(user)","anchor":"any?/1"},{"id":"expired?/1","deprecated":false,"title":"expired?(verification)","anchor":"expired?/1"},{"id":"issue_code/2","deprecated":false,"title":"issue_code(user, now \\\\ NaiveDateTime.utc_now())","anchor":"issue_code/2"},{"id":"verify_code/2","deprecated":false,"title":"verify_code(user, code)","anchor":"verify_code/2"}],"key":"functions"}]},{"id":"Plausible.Auth.GracePeriod","deprecated":false,"group":"","title":"Plausible.Auth.GracePeriod","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"active?/1","deprecated":false,"title":"active?(user)","anchor":"active?/1"},{"id":"end_changeset/1","deprecated":false,"title":"end_changeset(user)","anchor":"end_changeset/1"},{"id":"expired?/1","deprecated":false,"title":"expired?(user)","anchor":"expired?/1"},{"id":"remove_changeset/1","deprecated":false,"title":"remove_changeset(user)","anchor":"remove_changeset/1"},{"id":"start_changeset/2","deprecated":false,"title":"start_changeset(user, allowance_required)","anchor":"start_changeset/2"},{"id":"start_manual_lock_changeset/2","deprecated":false,"title":"start_manual_lock_changeset(user, allowance_required)","anchor":"start_manual_lock_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Auth.Invitation","deprecated":false,"group":"","title":"Plausible.Auth.Invitation","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","deprecated":false,"title":"new(attrs \\\\ %{})","anchor":"new/1"}],"key":"functions"}]},{"id":"Plausible.Auth.Password","deprecated":false,"group":"","title":"Plausible.Auth.Password","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"dummy_calculation/0","deprecated":false,"title":"dummy_calculation()","anchor":"dummy_calculation/0"},{"id":"hash/1","deprecated":false,"title":"hash(password)","anchor":"hash/1"},{"id":"match?/2","deprecated":false,"title":"match?(password, hash)","anchor":"match?/2"}],"key":"functions"}]},{"id":"Plausible.Auth.TOTP","deprecated":false,"group":"","title":"Plausible.Auth.TOTP","sections":[{"id":"Setup","anchor":"module-setup"},{"id":"Management","anchor":"module-management"},{"id":"Validation","anchor":"module-validation"},{"id":"Code validity","anchor":"module-code-validity"},{"id":"TOTP Token","anchor":"module-totp-token"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"disable/2","deprecated":false,"title":"disable(user, password)","anchor":"disable/2"},{"id":"enable/3","deprecated":false,"title":"enable(user, code, opts \\\\ [])","anchor":"enable/3"},{"id":"enabled?/1","deprecated":false,"title":"enabled?(user)","anchor":"enabled?/1"},{"id":"generate_recovery_codes/1","deprecated":false,"title":"generate_recovery_codes(map)","anchor":"generate_recovery_codes/1"},{"id":"generate_recovery_codes/2","deprecated":false,"title":"generate_recovery_codes(user, password)","anchor":"generate_recovery_codes/2"},{"id":"initiate/1","deprecated":false,"title":"initiate(user)","anchor":"initiate/1"},{"id":"initiated?/1","deprecated":false,"title":"initiated?(user)","anchor":"initiated?/1"},{"id":"reset_token/1","deprecated":false,"title":"reset_token(user)","anchor":"reset_token/1"},{"id":"use_recovery_code/2","deprecated":false,"title":"use_recovery_code(user, code)","anchor":"use_recovery_code/2"},{"id":"validate_code/3","deprecated":false,"title":"validate_code(user, code, opts \\\\ [])","anchor":"validate_code/3"}],"key":"functions"}]},{"id":"Plausible.Auth.TOTP.EncryptedBinary","deprecated":false,"group":"","title":"Plausible.Auth.TOTP.EncryptedBinary","sections":[]},{"id":"Plausible.Auth.TOTP.RecoveryCode","deprecated":false,"group":"","title":"Plausible.Auth.TOTP.RecoveryCode","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(user, code)","anchor":"changeset/2"},{"id":"changeset_to_map/2","deprecated":false,"title":"changeset_to_map(changeset, now)","anchor":"changeset_to_map/2"},{"id":"generate_codes/1","deprecated":false,"title":"generate_codes(count)","anchor":"generate_codes/1"},{"id":"match?/2","deprecated":false,"title":"match?(recovery_code, input_code)","anchor":"match?/2"}],"key":"functions"}]},{"id":"Plausible.Auth.TOTP.Vault","deprecated":false,"group":"","title":"Plausible.Auth.TOTP.Vault","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(config \\\\ [])","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Plausible.Auth.Token","deprecated":false,"group":"","title":"Plausible.Auth.Token","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"sign_password_reset/1","deprecated":false,"title":"sign_password_reset(email)","anchor":"sign_password_reset/1"},{"id":"sign_shared_link/1","deprecated":false,"title":"sign_shared_link(slug)","anchor":"sign_shared_link/1"},{"id":"verify_password_reset/1","deprecated":false,"title":"verify_password_reset(token)","anchor":"verify_password_reset/1"},{"id":"verify_shared_link/1","deprecated":false,"title":"verify_shared_link(token)","anchor":"verify_shared_link/1"}],"key":"functions"}]},{"id":"Plausible.Auth.User","deprecated":false,"group":"","title":"Plausible.Auth.User","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"cancel_email_changeset/1","deprecated":false,"title":"cancel_email_changeset(user)","anchor":"cancel_email_changeset/1"},{"id":"changeset/2","deprecated":false,"title":"changeset(user, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"email_changeset/2","deprecated":false,"title":"email_changeset(user, attrs \\\\ %{})","anchor":"email_changeset/2"},{"id":"end_trial/1","deprecated":false,"title":"end_trial(user)","anchor":"end_trial/1"},{"id":"hash_password/1","deprecated":false,"title":"hash_password(changeset)","anchor":"hash_password/1"},{"id":"new/1","deprecated":false,"title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"password_strength/1","deprecated":false,"title":"password_strength(changeset)","anchor":"password_strength/1"},{"id":"profile_img_url/1","deprecated":false,"title":"profile_img_url(user)","anchor":"profile_img_url/1"},{"id":"remove_trial_expiry/1","deprecated":false,"title":"remove_trial_expiry(user)","anchor":"remove_trial_expiry/1"},{"id":"set_password/2","deprecated":false,"title":"set_password(user, password)","anchor":"set_password/2"},{"id":"settings_changeset/2","deprecated":false,"title":"settings_changeset(user, attrs \\\\ %{})","anchor":"settings_changeset/2"},{"id":"start_trial/1","deprecated":false,"title":"start_trial(user)","anchor":"start_trial/1"},{"id":"subscription_accept_traffic_until_offset_days/0","deprecated":false,"title":"subscription_accept_traffic_until_offset_days()","anchor":"subscription_accept_traffic_until_offset_days/0"},{"id":"trial_accept_traffic_until_offset_days/0","deprecated":false,"title":"trial_accept_traffic_until_offset_days()","anchor":"trial_accept_traffic_until_offset_days/0"}],"key":"functions"}]},{"id":"Plausible.Auth.UserAdmin","deprecated":false,"group":"","title":"Plausible.Auth.UserAdmin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"custom_index_query/3","deprecated":false,"title":"custom_index_query(conn, schema, query)","anchor":"custom_index_query/3"},{"id":"delete/2","deprecated":false,"title":"delete(conn, map)","anchor":"delete/2"},{"id":"form_fields/1","deprecated":false,"title":"form_fields(_)","anchor":"form_fields/1"},{"id":"index/1","deprecated":false,"title":"index(_)","anchor":"index/1"},{"id":"resource_actions/1","deprecated":false,"title":"resource_actions(_)","anchor":"resource_actions/1"}],"key":"functions"}]},{"id":"Plausible.Billing","deprecated":false,"group":"","title":"Plausible.Billing","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"active_subscription_for/1","deprecated":false,"title":"active_subscription_for(user_id)","anchor":"active_subscription_for/1"},{"id":"cancelled_subscription_notice_dismiss_id/1","deprecated":false,"title":"cancelled_subscription_notice_dismiss_id(user)","anchor":"cancelled_subscription_notice_dismiss_id/1"},{"id":"change_plan/2","deprecated":false,"title":"change_plan(user, new_plan_id)","anchor":"change_plan/2"},{"id":"change_plan_preview/2","deprecated":false,"title":"change_plan_preview(subscription, new_plan_id)","anchor":"change_plan_preview/2"},{"id":"check_needs_to_upgrade/1","deprecated":false,"title":"check_needs_to_upgrade(user)","anchor":"check_needs_to_upgrade/1"},{"id":"format_price/1","deprecated":false,"title":"format_price(money)","anchor":"format_price/1"},{"id":"has_active_subscription?/1","deprecated":false,"title":"has_active_subscription?(user_id)","anchor":"has_active_subscription?/1"},{"id":"on_trial?/1","deprecated":false,"title":"on_trial?(user)","anchor":"on_trial?/1"},{"id":"paddle_api/0","deprecated":false,"title":"paddle_api()","anchor":"paddle_api/0"},{"id":"subscription_cancelled/1","deprecated":false,"title":"subscription_cancelled(params)","anchor":"subscription_cancelled/1"},{"id":"subscription_created/1","deprecated":false,"title":"subscription_created(params)","anchor":"subscription_created/1"},{"id":"subscription_is_active?/1","deprecated":false,"title":"subscription_is_active?(subscription)","anchor":"subscription_is_active?/1"},{"id":"subscription_payment_succeeded/1","deprecated":false,"title":"subscription_payment_succeeded(params)","anchor":"subscription_payment_succeeded/1"},{"id":"subscription_updated/1","deprecated":false,"title":"subscription_updated(params)","anchor":"subscription_updated/1"},{"id":"trial_days_left/1","deprecated":false,"title":"trial_days_left(user)","anchor":"trial_days_left/1"}],"key":"functions"}]},{"id":"Plausible.Billing.Ecto.Feature","deprecated":false,"group":"","title":"Plausible.Billing.Ecto.Feature","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(feature)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(mod)","anchor":"dump/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","deprecated":false,"title":"load(feature)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Plausible.Billing.Ecto.FeatureList","deprecated":false,"group":"","title":"Plausible.Billing.Ecto.FeatureList","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(list)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(list)","anchor":"dump/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","deprecated":false,"title":"load(list)","anchor":"load/1"},{"id":"render_form/5","deprecated":false,"title":"render_form(conn, changeset, form, field, options)","anchor":"render_form/5"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Plausible.Billing.Ecto.Limit","deprecated":false,"group":"","title":"Plausible.Billing.Ecto.Limit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(other)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(other)","anchor":"dump/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","deprecated":false,"title":"load(other)","anchor":"load/1"},{"id":"render_form/5","deprecated":false,"title":"render_form(conn, changeset, form, field, options)","anchor":"render_form/5"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Plausible.Billing.EnterprisePlan","deprecated":false,"group":"","title":"Plausible.Billing.EnterprisePlan","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(model, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Billing.EnterprisePlanAdmin","deprecated":false,"group":"","title":"Plausible.Billing.EnterprisePlanAdmin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"custom_index_query/3","deprecated":false,"title":"custom_index_query(conn, schema, query)","anchor":"custom_index_query/3"},{"id":"form_fields/1","deprecated":false,"title":"form_fields(schema)","anchor":"form_fields/1"},{"id":"index/1","deprecated":false,"title":"index(_)","anchor":"index/1"},{"id":"search_fields/1","deprecated":false,"title":"search_fields(schema)","anchor":"search_fields/1"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(enterprise_plan, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Billing.Feature","deprecated":false,"group":"","title":"Plausible.Billing.Feature","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"check_availability/1","deprecated":false,"title":"check_availability(t)","anchor":"c:check_availability/1"},{"id":"display_name/0","deprecated":false,"title":"display_name()","anchor":"c:display_name/0"},{"id":"enabled?/1","deprecated":false,"title":"enabled?(t)","anchor":"c:enabled?/1"},{"id":"free?/0","deprecated":false,"title":"free?()","anchor":"c:free?/0"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"c:name/0"},{"id":"opted_out?/1","deprecated":false,"title":"opted_out?(t)","anchor":"c:opted_out?/1"},{"id":"toggle/2","deprecated":false,"title":"toggle(t, t)","anchor":"c:toggle/2"},{"id":"toggle_field/0","deprecated":false,"title":"toggle_field()","anchor":"c:toggle_field/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"}],"key":"functions"}]},{"id":"Plausible.Billing.PaddleApi","deprecated":false,"group":"","title":"Plausible.Billing.PaddleApi","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"checkout_domain/0","deprecated":false,"title":"checkout_domain()","anchor":"checkout_domain/0"},{"id":"fetch_prices/1","deprecated":false,"title":"fetch_prices(product_ids)","anchor":"fetch_prices/1"},{"id":"get_invoices/1","deprecated":false,"title":"get_invoices(subscription)","anchor":"get_invoices/1"},{"id":"get_subscription/1","deprecated":false,"title":"get_subscription(paddle_subscription_id)","anchor":"get_subscription/1"},{"id":"update_subscription/2","deprecated":false,"title":"update_subscription(paddle_subscription_id, params)","anchor":"update_subscription/2"},{"id":"update_subscription_preview/2","deprecated":false,"title":"update_subscription_preview(paddle_subscription_id, new_plan_id)","anchor":"update_subscription_preview/2"},{"id":"vendors_domain/0","deprecated":false,"title":"vendors_domain()","anchor":"vendors_domain/0"}],"key":"functions"}]},{"id":"Plausible.Billing.Plans","deprecated":false,"group":"","title":"Plausible.Billing.Plans","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all/0","deprecated":false,"title":"all()","anchor":"all/0"},{"id":"available_plans_for/2","deprecated":false,"title":"available_plans_for(user, opts \\\\ [])","anchor":"available_plans_for/2"},{"id":"business_plans_for/1","deprecated":false,"title":"business_plans_for(user)","anchor":"business_plans_for/1"},{"id":"business_tier?/1","deprecated":false,"title":"business_tier?(subscription)","anchor":"business_tier?/1"},{"id":"business_tier_launch/0","deprecated":false,"title":"business_tier_launch()","anchor":"business_tier_launch/0"},{"id":"find/1","deprecated":false,"title":"find(product_id)","anchor":"find/1"},{"id":"get_price_for/1","deprecated":false,"title":"get_price_for(enterprise_plan)","anchor":"get_price_for/1"},{"id":"get_regular_plan/2","deprecated":false,"title":"get_regular_plan(subscription, opts \\\\ [])","anchor":"get_regular_plan/2"},{"id":"get_subscription_plan/1","deprecated":false,"title":"get_subscription_plan(subscription)","anchor":"get_subscription_plan/1"},{"id":"growth_plans_for/1","deprecated":false,"title":"growth_plans_for(user)","anchor":"growth_plans_for/1"},{"id":"latest_enterprise_plan_with_price/1","deprecated":false,"title":"latest_enterprise_plan_with_price(user)","anchor":"latest_enterprise_plan_with_price/1"},{"id":"subscription_interval/1","deprecated":false,"title":"subscription_interval(subscription)","anchor":"subscription_interval/1"},{"id":"suggest/2","deprecated":false,"title":"suggest(user, usage_during_cycle)","anchor":"suggest/2"},{"id":"suggest_tier/1","deprecated":false,"title":"suggest_tier(user)","anchor":"suggest_tier/1"},{"id":"with_prices/1","deprecated":false,"title":"with_prices(plans)","anchor":"with_prices/1"},{"id":"yearly_product_ids/0","deprecated":false,"title":"yearly_product_ids()","anchor":"yearly_product_ids/0"}],"key":"functions"}]},{"id":"Plausible.Billing.Quota","deprecated":false,"group":"","title":"Plausible.Billing.Quota","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"limit/0","deprecated":false,"title":"limit()","anchor":"t:limit/0"},{"id":"monthly_pageview_usage/0","deprecated":false,"title":"monthly_pageview_usage()","anchor":"t:monthly_pageview_usage/0"},{"id":"over_limits_error/0","deprecated":false,"title":"over_limits_error()","anchor":"t:over_limits_error/0"},{"id":"period/0","deprecated":false,"title":"period()","anchor":"t:period/0"},{"id":"usage_cycle/0","deprecated":false,"title":"usage_cycle()","anchor":"t:usage_cycle/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"allowed_features_for/1","deprecated":false,"title":"allowed_features_for(user)","anchor":"allowed_features_for/1"},{"id":"below_limit?/2","deprecated":false,"title":"below_limit?(usage, limit)","anchor":"below_limit?/2"},{"id":"ensure_can_add_new_site/1","deprecated":false,"title":"ensure_can_add_new_site(user)","anchor":"ensure_can_add_new_site/1"},{"id":"ensure_within_plan_limits/3","deprecated":false,"title":"ensure_within_plan_limits(user_or_usage, plan, opts \\\\ [])","anchor":"ensure_within_plan_limits/3"},{"id":"features_usage/1","deprecated":false,"title":"features_usage(user)","anchor":"features_usage/1"},{"id":"monthly_pageview_limit/1","deprecated":false,"title":"monthly_pageview_limit(user)","anchor":"monthly_pageview_limit/1"},{"id":"monthly_pageview_usage/2","deprecated":false,"title":"monthly_pageview_usage(user, site_ids \\\\ nil)","anchor":"monthly_pageview_usage/2"},{"id":"site_limit/1","deprecated":false,"title":"site_limit(user)","anchor":"site_limit/1"},{"id":"site_usage/1","deprecated":false,"title":"site_usage(user)","anchor":"site_usage/1"},{"id":"team_member_limit/1","deprecated":false,"title":"team_member_limit(user)","anchor":"team_member_limit/1"},{"id":"team_member_usage/1","deprecated":false,"title":"team_member_usage(user)","anchor":"team_member_usage/1"},{"id":"usage/2","deprecated":false,"title":"usage(user, opts \\\\ [])","anchor":"usage/2"},{"id":"usage_cycle/4","deprecated":false,"title":"usage_cycle(user, cycle, owned_site_ids \\\\ nil, today \\\\ Timex.today())","anchor":"usage_cycle/4"},{"id":"within_limit?/2","deprecated":false,"title":"within_limit?(usage, limit)","anchor":"within_limit?/2"}],"key":"functions"}]},{"id":"Plausible.Billing.SiteLocker","deprecated":false,"group":"","title":"Plausible.Billing.SiteLocker","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"lock_reason/0","deprecated":false,"title":"lock_reason()","anchor":"t:lock_reason/0"},{"id":"update_opt/0","deprecated":false,"title":"update_opt()","anchor":"t:update_opt/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"send_grace_period_end_email/1","deprecated":false,"title":"send_grace_period_end_email(user)","anchor":"send_grace_period_end_email/1"},{"id":"set_lock_status_for/2","deprecated":false,"title":"set_lock_status_for(user, status)","anchor":"set_lock_status_for/2"},{"id":"update_sites_for/2","deprecated":false,"title":"update_sites_for(user, opts \\\\ [])","anchor":"update_sites_for/2"}],"key":"functions"}]},{"id":"Plausible.Billing.Subscription.Status","deprecated":false,"group":"","title":"Plausible.Billing.Subscription.Status","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"status/0","deprecated":false,"title":"status()","anchor":"t:status/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"active/0","deprecated":false,"title":"active()","anchor":"active/0"},{"id":"active?/1","deprecated":false,"title":"active?(subscription)","anchor":"active?/1"},{"id":"deleted/0","deprecated":false,"title":"deleted()","anchor":"deleted/0"},{"id":"deleted?/1","deprecated":false,"title":"deleted?(subscription)","anchor":"deleted?/1"},{"id":"in?/2","deprecated":false,"title":"in?(subscription, expected)","anchor":"in?/2"},{"id":"past_due/0","deprecated":false,"title":"past_due()","anchor":"past_due/0"},{"id":"past_due?/1","deprecated":false,"title":"past_due?(subscription)","anchor":"past_due?/1"},{"id":"paused/0","deprecated":false,"title":"paused()","anchor":"paused/0"},{"id":"paused?/1","deprecated":false,"title":"paused?(subscription)","anchor":"paused?/1"},{"id":"valid_statuses/0","deprecated":false,"title":"valid_statuses()","anchor":"valid_statuses/0"}],"key":"functions"}]},{"id":"Plausible.ChangesetHelpers","deprecated":false,"group":"","title":"Plausible.ChangesetHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"traverse_errors/1","deprecated":false,"title":"traverse_errors(changeset)","anchor":"traverse_errors/1"}],"key":"functions"}]},{"id":"Plausible.Cldr","deprecated":false,"group":"","title":"Plausible.Cldr","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"available_locale_name?/1","deprecated":false,"title":"available_locale_name?(locale_name)","anchor":"available_locale_name?/1"},{"id":"default_locale/0","deprecated":false,"title":"default_locale()","anchor":"default_locale/0"},{"id":"default_territory/0","deprecated":false,"title":"default_territory()","anchor":"default_territory/0"},{"id":"ellipsis/2","deprecated":false,"title":"ellipsis(string, options \\\\ [])","anchor":"ellipsis/2"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"get_locale/0"},{"id":"known_calendars/0","deprecated":false,"title":"known_calendars()","anchor":"known_calendars/0"},{"id":"known_currencies/0","deprecated":false,"title":"known_currencies()","anchor":"known_currencies/0"},{"id":"known_gettext_locale_name/1","deprecated":false,"title":"known_gettext_locale_name(locale_name)","anchor":"known_gettext_locale_name/1"},{"id":"known_gettext_locale_name?/1","deprecated":false,"title":"known_gettext_locale_name?(locale_name)","anchor":"known_gettext_locale_name?/1"},{"id":"known_gettext_locale_names/0","deprecated":false,"title":"known_gettext_locale_names()","anchor":"known_gettext_locale_names/0"},{"id":"known_locale_name/1","deprecated":false,"title":"known_locale_name(locale_name)","anchor":"known_locale_name/1"},{"id":"known_locale_name?/1","deprecated":false,"title":"known_locale_name?(locale_name)","anchor":"known_locale_name?/1"},{"id":"known_locale_names/0","deprecated":false,"title":"known_locale_names()","anchor":"known_locale_names/0"},{"id":"known_number_system_types/0","deprecated":false,"title":"known_number_system_types()","anchor":"known_number_system_types/0"},{"id":"known_number_systems/0","deprecated":false,"title":"known_number_systems()","anchor":"known_number_systems/0"},{"id":"known_rbnf_locale_name/1","deprecated":false,"title":"known_rbnf_locale_name(locale_name)","anchor":"known_rbnf_locale_name/1"},{"id":"known_rbnf_locale_name?/1","deprecated":false,"title":"known_rbnf_locale_name?(locale_name)","anchor":"known_rbnf_locale_name?/1"},{"id":"known_rbnf_locale_names/0","deprecated":false,"title":"known_rbnf_locale_names()","anchor":"known_rbnf_locale_names/0"},{"id":"known_territories/0","deprecated":false,"title":"known_territories()","anchor":"known_territories/0"},{"id":"normalize_lenient_parse/3","deprecated":false,"title":"normalize_lenient_parse(string, scope, locale \\\\ get_locale())","anchor":"normalize_lenient_parse/3"},{"id":"put_locale/1","deprecated":false,"title":"put_locale(locale_name)","anchor":"put_locale/1"},{"id":"quote/2","deprecated":false,"title":"quote(string, options \\\\ [])","anchor":"quote/2"},{"id":"unknown_locale_names/0","deprecated":false,"title":"unknown_locale_names()","anchor":"unknown_locale_names/0"},{"id":"validate_calendar/1","deprecated":false,"title":"validate_calendar(calendar)","anchor":"validate_calendar/1"},{"id":"validate_currency/1","deprecated":false,"title":"validate_currency(currency)","anchor":"validate_currency/1"},{"id":"validate_locale/1","deprecated":false,"title":"validate_locale(locale)","anchor":"validate_locale/1"},{"id":"validate_number_system/1","deprecated":false,"title":"validate_number_system(number_system)","anchor":"validate_number_system/1"},{"id":"validate_number_system_type/1","deprecated":false,"title":"validate_number_system_type(number_system_type)","anchor":"validate_number_system_type/1"},{"id":"validate_territory/1","deprecated":false,"title":"validate_territory(territory)","anchor":"validate_territory/1"},{"id":"with_locale/2","deprecated":false,"title":"with_locale(locale, fun)","anchor":"with_locale/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.AcceptLanguage","deprecated":false,"group":"","title":"Plausible.Cldr.AcceptLanguage","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"best_match/1","deprecated":false,"title":"best_match(accept_language)","anchor":"best_match/1"},{"id":"parse/1","deprecated":false,"title":"parse(tokens_or_string)","anchor":"parse/1"},{"id":"parse!/1","deprecated":false,"title":"parse!(accept_language)","anchor":"parse!/1"}],"key":"functions"}]},{"id":"Plausible.Cldr.Currency","deprecated":false,"group":"","title":"Plausible.Cldr.Currency","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"currencies_for_locale/3","deprecated":false,"title":"currencies_for_locale(locale, only \\\\ :all, except \\\\ nil)","anchor":"currencies_for_locale/3"},{"id":"currencies_for_locale!/3","deprecated":false,"title":"currencies_for_locale!(locale, only \\\\ :all, except \\\\ nil)","anchor":"currencies_for_locale!/3"},{"id":"currency_for_code/2","deprecated":false,"title":"currency_for_code(currency_or_currency_code, options \\\\ [locale: Plausible.Cldr.default_locale()])","anchor":"currency_for_code/2"},{"id":"currency_for_code!/2","deprecated":false,"title":"currency_for_code!(currency_or_currency_code, options \\\\ [locale: Plausible.Cldr.default_locale()])","anchor":"currency_for_code!/2"},{"id":"currency_from_locale/1","deprecated":false,"title":"currency_from_locale(locale)","anchor":"currency_from_locale/1"},{"id":"currency_history_for_locale/1","deprecated":false,"title":"currency_history_for_locale(language_tag)","anchor":"currency_history_for_locale/1"},{"id":"currency_strings/3","deprecated":false,"title":"currency_strings(locale, only \\\\ :all, except \\\\ nil)","anchor":"currency_strings/3"},{"id":"currency_strings!/3","deprecated":false,"title":"currency_strings!(locale_name, only \\\\ :all, except \\\\ nil)","anchor":"currency_strings!/3"},{"id":"current_currency_from_locale/1","deprecated":false,"title":"current_currency_from_locale(locale)","anchor":"current_currency_from_locale/1"},{"id":"current_territory_currencies/0","deprecated":false,"title":"current_territory_currencies()","anchor":"current_territory_currencies/0"},{"id":"known_currencies/0","deprecated":false,"title":"known_currencies()","anchor":"known_currencies/0"},{"id":"known_currency?/1","deprecated":false,"title":"known_currency?(code)","anchor":"known_currency?/1"},{"id":"known_currency_code/1","deprecated":false,"title":"known_currency_code(currency_code)","anchor":"known_currency_code/1"},{"id":"known_currency_code?/1","deprecated":false,"title":"known_currency_code?(currency_code)","anchor":"known_currency_code?/1"},{"id":"known_currency_codes/0","deprecated":false,"title":"known_currency_codes()","anchor":"known_currency_codes/0"},{"id":"new/2","deprecated":false,"title":"new(currency, options \\\\ [])","anchor":"new/2"},{"id":"pluralize/3","deprecated":false,"title":"pluralize(number, currency, options \\\\ [])","anchor":"pluralize/3"},{"id":"strings_for_currency/2","deprecated":false,"title":"strings_for_currency(currency, locale)","anchor":"strings_for_currency/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Locale","deprecated":false,"group":"","title":"Plausible.Cldr.Locale","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fallback_locale_names/1","deprecated":false,"title":"fallback_locale_names(locale)","anchor":"fallback_locale_names/1"},{"id":"fallback_locales/1","deprecated":false,"title":"fallback_locales(locale)","anchor":"fallback_locales/1"},{"id":"locale_for_territory/1","deprecated":false,"title":"locale_for_territory(territory)","anchor":"locale_for_territory/1"},{"id":"locale_from_host/2","deprecated":false,"title":"locale_from_host(host, options \\\\ [])","anchor":"locale_from_host/2"},{"id":"new/1","deprecated":false,"title":"new(locale_name)","anchor":"new/1"},{"id":"new!/1","deprecated":false,"title":"new!(locale_name)","anchor":"new!/1"},{"id":"script_direction_from_locale/1","deprecated":false,"title":"script_direction_from_locale(locale)","anchor":"script_direction_from_locale/1"},{"id":"territory_from_host/1","deprecated":false,"title":"territory_from_host(host)","anchor":"territory_from_host/1"},{"id":"territory_from_locale/1","deprecated":false,"title":"territory_from_locale(locale)","anchor":"territory_from_locale/1"},{"id":"timezone_from_locale/1","deprecated":false,"title":"timezone_from_locale(locale)","anchor":"timezone_from_locale/1"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number","deprecated":false,"group":"","title":"Plausible.Cldr.Number","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"parse/2","deprecated":false,"title":"parse(string, options \\\\ [])","anchor":"parse/2"},{"id":"resolve_currencies/2","deprecated":false,"title":"resolve_currencies(list, options \\\\ [])","anchor":"resolve_currencies/2"},{"id":"resolve_currency/2","deprecated":false,"title":"resolve_currency(string, options \\\\ [])","anchor":"resolve_currency/2"},{"id":"resolve_per/2","deprecated":false,"title":"resolve_per(string, options \\\\ [])","anchor":"resolve_per/2"},{"id":"resolve_pers/2","deprecated":false,"title":"resolve_pers(list, options \\\\ [])","anchor":"resolve_pers/2"},{"id":"scan/2","deprecated":false,"title":"scan(string, options \\\\ [])","anchor":"scan/2"},{"id":"to_approx_string/2","deprecated":false,"title":"to_approx_string(number, options \\\\ [])","anchor":"to_approx_string/2"},{"id":"to_at_least_string/2","deprecated":false,"title":"to_at_least_string(number, options \\\\ [])","anchor":"to_at_least_string/2"},{"id":"to_at_most_string/2","deprecated":false,"title":"to_at_most_string(number, options \\\\ [])","anchor":"to_at_most_string/2"},{"id":"to_range_string/2","deprecated":false,"title":"to_range_string(range, options \\\\ [])","anchor":"to_range_string/2"},{"id":"to_string/2","deprecated":false,"title":"to_string(number, options \\\\ default_options())","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(number, options \\\\ default_options())","anchor":"to_string!/2"},{"id":"validate_number_system/2","deprecated":false,"title":"validate_number_system(locale, number_system)","anchor":"validate_number_system/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Cardinal","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Cardinal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"available_locale_names/0","deprecated":false,"title":"available_locale_names()","anchor":"available_locale_names/0"},{"id":"known_locale_names/0","deprecated":false,"title":"known_locale_names()","anchor":"known_locale_names/0"},{"id":"plural_rule/3","deprecated":false,"title":"plural_rule(number, locale, rounding \\\\ Math.default_rounding())","anchor":"plural_rule/3"},{"id":"plural_rules/0","deprecated":false,"title":"plural_rules()","anchor":"plural_rules/0"},{"id":"plural_rules_for/1","deprecated":false,"title":"plural_rules_for(locale_name)","anchor":"plural_rules_for/1"},{"id":"pluralize/3","deprecated":false,"title":"pluralize(number, locale_name, substitutions)","anchor":"pluralize/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Format","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Format","sections":[{"id":"Number Pattern Examples","anchor":"module-number-pattern-examples"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_formats_for/1","deprecated":false,"title":"all_formats_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"all_formats_for/1"},{"id":"all_formats_for!/1","deprecated":false,"title":"all_formats_for!(locale \\\\ Plausible.Cldr.get_locale())","anchor":"all_formats_for!/1"},{"id":"currency_spacing/2","deprecated":false,"title":"currency_spacing(locale, number_system)","anchor":"currency_spacing/2"},{"id":"decimal_format_list/0","deprecated":false,"title":"decimal_format_list()","anchor":"decimal_format_list/0"},{"id":"decimal_format_list_for/1","deprecated":false,"title":"decimal_format_list_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"decimal_format_list_for/1"},{"id":"default_grouping_for/1","deprecated":false,"title":"default_grouping_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"default_grouping_for/1"},{"id":"default_grouping_for!/1","deprecated":false,"title":"default_grouping_for!(locale)","anchor":"default_grouping_for!/1"},{"id":"formats_for/2","deprecated":false,"title":"formats_for(locale \\\\ Plausible.Cldr.default_locale(), number_system \\\\ Cldr.Number.System.default_number_system_type())","anchor":"formats_for/2"},{"id":"formats_for!/2","deprecated":false,"title":"formats_for!(locale \\\\ Plausible.Cldr.default_locale(), number_system \\\\ Cldr.Number.System.default_number_system_type())","anchor":"formats_for!/2"},{"id":"minimum_grouping_digits_for/1","deprecated":false,"title":"minimum_grouping_digits_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"minimum_grouping_digits_for/1"},{"id":"minimum_grouping_digits_for!/1","deprecated":false,"title":"minimum_grouping_digits_for!(locale)","anchor":"minimum_grouping_digits_for!/1"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Formatter.Decimal","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Formatter.Decimal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"metadata!/1","deprecated":false,"title":"metadata!(format)","anchor":"metadata!/1"},{"id":"to_string/3","deprecated":false,"title":"to_string(number, format, options \\\\ [])","anchor":"to_string/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Ordinal","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Ordinal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"available_locale_names/0","deprecated":false,"title":"available_locale_names()","anchor":"available_locale_names/0"},{"id":"known_locale_names/0","deprecated":false,"title":"known_locale_names()","anchor":"known_locale_names/0"},{"id":"plural_rule/3","deprecated":false,"title":"plural_rule(number, locale, rounding \\\\ Math.default_rounding())","anchor":"plural_rule/3"},{"id":"plural_rules/0","deprecated":false,"title":"plural_rules()","anchor":"plural_rules/0"},{"id":"plural_rules_for/1","deprecated":false,"title":"plural_rules_for(locale_name)","anchor":"plural_rules_for/1"},{"id":"pluralize/3","deprecated":false,"title":"pluralize(number, locale_name, substitutions)","anchor":"pluralize/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.PluralRule.Range","deprecated":false,"group":"","title":"Plausible.Cldr.Number.PluralRule.Range","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"plural_rule/3","deprecated":false,"title":"plural_rule(first, last, locale)","anchor":"plural_rule/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Symbol","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Symbol","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_decimal_symbols/0","deprecated":false,"title":"all_decimal_symbols()","anchor":"all_decimal_symbols/0"},{"id":"all_decimal_symbols_class/0","deprecated":false,"title":"all_decimal_symbols_class()","anchor":"all_decimal_symbols_class/0"},{"id":"all_grouping_symbols/0","deprecated":false,"title":"all_grouping_symbols()","anchor":"all_grouping_symbols/0"},{"id":"all_grouping_symbols_class/0","deprecated":false,"title":"all_grouping_symbols_class()","anchor":"all_grouping_symbols_class/0"},{"id":"number_symbols_for/1","deprecated":false,"title":"number_symbols_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"number_symbols_for/1"},{"id":"number_symbols_for/2","deprecated":false,"title":"number_symbols_for(locale, number_system)","anchor":"number_symbols_for/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.System","deprecated":false,"group":"","title":"Plausible.Cldr.Number.System","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"number_system_for/2","deprecated":false,"title":"number_system_for(locale, system_name)","anchor":"number_system_for/2"},{"id":"number_system_from_locale/1","deprecated":false,"title":"number_system_from_locale(locale)","anchor":"number_system_from_locale/1"},{"id":"number_system_names_for/1","deprecated":false,"title":"number_system_names_for(locale)","anchor":"number_system_names_for/1"},{"id":"number_system_names_for!/1","deprecated":false,"title":"number_system_names_for!(locale)","anchor":"number_system_names_for!/1"},{"id":"number_system_types_for/1","deprecated":false,"title":"number_system_types_for(locale)","anchor":"number_system_types_for/1"},{"id":"number_systems_for/1","deprecated":false,"title":"number_systems_for(locale)","anchor":"number_systems_for/1"},{"id":"number_systems_for!/1","deprecated":false,"title":"number_systems_for!(locale)","anchor":"number_systems_for!/1"},{"id":"number_systems_like/2","deprecated":false,"title":"number_systems_like(locale, number_system)","anchor":"number_systems_like/2"},{"id":"system_name_from/2","deprecated":false,"title":"system_name_from(system_name, locale)","anchor":"system_name_from/2"},{"id":"to_system/2","deprecated":false,"title":"to_system(number, system)","anchor":"to_system/2"},{"id":"to_system!/2","deprecated":false,"title":"to_system!(number, system_name)","anchor":"to_system!/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Transliterate","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Transliterate","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"transliterate/3","deprecated":false,"title":"transliterate(sequence, locale \\\\ Plausible.Cldr.get_locale(), number_system \\\\ System.default_number_system_type())","anchor":"transliterate/3"},{"id":"transliterate!/3","deprecated":false,"title":"transliterate!(sequence, locale, number_system)","anchor":"transliterate!/3"},{"id":"transliterate_digits/3","deprecated":false,"title":"transliterate_digits(digits, from_system, to_system)","anchor":"transliterate_digits/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Rbnf.NumberSystem","deprecated":false,"group":"","title":"Plausible.Cldr.Rbnf.NumberSystem","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_rule_sets/0","deprecated":false,"title":"all_rule_sets()","anchor":"all_rule_sets/0"},{"id":"armenian_lower/1","deprecated":false,"title":"armenian_lower(number)","anchor":"armenian_lower/1"},{"id":"armenian_lower/2","deprecated":false,"title":"armenian_lower(number, locale)","anchor":"armenian_lower/2"},{"id":"armenian_upper/1","deprecated":false,"title":"armenian_upper(number)","anchor":"armenian_upper/1"},{"id":"armenian_upper/2","deprecated":false,"title":"armenian_upper(number, locale)","anchor":"armenian_upper/2"},{"id":"cyrillic_lower/1","deprecated":false,"title":"cyrillic_lower(number)","anchor":"cyrillic_lower/1"},{"id":"cyrillic_lower/2","deprecated":false,"title":"cyrillic_lower(number, locale)","anchor":"cyrillic_lower/2"},{"id":"cyrillic_lower_1_10/2","deprecated":false,"title":"cyrillic_lower_1_10(number, language_tag)","anchor":"cyrillic_lower_1_10/2"},{"id":"cyrillic_lower_final/2","deprecated":false,"title":"cyrillic_lower_final(number, language_tag)","anchor":"cyrillic_lower_final/2"},{"id":"cyrillic_lower_post/2","deprecated":false,"title":"cyrillic_lower_post(number, language_tag)","anchor":"cyrillic_lower_post/2"},{"id":"cyrillic_lower_thousands/2","deprecated":false,"title":"cyrillic_lower_thousands(number, language_tag)","anchor":"cyrillic_lower_thousands/2"},{"id":"ethiopic/1","deprecated":false,"title":"ethiopic(number)","anchor":"ethiopic/1"},{"id":"ethiopic/2","deprecated":false,"title":"ethiopic(number, locale)","anchor":"ethiopic/2"},{"id":"ethiopic_p1/2","deprecated":false,"title":"ethiopic_p1(number, language_tag)","anchor":"ethiopic_p1/2"},{"id":"ethiopic_p2/2","deprecated":false,"title":"ethiopic_p2(number, language_tag)","anchor":"ethiopic_p2/2"},{"id":"ethiopic_p3/2","deprecated":false,"title":"ethiopic_p3(number, language_tag)","anchor":"ethiopic_p3/2"},{"id":"ethiopic_p/2","deprecated":false,"title":"ethiopic_p(number, language_tag)","anchor":"ethiopic_p/2"},{"id":"georgian/1","deprecated":false,"title":"georgian(number)","anchor":"georgian/1"},{"id":"georgian/2","deprecated":false,"title":"georgian(number, locale)","anchor":"georgian/2"},{"id":"greek_lower/1","deprecated":false,"title":"greek_lower(number)","anchor":"greek_lower/1"},{"id":"greek_lower/2","deprecated":false,"title":"greek_lower(number, locale)","anchor":"greek_lower/2"},{"id":"greek_numeral_majuscules/2","deprecated":false,"title":"greek_numeral_majuscules(number, language_tag)","anchor":"greek_numeral_majuscules/2"},{"id":"greek_numeral_minuscules/2","deprecated":false,"title":"greek_numeral_minuscules(number, language_tag)","anchor":"greek_numeral_minuscules/2"},{"id":"greek_upper/1","deprecated":false,"title":"greek_upper(number)","anchor":"greek_upper/1"},{"id":"greek_upper/2","deprecated":false,"title":"greek_upper(number, locale)","anchor":"greek_upper/2"},{"id":"hebrew/1","deprecated":false,"title":"hebrew(number)","anchor":"hebrew/1"},{"id":"hebrew/2","deprecated":false,"title":"hebrew(number, locale)","anchor":"hebrew/2"},{"id":"hebrew_0_99/2","deprecated":false,"title":"hebrew_0_99(number, language_tag)","anchor":"hebrew_0_99/2"},{"id":"hebrew_item/1","deprecated":false,"title":"hebrew_item(number)","anchor":"hebrew_item/1"},{"id":"hebrew_item/2","deprecated":false,"title":"hebrew_item(number, locale)","anchor":"hebrew_item/2"},{"id":"hebrew_item_hundreds/2","deprecated":false,"title":"hebrew_item_hundreds(number, language_tag)","anchor":"hebrew_item_hundreds/2"},{"id":"hebrew_thousands/2","deprecated":false,"title":"hebrew_thousands(number, language_tag)","anchor":"hebrew_thousands/2"},{"id":"roman_lower/1","deprecated":false,"title":"roman_lower(number)","anchor":"roman_lower/1"},{"id":"roman_lower/2","deprecated":false,"title":"roman_lower(number, locale)","anchor":"roman_lower/2"},{"id":"roman_upper/1","deprecated":false,"title":"roman_upper(number)","anchor":"roman_upper/1"},{"id":"roman_upper/2","deprecated":false,"title":"roman_upper(number, locale)","anchor":"roman_upper/2"},{"id":"rule_sets/0","deprecated":false,"title":"rule_sets()","anchor":"rule_sets/0"},{"id":"rule_sets/1","deprecated":false,"title":"rule_sets(rbnf_locale_name)","anchor":"rule_sets/1"},{"id":"tamil/1","deprecated":false,"title":"tamil(number)","anchor":"tamil/1"},{"id":"tamil/2","deprecated":false,"title":"tamil(number, locale)","anchor":"tamil/2"},{"id":"tamil_thousands/2","deprecated":false,"title":"tamil_thousands(number, language_tag)","anchor":"tamil_thousands/2"},{"id":"zz_default/1","deprecated":false,"title":"zz_default(number)","anchor":"zz_default/1"},{"id":"zz_default/2","deprecated":false,"title":"zz_default(number, locale)","anchor":"zz_default/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Rbnf.Ordinal","deprecated":false,"group":"","title":"Plausible.Cldr.Rbnf.Ordinal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_rule_sets/0","deprecated":false,"title":"all_rule_sets()","anchor":"all_rule_sets/0"},{"id":"digits_ordinal/2","deprecated":false,"title":"digits_ordinal(number, locale)","anchor":"digits_ordinal/2"},{"id":"rule_sets/0","deprecated":false,"title":"rule_sets()","anchor":"rule_sets/0"},{"id":"rule_sets/1","deprecated":false,"title":"rule_sets(rbnf_locale_name)","anchor":"rule_sets/1"}],"key":"functions"}]},{"id":"Plausible.Cldr.Rbnf.Spellout","deprecated":false,"group":"","title":"Plausible.Cldr.Rbnf.Spellout","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_rule_sets/0","deprecated":false,"title":"all_rule_sets()","anchor":"all_rule_sets/0"},{"id":"and/2","deprecated":false,"title":"number and language_tag","anchor":"and/2"},{"id":"and_o/2","deprecated":false,"title":"and_o(number, language_tag)","anchor":"and_o/2"},{"id":"commas/2","deprecated":false,"title":"commas(number, language_tag)","anchor":"commas/2"},{"id":"commas_o/2","deprecated":false,"title":"commas_o(number, language_tag)","anchor":"commas_o/2"},{"id":"r2d_year/2","deprecated":false,"title":"r2d_year(number, language_tag)","anchor":"r2d_year/2"},{"id":"rule_sets/0","deprecated":false,"title":"rule_sets()","anchor":"rule_sets/0"},{"id":"rule_sets/1","deprecated":false,"title":"rule_sets(rbnf_locale_name)","anchor":"rule_sets/1"},{"id":"spellout_cardinal/2","deprecated":false,"title":"spellout_cardinal(number, locale)","anchor":"spellout_cardinal/2"},{"id":"spellout_cardinal_verbose/2","deprecated":false,"title":"spellout_cardinal_verbose(number, locale)","anchor":"spellout_cardinal_verbose/2"},{"id":"spellout_numbering/2","deprecated":false,"title":"spellout_numbering(number, locale)","anchor":"spellout_numbering/2"},{"id":"spellout_numbering_verbose/2","deprecated":false,"title":"spellout_numbering_verbose(number, locale)","anchor":"spellout_numbering_verbose/2"},{"id":"spellout_numbering_year/2","deprecated":false,"title":"spellout_numbering_year(number, locale)","anchor":"spellout_numbering_year/2"},{"id":"spellout_ordinal/2","deprecated":false,"title":"spellout_ordinal(number, locale)","anchor":"spellout_ordinal/2"},{"id":"spellout_ordinal_verbose/2","deprecated":false,"title":"spellout_ordinal_verbose(number, locale)","anchor":"spellout_ordinal_verbose/2"},{"id":"th/2","deprecated":false,"title":"th(number, language_tag)","anchor":"th/2"},{"id":"tieth/2","deprecated":false,"title":"tieth(number, language_tag)","anchor":"tieth/2"}],"key":"functions"}]},{"id":"Plausible.ClickhouseEventV2","deprecated":false,"group":"","title":"Plausible.ClickhouseEventV2","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"new/1","deprecated":false,"title":"new(attrs)","anchor":"new/1"}],"key":"functions"}]},{"id":"Plausible.ClickhouseRepo","deprecated":false,"group":"","title":"Plausible.ClickhouseRepo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"parallel_tasks/1","deprecated":false,"title":"parallel_tasks(queries)","anchor":"parallel_tasks/1"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"}],"key":"functions"}]},{"id":"Plausible.ClickhouseSessionV2","deprecated":false,"group":"","title":"Plausible.ClickhouseSessionV2","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"random_uint64/0","deprecated":false,"title":"random_uint64()","anchor":"random_uint64/0"}],"key":"functions"}]},{"id":"Plausible.ClickhouseSessionV2.BoolUInt8","deprecated":false,"group":"","title":"Plausible.ClickhouseSessionV2.BoolUInt8","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"}],"key":"functions"}]},{"id":"Plausible.ConfigHelpers","deprecated":false,"group":"","title":"Plausible.ConfigHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_int_from_path_or_env/3","deprecated":false,"title":"get_int_from_path_or_env(config_dir, var_name, default \\\\ nil)","anchor":"get_int_from_path_or_env/3"},{"id":"get_var_from_path_or_env/3","deprecated":false,"title":"get_var_from_path_or_env(config_dir, var_name, default \\\\ nil)","anchor":"get_var_from_path_or_env/3"}],"key":"functions"}]},{"id":"Plausible.DataCase","deprecated":false,"group":"","title":"Plausible.DataCase","sections":[]},{"id":"Plausible.DataMigration","deprecated":false,"group":"","title":"Plausible.DataMigration","sections":[]},{"id":"Plausible.DataMigration.NumericIDs","deprecated":false,"group":"","title":"Plausible.DataMigration.NumericIDs","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/3","deprecated":false,"title":"confirm(message, func, default_choice \\\\ :yes)","anchor":"confirm/3"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/2","deprecated":false,"title":"run_sql(name, assigns \\\\ [])","anchor":"run_sql/2"},{"id":"run_sql_confirm/2","deprecated":false,"title":"run_sql_confirm(name, options \\\\ [])","anchor":"run_sql_confirm/2"}],"key":"functions"}]},{"id":"Plausible.DataMigration.Repo","deprecated":false,"group":"","title":"Plausible.DataMigration.Repo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start/2","deprecated":false,"title":"start(url, max_threads)","anchor":"start/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.DebugReplayInfo","deprecated":false,"group":"","title":"Plausible.DebugReplayInfo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"deserialize/1","deprecated":false,"title":"deserialize(replay_info)","anchor":"deserialize/1"},{"id":"include_sentry_replay_info/0","deprecated":false,"title":"include_sentry_replay_info()","anchor":"include_sentry_replay_info/0"}],"key":"functions"}]},{"id":"Plausible.Ecto.EventName","deprecated":false,"group":"","title":"Plausible.Ecto.EventName","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(val)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(val)","anchor":"dump/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","deprecated":false,"title":"load(val)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Plausible.Factory","deprecated":false,"group":"","title":"Plausible.Factory","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api_key_factory/0","deprecated":false,"title":"api_key_factory()","anchor":"api_key_factory/0"},{"id":"build/2","deprecated":false,"title":"build(factory_name, attrs \\\\ %{})","anchor":"build/2"},{"id":"build_list/3","deprecated":false,"title":"build_list(number_of_records, factory_name, attrs \\\\ %{})","anchor":"build_list/3"},{"id":"build_pair/2","deprecated":false,"title":"build_pair(factory_name, attrs \\\\ %{})","anchor":"build_pair/2"},{"id":"business_subscription_factory/0","deprecated":false,"title":"business_subscription_factory()","anchor":"business_subscription_factory/0"},{"id":"ch_session_factory/0","deprecated":false,"title":"ch_session_factory()","anchor":"ch_session_factory/0"},{"id":"create/1","deprecated":false,"title":"create(_)","anchor":"create/1"},{"id":"create/2","deprecated":false,"title":"create(_, _)","anchor":"create/2"},{"id":"create_list/3","deprecated":false,"title":"create_list(_, _, _)","anchor":"create_list/3"},{"id":"create_pair/2","deprecated":false,"title":"create_pair(_, _)","anchor":"create_pair/2"},{"id":"enterprise_plan_factory/0","deprecated":false,"title":"enterprise_plan_factory()","anchor":"enterprise_plan_factory/0"},{"id":"event_factory/0","deprecated":false,"title":"event_factory()","anchor":"event_factory/0"},{"id":"factory/1","deprecated":false,"title":"factory(factory_name)","anchor":"factory/1"},{"id":"goal_factory/0","deprecated":false,"title":"goal_factory()","anchor":"goal_factory/0"},{"id":"google_auth_factory/0","deprecated":false,"title":"google_auth_factory()","anchor":"google_auth_factory/0"},{"id":"growth_subscription_factory/0","deprecated":false,"title":"growth_subscription_factory()","anchor":"growth_subscription_factory/0"},{"id":"imported_browsers_factory/0","deprecated":false,"title":"imported_browsers_factory()","anchor":"imported_browsers_factory/0"},{"id":"imported_devices_factory/0","deprecated":false,"title":"imported_devices_factory()","anchor":"imported_devices_factory/0"},{"id":"imported_entry_pages_factory/0","deprecated":false,"title":"imported_entry_pages_factory()","anchor":"imported_entry_pages_factory/0"},{"id":"imported_exit_pages_factory/0","deprecated":false,"title":"imported_exit_pages_factory()","anchor":"imported_exit_pages_factory/0"},{"id":"imported_locations_factory/0","deprecated":false,"title":"imported_locations_factory()","anchor":"imported_locations_factory/0"},{"id":"imported_operating_systems_factory/0","deprecated":false,"title":"imported_operating_systems_factory()","anchor":"imported_operating_systems_factory/0"},{"id":"imported_pages_factory/0","deprecated":false,"title":"imported_pages_factory()","anchor":"imported_pages_factory/0"},{"id":"imported_sources_factory/0","deprecated":false,"title":"imported_sources_factory()","anchor":"imported_sources_factory/0"},{"id":"imported_visitors_factory/0","deprecated":false,"title":"imported_visitors_factory()","anchor":"imported_visitors_factory/0"},{"id":"insert/1","deprecated":false,"title":"insert(already_built_record)","anchor":"insert/1"},{"id":"insert/2","deprecated":false,"title":"insert(already_built_record, function_opts)","anchor":"insert/2"},{"id":"insert/3","deprecated":false,"title":"insert(factory_name, attrs, opts)","anchor":"insert/3"},{"id":"insert_list/3","deprecated":false,"title":"insert_list(number_of_records, factory_name, attrs \\\\ %{})","anchor":"insert_list/3"},{"id":"insert_list/4","deprecated":false,"title":"insert_list(number_of_records, factory_name, attrs, opts)","anchor":"insert_list/4"},{"id":"insert_pair/2","deprecated":false,"title":"insert_pair(factory_name, attrs \\\\ %{})","anchor":"insert_pair/2"},{"id":"insert_pair/3","deprecated":false,"title":"insert_pair(factory_name, attrs, opts)","anchor":"insert_pair/3"},{"id":"invitation_factory/0","deprecated":false,"title":"invitation_factory()","anchor":"invitation_factory/0"},{"id":"monthly_report_factory/0","deprecated":false,"title":"monthly_report_factory()","anchor":"monthly_report_factory/0"},{"id":"pageview_factory/0","deprecated":false,"title":"pageview_factory()","anchor":"pageview_factory/0"},{"id":"params_for/2","deprecated":false,"title":"params_for(factory_name, attrs \\\\ %{})","anchor":"params_for/2"},{"id":"params_with_assocs/2","deprecated":false,"title":"params_with_assocs(factory_name, attrs \\\\ %{})","anchor":"params_with_assocs/2"},{"id":"shared_link_factory/0","deprecated":false,"title":"shared_link_factory()","anchor":"shared_link_factory/0"},{"id":"site_factory/1","deprecated":false,"title":"site_factory(attrs)","anchor":"site_factory/1"},{"id":"site_membership_factory/0","deprecated":false,"title":"site_membership_factory()","anchor":"site_membership_factory/0"},{"id":"spike_notification_factory/0","deprecated":false,"title":"spike_notification_factory()","anchor":"spike_notification_factory/0"},{"id":"string_params_for/2","deprecated":false,"title":"string_params_for(factory_name, attrs \\\\ %{})","anchor":"string_params_for/2"},{"id":"string_params_with_assocs/2","deprecated":false,"title":"string_params_with_assocs(factory_name, attrs \\\\ %{})","anchor":"string_params_with_assocs/2"},{"id":"subscription_factory/0","deprecated":false,"title":"subscription_factory()","anchor":"subscription_factory/0"},{"id":"user_factory/1","deprecated":false,"title":"user_factory(attrs)","anchor":"user_factory/1"},{"id":"weekly_report_factory/0","deprecated":false,"title":"weekly_report_factory()","anchor":"weekly_report_factory/0"}],"key":"functions"}]},{"id":"Plausible.Funnel","deprecated":false,"group":"","title":"Plausible.Funnel","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(funnel \\\\ %__MODULE__{}, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"max_steps/0","deprecated":false,"title":"max_steps()","anchor":"max_steps/0"},{"id":"min_steps/0","deprecated":false,"title":"min_steps()","anchor":"min_steps/0"},{"id":"put_step_orders/1","deprecated":false,"title":"put_step_orders(changeset)","anchor":"put_step_orders/1"}],"key":"functions"}]},{"id":"Plausible.Funnel.Const","deprecated":false,"group":"","title":"Plausible.Funnel.Const","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"max_steps/0","deprecated":false,"title":"max_steps()","anchor":"max_steps/0"},{"id":"min_steps/0","deprecated":false,"title":"min_steps()","anchor":"min_steps/0"}],"key":"functions"}]},{"id":"Plausible.Funnel.Step","deprecated":false,"group":"","title":"Plausible.Funnel.Step","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(step, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Funnels","deprecated":false,"group":"","title":"Plausible.Funnels","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/3","deprecated":false,"title":"create(site, name, steps)","anchor":"create/3"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(site, name, steps)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(site_id, funnel_id)","anchor":"delete/2"},{"id":"ephemeral_definition/3","deprecated":false,"title":"ephemeral_definition(site, name, steps)","anchor":"ephemeral_definition/3"},{"id":"get/2","deprecated":false,"title":"get(site_id, by)","anchor":"get/2"},{"id":"list/1","deprecated":false,"title":"list(site)","anchor":"list/1"}],"key":"functions"}]},{"id":"Plausible.Geo","deprecated":false,"group":"","title":"Plausible.Geo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"await_loader/0","deprecated":false,"title":"await_loader()","anchor":"await_loader/0"},{"id":"database_type/0","deprecated":false,"title":"database_type()","anchor":"database_type/0"},{"id":"load_db/1","deprecated":false,"title":"load_db(opts)","anchor":"load_db/1"},{"id":"lookup/1","deprecated":false,"title":"lookup(ip_address)","anchor":"lookup/1"}],"key":"functions"}]},{"id":"Plausible.Goal","deprecated":false,"group":"","title":"Plausible.Goal","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(goal, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Goal.Revenue","deprecated":false,"group":"","title":"Plausible.Goal.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"currency_options/0","deprecated":false,"title":"currency_options()","anchor":"currency_options/0"},{"id":"revenue?/1","deprecated":false,"title":"revenue?(goal)","anchor":"revenue?/1"},{"id":"valid_currencies/0","deprecated":false,"title":"valid_currencies()","anchor":"valid_currencies/0"}],"key":"functions"}]},{"id":"Plausible.Goals","deprecated":false,"group":"","title":"Plausible.Goals","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"count/1","deprecated":false,"title":"count(site)","anchor":"count/1"},{"id":"create/3","deprecated":false,"title":"create(site, params, opts \\\\ [])","anchor":"create/3"},{"id":"delete/2","deprecated":false,"title":"delete(id, site_id)","anchor":"delete/2"},{"id":"find_or_create/2","deprecated":false,"title":"find_or_create(site, map)","anchor":"find_or_create/2"},{"id":"for_site/2","deprecated":false,"title":"for_site(site, opts \\\\ [])","anchor":"for_site/2"},{"id":"for_site_query/2","deprecated":false,"title":"for_site_query(site, opts \\\\ [])","anchor":"for_site_query/2"}],"key":"functions"}]},{"id":"Plausible.Google.Api","deprecated":false,"group":"","title":"Plausible.Google.Api","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"google_analytics_view/0","deprecated":false,"title":"google_analytics_view()","anchor":"t:google_analytics_view/0"},{"id":"import_auth/0","deprecated":false,"title":"import_auth()","anchor":"t:import_auth/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"fetch_and_persist/3","deprecated":false,"title":"fetch_and_persist(site, report_request, opts \\\\ [])","anchor":"fetch_and_persist/3"},{"id":"fetch_stats/3","deprecated":false,"title":"fetch_stats(site, map, limit)","anchor":"fetch_stats/3"},{"id":"fetch_verified_properties/1","deprecated":false,"title":"fetch_verified_properties(auth)","anchor":"fetch_verified_properties/1"},{"id":"get_view/2","deprecated":false,"title":"get_view(access_token, lookup_id)","anchor":"get_view/2"},{"id":"import_analytics/4","deprecated":false,"title":"import_analytics(site, date_range, view_id, auth)","anchor":"import_analytics/4"},{"id":"import_authorize_url/2","deprecated":false,"title":"import_authorize_url(site_id, redirect_to)","anchor":"import_authorize_url/2"},{"id":"list_views/1","deprecated":false,"title":"list_views(access_token)","anchor":"list_views/1"},{"id":"search_console_authorize_url/2","deprecated":false,"title":"search_console_authorize_url(site_id, redirect_to)","anchor":"search_console_authorize_url/2"}],"key":"functions"}]},{"id":"Plausible.Google.Api.Mock","deprecated":false,"group":"","title":"Plausible.Google.Api.Mock","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_stats/3","deprecated":false,"title":"fetch_stats(auth, query, limit)","anchor":"fetch_stats/3"}],"key":"functions"}]},{"id":"Plausible.Google.Buffer","deprecated":false,"group":"","title":"Plausible.Google.Buffer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"flush/2","deprecated":false,"title":"flush(pid, timeout \\\\ :infinity)","anchor":"flush/2"},{"id":"handle_continue/2","deprecated":false,"title":"handle_continue(arg, state)","anchor":"handle_continue/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"},{"id":"insert_many/3","deprecated":false,"title":"insert_many(pid, table_name, records)","anchor":"insert_many/3"},{"id":"size/2","deprecated":false,"title":"size(pid, table_name)","anchor":"size/2"},{"id":"start_link/0","deprecated":false,"title":"start_link()","anchor":"start_link/0"},{"id":"stop/1","deprecated":false,"title":"stop(pid)","anchor":"stop/1"}],"key":"functions"}]},{"id":"Plausible.Google.HTTP","deprecated":false,"group":"","title":"Plausible.Google.HTTP","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_access_token/1","deprecated":false,"title":"fetch_access_token(code)","anchor":"fetch_access_token/1"},{"id":"get_analytics_start_date/2","deprecated":false,"title":"get_analytics_start_date(view_id, access_token)","anchor":"get_analytics_start_date/2"},{"id":"get_report/1","deprecated":false,"title":"get_report(report_request)","anchor":"get_report/1"},{"id":"list_sites/1","deprecated":false,"title":"list_sites(access_token)","anchor":"list_sites/1"},{"id":"list_stats/5","deprecated":false,"title":"list_stats(access_token, property, date_range, limit, page \\\\ nil)","anchor":"list_stats/5"},{"id":"list_views_for_user/1","deprecated":false,"title":"list_views_for_user(access_token)","anchor":"list_views_for_user/1"},{"id":"refresh_auth_token/1","deprecated":false,"title":"refresh_auth_token(refresh_token)","anchor":"refresh_auth_token/1"}],"key":"functions"}]},{"id":"Plausible.Google.ReportRequest","deprecated":false,"group":"","title":"Plausible.Google.ReportRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"full_report/0","deprecated":false,"title":"full_report()","anchor":"full_report/0"}],"key":"functions"}]},{"id":"Plausible.HTTPClient","deprecated":false,"group":"","title":"Plausible.HTTPClient","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/3","deprecated":false,"title":"get(url, headers \\\\ [], params \\\\ nil)","anchor":"get/3"},{"id":"impl/0","deprecated":false,"title":"impl()","anchor":"impl/0"},{"id":"post/4","deprecated":false,"title":"post(url, headers \\\\ [], params \\\\ nil, finch_req_opts \\\\ [])","anchor":"post/4"}],"key":"functions"}]},{"id":"Plausible.HTTPClient.Interface","deprecated":false,"group":"","title":"Plausible.HTTPClient.Interface","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"finch_request_opts/0","deprecated":false,"title":"finch_request_opts()","anchor":"t:finch_request_opts/0"},{"id":"headers/0","deprecated":false,"title":"headers()","anchor":"t:headers/0"},{"id":"params/0","deprecated":false,"title":"params()","anchor":"t:params/0"},{"id":"response/0","deprecated":false,"title":"response()","anchor":"t:response/0"},{"id":"url/0","deprecated":false,"title":"url()","anchor":"t:url/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"get/1","deprecated":false,"title":"get(url)","anchor":"c:get/1"},{"id":"get/2","deprecated":false,"title":"get(url, headers)","anchor":"c:get/2"},{"id":"get/3","deprecated":false,"title":"get(url, headers, params)","anchor":"c:get/3"},{"id":"post/3","deprecated":false,"title":"post(url, headers, params)","anchor":"c:post/3"},{"id":"post/4","deprecated":false,"title":"post(url, headers, params, finch_request_opts)","anchor":"c:post/4"}],"key":"callbacks"}]},{"id":"Plausible.HTTPClient.Non200Error","deprecated":false,"group":"","title":"Plausible.HTTPClient.Non200Error","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","deprecated":false,"title":"new(response)","anchor":"new/1"}],"key":"functions"}]},{"id":"Plausible.Helpers.JSON","deprecated":false,"group":"","title":"Plausible.Helpers.JSON","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"decode_or_fallback/1","deprecated":false,"title":"decode_or_fallback(raw)","anchor":"decode_or_fallback/1"}],"key":"functions"}]},{"id":"Plausible.ImportDeletionRepo","deprecated":false,"group":"","title":"Plausible.ImportDeletionRepo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.Imported","deprecated":false,"group":"","title":"Plausible.Imported","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"forget/1","deprecated":false,"title":"forget(site)","anchor":"forget/1"},{"id":"from_google_analytics/3","deprecated":false,"title":"from_google_analytics(data, site_id, table)","anchor":"from_google_analytics/3"},{"id":"tables/0","deprecated":false,"title":"tables()","anchor":"tables/0"}],"key":"functions"}]},{"id":"Plausible.IngestRepo","deprecated":false,"group":"","title":"Plausible.IngestRepo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Counters","deprecated":false,"group":"","title":"Plausible.Ingestion.Counters","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"},{"id":"stop/1","deprecated":false,"title":"stop(pid)","anchor":"stop/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Counters.Buffer","deprecated":false,"group":"","title":"Plausible.Ingestion.Counters.Buffer","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"bucket_fn_opt/0","deprecated":false,"title":"bucket_fn_opt()","anchor":"t:bucket_fn_opt/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"},{"id":"unix_timestamp/0","deprecated":false,"title":"unix_timestamp()","anchor":"t:unix_timestamp/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"aggregate/4","deprecated":false,"title":"aggregate(buffer, metric, domain, timestamp)","anchor":"aggregate/4"},{"id":"bucket_10s/1","deprecated":false,"title":"bucket_10s(datetime)","anchor":"bucket_10s/1"},{"id":"flush/2","deprecated":false,"title":"flush(buffer, now \\\\ DateTime.utc_now())","anchor":"flush/2"},{"id":"new/2","deprecated":false,"title":"new(buffer_name, opts \\\\ [])","anchor":"new/2"},{"id":"previous_10s/1","deprecated":false,"title":"previous_10s(datetime)","anchor":"previous_10s/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Counters.Record","deprecated":false,"group":"","title":"Plausible.Ingestion.Counters.Record","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Plausible.Ingestion.Counters.TelemetryHandler","deprecated":false,"group":"","title":"Plausible.Ingestion.Counters.TelemetryHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","deprecated":false,"title":"handle_event(list, measurements, map, buffer)","anchor":"handle_event/4"},{"id":"install/1","deprecated":false,"title":"install(buffer)","anchor":"install/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Event","deprecated":false,"group":"","title":"Plausible.Ingestion.Event","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"drop_reason/0","deprecated":false,"title":"drop_reason()","anchor":"t:drop_reason/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"build_and_buffer/1","deprecated":false,"title":"build_and_buffer(request)","anchor":"build_and_buffer/1"},{"id":"emit_telemetry_buffered/1","deprecated":false,"title":"emit_telemetry_buffered(event)","anchor":"emit_telemetry_buffered/1"},{"id":"emit_telemetry_dropped/2","deprecated":false,"title":"emit_telemetry_dropped(event, reason)","anchor":"emit_telemetry_dropped/2"},{"id":"telemetry_event_buffered/0","deprecated":false,"title":"telemetry_event_buffered()","anchor":"telemetry_event_buffered/0"},{"id":"telemetry_event_dropped/0","deprecated":false,"title":"telemetry_event_dropped()","anchor":"telemetry_event_dropped/0"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Event.Revenue","deprecated":false,"group":"","title":"Plausible.Ingestion.Event.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_revenue_attrs/1","deprecated":false,"title":"get_revenue_attrs(event)","anchor":"get_revenue_attrs/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Request","deprecated":false,"group":"","title":"Plausible.Ingestion.Request","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"build/2","deprecated":false,"title":"build(conn, now \\\\ NaiveDateTime.utc_now())","anchor":"build/2"},{"id":"sanitize_hostname/1","deprecated":false,"title":"sanitize_hostname(hostname)","anchor":"sanitize_hostname/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Request.Revenue","deprecated":false,"group":"","title":"Plausible.Ingestion.Request.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"put_revenue_source/2","deprecated":false,"title":"put_revenue_source(changeset, request_body)","anchor":"put_revenue_source/2"}],"key":"functions"}]},{"id":"Plausible.Mailer","deprecated":false,"group":"","title":"Plausible.Mailer","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"result/0","deprecated":false,"title":"result()","anchor":"t:result/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"deliver/1","deprecated":false,"title":"deliver(email)","anchor":"deliver/1"},{"id":"deliver_later/2","deprecated":false,"title":"deliver_later(email, opts \\\\ [])","anchor":"deliver_later/2"},{"id":"deliver_later!/2","deprecated":false,"title":"deliver_later!(email, opts \\\\ [])","anchor":"deliver_later!/2"},{"id":"deliver_now/2","deprecated":false,"title":"deliver_now(email, opts \\\\ [])","anchor":"deliver_now/2"},{"id":"deliver_now!/2","deprecated":false,"title":"deliver_now!(email, opts \\\\ [])","anchor":"deliver_now!/2"},{"id":"send/1","deprecated":false,"title":"send(email)","anchor":"send/1"}],"key":"functions"}]},{"id":"Plausible.OpenTelemetry.Sampler","deprecated":false,"group":"","title":"Plausible.OpenTelemetry.Sampler","sections":[]},{"id":"Plausible.PaddleApi.Mock","deprecated":false,"group":"","title":"Plausible.PaddleApi.Mock","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_prices/1","deprecated":false,"title":"fetch_prices(product_ids)","anchor":"fetch_prices/1"},{"id":"get_invoices/1","deprecated":false,"title":"get_invoices(subscription)","anchor":"get_invoices/1"},{"id":"get_subscription/1","deprecated":false,"title":"get_subscription(_)","anchor":"get_subscription/1"},{"id":"update_subscription/2","deprecated":false,"title":"update_subscription(_, map)","anchor":"update_subscription/2"},{"id":"update_subscription_preview/2","deprecated":false,"title":"update_subscription_preview(user, new_plan_id)","anchor":"update_subscription_preview/2"}],"key":"functions"}]},{"id":"Plausible.Pagination","deprecated":false,"group":"","title":"Plausible.Pagination","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"paginate/4","deprecated":false,"title":"paginate(queryable, params, opts, repo_opts \\\\ [])","anchor":"paginate/4"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.CustomProps","deprecated":false,"group":"","title":"Plausible.Plugins.API.CustomProps","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"disable/2","deprecated":false,"title":"disable(site, prop_or_props)","anchor":"disable/2"},{"id":"enable/2","deprecated":false,"title":"enable(site, prop_or_props)","anchor":"enable/2"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.Goals","deprecated":false,"group":"","title":"Plausible.Plugins.API.Goals","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"create_request/0","deprecated":false,"title":"create_request()","anchor":"t:create_request/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(site, goal_or_goals)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(site, id_or_ids)","anchor":"delete/2"},{"id":"get/2","deprecated":false,"title":"get(site, id)","anchor":"get/2"},{"id":"get_goals/2","deprecated":false,"title":"get_goals(site, params)","anchor":"get_goals/2"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.SharedLinks","deprecated":false,"group":"","title":"Plausible.Plugins.API.SharedLinks","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/2","deprecated":false,"title":"get(site, id)","anchor":"get/2"},{"id":"get_or_create/3","deprecated":false,"title":"get_or_create(site, name, password \\\\ nil)","anchor":"get_or_create/3"},{"id":"get_shared_links/2","deprecated":false,"title":"get_shared_links(site, params)","anchor":"get_shared_links/2"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.Token","deprecated":false,"group":"","title":"Plausible.Plugins.API.Token","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"generate/1","deprecated":false,"title":"generate(random_bytes \\\\ random_bytes())","anchor":"generate/1"},{"id":"hash/1","deprecated":false,"title":"hash(raw)","anchor":"hash/1"},{"id":"insert_changeset/3","deprecated":false,"title":"insert_changeset(site, map, attrs \\\\ %{})","anchor":"insert_changeset/3"},{"id":"last_used_humanize/1","deprecated":false,"title":"last_used_humanize(token)","anchor":"last_used_humanize/1"},{"id":"prefix/0","deprecated":false,"title":"prefix()","anchor":"prefix/0"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.Tokens","deprecated":false,"group":"","title":"Plausible.Plugins.API.Tokens","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"any?/1","deprecated":false,"title":"any?(site)","anchor":"any?/1"},{"id":"create/3","deprecated":false,"title":"create(site, description, generated_token \\\\ Token.generate())","anchor":"create/3"},{"id":"delete/2","deprecated":false,"title":"delete(site, token_id)","anchor":"delete/2"},{"id":"find/1","deprecated":false,"title":"find(raw)","anchor":"find/1"},{"id":"list/1","deprecated":false,"title":"list(site)","anchor":"list/1"},{"id":"update_last_seen/2","deprecated":false,"title":"update_last_seen(token, now \\\\ NaiveDateTime.utc_now())","anchor":"update_last_seen/2"}],"key":"functions"}]},{"id":"Plausible.PromEx","deprecated":false,"group":"","title":"Plausible.PromEx","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"}],"key":"functions"}]},{"id":"Plausible.PromEx.Plugins.PlausibleMetrics","deprecated":false,"group":"","title":"Plausible.PromEx.Plugins.PlausibleMetrics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"execute_cache_metrics/0","deprecated":false,"title":"execute_cache_metrics()","anchor":"execute_cache_metrics/0"},{"id":"execute_write_buffer_metrics/0","deprecated":false,"title":"execute_write_buffer_metrics()","anchor":"execute_write_buffer_metrics/0"}],"key":"functions"}]},{"id":"Plausible.Props","deprecated":false,"group":"","title":"Plausible.Props","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"prop/0","deprecated":false,"title":"prop()","anchor":"t:prop/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"allow/2","deprecated":false,"title":"allow(site, prop_or_props)","anchor":"allow/2"},{"id":"allow_changeset/2","deprecated":false,"title":"allow_changeset(site, prop_or_props)","anchor":"allow_changeset/2"},{"id":"allow_existing_props/1","deprecated":false,"title":"allow_existing_props(site)","anchor":"allow_existing_props/1"},{"id":"configured?/1","deprecated":false,"title":"configured?(site)","anchor":"configured?/1"},{"id":"disallow/2","deprecated":false,"title":"disallow(site, prop_or_props)","anchor":"disallow/2"},{"id":"ensure_prop_key_accessible/2","deprecated":false,"title":"ensure_prop_key_accessible(prop_key, user)","anchor":"ensure_prop_key_accessible/2"},{"id":"internal_keys/0","deprecated":false,"title":"internal_keys()","anchor":"internal_keys/0"},{"id":"max_prop_key_length/0","deprecated":false,"title":"max_prop_key_length()","anchor":"max_prop_key_length/0"},{"id":"max_prop_value_length/0","deprecated":false,"title":"max_prop_value_length()","anchor":"max_prop_value_length/0"},{"id":"max_props/0","deprecated":false,"title":"max_props()","anchor":"max_props/0"},{"id":"suggest_keys_to_allow/2","deprecated":false,"title":"suggest_keys_to_allow(site, limit \\\\ 300)","anchor":"suggest_keys_to_allow/2"}],"key":"functions"}]},{"id":"Plausible.Purge","deprecated":false,"group":"","title":"Plausible.Purge","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_imported_stats!/1","deprecated":false,"title":"delete_imported_stats!(site)","anchor":"delete_imported_stats!/1"},{"id":"delete_native_stats!/1","deprecated":false,"title":"delete_native_stats!(site)","anchor":"delete_native_stats!/1"},{"id":"reset!/1","deprecated":false,"title":"reset!(site)","anchor":"reset!/1"}],"key":"functions"}]},{"id":"Plausible.RateLimit","deprecated":false,"group":"","title":"Plausible.RateLimit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check_rate/5","deprecated":false,"title":"check_rate(table \\\\ __MODULE__, key, scale, limit, increment \\\\ 1)","anchor":"check_rate/5"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Plausible.Release","deprecated":false,"group":"","title":"Plausible.Release","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"configure_ref_inspector/0","deprecated":false,"title":"configure_ref_inspector()","anchor":"configure_ref_inspector/0"},{"id":"configure_ua_inspector/0","deprecated":false,"title":"configure_ua_inspector()","anchor":"configure_ua_inspector/0"},{"id":"createdb/0","deprecated":false,"title":"createdb()","anchor":"createdb/0"},{"id":"dump_plans/0","deprecated":false,"title":"dump_plans()","anchor":"dump_plans/0"},{"id":"migrate/0","deprecated":false,"title":"migrate()","anchor":"migrate/0"},{"id":"pending_migrations/0","deprecated":false,"title":"pending_migrations()","anchor":"pending_migrations/0"},{"id":"rollback/0","deprecated":false,"title":"rollback()","anchor":"rollback/0"},{"id":"seed/0","deprecated":false,"title":"seed()","anchor":"seed/0"},{"id":"should_be_first_launch?/0","deprecated":false,"title":"should_be_first_launch?()","anchor":"should_be_first_launch?/0"}],"key":"functions"}]},{"id":"Plausible.Repo","deprecated":false,"group":"","title":"Plausible.Repo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"explain/3","deprecated":false,"title":"explain(operation, queryable, opts \\\\ [])","anchor":"explain/3"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"in_transaction?/0","deprecated":false,"title":"in_transaction?()","anchor":"in_transaction?/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"paginate/2","deprecated":false,"title":"paginate(pageable, options \\\\ [])","anchor":"paginate/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"query_many/3","deprecated":false,"title":"query_many(sql, params \\\\ [], opts \\\\ [])","anchor":"query_many/3"},{"id":"query_many!/3","deprecated":false,"title":"query_many!(sql, params \\\\ [], opts \\\\ [])","anchor":"query_many!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"rollback/1","deprecated":false,"title":"rollback(value)","anchor":"rollback/1"},{"id":"scrivener_defaults/0","deprecated":false,"title":"scrivener_defaults()","anchor":"scrivener_defaults/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"transaction/2","deprecated":false,"title":"transaction(fun_or_multi, opts \\\\ [])","anchor":"transaction/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.Sentry.Client","deprecated":false,"group":"","title":"Plausible.Sentry.Client","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/0","deprecated":false,"title":"child_spec()","anchor":"child_spec/0"},{"id":"post/3","deprecated":false,"title":"post(url, headers, body)","anchor":"post/3"}],"key":"functions"}]},{"id":"Plausible.SentryFilter","deprecated":false,"group":"","title":"Plausible.SentryFilter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"before_send/1","deprecated":false,"title":"before_send(event)","anchor":"before_send/1"},{"id":"exclude_exception?/2","deprecated":false,"title":"exclude_exception?(exception, source)","anchor":"exclude_exception?/2"}],"key":"functions"}]},{"id":"Plausible.Session.CacheStore","deprecated":false,"group":"","title":"Plausible.Session.CacheStore","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_event/3","deprecated":false,"title":"on_event(event, prev_user_id, buffer \\\\ WriteBuffer)","anchor":"on_event/3"}],"key":"functions"}]},{"id":"Plausible.Session.Salts","deprecated":false,"group":"","title":"Plausible.Session.Salts","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"fetch/0","deprecated":false,"title":"fetch()","anchor":"fetch/0"},{"id":"rotate/0","deprecated":false,"title":"rotate()","anchor":"rotate/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Plausible.Site","deprecated":false,"group":"","title":"Plausible.Site","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(site, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"crm_changeset/2","deprecated":false,"title":"crm_changeset(site, attrs)","anchor":"crm_changeset/2"},{"id":"import_failure/1","deprecated":false,"title":"import_failure(site)","anchor":"import_failure/1"},{"id":"import_success/1","deprecated":false,"title":"import_success(site)","anchor":"import_success/1"},{"id":"local_start_date/1","deprecated":false,"title":"local_start_date(site)","anchor":"local_start_date/1"},{"id":"make_private/1","deprecated":false,"title":"make_private(site)","anchor":"make_private/1"},{"id":"make_public/1","deprecated":false,"title":"make_public(site)","anchor":"make_public/1"},{"id":"new/1","deprecated":false,"title":"new(params)","anchor":"new/1"},{"id":"remove_imported_data/1","deprecated":false,"title":"remove_imported_data(site)","anchor":"remove_imported_data/1"},{"id":"set_imported_source/2","deprecated":false,"title":"set_imported_source(site, imported_source)","anchor":"set_imported_source/2"},{"id":"set_native_stats_start_at/2","deprecated":false,"title":"set_native_stats_start_at(site, val)","anchor":"set_native_stats_start_at/2"},{"id":"set_stats_start_date/2","deprecated":false,"title":"set_stats_start_date(site, val)","anchor":"set_stats_start_date/2"},{"id":"start_import/5","deprecated":false,"title":"start_import(site, start_date, end_date, imported_source, status \\\\ \"importing\")","anchor":"start_import/5"},{"id":"tz_offset/2","deprecated":false,"title":"tz_offset(site, utc_now \\\\ DateTime.utc_now())","anchor":"tz_offset/2"},{"id":"update_changeset/3","deprecated":false,"title":"update_changeset(site, attrs \\\\ %{}, opts \\\\ [])","anchor":"update_changeset/3"}],"key":"functions"}]},{"id":"Plausible.Site.Cache","deprecated":false,"group":"","title":"Plausible.Site.Cache","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"},{"id":"get/2","deprecated":false,"title":"get(domain, opts \\\\ [])","anchor":"get/2"},{"id":"get_site_id/2","deprecated":false,"title":"get_site_id(domain, opts \\\\ [])","anchor":"get_site_id/2"},{"id":"hit_rate/1","deprecated":false,"title":"hit_rate(cache_name \\\\ :sites_by_domain)","anchor":"hit_rate/1"},{"id":"merge/2","deprecated":false,"title":"merge(new_items, opts \\\\ [])","anchor":"merge/2"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"name/0"},{"id":"ready?/1","deprecated":false,"title":"ready?(cache_name \\\\ :sites_by_domain)","anchor":"ready?/1"},{"id":"refresh_all/1","deprecated":false,"title":"refresh_all(opts \\\\ [])","anchor":"refresh_all/1"},{"id":"refresh_updated_recently/1","deprecated":false,"title":"refresh_updated_recently(opts \\\\ [])","anchor":"refresh_updated_recently/1"},{"id":"size/1","deprecated":false,"title":"size(cache_name \\\\ :sites_by_domain)","anchor":"size/1"},{"id":"telemetry_event_refresh/2","deprecated":false,"title":"telemetry_event_refresh(cache_name \\\\ :sites_by_domain, mode)","anchor":"telemetry_event_refresh/2"},{"id":"touch_site!/2","deprecated":false,"title":"touch_site!(site, now)","anchor":"touch_site!/2"}],"key":"functions"}]},{"id":"Plausible.Site.Cache.Warmer","deprecated":false,"group":"","title":"Plausible.Site.Cache.Warmer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"interval/0","deprecated":false,"title":"interval()","anchor":"interval/0"}],"key":"functions"}]},{"id":"Plausible.Site.Cache.Warmer.All","deprecated":false,"group":"","title":"Plausible.Site.Cache.Warmer.All","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"}],"key":"functions"}]},{"id":"Plausible.Site.Cache.Warmer.RecentlyUpdated","deprecated":false,"group":"","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"}],"key":"functions"}]},{"id":"Plausible.Site.Domain","deprecated":false,"group":"","title":"Plausible.Site.Domain","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change/3","deprecated":false,"title":"change(site, new_domain, opts \\\\ [])","anchor":"change/3"},{"id":"expire_change_transitions/1","deprecated":false,"title":"expire_change_transitions(expire_threshold_hours \\\\ 72)","anchor":"expire_change_transitions/1"}],"key":"functions"}]},{"id":"Plausible.Site.GateKeeper","deprecated":false,"group":"","title":"Plausible.Site.GateKeeper","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"policy/0","deprecated":false,"title":"policy()","anchor":"t:policy/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"check/2","deprecated":false,"title":"check(domain, opts \\\\ [])","anchor":"check/2"},{"id":"key/1","deprecated":false,"title":"key(domain)","anchor":"key/1"}],"key":"functions"}]},{"id":"Plausible.Site.GoogleAuth","deprecated":false,"group":"","title":"Plausible.Site.GoogleAuth","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(auth, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"set_property/2","deprecated":false,"title":"set_property(auth, attrs \\\\ %{})","anchor":"set_property/2"}],"key":"functions"}]},{"id":"Plausible.Site.ImportedData","deprecated":false,"group":"","title":"Plausible.Site.ImportedData","sections":[]},{"id":"Plausible.Site.Membership","deprecated":false,"group":"","title":"Plausible.Site.Membership","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"role/0","deprecated":false,"title":"role()","anchor":"t:role/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/2","deprecated":false,"title":"new(site, user)","anchor":"new/2"},{"id":"set_role/2","deprecated":false,"title":"set_role(changeset, role)","anchor":"set_role/2"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships","deprecated":false,"group":"","title":"Plausible.Site.Memberships","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept_invitation/2","deprecated":false,"title":"accept_invitation(invitation_id, user)","anchor":"accept_invitation/2"},{"id":"any?/1","deprecated":false,"title":"any?(user)","anchor":"any?/1"},{"id":"any_or_pending?/1","deprecated":false,"title":"any_or_pending?(user)","anchor":"any_or_pending?/1"},{"id":"bulk_create_invitation/5","deprecated":false,"title":"bulk_create_invitation(sites, inviter, invitee_email, role, opts)","anchor":"bulk_create_invitation/5"},{"id":"bulk_transfer_ownership_direct/2","deprecated":false,"title":"bulk_transfer_ownership_direct(sites, new_owner)","anchor":"bulk_transfer_ownership_direct/2"},{"id":"create_invitation/4","deprecated":false,"title":"create_invitation(site, inviter, invitee_email, role)","anchor":"create_invitation/4"},{"id":"pending?/1","deprecated":false,"title":"pending?(email)","anchor":"pending?/1"},{"id":"pending_ownerships?/1","deprecated":false,"title":"pending_ownerships?(email)","anchor":"pending_ownerships?/1"},{"id":"reject_invitation/2","deprecated":false,"title":"reject_invitation(invitation_id, user)","anchor":"reject_invitation/2"},{"id":"remove_invitation/2","deprecated":false,"title":"remove_invitation(invitation_id, site)","anchor":"remove_invitation/2"},{"id":"transfer_ownership/2","deprecated":false,"title":"transfer_ownership(site, user)","anchor":"transfer_ownership/2"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships.AcceptInvitation","deprecated":false,"group":"","title":"Plausible.Site.Memberships.AcceptInvitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept_invitation/2","deprecated":false,"title":"accept_invitation(invitation_id, user)","anchor":"accept_invitation/2"},{"id":"transfer_ownership/2","deprecated":false,"title":"transfer_ownership(site, user)","anchor":"transfer_ownership/2"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships.CreateInvitation","deprecated":false,"group":"","title":"Plausible.Site.Memberships.CreateInvitation","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"invite_error/0","deprecated":false,"title":"invite_error()","anchor":"t:invite_error/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"bulk_create_invitation/5","deprecated":false,"title":"bulk_create_invitation(sites, inviter, invitee_email, role, opts \\\\ [])","anchor":"bulk_create_invitation/5"},{"id":"bulk_transfer_ownership_direct/2","deprecated":false,"title":"bulk_transfer_ownership_direct(sites, new_owner)","anchor":"bulk_transfer_ownership_direct/2"},{"id":"create_invitation/4","deprecated":false,"title":"create_invitation(site, inviter, invitee_email, role)","anchor":"create_invitation/4"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships.RejectInvitation","deprecated":false,"group":"","title":"Plausible.Site.Memberships.RejectInvitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"reject_invitation/2","deprecated":false,"title":"reject_invitation(invitation_id, user)","anchor":"reject_invitation/2"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships.RemoveInvitation","deprecated":false,"group":"","title":"Plausible.Site.Memberships.RemoveInvitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"remove_invitation/2","deprecated":false,"title":"remove_invitation(invitation_id, site)","anchor":"remove_invitation/2"}],"key":"functions"}]},{"id":"Plausible.Site.MonthlyReport","deprecated":false,"group":"","title":"Plausible.Site.MonthlyReport","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_recipient/2","deprecated":false,"title":"add_recipient(report, recipient)","anchor":"add_recipient/2"},{"id":"changeset/2","deprecated":false,"title":"changeset(settings, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"remove_recipient/2","deprecated":false,"title":"remove_recipient(report, recipient)","anchor":"remove_recipient/2"}],"key":"functions"}]},{"id":"Plausible.Site.Removal","deprecated":false,"group":"","title":"Plausible.Site.Removal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(domain)","anchor":"run/1"}],"key":"functions"}]},{"id":"Plausible.Site.SharedLink","deprecated":false,"group":"","title":"Plausible.Site.SharedLink","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(link, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Site.SpikeNotification","deprecated":false,"group":"","title":"Plausible.Site.SpikeNotification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_recipient/2","deprecated":false,"title":"add_recipient(schema, recipient)","anchor":"add_recipient/2"},{"id":"changeset/2","deprecated":false,"title":"changeset(schema, attrs)","anchor":"changeset/2"},{"id":"remove_recipient/2","deprecated":false,"title":"remove_recipient(schema, recipient)","anchor":"remove_recipient/2"},{"id":"was_sent/1","deprecated":false,"title":"was_sent(schema)","anchor":"was_sent/1"}],"key":"functions"}]},{"id":"Plausible.Site.UserPreference","deprecated":false,"group":"","title":"Plausible.Site.UserPreference","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(user, site, attrs \\\\ %{})","anchor":"changeset/3"},{"id":"options/0","deprecated":false,"title":"options()","anchor":"options/0"}],"key":"functions"}]},{"id":"Plausible.Site.WeeklyReport","deprecated":false,"group":"","title":"Plausible.Site.WeeklyReport","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_recipient/2","deprecated":false,"title":"add_recipient(report, recipient)","anchor":"add_recipient/2"},{"id":"changeset/2","deprecated":false,"title":"changeset(settings, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"remove_recipient/2","deprecated":false,"title":"remove_recipient(report, recipient)","anchor":"remove_recipient/2"}],"key":"functions"}]},{"id":"Plausible.SiteAdmin","deprecated":false,"group":"","title":"Plausible.SiteAdmin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(schema, attrs)","anchor":"create_changeset/2"},{"id":"custom_index_query/3","deprecated":false,"title":"custom_index_query(conn, schema, query)","anchor":"custom_index_query/3"},{"id":"form_fields/1","deprecated":false,"title":"form_fields(_)","anchor":"form_fields/1"},{"id":"get_struct_fields/1","deprecated":false,"title":"get_struct_fields(module)","anchor":"get_struct_fields/1"},{"id":"index/1","deprecated":false,"title":"index(_)","anchor":"index/1"},{"id":"list_actions/1","deprecated":false,"title":"list_actions(conn)","anchor":"list_actions/1"},{"id":"ordering/1","deprecated":false,"title":"ordering(schema)","anchor":"ordering/1"},{"id":"search_fields/1","deprecated":false,"title":"search_fields(schema)","anchor":"search_fields/1"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(schema, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Sites","deprecated":false,"group":"","title":"Plausible.Sites","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"list_opt/0","deprecated":false,"title":"list_opt()","anchor":"t:list_opt/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(user, params)","anchor":"create/2"},{"id":"create_shared_link/3","deprecated":false,"title":"create_shared_link(site, name, password \\\\ nil)","anchor":"create_shared_link/3"},{"id":"get_by_domain/1","deprecated":false,"title":"get_by_domain(domain)","anchor":"get_by_domain/1"},{"id":"get_by_domain!/1","deprecated":false,"title":"get_by_domain!(domain)","anchor":"get_by_domain!/1"},{"id":"get_for_user/3","deprecated":false,"title":"get_for_user(user_id, domain, roles \\\\ [:owner, :admin, :viewer])","anchor":"get_for_user/3"},{"id":"get_for_user!/3","deprecated":false,"title":"get_for_user!(user_id, domain, roles \\\\ [:owner, :admin, :viewer])","anchor":"get_for_user!/3"},{"id":"has_admin_access?/2","deprecated":false,"title":"has_admin_access?(user_id, site)","anchor":"has_admin_access?/2"},{"id":"has_goals?/1","deprecated":false,"title":"has_goals?(site)","anchor":"has_goals?/1"},{"id":"has_stats?/1","deprecated":false,"title":"has_stats?(site)","anchor":"has_stats?/1"},{"id":"is_member?/2","deprecated":false,"title":"is_member?(user_id, site)","anchor":"is_member?/2"},{"id":"list/3","deprecated":false,"title":"list(user, pagination_params, opts \\\\ [])","anchor":"list/3"},{"id":"list_with_invitations/3","deprecated":false,"title":"list_with_invitations(user, pagination_params, opts \\\\ [])","anchor":"list_with_invitations/3"},{"id":"locked?/1","deprecated":false,"title":"locked?(site)","anchor":"locked?/1"},{"id":"owned_site_ids/1","deprecated":false,"title":"owned_site_ids(user)","anchor":"owned_site_ids/1"},{"id":"owned_sites_count/1","deprecated":false,"title":"owned_sites_count(user)","anchor":"owned_sites_count/1"},{"id":"owned_sites_domains/1","deprecated":false,"title":"owned_sites_domains(user)","anchor":"owned_sites_domains/1"},{"id":"role/2","deprecated":false,"title":"role(user_id, site)","anchor":"role/2"},{"id":"set_option/4","deprecated":false,"title":"set_option(user, site, option, value)","anchor":"set_option/4"},{"id":"shared_link_url/2","deprecated":false,"title":"shared_link_url(site, link)","anchor":"shared_link_url/2"},{"id":"stats_start_date/1","deprecated":false,"title":"stats_start_date(site)","anchor":"stats_start_date/1"},{"id":"toggle_pin/2","deprecated":false,"title":"toggle_pin(user, site)","anchor":"toggle_pin/2"}],"key":"functions"}]},{"id":"Plausible.Stats","deprecated":false,"group":"","title":"Plausible.Stats","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(site, query, metrics)","anchor":"aggregate/3"},{"id":"breakdown/5","deprecated":false,"title":"breakdown(site, query, prop, metrics, pagination)","anchor":"breakdown/5"},{"id":"current_visitors/1","deprecated":false,"title":"current_visitors(site)","anchor":"current_visitors/1"},{"id":"filter_suggestions/4","deprecated":false,"title":"filter_suggestions(site, query, filter_name, filter_search)","anchor":"filter_suggestions/4"},{"id":"funnel/3","deprecated":false,"title":"funnel(site, query, funnel)","anchor":"funnel/3"},{"id":"timeseries/3","deprecated":false,"title":"timeseries(site, query, metrics)","anchor":"timeseries/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Aggregate","deprecated":false,"group":"","title":"Plausible.Stats.Aggregate","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(site, query, metrics)","anchor":"aggregate/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Base","deprecated":false,"group":"","title":"Plausible.Stats.Base","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_entry_prop_filter/3","deprecated":false,"title":"apply_entry_prop_filter(sessions_q, prop_name, arg3)","anchor":"apply_entry_prop_filter/3"},{"id":"base_event_query/2","deprecated":false,"title":"base_event_query(site, query)","anchor":"base_event_query/2"},{"id":"dynamic_filter_condition/3","deprecated":false,"title":"dynamic_filter_condition(query, filter_key, db_field)","anchor":"dynamic_filter_condition/3"},{"id":"filter_by_entry_props/2","deprecated":false,"title":"filter_by_entry_props(sessions_q, query)","anchor":"filter_by_entry_props/2"},{"id":"filter_converted_sessions/3","deprecated":false,"title":"filter_converted_sessions(db_query, site, query)","anchor":"filter_converted_sessions/3"},{"id":"page_regex/1","deprecated":false,"title":"page_regex(expr)","anchor":"page_regex/1"},{"id":"query_events/2","deprecated":false,"title":"query_events(site, query)","anchor":"query_events/2"},{"id":"query_sessions/2","deprecated":false,"title":"query_sessions(site, query)","anchor":"query_sessions/2"},{"id":"select_event_metrics/2","deprecated":false,"title":"select_event_metrics(q, list)","anchor":"select_event_metrics/2"},{"id":"select_session_metrics/3","deprecated":false,"title":"select_session_metrics(q, list, query)","anchor":"select_session_metrics/3"},{"id":"utc_boundaries/2","deprecated":false,"title":"utc_boundaries(query, site)","anchor":"utc_boundaries/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Breakdown","deprecated":false,"group":"","title":"Plausible.Stats.Breakdown","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"breakdown/5","deprecated":false,"title":"breakdown(site, query, property, metrics, pagination)","anchor":"breakdown/5"}],"key":"functions"}]},{"id":"Plausible.Stats.Clickhouse","deprecated":false,"group":"","title":"Plausible.Stats.Clickhouse","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"current_visitors/2","deprecated":false,"title":"current_visitors(site, query)","anchor":"current_visitors/2"},{"id":"empty_24h_visitors_hourly_intervals/2","deprecated":false,"title":"empty_24h_visitors_hourly_intervals(sites, now \\\\ NaiveDateTime.utc_now())","anchor":"empty_24h_visitors_hourly_intervals/2"},{"id":"has_pageviews?/1","deprecated":false,"title":"has_pageviews?(site)","anchor":"has_pageviews?/1"},{"id":"imported_pageview_count/1","deprecated":false,"title":"imported_pageview_count(site)","anchor":"imported_pageview_count/1"},{"id":"last_24h_visitors_hourly_intervals/2","deprecated":false,"title":"last_24h_visitors_hourly_intervals(sites, now \\\\ NaiveDateTime.utc_now())","anchor":"last_24h_visitors_hourly_intervals/2"},{"id":"pageview_start_date_local/1","deprecated":false,"title":"pageview_start_date_local(site)","anchor":"pageview_start_date_local/1"},{"id":"top_sources/6","deprecated":false,"title":"top_sources(site, query, limit, page, show_noref \\\\ false, include_details)","anchor":"top_sources/6"},{"id":"usage_breakdown/2","deprecated":false,"title":"usage_breakdown(domains, date_range)","anchor":"usage_breakdown/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Compare","deprecated":false,"group":"","title":"Plausible.Stats.Compare","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"calculate_change/3","deprecated":false,"title":"calculate_change(arg1, old_count, new_count)","anchor":"calculate_change/3"},{"id":"percent_change/2","deprecated":false,"title":"percent_change(old_count, new_count)","anchor":"percent_change/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Comparisons","deprecated":false,"group":"","title":"Plausible.Stats.Comparisons","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"mode/0","deprecated":false,"title":"mode()","anchor":"t:mode/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"compare/4","deprecated":false,"title":"compare(site, source_query, mode, opts \\\\ [])","anchor":"compare/4"}],"key":"functions"}]},{"id":"Plausible.Stats.CurrentVisitors","deprecated":false,"group":"","title":"Plausible.Stats.CurrentVisitors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"current_visitors/1","deprecated":false,"title":"current_visitors(site)","anchor":"current_visitors/1"}],"key":"functions"}]},{"id":"Plausible.Stats.CustomProps","deprecated":false,"group":"","title":"Plausible.Stats.CustomProps","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_prop_names/2","deprecated":false,"title":"fetch_prop_names(site, query)","anchor":"fetch_prop_names/2"},{"id":"maybe_allowed_props_only/2","deprecated":false,"title":"maybe_allowed_props_only(q, allowed_props)","anchor":"maybe_allowed_props_only/2"},{"id":"props_for_all_event_names/2","deprecated":false,"title":"props_for_all_event_names(site, query)","anchor":"props_for_all_event_names/2"}],"key":"functions"}]},{"id":"Plausible.Stats.EmailReport","deprecated":false,"group":"","title":"Plausible.Stats.EmailReport","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/2","deprecated":false,"title":"get(site, query)","anchor":"get/2"}],"key":"functions"}]},{"id":"Plausible.Stats.FilterParser","deprecated":false,"group":"","title":"Plausible.Stats.FilterParser","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"parse_filters/1","deprecated":false,"title":"parse_filters(filters)","anchor":"parse_filters/1"}],"key":"functions"}]},{"id":"Plausible.Stats.FilterSuggestions","deprecated":false,"group":"","title":"Plausible.Stats.FilterSuggestions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter_suggestions/4","deprecated":false,"title":"filter_suggestions(site, query, filter_name, filter_search)","anchor":"filter_suggestions/4"}],"key":"functions"}]},{"id":"Plausible.Stats.Filters","deprecated":false,"group":"","title":"Plausible.Stats.Filters","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_prefix/1","deprecated":false,"title":"add_prefix(query)","anchor":"add_prefix/1"},{"id":"visit_props/0","deprecated":false,"title":"visit_props()","anchor":"visit_props/0"}],"key":"functions"}]},{"id":"Plausible.Stats.Fragments","deprecated":false,"group":"","title":"Plausible.Stats.Fragments","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bounce_rate/0","deprecated":false,"title":"bounce_rate()","anchor":"bounce_rate/0"},{"id":"coalesce_string/2","deprecated":false,"title":"coalesce_string(fieldA, fieldB)","anchor":"coalesce_string/2"},{"id":"sample_percent/0","deprecated":false,"title":"sample_percent()","anchor":"sample_percent/0"},{"id":"to_timezone/2","deprecated":false,"title":"to_timezone(date, timezone)","anchor":"to_timezone/2"},{"id":"total/0","deprecated":false,"title":"total()","anchor":"total/0"},{"id":"uniq/1","deprecated":false,"title":"uniq(user_id)","anchor":"uniq/1"},{"id":"visit_duration/0","deprecated":false,"title":"visit_duration()","anchor":"visit_duration/0"},{"id":"weekstart_not_before/2","deprecated":false,"title":"weekstart_not_before(date, not_before)","anchor":"weekstart_not_before/2"},{"id":"weekstart_not_before/3","deprecated":false,"title":"weekstart_not_before(date, not_before, timezone)","anchor":"weekstart_not_before/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Funnel","deprecated":false,"group":"","title":"Plausible.Stats.Funnel","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"funnel/3","deprecated":false,"title":"funnel(site, query, funnel_id)","anchor":"funnel/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Goal.Revenue","deprecated":false,"group":"","title":"Plausible.Stats.Goal.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"average_revenue_query/1","deprecated":false,"title":"average_revenue_query(query)","anchor":"average_revenue_query/1"},{"id":"cast_revenue_metrics_to_money/2","deprecated":false,"title":"cast_revenue_metrics_to_money(results, revenue_goals)","anchor":"cast_revenue_metrics_to_money/2"},{"id":"get_revenue_tracking_currency/3","deprecated":false,"title":"get_revenue_tracking_currency(site, query, metrics)","anchor":"get_revenue_tracking_currency/3"},{"id":"revenue_metrics/0","deprecated":false,"title":"revenue_metrics()","anchor":"revenue_metrics/0"},{"id":"total_revenue_query/1","deprecated":false,"title":"total_revenue_query(query)","anchor":"total_revenue_query/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported","deprecated":false,"group":"","title":"Plausible.Stats.Imported","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"merge_imported/5","deprecated":false,"title":"merge_imported(q, site, query, property, metrics)","anchor":"merge_imported/5"},{"id":"merge_imported_timeseries/4","deprecated":false,"title":"merge_imported_timeseries(native_q, site, query, metrics)","anchor":"merge_imported_timeseries/4"}],"key":"functions"}]},{"id":"Plausible.Stats.Interval","deprecated":false,"group":"","title":"Plausible.Stats.Interval","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"opt/0","deprecated":false,"title":"opt()","anchor":"t:opt/0"},{"id":"opts/0","deprecated":false,"title":"opts()","anchor":"t:opts/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"default_for_date_range/1","deprecated":false,"title":"default_for_date_range(range)","anchor":"default_for_date_range/1"},{"id":"default_for_period/1","deprecated":false,"title":"default_for_period(period)","anchor":"default_for_period/1"},{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"},{"id":"valid?/1","deprecated":false,"title":"valid?(interval)","anchor":"valid?/1"},{"id":"valid_by_period/1","deprecated":false,"title":"valid_by_period(opts \\\\ [])","anchor":"valid_by_period/1"},{"id":"valid_for_period?/3","deprecated":false,"title":"valid_for_period?(period, interval, opts \\\\ [])","anchor":"valid_for_period?/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Props","deprecated":false,"group":"","title":"Plausible.Stats.Props","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event_props/0","deprecated":false,"title":"event_props()","anchor":"event_props/0"},{"id":"valid_prop?/1","deprecated":false,"title":"valid_prop?(prop)","anchor":"valid_prop?/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Query","deprecated":false,"group":"","title":"Plausible.Stats.Query","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"from/2","deprecated":false,"title":"from(site, params)","anchor":"from/2"},{"id":"get_filter_by_prefix/2","deprecated":false,"title":"get_filter_by_prefix(query, prefix)","anchor":"get_filter_by_prefix/2"},{"id":"has_event_filters?/1","deprecated":false,"title":"has_event_filters?(query)","anchor":"has_event_filters?/1"},{"id":"include_imported?/3","deprecated":false,"title":"include_imported?(query, site, requested?)","anchor":"include_imported?/3"},{"id":"put_filter/3","deprecated":false,"title":"put_filter(query, key, val)","anchor":"put_filter/3"},{"id":"remove_event_filters/2","deprecated":false,"title":"remove_event_filters(query, opts)","anchor":"remove_event_filters/2"},{"id":"trace/1","deprecated":false,"title":"trace(query)","anchor":"trace/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Sampling","deprecated":false,"group":"","title":"Plausible.Stats.Sampling","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_query_hint/1","deprecated":false,"title":"add_query_hint(query)","anchor":"add_query_hint/1"},{"id":"add_query_hint/2","deprecated":false,"title":"add_query_hint(db_query, query)","anchor":"add_query_hint/2"},{"id":"put_threshold/2","deprecated":false,"title":"put_threshold(query, params)","anchor":"put_threshold/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Timeseries","deprecated":false,"group":"","title":"Plausible.Stats.Timeseries","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"results/0","deprecated":false,"title":"results()","anchor":"t:results/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"timeseries/3","deprecated":false,"title":"timeseries(site, query, metrics)","anchor":"timeseries/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Util","deprecated":false,"group":"","title":"Plausible.Stats.Util","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"remove_internal_visits_metric/1","deprecated":false,"title":"remove_internal_visits_metric(result)","anchor":"remove_internal_visits_metric/1"},{"id":"remove_internal_visits_metric/2","deprecated":false,"title":"remove_internal_visits_metric(results, metrics)","anchor":"remove_internal_visits_metric/2"}],"key":"functions"}]},{"id":"Plausible.Test.Support.HTML","deprecated":false,"group":"","title":"Plausible.Test.Support.HTML","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"class_of_element/2","deprecated":false,"title":"class_of_element(html, element)","anchor":"class_of_element/2"},{"id":"element_exists?/2","deprecated":false,"title":"element_exists?(html, selector)","anchor":"element_exists?/2"},{"id":"find/2","deprecated":false,"title":"find(html, value)","anchor":"find/2"},{"id":"form_exists?/2","deprecated":false,"title":"form_exists?(html, action_path)","anchor":"form_exists?/2"},{"id":"name_of/1","deprecated":false,"title":"name_of(element)","anchor":"name_of/1"},{"id":"submit_button/2","deprecated":false,"title":"submit_button(html, form)","anchor":"submit_button/2"},{"id":"text/1","deprecated":false,"title":"text(element)","anchor":"text/1"},{"id":"text_of_attr/2","deprecated":false,"title":"text_of_attr(element, attr)","anchor":"text_of_attr/2"},{"id":"text_of_attr/3","deprecated":false,"title":"text_of_attr(html, element, attr)","anchor":"text_of_attr/3"},{"id":"text_of_element/2","deprecated":false,"title":"text_of_element(html, element)","anchor":"text_of_element/2"}],"key":"functions"}]},{"id":"Plausible.Test.Support.HTTPMocker","deprecated":false,"group":"","title":"Plausible.Test.Support.HTTPMocker","sections":[]},{"id":"Plausible.TestUtils","deprecated":false,"group":"","title":"Plausible.TestUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_imported_data/1","deprecated":false,"title":"add_imported_data(map)","anchor":"add_imported_data/1"},{"id":"await_clickhouse_count/2","deprecated":false,"title":"await_clickhouse_count(query, expected)","anchor":"await_clickhouse_count/2"},{"id":"create_api_key/1","deprecated":false,"title":"create_api_key(map)","anchor":"create_api_key/1"},{"id":"create_events/1","deprecated":false,"title":"create_events(events)","anchor":"create_events/1"},{"id":"create_new_site/1","deprecated":false,"title":"create_new_site(map)","anchor":"create_new_site/1"},{"id":"create_pageviews/1","deprecated":false,"title":"create_pageviews(pageviews)","anchor":"create_pageviews/1"},{"id":"create_sessions/1","deprecated":false,"title":"create_sessions(sessions)","anchor":"create_sessions/1"},{"id":"create_site/1","deprecated":false,"title":"create_site(map)","anchor":"create_site/1"},{"id":"create_user/1","deprecated":false,"title":"create_user(_)","anchor":"create_user/1"},{"id":"eventually/3","deprecated":false,"title":"eventually(expectation, wait_time_ms \\\\ 50, retries \\\\ 10)","anchor":"eventually/3"},{"id":"generate_usage_for/3","deprecated":false,"title":"generate_usage_for(site, i, timestamp \\\\ NaiveDateTime.utc_now())","anchor":"generate_usage_for/3"},{"id":"init_session/1","deprecated":false,"title":"init_session(conn)","anchor":"init_session/1"},{"id":"log_in/1","deprecated":false,"title":"log_in(map)","anchor":"log_in/1"},{"id":"patch_env/2","deprecated":false,"title":"patch_env(env_key, value)","anchor":"patch_env/2"},{"id":"populate_stats/1","deprecated":false,"title":"populate_stats(events)","anchor":"populate_stats/1"},{"id":"populate_stats/2","deprecated":false,"title":"populate_stats(site, events)","anchor":"populate_stats/2"},{"id":"random_ip/0","deprecated":false,"title":"random_ip()","anchor":"random_ip/0"},{"id":"relative_time/1","deprecated":false,"title":"relative_time(shifts)","anchor":"relative_time/1"},{"id":"setup_patch_env/2","deprecated":false,"title":"setup_patch_env(env_key, value)","anchor":"setup_patch_env/2"},{"id":"to_naive_truncate/1","deprecated":false,"title":"to_naive_truncate(dt)","anchor":"to_naive_truncate/1"},{"id":"use_api_key/1","deprecated":false,"title":"use_api_key(map)","anchor":"use_api_key/1"}],"key":"functions"}]},{"id":"Plausible.Themes","deprecated":false,"group":"","title":"Plausible.Themes","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"options/0","deprecated":false,"title":"options()","anchor":"options/0"}],"key":"functions"}]},{"id":"Plausible.Timezones","deprecated":false,"group":"","title":"Plausible.Timezones","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"options/1","deprecated":false,"title":"options(now \\\\ DateTime.utc_now())","anchor":"options/1"},{"id":"to_date_in_timezone/2","deprecated":false,"title":"to_date_in_timezone(dt, timezone)","anchor":"to_date_in_timezone/2"},{"id":"to_utc_datetime/2","deprecated":false,"title":"to_utc_datetime(naive_date_time, timezone)","anchor":"to_utc_datetime/2"}],"key":"functions"}]},{"id":"Plausible.Users","deprecated":false,"group":"","title":"Plausible.Users","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept_traffic_until/1","deprecated":false,"title":"accept_traffic_until(user)","anchor":"accept_traffic_until/1"},{"id":"allow_next_upgrade_override/1","deprecated":false,"title":"allow_next_upgrade_override(user)","anchor":"allow_next_upgrade_override/1"},{"id":"has_email_code?/1","deprecated":false,"title":"has_email_code?(user)","anchor":"has_email_code?/1"},{"id":"maybe_reset_next_upgrade_override/1","deprecated":false,"title":"maybe_reset_next_upgrade_override(user)","anchor":"maybe_reset_next_upgrade_override/1"},{"id":"update_accept_traffic_until/1","deprecated":false,"title":"update_accept_traffic_until(user)","anchor":"update_accept_traffic_until/1"},{"id":"with_subscription/1","deprecated":false,"title":"with_subscription(user)","anchor":"with_subscription/1"}],"key":"functions"}]},{"id":"Plausible.Workers.AcceptTrafficUntil","deprecated":false,"group":"","title":"Plausible.Workers.AcceptTrafficUntil","sections":[]},{"id":"Plausible.Workers.CheckUsage","deprecated":false,"group":"","title":"Plausible.Workers.CheckUsage","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check_enterprise_subscriber/2","deprecated":false,"title":"check_enterprise_subscriber(subscriber, quota_mod)","anchor":"check_enterprise_subscriber/2"},{"id":"day_of_month/1","deprecated":false,"title":"day_of_month(date)","anchor":"day_of_month/1"},{"id":"exceeds_last_two_usage_cycles?/2","deprecated":false,"title":"exceeds_last_two_usage_cycles?(usage, limit)","anchor":"exceeds_last_two_usage_cycles?/2"},{"id":"last_day_of_month/1","deprecated":false,"title":"last_day_of_month(day)","anchor":"last_day_of_month/1"},{"id":"least/2","deprecated":false,"title":"least(left, right)","anchor":"least/2"},{"id":"yesterday/0","deprecated":false,"title":"yesterday()","anchor":"yesterday/0"}],"key":"functions"}]},{"id":"Plausible.Workers.CleanInvitations","deprecated":false,"group":"","title":"Plausible.Workers.CleanInvitations","sections":[]},{"id":"Plausible.Workers.ExpireDomainChangeTransitions","deprecated":false,"group":"","title":"Plausible.Workers.ExpireDomainChangeTransitions","sections":[]},{"id":"Plausible.Workers.ImportGoogleAnalytics","deprecated":false,"group":"","title":"Plausible.Workers.ImportGoogleAnalytics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import_failed/1","deprecated":false,"title":"import_failed(site)","anchor":"import_failed/1"}],"key":"functions"}]},{"id":"Plausible.Workers.LockSites","deprecated":false,"group":"","title":"Plausible.Workers.LockSites","sections":[]},{"id":"Plausible.Workers.NotifyAnnualRenewal","deprecated":false,"group":"","title":"Plausible.Workers.NotifyAnnualRenewal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform/1","deprecated":false,"title":"perform(job)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Plausible.Workers.RotateSalts","deprecated":false,"group":"","title":"Plausible.Workers.RotateSalts","sections":[]},{"id":"Plausible.Workers.ScheduleEmailReports","deprecated":false,"group":"","title":"Plausible.Workers.ScheduleEmailReports","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"first_of_month_9am/1","deprecated":false,"title":"first_of_month_9am(timezone)","anchor":"first_of_month_9am/1"},{"id":"monday_9am/1","deprecated":false,"title":"monday_9am(timezone)","anchor":"monday_9am/1"},{"id":"perform/1","deprecated":false,"title":"perform(job)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Plausible.Workers.SendCheckStatsEmails","deprecated":false,"group":"","title":"Plausible.Workers.SendCheckStatsEmails","sections":[]},{"id":"Plausible.Workers.SendEmailReport","deprecated":false,"group":"","title":"Plausible.Workers.SendEmailReport","sections":[]},{"id":"Plausible.Workers.SendSiteSetupEmails","deprecated":false,"group":"","title":"Plausible.Workers.SendSiteSetupEmails","sections":[]},{"id":"Plausible.Workers.SendTrialNotifications","deprecated":false,"group":"","title":"Plausible.Workers.SendTrialNotifications","sections":[]},{"id":"Plausible.Workers.SpikeNotifier","deprecated":false,"group":"","title":"Plausible.Workers.SpikeNotifier","sections":[]},{"id":"PlausibleWeb","deprecated":false,"group":"","title":"PlausibleWeb","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__using__/1","deprecated":false,"title":"__using__(which)","anchor":"__using__/1"},{"id":"channel/0","deprecated":false,"title":"channel()","anchor":"channel/0"},{"id":"controller/0","deprecated":false,"title":"controller()","anchor":"controller/0"},{"id":"live_view/1","deprecated":false,"title":"live_view(opts \\\\ [])","anchor":"live_view/1"},{"id":"open_api_schema/0","deprecated":false,"title":"open_api_schema()","anchor":"open_api_schema/0"},{"id":"plugins_api_controller/0","deprecated":false,"title":"plugins_api_controller()","anchor":"plugins_api_controller/0"},{"id":"plugins_api_view/0","deprecated":false,"title":"plugins_api_view()","anchor":"plugins_api_view/0"},{"id":"router/0","deprecated":false,"title":"router()","anchor":"router/0"},{"id":"view/0","deprecated":false,"title":"view()","anchor":"view/0"}],"key":"functions"}]},{"id":"PlausibleWeb.AdminController","deprecated":false,"group":"","title":"PlausibleWeb.AdminController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"usage/2","deprecated":false,"title":"usage(conn, params)","anchor":"usage/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.ExternalController","deprecated":false,"group":"","title":"PlausibleWeb.Api.ExternalController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error/2","deprecated":false,"title":"error(conn, params)","anchor":"error/2"},{"id":"event/2","deprecated":false,"title":"event(conn, params)","anchor":"event/2"},{"id":"health/2","deprecated":false,"title":"health(conn, params)","anchor":"health/2"},{"id":"info/2","deprecated":false,"title":"info(conn, params)","anchor":"info/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.ExternalSitesController","deprecated":false,"group":"","title":"PlausibleWeb.Api.ExternalSitesController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_site/2","deprecated":false,"title":"create_site(conn, params)","anchor":"create_site/2"},{"id":"delete_goal/2","deprecated":false,"title":"delete_goal(conn, params)","anchor":"delete_goal/2"},{"id":"delete_site/2","deprecated":false,"title":"delete_site(conn, map)","anchor":"delete_site/2"},{"id":"find_or_create_goal/2","deprecated":false,"title":"find_or_create_goal(conn, params)","anchor":"find_or_create_goal/2"},{"id":"find_or_create_shared_link/2","deprecated":false,"title":"find_or_create_shared_link(conn, params)","anchor":"find_or_create_shared_link/2"},{"id":"get_site/2","deprecated":false,"title":"get_site(conn, map)","anchor":"get_site/2"},{"id":"update_site/2","deprecated":false,"title":"update_site(conn, params)","anchor":"update_site/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.ExternalStatsController","deprecated":false,"group":"","title":"PlausibleWeb.Api.ExternalStatsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/2","deprecated":false,"title":"aggregate(conn, params)","anchor":"aggregate/2"},{"id":"breakdown/2","deprecated":false,"title":"breakdown(conn, params)","anchor":"breakdown/2"},{"id":"realtime_visitors/2","deprecated":false,"title":"realtime_visitors(conn, params)","anchor":"realtime_visitors/2"},{"id":"timeseries/2","deprecated":false,"title":"timeseries(conn, params)","anchor":"timeseries/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.Helpers","deprecated":false,"group":"","title":"PlausibleWeb.Api.Helpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bad_request/2","deprecated":false,"title":"bad_request(conn, msg)","anchor":"bad_request/2"},{"id":"not_found/2","deprecated":false,"title":"not_found(conn, msg)","anchor":"not_found/2"},{"id":"payment_required/2","deprecated":false,"title":"payment_required(conn, msg)","anchor":"payment_required/2"},{"id":"too_many_requests/2","deprecated":false,"title":"too_many_requests(conn, msg)","anchor":"too_many_requests/2"},{"id":"unauthorized/2","deprecated":false,"title":"unauthorized(conn, msg)","anchor":"unauthorized/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.InternalController","deprecated":false,"group":"","title":"PlausibleWeb.Api.InternalController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"disable_feature/2","deprecated":false,"title":"disable_feature(conn, map)","anchor":"disable_feature/2"},{"id":"domain_status/2","deprecated":false,"title":"domain_status(conn, map)","anchor":"domain_status/2"},{"id":"sites/2","deprecated":false,"title":"sites(conn, params)","anchor":"sites/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.PaddleController","deprecated":false,"group":"","title":"PlausibleWeb.Api.PaddleController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"verified_signature?/1","deprecated":false,"title":"verified_signature?(params)","anchor":"verified_signature?/1"},{"id":"verify_signature/2","deprecated":false,"title":"verify_signature(conn, opts)","anchor":"verify_signature/2"},{"id":"webhook/2","deprecated":false,"title":"webhook(conn, params)","anchor":"webhook/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.StatsController","deprecated":false,"group":"","title":"PlausibleWeb.Api.StatsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_custom_prop_values/2","deprecated":false,"title":"all_custom_prop_values(conn, params)","anchor":"all_custom_prop_values/2"},{"id":"browser_versions/2","deprecated":false,"title":"browser_versions(conn, params)","anchor":"browser_versions/2"},{"id":"browsers/2","deprecated":false,"title":"browsers(conn, params)","anchor":"browsers/2"},{"id":"cities/2","deprecated":false,"title":"cities(conn, params)","anchor":"cities/2"},{"id":"conversions/2","deprecated":false,"title":"conversions(conn, params)","anchor":"conversions/2"},{"id":"countries/2","deprecated":false,"title":"countries(conn, params)","anchor":"countries/2"},{"id":"current_visitors/2","deprecated":false,"title":"current_visitors(conn, _)","anchor":"current_visitors/2"},{"id":"custom_prop_values/2","deprecated":false,"title":"custom_prop_values(conn, params)","anchor":"custom_prop_values/2"},{"id":"entry_pages/2","deprecated":false,"title":"entry_pages(conn, params)","anchor":"entry_pages/2"},{"id":"exit_pages/2","deprecated":false,"title":"exit_pages(conn, params)","anchor":"exit_pages/2"},{"id":"filter_suggestions/2","deprecated":false,"title":"filter_suggestions(conn, params)","anchor":"filter_suggestions/2"},{"id":"format_money/1","deprecated":false,"title":"format_money(money)","anchor":"format_money/1"},{"id":"format_revenue_metric/1","deprecated":false,"title":"format_revenue_metric(metric_value)","anchor":"format_revenue_metric/1"},{"id":"funnel/2","deprecated":false,"title":"funnel(conn, params)","anchor":"funnel/2"},{"id":"main_graph/2","deprecated":false,"title":"main_graph(conn, params)","anchor":"main_graph/2"},{"id":"operating_system_versions/2","deprecated":false,"title":"operating_system_versions(conn, params)","anchor":"operating_system_versions/2"},{"id":"operating_systems/2","deprecated":false,"title":"operating_systems(conn, params)","anchor":"operating_systems/2"},{"id":"pages/2","deprecated":false,"title":"pages(conn, params)","anchor":"pages/2"},{"id":"referrer_drilldown/2","deprecated":false,"title":"referrer_drilldown(conn, params)","anchor":"referrer_drilldown/2"},{"id":"referrers/2","deprecated":false,"title":"referrers(conn, params)","anchor":"referrers/2"},{"id":"regions/2","deprecated":false,"title":"regions(conn, params)","anchor":"regions/2"},{"id":"screen_sizes/2","deprecated":false,"title":"screen_sizes(conn, params)","anchor":"screen_sizes/2"},{"id":"sources/2","deprecated":false,"title":"sources(conn, params)","anchor":"sources/2"},{"id":"top_stats/2","deprecated":false,"title":"top_stats(conn, params)","anchor":"top_stats/2"},{"id":"utm_campaigns/2","deprecated":false,"title":"utm_campaigns(conn, params)","anchor":"utm_campaigns/2"},{"id":"utm_contents/2","deprecated":false,"title":"utm_contents(conn, params)","anchor":"utm_contents/2"},{"id":"utm_mediums/2","deprecated":false,"title":"utm_mediums(conn, params)","anchor":"utm_mediums/2"},{"id":"utm_sources/2","deprecated":false,"title":"utm_sources(conn, params)","anchor":"utm_sources/2"},{"id":"utm_terms/2","deprecated":false,"title":"utm_terms(conn, params)","anchor":"utm_terms/2"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthController","deprecated":false,"group":"","title":"PlausibleWeb.AuthController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"activate/2","deprecated":false,"title":"activate(conn, map)","anchor":"activate/2"},{"id":"activate_form/2","deprecated":false,"title":"activate_form(conn, params)","anchor":"activate_form/2"},{"id":"cancel_update_email/2","deprecated":false,"title":"cancel_update_email(conn, params)","anchor":"cancel_update_email/2"},{"id":"create_api_key/2","deprecated":false,"title":"create_api_key(conn, map)","anchor":"create_api_key/2"},{"id":"delete_api_key/2","deprecated":false,"title":"delete_api_key(conn, map)","anchor":"delete_api_key/2"},{"id":"delete_me/2","deprecated":false,"title":"delete_me(conn, params)","anchor":"delete_me/2"},{"id":"disable_2fa/2","deprecated":false,"title":"disable_2fa(conn, map)","anchor":"disable_2fa/2"},{"id":"generate_2fa_recovery_codes/2","deprecated":false,"title":"generate_2fa_recovery_codes(conn, map)","anchor":"generate_2fa_recovery_codes/2"},{"id":"google_auth_callback/2","deprecated":false,"title":"google_auth_callback(conn, params)","anchor":"google_auth_callback/2"},{"id":"initiate_2fa_setup/2","deprecated":false,"title":"initiate_2fa_setup(conn, params)","anchor":"initiate_2fa_setup/2"},{"id":"login/2","deprecated":false,"title":"login(conn, map)","anchor":"login/2"},{"id":"login_form/2","deprecated":false,"title":"login_form(conn, params)","anchor":"login_form/2"},{"id":"logout/2","deprecated":false,"title":"logout(conn, params)","anchor":"logout/2"},{"id":"new_api_key/2","deprecated":false,"title":"new_api_key(conn, params)","anchor":"new_api_key/2"},{"id":"password_reset/2","deprecated":false,"title":"password_reset(conn, params)","anchor":"password_reset/2"},{"id":"password_reset_form/2","deprecated":false,"title":"password_reset_form(conn, params)","anchor":"password_reset_form/2"},{"id":"password_reset_request/2","deprecated":false,"title":"password_reset_request(conn, params)","anchor":"password_reset_request/2"},{"id":"password_reset_request_form/2","deprecated":false,"title":"password_reset_request_form(conn, _)","anchor":"password_reset_request_form/2"},{"id":"register/2","deprecated":false,"title":"register(conn, map)","anchor":"register/2"},{"id":"register_from_invitation/2","deprecated":false,"title":"register_from_invitation(conn, map)","anchor":"register_from_invitation/2"},{"id":"request_activation_code/2","deprecated":false,"title":"request_activation_code(conn, params)","anchor":"request_activation_code/2"},{"id":"save_settings/2","deprecated":false,"title":"save_settings(conn, map)","anchor":"save_settings/2"},{"id":"update_email/2","deprecated":false,"title":"update_email(conn, map)","anchor":"update_email/2"},{"id":"user_settings/2","deprecated":false,"title":"user_settings(conn, params)","anchor":"user_settings/2"},{"id":"verify_2fa/2","deprecated":false,"title":"verify_2fa(conn, params)","anchor":"verify_2fa/2"},{"id":"verify_2fa_form/2","deprecated":false,"title":"verify_2fa_form(conn, _)","anchor":"verify_2fa_form/2"},{"id":"verify_2fa_recovery_code/2","deprecated":false,"title":"verify_2fa_recovery_code(conn, map)","anchor":"verify_2fa_recovery_code/2"},{"id":"verify_2fa_recovery_code_form/2","deprecated":false,"title":"verify_2fa_recovery_code_form(conn, params)","anchor":"verify_2fa_recovery_code_form/2"},{"id":"verify_2fa_setup/2","deprecated":false,"title":"verify_2fa_setup(conn, map)","anchor":"verify_2fa_setup/2"},{"id":"verify_2fa_setup_form/2","deprecated":false,"title":"verify_2fa_setup_form(conn, params)","anchor":"verify_2fa_setup_form/2"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthPlug","deprecated":false,"group":"","title":"PlausibleWeb.AuthPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthView","deprecated":false,"group":"","title":"PlausibleWeb.AuthView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"activate.html/1","deprecated":false,"title":"activate.html(assigns)","anchor":"activate.html/1"},{"id":"delimit_integer/1","deprecated":false,"title":"delimit_integer(number)","anchor":"delimit_integer/1"},{"id":"format_invoices/1","deprecated":false,"title":"format_invoices(invoice_list)","anchor":"format_invoices/1"},{"id":"generate_2fa_recovery_codes.html/1","deprecated":false,"title":"generate_2fa_recovery_codes.html(assigns)","anchor":"generate_2fa_recovery_codes.html/1"},{"id":"initiate_2fa_setup.html/1","deprecated":false,"title":"initiate_2fa_setup.html(assigns)","anchor":"initiate_2fa_setup.html/1"},{"id":"login_form.html/1","deprecated":false,"title":"login_form.html(assigns)","anchor":"login_form.html/1"},{"id":"new_api_key.html/1","deprecated":false,"title":"new_api_key.html(assigns)","anchor":"new_api_key.html/1"},{"id":"password_reset_form.html/1","deprecated":false,"title":"password_reset_form.html(assigns)","anchor":"password_reset_form.html/1"},{"id":"password_reset_request_form.html/1","deprecated":false,"title":"password_reset_request_form.html(assigns)","anchor":"password_reset_request_form.html/1"},{"id":"password_reset_request_success.html/1","deprecated":false,"title":"password_reset_request_success.html(assigns)","anchor":"password_reset_request_success.html/1"},{"id":"present_subscription_status/1","deprecated":false,"title":"present_subscription_status(status)","anchor":"present_subscription_status/1"},{"id":"register_success.html/1","deprecated":false,"title":"register_success.html(assigns)","anchor":"register_success.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"subscription_colors/1","deprecated":false,"title":"subscription_colors(_)","anchor":"subscription_colors/1"},{"id":"subscription_interval/1","deprecated":false,"title":"subscription_interval(subscription)","anchor":"subscription_interval/1"},{"id":"subscription_quota/2","deprecated":false,"title":"subscription_quota(subscription, options \\\\ [])","anchor":"subscription_quota/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"user_settings.html/1","deprecated":false,"title":"user_settings.html(assigns)","anchor":"user_settings.html/1"},{"id":"verify_2fa.html/1","deprecated":false,"title":"verify_2fa.html(assigns)","anchor":"verify_2fa.html/1"},{"id":"verify_2fa_recovery_code.html/1","deprecated":false,"title":"verify_2fa_recovery_code.html(assigns)","anchor":"verify_2fa_recovery_code.html/1"},{"id":"verify_2fa_setup.html/1","deprecated":false,"title":"verify_2fa_setup.html(assigns)","anchor":"verify_2fa_setup.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthorizeSiteAccess","deprecated":false,"group":"","title":"PlausibleWeb.AuthorizeSiteAccess","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, allowed_roles)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(allowed_roles)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthorizeSitesApiPlug","deprecated":false,"group":"","title":"PlausibleWeb.AuthorizeSitesApiPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthorizeStatsApiPlug","deprecated":false,"group":"","title":"PlausibleWeb.AuthorizeStatsApiPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AvatarController","deprecated":false,"group":"","title":"PlausibleWeb.AvatarController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"avatar/2","deprecated":false,"title":"avatar(conn, params)","anchor":"avatar/2"}],"key":"functions"}]},{"id":"PlausibleWeb.BillingController","deprecated":false,"group":"","title":"PlausibleWeb.BillingController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change_plan/2","deprecated":false,"title":"change_plan(conn, map)","anchor":"change_plan/2"},{"id":"change_plan_preview/2","deprecated":false,"title":"change_plan_preview(conn, map)","anchor":"change_plan_preview/2"},{"id":"choose_plan/2","deprecated":false,"title":"choose_plan(conn, params)","anchor":"choose_plan/2"},{"id":"ping_subscription/2","deprecated":false,"title":"ping_subscription(conn, params)","anchor":"ping_subscription/2"},{"id":"upgrade_success/2","deprecated":false,"title":"upgrade_success(conn, params)","anchor":"upgrade_success/2"},{"id":"upgrade_to_enterprise_plan/2","deprecated":false,"title":"upgrade_to_enterprise_plan(conn, params)","anchor":"upgrade_to_enterprise_plan/2"}],"key":"functions"}]},{"id":"PlausibleWeb.BillingView","deprecated":false,"group":"","title":"PlausibleWeb.BillingView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"change_enterprise_plan_contact_us.html/1","deprecated":false,"title":"change_enterprise_plan_contact_us.html(assigns)","anchor":"change_enterprise_plan_contact_us.html/1"},{"id":"change_plan_preview.html/1","deprecated":false,"title":"change_plan_preview.html(assigns)","anchor":"change_plan_preview.html/1"},{"id":"choose_plan.html/1","deprecated":false,"title":"choose_plan.html(assigns)","anchor":"choose_plan.html/1"},{"id":"present_currency/1","deprecated":false,"title":"present_currency(arg)","anchor":"present_currency/1"},{"id":"present_date/1","deprecated":false,"title":"present_date(date)","anchor":"present_date/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"upgrade_success.html/1","deprecated":false,"title":"upgrade_success.html(assigns)","anchor":"upgrade_success.html/1"},{"id":"upgrade_to_enterprise_plan.html/1","deprecated":false,"title":"upgrade_to_enterprise_plan.html(assigns)","anchor":"upgrade_to_enterprise_plan.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.CRMAuthPlug","deprecated":false,"group":"","title":"PlausibleWeb.CRMAuthPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Captcha","deprecated":false,"group":"","title":"PlausibleWeb.Captcha","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"},{"id":"sitekey/0","deprecated":false,"title":"sitekey()","anchor":"sitekey/0"},{"id":"verify/1","deprecated":false,"title":"verify(token)","anchor":"verify/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Billing.PlanBenefits","deprecated":false,"group":"","title":"PlausibleWeb.Components.Billing.PlanBenefits","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"for_business/2","deprecated":false,"title":"for_business(plan, growth_benefits)","anchor":"for_business/2"},{"id":"for_enterprise/1","deprecated":false,"title":"for_enterprise(business_benefits)","anchor":"for_enterprise/1"},{"id":"for_growth/1","deprecated":false,"title":"for_growth(plan)","anchor":"for_growth/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Generic","deprecated":false,"group":"","title":"PlausibleWeb.Components.Generic","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"button/1","deprecated":false,"title":"button(assigns)","anchor":"button/1"},{"id":"button_link/1","deprecated":false,"title":"button_link(assigns)","anchor":"button_link/1"},{"id":"docs_info/1","deprecated":false,"title":"docs_info(assigns)","anchor":"docs_info/1"},{"id":"dropdown/1","deprecated":false,"title":"dropdown(assigns)","anchor":"dropdown/1"},{"id":"dropdown_link/1","deprecated":false,"title":"dropdown_link(assigns)","anchor":"dropdown_link/1"},{"id":"notice/1","deprecated":false,"title":"notice(assigns)","anchor":"notice/1"},{"id":"spinner/1","deprecated":false,"title":"spinner(assigns)","anchor":"spinner/1"},{"id":"styled_link/1","deprecated":false,"title":"styled_link(assigns)","anchor":"styled_link/1"},{"id":"unstyled_link/1","deprecated":false,"title":"unstyled_link(assigns)","anchor":"unstyled_link/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Google","deprecated":false,"group":"","title":"PlausibleWeb.Components.Google","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"button/1","deprecated":false,"title":"button(assigns)","anchor":"button/1"},{"id":"logo/1","deprecated":false,"title":"logo(assigns \\\\ %{})","anchor":"logo/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Settings","deprecated":false,"group":"","title":"PlausibleWeb.Components.Settings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"settings_google_import/1","deprecated":false,"title":"settings_google_import(assigns)","anchor":"settings_google_import/1"},{"id":"settings_search_console/1","deprecated":false,"title":"settings_search_console(assigns)","anchor":"settings_search_console/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Site.Feature","deprecated":false,"group":"","title":"PlausibleWeb.Components.Site.Feature","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"target/4","deprecated":false,"title":"target(site, setting, conn, set_to)","anchor":"target/4"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"toggle/1","deprecated":false,"title":"toggle(assigns)","anchor":"toggle/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.TwoFactor","deprecated":false,"group":"","title":"PlausibleWeb.Components.TwoFactor","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"modal/1","deprecated":false,"title":"modal(assigns)","anchor":"modal/1"},{"id":"qr_code/1","deprecated":false,"title":"qr_code(assigns)","anchor":"qr_code/1"},{"id":"verify_2fa_input/1","deprecated":false,"title":"verify_2fa_input(assigns)","anchor":"verify_2fa_input/1"}],"key":"functions"}]},{"id":"PlausibleWeb.ConnCase","deprecated":false,"group":"","title":"PlausibleWeb.ConnCase","sections":[]},{"id":"PlausibleWeb.ControllerHelpers","deprecated":false,"group":"","title":"PlausibleWeb.ControllerHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render_error/2","deprecated":false,"title":"render_error(conn, status)","anchor":"render_error/2"},{"id":"render_error/3","deprecated":false,"title":"render_error(conn, status, message)","anchor":"render_error/3"}],"key":"functions"}]},{"id":"PlausibleWeb.Controllers.API.Revenue","deprecated":false,"group":"","title":"PlausibleWeb.Controllers.API.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"format_money/1","deprecated":false,"title":"format_money(value)","anchor":"format_money/1"},{"id":"format_revenue_metric/1","deprecated":false,"title":"format_revenue_metric(arg)","anchor":"format_revenue_metric/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Dogfood","deprecated":false,"group":"","title":"PlausibleWeb.Dogfood","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api_destination/0","deprecated":false,"title":"api_destination()","anchor":"api_destination/0"},{"id":"domain/1","deprecated":false,"title":"domain(conn)","anchor":"domain/1"},{"id":"script_url/0","deprecated":false,"title":"script_url()","anchor":"script_url/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Email","deprecated":false,"group":"","title":"PlausibleWeb.Email","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"activation_email/2","deprecated":false,"title":"activation_email(user, code)","anchor":"activation_email/2"},{"id":"approaching_accept_traffic_until/1","deprecated":false,"title":"approaching_accept_traffic_until(notification)","anchor":"approaching_accept_traffic_until/1"},{"id":"approaching_accept_traffic_until_tomorrow/1","deprecated":false,"title":"approaching_accept_traffic_until_tomorrow(notification)","anchor":"approaching_accept_traffic_until_tomorrow/1"},{"id":"base_email/0","deprecated":false,"title":"base_email()","anchor":"base_email/0"},{"id":"base_email/1","deprecated":false,"title":"base_email(map)","anchor":"base_email/1"},{"id":"cancellation_email/1","deprecated":false,"title":"cancellation_email(user)","anchor":"cancellation_email/1"},{"id":"check_stats_email/1","deprecated":false,"title":"check_stats_email(user)","anchor":"check_stats_email/1"},{"id":"create_site_email/1","deprecated":false,"title":"create_site_email(user)","anchor":"create_site_email/1"},{"id":"dashboard_locked/3","deprecated":false,"title":"dashboard_locked(user, usage, suggested_plan)","anchor":"dashboard_locked/3"},{"id":"enterprise_over_limit_internal_email/4","deprecated":false,"title":"enterprise_over_limit_internal_email(user, pageview_usage, site_usage, site_allowance)","anchor":"enterprise_over_limit_internal_email/4"},{"id":"error_report/3","deprecated":false,"title":"error_report(reported_by, trace_id, feedback)","anchor":"error_report/3"},{"id":"existing_user_invitation/1","deprecated":false,"title":"existing_user_invitation(invitation)","anchor":"existing_user_invitation/1"},{"id":"import_failure/2","deprecated":false,"title":"import_failure(user, site)","anchor":"import_failure/2"},{"id":"import_success/2","deprecated":false,"title":"import_success(user, site)","anchor":"import_success/2"},{"id":"invitation_accepted/1","deprecated":false,"title":"invitation_accepted(invitation)","anchor":"invitation_accepted/1"},{"id":"invitation_rejected/1","deprecated":false,"title":"invitation_rejected(invitation)","anchor":"invitation_rejected/1"},{"id":"mailer_email_from/0","deprecated":false,"title":"mailer_email_from()","anchor":"mailer_email_from/0"},{"id":"new_user_invitation/1","deprecated":false,"title":"new_user_invitation(invitation)","anchor":"new_user_invitation/1"},{"id":"over_limit_email/3","deprecated":false,"title":"over_limit_email(user, usage, suggested_plan)","anchor":"over_limit_email/3"},{"id":"ownership_transfer_accepted/1","deprecated":false,"title":"ownership_transfer_accepted(invitation)","anchor":"ownership_transfer_accepted/1"},{"id":"ownership_transfer_rejected/1","deprecated":false,"title":"ownership_transfer_rejected(invitation)","anchor":"ownership_transfer_rejected/1"},{"id":"ownership_transfer_request/2","deprecated":false,"title":"ownership_transfer_request(invitation, new_owner_account)","anchor":"ownership_transfer_request/2"},{"id":"password_reset_email/2","deprecated":false,"title":"password_reset_email(email, reset_link)","anchor":"password_reset_email/2"},{"id":"priority_email/0","deprecated":false,"title":"priority_email()","anchor":"priority_email/0"},{"id":"priority_email/1","deprecated":false,"title":"priority_email(map)","anchor":"priority_email/1"},{"id":"render/3","deprecated":false,"title":"render(email, template, assigns \\\\ [])","anchor":"render/3"},{"id":"site_member_removed/1","deprecated":false,"title":"site_member_removed(membership)","anchor":"site_member_removed/1"},{"id":"site_setup_help/2","deprecated":false,"title":"site_setup_help(user, site)","anchor":"site_setup_help/2"},{"id":"site_setup_success/2","deprecated":false,"title":"site_setup_success(user, site)","anchor":"site_setup_success/2"},{"id":"spike_notification/5","deprecated":false,"title":"spike_notification(email, site, current_visitors, sources, dashboard_link)","anchor":"spike_notification/5"},{"id":"stats_report/2","deprecated":false,"title":"stats_report(email, assigns)","anchor":"stats_report/2"},{"id":"trial_one_week_reminder/1","deprecated":false,"title":"trial_one_week_reminder(user)","anchor":"trial_one_week_reminder/1"},{"id":"trial_over_email/1","deprecated":false,"title":"trial_over_email(user)","anchor":"trial_over_email/1"},{"id":"trial_upgrade_email/3","deprecated":false,"title":"trial_upgrade_email(user, day, usage)","anchor":"trial_upgrade_email/3"},{"id":"two_factor_disabled_email/1","deprecated":false,"title":"two_factor_disabled_email(user)","anchor":"two_factor_disabled_email/1"},{"id":"two_factor_enabled_email/1","deprecated":false,"title":"two_factor_enabled_email(user)","anchor":"two_factor_enabled_email/1"},{"id":"welcome_email/1","deprecated":false,"title":"welcome_email(user)","anchor":"welcome_email/1"},{"id":"yearly_expiration_notification/1","deprecated":false,"title":"yearly_expiration_notification(user)","anchor":"yearly_expiration_notification/1"},{"id":"yearly_renewal_notification/1","deprecated":false,"title":"yearly_renewal_notification(user)","anchor":"yearly_renewal_notification/1"}],"key":"functions"}]},{"id":"PlausibleWeb.EmailView","deprecated":false,"group":"","title":"PlausibleWeb.EmailView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"activation_email.html/1","deprecated":false,"title":"activation_email.html(assigns)","anchor":"activation_email.html/1"},{"id":"approaching_accept_traffic_until.html/1","deprecated":false,"title":"approaching_accept_traffic_until.html(assigns)","anchor":"approaching_accept_traffic_until.html/1"},{"id":"cancellation_email.html/1","deprecated":false,"title":"cancellation_email.html(assigns)","anchor":"cancellation_email.html/1"},{"id":"check_stats_email.html/1","deprecated":false,"title":"check_stats_email.html(assigns)","anchor":"check_stats_email.html/1"},{"id":"create_site_email.html/1","deprecated":false,"title":"create_site_email.html(assigns)","anchor":"create_site_email.html/1"},{"id":"dashboard_locked.html/1","deprecated":false,"title":"dashboard_locked.html(assigns)","anchor":"dashboard_locked.html/1"},{"id":"date_format/1","deprecated":false,"title":"date_format(date)","anchor":"date_format/1"},{"id":"enterprise_over_limit_internal.html/1","deprecated":false,"title":"enterprise_over_limit_internal.html(assigns)","anchor":"enterprise_over_limit_internal.html/1"},{"id":"error_report_email.html/1","deprecated":false,"title":"error_report_email.html(assigns)","anchor":"error_report_email.html/1"},{"id":"existing_user_invitation.html/1","deprecated":false,"title":"existing_user_invitation.html(assigns)","anchor":"existing_user_invitation.html/1"},{"id":"google_analytics_import.html/1","deprecated":false,"title":"google_analytics_import.html(assigns)","anchor":"google_analytics_import.html/1"},{"id":"greet_recipient/1","deprecated":false,"title":"greet_recipient(_)","anchor":"greet_recipient/1"},{"id":"invitation_accepted.html/1","deprecated":false,"title":"invitation_accepted.html(assigns)","anchor":"invitation_accepted.html/1"},{"id":"invitation_rejected.html/1","deprecated":false,"title":"invitation_rejected.html(assigns)","anchor":"invitation_rejected.html/1"},{"id":"new_user_invitation.html/1","deprecated":false,"title":"new_user_invitation.html(assigns)","anchor":"new_user_invitation.html/1"},{"id":"over_limit.html/1","deprecated":false,"title":"over_limit.html(assigns)","anchor":"over_limit.html/1"},{"id":"ownership_transfer_accepted.html/1","deprecated":false,"title":"ownership_transfer_accepted.html(assigns)","anchor":"ownership_transfer_accepted.html/1"},{"id":"ownership_transfer_rejected.html/1","deprecated":false,"title":"ownership_transfer_rejected.html(assigns)","anchor":"ownership_transfer_rejected.html/1"},{"id":"ownership_transfer_request.html/1","deprecated":false,"title":"ownership_transfer_request.html(assigns)","anchor":"ownership_transfer_request.html/1"},{"id":"password_reset_email.html/1","deprecated":false,"title":"password_reset_email.html(assigns)","anchor":"password_reset_email.html/1"},{"id":"plausible_url/0","deprecated":false,"title":"plausible_url()","anchor":"plausible_url/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"sentry_link/2","deprecated":false,"title":"sentry_link(trace_id, dsn \\\\ Sentry.Config.dsn())","anchor":"sentry_link/2"},{"id":"site_member_removed.html/1","deprecated":false,"title":"site_member_removed.html(assigns)","anchor":"site_member_removed.html/1"},{"id":"site_setup_help_email.html/1","deprecated":false,"title":"site_setup_help_email.html(assigns)","anchor":"site_setup_help_email.html/1"},{"id":"site_setup_success_email.html/1","deprecated":false,"title":"site_setup_success_email.html(assigns)","anchor":"site_setup_success_email.html/1"},{"id":"spike_notification.html/1","deprecated":false,"title":"spike_notification.html(assigns)","anchor":"spike_notification.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"trial_one_week_reminder.html/1","deprecated":false,"title":"trial_one_week_reminder.html(assigns)","anchor":"trial_one_week_reminder.html/1"},{"id":"trial_over_email.html/1","deprecated":false,"title":"trial_over_email.html(assigns)","anchor":"trial_over_email.html/1"},{"id":"trial_upgrade_email.html/1","deprecated":false,"title":"trial_upgrade_email.html(assigns)","anchor":"trial_upgrade_email.html/1"},{"id":"two_factor_disabled_email.html/1","deprecated":false,"title":"two_factor_disabled_email.html(assigns)","anchor":"two_factor_disabled_email.html/1"},{"id":"two_factor_enabled_email.html/1","deprecated":false,"title":"two_factor_enabled_email.html(assigns)","anchor":"two_factor_enabled_email.html/1"},{"id":"welcome_email.html/1","deprecated":false,"title":"welcome_email.html(assigns)","anchor":"welcome_email.html/1"},{"id":"yearly_expiration_notification.html/1","deprecated":false,"title":"yearly_expiration_notification.html(assigns)","anchor":"yearly_expiration_notification.html/1"},{"id":"yearly_renewal_notification.html/1","deprecated":false,"title":"yearly_renewal_notification.html(assigns)","anchor":"yearly_renewal_notification.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Endpoint","deprecated":false,"group":"","title":"PlausibleWeb.Endpoint","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"broadcast/3","deprecated":false,"title":"broadcast(topic, event, msg)","anchor":"broadcast/3"},{"id":"broadcast!/3","deprecated":false,"title":"broadcast!(topic, event, msg)","anchor":"broadcast!/3"},{"id":"broadcast_from/4","deprecated":false,"title":"broadcast_from(from, topic, event, msg)","anchor":"broadcast_from/4"},{"id":"broadcast_from!/4","deprecated":false,"title":"broadcast_from!(from, topic, event, msg)","anchor":"broadcast_from!/4"},{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/2","deprecated":false,"title":"config(key, default \\\\ nil)","anchor":"config/2"},{"id":"config_change/2","deprecated":false,"title":"config_change(changed, removed)","anchor":"config_change/2"},{"id":"host/0","deprecated":false,"title":"host()","anchor":"host/0"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"},{"id":"local_broadcast/3","deprecated":false,"title":"local_broadcast(topic, event, msg)","anchor":"local_broadcast/3"},{"id":"local_broadcast_from/4","deprecated":false,"title":"local_broadcast_from(from, topic, event, msg)","anchor":"local_broadcast_from/4"},{"id":"path/1","deprecated":false,"title":"path(path)","anchor":"path/1"},{"id":"runtime_session/2","deprecated":false,"title":"runtime_session(conn, opts)","anchor":"runtime_session/2"},{"id":"runtime_session_opts/0","deprecated":false,"title":"runtime_session_opts()","anchor":"runtime_session_opts/0"},{"id":"script_name/0","deprecated":false,"title":"script_name()","anchor":"script_name/0"},{"id":"secure_cookie?/0","deprecated":false,"title":"secure_cookie?()","anchor":"secure_cookie?/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"static_integrity/1","deprecated":false,"title":"static_integrity(path)","anchor":"static_integrity/1"},{"id":"static_lookup/1","deprecated":false,"title":"static_lookup(path)","anchor":"static_lookup/1"},{"id":"static_path/1","deprecated":false,"title":"static_path(path)","anchor":"static_path/1"},{"id":"static_url/0","deprecated":false,"title":"static_url()","anchor":"static_url/0"},{"id":"struct_url/0","deprecated":false,"title":"struct_url()","anchor":"struct_url/0"},{"id":"subscribe/2","deprecated":false,"title":"subscribe(topic, opts \\\\ [])","anchor":"subscribe/2"},{"id":"unsubscribe/1","deprecated":false,"title":"unsubscribe(topic)","anchor":"unsubscribe/1"},{"id":"url/0","deprecated":false,"title":"url()","anchor":"url/0"},{"id":"websocket_url/0","deprecated":false,"title":"websocket_url()","anchor":"websocket_url/0"}],"key":"functions"}]},{"id":"PlausibleWeb.ErrorHelpers","deprecated":false,"group":"","title":"PlausibleWeb.ErrorHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error_tag/2","deprecated":false,"title":"error_tag(assigns, field)","anchor":"error_tag/2"},{"id":"translate_error/1","deprecated":false,"title":"translate_error(arg)","anchor":"translate_error/1"}],"key":"functions"}]},{"id":"PlausibleWeb.ErrorReportController","deprecated":false,"group":"","title":"PlausibleWeb.ErrorReportController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"submit_error_report/2","deprecated":false,"title":"submit_error_report(conn, arg2)","anchor":"submit_error_report/2"}],"key":"functions"}]},{"id":"PlausibleWeb.ErrorView","deprecated":false,"group":"","title":"PlausibleWeb.ErrorView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"404_error.html/1","deprecated":false,"title":"404_error.html(assigns)","anchor":"404_error.html/1"},{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"generic_error.html/1","deprecated":false,"title":"generic_error.html(assigns)","anchor":"generic_error.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"server_error.html/1","deprecated":false,"title":"server_error.html(assigns)","anchor":"server_error.html/1"},{"id":"server_error_report_thanks.html/1","deprecated":false,"title":"server_error_report_thanks.html(assigns)","anchor":"server_error_report_thanks.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Favicon","deprecated":false,"group":"","title":"PlausibleWeb.Favicon","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, list)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(_)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.FirstLaunchPlug","deprecated":false,"group":"","title":"PlausibleWeb.FirstLaunchPlug","sections":[]},{"id":"PlausibleWeb.FirstLaunchPlug.Test","deprecated":false,"group":"","title":"PlausibleWeb.FirstLaunchPlug.Test","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"skip/1","deprecated":false,"title":"skip(context)","anchor":"skip/1"}],"key":"functions"}]},{"id":"PlausibleWeb.FormHelpers","deprecated":false,"group":"","title":"PlausibleWeb.FormHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"styled_error/1","deprecated":false,"title":"styled_error(error)","anchor":"styled_error/1"},{"id":"styled_label/4","deprecated":false,"title":"styled_label(form, field, text, opts \\\\ [])","anchor":"styled_label/4"},{"id":"styled_select/4","deprecated":false,"title":"styled_select(form, field, options, opts \\\\ [])","anchor":"styled_select/4"},{"id":"styled_text_input/3","deprecated":false,"title":"styled_text_input(form, field, opts \\\\ [])","anchor":"styled_text_input/3"}],"key":"functions"}]},{"id":"PlausibleWeb.InvitationController","deprecated":false,"group":"","title":"PlausibleWeb.InvitationController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept_invitation/2","deprecated":false,"title":"accept_invitation(conn, map)","anchor":"accept_invitation/2"},{"id":"reject_invitation/2","deprecated":false,"title":"reject_invitation(conn, map)","anchor":"reject_invitation/2"},{"id":"remove_invitation/2","deprecated":false,"title":"remove_invitation(conn, map)","anchor":"remove_invitation/2"}],"key":"functions"}]},{"id":"PlausibleWeb.LastSeenPlug","deprecated":false,"group":"","title":"PlausibleWeb.LastSeenPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.LayoutView","deprecated":false,"group":"","title":"PlausibleWeb.LayoutView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"app.html/1","deprecated":false,"title":"app.html(assigns)","anchor":"app.html/1"},{"id":"base_email.html/1","deprecated":false,"title":"base_email.html(assigns)","anchor":"base_email.html/1"},{"id":"base_error.html/1","deprecated":false,"title":"base_error.html(assigns)","anchor":"base_error.html/1"},{"id":"embedded.html/1","deprecated":false,"title":"embedded.html(assigns)","anchor":"embedded.html/1"},{"id":"feedback_link/1","deprecated":false,"title":"feedback_link(user)","anchor":"feedback_link/1"},{"id":"focus.html/1","deprecated":false,"title":"focus.html(assigns)","anchor":"focus.html/1"},{"id":"grace_period_end/1","deprecated":false,"title":"grace_period_end(user)","anchor":"grace_period_end/1"},{"id":"home_dest/1","deprecated":false,"title":"home_dest(conn)","anchor":"home_dest/1"},{"id":"is_current_tab/2","deprecated":false,"title":"is_current_tab(conn, tab)","anchor":"is_current_tab/2"},{"id":"plausible_url/0","deprecated":false,"title":"plausible_url()","anchor":"plausible_url/0"},{"id":"priority_email.html/1","deprecated":false,"title":"priority_email.html(assigns)","anchor":"priority_email.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"render_layout/3","deprecated":false,"title":"render_layout(layout, assigns, list)","anchor":"render_layout/3"},{"id":"settings_tabs/1","deprecated":false,"title":"settings_tabs(conn)","anchor":"settings_tabs/1"},{"id":"site_settings.html/1","deprecated":false,"title":"site_settings.html(assigns)","anchor":"site_settings.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"trial_notificaton/1","deprecated":false,"title":"trial_notificaton(user)","anchor":"trial_notificaton/1"},{"id":"websocket_url/0","deprecated":false,"title":"websocket_url()","anchor":"websocket_url/0"}],"key":"functions"}]},{"id":"PlausibleWeb.LayoutView.JWT","deprecated":false,"group":"","title":"PlausibleWeb.LayoutView.JWT","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"generate_and_sign/2","deprecated":false,"title":"generate_and_sign(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign/2"},{"id":"generate_and_sign!/2","deprecated":false,"title":"generate_and_sign!(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign!/2"},{"id":"verify_and_validate/3","deprecated":false,"title":"verify_and_validate(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate/3"},{"id":"verify_and_validate!/3","deprecated":false,"title":"verify_and_validate!(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate!/3"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.ChoosePlan","deprecated":false,"group":"","title":"PlausibleWeb.Live.ChoosePlan","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"two_months_free/1","deprecated":false,"title":"two_months_free(assigns)","anchor":"two_months_free/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.ComboBox","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.ComboBox","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"dropdown/1","deprecated":false,"title":"dropdown(assigns)","anchor":"dropdown/1"},{"id":"dropdown_anchor/1","deprecated":false,"title":"dropdown_anchor(assigns)","anchor":"dropdown_anchor/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"option/1","deprecated":false,"title":"option(assigns)","anchor":"option/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"select_option/4","deprecated":false,"title":"select_option(js \\\\ %JS{}, id, submit_value, display_value)","anchor":"select_option/4"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.ComboBox.StaticSearch","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.ComboBox.StaticSearch","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"suggest/3","deprecated":false,"title":"suggest(input, choices, opts \\\\ [])","anchor":"suggest/3"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error/1","deprecated":false,"title":"error(assigns)","anchor":"error/1"},{"id":"input/1","deprecated":false,"title":"input(assigns)","anchor":"input/1"},{"id":"input_with_clipboard/1","deprecated":false,"title":"input_with_clipboard(assigns)","anchor":"input_with_clipboard/1"},{"id":"label/1","deprecated":false,"title":"label(assigns)","anchor":"label/1"},{"id":"password_input_with_strength/1","deprecated":false,"title":"password_input_with_strength(assigns)","anchor":"password_input_with_strength/1"},{"id":"password_length_hint/1","deprecated":false,"title":"password_length_hint(assigns)","anchor":"password_length_hint/1"},{"id":"strength_meter/1","deprecated":false,"title":"strength_meter(assigns)","anchor":"strength_meter/1"},{"id":"translate_error/1","deprecated":false,"title":"translate_error(arg)","anchor":"translate_error/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.Pagination","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Pagination","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"pagination/1","deprecated":false,"title":"pagination(assigns)","anchor":"pagination/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.Visitors","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Visitors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"chart/1","deprecated":false,"title":"chart(assigns)","anchor":"chart/1"},{"id":"gradient_defs/1","deprecated":false,"title":"gradient_defs(assigns)","anchor":"gradient_defs/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Flash","deprecated":false,"group":"","title":"PlausibleWeb.Live.Flash","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clear_flash_button/1","deprecated":false,"title":"clear_flash_button(assigns)","anchor":"clear_flash_button/1"},{"id":"flash/1","deprecated":false,"title":"flash(assigns)","anchor":"flash/1"},{"id":"flash_messages/1","deprecated":false,"title":"flash_messages(assigns)","anchor":"flash_messages/1"},{"id":"icon_error/1","deprecated":false,"title":"icon_error(assigns)","anchor":"icon_error/1"},{"id":"icon_success/1","deprecated":false,"title":"icon_success(assigns)","anchor":"icon_success/1"},{"id":"put_live_flash/3","deprecated":false,"title":"put_live_flash(socket, key, message)","anchor":"put_live_flash/3"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.FunnelSettings","deprecated":false,"group":"","title":"PlausibleWeb.Live.FunnelSettings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.FunnelSettings.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.FunnelSettings.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_step_button/1","deprecated":false,"title":"add_step_button(assigns)","anchor":"add_step_button/1"},{"id":"evaluation/1","deprecated":false,"title":"evaluation(assigns)","anchor":"evaluation/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"remove_step_button/1","deprecated":false,"title":"remove_step_button(assigns)","anchor":"remove_step_button/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.FunnelSettings.List","deprecated":false,"group":"","title":"PlausibleWeb.Live.FunnelSettings.List","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.GoalSettings","deprecated":false,"group":"","title":"PlausibleWeb.Live.GoalSettings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.GoalSettings.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.GoalSettings.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"custom_event_fields/1","deprecated":false,"title":"custom_event_fields(assigns)","anchor":"custom_event_fields/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"pageview_fields/1","deprecated":false,"title":"pageview_fields(assigns)","anchor":"pageview_fields/1"},{"id":"pageviews_tab/1","deprecated":false,"title":"pageviews_tab(assigns)","anchor":"pageviews_tab/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"suggest_page_paths/3","deprecated":false,"title":"suggest_page_paths(input, options, site)","anchor":"suggest_page_paths/3"},{"id":"tabs/1","deprecated":false,"title":"tabs(assigns)","anchor":"tabs/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.GoalSettings.List","deprecated":false,"group":"","title":"PlausibleWeb.Live.GoalSettings.List","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Plugins.API.Settings","deprecated":false,"group":"","title":"PlausibleWeb.Live.Plugins.API.Settings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Plugins.API.TokenForm","deprecated":false,"group":"","title":"PlausibleWeb.Live.Plugins.API.TokenForm","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.PropsSettings","deprecated":false,"group":"","title":"PlausibleWeb.Live.PropsSettings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.PropsSettings.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.PropsSettings.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.PropsSettings.List","deprecated":false,"group":"","title":"PlausibleWeb.Live.PropsSettings.List","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.RegisterForm","deprecated":false,"group":"","title":"PlausibleWeb.Live.RegisterForm","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.ResetPasswordForm","deprecated":false,"group":"","title":"PlausibleWeb.Live.ResetPasswordForm","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.SentryContext","deprecated":false,"group":"","title":"PlausibleWeb.Live.SentryContext","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_mount/4","deprecated":false,"title":"on_mount(atom, params, session, socket)","anchor":"on_mount/4"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Sites","deprecated":false,"group":"","title":"PlausibleWeb.Live.Sites","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ellipsis_menu/1","deprecated":false,"title":"ellipsis_menu(assigns)","anchor":"ellipsis_menu/1"},{"id":"favicon/1","deprecated":false,"title":"favicon(assigns)","anchor":"favicon/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg, socket)","anchor":"handle_info/2"},{"id":"handle_params/3","deprecated":false,"title":"handle_params(params, uri, socket)","anchor":"handle_params/3"},{"id":"icon_pin/1","deprecated":false,"title":"icon_pin(assigns)","anchor":"icon_pin/1"},{"id":"invitation/1","deprecated":false,"title":"invitation(assigns)","anchor":"invitation/1"},{"id":"invitation_modal/1","deprecated":false,"title":"invitation_modal(assigns)","anchor":"invitation_modal/1"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"percentage_change/1","deprecated":false,"title":"percentage_change(assigns)","anchor":"percentage_change/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"search_form/1","deprecated":false,"title":"search_form(assigns)","anchor":"search_form/1"},{"id":"site/1","deprecated":false,"title":"site(assigns)","anchor":"site/1"},{"id":"site_stats/1","deprecated":false,"title":"site_stats(assigns)","anchor":"site_stats/1"},{"id":"upgrade_nag_screen/1","deprecated":false,"title":"upgrade_nag_screen(assigns)","anchor":"upgrade_nag_screen/1"}],"key":"functions"}]},{"id":"PlausibleWeb.MJML.StatsReport","deprecated":false,"group":"","title":"PlausibleWeb.MJML.StatsReport","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"debug_mjml_template/0","deprecated":false,"title":"debug_mjml_template()","anchor":"debug_mjml_template/0"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.PageController","deprecated":false,"group":"","title":"PlausibleWeb.PageController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/2"}],"key":"functions"}]},{"id":"PlausibleWeb.PageView","deprecated":false,"group":"","title":"PlausibleWeb.PageView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"index.html/1","deprecated":false,"title":"index.html(assigns)","anchor":"index.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"base_uri/0","deprecated":false,"title":"base_uri()","anchor":"base_uri/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Controllers.CustomProps","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"disable/2","deprecated":false,"title":"disable(conn, params)","anchor":"disable/2"},{"id":"enable/2","deprecated":false,"title":"enable(conn, params)","anchor":"enable/2"},{"id":"open_api_operation/1","deprecated":false,"title":"open_api_operation(action)","anchor":"open_api_operation/1"},{"id":"shared_security/0","deprecated":false,"title":"shared_security()","anchor":"shared_security/0"},{"id":"shared_tags/0","deprecated":false,"title":"shared_tags()","anchor":"shared_tags/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Controllers.Goals","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.Goals","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(conn, params)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(conn, params)","anchor":"delete/2"},{"id":"delete_bulk/2","deprecated":false,"title":"delete_bulk(conn, params)","anchor":"delete_bulk/2"},{"id":"get/2","deprecated":false,"title":"get(conn, params)","anchor":"get/2"},{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/2"},{"id":"open_api_operation/1","deprecated":false,"title":"open_api_operation(action)","anchor":"open_api_operation/1"},{"id":"shared_security/0","deprecated":false,"title":"shared_security()","anchor":"shared_security/0"},{"id":"shared_tags/0","deprecated":false,"title":"shared_tags()","anchor":"shared_tags/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Controllers.SharedLinks","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(conn, params)","anchor":"create/2"},{"id":"get/2","deprecated":false,"title":"get(conn, params)","anchor":"get/2"},{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/2"},{"id":"open_api_operation/1","deprecated":false,"title":"open_api_operation(action)","anchor":"open_api_operation/1"},{"id":"shared_security/0","deprecated":false,"title":"shared_security()","anchor":"shared_security/0"},{"id":"shared_tags/0","deprecated":false,"title":"shared_tags()","anchor":"shared_tags/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Errors","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Errors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error/3","deprecated":false,"title":"error(conn, status, message)","anchor":"error/3"},{"id":"unauthorized/1","deprecated":false,"title":"unauthorized(conn)","anchor":"unauthorized/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Router","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Router","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api/2","deprecated":false,"title":"api(conn, _)","anchor":"api/2"},{"id":"auth/2","deprecated":false,"title":"auth(conn, _)","anchor":"auth/2"},{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.CustomProp","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Error","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Error","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.Type","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Type","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Link","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Link","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.NotFound","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.NotFound","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.SharedLink","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Unauthorized","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Unauthorized","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Spec","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Spec","sections":[]},{"id":"PlausibleWeb.Plugins.API.Views.CustomProp","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.CustomProp","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Views.Error","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Error","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Views.Goal","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Goal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Views.Pagination","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Pagination","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"render_metadata_links/4","deprecated":false,"title":"render_metadata_links(meta, helper_fn, helper_fn_args, existing_params \\\\ %{})","anchor":"render_metadata_links/4"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Views.SharedLink","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.SharedLink","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.PluginsAPICase","deprecated":false,"group":"","title":"PlausibleWeb.PluginsAPICase","sections":[]},{"id":"PlausibleWeb.Plugs.AuthorizePluginsAPI","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.AuthorizePluginsAPI","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts \\\\ [])","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugs.ErrorHandler","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.ErrorHandler","sections":[]},{"id":"PlausibleWeb.Plugs.MaybeDisableRegistration","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.MaybeDisableRegistration","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugs.NoRobots","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.NoRobots","sections":[]},{"id":"PlausibleWeb.RefInspector","deprecated":false,"group":"","title":"PlausibleWeb.RefInspector","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"parse/1","deprecated":false,"title":"parse(ref)","anchor":"parse/1"},{"id":"right_uri?/1","deprecated":false,"title":"right_uri?(arg1)","anchor":"right_uri?/1"}],"key":"functions"}]},{"id":"PlausibleWeb.RemoteIp","deprecated":false,"group":"","title":"PlausibleWeb.RemoteIp","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/1","deprecated":false,"title":"get(conn)","anchor":"get/1"}],"key":"functions"}]},{"id":"PlausibleWeb.RequireAccountPlug","deprecated":false,"group":"","title":"PlausibleWeb.RequireAccountPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.RequireLoggedOutPlug","deprecated":false,"group":"","title":"PlausibleWeb.RequireLoggedOutPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Router","deprecated":false,"group":"","title":"PlausibleWeb.Router","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api/2","deprecated":false,"title":"api(conn, _)","anchor":"api/2"},{"id":"app_layout/2","deprecated":false,"title":"app_layout(conn, _)","anchor":"app_layout/2"},{"id":"browser/2","deprecated":false,"title":"browser(conn, _)","anchor":"browser/2"},{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"csrf/2","deprecated":false,"title":"csrf(conn, _)","anchor":"csrf/2"},{"id":"flags/2","deprecated":false,"title":"flags(conn, _)","anchor":"flags/2"},{"id":"focus_layout/2","deprecated":false,"title":"focus_layout(conn, _)","anchor":"focus_layout/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"},{"id":"internal_stats_api/2","deprecated":false,"title":"internal_stats_api(conn, _)","anchor":"internal_stats_api/2"},{"id":"kaffy_browser/2","deprecated":false,"title":"kaffy_browser(conn, _)","anchor":"kaffy_browser/2"},{"id":"public_api/2","deprecated":false,"title":"public_api(conn, _)","anchor":"public_api/2"},{"id":"shared_link/2","deprecated":false,"title":"shared_link(conn, _)","anchor":"shared_link/2"}],"key":"functions"}]},{"id":"PlausibleWeb.SessionTimeoutPlug","deprecated":false,"group":"","title":"PlausibleWeb.SessionTimeoutPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts \\\\ [])","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Site.MembershipController","deprecated":false,"group":"","title":"PlausibleWeb.Site.MembershipController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"invite_member/2","deprecated":false,"title":"invite_member(conn, map)","anchor":"invite_member/2"},{"id":"invite_member_form/2","deprecated":false,"title":"invite_member_form(conn, params)","anchor":"invite_member_form/2"},{"id":"remove_member/2","deprecated":false,"title":"remove_member(conn, map)","anchor":"remove_member/2"},{"id":"transfer_ownership/2","deprecated":false,"title":"transfer_ownership(conn, map)","anchor":"transfer_ownership/2"},{"id":"transfer_ownership_form/2","deprecated":false,"title":"transfer_ownership_form(conn, params)","anchor":"transfer_ownership_form/2"},{"id":"update_role/2","deprecated":false,"title":"update_role(conn, map)","anchor":"update_role/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Site.MembershipView","deprecated":false,"group":"","title":"PlausibleWeb.Site.MembershipView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"invite_member_form.html/1","deprecated":false,"title":"invite_member_form.html(assigns)","anchor":"invite_member_form.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"transfer_ownership_form.html/1","deprecated":false,"title":"transfer_ownership_form.html(assigns)","anchor":"transfer_ownership_form.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.SiteController","deprecated":false,"group":"","title":"PlausibleWeb.SiteController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_monthly_report_recipient/2","deprecated":false,"title":"add_monthly_report_recipient(conn, map)","anchor":"add_monthly_report_recipient/2"},{"id":"add_snippet/2","deprecated":false,"title":"add_snippet(conn, params)","anchor":"add_snippet/2"},{"id":"add_snippet_after_domain_change/2","deprecated":false,"title":"add_snippet_after_domain_change(conn, params)","anchor":"add_snippet_after_domain_change/2"},{"id":"add_spike_notification_recipient/2","deprecated":false,"title":"add_spike_notification_recipient(conn, map)","anchor":"add_spike_notification_recipient/2"},{"id":"add_weekly_report_recipient/2","deprecated":false,"title":"add_weekly_report_recipient(conn, map)","anchor":"add_weekly_report_recipient/2"},{"id":"change_domain/2","deprecated":false,"title":"change_domain(conn, params)","anchor":"change_domain/2"},{"id":"change_domain_submit/2","deprecated":false,"title":"change_domain_submit(conn, map)","anchor":"change_domain_submit/2"},{"id":"create_shared_link/2","deprecated":false,"title":"create_shared_link(conn, map)","anchor":"create_shared_link/2"},{"id":"create_site/2","deprecated":false,"title":"create_site(conn, map)","anchor":"create_site/2"},{"id":"delete_google_auth/2","deprecated":false,"title":"delete_google_auth(conn, params)","anchor":"delete_google_auth/2"},{"id":"delete_shared_link/2","deprecated":false,"title":"delete_shared_link(conn, map)","anchor":"delete_shared_link/2"},{"id":"delete_site/2","deprecated":false,"title":"delete_site(conn, params)","anchor":"delete_site/2"},{"id":"disable_monthly_report/2","deprecated":false,"title":"disable_monthly_report(conn, params)","anchor":"disable_monthly_report/2"},{"id":"disable_spike_notification/2","deprecated":false,"title":"disable_spike_notification(conn, params)","anchor":"disable_spike_notification/2"},{"id":"disable_weekly_report/2","deprecated":false,"title":"disable_weekly_report(conn, params)","anchor":"disable_weekly_report/2"},{"id":"edit_shared_link/2","deprecated":false,"title":"edit_shared_link(conn, map)","anchor":"edit_shared_link/2"},{"id":"enable_monthly_report/2","deprecated":false,"title":"enable_monthly_report(conn, params)","anchor":"enable_monthly_report/2"},{"id":"enable_spike_notification/2","deprecated":false,"title":"enable_spike_notification(conn, params)","anchor":"enable_spike_notification/2"},{"id":"enable_weekly_report/2","deprecated":false,"title":"enable_weekly_report(conn, params)","anchor":"enable_weekly_report/2"},{"id":"forget_imported/2","deprecated":false,"title":"forget_imported(conn, params)","anchor":"forget_imported/2"},{"id":"import_from_google/2","deprecated":false,"title":"import_from_google(conn, map)","anchor":"import_from_google/2"},{"id":"import_from_google_confirm/2","deprecated":false,"title":"import_from_google_confirm(conn, map)","anchor":"import_from_google_confirm/2"},{"id":"import_from_google_user_metric_notice/2","deprecated":false,"title":"import_from_google_user_metric_notice(conn, map)","anchor":"import_from_google_user_metric_notice/2"},{"id":"import_from_google_view_id/2","deprecated":false,"title":"import_from_google_view_id(conn, map)","anchor":"import_from_google_view_id/2"},{"id":"import_from_google_view_id_form/2","deprecated":false,"title":"import_from_google_view_id_form(conn, map)","anchor":"import_from_google_view_id_form/2"},{"id":"make_private/2","deprecated":false,"title":"make_private(conn, params)","anchor":"make_private/2"},{"id":"make_public/2","deprecated":false,"title":"make_public(conn, params)","anchor":"make_public/2"},{"id":"new/2","deprecated":false,"title":"new(conn, params)","anchor":"new/2"},{"id":"new_shared_link/2","deprecated":false,"title":"new_shared_link(conn, params)","anchor":"new_shared_link/2"},{"id":"remove_monthly_report_recipient/2","deprecated":false,"title":"remove_monthly_report_recipient(conn, map)","anchor":"remove_monthly_report_recipient/2"},{"id":"remove_spike_notification_recipient/2","deprecated":false,"title":"remove_spike_notification_recipient(conn, map)","anchor":"remove_spike_notification_recipient/2"},{"id":"remove_weekly_report_recipient/2","deprecated":false,"title":"remove_weekly_report_recipient(conn, map)","anchor":"remove_weekly_report_recipient/2"},{"id":"reset_stats/2","deprecated":false,"title":"reset_stats(conn, params)","anchor":"reset_stats/2"},{"id":"settings/2","deprecated":false,"title":"settings(conn, map)","anchor":"settings/2"},{"id":"settings_danger_zone/2","deprecated":false,"title":"settings_danger_zone(conn, params)","anchor":"settings_danger_zone/2"},{"id":"settings_email_reports/2","deprecated":false,"title":"settings_email_reports(conn, params)","anchor":"settings_email_reports/2"},{"id":"settings_funnels/2","deprecated":false,"title":"settings_funnels(conn, params)","anchor":"settings_funnels/2"},{"id":"settings_general/2","deprecated":false,"title":"settings_general(conn, params)","anchor":"settings_general/2"},{"id":"settings_goals/2","deprecated":false,"title":"settings_goals(conn, params)","anchor":"settings_goals/2"},{"id":"settings_integrations/2","deprecated":false,"title":"settings_integrations(conn, params)","anchor":"settings_integrations/2"},{"id":"settings_people/2","deprecated":false,"title":"settings_people(conn, params)","anchor":"settings_people/2"},{"id":"settings_props/2","deprecated":false,"title":"settings_props(conn, params)","anchor":"settings_props/2"},{"id":"settings_visibility/2","deprecated":false,"title":"settings_visibility(conn, params)","anchor":"settings_visibility/2"},{"id":"update_feature_visibility/2","deprecated":false,"title":"update_feature_visibility(conn, map)","anchor":"update_feature_visibility/2"},{"id":"update_google_auth/2","deprecated":false,"title":"update_google_auth(conn, map)","anchor":"update_google_auth/2"},{"id":"update_settings/2","deprecated":false,"title":"update_settings(conn, map)","anchor":"update_settings/2"},{"id":"update_shared_link/2","deprecated":false,"title":"update_shared_link(conn, map)","anchor":"update_shared_link/2"},{"id":"update_spike_notification/2","deprecated":false,"title":"update_spike_notification(conn, map)","anchor":"update_spike_notification/2"}],"key":"functions"}]},{"id":"PlausibleWeb.SiteView","deprecated":false,"group":"","title":"PlausibleWeb.SiteView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"change_domain.html/1","deprecated":false,"title":"change_domain.html(assigns)","anchor":"change_domain.html/1"},{"id":"edit_shared_link.html/1","deprecated":false,"title":"edit_shared_link.html(assigns)","anchor":"edit_shared_link.html/1"},{"id":"import_from_google_confirm.html/1","deprecated":false,"title":"import_from_google_confirm.html(assigns)","anchor":"import_from_google_confirm.html/1"},{"id":"import_from_google_user_metric_form.html/1","deprecated":false,"title":"import_from_google_user_metric_form.html(assigns)","anchor":"import_from_google_user_metric_form.html/1"},{"id":"import_from_google_view_id_form.html/1","deprecated":false,"title":"import_from_google_view_id_form.html(assigns)","anchor":"import_from_google_view_id_form.html/1"},{"id":"new.html/1","deprecated":false,"title":"new.html(assigns)","anchor":"new.html/1"},{"id":"new_shared_link.html/1","deprecated":false,"title":"new_shared_link.html(assigns)","anchor":"new_shared_link.html/1"},{"id":"plausible_url/0","deprecated":false,"title":"plausible_url()","anchor":"plausible_url/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"render_snippet/1","deprecated":false,"title":"render_snippet(site)","anchor":"render_snippet/1"},{"id":"settings_danger_zone.html/1","deprecated":false,"title":"settings_danger_zone.html(assigns)","anchor":"settings_danger_zone.html/1"},{"id":"settings_email_reports.html/1","deprecated":false,"title":"settings_email_reports.html(assigns)","anchor":"settings_email_reports.html/1"},{"id":"settings_funnels.html/1","deprecated":false,"title":"settings_funnels.html(assigns)","anchor":"settings_funnels.html/1"},{"id":"settings_general.html/1","deprecated":false,"title":"settings_general.html(assigns)","anchor":"settings_general.html/1"},{"id":"settings_goals.html/1","deprecated":false,"title":"settings_goals.html(assigns)","anchor":"settings_goals.html/1"},{"id":"settings_google_import.html/1","deprecated":false,"title":"settings_google_import.html(assigns)","anchor":"settings_google_import.html/1"},{"id":"settings_integrations.html/1","deprecated":false,"title":"settings_integrations.html(assigns)","anchor":"settings_integrations.html/1"},{"id":"settings_people.html/1","deprecated":false,"title":"settings_people.html(assigns)","anchor":"settings_people.html/1"},{"id":"settings_props.html/1","deprecated":false,"title":"settings_props.html(assigns)","anchor":"settings_props.html/1"},{"id":"settings_search_console.html/1","deprecated":false,"title":"settings_search_console.html(assigns)","anchor":"settings_search_console.html/1"},{"id":"settings_visibility.html/1","deprecated":false,"title":"settings_visibility.html(assigns)","anchor":"settings_visibility.html/1"},{"id":"shared_link_dest/2","deprecated":false,"title":"shared_link_dest(site, link)","anchor":"shared_link_dest/2"},{"id":"snippet.html/1","deprecated":false,"title":"snippet.html(assigns)","anchor":"snippet.html/1"},{"id":"snippet_after_domain_change.html/1","deprecated":false,"title":"snippet_after_domain_change.html(assigns)","anchor":"snippet_after_domain_change.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"with_indefinite_article/1","deprecated":false,"title":"with_indefinite_article(word)","anchor":"with_indefinite_article/1"}],"key":"functions"}]},{"id":"PlausibleWeb.StatsController","deprecated":false,"group":"","title":"PlausibleWeb.StatsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"authenticate_shared_link/2","deprecated":false,"title":"authenticate_shared_link(conn, map)","anchor":"authenticate_shared_link/2"},{"id":"csv_export/2","deprecated":false,"title":"csv_export(conn, params)","anchor":"csv_export/2"},{"id":"shared_link/2","deprecated":false,"title":"shared_link(conn, arg2)","anchor":"shared_link/2"},{"id":"stats/2","deprecated":false,"title":"stats(conn, params)","anchor":"stats/2"}],"key":"functions"}]},{"id":"PlausibleWeb.StatsView","deprecated":false,"group":"","title":"PlausibleWeb.StatsView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"large_number_format/1","deprecated":false,"title":"large_number_format(n)","anchor":"large_number_format/1"},{"id":"plausible_url/0","deprecated":false,"title":"plausible_url()","anchor":"plausible_url/0"},{"id":"pretty_stats_url/1","deprecated":false,"title":"pretty_stats_url(arg)","anchor":"pretty_stats_url/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"shared_link_password.html/1","deprecated":false,"title":"shared_link_password.html(assigns)","anchor":"shared_link_password.html/1"},{"id":"site_locked.html/1","deprecated":false,"title":"site_locked.html(assigns)","anchor":"site_locked.html/1"},{"id":"stats.html/1","deprecated":false,"title":"stats.html(assigns)","anchor":"stats.html/1"},{"id":"stats_container_class/1","deprecated":false,"title":"stats_container_class(conn)","anchor":"stats_container_class/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"waiting_first_pageview.html/1","deprecated":false,"title":"waiting_first_pageview.html(assigns)","anchor":"waiting_first_pageview.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Tracker","deprecated":false,"group":"","title":"PlausibleWeb.Tracker","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, list)","anchor":"call/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.TwoFactor.Session","deprecated":false,"group":"","title":"PlausibleWeb.TwoFactor.Session","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clear_2fa_user/1","deprecated":false,"title":"clear_2fa_user(conn)","anchor":"clear_2fa_user/1"},{"id":"clear_remember_2fa/1","deprecated":false,"title":"clear_remember_2fa(conn)","anchor":"clear_remember_2fa/1"},{"id":"get_2fa_user/1","deprecated":false,"title":"get_2fa_user(conn)","anchor":"get_2fa_user/1"},{"id":"maybe_set_remember_2fa/3","deprecated":false,"title":"maybe_set_remember_2fa(conn, user, arg3)","anchor":"maybe_set_remember_2fa/3"},{"id":"remember_2fa?/2","deprecated":false,"title":"remember_2fa?(conn, user)","anchor":"remember_2fa?/2"},{"id":"remember_2fa_days/0","deprecated":false,"title":"remember_2fa_days()","anchor":"remember_2fa_days/0"},{"id":"set_2fa_user/2","deprecated":false,"title":"set_2fa_user(conn, user)","anchor":"set_2fa_user/2"}],"key":"functions"}]},{"id":"PlausibleWeb.UnsubscribeController","deprecated":false,"group":"","title":"PlausibleWeb.UnsubscribeController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"monthly_report/2","deprecated":false,"title":"monthly_report(conn, map)","anchor":"monthly_report/2"},{"id":"weekly_report/2","deprecated":false,"title":"weekly_report(conn, map)","anchor":"weekly_report/2"}],"key":"functions"}]},{"id":"PlausibleWeb.UnsubscribeView","deprecated":false,"group":"","title":"PlausibleWeb.UnsubscribeView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"success.html/1","deprecated":false,"title":"success.html(assigns)","anchor":"success.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]}],"extras":[{"id":"api-reference","group":"","title":"API Reference","headers":[{"id":"Modules","anchor":"modules"},{"id":"Mix Tasks","anchor":"mix-tasks"}]},{"id":"readme","group":"","title":"Introduction","headers":[{"id":"Why Plausible?","anchor":"why-plausible"},{"id":"Why is Plausible Analytics Cloud not free like Google Analytics?","anchor":"why-is-plausible-analytics-cloud-not-free-like-google-analytics"},{"id":"Getting started with Plausible","anchor":"getting-started-with-plausible"},{"id":"Technology","anchor":"technology"},{"id":"Contributors","anchor":"contributors"},{"id":"Feedback & Roadmap","anchor":"feedback-roadmap"},{"id":"License & Trademarks","anchor":"license-trademarks"}]},{"id":"contributing","group":"","title":"Contributing","headers":[{"id":"Development setup","anchor":"development-setup"},{"id":"Finding a task","anchor":"finding-a-task"}]},{"id":"account-locking","group":"Features","title":"Account locking","headers":[{"id":"Usage alert and grace period","anchor":"usage-alert-and-grace-period"},{"id":"Account locking","anchor":"account-locking"}]}],"tasks":[{"id":"Mix.Tasks.CancelSubscription","deprecated":false,"group":"","title":"mix cancel_subscription","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(list)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.CleanClickhouse","deprecated":false,"group":"","title":"mix clean_clickhouse","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.CreateFreeSubscription","deprecated":false,"group":"","title":"mix create_free_subscription","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"execute/1","deprecated":false,"title":"execute(user_id)","anchor":"execute/1"},{"id":"run/1","deprecated":false,"title":"run(arg1)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.DownloadCountryDatabase","deprecated":false,"group":"","title":"mix download_country_database","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.GenerateReferrerFavicons","deprecated":false,"group":"","title":"mix generate_referrer_favicons","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.PullSandboxSubscription","deprecated":false,"group":"","title":"mix pull_sandbox_subscription","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(list)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.SendPageview","deprecated":false,"group":"","title":"mix send_pageview","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(opts)","anchor":"run/1"}],"key":"functions"}]}]} \ No newline at end of file +sidebarNodes={"modules":[{"id":"ObanErrorReporter","deprecated":false,"group":"","title":"ObanErrorReporter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","deprecated":false,"title":"handle_event(list, measure, meta, _)","anchor":"handle_event/4"}],"key":"functions"}]},{"id":"Plausible","deprecated":false,"group":"","title":"Plausible","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"do_on_full_build/1","deprecated":false,"title":"do_on_full_build(list)","anchor":"do_on_full_build/1"},{"id":"full_build?/0","deprecated":false,"title":"full_build?()","anchor":"full_build?/0"},{"id":"on_full_build/1","deprecated":false,"title":"on_full_build(clauses)","anchor":"on_full_build/1"},{"id":"small_build?/0","deprecated":false,"title":"small_build?()","anchor":"small_build?/0"}],"key":"functions"}]},{"id":"Plausible.AsyncInsertRepo","deprecated":false,"group":"","title":"Plausible.AsyncInsertRepo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.Auth","deprecated":false,"group":"","title":"Plausible.Auth","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_api_key/3","deprecated":false,"title":"create_api_key(user, name, key)","anchor":"create_api_key/3"},{"id":"create_user/3","deprecated":false,"title":"create_user(name, email, pwd)","anchor":"create_user/3"},{"id":"delete_api_key/2","deprecated":false,"title":"delete_api_key(user, id)","anchor":"delete_api_key/2"},{"id":"delete_user/1","deprecated":false,"title":"delete_user(user)","anchor":"delete_user/1"},{"id":"enterprise_configured?/1","deprecated":false,"title":"enterprise_configured?(user)","anchor":"enterprise_configured?/1"},{"id":"find_api_key/1","deprecated":false,"title":"find_api_key(raw_key)","anchor":"find_api_key/1"},{"id":"find_user_by/1","deprecated":false,"title":"find_user_by(opts)","anchor":"find_user_by/1"},{"id":"has_active_sites?/2","deprecated":false,"title":"has_active_sites?(user, roles \\\\ [:owner, :admin, :viewer])","anchor":"has_active_sites?/2"},{"id":"is_super_admin?/1","deprecated":false,"title":"is_super_admin?(user_id)","anchor":"is_super_admin?/1"},{"id":"user_owns_sites?/1","deprecated":false,"title":"user_owns_sites?(user)","anchor":"user_owns_sites?/1"}],"key":"functions"}]},{"id":"Plausible.Auth.ApiKey","deprecated":false,"group":"","title":"Plausible.Auth.ApiKey","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(schema, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"do_hash/1","deprecated":false,"title":"do_hash(key)","anchor":"do_hash/1"},{"id":"process_key/1","deprecated":false,"title":"process_key(changeset)","anchor":"process_key/1"},{"id":"update/2","deprecated":false,"title":"update(schema, attrs \\\\ %{})","anchor":"update/2"}],"key":"functions"}]},{"id":"Plausible.Auth.ApiKeyAdmin","deprecated":false,"group":"","title":"Plausible.Auth.ApiKeyAdmin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(schema, attrs)","anchor":"create_changeset/2"},{"id":"custom_index_query/3","deprecated":false,"title":"custom_index_query(conn, schema, query)","anchor":"custom_index_query/3"},{"id":"form_fields/1","deprecated":false,"title":"form_fields(_)","anchor":"form_fields/1"},{"id":"index/1","deprecated":false,"title":"index(_)","anchor":"index/1"},{"id":"search_fields/1","deprecated":false,"title":"search_fields(schema)","anchor":"search_fields/1"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(schema, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Auth.EmailActivationCode","deprecated":false,"group":"","title":"Plausible.Auth.EmailActivationCode","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"generate_code/0","deprecated":false,"title":"generate_code()","anchor":"generate_code/0"},{"id":"new/2","deprecated":false,"title":"new(user, now)","anchor":"new/2"}],"key":"functions"}]},{"id":"Plausible.Auth.EmailVerification","deprecated":false,"group":"","title":"Plausible.Auth.EmailVerification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"any?/1","deprecated":false,"title":"any?(user)","anchor":"any?/1"},{"id":"expired?/1","deprecated":false,"title":"expired?(verification)","anchor":"expired?/1"},{"id":"issue_code/2","deprecated":false,"title":"issue_code(user, now \\\\ NaiveDateTime.utc_now())","anchor":"issue_code/2"},{"id":"verify_code/2","deprecated":false,"title":"verify_code(user, code)","anchor":"verify_code/2"}],"key":"functions"}]},{"id":"Plausible.Auth.GracePeriod","deprecated":false,"group":"","title":"Plausible.Auth.GracePeriod","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"active?/1","deprecated":false,"title":"active?(user)","anchor":"active?/1"},{"id":"end_changeset/1","deprecated":false,"title":"end_changeset(user)","anchor":"end_changeset/1"},{"id":"expired?/1","deprecated":false,"title":"expired?(user)","anchor":"expired?/1"},{"id":"remove_changeset/1","deprecated":false,"title":"remove_changeset(user)","anchor":"remove_changeset/1"},{"id":"start_changeset/2","deprecated":false,"title":"start_changeset(user, allowance_required)","anchor":"start_changeset/2"},{"id":"start_manual_lock_changeset/2","deprecated":false,"title":"start_manual_lock_changeset(user, allowance_required)","anchor":"start_manual_lock_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Auth.Invitation","deprecated":false,"group":"","title":"Plausible.Auth.Invitation","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","deprecated":false,"title":"new(attrs \\\\ %{})","anchor":"new/1"}],"key":"functions"}]},{"id":"Plausible.Auth.Password","deprecated":false,"group":"","title":"Plausible.Auth.Password","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"dummy_calculation/0","deprecated":false,"title":"dummy_calculation()","anchor":"dummy_calculation/0"},{"id":"hash/1","deprecated":false,"title":"hash(password)","anchor":"hash/1"},{"id":"match?/2","deprecated":false,"title":"match?(password, hash)","anchor":"match?/2"}],"key":"functions"}]},{"id":"Plausible.Auth.TOTP","deprecated":false,"group":"","title":"Plausible.Auth.TOTP","sections":[{"id":"Setup","anchor":"module-setup"},{"id":"Management","anchor":"module-management"},{"id":"Validation","anchor":"module-validation"},{"id":"Code validity","anchor":"module-code-validity"},{"id":"TOTP Token","anchor":"module-totp-token"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"disable/2","deprecated":false,"title":"disable(user, password)","anchor":"disable/2"},{"id":"enable/3","deprecated":false,"title":"enable(user, code, opts \\\\ [])","anchor":"enable/3"},{"id":"enabled?/1","deprecated":false,"title":"enabled?(user)","anchor":"enabled?/1"},{"id":"generate_recovery_codes/1","deprecated":false,"title":"generate_recovery_codes(map)","anchor":"generate_recovery_codes/1"},{"id":"generate_recovery_codes/2","deprecated":false,"title":"generate_recovery_codes(user, password)","anchor":"generate_recovery_codes/2"},{"id":"initiate/1","deprecated":false,"title":"initiate(user)","anchor":"initiate/1"},{"id":"initiated?/1","deprecated":false,"title":"initiated?(user)","anchor":"initiated?/1"},{"id":"reset_token/1","deprecated":false,"title":"reset_token(user)","anchor":"reset_token/1"},{"id":"use_recovery_code/2","deprecated":false,"title":"use_recovery_code(user, code)","anchor":"use_recovery_code/2"},{"id":"validate_code/3","deprecated":false,"title":"validate_code(user, code, opts \\\\ [])","anchor":"validate_code/3"}],"key":"functions"}]},{"id":"Plausible.Auth.TOTP.EncryptedBinary","deprecated":false,"group":"","title":"Plausible.Auth.TOTP.EncryptedBinary","sections":[]},{"id":"Plausible.Auth.TOTP.RecoveryCode","deprecated":false,"group":"","title":"Plausible.Auth.TOTP.RecoveryCode","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(user, code)","anchor":"changeset/2"},{"id":"changeset_to_map/2","deprecated":false,"title":"changeset_to_map(changeset, now)","anchor":"changeset_to_map/2"},{"id":"generate_codes/1","deprecated":false,"title":"generate_codes(count)","anchor":"generate_codes/1"},{"id":"match?/2","deprecated":false,"title":"match?(recovery_code, input_code)","anchor":"match?/2"}],"key":"functions"}]},{"id":"Plausible.Auth.TOTP.Vault","deprecated":false,"group":"","title":"Plausible.Auth.TOTP.Vault","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(config \\\\ [])","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Plausible.Auth.Token","deprecated":false,"group":"","title":"Plausible.Auth.Token","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"sign_password_reset/1","deprecated":false,"title":"sign_password_reset(email)","anchor":"sign_password_reset/1"},{"id":"sign_shared_link/1","deprecated":false,"title":"sign_shared_link(slug)","anchor":"sign_shared_link/1"},{"id":"verify_password_reset/1","deprecated":false,"title":"verify_password_reset(token)","anchor":"verify_password_reset/1"},{"id":"verify_shared_link/1","deprecated":false,"title":"verify_shared_link(token)","anchor":"verify_shared_link/1"}],"key":"functions"}]},{"id":"Plausible.Auth.User","deprecated":false,"group":"","title":"Plausible.Auth.User","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"cancel_email_changeset/1","deprecated":false,"title":"cancel_email_changeset(user)","anchor":"cancel_email_changeset/1"},{"id":"changeset/2","deprecated":false,"title":"changeset(user, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"email_changeset/2","deprecated":false,"title":"email_changeset(user, attrs \\\\ %{})","anchor":"email_changeset/2"},{"id":"end_trial/1","deprecated":false,"title":"end_trial(user)","anchor":"end_trial/1"},{"id":"hash_password/1","deprecated":false,"title":"hash_password(changeset)","anchor":"hash_password/1"},{"id":"new/1","deprecated":false,"title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"password_strength/1","deprecated":false,"title":"password_strength(changeset)","anchor":"password_strength/1"},{"id":"profile_img_url/1","deprecated":false,"title":"profile_img_url(user)","anchor":"profile_img_url/1"},{"id":"remove_trial_expiry/1","deprecated":false,"title":"remove_trial_expiry(user)","anchor":"remove_trial_expiry/1"},{"id":"set_password/2","deprecated":false,"title":"set_password(user, password)","anchor":"set_password/2"},{"id":"settings_changeset/2","deprecated":false,"title":"settings_changeset(user, attrs \\\\ %{})","anchor":"settings_changeset/2"},{"id":"start_trial/1","deprecated":false,"title":"start_trial(user)","anchor":"start_trial/1"},{"id":"subscription_accept_traffic_until_offset_days/0","deprecated":false,"title":"subscription_accept_traffic_until_offset_days()","anchor":"subscription_accept_traffic_until_offset_days/0"},{"id":"trial_accept_traffic_until_offset_days/0","deprecated":false,"title":"trial_accept_traffic_until_offset_days()","anchor":"trial_accept_traffic_until_offset_days/0"}],"key":"functions"}]},{"id":"Plausible.Auth.UserAdmin","deprecated":false,"group":"","title":"Plausible.Auth.UserAdmin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"custom_index_query/3","deprecated":false,"title":"custom_index_query(conn, schema, query)","anchor":"custom_index_query/3"},{"id":"delete/2","deprecated":false,"title":"delete(conn, map)","anchor":"delete/2"},{"id":"form_fields/1","deprecated":false,"title":"form_fields(_)","anchor":"form_fields/1"},{"id":"index/1","deprecated":false,"title":"index(_)","anchor":"index/1"},{"id":"resource_actions/1","deprecated":false,"title":"resource_actions(_)","anchor":"resource_actions/1"}],"key":"functions"}]},{"id":"Plausible.Billing","deprecated":false,"group":"","title":"Plausible.Billing","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"active_subscription_for/1","deprecated":false,"title":"active_subscription_for(user_id)","anchor":"active_subscription_for/1"},{"id":"cancelled_subscription_notice_dismiss_id/1","deprecated":false,"title":"cancelled_subscription_notice_dismiss_id(user)","anchor":"cancelled_subscription_notice_dismiss_id/1"},{"id":"change_plan/2","deprecated":false,"title":"change_plan(user, new_plan_id)","anchor":"change_plan/2"},{"id":"change_plan_preview/2","deprecated":false,"title":"change_plan_preview(subscription, new_plan_id)","anchor":"change_plan_preview/2"},{"id":"check_needs_to_upgrade/1","deprecated":false,"title":"check_needs_to_upgrade(user)","anchor":"check_needs_to_upgrade/1"},{"id":"format_price/1","deprecated":false,"title":"format_price(money)","anchor":"format_price/1"},{"id":"has_active_subscription?/1","deprecated":false,"title":"has_active_subscription?(user_id)","anchor":"has_active_subscription?/1"},{"id":"on_trial?/1","deprecated":false,"title":"on_trial?(user)","anchor":"on_trial?/1"},{"id":"paddle_api/0","deprecated":false,"title":"paddle_api()","anchor":"paddle_api/0"},{"id":"subscription_cancelled/1","deprecated":false,"title":"subscription_cancelled(params)","anchor":"subscription_cancelled/1"},{"id":"subscription_created/1","deprecated":false,"title":"subscription_created(params)","anchor":"subscription_created/1"},{"id":"subscription_is_active?/1","deprecated":false,"title":"subscription_is_active?(subscription)","anchor":"subscription_is_active?/1"},{"id":"subscription_payment_succeeded/1","deprecated":false,"title":"subscription_payment_succeeded(params)","anchor":"subscription_payment_succeeded/1"},{"id":"subscription_updated/1","deprecated":false,"title":"subscription_updated(params)","anchor":"subscription_updated/1"},{"id":"trial_days_left/1","deprecated":false,"title":"trial_days_left(user)","anchor":"trial_days_left/1"}],"key":"functions"}]},{"id":"Plausible.Billing.Ecto.Feature","deprecated":false,"group":"","title":"Plausible.Billing.Ecto.Feature","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(feature)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(mod)","anchor":"dump/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","deprecated":false,"title":"load(feature)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Plausible.Billing.Ecto.FeatureList","deprecated":false,"group":"","title":"Plausible.Billing.Ecto.FeatureList","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(list)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(list)","anchor":"dump/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","deprecated":false,"title":"load(list)","anchor":"load/1"},{"id":"render_form/5","deprecated":false,"title":"render_form(conn, changeset, form, field, options)","anchor":"render_form/5"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Plausible.Billing.Ecto.Limit","deprecated":false,"group":"","title":"Plausible.Billing.Ecto.Limit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(other)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(other)","anchor":"dump/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","deprecated":false,"title":"load(other)","anchor":"load/1"},{"id":"render_form/5","deprecated":false,"title":"render_form(conn, changeset, form, field, options)","anchor":"render_form/5"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Plausible.Billing.EnterprisePlan","deprecated":false,"group":"","title":"Plausible.Billing.EnterprisePlan","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(model, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Billing.EnterprisePlanAdmin","deprecated":false,"group":"","title":"Plausible.Billing.EnterprisePlanAdmin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"custom_index_query/3","deprecated":false,"title":"custom_index_query(conn, schema, query)","anchor":"custom_index_query/3"},{"id":"form_fields/1","deprecated":false,"title":"form_fields(schema)","anchor":"form_fields/1"},{"id":"index/1","deprecated":false,"title":"index(_)","anchor":"index/1"},{"id":"search_fields/1","deprecated":false,"title":"search_fields(schema)","anchor":"search_fields/1"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(enterprise_plan, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Billing.Feature","deprecated":false,"group":"","title":"Plausible.Billing.Feature","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"check_availability/1","deprecated":false,"title":"check_availability(t)","anchor":"c:check_availability/1"},{"id":"display_name/0","deprecated":false,"title":"display_name()","anchor":"c:display_name/0"},{"id":"enabled?/1","deprecated":false,"title":"enabled?(t)","anchor":"c:enabled?/1"},{"id":"free?/0","deprecated":false,"title":"free?()","anchor":"c:free?/0"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"c:name/0"},{"id":"opted_out?/1","deprecated":false,"title":"opted_out?(t)","anchor":"c:opted_out?/1"},{"id":"toggle/2","deprecated":false,"title":"toggle(t, t)","anchor":"c:toggle/2"},{"id":"toggle_field/0","deprecated":false,"title":"toggle_field()","anchor":"c:toggle_field/0"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"}],"key":"functions"}]},{"id":"Plausible.Billing.PaddleApi","deprecated":false,"group":"","title":"Plausible.Billing.PaddleApi","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"checkout_domain/0","deprecated":false,"title":"checkout_domain()","anchor":"checkout_domain/0"},{"id":"fetch_prices/1","deprecated":false,"title":"fetch_prices(product_ids)","anchor":"fetch_prices/1"},{"id":"get_invoices/1","deprecated":false,"title":"get_invoices(subscription)","anchor":"get_invoices/1"},{"id":"get_subscription/1","deprecated":false,"title":"get_subscription(paddle_subscription_id)","anchor":"get_subscription/1"},{"id":"update_subscription/2","deprecated":false,"title":"update_subscription(paddle_subscription_id, params)","anchor":"update_subscription/2"},{"id":"update_subscription_preview/2","deprecated":false,"title":"update_subscription_preview(paddle_subscription_id, new_plan_id)","anchor":"update_subscription_preview/2"},{"id":"vendors_domain/0","deprecated":false,"title":"vendors_domain()","anchor":"vendors_domain/0"}],"key":"functions"}]},{"id":"Plausible.Billing.Plans","deprecated":false,"group":"","title":"Plausible.Billing.Plans","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all/0","deprecated":false,"title":"all()","anchor":"all/0"},{"id":"available_plans_for/2","deprecated":false,"title":"available_plans_for(user, opts \\\\ [])","anchor":"available_plans_for/2"},{"id":"business_plans_for/1","deprecated":false,"title":"business_plans_for(user)","anchor":"business_plans_for/1"},{"id":"business_tier?/1","deprecated":false,"title":"business_tier?(subscription)","anchor":"business_tier?/1"},{"id":"business_tier_launch/0","deprecated":false,"title":"business_tier_launch()","anchor":"business_tier_launch/0"},{"id":"find/1","deprecated":false,"title":"find(product_id)","anchor":"find/1"},{"id":"get_price_for/1","deprecated":false,"title":"get_price_for(enterprise_plan)","anchor":"get_price_for/1"},{"id":"get_regular_plan/2","deprecated":false,"title":"get_regular_plan(subscription, opts \\\\ [])","anchor":"get_regular_plan/2"},{"id":"get_subscription_plan/1","deprecated":false,"title":"get_subscription_plan(subscription)","anchor":"get_subscription_plan/1"},{"id":"growth_plans_for/1","deprecated":false,"title":"growth_plans_for(user)","anchor":"growth_plans_for/1"},{"id":"latest_enterprise_plan_with_price/1","deprecated":false,"title":"latest_enterprise_plan_with_price(user)","anchor":"latest_enterprise_plan_with_price/1"},{"id":"subscription_interval/1","deprecated":false,"title":"subscription_interval(subscription)","anchor":"subscription_interval/1"},{"id":"suggest/2","deprecated":false,"title":"suggest(user, usage_during_cycle)","anchor":"suggest/2"},{"id":"suggest_tier/1","deprecated":false,"title":"suggest_tier(user)","anchor":"suggest_tier/1"},{"id":"with_prices/1","deprecated":false,"title":"with_prices(plans)","anchor":"with_prices/1"},{"id":"yearly_product_ids/0","deprecated":false,"title":"yearly_product_ids()","anchor":"yearly_product_ids/0"}],"key":"functions"}]},{"id":"Plausible.Billing.Quota","deprecated":false,"group":"","title":"Plausible.Billing.Quota","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"limit/0","deprecated":false,"title":"limit()","anchor":"t:limit/0"},{"id":"monthly_pageview_usage/0","deprecated":false,"title":"monthly_pageview_usage()","anchor":"t:monthly_pageview_usage/0"},{"id":"over_limits_error/0","deprecated":false,"title":"over_limits_error()","anchor":"t:over_limits_error/0"},{"id":"period/0","deprecated":false,"title":"period()","anchor":"t:period/0"},{"id":"usage_cycle/0","deprecated":false,"title":"usage_cycle()","anchor":"t:usage_cycle/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"allowed_features_for/1","deprecated":false,"title":"allowed_features_for(user)","anchor":"allowed_features_for/1"},{"id":"below_limit?/2","deprecated":false,"title":"below_limit?(usage, limit)","anchor":"below_limit?/2"},{"id":"ensure_can_add_new_site/1","deprecated":false,"title":"ensure_can_add_new_site(user)","anchor":"ensure_can_add_new_site/1"},{"id":"ensure_within_plan_limits/3","deprecated":false,"title":"ensure_within_plan_limits(user_or_usage, plan, opts \\\\ [])","anchor":"ensure_within_plan_limits/3"},{"id":"features_usage/1","deprecated":false,"title":"features_usage(user)","anchor":"features_usage/1"},{"id":"monthly_pageview_limit/1","deprecated":false,"title":"monthly_pageview_limit(user)","anchor":"monthly_pageview_limit/1"},{"id":"monthly_pageview_usage/2","deprecated":false,"title":"monthly_pageview_usage(user, site_ids \\\\ nil)","anchor":"monthly_pageview_usage/2"},{"id":"site_limit/1","deprecated":false,"title":"site_limit(user)","anchor":"site_limit/1"},{"id":"site_usage/1","deprecated":false,"title":"site_usage(user)","anchor":"site_usage/1"},{"id":"team_member_limit/1","deprecated":false,"title":"team_member_limit(user)","anchor":"team_member_limit/1"},{"id":"team_member_usage/1","deprecated":false,"title":"team_member_usage(user)","anchor":"team_member_usage/1"},{"id":"usage/2","deprecated":false,"title":"usage(user, opts \\\\ [])","anchor":"usage/2"},{"id":"usage_cycle/4","deprecated":false,"title":"usage_cycle(user, cycle, owned_site_ids \\\\ nil, today \\\\ Timex.today())","anchor":"usage_cycle/4"},{"id":"within_limit?/2","deprecated":false,"title":"within_limit?(usage, limit)","anchor":"within_limit?/2"}],"key":"functions"}]},{"id":"Plausible.Billing.SiteLocker","deprecated":false,"group":"","title":"Plausible.Billing.SiteLocker","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"lock_reason/0","deprecated":false,"title":"lock_reason()","anchor":"t:lock_reason/0"},{"id":"update_opt/0","deprecated":false,"title":"update_opt()","anchor":"t:update_opt/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"send_grace_period_end_email/1","deprecated":false,"title":"send_grace_period_end_email(user)","anchor":"send_grace_period_end_email/1"},{"id":"set_lock_status_for/2","deprecated":false,"title":"set_lock_status_for(user, status)","anchor":"set_lock_status_for/2"},{"id":"update_sites_for/2","deprecated":false,"title":"update_sites_for(user, opts \\\\ [])","anchor":"update_sites_for/2"}],"key":"functions"}]},{"id":"Plausible.Billing.Subscription.Status","deprecated":false,"group":"","title":"Plausible.Billing.Subscription.Status","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"status/0","deprecated":false,"title":"status()","anchor":"t:status/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"active/0","deprecated":false,"title":"active()","anchor":"active/0"},{"id":"active?/1","deprecated":false,"title":"active?(subscription)","anchor":"active?/1"},{"id":"deleted/0","deprecated":false,"title":"deleted()","anchor":"deleted/0"},{"id":"deleted?/1","deprecated":false,"title":"deleted?(subscription)","anchor":"deleted?/1"},{"id":"in?/2","deprecated":false,"title":"in?(subscription, expected)","anchor":"in?/2"},{"id":"past_due/0","deprecated":false,"title":"past_due()","anchor":"past_due/0"},{"id":"past_due?/1","deprecated":false,"title":"past_due?(subscription)","anchor":"past_due?/1"},{"id":"paused/0","deprecated":false,"title":"paused()","anchor":"paused/0"},{"id":"paused?/1","deprecated":false,"title":"paused?(subscription)","anchor":"paused?/1"},{"id":"valid_statuses/0","deprecated":false,"title":"valid_statuses()","anchor":"valid_statuses/0"}],"key":"functions"}]},{"id":"Plausible.ChangesetHelpers","deprecated":false,"group":"","title":"Plausible.ChangesetHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"traverse_errors/1","deprecated":false,"title":"traverse_errors(changeset)","anchor":"traverse_errors/1"}],"key":"functions"}]},{"id":"Plausible.Cldr","deprecated":false,"group":"","title":"Plausible.Cldr","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"available_locale_name?/1","deprecated":false,"title":"available_locale_name?(locale_name)","anchor":"available_locale_name?/1"},{"id":"default_locale/0","deprecated":false,"title":"default_locale()","anchor":"default_locale/0"},{"id":"default_territory/0","deprecated":false,"title":"default_territory()","anchor":"default_territory/0"},{"id":"ellipsis/2","deprecated":false,"title":"ellipsis(string, options \\\\ [])","anchor":"ellipsis/2"},{"id":"get_locale/0","deprecated":false,"title":"get_locale()","anchor":"get_locale/0"},{"id":"known_calendars/0","deprecated":false,"title":"known_calendars()","anchor":"known_calendars/0"},{"id":"known_currencies/0","deprecated":false,"title":"known_currencies()","anchor":"known_currencies/0"},{"id":"known_gettext_locale_name/1","deprecated":false,"title":"known_gettext_locale_name(locale_name)","anchor":"known_gettext_locale_name/1"},{"id":"known_gettext_locale_name?/1","deprecated":false,"title":"known_gettext_locale_name?(locale_name)","anchor":"known_gettext_locale_name?/1"},{"id":"known_gettext_locale_names/0","deprecated":false,"title":"known_gettext_locale_names()","anchor":"known_gettext_locale_names/0"},{"id":"known_locale_name/1","deprecated":false,"title":"known_locale_name(locale_name)","anchor":"known_locale_name/1"},{"id":"known_locale_name?/1","deprecated":false,"title":"known_locale_name?(locale_name)","anchor":"known_locale_name?/1"},{"id":"known_locale_names/0","deprecated":false,"title":"known_locale_names()","anchor":"known_locale_names/0"},{"id":"known_number_system_types/0","deprecated":false,"title":"known_number_system_types()","anchor":"known_number_system_types/0"},{"id":"known_number_systems/0","deprecated":false,"title":"known_number_systems()","anchor":"known_number_systems/0"},{"id":"known_rbnf_locale_name/1","deprecated":false,"title":"known_rbnf_locale_name(locale_name)","anchor":"known_rbnf_locale_name/1"},{"id":"known_rbnf_locale_name?/1","deprecated":false,"title":"known_rbnf_locale_name?(locale_name)","anchor":"known_rbnf_locale_name?/1"},{"id":"known_rbnf_locale_names/0","deprecated":false,"title":"known_rbnf_locale_names()","anchor":"known_rbnf_locale_names/0"},{"id":"known_territories/0","deprecated":false,"title":"known_territories()","anchor":"known_territories/0"},{"id":"normalize_lenient_parse/3","deprecated":false,"title":"normalize_lenient_parse(string, scope, locale \\\\ get_locale())","anchor":"normalize_lenient_parse/3"},{"id":"put_locale/1","deprecated":false,"title":"put_locale(locale_name)","anchor":"put_locale/1"},{"id":"quote/2","deprecated":false,"title":"quote(string, options \\\\ [])","anchor":"quote/2"},{"id":"unknown_locale_names/0","deprecated":false,"title":"unknown_locale_names()","anchor":"unknown_locale_names/0"},{"id":"validate_calendar/1","deprecated":false,"title":"validate_calendar(calendar)","anchor":"validate_calendar/1"},{"id":"validate_currency/1","deprecated":false,"title":"validate_currency(currency)","anchor":"validate_currency/1"},{"id":"validate_locale/1","deprecated":false,"title":"validate_locale(locale)","anchor":"validate_locale/1"},{"id":"validate_number_system/1","deprecated":false,"title":"validate_number_system(number_system)","anchor":"validate_number_system/1"},{"id":"validate_number_system_type/1","deprecated":false,"title":"validate_number_system_type(number_system_type)","anchor":"validate_number_system_type/1"},{"id":"validate_territory/1","deprecated":false,"title":"validate_territory(territory)","anchor":"validate_territory/1"},{"id":"with_locale/2","deprecated":false,"title":"with_locale(locale, fun)","anchor":"with_locale/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.AcceptLanguage","deprecated":false,"group":"","title":"Plausible.Cldr.AcceptLanguage","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"best_match/1","deprecated":false,"title":"best_match(accept_language)","anchor":"best_match/1"},{"id":"parse/1","deprecated":false,"title":"parse(tokens_or_string)","anchor":"parse/1"},{"id":"parse!/1","deprecated":false,"title":"parse!(accept_language)","anchor":"parse!/1"}],"key":"functions"}]},{"id":"Plausible.Cldr.Currency","deprecated":false,"group":"","title":"Plausible.Cldr.Currency","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"currencies_for_locale/3","deprecated":false,"title":"currencies_for_locale(locale, only \\\\ :all, except \\\\ nil)","anchor":"currencies_for_locale/3"},{"id":"currencies_for_locale!/3","deprecated":false,"title":"currencies_for_locale!(locale, only \\\\ :all, except \\\\ nil)","anchor":"currencies_for_locale!/3"},{"id":"currency_for_code/2","deprecated":false,"title":"currency_for_code(currency_or_currency_code, options \\\\ [locale: Plausible.Cldr.default_locale()])","anchor":"currency_for_code/2"},{"id":"currency_for_code!/2","deprecated":false,"title":"currency_for_code!(currency_or_currency_code, options \\\\ [locale: Plausible.Cldr.default_locale()])","anchor":"currency_for_code!/2"},{"id":"currency_from_locale/1","deprecated":false,"title":"currency_from_locale(locale)","anchor":"currency_from_locale/1"},{"id":"currency_history_for_locale/1","deprecated":false,"title":"currency_history_for_locale(language_tag)","anchor":"currency_history_for_locale/1"},{"id":"currency_strings/3","deprecated":false,"title":"currency_strings(locale, only \\\\ :all, except \\\\ nil)","anchor":"currency_strings/3"},{"id":"currency_strings!/3","deprecated":false,"title":"currency_strings!(locale_name, only \\\\ :all, except \\\\ nil)","anchor":"currency_strings!/3"},{"id":"current_currency_from_locale/1","deprecated":false,"title":"current_currency_from_locale(locale)","anchor":"current_currency_from_locale/1"},{"id":"current_territory_currencies/0","deprecated":false,"title":"current_territory_currencies()","anchor":"current_territory_currencies/0"},{"id":"known_currencies/0","deprecated":false,"title":"known_currencies()","anchor":"known_currencies/0"},{"id":"known_currency?/1","deprecated":false,"title":"known_currency?(code)","anchor":"known_currency?/1"},{"id":"known_currency_code/1","deprecated":false,"title":"known_currency_code(currency_code)","anchor":"known_currency_code/1"},{"id":"known_currency_code?/1","deprecated":false,"title":"known_currency_code?(currency_code)","anchor":"known_currency_code?/1"},{"id":"known_currency_codes/0","deprecated":false,"title":"known_currency_codes()","anchor":"known_currency_codes/0"},{"id":"new/2","deprecated":false,"title":"new(currency, options \\\\ [])","anchor":"new/2"},{"id":"pluralize/3","deprecated":false,"title":"pluralize(number, currency, options \\\\ [])","anchor":"pluralize/3"},{"id":"strings_for_currency/2","deprecated":false,"title":"strings_for_currency(currency, locale)","anchor":"strings_for_currency/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Locale","deprecated":false,"group":"","title":"Plausible.Cldr.Locale","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fallback_locale_names/1","deprecated":false,"title":"fallback_locale_names(locale)","anchor":"fallback_locale_names/1"},{"id":"fallback_locales/1","deprecated":false,"title":"fallback_locales(locale)","anchor":"fallback_locales/1"},{"id":"locale_for_territory/1","deprecated":false,"title":"locale_for_territory(territory)","anchor":"locale_for_territory/1"},{"id":"locale_from_host/2","deprecated":false,"title":"locale_from_host(host, options \\\\ [])","anchor":"locale_from_host/2"},{"id":"new/1","deprecated":false,"title":"new(locale_name)","anchor":"new/1"},{"id":"new!/1","deprecated":false,"title":"new!(locale_name)","anchor":"new!/1"},{"id":"script_direction_from_locale/1","deprecated":false,"title":"script_direction_from_locale(locale)","anchor":"script_direction_from_locale/1"},{"id":"territory_from_host/1","deprecated":false,"title":"territory_from_host(host)","anchor":"territory_from_host/1"},{"id":"territory_from_locale/1","deprecated":false,"title":"territory_from_locale(locale)","anchor":"territory_from_locale/1"},{"id":"timezone_from_locale/1","deprecated":false,"title":"timezone_from_locale(locale)","anchor":"timezone_from_locale/1"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number","deprecated":false,"group":"","title":"Plausible.Cldr.Number","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"parse/2","deprecated":false,"title":"parse(string, options \\\\ [])","anchor":"parse/2"},{"id":"resolve_currencies/2","deprecated":false,"title":"resolve_currencies(list, options \\\\ [])","anchor":"resolve_currencies/2"},{"id":"resolve_currency/2","deprecated":false,"title":"resolve_currency(string, options \\\\ [])","anchor":"resolve_currency/2"},{"id":"resolve_per/2","deprecated":false,"title":"resolve_per(string, options \\\\ [])","anchor":"resolve_per/2"},{"id":"resolve_pers/2","deprecated":false,"title":"resolve_pers(list, options \\\\ [])","anchor":"resolve_pers/2"},{"id":"scan/2","deprecated":false,"title":"scan(string, options \\\\ [])","anchor":"scan/2"},{"id":"to_approx_string/2","deprecated":false,"title":"to_approx_string(number, options \\\\ [])","anchor":"to_approx_string/2"},{"id":"to_at_least_string/2","deprecated":false,"title":"to_at_least_string(number, options \\\\ [])","anchor":"to_at_least_string/2"},{"id":"to_at_most_string/2","deprecated":false,"title":"to_at_most_string(number, options \\\\ [])","anchor":"to_at_most_string/2"},{"id":"to_range_string/2","deprecated":false,"title":"to_range_string(range, options \\\\ [])","anchor":"to_range_string/2"},{"id":"to_string/2","deprecated":false,"title":"to_string(number, options \\\\ default_options())","anchor":"to_string/2"},{"id":"to_string!/2","deprecated":false,"title":"to_string!(number, options \\\\ default_options())","anchor":"to_string!/2"},{"id":"validate_number_system/2","deprecated":false,"title":"validate_number_system(locale, number_system)","anchor":"validate_number_system/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Cardinal","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Cardinal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"available_locale_names/0","deprecated":false,"title":"available_locale_names()","anchor":"available_locale_names/0"},{"id":"known_locale_names/0","deprecated":false,"title":"known_locale_names()","anchor":"known_locale_names/0"},{"id":"plural_rule/3","deprecated":false,"title":"plural_rule(number, locale, rounding \\\\ Math.default_rounding())","anchor":"plural_rule/3"},{"id":"plural_rules/0","deprecated":false,"title":"plural_rules()","anchor":"plural_rules/0"},{"id":"plural_rules_for/1","deprecated":false,"title":"plural_rules_for(locale_name)","anchor":"plural_rules_for/1"},{"id":"pluralize/3","deprecated":false,"title":"pluralize(number, locale_name, substitutions)","anchor":"pluralize/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Format","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Format","sections":[{"id":"Number Pattern Examples","anchor":"module-number-pattern-examples"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_formats_for/1","deprecated":false,"title":"all_formats_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"all_formats_for/1"},{"id":"all_formats_for!/1","deprecated":false,"title":"all_formats_for!(locale \\\\ Plausible.Cldr.get_locale())","anchor":"all_formats_for!/1"},{"id":"currency_spacing/2","deprecated":false,"title":"currency_spacing(locale, number_system)","anchor":"currency_spacing/2"},{"id":"decimal_format_list/0","deprecated":false,"title":"decimal_format_list()","anchor":"decimal_format_list/0"},{"id":"decimal_format_list_for/1","deprecated":false,"title":"decimal_format_list_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"decimal_format_list_for/1"},{"id":"default_grouping_for/1","deprecated":false,"title":"default_grouping_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"default_grouping_for/1"},{"id":"default_grouping_for!/1","deprecated":false,"title":"default_grouping_for!(locale)","anchor":"default_grouping_for!/1"},{"id":"formats_for/2","deprecated":false,"title":"formats_for(locale \\\\ Plausible.Cldr.default_locale(), number_system \\\\ Cldr.Number.System.default_number_system_type())","anchor":"formats_for/2"},{"id":"formats_for!/2","deprecated":false,"title":"formats_for!(locale \\\\ Plausible.Cldr.default_locale(), number_system \\\\ Cldr.Number.System.default_number_system_type())","anchor":"formats_for!/2"},{"id":"minimum_grouping_digits_for/1","deprecated":false,"title":"minimum_grouping_digits_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"minimum_grouping_digits_for/1"},{"id":"minimum_grouping_digits_for!/1","deprecated":false,"title":"minimum_grouping_digits_for!(locale)","anchor":"minimum_grouping_digits_for!/1"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Formatter.Decimal","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Formatter.Decimal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"metadata!/1","deprecated":false,"title":"metadata!(format)","anchor":"metadata!/1"},{"id":"to_string/3","deprecated":false,"title":"to_string(number, format, options \\\\ [])","anchor":"to_string/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Ordinal","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Ordinal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"available_locale_names/0","deprecated":false,"title":"available_locale_names()","anchor":"available_locale_names/0"},{"id":"known_locale_names/0","deprecated":false,"title":"known_locale_names()","anchor":"known_locale_names/0"},{"id":"plural_rule/3","deprecated":false,"title":"plural_rule(number, locale, rounding \\\\ Math.default_rounding())","anchor":"plural_rule/3"},{"id":"plural_rules/0","deprecated":false,"title":"plural_rules()","anchor":"plural_rules/0"},{"id":"plural_rules_for/1","deprecated":false,"title":"plural_rules_for(locale_name)","anchor":"plural_rules_for/1"},{"id":"pluralize/3","deprecated":false,"title":"pluralize(number, locale_name, substitutions)","anchor":"pluralize/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.PluralRule.Range","deprecated":false,"group":"","title":"Plausible.Cldr.Number.PluralRule.Range","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"plural_rule/3","deprecated":false,"title":"plural_rule(first, last, locale)","anchor":"plural_rule/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Symbol","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Symbol","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_decimal_symbols/0","deprecated":false,"title":"all_decimal_symbols()","anchor":"all_decimal_symbols/0"},{"id":"all_decimal_symbols_class/0","deprecated":false,"title":"all_decimal_symbols_class()","anchor":"all_decimal_symbols_class/0"},{"id":"all_grouping_symbols/0","deprecated":false,"title":"all_grouping_symbols()","anchor":"all_grouping_symbols/0"},{"id":"all_grouping_symbols_class/0","deprecated":false,"title":"all_grouping_symbols_class()","anchor":"all_grouping_symbols_class/0"},{"id":"number_symbols_for/1","deprecated":false,"title":"number_symbols_for(locale \\\\ Plausible.Cldr.get_locale())","anchor":"number_symbols_for/1"},{"id":"number_symbols_for/2","deprecated":false,"title":"number_symbols_for(locale, number_system)","anchor":"number_symbols_for/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.System","deprecated":false,"group":"","title":"Plausible.Cldr.Number.System","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"number_system_for/2","deprecated":false,"title":"number_system_for(locale, system_name)","anchor":"number_system_for/2"},{"id":"number_system_from_locale/1","deprecated":false,"title":"number_system_from_locale(locale)","anchor":"number_system_from_locale/1"},{"id":"number_system_names_for/1","deprecated":false,"title":"number_system_names_for(locale)","anchor":"number_system_names_for/1"},{"id":"number_system_names_for!/1","deprecated":false,"title":"number_system_names_for!(locale)","anchor":"number_system_names_for!/1"},{"id":"number_system_types_for/1","deprecated":false,"title":"number_system_types_for(locale)","anchor":"number_system_types_for/1"},{"id":"number_systems_for/1","deprecated":false,"title":"number_systems_for(locale)","anchor":"number_systems_for/1"},{"id":"number_systems_for!/1","deprecated":false,"title":"number_systems_for!(locale)","anchor":"number_systems_for!/1"},{"id":"number_systems_like/2","deprecated":false,"title":"number_systems_like(locale, number_system)","anchor":"number_systems_like/2"},{"id":"system_name_from/2","deprecated":false,"title":"system_name_from(system_name, locale)","anchor":"system_name_from/2"},{"id":"to_system/2","deprecated":false,"title":"to_system(number, system)","anchor":"to_system/2"},{"id":"to_system!/2","deprecated":false,"title":"to_system!(number, system_name)","anchor":"to_system!/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Number.Transliterate","deprecated":false,"group":"","title":"Plausible.Cldr.Number.Transliterate","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"transliterate/3","deprecated":false,"title":"transliterate(sequence, locale \\\\ Plausible.Cldr.get_locale(), number_system \\\\ System.default_number_system_type())","anchor":"transliterate/3"},{"id":"transliterate!/3","deprecated":false,"title":"transliterate!(sequence, locale, number_system)","anchor":"transliterate!/3"},{"id":"transliterate_digits/3","deprecated":false,"title":"transliterate_digits(digits, from_system, to_system)","anchor":"transliterate_digits/3"}],"key":"functions"}]},{"id":"Plausible.Cldr.Rbnf.NumberSystem","deprecated":false,"group":"","title":"Plausible.Cldr.Rbnf.NumberSystem","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_rule_sets/0","deprecated":false,"title":"all_rule_sets()","anchor":"all_rule_sets/0"},{"id":"armenian_lower/1","deprecated":false,"title":"armenian_lower(number)","anchor":"armenian_lower/1"},{"id":"armenian_lower/2","deprecated":false,"title":"armenian_lower(number, locale)","anchor":"armenian_lower/2"},{"id":"armenian_upper/1","deprecated":false,"title":"armenian_upper(number)","anchor":"armenian_upper/1"},{"id":"armenian_upper/2","deprecated":false,"title":"armenian_upper(number, locale)","anchor":"armenian_upper/2"},{"id":"cyrillic_lower/1","deprecated":false,"title":"cyrillic_lower(number)","anchor":"cyrillic_lower/1"},{"id":"cyrillic_lower/2","deprecated":false,"title":"cyrillic_lower(number, locale)","anchor":"cyrillic_lower/2"},{"id":"cyrillic_lower_1_10/2","deprecated":false,"title":"cyrillic_lower_1_10(number, language_tag)","anchor":"cyrillic_lower_1_10/2"},{"id":"cyrillic_lower_final/2","deprecated":false,"title":"cyrillic_lower_final(number, language_tag)","anchor":"cyrillic_lower_final/2"},{"id":"cyrillic_lower_post/2","deprecated":false,"title":"cyrillic_lower_post(number, language_tag)","anchor":"cyrillic_lower_post/2"},{"id":"cyrillic_lower_thousands/2","deprecated":false,"title":"cyrillic_lower_thousands(number, language_tag)","anchor":"cyrillic_lower_thousands/2"},{"id":"ethiopic/1","deprecated":false,"title":"ethiopic(number)","anchor":"ethiopic/1"},{"id":"ethiopic/2","deprecated":false,"title":"ethiopic(number, locale)","anchor":"ethiopic/2"},{"id":"ethiopic_p1/2","deprecated":false,"title":"ethiopic_p1(number, language_tag)","anchor":"ethiopic_p1/2"},{"id":"ethiopic_p2/2","deprecated":false,"title":"ethiopic_p2(number, language_tag)","anchor":"ethiopic_p2/2"},{"id":"ethiopic_p3/2","deprecated":false,"title":"ethiopic_p3(number, language_tag)","anchor":"ethiopic_p3/2"},{"id":"ethiopic_p/2","deprecated":false,"title":"ethiopic_p(number, language_tag)","anchor":"ethiopic_p/2"},{"id":"georgian/1","deprecated":false,"title":"georgian(number)","anchor":"georgian/1"},{"id":"georgian/2","deprecated":false,"title":"georgian(number, locale)","anchor":"georgian/2"},{"id":"greek_lower/1","deprecated":false,"title":"greek_lower(number)","anchor":"greek_lower/1"},{"id":"greek_lower/2","deprecated":false,"title":"greek_lower(number, locale)","anchor":"greek_lower/2"},{"id":"greek_numeral_majuscules/2","deprecated":false,"title":"greek_numeral_majuscules(number, language_tag)","anchor":"greek_numeral_majuscules/2"},{"id":"greek_numeral_minuscules/2","deprecated":false,"title":"greek_numeral_minuscules(number, language_tag)","anchor":"greek_numeral_minuscules/2"},{"id":"greek_upper/1","deprecated":false,"title":"greek_upper(number)","anchor":"greek_upper/1"},{"id":"greek_upper/2","deprecated":false,"title":"greek_upper(number, locale)","anchor":"greek_upper/2"},{"id":"hebrew/1","deprecated":false,"title":"hebrew(number)","anchor":"hebrew/1"},{"id":"hebrew/2","deprecated":false,"title":"hebrew(number, locale)","anchor":"hebrew/2"},{"id":"hebrew_0_99/2","deprecated":false,"title":"hebrew_0_99(number, language_tag)","anchor":"hebrew_0_99/2"},{"id":"hebrew_item/1","deprecated":false,"title":"hebrew_item(number)","anchor":"hebrew_item/1"},{"id":"hebrew_item/2","deprecated":false,"title":"hebrew_item(number, locale)","anchor":"hebrew_item/2"},{"id":"hebrew_item_hundreds/2","deprecated":false,"title":"hebrew_item_hundreds(number, language_tag)","anchor":"hebrew_item_hundreds/2"},{"id":"hebrew_thousands/2","deprecated":false,"title":"hebrew_thousands(number, language_tag)","anchor":"hebrew_thousands/2"},{"id":"roman_lower/1","deprecated":false,"title":"roman_lower(number)","anchor":"roman_lower/1"},{"id":"roman_lower/2","deprecated":false,"title":"roman_lower(number, locale)","anchor":"roman_lower/2"},{"id":"roman_upper/1","deprecated":false,"title":"roman_upper(number)","anchor":"roman_upper/1"},{"id":"roman_upper/2","deprecated":false,"title":"roman_upper(number, locale)","anchor":"roman_upper/2"},{"id":"rule_sets/0","deprecated":false,"title":"rule_sets()","anchor":"rule_sets/0"},{"id":"rule_sets/1","deprecated":false,"title":"rule_sets(rbnf_locale_name)","anchor":"rule_sets/1"},{"id":"tamil/1","deprecated":false,"title":"tamil(number)","anchor":"tamil/1"},{"id":"tamil/2","deprecated":false,"title":"tamil(number, locale)","anchor":"tamil/2"},{"id":"tamil_thousands/2","deprecated":false,"title":"tamil_thousands(number, language_tag)","anchor":"tamil_thousands/2"},{"id":"zz_default/1","deprecated":false,"title":"zz_default(number)","anchor":"zz_default/1"},{"id":"zz_default/2","deprecated":false,"title":"zz_default(number, locale)","anchor":"zz_default/2"}],"key":"functions"}]},{"id":"Plausible.Cldr.Rbnf.Ordinal","deprecated":false,"group":"","title":"Plausible.Cldr.Rbnf.Ordinal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_rule_sets/0","deprecated":false,"title":"all_rule_sets()","anchor":"all_rule_sets/0"},{"id":"digits_ordinal/2","deprecated":false,"title":"digits_ordinal(number, locale)","anchor":"digits_ordinal/2"},{"id":"rule_sets/0","deprecated":false,"title":"rule_sets()","anchor":"rule_sets/0"},{"id":"rule_sets/1","deprecated":false,"title":"rule_sets(rbnf_locale_name)","anchor":"rule_sets/1"}],"key":"functions"}]},{"id":"Plausible.Cldr.Rbnf.Spellout","deprecated":false,"group":"","title":"Plausible.Cldr.Rbnf.Spellout","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_rule_sets/0","deprecated":false,"title":"all_rule_sets()","anchor":"all_rule_sets/0"},{"id":"and/2","deprecated":false,"title":"number and language_tag","anchor":"and/2"},{"id":"and_o/2","deprecated":false,"title":"and_o(number, language_tag)","anchor":"and_o/2"},{"id":"commas/2","deprecated":false,"title":"commas(number, language_tag)","anchor":"commas/2"},{"id":"commas_o/2","deprecated":false,"title":"commas_o(number, language_tag)","anchor":"commas_o/2"},{"id":"r2d_year/2","deprecated":false,"title":"r2d_year(number, language_tag)","anchor":"r2d_year/2"},{"id":"rule_sets/0","deprecated":false,"title":"rule_sets()","anchor":"rule_sets/0"},{"id":"rule_sets/1","deprecated":false,"title":"rule_sets(rbnf_locale_name)","anchor":"rule_sets/1"},{"id":"spellout_cardinal/2","deprecated":false,"title":"spellout_cardinal(number, locale)","anchor":"spellout_cardinal/2"},{"id":"spellout_cardinal_verbose/2","deprecated":false,"title":"spellout_cardinal_verbose(number, locale)","anchor":"spellout_cardinal_verbose/2"},{"id":"spellout_numbering/2","deprecated":false,"title":"spellout_numbering(number, locale)","anchor":"spellout_numbering/2"},{"id":"spellout_numbering_verbose/2","deprecated":false,"title":"spellout_numbering_verbose(number, locale)","anchor":"spellout_numbering_verbose/2"},{"id":"spellout_numbering_year/2","deprecated":false,"title":"spellout_numbering_year(number, locale)","anchor":"spellout_numbering_year/2"},{"id":"spellout_ordinal/2","deprecated":false,"title":"spellout_ordinal(number, locale)","anchor":"spellout_ordinal/2"},{"id":"spellout_ordinal_verbose/2","deprecated":false,"title":"spellout_ordinal_verbose(number, locale)","anchor":"spellout_ordinal_verbose/2"},{"id":"th/2","deprecated":false,"title":"th(number, language_tag)","anchor":"th/2"},{"id":"tieth/2","deprecated":false,"title":"tieth(number, language_tag)","anchor":"tieth/2"}],"key":"functions"}]},{"id":"Plausible.ClickhouseEventV2","deprecated":false,"group":"","title":"Plausible.ClickhouseEventV2","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"new/1","deprecated":false,"title":"new(attrs)","anchor":"new/1"}],"key":"functions"}]},{"id":"Plausible.ClickhouseRepo","deprecated":false,"group":"","title":"Plausible.ClickhouseRepo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"parallel_tasks/1","deprecated":false,"title":"parallel_tasks(queries)","anchor":"parallel_tasks/1"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"}],"key":"functions"}]},{"id":"Plausible.ClickhouseSessionV2","deprecated":false,"group":"","title":"Plausible.ClickhouseSessionV2","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"random_uint64/0","deprecated":false,"title":"random_uint64()","anchor":"random_uint64/0"}],"key":"functions"}]},{"id":"Plausible.ClickhouseSessionV2.BoolUInt8","deprecated":false,"group":"","title":"Plausible.ClickhouseSessionV2.BoolUInt8","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"}],"key":"functions"}]},{"id":"Plausible.ConfigHelpers","deprecated":false,"group":"","title":"Plausible.ConfigHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_int_from_path_or_env/3","deprecated":false,"title":"get_int_from_path_or_env(config_dir, var_name, default \\\\ nil)","anchor":"get_int_from_path_or_env/3"},{"id":"get_var_from_path_or_env/3","deprecated":false,"title":"get_var_from_path_or_env(config_dir, var_name, default \\\\ nil)","anchor":"get_var_from_path_or_env/3"}],"key":"functions"}]},{"id":"Plausible.DataCase","deprecated":false,"group":"","title":"Plausible.DataCase","sections":[]},{"id":"Plausible.DataMigration","deprecated":false,"group":"","title":"Plausible.DataMigration","sections":[]},{"id":"Plausible.DataMigration.NumericIDs","deprecated":false,"group":"","title":"Plausible.DataMigration.NumericIDs","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/3","deprecated":false,"title":"confirm(message, func, default_choice \\\\ :yes)","anchor":"confirm/3"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/2","deprecated":false,"title":"run_sql(name, assigns \\\\ [])","anchor":"run_sql/2"},{"id":"run_sql_confirm/2","deprecated":false,"title":"run_sql_confirm(name, options \\\\ [])","anchor":"run_sql_confirm/2"}],"key":"functions"}]},{"id":"Plausible.DataMigration.Repo","deprecated":false,"group":"","title":"Plausible.DataMigration.Repo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start/2","deprecated":false,"title":"start(url, max_threads)","anchor":"start/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.DebugReplayInfo","deprecated":false,"group":"","title":"Plausible.DebugReplayInfo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"deserialize/1","deprecated":false,"title":"deserialize(replay_info)","anchor":"deserialize/1"},{"id":"include_sentry_replay_info/0","deprecated":false,"title":"include_sentry_replay_info()","anchor":"include_sentry_replay_info/0"}],"key":"functions"}]},{"id":"Plausible.Ecto.EventName","deprecated":false,"group":"","title":"Plausible.Ecto.EventName","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"cast/1","deprecated":false,"title":"cast(val)","anchor":"cast/1"},{"id":"dump/1","deprecated":false,"title":"dump(val)","anchor":"dump/1"},{"id":"embed_as/1","deprecated":false,"title":"embed_as(_)","anchor":"embed_as/1"},{"id":"equal?/2","deprecated":false,"title":"equal?(term1, term2)","anchor":"equal?/2"},{"id":"load/1","deprecated":false,"title":"load(val)","anchor":"load/1"},{"id":"type/0","deprecated":false,"title":"type()","anchor":"type/0"}],"key":"functions"}]},{"id":"Plausible.Factory","deprecated":false,"group":"","title":"Plausible.Factory","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api_key_factory/0","deprecated":false,"title":"api_key_factory()","anchor":"api_key_factory/0"},{"id":"build/2","deprecated":false,"title":"build(factory_name, attrs \\\\ %{})","anchor":"build/2"},{"id":"build_list/3","deprecated":false,"title":"build_list(number_of_records, factory_name, attrs \\\\ %{})","anchor":"build_list/3"},{"id":"build_pair/2","deprecated":false,"title":"build_pair(factory_name, attrs \\\\ %{})","anchor":"build_pair/2"},{"id":"business_subscription_factory/0","deprecated":false,"title":"business_subscription_factory()","anchor":"business_subscription_factory/0"},{"id":"ch_session_factory/0","deprecated":false,"title":"ch_session_factory()","anchor":"ch_session_factory/0"},{"id":"create/1","deprecated":false,"title":"create(_)","anchor":"create/1"},{"id":"create/2","deprecated":false,"title":"create(_, _)","anchor":"create/2"},{"id":"create_list/3","deprecated":false,"title":"create_list(_, _, _)","anchor":"create_list/3"},{"id":"create_pair/2","deprecated":false,"title":"create_pair(_, _)","anchor":"create_pair/2"},{"id":"enterprise_plan_factory/0","deprecated":false,"title":"enterprise_plan_factory()","anchor":"enterprise_plan_factory/0"},{"id":"event_factory/0","deprecated":false,"title":"event_factory()","anchor":"event_factory/0"},{"id":"factory/1","deprecated":false,"title":"factory(factory_name)","anchor":"factory/1"},{"id":"goal_factory/0","deprecated":false,"title":"goal_factory()","anchor":"goal_factory/0"},{"id":"google_auth_factory/0","deprecated":false,"title":"google_auth_factory()","anchor":"google_auth_factory/0"},{"id":"growth_subscription_factory/0","deprecated":false,"title":"growth_subscription_factory()","anchor":"growth_subscription_factory/0"},{"id":"imported_browsers_factory/0","deprecated":false,"title":"imported_browsers_factory()","anchor":"imported_browsers_factory/0"},{"id":"imported_devices_factory/0","deprecated":false,"title":"imported_devices_factory()","anchor":"imported_devices_factory/0"},{"id":"imported_entry_pages_factory/0","deprecated":false,"title":"imported_entry_pages_factory()","anchor":"imported_entry_pages_factory/0"},{"id":"imported_exit_pages_factory/0","deprecated":false,"title":"imported_exit_pages_factory()","anchor":"imported_exit_pages_factory/0"},{"id":"imported_locations_factory/0","deprecated":false,"title":"imported_locations_factory()","anchor":"imported_locations_factory/0"},{"id":"imported_operating_systems_factory/0","deprecated":false,"title":"imported_operating_systems_factory()","anchor":"imported_operating_systems_factory/0"},{"id":"imported_pages_factory/0","deprecated":false,"title":"imported_pages_factory()","anchor":"imported_pages_factory/0"},{"id":"imported_sources_factory/0","deprecated":false,"title":"imported_sources_factory()","anchor":"imported_sources_factory/0"},{"id":"imported_visitors_factory/0","deprecated":false,"title":"imported_visitors_factory()","anchor":"imported_visitors_factory/0"},{"id":"insert/1","deprecated":false,"title":"insert(already_built_record)","anchor":"insert/1"},{"id":"insert/2","deprecated":false,"title":"insert(already_built_record, function_opts)","anchor":"insert/2"},{"id":"insert/3","deprecated":false,"title":"insert(factory_name, attrs, opts)","anchor":"insert/3"},{"id":"insert_list/3","deprecated":false,"title":"insert_list(number_of_records, factory_name, attrs \\\\ %{})","anchor":"insert_list/3"},{"id":"insert_list/4","deprecated":false,"title":"insert_list(number_of_records, factory_name, attrs, opts)","anchor":"insert_list/4"},{"id":"insert_pair/2","deprecated":false,"title":"insert_pair(factory_name, attrs \\\\ %{})","anchor":"insert_pair/2"},{"id":"insert_pair/3","deprecated":false,"title":"insert_pair(factory_name, attrs, opts)","anchor":"insert_pair/3"},{"id":"invitation_factory/0","deprecated":false,"title":"invitation_factory()","anchor":"invitation_factory/0"},{"id":"monthly_report_factory/0","deprecated":false,"title":"monthly_report_factory()","anchor":"monthly_report_factory/0"},{"id":"pageview_factory/0","deprecated":false,"title":"pageview_factory()","anchor":"pageview_factory/0"},{"id":"params_for/2","deprecated":false,"title":"params_for(factory_name, attrs \\\\ %{})","anchor":"params_for/2"},{"id":"params_with_assocs/2","deprecated":false,"title":"params_with_assocs(factory_name, attrs \\\\ %{})","anchor":"params_with_assocs/2"},{"id":"shared_link_factory/0","deprecated":false,"title":"shared_link_factory()","anchor":"shared_link_factory/0"},{"id":"site_factory/1","deprecated":false,"title":"site_factory(attrs)","anchor":"site_factory/1"},{"id":"site_membership_factory/0","deprecated":false,"title":"site_membership_factory()","anchor":"site_membership_factory/0"},{"id":"spike_notification_factory/0","deprecated":false,"title":"spike_notification_factory()","anchor":"spike_notification_factory/0"},{"id":"string_params_for/2","deprecated":false,"title":"string_params_for(factory_name, attrs \\\\ %{})","anchor":"string_params_for/2"},{"id":"string_params_with_assocs/2","deprecated":false,"title":"string_params_with_assocs(factory_name, attrs \\\\ %{})","anchor":"string_params_with_assocs/2"},{"id":"subscription_factory/0","deprecated":false,"title":"subscription_factory()","anchor":"subscription_factory/0"},{"id":"user_factory/1","deprecated":false,"title":"user_factory(attrs)","anchor":"user_factory/1"},{"id":"weekly_report_factory/0","deprecated":false,"title":"weekly_report_factory()","anchor":"weekly_report_factory/0"}],"key":"functions"}]},{"id":"Plausible.Funnel","deprecated":false,"group":"","title":"Plausible.Funnel","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(funnel \\\\ %__MODULE__{}, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"max_steps/0","deprecated":false,"title":"max_steps()","anchor":"max_steps/0"},{"id":"min_steps/0","deprecated":false,"title":"min_steps()","anchor":"min_steps/0"},{"id":"put_step_orders/1","deprecated":false,"title":"put_step_orders(changeset)","anchor":"put_step_orders/1"}],"key":"functions"}]},{"id":"Plausible.Funnel.Const","deprecated":false,"group":"","title":"Plausible.Funnel.Const","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"max_steps/0","deprecated":false,"title":"max_steps()","anchor":"max_steps/0"},{"id":"min_steps/0","deprecated":false,"title":"min_steps()","anchor":"min_steps/0"}],"key":"functions"}]},{"id":"Plausible.Funnel.Step","deprecated":false,"group":"","title":"Plausible.Funnel.Step","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(step, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Funnels","deprecated":false,"group":"","title":"Plausible.Funnels","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/3","deprecated":false,"title":"create(site, name, steps)","anchor":"create/3"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(site, name, steps)","anchor":"create_changeset/3"},{"id":"delete/2","deprecated":false,"title":"delete(site_id, funnel_id)","anchor":"delete/2"},{"id":"ephemeral_definition/3","deprecated":false,"title":"ephemeral_definition(site, name, steps)","anchor":"ephemeral_definition/3"},{"id":"get/2","deprecated":false,"title":"get(site_id, by)","anchor":"get/2"},{"id":"list/1","deprecated":false,"title":"list(site)","anchor":"list/1"}],"key":"functions"}]},{"id":"Plausible.Geo","deprecated":false,"group":"","title":"Plausible.Geo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"await_loader/0","deprecated":false,"title":"await_loader()","anchor":"await_loader/0"},{"id":"database_type/0","deprecated":false,"title":"database_type()","anchor":"database_type/0"},{"id":"load_db/1","deprecated":false,"title":"load_db(opts)","anchor":"load_db/1"},{"id":"lookup/1","deprecated":false,"title":"lookup(ip_address)","anchor":"lookup/1"}],"key":"functions"}]},{"id":"Plausible.Goal","deprecated":false,"group":"","title":"Plausible.Goal","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(goal, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Goal.Revenue","deprecated":false,"group":"","title":"Plausible.Goal.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"currency_options/0","deprecated":false,"title":"currency_options()","anchor":"currency_options/0"},{"id":"revenue?/1","deprecated":false,"title":"revenue?(goal)","anchor":"revenue?/1"},{"id":"valid_currencies/0","deprecated":false,"title":"valid_currencies()","anchor":"valid_currencies/0"}],"key":"functions"}]},{"id":"Plausible.Goals","deprecated":false,"group":"","title":"Plausible.Goals","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"count/1","deprecated":false,"title":"count(site)","anchor":"count/1"},{"id":"create/3","deprecated":false,"title":"create(site, params, opts \\\\ [])","anchor":"create/3"},{"id":"delete/2","deprecated":false,"title":"delete(id, site_id)","anchor":"delete/2"},{"id":"find_or_create/2","deprecated":false,"title":"find_or_create(site, map)","anchor":"find_or_create/2"},{"id":"for_site/2","deprecated":false,"title":"for_site(site, opts \\\\ [])","anchor":"for_site/2"},{"id":"for_site_query/2","deprecated":false,"title":"for_site_query(site, opts \\\\ [])","anchor":"for_site_query/2"}],"key":"functions"}]},{"id":"Plausible.Google.Api","deprecated":false,"group":"","title":"Plausible.Google.Api","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"google_analytics_view/0","deprecated":false,"title":"google_analytics_view()","anchor":"t:google_analytics_view/0"},{"id":"import_auth/0","deprecated":false,"title":"import_auth()","anchor":"t:import_auth/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"fetch_and_persist/3","deprecated":false,"title":"fetch_and_persist(site, report_request, opts \\\\ [])","anchor":"fetch_and_persist/3"},{"id":"fetch_stats/3","deprecated":false,"title":"fetch_stats(site, map, limit)","anchor":"fetch_stats/3"},{"id":"fetch_verified_properties/1","deprecated":false,"title":"fetch_verified_properties(auth)","anchor":"fetch_verified_properties/1"},{"id":"get_view/2","deprecated":false,"title":"get_view(access_token, lookup_id)","anchor":"get_view/2"},{"id":"import_analytics/4","deprecated":false,"title":"import_analytics(site, date_range, view_id, auth)","anchor":"import_analytics/4"},{"id":"import_authorize_url/2","deprecated":false,"title":"import_authorize_url(site_id, redirect_to)","anchor":"import_authorize_url/2"},{"id":"list_views/1","deprecated":false,"title":"list_views(access_token)","anchor":"list_views/1"},{"id":"search_console_authorize_url/2","deprecated":false,"title":"search_console_authorize_url(site_id, redirect_to)","anchor":"search_console_authorize_url/2"}],"key":"functions"}]},{"id":"Plausible.Google.Api.Mock","deprecated":false,"group":"","title":"Plausible.Google.Api.Mock","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_stats/3","deprecated":false,"title":"fetch_stats(auth, query, limit)","anchor":"fetch_stats/3"}],"key":"functions"}]},{"id":"Plausible.Google.Buffer","deprecated":false,"group":"","title":"Plausible.Google.Buffer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"flush/2","deprecated":false,"title":"flush(pid, timeout \\\\ :infinity)","anchor":"flush/2"},{"id":"handle_continue/2","deprecated":false,"title":"handle_continue(arg, state)","anchor":"handle_continue/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"},{"id":"insert_many/3","deprecated":false,"title":"insert_many(pid, table_name, records)","anchor":"insert_many/3"},{"id":"size/2","deprecated":false,"title":"size(pid, table_name)","anchor":"size/2"},{"id":"start_link/0","deprecated":false,"title":"start_link()","anchor":"start_link/0"},{"id":"stop/1","deprecated":false,"title":"stop(pid)","anchor":"stop/1"}],"key":"functions"}]},{"id":"Plausible.Google.HTTP","deprecated":false,"group":"","title":"Plausible.Google.HTTP","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_access_token/1","deprecated":false,"title":"fetch_access_token(code)","anchor":"fetch_access_token/1"},{"id":"get_analytics_start_date/2","deprecated":false,"title":"get_analytics_start_date(view_id, access_token)","anchor":"get_analytics_start_date/2"},{"id":"get_report/1","deprecated":false,"title":"get_report(report_request)","anchor":"get_report/1"},{"id":"list_sites/1","deprecated":false,"title":"list_sites(access_token)","anchor":"list_sites/1"},{"id":"list_stats/5","deprecated":false,"title":"list_stats(access_token, property, date_range, limit, page \\\\ nil)","anchor":"list_stats/5"},{"id":"list_views_for_user/1","deprecated":false,"title":"list_views_for_user(access_token)","anchor":"list_views_for_user/1"},{"id":"refresh_auth_token/1","deprecated":false,"title":"refresh_auth_token(refresh_token)","anchor":"refresh_auth_token/1"}],"key":"functions"}]},{"id":"Plausible.Google.ReportRequest","deprecated":false,"group":"","title":"Plausible.Google.ReportRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"full_report/0","deprecated":false,"title":"full_report()","anchor":"full_report/0"}],"key":"functions"}]},{"id":"Plausible.HTTPClient","deprecated":false,"group":"","title":"Plausible.HTTPClient","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/3","deprecated":false,"title":"get(url, headers \\\\ [], params \\\\ nil)","anchor":"get/3"},{"id":"impl/0","deprecated":false,"title":"impl()","anchor":"impl/0"},{"id":"post/4","deprecated":false,"title":"post(url, headers \\\\ [], params \\\\ nil, finch_req_opts \\\\ [])","anchor":"post/4"}],"key":"functions"}]},{"id":"Plausible.HTTPClient.Interface","deprecated":false,"group":"","title":"Plausible.HTTPClient.Interface","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"finch_request_opts/0","deprecated":false,"title":"finch_request_opts()","anchor":"t:finch_request_opts/0"},{"id":"headers/0","deprecated":false,"title":"headers()","anchor":"t:headers/0"},{"id":"params/0","deprecated":false,"title":"params()","anchor":"t:params/0"},{"id":"response/0","deprecated":false,"title":"response()","anchor":"t:response/0"},{"id":"url/0","deprecated":false,"title":"url()","anchor":"t:url/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"get/1","deprecated":false,"title":"get(url)","anchor":"c:get/1"},{"id":"get/2","deprecated":false,"title":"get(url, headers)","anchor":"c:get/2"},{"id":"get/3","deprecated":false,"title":"get(url, headers, params)","anchor":"c:get/3"},{"id":"post/3","deprecated":false,"title":"post(url, headers, params)","anchor":"c:post/3"},{"id":"post/4","deprecated":false,"title":"post(url, headers, params, finch_request_opts)","anchor":"c:post/4"}],"key":"callbacks"}]},{"id":"Plausible.HTTPClient.Non200Error","deprecated":false,"group":"","title":"Plausible.HTTPClient.Non200Error","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/1","deprecated":false,"title":"new(response)","anchor":"new/1"}],"key":"functions"}]},{"id":"Plausible.Helpers.JSON","deprecated":false,"group":"","title":"Plausible.Helpers.JSON","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"decode_or_fallback/1","deprecated":false,"title":"decode_or_fallback(raw)","anchor":"decode_or_fallback/1"}],"key":"functions"}]},{"id":"Plausible.ImportDeletionRepo","deprecated":false,"group":"","title":"Plausible.ImportDeletionRepo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.Imported","deprecated":false,"group":"","title":"Plausible.Imported","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"forget/1","deprecated":false,"title":"forget(site)","anchor":"forget/1"},{"id":"from_google_analytics/3","deprecated":false,"title":"from_google_analytics(data, site_id, table)","anchor":"from_google_analytics/3"},{"id":"tables/0","deprecated":false,"title":"tables()","anchor":"tables/0"}],"key":"functions"}]},{"id":"Plausible.IngestRepo","deprecated":false,"group":"","title":"Plausible.IngestRepo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"insert_stream/3","deprecated":false,"title":"insert_stream(source_or_schema, rows, opts \\\\ [])","anchor":"insert_stream/3"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Counters","deprecated":false,"group":"","title":"Plausible.Ingestion.Counters","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"},{"id":"stop/1","deprecated":false,"title":"stop(pid)","anchor":"stop/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Counters.Buffer","deprecated":false,"group":"","title":"Plausible.Ingestion.Counters.Buffer","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"bucket_fn_opt/0","deprecated":false,"title":"bucket_fn_opt()","anchor":"t:bucket_fn_opt/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"},{"id":"unix_timestamp/0","deprecated":false,"title":"unix_timestamp()","anchor":"t:unix_timestamp/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"aggregate/4","deprecated":false,"title":"aggregate(buffer, metric, domain, timestamp)","anchor":"aggregate/4"},{"id":"bucket_10s/1","deprecated":false,"title":"bucket_10s(datetime)","anchor":"bucket_10s/1"},{"id":"flush/2","deprecated":false,"title":"flush(buffer, now \\\\ DateTime.utc_now())","anchor":"flush/2"},{"id":"new/2","deprecated":false,"title":"new(buffer_name, opts \\\\ [])","anchor":"new/2"},{"id":"previous_10s/1","deprecated":false,"title":"previous_10s(datetime)","anchor":"previous_10s/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Counters.Record","deprecated":false,"group":"","title":"Plausible.Ingestion.Counters.Record","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Plausible.Ingestion.Counters.TelemetryHandler","deprecated":false,"group":"","title":"Plausible.Ingestion.Counters.TelemetryHandler","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","deprecated":false,"title":"handle_event(list, measurements, map, buffer)","anchor":"handle_event/4"},{"id":"install/1","deprecated":false,"title":"install(buffer)","anchor":"install/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Event","deprecated":false,"group":"","title":"Plausible.Ingestion.Event","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"drop_reason/0","deprecated":false,"title":"drop_reason()","anchor":"t:drop_reason/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"build_and_buffer/1","deprecated":false,"title":"build_and_buffer(request)","anchor":"build_and_buffer/1"},{"id":"emit_telemetry_buffered/1","deprecated":false,"title":"emit_telemetry_buffered(event)","anchor":"emit_telemetry_buffered/1"},{"id":"emit_telemetry_dropped/2","deprecated":false,"title":"emit_telemetry_dropped(event, reason)","anchor":"emit_telemetry_dropped/2"},{"id":"telemetry_event_buffered/0","deprecated":false,"title":"telemetry_event_buffered()","anchor":"telemetry_event_buffered/0"},{"id":"telemetry_event_dropped/0","deprecated":false,"title":"telemetry_event_dropped()","anchor":"telemetry_event_dropped/0"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Event.Revenue","deprecated":false,"group":"","title":"Plausible.Ingestion.Event.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_revenue_attrs/1","deprecated":false,"title":"get_revenue_attrs(event)","anchor":"get_revenue_attrs/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Request","deprecated":false,"group":"","title":"Plausible.Ingestion.Request","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"build/2","deprecated":false,"title":"build(conn, now \\\\ NaiveDateTime.utc_now())","anchor":"build/2"},{"id":"sanitize_hostname/1","deprecated":false,"title":"sanitize_hostname(hostname)","anchor":"sanitize_hostname/1"}],"key":"functions"}]},{"id":"Plausible.Ingestion.Request.Revenue","deprecated":false,"group":"","title":"Plausible.Ingestion.Request.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"put_revenue_source/2","deprecated":false,"title":"put_revenue_source(changeset, request_body)","anchor":"put_revenue_source/2"}],"key":"functions"}]},{"id":"Plausible.Mailer","deprecated":false,"group":"","title":"Plausible.Mailer","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"result/0","deprecated":false,"title":"result()","anchor":"t:result/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"deliver/1","deprecated":false,"title":"deliver(email)","anchor":"deliver/1"},{"id":"deliver_later/2","deprecated":false,"title":"deliver_later(email, opts \\\\ [])","anchor":"deliver_later/2"},{"id":"deliver_later!/2","deprecated":false,"title":"deliver_later!(email, opts \\\\ [])","anchor":"deliver_later!/2"},{"id":"deliver_now/2","deprecated":false,"title":"deliver_now(email, opts \\\\ [])","anchor":"deliver_now/2"},{"id":"deliver_now!/2","deprecated":false,"title":"deliver_now!(email, opts \\\\ [])","anchor":"deliver_now!/2"},{"id":"send/1","deprecated":false,"title":"send(email)","anchor":"send/1"}],"key":"functions"}]},{"id":"Plausible.OpenTelemetry.Sampler","deprecated":false,"group":"","title":"Plausible.OpenTelemetry.Sampler","sections":[]},{"id":"Plausible.PaddleApi.Mock","deprecated":false,"group":"","title":"Plausible.PaddleApi.Mock","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_prices/1","deprecated":false,"title":"fetch_prices(product_ids)","anchor":"fetch_prices/1"},{"id":"get_invoices/1","deprecated":false,"title":"get_invoices(subscription)","anchor":"get_invoices/1"},{"id":"get_subscription/1","deprecated":false,"title":"get_subscription(_)","anchor":"get_subscription/1"},{"id":"update_subscription/2","deprecated":false,"title":"update_subscription(_, map)","anchor":"update_subscription/2"},{"id":"update_subscription_preview/2","deprecated":false,"title":"update_subscription_preview(user, new_plan_id)","anchor":"update_subscription_preview/2"}],"key":"functions"}]},{"id":"Plausible.Pagination","deprecated":false,"group":"","title":"Plausible.Pagination","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"paginate/4","deprecated":false,"title":"paginate(queryable, params, opts, repo_opts \\\\ [])","anchor":"paginate/4"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.CustomProps","deprecated":false,"group":"","title":"Plausible.Plugins.API.CustomProps","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"disable/2","deprecated":false,"title":"disable(site, prop_or_props)","anchor":"disable/2"},{"id":"enable/2","deprecated":false,"title":"enable(site, prop_or_props)","anchor":"enable/2"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.Goals","deprecated":false,"group":"","title":"Plausible.Plugins.API.Goals","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"create_request/0","deprecated":false,"title":"create_request()","anchor":"t:create_request/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(site, goal_or_goals)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(site, id_or_ids)","anchor":"delete/2"},{"id":"get/2","deprecated":false,"title":"get(site, id)","anchor":"get/2"},{"id":"get_goals/2","deprecated":false,"title":"get_goals(site, params)","anchor":"get_goals/2"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.SharedLinks","deprecated":false,"group":"","title":"Plausible.Plugins.API.SharedLinks","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/2","deprecated":false,"title":"get(site, id)","anchor":"get/2"},{"id":"get_or_create/3","deprecated":false,"title":"get_or_create(site, name, password \\\\ nil)","anchor":"get_or_create/3"},{"id":"get_shared_links/2","deprecated":false,"title":"get_shared_links(site, params)","anchor":"get_shared_links/2"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.Token","deprecated":false,"group":"","title":"Plausible.Plugins.API.Token","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"generate/1","deprecated":false,"title":"generate(random_bytes \\\\ random_bytes())","anchor":"generate/1"},{"id":"hash/1","deprecated":false,"title":"hash(raw)","anchor":"hash/1"},{"id":"insert_changeset/3","deprecated":false,"title":"insert_changeset(site, map, attrs \\\\ %{})","anchor":"insert_changeset/3"},{"id":"last_used_humanize/1","deprecated":false,"title":"last_used_humanize(token)","anchor":"last_used_humanize/1"},{"id":"prefix/0","deprecated":false,"title":"prefix()","anchor":"prefix/0"}],"key":"functions"}]},{"id":"Plausible.Plugins.API.Tokens","deprecated":false,"group":"","title":"Plausible.Plugins.API.Tokens","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"any?/1","deprecated":false,"title":"any?(site)","anchor":"any?/1"},{"id":"create/3","deprecated":false,"title":"create(site, description, generated_token \\\\ Token.generate())","anchor":"create/3"},{"id":"delete/2","deprecated":false,"title":"delete(site, token_id)","anchor":"delete/2"},{"id":"find/1","deprecated":false,"title":"find(raw)","anchor":"find/1"},{"id":"list/1","deprecated":false,"title":"list(site)","anchor":"list/1"},{"id":"update_last_seen/2","deprecated":false,"title":"update_last_seen(token, now \\\\ NaiveDateTime.utc_now())","anchor":"update_last_seen/2"}],"key":"functions"}]},{"id":"Plausible.PromEx","deprecated":false,"group":"","title":"Plausible.PromEx","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"}],"key":"functions"}]},{"id":"Plausible.PromEx.Plugins.PlausibleMetrics","deprecated":false,"group":"","title":"Plausible.PromEx.Plugins.PlausibleMetrics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"execute_cache_metrics/0","deprecated":false,"title":"execute_cache_metrics()","anchor":"execute_cache_metrics/0"},{"id":"execute_write_buffer_metrics/0","deprecated":false,"title":"execute_write_buffer_metrics()","anchor":"execute_write_buffer_metrics/0"}],"key":"functions"}]},{"id":"Plausible.Props","deprecated":false,"group":"","title":"Plausible.Props","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"prop/0","deprecated":false,"title":"prop()","anchor":"t:prop/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"allow/2","deprecated":false,"title":"allow(site, prop_or_props)","anchor":"allow/2"},{"id":"allow_changeset/2","deprecated":false,"title":"allow_changeset(site, prop_or_props)","anchor":"allow_changeset/2"},{"id":"allow_existing_props/1","deprecated":false,"title":"allow_existing_props(site)","anchor":"allow_existing_props/1"},{"id":"configured?/1","deprecated":false,"title":"configured?(site)","anchor":"configured?/1"},{"id":"disallow/2","deprecated":false,"title":"disallow(site, prop_or_props)","anchor":"disallow/2"},{"id":"ensure_prop_key_accessible/2","deprecated":false,"title":"ensure_prop_key_accessible(prop_key, user)","anchor":"ensure_prop_key_accessible/2"},{"id":"internal_keys/0","deprecated":false,"title":"internal_keys()","anchor":"internal_keys/0"},{"id":"max_prop_key_length/0","deprecated":false,"title":"max_prop_key_length()","anchor":"max_prop_key_length/0"},{"id":"max_prop_value_length/0","deprecated":false,"title":"max_prop_value_length()","anchor":"max_prop_value_length/0"},{"id":"max_props/0","deprecated":false,"title":"max_props()","anchor":"max_props/0"},{"id":"suggest_keys_to_allow/2","deprecated":false,"title":"suggest_keys_to_allow(site, limit \\\\ 300)","anchor":"suggest_keys_to_allow/2"}],"key":"functions"}]},{"id":"Plausible.Purge","deprecated":false,"group":"","title":"Plausible.Purge","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_imported_stats!/1","deprecated":false,"title":"delete_imported_stats!(site)","anchor":"delete_imported_stats!/1"},{"id":"delete_native_stats!/1","deprecated":false,"title":"delete_native_stats!(site)","anchor":"delete_native_stats!/1"},{"id":"reset!/1","deprecated":false,"title":"reset!(site)","anchor":"reset!/1"}],"key":"functions"}]},{"id":"Plausible.RateLimit","deprecated":false,"group":"","title":"Plausible.RateLimit","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check_rate/5","deprecated":false,"title":"check_rate(table \\\\ __MODULE__, key, scale, limit, increment \\\\ 1)","anchor":"check_rate/5"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Plausible.Release","deprecated":false,"group":"","title":"Plausible.Release","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"configure_ref_inspector/0","deprecated":false,"title":"configure_ref_inspector()","anchor":"configure_ref_inspector/0"},{"id":"configure_ua_inspector/0","deprecated":false,"title":"configure_ua_inspector()","anchor":"configure_ua_inspector/0"},{"id":"createdb/0","deprecated":false,"title":"createdb()","anchor":"createdb/0"},{"id":"dump_plans/0","deprecated":false,"title":"dump_plans()","anchor":"dump_plans/0"},{"id":"migrate/0","deprecated":false,"title":"migrate()","anchor":"migrate/0"},{"id":"pending_migrations/0","deprecated":false,"title":"pending_migrations()","anchor":"pending_migrations/0"},{"id":"rollback/0","deprecated":false,"title":"rollback()","anchor":"rollback/0"},{"id":"seed/0","deprecated":false,"title":"seed()","anchor":"seed/0"},{"id":"should_be_first_launch?/0","deprecated":false,"title":"should_be_first_launch?()","anchor":"should_be_first_launch?/0"}],"key":"functions"}]},{"id":"Plausible.Repo","deprecated":false,"group":"","title":"Plausible.Repo","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(queryable, aggregate, opts \\\\ [])","anchor":"aggregate/3"},{"id":"aggregate/4","deprecated":false,"title":"aggregate(queryable, aggregate, field, opts)","anchor":"aggregate/4"},{"id":"all/2","deprecated":false,"title":"all(queryable, opts \\\\ [])","anchor":"all/2"},{"id":"checked_out?/0","deprecated":false,"title":"checked_out?()","anchor":"checked_out?/0"},{"id":"checkout/2","deprecated":false,"title":"checkout(fun, opts \\\\ [])","anchor":"checkout/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/0","deprecated":false,"title":"config()","anchor":"config/0"},{"id":"default_options/1","deprecated":false,"title":"default_options(operation)","anchor":"default_options/1"},{"id":"delete/2","deprecated":false,"title":"delete(struct, opts \\\\ [])","anchor":"delete/2"},{"id":"delete!/2","deprecated":false,"title":"delete!(struct, opts \\\\ [])","anchor":"delete!/2"},{"id":"delete_all/2","deprecated":false,"title":"delete_all(queryable, opts \\\\ [])","anchor":"delete_all/2"},{"id":"disconnect_all/2","deprecated":false,"title":"disconnect_all(interval, opts \\\\ [])","anchor":"disconnect_all/2"},{"id":"exists?/2","deprecated":false,"title":"exists?(queryable, opts \\\\ [])","anchor":"exists?/2"},{"id":"explain/3","deprecated":false,"title":"explain(operation, queryable, opts \\\\ [])","anchor":"explain/3"},{"id":"get/3","deprecated":false,"title":"get(queryable, id, opts \\\\ [])","anchor":"get/3"},{"id":"get!/3","deprecated":false,"title":"get!(queryable, id, opts \\\\ [])","anchor":"get!/3"},{"id":"get_by/3","deprecated":false,"title":"get_by(queryable, clauses, opts \\\\ [])","anchor":"get_by/3"},{"id":"get_by!/3","deprecated":false,"title":"get_by!(queryable, clauses, opts \\\\ [])","anchor":"get_by!/3"},{"id":"get_dynamic_repo/0","deprecated":false,"title":"get_dynamic_repo()","anchor":"get_dynamic_repo/0"},{"id":"in_transaction?/0","deprecated":false,"title":"in_transaction?()","anchor":"in_transaction?/0"},{"id":"insert/2","deprecated":false,"title":"insert(struct, opts \\\\ [])","anchor":"insert/2"},{"id":"insert!/2","deprecated":false,"title":"insert!(struct, opts \\\\ [])","anchor":"insert!/2"},{"id":"insert_all/3","deprecated":false,"title":"insert_all(schema_or_source, entries, opts \\\\ [])","anchor":"insert_all/3"},{"id":"insert_or_update/2","deprecated":false,"title":"insert_or_update(changeset, opts \\\\ [])","anchor":"insert_or_update/2"},{"id":"insert_or_update!/2","deprecated":false,"title":"insert_or_update!(changeset, opts \\\\ [])","anchor":"insert_or_update!/2"},{"id":"load/2","deprecated":false,"title":"load(schema_or_types, data)","anchor":"load/2"},{"id":"one/2","deprecated":false,"title":"one(queryable, opts \\\\ [])","anchor":"one/2"},{"id":"one!/2","deprecated":false,"title":"one!(queryable, opts \\\\ [])","anchor":"one!/2"},{"id":"paginate/2","deprecated":false,"title":"paginate(pageable, options \\\\ [])","anchor":"paginate/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/3"},{"id":"prepare_query/3","deprecated":false,"title":"prepare_query(operation, query, opts)","anchor":"prepare_query/3"},{"id":"put_dynamic_repo/1","deprecated":false,"title":"put_dynamic_repo(dynamic)","anchor":"put_dynamic_repo/1"},{"id":"query/3","deprecated":false,"title":"query(sql, params \\\\ [], opts \\\\ [])","anchor":"query/3"},{"id":"query!/3","deprecated":false,"title":"query!(sql, params \\\\ [], opts \\\\ [])","anchor":"query!/3"},{"id":"query_many/3","deprecated":false,"title":"query_many(sql, params \\\\ [], opts \\\\ [])","anchor":"query_many/3"},{"id":"query_many!/3","deprecated":false,"title":"query_many!(sql, params \\\\ [], opts \\\\ [])","anchor":"query_many!/3"},{"id":"reload/2","deprecated":false,"title":"reload(queryable, opts \\\\ [])","anchor":"reload/2"},{"id":"reload!/2","deprecated":false,"title":"reload!(queryable, opts \\\\ [])","anchor":"reload!/2"},{"id":"rollback/1","deprecated":false,"title":"rollback(value)","anchor":"rollback/1"},{"id":"scrivener_defaults/0","deprecated":false,"title":"scrivener_defaults()","anchor":"scrivener_defaults/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"stop/1","deprecated":false,"title":"stop(timeout \\\\ 5000)","anchor":"stop/1"},{"id":"stream/2","deprecated":false,"title":"stream(queryable, opts \\\\ [])","anchor":"stream/2"},{"id":"to_sql/2","deprecated":false,"title":"to_sql(operation, queryable)","anchor":"to_sql/2"},{"id":"transaction/2","deprecated":false,"title":"transaction(fun_or_multi, opts \\\\ [])","anchor":"transaction/2"},{"id":"update/2","deprecated":false,"title":"update(struct, opts \\\\ [])","anchor":"update/2"},{"id":"update!/2","deprecated":false,"title":"update!(struct, opts \\\\ [])","anchor":"update!/2"},{"id":"update_all/3","deprecated":false,"title":"update_all(queryable, updates, opts \\\\ [])","anchor":"update_all/3"}],"key":"functions"}]},{"id":"Plausible.Sentry.Client","deprecated":false,"group":"","title":"Plausible.Sentry.Client","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/0","deprecated":false,"title":"child_spec()","anchor":"child_spec/0"},{"id":"post/3","deprecated":false,"title":"post(url, headers, body)","anchor":"post/3"}],"key":"functions"}]},{"id":"Plausible.SentryFilter","deprecated":false,"group":"","title":"Plausible.SentryFilter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"before_send/1","deprecated":false,"title":"before_send(event)","anchor":"before_send/1"},{"id":"exclude_exception?/2","deprecated":false,"title":"exclude_exception?(exception, source)","anchor":"exclude_exception?/2"}],"key":"functions"}]},{"id":"Plausible.Session.CacheStore","deprecated":false,"group":"","title":"Plausible.Session.CacheStore","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"on_event/3","deprecated":false,"title":"on_event(event, prev_user_id, buffer \\\\ WriteBuffer)","anchor":"on_event/3"}],"key":"functions"}]},{"id":"Plausible.Session.Salts","deprecated":false,"group":"","title":"Plausible.Session.Salts","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"fetch/0","deprecated":false,"title":"fetch()","anchor":"fetch/0"},{"id":"rotate/0","deprecated":false,"title":"rotate()","anchor":"rotate/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts)","anchor":"start_link/1"}],"key":"functions"}]},{"id":"Plausible.Site","deprecated":false,"group":"","title":"Plausible.Site","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(site, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"crm_changeset/2","deprecated":false,"title":"crm_changeset(site, attrs)","anchor":"crm_changeset/2"},{"id":"import_failure/1","deprecated":false,"title":"import_failure(site)","anchor":"import_failure/1"},{"id":"import_success/1","deprecated":false,"title":"import_success(site)","anchor":"import_success/1"},{"id":"local_start_date/1","deprecated":false,"title":"local_start_date(site)","anchor":"local_start_date/1"},{"id":"make_private/1","deprecated":false,"title":"make_private(site)","anchor":"make_private/1"},{"id":"make_public/1","deprecated":false,"title":"make_public(site)","anchor":"make_public/1"},{"id":"new/1","deprecated":false,"title":"new(params)","anchor":"new/1"},{"id":"remove_imported_data/1","deprecated":false,"title":"remove_imported_data(site)","anchor":"remove_imported_data/1"},{"id":"set_imported_source/2","deprecated":false,"title":"set_imported_source(site, imported_source)","anchor":"set_imported_source/2"},{"id":"set_native_stats_start_at/2","deprecated":false,"title":"set_native_stats_start_at(site, val)","anchor":"set_native_stats_start_at/2"},{"id":"set_stats_start_date/2","deprecated":false,"title":"set_stats_start_date(site, val)","anchor":"set_stats_start_date/2"},{"id":"start_import/5","deprecated":false,"title":"start_import(site, start_date, end_date, imported_source, status \\\\ \"importing\")","anchor":"start_import/5"},{"id":"tz_offset/2","deprecated":false,"title":"tz_offset(site, utc_now \\\\ DateTime.utc_now())","anchor":"tz_offset/2"},{"id":"update_changeset/3","deprecated":false,"title":"update_changeset(site, attrs \\\\ %{}, opts \\\\ [])","anchor":"update_changeset/3"}],"key":"functions"}]},{"id":"Plausible.Site.Cache","deprecated":false,"group":"","title":"Plausible.Site.Cache","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"},{"id":"get/2","deprecated":false,"title":"get(domain, opts \\\\ [])","anchor":"get/2"},{"id":"get_site_id/2","deprecated":false,"title":"get_site_id(domain, opts \\\\ [])","anchor":"get_site_id/2"},{"id":"hit_rate/1","deprecated":false,"title":"hit_rate(cache_name \\\\ :sites_by_domain)","anchor":"hit_rate/1"},{"id":"merge/2","deprecated":false,"title":"merge(new_items, opts \\\\ [])","anchor":"merge/2"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"name/0"},{"id":"ready?/1","deprecated":false,"title":"ready?(cache_name \\\\ :sites_by_domain)","anchor":"ready?/1"},{"id":"refresh_all/1","deprecated":false,"title":"refresh_all(opts \\\\ [])","anchor":"refresh_all/1"},{"id":"refresh_updated_recently/1","deprecated":false,"title":"refresh_updated_recently(opts \\\\ [])","anchor":"refresh_updated_recently/1"},{"id":"size/1","deprecated":false,"title":"size(cache_name \\\\ :sites_by_domain)","anchor":"size/1"},{"id":"telemetry_event_refresh/2","deprecated":false,"title":"telemetry_event_refresh(cache_name \\\\ :sites_by_domain, mode)","anchor":"telemetry_event_refresh/2"},{"id":"touch_site!/2","deprecated":false,"title":"touch_site!(site, now)","anchor":"touch_site!/2"}],"key":"functions"}]},{"id":"Plausible.Site.Cache.Warmer","deprecated":false,"group":"","title":"Plausible.Site.Cache.Warmer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"interval/0","deprecated":false,"title":"interval()","anchor":"interval/0"}],"key":"functions"}]},{"id":"Plausible.Site.Cache.Warmer.All","deprecated":false,"group":"","title":"Plausible.Site.Cache.Warmer.All","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"}],"key":"functions"}]},{"id":"Plausible.Site.Cache.Warmer.RecentlyUpdated","deprecated":false,"group":"","title":"Plausible.Site.Cache.Warmer.RecentlyUpdated","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"}],"key":"functions"}]},{"id":"Plausible.Site.Domain","deprecated":false,"group":"","title":"Plausible.Site.Domain","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change/3","deprecated":false,"title":"change(site, new_domain, opts \\\\ [])","anchor":"change/3"},{"id":"expire_change_transitions/1","deprecated":false,"title":"expire_change_transitions(expire_threshold_hours \\\\ 72)","anchor":"expire_change_transitions/1"}],"key":"functions"}]},{"id":"Plausible.Site.GateKeeper","deprecated":false,"group":"","title":"Plausible.Site.GateKeeper","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"policy/0","deprecated":false,"title":"policy()","anchor":"t:policy/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"check/2","deprecated":false,"title":"check(domain, opts \\\\ [])","anchor":"check/2"},{"id":"key/1","deprecated":false,"title":"key(domain)","anchor":"key/1"}],"key":"functions"}]},{"id":"Plausible.Site.GoogleAuth","deprecated":false,"group":"","title":"Plausible.Site.GoogleAuth","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(auth, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"set_property/2","deprecated":false,"title":"set_property(auth, attrs \\\\ %{})","anchor":"set_property/2"}],"key":"functions"}]},{"id":"Plausible.Site.ImportedData","deprecated":false,"group":"","title":"Plausible.Site.ImportedData","sections":[]},{"id":"Plausible.Site.Membership","deprecated":false,"group":"","title":"Plausible.Site.Membership","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"role/0","deprecated":false,"title":"role()","anchor":"t:role/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new/2","deprecated":false,"title":"new(site, user)","anchor":"new/2"},{"id":"set_role/2","deprecated":false,"title":"set_role(changeset, role)","anchor":"set_role/2"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships","deprecated":false,"group":"","title":"Plausible.Site.Memberships","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept_invitation/2","deprecated":false,"title":"accept_invitation(invitation_id, user)","anchor":"accept_invitation/2"},{"id":"any?/1","deprecated":false,"title":"any?(user)","anchor":"any?/1"},{"id":"any_or_pending?/1","deprecated":false,"title":"any_or_pending?(user)","anchor":"any_or_pending?/1"},{"id":"bulk_create_invitation/5","deprecated":false,"title":"bulk_create_invitation(sites, inviter, invitee_email, role, opts)","anchor":"bulk_create_invitation/5"},{"id":"bulk_transfer_ownership_direct/2","deprecated":false,"title":"bulk_transfer_ownership_direct(sites, new_owner)","anchor":"bulk_transfer_ownership_direct/2"},{"id":"create_invitation/4","deprecated":false,"title":"create_invitation(site, inviter, invitee_email, role)","anchor":"create_invitation/4"},{"id":"pending?/1","deprecated":false,"title":"pending?(email)","anchor":"pending?/1"},{"id":"pending_ownerships?/1","deprecated":false,"title":"pending_ownerships?(email)","anchor":"pending_ownerships?/1"},{"id":"reject_invitation/2","deprecated":false,"title":"reject_invitation(invitation_id, user)","anchor":"reject_invitation/2"},{"id":"remove_invitation/2","deprecated":false,"title":"remove_invitation(invitation_id, site)","anchor":"remove_invitation/2"},{"id":"transfer_ownership/2","deprecated":false,"title":"transfer_ownership(site, user)","anchor":"transfer_ownership/2"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships.AcceptInvitation","deprecated":false,"group":"","title":"Plausible.Site.Memberships.AcceptInvitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept_invitation/2","deprecated":false,"title":"accept_invitation(invitation_id, user)","anchor":"accept_invitation/2"},{"id":"transfer_ownership/2","deprecated":false,"title":"transfer_ownership(site, user)","anchor":"transfer_ownership/2"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships.CreateInvitation","deprecated":false,"group":"","title":"Plausible.Site.Memberships.CreateInvitation","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"invite_error/0","deprecated":false,"title":"invite_error()","anchor":"t:invite_error/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"bulk_create_invitation/5","deprecated":false,"title":"bulk_create_invitation(sites, inviter, invitee_email, role, opts \\\\ [])","anchor":"bulk_create_invitation/5"},{"id":"bulk_transfer_ownership_direct/2","deprecated":false,"title":"bulk_transfer_ownership_direct(sites, new_owner)","anchor":"bulk_transfer_ownership_direct/2"},{"id":"create_invitation/4","deprecated":false,"title":"create_invitation(site, inviter, invitee_email, role)","anchor":"create_invitation/4"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships.RejectInvitation","deprecated":false,"group":"","title":"Plausible.Site.Memberships.RejectInvitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"reject_invitation/2","deprecated":false,"title":"reject_invitation(invitation_id, user)","anchor":"reject_invitation/2"}],"key":"functions"}]},{"id":"Plausible.Site.Memberships.RemoveInvitation","deprecated":false,"group":"","title":"Plausible.Site.Memberships.RemoveInvitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"remove_invitation/2","deprecated":false,"title":"remove_invitation(invitation_id, site)","anchor":"remove_invitation/2"}],"key":"functions"}]},{"id":"Plausible.Site.MonthlyReport","deprecated":false,"group":"","title":"Plausible.Site.MonthlyReport","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_recipient/2","deprecated":false,"title":"add_recipient(report, recipient)","anchor":"add_recipient/2"},{"id":"changeset/2","deprecated":false,"title":"changeset(settings, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"remove_recipient/2","deprecated":false,"title":"remove_recipient(report, recipient)","anchor":"remove_recipient/2"}],"key":"functions"}]},{"id":"Plausible.Site.Removal","deprecated":false,"group":"","title":"Plausible.Site.Removal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(domain)","anchor":"run/1"}],"key":"functions"}]},{"id":"Plausible.Site.SharedLink","deprecated":false,"group":"","title":"Plausible.Site.SharedLink","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(link, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Site.SpikeNotification","deprecated":false,"group":"","title":"Plausible.Site.SpikeNotification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_recipient/2","deprecated":false,"title":"add_recipient(schema, recipient)","anchor":"add_recipient/2"},{"id":"changeset/2","deprecated":false,"title":"changeset(schema, attrs)","anchor":"changeset/2"},{"id":"remove_recipient/2","deprecated":false,"title":"remove_recipient(schema, recipient)","anchor":"remove_recipient/2"},{"id":"was_sent/1","deprecated":false,"title":"was_sent(schema)","anchor":"was_sent/1"}],"key":"functions"}]},{"id":"Plausible.Site.UserPreference","deprecated":false,"group":"","title":"Plausible.Site.UserPreference","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(user, site, attrs \\\\ %{})","anchor":"changeset/3"},{"id":"options/0","deprecated":false,"title":"options()","anchor":"options/0"}],"key":"functions"}]},{"id":"Plausible.Site.WeeklyReport","deprecated":false,"group":"","title":"Plausible.Site.WeeklyReport","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_recipient/2","deprecated":false,"title":"add_recipient(report, recipient)","anchor":"add_recipient/2"},{"id":"changeset/2","deprecated":false,"title":"changeset(settings, attrs \\\\ %{})","anchor":"changeset/2"},{"id":"remove_recipient/2","deprecated":false,"title":"remove_recipient(report, recipient)","anchor":"remove_recipient/2"}],"key":"functions"}]},{"id":"Plausible.SiteAdmin","deprecated":false,"group":"","title":"Plausible.SiteAdmin","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_changeset/2","deprecated":false,"title":"create_changeset(schema, attrs)","anchor":"create_changeset/2"},{"id":"custom_index_query/3","deprecated":false,"title":"custom_index_query(conn, schema, query)","anchor":"custom_index_query/3"},{"id":"form_fields/1","deprecated":false,"title":"form_fields(_)","anchor":"form_fields/1"},{"id":"get_struct_fields/1","deprecated":false,"title":"get_struct_fields(module)","anchor":"get_struct_fields/1"},{"id":"index/1","deprecated":false,"title":"index(_)","anchor":"index/1"},{"id":"list_actions/1","deprecated":false,"title":"list_actions(conn)","anchor":"list_actions/1"},{"id":"ordering/1","deprecated":false,"title":"ordering(schema)","anchor":"ordering/1"},{"id":"search_fields/1","deprecated":false,"title":"search_fields(schema)","anchor":"search_fields/1"},{"id":"update_changeset/2","deprecated":false,"title":"update_changeset(schema, attrs)","anchor":"update_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Sites","deprecated":false,"group":"","title":"Plausible.Sites","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"list_opt/0","deprecated":false,"title":"list_opt()","anchor":"t:list_opt/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(user, params)","anchor":"create/2"},{"id":"create_shared_link/3","deprecated":false,"title":"create_shared_link(site, name, password \\\\ nil)","anchor":"create_shared_link/3"},{"id":"get_by_domain/1","deprecated":false,"title":"get_by_domain(domain)","anchor":"get_by_domain/1"},{"id":"get_by_domain!/1","deprecated":false,"title":"get_by_domain!(domain)","anchor":"get_by_domain!/1"},{"id":"get_for_user/3","deprecated":false,"title":"get_for_user(user_id, domain, roles \\\\ [:owner, :admin, :viewer])","anchor":"get_for_user/3"},{"id":"get_for_user!/3","deprecated":false,"title":"get_for_user!(user_id, domain, roles \\\\ [:owner, :admin, :viewer])","anchor":"get_for_user!/3"},{"id":"has_admin_access?/2","deprecated":false,"title":"has_admin_access?(user_id, site)","anchor":"has_admin_access?/2"},{"id":"has_goals?/1","deprecated":false,"title":"has_goals?(site)","anchor":"has_goals?/1"},{"id":"has_stats?/1","deprecated":false,"title":"has_stats?(site)","anchor":"has_stats?/1"},{"id":"is_member?/2","deprecated":false,"title":"is_member?(user_id, site)","anchor":"is_member?/2"},{"id":"list/3","deprecated":false,"title":"list(user, pagination_params, opts \\\\ [])","anchor":"list/3"},{"id":"list_with_invitations/3","deprecated":false,"title":"list_with_invitations(user, pagination_params, opts \\\\ [])","anchor":"list_with_invitations/3"},{"id":"locked?/1","deprecated":false,"title":"locked?(site)","anchor":"locked?/1"},{"id":"owned_site_ids/1","deprecated":false,"title":"owned_site_ids(user)","anchor":"owned_site_ids/1"},{"id":"owned_sites_count/1","deprecated":false,"title":"owned_sites_count(user)","anchor":"owned_sites_count/1"},{"id":"owned_sites_domains/1","deprecated":false,"title":"owned_sites_domains(user)","anchor":"owned_sites_domains/1"},{"id":"role/2","deprecated":false,"title":"role(user_id, site)","anchor":"role/2"},{"id":"set_option/4","deprecated":false,"title":"set_option(user, site, option, value)","anchor":"set_option/4"},{"id":"shared_link_url/2","deprecated":false,"title":"shared_link_url(site, link)","anchor":"shared_link_url/2"},{"id":"stats_start_date/1","deprecated":false,"title":"stats_start_date(site)","anchor":"stats_start_date/1"},{"id":"toggle_pin/2","deprecated":false,"title":"toggle_pin(user, site)","anchor":"toggle_pin/2"}],"key":"functions"}]},{"id":"Plausible.Stats","deprecated":false,"group":"","title":"Plausible.Stats","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(site, query, metrics)","anchor":"aggregate/3"},{"id":"breakdown/5","deprecated":false,"title":"breakdown(site, query, prop, metrics, pagination)","anchor":"breakdown/5"},{"id":"current_visitors/1","deprecated":false,"title":"current_visitors(site)","anchor":"current_visitors/1"},{"id":"filter_suggestions/4","deprecated":false,"title":"filter_suggestions(site, query, filter_name, filter_search)","anchor":"filter_suggestions/4"},{"id":"funnel/3","deprecated":false,"title":"funnel(site, query, funnel)","anchor":"funnel/3"},{"id":"timeseries/3","deprecated":false,"title":"timeseries(site, query, metrics)","anchor":"timeseries/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Aggregate","deprecated":false,"group":"","title":"Plausible.Stats.Aggregate","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/3","deprecated":false,"title":"aggregate(site, query, metrics)","anchor":"aggregate/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Base","deprecated":false,"group":"","title":"Plausible.Stats.Base","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"apply_entry_prop_filter/3","deprecated":false,"title":"apply_entry_prop_filter(sessions_q, prop_name, arg3)","anchor":"apply_entry_prop_filter/3"},{"id":"base_event_query/2","deprecated":false,"title":"base_event_query(site, query)","anchor":"base_event_query/2"},{"id":"dynamic_filter_condition/3","deprecated":false,"title":"dynamic_filter_condition(query, filter_key, db_field)","anchor":"dynamic_filter_condition/3"},{"id":"filter_by_entry_props/2","deprecated":false,"title":"filter_by_entry_props(sessions_q, query)","anchor":"filter_by_entry_props/2"},{"id":"filter_converted_sessions/3","deprecated":false,"title":"filter_converted_sessions(db_query, site, query)","anchor":"filter_converted_sessions/3"},{"id":"page_regex/1","deprecated":false,"title":"page_regex(expr)","anchor":"page_regex/1"},{"id":"query_events/2","deprecated":false,"title":"query_events(site, query)","anchor":"query_events/2"},{"id":"query_sessions/2","deprecated":false,"title":"query_sessions(site, query)","anchor":"query_sessions/2"},{"id":"select_event_metrics/2","deprecated":false,"title":"select_event_metrics(q, list)","anchor":"select_event_metrics/2"},{"id":"select_session_metrics/3","deprecated":false,"title":"select_session_metrics(q, list, query)","anchor":"select_session_metrics/3"},{"id":"utc_boundaries/2","deprecated":false,"title":"utc_boundaries(query, site)","anchor":"utc_boundaries/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Breakdown","deprecated":false,"group":"","title":"Plausible.Stats.Breakdown","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"breakdown/5","deprecated":false,"title":"breakdown(site, query, property, metrics, pagination)","anchor":"breakdown/5"}],"key":"functions"}]},{"id":"Plausible.Stats.Clickhouse","deprecated":false,"group":"","title":"Plausible.Stats.Clickhouse","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"current_visitors/2","deprecated":false,"title":"current_visitors(site, query)","anchor":"current_visitors/2"},{"id":"empty_24h_visitors_hourly_intervals/2","deprecated":false,"title":"empty_24h_visitors_hourly_intervals(sites, now \\\\ NaiveDateTime.utc_now())","anchor":"empty_24h_visitors_hourly_intervals/2"},{"id":"has_pageviews?/1","deprecated":false,"title":"has_pageviews?(site)","anchor":"has_pageviews?/1"},{"id":"imported_pageview_count/1","deprecated":false,"title":"imported_pageview_count(site)","anchor":"imported_pageview_count/1"},{"id":"last_24h_visitors_hourly_intervals/2","deprecated":false,"title":"last_24h_visitors_hourly_intervals(sites, now \\\\ NaiveDateTime.utc_now())","anchor":"last_24h_visitors_hourly_intervals/2"},{"id":"pageview_start_date_local/1","deprecated":false,"title":"pageview_start_date_local(site)","anchor":"pageview_start_date_local/1"},{"id":"top_sources/6","deprecated":false,"title":"top_sources(site, query, limit, page, show_noref \\\\ false, include_details)","anchor":"top_sources/6"},{"id":"usage_breakdown/2","deprecated":false,"title":"usage_breakdown(domains, date_range)","anchor":"usage_breakdown/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Compare","deprecated":false,"group":"","title":"Plausible.Stats.Compare","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"calculate_change/3","deprecated":false,"title":"calculate_change(arg1, old_count, new_count)","anchor":"calculate_change/3"},{"id":"percent_change/2","deprecated":false,"title":"percent_change(old_count, new_count)","anchor":"percent_change/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Comparisons","deprecated":false,"group":"","title":"Plausible.Stats.Comparisons","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"mode/0","deprecated":false,"title":"mode()","anchor":"t:mode/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"compare/4","deprecated":false,"title":"compare(site, source_query, mode, opts \\\\ [])","anchor":"compare/4"}],"key":"functions"}]},{"id":"Plausible.Stats.CurrentVisitors","deprecated":false,"group":"","title":"Plausible.Stats.CurrentVisitors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"current_visitors/1","deprecated":false,"title":"current_visitors(site)","anchor":"current_visitors/1"}],"key":"functions"}]},{"id":"Plausible.Stats.CustomProps","deprecated":false,"group":"","title":"Plausible.Stats.CustomProps","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_prop_names/2","deprecated":false,"title":"fetch_prop_names(site, query)","anchor":"fetch_prop_names/2"},{"id":"maybe_allowed_props_only/2","deprecated":false,"title":"maybe_allowed_props_only(q, allowed_props)","anchor":"maybe_allowed_props_only/2"},{"id":"props_for_all_event_names/2","deprecated":false,"title":"props_for_all_event_names(site, query)","anchor":"props_for_all_event_names/2"}],"key":"functions"}]},{"id":"Plausible.Stats.EmailReport","deprecated":false,"group":"","title":"Plausible.Stats.EmailReport","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/2","deprecated":false,"title":"get(site, query)","anchor":"get/2"}],"key":"functions"}]},{"id":"Plausible.Stats.FilterParser","deprecated":false,"group":"","title":"Plausible.Stats.FilterParser","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"parse_filters/1","deprecated":false,"title":"parse_filters(filters)","anchor":"parse_filters/1"}],"key":"functions"}]},{"id":"Plausible.Stats.FilterSuggestions","deprecated":false,"group":"","title":"Plausible.Stats.FilterSuggestions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"filter_suggestions/4","deprecated":false,"title":"filter_suggestions(site, query, filter_name, filter_search)","anchor":"filter_suggestions/4"}],"key":"functions"}]},{"id":"Plausible.Stats.Filters","deprecated":false,"group":"","title":"Plausible.Stats.Filters","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_prefix/1","deprecated":false,"title":"add_prefix(query)","anchor":"add_prefix/1"},{"id":"visit_props/0","deprecated":false,"title":"visit_props()","anchor":"visit_props/0"}],"key":"functions"}]},{"id":"Plausible.Stats.Fragments","deprecated":false,"group":"","title":"Plausible.Stats.Fragments","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bounce_rate/0","deprecated":false,"title":"bounce_rate()","anchor":"bounce_rate/0"},{"id":"coalesce_string/2","deprecated":false,"title":"coalesce_string(fieldA, fieldB)","anchor":"coalesce_string/2"},{"id":"sample_percent/0","deprecated":false,"title":"sample_percent()","anchor":"sample_percent/0"},{"id":"to_timezone/2","deprecated":false,"title":"to_timezone(date, timezone)","anchor":"to_timezone/2"},{"id":"total/0","deprecated":false,"title":"total()","anchor":"total/0"},{"id":"uniq/1","deprecated":false,"title":"uniq(user_id)","anchor":"uniq/1"},{"id":"visit_duration/0","deprecated":false,"title":"visit_duration()","anchor":"visit_duration/0"},{"id":"weekstart_not_before/2","deprecated":false,"title":"weekstart_not_before(date, not_before)","anchor":"weekstart_not_before/2"},{"id":"weekstart_not_before/3","deprecated":false,"title":"weekstart_not_before(date, not_before, timezone)","anchor":"weekstart_not_before/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Funnel","deprecated":false,"group":"","title":"Plausible.Stats.Funnel","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"funnel/3","deprecated":false,"title":"funnel(site, query, funnel_id)","anchor":"funnel/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Goal.Revenue","deprecated":false,"group":"","title":"Plausible.Stats.Goal.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"average_revenue_query/1","deprecated":false,"title":"average_revenue_query(query)","anchor":"average_revenue_query/1"},{"id":"cast_revenue_metrics_to_money/2","deprecated":false,"title":"cast_revenue_metrics_to_money(results, revenue_goals)","anchor":"cast_revenue_metrics_to_money/2"},{"id":"get_revenue_tracking_currency/3","deprecated":false,"title":"get_revenue_tracking_currency(site, query, metrics)","anchor":"get_revenue_tracking_currency/3"},{"id":"revenue_metrics/0","deprecated":false,"title":"revenue_metrics()","anchor":"revenue_metrics/0"},{"id":"total_revenue_query/1","deprecated":false,"title":"total_revenue_query(query)","anchor":"total_revenue_query/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported","deprecated":false,"group":"","title":"Plausible.Stats.Imported","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"merge_imported/5","deprecated":false,"title":"merge_imported(q, site, query, property, metrics)","anchor":"merge_imported/5"},{"id":"merge_imported_timeseries/4","deprecated":false,"title":"merge_imported_timeseries(native_q, site, query, metrics)","anchor":"merge_imported_timeseries/4"}],"key":"functions"}]},{"id":"Plausible.Stats.Interval","deprecated":false,"group":"","title":"Plausible.Stats.Interval","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"opt/0","deprecated":false,"title":"opt()","anchor":"t:opt/0"},{"id":"opts/0","deprecated":false,"title":"opts()","anchor":"t:opts/0"},{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"default_for_date_range/1","deprecated":false,"title":"default_for_date_range(range)","anchor":"default_for_date_range/1"},{"id":"default_for_period/1","deprecated":false,"title":"default_for_period(period)","anchor":"default_for_period/1"},{"id":"list/0","deprecated":false,"title":"list()","anchor":"list/0"},{"id":"valid?/1","deprecated":false,"title":"valid?(interval)","anchor":"valid?/1"},{"id":"valid_by_period/1","deprecated":false,"title":"valid_by_period(opts \\\\ [])","anchor":"valid_by_period/1"},{"id":"valid_for_period?/3","deprecated":false,"title":"valid_for_period?(period, interval, opts \\\\ [])","anchor":"valid_for_period?/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Props","deprecated":false,"group":"","title":"Plausible.Stats.Props","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event_props/0","deprecated":false,"title":"event_props()","anchor":"event_props/0"},{"id":"valid_prop?/1","deprecated":false,"title":"valid_prop?(prop)","anchor":"valid_prop?/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Query","deprecated":false,"group":"","title":"Plausible.Stats.Query","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"from/2","deprecated":false,"title":"from(site, params)","anchor":"from/2"},{"id":"get_filter_by_prefix/2","deprecated":false,"title":"get_filter_by_prefix(query, prefix)","anchor":"get_filter_by_prefix/2"},{"id":"has_event_filters?/1","deprecated":false,"title":"has_event_filters?(query)","anchor":"has_event_filters?/1"},{"id":"include_imported?/3","deprecated":false,"title":"include_imported?(query, site, requested?)","anchor":"include_imported?/3"},{"id":"put_filter/3","deprecated":false,"title":"put_filter(query, key, val)","anchor":"put_filter/3"},{"id":"remove_event_filters/2","deprecated":false,"title":"remove_event_filters(query, opts)","anchor":"remove_event_filters/2"},{"id":"trace/1","deprecated":false,"title":"trace(query)","anchor":"trace/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Sampling","deprecated":false,"group":"","title":"Plausible.Stats.Sampling","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_query_hint/1","deprecated":false,"title":"add_query_hint(query)","anchor":"add_query_hint/1"},{"id":"add_query_hint/2","deprecated":false,"title":"add_query_hint(db_query, query)","anchor":"add_query_hint/2"},{"id":"put_threshold/2","deprecated":false,"title":"put_threshold(query, params)","anchor":"put_threshold/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Timeseries","deprecated":false,"group":"","title":"Plausible.Stats.Timeseries","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"results/0","deprecated":false,"title":"results()","anchor":"t:results/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"timeseries/3","deprecated":false,"title":"timeseries(site, query, metrics)","anchor":"timeseries/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Util","deprecated":false,"group":"","title":"Plausible.Stats.Util","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"remove_internal_visits_metric/1","deprecated":false,"title":"remove_internal_visits_metric(result)","anchor":"remove_internal_visits_metric/1"},{"id":"remove_internal_visits_metric/2","deprecated":false,"title":"remove_internal_visits_metric(results, metrics)","anchor":"remove_internal_visits_metric/2"}],"key":"functions"}]},{"id":"Plausible.Test.Support.HTML","deprecated":false,"group":"","title":"Plausible.Test.Support.HTML","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"class_of_element/2","deprecated":false,"title":"class_of_element(html, element)","anchor":"class_of_element/2"},{"id":"element_exists?/2","deprecated":false,"title":"element_exists?(html, selector)","anchor":"element_exists?/2"},{"id":"find/2","deprecated":false,"title":"find(html, value)","anchor":"find/2"},{"id":"form_exists?/2","deprecated":false,"title":"form_exists?(html, action_path)","anchor":"form_exists?/2"},{"id":"name_of/1","deprecated":false,"title":"name_of(element)","anchor":"name_of/1"},{"id":"submit_button/2","deprecated":false,"title":"submit_button(html, form)","anchor":"submit_button/2"},{"id":"text/1","deprecated":false,"title":"text(element)","anchor":"text/1"},{"id":"text_of_attr/2","deprecated":false,"title":"text_of_attr(element, attr)","anchor":"text_of_attr/2"},{"id":"text_of_attr/3","deprecated":false,"title":"text_of_attr(html, element, attr)","anchor":"text_of_attr/3"},{"id":"text_of_element/2","deprecated":false,"title":"text_of_element(html, element)","anchor":"text_of_element/2"}],"key":"functions"}]},{"id":"Plausible.Test.Support.HTTPMocker","deprecated":false,"group":"","title":"Plausible.Test.Support.HTTPMocker","sections":[]},{"id":"Plausible.TestUtils","deprecated":false,"group":"","title":"Plausible.TestUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_imported_data/1","deprecated":false,"title":"add_imported_data(map)","anchor":"add_imported_data/1"},{"id":"await_clickhouse_count/2","deprecated":false,"title":"await_clickhouse_count(query, expected)","anchor":"await_clickhouse_count/2"},{"id":"create_api_key/1","deprecated":false,"title":"create_api_key(map)","anchor":"create_api_key/1"},{"id":"create_events/1","deprecated":false,"title":"create_events(events)","anchor":"create_events/1"},{"id":"create_new_site/1","deprecated":false,"title":"create_new_site(map)","anchor":"create_new_site/1"},{"id":"create_pageviews/1","deprecated":false,"title":"create_pageviews(pageviews)","anchor":"create_pageviews/1"},{"id":"create_sessions/1","deprecated":false,"title":"create_sessions(sessions)","anchor":"create_sessions/1"},{"id":"create_site/1","deprecated":false,"title":"create_site(map)","anchor":"create_site/1"},{"id":"create_user/1","deprecated":false,"title":"create_user(_)","anchor":"create_user/1"},{"id":"eventually/3","deprecated":false,"title":"eventually(expectation, wait_time_ms \\\\ 50, retries \\\\ 10)","anchor":"eventually/3"},{"id":"generate_usage_for/3","deprecated":false,"title":"generate_usage_for(site, i, timestamp \\\\ NaiveDateTime.utc_now())","anchor":"generate_usage_for/3"},{"id":"init_session/1","deprecated":false,"title":"init_session(conn)","anchor":"init_session/1"},{"id":"log_in/1","deprecated":false,"title":"log_in(map)","anchor":"log_in/1"},{"id":"patch_env/2","deprecated":false,"title":"patch_env(env_key, value)","anchor":"patch_env/2"},{"id":"populate_stats/1","deprecated":false,"title":"populate_stats(events)","anchor":"populate_stats/1"},{"id":"populate_stats/2","deprecated":false,"title":"populate_stats(site, events)","anchor":"populate_stats/2"},{"id":"random_ip/0","deprecated":false,"title":"random_ip()","anchor":"random_ip/0"},{"id":"relative_time/1","deprecated":false,"title":"relative_time(shifts)","anchor":"relative_time/1"},{"id":"setup_patch_env/2","deprecated":false,"title":"setup_patch_env(env_key, value)","anchor":"setup_patch_env/2"},{"id":"to_naive_truncate/1","deprecated":false,"title":"to_naive_truncate(dt)","anchor":"to_naive_truncate/1"},{"id":"use_api_key/1","deprecated":false,"title":"use_api_key(map)","anchor":"use_api_key/1"}],"key":"functions"}]},{"id":"Plausible.Themes","deprecated":false,"group":"","title":"Plausible.Themes","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"options/0","deprecated":false,"title":"options()","anchor":"options/0"}],"key":"functions"}]},{"id":"Plausible.Timezones","deprecated":false,"group":"","title":"Plausible.Timezones","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"options/1","deprecated":false,"title":"options(now \\\\ DateTime.utc_now())","anchor":"options/1"},{"id":"to_date_in_timezone/2","deprecated":false,"title":"to_date_in_timezone(dt, timezone)","anchor":"to_date_in_timezone/2"},{"id":"to_utc_datetime/2","deprecated":false,"title":"to_utc_datetime(naive_date_time, timezone)","anchor":"to_utc_datetime/2"}],"key":"functions"}]},{"id":"Plausible.Users","deprecated":false,"group":"","title":"Plausible.Users","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept_traffic_until/1","deprecated":false,"title":"accept_traffic_until(user)","anchor":"accept_traffic_until/1"},{"id":"allow_next_upgrade_override/1","deprecated":false,"title":"allow_next_upgrade_override(user)","anchor":"allow_next_upgrade_override/1"},{"id":"has_email_code?/1","deprecated":false,"title":"has_email_code?(user)","anchor":"has_email_code?/1"},{"id":"maybe_reset_next_upgrade_override/1","deprecated":false,"title":"maybe_reset_next_upgrade_override(user)","anchor":"maybe_reset_next_upgrade_override/1"},{"id":"update_accept_traffic_until/1","deprecated":false,"title":"update_accept_traffic_until(user)","anchor":"update_accept_traffic_until/1"},{"id":"with_subscription/1","deprecated":false,"title":"with_subscription(user)","anchor":"with_subscription/1"}],"key":"functions"}]},{"id":"Plausible.Workers.AcceptTrafficUntil","deprecated":false,"group":"","title":"Plausible.Workers.AcceptTrafficUntil","sections":[]},{"id":"Plausible.Workers.CheckUsage","deprecated":false,"group":"","title":"Plausible.Workers.CheckUsage","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check_enterprise_subscriber/2","deprecated":false,"title":"check_enterprise_subscriber(subscriber, quota_mod)","anchor":"check_enterprise_subscriber/2"},{"id":"day_of_month/1","deprecated":false,"title":"day_of_month(date)","anchor":"day_of_month/1"},{"id":"exceeds_last_two_usage_cycles?/2","deprecated":false,"title":"exceeds_last_two_usage_cycles?(usage, limit)","anchor":"exceeds_last_two_usage_cycles?/2"},{"id":"last_day_of_month/1","deprecated":false,"title":"last_day_of_month(day)","anchor":"last_day_of_month/1"},{"id":"least/2","deprecated":false,"title":"least(left, right)","anchor":"least/2"},{"id":"yesterday/0","deprecated":false,"title":"yesterday()","anchor":"yesterday/0"}],"key":"functions"}]},{"id":"Plausible.Workers.CleanInvitations","deprecated":false,"group":"","title":"Plausible.Workers.CleanInvitations","sections":[]},{"id":"Plausible.Workers.ExpireDomainChangeTransitions","deprecated":false,"group":"","title":"Plausible.Workers.ExpireDomainChangeTransitions","sections":[]},{"id":"Plausible.Workers.ImportGoogleAnalytics","deprecated":false,"group":"","title":"Plausible.Workers.ImportGoogleAnalytics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import_failed/1","deprecated":false,"title":"import_failed(site)","anchor":"import_failed/1"}],"key":"functions"}]},{"id":"Plausible.Workers.LockSites","deprecated":false,"group":"","title":"Plausible.Workers.LockSites","sections":[]},{"id":"Plausible.Workers.NotifyAnnualRenewal","deprecated":false,"group":"","title":"Plausible.Workers.NotifyAnnualRenewal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform/1","deprecated":false,"title":"perform(job)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Plausible.Workers.RotateSalts","deprecated":false,"group":"","title":"Plausible.Workers.RotateSalts","sections":[]},{"id":"Plausible.Workers.ScheduleEmailReports","deprecated":false,"group":"","title":"Plausible.Workers.ScheduleEmailReports","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"first_of_month_9am/1","deprecated":false,"title":"first_of_month_9am(timezone)","anchor":"first_of_month_9am/1"},{"id":"monday_9am/1","deprecated":false,"title":"monday_9am(timezone)","anchor":"monday_9am/1"},{"id":"perform/1","deprecated":false,"title":"perform(job)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Plausible.Workers.SendCheckStatsEmails","deprecated":false,"group":"","title":"Plausible.Workers.SendCheckStatsEmails","sections":[]},{"id":"Plausible.Workers.SendEmailReport","deprecated":false,"group":"","title":"Plausible.Workers.SendEmailReport","sections":[]},{"id":"Plausible.Workers.SendSiteSetupEmails","deprecated":false,"group":"","title":"Plausible.Workers.SendSiteSetupEmails","sections":[]},{"id":"Plausible.Workers.SendTrialNotifications","deprecated":false,"group":"","title":"Plausible.Workers.SendTrialNotifications","sections":[]},{"id":"Plausible.Workers.SpikeNotifier","deprecated":false,"group":"","title":"Plausible.Workers.SpikeNotifier","sections":[]},{"id":"PlausibleWeb","deprecated":false,"group":"","title":"PlausibleWeb","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__using__/1","deprecated":false,"title":"__using__(which)","anchor":"__using__/1"},{"id":"channel/0","deprecated":false,"title":"channel()","anchor":"channel/0"},{"id":"controller/0","deprecated":false,"title":"controller()","anchor":"controller/0"},{"id":"open_api_schema/0","deprecated":false,"title":"open_api_schema()","anchor":"open_api_schema/0"},{"id":"plugins_api_controller/0","deprecated":false,"title":"plugins_api_controller()","anchor":"plugins_api_controller/0"},{"id":"plugins_api_view/0","deprecated":false,"title":"plugins_api_view()","anchor":"plugins_api_view/0"},{"id":"router/0","deprecated":false,"title":"router()","anchor":"router/0"},{"id":"view/0","deprecated":false,"title":"view()","anchor":"view/0"}],"key":"functions"}]},{"id":"PlausibleWeb.AdminController","deprecated":false,"group":"","title":"PlausibleWeb.AdminController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"usage/2","deprecated":false,"title":"usage(conn, params)","anchor":"usage/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.ExternalController","deprecated":false,"group":"","title":"PlausibleWeb.Api.ExternalController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error/2","deprecated":false,"title":"error(conn, params)","anchor":"error/2"},{"id":"event/2","deprecated":false,"title":"event(conn, params)","anchor":"event/2"},{"id":"health/2","deprecated":false,"title":"health(conn, params)","anchor":"health/2"},{"id":"info/2","deprecated":false,"title":"info(conn, params)","anchor":"info/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.ExternalSitesController","deprecated":false,"group":"","title":"PlausibleWeb.Api.ExternalSitesController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_site/2","deprecated":false,"title":"create_site(conn, params)","anchor":"create_site/2"},{"id":"delete_goal/2","deprecated":false,"title":"delete_goal(conn, params)","anchor":"delete_goal/2"},{"id":"delete_site/2","deprecated":false,"title":"delete_site(conn, map)","anchor":"delete_site/2"},{"id":"find_or_create_goal/2","deprecated":false,"title":"find_or_create_goal(conn, params)","anchor":"find_or_create_goal/2"},{"id":"find_or_create_shared_link/2","deprecated":false,"title":"find_or_create_shared_link(conn, params)","anchor":"find_or_create_shared_link/2"},{"id":"get_site/2","deprecated":false,"title":"get_site(conn, map)","anchor":"get_site/2"},{"id":"update_site/2","deprecated":false,"title":"update_site(conn, params)","anchor":"update_site/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.ExternalStatsController","deprecated":false,"group":"","title":"PlausibleWeb.Api.ExternalStatsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"aggregate/2","deprecated":false,"title":"aggregate(conn, params)","anchor":"aggregate/2"},{"id":"breakdown/2","deprecated":false,"title":"breakdown(conn, params)","anchor":"breakdown/2"},{"id":"realtime_visitors/2","deprecated":false,"title":"realtime_visitors(conn, params)","anchor":"realtime_visitors/2"},{"id":"timeseries/2","deprecated":false,"title":"timeseries(conn, params)","anchor":"timeseries/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.Helpers","deprecated":false,"group":"","title":"PlausibleWeb.Api.Helpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bad_request/2","deprecated":false,"title":"bad_request(conn, msg)","anchor":"bad_request/2"},{"id":"not_found/2","deprecated":false,"title":"not_found(conn, msg)","anchor":"not_found/2"},{"id":"payment_required/2","deprecated":false,"title":"payment_required(conn, msg)","anchor":"payment_required/2"},{"id":"too_many_requests/2","deprecated":false,"title":"too_many_requests(conn, msg)","anchor":"too_many_requests/2"},{"id":"unauthorized/2","deprecated":false,"title":"unauthorized(conn, msg)","anchor":"unauthorized/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.InternalController","deprecated":false,"group":"","title":"PlausibleWeb.Api.InternalController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"disable_feature/2","deprecated":false,"title":"disable_feature(conn, map)","anchor":"disable_feature/2"},{"id":"domain_status/2","deprecated":false,"title":"domain_status(conn, map)","anchor":"domain_status/2"},{"id":"sites/2","deprecated":false,"title":"sites(conn, params)","anchor":"sites/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.PaddleController","deprecated":false,"group":"","title":"PlausibleWeb.Api.PaddleController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"verified_signature?/1","deprecated":false,"title":"verified_signature?(params)","anchor":"verified_signature?/1"},{"id":"verify_signature/2","deprecated":false,"title":"verify_signature(conn, opts)","anchor":"verify_signature/2"},{"id":"webhook/2","deprecated":false,"title":"webhook(conn, params)","anchor":"webhook/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Api.StatsController","deprecated":false,"group":"","title":"PlausibleWeb.Api.StatsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_custom_prop_values/2","deprecated":false,"title":"all_custom_prop_values(conn, params)","anchor":"all_custom_prop_values/2"},{"id":"browser_versions/2","deprecated":false,"title":"browser_versions(conn, params)","anchor":"browser_versions/2"},{"id":"browsers/2","deprecated":false,"title":"browsers(conn, params)","anchor":"browsers/2"},{"id":"cities/2","deprecated":false,"title":"cities(conn, params)","anchor":"cities/2"},{"id":"conversions/2","deprecated":false,"title":"conversions(conn, params)","anchor":"conversions/2"},{"id":"countries/2","deprecated":false,"title":"countries(conn, params)","anchor":"countries/2"},{"id":"current_visitors/2","deprecated":false,"title":"current_visitors(conn, _)","anchor":"current_visitors/2"},{"id":"custom_prop_values/2","deprecated":false,"title":"custom_prop_values(conn, params)","anchor":"custom_prop_values/2"},{"id":"entry_pages/2","deprecated":false,"title":"entry_pages(conn, params)","anchor":"entry_pages/2"},{"id":"exit_pages/2","deprecated":false,"title":"exit_pages(conn, params)","anchor":"exit_pages/2"},{"id":"filter_suggestions/2","deprecated":false,"title":"filter_suggestions(conn, params)","anchor":"filter_suggestions/2"},{"id":"format_money/1","deprecated":false,"title":"format_money(money)","anchor":"format_money/1"},{"id":"format_revenue_metric/1","deprecated":false,"title":"format_revenue_metric(metric_value)","anchor":"format_revenue_metric/1"},{"id":"funnel/2","deprecated":false,"title":"funnel(conn, params)","anchor":"funnel/2"},{"id":"main_graph/2","deprecated":false,"title":"main_graph(conn, params)","anchor":"main_graph/2"},{"id":"operating_system_versions/2","deprecated":false,"title":"operating_system_versions(conn, params)","anchor":"operating_system_versions/2"},{"id":"operating_systems/2","deprecated":false,"title":"operating_systems(conn, params)","anchor":"operating_systems/2"},{"id":"pages/2","deprecated":false,"title":"pages(conn, params)","anchor":"pages/2"},{"id":"referrer_drilldown/2","deprecated":false,"title":"referrer_drilldown(conn, params)","anchor":"referrer_drilldown/2"},{"id":"referrers/2","deprecated":false,"title":"referrers(conn, params)","anchor":"referrers/2"},{"id":"regions/2","deprecated":false,"title":"regions(conn, params)","anchor":"regions/2"},{"id":"screen_sizes/2","deprecated":false,"title":"screen_sizes(conn, params)","anchor":"screen_sizes/2"},{"id":"sources/2","deprecated":false,"title":"sources(conn, params)","anchor":"sources/2"},{"id":"top_stats/2","deprecated":false,"title":"top_stats(conn, params)","anchor":"top_stats/2"},{"id":"utm_campaigns/2","deprecated":false,"title":"utm_campaigns(conn, params)","anchor":"utm_campaigns/2"},{"id":"utm_contents/2","deprecated":false,"title":"utm_contents(conn, params)","anchor":"utm_contents/2"},{"id":"utm_mediums/2","deprecated":false,"title":"utm_mediums(conn, params)","anchor":"utm_mediums/2"},{"id":"utm_sources/2","deprecated":false,"title":"utm_sources(conn, params)","anchor":"utm_sources/2"},{"id":"utm_terms/2","deprecated":false,"title":"utm_terms(conn, params)","anchor":"utm_terms/2"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthController","deprecated":false,"group":"","title":"PlausibleWeb.AuthController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"activate/2","deprecated":false,"title":"activate(conn, map)","anchor":"activate/2"},{"id":"activate_form/2","deprecated":false,"title":"activate_form(conn, params)","anchor":"activate_form/2"},{"id":"cancel_update_email/2","deprecated":false,"title":"cancel_update_email(conn, params)","anchor":"cancel_update_email/2"},{"id":"create_api_key/2","deprecated":false,"title":"create_api_key(conn, map)","anchor":"create_api_key/2"},{"id":"delete_api_key/2","deprecated":false,"title":"delete_api_key(conn, map)","anchor":"delete_api_key/2"},{"id":"delete_me/2","deprecated":false,"title":"delete_me(conn, params)","anchor":"delete_me/2"},{"id":"disable_2fa/2","deprecated":false,"title":"disable_2fa(conn, map)","anchor":"disable_2fa/2"},{"id":"generate_2fa_recovery_codes/2","deprecated":false,"title":"generate_2fa_recovery_codes(conn, map)","anchor":"generate_2fa_recovery_codes/2"},{"id":"google_auth_callback/2","deprecated":false,"title":"google_auth_callback(conn, params)","anchor":"google_auth_callback/2"},{"id":"initiate_2fa_setup/2","deprecated":false,"title":"initiate_2fa_setup(conn, params)","anchor":"initiate_2fa_setup/2"},{"id":"login/2","deprecated":false,"title":"login(conn, map)","anchor":"login/2"},{"id":"login_form/2","deprecated":false,"title":"login_form(conn, params)","anchor":"login_form/2"},{"id":"logout/2","deprecated":false,"title":"logout(conn, params)","anchor":"logout/2"},{"id":"new_api_key/2","deprecated":false,"title":"new_api_key(conn, params)","anchor":"new_api_key/2"},{"id":"password_reset/2","deprecated":false,"title":"password_reset(conn, params)","anchor":"password_reset/2"},{"id":"password_reset_form/2","deprecated":false,"title":"password_reset_form(conn, params)","anchor":"password_reset_form/2"},{"id":"password_reset_request/2","deprecated":false,"title":"password_reset_request(conn, params)","anchor":"password_reset_request/2"},{"id":"password_reset_request_form/2","deprecated":false,"title":"password_reset_request_form(conn, _)","anchor":"password_reset_request_form/2"},{"id":"register/2","deprecated":false,"title":"register(conn, map)","anchor":"register/2"},{"id":"register_from_invitation/2","deprecated":false,"title":"register_from_invitation(conn, map)","anchor":"register_from_invitation/2"},{"id":"request_activation_code/2","deprecated":false,"title":"request_activation_code(conn, params)","anchor":"request_activation_code/2"},{"id":"save_settings/2","deprecated":false,"title":"save_settings(conn, map)","anchor":"save_settings/2"},{"id":"update_email/2","deprecated":false,"title":"update_email(conn, map)","anchor":"update_email/2"},{"id":"user_settings/2","deprecated":false,"title":"user_settings(conn, params)","anchor":"user_settings/2"},{"id":"verify_2fa/2","deprecated":false,"title":"verify_2fa(conn, params)","anchor":"verify_2fa/2"},{"id":"verify_2fa_form/2","deprecated":false,"title":"verify_2fa_form(conn, _)","anchor":"verify_2fa_form/2"},{"id":"verify_2fa_recovery_code/2","deprecated":false,"title":"verify_2fa_recovery_code(conn, map)","anchor":"verify_2fa_recovery_code/2"},{"id":"verify_2fa_recovery_code_form/2","deprecated":false,"title":"verify_2fa_recovery_code_form(conn, params)","anchor":"verify_2fa_recovery_code_form/2"},{"id":"verify_2fa_setup/2","deprecated":false,"title":"verify_2fa_setup(conn, map)","anchor":"verify_2fa_setup/2"},{"id":"verify_2fa_setup_form/2","deprecated":false,"title":"verify_2fa_setup_form(conn, params)","anchor":"verify_2fa_setup_form/2"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthPlug","deprecated":false,"group":"","title":"PlausibleWeb.AuthPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthView","deprecated":false,"group":"","title":"PlausibleWeb.AuthView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"activate.html/1","deprecated":false,"title":"activate.html(assigns)","anchor":"activate.html/1"},{"id":"delimit_integer/1","deprecated":false,"title":"delimit_integer(number)","anchor":"delimit_integer/1"},{"id":"format_invoices/1","deprecated":false,"title":"format_invoices(invoice_list)","anchor":"format_invoices/1"},{"id":"generate_2fa_recovery_codes.html/1","deprecated":false,"title":"generate_2fa_recovery_codes.html(assigns)","anchor":"generate_2fa_recovery_codes.html/1"},{"id":"initiate_2fa_setup.html/1","deprecated":false,"title":"initiate_2fa_setup.html(assigns)","anchor":"initiate_2fa_setup.html/1"},{"id":"login_form.html/1","deprecated":false,"title":"login_form.html(assigns)","anchor":"login_form.html/1"},{"id":"new_api_key.html/1","deprecated":false,"title":"new_api_key.html(assigns)","anchor":"new_api_key.html/1"},{"id":"password_reset_form.html/1","deprecated":false,"title":"password_reset_form.html(assigns)","anchor":"password_reset_form.html/1"},{"id":"password_reset_request_form.html/1","deprecated":false,"title":"password_reset_request_form.html(assigns)","anchor":"password_reset_request_form.html/1"},{"id":"password_reset_request_success.html/1","deprecated":false,"title":"password_reset_request_success.html(assigns)","anchor":"password_reset_request_success.html/1"},{"id":"present_subscription_status/1","deprecated":false,"title":"present_subscription_status(status)","anchor":"present_subscription_status/1"},{"id":"register_success.html/1","deprecated":false,"title":"register_success.html(assigns)","anchor":"register_success.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"subscription_colors/1","deprecated":false,"title":"subscription_colors(_)","anchor":"subscription_colors/1"},{"id":"subscription_interval/1","deprecated":false,"title":"subscription_interval(subscription)","anchor":"subscription_interval/1"},{"id":"subscription_quota/2","deprecated":false,"title":"subscription_quota(subscription, options \\\\ [])","anchor":"subscription_quota/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"user_settings.html/1","deprecated":false,"title":"user_settings.html(assigns)","anchor":"user_settings.html/1"},{"id":"verify_2fa.html/1","deprecated":false,"title":"verify_2fa.html(assigns)","anchor":"verify_2fa.html/1"},{"id":"verify_2fa_recovery_code.html/1","deprecated":false,"title":"verify_2fa_recovery_code.html(assigns)","anchor":"verify_2fa_recovery_code.html/1"},{"id":"verify_2fa_setup.html/1","deprecated":false,"title":"verify_2fa_setup.html(assigns)","anchor":"verify_2fa_setup.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthorizeSiteAccess","deprecated":false,"group":"","title":"PlausibleWeb.AuthorizeSiteAccess","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, allowed_roles)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(allowed_roles)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthorizeSitesApiPlug","deprecated":false,"group":"","title":"PlausibleWeb.AuthorizeSitesApiPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AuthorizeStatsApiPlug","deprecated":false,"group":"","title":"PlausibleWeb.AuthorizeStatsApiPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.AvatarController","deprecated":false,"group":"","title":"PlausibleWeb.AvatarController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"avatar/2","deprecated":false,"title":"avatar(conn, params)","anchor":"avatar/2"}],"key":"functions"}]},{"id":"PlausibleWeb.BillingController","deprecated":false,"group":"","title":"PlausibleWeb.BillingController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"change_plan/2","deprecated":false,"title":"change_plan(conn, map)","anchor":"change_plan/2"},{"id":"change_plan_preview/2","deprecated":false,"title":"change_plan_preview(conn, map)","anchor":"change_plan_preview/2"},{"id":"choose_plan/2","deprecated":false,"title":"choose_plan(conn, params)","anchor":"choose_plan/2"},{"id":"ping_subscription/2","deprecated":false,"title":"ping_subscription(conn, params)","anchor":"ping_subscription/2"},{"id":"upgrade_success/2","deprecated":false,"title":"upgrade_success(conn, params)","anchor":"upgrade_success/2"},{"id":"upgrade_to_enterprise_plan/2","deprecated":false,"title":"upgrade_to_enterprise_plan(conn, params)","anchor":"upgrade_to_enterprise_plan/2"}],"key":"functions"}]},{"id":"PlausibleWeb.BillingView","deprecated":false,"group":"","title":"PlausibleWeb.BillingView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"change_enterprise_plan_contact_us.html/1","deprecated":false,"title":"change_enterprise_plan_contact_us.html(assigns)","anchor":"change_enterprise_plan_contact_us.html/1"},{"id":"change_plan_preview.html/1","deprecated":false,"title":"change_plan_preview.html(assigns)","anchor":"change_plan_preview.html/1"},{"id":"choose_plan.html/1","deprecated":false,"title":"choose_plan.html(assigns)","anchor":"choose_plan.html/1"},{"id":"present_currency/1","deprecated":false,"title":"present_currency(arg)","anchor":"present_currency/1"},{"id":"present_date/1","deprecated":false,"title":"present_date(date)","anchor":"present_date/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"upgrade_success.html/1","deprecated":false,"title":"upgrade_success.html(assigns)","anchor":"upgrade_success.html/1"},{"id":"upgrade_to_enterprise_plan.html/1","deprecated":false,"title":"upgrade_to_enterprise_plan.html(assigns)","anchor":"upgrade_to_enterprise_plan.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.CRMAuthPlug","deprecated":false,"group":"","title":"PlausibleWeb.CRMAuthPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Captcha","deprecated":false,"group":"","title":"PlausibleWeb.Captcha","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"},{"id":"sitekey/0","deprecated":false,"title":"sitekey()","anchor":"sitekey/0"},{"id":"verify/1","deprecated":false,"title":"verify(token)","anchor":"verify/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Billing.PlanBenefits","deprecated":false,"group":"","title":"PlausibleWeb.Components.Billing.PlanBenefits","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"for_business/2","deprecated":false,"title":"for_business(plan, growth_benefits)","anchor":"for_business/2"},{"id":"for_enterprise/1","deprecated":false,"title":"for_enterprise(business_benefits)","anchor":"for_enterprise/1"},{"id":"for_growth/1","deprecated":false,"title":"for_growth(plan)","anchor":"for_growth/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Generic","deprecated":false,"group":"","title":"PlausibleWeb.Components.Generic","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"button/1","deprecated":false,"title":"button(assigns)","anchor":"button/1"},{"id":"button_link/1","deprecated":false,"title":"button_link(assigns)","anchor":"button_link/1"},{"id":"docs_info/1","deprecated":false,"title":"docs_info(assigns)","anchor":"docs_info/1"},{"id":"dropdown/1","deprecated":false,"title":"dropdown(assigns)","anchor":"dropdown/1"},{"id":"dropdown_link/1","deprecated":false,"title":"dropdown_link(assigns)","anchor":"dropdown_link/1"},{"id":"notice/1","deprecated":false,"title":"notice(assigns)","anchor":"notice/1"},{"id":"spinner/1","deprecated":false,"title":"spinner(assigns)","anchor":"spinner/1"},{"id":"styled_link/1","deprecated":false,"title":"styled_link(assigns)","anchor":"styled_link/1"},{"id":"unstyled_link/1","deprecated":false,"title":"unstyled_link(assigns)","anchor":"unstyled_link/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Google","deprecated":false,"group":"","title":"PlausibleWeb.Components.Google","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"button/1","deprecated":false,"title":"button(assigns)","anchor":"button/1"},{"id":"logo/1","deprecated":false,"title":"logo(assigns \\\\ %{})","anchor":"logo/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Settings","deprecated":false,"group":"","title":"PlausibleWeb.Components.Settings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"settings_google_import/1","deprecated":false,"title":"settings_google_import(assigns)","anchor":"settings_google_import/1"},{"id":"settings_search_console/1","deprecated":false,"title":"settings_search_console(assigns)","anchor":"settings_search_console/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.Site.Feature","deprecated":false,"group":"","title":"PlausibleWeb.Components.Site.Feature","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"target/4","deprecated":false,"title":"target(site, setting, conn, set_to)","anchor":"target/4"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"toggle/1","deprecated":false,"title":"toggle(assigns)","anchor":"toggle/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.TwoFactor","deprecated":false,"group":"","title":"PlausibleWeb.Components.TwoFactor","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"modal/1","deprecated":false,"title":"modal(assigns)","anchor":"modal/1"},{"id":"qr_code/1","deprecated":false,"title":"qr_code(assigns)","anchor":"qr_code/1"},{"id":"verify_2fa_input/1","deprecated":false,"title":"verify_2fa_input(assigns)","anchor":"verify_2fa_input/1"}],"key":"functions"}]},{"id":"PlausibleWeb.ConnCase","deprecated":false,"group":"","title":"PlausibleWeb.ConnCase","sections":[]},{"id":"PlausibleWeb.ControllerHelpers","deprecated":false,"group":"","title":"PlausibleWeb.ControllerHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render_error/2","deprecated":false,"title":"render_error(conn, status)","anchor":"render_error/2"},{"id":"render_error/3","deprecated":false,"title":"render_error(conn, status, message)","anchor":"render_error/3"}],"key":"functions"}]},{"id":"PlausibleWeb.Controllers.API.Revenue","deprecated":false,"group":"","title":"PlausibleWeb.Controllers.API.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"format_money/1","deprecated":false,"title":"format_money(value)","anchor":"format_money/1"},{"id":"format_revenue_metric/1","deprecated":false,"title":"format_revenue_metric(arg)","anchor":"format_revenue_metric/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Dogfood","deprecated":false,"group":"","title":"PlausibleWeb.Dogfood","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api_destination/0","deprecated":false,"title":"api_destination()","anchor":"api_destination/0"},{"id":"domain/1","deprecated":false,"title":"domain(conn)","anchor":"domain/1"},{"id":"script_url/0","deprecated":false,"title":"script_url()","anchor":"script_url/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Email","deprecated":false,"group":"","title":"PlausibleWeb.Email","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"activation_email/2","deprecated":false,"title":"activation_email(user, code)","anchor":"activation_email/2"},{"id":"approaching_accept_traffic_until/1","deprecated":false,"title":"approaching_accept_traffic_until(notification)","anchor":"approaching_accept_traffic_until/1"},{"id":"approaching_accept_traffic_until_tomorrow/1","deprecated":false,"title":"approaching_accept_traffic_until_tomorrow(notification)","anchor":"approaching_accept_traffic_until_tomorrow/1"},{"id":"base_email/0","deprecated":false,"title":"base_email()","anchor":"base_email/0"},{"id":"base_email/1","deprecated":false,"title":"base_email(map)","anchor":"base_email/1"},{"id":"cancellation_email/1","deprecated":false,"title":"cancellation_email(user)","anchor":"cancellation_email/1"},{"id":"check_stats_email/1","deprecated":false,"title":"check_stats_email(user)","anchor":"check_stats_email/1"},{"id":"create_site_email/1","deprecated":false,"title":"create_site_email(user)","anchor":"create_site_email/1"},{"id":"dashboard_locked/3","deprecated":false,"title":"dashboard_locked(user, usage, suggested_plan)","anchor":"dashboard_locked/3"},{"id":"enterprise_over_limit_internal_email/4","deprecated":false,"title":"enterprise_over_limit_internal_email(user, pageview_usage, site_usage, site_allowance)","anchor":"enterprise_over_limit_internal_email/4"},{"id":"error_report/3","deprecated":false,"title":"error_report(reported_by, trace_id, feedback)","anchor":"error_report/3"},{"id":"existing_user_invitation/1","deprecated":false,"title":"existing_user_invitation(invitation)","anchor":"existing_user_invitation/1"},{"id":"import_failure/2","deprecated":false,"title":"import_failure(user, site)","anchor":"import_failure/2"},{"id":"import_success/2","deprecated":false,"title":"import_success(user, site)","anchor":"import_success/2"},{"id":"invitation_accepted/1","deprecated":false,"title":"invitation_accepted(invitation)","anchor":"invitation_accepted/1"},{"id":"invitation_rejected/1","deprecated":false,"title":"invitation_rejected(invitation)","anchor":"invitation_rejected/1"},{"id":"mailer_email_from/0","deprecated":false,"title":"mailer_email_from()","anchor":"mailer_email_from/0"},{"id":"new_user_invitation/1","deprecated":false,"title":"new_user_invitation(invitation)","anchor":"new_user_invitation/1"},{"id":"over_limit_email/3","deprecated":false,"title":"over_limit_email(user, usage, suggested_plan)","anchor":"over_limit_email/3"},{"id":"ownership_transfer_accepted/1","deprecated":false,"title":"ownership_transfer_accepted(invitation)","anchor":"ownership_transfer_accepted/1"},{"id":"ownership_transfer_rejected/1","deprecated":false,"title":"ownership_transfer_rejected(invitation)","anchor":"ownership_transfer_rejected/1"},{"id":"ownership_transfer_request/2","deprecated":false,"title":"ownership_transfer_request(invitation, new_owner_account)","anchor":"ownership_transfer_request/2"},{"id":"password_reset_email/2","deprecated":false,"title":"password_reset_email(email, reset_link)","anchor":"password_reset_email/2"},{"id":"priority_email/0","deprecated":false,"title":"priority_email()","anchor":"priority_email/0"},{"id":"priority_email/1","deprecated":false,"title":"priority_email(map)","anchor":"priority_email/1"},{"id":"render/3","deprecated":false,"title":"render(email, template, assigns \\\\ [])","anchor":"render/3"},{"id":"site_member_removed/1","deprecated":false,"title":"site_member_removed(membership)","anchor":"site_member_removed/1"},{"id":"site_setup_help/2","deprecated":false,"title":"site_setup_help(user, site)","anchor":"site_setup_help/2"},{"id":"site_setup_success/2","deprecated":false,"title":"site_setup_success(user, site)","anchor":"site_setup_success/2"},{"id":"spike_notification/5","deprecated":false,"title":"spike_notification(email, site, current_visitors, sources, dashboard_link)","anchor":"spike_notification/5"},{"id":"stats_report/2","deprecated":false,"title":"stats_report(email, assigns)","anchor":"stats_report/2"},{"id":"trial_one_week_reminder/1","deprecated":false,"title":"trial_one_week_reminder(user)","anchor":"trial_one_week_reminder/1"},{"id":"trial_over_email/1","deprecated":false,"title":"trial_over_email(user)","anchor":"trial_over_email/1"},{"id":"trial_upgrade_email/3","deprecated":false,"title":"trial_upgrade_email(user, day, usage)","anchor":"trial_upgrade_email/3"},{"id":"two_factor_disabled_email/1","deprecated":false,"title":"two_factor_disabled_email(user)","anchor":"two_factor_disabled_email/1"},{"id":"two_factor_enabled_email/1","deprecated":false,"title":"two_factor_enabled_email(user)","anchor":"two_factor_enabled_email/1"},{"id":"welcome_email/1","deprecated":false,"title":"welcome_email(user)","anchor":"welcome_email/1"},{"id":"yearly_expiration_notification/1","deprecated":false,"title":"yearly_expiration_notification(user)","anchor":"yearly_expiration_notification/1"},{"id":"yearly_renewal_notification/1","deprecated":false,"title":"yearly_renewal_notification(user)","anchor":"yearly_renewal_notification/1"}],"key":"functions"}]},{"id":"PlausibleWeb.EmailView","deprecated":false,"group":"","title":"PlausibleWeb.EmailView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"activation_email.html/1","deprecated":false,"title":"activation_email.html(assigns)","anchor":"activation_email.html/1"},{"id":"approaching_accept_traffic_until.html/1","deprecated":false,"title":"approaching_accept_traffic_until.html(assigns)","anchor":"approaching_accept_traffic_until.html/1"},{"id":"cancellation_email.html/1","deprecated":false,"title":"cancellation_email.html(assigns)","anchor":"cancellation_email.html/1"},{"id":"check_stats_email.html/1","deprecated":false,"title":"check_stats_email.html(assigns)","anchor":"check_stats_email.html/1"},{"id":"create_site_email.html/1","deprecated":false,"title":"create_site_email.html(assigns)","anchor":"create_site_email.html/1"},{"id":"dashboard_locked.html/1","deprecated":false,"title":"dashboard_locked.html(assigns)","anchor":"dashboard_locked.html/1"},{"id":"date_format/1","deprecated":false,"title":"date_format(date)","anchor":"date_format/1"},{"id":"enterprise_over_limit_internal.html/1","deprecated":false,"title":"enterprise_over_limit_internal.html(assigns)","anchor":"enterprise_over_limit_internal.html/1"},{"id":"error_report_email.html/1","deprecated":false,"title":"error_report_email.html(assigns)","anchor":"error_report_email.html/1"},{"id":"existing_user_invitation.html/1","deprecated":false,"title":"existing_user_invitation.html(assigns)","anchor":"existing_user_invitation.html/1"},{"id":"google_analytics_import.html/1","deprecated":false,"title":"google_analytics_import.html(assigns)","anchor":"google_analytics_import.html/1"},{"id":"greet_recipient/1","deprecated":false,"title":"greet_recipient(_)","anchor":"greet_recipient/1"},{"id":"invitation_accepted.html/1","deprecated":false,"title":"invitation_accepted.html(assigns)","anchor":"invitation_accepted.html/1"},{"id":"invitation_rejected.html/1","deprecated":false,"title":"invitation_rejected.html(assigns)","anchor":"invitation_rejected.html/1"},{"id":"new_user_invitation.html/1","deprecated":false,"title":"new_user_invitation.html(assigns)","anchor":"new_user_invitation.html/1"},{"id":"over_limit.html/1","deprecated":false,"title":"over_limit.html(assigns)","anchor":"over_limit.html/1"},{"id":"ownership_transfer_accepted.html/1","deprecated":false,"title":"ownership_transfer_accepted.html(assigns)","anchor":"ownership_transfer_accepted.html/1"},{"id":"ownership_transfer_rejected.html/1","deprecated":false,"title":"ownership_transfer_rejected.html(assigns)","anchor":"ownership_transfer_rejected.html/1"},{"id":"ownership_transfer_request.html/1","deprecated":false,"title":"ownership_transfer_request.html(assigns)","anchor":"ownership_transfer_request.html/1"},{"id":"password_reset_email.html/1","deprecated":false,"title":"password_reset_email.html(assigns)","anchor":"password_reset_email.html/1"},{"id":"plausible_url/0","deprecated":false,"title":"plausible_url()","anchor":"plausible_url/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"sentry_link/2","deprecated":false,"title":"sentry_link(trace_id, dsn \\\\ Sentry.Config.dsn())","anchor":"sentry_link/2"},{"id":"site_member_removed.html/1","deprecated":false,"title":"site_member_removed.html(assigns)","anchor":"site_member_removed.html/1"},{"id":"site_setup_help_email.html/1","deprecated":false,"title":"site_setup_help_email.html(assigns)","anchor":"site_setup_help_email.html/1"},{"id":"site_setup_success_email.html/1","deprecated":false,"title":"site_setup_success_email.html(assigns)","anchor":"site_setup_success_email.html/1"},{"id":"spike_notification.html/1","deprecated":false,"title":"spike_notification.html(assigns)","anchor":"spike_notification.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"trial_one_week_reminder.html/1","deprecated":false,"title":"trial_one_week_reminder.html(assigns)","anchor":"trial_one_week_reminder.html/1"},{"id":"trial_over_email.html/1","deprecated":false,"title":"trial_over_email.html(assigns)","anchor":"trial_over_email.html/1"},{"id":"trial_upgrade_email.html/1","deprecated":false,"title":"trial_upgrade_email.html(assigns)","anchor":"trial_upgrade_email.html/1"},{"id":"two_factor_disabled_email.html/1","deprecated":false,"title":"two_factor_disabled_email.html(assigns)","anchor":"two_factor_disabled_email.html/1"},{"id":"two_factor_enabled_email.html/1","deprecated":false,"title":"two_factor_enabled_email.html(assigns)","anchor":"two_factor_enabled_email.html/1"},{"id":"welcome_email.html/1","deprecated":false,"title":"welcome_email.html(assigns)","anchor":"welcome_email.html/1"},{"id":"yearly_expiration_notification.html/1","deprecated":false,"title":"yearly_expiration_notification.html(assigns)","anchor":"yearly_expiration_notification.html/1"},{"id":"yearly_renewal_notification.html/1","deprecated":false,"title":"yearly_renewal_notification.html(assigns)","anchor":"yearly_renewal_notification.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Endpoint","deprecated":false,"group":"","title":"PlausibleWeb.Endpoint","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"broadcast/3","deprecated":false,"title":"broadcast(topic, event, msg)","anchor":"broadcast/3"},{"id":"broadcast!/3","deprecated":false,"title":"broadcast!(topic, event, msg)","anchor":"broadcast!/3"},{"id":"broadcast_from/4","deprecated":false,"title":"broadcast_from(from, topic, event, msg)","anchor":"broadcast_from/4"},{"id":"broadcast_from!/4","deprecated":false,"title":"broadcast_from!(from, topic, event, msg)","anchor":"broadcast_from!/4"},{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"config/2","deprecated":false,"title":"config(key, default \\\\ nil)","anchor":"config/2"},{"id":"config_change/2","deprecated":false,"title":"config_change(changed, removed)","anchor":"config_change/2"},{"id":"host/0","deprecated":false,"title":"host()","anchor":"host/0"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"},{"id":"local_broadcast/3","deprecated":false,"title":"local_broadcast(topic, event, msg)","anchor":"local_broadcast/3"},{"id":"local_broadcast_from/4","deprecated":false,"title":"local_broadcast_from(from, topic, event, msg)","anchor":"local_broadcast_from/4"},{"id":"path/1","deprecated":false,"title":"path(path)","anchor":"path/1"},{"id":"runtime_session/2","deprecated":false,"title":"runtime_session(conn, opts)","anchor":"runtime_session/2"},{"id":"runtime_session_opts/0","deprecated":false,"title":"runtime_session_opts()","anchor":"runtime_session_opts/0"},{"id":"script_name/0","deprecated":false,"title":"script_name()","anchor":"script_name/0"},{"id":"secure_cookie?/0","deprecated":false,"title":"secure_cookie?()","anchor":"secure_cookie?/0"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"id":"static_integrity/1","deprecated":false,"title":"static_integrity(path)","anchor":"static_integrity/1"},{"id":"static_lookup/1","deprecated":false,"title":"static_lookup(path)","anchor":"static_lookup/1"},{"id":"static_path/1","deprecated":false,"title":"static_path(path)","anchor":"static_path/1"},{"id":"static_url/0","deprecated":false,"title":"static_url()","anchor":"static_url/0"},{"id":"struct_url/0","deprecated":false,"title":"struct_url()","anchor":"struct_url/0"},{"id":"subscribe/2","deprecated":false,"title":"subscribe(topic, opts \\\\ [])","anchor":"subscribe/2"},{"id":"unsubscribe/1","deprecated":false,"title":"unsubscribe(topic)","anchor":"unsubscribe/1"},{"id":"url/0","deprecated":false,"title":"url()","anchor":"url/0"},{"id":"websocket_url/0","deprecated":false,"title":"websocket_url()","anchor":"websocket_url/0"}],"key":"functions"}]},{"id":"PlausibleWeb.ErrorHelpers","deprecated":false,"group":"","title":"PlausibleWeb.ErrorHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error_tag/2","deprecated":false,"title":"error_tag(assigns, field)","anchor":"error_tag/2"},{"id":"translate_error/1","deprecated":false,"title":"translate_error(arg)","anchor":"translate_error/1"}],"key":"functions"}]},{"id":"PlausibleWeb.ErrorReportController","deprecated":false,"group":"","title":"PlausibleWeb.ErrorReportController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"submit_error_report/2","deprecated":false,"title":"submit_error_report(conn, arg2)","anchor":"submit_error_report/2"}],"key":"functions"}]},{"id":"PlausibleWeb.ErrorView","deprecated":false,"group":"","title":"PlausibleWeb.ErrorView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"404_error.html/1","deprecated":false,"title":"404_error.html(assigns)","anchor":"404_error.html/1"},{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"generic_error.html/1","deprecated":false,"title":"generic_error.html(assigns)","anchor":"generic_error.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"server_error.html/1","deprecated":false,"title":"server_error.html(assigns)","anchor":"server_error.html/1"},{"id":"server_error_report_thanks.html/1","deprecated":false,"title":"server_error_report_thanks.html(assigns)","anchor":"server_error_report_thanks.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Favicon","deprecated":false,"group":"","title":"PlausibleWeb.Favicon","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, list)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(_)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.FirstLaunchPlug","deprecated":false,"group":"","title":"PlausibleWeb.FirstLaunchPlug","sections":[]},{"id":"PlausibleWeb.FirstLaunchPlug.Test","deprecated":false,"group":"","title":"PlausibleWeb.FirstLaunchPlug.Test","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"skip/1","deprecated":false,"title":"skip(context)","anchor":"skip/1"}],"key":"functions"}]},{"id":"PlausibleWeb.FormHelpers","deprecated":false,"group":"","title":"PlausibleWeb.FormHelpers","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"styled_error/1","deprecated":false,"title":"styled_error(error)","anchor":"styled_error/1"},{"id":"styled_label/4","deprecated":false,"title":"styled_label(form, field, text, opts \\\\ [])","anchor":"styled_label/4"},{"id":"styled_select/4","deprecated":false,"title":"styled_select(form, field, options, opts \\\\ [])","anchor":"styled_select/4"},{"id":"styled_text_input/3","deprecated":false,"title":"styled_text_input(form, field, opts \\\\ [])","anchor":"styled_text_input/3"}],"key":"functions"}]},{"id":"PlausibleWeb.InvitationController","deprecated":false,"group":"","title":"PlausibleWeb.InvitationController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"accept_invitation/2","deprecated":false,"title":"accept_invitation(conn, map)","anchor":"accept_invitation/2"},{"id":"reject_invitation/2","deprecated":false,"title":"reject_invitation(conn, map)","anchor":"reject_invitation/2"},{"id":"remove_invitation/2","deprecated":false,"title":"remove_invitation(conn, map)","anchor":"remove_invitation/2"}],"key":"functions"}]},{"id":"PlausibleWeb.LastSeenPlug","deprecated":false,"group":"","title":"PlausibleWeb.LastSeenPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.LayoutView","deprecated":false,"group":"","title":"PlausibleWeb.LayoutView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"app.html/1","deprecated":false,"title":"app.html(assigns)","anchor":"app.html/1"},{"id":"base_email.html/1","deprecated":false,"title":"base_email.html(assigns)","anchor":"base_email.html/1"},{"id":"base_error.html/1","deprecated":false,"title":"base_error.html(assigns)","anchor":"base_error.html/1"},{"id":"embedded.html/1","deprecated":false,"title":"embedded.html(assigns)","anchor":"embedded.html/1"},{"id":"feedback_link/1","deprecated":false,"title":"feedback_link(user)","anchor":"feedback_link/1"},{"id":"focus.html/1","deprecated":false,"title":"focus.html(assigns)","anchor":"focus.html/1"},{"id":"grace_period_end/1","deprecated":false,"title":"grace_period_end(user)","anchor":"grace_period_end/1"},{"id":"home_dest/1","deprecated":false,"title":"home_dest(conn)","anchor":"home_dest/1"},{"id":"is_current_tab/2","deprecated":false,"title":"is_current_tab(conn, tab)","anchor":"is_current_tab/2"},{"id":"plausible_url/0","deprecated":false,"title":"plausible_url()","anchor":"plausible_url/0"},{"id":"priority_email.html/1","deprecated":false,"title":"priority_email.html(assigns)","anchor":"priority_email.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"render_layout/3","deprecated":false,"title":"render_layout(layout, assigns, list)","anchor":"render_layout/3"},{"id":"settings_tabs/1","deprecated":false,"title":"settings_tabs(conn)","anchor":"settings_tabs/1"},{"id":"site_settings.html/1","deprecated":false,"title":"site_settings.html(assigns)","anchor":"site_settings.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"trial_notificaton/1","deprecated":false,"title":"trial_notificaton(user)","anchor":"trial_notificaton/1"},{"id":"websocket_url/0","deprecated":false,"title":"websocket_url()","anchor":"websocket_url/0"}],"key":"functions"}]},{"id":"PlausibleWeb.LayoutView.JWT","deprecated":false,"group":"","title":"PlausibleWeb.LayoutView.JWT","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"generate_and_sign/2","deprecated":false,"title":"generate_and_sign(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign/2"},{"id":"generate_and_sign!/2","deprecated":false,"title":"generate_and_sign!(extra_claims \\\\ %{}, key \\\\ __default_signer__())","anchor":"generate_and_sign!/2"},{"id":"verify_and_validate/3","deprecated":false,"title":"verify_and_validate(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate/3"},{"id":"verify_and_validate!/3","deprecated":false,"title":"verify_and_validate!(bearer_token, key \\\\ __default_signer__(), context \\\\ %{})","anchor":"verify_and_validate!/3"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.ChoosePlan","deprecated":false,"group":"","title":"PlausibleWeb.Live.ChoosePlan","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"two_months_free/1","deprecated":false,"title":"two_months_free(assigns)","anchor":"two_months_free/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.ComboBox","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.ComboBox","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"dropdown/1","deprecated":false,"title":"dropdown(assigns)","anchor":"dropdown/1"},{"id":"dropdown_anchor/1","deprecated":false,"title":"dropdown_anchor(assigns)","anchor":"dropdown_anchor/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"option/1","deprecated":false,"title":"option(assigns)","anchor":"option/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"select_option/4","deprecated":false,"title":"select_option(js \\\\ %JS{}, id, submit_value, display_value)","anchor":"select_option/4"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.ComboBox.StaticSearch","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.ComboBox.StaticSearch","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"suggest/3","deprecated":false,"title":"suggest(input, choices, opts \\\\ [])","anchor":"suggest/3"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error/1","deprecated":false,"title":"error(assigns)","anchor":"error/1"},{"id":"input/1","deprecated":false,"title":"input(assigns)","anchor":"input/1"},{"id":"input_with_clipboard/1","deprecated":false,"title":"input_with_clipboard(assigns)","anchor":"input_with_clipboard/1"},{"id":"label/1","deprecated":false,"title":"label(assigns)","anchor":"label/1"},{"id":"password_input_with_strength/1","deprecated":false,"title":"password_input_with_strength(assigns)","anchor":"password_input_with_strength/1"},{"id":"password_length_hint/1","deprecated":false,"title":"password_length_hint(assigns)","anchor":"password_length_hint/1"},{"id":"strength_meter/1","deprecated":false,"title":"strength_meter(assigns)","anchor":"strength_meter/1"},{"id":"translate_error/1","deprecated":false,"title":"translate_error(arg)","anchor":"translate_error/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.Pagination","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Pagination","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"pagination/1","deprecated":false,"title":"pagination(assigns)","anchor":"pagination/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Components.Visitors","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Visitors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"chart/1","deprecated":false,"title":"chart(assigns)","anchor":"chart/1"},{"id":"gradient_defs/1","deprecated":false,"title":"gradient_defs(assigns)","anchor":"gradient_defs/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Flash","deprecated":false,"group":"","title":"PlausibleWeb.Live.Flash","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clear_flash_button/1","deprecated":false,"title":"clear_flash_button(assigns)","anchor":"clear_flash_button/1"},{"id":"flash/1","deprecated":false,"title":"flash(assigns)","anchor":"flash/1"},{"id":"flash_messages/1","deprecated":false,"title":"flash_messages(assigns)","anchor":"flash_messages/1"},{"id":"icon_error/1","deprecated":false,"title":"icon_error(assigns)","anchor":"icon_error/1"},{"id":"icon_success/1","deprecated":false,"title":"icon_success(assigns)","anchor":"icon_success/1"},{"id":"put_live_flash/3","deprecated":false,"title":"put_live_flash(socket, key, message)","anchor":"put_live_flash/3"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.FunnelSettings","deprecated":false,"group":"","title":"PlausibleWeb.Live.FunnelSettings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.FunnelSettings.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.FunnelSettings.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_step_button/1","deprecated":false,"title":"add_step_button(assigns)","anchor":"add_step_button/1"},{"id":"evaluation/1","deprecated":false,"title":"evaluation(assigns)","anchor":"evaluation/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"remove_step_button/1","deprecated":false,"title":"remove_step_button(assigns)","anchor":"remove_step_button/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.FunnelSettings.List","deprecated":false,"group":"","title":"PlausibleWeb.Live.FunnelSettings.List","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.GoalSettings","deprecated":false,"group":"","title":"PlausibleWeb.Live.GoalSettings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.GoalSettings.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.GoalSettings.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"custom_event_fields/1","deprecated":false,"title":"custom_event_fields(assigns)","anchor":"custom_event_fields/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"pageview_fields/1","deprecated":false,"title":"pageview_fields(assigns)","anchor":"pageview_fields/1"},{"id":"pageviews_tab/1","deprecated":false,"title":"pageviews_tab(assigns)","anchor":"pageviews_tab/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"suggest_page_paths/3","deprecated":false,"title":"suggest_page_paths(input, options, site)","anchor":"suggest_page_paths/3"},{"id":"tabs/1","deprecated":false,"title":"tabs(assigns)","anchor":"tabs/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.GoalSettings.List","deprecated":false,"group":"","title":"PlausibleWeb.Live.GoalSettings.List","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Plugins.API.Settings","deprecated":false,"group":"","title":"PlausibleWeb.Live.Plugins.API.Settings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Plugins.API.TokenForm","deprecated":false,"group":"","title":"PlausibleWeb.Live.Plugins.API.TokenForm","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.PropsSettings","deprecated":false,"group":"","title":"PlausibleWeb.Live.PropsSettings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.PropsSettings.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.PropsSettings.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.PropsSettings.List","deprecated":false,"group":"","title":"PlausibleWeb.Live.PropsSettings.List","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.RegisterForm","deprecated":false,"group":"","title":"PlausibleWeb.Live.RegisterForm","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, params, socket)","anchor":"handle_event/3"},{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.ResetPasswordForm","deprecated":false,"group":"","title":"PlausibleWeb.Live.ResetPasswordForm","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Sites","deprecated":false,"group":"","title":"PlausibleWeb.Live.Sites","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ellipsis_menu/1","deprecated":false,"title":"ellipsis_menu(assigns)","anchor":"ellipsis_menu/1"},{"id":"favicon/1","deprecated":false,"title":"favicon(assigns)","anchor":"favicon/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg, socket)","anchor":"handle_info/2"},{"id":"handle_params/3","deprecated":false,"title":"handle_params(params, uri, socket)","anchor":"handle_params/3"},{"id":"icon_pin/1","deprecated":false,"title":"icon_pin(assigns)","anchor":"icon_pin/1"},{"id":"invitation/1","deprecated":false,"title":"invitation(assigns)","anchor":"invitation/1"},{"id":"invitation_modal/1","deprecated":false,"title":"invitation_modal(assigns)","anchor":"invitation_modal/1"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"percentage_change/1","deprecated":false,"title":"percentage_change(assigns)","anchor":"percentage_change/1"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"search_form/1","deprecated":false,"title":"search_form(assigns)","anchor":"search_form/1"},{"id":"site/1","deprecated":false,"title":"site(assigns)","anchor":"site/1"},{"id":"site_stats/1","deprecated":false,"title":"site_stats(assigns)","anchor":"site_stats/1"},{"id":"upgrade_nag_screen/1","deprecated":false,"title":"upgrade_nag_screen(assigns)","anchor":"upgrade_nag_screen/1"}],"key":"functions"}]},{"id":"PlausibleWeb.MJML.StatsReport","deprecated":false,"group":"","title":"PlausibleWeb.MJML.StatsReport","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"debug_mjml_template/0","deprecated":false,"title":"debug_mjml_template()","anchor":"debug_mjml_template/0"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.PageController","deprecated":false,"group":"","title":"PlausibleWeb.PageController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/2"}],"key":"functions"}]},{"id":"PlausibleWeb.PageView","deprecated":false,"group":"","title":"PlausibleWeb.PageView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"index.html/1","deprecated":false,"title":"index.html(assigns)","anchor":"index.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"base_uri/0","deprecated":false,"title":"base_uri()","anchor":"base_uri/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Controllers.CustomProps","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"disable/2","deprecated":false,"title":"disable(conn, params)","anchor":"disable/2"},{"id":"enable/2","deprecated":false,"title":"enable(conn, params)","anchor":"enable/2"},{"id":"open_api_operation/1","deprecated":false,"title":"open_api_operation(action)","anchor":"open_api_operation/1"},{"id":"shared_security/0","deprecated":false,"title":"shared_security()","anchor":"shared_security/0"},{"id":"shared_tags/0","deprecated":false,"title":"shared_tags()","anchor":"shared_tags/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Controllers.Goals","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.Goals","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(conn, params)","anchor":"create/2"},{"id":"delete/2","deprecated":false,"title":"delete(conn, params)","anchor":"delete/2"},{"id":"delete_bulk/2","deprecated":false,"title":"delete_bulk(conn, params)","anchor":"delete_bulk/2"},{"id":"get/2","deprecated":false,"title":"get(conn, params)","anchor":"get/2"},{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/2"},{"id":"open_api_operation/1","deprecated":false,"title":"open_api_operation(action)","anchor":"open_api_operation/1"},{"id":"shared_security/0","deprecated":false,"title":"shared_security()","anchor":"shared_security/0"},{"id":"shared_tags/0","deprecated":false,"title":"shared_tags()","anchor":"shared_tags/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Controllers.SharedLinks","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create/2","deprecated":false,"title":"create(conn, params)","anchor":"create/2"},{"id":"get/2","deprecated":false,"title":"get(conn, params)","anchor":"get/2"},{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/2"},{"id":"open_api_operation/1","deprecated":false,"title":"open_api_operation(action)","anchor":"open_api_operation/1"},{"id":"shared_security/0","deprecated":false,"title":"shared_security()","anchor":"shared_security/0"},{"id":"shared_tags/0","deprecated":false,"title":"shared_tags()","anchor":"shared_tags/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Errors","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Errors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"error/3","deprecated":false,"title":"error(conn, status, message)","anchor":"error/3"},{"id":"unauthorized/1","deprecated":false,"title":"unauthorized(conn)","anchor":"unauthorized/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Router","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Router","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api/2","deprecated":false,"title":"api(conn, _)","anchor":"api/2"},{"id":"auth/2","deprecated":false,"title":"auth(conn, _)","anchor":"auth/2"},{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.CustomProp","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Error","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Error","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Goal.Type","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Type","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Link","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Link","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.NotFound","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.NotFound","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.SharedLink","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.Unauthorized","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Unauthorized","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"schema/0","deprecated":false,"title":"schema()","anchor":"schema/0"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Spec","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Spec","sections":[]},{"id":"PlausibleWeb.Plugins.API.Views.CustomProp","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.CustomProp","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Views.Error","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Error","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Views.Goal","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Goal","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Views.Pagination","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Pagination","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"render_metadata_links/4","deprecated":false,"title":"render_metadata_links(meta, helper_fn, helper_fn_args, existing_params \\\\ %{})","anchor":"render_metadata_links/4"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugins.API.Views.SharedLink","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.SharedLink","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]},{"id":"PlausibleWeb.PluginsAPICase","deprecated":false,"group":"","title":"PlausibleWeb.PluginsAPICase","sections":[]},{"id":"PlausibleWeb.Plugs.AuthorizePluginsAPI","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.AuthorizePluginsAPI","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts \\\\ [])","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugs.ErrorHandler","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.ErrorHandler","sections":[]},{"id":"PlausibleWeb.Plugs.MaybeDisableRegistration","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.MaybeDisableRegistration","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Plugs.NoRobots","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.NoRobots","sections":[]},{"id":"PlausibleWeb.RefInspector","deprecated":false,"group":"","title":"PlausibleWeb.RefInspector","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"parse/1","deprecated":false,"title":"parse(ref)","anchor":"parse/1"},{"id":"right_uri?/1","deprecated":false,"title":"right_uri?(arg1)","anchor":"right_uri?/1"}],"key":"functions"}]},{"id":"PlausibleWeb.RemoteIp","deprecated":false,"group":"","title":"PlausibleWeb.RemoteIp","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/1","deprecated":false,"title":"get(conn)","anchor":"get/1"}],"key":"functions"}]},{"id":"PlausibleWeb.RequireAccountPlug","deprecated":false,"group":"","title":"PlausibleWeb.RequireAccountPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.RequireLoggedOutPlug","deprecated":false,"group":"","title":"PlausibleWeb.RequireLoggedOutPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(options)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Router","deprecated":false,"group":"","title":"PlausibleWeb.Router","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api/2","deprecated":false,"title":"api(conn, _)","anchor":"api/2"},{"id":"app_layout/2","deprecated":false,"title":"app_layout(conn, _)","anchor":"app_layout/2"},{"id":"browser/2","deprecated":false,"title":"browser(conn, _)","anchor":"browser/2"},{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"csrf/2","deprecated":false,"title":"csrf(conn, _)","anchor":"csrf/2"},{"id":"flags/2","deprecated":false,"title":"flags(conn, _)","anchor":"flags/2"},{"id":"focus_layout/2","deprecated":false,"title":"focus_layout(conn, _)","anchor":"focus_layout/2"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"},{"id":"internal_stats_api/2","deprecated":false,"title":"internal_stats_api(conn, _)","anchor":"internal_stats_api/2"},{"id":"kaffy_browser/2","deprecated":false,"title":"kaffy_browser(conn, _)","anchor":"kaffy_browser/2"},{"id":"public_api/2","deprecated":false,"title":"public_api(conn, _)","anchor":"public_api/2"},{"id":"shared_link/2","deprecated":false,"title":"shared_link(conn, _)","anchor":"shared_link/2"}],"key":"functions"}]},{"id":"PlausibleWeb.SessionTimeoutPlug","deprecated":false,"group":"","title":"PlausibleWeb.SessionTimeoutPlug","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, opts)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(opts \\\\ [])","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Site.MembershipController","deprecated":false,"group":"","title":"PlausibleWeb.Site.MembershipController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"invite_member/2","deprecated":false,"title":"invite_member(conn, map)","anchor":"invite_member/2"},{"id":"invite_member_form/2","deprecated":false,"title":"invite_member_form(conn, params)","anchor":"invite_member_form/2"},{"id":"remove_member/2","deprecated":false,"title":"remove_member(conn, map)","anchor":"remove_member/2"},{"id":"transfer_ownership/2","deprecated":false,"title":"transfer_ownership(conn, map)","anchor":"transfer_ownership/2"},{"id":"transfer_ownership_form/2","deprecated":false,"title":"transfer_ownership_form(conn, params)","anchor":"transfer_ownership_form/2"},{"id":"update_role/2","deprecated":false,"title":"update_role(conn, map)","anchor":"update_role/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Site.MembershipView","deprecated":false,"group":"","title":"PlausibleWeb.Site.MembershipView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"invite_member_form.html/1","deprecated":false,"title":"invite_member_form.html(assigns)","anchor":"invite_member_form.html/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"transfer_ownership_form.html/1","deprecated":false,"title":"transfer_ownership_form.html(assigns)","anchor":"transfer_ownership_form.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.SiteController","deprecated":false,"group":"","title":"PlausibleWeb.SiteController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_monthly_report_recipient/2","deprecated":false,"title":"add_monthly_report_recipient(conn, map)","anchor":"add_monthly_report_recipient/2"},{"id":"add_snippet/2","deprecated":false,"title":"add_snippet(conn, params)","anchor":"add_snippet/2"},{"id":"add_snippet_after_domain_change/2","deprecated":false,"title":"add_snippet_after_domain_change(conn, params)","anchor":"add_snippet_after_domain_change/2"},{"id":"add_spike_notification_recipient/2","deprecated":false,"title":"add_spike_notification_recipient(conn, map)","anchor":"add_spike_notification_recipient/2"},{"id":"add_weekly_report_recipient/2","deprecated":false,"title":"add_weekly_report_recipient(conn, map)","anchor":"add_weekly_report_recipient/2"},{"id":"change_domain/2","deprecated":false,"title":"change_domain(conn, params)","anchor":"change_domain/2"},{"id":"change_domain_submit/2","deprecated":false,"title":"change_domain_submit(conn, map)","anchor":"change_domain_submit/2"},{"id":"create_shared_link/2","deprecated":false,"title":"create_shared_link(conn, map)","anchor":"create_shared_link/2"},{"id":"create_site/2","deprecated":false,"title":"create_site(conn, map)","anchor":"create_site/2"},{"id":"delete_google_auth/2","deprecated":false,"title":"delete_google_auth(conn, params)","anchor":"delete_google_auth/2"},{"id":"delete_shared_link/2","deprecated":false,"title":"delete_shared_link(conn, map)","anchor":"delete_shared_link/2"},{"id":"delete_site/2","deprecated":false,"title":"delete_site(conn, params)","anchor":"delete_site/2"},{"id":"disable_monthly_report/2","deprecated":false,"title":"disable_monthly_report(conn, params)","anchor":"disable_monthly_report/2"},{"id":"disable_spike_notification/2","deprecated":false,"title":"disable_spike_notification(conn, params)","anchor":"disable_spike_notification/2"},{"id":"disable_weekly_report/2","deprecated":false,"title":"disable_weekly_report(conn, params)","anchor":"disable_weekly_report/2"},{"id":"edit_shared_link/2","deprecated":false,"title":"edit_shared_link(conn, map)","anchor":"edit_shared_link/2"},{"id":"enable_monthly_report/2","deprecated":false,"title":"enable_monthly_report(conn, params)","anchor":"enable_monthly_report/2"},{"id":"enable_spike_notification/2","deprecated":false,"title":"enable_spike_notification(conn, params)","anchor":"enable_spike_notification/2"},{"id":"enable_weekly_report/2","deprecated":false,"title":"enable_weekly_report(conn, params)","anchor":"enable_weekly_report/2"},{"id":"forget_imported/2","deprecated":false,"title":"forget_imported(conn, params)","anchor":"forget_imported/2"},{"id":"import_from_google/2","deprecated":false,"title":"import_from_google(conn, map)","anchor":"import_from_google/2"},{"id":"import_from_google_confirm/2","deprecated":false,"title":"import_from_google_confirm(conn, map)","anchor":"import_from_google_confirm/2"},{"id":"import_from_google_user_metric_notice/2","deprecated":false,"title":"import_from_google_user_metric_notice(conn, map)","anchor":"import_from_google_user_metric_notice/2"},{"id":"import_from_google_view_id/2","deprecated":false,"title":"import_from_google_view_id(conn, map)","anchor":"import_from_google_view_id/2"},{"id":"import_from_google_view_id_form/2","deprecated":false,"title":"import_from_google_view_id_form(conn, map)","anchor":"import_from_google_view_id_form/2"},{"id":"make_private/2","deprecated":false,"title":"make_private(conn, params)","anchor":"make_private/2"},{"id":"make_public/2","deprecated":false,"title":"make_public(conn, params)","anchor":"make_public/2"},{"id":"new/2","deprecated":false,"title":"new(conn, params)","anchor":"new/2"},{"id":"new_shared_link/2","deprecated":false,"title":"new_shared_link(conn, params)","anchor":"new_shared_link/2"},{"id":"remove_monthly_report_recipient/2","deprecated":false,"title":"remove_monthly_report_recipient(conn, map)","anchor":"remove_monthly_report_recipient/2"},{"id":"remove_spike_notification_recipient/2","deprecated":false,"title":"remove_spike_notification_recipient(conn, map)","anchor":"remove_spike_notification_recipient/2"},{"id":"remove_weekly_report_recipient/2","deprecated":false,"title":"remove_weekly_report_recipient(conn, map)","anchor":"remove_weekly_report_recipient/2"},{"id":"reset_stats/2","deprecated":false,"title":"reset_stats(conn, params)","anchor":"reset_stats/2"},{"id":"settings/2","deprecated":false,"title":"settings(conn, map)","anchor":"settings/2"},{"id":"settings_danger_zone/2","deprecated":false,"title":"settings_danger_zone(conn, params)","anchor":"settings_danger_zone/2"},{"id":"settings_email_reports/2","deprecated":false,"title":"settings_email_reports(conn, params)","anchor":"settings_email_reports/2"},{"id":"settings_funnels/2","deprecated":false,"title":"settings_funnels(conn, params)","anchor":"settings_funnels/2"},{"id":"settings_general/2","deprecated":false,"title":"settings_general(conn, params)","anchor":"settings_general/2"},{"id":"settings_goals/2","deprecated":false,"title":"settings_goals(conn, params)","anchor":"settings_goals/2"},{"id":"settings_integrations/2","deprecated":false,"title":"settings_integrations(conn, params)","anchor":"settings_integrations/2"},{"id":"settings_people/2","deprecated":false,"title":"settings_people(conn, params)","anchor":"settings_people/2"},{"id":"settings_props/2","deprecated":false,"title":"settings_props(conn, params)","anchor":"settings_props/2"},{"id":"settings_visibility/2","deprecated":false,"title":"settings_visibility(conn, params)","anchor":"settings_visibility/2"},{"id":"update_feature_visibility/2","deprecated":false,"title":"update_feature_visibility(conn, map)","anchor":"update_feature_visibility/2"},{"id":"update_google_auth/2","deprecated":false,"title":"update_google_auth(conn, map)","anchor":"update_google_auth/2"},{"id":"update_settings/2","deprecated":false,"title":"update_settings(conn, map)","anchor":"update_settings/2"},{"id":"update_shared_link/2","deprecated":false,"title":"update_shared_link(conn, map)","anchor":"update_shared_link/2"},{"id":"update_spike_notification/2","deprecated":false,"title":"update_spike_notification(conn, map)","anchor":"update_spike_notification/2"}],"key":"functions"}]},{"id":"PlausibleWeb.SiteView","deprecated":false,"group":"","title":"PlausibleWeb.SiteView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"change_domain.html/1","deprecated":false,"title":"change_domain.html(assigns)","anchor":"change_domain.html/1"},{"id":"edit_shared_link.html/1","deprecated":false,"title":"edit_shared_link.html(assigns)","anchor":"edit_shared_link.html/1"},{"id":"import_from_google_confirm.html/1","deprecated":false,"title":"import_from_google_confirm.html(assigns)","anchor":"import_from_google_confirm.html/1"},{"id":"import_from_google_user_metric_form.html/1","deprecated":false,"title":"import_from_google_user_metric_form.html(assigns)","anchor":"import_from_google_user_metric_form.html/1"},{"id":"import_from_google_view_id_form.html/1","deprecated":false,"title":"import_from_google_view_id_form.html(assigns)","anchor":"import_from_google_view_id_form.html/1"},{"id":"new.html/1","deprecated":false,"title":"new.html(assigns)","anchor":"new.html/1"},{"id":"new_shared_link.html/1","deprecated":false,"title":"new_shared_link.html(assigns)","anchor":"new_shared_link.html/1"},{"id":"plausible_url/0","deprecated":false,"title":"plausible_url()","anchor":"plausible_url/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"render_snippet/1","deprecated":false,"title":"render_snippet(site)","anchor":"render_snippet/1"},{"id":"settings_danger_zone.html/1","deprecated":false,"title":"settings_danger_zone.html(assigns)","anchor":"settings_danger_zone.html/1"},{"id":"settings_email_reports.html/1","deprecated":false,"title":"settings_email_reports.html(assigns)","anchor":"settings_email_reports.html/1"},{"id":"settings_funnels.html/1","deprecated":false,"title":"settings_funnels.html(assigns)","anchor":"settings_funnels.html/1"},{"id":"settings_general.html/1","deprecated":false,"title":"settings_general.html(assigns)","anchor":"settings_general.html/1"},{"id":"settings_goals.html/1","deprecated":false,"title":"settings_goals.html(assigns)","anchor":"settings_goals.html/1"},{"id":"settings_google_import.html/1","deprecated":false,"title":"settings_google_import.html(assigns)","anchor":"settings_google_import.html/1"},{"id":"settings_integrations.html/1","deprecated":false,"title":"settings_integrations.html(assigns)","anchor":"settings_integrations.html/1"},{"id":"settings_people.html/1","deprecated":false,"title":"settings_people.html(assigns)","anchor":"settings_people.html/1"},{"id":"settings_props.html/1","deprecated":false,"title":"settings_props.html(assigns)","anchor":"settings_props.html/1"},{"id":"settings_search_console.html/1","deprecated":false,"title":"settings_search_console.html(assigns)","anchor":"settings_search_console.html/1"},{"id":"settings_visibility.html/1","deprecated":false,"title":"settings_visibility.html(assigns)","anchor":"settings_visibility.html/1"},{"id":"shared_link_dest/2","deprecated":false,"title":"shared_link_dest(site, link)","anchor":"shared_link_dest/2"},{"id":"snippet.html/1","deprecated":false,"title":"snippet.html(assigns)","anchor":"snippet.html/1"},{"id":"snippet_after_domain_change.html/1","deprecated":false,"title":"snippet_after_domain_change.html(assigns)","anchor":"snippet_after_domain_change.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"with_indefinite_article/1","deprecated":false,"title":"with_indefinite_article(word)","anchor":"with_indefinite_article/1"}],"key":"functions"}]},{"id":"PlausibleWeb.StatsController","deprecated":false,"group":"","title":"PlausibleWeb.StatsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"authenticate_shared_link/2","deprecated":false,"title":"authenticate_shared_link(conn, map)","anchor":"authenticate_shared_link/2"},{"id":"csv_export/2","deprecated":false,"title":"csv_export(conn, params)","anchor":"csv_export/2"},{"id":"shared_link/2","deprecated":false,"title":"shared_link(conn, arg2)","anchor":"shared_link/2"},{"id":"stats/2","deprecated":false,"title":"stats(conn, params)","anchor":"stats/2"}],"key":"functions"}]},{"id":"PlausibleWeb.StatsView","deprecated":false,"group":"","title":"PlausibleWeb.StatsView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"large_number_format/1","deprecated":false,"title":"large_number_format(n)","anchor":"large_number_format/1"},{"id":"plausible_url/0","deprecated":false,"title":"plausible_url()","anchor":"plausible_url/0"},{"id":"pretty_stats_url/1","deprecated":false,"title":"pretty_stats_url(arg)","anchor":"pretty_stats_url/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"shared_link_password.html/1","deprecated":false,"title":"shared_link_password.html(assigns)","anchor":"shared_link_password.html/1"},{"id":"site_locked.html/1","deprecated":false,"title":"site_locked.html(assigns)","anchor":"site_locked.html/1"},{"id":"stats.html/1","deprecated":false,"title":"stats.html(assigns)","anchor":"stats.html/1"},{"id":"stats_container_class/1","deprecated":false,"title":"stats_container_class(conn)","anchor":"stats_container_class/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"},{"id":"waiting_first_pageview.html/1","deprecated":false,"title":"waiting_first_pageview.html(assigns)","anchor":"waiting_first_pageview.html/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Tracker","deprecated":false,"group":"","title":"PlausibleWeb.Tracker","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, list)","anchor":"call/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(arg)","anchor":"child_spec/1"},{"id":"init/1","deprecated":false,"title":"init(opts)","anchor":"init/1"}],"key":"functions"}]},{"id":"PlausibleWeb.TwoFactor.Session","deprecated":false,"group":"","title":"PlausibleWeb.TwoFactor.Session","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clear_2fa_user/1","deprecated":false,"title":"clear_2fa_user(conn)","anchor":"clear_2fa_user/1"},{"id":"clear_remember_2fa/1","deprecated":false,"title":"clear_remember_2fa(conn)","anchor":"clear_remember_2fa/1"},{"id":"get_2fa_user/1","deprecated":false,"title":"get_2fa_user(conn)","anchor":"get_2fa_user/1"},{"id":"maybe_set_remember_2fa/3","deprecated":false,"title":"maybe_set_remember_2fa(conn, user, arg3)","anchor":"maybe_set_remember_2fa/3"},{"id":"remember_2fa?/2","deprecated":false,"title":"remember_2fa?(conn, user)","anchor":"remember_2fa?/2"},{"id":"remember_2fa_days/0","deprecated":false,"title":"remember_2fa_days()","anchor":"remember_2fa_days/0"},{"id":"set_2fa_user/2","deprecated":false,"title":"set_2fa_user(conn, user)","anchor":"set_2fa_user/2"}],"key":"functions"}]},{"id":"PlausibleWeb.UnsubscribeController","deprecated":false,"group":"","title":"PlausibleWeb.UnsubscribeController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"monthly_report/2","deprecated":false,"title":"monthly_report(conn, map)","anchor":"monthly_report/2"},{"id":"weekly_report/2","deprecated":false,"title":"weekly_report(conn, map)","anchor":"weekly_report/2"}],"key":"functions"}]},{"id":"PlausibleWeb.UnsubscribeView","deprecated":false,"group":"","title":"PlausibleWeb.UnsubscribeView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"success.html/1","deprecated":false,"title":"success.html(assigns)","anchor":"success.html/1"},{"id":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"key":"functions"}]}],"extras":[{"id":"api-reference","group":"","title":"API Reference","headers":[{"id":"Modules","anchor":"modules"},{"id":"Mix Tasks","anchor":"mix-tasks"}]},{"id":"readme","group":"","title":"Introduction","headers":[{"id":"Why Plausible?","anchor":"why-plausible"},{"id":"Why is Plausible Analytics Cloud not free like Google Analytics?","anchor":"why-is-plausible-analytics-cloud-not-free-like-google-analytics"},{"id":"Getting started with Plausible","anchor":"getting-started-with-plausible"},{"id":"Technology","anchor":"technology"},{"id":"Contributors","anchor":"contributors"},{"id":"Feedback & Roadmap","anchor":"feedback-roadmap"},{"id":"License & Trademarks","anchor":"license-trademarks"}]},{"id":"contributing","group":"","title":"Contributing","headers":[{"id":"Development setup","anchor":"development-setup"},{"id":"Finding a task","anchor":"finding-a-task"}]},{"id":"account-locking","group":"Features","title":"Account locking","headers":[{"id":"Usage alert and grace period","anchor":"usage-alert-and-grace-period"},{"id":"Account locking","anchor":"account-locking"}]}],"tasks":[{"id":"Mix.Tasks.CancelSubscription","deprecated":false,"group":"","title":"mix cancel_subscription","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(list)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.CleanClickhouse","deprecated":false,"group":"","title":"mix clean_clickhouse","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.CreateFreeSubscription","deprecated":false,"group":"","title":"mix create_free_subscription","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"execute/1","deprecated":false,"title":"execute(user_id)","anchor":"execute/1"},{"id":"run/1","deprecated":false,"title":"run(arg1)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.DownloadCountryDatabase","deprecated":false,"group":"","title":"mix download_country_database","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.GenerateReferrerFavicons","deprecated":false,"group":"","title":"mix generate_referrer_favicons","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(_)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.PullSandboxSubscription","deprecated":false,"group":"","title":"mix pull_sandbox_subscription","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(list)","anchor":"run/1"}],"key":"functions"}]},{"id":"Mix.Tasks.SendPageview","deprecated":false,"group":"","title":"mix send_pageview","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(opts)","anchor":"run/1"}],"key":"functions"}]}]} \ No newline at end of file diff --git a/readme.html b/readme.html index 74800eeed..449d4d323 100644 --- a/readme.html +++ b/readme.html @@ -13,7 +13,7 @@ - + diff --git a/search.html b/search.html index d5fb0c4af..6dd77cff6 100644 --- a/search.html +++ b/search.html @@ -13,7 +13,7 @@ - + @@ -107,7 +107,7 @@ Plausible
    - +

  • filters - optional filters to drill down data. See the Stats API "Filtering" section for more details.