From da3cd697e8663e59831465ded20f3003d1530e2a Mon Sep 17 00:00:00 2001 From: zoldar Date: Wed, 28 Feb 2024 08:34:47 +0000 Subject: [PATCH] deploy: 39aa81a16f6e9d27f6f05d2ba80302f785a9cd77 --- .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.Cache.Warmer.html | 2 +- Plausible.Cache.html | 2 +- Plausible.ChangesetHelpers.html | 2 +- Plausible.Cldr.AcceptLanguage.html | 250 +++++++------- Plausible.Cldr.Currency.html | 162 ++++----- 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 | 182 +++++------ 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 +- ...sible.DataMigration.VersionedSessions.html | 2 +- Plausible.DataMigration.html | 2 +- Plausible.DebugReplayInfo.html | 2 +- Plausible.Ecto.EventName.html | 2 +- Plausible.Factory.html | 82 +++-- 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 | 12 +- 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.Buffer.html | 2 +- Plausible.Imported.CSVImporter.html | 2 +- Plausible.Imported.ImportSources.html | 2 +- Plausible.Imported.Importer.html | 86 ++++- Plausible.Imported.NoopImporter.html | 2 +- Plausible.Imported.SiteImport.html | 57 +++- Plausible.Imported.UniversalAnalytics.html | 6 +- Plausible.Imported.html | 116 ++++++- 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.License.html | 2 +- Plausible.Mailer.html | 2 +- Plausible.MigrationUtils.html | 2 +- Plausible.OpenTelemetry.Sampler.html | 2 +- Plausible.PaddleApi.Mock.html | 2 +- Plausible.Pagination.html | 2 +- Plausible.Plugins.API.Capabilities.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 | 36 +- Plausible.RateLimit.html | 2 +- Plausible.Release.html | 2 +- Plausible.Repo.html | 2 +- Plausible.S3.html | 2 +- Plausible.Sentry.Client.html | 2 +- Plausible.SentryFilter.html | 2 +- Plausible.Session.CacheStore.html | 2 +- Plausible.Session.Salts.html | 2 +- Plausible.Shield.CountryRule.html | 2 +- Plausible.Shield.CountryRuleCache.html | 2 +- Plausible.Shield.IPRule.html | 2 +- Plausible.Shield.IPRuleCache.html | 2 +- Plausible.Shields.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 | 64 +++- Plausible.Stats.Aggregate.html | 2 +- Plausible.Stats.Base.html | 2 +- Plausible.Stats.Breakdown.html | 2 +- Plausible.Stats.Clickhouse.html | 52 ++- 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.FilterSuggestions.html | 2 +- Plausible.Stats.Filters.Utils.html | 2 +- Plausible.Stats.Filters.html | 14 +- 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.ImportAnalytics.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 638631 -> 641069 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 | 30 +- 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 | 2 +- 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 | 12 +- PlausibleWeb.Live.ChoosePlan.html | 2 +- ...Live.Components.ComboBox.StaticSearch.html | 2 +- PlausibleWeb.Live.Components.ComboBox.html | 2 +- PlausibleWeb.Live.Components.Form.html | 2 +- PlausibleWeb.Live.Components.Modal.html | 42 +-- PlausibleWeb.Live.Components.Pagination.html | 2 +- PlausibleWeb.Live.Components.Visitors.html | 2 +- PlausibleWeb.Live.Flash.html | 2 +- PlausibleWeb.Live.FunnelSettings.Form.html | 2 +- PlausibleWeb.Live.FunnelSettings.List.html | 2 +- PlausibleWeb.Live.FunnelSettings.html | 2 +- PlausibleWeb.Live.GoalSettings.Form.html | 2 +- PlausibleWeb.Live.GoalSettings.List.html | 2 +- PlausibleWeb.Live.GoalSettings.html | 2 +- PlausibleWeb.Live.ImportsExportsSettings.html | 307 ++++++++++++++++++ PlausibleWeb.Live.Plugins.API.Settings.html | 2 +- PlausibleWeb.Live.Plugins.API.TokenForm.html | 2 +- PlausibleWeb.Live.PropsSettings.Form.html | 2 +- PlausibleWeb.Live.PropsSettings.List.html | 2 +- PlausibleWeb.Live.PropsSettings.html | 2 +- PlausibleWeb.Live.RegisterForm.html | 2 +- PlausibleWeb.Live.ResetPasswordForm.html | 2 +- PlausibleWeb.Live.SentryContext.html | 2 +- PlausibleWeb.Live.Shields.Countries.html | 2 +- PlausibleWeb.Live.Shields.CountryRules.html | 2 +- PlausibleWeb.Live.Shields.IPAddresses.html | 2 +- PlausibleWeb.Live.Shields.IPRules.html | 2 +- PlausibleWeb.Live.Sites.html | 2 +- PlausibleWeb.MJML.StatsReport.html | 2 +- PlausibleWeb.PageController.html | 2 +- PlausibleWeb.PageView.html | 2 +- ....Plugins.API.Controllers.Capabilities.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 +- ...eWeb.Plugins.API.Schemas.Capabilities.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 +- ...bleWeb.Plugins.API.Views.Capabilities.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.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 | 160 ++++++--- PlausibleWeb.SiteView.html | 32 +- 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 | 2 +- api-reference.html | 11 +- contributing.html | 2 +- dist/search_data-3C463D62.js | 1 + dist/search_data-AA77C992.js | 1 - dist/sidebar_items-65293FE3.js | 1 + dist/sidebar_items-679F5E33.js | 1 - readme.html | 2 +- search.html | 4 +- 340 files changed, 1850 insertions(+), 1110 deletions(-) create mode 100644 PlausibleWeb.Live.ImportsExportsSettings.html create mode 100644 dist/search_data-3C463D62.js delete mode 100644 dist/search_data-AA77C992.js create mode 100644 dist/sidebar_items-65293FE3.js delete mode 100644 dist/sidebar_items-679F5E33.js diff --git a/.build b/.build index 94cedd3143..92ad113d4f 100644 --- a/.build +++ b/.build @@ -251,6 +251,7 @@ PlausibleWeb.Live.FunnelSettings.html PlausibleWeb.Live.GoalSettings.Form.html PlausibleWeb.Live.GoalSettings.List.html PlausibleWeb.Live.GoalSettings.html +PlausibleWeb.Live.ImportsExportsSettings.html PlausibleWeb.Live.Plugins.API.Settings.html PlausibleWeb.Live.Plugins.API.TokenForm.html PlausibleWeb.Live.PropsSettings.Form.html @@ -357,8 +358,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-AA77C992.js -dist/sidebar_items-679F5E33.js +dist/search_data-3C463D62.js +dist/sidebar_items-65293FE3.js index.html readme.html search.html diff --git a/404.html b/404.html index 71b2de8fa3..2ef47eea59 100644 --- a/404.html +++ b/404.html @@ -16,7 +16,7 @@ - + diff --git a/Mix.Tasks.CancelSubscription.html b/Mix.Tasks.CancelSubscription.html index f2585f7245..c09d309660 100644 --- a/Mix.Tasks.CancelSubscription.html +++ b/Mix.Tasks.CancelSubscription.html @@ -14,7 +14,7 @@ - + diff --git a/Mix.Tasks.CleanClickhouse.html b/Mix.Tasks.CleanClickhouse.html index 3924eb5a62..1bc3272535 100644 --- a/Mix.Tasks.CleanClickhouse.html +++ b/Mix.Tasks.CleanClickhouse.html @@ -14,7 +14,7 @@ - + diff --git a/Mix.Tasks.CreateFreeSubscription.html b/Mix.Tasks.CreateFreeSubscription.html index 1380aaf19e..917f2f747a 100644 --- a/Mix.Tasks.CreateFreeSubscription.html +++ b/Mix.Tasks.CreateFreeSubscription.html @@ -14,7 +14,7 @@ - + diff --git a/Mix.Tasks.DownloadCountryDatabase.html b/Mix.Tasks.DownloadCountryDatabase.html index dddbabd9d1..1dd774fb97 100644 --- a/Mix.Tasks.DownloadCountryDatabase.html +++ b/Mix.Tasks.DownloadCountryDatabase.html @@ -14,7 +14,7 @@ - + diff --git a/Mix.Tasks.GenerateReferrerFavicons.html b/Mix.Tasks.GenerateReferrerFavicons.html index 425196b9c9..b7d537100c 100644 --- a/Mix.Tasks.GenerateReferrerFavicons.html +++ b/Mix.Tasks.GenerateReferrerFavicons.html @@ -14,7 +14,7 @@ - + diff --git a/Mix.Tasks.PullSandboxSubscription.html b/Mix.Tasks.PullSandboxSubscription.html index 26dc141a8f..7c41ebc5e2 100644 --- a/Mix.Tasks.PullSandboxSubscription.html +++ b/Mix.Tasks.PullSandboxSubscription.html @@ -14,7 +14,7 @@ - + diff --git a/Mix.Tasks.SendPageview.html b/Mix.Tasks.SendPageview.html index 66013a1e98..b992530b93 100644 --- a/Mix.Tasks.SendPageview.html +++ b/Mix.Tasks.SendPageview.html @@ -14,7 +14,7 @@ - + diff --git a/ObanErrorReporter.html b/ObanErrorReporter.html index bd477f4f37..bf7e339a40 100644 --- a/ObanErrorReporter.html +++ b/ObanErrorReporter.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.AsyncInsertRepo.html b/Plausible.AsyncInsertRepo.html index 87040fd1c2..72152b5262 100644 --- a/Plausible.AsyncInsertRepo.html +++ b/Plausible.AsyncInsertRepo.html @@ -14,7 +14,7 @@ - + @@ -1143,23 +1143,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 f57fd37ae6..63011a53f0 100644 --- a/Plausible.Auth.ApiKey.html +++ b/Plausible.Auth.ApiKey.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.ApiKeyAdmin.html b/Plausible.Auth.ApiKeyAdmin.html index 91218a01ed..50aaaa1573 100644 --- a/Plausible.Auth.ApiKeyAdmin.html +++ b/Plausible.Auth.ApiKeyAdmin.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.EmailActivationCode.html b/Plausible.Auth.EmailActivationCode.html index af19b7d4f3..1d9400470d 100644 --- a/Plausible.Auth.EmailActivationCode.html +++ b/Plausible.Auth.EmailActivationCode.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.EmailVerification.html b/Plausible.Auth.EmailVerification.html index c510895a8e..ab54d1391e 100644 --- a/Plausible.Auth.EmailVerification.html +++ b/Plausible.Auth.EmailVerification.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.GracePeriod.html b/Plausible.Auth.GracePeriod.html index b7d4089b6c..9b23b49a0c 100644 --- a/Plausible.Auth.GracePeriod.html +++ b/Plausible.Auth.GracePeriod.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.Invitation.html b/Plausible.Auth.Invitation.html index 61469e76a4..386b1d36c3 100644 --- a/Plausible.Auth.Invitation.html +++ b/Plausible.Auth.Invitation.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.Password.html b/Plausible.Auth.Password.html index a6e85c62d3..273f320946 100644 --- a/Plausible.Auth.Password.html +++ b/Plausible.Auth.Password.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.TOTP.EncryptedBinary.html b/Plausible.Auth.TOTP.EncryptedBinary.html index 2339f99279..45b41b6f67 100644 --- a/Plausible.Auth.TOTP.EncryptedBinary.html +++ b/Plausible.Auth.TOTP.EncryptedBinary.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.TOTP.RecoveryCode.html b/Plausible.Auth.TOTP.RecoveryCode.html index 396eaff1c0..e989acc9cb 100644 --- a/Plausible.Auth.TOTP.RecoveryCode.html +++ b/Plausible.Auth.TOTP.RecoveryCode.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.TOTP.Vault.html b/Plausible.Auth.TOTP.Vault.html index 04f035d6de..570f30ece4 100644 --- a/Plausible.Auth.TOTP.Vault.html +++ b/Plausible.Auth.TOTP.Vault.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.TOTP.html b/Plausible.Auth.TOTP.html index 4581bc3b12..91c3cb0d36 100644 --- a/Plausible.Auth.TOTP.html +++ b/Plausible.Auth.TOTP.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.Token.html b/Plausible.Auth.Token.html index 25d25b76de..d33893bb0e 100644 --- a/Plausible.Auth.Token.html +++ b/Plausible.Auth.Token.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.User.html b/Plausible.Auth.User.html index 33c2ef02f0..f0b1d9e560 100644 --- a/Plausible.Auth.User.html +++ b/Plausible.Auth.User.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.UserAdmin.html b/Plausible.Auth.UserAdmin.html index f080afd10f..26f653e434 100644 --- a/Plausible.Auth.UserAdmin.html +++ b/Plausible.Auth.UserAdmin.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.html b/Plausible.Auth.html index 12c077fc4e..ef7d42e424 100644 --- a/Plausible.Auth.html +++ b/Plausible.Auth.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.Ecto.Feature.html b/Plausible.Billing.Ecto.Feature.html index d1c1ad0665..e207fe69a5 100644 --- a/Plausible.Billing.Ecto.Feature.html +++ b/Plausible.Billing.Ecto.Feature.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.Ecto.FeatureList.html b/Plausible.Billing.Ecto.FeatureList.html index 5577b055ba..5afc4c634a 100644 --- a/Plausible.Billing.Ecto.FeatureList.html +++ b/Plausible.Billing.Ecto.FeatureList.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.Ecto.Limit.html b/Plausible.Billing.Ecto.Limit.html index 7477db07cf..506577082c 100644 --- a/Plausible.Billing.Ecto.Limit.html +++ b/Plausible.Billing.Ecto.Limit.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.EnterprisePlan.html b/Plausible.Billing.EnterprisePlan.html index c43f6598ab..ddf6ee79a9 100644 --- a/Plausible.Billing.EnterprisePlan.html +++ b/Plausible.Billing.EnterprisePlan.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.EnterprisePlanAdmin.html b/Plausible.Billing.EnterprisePlanAdmin.html index dbb4859445..bd14544da1 100644 --- a/Plausible.Billing.EnterprisePlanAdmin.html +++ b/Plausible.Billing.EnterprisePlanAdmin.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.Feature.html b/Plausible.Billing.Feature.html index 5f16bf2f39..5d1c0df95a 100644 --- a/Plausible.Billing.Feature.html +++ b/Plausible.Billing.Feature.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.PaddleApi.html b/Plausible.Billing.PaddleApi.html index 219ca46a2e..8869b301db 100644 --- a/Plausible.Billing.PaddleApi.html +++ b/Plausible.Billing.PaddleApi.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.Plans.html b/Plausible.Billing.Plans.html index 6961541327..9ead2c9eaa 100644 --- a/Plausible.Billing.Plans.html +++ b/Plausible.Billing.Plans.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.Quota.html b/Plausible.Billing.Quota.html index 2fe854e9af..7ab66c5f2e 100644 --- a/Plausible.Billing.Quota.html +++ b/Plausible.Billing.Quota.html @@ -14,7 +14,7 @@ - + @@ -727,12 +727,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 83a1ba112c..d6b7627fb0 100644 --- a/Plausible.Billing.SiteLocker.html +++ b/Plausible.Billing.SiteLocker.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.Subscription.Status.html b/Plausible.Billing.Subscription.Status.html index 57a4ef76b5..e9817a01cc 100644 --- a/Plausible.Billing.Subscription.Status.html +++ b/Plausible.Billing.Subscription.Status.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.html b/Plausible.Billing.html index a244baeeb3..a65b7355fc 100644 --- a/Plausible.Billing.html +++ b/Plausible.Billing.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Cache.Warmer.html b/Plausible.Cache.Warmer.html index 0c89d2d861..a06830cc8e 100644 --- a/Plausible.Cache.Warmer.html +++ b/Plausible.Cache.Warmer.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Cache.html b/Plausible.Cache.html index 89a1aac6a8..f94a19f865 100644 --- a/Plausible.Cache.html +++ b/Plausible.Cache.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.ChangesetHelpers.html b/Plausible.ChangesetHelpers.html index c46662eb89..700a49ccba 100644 --- a/Plausible.ChangesetHelpers.html +++ b/Plausible.ChangesetHelpers.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Cldr.AcceptLanguage.html b/Plausible.Cldr.AcceptLanguage.html index c09e2c5665..1c51c7a59e 100644 --- a/Plausible.Cldr.AcceptLanguage.html +++ b/Plausible.Cldr.AcceptLanguage.html @@ -14,7 +14,7 @@ - + @@ -148,7 +148,7 @@ Pages 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."

@@ -261,54 +261,54 @@ a configured Examples -
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"}}
@@ -369,95 +369,95 @@ wuth an error tuple for each invalid tag added at the end of the list.

Example

-
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"}} + ]}
@@ -502,92 +502,92 @@ wuth an error tuple for each invalid tag added at the end of the list.

Example

-
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 8f113052c6..949cae12ba 100644 --- a/Plausible.Cldr.Currency.html +++ b/Plausible.Cldr.Currency.html @@ -14,7 +14,7 @@ - + @@ -419,11 +419,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,
@@ -433,12 +433,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,
@@ -448,7 +448,7 @@ The default is :all. See symbol: "SUR",
    tender: true,
    to: nil
- },
+ },
  ...
 }}
@@ -499,11 +499,11 @@ The default is :all. See Example

MyApp.Cldr.Currency.currencies_for_locale!("en") - => %{

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,
@@ -513,12 +513,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,
@@ -528,7 +528,7 @@ The default is :all. See symbol: "SUR",
   tender: true,
   to: nil
-},
+},
 ...

}

@@ -586,13 +586,13 @@ or a Examples -
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",
@@ -600,15 +600,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",
@@ -616,7 +616,7 @@ or a rounding: 0,
     symbol: "THB",
     tender: true
-}}
+}}
@@ -675,12 +675,12 @@ or a Examples -
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",
@@ -688,14 +688,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",
@@ -703,7 +703,7 @@ or a rounding: 0,
   symbol: "THB",
   tender: true
-}
+}
@@ -744,15 +744,15 @@ or a Examples -
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
 
-iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
+iex> Plausible.Cldr.Currency.currency_from_locale("en-GB")
 :GBP
@@ -796,14 +796,14 @@ or a Example -
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]}
-  }
-}
+
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]}
+  }
+}
@@ -862,9 +862,9 @@ The default is :all. See Example -
MyApp.Cldr.Currency.currency_strings("en")
-=> {:ok,
- %{
+
MyApp.Cldr.Currency.currency_strings("en")
+=> {:ok,
+ %{
    "mexican silver pesos" => :MXP,
    "sudanese dinar" => :SDD,
    "bad" => :BAD,
@@ -874,7 +874,7 @@ The default is :all. See "guyanaese dollars" => :GYD,
    "equatorial guinean ekwele" => :GQE,
    ...
-  }}
+ }}
@@ -933,8 +933,8 @@ The default is :all. See Example -
MyApp.Cldr.Currency.currency_strings!("en")
-=> %{
+
MyApp.Cldr.Currency.currency_strings!("en")
+=> %{
   "mexican silver pesos" => :MXP,
   "sudanese dinar" => :SDD,
   "bad" => :BAD,
@@ -944,7 +944,7 @@ The default is :all. See "guyanaese dollars" => :GYD,
   "equatorial guinean ekwele" => :GQE,
   ...
- }
+ }
@@ -982,10 +982,10 @@ or a Example -
iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
+
iex> MyApp.Cldr.Currency.current_currency_from_locale("en")
 :USD
 
-iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
+iex> MyApp.Cldr.Currency.current_currency_from_locale("en-AU")
 :AUD
@@ -1033,7 +1033,7 @@ mapping is returned for that territory.

Example

-
iex> Plausible.Cldr.Currency.current_territory_currencies()
+
iex> Plausible.Cldr.Currency.current_territory_currencies()
@@ -1125,11 +1125,11 @@ currency code

Examples

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

Examples

-
iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
+
iex> Plausible.Cldr.Currency.known_currency_code?("AUD")
 true
 
-iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
+iex> Plausible.Cldr.Currency.known_currency_code?("GGG")
 false
 
-iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
+iex> Plausible.Cldr.Currency.known_currency_code?(:XCV)
 false
@@ -1217,7 +1217,7 @@ currency code

Example

-
iex> Plausible.Cldr.Currency.known_currency_codes()
+
iex> Plausible.Cldr.Currency.known_currency_codes()
@@ -1276,14 +1276,14 @@ such as 0.05. Optional.

Example

-
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,
@@ -1293,11 +1293,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."}}
@@ -1355,20 +1355,20 @@ default is Plaus Examples -
iex> Plausible.Cldr.Currency.pluralize(1, :USD)
-{:ok, "US dollar"}
+
iex> Plausible.Cldr.Currency.pluralize(1, :USD)
+{:ok, "US dollar"}
 
-iex> Plausible.Cldr.Currency.pluralize(3, :USD)
-{:ok, "US dollars"}
+iex> Plausible.Cldr.Currency.pluralize(3, :USD)
+{:ok, "US dollars"}
 
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
-{:ok, "美元"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "zh")
+{:ok, "美元"}
 
-iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
-{:ok, "dollars des États-Unis"}
+iex> Plausible.Cldr.Currency.pluralize(12, :USD, locale: "fr")
+{:ok, "dollars des États-Unis"}
 
-iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr")
-{:ok, "dollar des États-Unis"}
+
iex> Plausible.Cldr.Currency.pluralize(1, :USD, locale: "fr") +{:ok, "dollar des États-Unis"}
@@ -1410,8 +1410,8 @@ or a Example -
iex> MyApp.Cldr.Currency.strings_for_currency(:AUD, "en")
-["a$", "australian dollars", "aud", "australian dollar"]
+
iex> MyApp.Cldr.Currency.strings_for_currency(:AUD, "en")
+["a$", "australian dollars", "aud", "australian dollar"]
diff --git a/Plausible.Cldr.Locale.html b/Plausible.Cldr.Locale.html index 6f39cfd506..33f6f5ce9e 100644 --- a/Plausible.Cldr.Locale.html +++ b/Plausible.Cldr.Locale.html @@ -14,7 +14,7 @@ - + @@ -326,16 +326,16 @@ this specific locale..

Examples

-
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]}
@@ -389,20 +389,20 @@ this specific locale.

Examples

-
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]>]}
@@ -533,15 +533,15 @@ generic top-level domain names.

Examples

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\""}}
@@ -683,12 +683,12 @@ be a territory.

Examples

-
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 3831f410a3..5e063f3a3d 100644 --- a/Plausible.Cldr.Number.Cardinal.html +++ b/Plausible.Cldr.Number.Cardinal.html @@ -14,7 +14,7 @@ - + @@ -455,31 +455,31 @@ The valid substitution keys are :zero, Examples -
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 7903b7eb87..a12ab60b80 100644 --- a/Plausible.Cldr.Number.Format.html +++ b/Plausible.Cldr.Number.Format.html @@ -14,7 +14,7 @@ - + @@ -468,7 +468,7 @@ to precompile all the known formats at compile time.

Example

#=> 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¤)",
@@ -478,7 +478,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 ¤", ...]
@@ -526,8 +526,8 @@ the known formats at compile time. Its use is not otherwise recommended.

Example

-
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",
@@ -535,7 +535,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"]}
@@ -588,8 +588,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}}}
@@ -641,8 +641,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}}
@@ -699,18 +699,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 ¤"]}], ... }
@@ -801,8 +801,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}
@@ -854,7 +854,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 756057e2f9..c055dc3811 100644 --- a/Plausible.Cldr.Number.Formatter.Decimal.html +++ b/Plausible.Cldr.Number.Formatter.Decimal.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Cldr.Number.Ordinal.html b/Plausible.Cldr.Number.Ordinal.html index 73ac1fe880..ca8bce3794 100644 --- a/Plausible.Cldr.Number.Ordinal.html +++ b/Plausible.Cldr.Number.Ordinal.html @@ -14,7 +14,7 @@ - + @@ -458,31 +458,31 @@ The valid substitution keys are :zero, Examples -
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 ccae2c294c..449a983f53 100644 --- a/Plausible.Cldr.Number.PluralRule.Range.html +++ b/Plausible.Cldr.Number.PluralRule.Range.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Cldr.Number.Symbol.html b/Plausible.Cldr.Number.Symbol.html index 5854ec883a..aa144c71c0 100644 --- a/Plausible.Cldr.Number.Symbol.html +++ b/Plausible.Cldr.Number.Symbol.html @@ -14,7 +14,7 @@ - + @@ -378,9 +378,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: ",",
@@ -393,8 +393,8 @@ is Plausible.Cld
      plus_sign: "+",
      superscripting_exponent: "×",
      time_separator: ":"
-   },
-   thai: %Cldr.Number.Symbol{
+   },
+   thai: %Cldr.Number.Symbol{
      decimal: ".",
      exponential: "E",
      group: ",",
@@ -407,8 +407,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 560248bfdb..9dd749bf7e 100644 --- a/Plausible.Cldr.Number.System.html +++ b/Plausible.Cldr.Number.System.html @@ -14,7 +14,7 @@ - + @@ -317,23 +317,23 @@ it is returned as is.

Examples

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}"} +}
@@ -424,10 +424,10 @@ or a Examples
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"}}
@@ -509,13 +509,13 @@ or a Examples
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"}}
@@ -613,20 +613,20 @@ actual system name.

Examples

-
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.

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

Examples

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 0195677a75..ad06957819 100644 --- a/Plausible.Cldr.Number.Transliterate.html +++ b/Plausible.Cldr.Number.Transliterate.html @@ -14,7 +14,7 @@ - + @@ -162,12 +162,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.numeric_systems/0.

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

@@ -281,22 +281,22 @@ and Examples -
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 bfa52d9d4c..e1b02d1426 100644 --- a/Plausible.Cldr.Number.html +++ b/Plausible.Cldr.Number.html @@ -14,7 +14,7 @@ - + @@ -441,19 +441,19 @@ using the Elixir standard library functions.

Examples

-
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"}}
@@ -525,17 +525,17 @@ financial instruments.

Examples

-
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]
@@ -612,19 +612,19 @@ financial instruments.

Examples

-
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"}}
@@ -688,13 +688,13 @@ The default is options[:backend].get_locale()Examples
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]
@@ -751,9 +751,9 @@ The default is options[:backend].get_locale() Examples -
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]
@@ -813,20 +813,20 @@ and any options provided are passed to that function.

Examples

-
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"]
@@ -873,7 +873,7 @@ options.

Example

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

Example

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

Example

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

Example

iex> Plausible.Cldr.Number.to_range_string 1234..5678
-{:ok, "1,234–5,678"}
+{:ok, "1,234–5,678"}
@@ -1133,21 +1133,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. @@ -1168,80 +1168,80 @@ inserted in the final formatted number.

Examples

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", format: :percent)
    -    {:error, {Cldr.UnknownFormatError,
    -      "The locale :he with number system :hebr does not define a format :percent"}}
    +return looks like:
    iex> Plausible.Cldr.Number.to_string(1234, locale: "he", number_system: "hebr", format: :percent)
+    {:error, {Cldr.UnknownFormatError,
+      "The locale :he with number system :hebr does not define a format :percent"}}
@@ -1346,17 +1346,17 @@ returned by Examples
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 9c09e50fd2..81c4d2b8df 100644 --- a/Plausible.Cldr.Rbnf.NumberSystem.html +++ b/Plausible.Cldr.Rbnf.NumberSystem.html @@ -14,7 +14,7 @@ - + @@ -145,9 +145,9 @@ Pages

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,
@@ -161,9 +161,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 75bdb1cf65..d467390440 100644 --- a/Plausible.Cldr.Rbnf.Ordinal.html +++ b/Plausible.Cldr.Rbnf.Ordinal.html @@ -14,7 +14,7 @@ - + @@ -145,20 +145,20 @@ Pages

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 ead3d49efd..db6cd4f267 100644 --- a/Plausible.Cldr.Rbnf.Spellout.html +++ b/Plausible.Cldr.Rbnf.Spellout.html @@ -14,7 +14,7 @@ - + @@ -145,9 +145,9 @@ Pages

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,
@@ -155,9 +155,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 4e4e3642a0..a0b6aa4020 100644 --- a/Plausible.Cldr.html +++ b/Plausible.Cldr.html @@ -14,7 +14,7 @@ - + @@ -558,24 +558,24 @@ current locale is restored after the function.

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: [] +}
@@ -610,7 +610,7 @@ does not specify one and none can be inferred.

Example

-
iex> Plausible.Cldr.default_territory()
+
iex> Plausible.Cldr.default_territory()
 :"001"
@@ -670,16 +670,16 @@ is inserted between words or sentences. The valid options are Examples -
iex> Plausible.Cldr.ellipsis("And furthermore")
+
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)
+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"
@@ -715,23 +715,23 @@ take an optional locale parameter for which a locale is not supplied.

Example

-
iex> Plausible.Cldr.put_locale("pl")
-iex> Plausible.Cldr.get_locale()
-%Cldr.LanguageTag{
+
iex> Plausible.Cldr.put_locale("pl")
+iex> Plausible.Cldr.get_locale()
+%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: [] + }
@@ -818,10 +818,10 @@ take an optional locale parameter for which a locale is not supplied.

Examples

-
iex> Plausible.Cldr.known_gettext_locale_name("en")
+
iex> Plausible.Cldr.known_gettext_locale_name("en")
 "en"
 
-iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
+iex> Plausible.Cldr.known_gettext_locale_name("en-SA")
 false
@@ -864,10 +864,10 @@ name is configured and available in Gettext.

Examples

-
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
@@ -941,10 +941,10 @@ to return the first known locale name from a list.

Examples

-
iex> Plausible.Cldr.known_locale_name(:"en-AU")
+
iex> Plausible.Cldr.known_locale_name(:"en-AU")
 :"en-AU"
 
-iex> Plausible.Cldr.known_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_locale_name(:"en-SA")
 false
@@ -986,10 +986,10 @@ name is configured and available in Cldr.

Examples

-
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
@@ -1043,8 +1043,8 @@ in this module or in Example -
iex> Plausible.Cldr.known_number_system_types()
-[:default, :finance, :native, :traditional]
+
iex> Plausible.Cldr.known_number_system_types()
+[:default, :finance, :native, :traditional]
@@ -1109,10 +1109,10 @@ and has RBNF rules defined.

Examples

-
iex> Plausible.Cldr.known_rbnf_locale_name(:en)
+
iex> Plausible.Cldr.known_rbnf_locale_name(:en)
 :en
 
-iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
+iex> Plausible.Cldr.known_rbnf_locale_name(:"en-SA")
 false
@@ -1155,10 +1155,10 @@ rules based number formats (RBNF).

Examples

-
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
@@ -1294,14 +1294,14 @@ CLDR backend defined by the t:Cldr.LanguageTag is se Examples
iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"en")
-{:ok, "en"}
+iex> Plausible.Cldr.put_gettext_locale(~l"en")
+{:ok, "en"}
 
 iex> import Cldr.LanguageTag.Sigil
-iex> Plausible.Cldr.put_gettext_locale(~l"de")
-{:error,
-  {Cldr.UnknownLocaleError,
-    "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
+
iex> Plausible.Cldr.put_gettext_locale(~l"de") +{:error, + {Cldr.UnknownLocaleError, + "Locale #Cldr.LanguageTag<de [validated]> does not map to a known gettext locale name"}}
@@ -1345,29 +1345,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"}}
@@ -1416,10 +1416,10 @@ The default is Examples -
iex> Plausible.Cldr.quote("Quoted String")
+
iex> Plausible.Cldr.quote("Quoted String")
 "“Quoted String”"
 
-iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
+iex> Plausible.Cldr.quote("Quoted String", locale: :ja)
 "「Quoted String」"
@@ -1550,47 +1550,47 @@ of a language tag.

Examples

-
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"}}
@@ -1660,23 +1660,23 @@ of a language tag.

Examples

-
iex> Plausible.Cldr.validate_number_system_type(:default)
-{:ok, :default}
+
iex> Plausible.Cldr.validate_number_system_type(:default)
+{:ok, :default}
 
-iex> Plausible.Cldr.validate_number_system_type(:traditional)
-{:ok, :traditional}
+iex> Plausible.Cldr.validate_number_system_type(:traditional)
+{:ok, :traditional}
 
-iex> Plausible.Cldr.validate_number_system_type(:latn)
-{
+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")
-{
+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 7607cfbdca..1b76b84d72 100644 --- a/Plausible.ClickhouseEventV2.html +++ b/Plausible.ClickhouseEventV2.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html index 827a3789a7..9317a340ae 100644 --- a/Plausible.ClickhouseRepo.html +++ b/Plausible.ClickhouseRepo.html @@ -14,7 +14,7 @@ - + @@ -845,23 +845,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 6a4e17b3a7..ef8b7fcedc 100644 --- a/Plausible.ClickhouseSessionV2.BoolUInt8.html +++ b/Plausible.ClickhouseSessionV2.BoolUInt8.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.ClickhouseSessionV2.html b/Plausible.ClickhouseSessionV2.html index 87ccd09b3d..4464557010 100644 --- a/Plausible.ClickhouseSessionV2.html +++ b/Plausible.ClickhouseSessionV2.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html index adecda39a3..125f2d7656 100644 --- a/Plausible.ConfigHelpers.html +++ b/Plausible.ConfigHelpers.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html index 9eaa54c152..34bb49c745 100644 --- a/Plausible.DataCase.html +++ b/Plausible.DataCase.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.NumericIDs.html b/Plausible.DataMigration.NumericIDs.html index 9573c59eb4..140a364ca5 100644 --- a/Plausible.DataMigration.NumericIDs.html +++ b/Plausible.DataMigration.NumericIDs.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.Repo.html b/Plausible.DataMigration.Repo.html index ee3852011e..4808c4c822 100644 --- a/Plausible.DataMigration.Repo.html +++ b/Plausible.DataMigration.Repo.html @@ -14,7 +14,7 @@ - + @@ -1152,23 +1152,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.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html index 63d2522eb0..6423c9abbd 100644 --- a/Plausible.DataMigration.VersionedSessions.html +++ b/Plausible.DataMigration.VersionedSessions.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.html b/Plausible.DataMigration.html index 62455b9b21..7642c6f0a9 100644 --- a/Plausible.DataMigration.html +++ b/Plausible.DataMigration.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DebugReplayInfo.html b/Plausible.DebugReplayInfo.html index ca7a76f456..8009bfdcb0 100644 --- a/Plausible.DebugReplayInfo.html +++ b/Plausible.DebugReplayInfo.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ecto.EventName.html b/Plausible.Ecto.EventName.html index b60e1b32c1..001607bc14 100644 --- a/Plausible.Ecto.EventName.html +++ b/Plausible.Ecto.EventName.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Factory.html b/Plausible.Factory.html index 3eeb1d75a7..c3c8a70f0a 100644 --- a/Plausible.Factory.html +++ b/Plausible.Factory.html @@ -14,7 +14,7 @@ - + @@ -485,6 +485,14 @@ Pages +
+ + +
+
site_membership_factory() @@ -563,7 +571,7 @@ Pages

api_key_factory()

- + View Source @@ -657,7 +665,7 @@ Pages

business_subscription_factory()

- + View Source @@ -679,7 +687,7 @@ Pages

ch_session_factory()

- + View Source @@ -701,7 +709,7 @@ Pages

country_rule_factory()

- + View Source @@ -835,7 +843,7 @@ Pages

enterprise_plan_factory()

- + View Source @@ -857,7 +865,7 @@ Pages

event_factory()

- + View Source @@ -907,7 +915,7 @@ Pages

goal_factory()

- + View Source @@ -929,7 +937,7 @@ Pages

google_auth_factory()

- + View Source @@ -951,7 +959,7 @@ Pages

growth_subscription_factory()

- + View Source @@ -973,7 +981,7 @@ Pages

imported_browsers_factory()

- + View Source @@ -995,7 +1003,7 @@ Pages

imported_devices_factory()

- + View Source @@ -1017,7 +1025,7 @@ Pages

imported_entry_pages_factory()

- + View Source @@ -1039,7 +1047,7 @@ Pages

imported_exit_pages_factory()

- + View Source @@ -1061,7 +1069,7 @@ Pages

imported_locations_factory()

- + View Source @@ -1083,7 +1091,7 @@ Pages

imported_operating_systems_factory()

- + View Source @@ -1105,7 +1113,7 @@ Pages

imported_pages_factory()

- + View Source @@ -1127,7 +1135,7 @@ Pages

imported_sources_factory()

- + View Source @@ -1149,7 +1157,7 @@ Pages

imported_visitors_factory()

- + View Source @@ -1329,7 +1337,7 @@ Pages

invitation_factory()

- + View Source @@ -1351,7 +1359,7 @@ Pages

ip_rule_factory()

- + View Source @@ -1373,7 +1381,7 @@ Pages

monthly_report_factory()

- + View Source @@ -1395,7 +1403,7 @@ Pages

pageview_factory()

- + View Source @@ -1465,7 +1473,7 @@ Pages

shared_link_factory()

- + View Source @@ -1498,6 +1506,28 @@ Pages
+
+
+
+ +
+ + + Link to this function + +

site_import_factory()

+ + + + View Source + + + +
+ +
+ +
@@ -1601,7 +1631,7 @@ Pages

subscription_factory()

- + View Source @@ -1645,7 +1675,7 @@ Pages

weekly_report_factory()

- + View Source diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html index 58a22a80de..c0acb01a49 100644 --- a/Plausible.Funnel.Const.html +++ b/Plausible.Funnel.Const.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Funnel.Step.html b/Plausible.Funnel.Step.html index 18ba713868..a8fc0a27ae 100644 --- a/Plausible.Funnel.Step.html +++ b/Plausible.Funnel.Step.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Funnel.html b/Plausible.Funnel.html index 970fe97f71..9b9e55459f 100644 --- a/Plausible.Funnel.html +++ b/Plausible.Funnel.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html index 0430320000..f85d809d0f 100644 --- a/Plausible.Funnels.html +++ b/Plausible.Funnels.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Geo.html b/Plausible.Geo.html index 8d0d12c784..d3ad5d6462 100644 --- a/Plausible.Geo.html +++ b/Plausible.Geo.html @@ -14,7 +14,7 @@ - + @@ -260,8 +260,8 @@ and MaxMind license key.

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"
@@ -301,8 +301,8 @@ asynchronously.

Examples

-

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
@@ -331,21 +331,21 @@ asynchronously.

Examples

-
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",
@@ -354,12 +354,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", @@ -368,20 +368,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", @@ -390,13 +390,13 @@ asynchronously.

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

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

+
} + } + ] +}
diff --git a/Plausible.Goal.Revenue.html b/Plausible.Goal.Revenue.html index 139bdaf626..5a1b8ebba9 100644 --- a/Plausible.Goal.Revenue.html +++ b/Plausible.Goal.Revenue.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Goal.html b/Plausible.Goal.html index 99e4dfdc93..81d3f9bd09 100644 --- a/Plausible.Goal.html +++ b/Plausible.Goal.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Goals.html b/Plausible.Goals.html index fbba0be857..76773ee643 100644 --- a/Plausible.Goals.html +++ b/Plausible.Goals.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Google.Api.Mock.html b/Plausible.Google.Api.Mock.html index 6d099fe3a2..05e99ff65f 100644 --- a/Plausible.Google.Api.Mock.html +++ b/Plausible.Google.Api.Mock.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Google.Api.html b/Plausible.Google.Api.html index eb7159ac82..ff2b8748d8 100644 --- a/Plausible.Google.Api.html +++ b/Plausible.Google.Api.html @@ -14,7 +14,7 @@ - + @@ -223,7 +223,7 @@ Pages
@@ -472,14 +472,16 @@ importing has finished or {:error, term()} when a re many times.

Useful links:

-
+
+ +
- + Link to this function -

import_authorize_url(site_id, redirect_to)

+

import_authorize_url(site_id, redirect_to, legacy \\ true)

diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html index 01d0e2b18a..f0021027bf 100644 --- a/Plausible.Google.HTTP.html +++ b/Plausible.Google.HTTP.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Google.ReportRequest.html b/Plausible.Google.ReportRequest.html index 5db5738b32..d32f03054d 100644 --- a/Plausible.Google.ReportRequest.html +++ b/Plausible.Google.ReportRequest.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html index dcd944f521..8c786ad513 100644 --- a/Plausible.HTTPClient.Interface.html +++ b/Plausible.HTTPClient.Interface.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.HTTPClient.Non200Error.html b/Plausible.HTTPClient.Non200Error.html index 529f9d1cb9..f580c21301 100644 --- a/Plausible.HTTPClient.Non200Error.html +++ b/Plausible.HTTPClient.Non200Error.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.HTTPClient.html b/Plausible.HTTPClient.html index 0f6dd18b8e..88280bad90 100644 --- a/Plausible.HTTPClient.html +++ b/Plausible.HTTPClient.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Helpers.JSON.html b/Plausible.Helpers.JSON.html index 93ac0ae4c4..9e4b1abaf7 100644 --- a/Plausible.Helpers.JSON.html +++ b/Plausible.Helpers.JSON.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.ImportDeletionRepo.html b/Plausible.ImportDeletionRepo.html index 8255b40b9c..883312a0f6 100644 --- a/Plausible.ImportDeletionRepo.html +++ b/Plausible.ImportDeletionRepo.html @@ -14,7 +14,7 @@ - + @@ -1143,23 +1143,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.Buffer.html b/Plausible.Imported.Buffer.html index b275ac8fcd..82f6f24390 100644 --- a/Plausible.Imported.Buffer.html +++ b/Plausible.Imported.Buffer.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Imported.CSVImporter.html b/Plausible.Imported.CSVImporter.html index d727b03e7f..05c3a2fb2f 100644 --- a/Plausible.Imported.CSVImporter.html +++ b/Plausible.Imported.CSVImporter.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Imported.ImportSources.html b/Plausible.Imported.ImportSources.html index 223d4aaeb4..1193cb5c9b 100644 --- a/Plausible.Imported.ImportSources.html +++ b/Plausible.Imported.ImportSources.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Imported.Importer.html b/Plausible.Imported.Importer.html index 47199b8921..f20ca535f2 100644 --- a/Plausible.Imported.Importer.html +++ b/Plausible.Imported.Importer.html @@ -14,7 +14,7 @@ - + @@ -178,30 +178,30 @@ scope of importer logic and is expected to be implemented separately.

In case it's necessary to run the whole import job fully synchronously, the Plausible.Workers.ImportAnalytics worker sends an Oban.Notifier message -on completion, failure or transient failure of the import.

A basic usage scenario looks like this:

{:ok, job} = Plausible.Imported.NoopImporter.new_import(
+on completion, failure or transient failure of the import.

A basic usage scenario looks like this:

{:ok, job} = Plausible.Imported.NoopImporter.new_import(
   site,
   user,
   start_date: ~D[2005-01-01],
-  end_date: Date.utc_today(),
+  end_date: Date.utc_today(),
   # this option is necessary to setup the calling process as listener
   listen?: true
-)
+)
 
-import_id = job.args[:import_id]
+import_id = job.args[:import_id]
 
-receive do
-  {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
-    IO.puts("Job completed")
+receive do
+  {:notification, :analytics_imports_jobs, %{"complete" => ^import_id}} ->
+    IO.puts("Job completed")
 
-  {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
-    IO.puts("Job failed transiently")
+  {:notification, :analytics_imports_jobs, %{"transient_fail" => ^import_id}} ->
+    IO.puts("Job failed transiently")
 
-  {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
-    IO.puts("Job failed permanently")
-after
+  {:notification, :analytics_imports_jobs, %{"fail" => ^import_id}} ->
+    IO.puts("Job failed permanently")
+after
   15_000 ->
-    IO.puts("Job didn't finish in 15 seconds")
-end

In a more realistic scenario, job scheduling will be done inside a GenServer process + IO.puts("Job didn't finish in 15 seconds") +end

In a more realistic scenario, job scheduling will be done inside a GenServer process like LiveView, where notifications can be listened for via handle_info/2.

@@ -282,6 +282,22 @@ like LiveView, where notifications can be listened for via
+ +
+

+ Functions +

+ +
+
+ listen() + +
+ +

Allows to explicitly start listening for importer job notifications.

+ +
+
@@ -519,6 +535,46 @@ like LiveView, where notifications can be listened for via + + + + + + +
+

+ + + + Functions +

+
+
+ + + +
+ +
+ +
@spec listen() :: :ok
+ +
+ +

Allows to explicitly start listening for importer job notifications.

Listener must explicitly filter out a subset of imports that apply to the given context.

diff --git a/Plausible.Imported.NoopImporter.html b/Plausible.Imported.NoopImporter.html index b5d435b6cf..ca082577a0 100644 --- a/Plausible.Imported.NoopImporter.html +++ b/Plausible.Imported.NoopImporter.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Imported.SiteImport.html b/Plausible.Imported.SiteImport.html index d8e7877456..8763fea1da 100644 --- a/Plausible.Imported.SiteImport.html +++ b/Plausible.Imported.SiteImport.html @@ -14,7 +14,7 @@ - + @@ -213,6 +213,14 @@ Pages
+
+ + +
+
importing() @@ -286,6 +294,7 @@ Pages imported_by: term(), imported_by_id: term(), inserted_at: term(), + legacy: term(), site: term(), site_id: term(), source: term(), @@ -322,7 +331,7 @@ Pages

complete_changeset(site_import, params \\ %{})

- + View Source @@ -350,7 +359,7 @@ Pages

completed()

- + View Source @@ -374,7 +383,7 @@ Pages

create_changeset(site, user, params)

- + View Source @@ -403,7 +412,7 @@ Pages

fail_changeset(site_import)

- + View Source @@ -431,7 +440,7 @@ Pages

failed()

- + View Source @@ -444,6 +453,34 @@ Pages
+
+
+
+ + + +
+ +
+ +
@spec from_legacy(Plausible.Site.ImportedData.t()) :: t()
+ +
+ +
@@ -455,7 +492,7 @@ Pages

importing()

- + View Source @@ -479,7 +516,7 @@ Pages

label(arg1)

- + View Source @@ -507,7 +544,7 @@ Pages

pending()

- + View Source @@ -531,7 +568,7 @@ Pages

start_changeset(site_import)

- + View Source diff --git a/Plausible.Imported.UniversalAnalytics.html b/Plausible.Imported.UniversalAnalytics.html index f9c92dfeb7..0bc410ab2c 100644 --- a/Plausible.Imported.UniversalAnalytics.html +++ b/Plausible.Imported.UniversalAnalytics.html @@ -14,7 +14,7 @@ - + @@ -207,7 +207,7 @@ Pages

from_report(data, site_id, import_id, table)

- + View Source @@ -229,7 +229,7 @@ Pages

import_data(site_import, opts)

- + View Source diff --git a/Plausible.Imported.html b/Plausible.Imported.html index 74ca342c72..e38b1ae12d 100644 --- a/Plausible.Imported.html +++ b/Plausible.Imported.html @@ -14,7 +14,7 @@ - + @@ -176,6 +176,14 @@ analytics formerly known as "Google Analytics"
  • + + + +
    list_all_imports(site) @@ -192,6 +200,16 @@ analytics formerly known as "Google Analytics"
  • + + + + + +
    load_import_data(site) @@ -200,6 +218,14 @@ analytics formerly known as "Google Analytics"
  • + + + +
    tables() @@ -230,7 +256,7 @@ analytics formerly known as "Google Analytics"
  • delete_imports_for_site(site) - + View Source @@ -258,7 +284,7 @@ analytics formerly known as "Google Analytics"
  • get_earliest_import(site) - + View Source @@ -276,6 +302,34 @@ analytics formerly known as "Google Analytics"
  • + + + +
    + +
    + +
    @spec get_import(non_neg_integer()) :: Plausible.Imported.SiteImport.t() | nil
    + +
    + +
  • @@ -287,7 +341,7 @@ analytics formerly known as "Google Analytics"
  • list_all_imports(site) - + View Source @@ -315,7 +369,7 @@ analytics formerly known as "Google Analytics"
  • list_complete_import_ids(site) - + View Source @@ -334,6 +388,28 @@ analytics formerly known as "Google Analytics"
  • + + + +
    + +

    See Plausible.Imported.Importer.listen/0.

    +
    +
  • @@ -343,6 +419,34 @@ analytics formerly known as "Google Analytics"
  • load_import_data(site) + + + View Source + + + +
  • + +
    + +
    + +
    @spec load_import_data(Plausible.Site.t()) :: Plausible.Site.t()
    + +
    + + +
    +
    +
    + + diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html index 4ec40aa2ce..f0e75a6477 100644 --- a/Plausible.IngestRepo.html +++ b/Plausible.IngestRepo.html @@ -14,7 +14,7 @@ - + @@ -1143,23 +1143,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 cc3f061790..7300f10691 100644 --- a/Plausible.Ingestion.Counters.Buffer.html +++ b/Plausible.Ingestion.Counters.Buffer.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ingestion.Counters.Record.html b/Plausible.Ingestion.Counters.Record.html index 09435acc1c..3bd3370bbe 100644 --- a/Plausible.Ingestion.Counters.Record.html +++ b/Plausible.Ingestion.Counters.Record.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ingestion.Counters.TelemetryHandler.html b/Plausible.Ingestion.Counters.TelemetryHandler.html index f96dc7a339..3cf04f835b 100644 --- a/Plausible.Ingestion.Counters.TelemetryHandler.html +++ b/Plausible.Ingestion.Counters.TelemetryHandler.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ingestion.Counters.html b/Plausible.Ingestion.Counters.html index 83c8d76ce7..abdd192cf7 100644 --- a/Plausible.Ingestion.Counters.html +++ b/Plausible.Ingestion.Counters.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ingestion.Event.Revenue.html b/Plausible.Ingestion.Event.Revenue.html index 6f0c234e03..ab82092dd4 100644 --- a/Plausible.Ingestion.Event.Revenue.html +++ b/Plausible.Ingestion.Event.Revenue.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ingestion.Event.html b/Plausible.Ingestion.Event.html index 8c4abe3834..905f95fe88 100644 --- a/Plausible.Ingestion.Event.html +++ b/Plausible.Ingestion.Event.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ingestion.Request.Revenue.html b/Plausible.Ingestion.Request.Revenue.html index 0d3074f306..69c772752e 100644 --- a/Plausible.Ingestion.Request.Revenue.html +++ b/Plausible.Ingestion.Request.Revenue.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ingestion.Request.html b/Plausible.Ingestion.Request.html index a0e3b2cd2f..6d46ce9436 100644 --- a/Plausible.Ingestion.Request.html +++ b/Plausible.Ingestion.Request.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.License.html b/Plausible.License.html index 2abe256c70..7b4e386504 100644 --- a/Plausible.License.html +++ b/Plausible.License.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html index c0773c12ee..396094215a 100644 --- a/Plausible.Mailer.html +++ b/Plausible.Mailer.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html index 58b1a9d32d..141edbf91f 100644 --- a/Plausible.MigrationUtils.html +++ b/Plausible.MigrationUtils.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.OpenTelemetry.Sampler.html b/Plausible.OpenTelemetry.Sampler.html index 49a7952db6..2ac619c13f 100644 --- a/Plausible.OpenTelemetry.Sampler.html +++ b/Plausible.OpenTelemetry.Sampler.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.PaddleApi.Mock.html b/Plausible.PaddleApi.Mock.html index 7599002424..d4cfd7e704 100644 --- a/Plausible.PaddleApi.Mock.html +++ b/Plausible.PaddleApi.Mock.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Pagination.html b/Plausible.Pagination.html index eb042e14d5..fa60916a5f 100644 --- a/Plausible.Pagination.html +++ b/Plausible.Pagination.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Plugins.API.Capabilities.html b/Plausible.Plugins.API.Capabilities.html index 022d4ae041..36d622be32 100644 --- a/Plausible.Plugins.API.Capabilities.html +++ b/Plausible.Plugins.API.Capabilities.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Plugins.API.CustomProps.html b/Plausible.Plugins.API.CustomProps.html index 9023b57036..cccc84e1e5 100644 --- a/Plausible.Plugins.API.CustomProps.html +++ b/Plausible.Plugins.API.CustomProps.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Plugins.API.Goals.html b/Plausible.Plugins.API.Goals.html index fcf0bfe86b..73f9a8bf11 100644 --- a/Plausible.Plugins.API.Goals.html +++ b/Plausible.Plugins.API.Goals.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Plugins.API.SharedLinks.html b/Plausible.Plugins.API.SharedLinks.html index 2d0fd048b1..d03c145d29 100644 --- a/Plausible.Plugins.API.SharedLinks.html +++ b/Plausible.Plugins.API.SharedLinks.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Plugins.API.Token.html b/Plausible.Plugins.API.Token.html index 5d8ec6fd13..88725b837d 100644 --- a/Plausible.Plugins.API.Token.html +++ b/Plausible.Plugins.API.Token.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Plugins.API.Tokens.html b/Plausible.Plugins.API.Tokens.html index 11982788bb..deb3760a3b 100644 --- a/Plausible.Plugins.API.Tokens.html +++ b/Plausible.Plugins.API.Tokens.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.PromEx.Plugins.PlausibleMetrics.html b/Plausible.PromEx.Plugins.PlausibleMetrics.html index 3ee39d6882..5b02a4c420 100644 --- a/Plausible.PromEx.Plugins.PlausibleMetrics.html +++ b/Plausible.PromEx.Plugins.PlausibleMetrics.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.PromEx.html b/Plausible.PromEx.html index dd38086abd..d1f63110e4 100644 --- a/Plausible.PromEx.html +++ b/Plausible.PromEx.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Props.html b/Plausible.Props.html index 798940ade2..15e91133b0 100644 --- a/Plausible.Props.html +++ b/Plausible.Props.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Purge.html b/Plausible.Purge.html index fc200a514d..510c39b612 100644 --- a/Plausible.Purge.html +++ b/Plausible.Purge.html @@ -14,7 +14,7 @@ - + @@ -187,6 +187,14 @@ asynchronously.

  • +

    + + +
    delete_native_stats!(site) @@ -247,6 +255,28 @@ asynchronously.

  • stats_start_date field.

    The stats_start_date is expected to get repopulated the next time Plausible.Sites.stats_start_date/1 is called.

    If the input argument is a site, all imported stats are deleted. If it's a site import, only imported stats for that import are deleted.

    +
  • + +
    + +
    + + + Link to this function + +

    delete_imported_stats!(site, import_id)

    + + + + View Source + + + +
    + +
    + +
    @@ -258,7 +288,7 @@ only imported stats for that import are deleted.

    delete_native_stats!(site)

    - + View Source @@ -286,7 +316,7 @@ only imported stats for that import are deleted.

    reset!(site)

    - + View Source diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html index 477d9e2b2e..280ec13883 100644 --- a/Plausible.RateLimit.html +++ b/Plausible.RateLimit.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Release.html b/Plausible.Release.html index ea1113519c..a3ded88f27 100644 --- a/Plausible.Release.html +++ b/Plausible.Release.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Repo.html b/Plausible.Repo.html index e8d5807009..5ae53c78b9 100644 --- a/Plausible.Repo.html +++ b/Plausible.Repo.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.S3.html b/Plausible.S3.html index 3068a2dc31..61f68c3f0d 100644 --- a/Plausible.S3.html +++ b/Plausible.S3.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html index 1b2c3b8b2a..4d5b92ae5e 100644 --- a/Plausible.Sentry.Client.html +++ b/Plausible.Sentry.Client.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.SentryFilter.html b/Plausible.SentryFilter.html index d528fd4f61..5e02b41612 100644 --- a/Plausible.SentryFilter.html +++ b/Plausible.SentryFilter.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Session.CacheStore.html b/Plausible.Session.CacheStore.html index 3d057860cc..893ff06478 100644 --- a/Plausible.Session.CacheStore.html +++ b/Plausible.Session.CacheStore.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Session.Salts.html b/Plausible.Session.Salts.html index 91b1b5b823..6579c4bd57 100644 --- a/Plausible.Session.Salts.html +++ b/Plausible.Session.Salts.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shield.CountryRule.html b/Plausible.Shield.CountryRule.html index 803794bc3b..9faadb3c07 100644 --- a/Plausible.Shield.CountryRule.html +++ b/Plausible.Shield.CountryRule.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shield.CountryRuleCache.html b/Plausible.Shield.CountryRuleCache.html index 703005b6d2..e33a9a6c67 100644 --- a/Plausible.Shield.CountryRuleCache.html +++ b/Plausible.Shield.CountryRuleCache.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html index 75b0a55094..5bf120db8d 100644 --- a/Plausible.Shield.IPRule.html +++ b/Plausible.Shield.IPRule.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shield.IPRuleCache.html b/Plausible.Shield.IPRuleCache.html index 7fbc94faf8..abd68ca806 100644 --- a/Plausible.Shield.IPRuleCache.html +++ b/Plausible.Shield.IPRuleCache.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shields.html b/Plausible.Shields.html index 90bbbbb5d6..9e3909007c 100644 --- a/Plausible.Shields.html +++ b/Plausible.Shields.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Cache.html b/Plausible.Site.Cache.html index 6321f53d9e..82b1f179e8 100644 --- a/Plausible.Site.Cache.html +++ b/Plausible.Site.Cache.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Domain.html b/Plausible.Site.Domain.html index 2b6bf58930..eebf982528 100644 --- a/Plausible.Site.Domain.html +++ b/Plausible.Site.Domain.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.GateKeeper.html b/Plausible.Site.GateKeeper.html index b71afacd08..bd31dd8964 100644 --- a/Plausible.Site.GateKeeper.html +++ b/Plausible.Site.GateKeeper.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.GoogleAuth.html b/Plausible.Site.GoogleAuth.html index 7f6f3ce3ec..17554241e6 100644 --- a/Plausible.Site.GoogleAuth.html +++ b/Plausible.Site.GoogleAuth.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.ImportedData.html b/Plausible.Site.ImportedData.html index a6d3f037f3..27bca21482 100644 --- a/Plausible.Site.ImportedData.html +++ b/Plausible.Site.ImportedData.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Membership.html b/Plausible.Site.Membership.html index ae94b42367..c00d4d2e50 100644 --- a/Plausible.Site.Membership.html +++ b/Plausible.Site.Membership.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Memberships.AcceptInvitation.html b/Plausible.Site.Memberships.AcceptInvitation.html index 2d54298755..430eb931da 100644 --- a/Plausible.Site.Memberships.AcceptInvitation.html +++ b/Plausible.Site.Memberships.AcceptInvitation.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Memberships.CreateInvitation.html b/Plausible.Site.Memberships.CreateInvitation.html index 9d4cd6f5fb..41b7f83271 100644 --- a/Plausible.Site.Memberships.CreateInvitation.html +++ b/Plausible.Site.Memberships.CreateInvitation.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Memberships.RejectInvitation.html b/Plausible.Site.Memberships.RejectInvitation.html index f25f4758f2..45252874a3 100644 --- a/Plausible.Site.Memberships.RejectInvitation.html +++ b/Plausible.Site.Memberships.RejectInvitation.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Memberships.RemoveInvitation.html b/Plausible.Site.Memberships.RemoveInvitation.html index 26d4edecf2..7333b49564 100644 --- a/Plausible.Site.Memberships.RemoveInvitation.html +++ b/Plausible.Site.Memberships.RemoveInvitation.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Memberships.html b/Plausible.Site.Memberships.html index 326c9e59d6..3308f31a72 100644 --- a/Plausible.Site.Memberships.html +++ b/Plausible.Site.Memberships.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.MonthlyReport.html b/Plausible.Site.MonthlyReport.html index 96b5319603..c7f5ca5aa7 100644 --- a/Plausible.Site.MonthlyReport.html +++ b/Plausible.Site.MonthlyReport.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Removal.html b/Plausible.Site.Removal.html index e5f7453790..e8308c13b4 100644 --- a/Plausible.Site.Removal.html +++ b/Plausible.Site.Removal.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.SharedLink.html b/Plausible.Site.SharedLink.html index ba31483df3..afa87c47b1 100644 --- a/Plausible.Site.SharedLink.html +++ b/Plausible.Site.SharedLink.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.SpikeNotification.html b/Plausible.Site.SpikeNotification.html index 019f363bd9..4c31bfef94 100644 --- a/Plausible.Site.SpikeNotification.html +++ b/Plausible.Site.SpikeNotification.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.UserPreference.html b/Plausible.Site.UserPreference.html index 7a91297029..65dd8dc36b 100644 --- a/Plausible.Site.UserPreference.html +++ b/Plausible.Site.UserPreference.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.WeeklyReport.html b/Plausible.Site.WeeklyReport.html index 5da0f7fe73..fb843b4722 100644 --- a/Plausible.Site.WeeklyReport.html +++ b/Plausible.Site.WeeklyReport.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.html b/Plausible.Site.html index a53e663a8a..0c881a96d2 100644 --- a/Plausible.Site.html +++ b/Plausible.Site.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html index a26498afff..bc2403c843 100644 --- a/Plausible.SiteAdmin.html +++ b/Plausible.SiteAdmin.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Sites.html b/Plausible.Sites.html index 522b916802..08149fcf19 100644 --- a/Plausible.Sites.html +++ b/Plausible.Sites.html @@ -14,7 +14,7 @@ - + @@ -297,6 +297,14 @@ This function does 2 transformations: + +
    owned_site_ids(user) @@ -478,7 +486,7 @@ does not have stats yet.

    create_shared_link(site, name, password \\ nil)

    - + View Source @@ -546,7 +554,7 @@ does not have stats yet.

    get_for_user(user_id, domain, roles \\ [:owner, :admin, :viewer])

    - + View Source @@ -570,7 +578,7 @@ does not have stats yet.

    get_for_user!(user_id, domain, roles \\ [:owner, :admin, :viewer])

    - + View Source @@ -592,7 +600,7 @@ does not have stats yet.

    has_admin_access?(user_id, site)

    - + View Source @@ -614,7 +622,7 @@ does not have stats yet.

    has_goals?(site)

    - + View Source @@ -636,7 +644,7 @@ does not have stats yet.

    has_stats?(site)

    - + View Source @@ -658,7 +666,7 @@ does not have stats yet.

    is_member?(user_id, site)

    - + View Source @@ -786,7 +794,7 @@ This function does 2 transformations:

    locked?(site)

    - + View Source @@ -797,6 +805,34 @@ This function does 2 transformations:
    +
    +
    +
    + +
    + + + Link to this function + +

    native_stats_start_date(site)

    + + + + View Source + + + +
    + +
    + +
    + +
    @spec native_stats_start_date(Plausible.Site.t()) :: Date.t() | nil
    + +
    + +
    @@ -808,7 +844,7 @@ This function does 2 transformations:

    owned_site_ids(user)

    - + View Source @@ -830,7 +866,7 @@ This function does 2 transformations:

    owned_sites_count(user)

    - + View Source @@ -852,7 +888,7 @@ This function does 2 transformations:

    owned_sites_domains(user)

    - + View Source @@ -874,7 +910,7 @@ This function does 2 transformations:

    role(user_id, site)

    - + View Source @@ -925,7 +961,7 @@ This function does 2 transformations:

    shared_link_url(site, link)

    - + View Source diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html index 1d73599aa2..5a5f3170db 100644 --- a/Plausible.Stats.Aggregate.html +++ b/Plausible.Stats.Aggregate.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Base.html b/Plausible.Stats.Base.html index 0f91c8fa8a..aac0f478c6 100644 --- a/Plausible.Stats.Base.html +++ b/Plausible.Stats.Base.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Breakdown.html b/Plausible.Stats.Breakdown.html index 00b72e2a48..62db2186b6 100644 --- a/Plausible.Stats.Breakdown.html +++ b/Plausible.Stats.Breakdown.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Clickhouse.html b/Plausible.Stats.Clickhouse.html index e5fa7445ac..f39de2e49e 100644 --- a/Plausible.Stats.Clickhouse.html +++ b/Plausible.Stats.Clickhouse.html @@ -14,7 +14,7 @@ - + @@ -187,6 +187,14 @@ Pages + +
    last_24h_visitors_hourly_intervals(sites, now \\ NaiveDateTime.utc_now()) @@ -241,7 +249,7 @@ Pages

    current_visitors(site, query)

    - + View Source @@ -265,7 +273,7 @@ Pages

    empty_24h_visitors_hourly_intervals(sites, now \\ NaiveDateTime.utc_now())

    - + View Source @@ -294,7 +302,7 @@ Pages

    has_pageviews?(site)

    - + View Source @@ -327,6 +335,36 @@ Pages
    +
    +
    +
    + +
    + + + Link to this function + +

    imported_pageview_counts(site)

    + + + + View Source + + + +
    + +
    + +
    + +
    @spec imported_pageview_counts(Plausible.Site.t()) :: %{
    +  required(non_neg_integer()) => non_neg_integer()
    +}
    + +
    + +
    @@ -340,7 +378,7 @@ Pages

    last_24h_visitors_hourly_intervals(sites, now \\ NaiveDateTime.utc_now())

    - + View Source @@ -397,7 +435,7 @@ Pages

    top_sources_for_spike(site, query, limit, page)

    - + View Source @@ -419,7 +457,7 @@ Pages

    usage_breakdown(domains, date_range)

    - + View Source diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html index a3ea0f253f..87a9d0058a 100644 --- a/Plausible.Stats.Compare.html +++ b/Plausible.Stats.Compare.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Comparisons.html b/Plausible.Stats.Comparisons.html index a4d579873a..5919ab27b4 100644 --- a/Plausible.Stats.Comparisons.html +++ b/Plausible.Stats.Comparisons.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.CurrentVisitors.html b/Plausible.Stats.CurrentVisitors.html index ddd6ac2c58..a8cf1013df 100644 --- a/Plausible.Stats.CurrentVisitors.html +++ b/Plausible.Stats.CurrentVisitors.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.CustomProps.html b/Plausible.Stats.CustomProps.html index 1f77b348ce..f4a258ab44 100644 --- a/Plausible.Stats.CustomProps.html +++ b/Plausible.Stats.CustomProps.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.EmailReport.html b/Plausible.Stats.EmailReport.html index 2ba9edaaad..3591f95c8e 100644 --- a/Plausible.Stats.EmailReport.html +++ b/Plausible.Stats.EmailReport.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.FilterSuggestions.html b/Plausible.Stats.FilterSuggestions.html index 469aa5aaea..7c66418397 100644 --- a/Plausible.Stats.FilterSuggestions.html +++ b/Plausible.Stats.FilterSuggestions.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Filters.Utils.html b/Plausible.Stats.Filters.Utils.html index 28b62d6fd5..6055c8caad 100644 --- a/Plausible.Stats.Filters.Utils.html +++ b/Plausible.Stats.Filters.Utils.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Filters.html b/Plausible.Stats.Filters.html index 88eacbf2f3..62e63adae8 100644 --- a/Plausible.Stats.Filters.html +++ b/Plausible.Stats.Filters.html @@ -14,7 +14,7 @@ - + @@ -253,14 +253,14 @@ Pages Examples: -
    iex> Filters.parse("{\"page\":\"/blog/**\"}")
    -%{"event:page" => {:matches, "/blog/**"}}
    +
    iex> Filters.parse("{\"page\":\"/blog/**\"}")
    +%{"event:page" => {:matches, "/blog/**"}}
     
    -iex> Filters.parse("visit:browser!=Chrome")
    -%{"visit:browser" => {:is_not, "Chrome"}}
    +iex> Filters.parse("visit:browser!=Chrome")
    +%{"visit:browser" => {:is_not, "Chrome"}}
     
    -iex> Filters.parse(nil)
    -%{}
    +
    iex> Filters.parse(nil) +%{}
    diff --git a/Plausible.Stats.Fragments.html b/Plausible.Stats.Fragments.html index 4a6dca0a3f..703953f3b3 100644 --- a/Plausible.Stats.Fragments.html +++ b/Plausible.Stats.Fragments.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Funnel.html b/Plausible.Stats.Funnel.html index 6bc4bbc57a..841bdb918a 100644 --- a/Plausible.Stats.Funnel.html +++ b/Plausible.Stats.Funnel.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Goal.Revenue.html b/Plausible.Stats.Goal.Revenue.html index c5e6d0b888..b19523ebb3 100644 --- a/Plausible.Stats.Goal.Revenue.html +++ b/Plausible.Stats.Goal.Revenue.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html index ce1a63680c..7548c1a291 100644 --- a/Plausible.Stats.Imported.html +++ b/Plausible.Stats.Imported.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Interval.html b/Plausible.Stats.Interval.html index 89052eab5a..5170652d4e 100644 --- a/Plausible.Stats.Interval.html +++ b/Plausible.Stats.Interval.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Props.html b/Plausible.Stats.Props.html index e62c61282a..c7f1ed6990 100644 --- a/Plausible.Stats.Props.html +++ b/Plausible.Stats.Props.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Query.html b/Plausible.Stats.Query.html index a1a89c778d..1d69a3b74a 100644 --- a/Plausible.Stats.Query.html +++ b/Plausible.Stats.Query.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html index 208e125693..fd66082957 100644 --- a/Plausible.Stats.Sampling.html +++ b/Plausible.Stats.Sampling.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html index 701b692106..11bb3c2b2e 100644 --- a/Plausible.Stats.Timeseries.html +++ b/Plausible.Stats.Timeseries.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Util.html b/Plausible.Stats.Util.html index 2c6e0fe8ec..88f602590b 100644 --- a/Plausible.Stats.Util.html +++ b/Plausible.Stats.Util.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.html b/Plausible.Stats.html index 1ae6ffd81d..88defe6928 100644 --- a/Plausible.Stats.html +++ b/Plausible.Stats.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html index d15f462566..135746c7fa 100644 --- a/Plausible.Test.Support.HTML.html +++ b/Plausible.Test.Support.HTML.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Test.Support.HTTPMocker.html b/Plausible.Test.Support.HTTPMocker.html index baac0ee77c..ff3b69712d 100644 --- a/Plausible.Test.Support.HTTPMocker.html +++ b/Plausible.Test.Support.HTTPMocker.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.TestUtils.html b/Plausible.TestUtils.html index 344f1b52d6..792d58c6a1 100644 --- a/Plausible.TestUtils.html +++ b/Plausible.TestUtils.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Themes.html b/Plausible.Themes.html index aca76e1702..32d20d7de3 100644 --- a/Plausible.Themes.html +++ b/Plausible.Themes.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html index 3d1ea618a5..6ef47a8ef3 100644 --- a/Plausible.Timezones.html +++ b/Plausible.Timezones.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Users.html b/Plausible.Users.html index c43e6f77e2..e07de385bb 100644 --- a/Plausible.Users.html +++ b/Plausible.Users.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.AcceptTrafficUntil.html b/Plausible.Workers.AcceptTrafficUntil.html index f29c10ab7b..4ebcfdf8da 100644 --- a/Plausible.Workers.AcceptTrafficUntil.html +++ b/Plausible.Workers.AcceptTrafficUntil.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.CheckUsage.html b/Plausible.Workers.CheckUsage.html index 8906cbe663..14ea061d65 100644 --- a/Plausible.Workers.CheckUsage.html +++ b/Plausible.Workers.CheckUsage.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.CleanInvitations.html b/Plausible.Workers.CleanInvitations.html index 351e048f9d..4ceb9ec95d 100644 --- a/Plausible.Workers.CleanInvitations.html +++ b/Plausible.Workers.CleanInvitations.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html index 7273c4047f..af84d98729 100644 --- a/Plausible.Workers.ExpireDomainChangeTransitions.html +++ b/Plausible.Workers.ExpireDomainChangeTransitions.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html index 058355811f..dfdf806a19 100644 --- a/Plausible.Workers.ImportAnalytics.html +++ b/Plausible.Workers.ImportAnalytics.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html index 39a09b2aad..92d1ed212c 100644 --- a/Plausible.Workers.LockSites.html +++ b/Plausible.Workers.LockSites.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.NotifyAnnualRenewal.html b/Plausible.Workers.NotifyAnnualRenewal.html index f7c028b56e..4d83021184 100644 --- a/Plausible.Workers.NotifyAnnualRenewal.html +++ b/Plausible.Workers.NotifyAnnualRenewal.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html index fd18d0ba4b..744b6fa8f4 100644 --- a/Plausible.Workers.RotateSalts.html +++ b/Plausible.Workers.RotateSalts.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.ScheduleEmailReports.html b/Plausible.Workers.ScheduleEmailReports.html index efe6d061b3..7c851b4dcc 100644 --- a/Plausible.Workers.ScheduleEmailReports.html +++ b/Plausible.Workers.ScheduleEmailReports.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.SendCheckStatsEmails.html b/Plausible.Workers.SendCheckStatsEmails.html index d7b1b19010..2d8f751db4 100644 --- a/Plausible.Workers.SendCheckStatsEmails.html +++ b/Plausible.Workers.SendCheckStatsEmails.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.SendEmailReport.html b/Plausible.Workers.SendEmailReport.html index c2c34ba5b9..bb630d7860 100644 --- a/Plausible.Workers.SendEmailReport.html +++ b/Plausible.Workers.SendEmailReport.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.SendSiteSetupEmails.html b/Plausible.Workers.SendSiteSetupEmails.html index 45d3ed33fd..beebcb28f7 100644 --- a/Plausible.Workers.SendSiteSetupEmails.html +++ b/Plausible.Workers.SendSiteSetupEmails.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.SendTrialNotifications.html b/Plausible.Workers.SendTrialNotifications.html index f6df230e7e..97687f463b 100644 --- a/Plausible.Workers.SendTrialNotifications.html +++ b/Plausible.Workers.SendTrialNotifications.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.SpikeNotifier.html b/Plausible.Workers.SpikeNotifier.html index 3289a65526..0cad9350f3 100644 --- a/Plausible.Workers.SpikeNotifier.html +++ b/Plausible.Workers.SpikeNotifier.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.epub b/Plausible.epub index d1c9821920387b3d593de5385fb84d30fd69e204..a43a04aa9efbda73829f84d4df9756d06b69cd80 100644 GIT binary patch delta 169285 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"hNk<|Y;M@)g#iUW9oSVxmR6 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

    ZCc2&{}`#2lQ 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≪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 AKL7v# diff --git a/Plausible.html b/Plausible.html index 0a16a78528..f63be261cb 100644 --- a/Plausible.html +++ b/Plausible.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AdminController.html b/PlausibleWeb.AdminController.html index 9e176e7a4e..251fae4bac 100644 --- a/PlausibleWeb.AdminController.html +++ b/PlausibleWeb.AdminController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Api.ExternalController.html b/PlausibleWeb.Api.ExternalController.html index 7ef5815f50..50517fea6f 100644 --- a/PlausibleWeb.Api.ExternalController.html +++ b/PlausibleWeb.Api.ExternalController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Api.ExternalSitesController.html b/PlausibleWeb.Api.ExternalSitesController.html index dd6bac33b5..16c9b9ff06 100644 --- a/PlausibleWeb.Api.ExternalSitesController.html +++ b/PlausibleWeb.Api.ExternalSitesController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Api.ExternalStatsController.html b/PlausibleWeb.Api.ExternalStatsController.html index 59ee899b6f..c25a420e90 100644 --- a/PlausibleWeb.Api.ExternalStatsController.html +++ b/PlausibleWeb.Api.ExternalStatsController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Api.Helpers.html b/PlausibleWeb.Api.Helpers.html index c897cfcf08..eb998c2c60 100644 --- a/PlausibleWeb.Api.Helpers.html +++ b/PlausibleWeb.Api.Helpers.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Api.InternalController.html b/PlausibleWeb.Api.InternalController.html index 5a670a5609..c7fbc67b93 100644 --- a/PlausibleWeb.Api.InternalController.html +++ b/PlausibleWeb.Api.InternalController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Api.PaddleController.html b/PlausibleWeb.Api.PaddleController.html index dcb57bd3ce..8f733009df 100644 --- a/PlausibleWeb.Api.PaddleController.html +++ b/PlausibleWeb.Api.PaddleController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Api.StatsController.html b/PlausibleWeb.Api.StatsController.html index 556e8abb34..4c77320b12 100644 --- a/PlausibleWeb.Api.StatsController.html +++ b/PlausibleWeb.Api.StatsController.html @@ -14,7 +14,7 @@ - + @@ -747,13 +747,13 @@ and month. The default depends on the Plausible.Query.from/2 for each default.

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

  • 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"
    -}

    +}

    @@ -768,20 +768,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 f9c2a41df5..eba6317946 100644 --- a/PlausibleWeb.AuthController.html +++ b/PlausibleWeb.AuthController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AuthPlug.html b/PlausibleWeb.AuthPlug.html index c46e9c2485..5706b9909c 100644 --- a/PlausibleWeb.AuthPlug.html +++ b/PlausibleWeb.AuthPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AuthView.html b/PlausibleWeb.AuthView.html index f2b9e1c16f..2252cb1928 100644 --- a/PlausibleWeb.AuthView.html +++ b/PlausibleWeb.AuthView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AuthorizeSiteAccess.html b/PlausibleWeb.AuthorizeSiteAccess.html index bcd7e8f2ea..b737440b24 100644 --- a/PlausibleWeb.AuthorizeSiteAccess.html +++ b/PlausibleWeb.AuthorizeSiteAccess.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AuthorizeSitesApiPlug.html b/PlausibleWeb.AuthorizeSitesApiPlug.html index be7fdd2a28..88276c9c1c 100644 --- a/PlausibleWeb.AuthorizeSitesApiPlug.html +++ b/PlausibleWeb.AuthorizeSitesApiPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AuthorizeStatsApiPlug.html b/PlausibleWeb.AuthorizeStatsApiPlug.html index d770c4b08e..825e0e82b9 100644 --- a/PlausibleWeb.AuthorizeStatsApiPlug.html +++ b/PlausibleWeb.AuthorizeStatsApiPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AvatarController.html b/PlausibleWeb.AvatarController.html index 6b7548e1ca..b42ce2c353 100644 --- a/PlausibleWeb.AvatarController.html +++ b/PlausibleWeb.AvatarController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.BillingController.html b/PlausibleWeb.BillingController.html index b0ed72e1ea..978d069010 100644 --- a/PlausibleWeb.BillingController.html +++ b/PlausibleWeb.BillingController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.BillingView.html b/PlausibleWeb.BillingView.html index 342d337466..fbae369f13 100644 --- a/PlausibleWeb.BillingView.html +++ b/PlausibleWeb.BillingView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.CRMAuthPlug.html b/PlausibleWeb.CRMAuthPlug.html index f2c9158752..e08ea38e8d 100644 --- a/PlausibleWeb.CRMAuthPlug.html +++ b/PlausibleWeb.CRMAuthPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Captcha.html b/PlausibleWeb.Captcha.html index a0b2d54371..18ae470173 100644 --- a/PlausibleWeb.Captcha.html +++ b/PlausibleWeb.Captcha.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Components.Billing.PlanBenefits.html b/PlausibleWeb.Components.Billing.PlanBenefits.html index bfc95bc8db..87d010e8ab 100644 --- a/PlausibleWeb.Components.Billing.PlanBenefits.html +++ b/PlausibleWeb.Components.Billing.PlanBenefits.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Components.Generic.html b/PlausibleWeb.Components.Generic.html index 5bcbbf8fe7..4f79027836 100644 --- a/PlausibleWeb.Components.Generic.html +++ b/PlausibleWeb.Components.Generic.html @@ -14,7 +14,7 @@ - + @@ -165,7 +165,7 @@ Pages -

    Attributes

    • type (:string) - Defaults to "button".
    • class (:string) - Defaults to "".
    • disabled (:boolean) - Defaults to false.
    • Global attributes are accepted.

    Slots

    • inner_block
    +

    Attributes

    • type (:string) - Defaults to "button".
    • theme (:string) - Defaults to "primary".
    • class (:string) - Defaults to "".
    • disabled (:boolean) - Defaults to false.
    • Global attributes are accepted.

    Slots

    • inner_block
    @@ -175,7 +175,7 @@ Pages -

    Attributes

    • href (:string) (required)
    • class (:string) - Defaults to "".
    • Global attributes are accepted.

    Slots

    • inner_block
    +

    Attributes

    • href (:string) (required)
    • class (:string) - Defaults to "".
    • theme (:string) - Defaults to "primary".
    • disabled (:boolean) - Defaults to false.
    • Global attributes are accepted.

    Slots

    • inner_block
    @@ -281,7 +281,7 @@ Pages

    button(assigns)

    - + View Source @@ -297,7 +297,7 @@ Pages Attributes -
    • type (:string) - Defaults to "button".
    • class (:string) - Defaults to "".
    • disabled (:boolean) - Defaults to false.
    • Global attributes are accepted.

    +
    • type (:string) - Defaults to "button".
    • theme (:string) - Defaults to "primary".
    • class (:string) - Defaults to "".
    • disabled (:boolean) - Defaults to false.
    • Global attributes are accepted.

    @@ -315,7 +315,7 @@ Pages

    button_link(assigns)

    - + View Source @@ -331,7 +331,7 @@ Pages Attributes -
    • href (:string) (required)
    • class (:string) - Defaults to "".
    • Global attributes are accepted.

    +
    • href (:string) (required)
    • class (:string) - Defaults to "".
    • theme (:string) - Defaults to "primary".
    • disabled (:boolean) - Defaults to false.
    • Global attributes are accepted.

    @@ -349,7 +349,7 @@ Pages

    docs_info(assigns)

    - + View Source @@ -377,7 +377,7 @@ Pages

    dropdown(assigns)

    - + View Source @@ -405,7 +405,7 @@ Pages

    dropdown_link(assigns)

    - + View Source @@ -439,7 +439,7 @@ Pages

    dynamic_icon(assigns)

    - + View Source @@ -467,7 +467,7 @@ Pages

    notice(assigns)

    - + View Source @@ -501,7 +501,7 @@ Pages

    spinner(assigns)

    - + View Source @@ -529,7 +529,7 @@ Pages

    styled_link(assigns)

    - + View Source @@ -563,7 +563,7 @@ Pages

    unstyled_link(assigns)

    - + View Source diff --git a/PlausibleWeb.Components.Google.html b/PlausibleWeb.Components.Google.html index dad93db7a6..c08b0ad7aa 100644 --- a/PlausibleWeb.Components.Google.html +++ b/PlausibleWeb.Components.Google.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Components.Settings.html b/PlausibleWeb.Components.Settings.html index cef394fcbd..ba6ae59fec 100644 --- a/PlausibleWeb.Components.Settings.html +++ b/PlausibleWeb.Components.Settings.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Components.Site.Feature.html b/PlausibleWeb.Components.Site.Feature.html index 17519371c7..9f729af477 100644 --- a/PlausibleWeb.Components.Site.Feature.html +++ b/PlausibleWeb.Components.Site.Feature.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Components.TwoFactor.html b/PlausibleWeb.Components.TwoFactor.html index f8c3c24df8..2667e02c3a 100644 --- a/PlausibleWeb.Components.TwoFactor.html +++ b/PlausibleWeb.Components.TwoFactor.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.ConnCase.html b/PlausibleWeb.ConnCase.html index f743e09a9f..90c637c6a8 100644 --- a/PlausibleWeb.ConnCase.html +++ b/PlausibleWeb.ConnCase.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.ControllerHelpers.html b/PlausibleWeb.ControllerHelpers.html index 2a2e918853..eca4395c66 100644 --- a/PlausibleWeb.ControllerHelpers.html +++ b/PlausibleWeb.ControllerHelpers.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Controllers.API.Revenue.html b/PlausibleWeb.Controllers.API.Revenue.html index f1beda9701..2a3d51e46d 100644 --- a/PlausibleWeb.Controllers.API.Revenue.html +++ b/PlausibleWeb.Controllers.API.Revenue.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Dogfood.html b/PlausibleWeb.Dogfood.html index 404461251f..a385702412 100644 --- a/PlausibleWeb.Dogfood.html +++ b/PlausibleWeb.Dogfood.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Email.html b/PlausibleWeb.Email.html index 4e2d5245fb..5989cac609 100644 --- a/PlausibleWeb.Email.html +++ b/PlausibleWeb.Email.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.EmailView.html b/PlausibleWeb.EmailView.html index e751f9433f..7b35f31889 100644 --- a/PlausibleWeb.EmailView.html +++ b/PlausibleWeb.EmailView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Endpoint.html b/PlausibleWeb.Endpoint.html index 074fa0dfb2..40df025ce1 100644 --- a/PlausibleWeb.Endpoint.html +++ b/PlausibleWeb.Endpoint.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.ErrorHelpers.html b/PlausibleWeb.ErrorHelpers.html index 768822f193..6547e00ada 100644 --- a/PlausibleWeb.ErrorHelpers.html +++ b/PlausibleWeb.ErrorHelpers.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.ErrorReportController.html b/PlausibleWeb.ErrorReportController.html index 92beb66168..c36890c814 100644 --- a/PlausibleWeb.ErrorReportController.html +++ b/PlausibleWeb.ErrorReportController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.ErrorView.html b/PlausibleWeb.ErrorView.html index 6f0b7f69fd..cd552f0d9d 100644 --- a/PlausibleWeb.ErrorView.html +++ b/PlausibleWeb.ErrorView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Favicon.html b/PlausibleWeb.Favicon.html index d311372a9c..0f64432e54 100644 --- a/PlausibleWeb.Favicon.html +++ b/PlausibleWeb.Favicon.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.FirstLaunchPlug.Test.html b/PlausibleWeb.FirstLaunchPlug.Test.html index e1bc0f8a60..eef6b7d63b 100644 --- a/PlausibleWeb.FirstLaunchPlug.Test.html +++ b/PlausibleWeb.FirstLaunchPlug.Test.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.FirstLaunchPlug.html b/PlausibleWeb.FirstLaunchPlug.html index 90cf93d498..93918acf2b 100644 --- a/PlausibleWeb.FirstLaunchPlug.html +++ b/PlausibleWeb.FirstLaunchPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.FormHelpers.html b/PlausibleWeb.FormHelpers.html index 780ab93a0c..576a019d08 100644 --- a/PlausibleWeb.FormHelpers.html +++ b/PlausibleWeb.FormHelpers.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.InvitationController.html b/PlausibleWeb.InvitationController.html index 084f180773..796a0b7f5d 100644 --- a/PlausibleWeb.InvitationController.html +++ b/PlausibleWeb.InvitationController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.LastSeenPlug.html b/PlausibleWeb.LastSeenPlug.html index 17a1dac2e7..09e3bb07e4 100644 --- a/PlausibleWeb.LastSeenPlug.html +++ b/PlausibleWeb.LastSeenPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.LayoutView.JWT.html b/PlausibleWeb.LayoutView.JWT.html index a95e75e51d..c2abc9225d 100644 --- a/PlausibleWeb.LayoutView.JWT.html +++ b/PlausibleWeb.LayoutView.JWT.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.LayoutView.html b/PlausibleWeb.LayoutView.html index f185bc5267..36198cf53c 100644 --- a/PlausibleWeb.LayoutView.html +++ b/PlausibleWeb.LayoutView.html @@ -14,7 +14,7 @@ - + @@ -487,7 +487,7 @@ to render a particular template.

    flat_settings_options(conn)

    - + View Source @@ -531,7 +531,7 @@ to render a particular template.

    grace_period_end(user)

    - + View Source @@ -575,7 +575,7 @@ to render a particular template.

    is_current_tab(conn, tab)

    - + View Source @@ -687,7 +687,7 @@ to render a particular template.

    render_layout(layout, assigns, list)

    - + View Source @@ -783,7 +783,7 @@ to render a particular template.

    trial_notificaton(user)

    - + View Source diff --git a/PlausibleWeb.Live.ChoosePlan.html b/PlausibleWeb.Live.ChoosePlan.html index fc377e6334..dc5b70bb59 100644 --- a/PlausibleWeb.Live.ChoosePlan.html +++ b/PlausibleWeb.Live.ChoosePlan.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html b/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html index e4def9afea..15ed583a51 100644 --- a/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html +++ b/PlausibleWeb.Live.Components.ComboBox.StaticSearch.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Components.ComboBox.html b/PlausibleWeb.Live.Components.ComboBox.html index bb1ff74492..bae9a46dfe 100644 --- a/PlausibleWeb.Live.Components.ComboBox.html +++ b/PlausibleWeb.Live.Components.ComboBox.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Components.Form.html b/PlausibleWeb.Live.Components.Form.html index 77963c99f0..1c752a6280 100644 --- a/PlausibleWeb.Live.Components.Form.html +++ b/PlausibleWeb.Live.Components.Form.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Components.Modal.html b/PlausibleWeb.Live.Components.Modal.html index 3bfc43a3ee..685d51138b 100644 --- a/PlausibleWeb.Live.Components.Modal.html +++ b/PlausibleWeb.Live.Components.Modal.html @@ -14,7 +14,7 @@ - + @@ -153,18 +153,18 @@ on connections with high latency.

    Usage

    An example use case for a modal is embedding a form inside -existing live view which allows adding new entries of some kind:

    <.live_component module={Modal} id="some-form-modal">
    +existing live view which allows adding new entries of some kind:

    <.live_component module={Modal} id="some-form-modal">
       <.live_component
    -    module={SomeForm}
    +    module={SomeForm}
         id="some-form"
    -    on_save_form={
    -      fn entry, socket ->
    -        send(self(), {:entry_added, entry})
    -        Modal.close(socket, "some-form-modal")
    -      end
    -    }
    +    on_save_form={
    +      fn entry, socket ->
    +        send(self(), {:entry_added, entry})
    +        Modal.close(socket, "some-form-modal")
    +      end
    +    }
       />
    -</.live_component>

    Then somewhere in the same live view the modal is rendered in:

    <.button x-data x-on:click={Modal.JS.open("goals-form-modal")}>
    +</.live_component>

    Then somewhere in the same live view the modal is rendered in:

    <.button x-data x-on:click={Modal.JS.open("goals-form-modal")}>
       + Add Entry
     </.button>

    @@ -184,26 +184,26 @@ itself - adding x-data attribute without any value i to ensure that.

  • Modal.close/2 - to close the modal from the backend; usually done inside wrapped component's handle_event/2. The example quoted above shows one way to implement this, under that assumption -that the component exposes a callback, like this:

    defmodule SomeForm do
    +that the component exposes a callback, like this:

    defmodule SomeForm do
       use Phoenix.LiveComponent
     
    -  def update(assigns, socket) do
    +  def update(assigns, socket) do
         # ...
     
    -    {:ok, assign(socket, :on_save_form, assigns.on_save_form)}
    -  end
    +    {:ok, assign(socket, :on_save_form, assigns.on_save_form)}
    +  end
     
       #...
     
    -  def handle_event("save-form", %{"form" => form}, socket) do
    -    case save_entry(form) do
    -      {:ok, entry} ->
    -        {:noreply, socket.assigns.on_save_form(entry, socket)}
    +  def handle_event("save-form", %{"form" => form}, socket) do
    +    case save_entry(form) do
    +      {:ok, entry} ->
    +        {:noreply, socket.assigns.on_save_form(entry, socket)}
     
           # error case handling ...
    -    end
    -  end
    -end

    Using callback approach has an added benefit of making the + end + end +end

    Using callback approach has an added benefit of making the component more flexible.

  • diff --git a/PlausibleWeb.Live.Components.Pagination.html b/PlausibleWeb.Live.Components.Pagination.html index cbd6afc322..7189f402fd 100644 --- a/PlausibleWeb.Live.Components.Pagination.html +++ b/PlausibleWeb.Live.Components.Pagination.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Components.Visitors.html b/PlausibleWeb.Live.Components.Visitors.html index f4cbb4bcaf..576129b8c5 100644 --- a/PlausibleWeb.Live.Components.Visitors.html +++ b/PlausibleWeb.Live.Components.Visitors.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Flash.html b/PlausibleWeb.Live.Flash.html index 76ae7dd3c3..3700a6c3b2 100644 --- a/PlausibleWeb.Live.Flash.html +++ b/PlausibleWeb.Live.Flash.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.FunnelSettings.Form.html b/PlausibleWeb.Live.FunnelSettings.Form.html index 4c6acbb6e1..608e2808e5 100644 --- a/PlausibleWeb.Live.FunnelSettings.Form.html +++ b/PlausibleWeb.Live.FunnelSettings.Form.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.FunnelSettings.List.html b/PlausibleWeb.Live.FunnelSettings.List.html index 7bfc23b383..c182cc6a4e 100644 --- a/PlausibleWeb.Live.FunnelSettings.List.html +++ b/PlausibleWeb.Live.FunnelSettings.List.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.FunnelSettings.html b/PlausibleWeb.Live.FunnelSettings.html index 474d309fef..bef9f6501b 100644 --- a/PlausibleWeb.Live.FunnelSettings.html +++ b/PlausibleWeb.Live.FunnelSettings.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.GoalSettings.Form.html b/PlausibleWeb.Live.GoalSettings.Form.html index cf0c0b264c..2d33ab8227 100644 --- a/PlausibleWeb.Live.GoalSettings.Form.html +++ b/PlausibleWeb.Live.GoalSettings.Form.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.GoalSettings.List.html b/PlausibleWeb.Live.GoalSettings.List.html index 5582911042..eb6f42ca65 100644 --- a/PlausibleWeb.Live.GoalSettings.List.html +++ b/PlausibleWeb.Live.GoalSettings.List.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.GoalSettings.html b/PlausibleWeb.Live.GoalSettings.html index 4337701e89..a40b0ca089 100644 --- a/PlausibleWeb.Live.GoalSettings.html +++ b/PlausibleWeb.Live.GoalSettings.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.ImportsExportsSettings.html b/PlausibleWeb.Live.ImportsExportsSettings.html new file mode 100644 index 0000000000..d710e8a9ad --- /dev/null +++ b/PlausibleWeb.Live.ImportsExportsSettings.html @@ -0,0 +1,307 @@ + + + + + + + + + + + PlausibleWeb.Live.ImportsExportsSettings — Plausible v0.0.1 + + + + + + + + + + + + + + + + +
    + + + +
    + +
    + +
    + +
    +
    + + +

    + + + + View Source + + + PlausibleWeb.Live.ImportsExportsSettings + (Plausible v0.0.1) + +

    + + +
    +

    LiveView allowing listing and deleting imports.

    +
    + + +
    +

    + + + + Summary +

    +
    +

    + Functions +

    + +
    + + +

    Callback implementation for Phoenix.LiveView.handle_info/2.

    + +
    + +
    + + +

    Callback implementation for Phoenix.LiveView.mount/3.

    + +
    + +
    + + +

    Callback implementation for Phoenix.LiveView.render/1.

    + +
    + +
    + +
    + + +
    +

    + + + + Functions +

    +
    +
    + +
    + + + Link to this function + +

    handle_info(arg, socket)

    + + + + View Source + + + +
    + +
    + +

    Callback implementation for Phoenix.LiveView.handle_info/2.

    +
    +
    +
    + +
    + + + Link to this function + +

    mount(params, map, socket)

    + + + + View Source + + + +
    + +
    + +

    Callback implementation for Phoenix.LiveView.mount/3.

    +
    +
    +
    + + + +
    + +

    Callback implementation for Phoenix.LiveView.render/1.

    +
    +
    + +
    +
    + + +
    +
    +
    +
    + + + + + + diff --git a/PlausibleWeb.Live.Plugins.API.Settings.html b/PlausibleWeb.Live.Plugins.API.Settings.html index d1d62a40fb..fea7411b0a 100644 --- a/PlausibleWeb.Live.Plugins.API.Settings.html +++ b/PlausibleWeb.Live.Plugins.API.Settings.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Plugins.API.TokenForm.html b/PlausibleWeb.Live.Plugins.API.TokenForm.html index 3341df6ba3..8a42822d0b 100644 --- a/PlausibleWeb.Live.Plugins.API.TokenForm.html +++ b/PlausibleWeb.Live.Plugins.API.TokenForm.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.PropsSettings.Form.html b/PlausibleWeb.Live.PropsSettings.Form.html index a0b7c8e55c..685d999490 100644 --- a/PlausibleWeb.Live.PropsSettings.Form.html +++ b/PlausibleWeb.Live.PropsSettings.Form.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.PropsSettings.List.html b/PlausibleWeb.Live.PropsSettings.List.html index 115ef60933..2ba053ea1e 100644 --- a/PlausibleWeb.Live.PropsSettings.List.html +++ b/PlausibleWeb.Live.PropsSettings.List.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.PropsSettings.html b/PlausibleWeb.Live.PropsSettings.html index c188cb94ab..f0936151c3 100644 --- a/PlausibleWeb.Live.PropsSettings.html +++ b/PlausibleWeb.Live.PropsSettings.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.RegisterForm.html b/PlausibleWeb.Live.RegisterForm.html index a5ede7324e..a5e81d73ea 100644 --- a/PlausibleWeb.Live.RegisterForm.html +++ b/PlausibleWeb.Live.RegisterForm.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.ResetPasswordForm.html b/PlausibleWeb.Live.ResetPasswordForm.html index c47e3ce72c..44bca65329 100644 --- a/PlausibleWeb.Live.ResetPasswordForm.html +++ b/PlausibleWeb.Live.ResetPasswordForm.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.SentryContext.html b/PlausibleWeb.Live.SentryContext.html index 213c4a3946..4844b5decd 100644 --- a/PlausibleWeb.Live.SentryContext.html +++ b/PlausibleWeb.Live.SentryContext.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Shields.Countries.html b/PlausibleWeb.Live.Shields.Countries.html index 9c13a18409..18302418e8 100644 --- a/PlausibleWeb.Live.Shields.Countries.html +++ b/PlausibleWeb.Live.Shields.Countries.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Shields.CountryRules.html b/PlausibleWeb.Live.Shields.CountryRules.html index e5a7f62c57..ee7a855315 100644 --- a/PlausibleWeb.Live.Shields.CountryRules.html +++ b/PlausibleWeb.Live.Shields.CountryRules.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Shields.IPAddresses.html b/PlausibleWeb.Live.Shields.IPAddresses.html index f004c74bf2..39ea77780e 100644 --- a/PlausibleWeb.Live.Shields.IPAddresses.html +++ b/PlausibleWeb.Live.Shields.IPAddresses.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Shields.IPRules.html b/PlausibleWeb.Live.Shields.IPRules.html index 8c070b1e84..7adab73c37 100644 --- a/PlausibleWeb.Live.Shields.IPRules.html +++ b/PlausibleWeb.Live.Shields.IPRules.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Sites.html b/PlausibleWeb.Live.Sites.html index a25606b99f..28aa2f539d 100644 --- a/PlausibleWeb.Live.Sites.html +++ b/PlausibleWeb.Live.Sites.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.MJML.StatsReport.html b/PlausibleWeb.MJML.StatsReport.html index 308626c948..a527b5d6d7 100644 --- a/PlausibleWeb.MJML.StatsReport.html +++ b/PlausibleWeb.MJML.StatsReport.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.PageController.html b/PlausibleWeb.PageController.html index e0fa437e6e..6f30c6d413 100644 --- a/PlausibleWeb.PageController.html +++ b/PlausibleWeb.PageController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.PageView.html b/PlausibleWeb.PageView.html index 3c1cb884c5..aea245dd68 100644 --- a/PlausibleWeb.PageView.html +++ b/PlausibleWeb.PageView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Controllers.Capabilities.html b/PlausibleWeb.Plugins.API.Controllers.Capabilities.html index 14fb7b21b8..2965318a22 100644 --- a/PlausibleWeb.Plugins.API.Controllers.Capabilities.html +++ b/PlausibleWeb.Plugins.API.Controllers.Capabilities.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Controllers.CustomProps.html b/PlausibleWeb.Plugins.API.Controllers.CustomProps.html index acc22b72c3..a540a8cd4e 100644 --- a/PlausibleWeb.Plugins.API.Controllers.CustomProps.html +++ b/PlausibleWeb.Plugins.API.Controllers.CustomProps.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Controllers.Goals.html b/PlausibleWeb.Plugins.API.Controllers.Goals.html index d3d7e953dc..5eec32a0cc 100644 --- a/PlausibleWeb.Plugins.API.Controllers.Goals.html +++ b/PlausibleWeb.Plugins.API.Controllers.Goals.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Controllers.SharedLinks.html b/PlausibleWeb.Plugins.API.Controllers.SharedLinks.html index 1d811748f2..14ec22a5d0 100644 --- a/PlausibleWeb.Plugins.API.Controllers.SharedLinks.html +++ b/PlausibleWeb.Plugins.API.Controllers.SharedLinks.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Errors.html b/PlausibleWeb.Plugins.API.Errors.html index 7bd66a4341..0457f031bb 100644 --- a/PlausibleWeb.Plugins.API.Errors.html +++ b/PlausibleWeb.Plugins.API.Errors.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Capabilities.html b/PlausibleWeb.Plugins.API.Schemas.Capabilities.html index 9c93e3d39a..bfe783d0d6 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Capabilities.html +++ b/PlausibleWeb.Plugins.API.Schemas.Capabilities.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html b/PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html index 2f7eececf2..d6b0fb5755 100644 --- a/PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html b/PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html index 4304d109a1..f520a38252 100644 --- a/PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html b/PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html index a81b653f43..5f462025e5 100644 --- a/PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html +++ b/PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.CustomProp.html b/PlausibleWeb.Plugins.API.Schemas.CustomProp.html index 2b07de1b30..f1c9ddcc90 100644 --- a/PlausibleWeb.Plugins.API.Schemas.CustomProp.html +++ b/PlausibleWeb.Plugins.API.Schemas.CustomProp.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Error.html b/PlausibleWeb.Plugins.API.Schemas.Error.html index 01310917cf..e71ec9c4a5 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Error.html +++ b/PlausibleWeb.Plugins.API.Schemas.Error.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html index f7f6c6a477..20b716c25d 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html index 1aab52f277..7b8ea375e8 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html index 8f103beb4f..7a2faae98d 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html index d0793ab702..6599d7b425 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html b/PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html index 0d1b2b417d..02ee6756b7 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html b/PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html index 3184785451..a7262cd0f3 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html b/PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html index 15e32a127a..40bc63369d 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html b/PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html index 4fa6341fca..9eb31d72f5 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html b/PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html index 33b31be084..b5157a7153 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.Type.html b/PlausibleWeb.Plugins.API.Schemas.Goal.Type.html index 3c69cd1928..c3088344ae 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.Type.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.Type.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Goal.html b/PlausibleWeb.Plugins.API.Schemas.Goal.html index 5d4f398700..b78b9f8fe3 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Goal.html +++ b/PlausibleWeb.Plugins.API.Schemas.Goal.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Link.html b/PlausibleWeb.Plugins.API.Schemas.Link.html index 4c105b2dbd..a731b475c4 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Link.html +++ b/PlausibleWeb.Plugins.API.Schemas.Link.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.NotFound.html b/PlausibleWeb.Plugins.API.Schemas.NotFound.html index 96b815d947..b67eb2734c 100644 --- a/PlausibleWeb.Plugins.API.Schemas.NotFound.html +++ b/PlausibleWeb.Plugins.API.Schemas.NotFound.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html b/PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html index 4befa2a8e8..aa882ee999 100644 --- a/PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html +++ b/PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html b/PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html index e02a121874..7cf90ecd2d 100644 --- a/PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html +++ b/PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html b/PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html index 1c288a3ddf..5fda1aeb83 100644 --- a/PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html b/PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html index 92b9219b44..1e39fdde72 100644 --- a/PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html +++ b/PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.SharedLink.html b/PlausibleWeb.Plugins.API.Schemas.SharedLink.html index 16d2053778..e9edaf0d69 100644 --- a/PlausibleWeb.Plugins.API.Schemas.SharedLink.html +++ b/PlausibleWeb.Plugins.API.Schemas.SharedLink.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Unauthorized.html b/PlausibleWeb.Plugins.API.Schemas.Unauthorized.html index 49472041dc..ae0d1174e6 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Unauthorized.html +++ b/PlausibleWeb.Plugins.API.Schemas.Unauthorized.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html b/PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html index b1cd9c3228..def04d393b 100644 --- a/PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html +++ b/PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Spec.html b/PlausibleWeb.Plugins.API.Spec.html index 58a4f1fc50..f8e2530273 100644 --- a/PlausibleWeb.Plugins.API.Spec.html +++ b/PlausibleWeb.Plugins.API.Spec.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.Capabilities.html b/PlausibleWeb.Plugins.API.Views.Capabilities.html index 86d8719b53..5c75497550 100644 --- a/PlausibleWeb.Plugins.API.Views.Capabilities.html +++ b/PlausibleWeb.Plugins.API.Views.Capabilities.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.CustomProp.html b/PlausibleWeb.Plugins.API.Views.CustomProp.html index 8843f0be96..cb4ac25ee9 100644 --- a/PlausibleWeb.Plugins.API.Views.CustomProp.html +++ b/PlausibleWeb.Plugins.API.Views.CustomProp.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.Error.html b/PlausibleWeb.Plugins.API.Views.Error.html index 68e69cdf74..5890c00034 100644 --- a/PlausibleWeb.Plugins.API.Views.Error.html +++ b/PlausibleWeb.Plugins.API.Views.Error.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.Goal.html b/PlausibleWeb.Plugins.API.Views.Goal.html index b45610864d..4b57d5e63d 100644 --- a/PlausibleWeb.Plugins.API.Views.Goal.html +++ b/PlausibleWeb.Plugins.API.Views.Goal.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.Pagination.html b/PlausibleWeb.Plugins.API.Views.Pagination.html index 3331b046f8..da3a525dbb 100644 --- a/PlausibleWeb.Plugins.API.Views.Pagination.html +++ b/PlausibleWeb.Plugins.API.Views.Pagination.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.SharedLink.html b/PlausibleWeb.Plugins.API.Views.SharedLink.html index f697c7a7ff..4268875110 100644 --- a/PlausibleWeb.Plugins.API.Views.SharedLink.html +++ b/PlausibleWeb.Plugins.API.Views.SharedLink.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.PluginsAPICase.html b/PlausibleWeb.PluginsAPICase.html index c18e3fdd69..e65c4aae9a 100644 --- a/PlausibleWeb.PluginsAPICase.html +++ b/PlausibleWeb.PluginsAPICase.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugs.AuthorizePluginsAPI.html b/PlausibleWeb.Plugs.AuthorizePluginsAPI.html index 99aaa67d6a..6257ca765f 100644 --- a/PlausibleWeb.Plugs.AuthorizePluginsAPI.html +++ b/PlausibleWeb.Plugs.AuthorizePluginsAPI.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugs.ErrorHandler.html b/PlausibleWeb.Plugs.ErrorHandler.html index 7cdc184034..313f3050f9 100644 --- a/PlausibleWeb.Plugs.ErrorHandler.html +++ b/PlausibleWeb.Plugs.ErrorHandler.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugs.MaybeDisableRegistration.html b/PlausibleWeb.Plugs.MaybeDisableRegistration.html index 9b3eeaf346..71e5aac782 100644 --- a/PlausibleWeb.Plugs.MaybeDisableRegistration.html +++ b/PlausibleWeb.Plugs.MaybeDisableRegistration.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugs.NoRobots.html b/PlausibleWeb.Plugs.NoRobots.html index 9d1f0c8dd9..1416f049af 100644 --- a/PlausibleWeb.Plugs.NoRobots.html +++ b/PlausibleWeb.Plugs.NoRobots.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.RefInspector.html b/PlausibleWeb.RefInspector.html index 308a49f7c4..4cb11e8ca5 100644 --- a/PlausibleWeb.RefInspector.html +++ b/PlausibleWeb.RefInspector.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.RemoteIP.html b/PlausibleWeb.RemoteIP.html index f82a1fe72b..e278be14e9 100644 --- a/PlausibleWeb.RemoteIP.html +++ b/PlausibleWeb.RemoteIP.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.RequireAccountPlug.html b/PlausibleWeb.RequireAccountPlug.html index df68a4f129..b90296fdcf 100644 --- a/PlausibleWeb.RequireAccountPlug.html +++ b/PlausibleWeb.RequireAccountPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.RequireLoggedOutPlug.html b/PlausibleWeb.RequireLoggedOutPlug.html index 41dc65a369..65e528e908 100644 --- a/PlausibleWeb.RequireLoggedOutPlug.html +++ b/PlausibleWeb.RequireLoggedOutPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Router.html b/PlausibleWeb.Router.html index 57dabb895f..a3910c53db 100644 --- a/PlausibleWeb.Router.html +++ b/PlausibleWeb.Router.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.SessionTimeoutPlug.html b/PlausibleWeb.SessionTimeoutPlug.html index b10b0ac18b..7442af3344 100644 --- a/PlausibleWeb.SessionTimeoutPlug.html +++ b/PlausibleWeb.SessionTimeoutPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Site.MembershipController.html b/PlausibleWeb.Site.MembershipController.html index f21828dd26..46a6f543c4 100644 --- a/PlausibleWeb.Site.MembershipController.html +++ b/PlausibleWeb.Site.MembershipController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Site.MembershipView.html b/PlausibleWeb.Site.MembershipView.html index f11b481d7c..53e7189a93 100644 --- a/PlausibleWeb.Site.MembershipView.html +++ b/PlausibleWeb.Site.MembershipView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.SiteController.html b/PlausibleWeb.SiteController.html index 3caa5c9da4..0cad775ad4 100644 --- a/PlausibleWeb.SiteController.html +++ b/PlausibleWeb.SiteController.html @@ -14,7 +14,7 @@ - + @@ -307,6 +307,14 @@ Pages + +
    forget_imported(conn, params) @@ -467,6 +475,14 @@ Pages
    + +
    settings_integrations(conn, params) @@ -569,7 +585,7 @@ Pages

    add_monthly_report_recipient(conn, map)

    - + View Source @@ -591,7 +607,7 @@ Pages

    add_snippet(conn, params)

    - + View Source @@ -613,7 +629,7 @@ Pages

    add_snippet_after_domain_change(conn, params)

    - + View Source @@ -635,7 +651,7 @@ Pages

    add_spike_notification_recipient(conn, map)

    - + View Source @@ -657,7 +673,7 @@ Pages

    add_weekly_report_recipient(conn, map)

    - + View Source @@ -679,7 +695,7 @@ Pages

    change_domain(conn, params)

    - + View Source @@ -701,7 +717,7 @@ Pages

    change_domain_submit(conn, map)

    - + View Source @@ -723,7 +739,7 @@ Pages

    create_shared_link(conn, map)

    - + View Source @@ -745,7 +761,7 @@ Pages

    create_site(conn, map)

    - + View Source @@ -767,7 +783,7 @@ Pages

    delete_google_auth(conn, params)

    - + View Source @@ -789,7 +805,7 @@ Pages

    delete_shared_link(conn, map)

    - + View Source @@ -811,7 +827,7 @@ Pages

    delete_site(conn, params)

    - + View Source @@ -833,7 +849,7 @@ Pages

    disable_monthly_report(conn, params)

    - + View Source @@ -855,7 +871,7 @@ Pages

    disable_spike_notification(conn, params)

    - + View Source @@ -877,7 +893,7 @@ Pages

    disable_weekly_report(conn, params)

    - + View Source @@ -899,7 +915,7 @@ Pages

    edit_shared_link(conn, map)

    - + View Source @@ -921,7 +937,7 @@ Pages

    enable_monthly_report(conn, params)

    - + View Source @@ -943,7 +959,7 @@ Pages

    enable_spike_notification(conn, params)

    - + View Source @@ -965,7 +981,29 @@ Pages

    enable_weekly_report(conn, params)

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

    forget_import(conn, map)

    + + View Source @@ -987,7 +1025,7 @@ Pages

    forget_imported(conn, params)

    - + View Source @@ -1009,7 +1047,7 @@ Pages

    import_from_google(conn, map)

    - + View Source @@ -1031,7 +1069,7 @@ Pages

    import_from_google_confirm(conn, map)

    - + View Source @@ -1053,7 +1091,7 @@ Pages

    import_from_google_user_metric_notice(conn, map)

    - + View Source @@ -1075,7 +1113,7 @@ Pages

    import_from_google_view_id(conn, map)

    - + View Source @@ -1097,7 +1135,7 @@ Pages

    import_from_google_view_id_form(conn, map)

    - + View Source @@ -1119,7 +1157,7 @@ Pages

    make_private(conn, params)

    - + View Source @@ -1141,7 +1179,7 @@ Pages

    make_public(conn, params)

    - + View Source @@ -1163,7 +1201,7 @@ Pages

    new(conn, params)

    - + View Source @@ -1185,7 +1223,7 @@ Pages

    new_shared_link(conn, params)

    - + View Source @@ -1207,7 +1245,7 @@ Pages

    remove_monthly_report_recipient(conn, map)

    - + View Source @@ -1229,7 +1267,7 @@ Pages

    remove_spike_notification_recipient(conn, map)

    - + View Source @@ -1251,7 +1289,7 @@ Pages

    remove_weekly_report_recipient(conn, map)

    - + View Source @@ -1273,7 +1311,7 @@ Pages

    reset_stats(conn, params)

    - + View Source @@ -1295,7 +1333,7 @@ Pages

    settings(conn, map)

    - + View Source @@ -1317,7 +1355,7 @@ Pages

    settings_danger_zone(conn, params)

    - + View Source @@ -1339,7 +1377,7 @@ Pages

    settings_email_reports(conn, params)

    - + View Source @@ -1361,7 +1399,7 @@ Pages

    settings_funnels(conn, params)

    - + View Source @@ -1383,7 +1421,7 @@ Pages

    settings_general(conn, params)

    - + View Source @@ -1405,7 +1443,29 @@ Pages

    settings_goals(conn, params)

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

    settings_imports_exports(conn, params)

    + + View Source @@ -1427,7 +1487,7 @@ Pages

    settings_integrations(conn, params)

    - + View Source @@ -1449,7 +1509,7 @@ Pages

    settings_people(conn, params)

    - + View Source @@ -1471,7 +1531,7 @@ Pages

    settings_props(conn, params)

    - + View Source @@ -1493,7 +1553,7 @@ Pages

    settings_shields(conn, map)

    - + View Source @@ -1515,7 +1575,7 @@ Pages

    settings_visibility(conn, params)

    - + View Source @@ -1537,7 +1597,7 @@ Pages

    update_feature_visibility(conn, map)

    - + View Source @@ -1559,7 +1619,7 @@ Pages

    update_google_auth(conn, map)

    - + View Source @@ -1581,7 +1641,7 @@ Pages

    update_settings(conn, map)

    - + View Source @@ -1603,7 +1663,7 @@ Pages

    update_shared_link(conn, map)

    - + View Source @@ -1625,7 +1685,7 @@ Pages

    update_spike_notification(conn, map)

    - + View Source diff --git a/PlausibleWeb.SiteView.html b/PlausibleWeb.SiteView.html index 3bef734485..bd6d296baa 100644 --- a/PlausibleWeb.SiteView.html +++ b/PlausibleWeb.SiteView.html @@ -14,7 +14,7 @@ - + @@ -295,6 +295,14 @@ Pages
    + +
    settings_integrations.html(assigns) @@ -774,6 +782,28 @@ to render a particular template.

    +
    +
    +
    + +
    + + + Link to this function + +

    settings_imports_exports.html(assigns)

    + + + + View Source + + + +
    + +
    + +
    diff --git a/PlausibleWeb.StatsController.html b/PlausibleWeb.StatsController.html index 47a11ff659..be4b9de43d 100644 --- a/PlausibleWeb.StatsController.html +++ b/PlausibleWeb.StatsController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.StatsView.html b/PlausibleWeb.StatsView.html index 64f556089b..ea5b7c1f6b 100644 --- a/PlausibleWeb.StatsView.html +++ b/PlausibleWeb.StatsView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Tracker.html b/PlausibleWeb.Tracker.html index fd8a3d53d0..6d0bc3743f 100644 --- a/PlausibleWeb.Tracker.html +++ b/PlausibleWeb.Tracker.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.TwoFactor.Session.html b/PlausibleWeb.TwoFactor.Session.html index c83114962d..68eee1e6ff 100644 --- a/PlausibleWeb.TwoFactor.Session.html +++ b/PlausibleWeb.TwoFactor.Session.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.UnsubscribeController.html b/PlausibleWeb.UnsubscribeController.html index 52c9a4b197..e0a052d804 100644 --- a/PlausibleWeb.UnsubscribeController.html +++ b/PlausibleWeb.UnsubscribeController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.UnsubscribeView.html b/PlausibleWeb.UnsubscribeView.html index 27620d2c4b..e59f03fea6 100644 --- a/PlausibleWeb.UnsubscribeView.html +++ b/PlausibleWeb.UnsubscribeView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.html b/PlausibleWeb.html index 6a4e194027..782b96a2aa 100644 --- a/PlausibleWeb.html +++ b/PlausibleWeb.html @@ -14,7 +14,7 @@ - + diff --git a/api-reference.html b/api-reference.html index 71b1f62e12..d271c5673a 100644 --- a/api-reference.html +++ b/api-reference.html @@ -14,7 +14,7 @@ - + @@ -2228,6 +2228,15 @@ and the number of steps they have.

    Phoenix LiveComponent module that renders a list of goals

    +
    +
    + + +

    LiveView allowing listing and deleting imports.

    +
    diff --git a/contributing.html b/contributing.html index 6b1acc2d85..44c4995a21 100644 --- a/contributing.html +++ b/contributing.html @@ -14,7 +14,7 @@ - + diff --git a/dist/search_data-3C463D62.js b/dist/search_data-3C463D62.js new file mode 100644 index 0000000000..9986e9c261 --- /dev/null +++ b/dist/search_data-3C463D62.js @@ -0,0 +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/1","doc":"Starts a account locking grace period of 7 days by changing the User struct.","ref":"Plausible.Auth.GracePeriod.html#start_changeset/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.start_manual_lock_changeset/1","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/1"},{"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.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_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":"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":"macro","title":"Plausible.Billing.Feature.list_short_names/0","doc":"Lists all the feature short names, e.g. RevenueGoals","ref":"Plausible.Billing.Feature.html#list_short_names/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.pageview_allowance_margin/0","doc":"","ref":"Plausible.Billing.Quota.html#pageview_allowance_margin/0"},{"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/2","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.\n\n* Specific e-mails can be excluded from the count, so that where necessary,\n we can ensure inviting the same person(s) to more than 1 sites is allowed","ref":"Plausible.Billing.Quota.html#team_member_usage/2"},{"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":"behaviour","title":"Plausible.Cache","doc":"Caching interface specific for Plausible. Usage:\n\n use Plausible.Cache\n\n # - Implement the callbacks required\n # - Optionally override `unwrap_cache_keys/1`\n # - Populate the cache with `Plausible.Cache.Warmer`\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 `:plausible, Elixir.Plausible.Cache, enabled: bool()` application env key.\nThis can be overridden on case by case basis, using the child specs options.\n\nThe `base_db_query/0` callback is used to generate the base query that is \nexecuted on every cache refresh. \n\nThere are two modes of refresh operation: `:all` and `:updated_recently`;\nthe former will invoke the query as is and clear all the existing entries,\nwhile the latter will attempt to limit the query to only the records that \nhave been updated in the last 15 minutes and try to merge the new results with\nexisting cache entries.\n\nBoth refresh modes are normally executed periodically from within a warmer process;\nsee: `Plausible.Cache.Warmer`. The reason for two modes is that the latter is lighter \non the database and can be executed more frequently.\n\nWhen Cache is disabled via application env, the `get/1` function\nfalls back to pure database lookups (implemented via `get_from_source/1` callback. \nThis should help with introducing cached lookups in existing code, \nso that no existing tests should break.\n\nRefreshing the cache emits telemetry event defined as per `telemetry_event_refresh/2`.","ref":"Plausible.Cache.html"},{"type":"callback","title":"Plausible.Cache.base_db_query/0","doc":"Returns the base Ecto query used to refresh the cache","ref":"Plausible.Cache.html#c:base_db_query/0"},{"type":"callback","title":"Plausible.Cache.child_id/0","doc":"Supervisor child id, must be unique within the supervision tree","ref":"Plausible.Cache.html#c:child_id/0"},{"type":"callback","title":"Plausible.Cache.count_all/0","doc":"Counts all items at the source, an aggregate query most likely","ref":"Plausible.Cache.html#c:count_all/0"},{"type":"function","title":"Plausible.Cache.enabled?/0","doc":"Looks for application env value at `:plausible, Elixir.Plausible.Cache, enabled: bool()`","ref":"Plausible.Cache.html#enabled?/0"},{"type":"callback","title":"Plausible.Cache.get_from_source/1","doc":"Retrieves the item from the source, in case the cache is disabled","ref":"Plausible.Cache.html#c:get_from_source/1"},{"type":"callback","title":"Plausible.Cache.name/0","doc":"Unique cache name, used by underlying implementation","ref":"Plausible.Cache.html#c:name/0"},{"type":"callback","title":"Plausible.Cache.unwrap_cache_keys/1","doc":"Optionally unwraps the keys of the cache items, in case one item is stored under multiple keys","ref":"Plausible.Cache.html#c:unwrap_cache_keys/1"},{"type":"module","title":"Plausible.Cache.Warmer","doc":"A periodic cache warmer.\n\nChild specification options available:\n\n * `cache_impl` - module expected to implement `Plausible.Cache` behaviour\n * `interval` - the number of milliseconds for each warm-up cycle\n * `cache_name` - defaults to cache_impl.name() but can be overridden for testing\n * `force_start?` - enforcess process startup for testing, even if it's barred\n by `Plausible.Cache.enabled?`. This is useful for avoiding issues with DB ownership\n and async tests.\n * `warmer_fn` - by convention, either `:refresh_all` or `:refresh_updated_recently`,\n both are automatically provided by `cache_impl` module. Technically any exported\n or captured function will work, if need be.\n\nSee tests for more comprehensive examples.","ref":"Plausible.Cache.Warmer.html"},{"type":"function","title":"Plausible.Cache.Warmer.child_spec/1","doc":"","ref":"Plausible.Cache.Warmer.html#child_spec/1"},{"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_gettext_locale/1","doc":"Set the current process's Gettext locale from a\n`t:Cldr.LanguageTag`.","ref":"Plausible.Cldr.html#put_gettext_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.put_gettext_locale/1","doc":"* `locale` is a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`.","ref":"Plausible.Cldr.html#put_gettext_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.put_gettext_locale/1","doc":"* `{:ok, gettext_locale_name}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.html#put_gettext_locale/1-returns"},{"type":"function","title":"Behaviour - Plausible.Cldr.put_gettext_locale/1","doc":"1. If the `locale.gettext_locale_name` is `nil` then an error\n is returned.\n\n2. The `gettext` locale for the `gettext_backend` configured for the\n CLDR backend defined by the `t:Cldr.LanguageTag` is set.","ref":"Plausible.Cldr.html#put_gettext_locale/1-behaviour"},{"type":"function","title":"Examples - Plausible.Cldr.put_gettext_locale/1","doc":"iex> import Cldr.LanguageTag.Sigil\n iex> Plausible.Cldr.put_gettext_locale(~l\"en\")\n {:ok, \"en\"}\n\n iex> import Cldr.LanguageTag.Sigil\n iex> Plausible.Cldr.put_gettext_locale(~l\"de\")\n {:error,\n {Cldr.UnknownLocaleError,\n \"Locale #Cldr.LanguageTag does not map to a known gettext locale name\"}}","ref":"Plausible.Cldr.html#put_gettext_locale/1-examples"},{"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\", format: :percent)\n {:error, {Cldr.UnknownFormatError,\n \"The locale :he with number system :hebr does not define a format :percent\"}}\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.numeric_systems/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.numeric_systems/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.DataMigration.VersionedSessions","doc":"Sessions CollapsingMergeTree -> VersionedCollapsingMergeTree migration, SQL files available at:\npriv/data_migrations/VersionedSessions/sql","ref":"Plausible.DataMigration.VersionedSessions.html"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.confirm/3","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run/1","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#run/1"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run_sql/2","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql/2"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run_sql_confirm/2","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql_confirm/2"},{"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.country_rule_factory/0","doc":"","ref":"Plausible.Factory.html#country_rule_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.ip_rule_factory/0","doc":"","ref":"Plausible.Factory.html#ip_rule_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_import_factory/0","doc":"","ref":"Plausible.Factory.html#site_import_factory/0"},{"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/2","doc":"","ref":"Plausible.Google.Api.html#fetch_and_persist/2"},{"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 passed to persist callback.\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/3","doc":"","ref":"Plausible.Google.Api.html#import_authorize_url/3"},{"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.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":"Context for managing site statistics imports.\n\nCurrently following importers are implemented:\n\n* `Plausible.Imported.UniversalAnalytics` - existing mechanism, for legacy Google\n analytics formerly known as \"Google Analytics\"\n* `Plausible.Imported.NoopImporter` - importer stub, used mainly for testing purposes\n* `Plausible.Imported.CSVImporter` - CSV importer from S3\n\nFor more information on implementing importers, see `Plausible.Imported.Importer`.","ref":"Plausible.Imported.html"},{"type":"function","title":"Plausible.Imported.delete_imports_for_site/1","doc":"","ref":"Plausible.Imported.html#delete_imports_for_site/1"},{"type":"function","title":"Plausible.Imported.get_earliest_import/1","doc":"","ref":"Plausible.Imported.html#get_earliest_import/1"},{"type":"function","title":"Plausible.Imported.get_import/1","doc":"","ref":"Plausible.Imported.html#get_import/1"},{"type":"function","title":"Plausible.Imported.list_all_imports/1","doc":"","ref":"Plausible.Imported.html#list_all_imports/1"},{"type":"function","title":"Plausible.Imported.list_complete_import_ids/1","doc":"","ref":"Plausible.Imported.html#list_complete_import_ids/1"},{"type":"function","title":"Plausible.Imported.listen/0","doc":"","ref":"Plausible.Imported.html#listen/0"},{"type":"function","title":"Plausible.Imported.load_import_data/1","doc":"","ref":"Plausible.Imported.html#load_import_data/1"},{"type":"function","title":"Plausible.Imported.max_complete_imports/0","doc":"","ref":"Plausible.Imported.html#max_complete_imports/0"},{"type":"function","title":"Plausible.Imported.tables/0","doc":"","ref":"Plausible.Imported.html#tables/0"},{"type":"module","title":"Plausible.Imported.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.Imported.Buffer.html"},{"type":"function","title":"Plausible.Imported.Buffer.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Imported.Buffer.html#child_spec/1"},{"type":"function","title":"Plausible.Imported.Buffer.flush/2","doc":"Flushes all table buffers to Clickhouse.","ref":"Plausible.Imported.Buffer.html#flush/2"},{"type":"function","title":"Plausible.Imported.Buffer.handle_continue/2","doc":"","ref":"Plausible.Imported.Buffer.html#handle_continue/2"},{"type":"function","title":"Plausible.Imported.Buffer.init/1","doc":"","ref":"Plausible.Imported.Buffer.html#init/1"},{"type":"function","title":"Plausible.Imported.Buffer.insert_many/3","doc":"Puts the given records into the table buffer.","ref":"Plausible.Imported.Buffer.html#insert_many/3"},{"type":"function","title":"Plausible.Imported.Buffer.size/2","doc":"Returns the total count of items in the given table buffer.","ref":"Plausible.Imported.Buffer.html#size/2"},{"type":"function","title":"Plausible.Imported.Buffer.start_link/0","doc":"","ref":"Plausible.Imported.Buffer.html#start_link/0"},{"type":"function","title":"Plausible.Imported.Buffer.stop/1","doc":"","ref":"Plausible.Imported.Buffer.html#stop/1"},{"type":"module","title":"Plausible.Imported.CSVImporter","doc":"CSV importer from S3 that uses ClickHouse [s3 table function.](https://clickhouse.com/docs/en/sql-reference/table-functions/s3)","ref":"Plausible.Imported.CSVImporter.html"},{"type":"function","title":"Plausible.Imported.CSVImporter.new_import/3","doc":"","ref":"Plausible.Imported.CSVImporter.html#new_import/3"},{"type":"module","title":"Plausible.Imported.ImportSources","doc":"Definitions of import sources.","ref":"Plausible.Imported.ImportSources.html"},{"type":"function","title":"Plausible.Imported.ImportSources.by_name/1","doc":"","ref":"Plausible.Imported.ImportSources.html#by_name/1"},{"type":"function","title":"Plausible.Imported.ImportSources.names/0","doc":"","ref":"Plausible.Imported.ImportSources.html#names/0"},{"type":"behaviour","title":"Plausible.Imported.Importer","doc":"Behaviour that should be implemented for each import source.\n\nAll imports are executed as background jobs run via `Plausible.Workers.ImportAnalytics`\nOban worker. Each import source must define a module conforming `Importer` behaviour.\n\nThe callbacks that need to be implemented:\n\n* `name/0` - Returns import source name as an atom. Example: `:universal_analytics`.\n* `label/0` - Descriptive, display friendly name of the source.\n Example: \"Google Analytics\".\n* `email_template/0` - Name of the email template to use for notifications in\n `PlausibleWeb.Email` (`import_success` and `import_failure`). The template\n should have content customized for a particular source.\n* `parse_args/1` - Receives Oban job arguments coming from `new_import/3`. Whatever\n options were passed to `new_import/3` will be present in the input map with string\n keys and values serialized to primitives. If, for instance `start_date: ~D[2024-01-03]`\n is passed as an option, `parse_args/1` receives `%{..., \"start_date\" => \"2024-01-03\"}`.\n The expectation is parsing the map values producing a keyword list of options to\n pass to `import_data/2`.\n* `import_data/2` - Receives site import struct and options produced by `parse_args/1`.\n This is where all the import processing is done. The way the import is implemented\n is entirely arbitrary except the requirement that the process as a whole must\n by synchronous. The callback is expected to return either `:ok` or `{:ok, %{...}}`\n on successful import or `{:error, ...}` on failure. The map in success tuple is\n used for updating site import struct and is passed to `on_success/2` callback.\n Please note that error tuple should be only returned on errors that can't be\n recovered from. For transient errors, the import should throw an exception or\n simply crash.\n* `before_start/1` - Optional callback run right before scheduling import job. It's\n expected to either return `:ok` for the import to proceed or `{:error, ...}` tuple,\n which will be returned from `new_import/3` call.\n* `on_success/2` - Optional callback run once site import is completed. Receives map\n returned from `import_data/2`. Expected to always return `:ok`.\n* `on_failure/1` - Optional callback run when import job fails permanently.\n\nAll sources must be added to the list in `Plausible.Imported.ImportSources`.\n\nIn order to schedule a new import job using a given source, respective importer's\n`new_import/3` function must be called. It accepts site, user who is doing the import\nand any options necessary to carry out the import.\n\nThere's an expectation that `start_date` and `end_date` are provided either as options\npassed to `new_import/3` or data in map returned from `import_data/2`. If these parameters\nare not provided, the import will eventually crash. These parameters define time range\nof imported data which is in turn used for efficient querying.\n\nLogic running inside `import_data/2` is expected to populated all `imported_*` tables\nin ClickHouse with `import_id` column set to site import's ID.\n\nManaging any configuration or authentication prior to running import is outside of\nscope of importer logic and is expected to be implemented separately.","ref":"Plausible.Imported.Importer.html"},{"type":"behaviour","title":"Running import fully synchronously - Plausible.Imported.Importer","doc":"In case it's necessary to run the whole import job fully synchronously, the\n`Plausible.Workers.ImportAnalytics` worker sends an `Oban.Notifier` message\non completion, failure or transient failure of the import.\n\nA basic usage scenario looks like this:\n\n```elixir\n{:ok, job} = Plausible.Imported.NoopImporter.new_import(\n site,\n user,\n start_date: ~D[2005-01-01],\n end_date: Date.utc_today(),\n # this option is necessary to setup the calling process as listener\n listen?: true\n)\n\nimport_id = job.args[:import_id]\n\nreceive do\n {:notification, :analytics_imports_jobs, %{\"complete\" => ^import_id}} ->\n IO.puts(\"Job completed\")\n\n {:notification, :analytics_imports_jobs, %{\"transient_fail\" => ^import_id}} ->\n IO.puts(\"Job failed transiently\")\n\n {:notification, :analytics_imports_jobs, %{\"fail\" => ^import_id}} ->\n IO.puts(\"Job failed permanently\")\nafter\n 15_000 ->\n IO.puts(\"Job didn't finish in 15 seconds\")\nend\n```\n\nIn a more realistic scenario, job scheduling will be done inside a GenServer process\nlike LiveView, where notifications can be listened for via `handle_info/2`.","ref":"Plausible.Imported.Importer.html#module-running-import-fully-synchronously"},{"type":"callback","title":"Plausible.Imported.Importer.before_start/1","doc":"","ref":"Plausible.Imported.Importer.html#c:before_start/1"},{"type":"callback","title":"Plausible.Imported.Importer.email_template/0","doc":"","ref":"Plausible.Imported.Importer.html#c:email_template/0"},{"type":"callback","title":"Plausible.Imported.Importer.import_data/2","doc":"","ref":"Plausible.Imported.Importer.html#c:import_data/2"},{"type":"callback","title":"Plausible.Imported.Importer.label/0","doc":"","ref":"Plausible.Imported.Importer.html#c:label/0"},{"type":"function","title":"Plausible.Imported.Importer.listen/0","doc":"Allows to explicitly start listening for importer job notifications.\n\nListener must explicitly filter out a subset of imports that apply to the given context.","ref":"Plausible.Imported.Importer.html#listen/0"},{"type":"callback","title":"Plausible.Imported.Importer.name/0","doc":"","ref":"Plausible.Imported.Importer.html#c:name/0"},{"type":"callback","title":"Plausible.Imported.Importer.on_failure/1","doc":"","ref":"Plausible.Imported.Importer.html#c:on_failure/1"},{"type":"callback","title":"Plausible.Imported.Importer.on_success/2","doc":"","ref":"Plausible.Imported.Importer.html#c:on_success/2"},{"type":"callback","title":"Plausible.Imported.Importer.parse_args/1","doc":"","ref":"Plausible.Imported.Importer.html#c:parse_args/1"},{"type":"module","title":"Plausible.Imported.NoopImporter","doc":"Stub import implementation.","ref":"Plausible.Imported.NoopImporter.html"},{"type":"function","title":"Plausible.Imported.NoopImporter.new_import/3","doc":"","ref":"Plausible.Imported.NoopImporter.html#new_import/3"},{"type":"module","title":"Plausible.Imported.SiteImport","doc":"Site import schema.","ref":"Plausible.Imported.SiteImport.html"},{"type":"function","title":"Plausible.Imported.SiteImport.complete_changeset/2","doc":"","ref":"Plausible.Imported.SiteImport.html#complete_changeset/2"},{"type":"macro","title":"Plausible.Imported.SiteImport.completed/0","doc":"","ref":"Plausible.Imported.SiteImport.html#completed/0"},{"type":"function","title":"Plausible.Imported.SiteImport.create_changeset/3","doc":"","ref":"Plausible.Imported.SiteImport.html#create_changeset/3"},{"type":"function","title":"Plausible.Imported.SiteImport.fail_changeset/1","doc":"","ref":"Plausible.Imported.SiteImport.html#fail_changeset/1"},{"type":"macro","title":"Plausible.Imported.SiteImport.failed/0","doc":"","ref":"Plausible.Imported.SiteImport.html#failed/0"},{"type":"function","title":"Plausible.Imported.SiteImport.from_legacy/1","doc":"","ref":"Plausible.Imported.SiteImport.html#from_legacy/1"},{"type":"macro","title":"Plausible.Imported.SiteImport.importing/0","doc":"","ref":"Plausible.Imported.SiteImport.html#importing/0"},{"type":"function","title":"Plausible.Imported.SiteImport.label/1","doc":"","ref":"Plausible.Imported.SiteImport.html#label/1"},{"type":"macro","title":"Plausible.Imported.SiteImport.pending/0","doc":"","ref":"Plausible.Imported.SiteImport.html#pending/0"},{"type":"function","title":"Plausible.Imported.SiteImport.start_changeset/1","doc":"","ref":"Plausible.Imported.SiteImport.html#start_changeset/1"},{"type":"type","title":"Plausible.Imported.SiteImport.t/0","doc":"","ref":"Plausible.Imported.SiteImport.html#t:t/0"},{"type":"module","title":"Plausible.Imported.UniversalAnalytics","doc":"Import implementation for Universal Analytics.","ref":"Plausible.Imported.UniversalAnalytics.html"},{"type":"function","title":"Plausible.Imported.UniversalAnalytics.from_report/4","doc":"","ref":"Plausible.Imported.UniversalAnalytics.html#from_report/4"},{"type":"function","title":"Plausible.Imported.UniversalAnalytics.import_data/2","doc":"Imports stats from a Google Analytics UA view to a Plausible site.\n\nThis function fetches Google Analytics reports which are then passed in batches\nto Clickhouse by the `Plausible.Imported.Buffer` process.","ref":"Plausible.Imported.UniversalAnalytics.html#import_data/2"},{"type":"function","title":"Plausible.Imported.UniversalAnalytics.new_import/3","doc":"","ref":"Plausible.Imported.UniversalAnalytics.html#new_import/3"},{"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.License","doc":"This module ensures that you cannot run Plausible Analytics Enterprise Edition without a valid license key.\n The software contained within the ee/ and assets/js/dashboard/ee directories are Copyright © Plausible Insights OÜ.\n We have made this code available solely for informational and transparency purposes. No rights are granted to use,\n distribute, or exploit this software in any form.\n\n Any attempt to disable or modify the behavior of this module will be considered a violation of copyright.\n If you wish to use the Plausible Analytics Enterprise Edition for your own requirements, please contact us\n at hello@plausible.io to discuss obtaining a license.","ref":"Plausible.License.html"},{"type":"function","title":"Plausible.License.ensure_valid_license/0","doc":"","ref":"Plausible.License.html#ensure_valid_license/0"},{"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.MigrationUtils","doc":"Base module for to use in Clickhouse migrations","ref":"Plausible.MigrationUtils.html"},{"type":"function","title":"Plausible.MigrationUtils.clustered_table?/1","doc":"","ref":"Plausible.MigrationUtils.html#clustered_table?/1"},{"type":"function","title":"Plausible.MigrationUtils.on_cluster_statement/1","doc":"","ref":"Plausible.MigrationUtils.html#on_cluster_statement/1"},{"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.Capabilities","doc":"Context module for querying API capabilities","ref":"Plausible.Plugins.API.Capabilities.html"},{"type":"function","title":"Plausible.Plugins.API.Capabilities.get/1","doc":"","ref":"Plausible.Plugins.API.Capabilities.html#get/1"},{"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.allowed_for/2","doc":"Returns the custom props allowed in queries for the given site. There are\ntwo factors deciding whether a custom property is allowed for a site.\n\n#","ref":"Plausible.Props.html#allowed_for/2"},{"type":"function","title":"1. Subscription plan including the props feature. - Plausible.Props.allowed_for/2","doc":"Internally used keys (i.e. `[\"url\", \"path\"]`) are always allowed,\neven for plans that don't include props. For any other props, access to the\nCustom Properties feature is required.\n\n#","ref":"Plausible.Props.html#allowed_for/2-1-subscription-plan-including-the-props-feature"},{"type":"function","title":"2. The site having an `allowed_event_props` list configured. - Plausible.Props.allowed_for/2","doc":"For customers with a configured `allowed_event_props` list, this function\nreturns that list (+ internally used keys). That helps to filter out garbage\nprops which people might not want to see in their dashboards.\n\nWith the `bypass_setup?` boolean option you can override the requirement of\nthe site having set up props in the `allowed_event_props` list. For example,\nthis is currently used for fetching allowed properties in Stats API queries\nin order to ensure the props feature access.\n\nSince `allowed_event_props` was added after the props feature had already\nbeen used for a while, there are sites with `allowed_event_props = nil`. For\nthose sites, all custom properties that exist in the database are allowed to\nbe queried.","ref":"Plausible.Props.html#allowed_for/2-2-the-site-having-an-allowed_event_props-list-configured"},{"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 and clears the `stats_start_date` field.\n\nThe `stats_start_date` is expected to get repopulated the next time\n`Plausible.Sites.stats_start_date/1` is called.\n\nIf the input argument is a site, all imported stats are deleted. If it's a site import,\nonly imported stats for that import are deleted.","ref":"Plausible.Purge.html#delete_imported_stats!/1"},{"type":"function","title":"Plausible.Purge.delete_imported_stats!/2","doc":"","ref":"Plausible.Purge.html#delete_imported_stats!/2"},{"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.S3","doc":"Helper functions for S3 exports/imports.","ref":"Plausible.S3.html"},{"type":"function","title":"Plausible.S3.import_clickhouse_credentials/0","doc":"Returns `access_key_id` and `secret_access_key` to be used by ClickHouse during imports from S3.","ref":"Plausible.S3.html#import_clickhouse_credentials/0"},{"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.Shield.CountryRule","doc":"Schema for Country Block List","ref":"Plausible.Shield.CountryRule.html"},{"type":"function","title":"Plausible.Shield.CountryRule.changeset/2","doc":"","ref":"Plausible.Shield.CountryRule.html#changeset/2"},{"type":"type","title":"Plausible.Shield.CountryRule.t/0","doc":"","ref":"Plausible.Shield.CountryRule.html#t:t/0"},{"type":"module","title":"Plausible.Shield.CountryRuleCache","doc":"Allows retrieving Country Rules by domain and country code","ref":"Plausible.Shield.CountryRuleCache.html"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.child_spec/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#child_spec/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.get/2","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#get/2"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.hit_rate/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#hit_rate/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.merge_items/2","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#merge_items/2"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.ready?/1","doc":"Ensures the cache has non-zero size unless no items exist.\nUseful for orchestrating app startup to prevent the service\ngoing up asynchronously with an empty cache.","ref":"Plausible.Shield.CountryRuleCache.html#ready?/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.refresh_all/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#refresh_all/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.refresh_updated_recently/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.size/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#size/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#telemetry_event_refresh/2"},{"type":"module","title":"Plausible.Shield.IPRule","doc":"Schema for IP block list","ref":"Plausible.Shield.IPRule.html"},{"type":"function","title":"Plausible.Shield.IPRule.changeset/2","doc":"","ref":"Plausible.Shield.IPRule.html#changeset/2"},{"type":"type","title":"Plausible.Shield.IPRule.t/0","doc":"","ref":"Plausible.Shield.IPRule.html#t:t/0"},{"type":"module","title":"Plausible.Shield.IPRuleCache","doc":"Allows retrieving IP Rules by domain and IP","ref":"Plausible.Shield.IPRuleCache.html"},{"type":"function","title":"Plausible.Shield.IPRuleCache.child_spec/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#child_spec/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.get/2","doc":"","ref":"Plausible.Shield.IPRuleCache.html#get/2"},{"type":"function","title":"Plausible.Shield.IPRuleCache.hit_rate/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#hit_rate/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.merge_items/2","doc":"","ref":"Plausible.Shield.IPRuleCache.html#merge_items/2"},{"type":"function","title":"Plausible.Shield.IPRuleCache.ready?/1","doc":"Ensures the cache has non-zero size unless no items exist.\nUseful for orchestrating app startup to prevent the service\ngoing up asynchronously with an empty cache.","ref":"Plausible.Shield.IPRuleCache.html#ready?/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.refresh_all/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#refresh_all/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.refresh_updated_recently/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.size/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#size/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Shield.IPRuleCache.html#telemetry_event_refresh/2"},{"type":"module","title":"Plausible.Shields","doc":"Contextual interface for shields.","ref":"Plausible.Shields.html"},{"type":"function","title":"Plausible.Shields.add_country_rule/3","doc":"","ref":"Plausible.Shields.html#add_country_rule/3"},{"type":"function","title":"Plausible.Shields.add_ip_rule/3","doc":"","ref":"Plausible.Shields.html#add_ip_rule/3"},{"type":"function","title":"Plausible.Shields.count_country_rules/1","doc":"","ref":"Plausible.Shields.html#count_country_rules/1"},{"type":"function","title":"Plausible.Shields.count_ip_rules/1","doc":"","ref":"Plausible.Shields.html#count_ip_rules/1"},{"type":"function","title":"Plausible.Shields.list_country_rules/1","doc":"","ref":"Plausible.Shields.html#list_country_rules/1"},{"type":"function","title":"Plausible.Shields.list_ip_rules/1","doc":"","ref":"Plausible.Shields.html#list_ip_rules/1"},{"type":"function","title":"Plausible.Shields.maximum_country_rules/0","doc":"","ref":"Plausible.Shields.html#maximum_country_rules/0"},{"type":"function","title":"Plausible.Shields.maximum_ip_rules/0","doc":"","ref":"Plausible.Shields.html#maximum_ip_rules/0"},{"type":"function","title":"Plausible.Shields.remove_country_rule/2","doc":"","ref":"Plausible.Shields.html#remove_country_rule/2"},{"type":"function","title":"Plausible.Shields.remove_ip_rule/2","doc":"","ref":"Plausible.Shields.html#remove_ip_rule/2"},{"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.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_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":"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\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\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.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_items/2","doc":"","ref":"Plausible.Site.Cache.html#merge_items/2"},{"type":"function","title":"Plausible.Site.Cache.ready?/1","doc":"Ensures the cache has non-zero size unless no items 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":"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 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 analytics imports","ref":"Plausible.Site.ImportedData.html"},{"type":"type","title":"Plausible.Site.ImportedData.t/0","doc":"","ref":"Plausible.Site.ImportedData.html#t:t/0"},{"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.clear_stats_start_date!/1","doc":"","ref":"Plausible.Sites.html#clear_stats_start_date!/1"},{"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.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.Sites.html#local_start_date/1"},{"type":"function","title":"Examples - Plausible.Sites.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.Sites.html#local_start_date/1-examples"},{"type":"function","title":"Plausible.Sites.locked?/1","doc":"","ref":"Plausible.Sites.html#locked?/1"},{"type":"function","title":"Plausible.Sites.native_stats_start_date/1","doc":"","ref":"Plausible.Sites.html#native_stats_start_date/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\nimported stats and Clickhouse, choosing the earliest start date and saves\nit 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/6","doc":"","ref":"Plausible.Stats.Breakdown.html#breakdown/6"},{"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.imported_pageview_counts/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#imported_pageview_counts/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_for_spike/4","doc":"","ref":"Plausible.Stats.Clickhouse.html#top_sources_for_spike/4"},{"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 overridden 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":"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.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":"A module for parsing filters used in stat queries.","ref":"Plausible.Stats.Filters.html"},{"type":"function","title":"Plausible.Stats.Filters.event_props/0","doc":"","ref":"Plausible.Stats.Filters.html#event_props/0"},{"type":"function","title":"Plausible.Stats.Filters.parse/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.Filters.html#parse/1"},{"type":"function","title":"Examples: - Plausible.Stats.Filters.parse/1","doc":"iex> Filters.parse(\"{\\\"page\\\":\\\"/blog/**\\\"}\")\n %{\"event:page\" => {:matches, \"/blog/**\"}}\n\n iex> Filters.parse(\"visit:browser!=Chrome\")\n %{\"visit:browser\" => {:is_not, \"Chrome\"}}\n\n iex> Filters.parse(nil)\n %{}","ref":"Plausible.Stats.Filters.html#parse/1-examples"},{"type":"function","title":"Plausible.Stats.Filters.visit_props/0","doc":"","ref":"Plausible.Stats.Filters.html#visit_props/0"},{"type":"function","title":"Plausible.Stats.Filters.without_prefix/1","doc":"","ref":"Plausible.Stats.Filters.html#without_prefix/1"},{"type":"module","title":"Plausible.Stats.Filters.Utils","doc":"Contains utility functions shared between `DashboardFilterParser`\nand `StatsAPIFilterParser`.","ref":"Plausible.Stats.Filters.Utils.html"},{"type":"function","title":"Plausible.Stats.Filters.Utils.list_expression?/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#list_expression?/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.parse_member_list/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#parse_member_list/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.remove_escape_chars/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#remove_escape_chars/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.unwrap_goal_value/1","doc":"Does the opposite to `wrap_goal_value`, turning the `{:page, path}`\nand `{:event, name}` tuples into strings. Similarly, when given a\nlist, maps all the list elements into strings with the same logic.","ref":"Plausible.Stats.Filters.Utils.html#unwrap_goal_value/1"},{"type":"function","title":"Examples - Plausible.Stats.Filters.Utils.unwrap_goal_value/1","doc":"iex> Plausible.Stats.Filters.Utils.unwrap_goal_value({:page, \"/register\"})\n \"Visit /register\"\n\n iex> Plausible.Stats.Filters.Utils.unwrap_goal_value({:event, \"Signup\"})\n \"Signup\"\n\n iex> Plausible.Stats.Filters.Utils.unwrap_goal_value([{:event, \"Signup\"}, {:page, \"/register\"}])\n [\"Signup\", \"Visit /register\"]","ref":"Plausible.Stats.Filters.Utils.html#unwrap_goal_value/1-examples"},{"type":"function","title":"Plausible.Stats.Filters.Utils.wildcard_expression?/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#wildcard_expression?/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.wrap_goal_value/1","doc":"Wraps the given goal filter into a tuple where the first element\nrepresents the goal type (i.e. `page` or `event`), and the second\nelement is either the page path or the event name.\n\nGiven a list of goal filter values, wraps all values based on the\nsame logic.","ref":"Plausible.Stats.Filters.Utils.html#wrap_goal_value/1"},{"type":"function","title":"Examples - Plausible.Stats.Filters.Utils.wrap_goal_value/1","doc":"iex> Plausible.Stats.Filters.Utils.wrap_goal_value(\"Visit /register\")\n {:page, \"/register\"}\n\n iex> Plausible.Stats.Filters.Utils.wrap_goal_value(\"Signup\")\n {:event, \"Signup\"}\n\n iex> Plausible.Stats.Filters.Utils.wrap_goal_value([\"Signup\", \"Visit /register\"])\n [{:event, \"Signup\"}, {:page, \"/register\"}]","ref":"Plausible.Stats.Filters.Utils.html#wrap_goal_value/1-examples"},{"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.get_by_key/3","doc":"Returns value of a key (usually property) under `meta.value` array or similar.\n\nThis macro is used for operating on custom properties.\nCallsites should also check whether key exists first in SQL via `has_key` macro.","ref":"Plausible.Stats.Fragments.html#get_by_key/3"},{"type":"macro","title":"Examples - Plausible.Stats.Fragments.get_by_key/3","doc":"`get_by_key(e, :meta, \"some_property_name\")` expands to SQL `meta.value[indexOf(meta.key, \"some_property\")]`","ref":"Plausible.Stats.Fragments.html#get_by_key/3-examples"},{"type":"macro","title":"Plausible.Stats.Fragments.has_key/3","doc":"Returns whether a key (usually property) exists under `meta.key` array or similar.\n\nThis macro is used for operating on custom properties.","ref":"Plausible.Stats.Fragments.html#has_key/3"},{"type":"macro","title":"Examples - Plausible.Stats.Fragments.has_key/3","doc":"`has_key(e, :meta, \"some_property_name\")` expands to SQL `has(meta.key, \"some_property_name\")`","ref":"Plausible.Stats.Fragments.html#has_key/3-examples"},{"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_all_filters_by_prefix/2","doc":"","ref":"Plausible.Stats.Query.html#get_all_filters_by_prefix/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/2","doc":"","ref":"Plausible.Stats.Query.html#trace/2"},{"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.calculate_cr/2","doc":"","ref":"Plausible.Stats.Util.html#calculate_cr/2"},{"type":"function","title":"Plausible.Stats.Util.keep_requested_metrics/2","doc":"Sometimes we need to manually add metrics in order to calculate the value for\nother metrics. E.g:\n\n* `__internal_visits` is fetched when querying bounce rate, visit duration,\n or views_per_visit, as it is needed to calculate these from imported data.\n\n* `visitors` metric might be added manually via `maybe_add_visitors_metric/1`,\n in order to be able to calculate conversion rate.\n\nThis function can be used for stripping those metrics from a breakdown (list),\nor an aggregate (map) result. We do not want to return metrics that we're not\nrequested.","ref":"Plausible.Stats.Util.html#keep_requested_metrics/2"},{"type":"function","title":"Plausible.Stats.Util.maybe_add_visitors_metric/1","doc":"This function adds the `visitors` metric into the list of\ngiven metrics if it's not already there and if there is a\n`conversion_rate` metric in the list.\n\nCurrently, the conversion rate cannot be queried from the\ndatabase with a simple select clause - instead, we need to\nfetch the database result first, and then manually add it\ninto the aggregate map or every entry of thebreakdown list.\n\nIn order for us to be able to calculate it based on the\nresults returned by the database query, the visitors metric\nneeds to be queried.","ref":"Plausible.Stats.Util.html#maybe_add_visitors_metric/1"},{"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.populate_stats/3","doc":"","ref":"Plausible.TestUtils.html#populate_stats/3"},{"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_datetime_in_timezone/2","doc":"","ref":"Plausible.Timezones.html#to_datetime_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.on_trial?/1","doc":"","ref":"Plausible.Users.html#on_trial?/1"},{"type":"function","title":"Plausible.Users.trial_days_left/1","doc":"","ref":"Plausible.Users.html#trial_days_left/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":"function","title":"Plausible.Workers.AcceptTrafficUntil.dry_run/1","doc":"","ref":"Plausible.Workers.AcceptTrafficUntil.html#dry_run/1"},{"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.ImportAnalytics","doc":"Worker for running analytics import jobs.","ref":"Plausible.Workers.ImportAnalytics.html"},{"type":"function","title":"Plausible.Workers.ImportAnalytics.import_complete/1","doc":"","ref":"Plausible.Workers.ImportAnalytics.html#import_complete/1"},{"type":"function","title":"Plausible.Workers.ImportAnalytics.import_fail/1","doc":"","ref":"Plausible.Workers.ImportAnalytics.html#import_fail/1"},{"type":"function","title":"Plausible.Workers.ImportAnalytics.import_fail_transient/1","doc":"","ref":"Plausible.Workers.ImportAnalytics.html#import_fail_transient/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* `theme` (`:string`) - Defaults to `\"primary\"`.\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* `theme` (`:string`) - Defaults to `\"primary\"`.\n* `disabled` (`:boolean`) - Defaults to `false`.\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.dynamic_icon/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#dynamic_icon/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.dynamic_icon/1","doc":"* `name` (`:atom`) (required)\n* `outline` (`:boolean`) - Defaults to `true`.\n* `solid` (`:boolean`) - Defaults to `false`.\n* `mini` (`:boolean`) - Defaults to `false`.\n* Global attributes are accepted. Supports all globals plus: `[\"fill\", \"stroke\", \"stroke-width\"]`.","ref":"PlausibleWeb.Components.Generic.html#dynamic_icon/1-attributes"},{"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 `\"\"`.\n* Global attributes are accepted.","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`) - Defaults to `\"#\"`.\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","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.server_info/1","doc":"Returns the address and port that the server is running on","ref":"PlausibleWeb.Endpoint.html#server_info/1"},{"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 `\n<.input name=\"my-input\" errors={[\"oh no!\"]} />","ref":"PlausibleWeb.Live.Components.Form.html#input/1-examples"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.input/1","doc":"* `id` (`:any`) - Defaults to `nil`.\n* `name` (`:any`)\n* `label` (`:string`) - Defaults to `nil`.\n* `value` (`:any`)\n* `type` (`:string`) - Defaults to `\"text\"`.\n* `field` (`Phoenix.HTML.FormField`) - a form field struct retrieved from the form, for example: @form[:email].\n* `errors` (`:list`) - Defaults to `[]`.\n* `checked` (`:boolean`) - the checked flag for checkbox inputs.\n* `prompt` (`:string`) - the prompt for select inputs. Defaults to `nil`.\n* `options` (`:list`) - the options to pass to Phoenix.HTML.Form.options_for_select/2.\n* `multiple` (`:boolean`) - the multiple flag for select inputs. Defaults to `false`.\n* Global attributes are accepted. Supports all globals plus: `[\"accept\", \"autocomplete\", \"capture\", \"cols\", \"disabled\", \"form\", \"list\", \"max\", \"maxlength\", \"min\", \"minlength\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"size\", \"step\"]`.","ref":"PlausibleWeb.Live.Components.Form.html#input/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Live.Components.Form.input/1","doc":"* `inner_block`","ref":"PlausibleWeb.Live.Components.Form.html#input/1-slots"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.input_with_clipboard/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#input_with_clipboard/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.input_with_clipboard/1","doc":"* `id` (`:string`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.\n* `name` (`:string`) (required)\n* `label` (`:string`) (required)\n* `value` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Live.Components.Form.html#input_with_clipboard/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.label/1","doc":"Renders a label.","ref":"PlausibleWeb.Live.Components.Form.html#label/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.label/1","doc":"* `for` (`:string`) - Defaults to `nil`.","ref":"PlausibleWeb.Live.Components.Form.html#label/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Live.Components.Form.label/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Live.Components.Form.html#label/1-slots"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.password_input_with_strength/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#password_input_with_strength/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.password_input_with_strength/1","doc":"* `id` (`:any`) - Defaults to `nil`.\n* `label` (`:string`) - Defaults to `nil`.\n* `field` (`Phoenix.HTML.FormField`) (required) - a form field struct retrieved from the form, for example: @form[:password].\n* `strength` (`:any`)\n* Global attributes are accepted. Supports all globals plus: `[\"autocomplete\", \"disabled\", \"form\", \"maxlength\", \"minlength\", \"readonly\", \"required\", \"size\"]`.","ref":"PlausibleWeb.Live.Components.Form.html#password_input_with_strength/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.password_length_hint/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#password_length_hint/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.password_length_hint/1","doc":"* `minimum` (`:integer`) (required)\n* `class` (`:any`)\n* `ok_class` (`:any`)\n* `error_class` (`:any`)\n* `field` (`Phoenix.HTML.FormField`) (required) - a form field struct retrieved from the form, for example: @form[:password].","ref":"PlausibleWeb.Live.Components.Form.html#password_length_hint/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.strength_meter/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#strength_meter/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.strength_meter/1","doc":"* `score` (`:integer`) - Defaults to `0`.\n* `warning` (`:string`) - Defaults to `\"\"`.\n* `suggestions` (`:list`) - Defaults to `[]`.","ref":"PlausibleWeb.Live.Components.Form.html#strength_meter/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.translate_error/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#translate_error/1"},{"type":"module","title":"PlausibleWeb.Live.Components.Modal","doc":"LiveView implementation of modal component.\n\nThis component is a general purpose modal implementation for LiveView\nwith emphasis on keeping nested components largely agnostic of the fact\nthat they are placed in a modal and maintaining good user experience\non connections with high latency.","ref":"PlausibleWeb.Live.Components.Modal.html"},{"type":"module","title":"Usage - PlausibleWeb.Live.Components.Modal","doc":"An example use case for a modal is embedding a form inside\nexisting live view which allows adding new entries of some kind:\n\n```\n<.live_component module={Modal} id=\"some-form-modal\">\n <.live_component\n module={SomeForm}\n id=\"some-form\"\n on_save_form={\n fn entry, socket ->\n send(self(), {:entry_added, entry})\n Modal.close(socket, \"some-form-modal\")\n end\n }\n />\n\n```\n\nThen somewhere in the same live view the modal is rendered in:\n\n```\n<.button x-data x-on:click={Modal.JS.open(\"goals-form-modal\")}>\n + Add Entry\n\n```","ref":"PlausibleWeb.Live.Components.Modal.html#module-usage"},{"type":"module","title":"Explanation - PlausibleWeb.Live.Components.Modal","doc":"The component embedded inside the modal is always rendered when\nthe live view is mounted but is kept hidden until `Modal.JS.open`\nis called on it. On subsequent openings within the same session\nthe contents of the modal are completely remounted. This assures\nthat any stateful components inside the modal are reset to their\ninitial state.\n\n`Modal` exposes two functions for managing window state:\n\n * `Modal.JS.open/1` - to open the modal from the frontend. It's\n important to make sure the element triggering that call is\n wrapped in an Alpine UI component - or is an Alpine component\n itself - adding `x-data` attribute without any value is enough\n to ensure that.\n * `Modal.close/2` - to close the modal from the backend; usually\n done inside wrapped component's `handle_event/2`. The example\n quoted above shows one way to implement this, under that assumption\n that the component exposes a callback, like this:\n\n ```\n defmodule SomeForm do\n use Phoenix.LiveComponent\n\n def update(assigns, socket) do\n # ...\n\n {:ok, assign(socket, :on_save_form, assigns.on_save_form)}\n end\n\n #...\n\n def handle_event(\"save-form\", %{\"form\" => form}, socket) do\n case save_entry(form) do\n {:ok, entry} ->\n {:noreply, socket.assigns.on_save_form(entry, socket)}\n\n # error case handling ...\n end\n end\n end\n ```\n\n Using callback approach has an added benefit of making the\n component more flexible.","ref":"PlausibleWeb.Live.Components.Modal.html#module-explanation"},{"type":"function","title":"PlausibleWeb.Live.Components.Modal.close/2","doc":"","ref":"PlausibleWeb.Live.Components.Modal.html#close/2"},{"type":"function","title":"PlausibleWeb.Live.Components.Modal.render/1","doc":"","ref":"PlausibleWeb.Live.Components.Modal.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Modal.render/1","doc":"* `id` (`:any`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.","ref":"PlausibleWeb.Live.Components.Modal.html#render/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Live.Components.Modal.render/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Live.Components.Modal.html#render/1-slots"},{"type":"module","title":"PlausibleWeb.Live.Components.Pagination","doc":"Pagination components for LiveViews.","ref":"PlausibleWeb.Live.Components.Pagination.html"},{"type":"function","title":"PlausibleWeb.Live.Components.Pagination.pagination/1","doc":"","ref":"PlausibleWeb.Live.Components.Pagination.html#pagination/1"},{"type":"module","title":"PlausibleWeb.Live.Components.Visitors","doc":"Component rendering mini-graph of site's visitors over the last 24 hours.\n\nThe `gradient_defs` component should be rendered once before using `chart`\none or more times.\n\nAccepts input generated via `Plausible.Stats.Clickhouse.last_24h_visitors_hourly_intervals/2`.","ref":"PlausibleWeb.Live.Components.Visitors.html"},{"type":"function","title":"PlausibleWeb.Live.Components.Visitors.chart/1","doc":"","ref":"PlausibleWeb.Live.Components.Visitors.html#chart/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Visitors.chart/1","doc":"* `intervals` (`:list`) (required)\n* `height` (`:integer`) - Defaults to `50`.\n* `tick` (`:integer`) - Defaults to `20`.","ref":"PlausibleWeb.Live.Components.Visitors.html#chart/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Visitors.gradient_defs/1","doc":"","ref":"PlausibleWeb.Live.Components.Visitors.html#gradient_defs/1"},{"type":"module","title":"PlausibleWeb.Live.Flash","doc":"Flash component for LiveViews - works also when embedded within dead views","ref":"PlausibleWeb.Live.Flash.html"},{"type":"function","title":"PlausibleWeb.Live.Flash.clear_flash_button/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#clear_flash_button/1"},{"type":"function","title":"PlausibleWeb.Live.Flash.flash/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#flash/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Flash.flash/1","doc":"* `key` (`:string`) - Defaults to `nil`.\n* `on_close` (`:any`) - Defaults to `\"lv:clear-flash\"`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Live.Flash.html#flash/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Live.Flash.flash/1","doc":"* `icon` (required)\n* `title`\n* `message` (required)","ref":"PlausibleWeb.Live.Flash.html#flash/1-slots"},{"type":"function","title":"PlausibleWeb.Live.Flash.flash_messages/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#flash_messages/1"},{"type":"function","title":"PlausibleWeb.Live.Flash.icon_error/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#icon_error/1"},{"type":"function","title":"PlausibleWeb.Live.Flash.icon_success/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#icon_success/1"},{"type":"function","title":"PlausibleWeb.Live.Flash.put_live_flash/3","doc":"","ref":"PlausibleWeb.Live.Flash.html#put_live_flash/3"},{"type":"module","title":"PlausibleWeb.Live.FunnelSettings","doc":"LiveView allowing listing, creating and deleting funnels.","ref":"PlausibleWeb.Live.FunnelSettings.html"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.handle_event/3","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.handle_info/2","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.mount/3","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.render/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.FunnelSettings.Form","doc":"Phoenix LiveComponent that renders a form used for setting up funnels.\nMakes use of dynamically placed `PlausibleWeb.Live.FunnelSettings.ComboBox` components\nto allow building searchable funnel definitions out of list of goals available.","ref":"PlausibleWeb.Live.FunnelSettings.Form.html"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.add_step_button/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#add_step_button/1"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.evaluation/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#evaluation/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.FunnelSettings.Form.evaluation/1","doc":"* `at` (`:integer`) (required)\n* `result` (`:map`) (required)","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#evaluation/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.handle_event/3","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.handle_info/2","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.mount/3","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.remove_step_button/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#remove_step_button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.FunnelSettings.Form.remove_step_button/1","doc":"* `step_idx` (`:integer`) (required)","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#remove_step_button/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.render/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.FunnelSettings.List","doc":"Phoenix LiveComponent module that renders a list of funnels with their names\nand the number of steps they have.\n\nEach funnel is displayed with a delete button, which triggers a confirmation\nmessage before deleting the funnel from the UI. If there are no funnels\nconfigured for the site, a message is displayed indicating so.","ref":"PlausibleWeb.Live.FunnelSettings.List.html"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.List.render/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.List.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.GoalSettings","doc":"LiveView allowing listing, creating and deleting goals.","ref":"PlausibleWeb.Live.GoalSettings.html"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.handle_event/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.handle_info/2","doc":"","ref":"PlausibleWeb.Live.GoalSettings.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.mount/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.render/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.GoalSettings.Form","doc":"Live view for the goal creation form","ref":"PlausibleWeb.Live.GoalSettings.Form.html"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.custom_event_fields/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#custom_event_fields/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.GoalSettings.Form.custom_event_fields/1","doc":"* `f` (`Phoenix.HTML.Form`)\n* `site` (`Plausible.Site`)\n* `current_user` (`Plausible.Auth.User`)\n* `has_access_to_revenue_goals?` (`:boolean`)\n* Global attributes are accepted.","ref":"PlausibleWeb.Live.GoalSettings.Form.html#custom_event_fields/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.handle_event/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.pageview_fields/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#pageview_fields/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.GoalSettings.Form.pageview_fields/1","doc":"* `f` (`Phoenix.HTML.Form`)\n* `site` (`Plausible.Site`)\n* Global attributes are accepted.","ref":"PlausibleWeb.Live.GoalSettings.Form.html#pageview_fields/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.pageviews_tab/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#pageviews_tab/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.render/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.suggest_page_paths/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#suggest_page_paths/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.tabs/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#tabs/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.update/2","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.GoalSettings.List","doc":"Phoenix LiveComponent module that renders a list of goals","ref":"PlausibleWeb.Live.GoalSettings.List.html"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.List.render/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.List.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.GoalSettings.List.render/1","doc":"* `goals` (`:list`) (required)\n* `domain` (`:string`) (required)\n* `filter_text` (`:string`)\n* `site` (`Plausible.Site`) (required)","ref":"PlausibleWeb.Live.GoalSettings.List.html#render/1-attributes"},{"type":"module","title":"PlausibleWeb.Live.ImportsExportsSettings","doc":"LiveView allowing listing and deleting imports.","ref":"PlausibleWeb.Live.ImportsExportsSettings.html"},{"type":"function","title":"PlausibleWeb.Live.ImportsExportsSettings.handle_info/2","doc":"","ref":"PlausibleWeb.Live.ImportsExportsSettings.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.ImportsExportsSettings.mount/3","doc":"","ref":"PlausibleWeb.Live.ImportsExportsSettings.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.ImportsExportsSettings.render/1","doc":"","ref":"PlausibleWeb.Live.ImportsExportsSettings.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.Plugins.API.Settings","doc":"LiveView allowing listing, creating and revoking Plugins API tokens.","ref":"PlausibleWeb.Live.Plugins.API.Settings.html"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.Settings.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Plugins.API.Settings.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.Settings.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Plugins.API.Settings.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.Settings.mount/3","doc":"","ref":"PlausibleWeb.Live.Plugins.API.Settings.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.Settings.render/1","doc":"","ref":"PlausibleWeb.Live.Plugins.API.Settings.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.Plugins.API.TokenForm","doc":"Live view for the goal creation form","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.TokenForm.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.TokenForm.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.TokenForm.mount/3","doc":"","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.TokenForm.render/1","doc":"","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.PropsSettings","doc":"LiveView allowing listing, allowing and disallowing custom event properties.","ref":"PlausibleWeb.Live.PropsSettings.html"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.handle_event/3","doc":"","ref":"PlausibleWeb.Live.PropsSettings.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.handle_info/2","doc":"","ref":"PlausibleWeb.Live.PropsSettings.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.mount/3","doc":"","ref":"PlausibleWeb.Live.PropsSettings.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.render/1","doc":"","ref":"PlausibleWeb.Live.PropsSettings.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.PropsSettings.Form","doc":"Live view for the custom props creation form","ref":"PlausibleWeb.Live.PropsSettings.Form.html"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.Form.handle_event/3","doc":"","ref":"PlausibleWeb.Live.PropsSettings.Form.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.Form.handle_info/2","doc":"","ref":"PlausibleWeb.Live.PropsSettings.Form.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.Form.mount/3","doc":"","ref":"PlausibleWeb.Live.PropsSettings.Form.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.Form.render/1","doc":"","ref":"PlausibleWeb.Live.PropsSettings.Form.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.PropsSettings.List","doc":"Phoenix LiveComponent module that renders a list of custom properties","ref":"PlausibleWeb.Live.PropsSettings.List.html"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.List.render/1","doc":"","ref":"PlausibleWeb.Live.PropsSettings.List.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.PropsSettings.List.render/1","doc":"* `props` (`:list`) (required)\n* `domain` (`:string`) (required)\n* `filter_text` (`:string`)","ref":"PlausibleWeb.Live.PropsSettings.List.html#render/1-attributes"},{"type":"module","title":"PlausibleWeb.Live.RegisterForm","doc":"LiveView for registration form.","ref":"PlausibleWeb.Live.RegisterForm.html"},{"type":"function","title":"PlausibleWeb.Live.RegisterForm.handle_event/3","doc":"","ref":"PlausibleWeb.Live.RegisterForm.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.RegisterForm.handle_info/2","doc":"","ref":"PlausibleWeb.Live.RegisterForm.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.RegisterForm.mount/3","doc":"","ref":"PlausibleWeb.Live.RegisterForm.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.RegisterForm.render/1","doc":"","ref":"PlausibleWeb.Live.RegisterForm.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.ResetPasswordForm","doc":"LiveView for password reset form.","ref":"PlausibleWeb.Live.ResetPasswordForm.html"},{"type":"function","title":"PlausibleWeb.Live.ResetPasswordForm.handle_event/3","doc":"","ref":"PlausibleWeb.Live.ResetPasswordForm.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.ResetPasswordForm.handle_info/2","doc":"","ref":"PlausibleWeb.Live.ResetPasswordForm.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.ResetPasswordForm.mount/3","doc":"","ref":"PlausibleWeb.Live.ResetPasswordForm.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.ResetPasswordForm.render/1","doc":"","ref":"PlausibleWeb.Live.ResetPasswordForm.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.SentryContext","doc":"This module tries to supply LiveViews with some common Sentry context\n(without it, there is practically none).\n\nUse via `use PlausibleWeb.Live.SentryContext` in your LiveView module,\nor preferably via `use PlausibleWeb, :live_view`.\n\nIn case you have multiple LiveViews, there is `use PlausibleWeb, live_view: :no_sentry_context`\nexposed that allows you to skip using this module. This is because\nonly the root LiveView has access to `connect_info` and an exception will be\nthrown otherwise.","ref":"PlausibleWeb.Live.SentryContext.html"},{"type":"function","title":"PlausibleWeb.Live.SentryContext.on_mount/4","doc":"","ref":"PlausibleWeb.Live.SentryContext.html#on_mount/4"},{"type":"module","title":"PlausibleWeb.Live.Shields.Countries","doc":"LiveView for IP Addresses Shield","ref":"PlausibleWeb.Live.Shields.Countries.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.Countries.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Shields.Countries.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.Countries.mount/3","doc":"","ref":"PlausibleWeb.Live.Shields.Countries.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.Countries.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.Countries.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.Shields.CountryRules","doc":"LiveView allowing Country Rules management","ref":"PlausibleWeb.Live.Shields.CountryRules.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.CountryRules.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Shields.CountryRules.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.CountryRules.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.CountryRules.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Shields.CountryRules.send_flash/2","doc":"","ref":"PlausibleWeb.Live.Shields.CountryRules.html#send_flash/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.CountryRules.update/2","doc":"","ref":"PlausibleWeb.Live.Shields.CountryRules.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.Shields.IPAddresses","doc":"LiveView for IP Addresses Shield","ref":"PlausibleWeb.Live.Shields.IPAddresses.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPAddresses.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Shields.IPAddresses.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPAddresses.mount/3","doc":"","ref":"PlausibleWeb.Live.Shields.IPAddresses.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPAddresses.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.IPAddresses.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.Shields.IPRules","doc":"LiveView allowing IP Rules management","ref":"PlausibleWeb.Live.Shields.IPRules.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPRules.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Shields.IPRules.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPRules.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.IPRules.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPRules.send_flash/2","doc":"","ref":"PlausibleWeb.Live.Shields.IPRules.html#send_flash/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPRules.update/2","doc":"","ref":"PlausibleWeb.Live.Shields.IPRules.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.Sites","doc":"LiveView for sites index.","ref":"PlausibleWeb.Live.Sites.html"},{"type":"function","title":"PlausibleWeb.Live.Sites.ellipsis_menu/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#ellipsis_menu/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.favicon/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#favicon/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Sites.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Sites.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Sites.handle_params/3","doc":"","ref":"PlausibleWeb.Live.Sites.html#handle_params/3"},{"type":"function","title":"PlausibleWeb.Live.Sites.icon_pin/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#icon_pin/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.icon_pin/1","doc":"* Global attributes are accepted.","ref":"PlausibleWeb.Live.Sites.html#icon_pin/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.invitation/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#invitation/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.invitation/1","doc":"* `site` (`Plausible.Site`) (required)\n* `invitation` (`Plausible.Auth.Invitation`) (required)\n* `hourly_stats` (`:map`) (required)","ref":"PlausibleWeb.Live.Sites.html#invitation/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.invitation_modal/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#invitation_modal/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.invitation_modal/1","doc":"* `user` (`Plausible.Auth.User`) (required)","ref":"PlausibleWeb.Live.Sites.html#invitation_modal/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.mount/3","doc":"","ref":"PlausibleWeb.Live.Sites.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Sites.percentage_change/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#percentage_change/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.percentage_change/1","doc":"* `change` (`:integer`) (required)","ref":"PlausibleWeb.Live.Sites.html#percentage_change/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.render/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.search_form/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#search_form/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.search_form/1","doc":"* `filter_text` (`:string`) - Defaults to `\"\"`.\n* `uri` (`URI`) (required)","ref":"PlausibleWeb.Live.Sites.html#search_form/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.site/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#site/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.site/1","doc":"* `site` (`Plausible.Site`) (required)\n* `hourly_stats` (`:map`) (required)","ref":"PlausibleWeb.Live.Sites.html#site/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.site_stats/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#site_stats/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.site_stats/1","doc":"* `hourly_stats` (`:map`) (required)","ref":"PlausibleWeb.Live.Sites.html#site_stats/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.upgrade_nag_screen/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#upgrade_nag_screen/1"},{"type":"module","title":"PlausibleWeb.MJML.StatsReport","doc":"MJML rendered for the weekly or monthly report e-mail","ref":"PlausibleWeb.MJML.StatsReport.html"},{"type":"function","title":"PlausibleWeb.MJML.StatsReport.debug_mjml_template/0","doc":"Returns the raw MJML template. Useful for debugging rendering issues.","ref":"PlausibleWeb.MJML.StatsReport.html#debug_mjml_template/0"},{"type":"function","title":"PlausibleWeb.MJML.StatsReport.render/1","doc":"Safely render the MJML template using Phoenix.HTML","ref":"PlausibleWeb.MJML.StatsReport.html#render/1"},{"type":"module","title":"PlausibleWeb.PageController","doc":"","ref":"PlausibleWeb.PageController.html"},{"type":"function","title":"PlausibleWeb.PageController.index/2","doc":"The root path is never accessible in Plausible.Cloud because it is handled by the upstream reverse proxy.\n\nThis controller action is only ever triggered in self-hosted Plausible.","ref":"PlausibleWeb.PageController.html#index/2"},{"type":"module","title":"PlausibleWeb.PageView","doc":"","ref":"PlausibleWeb.PageView.html"},{"type":"function","title":"PlausibleWeb.PageView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.PageView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.PageView.index.html/1","doc":"","ref":"PlausibleWeb.PageView.html#index.html/1"},{"type":"function","title":"PlausibleWeb.PageView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.PageView.html#render/2"},{"type":"function","title":"PlausibleWeb.PageView.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.PageView.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities","doc":"Controller for Plugins API Capabilities - doesn't enforce authentication,\nserves as a comprehensive health check","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities.index/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html#index/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html#shared_tags/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps","doc":"Controller for the CustomProp resource under Plugins API","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.disable/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#disable/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.enable/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#enable/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#shared_tags/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Controllers.Goals","doc":"Controller for the Goal resource under Plugins API","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.create/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#create/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.delete/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#delete/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.delete_bulk/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#delete_bulk/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.get/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#get/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.index/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#index/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#shared_tags/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks","doc":"Controller for the Shared Link resource under Plugins API","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.create/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#create/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.get/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#get/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.index/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#index/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#shared_tags/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Errors","doc":"Common responses for Plugins API","ref":"PlausibleWeb.Plugins.API.Errors.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Errors.error/3","doc":"","ref":"PlausibleWeb.Plugins.API.Errors.html#error/3"},{"type":"function","title":"PlausibleWeb.Plugins.API.Errors.unauthorized/1","doc":"","ref":"PlausibleWeb.Plugins.API.Errors.html#unauthorized/1"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Capabilities","doc":"OpenAPI schema for Capabilities","ref":"PlausibleWeb.Plugins.API.Schemas.Capabilities.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Capabilities.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Capabilities.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Capabilities.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Capabilities.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp","doc":"OpenAPI schema for Goal","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest","doc":"OpenAPI schema for Custom Property disable request","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest","doc":"OpenAPI schema for Custom Property creation request","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse","doc":"OpenAPI schema for SharedLink list response","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Error","doc":"OpenAPI schema for an error included in a response","ref":"PlausibleWeb.Plugins.API.Schemas.Error.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Error.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Error.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Error.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Error.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal","doc":"OpenAPI schema for Goal","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest","doc":"OpenAPI schema for Goal creation request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent","doc":"OpenAPI schema for Custom Event Goal creation request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview","doc":"OpenAPI schema for Pageview Goal creation request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue","doc":"OpenAPI schema for Custom Event Goal creation request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent","doc":"OpenAPI schema for Custom Event Goal object","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest","doc":"OpenAPI schema for bulk Goal deletion request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse","doc":"OpenAPI schema for Goals list response","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview","doc":"OpenAPI schema for Pageview Goal object","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue","doc":"OpenAPI schema for Revenue Goal object","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Type","doc":"OpenAPI schema for common Goal Type\n\nFuture-proof: funnels etc.","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Link","doc":"OpenAPI Link schema","ref":"PlausibleWeb.Plugins.API.Schemas.Link.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Link.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Link.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Link.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Link.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.NotFound","doc":"OpenAPI schema for a generic 404 response","ref":"PlausibleWeb.Plugins.API.Schemas.NotFound.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.NotFound.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.NotFound.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.NotFound.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.NotFound.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata","doc":"Pagination metadata OpenAPI schema","ref":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired","doc":"OpenAPI schema for a generic 402 response","ref":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink","doc":"OpenAPI schema for SharedLink object","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest","doc":"OpenAPI schema for SharedLink creation request","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse","doc":"OpenAPI schema for SharedLink list response","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Unauthorized","doc":"OpenAPI schema for a generic 401 response","ref":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity","doc":"OpenAPI schema for a generic 422 response","ref":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Spec","doc":"OpenAPI specification for the Plugins API","ref":"PlausibleWeb.Plugins.API.Spec.html"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.Capabilities","doc":"View for rendering Capabilities on the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.Capabilities.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Capabilities.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Capabilities.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Capabilities.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Capabilities.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Capabilities.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.Plugins.API.Views.Capabilities.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.CustomProp","doc":"View for rendering Custom Props in the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.CustomProp.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.CustomProp.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.CustomProp.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.CustomProp.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.CustomProp.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.CustomProp.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.Plugins.API.Views.CustomProp.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.Error","doc":"View for rendering Plugins REST API errors","ref":"PlausibleWeb.Plugins.API.Views.Error.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Error.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Error.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Error.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Error.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Error.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.Plugins.API.Views.Error.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.Goal","doc":"View for rendering Goals in the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.Goal.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Goal.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Goal.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Goal.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Goal.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Goal.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.Plugins.API.Views.Goal.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.Pagination","doc":"A view capable of rendering pagination metadata included\nin responses containing lists of objects.","ref":"PlausibleWeb.Plugins.API.Views.Pagination.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Pagination.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Pagination.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Pagination.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Pagination.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Pagination.render_metadata_links/4","doc":"","ref":"PlausibleWeb.Plugins.API.Views.Pagination.html#render_metadata_links/4"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Pagination.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.Plugins.API.Views.Pagination.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.SharedLink","doc":"View for rendering Shared Links in the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.SharedLink.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.SharedLink.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.SharedLink.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.SharedLink.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.SharedLink.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.SharedLink.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.Plugins.API.Views.SharedLink.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.PluginsAPICase","doc":"This module defines the test case to be used by\ntests that require setting up a Plugins API connection.","ref":"PlausibleWeb.PluginsAPICase.html"},{"type":"module","title":"PlausibleWeb.Plugs.AuthorizePluginsAPI","doc":"Plug for Basic HTTP Authentication using\nPlugins API Tokens lookup.","ref":"PlausibleWeb.Plugs.AuthorizePluginsAPI.html"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizePluginsAPI.call/2","doc":"","ref":"PlausibleWeb.Plugs.AuthorizePluginsAPI.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizePluginsAPI.init/1","doc":"","ref":"PlausibleWeb.Plugs.AuthorizePluginsAPI.html#init/1"},{"type":"module","title":"PlausibleWeb.Plugs.ErrorHandler","doc":"A thin macro wrapper around Plug.ErrorHandler that adds Sentry context\n containing a readable support hash presented to the users.\n To be used in the user-facing APIs, so that we don't leak internal\n server errors.\n\n Usage: `use PlausibleWeb.Plugs.ErrorHandler`","ref":"PlausibleWeb.Plugs.ErrorHandler.html"},{"type":"module","title":"PlausibleWeb.Plugs.MaybeDisableRegistration","doc":"Plug toggling registration according to selfhosted state.","ref":"PlausibleWeb.Plugs.MaybeDisableRegistration.html"},{"type":"function","title":"PlausibleWeb.Plugs.MaybeDisableRegistration.call/2","doc":"","ref":"PlausibleWeb.Plugs.MaybeDisableRegistration.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.MaybeDisableRegistration.init/1","doc":"","ref":"PlausibleWeb.Plugs.MaybeDisableRegistration.html#init/1"},{"type":"module","title":"PlausibleWeb.Plugs.NoRobots","doc":"Rejects bot requests by any means available.\n\nWe're adding `x-robots-tag` to the response header and annotate the conn\nwith \"noindex, nofollow\" under `private.robots` key.\n\nThe only exception is, if the request is trying to access our live demo\nat plausible.io/plausible.io - in which case we'll allow indexing, but deny\nfollowing links and skip the bot detection, in kind robots we trust.","ref":"PlausibleWeb.Plugs.NoRobots.html"},{"type":"module","title":"PlausibleWeb.RefInspector","doc":"","ref":"PlausibleWeb.RefInspector.html"},{"type":"function","title":"PlausibleWeb.RefInspector.parse/1","doc":"","ref":"PlausibleWeb.RefInspector.html#parse/1"},{"type":"function","title":"PlausibleWeb.RefInspector.right_uri?/1","doc":"","ref":"PlausibleWeb.RefInspector.html#right_uri?/1"},{"type":"module","title":"PlausibleWeb.RemoteIP","doc":"Implements the strategy of retrieving client's remote IP","ref":"PlausibleWeb.RemoteIP.html"},{"type":"function","title":"PlausibleWeb.RemoteIP.get/1","doc":"","ref":"PlausibleWeb.RemoteIP.html#get/1"},{"type":"module","title":"PlausibleWeb.RequireAccountPlug","doc":"","ref":"PlausibleWeb.RequireAccountPlug.html"},{"type":"function","title":"PlausibleWeb.RequireAccountPlug.call/2","doc":"","ref":"PlausibleWeb.RequireAccountPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.RequireAccountPlug.init/1","doc":"","ref":"PlausibleWeb.RequireAccountPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.RequireLoggedOutPlug","doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html"},{"type":"function","title":"PlausibleWeb.RequireLoggedOutPlug.call/2","doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.RequireLoggedOutPlug.init/1","doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.Router","doc":"","ref":"PlausibleWeb.Router.html"},{"type":"function","title":"PlausibleWeb.Router.api/2","doc":"","ref":"PlausibleWeb.Router.html#api/2"},{"type":"function","title":"PlausibleWeb.Router.app_layout/2","doc":"","ref":"PlausibleWeb.Router.html#app_layout/2"},{"type":"function","title":"PlausibleWeb.Router.browser/2","doc":"","ref":"PlausibleWeb.Router.html#browser/2"},{"type":"function","title":"PlausibleWeb.Router.call/2","doc":"Callback invoked by Plug on every request.","ref":"PlausibleWeb.Router.html#call/2"},{"type":"function","title":"PlausibleWeb.Router.csrf/2","doc":"","ref":"PlausibleWeb.Router.html#csrf/2"},{"type":"function","title":"PlausibleWeb.Router.flags/2","doc":"","ref":"PlausibleWeb.Router.html#flags/2"},{"type":"function","title":"PlausibleWeb.Router.focus_layout/2","doc":"","ref":"PlausibleWeb.Router.html#focus_layout/2"},{"type":"function","title":"PlausibleWeb.Router.init/1","doc":"Callback required by Plug that initializes the router\nfor serving web requests.","ref":"PlausibleWeb.Router.html#init/1"},{"type":"function","title":"PlausibleWeb.Router.internal_stats_api/2","doc":"","ref":"PlausibleWeb.Router.html#internal_stats_api/2"},{"type":"function","title":"PlausibleWeb.Router.kaffy_browser/2","doc":"","ref":"PlausibleWeb.Router.html#kaffy_browser/2"},{"type":"function","title":"PlausibleWeb.Router.plugins_api/2","doc":"","ref":"PlausibleWeb.Router.html#plugins_api/2"},{"type":"function","title":"PlausibleWeb.Router.plugins_api_auth/2","doc":"","ref":"PlausibleWeb.Router.html#plugins_api_auth/2"},{"type":"function","title":"PlausibleWeb.Router.public_api/2","doc":"","ref":"PlausibleWeb.Router.html#public_api/2"},{"type":"function","title":"PlausibleWeb.Router.shared_link/2","doc":"","ref":"PlausibleWeb.Router.html#shared_link/2"},{"type":"module","title":"PlausibleWeb.SessionTimeoutPlug","doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html"},{"type":"function","title":"PlausibleWeb.SessionTimeoutPlug.call/2","doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.SessionTimeoutPlug.init/1","doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.Site.MembershipController","doc":"This controller deals with user management via the UI in Site Settings -> 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_import/2","doc":"","ref":"PlausibleWeb.SiteController.html#forget_import/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_imports_exports/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_imports_exports/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_shields/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_shields/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_imports_exports.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_imports_exports.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_shields.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_shields.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 Plausible Community Edition or have us manage Plausible Analytics 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 12,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 Analytics 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 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 and self-hosted solution called [Plausible Community Edition (CE)](https://plausible.io/self-hosted-web-analytics). Here are the differences between Plausible Analytics managed hosting in the cloud and the Plausible CE:\n\n| | Plausible Analytics Cloud | Plausible Community Edition |\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](https://plausible.io/blog/community-edition).|\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. CE 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 CE on your server? Take a look at our [Plausible CE installation instructions](https://github.com/plausible/community-edition/).\n\nPlausible CE 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.","ref":"readme.html#can-plausible-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 CE 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"}],"content_type":"text/markdown"} \ No newline at end of file diff --git a/dist/search_data-AA77C992.js b/dist/search_data-AA77C992.js deleted file mode 100644 index 422a40fbf0..0000000000 --- a/dist/search_data-AA77C992.js +++ /dev/null @@ -1 +0,0 @@ -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/1","doc":"Starts a account locking grace period of 7 days by changing the User struct.","ref":"Plausible.Auth.GracePeriod.html#start_changeset/1"},{"type":"function","title":"Plausible.Auth.GracePeriod.start_manual_lock_changeset/1","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/1"},{"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.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_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":"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":"macro","title":"Plausible.Billing.Feature.list_short_names/0","doc":"Lists all the feature short names, e.g. RevenueGoals","ref":"Plausible.Billing.Feature.html#list_short_names/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.pageview_allowance_margin/0","doc":"","ref":"Plausible.Billing.Quota.html#pageview_allowance_margin/0"},{"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/2","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.\n\n* Specific e-mails can be excluded from the count, so that where necessary,\n we can ensure inviting the same person(s) to more than 1 sites is allowed","ref":"Plausible.Billing.Quota.html#team_member_usage/2"},{"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":"behaviour","title":"Plausible.Cache","doc":"Caching interface specific for Plausible. Usage:\n\n use Plausible.Cache\n\n # - Implement the callbacks required\n # - Optionally override `unwrap_cache_keys/1`\n # - Populate the cache with `Plausible.Cache.Warmer`\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 `:plausible, Elixir.Plausible.Cache, enabled: bool()` application env key.\nThis can be overridden on case by case basis, using the child specs options.\n\nThe `base_db_query/0` callback is used to generate the base query that is \nexecuted on every cache refresh. \n\nThere are two modes of refresh operation: `:all` and `:updated_recently`;\nthe former will invoke the query as is and clear all the existing entries,\nwhile the latter will attempt to limit the query to only the records that \nhave been updated in the last 15 minutes and try to merge the new results with\nexisting cache entries.\n\nBoth refresh modes are normally executed periodically from within a warmer process;\nsee: `Plausible.Cache.Warmer`. The reason for two modes is that the latter is lighter \non the database and can be executed more frequently.\n\nWhen Cache is disabled via application env, the `get/1` function\nfalls back to pure database lookups (implemented via `get_from_source/1` callback. \nThis should help with introducing cached lookups in existing code, \nso that no existing tests should break.\n\nRefreshing the cache emits telemetry event defined as per `telemetry_event_refresh/2`.","ref":"Plausible.Cache.html"},{"type":"callback","title":"Plausible.Cache.base_db_query/0","doc":"Returns the base Ecto query used to refresh the cache","ref":"Plausible.Cache.html#c:base_db_query/0"},{"type":"callback","title":"Plausible.Cache.child_id/0","doc":"Supervisor child id, must be unique within the supervision tree","ref":"Plausible.Cache.html#c:child_id/0"},{"type":"callback","title":"Plausible.Cache.count_all/0","doc":"Counts all items at the source, an aggregate query most likely","ref":"Plausible.Cache.html#c:count_all/0"},{"type":"function","title":"Plausible.Cache.enabled?/0","doc":"Looks for application env value at `:plausible, Elixir.Plausible.Cache, enabled: bool()`","ref":"Plausible.Cache.html#enabled?/0"},{"type":"callback","title":"Plausible.Cache.get_from_source/1","doc":"Retrieves the item from the source, in case the cache is disabled","ref":"Plausible.Cache.html#c:get_from_source/1"},{"type":"callback","title":"Plausible.Cache.name/0","doc":"Unique cache name, used by underlying implementation","ref":"Plausible.Cache.html#c:name/0"},{"type":"callback","title":"Plausible.Cache.unwrap_cache_keys/1","doc":"Optionally unwraps the keys of the cache items, in case one item is stored under multiple keys","ref":"Plausible.Cache.html#c:unwrap_cache_keys/1"},{"type":"module","title":"Plausible.Cache.Warmer","doc":"A periodic cache warmer.\n\nChild specification options available:\n\n * `cache_impl` - module expected to implement `Plausible.Cache` behaviour\n * `interval` - the number of milliseconds for each warm-up cycle\n * `cache_name` - defaults to cache_impl.name() but can be overridden for testing\n * `force_start?` - enforcess process startup for testing, even if it's barred\n by `Plausible.Cache.enabled?`. This is useful for avoiding issues with DB ownership\n and async tests.\n * `warmer_fn` - by convention, either `:refresh_all` or `:refresh_updated_recently`,\n both are automatically provided by `cache_impl` module. Technically any exported\n or captured function will work, if need be.\n\nSee tests for more comprehensive examples.","ref":"Plausible.Cache.Warmer.html"},{"type":"function","title":"Plausible.Cache.Warmer.child_spec/1","doc":"","ref":"Plausible.Cache.Warmer.html#child_spec/1"},{"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_gettext_locale/1","doc":"Set the current process's Gettext locale from a\n`t:Cldr.LanguageTag`.","ref":"Plausible.Cldr.html#put_gettext_locale/1"},{"type":"function","title":"Arguments - Plausible.Cldr.put_gettext_locale/1","doc":"* `locale` is a `Cldr.LanguageTag` struct returned by `Cldr.Locale.new!/2`.","ref":"Plausible.Cldr.html#put_gettext_locale/1-arguments"},{"type":"function","title":"Returns - Plausible.Cldr.put_gettext_locale/1","doc":"* `{:ok, gettext_locale_name}` or\n\n* `{:error, {exception, reason}}`","ref":"Plausible.Cldr.html#put_gettext_locale/1-returns"},{"type":"function","title":"Behaviour - Plausible.Cldr.put_gettext_locale/1","doc":"1. If the `locale.gettext_locale_name` is `nil` then an error\n is returned.\n\n2. The `gettext` locale for the `gettext_backend` configured for the\n CLDR backend defined by the `t:Cldr.LanguageTag` is set.","ref":"Plausible.Cldr.html#put_gettext_locale/1-behaviour"},{"type":"function","title":"Examples - Plausible.Cldr.put_gettext_locale/1","doc":"iex> import Cldr.LanguageTag.Sigil\n iex> Plausible.Cldr.put_gettext_locale(~l\"en\")\n {:ok, \"en\"}\n\n iex> import Cldr.LanguageTag.Sigil\n iex> Plausible.Cldr.put_gettext_locale(~l\"de\")\n {:error,\n {Cldr.UnknownLocaleError,\n \"Locale #Cldr.LanguageTag does not map to a known gettext locale name\"}}","ref":"Plausible.Cldr.html#put_gettext_locale/1-examples"},{"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\", format: :percent)\n {:error, {Cldr.UnknownFormatError,\n \"The locale :he with number system :hebr does not define a format :percent\"}}\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.numeric_systems/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.numeric_systems/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.DataMigration.VersionedSessions","doc":"Sessions CollapsingMergeTree -> VersionedCollapsingMergeTree migration, SQL files available at:\npriv/data_migrations/VersionedSessions/sql","ref":"Plausible.DataMigration.VersionedSessions.html"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.confirm/3","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run/1","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#run/1"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run_sql/2","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql/2"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run_sql_confirm/2","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql_confirm/2"},{"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.country_rule_factory/0","doc":"","ref":"Plausible.Factory.html#country_rule_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.ip_rule_factory/0","doc":"","ref":"Plausible.Factory.html#ip_rule_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/2","doc":"","ref":"Plausible.Google.Api.html#fetch_and_persist/2"},{"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 passed to persist callback.\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.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":"Context for managing site statistics imports.\n\nCurrently following importers are implemented:\n\n* `Plausible.Imported.UniversalAnalytics` - existing mechanism, for legacy Google\n analytics formerly known as \"Google Analytics\"\n* `Plausible.Imported.NoopImporter` - importer stub, used mainly for testing purposes\n* `Plausible.Imported.CSVImporter` - CSV importer from S3\n\nFor more information on implementing importers, see `Plausible.Imported.Importer`.","ref":"Plausible.Imported.html"},{"type":"function","title":"Plausible.Imported.delete_imports_for_site/1","doc":"","ref":"Plausible.Imported.html#delete_imports_for_site/1"},{"type":"function","title":"Plausible.Imported.get_earliest_import/1","doc":"","ref":"Plausible.Imported.html#get_earliest_import/1"},{"type":"function","title":"Plausible.Imported.list_all_imports/1","doc":"","ref":"Plausible.Imported.html#list_all_imports/1"},{"type":"function","title":"Plausible.Imported.list_complete_import_ids/1","doc":"","ref":"Plausible.Imported.html#list_complete_import_ids/1"},{"type":"function","title":"Plausible.Imported.load_import_data/1","doc":"","ref":"Plausible.Imported.html#load_import_data/1"},{"type":"function","title":"Plausible.Imported.tables/0","doc":"","ref":"Plausible.Imported.html#tables/0"},{"type":"module","title":"Plausible.Imported.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.Imported.Buffer.html"},{"type":"function","title":"Plausible.Imported.Buffer.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Imported.Buffer.html#child_spec/1"},{"type":"function","title":"Plausible.Imported.Buffer.flush/2","doc":"Flushes all table buffers to Clickhouse.","ref":"Plausible.Imported.Buffer.html#flush/2"},{"type":"function","title":"Plausible.Imported.Buffer.handle_continue/2","doc":"","ref":"Plausible.Imported.Buffer.html#handle_continue/2"},{"type":"function","title":"Plausible.Imported.Buffer.init/1","doc":"","ref":"Plausible.Imported.Buffer.html#init/1"},{"type":"function","title":"Plausible.Imported.Buffer.insert_many/3","doc":"Puts the given records into the table buffer.","ref":"Plausible.Imported.Buffer.html#insert_many/3"},{"type":"function","title":"Plausible.Imported.Buffer.size/2","doc":"Returns the total count of items in the given table buffer.","ref":"Plausible.Imported.Buffer.html#size/2"},{"type":"function","title":"Plausible.Imported.Buffer.start_link/0","doc":"","ref":"Plausible.Imported.Buffer.html#start_link/0"},{"type":"function","title":"Plausible.Imported.Buffer.stop/1","doc":"","ref":"Plausible.Imported.Buffer.html#stop/1"},{"type":"module","title":"Plausible.Imported.CSVImporter","doc":"CSV importer from S3 that uses ClickHouse [s3 table function.](https://clickhouse.com/docs/en/sql-reference/table-functions/s3)","ref":"Plausible.Imported.CSVImporter.html"},{"type":"function","title":"Plausible.Imported.CSVImporter.new_import/3","doc":"","ref":"Plausible.Imported.CSVImporter.html#new_import/3"},{"type":"module","title":"Plausible.Imported.ImportSources","doc":"Definitions of import sources.","ref":"Plausible.Imported.ImportSources.html"},{"type":"function","title":"Plausible.Imported.ImportSources.by_name/1","doc":"","ref":"Plausible.Imported.ImportSources.html#by_name/1"},{"type":"function","title":"Plausible.Imported.ImportSources.names/0","doc":"","ref":"Plausible.Imported.ImportSources.html#names/0"},{"type":"behaviour","title":"Plausible.Imported.Importer","doc":"Behaviour that should be implemented for each import source.\n\nAll imports are executed as background jobs run via `Plausible.Workers.ImportAnalytics`\nOban worker. Each import source must define a module conforming `Importer` behaviour.\n\nThe callbacks that need to be implemented:\n\n* `name/0` - Returns import source name as an atom. Example: `:universal_analytics`.\n* `label/0` - Descriptive, display friendly name of the source.\n Example: \"Google Analytics\".\n* `email_template/0` - Name of the email template to use for notifications in\n `PlausibleWeb.Email` (`import_success` and `import_failure`). The template\n should have content customized for a particular source.\n* `parse_args/1` - Receives Oban job arguments coming from `new_import/3`. Whatever\n options were passed to `new_import/3` will be present in the input map with string\n keys and values serialized to primitives. If, for instance `start_date: ~D[2024-01-03]`\n is passed as an option, `parse_args/1` receives `%{..., \"start_date\" => \"2024-01-03\"}`.\n The expectation is parsing the map values producing a keyword list of options to\n pass to `import_data/2`.\n* `import_data/2` - Receives site import struct and options produced by `parse_args/1`.\n This is where all the import processing is done. The way the import is implemented\n is entirely arbitrary except the requirement that the process as a whole must\n by synchronous. The callback is expected to return either `:ok` or `{:ok, %{...}}`\n on successful import or `{:error, ...}` on failure. The map in success tuple is\n used for updating site import struct and is passed to `on_success/2` callback.\n Please note that error tuple should be only returned on errors that can't be\n recovered from. For transient errors, the import should throw an exception or\n simply crash.\n* `before_start/1` - Optional callback run right before scheduling import job. It's\n expected to either return `:ok` for the import to proceed or `{:error, ...}` tuple,\n which will be returned from `new_import/3` call.\n* `on_success/2` - Optional callback run once site import is completed. Receives map\n returned from `import_data/2`. Expected to always return `:ok`.\n* `on_failure/1` - Optional callback run when import job fails permanently.\n\nAll sources must be added to the list in `Plausible.Imported.ImportSources`.\n\nIn order to schedule a new import job using a given source, respective importer's\n`new_import/3` function must be called. It accepts site, user who is doing the import\nand any options necessary to carry out the import.\n\nThere's an expectation that `start_date` and `end_date` are provided either as options\npassed to `new_import/3` or data in map returned from `import_data/2`. If these parameters\nare not provided, the import will eventually crash. These parameters define time range\nof imported data which is in turn used for efficient querying.\n\nLogic running inside `import_data/2` is expected to populated all `imported_*` tables\nin ClickHouse with `import_id` column set to site import's ID.\n\nManaging any configuration or authentication prior to running import is outside of\nscope of importer logic and is expected to be implemented separately.","ref":"Plausible.Imported.Importer.html"},{"type":"behaviour","title":"Running import fully synchronously - Plausible.Imported.Importer","doc":"In case it's necessary to run the whole import job fully synchronously, the\n`Plausible.Workers.ImportAnalytics` worker sends an `Oban.Notifier` message\non completion, failure or transient failure of the import.\n\nA basic usage scenario looks like this:\n\n```elixir\n{:ok, job} = Plausible.Imported.NoopImporter.new_import(\n site,\n user,\n start_date: ~D[2005-01-01],\n end_date: Date.utc_today(),\n # this option is necessary to setup the calling process as listener\n listen?: true\n)\n\nimport_id = job.args[:import_id]\n\nreceive do\n {:notification, :analytics_imports_jobs, %{\"complete\" => ^import_id}} ->\n IO.puts(\"Job completed\")\n\n {:notification, :analytics_imports_jobs, %{\"transient_fail\" => ^import_id}} ->\n IO.puts(\"Job failed transiently\")\n\n {:notification, :analytics_imports_jobs, %{\"fail\" => ^import_id}} ->\n IO.puts(\"Job failed permanently\")\nafter\n 15_000 ->\n IO.puts(\"Job didn't finish in 15 seconds\")\nend\n```\n\nIn a more realistic scenario, job scheduling will be done inside a GenServer process\nlike LiveView, where notifications can be listened for via `handle_info/2`.","ref":"Plausible.Imported.Importer.html#module-running-import-fully-synchronously"},{"type":"callback","title":"Plausible.Imported.Importer.before_start/1","doc":"","ref":"Plausible.Imported.Importer.html#c:before_start/1"},{"type":"callback","title":"Plausible.Imported.Importer.email_template/0","doc":"","ref":"Plausible.Imported.Importer.html#c:email_template/0"},{"type":"callback","title":"Plausible.Imported.Importer.import_data/2","doc":"","ref":"Plausible.Imported.Importer.html#c:import_data/2"},{"type":"callback","title":"Plausible.Imported.Importer.label/0","doc":"","ref":"Plausible.Imported.Importer.html#c:label/0"},{"type":"callback","title":"Plausible.Imported.Importer.name/0","doc":"","ref":"Plausible.Imported.Importer.html#c:name/0"},{"type":"callback","title":"Plausible.Imported.Importer.on_failure/1","doc":"","ref":"Plausible.Imported.Importer.html#c:on_failure/1"},{"type":"callback","title":"Plausible.Imported.Importer.on_success/2","doc":"","ref":"Plausible.Imported.Importer.html#c:on_success/2"},{"type":"callback","title":"Plausible.Imported.Importer.parse_args/1","doc":"","ref":"Plausible.Imported.Importer.html#c:parse_args/1"},{"type":"module","title":"Plausible.Imported.NoopImporter","doc":"Stub import implementation.","ref":"Plausible.Imported.NoopImporter.html"},{"type":"function","title":"Plausible.Imported.NoopImporter.new_import/3","doc":"","ref":"Plausible.Imported.NoopImporter.html#new_import/3"},{"type":"module","title":"Plausible.Imported.SiteImport","doc":"Site import schema.","ref":"Plausible.Imported.SiteImport.html"},{"type":"function","title":"Plausible.Imported.SiteImport.complete_changeset/2","doc":"","ref":"Plausible.Imported.SiteImport.html#complete_changeset/2"},{"type":"macro","title":"Plausible.Imported.SiteImport.completed/0","doc":"","ref":"Plausible.Imported.SiteImport.html#completed/0"},{"type":"function","title":"Plausible.Imported.SiteImport.create_changeset/3","doc":"","ref":"Plausible.Imported.SiteImport.html#create_changeset/3"},{"type":"function","title":"Plausible.Imported.SiteImport.fail_changeset/1","doc":"","ref":"Plausible.Imported.SiteImport.html#fail_changeset/1"},{"type":"macro","title":"Plausible.Imported.SiteImport.failed/0","doc":"","ref":"Plausible.Imported.SiteImport.html#failed/0"},{"type":"macro","title":"Plausible.Imported.SiteImport.importing/0","doc":"","ref":"Plausible.Imported.SiteImport.html#importing/0"},{"type":"function","title":"Plausible.Imported.SiteImport.label/1","doc":"","ref":"Plausible.Imported.SiteImport.html#label/1"},{"type":"macro","title":"Plausible.Imported.SiteImport.pending/0","doc":"","ref":"Plausible.Imported.SiteImport.html#pending/0"},{"type":"function","title":"Plausible.Imported.SiteImport.start_changeset/1","doc":"","ref":"Plausible.Imported.SiteImport.html#start_changeset/1"},{"type":"type","title":"Plausible.Imported.SiteImport.t/0","doc":"","ref":"Plausible.Imported.SiteImport.html#t:t/0"},{"type":"module","title":"Plausible.Imported.UniversalAnalytics","doc":"Import implementation for Universal Analytics.","ref":"Plausible.Imported.UniversalAnalytics.html"},{"type":"function","title":"Plausible.Imported.UniversalAnalytics.from_report/4","doc":"","ref":"Plausible.Imported.UniversalAnalytics.html#from_report/4"},{"type":"function","title":"Plausible.Imported.UniversalAnalytics.import_data/2","doc":"Imports stats from a Google Analytics UA view to a Plausible site.\n\nThis function fetches Google Analytics reports which are then passed in batches\nto Clickhouse by the `Plausible.Imported.Buffer` process.","ref":"Plausible.Imported.UniversalAnalytics.html#import_data/2"},{"type":"function","title":"Plausible.Imported.UniversalAnalytics.new_import/3","doc":"","ref":"Plausible.Imported.UniversalAnalytics.html#new_import/3"},{"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.License","doc":"This module ensures that you cannot run Plausible Analytics Enterprise Edition without a valid license key.\n The software contained within the ee/ and assets/js/dashboard/ee directories are Copyright © Plausible Insights OÜ.\n We have made this code available solely for informational and transparency purposes. No rights are granted to use,\n distribute, or exploit this software in any form.\n\n Any attempt to disable or modify the behavior of this module will be considered a violation of copyright.\n If you wish to use the Plausible Analytics Enterprise Edition for your own requirements, please contact us\n at hello@plausible.io to discuss obtaining a license.","ref":"Plausible.License.html"},{"type":"function","title":"Plausible.License.ensure_valid_license/0","doc":"","ref":"Plausible.License.html#ensure_valid_license/0"},{"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.MigrationUtils","doc":"Base module for to use in Clickhouse migrations","ref":"Plausible.MigrationUtils.html"},{"type":"function","title":"Plausible.MigrationUtils.clustered_table?/1","doc":"","ref":"Plausible.MigrationUtils.html#clustered_table?/1"},{"type":"function","title":"Plausible.MigrationUtils.on_cluster_statement/1","doc":"","ref":"Plausible.MigrationUtils.html#on_cluster_statement/1"},{"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.Capabilities","doc":"Context module for querying API capabilities","ref":"Plausible.Plugins.API.Capabilities.html"},{"type":"function","title":"Plausible.Plugins.API.Capabilities.get/1","doc":"","ref":"Plausible.Plugins.API.Capabilities.html#get/1"},{"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.allowed_for/2","doc":"Returns the custom props allowed in queries for the given site. There are\ntwo factors deciding whether a custom property is allowed for a site.\n\n#","ref":"Plausible.Props.html#allowed_for/2"},{"type":"function","title":"1. Subscription plan including the props feature. - Plausible.Props.allowed_for/2","doc":"Internally used keys (i.e. `[\"url\", \"path\"]`) are always allowed,\neven for plans that don't include props. For any other props, access to the\nCustom Properties feature is required.\n\n#","ref":"Plausible.Props.html#allowed_for/2-1-subscription-plan-including-the-props-feature"},{"type":"function","title":"2. The site having an `allowed_event_props` list configured. - Plausible.Props.allowed_for/2","doc":"For customers with a configured `allowed_event_props` list, this function\nreturns that list (+ internally used keys). That helps to filter out garbage\nprops which people might not want to see in their dashboards.\n\nWith the `bypass_setup?` boolean option you can override the requirement of\nthe site having set up props in the `allowed_event_props` list. For example,\nthis is currently used for fetching allowed properties in Stats API queries\nin order to ensure the props feature access.\n\nSince `allowed_event_props` was added after the props feature had already\nbeen used for a while, there are sites with `allowed_event_props = nil`. For\nthose sites, all custom properties that exist in the database are allowed to\nbe queried.","ref":"Plausible.Props.html#allowed_for/2-2-the-site-having-an-allowed_event_props-list-configured"},{"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 and clears the `stats_start_date` field.\n\nThe `stats_start_date` is expected to get repopulated the next time\n`Plausible.Sites.stats_start_date/1` is called.\n\nIf the input argument is a site, all imported stats are deleted. If it's a site import,\nonly imported stats for that import are deleted.","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.S3","doc":"Helper functions for S3 exports/imports.","ref":"Plausible.S3.html"},{"type":"function","title":"Plausible.S3.import_clickhouse_credentials/0","doc":"Returns `access_key_id` and `secret_access_key` to be used by ClickHouse during imports from S3.","ref":"Plausible.S3.html#import_clickhouse_credentials/0"},{"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.Shield.CountryRule","doc":"Schema for Country Block List","ref":"Plausible.Shield.CountryRule.html"},{"type":"function","title":"Plausible.Shield.CountryRule.changeset/2","doc":"","ref":"Plausible.Shield.CountryRule.html#changeset/2"},{"type":"type","title":"Plausible.Shield.CountryRule.t/0","doc":"","ref":"Plausible.Shield.CountryRule.html#t:t/0"},{"type":"module","title":"Plausible.Shield.CountryRuleCache","doc":"Allows retrieving Country Rules by domain and country code","ref":"Plausible.Shield.CountryRuleCache.html"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.child_spec/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#child_spec/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.get/2","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#get/2"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.hit_rate/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#hit_rate/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.merge_items/2","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#merge_items/2"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.ready?/1","doc":"Ensures the cache has non-zero size unless no items exist.\nUseful for orchestrating app startup to prevent the service\ngoing up asynchronously with an empty cache.","ref":"Plausible.Shield.CountryRuleCache.html#ready?/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.refresh_all/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#refresh_all/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.refresh_updated_recently/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.size/1","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#size/1"},{"type":"function","title":"Plausible.Shield.CountryRuleCache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#telemetry_event_refresh/2"},{"type":"module","title":"Plausible.Shield.IPRule","doc":"Schema for IP block list","ref":"Plausible.Shield.IPRule.html"},{"type":"function","title":"Plausible.Shield.IPRule.changeset/2","doc":"","ref":"Plausible.Shield.IPRule.html#changeset/2"},{"type":"type","title":"Plausible.Shield.IPRule.t/0","doc":"","ref":"Plausible.Shield.IPRule.html#t:t/0"},{"type":"module","title":"Plausible.Shield.IPRuleCache","doc":"Allows retrieving IP Rules by domain and IP","ref":"Plausible.Shield.IPRuleCache.html"},{"type":"function","title":"Plausible.Shield.IPRuleCache.child_spec/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#child_spec/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.get/2","doc":"","ref":"Plausible.Shield.IPRuleCache.html#get/2"},{"type":"function","title":"Plausible.Shield.IPRuleCache.hit_rate/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#hit_rate/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.merge_items/2","doc":"","ref":"Plausible.Shield.IPRuleCache.html#merge_items/2"},{"type":"function","title":"Plausible.Shield.IPRuleCache.ready?/1","doc":"Ensures the cache has non-zero size unless no items exist.\nUseful for orchestrating app startup to prevent the service\ngoing up asynchronously with an empty cache.","ref":"Plausible.Shield.IPRuleCache.html#ready?/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.refresh_all/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#refresh_all/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.refresh_updated_recently/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.size/1","doc":"","ref":"Plausible.Shield.IPRuleCache.html#size/1"},{"type":"function","title":"Plausible.Shield.IPRuleCache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Shield.IPRuleCache.html#telemetry_event_refresh/2"},{"type":"module","title":"Plausible.Shields","doc":"Contextual interface for shields.","ref":"Plausible.Shields.html"},{"type":"function","title":"Plausible.Shields.add_country_rule/3","doc":"","ref":"Plausible.Shields.html#add_country_rule/3"},{"type":"function","title":"Plausible.Shields.add_ip_rule/3","doc":"","ref":"Plausible.Shields.html#add_ip_rule/3"},{"type":"function","title":"Plausible.Shields.count_country_rules/1","doc":"","ref":"Plausible.Shields.html#count_country_rules/1"},{"type":"function","title":"Plausible.Shields.count_ip_rules/1","doc":"","ref":"Plausible.Shields.html#count_ip_rules/1"},{"type":"function","title":"Plausible.Shields.list_country_rules/1","doc":"","ref":"Plausible.Shields.html#list_country_rules/1"},{"type":"function","title":"Plausible.Shields.list_ip_rules/1","doc":"","ref":"Plausible.Shields.html#list_ip_rules/1"},{"type":"function","title":"Plausible.Shields.maximum_country_rules/0","doc":"","ref":"Plausible.Shields.html#maximum_country_rules/0"},{"type":"function","title":"Plausible.Shields.maximum_ip_rules/0","doc":"","ref":"Plausible.Shields.html#maximum_ip_rules/0"},{"type":"function","title":"Plausible.Shields.remove_country_rule/2","doc":"","ref":"Plausible.Shields.html#remove_country_rule/2"},{"type":"function","title":"Plausible.Shields.remove_ip_rule/2","doc":"","ref":"Plausible.Shields.html#remove_ip_rule/2"},{"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.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_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":"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\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\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.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_items/2","doc":"","ref":"Plausible.Site.Cache.html#merge_items/2"},{"type":"function","title":"Plausible.Site.Cache.ready?/1","doc":"Ensures the cache has non-zero size unless no items 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":"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 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 analytics imports","ref":"Plausible.Site.ImportedData.html"},{"type":"type","title":"Plausible.Site.ImportedData.t/0","doc":"","ref":"Plausible.Site.ImportedData.html#t:t/0"},{"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.clear_stats_start_date!/1","doc":"","ref":"Plausible.Sites.html#clear_stats_start_date!/1"},{"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.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.Sites.html#local_start_date/1"},{"type":"function","title":"Examples - Plausible.Sites.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.Sites.html#local_start_date/1-examples"},{"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\nimported stats and Clickhouse, choosing the earliest start date and saves\nit 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/6","doc":"","ref":"Plausible.Stats.Breakdown.html#breakdown/6"},{"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_for_spike/4","doc":"","ref":"Plausible.Stats.Clickhouse.html#top_sources_for_spike/4"},{"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 overridden 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":"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.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":"A module for parsing filters used in stat queries.","ref":"Plausible.Stats.Filters.html"},{"type":"function","title":"Plausible.Stats.Filters.event_props/0","doc":"","ref":"Plausible.Stats.Filters.html#event_props/0"},{"type":"function","title":"Plausible.Stats.Filters.parse/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.Filters.html#parse/1"},{"type":"function","title":"Examples: - Plausible.Stats.Filters.parse/1","doc":"iex> Filters.parse(\"{\\\"page\\\":\\\"/blog/**\\\"}\")\n %{\"event:page\" => {:matches, \"/blog/**\"}}\n\n iex> Filters.parse(\"visit:browser!=Chrome\")\n %{\"visit:browser\" => {:is_not, \"Chrome\"}}\n\n iex> Filters.parse(nil)\n %{}","ref":"Plausible.Stats.Filters.html#parse/1-examples"},{"type":"function","title":"Plausible.Stats.Filters.visit_props/0","doc":"","ref":"Plausible.Stats.Filters.html#visit_props/0"},{"type":"function","title":"Plausible.Stats.Filters.without_prefix/1","doc":"","ref":"Plausible.Stats.Filters.html#without_prefix/1"},{"type":"module","title":"Plausible.Stats.Filters.Utils","doc":"Contains utility functions shared between `DashboardFilterParser`\nand `StatsAPIFilterParser`.","ref":"Plausible.Stats.Filters.Utils.html"},{"type":"function","title":"Plausible.Stats.Filters.Utils.list_expression?/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#list_expression?/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.parse_member_list/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#parse_member_list/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.remove_escape_chars/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#remove_escape_chars/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.unwrap_goal_value/1","doc":"Does the opposite to `wrap_goal_value`, turning the `{:page, path}`\nand `{:event, name}` tuples into strings. Similarly, when given a\nlist, maps all the list elements into strings with the same logic.","ref":"Plausible.Stats.Filters.Utils.html#unwrap_goal_value/1"},{"type":"function","title":"Examples - Plausible.Stats.Filters.Utils.unwrap_goal_value/1","doc":"iex> Plausible.Stats.Filters.Utils.unwrap_goal_value({:page, \"/register\"})\n \"Visit /register\"\n\n iex> Plausible.Stats.Filters.Utils.unwrap_goal_value({:event, \"Signup\"})\n \"Signup\"\n\n iex> Plausible.Stats.Filters.Utils.unwrap_goal_value([{:event, \"Signup\"}, {:page, \"/register\"}])\n [\"Signup\", \"Visit /register\"]","ref":"Plausible.Stats.Filters.Utils.html#unwrap_goal_value/1-examples"},{"type":"function","title":"Plausible.Stats.Filters.Utils.wildcard_expression?/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#wildcard_expression?/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.wrap_goal_value/1","doc":"Wraps the given goal filter into a tuple where the first element\nrepresents the goal type (i.e. `page` or `event`), and the second\nelement is either the page path or the event name.\n\nGiven a list of goal filter values, wraps all values based on the\nsame logic.","ref":"Plausible.Stats.Filters.Utils.html#wrap_goal_value/1"},{"type":"function","title":"Examples - Plausible.Stats.Filters.Utils.wrap_goal_value/1","doc":"iex> Plausible.Stats.Filters.Utils.wrap_goal_value(\"Visit /register\")\n {:page, \"/register\"}\n\n iex> Plausible.Stats.Filters.Utils.wrap_goal_value(\"Signup\")\n {:event, \"Signup\"}\n\n iex> Plausible.Stats.Filters.Utils.wrap_goal_value([\"Signup\", \"Visit /register\"])\n [{:event, \"Signup\"}, {:page, \"/register\"}]","ref":"Plausible.Stats.Filters.Utils.html#wrap_goal_value/1-examples"},{"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.get_by_key/3","doc":"Returns value of a key (usually property) under `meta.value` array or similar.\n\nThis macro is used for operating on custom properties.\nCallsites should also check whether key exists first in SQL via `has_key` macro.","ref":"Plausible.Stats.Fragments.html#get_by_key/3"},{"type":"macro","title":"Examples - Plausible.Stats.Fragments.get_by_key/3","doc":"`get_by_key(e, :meta, \"some_property_name\")` expands to SQL `meta.value[indexOf(meta.key, \"some_property\")]`","ref":"Plausible.Stats.Fragments.html#get_by_key/3-examples"},{"type":"macro","title":"Plausible.Stats.Fragments.has_key/3","doc":"Returns whether a key (usually property) exists under `meta.key` array or similar.\n\nThis macro is used for operating on custom properties.","ref":"Plausible.Stats.Fragments.html#has_key/3"},{"type":"macro","title":"Examples - Plausible.Stats.Fragments.has_key/3","doc":"`has_key(e, :meta, \"some_property_name\")` expands to SQL `has(meta.key, \"some_property_name\")`","ref":"Plausible.Stats.Fragments.html#has_key/3-examples"},{"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_all_filters_by_prefix/2","doc":"","ref":"Plausible.Stats.Query.html#get_all_filters_by_prefix/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/2","doc":"","ref":"Plausible.Stats.Query.html#trace/2"},{"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.calculate_cr/2","doc":"","ref":"Plausible.Stats.Util.html#calculate_cr/2"},{"type":"function","title":"Plausible.Stats.Util.keep_requested_metrics/2","doc":"Sometimes we need to manually add metrics in order to calculate the value for\nother metrics. E.g:\n\n* `__internal_visits` is fetched when querying bounce rate, visit duration,\n or views_per_visit, as it is needed to calculate these from imported data.\n\n* `visitors` metric might be added manually via `maybe_add_visitors_metric/1`,\n in order to be able to calculate conversion rate.\n\nThis function can be used for stripping those metrics from a breakdown (list),\nor an aggregate (map) result. We do not want to return metrics that we're not\nrequested.","ref":"Plausible.Stats.Util.html#keep_requested_metrics/2"},{"type":"function","title":"Plausible.Stats.Util.maybe_add_visitors_metric/1","doc":"This function adds the `visitors` metric into the list of\ngiven metrics if it's not already there and if there is a\n`conversion_rate` metric in the list.\n\nCurrently, the conversion rate cannot be queried from the\ndatabase with a simple select clause - instead, we need to\nfetch the database result first, and then manually add it\ninto the aggregate map or every entry of thebreakdown list.\n\nIn order for us to be able to calculate it based on the\nresults returned by the database query, the visitors metric\nneeds to be queried.","ref":"Plausible.Stats.Util.html#maybe_add_visitors_metric/1"},{"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.populate_stats/3","doc":"","ref":"Plausible.TestUtils.html#populate_stats/3"},{"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_datetime_in_timezone/2","doc":"","ref":"Plausible.Timezones.html#to_datetime_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.on_trial?/1","doc":"","ref":"Plausible.Users.html#on_trial?/1"},{"type":"function","title":"Plausible.Users.trial_days_left/1","doc":"","ref":"Plausible.Users.html#trial_days_left/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":"function","title":"Plausible.Workers.AcceptTrafficUntil.dry_run/1","doc":"","ref":"Plausible.Workers.AcceptTrafficUntil.html#dry_run/1"},{"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.ImportAnalytics","doc":"Worker for running analytics import jobs.","ref":"Plausible.Workers.ImportAnalytics.html"},{"type":"function","title":"Plausible.Workers.ImportAnalytics.import_complete/1","doc":"","ref":"Plausible.Workers.ImportAnalytics.html#import_complete/1"},{"type":"function","title":"Plausible.Workers.ImportAnalytics.import_fail/1","doc":"","ref":"Plausible.Workers.ImportAnalytics.html#import_fail/1"},{"type":"function","title":"Plausible.Workers.ImportAnalytics.import_fail_transient/1","doc":"","ref":"Plausible.Workers.ImportAnalytics.html#import_fail_transient/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.dynamic_icon/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#dynamic_icon/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.dynamic_icon/1","doc":"* `name` (`:atom`) (required)\n* `outline` (`:boolean`) - Defaults to `true`.\n* `solid` (`:boolean`) - Defaults to `false`.\n* `mini` (`:boolean`) - Defaults to `false`.\n* Global attributes are accepted. Supports all globals plus: `[\"fill\", \"stroke\", \"stroke-width\"]`.","ref":"PlausibleWeb.Components.Generic.html#dynamic_icon/1-attributes"},{"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 `\"\"`.\n* Global attributes are accepted.","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`) - Defaults to `\"#\"`.\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","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.server_info/1","doc":"Returns the address and port that the server is running on","ref":"PlausibleWeb.Endpoint.html#server_info/1"},{"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 `\n<.input name=\"my-input\" errors={[\"oh no!\"]} />","ref":"PlausibleWeb.Live.Components.Form.html#input/1-examples"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.input/1","doc":"* `id` (`:any`) - Defaults to `nil`.\n* `name` (`:any`)\n* `label` (`:string`) - Defaults to `nil`.\n* `value` (`:any`)\n* `type` (`:string`) - Defaults to `\"text\"`.\n* `field` (`Phoenix.HTML.FormField`) - a form field struct retrieved from the form, for example: @form[:email].\n* `errors` (`:list`) - Defaults to `[]`.\n* `checked` (`:boolean`) - the checked flag for checkbox inputs.\n* `prompt` (`:string`) - the prompt for select inputs. Defaults to `nil`.\n* `options` (`:list`) - the options to pass to Phoenix.HTML.Form.options_for_select/2.\n* `multiple` (`:boolean`) - the multiple flag for select inputs. Defaults to `false`.\n* Global attributes are accepted. Supports all globals plus: `[\"accept\", \"autocomplete\", \"capture\", \"cols\", \"disabled\", \"form\", \"list\", \"max\", \"maxlength\", \"min\", \"minlength\", \"multiple\", \"pattern\", \"placeholder\", \"readonly\", \"required\", \"rows\", \"size\", \"step\"]`.","ref":"PlausibleWeb.Live.Components.Form.html#input/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Live.Components.Form.input/1","doc":"* `inner_block`","ref":"PlausibleWeb.Live.Components.Form.html#input/1-slots"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.input_with_clipboard/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#input_with_clipboard/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.input_with_clipboard/1","doc":"* `id` (`:string`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.\n* `name` (`:string`) (required)\n* `label` (`:string`) (required)\n* `value` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Live.Components.Form.html#input_with_clipboard/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.label/1","doc":"Renders a label.","ref":"PlausibleWeb.Live.Components.Form.html#label/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.label/1","doc":"* `for` (`:string`) - Defaults to `nil`.","ref":"PlausibleWeb.Live.Components.Form.html#label/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Live.Components.Form.label/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Live.Components.Form.html#label/1-slots"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.password_input_with_strength/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#password_input_with_strength/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.password_input_with_strength/1","doc":"* `id` (`:any`) - Defaults to `nil`.\n* `label` (`:string`) - Defaults to `nil`.\n* `field` (`Phoenix.HTML.FormField`) (required) - a form field struct retrieved from the form, for example: @form[:password].\n* `strength` (`:any`)\n* Global attributes are accepted. Supports all globals plus: `[\"autocomplete\", \"disabled\", \"form\", \"maxlength\", \"minlength\", \"readonly\", \"required\", \"size\"]`.","ref":"PlausibleWeb.Live.Components.Form.html#password_input_with_strength/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.password_length_hint/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#password_length_hint/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.password_length_hint/1","doc":"* `minimum` (`:integer`) (required)\n* `class` (`:any`)\n* `ok_class` (`:any`)\n* `error_class` (`:any`)\n* `field` (`Phoenix.HTML.FormField`) (required) - a form field struct retrieved from the form, for example: @form[:password].","ref":"PlausibleWeb.Live.Components.Form.html#password_length_hint/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.strength_meter/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#strength_meter/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Form.strength_meter/1","doc":"* `score` (`:integer`) - Defaults to `0`.\n* `warning` (`:string`) - Defaults to `\"\"`.\n* `suggestions` (`:list`) - Defaults to `[]`.","ref":"PlausibleWeb.Live.Components.Form.html#strength_meter/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Form.translate_error/1","doc":"","ref":"PlausibleWeb.Live.Components.Form.html#translate_error/1"},{"type":"module","title":"PlausibleWeb.Live.Components.Modal","doc":"LiveView implementation of modal component.\n\nThis component is a general purpose modal implementation for LiveView\nwith emphasis on keeping nested components largely agnostic of the fact\nthat they are placed in a modal and maintaining good user experience\non connections with high latency.","ref":"PlausibleWeb.Live.Components.Modal.html"},{"type":"module","title":"Usage - PlausibleWeb.Live.Components.Modal","doc":"An example use case for a modal is embedding a form inside\nexisting live view which allows adding new entries of some kind:\n\n```\n<.live_component module={Modal} id=\"some-form-modal\">\n <.live_component\n module={SomeForm}\n id=\"some-form\"\n on_save_form={\n fn entry, socket ->\n send(self(), {:entry_added, entry})\n Modal.close(socket, \"some-form-modal\")\n end\n }\n />\n\n```\n\nThen somewhere in the same live view the modal is rendered in:\n\n```\n<.button x-data x-on:click={Modal.JS.open(\"goals-form-modal\")}>\n + Add Entry\n\n```","ref":"PlausibleWeb.Live.Components.Modal.html#module-usage"},{"type":"module","title":"Explanation - PlausibleWeb.Live.Components.Modal","doc":"The component embedded inside the modal is always rendered when\nthe live view is mounted but is kept hidden until `Modal.JS.open`\nis called on it. On subsequent openings within the same session\nthe contents of the modal are completely remounted. This assures\nthat any stateful components inside the modal are reset to their\ninitial state.\n\n`Modal` exposes two functions for managing window state:\n\n * `Modal.JS.open/1` - to open the modal from the frontend. It's\n important to make sure the element triggering that call is\n wrapped in an Alpine UI component - or is an Alpine component\n itself - adding `x-data` attribute without any value is enough\n to ensure that.\n * `Modal.close/2` - to close the modal from the backend; usually\n done inside wrapped component's `handle_event/2`. The example\n quoted above shows one way to implement this, under that assumption\n that the component exposes a callback, like this:\n\n ```\n defmodule SomeForm do\n use Phoenix.LiveComponent\n\n def update(assigns, socket) do\n # ...\n\n {:ok, assign(socket, :on_save_form, assigns.on_save_form)}\n end\n\n #...\n\n def handle_event(\"save-form\", %{\"form\" => form}, socket) do\n case save_entry(form) do\n {:ok, entry} ->\n {:noreply, socket.assigns.on_save_form(entry, socket)}\n\n # error case handling ...\n end\n end\n end\n ```\n\n Using callback approach has an added benefit of making the\n component more flexible.","ref":"PlausibleWeb.Live.Components.Modal.html#module-explanation"},{"type":"function","title":"PlausibleWeb.Live.Components.Modal.close/2","doc":"","ref":"PlausibleWeb.Live.Components.Modal.html#close/2"},{"type":"function","title":"PlausibleWeb.Live.Components.Modal.render/1","doc":"","ref":"PlausibleWeb.Live.Components.Modal.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Modal.render/1","doc":"* `id` (`:any`) (required)\n* `class` (`:string`) - Defaults to `\"\"`.","ref":"PlausibleWeb.Live.Components.Modal.html#render/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Live.Components.Modal.render/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Live.Components.Modal.html#render/1-slots"},{"type":"module","title":"PlausibleWeb.Live.Components.Pagination","doc":"Pagination components for LiveViews.","ref":"PlausibleWeb.Live.Components.Pagination.html"},{"type":"function","title":"PlausibleWeb.Live.Components.Pagination.pagination/1","doc":"","ref":"PlausibleWeb.Live.Components.Pagination.html#pagination/1"},{"type":"module","title":"PlausibleWeb.Live.Components.Visitors","doc":"Component rendering mini-graph of site's visitors over the last 24 hours.\n\nThe `gradient_defs` component should be rendered once before using `chart`\none or more times.\n\nAccepts input generated via `Plausible.Stats.Clickhouse.last_24h_visitors_hourly_intervals/2`.","ref":"PlausibleWeb.Live.Components.Visitors.html"},{"type":"function","title":"PlausibleWeb.Live.Components.Visitors.chart/1","doc":"","ref":"PlausibleWeb.Live.Components.Visitors.html#chart/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Visitors.chart/1","doc":"* `intervals` (`:list`) (required)\n* `height` (`:integer`) - Defaults to `50`.\n* `tick` (`:integer`) - Defaults to `20`.","ref":"PlausibleWeb.Live.Components.Visitors.html#chart/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Components.Visitors.gradient_defs/1","doc":"","ref":"PlausibleWeb.Live.Components.Visitors.html#gradient_defs/1"},{"type":"module","title":"PlausibleWeb.Live.Flash","doc":"Flash component for LiveViews - works also when embedded within dead views","ref":"PlausibleWeb.Live.Flash.html"},{"type":"function","title":"PlausibleWeb.Live.Flash.clear_flash_button/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#clear_flash_button/1"},{"type":"function","title":"PlausibleWeb.Live.Flash.flash/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#flash/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Flash.flash/1","doc":"* `key` (`:string`) - Defaults to `nil`.\n* `on_close` (`:any`) - Defaults to `\"lv:clear-flash\"`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Live.Flash.html#flash/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Live.Flash.flash/1","doc":"* `icon` (required)\n* `title`\n* `message` (required)","ref":"PlausibleWeb.Live.Flash.html#flash/1-slots"},{"type":"function","title":"PlausibleWeb.Live.Flash.flash_messages/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#flash_messages/1"},{"type":"function","title":"PlausibleWeb.Live.Flash.icon_error/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#icon_error/1"},{"type":"function","title":"PlausibleWeb.Live.Flash.icon_success/1","doc":"","ref":"PlausibleWeb.Live.Flash.html#icon_success/1"},{"type":"function","title":"PlausibleWeb.Live.Flash.put_live_flash/3","doc":"","ref":"PlausibleWeb.Live.Flash.html#put_live_flash/3"},{"type":"module","title":"PlausibleWeb.Live.FunnelSettings","doc":"LiveView allowing listing, creating and deleting funnels.","ref":"PlausibleWeb.Live.FunnelSettings.html"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.handle_event/3","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.handle_info/2","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.mount/3","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.render/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.FunnelSettings.Form","doc":"Phoenix LiveComponent that renders a form used for setting up funnels.\nMakes use of dynamically placed `PlausibleWeb.Live.FunnelSettings.ComboBox` components\nto allow building searchable funnel definitions out of list of goals available.","ref":"PlausibleWeb.Live.FunnelSettings.Form.html"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.add_step_button/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#add_step_button/1"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.evaluation/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#evaluation/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.FunnelSettings.Form.evaluation/1","doc":"* `at` (`:integer`) (required)\n* `result` (`:map`) (required)","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#evaluation/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.handle_event/3","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.handle_info/2","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.mount/3","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.remove_step_button/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#remove_step_button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.FunnelSettings.Form.remove_step_button/1","doc":"* `step_idx` (`:integer`) (required)","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#remove_step_button/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.Form.render/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.Form.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.FunnelSettings.List","doc":"Phoenix LiveComponent module that renders a list of funnels with their names\nand the number of steps they have.\n\nEach funnel is displayed with a delete button, which triggers a confirmation\nmessage before deleting the funnel from the UI. If there are no funnels\nconfigured for the site, a message is displayed indicating so.","ref":"PlausibleWeb.Live.FunnelSettings.List.html"},{"type":"function","title":"PlausibleWeb.Live.FunnelSettings.List.render/1","doc":"","ref":"PlausibleWeb.Live.FunnelSettings.List.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.GoalSettings","doc":"LiveView allowing listing, creating and deleting goals.","ref":"PlausibleWeb.Live.GoalSettings.html"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.handle_event/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.handle_info/2","doc":"","ref":"PlausibleWeb.Live.GoalSettings.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.mount/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.render/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.GoalSettings.Form","doc":"Live view for the goal creation form","ref":"PlausibleWeb.Live.GoalSettings.Form.html"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.custom_event_fields/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#custom_event_fields/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.GoalSettings.Form.custom_event_fields/1","doc":"* `f` (`Phoenix.HTML.Form`)\n* `site` (`Plausible.Site`)\n* `current_user` (`Plausible.Auth.User`)\n* `has_access_to_revenue_goals?` (`:boolean`)\n* Global attributes are accepted.","ref":"PlausibleWeb.Live.GoalSettings.Form.html#custom_event_fields/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.handle_event/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.pageview_fields/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#pageview_fields/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.GoalSettings.Form.pageview_fields/1","doc":"* `f` (`Phoenix.HTML.Form`)\n* `site` (`Plausible.Site`)\n* Global attributes are accepted.","ref":"PlausibleWeb.Live.GoalSettings.Form.html#pageview_fields/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.pageviews_tab/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#pageviews_tab/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.render/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.suggest_page_paths/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#suggest_page_paths/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.tabs/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#tabs/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.update/2","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.GoalSettings.List","doc":"Phoenix LiveComponent module that renders a list of goals","ref":"PlausibleWeb.Live.GoalSettings.List.html"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.List.render/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.List.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.GoalSettings.List.render/1","doc":"* `goals` (`:list`) (required)\n* `domain` (`:string`) (required)\n* `filter_text` (`:string`)\n* `site` (`Plausible.Site`) (required)","ref":"PlausibleWeb.Live.GoalSettings.List.html#render/1-attributes"},{"type":"module","title":"PlausibleWeb.Live.Plugins.API.Settings","doc":"LiveView allowing listing, creating and revoking Plugins API tokens.","ref":"PlausibleWeb.Live.Plugins.API.Settings.html"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.Settings.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Plugins.API.Settings.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.Settings.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Plugins.API.Settings.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.Settings.mount/3","doc":"","ref":"PlausibleWeb.Live.Plugins.API.Settings.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.Settings.render/1","doc":"","ref":"PlausibleWeb.Live.Plugins.API.Settings.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.Plugins.API.TokenForm","doc":"Live view for the goal creation form","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.TokenForm.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.TokenForm.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.TokenForm.mount/3","doc":"","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Plugins.API.TokenForm.render/1","doc":"","ref":"PlausibleWeb.Live.Plugins.API.TokenForm.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.PropsSettings","doc":"LiveView allowing listing, allowing and disallowing custom event properties.","ref":"PlausibleWeb.Live.PropsSettings.html"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.handle_event/3","doc":"","ref":"PlausibleWeb.Live.PropsSettings.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.handle_info/2","doc":"","ref":"PlausibleWeb.Live.PropsSettings.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.mount/3","doc":"","ref":"PlausibleWeb.Live.PropsSettings.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.render/1","doc":"","ref":"PlausibleWeb.Live.PropsSettings.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.PropsSettings.Form","doc":"Live view for the custom props creation form","ref":"PlausibleWeb.Live.PropsSettings.Form.html"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.Form.handle_event/3","doc":"","ref":"PlausibleWeb.Live.PropsSettings.Form.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.Form.handle_info/2","doc":"","ref":"PlausibleWeb.Live.PropsSettings.Form.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.Form.mount/3","doc":"","ref":"PlausibleWeb.Live.PropsSettings.Form.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.Form.render/1","doc":"","ref":"PlausibleWeb.Live.PropsSettings.Form.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.PropsSettings.List","doc":"Phoenix LiveComponent module that renders a list of custom properties","ref":"PlausibleWeb.Live.PropsSettings.List.html"},{"type":"function","title":"PlausibleWeb.Live.PropsSettings.List.render/1","doc":"","ref":"PlausibleWeb.Live.PropsSettings.List.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.PropsSettings.List.render/1","doc":"* `props` (`:list`) (required)\n* `domain` (`:string`) (required)\n* `filter_text` (`:string`)","ref":"PlausibleWeb.Live.PropsSettings.List.html#render/1-attributes"},{"type":"module","title":"PlausibleWeb.Live.RegisterForm","doc":"LiveView for registration form.","ref":"PlausibleWeb.Live.RegisterForm.html"},{"type":"function","title":"PlausibleWeb.Live.RegisterForm.handle_event/3","doc":"","ref":"PlausibleWeb.Live.RegisterForm.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.RegisterForm.handle_info/2","doc":"","ref":"PlausibleWeb.Live.RegisterForm.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.RegisterForm.mount/3","doc":"","ref":"PlausibleWeb.Live.RegisterForm.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.RegisterForm.render/1","doc":"","ref":"PlausibleWeb.Live.RegisterForm.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.ResetPasswordForm","doc":"LiveView for password reset form.","ref":"PlausibleWeb.Live.ResetPasswordForm.html"},{"type":"function","title":"PlausibleWeb.Live.ResetPasswordForm.handle_event/3","doc":"","ref":"PlausibleWeb.Live.ResetPasswordForm.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.ResetPasswordForm.handle_info/2","doc":"","ref":"PlausibleWeb.Live.ResetPasswordForm.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.ResetPasswordForm.mount/3","doc":"","ref":"PlausibleWeb.Live.ResetPasswordForm.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.ResetPasswordForm.render/1","doc":"","ref":"PlausibleWeb.Live.ResetPasswordForm.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.SentryContext","doc":"This module tries to supply LiveViews with some common Sentry context\n(without it, there is practically none).\n\nUse via `use PlausibleWeb.Live.SentryContext` in your LiveView module,\nor preferably via `use PlausibleWeb, :live_view`.\n\nIn case you have multiple LiveViews, there is `use PlausibleWeb, live_view: :no_sentry_context`\nexposed that allows you to skip using this module. This is because\nonly the root LiveView has access to `connect_info` and an exception will be\nthrown otherwise.","ref":"PlausibleWeb.Live.SentryContext.html"},{"type":"function","title":"PlausibleWeb.Live.SentryContext.on_mount/4","doc":"","ref":"PlausibleWeb.Live.SentryContext.html#on_mount/4"},{"type":"module","title":"PlausibleWeb.Live.Shields.Countries","doc":"LiveView for IP Addresses Shield","ref":"PlausibleWeb.Live.Shields.Countries.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.Countries.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Shields.Countries.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.Countries.mount/3","doc":"","ref":"PlausibleWeb.Live.Shields.Countries.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.Countries.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.Countries.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.Shields.CountryRules","doc":"LiveView allowing Country Rules management","ref":"PlausibleWeb.Live.Shields.CountryRules.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.CountryRules.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Shields.CountryRules.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.CountryRules.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.CountryRules.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Shields.CountryRules.send_flash/2","doc":"","ref":"PlausibleWeb.Live.Shields.CountryRules.html#send_flash/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.CountryRules.update/2","doc":"","ref":"PlausibleWeb.Live.Shields.CountryRules.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.Shields.IPAddresses","doc":"LiveView for IP Addresses Shield","ref":"PlausibleWeb.Live.Shields.IPAddresses.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPAddresses.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Shields.IPAddresses.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPAddresses.mount/3","doc":"","ref":"PlausibleWeb.Live.Shields.IPAddresses.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPAddresses.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.IPAddresses.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.Shields.IPRules","doc":"LiveView allowing IP Rules management","ref":"PlausibleWeb.Live.Shields.IPRules.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPRules.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Shields.IPRules.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPRules.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.IPRules.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPRules.send_flash/2","doc":"","ref":"PlausibleWeb.Live.Shields.IPRules.html#send_flash/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.IPRules.update/2","doc":"","ref":"PlausibleWeb.Live.Shields.IPRules.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.Sites","doc":"LiveView for sites index.","ref":"PlausibleWeb.Live.Sites.html"},{"type":"function","title":"PlausibleWeb.Live.Sites.ellipsis_menu/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#ellipsis_menu/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.favicon/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#favicon/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Sites.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Sites.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Sites.handle_params/3","doc":"","ref":"PlausibleWeb.Live.Sites.html#handle_params/3"},{"type":"function","title":"PlausibleWeb.Live.Sites.icon_pin/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#icon_pin/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.icon_pin/1","doc":"* Global attributes are accepted.","ref":"PlausibleWeb.Live.Sites.html#icon_pin/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.invitation/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#invitation/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.invitation/1","doc":"* `site` (`Plausible.Site`) (required)\n* `invitation` (`Plausible.Auth.Invitation`) (required)\n* `hourly_stats` (`:map`) (required)","ref":"PlausibleWeb.Live.Sites.html#invitation/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.invitation_modal/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#invitation_modal/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.invitation_modal/1","doc":"* `user` (`Plausible.Auth.User`) (required)","ref":"PlausibleWeb.Live.Sites.html#invitation_modal/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.mount/3","doc":"","ref":"PlausibleWeb.Live.Sites.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Sites.percentage_change/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#percentage_change/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.percentage_change/1","doc":"* `change` (`:integer`) (required)","ref":"PlausibleWeb.Live.Sites.html#percentage_change/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.render/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.search_form/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#search_form/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.search_form/1","doc":"* `filter_text` (`:string`) - Defaults to `\"\"`.\n* `uri` (`URI`) (required)","ref":"PlausibleWeb.Live.Sites.html#search_form/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.site/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#site/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.site/1","doc":"* `site` (`Plausible.Site`) (required)\n* `hourly_stats` (`:map`) (required)","ref":"PlausibleWeb.Live.Sites.html#site/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.site_stats/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#site_stats/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Sites.site_stats/1","doc":"* `hourly_stats` (`:map`) (required)","ref":"PlausibleWeb.Live.Sites.html#site_stats/1-attributes"},{"type":"function","title":"PlausibleWeb.Live.Sites.upgrade_nag_screen/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#upgrade_nag_screen/1"},{"type":"module","title":"PlausibleWeb.MJML.StatsReport","doc":"MJML rendered for the weekly or monthly report e-mail","ref":"PlausibleWeb.MJML.StatsReport.html"},{"type":"function","title":"PlausibleWeb.MJML.StatsReport.debug_mjml_template/0","doc":"Returns the raw MJML template. Useful for debugging rendering issues.","ref":"PlausibleWeb.MJML.StatsReport.html#debug_mjml_template/0"},{"type":"function","title":"PlausibleWeb.MJML.StatsReport.render/1","doc":"Safely render the MJML template using Phoenix.HTML","ref":"PlausibleWeb.MJML.StatsReport.html#render/1"},{"type":"module","title":"PlausibleWeb.PageController","doc":"","ref":"PlausibleWeb.PageController.html"},{"type":"function","title":"PlausibleWeb.PageController.index/2","doc":"The root path is never accessible in Plausible.Cloud because it is handled by the upstream reverse proxy.\n\nThis controller action is only ever triggered in self-hosted Plausible.","ref":"PlausibleWeb.PageController.html#index/2"},{"type":"module","title":"PlausibleWeb.PageView","doc":"","ref":"PlausibleWeb.PageView.html"},{"type":"function","title":"PlausibleWeb.PageView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.PageView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.PageView.index.html/1","doc":"","ref":"PlausibleWeb.PageView.html#index.html/1"},{"type":"function","title":"PlausibleWeb.PageView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.PageView.html#render/2"},{"type":"function","title":"PlausibleWeb.PageView.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.PageView.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities","doc":"Controller for Plugins API Capabilities - doesn't enforce authentication,\nserves as a comprehensive health check","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities.index/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html#index/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Capabilities.html#shared_tags/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps","doc":"Controller for the CustomProp resource under Plugins API","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.disable/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#disable/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.enable/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#enable/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.CustomProps.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.CustomProps.html#shared_tags/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Controllers.Goals","doc":"Controller for the Goal resource under Plugins API","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.create/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#create/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.delete/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#delete/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.delete_bulk/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#delete_bulk/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.get/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#get/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.index/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#index/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Goals.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Goals.html#shared_tags/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks","doc":"Controller for the Shared Link resource under Plugins API","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.create/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#create/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.get/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#get/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.index/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#index/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.SharedLinks.html#shared_tags/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Errors","doc":"Common responses for Plugins API","ref":"PlausibleWeb.Plugins.API.Errors.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Errors.error/3","doc":"","ref":"PlausibleWeb.Plugins.API.Errors.html#error/3"},{"type":"function","title":"PlausibleWeb.Plugins.API.Errors.unauthorized/1","doc":"","ref":"PlausibleWeb.Plugins.API.Errors.html#unauthorized/1"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Capabilities","doc":"OpenAPI schema for Capabilities","ref":"PlausibleWeb.Plugins.API.Schemas.Capabilities.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Capabilities.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Capabilities.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Capabilities.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Capabilities.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp","doc":"OpenAPI schema for Goal","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest","doc":"OpenAPI schema for Custom Property disable request","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.DisableRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest","doc":"OpenAPI schema for Custom Property creation request","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.EnableRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse","doc":"OpenAPI schema for SharedLink list response","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.CustomProp.ListResponse.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Error","doc":"OpenAPI schema for an error included in a response","ref":"PlausibleWeb.Plugins.API.Schemas.Error.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Error.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Error.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Error.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Error.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal","doc":"OpenAPI schema for Goal","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest","doc":"OpenAPI schema for Goal creation request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent","doc":"OpenAPI schema for Custom Event Goal creation request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.CustomEvent.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview","doc":"OpenAPI schema for Pageview Goal creation request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Pageview.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue","doc":"OpenAPI schema for Custom Event Goal creation request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CreateRequest.Revenue.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent","doc":"OpenAPI schema for Custom Event Goal object","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.CustomEvent.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest","doc":"OpenAPI schema for bulk Goal deletion request","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.DeleteBulkRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse","doc":"OpenAPI schema for Goals list response","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.ListResponse.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview","doc":"OpenAPI schema for Pageview Goal object","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Pageview.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue","doc":"OpenAPI schema for Revenue Goal object","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Revenue.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Type","doc":"OpenAPI schema for common Goal Type\n\nFuture-proof: funnels etc.","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Goal.Type.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Link","doc":"OpenAPI Link schema","ref":"PlausibleWeb.Plugins.API.Schemas.Link.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Link.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Link.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Link.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Link.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.NotFound","doc":"OpenAPI schema for a generic 404 response","ref":"PlausibleWeb.Plugins.API.Schemas.NotFound.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.NotFound.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.NotFound.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.NotFound.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.NotFound.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata","doc":"Pagination metadata OpenAPI schema","ref":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.PaginationMetadata.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired","doc":"OpenAPI schema for a generic 402 response","ref":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.PaymentRequired.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink","doc":"OpenAPI schema for SharedLink object","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest","doc":"OpenAPI schema for SharedLink creation request","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.CreateRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse","doc":"OpenAPI schema for SharedLink list response","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.SharedLink.ListResponse.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Unauthorized","doc":"OpenAPI schema for a generic 401 response","ref":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Unauthorized.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity","doc":"OpenAPI schema for a generic 422 response","ref":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.UnprocessableEntity.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Spec","doc":"OpenAPI specification for the Plugins API","ref":"PlausibleWeb.Plugins.API.Spec.html"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.Capabilities","doc":"View for rendering Capabilities on the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.Capabilities.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Capabilities.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Capabilities.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Capabilities.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Capabilities.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Capabilities.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.Plugins.API.Views.Capabilities.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.CustomProp","doc":"View for rendering Custom Props in the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.CustomProp.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.CustomProp.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.CustomProp.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.CustomProp.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.CustomProp.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.CustomProp.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.Plugins.API.Views.CustomProp.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.Error","doc":"View for rendering Plugins REST API errors","ref":"PlausibleWeb.Plugins.API.Views.Error.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Error.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Error.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Error.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Error.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Error.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.Plugins.API.Views.Error.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.Goal","doc":"View for rendering Goals in the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.Goal.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Goal.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Goal.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Goal.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Goal.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Goal.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.Plugins.API.Views.Goal.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.Pagination","doc":"A view capable of rendering pagination metadata included\nin responses containing lists of objects.","ref":"PlausibleWeb.Plugins.API.Views.Pagination.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Pagination.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Pagination.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Pagination.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Pagination.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Pagination.render_metadata_links/4","doc":"","ref":"PlausibleWeb.Plugins.API.Views.Pagination.html#render_metadata_links/4"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Pagination.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.Plugins.API.Views.Pagination.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.Plugins.API.Views.SharedLink","doc":"View for rendering Shared Links in the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.SharedLink.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.SharedLink.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.SharedLink.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.SharedLink.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.SharedLink.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.SharedLink.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.Plugins.API.Views.SharedLink.html#template_not_found/2"},{"type":"module","title":"PlausibleWeb.PluginsAPICase","doc":"This module defines the test case to be used by\ntests that require setting up a Plugins API connection.","ref":"PlausibleWeb.PluginsAPICase.html"},{"type":"module","title":"PlausibleWeb.Plugs.AuthorizePluginsAPI","doc":"Plug for Basic HTTP Authentication using\nPlugins API Tokens lookup.","ref":"PlausibleWeb.Plugs.AuthorizePluginsAPI.html"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizePluginsAPI.call/2","doc":"","ref":"PlausibleWeb.Plugs.AuthorizePluginsAPI.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizePluginsAPI.init/1","doc":"","ref":"PlausibleWeb.Plugs.AuthorizePluginsAPI.html#init/1"},{"type":"module","title":"PlausibleWeb.Plugs.ErrorHandler","doc":"A thin macro wrapper around Plug.ErrorHandler that adds Sentry context\n containing a readable support hash presented to the users.\n To be used in the user-facing APIs, so that we don't leak internal\n server errors.\n\n Usage: `use PlausibleWeb.Plugs.ErrorHandler`","ref":"PlausibleWeb.Plugs.ErrorHandler.html"},{"type":"module","title":"PlausibleWeb.Plugs.MaybeDisableRegistration","doc":"Plug toggling registration according to selfhosted state.","ref":"PlausibleWeb.Plugs.MaybeDisableRegistration.html"},{"type":"function","title":"PlausibleWeb.Plugs.MaybeDisableRegistration.call/2","doc":"","ref":"PlausibleWeb.Plugs.MaybeDisableRegistration.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.MaybeDisableRegistration.init/1","doc":"","ref":"PlausibleWeb.Plugs.MaybeDisableRegistration.html#init/1"},{"type":"module","title":"PlausibleWeb.Plugs.NoRobots","doc":"Rejects bot requests by any means available.\n\nWe're adding `x-robots-tag` to the response header and annotate the conn\nwith \"noindex, nofollow\" under `private.robots` key.\n\nThe only exception is, if the request is trying to access our live demo\nat plausible.io/plausible.io - in which case we'll allow indexing, but deny\nfollowing links and skip the bot detection, in kind robots we trust.","ref":"PlausibleWeb.Plugs.NoRobots.html"},{"type":"module","title":"PlausibleWeb.RefInspector","doc":"","ref":"PlausibleWeb.RefInspector.html"},{"type":"function","title":"PlausibleWeb.RefInspector.parse/1","doc":"","ref":"PlausibleWeb.RefInspector.html#parse/1"},{"type":"function","title":"PlausibleWeb.RefInspector.right_uri?/1","doc":"","ref":"PlausibleWeb.RefInspector.html#right_uri?/1"},{"type":"module","title":"PlausibleWeb.RemoteIP","doc":"Implements the strategy of retrieving client's remote IP","ref":"PlausibleWeb.RemoteIP.html"},{"type":"function","title":"PlausibleWeb.RemoteIP.get/1","doc":"","ref":"PlausibleWeb.RemoteIP.html#get/1"},{"type":"module","title":"PlausibleWeb.RequireAccountPlug","doc":"","ref":"PlausibleWeb.RequireAccountPlug.html"},{"type":"function","title":"PlausibleWeb.RequireAccountPlug.call/2","doc":"","ref":"PlausibleWeb.RequireAccountPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.RequireAccountPlug.init/1","doc":"","ref":"PlausibleWeb.RequireAccountPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.RequireLoggedOutPlug","doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html"},{"type":"function","title":"PlausibleWeb.RequireLoggedOutPlug.call/2","doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.RequireLoggedOutPlug.init/1","doc":"","ref":"PlausibleWeb.RequireLoggedOutPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.Router","doc":"","ref":"PlausibleWeb.Router.html"},{"type":"function","title":"PlausibleWeb.Router.api/2","doc":"","ref":"PlausibleWeb.Router.html#api/2"},{"type":"function","title":"PlausibleWeb.Router.app_layout/2","doc":"","ref":"PlausibleWeb.Router.html#app_layout/2"},{"type":"function","title":"PlausibleWeb.Router.browser/2","doc":"","ref":"PlausibleWeb.Router.html#browser/2"},{"type":"function","title":"PlausibleWeb.Router.call/2","doc":"Callback invoked by Plug on every request.","ref":"PlausibleWeb.Router.html#call/2"},{"type":"function","title":"PlausibleWeb.Router.csrf/2","doc":"","ref":"PlausibleWeb.Router.html#csrf/2"},{"type":"function","title":"PlausibleWeb.Router.flags/2","doc":"","ref":"PlausibleWeb.Router.html#flags/2"},{"type":"function","title":"PlausibleWeb.Router.focus_layout/2","doc":"","ref":"PlausibleWeb.Router.html#focus_layout/2"},{"type":"function","title":"PlausibleWeb.Router.init/1","doc":"Callback required by Plug that initializes the router\nfor serving web requests.","ref":"PlausibleWeb.Router.html#init/1"},{"type":"function","title":"PlausibleWeb.Router.internal_stats_api/2","doc":"","ref":"PlausibleWeb.Router.html#internal_stats_api/2"},{"type":"function","title":"PlausibleWeb.Router.kaffy_browser/2","doc":"","ref":"PlausibleWeb.Router.html#kaffy_browser/2"},{"type":"function","title":"PlausibleWeb.Router.plugins_api/2","doc":"","ref":"PlausibleWeb.Router.html#plugins_api/2"},{"type":"function","title":"PlausibleWeb.Router.plugins_api_auth/2","doc":"","ref":"PlausibleWeb.Router.html#plugins_api_auth/2"},{"type":"function","title":"PlausibleWeb.Router.public_api/2","doc":"","ref":"PlausibleWeb.Router.html#public_api/2"},{"type":"function","title":"PlausibleWeb.Router.shared_link/2","doc":"","ref":"PlausibleWeb.Router.html#shared_link/2"},{"type":"module","title":"PlausibleWeb.SessionTimeoutPlug","doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html"},{"type":"function","title":"PlausibleWeb.SessionTimeoutPlug.call/2","doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html#call/2"},{"type":"function","title":"PlausibleWeb.SessionTimeoutPlug.init/1","doc":"","ref":"PlausibleWeb.SessionTimeoutPlug.html#init/1"},{"type":"module","title":"PlausibleWeb.Site.MembershipController","doc":"This controller deals with user management via the UI in Site Settings -> 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_shields/2","doc":"","ref":"PlausibleWeb.SiteController.html#settings_shields/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_shields.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#settings_shields.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 Plausible Community Edition or have us manage Plausible Analytics 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 12,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 Analytics 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 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 and self-hosted solution called [Plausible Community Edition (CE)](https://plausible.io/self-hosted-web-analytics). Here are the differences between Plausible Analytics managed hosting in the cloud and the Plausible CE:\n\n| | Plausible Analytics Cloud | Plausible Community Edition |\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](https://plausible.io/blog/community-edition).|\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. CE 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 CE on your server? Take a look at our [Plausible CE installation instructions](https://github.com/plausible/community-edition/).\n\nPlausible CE 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.","ref":"readme.html#can-plausible-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 CE 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"}],"content_type":"text/markdown"} \ No newline at end of file diff --git a/dist/sidebar_items-65293FE3.js b/dist/sidebar_items-65293FE3.js new file mode 100644 index 0000000000..9f173654ab --- /dev/null +++ b/dist/sidebar_items-65293FE3.js @@ -0,0 +1 @@ +sidebarNodes={"modules":[{"id":"ObanErrorReporter","deprecated":false,"group":"","title":"ObanErrorReporter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","deprecated":false,"title":"handle_event(name, measurements, metadata, _)","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/1","deprecated":false,"title":"start_changeset(user)","anchor":"start_changeset/1"},{"id":"start_manual_lock_changeset/1","deprecated":false,"title":"start_manual_lock_changeset(user)","anchor":"start_manual_lock_changeset/1"}],"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":"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_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"}],"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"},{"id":"list_short_names/0","deprecated":false,"title":"list_short_names()","anchor":"list_short_names/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":"pageview_allowance_margin/0","deprecated":false,"title":"pageview_allowance_margin()","anchor":"pageview_allowance_margin/0"},{"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/2","deprecated":false,"title":"team_member_usage(user, opts \\\\ [])","anchor":"team_member_usage/2"},{"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.Cache","deprecated":false,"group":"","title":"Plausible.Cache","sections":[],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"base_db_query/0","deprecated":false,"title":"base_db_query()","anchor":"c:base_db_query/0"},{"id":"child_id/0","deprecated":false,"title":"child_id()","anchor":"c:child_id/0"},{"id":"count_all/0","deprecated":false,"title":"count_all()","anchor":"c:count_all/0"},{"id":"get_from_source/1","deprecated":false,"title":"get_from_source(any)","anchor":"c:get_from_source/1"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"c:name/0"},{"id":"unwrap_cache_keys/1","deprecated":false,"title":"unwrap_cache_keys(list)","anchor":"c:unwrap_cache_keys/1"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"}],"key":"functions"}]},{"id":"Plausible.Cache.Warmer","deprecated":false,"group":"","title":"Plausible.Cache.Warmer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"}],"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_gettext_locale/1","deprecated":false,"title":"put_gettext_locale(locale)","anchor":"put_gettext_locale/1"},{"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.DataMigration.VersionedSessions","deprecated":false,"group":"","title":"Plausible.DataMigration.VersionedSessions","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.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":"country_rule_factory/0","deprecated":false,"title":"country_rule_factory()","anchor":"country_rule_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":"ip_rule_factory/0","deprecated":false,"title":"ip_rule_factory()","anchor":"ip_rule_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_import_factory/0","deprecated":false,"title":"site_import_factory()","anchor":"site_import_factory/0"},{"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/2","deprecated":false,"title":"fetch_and_persist(report_request, opts \\\\ [])","anchor":"fetch_and_persist/2"},{"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(date_range, view_id, auth, persist_fn)","anchor":"import_analytics/4"},{"id":"import_authorize_url/3","deprecated":false,"title":"import_authorize_url(site_id, redirect_to, legacy \\\\ true)","anchor":"import_authorize_url/3"},{"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.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":"delete_imports_for_site/1","deprecated":false,"title":"delete_imports_for_site(site)","anchor":"delete_imports_for_site/1"},{"id":"get_earliest_import/1","deprecated":false,"title":"get_earliest_import(site)","anchor":"get_earliest_import/1"},{"id":"get_import/1","deprecated":false,"title":"get_import(import_id)","anchor":"get_import/1"},{"id":"list_all_imports/1","deprecated":false,"title":"list_all_imports(site)","anchor":"list_all_imports/1"},{"id":"list_complete_import_ids/1","deprecated":false,"title":"list_complete_import_ids(site)","anchor":"list_complete_import_ids/1"},{"id":"listen/0","deprecated":false,"title":"listen()","anchor":"listen/0"},{"id":"load_import_data/1","deprecated":false,"title":"load_import_data(site)","anchor":"load_import_data/1"},{"id":"max_complete_imports/0","deprecated":false,"title":"max_complete_imports()","anchor":"max_complete_imports/0"},{"id":"tables/0","deprecated":false,"title":"tables()","anchor":"tables/0"}],"key":"functions"}]},{"id":"Plausible.Imported.Buffer","deprecated":false,"group":"","title":"Plausible.Imported.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.Imported.CSVImporter","deprecated":false,"group":"","title":"Plausible.Imported.CSVImporter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"new_import/3","deprecated":false,"title":"new_import(site, user, opts)","anchor":"new_import/3"}],"key":"functions"}]},{"id":"Plausible.Imported.ImportSources","deprecated":false,"group":"","title":"Plausible.Imported.ImportSources","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"by_name/1","deprecated":false,"title":"by_name(name)","anchor":"by_name/1"},{"id":"names/0","deprecated":false,"title":"names()","anchor":"names/0"}],"key":"functions"}]},{"id":"Plausible.Imported.Importer","deprecated":false,"group":"","title":"Plausible.Imported.Importer","sections":[{"id":"Running import fully synchronously","anchor":"module-running-import-fully-synchronously"}],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"before_start/1","deprecated":false,"title":"before_start(t)","anchor":"c:before_start/1"},{"id":"email_template/0","deprecated":false,"title":"email_template()","anchor":"c:email_template/0"},{"id":"import_data/2","deprecated":false,"title":"import_data(t, t)","anchor":"c:import_data/2"},{"id":"label/0","deprecated":false,"title":"label()","anchor":"c:label/0"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"c:name/0"},{"id":"on_failure/1","deprecated":false,"title":"on_failure(t)","anchor":"c:on_failure/1"},{"id":"on_success/2","deprecated":false,"title":"on_success(t, map)","anchor":"c:on_success/2"},{"id":"parse_args/1","deprecated":false,"title":"parse_args(map)","anchor":"c:parse_args/1"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"listen/0","deprecated":false,"title":"listen()","anchor":"listen/0"}],"key":"functions"}]},{"id":"Plausible.Imported.NoopImporter","deprecated":false,"group":"","title":"Plausible.Imported.NoopImporter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"new_import/3","deprecated":false,"title":"new_import(site, user, opts)","anchor":"new_import/3"}],"key":"functions"}]},{"id":"Plausible.Imported.SiteImport","deprecated":false,"group":"","title":"Plausible.Imported.SiteImport","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"complete_changeset/2","deprecated":false,"title":"complete_changeset(site_import, params \\\\ %{})","anchor":"complete_changeset/2"},{"id":"completed/0","deprecated":false,"title":"completed()","anchor":"completed/0"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(site, user, params)","anchor":"create_changeset/3"},{"id":"fail_changeset/1","deprecated":false,"title":"fail_changeset(site_import)","anchor":"fail_changeset/1"},{"id":"failed/0","deprecated":false,"title":"failed()","anchor":"failed/0"},{"id":"from_legacy/1","deprecated":false,"title":"from_legacy(data)","anchor":"from_legacy/1"},{"id":"importing/0","deprecated":false,"title":"importing()","anchor":"importing/0"},{"id":"label/1","deprecated":false,"title":"label(arg1)","anchor":"label/1"},{"id":"pending/0","deprecated":false,"title":"pending()","anchor":"pending/0"},{"id":"start_changeset/1","deprecated":false,"title":"start_changeset(site_import)","anchor":"start_changeset/1"}],"key":"functions"}]},{"id":"Plausible.Imported.UniversalAnalytics","deprecated":false,"group":"","title":"Plausible.Imported.UniversalAnalytics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"from_report/4","deprecated":false,"title":"from_report(data, site_id, import_id, table)","anchor":"from_report/4"},{"id":"import_data/2","deprecated":false,"title":"import_data(site_import, opts)","anchor":"import_data/2"},{"id":"new_import/3","deprecated":false,"title":"new_import(site, user, opts)","anchor":"new_import/3"}],"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.License","deprecated":false,"group":"","title":"Plausible.License","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ensure_valid_license/0","deprecated":false,"title":"ensure_valid_license()","anchor":"ensure_valid_license/0"}],"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.MigrationUtils","deprecated":false,"group":"","title":"Plausible.MigrationUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clustered_table?/1","deprecated":false,"title":"clustered_table?(table)","anchor":"clustered_table?/1"},{"id":"on_cluster_statement/1","deprecated":false,"title":"on_cluster_statement(table)","anchor":"on_cluster_statement/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.Capabilities","deprecated":false,"group":"","title":"Plausible.Plugins.API.Capabilities","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/1","deprecated":false,"title":"get(conn)","anchor":"get/1"}],"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":"allowed_for/2","deprecated":false,"title":"allowed_for(site, opts \\\\ [])","anchor":"allowed_for/2"},{"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_imported_stats!/2","deprecated":false,"title":"delete_imported_stats!(site, import_id)","anchor":"delete_imported_stats!/2"},{"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.S3","deprecated":false,"group":"","title":"Plausible.S3","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import_clickhouse_credentials/0","deprecated":false,"title":"import_clickhouse_credentials()","anchor":"import_clickhouse_credentials/0"}],"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.Shield.CountryRule","deprecated":false,"group":"","title":"Plausible.Shield.CountryRule","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(rule, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Shield.CountryRuleCache","deprecated":false,"group":"","title":"Plausible.Shield.CountryRuleCache","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"get/2","deprecated":false,"title":"get(key, opts \\\\ [])","anchor":"get/2"},{"id":"hit_rate/1","deprecated":false,"title":"hit_rate(cache_name \\\\ name())","anchor":"hit_rate/1"},{"id":"merge_items/2","deprecated":false,"title":"merge_items(new_items, opts \\\\ [])","anchor":"merge_items/2"},{"id":"ready?/1","deprecated":false,"title":"ready?(cache_name \\\\ name())","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 \\\\ name())","anchor":"size/1"},{"id":"telemetry_event_refresh/2","deprecated":false,"title":"telemetry_event_refresh(cache_name \\\\ name(), mode)","anchor":"telemetry_event_refresh/2"}],"key":"functions"}]},{"id":"Plausible.Shield.IPRule","deprecated":false,"group":"","title":"Plausible.Shield.IPRule","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(rule, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Shield.IPRuleCache","deprecated":false,"group":"","title":"Plausible.Shield.IPRuleCache","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"get/2","deprecated":false,"title":"get(key, opts \\\\ [])","anchor":"get/2"},{"id":"hit_rate/1","deprecated":false,"title":"hit_rate(cache_name \\\\ name())","anchor":"hit_rate/1"},{"id":"merge_items/2","deprecated":false,"title":"merge_items(new_items, opts \\\\ [])","anchor":"merge_items/2"},{"id":"ready?/1","deprecated":false,"title":"ready?(cache_name \\\\ name())","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 \\\\ name())","anchor":"size/1"},{"id":"telemetry_event_refresh/2","deprecated":false,"title":"telemetry_event_refresh(cache_name \\\\ name(), mode)","anchor":"telemetry_event_refresh/2"}],"key":"functions"}]},{"id":"Plausible.Shields","deprecated":false,"group":"","title":"Plausible.Shields","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_country_rule/3","deprecated":false,"title":"add_country_rule(site_or_id, params, opts \\\\ [])","anchor":"add_country_rule/3"},{"id":"add_ip_rule/3","deprecated":false,"title":"add_ip_rule(site_or_id, params, opts \\\\ [])","anchor":"add_ip_rule/3"},{"id":"count_country_rules/1","deprecated":false,"title":"count_country_rules(site_or_id)","anchor":"count_country_rules/1"},{"id":"count_ip_rules/1","deprecated":false,"title":"count_ip_rules(site_or_id)","anchor":"count_ip_rules/1"},{"id":"list_country_rules/1","deprecated":false,"title":"list_country_rules(site_or_id)","anchor":"list_country_rules/1"},{"id":"list_ip_rules/1","deprecated":false,"title":"list_ip_rules(site_or_id)","anchor":"list_ip_rules/1"},{"id":"maximum_country_rules/0","deprecated":false,"title":"maximum_country_rules()","anchor":"maximum_country_rules/0"},{"id":"maximum_ip_rules/0","deprecated":false,"title":"maximum_ip_rules()","anchor":"maximum_ip_rules/0"},{"id":"remove_country_rule/2","deprecated":false,"title":"remove_country_rule(site_or_id, rule_id)","anchor":"remove_country_rule/2"},{"id":"remove_ip_rule/2","deprecated":false,"title":"remove_ip_rule(site_or_id, rule_id)","anchor":"remove_ip_rule/2"}],"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":"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_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":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"get/2","deprecated":false,"title":"get(key, 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 \\\\ name())","anchor":"hit_rate/1"},{"id":"merge_items/2","deprecated":false,"title":"merge_items(new_items, opts \\\\ [])","anchor":"merge_items/2"},{"id":"ready?/1","deprecated":false,"title":"ready?(cache_name \\\\ name())","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 \\\\ name())","anchor":"size/1"},{"id":"telemetry_event_refresh/2","deprecated":false,"title":"telemetry_event_refresh(cache_name \\\\ name(), 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.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":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"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":"clear_stats_start_date!/1","deprecated":false,"title":"clear_stats_start_date!(site)","anchor":"clear_stats_start_date!/1"},{"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":"local_start_date/1","deprecated":false,"title":"local_start_date(site)","anchor":"local_start_date/1"},{"id":"locked?/1","deprecated":false,"title":"locked?(site)","anchor":"locked?/1"},{"id":"native_stats_start_date/1","deprecated":false,"title":"native_stats_start_date(site)","anchor":"native_stats_start_date/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/6","deprecated":false,"title":"breakdown(site, query, property, metrics, pagination, opts \\\\ [])","anchor":"breakdown/6"}],"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":"imported_pageview_counts/1","deprecated":false,"title":"imported_pageview_counts(site)","anchor":"imported_pageview_counts/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_for_spike/4","deprecated":false,"title":"top_sources_for_spike(site, query, limit, page)","anchor":"top_sources_for_spike/4"},{"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_value, new_value)","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, site)","anchor":"maybe_allowed_props_only/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.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":"event_props/0","deprecated":false,"title":"event_props()","anchor":"event_props/0"},{"id":"parse/1","deprecated":false,"title":"parse(filters)","anchor":"parse/1"},{"id":"visit_props/0","deprecated":false,"title":"visit_props()","anchor":"visit_props/0"},{"id":"without_prefix/1","deprecated":false,"title":"without_prefix(property)","anchor":"without_prefix/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Filters.Utils","deprecated":false,"group":"","title":"Plausible.Stats.Filters.Utils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"list_expression?/1","deprecated":false,"title":"list_expression?(expression)","anchor":"list_expression?/1"},{"id":"parse_member_list/1","deprecated":false,"title":"parse_member_list(raw_value)","anchor":"parse_member_list/1"},{"id":"remove_escape_chars/1","deprecated":false,"title":"remove_escape_chars(value)","anchor":"remove_escape_chars/1"},{"id":"unwrap_goal_value/1","deprecated":false,"title":"unwrap_goal_value(goals)","anchor":"unwrap_goal_value/1"},{"id":"wildcard_expression?/1","deprecated":false,"title":"wildcard_expression?(expression)","anchor":"wildcard_expression?/1"},{"id":"wrap_goal_value/1","deprecated":false,"title":"wrap_goal_value(goals)","anchor":"wrap_goal_value/1"}],"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":"get_by_key/3","deprecated":false,"title":"get_by_key(table, meta_column, key)","anchor":"get_by_key/3"},{"id":"has_key/3","deprecated":false,"title":"has_key(table, meta_column, key)","anchor":"has_key/3"},{"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_all_filters_by_prefix/2","deprecated":false,"title":"get_all_filters_by_prefix(query, prefix)","anchor":"get_all_filters_by_prefix/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/2","deprecated":false,"title":"trace(query, metrics)","anchor":"trace/2"}],"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":"calculate_cr/2","deprecated":false,"title":"calculate_cr(unique_visitors, converted_visitors)","anchor":"calculate_cr/2"},{"id":"keep_requested_metrics/2","deprecated":false,"title":"keep_requested_metrics(results, requested_metrics)","anchor":"keep_requested_metrics/2"},{"id":"maybe_add_visitors_metric/1","deprecated":false,"title":"maybe_add_visitors_metric(metrics)","anchor":"maybe_add_visitors_metric/1"}],"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":"populate_stats/3","deprecated":false,"title":"populate_stats(site, import_id, events)","anchor":"populate_stats/3"},{"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_datetime_in_timezone/2","deprecated":false,"title":"to_datetime_in_timezone(dt, timezone)","anchor":"to_datetime_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":"on_trial?/1","deprecated":false,"title":"on_trial?(user)","anchor":"on_trial?/1"},{"id":"trial_days_left/1","deprecated":false,"title":"trial_days_left(user)","anchor":"trial_days_left/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":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"dry_run/1","deprecated":false,"title":"dry_run(date)","anchor":"dry_run/1"}],"key":"functions"}]},{"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.ImportAnalytics","deprecated":false,"group":"","title":"Plausible.Workers.ImportAnalytics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import_complete/1","deprecated":false,"title":"import_complete(site_import)","anchor":"import_complete/1"},{"id":"import_fail/1","deprecated":false,"title":"import_fail(site_import)","anchor":"import_fail/1"},{"id":"import_fail_transient/1","deprecated":false,"title":"import_fail_transient(site_import)","anchor":"import_fail_transient/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":"dynamic_icon/1","deprecated":false,"title":"dynamic_icon(assigns)","anchor":"dynamic_icon/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(site_import, user)","anchor":"import_failure/2"},{"id":"import_success/2","deprecated":false,"title":"import_success(site_import, user)","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":"server_info/1","deprecated":false,"title":"server_info(scheme)","anchor":"server_info/1"},{"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":"flat_settings_options/1","deprecated":false,"title":"flat_settings_options(conn)","anchor":"flat_settings_options/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":"logo_path/1","deprecated":false,"title":"logo_path(filename)","anchor":"logo_path/1"},{"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.Modal","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Modal","sections":[{"id":"Usage","anchor":"module-usage"},{"id":"Explanation","anchor":"module-explanation"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"close/2","deprecated":false,"title":"close(socket, id)","anchor":"close/2"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/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(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.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, map, socket)","anchor":"handle_event/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"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"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.ImportsExportsSettings","deprecated":false,"group":"","title":"PlausibleWeb.Live.ImportsExportsSettings","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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.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.Shields.Countries","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.Countries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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.Shields.CountryRules","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.CountryRules","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"send_flash/2","deprecated":false,"title":"send_flash(kind, message)","anchor":"send_flash/2"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Shields.IPAddresses","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.IPAddresses","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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.Shields.IPRules","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.IPRules","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"send_flash/2","deprecated":false,"title":"send_flash(kind, message)","anchor":"send_flash/2"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"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.Controllers.Capabilities","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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.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.Schemas.Capabilities","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Capabilities","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","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.Capabilities","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Capabilities","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.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":"plugins_api/2","deprecated":false,"title":"plugins_api(conn, _)","anchor":"plugins_api/2"},{"id":"plugins_api_auth/2","deprecated":false,"title":"plugins_api_auth(conn, _)","anchor":"plugins_api_auth/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_import/2","deprecated":false,"title":"forget_import(conn, map)","anchor":"forget_import/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_imports_exports/2","deprecated":false,"title":"settings_imports_exports(conn, params)","anchor":"settings_imports_exports/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_shields/2","deprecated":false,"title":"settings_shields(conn, map)","anchor":"settings_shields/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_imports_exports.html/1","deprecated":false,"title":"settings_imports_exports.html(assigns)","anchor":"settings_imports_exports.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_shields.html/1","deprecated":false,"title":"settings_shields.html(assigns)","anchor":"settings_shields.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"}]}],"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/dist/sidebar_items-679F5E33.js b/dist/sidebar_items-679F5E33.js deleted file mode 100644 index 28ded3f5da..0000000000 --- a/dist/sidebar_items-679F5E33.js +++ /dev/null @@ -1 +0,0 @@ -sidebarNodes={"modules":[{"id":"ObanErrorReporter","deprecated":false,"group":"","title":"ObanErrorReporter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","deprecated":false,"title":"handle_event(name, measurements, metadata, _)","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/1","deprecated":false,"title":"start_changeset(user)","anchor":"start_changeset/1"},{"id":"start_manual_lock_changeset/1","deprecated":false,"title":"start_manual_lock_changeset(user)","anchor":"start_manual_lock_changeset/1"}],"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":"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_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"}],"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"},{"id":"list_short_names/0","deprecated":false,"title":"list_short_names()","anchor":"list_short_names/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":"pageview_allowance_margin/0","deprecated":false,"title":"pageview_allowance_margin()","anchor":"pageview_allowance_margin/0"},{"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/2","deprecated":false,"title":"team_member_usage(user, opts \\\\ [])","anchor":"team_member_usage/2"},{"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.Cache","deprecated":false,"group":"","title":"Plausible.Cache","sections":[],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"base_db_query/0","deprecated":false,"title":"base_db_query()","anchor":"c:base_db_query/0"},{"id":"child_id/0","deprecated":false,"title":"child_id()","anchor":"c:child_id/0"},{"id":"count_all/0","deprecated":false,"title":"count_all()","anchor":"c:count_all/0"},{"id":"get_from_source/1","deprecated":false,"title":"get_from_source(any)","anchor":"c:get_from_source/1"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"c:name/0"},{"id":"unwrap_cache_keys/1","deprecated":false,"title":"unwrap_cache_keys(list)","anchor":"c:unwrap_cache_keys/1"}],"key":"callbacks"},{"name":"Functions","nodes":[{"id":"enabled?/0","deprecated":false,"title":"enabled?()","anchor":"enabled?/0"}],"key":"functions"}]},{"id":"Plausible.Cache.Warmer","deprecated":false,"group":"","title":"Plausible.Cache.Warmer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"}],"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_gettext_locale/1","deprecated":false,"title":"put_gettext_locale(locale)","anchor":"put_gettext_locale/1"},{"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.DataMigration.VersionedSessions","deprecated":false,"group":"","title":"Plausible.DataMigration.VersionedSessions","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.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":"country_rule_factory/0","deprecated":false,"title":"country_rule_factory()","anchor":"country_rule_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":"ip_rule_factory/0","deprecated":false,"title":"ip_rule_factory()","anchor":"ip_rule_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/2","deprecated":false,"title":"fetch_and_persist(report_request, opts \\\\ [])","anchor":"fetch_and_persist/2"},{"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(date_range, view_id, auth, persist_fn)","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.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":"delete_imports_for_site/1","deprecated":false,"title":"delete_imports_for_site(site)","anchor":"delete_imports_for_site/1"},{"id":"get_earliest_import/1","deprecated":false,"title":"get_earliest_import(site)","anchor":"get_earliest_import/1"},{"id":"list_all_imports/1","deprecated":false,"title":"list_all_imports(site)","anchor":"list_all_imports/1"},{"id":"list_complete_import_ids/1","deprecated":false,"title":"list_complete_import_ids(site)","anchor":"list_complete_import_ids/1"},{"id":"load_import_data/1","deprecated":false,"title":"load_import_data(site)","anchor":"load_import_data/1"},{"id":"tables/0","deprecated":false,"title":"tables()","anchor":"tables/0"}],"key":"functions"}]},{"id":"Plausible.Imported.Buffer","deprecated":false,"group":"","title":"Plausible.Imported.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.Imported.CSVImporter","deprecated":false,"group":"","title":"Plausible.Imported.CSVImporter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"new_import/3","deprecated":false,"title":"new_import(site, user, opts)","anchor":"new_import/3"}],"key":"functions"}]},{"id":"Plausible.Imported.ImportSources","deprecated":false,"group":"","title":"Plausible.Imported.ImportSources","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"by_name/1","deprecated":false,"title":"by_name(name)","anchor":"by_name/1"},{"id":"names/0","deprecated":false,"title":"names()","anchor":"names/0"}],"key":"functions"}]},{"id":"Plausible.Imported.Importer","deprecated":false,"group":"","title":"Plausible.Imported.Importer","sections":[{"id":"Running import fully synchronously","anchor":"module-running-import-fully-synchronously"}],"nodeGroups":[{"name":"Callbacks","nodes":[{"id":"before_start/1","deprecated":false,"title":"before_start(t)","anchor":"c:before_start/1"},{"id":"email_template/0","deprecated":false,"title":"email_template()","anchor":"c:email_template/0"},{"id":"import_data/2","deprecated":false,"title":"import_data(t, t)","anchor":"c:import_data/2"},{"id":"label/0","deprecated":false,"title":"label()","anchor":"c:label/0"},{"id":"name/0","deprecated":false,"title":"name()","anchor":"c:name/0"},{"id":"on_failure/1","deprecated":false,"title":"on_failure(t)","anchor":"c:on_failure/1"},{"id":"on_success/2","deprecated":false,"title":"on_success(t, map)","anchor":"c:on_success/2"},{"id":"parse_args/1","deprecated":false,"title":"parse_args(map)","anchor":"c:parse_args/1"}],"key":"callbacks"}]},{"id":"Plausible.Imported.NoopImporter","deprecated":false,"group":"","title":"Plausible.Imported.NoopImporter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"new_import/3","deprecated":false,"title":"new_import(site, user, opts)","anchor":"new_import/3"}],"key":"functions"}]},{"id":"Plausible.Imported.SiteImport","deprecated":false,"group":"","title":"Plausible.Imported.SiteImport","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"complete_changeset/2","deprecated":false,"title":"complete_changeset(site_import, params \\\\ %{})","anchor":"complete_changeset/2"},{"id":"completed/0","deprecated":false,"title":"completed()","anchor":"completed/0"},{"id":"create_changeset/3","deprecated":false,"title":"create_changeset(site, user, params)","anchor":"create_changeset/3"},{"id":"fail_changeset/1","deprecated":false,"title":"fail_changeset(site_import)","anchor":"fail_changeset/1"},{"id":"failed/0","deprecated":false,"title":"failed()","anchor":"failed/0"},{"id":"importing/0","deprecated":false,"title":"importing()","anchor":"importing/0"},{"id":"label/1","deprecated":false,"title":"label(arg1)","anchor":"label/1"},{"id":"pending/0","deprecated":false,"title":"pending()","anchor":"pending/0"},{"id":"start_changeset/1","deprecated":false,"title":"start_changeset(site_import)","anchor":"start_changeset/1"}],"key":"functions"}]},{"id":"Plausible.Imported.UniversalAnalytics","deprecated":false,"group":"","title":"Plausible.Imported.UniversalAnalytics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"from_report/4","deprecated":false,"title":"from_report(data, site_id, import_id, table)","anchor":"from_report/4"},{"id":"import_data/2","deprecated":false,"title":"import_data(site_import, opts)","anchor":"import_data/2"},{"id":"new_import/3","deprecated":false,"title":"new_import(site, user, opts)","anchor":"new_import/3"}],"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.License","deprecated":false,"group":"","title":"Plausible.License","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ensure_valid_license/0","deprecated":false,"title":"ensure_valid_license()","anchor":"ensure_valid_license/0"}],"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.MigrationUtils","deprecated":false,"group":"","title":"Plausible.MigrationUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clustered_table?/1","deprecated":false,"title":"clustered_table?(table)","anchor":"clustered_table?/1"},{"id":"on_cluster_statement/1","deprecated":false,"title":"on_cluster_statement(table)","anchor":"on_cluster_statement/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.Capabilities","deprecated":false,"group":"","title":"Plausible.Plugins.API.Capabilities","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get/1","deprecated":false,"title":"get(conn)","anchor":"get/1"}],"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":"allowed_for/2","deprecated":false,"title":"allowed_for(site, opts \\\\ [])","anchor":"allowed_for/2"},{"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.S3","deprecated":false,"group":"","title":"Plausible.S3","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import_clickhouse_credentials/0","deprecated":false,"title":"import_clickhouse_credentials()","anchor":"import_clickhouse_credentials/0"}],"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.Shield.CountryRule","deprecated":false,"group":"","title":"Plausible.Shield.CountryRule","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(rule, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Shield.CountryRuleCache","deprecated":false,"group":"","title":"Plausible.Shield.CountryRuleCache","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"get/2","deprecated":false,"title":"get(key, opts \\\\ [])","anchor":"get/2"},{"id":"hit_rate/1","deprecated":false,"title":"hit_rate(cache_name \\\\ name())","anchor":"hit_rate/1"},{"id":"merge_items/2","deprecated":false,"title":"merge_items(new_items, opts \\\\ [])","anchor":"merge_items/2"},{"id":"ready?/1","deprecated":false,"title":"ready?(cache_name \\\\ name())","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 \\\\ name())","anchor":"size/1"},{"id":"telemetry_event_refresh/2","deprecated":false,"title":"telemetry_event_refresh(cache_name \\\\ name(), mode)","anchor":"telemetry_event_refresh/2"}],"key":"functions"}]},{"id":"Plausible.Shield.IPRule","deprecated":false,"group":"","title":"Plausible.Shield.IPRule","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(rule, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Shield.IPRuleCache","deprecated":false,"group":"","title":"Plausible.Shield.IPRuleCache","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"get/2","deprecated":false,"title":"get(key, opts \\\\ [])","anchor":"get/2"},{"id":"hit_rate/1","deprecated":false,"title":"hit_rate(cache_name \\\\ name())","anchor":"hit_rate/1"},{"id":"merge_items/2","deprecated":false,"title":"merge_items(new_items, opts \\\\ [])","anchor":"merge_items/2"},{"id":"ready?/1","deprecated":false,"title":"ready?(cache_name \\\\ name())","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 \\\\ name())","anchor":"size/1"},{"id":"telemetry_event_refresh/2","deprecated":false,"title":"telemetry_event_refresh(cache_name \\\\ name(), mode)","anchor":"telemetry_event_refresh/2"}],"key":"functions"}]},{"id":"Plausible.Shields","deprecated":false,"group":"","title":"Plausible.Shields","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_country_rule/3","deprecated":false,"title":"add_country_rule(site_or_id, params, opts \\\\ [])","anchor":"add_country_rule/3"},{"id":"add_ip_rule/3","deprecated":false,"title":"add_ip_rule(site_or_id, params, opts \\\\ [])","anchor":"add_ip_rule/3"},{"id":"count_country_rules/1","deprecated":false,"title":"count_country_rules(site_or_id)","anchor":"count_country_rules/1"},{"id":"count_ip_rules/1","deprecated":false,"title":"count_ip_rules(site_or_id)","anchor":"count_ip_rules/1"},{"id":"list_country_rules/1","deprecated":false,"title":"list_country_rules(site_or_id)","anchor":"list_country_rules/1"},{"id":"list_ip_rules/1","deprecated":false,"title":"list_ip_rules(site_or_id)","anchor":"list_ip_rules/1"},{"id":"maximum_country_rules/0","deprecated":false,"title":"maximum_country_rules()","anchor":"maximum_country_rules/0"},{"id":"maximum_ip_rules/0","deprecated":false,"title":"maximum_ip_rules()","anchor":"maximum_ip_rules/0"},{"id":"remove_country_rule/2","deprecated":false,"title":"remove_country_rule(site_or_id, rule_id)","anchor":"remove_country_rule/2"},{"id":"remove_ip_rule/2","deprecated":false,"title":"remove_ip_rule(site_or_id, rule_id)","anchor":"remove_ip_rule/2"}],"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":"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_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":"Functions","nodes":[{"id":"child_spec/1","deprecated":false,"title":"child_spec(opts)","anchor":"child_spec/1"},{"id":"get/2","deprecated":false,"title":"get(key, 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 \\\\ name())","anchor":"hit_rate/1"},{"id":"merge_items/2","deprecated":false,"title":"merge_items(new_items, opts \\\\ [])","anchor":"merge_items/2"},{"id":"ready?/1","deprecated":false,"title":"ready?(cache_name \\\\ name())","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 \\\\ name())","anchor":"size/1"},{"id":"telemetry_event_refresh/2","deprecated":false,"title":"telemetry_event_refresh(cache_name \\\\ name(), 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.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":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"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":"clear_stats_start_date!/1","deprecated":false,"title":"clear_stats_start_date!(site)","anchor":"clear_stats_start_date!/1"},{"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":"local_start_date/1","deprecated":false,"title":"local_start_date(site)","anchor":"local_start_date/1"},{"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/6","deprecated":false,"title":"breakdown(site, query, property, metrics, pagination, opts \\\\ [])","anchor":"breakdown/6"}],"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_for_spike/4","deprecated":false,"title":"top_sources_for_spike(site, query, limit, page)","anchor":"top_sources_for_spike/4"},{"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_value, new_value)","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, site)","anchor":"maybe_allowed_props_only/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.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":"event_props/0","deprecated":false,"title":"event_props()","anchor":"event_props/0"},{"id":"parse/1","deprecated":false,"title":"parse(filters)","anchor":"parse/1"},{"id":"visit_props/0","deprecated":false,"title":"visit_props()","anchor":"visit_props/0"},{"id":"without_prefix/1","deprecated":false,"title":"without_prefix(property)","anchor":"without_prefix/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Filters.Utils","deprecated":false,"group":"","title":"Plausible.Stats.Filters.Utils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"list_expression?/1","deprecated":false,"title":"list_expression?(expression)","anchor":"list_expression?/1"},{"id":"parse_member_list/1","deprecated":false,"title":"parse_member_list(raw_value)","anchor":"parse_member_list/1"},{"id":"remove_escape_chars/1","deprecated":false,"title":"remove_escape_chars(value)","anchor":"remove_escape_chars/1"},{"id":"unwrap_goal_value/1","deprecated":false,"title":"unwrap_goal_value(goals)","anchor":"unwrap_goal_value/1"},{"id":"wildcard_expression?/1","deprecated":false,"title":"wildcard_expression?(expression)","anchor":"wildcard_expression?/1"},{"id":"wrap_goal_value/1","deprecated":false,"title":"wrap_goal_value(goals)","anchor":"wrap_goal_value/1"}],"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":"get_by_key/3","deprecated":false,"title":"get_by_key(table, meta_column, key)","anchor":"get_by_key/3"},{"id":"has_key/3","deprecated":false,"title":"has_key(table, meta_column, key)","anchor":"has_key/3"},{"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_all_filters_by_prefix/2","deprecated":false,"title":"get_all_filters_by_prefix(query, prefix)","anchor":"get_all_filters_by_prefix/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/2","deprecated":false,"title":"trace(query, metrics)","anchor":"trace/2"}],"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":"calculate_cr/2","deprecated":false,"title":"calculate_cr(unique_visitors, converted_visitors)","anchor":"calculate_cr/2"},{"id":"keep_requested_metrics/2","deprecated":false,"title":"keep_requested_metrics(results, requested_metrics)","anchor":"keep_requested_metrics/2"},{"id":"maybe_add_visitors_metric/1","deprecated":false,"title":"maybe_add_visitors_metric(metrics)","anchor":"maybe_add_visitors_metric/1"}],"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":"populate_stats/3","deprecated":false,"title":"populate_stats(site, import_id, events)","anchor":"populate_stats/3"},{"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_datetime_in_timezone/2","deprecated":false,"title":"to_datetime_in_timezone(dt, timezone)","anchor":"to_datetime_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":"on_trial?/1","deprecated":false,"title":"on_trial?(user)","anchor":"on_trial?/1"},{"id":"trial_days_left/1","deprecated":false,"title":"trial_days_left(user)","anchor":"trial_days_left/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":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"dry_run/1","deprecated":false,"title":"dry_run(date)","anchor":"dry_run/1"}],"key":"functions"}]},{"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.ImportAnalytics","deprecated":false,"group":"","title":"Plausible.Workers.ImportAnalytics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"import_complete/1","deprecated":false,"title":"import_complete(site_import)","anchor":"import_complete/1"},{"id":"import_fail/1","deprecated":false,"title":"import_fail(site_import)","anchor":"import_fail/1"},{"id":"import_fail_transient/1","deprecated":false,"title":"import_fail_transient(site_import)","anchor":"import_fail_transient/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":"dynamic_icon/1","deprecated":false,"title":"dynamic_icon(assigns)","anchor":"dynamic_icon/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(site_import, user)","anchor":"import_failure/2"},{"id":"import_success/2","deprecated":false,"title":"import_success(site_import, user)","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":"server_info/1","deprecated":false,"title":"server_info(scheme)","anchor":"server_info/1"},{"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":"flat_settings_options/1","deprecated":false,"title":"flat_settings_options(conn)","anchor":"flat_settings_options/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":"logo_path/1","deprecated":false,"title":"logo_path(filename)","anchor":"logo_path/1"},{"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.Modal","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Modal","sections":[{"id":"Usage","anchor":"module-usage"},{"id":"Explanation","anchor":"module-explanation"}],"nodeGroups":[{"name":"Functions","nodes":[{"id":"close/2","deprecated":false,"title":"close(socket, id)","anchor":"close/2"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/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(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.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, map, socket)","anchor":"handle_event/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"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"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.Shields.Countries","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.Countries","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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.Shields.CountryRules","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.CountryRules","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"send_flash/2","deprecated":false,"title":"send_flash(kind, message)","anchor":"send_flash/2"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Shields.IPAddresses","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.IPAddresses","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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.Shields.IPRules","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.IPRules","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, map, socket)","anchor":"handle_event/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"send_flash/2","deprecated":false,"title":"send_flash(kind, message)","anchor":"send_flash/2"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"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.Controllers.Capabilities","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.Capabilities","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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.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.Schemas.Capabilities","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Capabilities","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","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.Capabilities","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Capabilities","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.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":"plugins_api/2","deprecated":false,"title":"plugins_api(conn, _)","anchor":"plugins_api/2"},{"id":"plugins_api_auth/2","deprecated":false,"title":"plugins_api_auth(conn, _)","anchor":"plugins_api_auth/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_shields/2","deprecated":false,"title":"settings_shields(conn, map)","anchor":"settings_shields/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_shields.html/1","deprecated":false,"title":"settings_shields.html(assigns)","anchor":"settings_shields.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"}]}],"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 b88ebdf295..0411b8f91d 100644 --- a/readme.html +++ b/readme.html @@ -14,7 +14,7 @@ - + diff --git a/search.html b/search.html index 5dde10eec0..d58a68ed42 100644 --- a/search.html +++ b/search.html @@ -16,7 +16,7 @@ - + @@ -138,7 +138,7 @@ Pages
    - +