From ed60dddd9d9261570fcf4e301bcda61d1498401f Mon Sep 17 00:00:00 2001 From: "github-merge-queue[bot]" Date: Thu, 21 Nov 2024 11:18:46 +0000 Subject: [PATCH] deploy: 4d9ea15e9e172afcf0ac918ef4ea41fced5fad3b --- .build | 6 +- 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.UserSession.html | 2 +- Plausible.Auth.UserSessions.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 | 2 +- Plausible.Billing.SiteLocker.html | 2 +- Plausible.Billing.Subscription.Status.html | 2 +- Plausible.Billing.html | 2 +- Plausible.Cache.Adapter.html | 2 +- Plausible.Cache.Stats.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 | 184 ++++----- Plausible.ClickhouseEventV2.html | 2 +- Plausible.ClickhouseLocationData.html | 2 +- Plausible.ClickhouseRepo.html | 18 +- Plausible.ClickhouseSessionV2.BoolUInt8.html | 2 +- Plausible.ClickhouseSessionV2.html | 2 +- Plausible.ConfigHelpers.html | 2 +- Plausible.CrmExtensions.html | 2 +- Plausible.DataCase.html | 2 +- ...ible.DataMigration.AcquisitionChannel.html | 2 +- Plausible.DataMigration.BackfillTeams.html | 2 +- ...gration.CleanUpDemoSiteReferrerSource.html | 2 +- Plausible.DataMigration.ClickhouseRepo.html | 18 +- Plausible.DataMigration.LocationsSync.html | 2 +- Plausible.DataMigration.NumericIDs.html | 2 +- ...Migration.PopulateEventSessionColumns.html | 2 +- Plausible.DataMigration.PostgresRepo.html | 2 +- Plausible.DataMigration.SiteImports.html | 2 +- ...le.DataMigration.TeamsConsitencyCheck.html | 2 +- ...sible.DataMigration.VersionedSessions.html | 2 +- Plausible.DataMigration.html | 2 +- Plausible.Ecto.EventName.html | 2 +- Plausible.Ecto.Types.CompiledRegex.html | 2 +- Plausible.Exports.html | 20 +- Plausible.Factory.html | 2 +- Plausible.File.html | 2 +- Plausible.Funnel.Const.html | 2 +- Plausible.Funnel.Step.html | 2 +- Plausible.Funnel.html | 2 +- Plausible.Funnels.html | 2 +- Plausible.Geo.html | 66 ++-- Plausible.Goal.Revenue.html | 2 +- Plausible.Goal.html | 2 +- Plausible.Goals.html | 2 +- Plausible.Google.API.Mock.html | 2 +- Plausible.Google.API.html | 2 +- Plausible.Google.GA4.API.html | 2 +- Plausible.Google.GA4.HTTP.html | 2 +- Plausible.Google.GA4.ReportRequest.html | 2 +- Plausible.Google.HTTP.html | 2 +- Plausible.HTTPClient.Interface.html | 2 +- Plausible.HTTPClient.Non200Error.html | 2 +- Plausible.HTTPClient.html | 2 +- Plausible.HelpScout.Vault.html | 2 +- Plausible.HelpScout.html | 2 +- Plausible.Helpers.JSON.html | 2 +- Plausible.ImportDeletionRepo.html | 18 +- Plausible.Imported.Buffer.html | 2 +- Plausible.Imported.CSVImporter.html | 38 +- Plausible.Imported.GoogleAnalytics4.html | 2 +- Plausible.Imported.ImportSources.html | 2 +- Plausible.Imported.Importer.html | 30 +- Plausible.Imported.NoopImporter.html | 2 +- Plausible.Imported.SiteImport.html | 2 +- Plausible.Imported.UniversalAnalytics.html | 2 +- Plausible.Imported.html | 2 +- Plausible.IngestRepo.html | 18 +- Plausible.Ingestion.Acquisition.html | 2 +- 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.Ingestion.Source.html | 2 +- Plausible.License.html | 2 +- Plausible.LiveViewTest.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.Funnels.html | 2 +- Plausible.Plugins.API.Goals.html | 2 +- Plausible.Plugins.API.SharedLinks.html | 2 +- Plausible.Plugins.API.Token.html | 2 +- Plausible.Plugins.API.Tokens.html | 2 +- ...sible.PromEx.Plugins.PlausibleMetrics.html | 2 +- Plausible.PromEx.html | 2 +- Plausible.Props.html | 2 +- Plausible.Purge.html | 2 +- Plausible.RateLimit.html | 2 +- Plausible.Release.html | 2 +- Plausible.Repo.html | 2 +- Plausible.RequestLogger.html | 2 +- Plausible.S3.html | 16 +- 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.HostnameRule.html | 2 +- Plausible.Shield.HostnameRuleCache.html | 2 +- Plausible.Shield.IPRule.html | 2 +- Plausible.Shield.IPRuleCache.html | 2 +- Plausible.Shield.PageRule.html | 2 +- Plausible.Shield.PageRuleCache.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.InstallationMeta.html | 2 +- Plausible.Site.Membership.html | 2 +- ...ble.Site.Memberships.AcceptInvitation.html | 2 +- ...ble.Site.Memberships.CreateInvitation.html | 10 +- ...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.TrafficChangeNotification.html | 2 +- Plausible.Site.UserPreference.html | 2 +- Plausible.Site.WeeklyReport.html | 2 +- Plausible.Site.html | 2 +- Plausible.SiteAdmin.html | 2 +- Plausible.Sites.html | 2 +- Plausible.Stats.Aggregate.html | 2 +- Plausible.Stats.Base.html | 2 +- Plausible.Stats.Breakdown.html | 2 +- Plausible.Stats.Clickhouse.html | 2 +- Plausible.Stats.Compare.html | 2 +- Plausible.Stats.Comparisons.html | 2 +- Plausible.Stats.CurrentVisitors.html | 2 +- Plausible.Stats.CustomProps.html | 2 +- Plausible.Stats.DateTimeRange.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.Funnel.html | 2 +- Plausible.Stats.Goal.Revenue.html | 2 +- Plausible.Stats.Imported.Base.html | 2 +- Plausible.Stats.Imported.SQL.Expression.html | 2 +- ...sible.Stats.Imported.SQL.WhereBuilder.html | 2 +- Plausible.Stats.Imported.html | 2 +- Plausible.Stats.Interval.html | 2 +- Plausible.Stats.JSONSchema.Utils.html | 2 +- Plausible.Stats.JSONSchema.html | 2 +- Plausible.Stats.Legacy.Dimensions.html | 2 +- Plausible.Stats.Legacy.QueryBuilder.html | 2 +- Plausible.Stats.Legacy.TimeOnPage.html | 2 +- Plausible.Stats.Metrics.html | 2 +- Plausible.Stats.Query.html | 2 +- Plausible.Stats.QueryOptimizer.html | 2 +- Plausible.Stats.QueryResult.html | 2 +- Plausible.Stats.QueryRunner.html | 2 +- Plausible.Stats.SQL.Expression.html | 2 +- Plausible.Stats.SQL.Fragments.html | 6 +- Plausible.Stats.SQL.SpecialMetrics.html | 2 +- Plausible.Stats.SQL.WhereBuilder.html | 2 +- Plausible.Stats.Sampling.html | 2 +- Plausible.Stats.TableDecider.html | 2 +- Plausible.Stats.Time.html | 2 +- Plausible.Stats.Timeseries.html | 2 +- Plausible.Stats.Util.html | 2 +- Plausible.Stats.html | 2 +- Plausible.Teams.Adapter.Read.Billing.html | 98 ++++- Plausible.Teams.Adapter.Read.Invitations.html | 361 ++++++++++++++++++ Plausible.Teams.Adapter.Read.Ownership.html | 2 +- Plausible.Teams.Adapter.Read.Sites.html | 2 +- Plausible.Teams.Adapter.Read.Teams.html | 301 +++++++++++++++ Plausible.Teams.Adapter.html | 2 +- Plausible.Teams.GuestInvitation.html | 2 +- Plausible.Teams.GuestMembership.html | 2 +- Plausible.Teams.Invitation.html | 2 +- Plausible.Teams.Membership.html | 2 +- Plausible.Teams.SiteTransfer.html | 2 +- Plausible.Teams.Team.html | 2 +- Plausible.Teams.Test.html | 26 +- Plausible.Teams.Users.html | 2 +- Plausible.Teams.html | 24 +- 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.Verification.Check.html | 2 +- Plausible.Verification.Checks.CSP.html | 2 +- Plausible.Verification.Checks.FetchBody.html | 2 +- ...ible.Verification.Checks.Installation.html | 2 +- Plausible.Verification.Checks.ScanBody.html | 2 +- Plausible.Verification.Checks.Snippet.html | 2 +- ....Verification.Checks.SnippetCacheBust.html | 2 +- Plausible.Verification.Checks.html | 2 +- ...sible.Verification.Diagnostics.Result.html | 2 +- Plausible.Verification.Diagnostics.html | 2 +- Plausible.Verification.Errors.html | 2 +- Plausible.Verification.State.html | 2 +- Plausible.Verification.URL.html | 2 +- Plausible.Verification.html | 2 +- Plausible.Workers.AcceptTrafficUntil.html | 2 +- Plausible.Workers.CheckUsage.html | 2 +- Plausible.Workers.CleanInvitations.html | 2 +- Plausible.Workers.CleanUserSessions.html | 2 +- Plausible.Workers.ClickhouseCleanSites.html | 2 +- ...Workers.ExpireDomainChangeTransitions.html | 2 +- Plausible.Workers.ExportAnalytics.html | 2 +- Plausible.Workers.ImportAnalytics.html | 2 +- ...e.Workers.LocalImportAnalyticsCleaner.html | 2 +- Plausible.Workers.LockSites.html | 2 +- Plausible.Workers.NotifyAnnualRenewal.html | 2 +- ...sible.Workers.NotifyExportedAnalytics.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.TrafficChangeNotifier.html | 2 +- Plausible.epub | Bin 812784 -> 815278 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.AvatarController.html | 2 +- PlausibleWeb.BillingController.html | 2 +- PlausibleWeb.BillingView.html | 2 +- PlausibleWeb.Captcha.html | 2 +- ...leWeb.Components.Billing.PlanBenefits.html | 2 +- ...Components.FirstDashboardLaunchBanner.html | 2 +- PlausibleWeb.Components.FlowProgress.html | 2 +- PlausibleWeb.Components.Generic.html | 2 +- PlausibleWeb.Components.Google.html | 2 +- PlausibleWeb.Components.Settings.html | 2 +- PlausibleWeb.Components.Site.Feature.html | 2 +- PlausibleWeb.Components.TwoFactor.html | 2 +- PlausibleWeb.ConnCase.html | 2 +- PlausibleWeb.ControllerHelpers.html | 2 +- PlausibleWeb.Controllers.API.Revenue.html | 2 +- PlausibleWeb.DebugController.html | 2 +- PlausibleWeb.DebugView.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.Flows.html | 2 +- PlausibleWeb.GoogleAnalyticsController.html | 2 +- PlausibleWeb.GoogleAnalyticsView.html | 2 +- PlausibleWeb.HelpScoutController.html | 2 +- PlausibleWeb.HelpScoutView.html | 2 +- PlausibleWeb.InvitationController.html | 2 +- PlausibleWeb.LayoutView.JWT.html | 2 +- PlausibleWeb.LayoutView.html | 2 +- PlausibleWeb.Live.AuthContext.html | 2 +- PlausibleWeb.Live.CSVExport.html | 2 +- PlausibleWeb.Live.CSVImport.html | 2 +- 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 | 44 +-- PlausibleWeb.Live.Components.Pagination.html | 2 +- ...sibleWeb.Live.Components.Verification.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 | 2 +- PlausibleWeb.Live.Installation.html | 2 +- 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.HostnameRules.html | 2 +- PlausibleWeb.Live.Shields.Hostnames.html | 2 +- PlausibleWeb.Live.Shields.IPAddresses.html | 2 +- PlausibleWeb.Live.Shields.IPRules.html | 2 +- PlausibleWeb.Live.Shields.PageRules.html | 2 +- PlausibleWeb.Live.Shields.Pages.html | 2 +- PlausibleWeb.Live.Sites.html | 2 +- PlausibleWeb.Live.Verification.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 +- ...leWeb.Plugins.API.Controllers.Funnels.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 +- ...gins.API.Schemas.Funnel.CreateRequest.html | 2 +- ...ugins.API.Schemas.Funnel.ListResponse.html | 2 +- PlausibleWeb.Plugins.API.Schemas.Funnel.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.Funnel.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.AuthorizePublicAPI.html | 8 +- PlausibleWeb.Plugs.AuthorizeSiteAccess.html | 4 +- PlausibleWeb.Plugs.ErrorHandler.html | 2 +- ...bleWeb.Plugs.MaybeDisableRegistration.html | 2 +- PlausibleWeb.Plugs.NoRobots.html | 2 +- PlausibleWeb.Plugs.UserSessionTouch.html | 2 +- PlausibleWeb.RemoteIP.html | 2 +- PlausibleWeb.RequireAccountPlug.html | 2 +- PlausibleWeb.RequireLoggedOutPlug.html | 2 +- PlausibleWeb.Router.html | 2 +- PlausibleWeb.SettingsController.html | 2 +- PlausibleWeb.SettingsView.html | 2 +- PlausibleWeb.Site.MembershipController.html | 2 +- PlausibleWeb.Site.MembershipView.html | 2 +- PlausibleWeb.SiteController.html | 2 +- PlausibleWeb.SiteView.html | 2 +- PlausibleWeb.StatsController.html | 2 +- PlausibleWeb.StatsView.html | 2 +- PlausibleWeb.TestController.html | 2 +- PlausibleWeb.Tracker.html | 2 +- PlausibleWeb.TwoFactor.Session.html | 2 +- PlausibleWeb.UnsubscribeController.html | 2 +- PlausibleWeb.UnsubscribeView.html | 2 +- PlausibleWeb.UserAuth.html | 2 +- PlausibleWeb.html | 2 +- api-reference.html | 20 +- contributing.html | 2 +- ...ta-A23F52FF.js => search_data-D5C2181C.js} | 2 +- ...-4BEA778F.js => sidebar_items-DD84C8DF.js} | 2 +- readme.html | 2 +- search.html | 4 +- 443 files changed, 1904 insertions(+), 1160 deletions(-) create mode 100644 Plausible.Teams.Adapter.Read.Invitations.html create mode 100644 Plausible.Teams.Adapter.Read.Teams.html rename dist/{search_data-A23F52FF.js => search_data-D5C2181C.js} (65%) rename dist/{sidebar_items-4BEA778F.js => sidebar_items-DD84C8DF.js} (60%) diff --git a/.build b/.build index 2757200f12..dcfbd3774f 100644 --- a/.build +++ b/.build @@ -222,8 +222,10 @@ Plausible.Stats.Timeseries.html Plausible.Stats.Util.html Plausible.Stats.html Plausible.Teams.Adapter.Read.Billing.html +Plausible.Teams.Adapter.Read.Invitations.html Plausible.Teams.Adapter.Read.Ownership.html Plausible.Teams.Adapter.Read.Sites.html +Plausible.Teams.Adapter.Read.Teams.html Plausible.Teams.Adapter.html Plausible.Teams.GuestInvitation.html Plausible.Teams.GuestMembership.html @@ -461,8 +463,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-A23F52FF.js -dist/sidebar_items-4BEA778F.js +dist/search_data-D5C2181C.js +dist/sidebar_items-DD84C8DF.js index.html readme.html search.html diff --git a/404.html b/404.html index d6afad0ba6..5f4e18a068 100644 --- a/404.html +++ b/404.html @@ -16,7 +16,7 @@ - + diff --git a/Mix.Tasks.CancelSubscription.html b/Mix.Tasks.CancelSubscription.html index c7ee320646..81fe82a4f3 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 2fa0ccb27d..f91dc95c95 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 f153301d98..b8759e8350 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 e23dff18e3..bfa57f3cc0 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 70dffd03df..2b453f86d5 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 7d060ab151..1fc999f575 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 f17866d452..0bdf6c97b5 100644 --- a/Mix.Tasks.SendPageview.html +++ b/Mix.Tasks.SendPageview.html @@ -14,7 +14,7 @@ - + diff --git a/ObanErrorReporter.html b/ObanErrorReporter.html index 2dff8bfdc6..b4b938c27d 100644 --- a/ObanErrorReporter.html +++ b/ObanErrorReporter.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.AsyncInsertRepo.html b/Plausible.AsyncInsertRepo.html index 53f4e78c99..98c2f4bf6a 100644 --- a/Plausible.AsyncInsertRepo.html +++ b/Plausible.AsyncInsertRepo.html @@ -14,7 +14,7 @@ - + @@ -1187,23 +1187,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 885410d7d1..c4fe8fc2d7 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 ed98ac6f08..c59c9cb61f 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 3c3f615f22..9d6c27dd21 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 977a5601eb..860c83d479 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 829aeba691..b16c841c43 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 8c4946944f..1e0fbcbcb3 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 12228b3348..76826b7374 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 59e0bbd057..8f35f9fd99 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 82b7c11dd6..fe2876647a 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 1d89d5d161..6ab1cf514a 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 5bb4211cc9..20cef03697 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 38b970625d..d4175c5bc8 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 d915955bdd..ebfad814d0 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 cf2fe8065f..f40ac89383 100644 --- a/Plausible.Auth.UserAdmin.html +++ b/Plausible.Auth.UserAdmin.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.UserSession.html b/Plausible.Auth.UserSession.html index e8d8fe2c96..18a5d195e8 100644 --- a/Plausible.Auth.UserSession.html +++ b/Plausible.Auth.UserSession.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.UserSessions.html b/Plausible.Auth.UserSessions.html index 167ef19978..182dd34308 100644 --- a/Plausible.Auth.UserSessions.html +++ b/Plausible.Auth.UserSessions.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Auth.html b/Plausible.Auth.html index 3720c5f44a..55c407db5e 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 251ac2084a..fa5f859f09 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 df746bb7d5..ae388ee717 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 b0c95bc4bd..b283292ed5 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 d186e65dd9..21888c15a7 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 61683e4da1..870104e218 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 ef4815e0b9..82ebaefaba 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 3382183a9b..70a15387be 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 29fc286b1c..3c81c9c823 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 f883b7c070..01c35447bd 100644 --- a/Plausible.Billing.Quota.html +++ b/Plausible.Billing.Quota.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Billing.SiteLocker.html b/Plausible.Billing.SiteLocker.html index e042203730..0db6527230 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 fb7f6ebeca..700a4d96c0 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 b25c255c9f..cc5ec4bb91 100644 --- a/Plausible.Billing.html +++ b/Plausible.Billing.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Cache.Adapter.html b/Plausible.Cache.Adapter.html index b59ef9eb28..486beaa133 100644 --- a/Plausible.Cache.Adapter.html +++ b/Plausible.Cache.Adapter.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Cache.Stats.html b/Plausible.Cache.Stats.html index 9bb11f2d96..a3311c0706 100644 --- a/Plausible.Cache.Stats.html +++ b/Plausible.Cache.Stats.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Cache.Warmer.html b/Plausible.Cache.Warmer.html index 55802d6d81..3b76f67a67 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 a4bfca859b..3829de55f5 100644 --- a/Plausible.Cache.html +++ b/Plausible.Cache.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.ChangesetHelpers.html b/Plausible.ChangesetHelpers.html index 1bc30511f9..ebcdcdce26 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 7ac39ed1e4..7248ab9c09 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 @@ with 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 @@ with 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 d776a03176..328dde4774 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 2e38407610..59f1636708 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 53f7bee1ea..0a3368d247 100644 --- a/Plausible.Cldr.Number.Cardinal.html +++ b/Plausible.Cldr.Number.Cardinal.html @@ -14,7 +14,7 @@ - + @@ -461,31 +461,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 eb5cfc8bba..5d5022bb61 100644 --- a/Plausible.Cldr.Number.Format.html +++ b/Plausible.Cldr.Number.Format.html @@ -14,7 +14,7 @@ - + @@ -465,7 +465,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¤)",
@@ -475,7 +475,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 ¤", ...]
@@ -523,8 +523,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",
@@ -532,7 +532,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"]}
@@ -585,8 +585,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}}}
@@ -642,8 +642,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}}
@@ -700,18 +700,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 ¤"]}], ... }
@@ -802,8 +802,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}
@@ -855,7 +855,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 b353485add..c82e71301f 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 0872ea495e..88bef250d3 100644 --- a/Plausible.Cldr.Number.Ordinal.html +++ b/Plausible.Cldr.Number.Ordinal.html @@ -14,7 +14,7 @@ - + @@ -464,31 +464,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 0916992ada..2d13b525e5 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 9de1c85228..3bca8ab2ed 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 f953b263ec..6c1f55c0bd 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"}}
@@ -614,20 +614,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.

@@ -674,16 +674,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 3339f56202..549cc7c985 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 5249fdd47c..46ab250c24 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 3c721a2880..e21225b055 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 f3a382e292..a991f60d1e 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 f1df5b850c..d79d627c3b 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 1138434229..727ed275f3 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,18 +1294,18 @@ 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")
-{
+iex> Plausible.Cldr.put_gettext_locale(~l"de")
+{
   :error,
-  {
+  {
     Cldr.UnknownLocaleError,
     "Locale TestBackend.Cldr.Locale.new!(\"de-DE\") does not map to a known gettext locale name"
-  }
-}
+
} +}
@@ -1349,29 +1349,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"}}
@@ -1420,10 +1420,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」"
@@ -1554,47 +1554,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"}}
@@ -1664,23 +1664,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 c7208292b2..b9c8a30aa3 100644 --- a/Plausible.ClickhouseEventV2.html +++ b/Plausible.ClickhouseEventV2.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.ClickhouseLocationData.html b/Plausible.ClickhouseLocationData.html index a095942340..78b11b50d0 100644 --- a/Plausible.ClickhouseLocationData.html +++ b/Plausible.ClickhouseLocationData.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.ClickhouseRepo.html b/Plausible.ClickhouseRepo.html index c448cfd5f7..3dc3190d88 100644 --- a/Plausible.ClickhouseRepo.html +++ b/Plausible.ClickhouseRepo.html @@ -14,7 +14,7 @@ - + @@ -879,23 +879,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 30a9006bf8..4129949897 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 e95d8897c5..5aa1ceb681 100644 --- a/Plausible.ClickhouseSessionV2.html +++ b/Plausible.ClickhouseSessionV2.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.ConfigHelpers.html b/Plausible.ConfigHelpers.html index a67ff46339..55a4b3f4eb 100644 --- a/Plausible.ConfigHelpers.html +++ b/Plausible.ConfigHelpers.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.CrmExtensions.html b/Plausible.CrmExtensions.html index 0e3b8f6393..d305bc4127 100644 --- a/Plausible.CrmExtensions.html +++ b/Plausible.CrmExtensions.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataCase.html b/Plausible.DataCase.html index c89db8a964..4f1b796d74 100644 --- a/Plausible.DataCase.html +++ b/Plausible.DataCase.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.AcquisitionChannel.html b/Plausible.DataMigration.AcquisitionChannel.html index 88ee736d95..eda4d2a802 100644 --- a/Plausible.DataMigration.AcquisitionChannel.html +++ b/Plausible.DataMigration.AcquisitionChannel.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.BackfillTeams.html b/Plausible.DataMigration.BackfillTeams.html index 7a367ad5ac..e63a83e945 100644 --- a/Plausible.DataMigration.BackfillTeams.html +++ b/Plausible.DataMigration.BackfillTeams.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html index b4d482a217..e6ad8e7c2f 100644 --- a/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html +++ b/Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.ClickhouseRepo.html b/Plausible.DataMigration.ClickhouseRepo.html index 450b7150d0..a8d5b7edfc 100644 --- a/Plausible.DataMigration.ClickhouseRepo.html +++ b/Plausible.DataMigration.ClickhouseRepo.html @@ -14,7 +14,7 @@ - + @@ -1196,23 +1196,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.LocationsSync.html b/Plausible.DataMigration.LocationsSync.html index 89143379e1..a2db26852f 100644 --- a/Plausible.DataMigration.LocationsSync.html +++ b/Plausible.DataMigration.LocationsSync.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.NumericIDs.html b/Plausible.DataMigration.NumericIDs.html index be86a7d4d2..4764aee26e 100644 --- a/Plausible.DataMigration.NumericIDs.html +++ b/Plausible.DataMigration.NumericIDs.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.PopulateEventSessionColumns.html b/Plausible.DataMigration.PopulateEventSessionColumns.html index 88f346eabe..3a442757d1 100644 --- a/Plausible.DataMigration.PopulateEventSessionColumns.html +++ b/Plausible.DataMigration.PopulateEventSessionColumns.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.PostgresRepo.html b/Plausible.DataMigration.PostgresRepo.html index 5860f84440..5ba5180a96 100644 --- a/Plausible.DataMigration.PostgresRepo.html +++ b/Plausible.DataMigration.PostgresRepo.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.SiteImports.html b/Plausible.DataMigration.SiteImports.html index bbf1ff3394..da7c9d7908 100644 --- a/Plausible.DataMigration.SiteImports.html +++ b/Plausible.DataMigration.SiteImports.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.TeamsConsitencyCheck.html b/Plausible.DataMigration.TeamsConsitencyCheck.html index 492f78bc84..fab3d85575 100644 --- a/Plausible.DataMigration.TeamsConsitencyCheck.html +++ b/Plausible.DataMigration.TeamsConsitencyCheck.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.DataMigration.VersionedSessions.html b/Plausible.DataMigration.VersionedSessions.html index 014bf8770e..2ea9e080b7 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 72ede3a6f6..d70e4fe8e7 100644 --- a/Plausible.DataMigration.html +++ b/Plausible.DataMigration.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ecto.EventName.html b/Plausible.Ecto.EventName.html index 8621308053..6fa11d4a74 100644 --- a/Plausible.Ecto.EventName.html +++ b/Plausible.Ecto.EventName.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ecto.Types.CompiledRegex.html b/Plausible.Ecto.Types.CompiledRegex.html index f8e2197982..d9e0358efb 100644 --- a/Plausible.Ecto.Types.CompiledRegex.html +++ b/Plausible.Ecto.Types.CompiledRegex.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Exports.html b/Plausible.Exports.html index 3599acc702..e976272383 100644 --- a/Plausible.Exports.html +++ b/Plausible.Exports.html @@ -14,7 +14,7 @@ - + @@ -381,7 +381,7 @@ tables into the format of imported_* tables for a we
-

Renders export archive filename.

Examples:

iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
+

Renders export archive filename.

Examples:

iex> archive_filename("plausible.io", _created_on = ~D[2024-12-31])
 "plausible_io_20241231.zip"
@@ -404,10 +404,10 @@ tables into the format of imported_* tables for a we
-

Safely renders content disposition for an arbitrary export filename.

Examples:

iex> content_disposition("plausible_io_20241231.zip")
+

Safely renders content disposition for an arbitrary export filename.

Examples:

iex> content_disposition("plausible_io_20241231.zip")
 "attachment; filename=\"plausible_io_20241231.zip\""
 
-iex> content_disposition("📊.zip")
+iex> content_disposition("📊.zip")
 "attachment; filename=\"plausible-export.zip\"; filename*=utf-8''%F0%9F%93%8A.zip"
@@ -726,14 +726,14 @@ tables into the format of imported_* tables for a we -

Creates a streamable Zip archive from the provided (named) Ecto queries.

Example usage:

{:ok, pool} = Ch.start_link(pool_size: 1)
+

Creates a streamable Zip archive from the provided (named) Ecto queries.

Example usage:

{:ok, pool} = Ch.start_link(pool_size: 1)
 
-DBConnection.run(pool, fn conn ->
+DBConnection.run(pool, fn conn ->
   conn
-  |> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames")
-  |> Stream.into(File.stream!("export.zip"))
-  |> Stream.run()
-end)
+
|> stream_archive(export_queries(_site_id = 1), format: "CSVWithNames") + |> Stream.into(File.stream!("export.zip")) + |> Stream.run() +end)
diff --git a/Plausible.Factory.html b/Plausible.Factory.html index 94500c23e3..ba6eba2098 100644 --- a/Plausible.Factory.html +++ b/Plausible.Factory.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.File.html b/Plausible.File.html index 4bc6d1ab0f..7a55352839 100644 --- a/Plausible.File.html +++ b/Plausible.File.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Funnel.Const.html b/Plausible.Funnel.Const.html index 7c3d427bf1..392ac69e37 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 04c53f5d3d..bf07a9101e 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 0a721efef6..b0807251b7 100644 --- a/Plausible.Funnel.html +++ b/Plausible.Funnel.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Funnels.html b/Plausible.Funnels.html index c2547fda24..702e363c4a 100644 --- a/Plausible.Funnels.html +++ b/Plausible.Funnels.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Geo.html b/Plausible.Geo.html index a1f7cc0df0..13cbb1e289 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"
@@ -302,8 +302,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
@@ -332,21 +332,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",
@@ -355,12 +355,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", @@ -369,20 +369,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", @@ -391,13 +391,13 @@ asynchronously.

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

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

+
} + } + ] +}
diff --git a/Plausible.Goal.Revenue.html b/Plausible.Goal.Revenue.html index 6f7fa44299..9c0c469696 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 8d1cef2696..9e012b3a78 100644 --- a/Plausible.Goal.html +++ b/Plausible.Goal.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Goals.html b/Plausible.Goals.html index 27deb88f94..11bb6c4c0c 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 2004fb150f..180a6436e8 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 11bcd4c5f3..59791c9bb9 100644 --- a/Plausible.Google.API.html +++ b/Plausible.Google.API.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Google.GA4.API.html b/Plausible.Google.GA4.API.html index dde03782c6..b5d41f2c8f 100644 --- a/Plausible.Google.GA4.API.html +++ b/Plausible.Google.GA4.API.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Google.GA4.HTTP.html b/Plausible.Google.GA4.HTTP.html index 58a27aed92..45c8deacd6 100644 --- a/Plausible.Google.GA4.HTTP.html +++ b/Plausible.Google.GA4.HTTP.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Google.GA4.ReportRequest.html b/Plausible.Google.GA4.ReportRequest.html index 0110a6068e..d23c792f99 100644 --- a/Plausible.Google.GA4.ReportRequest.html +++ b/Plausible.Google.GA4.ReportRequest.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Google.HTTP.html b/Plausible.Google.HTTP.html index 5ccdfffc50..d5e1fd17b6 100644 --- a/Plausible.Google.HTTP.html +++ b/Plausible.Google.HTTP.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.HTTPClient.Interface.html b/Plausible.HTTPClient.Interface.html index 2d1c7eab2f..f80a5ee055 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 4a14b89e5b..c92b9bbcd1 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 ec1e8f5098..db93679c07 100644 --- a/Plausible.HTTPClient.html +++ b/Plausible.HTTPClient.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.HelpScout.Vault.html b/Plausible.HelpScout.Vault.html index 218fc062a7..921c33e8ed 100644 --- a/Plausible.HelpScout.Vault.html +++ b/Plausible.HelpScout.Vault.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.HelpScout.html b/Plausible.HelpScout.html index de0d48ae4d..52fec1ff22 100644 --- a/Plausible.HelpScout.html +++ b/Plausible.HelpScout.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Helpers.JSON.html b/Plausible.Helpers.JSON.html index 46cfac947f..67a2c3c7a4 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 953ab7507b..86b71374ce 100644 --- a/Plausible.ImportDeletionRepo.html +++ b/Plausible.ImportDeletionRepo.html @@ -14,7 +14,7 @@ - + @@ -1187,23 +1187,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 63b9a72aa9..86fc3db4dc 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 3675c88a06..b5c86a6c33 100644 --- a/Plausible.Imported.CSVImporter.html +++ b/Plausible.Imported.CSVImporter.html @@ -14,7 +14,7 @@ - + @@ -257,13 +257,13 @@ or from local storage for which it uses iex> date_range([ -...> %{"filename" => "imported_devices_20190101_20210101.csv"}, +

Extracts min/max date range from a list of uploads.

Examples:

iex> date_range([
+...>   %{"filename" => "imported_devices_20190101_20210101.csv"},
 ...>   "pages_20200101_20220101.csv"
-...> ])
-Date.range(~D[2019-01-01], ~D[2022-01-01])
+...> ])
+Date.range(~D[2019-01-01], ~D[2022-01-01])
 
-iex> date_range([])
+iex> date_range([])
 nil
@@ -292,13 +292,13 @@ or from local storage for which it uses iex> extract_table("my_data.csv") +

Extracts the table name from the provided filename.

Raises if the filename doesn't conform to the expected format.

Examples:

iex> extract_table("my_data.csv")
 ** (ArgumentError) invalid filename
 
-iex> extract_table("imported_devices_00010101_20250101.csv")
+iex> extract_table("imported_devices_00010101_20250101.csv")
 "imported_devices"
 
-iex> extract_table("devices_00010101_20250101.csv")
+iex> extract_table("devices_00010101_20250101.csv")
 "imported_devices"
@@ -321,8 +321,8 @@ or from local storage for which it uses
-

Returns local directory for CSV imports storage.

Builds upon $DATA_DIR, $PERSISTENT_CACHE_DIR or $DEFAULT_DATA_DIR (if set) and falls back to /tmp.

$DEFAULT_DATA_DIR is set to /var/lib/plausible in container images.

Examples:

iex> local_dir = local_dir(_site_id = 37)
-iex> String.ends_with?(local_dir, "/plausible-imports/37")
+

Returns local directory for CSV imports storage.

Builds upon $DATA_DIR, $PERSISTENT_CACHE_DIR or $DEFAULT_DATA_DIR (if set) and falls back to /tmp.

$DEFAULT_DATA_DIR is set to /var/lib/plausible in container images.

Examples:

iex> local_dir = local_dir(_site_id = 37)
+iex> String.ends_with?(local_dir, "/plausible-imports/37")
 true
@@ -382,14 +382,14 @@ or from local storage for which it uses
iex> parse_filename!("my_data.csv") +

Extracts table name and min/max dates from the filename.

Examples:

iex> parse_filename!("my_data.csv")
 ** (ArgumentError) invalid filename
 
-iex> parse_filename!("imported_devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+iex> parse_filename!("imported_devices_00010101_20250101.csv")
+{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
 
-iex> parse_filename!("devices_00010101_20250101.csv")
-{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
+
iex> parse_filename!("devices_00010101_20250101.csv") +{"imported_devices", ~D[0001-01-01], ~D[2025-01-01]}
@@ -417,13 +417,13 @@ or from local storage for which it uses iex> valid_filename?("my_data.csv") +

Checks if the provided filename conforms to the expected format.

Examples:

iex> valid_filename?("my_data.csv")
 false
 
-iex> valid_filename?("imported_devices_00010101_20250101.csv")
+iex> valid_filename?("imported_devices_00010101_20250101.csv")
 true
 
-iex> valid_filename?("devices_00010101_20250101.csv")
+iex> valid_filename?("devices_00010101_20250101.csv")
 true
diff --git a/Plausible.Imported.GoogleAnalytics4.html b/Plausible.Imported.GoogleAnalytics4.html index bd760cfb67..ad2ef74281 100644 --- a/Plausible.Imported.GoogleAnalytics4.html +++ b/Plausible.Imported.GoogleAnalytics4.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Imported.ImportSources.html b/Plausible.Imported.ImportSources.html index 0f485b09cc..b9403a59dd 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 4afb61fa45..c18f31e897 100644 --- a/Plausible.Imported.Importer.html +++ b/Plausible.Imported.Importer.html @@ -14,7 +14,7 @@ - + @@ -183,30 +183,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, %{"event" => "complete", "import_id" => ^import_id}} ->
-    IO.puts("Job completed")
+receive do
+  {:notification, :analytics_imports_jobs, %{"event" => "complete", "import_id" => ^import_id}} ->
+    IO.puts("Job completed")
 
-  {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
-    IO.puts("Job failed transiently")
+  {:notification, :analytics_imports_jobs, %{"event" => "transient_fail", "import_id" => ^import_id}} ->
+    IO.puts("Job failed transiently")
 
-  {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^import_id}} ->
-    IO.puts("Job failed permanently")
-after
+  {:notification, :analytics_imports_jobs, %{"event" => "fail", "import_id" => ^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.

diff --git a/Plausible.Imported.NoopImporter.html b/Plausible.Imported.NoopImporter.html index 1c06d9713d..c6b0e6895e 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 f6b4ad5d91..3390af683f 100644 --- a/Plausible.Imported.SiteImport.html +++ b/Plausible.Imported.SiteImport.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Imported.UniversalAnalytics.html b/Plausible.Imported.UniversalAnalytics.html index 3a43097cfa..9441edad03 100644 --- a/Plausible.Imported.UniversalAnalytics.html +++ b/Plausible.Imported.UniversalAnalytics.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Imported.html b/Plausible.Imported.html index 3beddd68db..66c07450f8 100644 --- a/Plausible.Imported.html +++ b/Plausible.Imported.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.IngestRepo.html b/Plausible.IngestRepo.html index 290d975405..70e3c006b0 100644 --- a/Plausible.IngestRepo.html +++ b/Plausible.IngestRepo.html @@ -14,7 +14,7 @@ - + @@ -1225,23 +1225,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.Acquisition.html b/Plausible.Ingestion.Acquisition.html index 1d71521950..e4199852c8 100644 --- a/Plausible.Ingestion.Acquisition.html +++ b/Plausible.Ingestion.Acquisition.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ingestion.Counters.Buffer.html b/Plausible.Ingestion.Counters.Buffer.html index e0a01c58d3..1b41faf396 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 552b36207e..1b7553d9de 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 42309ce2e4..435e80fa41 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 2b57d67379..5457856f40 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 5887591b2e..e7aa08dcfb 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 81db22868a..f8065b4451 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 42569b66d9..0d71395db6 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 cb0e9a9d5f..56e519dcb3 100644 --- a/Plausible.Ingestion.Request.html +++ b/Plausible.Ingestion.Request.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Ingestion.Source.html b/Plausible.Ingestion.Source.html index 016a80dbc1..3caec9c888 100644 --- a/Plausible.Ingestion.Source.html +++ b/Plausible.Ingestion.Source.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.License.html b/Plausible.License.html index e308d8fad6..e17df865a2 100644 --- a/Plausible.License.html +++ b/Plausible.License.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.LiveViewTest.html b/Plausible.LiveViewTest.html index 127af0cddc..bca91cc4cd 100644 --- a/Plausible.LiveViewTest.html +++ b/Plausible.LiveViewTest.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Mailer.html b/Plausible.Mailer.html index e7f21e3b55..75d5005f53 100644 --- a/Plausible.Mailer.html +++ b/Plausible.Mailer.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.MigrationUtils.html b/Plausible.MigrationUtils.html index c056a0301e..af4764ee36 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 c81f82c804..448ff10ce2 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 294b45fcc9..dce75bb85a 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 aefda3f230..8a4f76c1dc 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 807abd788c..32eb51a4c1 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 b6d4c5e324..d51b00e605 100644 --- a/Plausible.Plugins.API.CustomProps.html +++ b/Plausible.Plugins.API.CustomProps.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Plugins.API.Funnels.html b/Plausible.Plugins.API.Funnels.html index cd0a67ceb9..26d5401ea4 100644 --- a/Plausible.Plugins.API.Funnels.html +++ b/Plausible.Plugins.API.Funnels.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Plugins.API.Goals.html b/Plausible.Plugins.API.Goals.html index 74ddda5776..78af240a14 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 44b4c6a581..c05cb02e8c 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 e15bc8969f..9ac5556eef 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 1ad968072d..4086fc6202 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 a8f948ceea..36b2d077e0 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 2e346f7d71..5f1dc67156 100644 --- a/Plausible.PromEx.html +++ b/Plausible.PromEx.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Props.html b/Plausible.Props.html index 8b1054c361..042b3486e8 100644 --- a/Plausible.Props.html +++ b/Plausible.Props.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Purge.html b/Plausible.Purge.html index b21e15e45a..5227922c02 100644 --- a/Plausible.Purge.html +++ b/Plausible.Purge.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.RateLimit.html b/Plausible.RateLimit.html index 2a4c79dc07..2689d03eb3 100644 --- a/Plausible.RateLimit.html +++ b/Plausible.RateLimit.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Release.html b/Plausible.Release.html index 6e19931bed..3722fc8f00 100644 --- a/Plausible.Release.html +++ b/Plausible.Release.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Repo.html b/Plausible.Repo.html index 11472f7468..eb791c66c9 100644 --- a/Plausible.Repo.html +++ b/Plausible.Repo.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.RequestLogger.html b/Plausible.RequestLogger.html index 1503163645..69b11c9d99 100644 --- a/Plausible.RequestLogger.html +++ b/Plausible.RequestLogger.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.S3.html b/Plausible.S3.html index fb378b7af3..7f81b3fa39 100644 --- a/Plausible.S3.html +++ b/Plausible.S3.html @@ -14,7 +14,7 @@ - + @@ -316,7 +316,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.

In

Returns the pre-configured S3 bucket for CSV exports.

config :plausible, Plausible.S3,
-  exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")

Example:

iex> exports_bucket()
+  exports_bucket: System.fetch_env!("S3_EXPORTS_BUCKET")

Example:

iex> exports_bucket()
 "test-exports"
@@ -348,8 +348,8 @@ The URL expires in 300 seconds, which should be enough for a redirect.

In -

Returns access_key_id and secret_access_key to be used by ClickHouse during imports from S3.

Example:

iex> import_clickhouse_credentials()
-%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
+

Returns access_key_id and secret_access_key to be used by ClickHouse during imports from S3.

Example:

iex> import_clickhouse_credentials()
+%{access_key_id: "minioadmin", secret_access_key: "minioadmin"}
@@ -371,9 +371,9 @@ The URL expires in 300 seconds, which should be enough for a redirect.

In

-

Presigns an upload for an imported file.

In the current implementation the bucket always goes into the path component.

Example:

iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
-iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
-iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
+

Presigns an upload for an imported file.

In the current implementation the bucket always goes into the path component.

Example:

iex> upload = import_presign_upload(_site_id = 123, _filename = "imported_browsers.csv")
+iex> true = String.ends_with?(upload.s3_url, "/test-imports/123/imported_browsers.csv")
+iex> true = String.contains?(upload.presigned_url, "/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&")
@@ -402,7 +402,7 @@ The URL expires in 300 seconds, which should be enough for a redirect.

In

Returns the pre-configured S3 bucket for CSV imports.

config :plausible, Plausible.S3,
-  imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")

Example:

iex> imports_bucket()
+  imports_bucket: System.fetch_env!("S3_IMPORTS_BUCKET")

Example:

iex> imports_bucket()
 "test-imports"
diff --git a/Plausible.Sentry.Client.html b/Plausible.Sentry.Client.html index fc8c5e2f94..13106f4123 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 0bebbc90f0..9d835da805 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 81a3439822..08611b8932 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 cb0c686d13..7061a2f9ad 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 52cc58f615..ed79b8762b 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 3d4fb405dc..c45aed1db6 100644 --- a/Plausible.Shield.CountryRuleCache.html +++ b/Plausible.Shield.CountryRuleCache.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shield.HostnameRule.html b/Plausible.Shield.HostnameRule.html index 9c768b08c2..3ec7711128 100644 --- a/Plausible.Shield.HostnameRule.html +++ b/Plausible.Shield.HostnameRule.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shield.HostnameRuleCache.html b/Plausible.Shield.HostnameRuleCache.html index 56f6278c91..c179752758 100644 --- a/Plausible.Shield.HostnameRuleCache.html +++ b/Plausible.Shield.HostnameRuleCache.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shield.IPRule.html b/Plausible.Shield.IPRule.html index 1362751c8b..117bcb15d6 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 4999d37e6c..289b71db94 100644 --- a/Plausible.Shield.IPRuleCache.html +++ b/Plausible.Shield.IPRuleCache.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shield.PageRule.html b/Plausible.Shield.PageRule.html index 20d7c18cfa..b227beccf0 100644 --- a/Plausible.Shield.PageRule.html +++ b/Plausible.Shield.PageRule.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shield.PageRuleCache.html b/Plausible.Shield.PageRuleCache.html index cba3abeccc..91f0e30838 100644 --- a/Plausible.Shield.PageRuleCache.html +++ b/Plausible.Shield.PageRuleCache.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Shields.html b/Plausible.Shields.html index 380dd46080..8475137051 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 843a117aca..785061a0df 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 3c7df44ece..5da937b8cb 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 9f4cb43a63..96b70aee3d 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 448f33cf49..81d319e5be 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 c335a1ed7a..197ddcec47 100644 --- a/Plausible.Site.ImportedData.html +++ b/Plausible.Site.ImportedData.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.InstallationMeta.html b/Plausible.Site.InstallationMeta.html index 50e7ad1308..77f871584f 100644 --- a/Plausible.Site.InstallationMeta.html +++ b/Plausible.Site.InstallationMeta.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.Membership.html b/Plausible.Site.Membership.html index f6b563c57a..94fcc9e6fa 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 18d40d5db6..0776880ade 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 da559e588b..bad866dbf6 100644 --- a/Plausible.Site.Memberships.CreateInvitation.html +++ b/Plausible.Site.Memberships.CreateInvitation.html @@ -14,7 +14,7 @@ - + @@ -224,7 +224,7 @@ this invitation.

invite_error()

- + View Source @@ -272,7 +272,7 @@ this invitation.

bulk_create_invitation(sites, inviter, invitee_email, role, opts \\ [])

- + View Source @@ -306,7 +306,7 @@ this invitation.

bulk_transfer_ownership_direct(sites, new_owner)

- + View Source @@ -337,7 +337,7 @@ this invitation.

create_invitation(site, inviter, invitee_email, role)

- + View Source diff --git a/Plausible.Site.Memberships.RejectInvitation.html b/Plausible.Site.Memberships.RejectInvitation.html index e1588271a8..f80b363017 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 b4a5035f84..3a4cc3d790 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 79b0239faf..ef7539fc1f 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 6954155f62..9749744ba9 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 52658c1eaa..5115c37663 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 e7f405a090..311f81e22f 100644 --- a/Plausible.Site.SharedLink.html +++ b/Plausible.Site.SharedLink.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.TrafficChangeNotification.html b/Plausible.Site.TrafficChangeNotification.html index 889e1798ce..5680a4b4c8 100644 --- a/Plausible.Site.TrafficChangeNotification.html +++ b/Plausible.Site.TrafficChangeNotification.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Site.UserPreference.html b/Plausible.Site.UserPreference.html index 8ed0e5282f..d4fab0d653 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 3b1b9c711e..3db84eedcd 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 45a30e7bb0..ddb85a8f84 100644 --- a/Plausible.Site.html +++ b/Plausible.Site.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.SiteAdmin.html b/Plausible.SiteAdmin.html index f2b75293df..cecc8428f7 100644 --- a/Plausible.SiteAdmin.html +++ b/Plausible.SiteAdmin.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Sites.html b/Plausible.Sites.html index 889ec331e1..0e0e482df3 100644 --- a/Plausible.Sites.html +++ b/Plausible.Sites.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Aggregate.html b/Plausible.Stats.Aggregate.html index c9c47b91ca..af689e8197 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 e8115ec6ca..52b461b0b7 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 34a22cb9a3..81c588979e 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 589f8a8646..cd1d811ebc 100644 --- a/Plausible.Stats.Clickhouse.html +++ b/Plausible.Stats.Clickhouse.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Compare.html b/Plausible.Stats.Compare.html index 8a101ecd1c..d9fa994cac 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 9831d5ddff..851926c3c9 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 06b1e45ac2..e04095ab2e 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 f9de34dbe7..749baf6845 100644 --- a/Plausible.Stats.CustomProps.html +++ b/Plausible.Stats.CustomProps.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.DateTimeRange.html b/Plausible.Stats.DateTimeRange.html index 827b4199f5..840a3c9e5a 100644 --- a/Plausible.Stats.DateTimeRange.html +++ b/Plausible.Stats.DateTimeRange.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.EmailReport.html b/Plausible.Stats.EmailReport.html index 4655fd2a38..d108048981 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 09ea07ebd0..ced6a987bd 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 de9a6e1453..b50c866239 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 101bc3d0e6..d911f9d3b3 100644 --- a/Plausible.Stats.Filters.html +++ b/Plausible.Stats.Filters.html @@ -14,7 +14,7 @@ - + @@ -396,14 +396,14 @@ does not handle AND/OR/NOT!

Examples: -
iex> Filters.parse("{\"page\":\"/blog/**\"}")
-[[:matches_wildcard, "event:page", ["/blog/**"]]]
+
iex> Filters.parse("{\"page\":\"/blog/**\"}")
+[[:matches_wildcard, "event:page", ["/blog/**"]]]
 
-iex> Filters.parse("visit:browser!=Chrome")
-[[:is_not, "visit:browser", ["Chrome"]]]
+iex> Filters.parse("visit:browser!=Chrome")
+[[:is_not, "visit:browser", ["Chrome"]]]
 
-iex> Filters.parse(nil)
-[]
+
iex> Filters.parse(nil) +[]
diff --git a/Plausible.Stats.Funnel.html b/Plausible.Stats.Funnel.html index 4d3a28d461..a859291e8c 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 8a6fadc8fd..77ef9c1710 100644 --- a/Plausible.Stats.Goal.Revenue.html +++ b/Plausible.Stats.Goal.Revenue.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Imported.Base.html b/Plausible.Stats.Imported.Base.html index 54e6ff232f..9588109e54 100644 --- a/Plausible.Stats.Imported.Base.html +++ b/Plausible.Stats.Imported.Base.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Imported.SQL.Expression.html b/Plausible.Stats.Imported.SQL.Expression.html index 60900470a1..133deab26d 100644 --- a/Plausible.Stats.Imported.SQL.Expression.html +++ b/Plausible.Stats.Imported.SQL.Expression.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Imported.SQL.WhereBuilder.html b/Plausible.Stats.Imported.SQL.WhereBuilder.html index d5592bfe63..69e73a6622 100644 --- a/Plausible.Stats.Imported.SQL.WhereBuilder.html +++ b/Plausible.Stats.Imported.SQL.WhereBuilder.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Imported.html b/Plausible.Stats.Imported.html index 61fe826dc7..2196436dd3 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 d00019dc63..d6b3dc7c5f 100644 --- a/Plausible.Stats.Interval.html +++ b/Plausible.Stats.Interval.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.JSONSchema.Utils.html b/Plausible.Stats.JSONSchema.Utils.html index 85e02fa0f1..f1601dcc9a 100644 --- a/Plausible.Stats.JSONSchema.Utils.html +++ b/Plausible.Stats.JSONSchema.Utils.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.JSONSchema.html b/Plausible.Stats.JSONSchema.html index d52af5b9f7..450d579644 100644 --- a/Plausible.Stats.JSONSchema.html +++ b/Plausible.Stats.JSONSchema.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Legacy.Dimensions.html b/Plausible.Stats.Legacy.Dimensions.html index af3e9bc4db..a75f1ef42d 100644 --- a/Plausible.Stats.Legacy.Dimensions.html +++ b/Plausible.Stats.Legacy.Dimensions.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Legacy.QueryBuilder.html b/Plausible.Stats.Legacy.QueryBuilder.html index 93e8b1a7b4..1df1660669 100644 --- a/Plausible.Stats.Legacy.QueryBuilder.html +++ b/Plausible.Stats.Legacy.QueryBuilder.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Legacy.TimeOnPage.html b/Plausible.Stats.Legacy.TimeOnPage.html index f1e53cfd91..2df09b478b 100644 --- a/Plausible.Stats.Legacy.TimeOnPage.html +++ b/Plausible.Stats.Legacy.TimeOnPage.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Metrics.html b/Plausible.Stats.Metrics.html index bdc00d1cb9..41ff645e47 100644 --- a/Plausible.Stats.Metrics.html +++ b/Plausible.Stats.Metrics.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Query.html b/Plausible.Stats.Query.html index a8e68e99b0..83d11f608d 100644 --- a/Plausible.Stats.Query.html +++ b/Plausible.Stats.Query.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.QueryOptimizer.html b/Plausible.Stats.QueryOptimizer.html index e286d190f0..cc78bb6217 100644 --- a/Plausible.Stats.QueryOptimizer.html +++ b/Plausible.Stats.QueryOptimizer.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.QueryResult.html b/Plausible.Stats.QueryResult.html index a5e0bf2f93..f3f35660ff 100644 --- a/Plausible.Stats.QueryResult.html +++ b/Plausible.Stats.QueryResult.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.QueryRunner.html b/Plausible.Stats.QueryRunner.html index d9f55ac925..e6a6397ec0 100644 --- a/Plausible.Stats.QueryRunner.html +++ b/Plausible.Stats.QueryRunner.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.SQL.Expression.html b/Plausible.Stats.SQL.Expression.html index d95a7e8f5f..847b46d125 100644 --- a/Plausible.Stats.SQL.Expression.html +++ b/Plausible.Stats.SQL.Expression.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.SQL.Fragments.html b/Plausible.Stats.SQL.Fragments.html index 06ead1713f..8e9e8251b0 100644 --- a/Plausible.Stats.SQL.Fragments.html +++ b/Plausible.Stats.SQL.Fragments.html @@ -14,7 +14,7 @@ - + @@ -668,12 +668,12 @@ boundary, not_before is returned.

not_before boundary is set to the past Saturday, which is before the weekstart, therefore the cap does not apply.

  > this_wednesday = ~D[2022-11-09]
   > past_saturday = ~D[2022-11-05]
-  > weekstart_not_before(this_wednesday, past_saturday)
+  > weekstart_not_before(this_wednesday, past_saturday)
   ~D[2022-11-07]

In this other example, the fragment returns Tuesday and not the weekstart. The not_before boundary is set to Tuesday, which is past the weekstart, therefore the cap applies.

  > this_wednesday = ~D[2022-11-09]
   > this_tuesday = ~D[2022-11-08]
-  > weekstart_not_before(this_wednesday, this_tuesday)
+  > weekstart_not_before(this_wednesday, this_tuesday)
   ~D[2022-11-08]

diff --git a/Plausible.Stats.SQL.SpecialMetrics.html b/Plausible.Stats.SQL.SpecialMetrics.html index a0833e0347..38fac36727 100644 --- a/Plausible.Stats.SQL.SpecialMetrics.html +++ b/Plausible.Stats.SQL.SpecialMetrics.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.SQL.WhereBuilder.html b/Plausible.Stats.SQL.WhereBuilder.html index b12a0f028c..ca2466f816 100644 --- a/Plausible.Stats.SQL.WhereBuilder.html +++ b/Plausible.Stats.SQL.WhereBuilder.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Sampling.html b/Plausible.Stats.Sampling.html index 3405d55417..448533f970 100644 --- a/Plausible.Stats.Sampling.html +++ b/Plausible.Stats.Sampling.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.TableDecider.html b/Plausible.Stats.TableDecider.html index 5b079693d8..dbfe0dab60 100644 --- a/Plausible.Stats.TableDecider.html +++ b/Plausible.Stats.TableDecider.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Time.html b/Plausible.Stats.Time.html index ac6c001ca4..ce02310e3c 100644 --- a/Plausible.Stats.Time.html +++ b/Plausible.Stats.Time.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Stats.Timeseries.html b/Plausible.Stats.Timeseries.html index 97cb29b273..624c254c38 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 9402cc2c51..6ac1f934c7 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 48b618bd21..2a51f4ba64 100644 --- a/Plausible.Stats.html +++ b/Plausible.Stats.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.Adapter.Read.Billing.html b/Plausible.Teams.Adapter.Read.Billing.html index beb2b8f356..72e8c70133 100644 --- a/Plausible.Teams.Adapter.Read.Billing.html +++ b/Plausible.Teams.Adapter.Read.Billing.html @@ -14,7 +14,7 @@ - + @@ -167,6 +167,14 @@ Pages + +
change_plan(user, new_plan_id) @@ -255,6 +263,14 @@ Pages
+ +
site_limit(user) @@ -317,7 +333,29 @@ Pages

active_subscription_for(user)

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

allow_next_upgrade_override?(user)

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

change_plan(user, new_plan_id)

- + View Source @@ -361,7 +399,7 @@ Pages

check_feature_availability(feature, user)

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

check_feature_availability_for_stats_api(user)

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

check_needs_to_upgrade(user)

- + View Source @@ -427,7 +465,7 @@ Pages

ensure_can_add_new_site(user)

- + View Source @@ -449,7 +487,7 @@ Pages

enterprise_configured?(user)

- + View Source @@ -471,7 +509,7 @@ Pages

get_subscription(user)

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

has_active_subscription?(user)

- + View Source @@ -515,7 +553,7 @@ Pages

latest_enterprise_plan_with_prices(user, customer_ip)

- + View Source @@ -537,7 +575,7 @@ Pages

monthly_pageview_limit(user)

- + View Source @@ -561,7 +599,31 @@ Pages

monthly_pageview_usage(user, site_ids \\ nil)

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

quota_usage(user, opts \\ [])

+ + View Source @@ -583,7 +645,7 @@ Pages

site_limit(user)

- + View Source @@ -605,7 +667,7 @@ Pages

site_usage(user)

- + View Source @@ -627,7 +689,7 @@ Pages

suggest_by_usage(user, usage_during_cycle)

- + View Source @@ -649,7 +711,7 @@ Pages

team_member_limit(user)

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

team_member_usage(user, opts \\ [])

- + View Source diff --git a/Plausible.Teams.Adapter.Read.Invitations.html b/Plausible.Teams.Adapter.Read.Invitations.html new file mode 100644 index 0000000000..bc2220801d --- /dev/null +++ b/Plausible.Teams.Adapter.Read.Invitations.html @@ -0,0 +1,361 @@ + + + + + + + + + + + Plausible.Teams.Adapter.Read.Invitations — Plausible v0.0.1 + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ +
+
+ + +

+ + + + View Source + + + Plausible.Teams.Adapter.Read.Invitations + (Plausible v0.0.1) + +

+ + +
+

Transition adapter for new schema reads

+
+ + +
+

+ + + + Summary +

+ + +
+ + +
+

+ + + + Functions +

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

check_invitation_permissions(site, inviter, role, opts)

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

check_team_member_limit(inviter, site, role, invitee_email)

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

ensure_new_membership(inviter, site, invitee, role)

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

ensure_transfer_valid(inviter, site, invitee, role)

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

send_invitation_email(inviter, invitation, invitee)

+ + + + View Source + + + +
+ +
+ + +
+
+ +
+
+ + +
+
+
+
+ + + + + + diff --git a/Plausible.Teams.Adapter.Read.Ownership.html b/Plausible.Teams.Adapter.Read.Ownership.html index a84a63fc57..d940762ec5 100644 --- a/Plausible.Teams.Adapter.Read.Ownership.html +++ b/Plausible.Teams.Adapter.Read.Ownership.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.Adapter.Read.Sites.html b/Plausible.Teams.Adapter.Read.Sites.html index 0806e9323e..4b04427930 100644 --- a/Plausible.Teams.Adapter.Read.Sites.html +++ b/Plausible.Teams.Adapter.Read.Sites.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.Adapter.Read.Teams.html b/Plausible.Teams.Adapter.Read.Teams.html new file mode 100644 index 0000000000..c722b7d736 --- /dev/null +++ b/Plausible.Teams.Adapter.Read.Teams.html @@ -0,0 +1,301 @@ + + + + + + + + + + + Plausible.Teams.Adapter.Read.Teams — Plausible v0.0.1 + + + + + + + + + + + + + + + + +
+ + + +
+ + + +
+ +
+
+ + +

+ + + + View Source + + + Plausible.Teams.Adapter.Read.Teams + (Plausible v0.0.1) + +

+ + +
+

Transition adapter for new schema reads

+
+ + +
+

+ + + + Summary +

+
+

+ Functions +

+ +
+ + +
+ +
+ + +
+ + + +
+ +
+ + +
+

+ + + + Functions +

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

trial_days_left(user)

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

trial_expiry_date(user)

+ + + + View Source + + + +
+ +
+ + +
+
+ +
+
+ + +
+
+
+
+ + + + + + diff --git a/Plausible.Teams.Adapter.html b/Plausible.Teams.Adapter.html index 3558a90aa9..79805e1cfc 100644 --- a/Plausible.Teams.Adapter.html +++ b/Plausible.Teams.Adapter.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.GuestInvitation.html b/Plausible.Teams.GuestInvitation.html index 438feea6d5..6bc0df0fa2 100644 --- a/Plausible.Teams.GuestInvitation.html +++ b/Plausible.Teams.GuestInvitation.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.GuestMembership.html b/Plausible.Teams.GuestMembership.html index d214f46d4e..1bbe23d6b0 100644 --- a/Plausible.Teams.GuestMembership.html +++ b/Plausible.Teams.GuestMembership.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.Invitation.html b/Plausible.Teams.Invitation.html index b94d9580b8..2c318c895c 100644 --- a/Plausible.Teams.Invitation.html +++ b/Plausible.Teams.Invitation.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.Membership.html b/Plausible.Teams.Membership.html index b2f038f583..f2a4b23983 100644 --- a/Plausible.Teams.Membership.html +++ b/Plausible.Teams.Membership.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.SiteTransfer.html b/Plausible.Teams.SiteTransfer.html index 49d02c900c..2a23ede26a 100644 --- a/Plausible.Teams.SiteTransfer.html +++ b/Plausible.Teams.SiteTransfer.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.Team.html b/Plausible.Teams.Team.html index 5f04dd9f23..07078824dd 100644 --- a/Plausible.Teams.Team.html +++ b/Plausible.Teams.Team.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.Test.html b/Plausible.Teams.Test.html index 3c7301c454..a96aecb5c0 100644 --- a/Plausible.Teams.Test.html +++ b/Plausible.Teams.Test.html @@ -14,7 +14,7 @@ - + @@ -333,7 +333,7 @@ Pages

assert_guest_invitation(team, site, email, role)

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

assert_guest_membership(team, site, user, role)

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

assert_team_attached(site, team_id \\ nil)

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

assert_team_exists(user, team_id \\ nil)

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

assert_team_membership(user, team, role \\ :owner)

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

invite_guest(site, invitee_or_email, args \\ [])

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

invite_transfer(site, invitee, args \\ [])

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

revoke_membership(site, user)

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

subscribe_to_business_plan(user)

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

subscribe_to_enterprise_plan(user, attrs \\ [])

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

subscribe_to_growth_plan(user)

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

subscribe_to_plan(user, paddle_plan_id, attrs \\ [])

- + View Source diff --git a/Plausible.Teams.Users.html b/Plausible.Teams.Users.html index 267e1d5fad..d2a986d875 100644 --- a/Plausible.Teams.Users.html +++ b/Plausible.Teams.Users.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Teams.html b/Plausible.Teams.html index 35079bee24..03be6fedc1 100644 --- a/Plausible.Teams.html +++ b/Plausible.Teams.html @@ -14,7 +14,7 @@ - + @@ -281,7 +281,7 @@ Pages

get_by_owner(user)

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

get_or_create(user)

- + View Source @@ -328,7 +328,7 @@ is returned.

last_subscription_join_query()

- + View Source @@ -350,7 +350,7 @@ is returned.

last_subscription_query()

- + View Source @@ -372,7 +372,7 @@ is returned.

load_for_site(site)

- + View Source @@ -422,7 +422,7 @@ is returned.

owned_sites(team)

- + View Source @@ -444,7 +444,7 @@ is returned.

owned_sites_ids(team)

- + View Source @@ -466,7 +466,7 @@ is returned.

read_team_schemas?(user)

- + View Source @@ -488,7 +488,7 @@ is returned.

sync_team(user)

- + View Source @@ -510,7 +510,7 @@ is returned.

trial_days_left(team)

- + View Source @@ -538,7 +538,7 @@ is returned.

with_subscription(team)

- + View Source diff --git a/Plausible.Test.Support.HTML.html b/Plausible.Test.Support.HTML.html index 045be72af8..cae961047b 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 4b940d5a38..df860230b6 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 385a69a38a..a3cd1dbedf 100644 --- a/Plausible.TestUtils.html +++ b/Plausible.TestUtils.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Themes.html b/Plausible.Themes.html index 76ad463d24..fb13de2062 100644 --- a/Plausible.Themes.html +++ b/Plausible.Themes.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Timezones.html b/Plausible.Timezones.html index c4a4417e4d..45dbe34481 100644 --- a/Plausible.Timezones.html +++ b/Plausible.Timezones.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Users.html b/Plausible.Users.html index 58ed252717..da792f85f4 100644 --- a/Plausible.Users.html +++ b/Plausible.Users.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Check.html b/Plausible.Verification.Check.html index c15da731ec..04f46dd433 100644 --- a/Plausible.Verification.Check.html +++ b/Plausible.Verification.Check.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Checks.CSP.html b/Plausible.Verification.Checks.CSP.html index d01739482c..f10cddcad3 100644 --- a/Plausible.Verification.Checks.CSP.html +++ b/Plausible.Verification.Checks.CSP.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Checks.FetchBody.html b/Plausible.Verification.Checks.FetchBody.html index 235f126b2d..4fe2a3915e 100644 --- a/Plausible.Verification.Checks.FetchBody.html +++ b/Plausible.Verification.Checks.FetchBody.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Checks.Installation.html b/Plausible.Verification.Checks.Installation.html index 083a2bac67..7bb0aebda1 100644 --- a/Plausible.Verification.Checks.Installation.html +++ b/Plausible.Verification.Checks.Installation.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Checks.ScanBody.html b/Plausible.Verification.Checks.ScanBody.html index a99dda0e33..6c03f34026 100644 --- a/Plausible.Verification.Checks.ScanBody.html +++ b/Plausible.Verification.Checks.ScanBody.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Checks.Snippet.html b/Plausible.Verification.Checks.Snippet.html index af5bb1b768..e19a6d7afc 100644 --- a/Plausible.Verification.Checks.Snippet.html +++ b/Plausible.Verification.Checks.Snippet.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Checks.SnippetCacheBust.html b/Plausible.Verification.Checks.SnippetCacheBust.html index e64e22c74f..7b36762f3d 100644 --- a/Plausible.Verification.Checks.SnippetCacheBust.html +++ b/Plausible.Verification.Checks.SnippetCacheBust.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Checks.html b/Plausible.Verification.Checks.html index 5f96fdd827..d690adac66 100644 --- a/Plausible.Verification.Checks.html +++ b/Plausible.Verification.Checks.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Diagnostics.Result.html b/Plausible.Verification.Diagnostics.Result.html index ce5fd65b63..3ccbc74e75 100644 --- a/Plausible.Verification.Diagnostics.Result.html +++ b/Plausible.Verification.Diagnostics.Result.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Diagnostics.html b/Plausible.Verification.Diagnostics.html index a80bcfc20b..d165a6ac0e 100644 --- a/Plausible.Verification.Diagnostics.html +++ b/Plausible.Verification.Diagnostics.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.Errors.html b/Plausible.Verification.Errors.html index 03e88751d5..c7ef8d0e11 100644 --- a/Plausible.Verification.Errors.html +++ b/Plausible.Verification.Errors.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.State.html b/Plausible.Verification.State.html index cff6f8a1d5..838bca1a1a 100644 --- a/Plausible.Verification.State.html +++ b/Plausible.Verification.State.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.URL.html b/Plausible.Verification.URL.html index d2bfe8715d..919386cb5e 100644 --- a/Plausible.Verification.URL.html +++ b/Plausible.Verification.URL.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Verification.html b/Plausible.Verification.html index 7072b46216..71fb0def6f 100644 --- a/Plausible.Verification.html +++ b/Plausible.Verification.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.AcceptTrafficUntil.html b/Plausible.Workers.AcceptTrafficUntil.html index 66b3a257cf..341e6b7d91 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 cc5775f131..21ca24fb64 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 a8fb10989e..19187113bd 100644 --- a/Plausible.Workers.CleanInvitations.html +++ b/Plausible.Workers.CleanInvitations.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.CleanUserSessions.html b/Plausible.Workers.CleanUserSessions.html index 30dbc67554..61c9fa29a4 100644 --- a/Plausible.Workers.CleanUserSessions.html +++ b/Plausible.Workers.CleanUserSessions.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.ClickhouseCleanSites.html b/Plausible.Workers.ClickhouseCleanSites.html index 341da914b7..8b9880dca3 100644 --- a/Plausible.Workers.ClickhouseCleanSites.html +++ b/Plausible.Workers.ClickhouseCleanSites.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.ExpireDomainChangeTransitions.html b/Plausible.Workers.ExpireDomainChangeTransitions.html index a0b1a1f26d..138b5bb5b1 100644 --- a/Plausible.Workers.ExpireDomainChangeTransitions.html +++ b/Plausible.Workers.ExpireDomainChangeTransitions.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.ExportAnalytics.html b/Plausible.Workers.ExportAnalytics.html index 2ddf173438..86d9dff181 100644 --- a/Plausible.Workers.ExportAnalytics.html +++ b/Plausible.Workers.ExportAnalytics.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.ImportAnalytics.html b/Plausible.Workers.ImportAnalytics.html index 93e5e9f6fd..e242ed8e27 100644 --- a/Plausible.Workers.ImportAnalytics.html +++ b/Plausible.Workers.ImportAnalytics.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.LocalImportAnalyticsCleaner.html b/Plausible.Workers.LocalImportAnalyticsCleaner.html index 1111c0b0e2..d58019e1e8 100644 --- a/Plausible.Workers.LocalImportAnalyticsCleaner.html +++ b/Plausible.Workers.LocalImportAnalyticsCleaner.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.LockSites.html b/Plausible.Workers.LockSites.html index 286499787f..f97d009de0 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 33c3f5de35..913131a01b 100644 --- a/Plausible.Workers.NotifyAnnualRenewal.html +++ b/Plausible.Workers.NotifyAnnualRenewal.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.NotifyExportedAnalytics.html b/Plausible.Workers.NotifyExportedAnalytics.html index 603e90e38d..5d6dad7962 100644 --- a/Plausible.Workers.NotifyExportedAnalytics.html +++ b/Plausible.Workers.NotifyExportedAnalytics.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.RotateSalts.html b/Plausible.Workers.RotateSalts.html index 98cad4e859..7f2169a2ed 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 b9c98007f9..7cf1430185 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 d228fb83e1..e16f57331b 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 ede964d03f..6e253b7003 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 57439a9ac0..cb6d73e443 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 78f94b3507..d9ef82ee9f 100644 --- a/Plausible.Workers.SendTrialNotifications.html +++ b/Plausible.Workers.SendTrialNotifications.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.Workers.TrafficChangeNotifier.html b/Plausible.Workers.TrafficChangeNotifier.html index 829d807500..6d6b684397 100644 --- a/Plausible.Workers.TrafficChangeNotifier.html +++ b/Plausible.Workers.TrafficChangeNotifier.html @@ -14,7 +14,7 @@ - + diff --git a/Plausible.epub b/Plausible.epub index 5353ee8440211b8c865f7511b6f587372d324ae8..b9a31de47b95e83fc9cd89d2da1c9a33dc9f9a47 100644 GIT binary patch delta 169141 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

oZFc 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

&}>m_-YQF*pQDWnlYh5q#xeWmM6pW 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%0A07m5O^A*bP3qD4>lg^iAZ9BC~SIs|U8x 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≺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 diff --git a/Plausible.html b/Plausible.html index c268f02ec0..ef7c8895d8 100644 --- a/Plausible.html +++ b/Plausible.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AdminController.html b/PlausibleWeb.AdminController.html index f251079934..735a53925f 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 89b002aa1d..72f8836398 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 d09b332120..f6cb9b9f5b 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 2f15299925..e7bbc01709 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 501d41ed06..49ff3e8628 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 093ea8df2b..2c3ecc6fa5 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 cd4d16d396..1cc990c7f2 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 b7aa3264ad..5890556cb2 100644 --- a/PlausibleWeb.Api.StatsController.html +++ b/PlausibleWeb.Api.StatsController.html @@ -14,7 +14,7 @@ - + @@ -811,13 +811,13 @@ and month. The default depends on the Plausible.Query.from/2 for each default.

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

  • Full example:

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

    Full example:

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

    +}

    @@ -832,20 +832,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
    -  },
    +  },
       "imports_exist" => false,
       "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,
       "includes_imported" => false
    -}
    +
    }

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

  • diff --git a/PlausibleWeb.AuthController.html b/PlausibleWeb.AuthController.html index 7e69287823..9090157e2b 100644 --- a/PlausibleWeb.AuthController.html +++ b/PlausibleWeb.AuthController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AuthPlug.html b/PlausibleWeb.AuthPlug.html index 0f8f0b2389..388ce01d01 100644 --- a/PlausibleWeb.AuthPlug.html +++ b/PlausibleWeb.AuthPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AuthView.html b/PlausibleWeb.AuthView.html index 1bfc55136a..c038f60c91 100644 --- a/PlausibleWeb.AuthView.html +++ b/PlausibleWeb.AuthView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.AvatarController.html b/PlausibleWeb.AvatarController.html index 3ad326c0fc..1869d4dae9 100644 --- a/PlausibleWeb.AvatarController.html +++ b/PlausibleWeb.AvatarController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.BillingController.html b/PlausibleWeb.BillingController.html index 53fd013b03..343cdf1376 100644 --- a/PlausibleWeb.BillingController.html +++ b/PlausibleWeb.BillingController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.BillingView.html b/PlausibleWeb.BillingView.html index 302fe56ea9..1ed72a1e2e 100644 --- a/PlausibleWeb.BillingView.html +++ b/PlausibleWeb.BillingView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Captcha.html b/PlausibleWeb.Captcha.html index a3592835fc..4b77c0eeb0 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 7d6120d9dd..66a63c7eb1 100644 --- a/PlausibleWeb.Components.Billing.PlanBenefits.html +++ b/PlausibleWeb.Components.Billing.PlanBenefits.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Components.FirstDashboardLaunchBanner.html b/PlausibleWeb.Components.FirstDashboardLaunchBanner.html index 3a433e5128..74e0c3d596 100644 --- a/PlausibleWeb.Components.FirstDashboardLaunchBanner.html +++ b/PlausibleWeb.Components.FirstDashboardLaunchBanner.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Components.FlowProgress.html b/PlausibleWeb.Components.FlowProgress.html index 96acb6a25d..b713a56936 100644 --- a/PlausibleWeb.Components.FlowProgress.html +++ b/PlausibleWeb.Components.FlowProgress.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Components.Generic.html b/PlausibleWeb.Components.Generic.html index 9673ae1758..4344805393 100644 --- a/PlausibleWeb.Components.Generic.html +++ b/PlausibleWeb.Components.Generic.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Components.Google.html b/PlausibleWeb.Components.Google.html index 57ec3fdda1..9a92b1fd47 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 4b34fdab2c..d81b703908 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 38de0ca248..5bdcb951fe 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 b5ba19e133..6b99265392 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 5f83d34753..c9bc4c96ae 100644 --- a/PlausibleWeb.ConnCase.html +++ b/PlausibleWeb.ConnCase.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.ControllerHelpers.html b/PlausibleWeb.ControllerHelpers.html index 4ea61824fa..6fc90ca3b1 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 4d694ce0aa..9c20d94a0c 100644 --- a/PlausibleWeb.Controllers.API.Revenue.html +++ b/PlausibleWeb.Controllers.API.Revenue.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.DebugController.html b/PlausibleWeb.DebugController.html index 4674faba28..f1d4fe7f61 100644 --- a/PlausibleWeb.DebugController.html +++ b/PlausibleWeb.DebugController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.DebugView.html b/PlausibleWeb.DebugView.html index e789cbcbbc..e2b86f687d 100644 --- a/PlausibleWeb.DebugView.html +++ b/PlausibleWeb.DebugView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Dogfood.html b/PlausibleWeb.Dogfood.html index 076cbf8116..b2b2ffd336 100644 --- a/PlausibleWeb.Dogfood.html +++ b/PlausibleWeb.Dogfood.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Email.html b/PlausibleWeb.Email.html index 37fce2cd63..89902d8b15 100644 --- a/PlausibleWeb.Email.html +++ b/PlausibleWeb.Email.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.EmailView.html b/PlausibleWeb.EmailView.html index 6033174f9a..02b2ac1c42 100644 --- a/PlausibleWeb.EmailView.html +++ b/PlausibleWeb.EmailView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Endpoint.html b/PlausibleWeb.Endpoint.html index d8b90f08f3..723c275df3 100644 --- a/PlausibleWeb.Endpoint.html +++ b/PlausibleWeb.Endpoint.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.ErrorHelpers.html b/PlausibleWeb.ErrorHelpers.html index 94453d1591..e7354e71d7 100644 --- a/PlausibleWeb.ErrorHelpers.html +++ b/PlausibleWeb.ErrorHelpers.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.ErrorReportController.html b/PlausibleWeb.ErrorReportController.html index 419911fef5..2bbc81712e 100644 --- a/PlausibleWeb.ErrorReportController.html +++ b/PlausibleWeb.ErrorReportController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.ErrorView.html b/PlausibleWeb.ErrorView.html index be4a0ace7f..e85d6a9d64 100644 --- a/PlausibleWeb.ErrorView.html +++ b/PlausibleWeb.ErrorView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Favicon.html b/PlausibleWeb.Favicon.html index 784a8ad831..514ffc0e23 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 93ff03225c..42e3f104a4 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 14e11498ef..040d408942 100644 --- a/PlausibleWeb.FirstLaunchPlug.html +++ b/PlausibleWeb.FirstLaunchPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Flows.html b/PlausibleWeb.Flows.html index d88ef3ffd8..00da29fbe2 100644 --- a/PlausibleWeb.Flows.html +++ b/PlausibleWeb.Flows.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.GoogleAnalyticsController.html b/PlausibleWeb.GoogleAnalyticsController.html index 71da99e435..a7b41eac0e 100644 --- a/PlausibleWeb.GoogleAnalyticsController.html +++ b/PlausibleWeb.GoogleAnalyticsController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.GoogleAnalyticsView.html b/PlausibleWeb.GoogleAnalyticsView.html index 3ebf4c64fb..984c03e67d 100644 --- a/PlausibleWeb.GoogleAnalyticsView.html +++ b/PlausibleWeb.GoogleAnalyticsView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.HelpScoutController.html b/PlausibleWeb.HelpScoutController.html index f7bc46df66..704b897f2a 100644 --- a/PlausibleWeb.HelpScoutController.html +++ b/PlausibleWeb.HelpScoutController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.HelpScoutView.html b/PlausibleWeb.HelpScoutView.html index f4b2fcf196..29ebeaab46 100644 --- a/PlausibleWeb.HelpScoutView.html +++ b/PlausibleWeb.HelpScoutView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.InvitationController.html b/PlausibleWeb.InvitationController.html index d62547b361..7cd9ee0f51 100644 --- a/PlausibleWeb.InvitationController.html +++ b/PlausibleWeb.InvitationController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.LayoutView.JWT.html b/PlausibleWeb.LayoutView.JWT.html index 4ee1ff6a9e..8085550468 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 e91bfd430a..339ecd336d 100644 --- a/PlausibleWeb.LayoutView.html +++ b/PlausibleWeb.LayoutView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.AuthContext.html b/PlausibleWeb.Live.AuthContext.html index 116afff358..a4ecc6fcba 100644 --- a/PlausibleWeb.Live.AuthContext.html +++ b/PlausibleWeb.Live.AuthContext.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.CSVExport.html b/PlausibleWeb.Live.CSVExport.html index 0092606fe3..e83c4578d7 100644 --- a/PlausibleWeb.Live.CSVExport.html +++ b/PlausibleWeb.Live.CSVExport.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.CSVImport.html b/PlausibleWeb.Live.CSVImport.html index 5571d0bcd6..13a39d5e05 100644 --- a/PlausibleWeb.Live.CSVImport.html +++ b/PlausibleWeb.Live.CSVImport.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.ChoosePlan.html b/PlausibleWeb.Live.ChoosePlan.html index 1d53b8ce6f..1f97ff94c3 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 759b18943a..134b1fb335 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 7bb2e9e4bf..31653fd896 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 67fe76bda5..86ca90955d 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 d478e04de0..8e26982629 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" :let={modal_unique_id}>
    +existing live view which allows adding new entries of some kind:

    <.live_component module={Modal} id="some-form-modal" :let={modal_unique_id}>
       <.live_component
    -    module={SomeForm}
    -    id={"some-form-#{modal_unique_id}"}
    -    on_save_form={
    -      fn entry, socket ->
    -        send(self(), {:entry_added, entry})
    -        Modal.close(socket, "some-form-modal")
    -      end
    -    }
    +    module={SomeForm}
    +    id={"some-form-#{modal_unique_id}"}
    +    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>

    @@ -199,26 +199,26 @@ and providing the state. Should be used together with Modal.JS.preopen/1 for optimal user experience.

  • 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 11373e1713..6e538f2955 100644 --- a/PlausibleWeb.Live.Components.Pagination.html +++ b/PlausibleWeb.Live.Components.Pagination.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Components.Verification.html b/PlausibleWeb.Live.Components.Verification.html index a752e87370..41b9087941 100644 --- a/PlausibleWeb.Live.Components.Verification.html +++ b/PlausibleWeb.Live.Components.Verification.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Components.Visitors.html b/PlausibleWeb.Live.Components.Visitors.html index c35a7c9f07..d7d4e815ba 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 689f20ec9b..5697ccca5f 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 9e6c334efd..c0378ccc08 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 253e2d5224..1d0d33d5c2 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 5b4f6d83e5..99cb2d3b57 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 c502e0652d..04fe03de39 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 8ee5fc752e..989f4cc508 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 84cddffa13..cafae3f70c 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 index 42024abec5..3c319f9149 100644 --- a/PlausibleWeb.Live.ImportsExportsSettings.html +++ b/PlausibleWeb.Live.ImportsExportsSettings.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Installation.html b/PlausibleWeb.Live.Installation.html index 5715b9afce..6cf864b4f2 100644 --- a/PlausibleWeb.Live.Installation.html +++ b/PlausibleWeb.Live.Installation.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Plugins.API.Settings.html b/PlausibleWeb.Live.Plugins.API.Settings.html index 117cfa46a8..b070b88f1b 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 248ff93e1b..b3a5c8a461 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 9377f35cc0..104133aa6e 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 7f75f78387..15e360a723 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 bba06a5842..387a63ca55 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 1a3bfb2083..8f150d15ab 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 2106366fc1..67c8ec2cad 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 d665f897d1..8c4523103c 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 8527260bb9..eba4208d30 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 cacfab7195..c034359279 100644 --- a/PlausibleWeb.Live.Shields.CountryRules.html +++ b/PlausibleWeb.Live.Shields.CountryRules.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Shields.HostnameRules.html b/PlausibleWeb.Live.Shields.HostnameRules.html index ee890e9f95..f42afbcdaf 100644 --- a/PlausibleWeb.Live.Shields.HostnameRules.html +++ b/PlausibleWeb.Live.Shields.HostnameRules.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Shields.Hostnames.html b/PlausibleWeb.Live.Shields.Hostnames.html index ecb3d4b4aa..9f9f86741d 100644 --- a/PlausibleWeb.Live.Shields.Hostnames.html +++ b/PlausibleWeb.Live.Shields.Hostnames.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Shields.IPAddresses.html b/PlausibleWeb.Live.Shields.IPAddresses.html index 57f1820ebe..8be23ecbfa 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 67cf77fd34..6b6ba98576 100644 --- a/PlausibleWeb.Live.Shields.IPRules.html +++ b/PlausibleWeb.Live.Shields.IPRules.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Shields.PageRules.html b/PlausibleWeb.Live.Shields.PageRules.html index 36e0aeeb6c..c01764f1e2 100644 --- a/PlausibleWeb.Live.Shields.PageRules.html +++ b/PlausibleWeb.Live.Shields.PageRules.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Shields.Pages.html b/PlausibleWeb.Live.Shields.Pages.html index 3c3e8281a1..0b6ff95354 100644 --- a/PlausibleWeb.Live.Shields.Pages.html +++ b/PlausibleWeb.Live.Shields.Pages.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Sites.html b/PlausibleWeb.Live.Sites.html index f72a2c5256..43ec58d027 100644 --- a/PlausibleWeb.Live.Sites.html +++ b/PlausibleWeb.Live.Sites.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Live.Verification.html b/PlausibleWeb.Live.Verification.html index 4f3f3b5255..ffe39d3ee5 100644 --- a/PlausibleWeb.Live.Verification.html +++ b/PlausibleWeb.Live.Verification.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.MJML.StatsReport.html b/PlausibleWeb.MJML.StatsReport.html index 175f65a380..340935f3f1 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 a2aaf4c1c1..951c9910fe 100644 --- a/PlausibleWeb.PageController.html +++ b/PlausibleWeb.PageController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.PageView.html b/PlausibleWeb.PageView.html index 85ad9f0a12..510bf59d5f 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 1a9fc3367c..646a457bc1 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 35b0aa3cdf..f258ce2b39 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.Funnels.html b/PlausibleWeb.Plugins.API.Controllers.Funnels.html index 7fe7e712b5..56ce1c0b8c 100644 --- a/PlausibleWeb.Plugins.API.Controllers.Funnels.html +++ b/PlausibleWeb.Plugins.API.Controllers.Funnels.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Controllers.Goals.html b/PlausibleWeb.Plugins.API.Controllers.Goals.html index 4f8638cc6e..6bb815faf3 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 f18520cda2..998e593cce 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 ca3d1eecf2..90b76e5d0f 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 ab49536b80..178df56ceb 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 6c575756a7..4a6179b151 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 6f44ff4acf..251714f92f 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 2cee969581..2ea7282f7a 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 d4a407267f..13878cc953 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 51fdb5c8ea..7ab353e176 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.Funnel.CreateRequest.html b/PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.html index b4641677c9..bae3635355 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.html +++ b/PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.html b/PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.html index b6075c802e..5e0a173636 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.html +++ b/PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Schemas.Funnel.html b/PlausibleWeb.Plugins.API.Schemas.Funnel.html index 21e403d1b6..fa80d02c34 100644 --- a/PlausibleWeb.Plugins.API.Schemas.Funnel.html +++ b/PlausibleWeb.Plugins.API.Schemas.Funnel.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 f3daf94634..b888481972 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 065d41446c..b605b9b34d 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 641bcf463f..cb28ee7ce0 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 2d805f0a79..ffcb5e7533 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 d03f8825e4..31efb61089 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 1d015824a3..cc3998b680 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 01d67c819c..0c520f5c67 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 162668ab9b..6b7596978b 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 22c49d38f9..78da357c8f 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 2c61473d47..b617c714e9 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 7dc71d2386..83b0105a1d 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 e6de9074c0..a53c18f37d 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 df6a7082d3..2ad0bb55fd 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 c1cd1b94b3..3f300c3a3a 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 6ad95f764a..b370f78e0c 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 e5b9ec2e4f..1a8ad55375 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 e93fb36d30..daafa0fbbc 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 131de53134..bc5a7256af 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 7b4c88210b..ffe75a2c72 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 f2cf13c1ed..21994fb6c4 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 d259c57346..fa0b8d6c90 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 79565b722b..71d449d783 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 81f41b77de..4bd532b143 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 12739c0477..2bf039e395 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.Funnel.html b/PlausibleWeb.Plugins.API.Views.Funnel.html index 4c01865635..7d40dc5963 100644 --- a/PlausibleWeb.Plugins.API.Views.Funnel.html +++ b/PlausibleWeb.Plugins.API.Views.Funnel.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugins.API.Views.Goal.html b/PlausibleWeb.Plugins.API.Views.Goal.html index 51d4dd6106..0bc81b4840 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 2b15cd74aa..f2d64a9cb1 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 9f471cf287..1c3b8061b1 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 fadd47fe34..7e78f5b17a 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 c72d2a76d0..fe2aadf188 100644 --- a/PlausibleWeb.Plugs.AuthorizePluginsAPI.html +++ b/PlausibleWeb.Plugs.AuthorizePluginsAPI.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugs.AuthorizePublicAPI.html b/PlausibleWeb.Plugs.AuthorizePublicAPI.html index f14b85ee95..d4d40f9959 100644 --- a/PlausibleWeb.Plugs.AuthorizePublicAPI.html +++ b/PlausibleWeb.Plugs.AuthorizePublicAPI.html @@ -14,7 +14,7 @@ - + @@ -145,12 +145,12 @@ Pages

    Plug for authorizing access to Stats and Sites APIs.

    The plug expects :api_scope to be provided in the assigns. The scope will then be used to check for API key validity. The assign can be -provided in the router configuration in a following way:

    scope "/api/v1/stats", PlausibleWeb.Api, assigns: %{api_scope: "some:scope:*"} do
    -  pipe_through [:public_api, PlausibleWeb.Plugs.AuthorizePublicAPI]
    +provided in the router configuration in a following way:

    scope "/api/v1/stats", PlausibleWeb.Api, assigns: %{api_scope: "some:scope:*"} do
    +  pipe_through [:public_api, PlausibleWeb.Plugs.AuthorizePublicAPI]
     
       # route definitions follow
       # ...
    -end

    The scope from :api_scope is checked for match against all scopes from API key's +end

    The scope from :api_scope is checked for match against all scopes from API key's scopes field. If the scope is among @implicit_scopes, it's considered to be present for any valid API key. Scopes are checked for match by prefix, so if we have some:scope:* in matching route :api_scope and the API key has some:* in its diff --git a/PlausibleWeb.Plugs.AuthorizeSiteAccess.html b/PlausibleWeb.Plugs.AuthorizeSiteAccess.html index 4e8cd638fa..ba7fe62fa5 100644 --- a/PlausibleWeb.Plugs.AuthorizeSiteAccess.html +++ b/PlausibleWeb.Plugs.AuthorizeSiteAccess.html @@ -14,7 +14,7 @@ - + @@ -143,7 +143,7 @@ Pages

    -

    Plug restricting access to site and shared link, when present.

    In order to permit access to site regardless of role:

    plug AuthorizeSiteAccess

    or

    plug AuthorizeSiteAccess, :all_roles

    Permit access for a subset of roles only:

    plug AuthorizeSiteAccess, [:admin, :owner, :super_admin]

    Permit access using a custom site param:

    plug AuthorizeSiteAccess, {[:admin, :owner, :super_admin], "site_id"}

    or in case where any role is allowed:

    plug AuthorizeSiteAccess, {:all_roles, "site_id"}
    +

    Plug restricting access to site and shared link, when present.

    In order to permit access to site regardless of role:

    plug AuthorizeSiteAccess

    or

    plug AuthorizeSiteAccess, :all_roles

    Permit access for a subset of roles only:

    plug AuthorizeSiteAccess, [:admin, :owner, :super_admin]

    Permit access using a custom site param:

    plug AuthorizeSiteAccess, {[:admin, :owner, :super_admin], "site_id"}

    or in case where any role is allowed:

    plug AuthorizeSiteAccess, {:all_roles, "site_id"}
    diff --git a/PlausibleWeb.Plugs.ErrorHandler.html b/PlausibleWeb.Plugs.ErrorHandler.html index 68614932a1..0d968af984 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 573405345b..b25c316bac 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 b8861a5426..f51b0b918a 100644 --- a/PlausibleWeb.Plugs.NoRobots.html +++ b/PlausibleWeb.Plugs.NoRobots.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Plugs.UserSessionTouch.html b/PlausibleWeb.Plugs.UserSessionTouch.html index f89bdea654..ca0c34920a 100644 --- a/PlausibleWeb.Plugs.UserSessionTouch.html +++ b/PlausibleWeb.Plugs.UserSessionTouch.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.RemoteIP.html b/PlausibleWeb.RemoteIP.html index 55c16ea22c..cd4d4ec844 100644 --- a/PlausibleWeb.RemoteIP.html +++ b/PlausibleWeb.RemoteIP.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.RequireAccountPlug.html b/PlausibleWeb.RequireAccountPlug.html index 3ac42493ca..d161f0f8a4 100644 --- a/PlausibleWeb.RequireAccountPlug.html +++ b/PlausibleWeb.RequireAccountPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.RequireLoggedOutPlug.html b/PlausibleWeb.RequireLoggedOutPlug.html index c782a050ed..266d2da902 100644 --- a/PlausibleWeb.RequireLoggedOutPlug.html +++ b/PlausibleWeb.RequireLoggedOutPlug.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Router.html b/PlausibleWeb.Router.html index 8050de3d5b..c5169c2798 100644 --- a/PlausibleWeb.Router.html +++ b/PlausibleWeb.Router.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.SettingsController.html b/PlausibleWeb.SettingsController.html index cc1f5797fc..2ef36f2c6a 100644 --- a/PlausibleWeb.SettingsController.html +++ b/PlausibleWeb.SettingsController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.SettingsView.html b/PlausibleWeb.SettingsView.html index 0a758aca5a..4ddbe61d82 100644 --- a/PlausibleWeb.SettingsView.html +++ b/PlausibleWeb.SettingsView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Site.MembershipController.html b/PlausibleWeb.Site.MembershipController.html index 2a94c86900..a3ebd43777 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 a209b0a4f3..0eb42407ff 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 3d328bd1ff..823f3f1d8f 100644 --- a/PlausibleWeb.SiteController.html +++ b/PlausibleWeb.SiteController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.SiteView.html b/PlausibleWeb.SiteView.html index f46eac422b..3a97162cff 100644 --- a/PlausibleWeb.SiteView.html +++ b/PlausibleWeb.SiteView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.StatsController.html b/PlausibleWeb.StatsController.html index 8befc5a83b..3f34c28a44 100644 --- a/PlausibleWeb.StatsController.html +++ b/PlausibleWeb.StatsController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.StatsView.html b/PlausibleWeb.StatsView.html index 587384070e..76a19cfa68 100644 --- a/PlausibleWeb.StatsView.html +++ b/PlausibleWeb.StatsView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.TestController.html b/PlausibleWeb.TestController.html index b1f1b831ec..17c28e6438 100644 --- a/PlausibleWeb.TestController.html +++ b/PlausibleWeb.TestController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.Tracker.html b/PlausibleWeb.Tracker.html index 0ad3fad65b..25212eedf1 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 053015e496..bcad3d40bb 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 42e793f625..85a31fc4b9 100644 --- a/PlausibleWeb.UnsubscribeController.html +++ b/PlausibleWeb.UnsubscribeController.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.UnsubscribeView.html b/PlausibleWeb.UnsubscribeView.html index 84094f7573..3f154a783f 100644 --- a/PlausibleWeb.UnsubscribeView.html +++ b/PlausibleWeb.UnsubscribeView.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.UserAuth.html b/PlausibleWeb.UserAuth.html index 63f0f72418..5029e30227 100644 --- a/PlausibleWeb.UserAuth.html +++ b/PlausibleWeb.UserAuth.html @@ -14,7 +14,7 @@ - + diff --git a/PlausibleWeb.html b/PlausibleWeb.html index 4c5d0c2f6a..d50ffb4aae 100644 --- a/PlausibleWeb.html +++ b/PlausibleWeb.html @@ -14,7 +14,7 @@ - + diff --git a/api-reference.html b/api-reference.html index 1b781a42ba..a44793ca0a 100644 --- a/api-reference.html +++ b/api-reference.html @@ -14,7 +14,7 @@ - + @@ -2097,6 +2097,15 @@ and metrics, with the purpose of reducing the number of queries and JOINs needed

    Transition adapter for new schema reads

    +
    +
    + + +

    Transition adapter for new schema reads

    +
    @@ -2115,6 +2124,15 @@ and metrics, with the purpose of reducing the number of queries and JOINs needed

    Transition adapter for new schema reads

    +
    +
    + + +

    Transition adapter for new schema reads

    +
    diff --git a/contributing.html b/contributing.html index 7a24955171..db8eb17a62 100644 --- a/contributing.html +++ b/contributing.html @@ -14,7 +14,7 @@ - + diff --git a/dist/search_data-A23F52FF.js b/dist/search_data-D5C2181C.js similarity index 65% rename from dist/search_data-A23F52FF.js rename to dist/search_data-D5C2181C.js index f5b140f8a2..1a6b7fba13 100644 --- a/dist/search_data-A23F52FF.js +++ b/dist/search_data-D5C2181C.js @@ -1 +1 @@ -searchData={"items":[{"type":"task","title":"mix cancel_subscription","doc":"This task is meant to replicate the behavior of cancelling\na subscription. On production, this action is initiated by\na Paddle webhook. Currently, only the subscription status\nis changed with that action.","ref":"Mix.Tasks.CancelSubscription.html"},{"type":"function","title":"Mix.Tasks.CancelSubscription.run/1","doc":"","ref":"Mix.Tasks.CancelSubscription.html#run/1"},{"type":"task","title":"mix clean_clickhouse","doc":"","ref":"Mix.Tasks.CleanClickhouse.html"},{"type":"function","title":"Mix.Tasks.CleanClickhouse.run/1","doc":"","ref":"Mix.Tasks.CleanClickhouse.html#run/1"},{"type":"task","title":"mix create_free_subscription","doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html"},{"type":"function","title":"Mix.Tasks.CreateFreeSubscription.execute/1","doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html#execute/1"},{"type":"function","title":"Mix.Tasks.CreateFreeSubscription.run/1","doc":"","ref":"Mix.Tasks.CreateFreeSubscription.html#run/1"},{"type":"task","title":"mix download_country_database","doc":"This task downloads the Country Lite database from DB-IP for self-hosted or development purposes.\nPlausible Cloud runs a paid version of DB-IP with more detailed geolocation data.","ref":"Mix.Tasks.DownloadCountryDatabase.html"},{"type":"function","title":"Mix.Tasks.DownloadCountryDatabase.run/1","doc":"","ref":"Mix.Tasks.DownloadCountryDatabase.html#run/1"},{"type":"task","title":"mix generate_referrer_favicons","doc":"","ref":"Mix.Tasks.GenerateReferrerFavicons.html"},{"type":"function","title":"Mix.Tasks.GenerateReferrerFavicons.run/1","doc":"","ref":"Mix.Tasks.GenerateReferrerFavicons.html#run/1"},{"type":"task","title":"mix pull_sandbox_subscription","doc":"","ref":"Mix.Tasks.PullSandboxSubscription.html"},{"type":"function","title":"Mix.Tasks.PullSandboxSubscription.run/1","doc":"","ref":"Mix.Tasks.PullSandboxSubscription.html#run/1"},{"type":"task","title":"mix send_pageview","doc":"It's often necessary to generate fake events for development and testing purposes. This Mix Task provides a quick and easy\nway to generate a pageview or custom event, either in your development environment or a remote Plausible instance.\n\nSee Mix.Tasks.SendPageview.usage/1 for more detailed documentation.","ref":"Mix.Tasks.SendPageview.html"},{"type":"function","title":"Mix.Tasks.SendPageview.run/1","doc":"","ref":"Mix.Tasks.SendPageview.html#run/1"},{"type":"module","title":"ObanErrorReporter","doc":"","ref":"ObanErrorReporter.html"},{"type":"function","title":"ObanErrorReporter.handle_event/4","doc":"","ref":"ObanErrorReporter.html#handle_event/4"},{"type":"module","title":"Plausible","doc":"Build-related macros","ref":"Plausible.html"},{"type":"function","title":"Plausible.ce?/0","doc":"","ref":"Plausible.html#ce?/0"},{"type":"function","title":"Plausible.ee?/0","doc":"","ref":"Plausible.html#ee?/0"},{"type":"macro","title":"Plausible.on_ce/1","doc":"","ref":"Plausible.html#on_ce/1"},{"type":"macro","title":"Plausible.on_ee/1","doc":"","ref":"Plausible.html#on_ee/1"},{"type":"function","title":"Plausible.product_name/0","doc":"","ref":"Plausible.html#product_name/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.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.AsyncInsertRepo.html#alter_update_all/3"},{"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_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.AsyncInsertRepo.html#to_inline_sql/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":"Functions for user authentication context.","ref":"Plausible.Auth.html"},{"type":"function","title":"Plausible.Auth.check_password/2","doc":"","ref":"Plausible.Auth.html#check_password/2"},{"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.get_user_by/1","doc":"","ref":"Plausible.Auth.html#get_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.rate_limit/2","doc":"","ref":"Plausible.Auth.html#rate_limit/2"},{"type":"function","title":"Plausible.Auth.rate_limits/0","doc":"","ref":"Plausible.Auth.html#rate_limits/0"},{"type":"function","title":"Plausible.Auth.user_owns_sites?/1","doc":"","ref":"Plausible.Auth.html#user_owns_sites?/1"},{"type":"type","title":"Plausible.Auth.rate_limit_type/0","doc":"","ref":"Plausible.Auth.html#t:rate_limit_type/0"},{"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. There's also alternative call for forced\ndisabling of TOTP for a given user without sending any notification,\n`force_disable/1`. It's meant for use in situation where user lost both,\n2FA device and recovery codes and their identity is verified independently.\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.force_disable/1","doc":"","ref":"Plausible.Auth.TOTP.html#force_disable/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.name_changeset/2","doc":"","ref":"Plausible.Auth.User.html#name_changeset/2"},{"type":"function","title":"Plausible.Auth.User.new/1","doc":"","ref":"Plausible.Auth.User.html#new/1"},{"type":"function","title":"Plausible.Auth.User.password_changeset/2","doc":"","ref":"Plausible.Auth.User.html#password_changeset/2"},{"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.theme_changeset/2","doc":"","ref":"Plausible.Auth.User.html#theme_changeset/2"},{"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.after_update/2","doc":"","ref":"Plausible.Auth.UserAdmin.html#after_update/2"},{"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.disable_2fa/1","doc":"","ref":"Plausible.Auth.UserAdmin.html#disable_2fa/1"},{"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.Auth.UserSession","doc":"Schema for storing user session data.","ref":"Plausible.Auth.UserSession.html"},{"type":"function","title":"Plausible.Auth.UserSession.new_session/3","doc":"","ref":"Plausible.Auth.UserSession.html#new_session/3"},{"type":"function","title":"Plausible.Auth.UserSession.timeout_duration/0","doc":"","ref":"Plausible.Auth.UserSession.html#timeout_duration/0"},{"type":"function","title":"Plausible.Auth.UserSession.touch_session/2","doc":"","ref":"Plausible.Auth.UserSession.html#touch_session/2"},{"type":"type","title":"Plausible.Auth.UserSession.t/0","doc":"","ref":"Plausible.Auth.UserSession.html#t:t/0"},{"type":"module","title":"Plausible.Auth.UserSessions","doc":"Functions for interacting with user sessions.","ref":"Plausible.Auth.UserSessions.html"},{"type":"function","title":"Plausible.Auth.UserSessions.last_used_humanize/2","doc":"","ref":"Plausible.Auth.UserSessions.html#last_used_humanize/2"},{"type":"function","title":"Plausible.Auth.UserSessions.list_for_user/2","doc":"","ref":"Plausible.Auth.UserSessions.html#list_for_user/2"},{"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":"type","title":"Plausible.Billing.EnterprisePlan.t/0","doc":"","ref":"Plausible.Billing.EnterprisePlan.html#t:t/0"},{"type":"module","title":"Plausible.Billing.EnterprisePlanAdmin","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.create_changeset/2","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#create_changeset/2"},{"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/3","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/3"},{"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/2","doc":"","ref":"Plausible.Billing.PaddleApi.html#fetch_prices/2"},{"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/2","doc":"","ref":"Plausible.Billing.Plans.html#get_price_for/2"},{"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 subscription to choose.\n\nAs new versions of plans are introduced, subscriptions which 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/2","doc":"","ref":"Plausible.Billing.Plans.html#latest_enterprise_plan_with_price/2"},{"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_by_usage/2","doc":"","ref":"Plausible.Billing.Plans.html#suggest_by_usage/2"},{"type":"function","title":"Plausible.Billing.Plans.with_prices/2","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/2"},{"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.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.eligible_for_upgrade?/1","doc":"","ref":"Plausible.Billing.Quota.html#eligible_for_upgrade?/1"},{"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_feature_access/2","doc":"","ref":"Plausible.Billing.Quota.html#ensure_feature_access/2"},{"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.exceeded_cycles/2","doc":"","ref":"Plausible.Billing.Quota.html#exceeded_cycles/2"},{"type":"function","title":"Plausible.Billing.Quota.exceeds_last_two_usage_cycles?/2","doc":"","ref":"Plausible.Billing.Quota.html#exceeds_last_two_usage_cycles?/2"},{"type":"function","title":"Plausible.Billing.Quota.suggest_tier/3","doc":"Suggests a suitable tier (Growth or Business) for the given usage map.\n\nIf even the highest Business plan does not accommodate the usage, then\n`:custom` is returned. This means that this kind of usage should get on\na custom plan.\n\n`nil` is returned if the usage is not eligible for upgrade.","ref":"Plausible.Billing.Quota.html#suggest_tier/3"},{"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":"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 wrapper around `Plausible.Cache.Adapter`, where the underlying\nimplementation can be transparently swapped.\n\nEven though normally the relevant Adapter processes are 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.Adapter","doc":"Interface for the underlying cache implementation.\nCurrently: ConCache\n\nUsing the Adapter module directly, the user must ensure that the relevant\nprocesses are available to use, which is normally done via the child specification.","ref":"Plausible.Cache.Adapter.html"},{"type":"function","title":"Plausible.Cache.Adapter.child_spec/3","doc":"","ref":"Plausible.Cache.Adapter.html#child_spec/3"},{"type":"function","title":"Plausible.Cache.Adapter.delete/2","doc":"","ref":"Plausible.Cache.Adapter.html#delete/2"},{"type":"function","title":"Plausible.Cache.Adapter.fetch/3","doc":"","ref":"Plausible.Cache.Adapter.html#fetch/3"},{"type":"function","title":"Plausible.Cache.Adapter.get/2","doc":"","ref":"Plausible.Cache.Adapter.html#get/2"},{"type":"function","title":"Plausible.Cache.Adapter.get/3","doc":"","ref":"Plausible.Cache.Adapter.html#get/3"},{"type":"function","title":"Plausible.Cache.Adapter.keys/1","doc":"","ref":"Plausible.Cache.Adapter.html#keys/1"},{"type":"function","title":"Plausible.Cache.Adapter.put/4","doc":"","ref":"Plausible.Cache.Adapter.html#put/4"},{"type":"function","title":"Plausible.Cache.Adapter.put_many/2","doc":"","ref":"Plausible.Cache.Adapter.html#put_many/2"},{"type":"function","title":"Plausible.Cache.Adapter.size/1","doc":"","ref":"Plausible.Cache.Adapter.html#size/1"},{"type":"function","title":"Plausible.Cache.Adapter.with_lock/4","doc":"","ref":"Plausible.Cache.Adapter.html#with_lock/4"},{"type":"module","title":"Plausible.Cache.Stats","doc":"Keeps track of hit/miss ratio for various caches.","ref":"Plausible.Cache.Stats.html"},{"type":"function","title":"Plausible.Cache.Stats.bump/2","doc":"","ref":"Plausible.Cache.Stats.html#bump/2"},{"type":"function","title":"Plausible.Cache.Stats.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Cache.Stats.html#child_spec/1"},{"type":"function","title":"Plausible.Cache.Stats.gather/1","doc":"","ref":"Plausible.Cache.Stats.html#gather/1"},{"type":"function","title":"Plausible.Cache.Stats.handle_telemetry_event/4","doc":"","ref":"Plausible.Cache.Stats.html#handle_telemetry_event/4"},{"type":"function","title":"Plausible.Cache.Stats.hit_rate/1","doc":"","ref":"Plausible.Cache.Stats.html#hit_rate/1"},{"type":"function","title":"Plausible.Cache.Stats.init/1","doc":"","ref":"Plausible.Cache.Stats.html#init/1"},{"type":"function","title":"Plausible.Cache.Stats.size/1","doc":"","ref":"Plausible.Cache.Stats.html#size/1"},{"type":"function","title":"Plausible.Cache.Stats.start_link/1","doc":"","ref":"Plausible.Cache.Stats.html#start_link/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 {\n :error,\n {\n Cldr.UnknownLocaleError,\n \"Locale TestBackend.Cldr.Locale.new!(\\\"de-DE\\\") does not map to a known gettext locale name\"\n }\n }","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_language` 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\nwith 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\nwith 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.merge_session/2","doc":"","ref":"Plausible.ClickhouseEventV2.html#merge_session/2"},{"type":"function","title":"Plausible.ClickhouseEventV2.new/1","doc":"","ref":"Plausible.ClickhouseEventV2.html#new/1"},{"type":"module","title":"Plausible.ClickhouseLocationData","doc":"Schema for storing location id <-> translation mappings in ClickHouse\n\nIndirectly read via dictionary `location_data_dictionary` in ALIAS columns in\n`events_v2`, `sessions_v2` and `imported_locations` table.","ref":"Plausible.ClickhouseLocationData.html"},{"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.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.ClickhouseRepo.html#alter_update_all/3"},{"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/2","doc":"","ref":"Plausible.ClickhouseRepo.html#parallel_tasks/2"},{"type":"function","title":"Plausible.ClickhouseRepo.preload/3","doc":"","ref":"Plausible.ClickhouseRepo.html#preload/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_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.ClickhouseRepo.html#to_inline_sql/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_bool_from_path_or_env/3","doc":"","ref":"Plausible.ConfigHelpers.html#get_bool_from_path_or_env/3"},{"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.CrmExtensions","doc":"Extensions for Kaffy CRM","ref":"Plausible.CrmExtensions.html"},{"type":"function","title":"Plausible.CrmExtensions.javascripts/1","doc":"","ref":"Plausible.CrmExtensions.html#javascripts/1"},{"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.AcquisitionChannel","doc":"Creates dictionaries and functions to calculate acquisition channel in ClickHouse\n\nCreates `acquisition_channel` columns in `events_v2` and `sessions_v2` tables.\nRun via `Plausible.DataMigration.AcquisitionChannel.run(options)`\n\nOptions:\n- `add_column` - creates the materialized column. Already done in a migration\n- `update_column` - Updates the column definition to use new function definitions. Defaults to true.\n Note that historical data is only updated if `backfill` is set to true or if it was never materialized.\n- `backfill` - backfills the data for the column. Speeds up calculations on historical data.\n\nSQL files available at: priv/data_migrations/AcquisitionChannel/sql","ref":"Plausible.DataMigration.AcquisitionChannel.html"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.confirm/3","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.do_run/3","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#do_run/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.run/1","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#run/1"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.run_sql/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.AcquisitionChannel.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.AcquisitionChannel.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.unwrap/2","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#unwrap/2"},{"type":"module","title":"Plausible.DataMigration.BackfillTeams","doc":"Backfill and sync all teams related entities.","ref":"Plausible.DataMigration.BackfillTeams.html"},{"type":"function","title":"Plausible.DataMigration.BackfillTeams.delete_orphaned_teams/1","doc":"","ref":"Plausible.DataMigration.BackfillTeams.html#delete_orphaned_teams/1"},{"type":"function","title":"Plausible.DataMigration.BackfillTeams.run/1","doc":"","ref":"Plausible.DataMigration.BackfillTeams.html#run/1"},{"type":"module","title":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource","doc":"Clean up referrer_source entries for demo site with\n`Direct / None` for value populated by dogfooding\nPlausible stats.","ref":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html"},{"type":"function","title":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource.run/1","doc":"","ref":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html#run/1"},{"type":"module","title":"Plausible.DataMigration.ClickhouseRepo","doc":"Ecto.Repo for Clickhouse data migrations, to be started manually,\noutside of the main application supervision tree.","ref":"Plausible.DataMigration.ClickhouseRepo.html"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.aggregate/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#aggregate/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.aggregate/4","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#aggregate/4"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.all/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#all/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.DataMigration.ClickhouseRepo.html#alter_update_all/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.checked_out?/0","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.checkout/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#checkout/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.child_spec/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#child_spec/1"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.config/0","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#config/0"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.default_options/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#default_options/1"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.delete/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#delete/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.delete!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#delete!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.delete_all/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#delete_all/2"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.exists?/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#exists?/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get!/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get!/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get_by/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get_by/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get_by!/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get_by!/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert_all/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert_all/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert_or_update/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert_or_update!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.load/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#load/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.one/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#one/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.one!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#one!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.preload/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#preload/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.prepare_query/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#query/3"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#query!/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.reload/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#reload/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.reload!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#reload!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.start/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#start/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.start_link/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#start_link/1"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.stop/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#stop/1"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.stream/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#stream/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.to_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.DataMigration.ClickhouseRepo.html#to_inline_sql/2"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#to_sql/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.update/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#update/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.update!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#update!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.update_all/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#update_all/3"},{"type":"module","title":"Plausible.DataMigration.LocationsSync","doc":"ClickHouse locations data migration for storing location names in ClickHouse.\n\nOnly run when `Location.version()` changes: either as a migration or in cron.\n\nThe migration:\n1. Truncates existing `location_data` table (if exists)\n2. Creates new table (if needed)\n3. Inserts new data from Location module\n4. (Re-)Creates dictionary to read location data from table\n5. Creates ALIAS columns in `events_v2`, `sessions_v2` and `imported_locations` table to make reading location names easy\n6. Updates table comment for `location_data` to indicate last version synced.\n\nNote that the dictionary is large enough to cache the whole dataset in memory, making lookups fast.\n\nThis migration is intended to be idempotent and rerunnable - if run multiple times, it should always set things to the same\nresult as if run once.\n\nSQL files available at: priv/data_migrations/LocationsSync/sql","ref":"Plausible.DataMigration.LocationsSync.html"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.confirm/3","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.do_run/3","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#do_run/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.out_of_date?/0","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#out_of_date?/0"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.run/0","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#run/0"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.run_sql/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.LocationsSync.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.LocationsSync.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.unwrap/2","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#unwrap/2"},{"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.do_run/3","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#do_run/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/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.NumericIDs.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.NumericIDs.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.unwrap/2","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#unwrap/2"},{"type":"module","title":"Plausible.DataMigration.PopulateEventSessionColumns","doc":"Populates event session columns with data from sessions table.\n\nRun via: ./bin/plausible rpc \"Plausible.DataMigration.PopulateEventSessionColumns.run\"\nKill via: ./bin/plausible rpc \"Plausible.DataMigration.PopulateEventSessionColumns.kill\"\nMonitor via ./bin/plausible rpc \"Plausible.DataMigration.PopulateEventSessionColumns.report_progress\"\n\nSuggested to run in a screen/tmux session to be able to easily monitor\n\nSQL files available at: priv/data_migrations/PopulateEventSessionColumns/sql","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.confirm/3","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.do_run/3","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#do_run/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.kill/1","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#kill/1"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.report_progress/1","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#report_progress/1"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.run/1","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#run/1"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.run_sql/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.unwrap/2","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#unwrap/2"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.wait_until_mutations_complete/1","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#wait_until_mutations_complete/1"},{"type":"module","title":"Plausible.DataMigration.PostgresRepo","doc":"Ecto.Repo for Posrtgres data migrations, to be started manually,\noutside of the main application supervision tree.","ref":"Plausible.DataMigration.PostgresRepo.html"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.aggregate/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#aggregate/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.aggregate/4","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#aggregate/4"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.all/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#all/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.checked_out?/0","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.checkout/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#checkout/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.child_spec/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#child_spec/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.config/0","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#config/0"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.default_options/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#default_options/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.delete/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#delete/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.delete!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#delete!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.delete_all/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#delete_all/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.PostgresRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.exists?/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#exists?/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.DataMigration.PostgresRepo.html#explain/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get!/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get!/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get_by/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get_by/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get_by!/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get_by!/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.in_transaction?/0","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#in_transaction?/0"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert_all/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert_all/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert_or_update/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert_or_update!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.load/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#load/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.one/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#one/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.one!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#one!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.preload/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#preload/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.prepare_query/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.PostgresRepo.html#query/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.PostgresRepo.html#query!/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.DataMigration.PostgresRepo.html#query_many/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.DataMigration.PostgresRepo.html#query_many!/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.reload/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#reload/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.reload!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#reload!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.rollback/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#rollback/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.start/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#start/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.start_link/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#start_link/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.stop/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#stop/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.stream/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#stream/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.PostgresRepo.html#to_sql/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.transaction/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#transaction/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.update/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#update/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.update!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#update!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.update_all/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#update_all/3"},{"type":"module","title":"Plausible.DataMigration.SiteImports","doc":"!!!WARNING!!!: This script is used in migrations. Please take special care\nwhen altering it.\n\nSite imports migration backfilling SiteImport entries for old imports\nand alters import end dates to match actual end date of respective import stats.","ref":"Plausible.DataMigration.SiteImports.html"},{"type":"function","title":"Plausible.DataMigration.SiteImports.run/1","doc":"","ref":"Plausible.DataMigration.SiteImports.html#run/1"},{"type":"module","title":"Plausible.DataMigration.TeamsConsitencyCheck","doc":"Verify consistency of teams.","ref":"Plausible.DataMigration.TeamsConsitencyCheck.html"},{"type":"function","title":"Plausible.DataMigration.TeamsConsitencyCheck.run/0","doc":"","ref":"Plausible.DataMigration.TeamsConsitencyCheck.html#run/0"},{"type":"module","title":"Plausible.DataMigration.VersionedSessions","doc":"!!!WARNING!!!: This script is used in migrations. Please take special care\nwhen altering it.\n\nSessions CollapsingMergeTree -> VersionedCollapsingMergeTree migration,\nSQL files available at:\n\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.do_run/3","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#do_run/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/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.unwrap/2","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#unwrap/2"},{"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.Ecto.Types.CompiledRegex","doc":"Ensures that the regex is compiled on load","ref":"Plausible.Ecto.Types.CompiledRegex.html"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.cast/1","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#cast/1"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.dump/1","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#dump/1"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.embed_as/1","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#embed_as/1"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.equal?/2","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#equal?/2"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.load/1","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#load/1"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.type/0","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#type/0"},{"type":"module","title":"Plausible.Exports","doc":"Contains functions to export data for events and sessions as Zip archives.","ref":"Plausible.Exports.html"},{"type":"function","title":"Plausible.Exports.archive_filename/2","doc":"Renders export archive filename.\n\nExamples:\n\n iex> archive_filename(\"plausible.io\", _created_on = ~D[2024-12-31])\n \"plausible_io_20241231.zip\"","ref":"Plausible.Exports.html#archive_filename/2"},{"type":"function","title":"Plausible.Exports.content_disposition/1","doc":"Safely renders content disposition for an arbitrary export filename.\n\nExamples:\n\n iex> content_disposition(\"plausible_io_20241231.zip\")\n \"attachment; filename=\\\"plausible_io_20241231.zip\\\"\"\n\n iex> content_disposition(\"📊.zip\")\n \"attachment; filename=\\\"plausible-export.zip\\\"; filename*=utf-8''%F0%9F%93%8A.zip\"","ref":"Plausible.Exports.html#content_disposition/1"},{"type":"function","title":"Plausible.Exports.date_range/2","doc":"Returns the date range for the site's events data in site's timezone or `nil` if there is no data","ref":"Plausible.Exports.html#date_range/2"},{"type":"function","title":"Plausible.Exports.delete_local_export/1","doc":"Deletes local export for a site","ref":"Plausible.Exports.html#delete_local_export/1"},{"type":"function","title":"Plausible.Exports.delete_s3_export!/1","doc":"Deletes S3 export for a site. Raises if object storage is unavailable.","ref":"Plausible.Exports.html#delete_s3_export!/1"},{"type":"function","title":"Plausible.Exports.export_queries/2","doc":"Builds Ecto queries to export data from `events_v2` and `sessions_v2`\ntables into the format of `imported_*` tables for a website.","ref":"Plausible.Exports.html#export_queries/2"},{"type":"function","title":"Plausible.Exports.get_last_export_job/1","doc":"Gets last CSV export job for a site","ref":"Plausible.Exports.html#get_last_export_job/1"},{"type":"function","title":"Plausible.Exports.get_local_export/3","doc":"Gets local export for a site","ref":"Plausible.Exports.html#get_local_export/3"},{"type":"function","title":"Plausible.Exports.get_s3_export!/2","doc":"Gets S3 export for a site. Raises if object storage is unavailable.","ref":"Plausible.Exports.html#get_s3_export!/2"},{"type":"function","title":"Plausible.Exports.oban_listen/0","doc":"Subscribes to CSV export job notifications","ref":"Plausible.Exports.html#oban_listen/0"},{"type":"function","title":"Plausible.Exports.schedule_local_export/2","doc":"Schedules CSV export job to local storage","ref":"Plausible.Exports.html#schedule_local_export/2"},{"type":"function","title":"Plausible.Exports.schedule_s3_export/2","doc":"Schedules CSV export job to S3 storage","ref":"Plausible.Exports.html#schedule_s3_export/2"},{"type":"function","title":"Plausible.Exports.stream_archive/3","doc":"Creates a streamable Zip archive from the provided (named) Ecto queries.\n\nExample usage:\n\n {:ok, pool} = Ch.start_link(pool_size: 1)\n\n DBConnection.run(pool, fn conn ->\n conn\n |> stream_archive(export_queries(_site_id = 1), format: \"CSVWithNames\")\n |> Stream.into(File.stream!(\"export.zip\"))\n |> Stream.run()\n end)","ref":"Plausible.Exports.html#stream_archive/3"},{"type":"type","title":"Plausible.Exports.export/0","doc":"","ref":"Plausible.Exports.html#t:export/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.drop_notification_factory/0","doc":"","ref":"Plausible.Factory.html#drop_notification_factory/0"},{"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/1","doc":"","ref":"Plausible.Factory.html#event_factory/1"},{"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/1","doc":"","ref":"Plausible.Factory.html#goal_factory/1"},{"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.guest_invitation_factory/0","doc":"","ref":"Plausible.Factory.html#guest_invitation_factory/0"},{"type":"function","title":"Plausible.Factory.guest_membership_factory/0","doc":"","ref":"Plausible.Factory.html#guest_membership_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_custom_events_factory/0","doc":"","ref":"Plausible.Factory.html#imported_custom_events_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.pageleave_factory/1","doc":"","ref":"Plausible.Factory.html#pageleave_factory/1"},{"type":"function","title":"Plausible.Factory.pageview_factory/1","doc":"","ref":"Plausible.Factory.html#pageview_factory/1"},{"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.site_transfer_factory/0","doc":"","ref":"Plausible.Factory.html#site_transfer_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.team_factory/0","doc":"","ref":"Plausible.Factory.html#team_factory/0"},{"type":"function","title":"Plausible.Factory.team_invitation_factory/0","doc":"","ref":"Plausible.Factory.html#team_invitation_factory/0"},{"type":"function","title":"Plausible.Factory.team_membership_factory/0","doc":"","ref":"Plausible.Factory.html#team_membership_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.File","doc":"File helpers for Plausible.","ref":"Plausible.File.html"},{"type":"function","title":"Plausible.File.mv!/2","doc":"Moves a file from one location to another.\n\nTries renaming first, and falls back to copying and deleting the original.","ref":"Plausible.File.html#mv!/2"},{"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_steps/2","doc":"","ref":"Plausible.Funnel.html#put_steps/2"},{"type":"type","title":"Plausible.Funnel.t/0","doc":"","ref":"Plausible.Funnel.html#t:t/0"},{"type":"module","title":"Plausible.Funnel.Const","doc":"Compile-time convenience 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.edit_changeset/3","doc":"","ref":"Plausible.Funnels.html#edit_changeset/3"},{"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":"function","title":"Plausible.Funnels.update/3","doc":"","ref":"Plausible.Funnels.html#update/3"},{"type":"function","title":"Plausible.Funnels.with_goals_query/1","doc":"","ref":"Plausible.Funnels.html#with_goals_query/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 * `:cache_dir` - if set, the downloaded .mmdb files are cached there across\n restarts.\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":"function","title":"Plausible.Goal.display_name/1","doc":"","ref":"Plausible.Goal.html#display_name/1"},{"type":"function","title":"Plausible.Goal.max_event_name_length/0","doc":"","ref":"Plausible.Goal.html#max_event_name_length/0"},{"type":"function","title":"Plausible.Goal.type/1","doc":"","ref":"Plausible.Goal.html#type/1"},{"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_option/1","doc":"","ref":"Plausible.Goal.Revenue.html#currency_option/1"},{"type":"function","title":"Plausible.Goal.Revenue.currency_options/0","doc":"","ref":"Plausible.Goal.Revenue.html#currency_options/0"},{"type":"function","title":"Plausible.Goal.Revenue.display/1","doc":"","ref":"Plausible.Goal.Revenue.html#display/1"},{"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.batch_create_event_goals/2","doc":"","ref":"Plausible.Goals.html#batch_create_event_goals/2"},{"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.create_404/1","doc":"","ref":"Plausible.Goals.html#create_404/1"},{"type":"function","title":"Plausible.Goals.create_file_downloads/1","doc":"","ref":"Plausible.Goals.html#create_file_downloads/1"},{"type":"function","title":"Plausible.Goals.create_outbound_links/1","doc":"","ref":"Plausible.Goals.html#create_outbound_links/1"},{"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.delete_404/1","doc":"","ref":"Plausible.Goals.html#delete_404/1"},{"type":"function","title":"Plausible.Goals.delete_file_downloads/1","doc":"","ref":"Plausible.Goals.html#delete_file_downloads/1"},{"type":"function","title":"Plausible.Goals.delete_outbound_links/1","doc":"","ref":"Plausible.Goals.html#delete_outbound_links/1"},{"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":"function","title":"Plausible.Goals.get/2","doc":"","ref":"Plausible.Goals.html#get/2"},{"type":"function","title":"Plausible.Goals.list_revenue_goals/1","doc":"","ref":"Plausible.Goals.html#list_revenue_goals/1"},{"type":"function","title":"Plausible.Goals.update/2","doc":"","ref":"Plausible.Goals.html#update/2"},{"type":"module","title":"Plausible.Google.API","doc":"API to Google services.","ref":"Plausible.Google.API.html"},{"type":"function","title":"Plausible.Google.API.fetch_access_token!/1","doc":"","ref":"Plausible.Google.API.html#fetch_access_token!/1"},{"type":"function","title":"Plausible.Google.API.fetch_stats/4","doc":"","ref":"Plausible.Google.API.html#fetch_stats/4"},{"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_analytics_end_date/2","doc":"","ref":"Plausible.Google.API.html#get_analytics_end_date/2"},{"type":"function","title":"Plausible.Google.API.get_analytics_start_date/2","doc":"","ref":"Plausible.Google.API.html#get_analytics_start_date/2"},{"type":"function","title":"Plausible.Google.API.get_property/2","doc":"","ref":"Plausible.Google.API.html#get_property/2"},{"type":"function","title":"Plausible.Google.API.import_authorize_url/1","doc":"","ref":"Plausible.Google.API.html#import_authorize_url/1"},{"type":"function","title":"Plausible.Google.API.list_properties/1","doc":"","ref":"Plausible.Google.API.html#list_properties/1"},{"type":"function","title":"Plausible.Google.API.maybe_refresh_token/1","doc":"","ref":"Plausible.Google.API.html#maybe_refresh_token/1"},{"type":"function","title":"Plausible.Google.API.property?/1","doc":"","ref":"Plausible.Google.API.html#property?/1"},{"type":"function","title":"Plausible.Google.API.search_console_authorize_url/1","doc":"","ref":"Plausible.Google.API.html#search_console_authorize_url/1"},{"type":"module","title":"Plausible.Google.API.Mock","doc":"Mock of API to Google services.","ref":"Plausible.Google.API.Mock.html"},{"type":"function","title":"Plausible.Google.API.Mock.fetch_stats/4","doc":"","ref":"Plausible.Google.API.Mock.html#fetch_stats/4"},{"type":"module","title":"Plausible.Google.GA4.API","doc":"API for Google Analytics 4.","ref":"Plausible.Google.GA4.API.html"},{"type":"function","title":"Plausible.Google.GA4.API.fetch_and_persist/2","doc":"","ref":"Plausible.Google.GA4.API.html#fetch_and_persist/2"},{"type":"function","title":"Plausible.Google.GA4.API.get_analytics_end_date/2","doc":"","ref":"Plausible.Google.GA4.API.html#get_analytics_end_date/2"},{"type":"function","title":"Plausible.Google.GA4.API.get_analytics_start_date/2","doc":"","ref":"Plausible.Google.GA4.API.html#get_analytics_start_date/2"},{"type":"function","title":"Plausible.Google.GA4.API.get_property/2","doc":"","ref":"Plausible.Google.GA4.API.html#get_property/2"},{"type":"function","title":"Plausible.Google.GA4.API.import_analytics/4","doc":"","ref":"Plausible.Google.GA4.API.html#import_analytics/4"},{"type":"function","title":"Plausible.Google.GA4.API.list_properties/1","doc":"","ref":"Plausible.Google.GA4.API.html#list_properties/1"},{"type":"type","title":"Plausible.Google.GA4.API.import_auth/0","doc":"","ref":"Plausible.Google.GA4.API.html#t:import_auth/0"},{"type":"module","title":"Plausible.Google.GA4.HTTP","doc":"HTTP client implementation for Google Analytics 4 API.","ref":"Plausible.Google.GA4.HTTP.html"},{"type":"function","title":"Plausible.Google.GA4.HTTP.get_analytics_end_date/2","doc":"","ref":"Plausible.Google.GA4.HTTP.html#get_analytics_end_date/2"},{"type":"function","title":"Plausible.Google.GA4.HTTP.get_analytics_start_date/2","doc":"","ref":"Plausible.Google.GA4.HTTP.html#get_analytics_start_date/2"},{"type":"function","title":"Plausible.Google.GA4.HTTP.get_property/2","doc":"","ref":"Plausible.Google.GA4.HTTP.html#get_property/2"},{"type":"function","title":"Plausible.Google.GA4.HTTP.get_report/1","doc":"","ref":"Plausible.Google.GA4.HTTP.html#get_report/1"},{"type":"function","title":"Plausible.Google.GA4.HTTP.list_accounts_for_user/1","doc":"","ref":"Plausible.Google.GA4.HTTP.html#list_accounts_for_user/1"},{"type":"module","title":"Plausible.Google.GA4.ReportRequest","doc":"Report request struct for Google Analytics 4 API","ref":"Plausible.Google.GA4.ReportRequest.html"},{"type":"function","title":"Plausible.Google.GA4.ReportRequest.full_report/0","doc":"","ref":"Plausible.Google.GA4.ReportRequest.html#full_report/0"},{"type":"type","title":"Plausible.Google.GA4.ReportRequest.t/0","doc":"","ref":"Plausible.Google.GA4.ReportRequest.html#t:t/0"},{"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.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.refresh_auth_token/1","doc":"","ref":"Plausible.Google.HTTP.html#refresh_auth_token/1"},{"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.HelpScout","doc":"HelpScout callback API logic.","ref":"Plausible.HelpScout.html"},{"type":"function","title":"Plausible.HelpScout.get_details_for_customer/1","doc":"","ref":"Plausible.HelpScout.html#get_details_for_customer/1"},{"type":"function","title":"Plausible.HelpScout.get_details_for_emails/2","doc":"","ref":"Plausible.HelpScout.html#get_details_for_emails/2"},{"type":"function","title":"Plausible.HelpScout.search_users/2","doc":"","ref":"Plausible.HelpScout.html#search_users/2"},{"type":"function","title":"Plausible.HelpScout.signature_errors/0","doc":"","ref":"Plausible.HelpScout.html#signature_errors/0"},{"type":"function","title":"Plausible.HelpScout.validate_signature/1","doc":"Validates signature against secret key configured for the\nHelpScout application.\n\nNOTE: HelpScout signature generation procedure at\nhttps://developer.helpscout.com/apps/guides/signature-validation/\nfails to mention that it's implicitly dependent on request params\norder getting preserved. PHP arrays are ordered maps, so they provide\nthis guarantee. Here, on the other hand, we have to determine the original\norder of the keys directly from the query string and serialize\nparams to JSON using wrapper struct, informing Jason to put the values\nin the serialized object in this particular order matching query string.","ref":"Plausible.HelpScout.html#validate_signature/1"},{"type":"type","title":"Plausible.HelpScout.signature_error/0","doc":"","ref":"Plausible.HelpScout.html#t:signature_error/0"},{"type":"module","title":"Plausible.HelpScout.Vault","doc":"Provides a vault that will be used to encrypt/decrypt the stored HelpScout API access tokens.","ref":"Plausible.HelpScout.Vault.html"},{"type":"function","title":"Plausible.HelpScout.Vault.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.HelpScout.Vault.html#child_spec/1"},{"type":"function","title":"Plausible.HelpScout.Vault.start_link/1","doc":"","ref":"Plausible.HelpScout.Vault.html#start_link/1"},{"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.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.ImportDeletionRepo.html#alter_update_all/3"},{"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_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.ImportDeletionRepo.html#to_inline_sql/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\nFor list of currently supported import sources see `Plausible.Imported.ImportSources`.\n\nFor more information on implementing importers, see `Plausible.Imported.Importer`.","ref":"Plausible.Imported.html"},{"type":"function","title":"Plausible.Imported.clamp_dates/3","doc":"","ref":"Plausible.Imported.html#clamp_dates/3"},{"type":"function","title":"Plausible.Imported.clamp_dates/4","doc":"","ref":"Plausible.Imported.html#clamp_dates/4"},{"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_cutoff_date/1","doc":"","ref":"Plausible.Imported.html#get_cutoff_date/1"},{"type":"function","title":"Plausible.Imported.get_import/2","doc":"","ref":"Plausible.Imported.html#get_import/2"},{"type":"function","title":"Plausible.Imported.get_imports_date_range/1","doc":"","ref":"Plausible.Imported.html#get_imports_date_range/1"},{"type":"function","title":"Plausible.Imported.get_legacy_import/1","doc":"","ref":"Plausible.Imported.html#get_legacy_import/1"},{"type":"function","title":"Plausible.Imported.get_occupied_date_ranges/1","doc":"","ref":"Plausible.Imported.html#get_occupied_date_ranges/1"},{"type":"function","title":"Plausible.Imported.goals_with_path/0","doc":"","ref":"Plausible.Imported.html#goals_with_path/0"},{"type":"function","title":"Plausible.Imported.goals_with_url/0","doc":"","ref":"Plausible.Imported.html#goals_with_url/0"},{"type":"function","title":"Plausible.Imported.imported_custom_props/0","doc":"","ref":"Plausible.Imported.html#imported_custom_props/0"},{"type":"function","title":"Plausible.Imported.list_all_imports/2","doc":"","ref":"Plausible.Imported.html#list_all_imports/2"},{"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.other_imports_in_progress?/1","doc":"","ref":"Plausible.Imported.html#other_imports_in_progress?/1"},{"type":"function","title":"Plausible.Imported.schemas/0","doc":"","ref":"Plausible.Imported.html#schemas/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/1","doc":"","ref":"Plausible.Imported.Buffer.html#start_link/1"},{"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 either S3 for which it uses ClickHouse [s3 table function](https://clickhouse.com/docs/en/sql-reference/table-functions/s3)\nor from local storage for which it uses [input function.](https://clickhouse.com/docs/en/sql-reference/table-functions/input)","ref":"Plausible.Imported.CSVImporter.html"},{"type":"function","title":"Plausible.Imported.CSVImporter.date_range/1","doc":"Extracts min/max date range from a list of uploads.\n\nExamples:\n\n iex> date_range([\n ...> %{\"filename\" => \"imported_devices_20190101_20210101.csv\"},\n ...> \"pages_20200101_20220101.csv\"\n ...> ])\n Date.range(~D[2019-01-01], ~D[2022-01-01])\n\n iex> date_range([])\n nil","ref":"Plausible.Imported.CSVImporter.html#date_range/1"},{"type":"function","title":"Plausible.Imported.CSVImporter.extract_table/1","doc":"Extracts the table name from the provided filename.\n\nRaises if the filename doesn't conform to the expected format.\n\nExamples:\n\n iex> extract_table(\"my_data.csv\")\n ** (ArgumentError) invalid filename\n\n iex> extract_table(\"imported_devices_00010101_20250101.csv\")\n \"imported_devices\"\n\n iex> extract_table(\"devices_00010101_20250101.csv\")\n \"imported_devices\"","ref":"Plausible.Imported.CSVImporter.html#extract_table/1"},{"type":"function","title":"Plausible.Imported.CSVImporter.local_dir/1","doc":"Returns local directory for CSV imports storage.\n\nBuilds upon `$DATA_DIR`, `$PERSISTENT_CACHE_DIR` or `$DEFAULT_DATA_DIR` (if set) and falls back to /tmp.\n\n`$DEFAULT_DATA_DIR` is set to `/var/lib/plausible` in container images.\n\nExamples:\n\n iex> local_dir = local_dir(_site_id = 37)\n iex> String.ends_with?(local_dir, \"/plausible-imports/37\")\n true","ref":"Plausible.Imported.CSVImporter.html#local_dir/1"},{"type":"function","title":"Plausible.Imported.CSVImporter.new_import/3","doc":"","ref":"Plausible.Imported.CSVImporter.html#new_import/3"},{"type":"function","title":"Plausible.Imported.CSVImporter.parse_filename!/1","doc":"Extracts table name and min/max dates from the filename.\n\nExamples:\n\n iex> parse_filename!(\"my_data.csv\")\n ** (ArgumentError) invalid filename\n\n iex> parse_filename!(\"imported_devices_00010101_20250101.csv\")\n {\"imported_devices\", ~D[0001-01-01], ~D[2025-01-01]}\n\n iex> parse_filename!(\"devices_00010101_20250101.csv\")\n {\"imported_devices\", ~D[0001-01-01], ~D[2025-01-01]}","ref":"Plausible.Imported.CSVImporter.html#parse_filename!/1"},{"type":"function","title":"Plausible.Imported.CSVImporter.valid_filename?/1","doc":"Checks if the provided filename conforms to the expected format.\n\nExamples:\n\n iex> valid_filename?(\"my_data.csv\")\n false\n\n iex> valid_filename?(\"imported_devices_00010101_20250101.csv\")\n true\n\n iex> valid_filename?(\"devices_00010101_20250101.csv\")\n true","ref":"Plausible.Imported.CSVImporter.html#valid_filename?/1"},{"type":"module","title":"Plausible.Imported.GoogleAnalytics4","doc":"Import implementation for Google Analytics 4.","ref":"Plausible.Imported.GoogleAnalytics4.html"},{"type":"function","title":"Plausible.Imported.GoogleAnalytics4.from_report/4","doc":"","ref":"Plausible.Imported.GoogleAnalytics4.html#from_report/4"},{"type":"function","title":"Plausible.Imported.GoogleAnalytics4.import_data/2","doc":"Imports stats from a Google Analytics 4 property to a Plausible site.\n\nThis function fetches Google Analytics 4 reports which are then passed in batches\nto Clickhouse by the `Plausible.Imported.Buffer` process.","ref":"Plausible.Imported.GoogleAnalytics4.html#import_data/2"},{"type":"function","title":"Plausible.Imported.GoogleAnalytics4.new_import/3","doc":"","ref":"Plausible.Imported.GoogleAnalytics4.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. The error tuple has an alternative `{error, reason, opts}` form,\n where `opts` allow to skip purging imported data so far via `skip_purge?` flag\n and skip marking the import as failed and notifying the user via `skip_mark_failed?`\n flag. Both flags are booleans.\n* `before_start/2` - Optional callback run right before scheduling import job. It's\n expected to either return `{:ok, site_import}` for the import to proceed\n or `{:error, ...}` tuple, which will be returned from `new_import/3` call.\n The `site_import` can be altered or replaced at this stage. The second argument\n are opts passed to `new_import/3`.\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, %{\"event\" => \"complete\", \"import_id\" => ^import_id}} ->\n IO.puts(\"Job completed\")\n\n {:notification, :analytics_imports_jobs, %{\"event\" => \"transient_fail\", \"import_id\" => ^import_id}} ->\n IO.puts(\"Job failed transiently\")\n\n {:notification, :analytics_imports_jobs, %{\"event\" => \"fail\", \"import_id\" => ^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/2","doc":"","ref":"Plausible.Imported.Importer.html#c:before_start/2"},{"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":"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.\n\nNOTE: As importing from UA is no longer supported, this module\nis only used to support rendering existing imports.","ref":"Plausible.Imported.UniversalAnalytics.html"},{"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.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.IngestRepo.html#alter_update_all/3"},{"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.clustered_table?/1","doc":"","ref":"Plausible.IngestRepo.html#clustered_table?/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.replica_count/1","doc":"","ref":"Plausible.IngestRepo.html#replica_count/1"},{"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_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.IngestRepo.html#to_inline_sql/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.Acquisition","doc":"This module is responsible for figuring out acquisition channel from event referrer_source.\n\nAcquisition channel is the marketing channel where people come from and convert and help\nusers to understand and improve their marketing flow.\n\nNote it uses priv/ga4-source-categories.csv as a source, which comes from https://support.google.com/analytics/answer/9756891?hl=en.\n\nNotable differences from GA4 that have been implemented just for Plausible:\n1. The @custom_source_categories module attribute contains a list of custom source categories that we have manually\nadded based on our own judgement and user feedback. For example we treat AI tools (ChatGPT, Perplexity) as search engines.\n2. Google is in a privileged position to analyze paid traffic from within their own network. The biggest use-case is auto-tagged adwords campaigns.\nWe do our best by categorizing as paid search when source is Google and the url has `gclid` parameter. Same for source Bing and `msclkid` url parameter.\n3. The @paid_sources module attribute in Plausible.Ingestion.Source contains a list of utm_sources that we will automatically categorize as paid traffic\nregardless of the medium. Examples are `yt-ads`, `facebook_ad`, `adwords`, etc. See also: Plausible.Ingestion.Source.paid_source?/1","ref":"Plausible.Ingestion.Acquisition.html"},{"type":"function","title":"Plausible.Ingestion.Acquisition.get_channel/5","doc":"","ref":"Plausible.Ingestion.Acquisition.html#get_channel/5"},{"type":"function","title":"Plausible.Ingestion.Acquisition.source_categories/0","doc":"","ref":"Plausible.Ingestion.Acquisition.html#source_categories/0"},{"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/2","doc":"","ref":"Plausible.Ingestion.Event.html#build_and_buffer/2"},{"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":"function","title":"Plausible.Ingestion.Event.telemetry_pipeline_step_duration/0","doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_pipeline_step_duration/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.Ingestion.Source","doc":"Resolves the `source` dimension from a combination of `referer` header and either `utm_source`, `source`, or `ref` query parameter.","ref":"Plausible.Ingestion.Source.html"},{"type":"function","title":"Plausible.Ingestion.Source.find_mapping/1","doc":"","ref":"Plausible.Ingestion.Source.html#find_mapping/1"},{"type":"function","title":"Plausible.Ingestion.Source.format_referrer/1","doc":"","ref":"Plausible.Ingestion.Source.html#format_referrer/1"},{"type":"function","title":"Plausible.Ingestion.Source.init/0","doc":"","ref":"Plausible.Ingestion.Source.html#init/0"},{"type":"function","title":"Plausible.Ingestion.Source.paid_source?/1","doc":"","ref":"Plausible.Ingestion.Source.html#paid_source?/1"},{"type":"function","title":"Plausible.Ingestion.Source.paid_sources/0","doc":"","ref":"Plausible.Ingestion.Source.html#paid_sources/0"},{"type":"function","title":"Plausible.Ingestion.Source.parse/1","doc":"","ref":"Plausible.Ingestion.Source.html#parse/1"},{"type":"function","title":"Plausible.Ingestion.Source.resolve/1","doc":"Resolves the source of a session based on query params and the `Referer` header.\n\nWhen a query parameter like `utm_source` is present, it will be prioritized over the `Referer` header. When the URL does not contain a source tag, we fall\nback to using `Referer` to determine the source. This module also takes care of certain transformations to make the data more useful for the user:\n1. The RefInspector library is used to categorize referrers into \"known\" sources. For example, when the referrer is google.com or google.co.uk,\nit will always be stored as \"Google\" which is more useful for marketers.\n2. On top of the standard RefInspector behaviour, we also keep a list of `custom_sources.json` which extends it with referrers that we have seen in the wild.\nFor example, Wikipedia has many domains that need to be combined into a single known source. These could all in theory be [upstreamed](https://github.com/snowplow-referer-parser/referer-parser).\n3. When a known source is supplied in utm_source (or source, ref) query parameter, we merge it with our known sources in a case-insensitive manner.\n4. Our list of `custom_sources.json` also contains some commonly used utm_source shorthands for certain sources. URL tagging is a mess, and we can never do it\nperfectly, but at least we're making an effort for the most commonly used ones. For example, `ig -> Instagram` and `adwords -> Google`.\n\n#","ref":"Plausible.Ingestion.Source.html#resolve/1"},{"type":"function","title":"Examples: - Plausible.Ingestion.Source.resolve/1","doc":"iex> alias Plausible.Ingestion.{Source, Request}\n iex> base_request = %Request{uri: URI.parse(\"https://plausible.io\")}\n iex> Source.resolve(%{base_request | referrer: \"https://google.com\"}) # Known referrer from RefInspector\n \"Google\"\n iex> Source.resolve(%{base_request | query_params: %{\"utm_source\" => \"google\"}}) # Known source from RefInspector supplied as downcased utm_source by user\n \"Google\"\n iex> Source.resolve(%{base_request | query_params: %{\"utm_source\" => \"GOOGLE\"}}) # Known source from RefInspector supplied as uppercased utm_source by user\n \"Google\"\n iex> Source.resolve(%{base_request | referrer: \"https://en.m.wikipedia.org\"}) # Known referrer from custom_sources.json\n \"Wikipedia\"\n iex> Source.resolve(%{base_request | query_params: %{\"utm_source\" => \"wikipedia\"}}) # Known source from custom_sources.json supplied as downcased utm_source by user\n \"Wikipedia\"\n iex> Source.resolve(%{base_request | query_params: %{\"utm_source\" => \"ig\"}}) # Known utm_source from custom_sources.json\n \"Instagram\"\n iex> Source.resolve(%{base_request | referrer: \"https://www.markosaric.com\"}) # Unknown source, it is just stored as the domain name\n \"markosaric.com\"","ref":"Plausible.Ingestion.Source.html#resolve/1-examples"},{"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.LiveViewTest","doc":"Temporary fix for `Phoenix.LiveViewTest.render_component/2` failing CI with warnings.\n\nThis module can be removed once Plausible switches to `phoenix_live_view ~> 1.0.0`","ref":"Plausible.LiveViewTest.html"},{"type":"macro","title":"Plausible.LiveViewTest.render_component/3","doc":"Same as `Phoenix.LiveViewTest.render_component/2` but with backported fixes from\nhttps://github.com/phoenixframework/phoenix_live_view/commit/489e8de024e03976e9ae38138eec517fbd456d27","ref":"Plausible.LiveViewTest.html#render_component/3"},{"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.dictionary_connection_params/0","doc":"","ref":"Plausible.MigrationUtils.html#dictionary_connection_params/0"},{"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/2","doc":"","ref":"Plausible.PaddleApi.Mock.html#fetch_prices/2"},{"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.Funnels","doc":"Plugins API context module for Funnels.\nAll high level Funnel operations should be implemented here.","ref":"Plausible.Plugins.API.Funnels.html"},{"type":"function","title":"Plausible.Plugins.API.Funnels.create/2","doc":"","ref":"Plausible.Plugins.API.Funnels.html#create/2"},{"type":"function","title":"Plausible.Plugins.API.Funnels.get/2","doc":"","ref":"Plausible.Plugins.API.Funnels.html#get/2"},{"type":"function","title":"Plausible.Plugins.API.Funnels.get_funnels/2","doc":"","ref":"Plausible.Plugins.API.Funnels.html#get_funnels/2"},{"type":"type","title":"Plausible.Plugins.API.Funnels.create_request/0","doc":"","ref":"Plausible.Plugins.API.Funnels.html#t:create_request/0"},{"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":"Fire telemetry events for various caches","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":"function","title":"Plausible.PromEx.Plugins.PlausibleMetrics.measure_duration/3","doc":"","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#measure_duration/3"},{"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\", \"search_query\"]`) 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/1","doc":"","ref":"Plausible.Release.html#createdb/1"},{"type":"function","title":"Plausible.Release.dump_plans/0","doc":"","ref":"Plausible.Release.html#dump_plans/0"},{"type":"function","title":"Plausible.Release.interweave_migrate/1","doc":"`interweave_migrate/0` is a migration function that:\n\n- Lists all pending migrations across multiple repositories.\n- Sorts these migrations into a single list.\n- Groups consecutive migrations by repository into \"streaks\".\n- Executes the migrations in the correct order by processing each streak sequentially.\n\n#","ref":"Plausible.Release.html#interweave_migrate/1"},{"type":"function","title":"Why Use This Approach? - Plausible.Release.interweave_migrate/1","doc":"This function resolves dependencies between migrations that span across different repositories.\nThe default `migrate/0` function migrates each repository independently, which may result in\nmigrations running in the wrong order when there are cross-repository dependencies.\n\nConsider the following example (adapted from reality, not 100% accurate):\n\n- **Migration 1**: The PostgreSQL (PG) repository creates a table named `site_imports`.\n- **Migration 2**: The ClickHouse (CH) repository creates `import_id` columns in `imported_*` tables.\n- **Migration 3**: The PG repository runs a data migration that utilizes both PG and CH databases,\n reading from the `import_id` column in `imported_*` tables.\n\nThe default `migrate/0` would execute these migrations by repository, resulting in the following order:\n\n1. Migration 1 (PG)\n2. Migration 3 (PG)\n3. Migration 2 (CH)\n\nThis sequence would fail at Migration 3, as the `import_id` columns in the CH repository have not been created yet.\n\n`interweave_migrate/0` addresses this issue by consolidating all pending migrations into a single, ordered queue:\n\n1. Migration 1 (PG)\n2. Migration 2 (CH)\n3. Migration 3 (PG)\n\nThis ensures all dependencies are resolved in the correct order.","ref":"Plausible.Release.html#interweave_migrate/1-why-use-this-approach"},{"type":"function","title":"Plausible.Release.pending_streaks/1","doc":"","ref":"Plausible.Release.html#pending_streaks/1"},{"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.RequestLogger","doc":"Custom request logger which:\n- Includes query parameters on the same line\n- Includes request duration on the same line","ref":"Plausible.RequestLogger.html"},{"type":"function","title":"Plausible.RequestLogger.log_request/4","doc":"","ref":"Plausible.RequestLogger.html#log_request/4"},{"type":"module","title":"Plausible.S3","doc":"Helper functions for S3 exports/imports.","ref":"Plausible.S3.html"},{"type":"function","title":"Plausible.S3.download_url/2","doc":"Returns a presigned URL to download the exported Zip archive from S3.\nThe URL expires in 300 seconds, which should be enough for a redirect.\n\nIn the current implementation the bucket always goes into the path component.","ref":"Plausible.S3.html#download_url/2"},{"type":"function","title":"Plausible.S3.export_upload_multipart/4","doc":"Chunks and uploads Zip archive to the provided S3 destination.\n\nIn the current implementation the bucket always goes into the path component.","ref":"Plausible.S3.html#export_upload_multipart/4"},{"type":"function","title":"Plausible.S3.exports_bucket/0","doc":"Returns the pre-configured S3 bucket for CSV exports.\n\n config :plausible, Plausible.S3,\n exports_bucket: System.fetch_env!(\"S3_EXPORTS_BUCKET\")\n\nExample:\n\n iex> exports_bucket()\n \"test-exports\"","ref":"Plausible.S3.html#exports_bucket/0"},{"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.\n\nExample:\n\n iex> import_clickhouse_credentials()\n %{access_key_id: \"minioadmin\", secret_access_key: \"minioadmin\"}","ref":"Plausible.S3.html#import_clickhouse_credentials/0"},{"type":"function","title":"Plausible.S3.import_presign_upload/2","doc":"Presigns an upload for an imported file.\n\nIn the current implementation the bucket always goes into the path component.\n\nExample:\n\n iex> upload = import_presign_upload(_site_id = 123, _filename = \"imported_browsers.csv\")\n iex> true = String.ends_with?(upload.s3_url, \"/test-imports/123/imported_browsers.csv\")\n iex> true = String.contains?(upload.presigned_url, \"/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&\")","ref":"Plausible.S3.html#import_presign_upload/2"},{"type":"function","title":"Plausible.S3.imports_bucket/0","doc":"Returns the pre-configured S3 bucket for CSV imports.\n\n config :plausible, Plausible.S3,\n imports_bucket: System.fetch_env!(\"S3_IMPORTS_BUCKET\")\n\nExample:\n\n iex> imports_bucket()\n \"test-imports\"","ref":"Plausible.S3.html#imports_bucket/0"},{"type":"module","title":"Plausible.Sentry.Client","doc":"","ref":"Plausible.Sentry.Client.html"},{"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":"module","title":"Plausible.Session.CacheStore","doc":"","ref":"Plausible.Session.CacheStore.html"},{"type":"function","title":"Plausible.Session.CacheStore.lock_telemetry_event/0","doc":"","ref":"Plausible.Session.CacheStore.html#lock_telemetry_event/0"},{"type":"function","title":"Plausible.Session.CacheStore.on_event/4","doc":"","ref":"Plausible.Session.CacheStore.html#on_event/4"},{"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.get_or_store/3","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#get_or_store/3"},{"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.HostnameRule","doc":"Schema for Hostnames allow list","ref":"Plausible.Shield.HostnameRule.html"},{"type":"function","title":"Plausible.Shield.HostnameRule.changeset/2","doc":"","ref":"Plausible.Shield.HostnameRule.html#changeset/2"},{"type":"type","title":"Plausible.Shield.HostnameRule.t/0","doc":"","ref":"Plausible.Shield.HostnameRule.html#t:t/0"},{"type":"module","title":"Plausible.Shield.HostnameRuleCache","doc":"Allows retrieving Hostname Rules by domain","ref":"Plausible.Shield.HostnameRuleCache.html"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.child_spec/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#child_spec/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.get/2","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#get/2"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.get_or_store/3","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#get_or_store/3"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.hit_rate/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#hit_rate/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.merge_items/2","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#merge_items/2"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.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.HostnameRuleCache.html#ready?/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.refresh_all/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#refresh_all/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.refresh_updated_recently/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.size/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#size/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Shield.HostnameRuleCache.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.get_or_store/3","doc":"","ref":"Plausible.Shield.IPRuleCache.html#get_or_store/3"},{"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.Shield.PageRule","doc":"Schema for Pages block list","ref":"Plausible.Shield.PageRule.html"},{"type":"function","title":"Plausible.Shield.PageRule.changeset/2","doc":"","ref":"Plausible.Shield.PageRule.html#changeset/2"},{"type":"type","title":"Plausible.Shield.PageRule.t/0","doc":"","ref":"Plausible.Shield.PageRule.html#t:t/0"},{"type":"module","title":"Plausible.Shield.PageRuleCache","doc":"Allows retrieving Page Rules by domain","ref":"Plausible.Shield.PageRuleCache.html"},{"type":"function","title":"Plausible.Shield.PageRuleCache.child_spec/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#child_spec/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.get/2","doc":"","ref":"Plausible.Shield.PageRuleCache.html#get/2"},{"type":"function","title":"Plausible.Shield.PageRuleCache.get_or_store/3","doc":"","ref":"Plausible.Shield.PageRuleCache.html#get_or_store/3"},{"type":"function","title":"Plausible.Shield.PageRuleCache.hit_rate/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#hit_rate/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.merge_items/2","doc":"","ref":"Plausible.Shield.PageRuleCache.html#merge_items/2"},{"type":"function","title":"Plausible.Shield.PageRuleCache.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.PageRuleCache.html#ready?/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.refresh_all/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#refresh_all/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.refresh_updated_recently/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.size/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#size/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Shield.PageRuleCache.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_hostname_rule/3","doc":"","ref":"Plausible.Shields.html#add_hostname_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.add_page_rule/3","doc":"","ref":"Plausible.Shields.html#add_page_rule/3"},{"type":"function","title":"Plausible.Shields.allowed_hostname_patterns/1","doc":"","ref":"Plausible.Shields.html#allowed_hostname_patterns/1"},{"type":"function","title":"Plausible.Shields.count_country_rules/1","doc":"","ref":"Plausible.Shields.html#count_country_rules/1"},{"type":"function","title":"Plausible.Shields.count_hostname_rules/1","doc":"","ref":"Plausible.Shields.html#count_hostname_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.count_page_rules/1","doc":"","ref":"Plausible.Shields.html#count_page_rules/1"},{"type":"function","title":"Plausible.Shields.country_blocked?/2","doc":"","ref":"Plausible.Shields.html#country_blocked?/2"},{"type":"function","title":"Plausible.Shields.hostname_allowed?/2","doc":"","ref":"Plausible.Shields.html#hostname_allowed?/2"},{"type":"function","title":"Plausible.Shields.ip_blocked?/2","doc":"","ref":"Plausible.Shields.html#ip_blocked?/2"},{"type":"function","title":"Plausible.Shields.list_country_rules/1","doc":"","ref":"Plausible.Shields.html#list_country_rules/1"},{"type":"function","title":"Plausible.Shields.list_hostname_rules/1","doc":"","ref":"Plausible.Shields.html#list_hostname_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.list_page_rules/1","doc":"","ref":"Plausible.Shields.html#list_page_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_hostname_rules/0","doc":"","ref":"Plausible.Shields.html#maximum_hostname_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.maximum_page_rules/0","doc":"","ref":"Plausible.Shields.html#maximum_page_rules/0"},{"type":"function","title":"Plausible.Shields.page_blocked?/2","doc":"","ref":"Plausible.Shields.html#page_blocked?/2"},{"type":"function","title":"Plausible.Shields.remove_country_rule/2","doc":"","ref":"Plausible.Shields.html#remove_country_rule/2"},{"type":"function","title":"Plausible.Shields.remove_hostname_rule/2","doc":"","ref":"Plausible.Shields.html#remove_hostname_rule/2"},{"type":"function","title":"Plausible.Shields.remove_ip_rule/2","doc":"","ref":"Plausible.Shields.html#remove_ip_rule/2"},{"type":"function","title":"Plausible.Shields.remove_page_rule/2","doc":"","ref":"Plausible.Shields.html#remove_page_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.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.new_for_team/2","doc":"","ref":"Plausible.Site.html#new_for_team/2"},{"type":"function","title":"Plausible.Site.set_native_stats_start_at/2","doc":"","ref":"Plausible.Site.html#set_native_stats_start_at/2"},{"type":"function","title":"Plausible.Site.set_stats_start_date/2","doc":"","ref":"Plausible.Site.html#set_stats_start_date/2"},{"type":"function","title":"Plausible.Site.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_or_store/3","doc":"","ref":"Plausible.Site.Cache.html#get_or_store/3"},{"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\n\nNOTE: needed by `SiteImports` data migration script","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.InstallationMeta","doc":"Embedded schema for installation meta-data","ref":"Plausible.Site.InstallationMeta.html"},{"type":"type","title":"Plausible.Site.InstallationMeta.t/0","doc":"","ref":"Plausible.Site.InstallationMeta.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.all_pending_ownerships/1","doc":"","ref":"Plausible.Site.Memberships.html#all_pending_ownerships/1"},{"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.TrafficChangeNotification","doc":"Configuration schema for site-specific traffic change notifications.","ref":"Plausible.Site.TrafficChangeNotification.html"},{"type":"function","title":"Plausible.Site.TrafficChangeNotification.add_recipient/2","doc":"","ref":"Plausible.Site.TrafficChangeNotification.html#add_recipient/2"},{"type":"function","title":"Plausible.Site.TrafficChangeNotification.changeset/2","doc":"","ref":"Plausible.Site.TrafficChangeNotification.html#changeset/2"},{"type":"function","title":"Plausible.Site.TrafficChangeNotification.remove_recipient/2","doc":"","ref":"Plausible.Site.TrafficChangeNotification.html#remove_recipient/2"},{"type":"function","title":"Plausible.Site.TrafficChangeNotification.was_sent/1","doc":"","ref":"Plausible.Site.TrafficChangeNotification.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.before_update/2","doc":"","ref":"Plausible.SiteAdmin.html#before_update/2"},{"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.for_user_query/1","doc":"","ref":"Plausible.Sites.html#for_user_query/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_by_domain!/1","doc":"","ref":"Plausible.Sites.html#get_by_domain!/1"},{"type":"function","title":"Plausible.Sites.has_admin_access?/2","doc":"","ref":"Plausible.Sites.html#has_admin_access?/2"},{"type":"function","title":"Plausible.Sites.has_goals?/1","doc":"","ref":"Plausible.Sites.html#has_goals?/1"},{"type":"function","title":"Plausible.Sites.has_stats?/1","doc":"","ref":"Plausible.Sites.html#has_stats?/1"},{"type":"function","title":"Plausible.Sites.is_member?/2","doc":"","ref":"Plausible.Sites.html#is_member?/2"},{"type":"function","title":"Plausible.Sites.list/3","doc":"","ref":"Plausible.Sites.html#list/3"},{"type":"function","title":"Plausible.Sites.list_with_invitations/3","doc":"","ref":"Plausible.Sites.html#list_with_invitations/3"},{"type":"function","title":"Plausible.Sites.locked?/1","doc":"","ref":"Plausible.Sites.html#locked?/1"},{"type":"function","title":"Plausible.Sites.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.owned_sites_locked?/1","doc":"","ref":"Plausible.Sites.html#owned_sites_locked?/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":"function","title":"Plausible.Sites.update_installation_meta!/2","doc":"","ref":"Plausible.Sites.html#update_installation_meta!/2"},{"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/4","doc":"","ref":"Plausible.Stats.html#breakdown/4"},{"type":"function","title":"Plausible.Stats.current_visitors/2","doc":"","ref":"Plausible.Stats.html#current_visitors/2"},{"type":"function","title":"Plausible.Stats.custom_prop_value_filter_suggestions/4","doc":"","ref":"Plausible.Stats.html#custom_prop_value_filter_suggestions/4"},{"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.query/2","doc":"","ref":"Plausible.Stats.html#query/2"},{"type":"function","title":"Plausible.Stats.timeseries/3","doc":"","ref":"Plausible.Stats.html#timeseries/3"},{"type":"module","title":"Plausible.Stats.Aggregate","doc":"Builds aggregate results for v1 of our stats API and dashboards.\n\nAvoid adding new logic here - update QueryBuilder etc instead.","ref":"Plausible.Stats.Aggregate.html"},{"type":"function","title":"Plausible.Stats.Aggregate.aggregate/3","doc":"","ref":"Plausible.Stats.Aggregate.html#aggregate/3"},{"type":"function","title":"Plausible.Stats.Aggregate.get_value/3","doc":"","ref":"Plausible.Stats.Aggregate.html#get_value/3"},{"type":"function","title":"Plausible.Stats.Aggregate.metric_map/3","doc":"","ref":"Plausible.Stats.Aggregate.html#metric_map/3"},{"type":"module","title":"Plausible.Stats.Base","doc":"","ref":"Plausible.Stats.Base.html"},{"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.query_sessions/2","doc":"","ref":"Plausible.Stats.Base.html#query_sessions/2"},{"type":"module","title":"Plausible.Stats.Breakdown","doc":"Builds breakdown results for v1 of our stats API and dashboards.\n\nAvoid adding new logic here - update QueryBuilder etc instead.","ref":"Plausible.Stats.Breakdown.html"},{"type":"function","title":"Plausible.Stats.Breakdown.breakdown/5","doc":"","ref":"Plausible.Stats.Breakdown.html#breakdown/5"},{"type":"function","title":"Plausible.Stats.Breakdown.formatted_date_ranges/1","doc":"","ref":"Plausible.Stats.Breakdown.html#formatted_date_ranges/1"},{"type":"function","title":"Plausible.Stats.Breakdown.transform_dimensions/1","doc":"","ref":"Plausible.Stats.Breakdown.html#transform_dimensions/1"},{"type":"module","title":"Plausible.Stats.Clickhouse","doc":"","ref":"Plausible.Stats.Clickhouse.html"},{"type":"function","title":"Plausible.Stats.Clickhouse.current_visitors/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#current_visitors/1"},{"type":"function","title":"Plausible.Stats.Clickhouse.current_visitors_12h/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#current_visitors_12h/1"},{"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.add_comparison_filters/2","doc":"Builds comparison query that specifically filters for values appearing in the main query results.\n\nWhen querying for comparisons with dimensions and pagination, extra\nfilters are added to ensure comparison query returns same set of results\nas main query.","ref":"Plausible.Stats.Comparisons.html#add_comparison_filters/2"},{"type":"function","title":"Plausible.Stats.Comparisons.get_comparison_query/2","doc":"Generates a comparison query based on the source query and comparison mode.\n\nCurrently only historical periods are supported for comparisons (not `realtime`\nand `30m` periods).","ref":"Plausible.Stats.Comparisons.html#get_comparison_query/2"},{"type":"function","title":"Options - Plausible.Stats.Comparisons.get_comparison_query/2","doc":"* `mode` (required) - 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 `date_range` for\n more details.\n\n * `:date_range` - a ISO-8601 date string pair used when mode is `\"custom\"`.\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#get_comparison_query/2-options"},{"type":"module","title":"Plausible.Stats.CurrentVisitors","doc":"","ref":"Plausible.Stats.CurrentVisitors.html"},{"type":"function","title":"Plausible.Stats.CurrentVisitors.current_visitors/2","doc":"","ref":"Plausible.Stats.CurrentVisitors.html#current_visitors/2"},{"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.DateTimeRange","doc":"Defines a struct similar `Date.Range`, but with `DateTime` instead of `Date`.\n\nThe structs should be created with the `new!/2` function.","ref":"Plausible.Stats.DateTimeRange.html"},{"type":"function","title":"Plausible.Stats.DateTimeRange.new!/2","doc":"","ref":"Plausible.Stats.DateTimeRange.html#new!/2"},{"type":"function","title":"Plausible.Stats.DateTimeRange.new!/3","doc":"Creates a `DateTimeRange` struct from the given `%Date{}` structs.\n\nThe first datetime will become the first date at 00:00:00, and the last datetime\nwill become the last date at 23:59:59. Both dates will be turned into `%DateTime{}`\nstructs in the given timezone.","ref":"Plausible.Stats.DateTimeRange.html#new!/3"},{"type":"function","title":"Plausible.Stats.DateTimeRange.to_date_range/2","doc":"","ref":"Plausible.Stats.DateTimeRange.html#to_date_range/2"},{"type":"function","title":"Plausible.Stats.DateTimeRange.to_timezone/2","doc":"","ref":"Plausible.Stats.DateTimeRange.html#to_timezone/2"},{"type":"type","title":"Plausible.Stats.DateTimeRange.t/0","doc":"","ref":"Plausible.Stats.DateTimeRange.html#t:t/0"},{"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.custom_prop_value_filter_suggestions/4","doc":"","ref":"Plausible.Stats.FilterSuggestions.html#custom_prop_value_filter_suggestions/4"},{"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.dimensions_used_in_filters/2","doc":"","ref":"Plausible.Stats.Filters.html#dimensions_used_in_filters/2"},{"type":"function","title":"Plausible.Stats.Filters.event_props/0","doc":"","ref":"Plausible.Stats.Filters.html#event_props/0"},{"type":"function","title":"Plausible.Stats.Filters.event_table_visit_props/0","doc":"","ref":"Plausible.Stats.Filters.html#event_table_visit_props/0"},{"type":"function","title":"Plausible.Stats.Filters.filtering_on_dimension?/2","doc":"","ref":"Plausible.Stats.Filters.html#filtering_on_dimension?/2"},{"type":"function","title":"Plausible.Stats.Filters.get_toplevel_filter/2","doc":"Gets the first top level filter with matching dimension (or nil).\n\nOnly use in cases where it's known that filters are only set on the top level as it\ndoes not handle AND/OR/NOT!","ref":"Plausible.Stats.Filters.html#get_toplevel_filter/2"},{"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 list, when `filters` is encoded JSON\n * a parsed filter list, when `filters` is a filter expression string\n * the same list, when `filters` is a map\n\nReturns an empty list 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 [[:matches_wildcard, \"event:page\", [\"/blog/**\"]]]\n\n iex> Filters.parse(\"visit:browser!=Chrome\")\n [[:is_not, \"visit:browser\", [\"Chrome\"]]]\n\n iex> Filters.parse(nil)\n []","ref":"Plausible.Stats.Filters.html#parse/1-examples"},{"type":"function","title":"Plausible.Stats.Filters.rename_dimensions_used_in_filter/2","doc":"","ref":"Plausible.Stats.Filters.html#rename_dimensions_used_in_filter/2"},{"type":"function","title":"Plausible.Stats.Filters.transform_filters/2","doc":"Updates filters via `transformer`.\n\nTransformer will receive each node (filter, and/or/not subtree) of\nquery and must return a list of nodes to replace it with or nil\nto ignore and look deeper.","ref":"Plausible.Stats.Filters.html#transform_filters/2"},{"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 `LegacyDashboardFilterParser`\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.page_regex/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#page_regex/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.split_goals/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#split_goals/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.split_goals_query_expressions/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#split_goals_query_expressions/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.wildcard_expression?/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#wildcard_expression?/1"},{"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.available?/1","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#available?/1"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.format_revenue_metric/3","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#format_revenue_metric/3"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.preload_revenue_currencies/4","doc":"Preloads revenue currencies for a query.\n\nAssumptions and business logic:\n1. Goals are already filtered according to query filters and dimensions\n2. If there's a single currency involved, return map containing the default\n3. If there's a breakdown by event:goal we return all the relevant currencies as a map\n4. If filtering by multiple different currencies without event:goal breakdown empty map is returned\n5. If user has no access or preloading is not needed, empty map is returned\n\nThe resulting data structure is attached to a `Query` and used below in `format_revenue_metric/3`.","ref":"Plausible.Stats.Goal.Revenue.html#preload_revenue_currencies/4"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.requested?/1","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#requested?/1"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.revenue_metrics/0","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#revenue_metrics/0"},{"type":"module","title":"Plausible.Stats.Imported","doc":"","ref":"Plausible.Stats.Imported.html"},{"type":"function","title":"Plausible.Stats.Imported.goals_with_path/0","doc":"","ref":"Plausible.Stats.Imported.html#goals_with_path/0"},{"type":"function","title":"Plausible.Stats.Imported.goals_with_url/0","doc":"","ref":"Plausible.Stats.Imported.html#goals_with_url/0"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported/4","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported/4"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_city_suggestions/3","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_city_suggestions/3"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_country_suggestions/3","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_country_suggestions/3"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_filter_suggestions/5","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_filter_suggestions/5"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_region_suggestions/3","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_region_suggestions/3"},{"type":"function","title":"Plausible.Stats.Imported.schema_supports_query?/1","doc":"Returns a boolean indicating whether the combination of filters and\nbreakdown property is possible to query from the imported tables.\n\nUsually, when no filters are used, the imported schema supports the\nquery. There is one exception though - breakdown by a custom property.\nWe are currently importing only two custom properties - `url` and `path.\nBoth these properties can only be used with their special goal filter\n(see `@goals_with_url` and `@goals_with_path`).","ref":"Plausible.Stats.Imported.html#schema_supports_query?/1"},{"type":"function","title":"Plausible.Stats.Imported.total_imported_visitors/2","doc":"","ref":"Plausible.Stats.Imported.html#total_imported_visitors/2"},{"type":"module","title":"Plausible.Stats.Imported.Base","doc":"A module for building the base of an imported stats query","ref":"Plausible.Stats.Imported.Base.html"},{"type":"function","title":"Plausible.Stats.Imported.Base.decide_tables/1","doc":"","ref":"Plausible.Stats.Imported.Base.html#decide_tables/1"},{"type":"function","title":"Plausible.Stats.Imported.Base.property_to_table_mappings/0","doc":"","ref":"Plausible.Stats.Imported.Base.html#property_to_table_mappings/0"},{"type":"function","title":"Plausible.Stats.Imported.Base.query_imported/2","doc":"","ref":"Plausible.Stats.Imported.Base.html#query_imported/2"},{"type":"function","title":"Plausible.Stats.Imported.Base.query_imported/3","doc":"","ref":"Plausible.Stats.Imported.Base.html#query_imported/3"},{"type":"function","title":"Plausible.Stats.Imported.Base.special_goals_for/1","doc":"","ref":"Plausible.Stats.Imported.Base.html#special_goals_for/1"},{"type":"module","title":"Plausible.Stats.Imported.SQL.Expression","doc":"This module is responsible for generating SQL/Ecto expressions\nfor dimensions, filters and metrics used in import table queries","ref":"Plausible.Stats.Imported.SQL.Expression.html"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.group_imported_by/2","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#group_imported_by/2"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.naive_dimension_join/3","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#naive_dimension_join/3"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.select_imported_metrics/2","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#select_imported_metrics/2"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.select_joined_dimensions/2","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#select_joined_dimensions/2"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.select_joined_metrics/2","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#select_joined_metrics/2"},{"type":"module","title":"Plausible.Stats.Imported.SQL.WhereBuilder","doc":"A module for building an ecto where clause of a query out of a query for Imported tables.","ref":"Plausible.Stats.Imported.SQL.WhereBuilder.html"},{"type":"function","title":"Plausible.Stats.Imported.SQL.WhereBuilder.build/1","doc":"","ref":"Plausible.Stats.Imported.SQL.WhereBuilder.html#build/1"},{"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`, `day`,\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 `DateTimeRange` 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.JSONSchema","doc":"Module for validating query parameters against JSON schema.\n\nNote that `internal` queries expose some metrics, filter types and other features not\navailable on the public API.","ref":"Plausible.Stats.JSONSchema.html"},{"type":"function","title":"Plausible.Stats.JSONSchema.raw_public_schema/0","doc":"","ref":"Plausible.Stats.JSONSchema.html#raw_public_schema/0"},{"type":"function","title":"Plausible.Stats.JSONSchema.validate/2","doc":"","ref":"Plausible.Stats.JSONSchema.html#validate/2"},{"type":"module","title":"Plausible.Stats.JSONSchema.Utils","doc":"Module for traversing and modifying JSON schemas.","ref":"Plausible.Stats.JSONSchema.Utils.html"},{"type":"function","title":"Plausible.Stats.JSONSchema.Utils.traverse/2","doc":"","ref":"Plausible.Stats.JSONSchema.Utils.html#traverse/2"},{"type":"type","title":"Plausible.Stats.JSONSchema.Utils.json/0","doc":"","ref":"Plausible.Stats.JSONSchema.Utils.html#t:json/0"},{"type":"type","title":"Plausible.Stats.JSONSchema.Utils.transform_fun/0","doc":"","ref":"Plausible.Stats.JSONSchema.Utils.html#t:transform_fun/0"},{"type":"module","title":"Plausible.Stats.Legacy.Dimensions","doc":"Deprecated module. See QueryParser for list of valid dimensions","ref":"Plausible.Stats.Legacy.Dimensions.html"},{"type":"function","title":"Plausible.Stats.Legacy.Dimensions.valid?/1","doc":"","ref":"Plausible.Stats.Legacy.Dimensions.html#valid?/1"},{"type":"module","title":"Plausible.Stats.Legacy.QueryBuilder","doc":"Module used to parse URL search params to a valid Query, used to power the API for the dashboard.\n@deprecated","ref":"Plausible.Stats.Legacy.QueryBuilder.html"},{"type":"function","title":"Plausible.Stats.Legacy.QueryBuilder.from/4","doc":"","ref":"Plausible.Stats.Legacy.QueryBuilder.html#from/4"},{"type":"function","title":"Plausible.Stats.Legacy.QueryBuilder.parse_comparison_params/2","doc":"","ref":"Plausible.Stats.Legacy.QueryBuilder.html#parse_comparison_params/2"},{"type":"function","title":"Plausible.Stats.Legacy.QueryBuilder.parse_order_by/1","doc":"#","ref":"Plausible.Stats.Legacy.QueryBuilder.html#parse_order_by/1"},{"type":"function","title":"Examples: - Plausible.Stats.Legacy.QueryBuilder.parse_order_by/1","doc":"iex> QueryBuilder.parse_order_by(nil)\n []\n\n iex> QueryBuilder.parse_order_by(\"\")\n []\n\n iex> QueryBuilder.parse_order_by(\"0\")\n []\n\n iex> QueryBuilder.parse_order_by(\"[}\")\n []\n\n iex> QueryBuilder.parse_order_by(~s({\"any\":\"object\"}))\n []\n\n iex> QueryBuilder.parse_order_by(~s([[\"visitors\",\"invalid\"]]))\n []\n\n iex> QueryBuilder.parse_order_by(~s([[\"visitors\",\"desc\"]]))\n [{:visitors, :desc}]\n\n iex> QueryBuilder.parse_order_by(~s([[\"visitors\",\"asc\"],[\"visit:source\",\"desc\"]]))\n [{:visitors, :asc}, {\"visit:source\", :desc}]","ref":"Plausible.Stats.Legacy.QueryBuilder.html#parse_order_by/1-examples"},{"type":"module","title":"Plausible.Stats.Legacy.TimeOnPage","doc":"Calculation methods for legacy time_on_page metric. Note the metric\nhas its own limitations and quirks.\n\nClosely coupled with Plausible.Stats.QueryRunner.","ref":"Plausible.Stats.Legacy.TimeOnPage.html"},{"type":"function","title":"Plausible.Stats.Legacy.TimeOnPage.calculate/3","doc":"","ref":"Plausible.Stats.Legacy.TimeOnPage.html#calculate/3"},{"type":"module","title":"Plausible.Stats.Metrics","doc":"A module listing all available metrics in Plausible.\n\nUseful for an explicit string to atom conversion.","ref":"Plausible.Stats.Metrics.html"},{"type":"function","title":"Plausible.Stats.Metrics.from_string/1","doc":"","ref":"Plausible.Stats.Metrics.html#from_string/1"},{"type":"function","title":"Plausible.Stats.Metrics.from_string!/1","doc":"","ref":"Plausible.Stats.Metrics.html#from_string!/1"},{"type":"function","title":"Plausible.Stats.Metrics.metric?/1","doc":"","ref":"Plausible.Stats.Metrics.html#metric?/1"},{"type":"module","title":"Plausible.Stats.Query","doc":"","ref":"Plausible.Stats.Query.html"},{"type":"function","title":"Plausible.Stats.Query.add_filter/2","doc":"","ref":"Plausible.Stats.Query.html#add_filter/2"},{"type":"function","title":"Plausible.Stats.Query.build/4","doc":"","ref":"Plausible.Stats.Query.html#build/4"},{"type":"function","title":"Plausible.Stats.Query.date_range/2","doc":"","ref":"Plausible.Stats.Query.html#date_range/2"},{"type":"function","title":"Plausible.Stats.Query.ensure_include_imported/2","doc":"","ref":"Plausible.Stats.Query.html#ensure_include_imported/2"},{"type":"function","title":"Plausible.Stats.Query.from/4","doc":"Builds query from old-style params. New code should prefer Query.build","ref":"Plausible.Stats.Query.html#from/4"},{"type":"function","title":"Plausible.Stats.Query.put_imported_opts/3","doc":"","ref":"Plausible.Stats.Query.html#put_imported_opts/3"},{"type":"function","title":"Plausible.Stats.Query.remove_top_level_filters/2","doc":"Removes top level filters matching any of passed prefix from the query.\n\nNote that this doesn't handle cases with AND/OR/NOT and as such is discouraged\nfrom use.","ref":"Plausible.Stats.Query.html#remove_top_level_filters/2"},{"type":"function","title":"Plausible.Stats.Query.set/2","doc":"","ref":"Plausible.Stats.Query.html#set/2"},{"type":"function","title":"Plausible.Stats.Query.set_include/3","doc":"","ref":"Plausible.Stats.Query.html#set_include/3"},{"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.QueryOptimizer","doc":"Methods to manipulate Query for business logic reasons before building an ecto query.","ref":"Plausible.Stats.QueryOptimizer.html"},{"type":"function","title":"Plausible.Stats.QueryOptimizer.optimize/1","doc":"This module manipulates an existing query, updating it according to business logic.\n\n For example, it:\n 1. Figures out what the right granularity to group by time is\n 2. Adds a missing order_by clause to a query\n 3. Updating \"time\" dimension in order_by to the right granularity\n 4. Updates event:hostname filters to also apply on visit level for sane results.\n 5. Removes revenue metrics from dashboard queries if not requested, present or unavailable for the site.","ref":"Plausible.Stats.QueryOptimizer.html#optimize/1"},{"type":"function","title":"Plausible.Stats.QueryOptimizer.split/1","doc":"Splits a query into event and sessions subcomponents as not all metrics can be\nqueried from a single table.\n\nevent:page dimension is treated in a special way, doing a breakdown of visit:entry_page\nfor sessions.","ref":"Plausible.Stats.QueryOptimizer.html#split/1"},{"type":"module","title":"Plausible.Stats.QueryResult","doc":"This struct contains the (JSON-encodable) response for a query and\nis responsible for building it from database query results.\n\nFor the convenience of API docs and consumers, the JSON result\nproduced by Jason.encode(query_result) is ordered.","ref":"Plausible.Stats.QueryResult.html"},{"type":"function","title":"Plausible.Stats.QueryResult.from/4","doc":"Builds full JSON-serializable query response.\n\n`results` should already-built by Plausible.Stats.QueryRunner","ref":"Plausible.Stats.QueryResult.html#from/4"},{"type":"module","title":"Plausible.Stats.QueryRunner","doc":"This module is responsible for executing a Plausible.Stats.Query\nand gathering results.\n\nSome secondary responsibilities are:\n1. Dealing with comparison queries and combining results with main\n2. Dealing with time-on-page\n3. Passing total_rows from clickhouse to QueryResult meta","ref":"Plausible.Stats.QueryRunner.html"},{"type":"function","title":"Plausible.Stats.QueryRunner.run/2","doc":"","ref":"Plausible.Stats.QueryRunner.html#run/2"},{"type":"module","title":"Plausible.Stats.SQL.Expression","doc":"This module is responsible for generating SQL/Ecto expressions\nfor dimensions and metrics used in query SELECT statement.\n\nEach dimension and metric is tagged with with selected_as for easier\nusage down the line.","ref":"Plausible.Stats.SQL.Expression.html"},{"type":"macro","title":"Plausible.Stats.SQL.Expression.event_goal_join/2","doc":"","ref":"Plausible.Stats.SQL.Expression.html#event_goal_join/2"},{"type":"function","title":"Plausible.Stats.SQL.Expression.event_metric/1","doc":"","ref":"Plausible.Stats.SQL.Expression.html#event_metric/1"},{"type":"function","title":"Plausible.Stats.SQL.Expression.select_dimension/5","doc":"","ref":"Plausible.Stats.SQL.Expression.html#select_dimension/5"},{"type":"function","title":"Plausible.Stats.SQL.Expression.session_metric/2","doc":"","ref":"Plausible.Stats.SQL.Expression.html#session_metric/2"},{"type":"module","title":"Plausible.Stats.SQL.Fragments","doc":"Various macros and common SQL fragments used in Stats code.","ref":"Plausible.Stats.SQL.Fragments.html"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.bounce_rate/0","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#bounce_rate/0"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.coalesce_string/2","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#coalesce_string/2"},{"type":"macro","title":"Plausible.Stats.SQL.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.SQL.Fragments.html#get_by_key/3"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.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.SQL.Fragments.html#get_by_key/3-examples"},{"type":"macro","title":"Plausible.Stats.SQL.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.SQL.Fragments.html#has_key/3"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.Fragments.has_key/3","doc":"`has_key(e, :meta, \"some_property_name\")` expands to SQL `has(meta.key, \"some_property_name\")`","ref":"Plausible.Stats.SQL.Fragments.html#has_key/3-examples"},{"type":"function","title":"Plausible.Stats.SQL.Fragments.meta_key_column/1","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#meta_key_column/1"},{"type":"function","title":"Plausible.Stats.SQL.Fragments.meta_value_column/1","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#meta_value_column/1"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.sample_percent/0","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#sample_percent/0"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.select_join_fields/4","doc":"Macro that helps join two Ecto queries by selecting fields from either one","ref":"Plausible.Stats.SQL.Fragments.html#select_join_fields/4"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.select_merge_as/3","doc":"Convenience Ecto macro for wrapping select_merge where each value gets in turn passed to selected_as.\n\n#","ref":"Plausible.Stats.SQL.Fragments.html#select_merge_as/3"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.Fragments.select_merge_as/3","doc":"iex> select_merge_as(q, [t], %{ foo: t.column }) |> expand_macro_once\n \"select_merge(q, [], ^wrap_alias([t], %{foo: t.column}))\"","ref":"Plausible.Stats.SQL.Fragments.html#select_merge_as/3-examples"},{"type":"macro","title":"Plausible.Stats.SQL.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.SQL.Fragments.html#to_timezone/2"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.total/0","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#total/0"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.uniq/1","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#uniq/1"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.visit_duration/0","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#visit_duration/0"},{"type":"macro","title":"Plausible.Stats.SQL.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.SQL.Fragments.html#weekstart_not_before/2"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.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 ```\n > 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 ```\n > 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]\n ```","ref":"Plausible.Stats.SQL.Fragments.html#weekstart_not_before/2-examples"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.wrap_alias/2","doc":"Convenience Ecto macro for wrapping a map passed to select_merge_as such that each\nexpression gets wrapped in dynamic and set as selected_as.\n\n#","ref":"Plausible.Stats.SQL.Fragments.html#wrap_alias/2"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.Fragments.wrap_alias/2","doc":"iex> wrap_alias([t], %{ foo: t.column }) |> expand_macro_once\n \"%{foo: dynamic([t], selected_as(t.column, :foo))}\"","ref":"Plausible.Stats.SQL.Fragments.html#wrap_alias/2-examples"},{"type":"module","title":"Plausible.Stats.SQL.SpecialMetrics","doc":"This module defines how special metrics like `conversion_rate` and\n`percentage` are calculated.","ref":"Plausible.Stats.SQL.SpecialMetrics.html"},{"type":"function","title":"Plausible.Stats.SQL.SpecialMetrics.add/3","doc":"","ref":"Plausible.Stats.SQL.SpecialMetrics.html#add/3"},{"type":"function","title":"Plausible.Stats.SQL.SpecialMetrics.maybe_add_global_conversion_rate/3","doc":"","ref":"Plausible.Stats.SQL.SpecialMetrics.html#maybe_add_global_conversion_rate/3"},{"type":"function","title":"Plausible.Stats.SQL.SpecialMetrics.maybe_add_group_conversion_rate/3","doc":"","ref":"Plausible.Stats.SQL.SpecialMetrics.html#maybe_add_group_conversion_rate/3"},{"type":"function","title":"Plausible.Stats.SQL.SpecialMetrics.maybe_add_scroll_depth/3","doc":"","ref":"Plausible.Stats.SQL.SpecialMetrics.html#maybe_add_scroll_depth/3"},{"type":"module","title":"Plausible.Stats.SQL.WhereBuilder","doc":"A module for building am ecto where clause of a query out of a query.","ref":"Plausible.Stats.SQL.WhereBuilder.html"},{"type":"function","title":"Plausible.Stats.SQL.WhereBuilder.build/3","doc":"Builds WHERE clause for a given Query against sessions or events table","ref":"Plausible.Stats.SQL.WhereBuilder.html#build/3"},{"type":"function","title":"Plausible.Stats.SQL.WhereBuilder.build_condition/2","doc":"Builds WHERE clause condition based off of a filter and a custom column name\nUsed for special business logic cases\n\nAccepts nil as the `filter` parameter, in which case the condition is a no-op (WHERE TRUE).","ref":"Plausible.Stats.SQL.WhereBuilder.html#build_condition/2"},{"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/3","doc":"","ref":"Plausible.Stats.Sampling.html#put_threshold/3"},{"type":"module","title":"Plausible.Stats.TableDecider","doc":"This module contains logic for deciding which tables need to be queried given a query\nand metrics, with the purpose of reducing the number of queries and JOINs needed to perform.","ref":"Plausible.Stats.TableDecider.html"},{"type":"function","title":"Plausible.Stats.TableDecider.events_join_sessions?/1","doc":"","ref":"Plausible.Stats.TableDecider.html#events_join_sessions?/1"},{"type":"function","title":"Plausible.Stats.TableDecider.partition_metrics/2","doc":"","ref":"Plausible.Stats.TableDecider.html#partition_metrics/2"},{"type":"function","title":"Plausible.Stats.TableDecider.sessions_join_events?/1","doc":"","ref":"Plausible.Stats.TableDecider.html#sessions_join_events?/1"},{"type":"module","title":"Plausible.Stats.Time","doc":"Collection of functions to work with time in queries.","ref":"Plausible.Stats.Time.html"},{"type":"function","title":"Plausible.Stats.Time.date_or_weekstart/2","doc":"","ref":"Plausible.Stats.Time.html#date_or_weekstart/2"},{"type":"function","title":"Plausible.Stats.Time.format_datetime/1","doc":"","ref":"Plausible.Stats.Time.html#format_datetime/1"},{"type":"function","title":"Plausible.Stats.Time.time_dimension/1","doc":"","ref":"Plausible.Stats.Time.html#time_dimension/1"},{"type":"function","title":"Plausible.Stats.Time.time_dimension?/1","doc":"","ref":"Plausible.Stats.Time.html#time_dimension?/1"},{"type":"function","title":"Plausible.Stats.Time.time_labels/1","doc":"Returns list of time bucket labels for the given query.","ref":"Plausible.Stats.Time.html#time_labels/1"},{"type":"function","title":"Plausible.Stats.Time.utc_boundaries/2","doc":"","ref":"Plausible.Stats.Time.html#utc_boundaries/2"},{"type":"module","title":"Plausible.Stats.Timeseries","doc":"Builds timeseries results for v1 of our stats API and dashboards.\n\nAvoid adding new logic here - update QueryBuilder etc instead.","ref":"Plausible.Stats.Timeseries.html"},{"type":"function","title":"Plausible.Stats.Timeseries.timeseries/3","doc":"","ref":"Plausible.Stats.Timeseries.html#timeseries/3"},{"type":"module","title":"Plausible.Stats.Util","doc":"Utilities for modifying stat results","ref":"Plausible.Stats.Util.html"},{"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 it is needed\nfor any of the other metrics to be calculated.","ref":"Plausible.Stats.Util.html#maybe_add_visitors_metric/1"},{"type":"function","title":"Plausible.Stats.Util.shortname/2","doc":"","ref":"Plausible.Stats.Util.html#shortname/2"},{"type":"module","title":"Plausible.Teams","doc":"Core context of teams.","ref":"Plausible.Teams.html"},{"type":"function","title":"Plausible.Teams.get_by_owner/1","doc":"","ref":"Plausible.Teams.html#get_by_owner/1"},{"type":"function","title":"Plausible.Teams.get_or_create/1","doc":"Get or create user's team.\n\nIf the user has no non-guest membership yet, an implicit \"My Team\" team is\ncreated with them as an owner.\n\nIf the user already has an owner membership in an existing team,\nthat team is returned.\n\nIf the user has a non-guest membership other than owner, `:no_team` error\nis returned.","ref":"Plausible.Teams.html#get_or_create/1"},{"type":"function","title":"Plausible.Teams.last_subscription_join_query/0","doc":"","ref":"Plausible.Teams.html#last_subscription_join_query/0"},{"type":"function","title":"Plausible.Teams.last_subscription_query/0","doc":"","ref":"Plausible.Teams.html#last_subscription_query/0"},{"type":"function","title":"Plausible.Teams.load_for_site/1","doc":"Create (when necessary) and load team relation for provided site.\n\nUsed for sync logic to work smoothly during transitional period.","ref":"Plausible.Teams.html#load_for_site/1"},{"type":"function","title":"Plausible.Teams.on_trial?/1","doc":"","ref":"Plausible.Teams.html#on_trial?/1"},{"type":"function","title":"Plausible.Teams.owned_sites/1","doc":"","ref":"Plausible.Teams.html#owned_sites/1"},{"type":"function","title":"Plausible.Teams.owned_sites_ids/1","doc":"","ref":"Plausible.Teams.html#owned_sites_ids/1"},{"type":"function","title":"Plausible.Teams.read_team_schemas?/1","doc":"","ref":"Plausible.Teams.html#read_team_schemas?/1"},{"type":"function","title":"Plausible.Teams.sync_team/1","doc":"","ref":"Plausible.Teams.html#sync_team/1"},{"type":"function","title":"Plausible.Teams.trial_days_left/1","doc":"","ref":"Plausible.Teams.html#trial_days_left/1"},{"type":"function","title":"Plausible.Teams.with_subscription/1","doc":"","ref":"Plausible.Teams.html#with_subscription/1"},{"type":"module","title":"Plausible.Teams.Adapter","doc":"Commonly used teams-transition functions","ref":"Plausible.Teams.Adapter.html"},{"type":"function","title":"Plausible.Teams.Adapter.switch/2","doc":"","ref":"Plausible.Teams.Adapter.html#switch/2"},{"type":"function","title":"Plausible.Teams.Adapter.user_or_team/1","doc":"","ref":"Plausible.Teams.Adapter.html#user_or_team/1"},{"type":"module","title":"Plausible.Teams.Adapter.Read.Billing","doc":"Transition adapter for new schema reads","ref":"Plausible.Teams.Adapter.Read.Billing.html"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.active_subscription_for/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#active_subscription_for/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.change_plan/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#change_plan/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.check_feature_availability/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#check_feature_availability/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.check_feature_availability_for_stats_api/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#check_feature_availability_for_stats_api/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.check_needs_to_upgrade/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#check_needs_to_upgrade/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.ensure_can_add_new_site/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#ensure_can_add_new_site/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.enterprise_configured?/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#enterprise_configured?/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.get_subscription/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#get_subscription/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.has_active_subscription?/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#has_active_subscription?/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.latest_enterprise_plan_with_prices/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#latest_enterprise_plan_with_prices/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.monthly_pageview_limit/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#monthly_pageview_limit/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.monthly_pageview_usage/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#monthly_pageview_usage/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.site_limit/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#site_limit/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.site_usage/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#site_usage/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.suggest_by_usage/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#suggest_by_usage/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.team_member_limit/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#team_member_limit/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.team_member_usage/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#team_member_usage/2"},{"type":"module","title":"Plausible.Teams.Adapter.Read.Ownership","doc":"Transition adapter for new schema reads","ref":"Plausible.Teams.Adapter.Read.Ownership.html"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.all_pending_site_transfers/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#all_pending_site_transfers/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.check_feature_access/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#check_feature_access/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.ensure_can_take_ownership/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#ensure_can_take_ownership/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.get_owner/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#get_owner/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.has_sites?/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#has_sites?/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.owns_sites?/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#owns_sites?/2"},{"type":"module","title":"Plausible.Teams.Adapter.Read.Sites","doc":"Transition adapter for new schema reads","ref":"Plausible.Teams.Adapter.Read.Sites.html"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.get_for_user/3","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#get_for_user/3"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.get_for_user!/3","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#get_for_user!/3"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.list/3","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#list/3"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.list_people/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#list_people/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.list_with_invitations/3","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#list_with_invitations/3"},{"type":"module","title":"Plausible.Teams.GuestInvitation","doc":"Guest invitation schema","ref":"Plausible.Teams.GuestInvitation.html"},{"type":"function","title":"Plausible.Teams.GuestInvitation.changeset/3","doc":"","ref":"Plausible.Teams.GuestInvitation.html#changeset/3"},{"type":"module","title":"Plausible.Teams.GuestMembership","doc":"Guest membership schema","ref":"Plausible.Teams.GuestMembership.html"},{"type":"function","title":"Plausible.Teams.GuestMembership.changeset/3","doc":"","ref":"Plausible.Teams.GuestMembership.html#changeset/3"},{"type":"module","title":"Plausible.Teams.Invitation","doc":"Team invitation schema","ref":"Plausible.Teams.Invitation.html"},{"type":"function","title":"Plausible.Teams.Invitation.changeset/2","doc":"","ref":"Plausible.Teams.Invitation.html#changeset/2"},{"type":"module","title":"Plausible.Teams.Membership","doc":"Team membership schema","ref":"Plausible.Teams.Membership.html"},{"type":"function","title":"Plausible.Teams.Membership.changeset/3","doc":"","ref":"Plausible.Teams.Membership.html#changeset/3"},{"type":"module","title":"Plausible.Teams.SiteTransfer","doc":"Site transfer schema","ref":"Plausible.Teams.SiteTransfer.html"},{"type":"function","title":"Plausible.Teams.SiteTransfer.changeset/2","doc":"","ref":"Plausible.Teams.SiteTransfer.html#changeset/2"},{"type":"module","title":"Plausible.Teams.Team","doc":"Team schema","ref":"Plausible.Teams.Team.html"},{"type":"function","title":"Plausible.Teams.Team.changeset/2","doc":"","ref":"Plausible.Teams.Team.html#changeset/2"},{"type":"function","title":"Plausible.Teams.Team.start_trial/2","doc":"","ref":"Plausible.Teams.Team.html#start_trial/2"},{"type":"function","title":"Plausible.Teams.Team.sync_changeset/2","doc":"","ref":"Plausible.Teams.Team.html#sync_changeset/2"},{"type":"type","title":"Plausible.Teams.Team.t/0","doc":"","ref":"Plausible.Teams.Team.html#t:t/0"},{"type":"module","title":"Plausible.Teams.Test","doc":"Convenience assertions for teams schema transition","ref":"Plausible.Teams.Test.html"},{"type":"function","title":"Plausible.Teams.Test.add_guest/2","doc":"","ref":"Plausible.Teams.Test.html#add_guest/2"},{"type":"function","title":"Plausible.Teams.Test.assert_guest_invitation/4","doc":"","ref":"Plausible.Teams.Test.html#assert_guest_invitation/4"},{"type":"function","title":"Plausible.Teams.Test.assert_guest_membership/4","doc":"","ref":"Plausible.Teams.Test.html#assert_guest_membership/4"},{"type":"function","title":"Plausible.Teams.Test.assert_team_attached/2","doc":"","ref":"Plausible.Teams.Test.html#assert_team_attached/2"},{"type":"function","title":"Plausible.Teams.Test.assert_team_exists/2","doc":"","ref":"Plausible.Teams.Test.html#assert_team_exists/2"},{"type":"function","title":"Plausible.Teams.Test.assert_team_membership/3","doc":"","ref":"Plausible.Teams.Test.html#assert_team_membership/3"},{"type":"function","title":"Plausible.Teams.Test.invite_guest/3","doc":"","ref":"Plausible.Teams.Test.html#invite_guest/3"},{"type":"function","title":"Plausible.Teams.Test.invite_transfer/3","doc":"","ref":"Plausible.Teams.Test.html#invite_transfer/3"},{"type":"function","title":"Plausible.Teams.Test.new_site/1","doc":"","ref":"Plausible.Teams.Test.html#new_site/1"},{"type":"function","title":"Plausible.Teams.Test.new_team/0","doc":"","ref":"Plausible.Teams.Test.html#new_team/0"},{"type":"function","title":"Plausible.Teams.Test.new_user/1","doc":"","ref":"Plausible.Teams.Test.html#new_user/1"},{"type":"function","title":"Plausible.Teams.Test.revoke_membership/2","doc":"","ref":"Plausible.Teams.Test.html#revoke_membership/2"},{"type":"function","title":"Plausible.Teams.Test.subscribe_to_business_plan/1","doc":"","ref":"Plausible.Teams.Test.html#subscribe_to_business_plan/1"},{"type":"function","title":"Plausible.Teams.Test.subscribe_to_enterprise_plan/2","doc":"","ref":"Plausible.Teams.Test.html#subscribe_to_enterprise_plan/2"},{"type":"function","title":"Plausible.Teams.Test.subscribe_to_growth_plan/1","doc":"","ref":"Plausible.Teams.Test.html#subscribe_to_growth_plan/1"},{"type":"function","title":"Plausible.Teams.Test.subscribe_to_plan/3","doc":"","ref":"Plausible.Teams.Test.html#subscribe_to_plan/3"},{"type":"module","title":"Plausible.Teams.Users","doc":"Users API accounting for teams.","ref":"Plausible.Teams.Users.html"},{"type":"function","title":"Plausible.Teams.Users.has_sites?/2","doc":"","ref":"Plausible.Teams.Users.html#has_sites?/2"},{"type":"function","title":"Plausible.Teams.Users.owns_sites?/2","doc":"","ref":"Plausible.Teams.Users.html#owns_sites?/2"},{"type":"module","title":"Plausible.Test.Support.HTML","doc":"Floki wrappers to help make assertions about HTML/DOM structures","ref":"Plausible.Test.Support.HTML.html"},{"type":"function","title":"Plausible.Test.Support.HTML.class_of_element/2","doc":"","ref":"Plausible.Test.Support.HTML.html#class_of_element/2"},{"type":"function","title":"Plausible.Test.Support.HTML.element_exists?/2","doc":"","ref":"Plausible.Test.Support.HTML.html#element_exists?/2"},{"type":"function","title":"Plausible.Test.Support.HTML.find/2","doc":"","ref":"Plausible.Test.Support.HTML.html#find/2"},{"type":"function","title":"Plausible.Test.Support.HTML.form_exists?/2","doc":"","ref":"Plausible.Test.Support.HTML.html#form_exists?/2"},{"type":"function","title":"Plausible.Test.Support.HTML.name_of/1","doc":"","ref":"Plausible.Test.Support.HTML.html#name_of/1"},{"type":"function","title":"Plausible.Test.Support.HTML.submit_button/2","doc":"","ref":"Plausible.Test.Support.HTML.html#submit_button/2"},{"type":"function","title":"Plausible.Test.Support.HTML.text/1","doc":"","ref":"Plausible.Test.Support.HTML.html#text/1"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_attr/2","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/2"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_attr/3","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/3"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_element/2","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_element/2"},{"type":"module","title":"Plausible.Test.Support.HTTPMocker","doc":"Currently only supports post request, it's a drop-in replacement\nfor our exvcr usage that wasn't ever needed (e.g. we had no way to\nre-record the cassettes anyway).","ref":"Plausible.Test.Support.HTTPMocker.html"},{"type":"module","title":"Plausible.TestUtils","doc":"","ref":"Plausible.TestUtils.html"},{"type":"function","title":"Plausible.TestUtils.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_legacy_site_import/1","doc":"","ref":"Plausible.TestUtils.html#create_legacy_site_import/1"},{"type":"function","title":"Plausible.TestUtils.create_pageviews/1","doc":"","ref":"Plausible.TestUtils.html#create_pageviews/1"},{"type":"function","title":"Plausible.TestUtils.create_site/1","doc":"","ref":"Plausible.TestUtils.html#create_site/1"},{"type":"function","title":"Plausible.TestUtils.create_site_import/1","doc":"","ref":"Plausible.TestUtils.html#create_site_import/1"},{"type":"function","title":"Plausible.TestUtils.create_user/1","doc":"","ref":"Plausible.TestUtils.html#create_user/1"},{"type":"function","title":"Plausible.TestUtils.ensure_minio/0","doc":"","ref":"Plausible.TestUtils.html#ensure_minio/0"},{"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":"function","title":"Plausible.TestUtils.maybe_fake_minio/1","doc":"","ref":"Plausible.TestUtils.html#maybe_fake_minio/1"},{"type":"function","title":"Plausible.TestUtils.minio_running?/0","doc":"","ref":"Plausible.TestUtils.html#minio_running?/0"},{"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":"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.bump_last_seen/2","doc":"","ref":"Plausible.Users.html#bump_last_seen/2"},{"type":"function","title":"Plausible.Users.end_grace_period/1","doc":"","ref":"Plausible.Users.html#end_grace_period/1"},{"type":"function","title":"Plausible.Users.has_email_code?/1","doc":"","ref":"Plausible.Users.html#has_email_code?/1"},{"type":"function","title":"Plausible.Users.last_subscription_join_query/0","doc":"","ref":"Plausible.Users.html#last_subscription_join_query/0"},{"type":"function","title":"Plausible.Users.last_subscription_query/0","doc":"","ref":"Plausible.Users.html#last_subscription_query/0"},{"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.remove_grace_period/1","doc":"","ref":"Plausible.Users.html#remove_grace_period/1"},{"type":"function","title":"Plausible.Users.start_grace_period/1","doc":"","ref":"Plausible.Users.html#start_grace_period/1"},{"type":"function","title":"Plausible.Users.start_manual_lock_grace_period/1","doc":"","ref":"Plausible.Users.html#start_manual_lock_grace_period/1"},{"type":"function","title":"Plausible.Users.start_trial/1","doc":"","ref":"Plausible.Users.html#start_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.Verification","doc":"Module defining the user-agent used for site verification.","ref":"Plausible.Verification.html"},{"type":"function","title":"Plausible.Verification.user_agent/0","doc":"","ref":"Plausible.Verification.html#user_agent/0"},{"type":"behaviour","title":"Plausible.Verification.Check","doc":"Behaviour to be implemented by specific site verification checks.\n`report_progress_as()` doesn't necessarily reflect the actual check description,\nit serves as a user-facing message grouping mechanism, to prevent frequent message flashing when checks rotate often.\nEach check operates on `state()` and is expected to return it, optionally modified, by all means.\n`perform_safe/1` is used to guarantee no exceptions are thrown by faulty implementations, not to interrupt LiveView.","ref":"Plausible.Verification.Check.html"},{"type":"callback","title":"Plausible.Verification.Check.perform/1","doc":"","ref":"Plausible.Verification.Check.html#c:perform/1"},{"type":"callback","title":"Plausible.Verification.Check.report_progress_as/0","doc":"","ref":"Plausible.Verification.Check.html#c:report_progress_as/0"},{"type":"type","title":"Plausible.Verification.Check.state/0","doc":"","ref":"Plausible.Verification.Check.html#t:state/0"},{"type":"module","title":"Plausible.Verification.Checks","doc":"Checks that are performed during site verification.\nEach module defined in `@checks` implements the `Plausible.Verification.Check` behaviour.\nChecks are normally run asynchronously, except when synchronous execution is optionally required\nfor tests. Slowdowns can be optionally added, the user doesn't benefit from running the checks too quickly.\n\nIn async execution, each check notifies the caller by sending a message to it.","ref":"Plausible.Verification.Checks.html"},{"type":"function","title":"Plausible.Verification.Checks.interpret_diagnostics/1","doc":"","ref":"Plausible.Verification.Checks.html#interpret_diagnostics/1"},{"type":"function","title":"Plausible.Verification.Checks.run/3","doc":"","ref":"Plausible.Verification.Checks.html#run/3"},{"type":"module","title":"Plausible.Verification.Checks.CSP","doc":"Scans the Content Security Policy header to ensure that the Plausible domain is allowed.\nSee `Plausible.Verification.Checks` for the execution sequence.","ref":"Plausible.Verification.Checks.CSP.html"},{"type":"function","title":"Plausible.Verification.Checks.CSP.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.CSP.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.FetchBody","doc":"Fetches the body of the site and extracts the HTML document, if available, for\nfurther processing.\nSee `Plausible.Verification.Checks` for the execution sequence.","ref":"Plausible.Verification.Checks.FetchBody.html"},{"type":"function","title":"Plausible.Verification.Checks.FetchBody.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.FetchBody.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.Installation","doc":"Calls the browserless.io service (local instance can be spawned with `make browserless`)\nand runs verification/verify_plausible_installed.js via the [function API](https://docs.browserless.io/HTTP-APIs/function).\n\nThe successful execution assumes the following JSON payload:\n - `data.plausibleInstalled` - boolean indicating whether the `plausible()` window function was found\n - `data.callbackStatus` - integer. 202 indicates that the server acknowledged the test event.\n\nThe test event ingestion is discarded based on user-agent, see: `Plausible.Verification.user_agent/0`","ref":"Plausible.Verification.Checks.Installation.html"},{"type":"function","title":"Plausible.Verification.Checks.Installation.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.Installation.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.ScanBody","doc":"Naive way of detecting GTM and WordPress powered sites.","ref":"Plausible.Verification.Checks.ScanBody.html"},{"type":"function","title":"Plausible.Verification.Checks.ScanBody.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.ScanBody.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.Snippet","doc":"The check looks for Plausible snippets and tries to address the common\nintegration issues, such as bad placement, data-domain typos, unknown \nattributes frequently added by performance optimization plugins, etc.","ref":"Plausible.Verification.Checks.Snippet.html"},{"type":"function","title":"Plausible.Verification.Checks.Snippet.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.Snippet.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.SnippetCacheBust","doc":"A naive way of trying to figure out whether the latest site contents \nis wrapped with some CDN/caching layer.\nIn case no snippets were found, we'll try to bust the cache by appending a random query parameter\nand re-run `Plausible.Verification.Checks.FetchBody` and `Plausible.Verification.Checks.Snippet` checks.\nIf the result is different this time, we'll assume cache likely.","ref":"Plausible.Verification.Checks.SnippetCacheBust.html"},{"type":"function","title":"Plausible.Verification.Checks.SnippetCacheBust.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.SnippetCacheBust.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Diagnostics","doc":"Module responsible for translating diagnostics to user-friendly errors and recommendations.","ref":"Plausible.Verification.Diagnostics.html"},{"type":"function","title":"Plausible.Verification.Diagnostics.interpret/2","doc":"","ref":"Plausible.Verification.Diagnostics.html#interpret/2"},{"type":"type","title":"Plausible.Verification.Diagnostics.t/0","doc":"","ref":"Plausible.Verification.Diagnostics.html#t:t/0"},{"type":"module","title":"Plausible.Verification.Diagnostics.Result","doc":"Diagnostics interpretation result.","ref":"Plausible.Verification.Diagnostics.Result.html"},{"type":"type","title":"Plausible.Verification.Diagnostics.Result.t/0","doc":"","ref":"Plausible.Verification.Diagnostics.Result.html#t:t/0"},{"type":"module","title":"Plausible.Verification.Errors","doc":"A go-to definition of all verification errors","ref":"Plausible.Verification.Errors.html"},{"type":"function","title":"Plausible.Verification.Errors.all/0","doc":"","ref":"Plausible.Verification.Errors.html#all/0"},{"type":"module","title":"Plausible.Verification.State","doc":"The struct and interface describing the state of the site verification process.\nAssigns are meant to be used to communicate between checks, while diagnostics\nare later on interpreted (translated into user-friendly messages and recommendations)\nvia `Plausible.Verification.Diagnostics` module.","ref":"Plausible.Verification.State.html"},{"type":"function","title":"Plausible.Verification.State.assign/2","doc":"","ref":"Plausible.Verification.State.html#assign/2"},{"type":"function","title":"Plausible.Verification.State.put_diagnostics/2","doc":"","ref":"Plausible.Verification.State.html#put_diagnostics/2"},{"type":"type","title":"Plausible.Verification.State.t/0","doc":"","ref":"Plausible.Verification.State.html#t:t/0"},{"type":"module","title":"Plausible.Verification.URL","doc":"Busting some caches by appending ?plausible_verification=12345 to it.","ref":"Plausible.Verification.URL.html"},{"type":"function","title":"Plausible.Verification.URL.bust_url/1","doc":"","ref":"Plausible.Verification.URL.html#bust_url/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":"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":"function","title":"Plausible.Workers.CheckUsage.maybe_remove_grace_period/2","doc":"","ref":"Plausible.Workers.CheckUsage.html#maybe_remove_grace_period/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.CleanUserSessions","doc":"Job removing expired user sessions. A grace period is applied.","ref":"Plausible.Workers.CleanUserSessions.html"},{"type":"function","title":"Plausible.Workers.CleanUserSessions.grace_period_duration/0","doc":"","ref":"Plausible.Workers.CleanUserSessions.html#grace_period_duration/0"},{"type":"module","title":"Plausible.Workers.ClickhouseCleanSites","doc":"Cleans deleted site data from ClickHouse asynchronously.\n\nWe batch up data deletions from ClickHouse as deleting a single site is\njust as expensive as deleting many.","ref":"Plausible.Workers.ClickhouseCleanSites.html"},{"type":"function","title":"Plausible.Workers.ClickhouseCleanSites.get_deleted_sites_with_clickhouse_data/0","doc":"","ref":"Plausible.Workers.ClickhouseCleanSites.html#get_deleted_sites_with_clickhouse_data/0"},{"type":"function","title":"Plausible.Workers.ClickhouseCleanSites.perform/1","doc":"","ref":"Plausible.Workers.ClickhouseCleanSites.html#perform/1"},{"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.ExportAnalytics","doc":"Worker for running CSV export jobs. Supports S3 and local storage.\nTo avoid blocking the queue, a timeout of 15 minutes is enforced.","ref":"Plausible.Workers.ExportAnalytics.html"},{"type":"function","title":"Plausible.Workers.ExportAnalytics.base_query/1","doc":"This base query filters export jobs for a site","ref":"Plausible.Workers.ExportAnalytics.html#base_query/1"},{"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/2","doc":"","ref":"Plausible.Workers.ImportAnalytics.html#import_fail/2"},{"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.LocalImportAnalyticsCleaner","doc":"Worker for cleaning local files left after analytics import jobs.","ref":"Plausible.Workers.LocalImportAnalyticsCleaner.html"},{"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.NotifyExportedAnalytics","doc":"This worker delivers emails for successful and failed exports","ref":"Plausible.Workers.NotifyExportedAnalytics.html"},{"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.TrafficChangeNotifier","doc":"Oban service sending out traffic drop/spike notifications","ref":"Plausible.Workers.TrafficChangeNotifier.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.component/0","doc":"","ref":"PlausibleWeb.html#component/0"},{"type":"function","title":"PlausibleWeb.controller/0","doc":"","ref":"PlausibleWeb.html#controller/0"},{"type":"function","title":"PlausibleWeb.live_component/0","doc":"","ref":"PlausibleWeb.html#live_component/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.current_plan/2","doc":"","ref":"PlausibleWeb.AdminController.html#current_plan/2"},{"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.goals_index/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#goals_index/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.index/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#index/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.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.currency/2","doc":"","ref":"PlausibleWeb.Api.PaddleController.html#currency/2"},{"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.build_intervals/4","doc":"","ref":"PlausibleWeb.Api.StatsController.html#build_intervals/4"},{"type":"function","title":"PlausibleWeb.Api.StatsController.channels/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#channels/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.cities/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#cities/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.comparison_query/1","doc":"","ref":"PlausibleWeb.Api.StatsController.html#comparison_query/1"},{"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_value_filter_suggestions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#custom_prop_value_filter_suggestions/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.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 * `includes_imported` - boolean indicating whether imported data\n was queried or not.\n\n * `imports_exist` - boolean indicating whether there are any completed\n imports for a given site or not.\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 \"imports_exist\" => false,\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 \"includes_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.put_combined_name_with_version/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#put_combined_name_with_version/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.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.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.request_activation_code/2","doc":"","ref":"PlausibleWeb.AuthController.html#request_activation_code/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":"Plug for populating conn assigns with user data\non the basis of authenticated session token.\n\nMust be kept in sync with `PlausibleWeb.Live.AuthContext`.","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.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.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.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.AuthView.html#render/2"},{"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.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.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.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.FirstDashboardLaunchBanner","doc":"A banner that appears on the first dashboard launch","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html"},{"type":"function","title":"PlausibleWeb.Components.FirstDashboardLaunchBanner.render/1","doc":"","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.FirstDashboardLaunchBanner.render/1","doc":"* `site` (`Plausible.Site`) (required)","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html#render/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.FirstDashboardLaunchBanner.set/1","doc":"","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html#set/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.FirstDashboardLaunchBanner.set/1","doc":"* `site` (`Plausible.Site`) (required)","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html#set/1-attributes"},{"type":"module","title":"PlausibleWeb.Components.FlowProgress","doc":"Component for provisioning/registration flows displaying\nprogress status. See `PlausibleWeb.Flows` for the list of\nflow definitions.","ref":"PlausibleWeb.Components.FlowProgress.html"},{"type":"function","title":"PlausibleWeb.Components.FlowProgress.render/1","doc":"","ref":"PlausibleWeb.Components.FlowProgress.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.FlowProgress.render/1","doc":"* `flow` (`:string`) (required) - Must be one of `\"register\"`, `\"invitation\"`, `\"domain_change\"`, `\"review\"`, or `\"provisioning\"`.\n* `current_step` (`:string`) (required) - Must be one of `\"Register\"`, `\"Activate account\"`, `\"Add site info\"`, `\"Install Plausible\"`, `\"Verify installation\"`, or `\"Set up new domain\"`.","ref":"PlausibleWeb.Components.FlowProgress.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* `mt?` (`:boolean`) - Defaults to `true`.\n* Global attributes are accepted. Supports all globals plus: `[\"name\"]`.","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* `method` (`:string`) - Defaults to `\"get\"`.\n* `mt?` (`:boolean`) - Defaults to `true`.\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.delete_button/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#delete_button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.delete_button/1","doc":"* `href` (`:string`) - Defaults to `nil`.\n* Global attributes are accepted. Supports all globals plus: `[\"method\", \"disabled\"]`.","ref":"PlausibleWeb.Components.Generic.html#delete_button/1-attributes"},{"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.edit_button/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#edit_button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.edit_button/1","doc":"* `href` (`:string`) - Defaults to `nil`.\n* Global attributes are accepted. Supports all globals plus: `[\"method\", \"disabled\"]`.","ref":"PlausibleWeb.Components.Generic.html#edit_button/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.Generic.filter_bar/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#filter_bar/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.filter_bar/1","doc":"* `filter_text` (`:string`) - Defaults to `\"\"`.\n* `placeholder` (`:string`) - Defaults to `\"\"`.\n* `filtering_enabled?` (`:boolean`) - Defaults to `true`.","ref":"PlausibleWeb.Components.Generic.html#filter_bar/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.filter_bar/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#filter_bar/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.focus_box/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#focus_box/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.focus_box/1","doc":"* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#focus_box/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.focus_box/1","doc":"* `title`\n* `subtitle`\n* `inner_block` (required)\n* `footer`","ref":"PlausibleWeb.Components.Generic.html#focus_box/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.focus_list/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#focus_list/1"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.focus_list/1","doc":"* `item` (required)","ref":"PlausibleWeb.Components.Generic.html#focus_list/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.h2/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#h2/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.h2/1","doc":"* `class` (`:any`) - Defaults to `nil`.","ref":"PlausibleWeb.Components.Generic.html#h2/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.h2/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#h2/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.notice/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#notice/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.notice/1","doc":"* `title` (`:any`) - Defaults to `nil`.\n* `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.settings_tiles/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#settings_tiles/1"},{"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":"* `href` (`:string`) - Defaults to `\"#\"`.\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* `method` (`:string`) - Defaults to `\"get\"`.\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.table/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#table/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.table/1","doc":"* `width` (`:string`) - Defaults to `\"min-w-full\"`.\n* `rows` (`:list`) - Defaults to `[]`.\n* `row_attrs` (`:any`) - Defaults to `nil`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#table/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.table/1","doc":"* `thead`\n* `tbody` (required)\n* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#table/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.td/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#td/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.td/1","doc":"* `truncate` (`:boolean`) - Defaults to `false`.\n* `max_width` (`:string`) - Defaults to `\"\"`.\n* `height` (`:string`) - Defaults to `\"\"`.\n* `actions` (`:boolean`) - Defaults to `nil`.\n* `hide_on_mobile` (`:boolean`) - Defaults to `nil`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#td/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.td/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#td/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.th/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#th/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.th/1","doc":"* `invisible` (`:boolean`) - Defaults to `false`.\n* `hide_on_mobile` (`:boolean`) - Defaults to `nil`.","ref":"PlausibleWeb.Components.Generic.html#th/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.th/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#th/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.tile/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#tile/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.tile/1","doc":"* `docs` (`:string`) - Defaults to `nil`.\n* `feature_mod` (`:atom`) - Defaults to `nil`.\n* `site` (`:any`)\n* `conn` (`:any`)","ref":"PlausibleWeb.Components.Generic.html#tile/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.tile/1","doc":"* `inner_block` (required)\n* `title` (required)\n* `subtitle` (required)","ref":"PlausibleWeb.Components.Generic.html#tile/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.title/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#title/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.title/1","doc":"* `class` (`:any`) - Defaults to `nil`.","ref":"PlausibleWeb.Components.Generic.html#title/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.title/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#title/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.toggle_submit/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#toggle_submit/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.toggle_submit/1","doc":"* `set_to` (`:boolean`) - Defaults to `false`.\n* `disabled?` (`:boolean`) - Defaults to `false`.","ref":"PlausibleWeb.Components.Generic.html#toggle_submit/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.toggle_submit/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#toggle_submit/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.tooltip/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#tooltip/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.tooltip/1","doc":"* `sticky?` (`:boolean`) - Defaults to `true`.","ref":"PlausibleWeb.Components.Generic.html#tooltip/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.tooltip/1","doc":"* `inner_block` (required)\n* `tooltip_content` (required)","ref":"PlausibleWeb.Components.Generic.html#tooltip/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 `nil`.\n* `method` (`:string`) - Defaults to `\"get\"`.\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_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)\n* `class` (`:any`) - Defaults to `nil`.","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 `\"\"`.\n* `show_button?` (`:boolean`) - Defaults to `true`.","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.debug_metadata/1","doc":"","ref":"PlausibleWeb.ControllerHelpers.html#debug_metadata/1"},{"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.DebugController","doc":"","ref":"PlausibleWeb.DebugController.html"},{"type":"function","title":"PlausibleWeb.DebugController.clickhouse/2","doc":"","ref":"PlausibleWeb.DebugController.html#clickhouse/2"},{"type":"module","title":"PlausibleWeb.DebugView","doc":"","ref":"PlausibleWeb.DebugView.html"},{"type":"function","title":"PlausibleWeb.DebugView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.DebugView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.DebugView.clickhouse.html/1","doc":"","ref":"PlausibleWeb.DebugView.html#clickhouse.html/1"},{"type":"function","title":"PlausibleWeb.DebugView.controller_name/1","doc":"","ref":"PlausibleWeb.DebugView.html#controller_name/1"},{"type":"function","title":"PlausibleWeb.DebugView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.DebugView.html#render/2"},{"type":"function","title":"PlausibleWeb.DebugView.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.DebugView.html#template_not_found/2"},{"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.drop_notification/5","doc":"","ref":"PlausibleWeb.Email.html#drop_notification/5"},{"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/3","doc":"","ref":"PlausibleWeb.Email.html#existing_user_invitation/3"},{"type":"function","title":"PlausibleWeb.Email.export_failure/2","doc":"","ref":"PlausibleWeb.Email.html#export_failure/2"},{"type":"function","title":"PlausibleWeb.Email.export_success/3","doc":"","ref":"PlausibleWeb.Email.html#export_success/3"},{"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/3","doc":"","ref":"PlausibleWeb.Email.html#invitation_accepted/3"},{"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/4","doc":"","ref":"PlausibleWeb.Email.html#new_user_invitation/4"},{"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/3","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_accepted/3"},{"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/5","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_request/5"},{"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.csv_import.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#csv_import.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.drop_notification.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#drop_notification.html/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.export_failure.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#export_failure.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.export_success.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#export_success.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/3","doc":"","ref":"PlausibleWeb.ErrorHelpers.html#error_tag/3"},{"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* `help_text` (`:string`) - Defaults to `nil`.\n* `value` (`:any`)\n* `width` (`:string`) - Defaults to `\"w-full\"`.\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* `class` (`:any`) - Defaults to `\"text-sm dark:bg-gray-900 block pl-3.5 py-2.5 border-gray-300 dark:border-gray-500 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 rounded-md\"`.\n* `mt?` (`:boolean`) - Defaults to `true`.\n* `max_one_error` (`:boolean`) - 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\", \"x-model\"]`.","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* `name` (`:string`) (required)\n* `label` (`:string`) - Defaults to `nil`.\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`.\n* `class` (`:string`) - Defaults to `\"\"`.","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\" :let={modal_unique_id}>\n <.live_component\n module={SomeForm}\n id={\"some-form-#{modal_unique_id}\"}\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. The modal component provides `modal_unique_id`\nas an argument to its inner block. Appending this ID to every\nlive components' ID nested inside the modal is important for\nconsistent state reset on every reopening. This also applies\nto live components nested inside live components embedded directly\nin the modal's inner block - then the unique ID should be also\npassed down as an attribute and appended accordingly. Appending can\nbe skipped if embedded component handles state reset explicitly\n(via, for instance, `phx-click-away` callback).\n\n`Modal` exposes a number of functions for managing window state:\n\n * `Modal.JS.preopen/1` - to preopen the modal on the frontend.\n Useful when the actual opening is done server-side with\n `Modal.open/2` - helps avoid lack of feedback to the end user\n when server-side state change before opening the modal is\n still in progress.\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.open/2` - to open the modal from the backend; usually\n called from `handle_event/2` of component wrapping the modal\n and providing the state. Should be used together with\n `Modal.JS.preopen/1` for optimal user experience.\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.open/2","doc":"","ref":"PlausibleWeb.Live.Components.Modal.html#open/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 `\"\"`.\n* `preload?` (`:boolean`) - Defaults to `true`.","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.Verification","doc":"This component is responsible for rendering the verification progress\nand diagnostics.","ref":"PlausibleWeb.Live.Components.Verification.html"},{"type":"function","title":"PlausibleWeb.Live.Components.Verification.render/1","doc":"","ref":"PlausibleWeb.Live.Components.Verification.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Verification.render/1","doc":"* `domain` (`:string`) (required)\n* `message` (`:string`) - Defaults to `\"We're visiting your site to ensure that everything is working\"`.\n* `super_admin?` (`:boolean`) - Defaults to `false`.\n* `finished?` (`:boolean`) - Defaults to `false`.\n* `success?` (`:boolean`) - Defaults to `false`.\n* `verification_state` (`Plausible.Verification.State`) - Defaults to `nil`.\n* `interpretation` (`Plausible.Verification.Diagnostics.Result`) - Defaults to `nil`.\n* `attempts` (`:integer`) - Defaults to `0`.\n* `flow` (`:string`) - Defaults to `\"\"`.\n* `installation_type` (`:string`) - Defaults to `nil`.\n* `awaiting_first_pageview?` (`:boolean`) - Defaults to `false`.","ref":"PlausibleWeb.Live.Components.Verification.html#render/1-attributes"},{"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.create_form/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#create_form/1"},{"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* `suffix` (`:string`)\n* `existing_goals` (`:list`)\n* `goal_options` (`:list`)\n* `goal` (`Plausible.Goal`) - Defaults to `nil`.\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.edit_form/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#edit_form/1"},{"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* `suffix` (`:string`)\n* `goal` (`Plausible.Goal`) - Defaults to `nil`.\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.revenue_goal_settings/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#revenue_goal_settings/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.suggest_event_names/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#suggest_event_names/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.suggest_page_paths/2","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#suggest_page_paths/2"},{"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.custom_event_description/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.List.html#custom_event_description/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.List.goal_description/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.List.html#goal_description/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.List.pageview_description/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.List.html#pageview_description/1"},{"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.Installation","doc":"User assistance module around Plausible installation instructions/onboarding","ref":"PlausibleWeb.Live.Installation.html"},{"type":"function","title":"PlausibleWeb.Live.Installation.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Installation.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Installation.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Installation.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Installation.handle_params/3","doc":"","ref":"PlausibleWeb.Live.Installation.html#handle_params/3"},{"type":"function","title":"PlausibleWeb.Live.Installation.mount/3","doc":"","ref":"PlausibleWeb.Live.Installation.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Installation.render/1","doc":"","ref":"PlausibleWeb.Live.Installation.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Installation.render_snippet_404/0","doc":"","ref":"PlausibleWeb.Live.Installation.html#render_snippet_404/0"},{"type":"function","title":"PlausibleWeb.Live.Installation.render_snippet_404/1","doc":"","ref":"PlausibleWeb.Live.Installation.html#render_snippet_404/1"},{"type":"function","title":"PlausibleWeb.Live.Installation.script_extension_params/0","doc":"","ref":"PlausibleWeb.Live.Installation.html#script_extension_params/0"},{"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.HostnameRules","doc":"LiveView allowing hostname Rules management","ref":"PlausibleWeb.Live.Shields.HostnameRules.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.send_flash/2","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#send_flash/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.suggest_hostnames/3","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#suggest_hostnames/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.update/2","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.Shields.Hostnames","doc":"LiveView for Hostnames Shield","ref":"PlausibleWeb.Live.Shields.Hostnames.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.Hostnames.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Shields.Hostnames.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.Hostnames.mount/3","doc":"","ref":"PlausibleWeb.Live.Shields.Hostnames.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.Hostnames.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.Hostnames.html#render/1"},{"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.Shields.PageRules","doc":"LiveView allowing page Rules management","ref":"PlausibleWeb.Live.Shields.PageRules.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.send_flash/2","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#send_flash/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.suggest_page_paths/3","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#suggest_page_paths/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.update/2","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.Shields.Pages","doc":"LiveView for IP Addresses Shield","ref":"PlausibleWeb.Live.Shields.Pages.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.Pages.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Shields.Pages.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.Pages.mount/3","doc":"","ref":"PlausibleWeb.Live.Shields.Pages.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.Pages.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.Pages.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.Sites","doc":"LiveView for sites index.","ref":"PlausibleWeb.Live.Sites.html"},{"type":"function","title":"PlausibleWeb.Live.Sites.check_feature_access/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#check_feature_access/2"},{"type":"function","title":"PlausibleWeb.Live.Sites.check_features/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#check_features/2"},{"type":"function","title":"PlausibleWeb.Live.Sites.check_needs_to_upgrade/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#check_needs_to_upgrade/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.ellipsis_menu/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#ellipsis_menu/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.ensure_can_take_ownership/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#ensure_can_take_ownership/2"},{"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.has_sites?/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#has_sites?/1"},{"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":"PlausibleWeb.Live.Sites.mount/3","doc":"","ref":"PlausibleWeb.Live.Sites.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Sites.owns_sites?/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#owns_sites?/2"},{"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.Live.Verification","doc":"LiveView coordinating the site verification process.\nOnboarding new sites, renders a standalone component.\nEmbedded modal variant is available for general site settings.","ref":"PlausibleWeb.Live.Verification.html"},{"type":"function","title":"PlausibleWeb.Live.Verification.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Verification.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Verification.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Verification.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Verification.mount/3","doc":"","ref":"PlausibleWeb.Live.Verification.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Verification.render/1","doc":"","ref":"PlausibleWeb.Live.Verification.html#render/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.Funnels","doc":"Controller for the Funnel resource under Plugins API","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.create/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#create/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.get/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#get/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.index/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#index/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.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.Funnel","doc":"OpenAPI schema for Funnel","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest","doc":"OpenAPI schema for Funnel creation request - get or creates goals along the way","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse","doc":"OpenAPI schema for Funnel list response","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.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.Funnel","doc":"View for rendering Funnels in the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.Funnel.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Funnel.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Funnel.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Funnel.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Funnel.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Funnel.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.Funnel.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.AuthorizePublicAPI","doc":"Plug for authorizing access to Stats and Sites APIs.\n\nThe plug expects `:api_scope` to be provided in the assigns. The scope\nwill then be used to check for API key validity. The assign can be\nprovided in the router configuration in a following way:\n\n scope \"/api/v1/stats\", PlausibleWeb.Api, assigns: %{api_scope: \"some:scope:*\"} do\n pipe_through [:public_api, PlausibleWeb.Plugs.AuthorizePublicAPI]\n\n # route definitions follow\n # ...\n end\n\nThe scope from `:api_scope` is checked for match against all scopes from API key's\n`scopes` field. If the scope is among `@implicit_scopes`, it's considered to be\npresent for any valid API key. Scopes are checked for match by prefix, so if we have\n`some:scope:*` in matching route `:api_scope` and the API key has `some:*` in its\n`scopes` field, they will match.\n\nAfter a match is found, additional verification can be conducted, like in case of\n`stats:read:*`, where valid site ID is expected among parameters too.\n\nAll API requests are rate limited per API key, enforcing a given hourly request limit.","ref":"PlausibleWeb.Plugs.AuthorizePublicAPI.html"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizePublicAPI.call/2","doc":"","ref":"PlausibleWeb.Plugs.AuthorizePublicAPI.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizePublicAPI.init/1","doc":"","ref":"PlausibleWeb.Plugs.AuthorizePublicAPI.html#init/1"},{"type":"module","title":"PlausibleWeb.Plugs.AuthorizeSiteAccess","doc":"Plug restricting access to site and shared link, when present.\n\nIn order to permit access to site regardless of role:\n\n```elixir\nplug AuthorizeSiteAccess\n```\n\nor\n\n```elixir\nplug AuthorizeSiteAccess, :all_roles\n```\n\nPermit access for a subset of roles only:\n\n```elixir\nplug AuthorizeSiteAccess, [:admin, :owner, :super_admin]\n```\n\nPermit access using a custom site param:\n\n```elixir\nplug AuthorizeSiteAccess, {[:admin, :owner, :super_admin], \"site_id\"}\n```\n\nor in case where any role is allowed:\n\n```elixir\nplug AuthorizeSiteAccess, {:all_roles, \"site_id\"}\n```","ref":"PlausibleWeb.Plugs.AuthorizeSiteAccess.html"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizeSiteAccess.call/2","doc":"","ref":"PlausibleWeb.Plugs.AuthorizeSiteAccess.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizeSiteAccess.init/1","doc":"","ref":"PlausibleWeb.Plugs.AuthorizeSiteAccess.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.Plugs.UserSessionTouch","doc":"Plug for bumping timeout on user session on every dashboard request.","ref":"PlausibleWeb.Plugs.UserSessionTouch.html"},{"type":"function","title":"PlausibleWeb.Plugs.UserSessionTouch.call/2","doc":"","ref":"PlausibleWeb.Plugs.UserSessionTouch.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.UserSessionTouch.init/1","doc":"","ref":"PlausibleWeb.Plugs.UserSessionTouch.html#init/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.docs_stats_api/2","doc":"","ref":"PlausibleWeb.Router.html#docs_stats_api/2"},{"type":"function","title":"PlausibleWeb.Router.external_api/2","doc":"","ref":"PlausibleWeb.Router.html#external_api/2"},{"type":"function","title":"PlausibleWeb.Router.flags/2","doc":"","ref":"PlausibleWeb.Router.html#flags/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.SettingsController","doc":"","ref":"PlausibleWeb.SettingsController.html"},{"type":"function","title":"PlausibleWeb.SettingsController.api_keys/2","doc":"","ref":"PlausibleWeb.SettingsController.html#api_keys/2"},{"type":"function","title":"PlausibleWeb.SettingsController.cancel_update_email/2","doc":"","ref":"PlausibleWeb.SettingsController.html#cancel_update_email/2"},{"type":"function","title":"PlausibleWeb.SettingsController.create_api_key/2","doc":"","ref":"PlausibleWeb.SettingsController.html#create_api_key/2"},{"type":"function","title":"PlausibleWeb.SettingsController.danger_zone/2","doc":"","ref":"PlausibleWeb.SettingsController.html#danger_zone/2"},{"type":"function","title":"PlausibleWeb.SettingsController.delete_api_key/2","doc":"","ref":"PlausibleWeb.SettingsController.html#delete_api_key/2"},{"type":"function","title":"PlausibleWeb.SettingsController.delete_session/2","doc":"","ref":"PlausibleWeb.SettingsController.html#delete_session/2"},{"type":"function","title":"PlausibleWeb.SettingsController.index/2","doc":"","ref":"PlausibleWeb.SettingsController.html#index/2"},{"type":"function","title":"PlausibleWeb.SettingsController.invoices/2","doc":"","ref":"PlausibleWeb.SettingsController.html#invoices/2"},{"type":"function","title":"PlausibleWeb.SettingsController.new_api_key/2","doc":"","ref":"PlausibleWeb.SettingsController.html#new_api_key/2"},{"type":"function","title":"PlausibleWeb.SettingsController.preferences/2","doc":"","ref":"PlausibleWeb.SettingsController.html#preferences/2"},{"type":"function","title":"PlausibleWeb.SettingsController.security/2","doc":"","ref":"PlausibleWeb.SettingsController.html#security/2"},{"type":"function","title":"PlausibleWeb.SettingsController.subscription/2","doc":"","ref":"PlausibleWeb.SettingsController.html#subscription/2"},{"type":"function","title":"PlausibleWeb.SettingsController.update_email/2","doc":"","ref":"PlausibleWeb.SettingsController.html#update_email/2"},{"type":"function","title":"PlausibleWeb.SettingsController.update_name/2","doc":"","ref":"PlausibleWeb.SettingsController.html#update_name/2"},{"type":"function","title":"PlausibleWeb.SettingsController.update_password/2","doc":"","ref":"PlausibleWeb.SettingsController.html#update_password/2"},{"type":"function","title":"PlausibleWeb.SettingsController.update_theme/2","doc":"","ref":"PlausibleWeb.SettingsController.html#update_theme/2"},{"type":"module","title":"PlausibleWeb.SettingsView","doc":"","ref":"PlausibleWeb.SettingsView.html"},{"type":"function","title":"PlausibleWeb.SettingsView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.SettingsView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.SettingsView.api_keys.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#api_keys.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.danger_zone.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#danger_zone.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.format_invoices/1","doc":"","ref":"PlausibleWeb.SettingsView.html#format_invoices/1"},{"type":"function","title":"PlausibleWeb.SettingsView.invoices.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#invoices.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.new_api_key.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#new_api_key.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.preferences.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#preferences.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.present_subscription_status/1","doc":"","ref":"PlausibleWeb.SettingsView.html#present_subscription_status/1"},{"type":"function","title":"PlausibleWeb.SettingsView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.SettingsView.html#render/2"},{"type":"function","title":"PlausibleWeb.SettingsView.security.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#security.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.subscription.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#subscription.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.subscription_colors/1","doc":"","ref":"PlausibleWeb.SettingsView.html#subscription_colors/1"},{"type":"function","title":"PlausibleWeb.SettingsView.subscription_interval/1","doc":"","ref":"PlausibleWeb.SettingsView.html#subscription_interval/1"},{"type":"function","title":"PlausibleWeb.SettingsView.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.SettingsView.html#template_not_found/2"},{"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_by_user/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#remove_member_by_user/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_by_user/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_by_user/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_traffic_change_notification_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_traffic_change_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.csv_import/2","doc":"","ref":"PlausibleWeb.SiteController.html#csv_import/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_traffic_change_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#disable_traffic_change_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.download_export/2","doc":"","ref":"PlausibleWeb.SiteController.html#download_export/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_traffic_change_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#enable_traffic_change_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.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_traffic_change_notification_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#remove_traffic_change_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_traffic_change_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_traffic_change_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.csv_import.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#csv_import.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.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_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.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":"module","title":"PlausibleWeb.TestController","doc":"","ref":"PlausibleWeb.TestController.html"},{"type":"function","title":"PlausibleWeb.TestController.api_basic/2","doc":"","ref":"PlausibleWeb.TestController.html#api_basic/2"},{"type":"function","title":"PlausibleWeb.TestController.browser_basic/2","doc":"","ref":"PlausibleWeb.TestController.html#browser_basic/2"},{"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":"module","title":"PlausibleWeb.UserAuth","doc":"Functions for user session management.","ref":"PlausibleWeb.UserAuth.html"},{"type":"function","title":"PlausibleWeb.UserAuth.get_user_session/1","doc":"","ref":"PlausibleWeb.UserAuth.html#get_user_session/1"},{"type":"function","title":"PlausibleWeb.UserAuth.log_in_user/3","doc":"","ref":"PlausibleWeb.UserAuth.html#log_in_user/3"},{"type":"function","title":"PlausibleWeb.UserAuth.log_out_user/1","doc":"","ref":"PlausibleWeb.UserAuth.html#log_out_user/1"},{"type":"function","title":"PlausibleWeb.UserAuth.revoke_all_user_sessions/2","doc":"","ref":"PlausibleWeb.UserAuth.html#revoke_all_user_sessions/2"},{"type":"function","title":"PlausibleWeb.UserAuth.revoke_user_session/2","doc":"","ref":"PlausibleWeb.UserAuth.html#revoke_user_session/2"},{"type":"function","title":"PlausibleWeb.UserAuth.set_logged_in_cookie/1","doc":"Sets the `logged_in` cookie share with the static site for determining\nwhether client is authenticated.\n\nAs it's a separate cookie, there's a chance it might fall out of sync\nwith session cookie state due to manual deletion or premature expiration.","ref":"PlausibleWeb.UserAuth.html#set_logged_in_cookie/1"},{"type":"function","title":"PlausibleWeb.UserAuth.touch_user_session/2","doc":"","ref":"PlausibleWeb.UserAuth.html#touch_user_session/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, 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 thousands of 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 [small](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. Track ecommerce revenue, outbound link clicks, file downloads and 404 error pages. Increase conversions using funnel analysis.\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 +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.ce?/0","doc":"","ref":"Plausible.html#ce?/0"},{"type":"function","title":"Plausible.ee?/0","doc":"","ref":"Plausible.html#ee?/0"},{"type":"macro","title":"Plausible.on_ce/1","doc":"","ref":"Plausible.html#on_ce/1"},{"type":"macro","title":"Plausible.on_ee/1","doc":"","ref":"Plausible.html#on_ee/1"},{"type":"function","title":"Plausible.product_name/0","doc":"","ref":"Plausible.html#product_name/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.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.AsyncInsertRepo.html#alter_update_all/3"},{"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_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.AsyncInsertRepo.html#to_inline_sql/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":"Functions for user authentication context.","ref":"Plausible.Auth.html"},{"type":"function","title":"Plausible.Auth.check_password/2","doc":"","ref":"Plausible.Auth.html#check_password/2"},{"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.get_user_by/1","doc":"","ref":"Plausible.Auth.html#get_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.rate_limit/2","doc":"","ref":"Plausible.Auth.html#rate_limit/2"},{"type":"function","title":"Plausible.Auth.rate_limits/0","doc":"","ref":"Plausible.Auth.html#rate_limits/0"},{"type":"function","title":"Plausible.Auth.user_owns_sites?/1","doc":"","ref":"Plausible.Auth.html#user_owns_sites?/1"},{"type":"type","title":"Plausible.Auth.rate_limit_type/0","doc":"","ref":"Plausible.Auth.html#t:rate_limit_type/0"},{"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. There's also alternative call for forced\ndisabling of TOTP for a given user without sending any notification,\n`force_disable/1`. It's meant for use in situation where user lost both,\n2FA device and recovery codes and their identity is verified independently.\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.force_disable/1","doc":"","ref":"Plausible.Auth.TOTP.html#force_disable/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.name_changeset/2","doc":"","ref":"Plausible.Auth.User.html#name_changeset/2"},{"type":"function","title":"Plausible.Auth.User.new/1","doc":"","ref":"Plausible.Auth.User.html#new/1"},{"type":"function","title":"Plausible.Auth.User.password_changeset/2","doc":"","ref":"Plausible.Auth.User.html#password_changeset/2"},{"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.theme_changeset/2","doc":"","ref":"Plausible.Auth.User.html#theme_changeset/2"},{"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.after_update/2","doc":"","ref":"Plausible.Auth.UserAdmin.html#after_update/2"},{"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.disable_2fa/1","doc":"","ref":"Plausible.Auth.UserAdmin.html#disable_2fa/1"},{"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.Auth.UserSession","doc":"Schema for storing user session data.","ref":"Plausible.Auth.UserSession.html"},{"type":"function","title":"Plausible.Auth.UserSession.new_session/3","doc":"","ref":"Plausible.Auth.UserSession.html#new_session/3"},{"type":"function","title":"Plausible.Auth.UserSession.timeout_duration/0","doc":"","ref":"Plausible.Auth.UserSession.html#timeout_duration/0"},{"type":"function","title":"Plausible.Auth.UserSession.touch_session/2","doc":"","ref":"Plausible.Auth.UserSession.html#touch_session/2"},{"type":"type","title":"Plausible.Auth.UserSession.t/0","doc":"","ref":"Plausible.Auth.UserSession.html#t:t/0"},{"type":"module","title":"Plausible.Auth.UserSessions","doc":"Functions for interacting with user sessions.","ref":"Plausible.Auth.UserSessions.html"},{"type":"function","title":"Plausible.Auth.UserSessions.last_used_humanize/2","doc":"","ref":"Plausible.Auth.UserSessions.html#last_used_humanize/2"},{"type":"function","title":"Plausible.Auth.UserSessions.list_for_user/2","doc":"","ref":"Plausible.Auth.UserSessions.html#list_for_user/2"},{"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":"type","title":"Plausible.Billing.EnterprisePlan.t/0","doc":"","ref":"Plausible.Billing.EnterprisePlan.html#t:t/0"},{"type":"module","title":"Plausible.Billing.EnterprisePlanAdmin","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html"},{"type":"function","title":"Plausible.Billing.EnterprisePlanAdmin.create_changeset/2","doc":"","ref":"Plausible.Billing.EnterprisePlanAdmin.html#create_changeset/2"},{"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/3","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/3"},{"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/2","doc":"","ref":"Plausible.Billing.PaddleApi.html#fetch_prices/2"},{"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/2","doc":"","ref":"Plausible.Billing.Plans.html#get_price_for/2"},{"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 subscription to choose.\n\nAs new versions of plans are introduced, subscriptions which 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/2","doc":"","ref":"Plausible.Billing.Plans.html#latest_enterprise_plan_with_price/2"},{"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_by_usage/2","doc":"","ref":"Plausible.Billing.Plans.html#suggest_by_usage/2"},{"type":"function","title":"Plausible.Billing.Plans.with_prices/2","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/2"},{"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.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.eligible_for_upgrade?/1","doc":"","ref":"Plausible.Billing.Quota.html#eligible_for_upgrade?/1"},{"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_feature_access/2","doc":"","ref":"Plausible.Billing.Quota.html#ensure_feature_access/2"},{"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.exceeded_cycles/2","doc":"","ref":"Plausible.Billing.Quota.html#exceeded_cycles/2"},{"type":"function","title":"Plausible.Billing.Quota.exceeds_last_two_usage_cycles?/2","doc":"","ref":"Plausible.Billing.Quota.html#exceeds_last_two_usage_cycles?/2"},{"type":"function","title":"Plausible.Billing.Quota.suggest_tier/3","doc":"Suggests a suitable tier (Growth or Business) for the given usage map.\n\nIf even the highest Business plan does not accommodate the usage, then\n`:custom` is returned. This means that this kind of usage should get on\na custom plan.\n\n`nil` is returned if the usage is not eligible for upgrade.","ref":"Plausible.Billing.Quota.html#suggest_tier/3"},{"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":"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 wrapper around `Plausible.Cache.Adapter`, where the underlying\nimplementation can be transparently swapped.\n\nEven though normally the relevant Adapter processes are 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.Adapter","doc":"Interface for the underlying cache implementation.\nCurrently: ConCache\n\nUsing the Adapter module directly, the user must ensure that the relevant\nprocesses are available to use, which is normally done via the child specification.","ref":"Plausible.Cache.Adapter.html"},{"type":"function","title":"Plausible.Cache.Adapter.child_spec/3","doc":"","ref":"Plausible.Cache.Adapter.html#child_spec/3"},{"type":"function","title":"Plausible.Cache.Adapter.delete/2","doc":"","ref":"Plausible.Cache.Adapter.html#delete/2"},{"type":"function","title":"Plausible.Cache.Adapter.fetch/3","doc":"","ref":"Plausible.Cache.Adapter.html#fetch/3"},{"type":"function","title":"Plausible.Cache.Adapter.get/2","doc":"","ref":"Plausible.Cache.Adapter.html#get/2"},{"type":"function","title":"Plausible.Cache.Adapter.get/3","doc":"","ref":"Plausible.Cache.Adapter.html#get/3"},{"type":"function","title":"Plausible.Cache.Adapter.keys/1","doc":"","ref":"Plausible.Cache.Adapter.html#keys/1"},{"type":"function","title":"Plausible.Cache.Adapter.put/4","doc":"","ref":"Plausible.Cache.Adapter.html#put/4"},{"type":"function","title":"Plausible.Cache.Adapter.put_many/2","doc":"","ref":"Plausible.Cache.Adapter.html#put_many/2"},{"type":"function","title":"Plausible.Cache.Adapter.size/1","doc":"","ref":"Plausible.Cache.Adapter.html#size/1"},{"type":"function","title":"Plausible.Cache.Adapter.with_lock/4","doc":"","ref":"Plausible.Cache.Adapter.html#with_lock/4"},{"type":"module","title":"Plausible.Cache.Stats","doc":"Keeps track of hit/miss ratio for various caches.","ref":"Plausible.Cache.Stats.html"},{"type":"function","title":"Plausible.Cache.Stats.bump/2","doc":"","ref":"Plausible.Cache.Stats.html#bump/2"},{"type":"function","title":"Plausible.Cache.Stats.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.Cache.Stats.html#child_spec/1"},{"type":"function","title":"Plausible.Cache.Stats.gather/1","doc":"","ref":"Plausible.Cache.Stats.html#gather/1"},{"type":"function","title":"Plausible.Cache.Stats.handle_telemetry_event/4","doc":"","ref":"Plausible.Cache.Stats.html#handle_telemetry_event/4"},{"type":"function","title":"Plausible.Cache.Stats.hit_rate/1","doc":"","ref":"Plausible.Cache.Stats.html#hit_rate/1"},{"type":"function","title":"Plausible.Cache.Stats.init/1","doc":"","ref":"Plausible.Cache.Stats.html#init/1"},{"type":"function","title":"Plausible.Cache.Stats.size/1","doc":"","ref":"Plausible.Cache.Stats.html#size/1"},{"type":"function","title":"Plausible.Cache.Stats.start_link/1","doc":"","ref":"Plausible.Cache.Stats.html#start_link/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 {\n :error,\n {\n Cldr.UnknownLocaleError,\n \"Locale TestBackend.Cldr.Locale.new!(\\\"de-DE\\\") does not map to a known gettext locale name\"\n }\n }","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_language` 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\nwith 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\nwith 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.merge_session/2","doc":"","ref":"Plausible.ClickhouseEventV2.html#merge_session/2"},{"type":"function","title":"Plausible.ClickhouseEventV2.new/1","doc":"","ref":"Plausible.ClickhouseEventV2.html#new/1"},{"type":"module","title":"Plausible.ClickhouseLocationData","doc":"Schema for storing location id <-> translation mappings in ClickHouse\n\nIndirectly read via dictionary `location_data_dictionary` in ALIAS columns in\n`events_v2`, `sessions_v2` and `imported_locations` table.","ref":"Plausible.ClickhouseLocationData.html"},{"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.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.ClickhouseRepo.html#alter_update_all/3"},{"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/2","doc":"","ref":"Plausible.ClickhouseRepo.html#parallel_tasks/2"},{"type":"function","title":"Plausible.ClickhouseRepo.preload/3","doc":"","ref":"Plausible.ClickhouseRepo.html#preload/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_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.ClickhouseRepo.html#to_inline_sql/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_bool_from_path_or_env/3","doc":"","ref":"Plausible.ConfigHelpers.html#get_bool_from_path_or_env/3"},{"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.CrmExtensions","doc":"Extensions for Kaffy CRM","ref":"Plausible.CrmExtensions.html"},{"type":"function","title":"Plausible.CrmExtensions.javascripts/1","doc":"","ref":"Plausible.CrmExtensions.html#javascripts/1"},{"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.AcquisitionChannel","doc":"Creates dictionaries and functions to calculate acquisition channel in ClickHouse\n\nCreates `acquisition_channel` columns in `events_v2` and `sessions_v2` tables.\nRun via `Plausible.DataMigration.AcquisitionChannel.run(options)`\n\nOptions:\n- `add_column` - creates the materialized column. Already done in a migration\n- `update_column` - Updates the column definition to use new function definitions. Defaults to true.\n Note that historical data is only updated if `backfill` is set to true or if it was never materialized.\n- `backfill` - backfills the data for the column. Speeds up calculations on historical data.\n\nSQL files available at: priv/data_migrations/AcquisitionChannel/sql","ref":"Plausible.DataMigration.AcquisitionChannel.html"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.confirm/3","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.do_run/3","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#do_run/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.run/1","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#run/1"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.run_sql/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.AcquisitionChannel.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.AcquisitionChannel.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.AcquisitionChannel.unwrap/2","doc":"","ref":"Plausible.DataMigration.AcquisitionChannel.html#unwrap/2"},{"type":"module","title":"Plausible.DataMigration.BackfillTeams","doc":"Backfill and sync all teams related entities.","ref":"Plausible.DataMigration.BackfillTeams.html"},{"type":"function","title":"Plausible.DataMigration.BackfillTeams.delete_orphaned_teams/1","doc":"","ref":"Plausible.DataMigration.BackfillTeams.html#delete_orphaned_teams/1"},{"type":"function","title":"Plausible.DataMigration.BackfillTeams.run/1","doc":"","ref":"Plausible.DataMigration.BackfillTeams.html#run/1"},{"type":"module","title":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource","doc":"Clean up referrer_source entries for demo site with\n`Direct / None` for value populated by dogfooding\nPlausible stats.","ref":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html"},{"type":"function","title":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource.run/1","doc":"","ref":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource.html#run/1"},{"type":"module","title":"Plausible.DataMigration.ClickhouseRepo","doc":"Ecto.Repo for Clickhouse data migrations, to be started manually,\noutside of the main application supervision tree.","ref":"Plausible.DataMigration.ClickhouseRepo.html"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.aggregate/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#aggregate/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.aggregate/4","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#aggregate/4"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.all/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#all/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.DataMigration.ClickhouseRepo.html#alter_update_all/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.checked_out?/0","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.checkout/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#checkout/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.child_spec/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#child_spec/1"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.config/0","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#config/0"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.default_options/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#default_options/1"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.delete/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#delete/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.delete!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#delete!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.delete_all/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#delete_all/2"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.exists?/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#exists?/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get!/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get!/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get_by/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get_by/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get_by!/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get_by!/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert_all/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert_all/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert_or_update/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.insert_or_update!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#insert_stream/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.load/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#load/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.one/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#one/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.one!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#one!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.preload/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#preload/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.prepare_query/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#query/3"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#query!/3"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.reload/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#reload/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.reload!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#reload!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.start/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#start/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.start_link/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#start_link/1"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.stop/1","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#stop/1"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.stream/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#stream/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.to_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.DataMigration.ClickhouseRepo.html#to_inline_sql/2"},{"type":"function","title":"Plausible.DataMigration.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.DataMigration.ClickhouseRepo.html#to_sql/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.update/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#update/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.update!/2","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#update!/2"},{"type":"function","title":"Plausible.DataMigration.ClickhouseRepo.update_all/3","doc":"","ref":"Plausible.DataMigration.ClickhouseRepo.html#update_all/3"},{"type":"module","title":"Plausible.DataMigration.LocationsSync","doc":"ClickHouse locations data migration for storing location names in ClickHouse.\n\nOnly run when `Location.version()` changes: either as a migration or in cron.\n\nThe migration:\n1. Truncates existing `location_data` table (if exists)\n2. Creates new table (if needed)\n3. Inserts new data from Location module\n4. (Re-)Creates dictionary to read location data from table\n5. Creates ALIAS columns in `events_v2`, `sessions_v2` and `imported_locations` table to make reading location names easy\n6. Updates table comment for `location_data` to indicate last version synced.\n\nNote that the dictionary is large enough to cache the whole dataset in memory, making lookups fast.\n\nThis migration is intended to be idempotent and rerunnable - if run multiple times, it should always set things to the same\nresult as if run once.\n\nSQL files available at: priv/data_migrations/LocationsSync/sql","ref":"Plausible.DataMigration.LocationsSync.html"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.confirm/3","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.do_run/3","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#do_run/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.out_of_date?/0","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#out_of_date?/0"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.run/0","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#run/0"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.run_sql/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.LocationsSync.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.LocationsSync.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.LocationsSync.unwrap/2","doc":"","ref":"Plausible.DataMigration.LocationsSync.html#unwrap/2"},{"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.do_run/3","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#do_run/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/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.NumericIDs.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.NumericIDs.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.NumericIDs.unwrap/2","doc":"","ref":"Plausible.DataMigration.NumericIDs.html#unwrap/2"},{"type":"module","title":"Plausible.DataMigration.PopulateEventSessionColumns","doc":"Populates event session columns with data from sessions table.\n\nRun via: ./bin/plausible rpc \"Plausible.DataMigration.PopulateEventSessionColumns.run\"\nKill via: ./bin/plausible rpc \"Plausible.DataMigration.PopulateEventSessionColumns.kill\"\nMonitor via ./bin/plausible rpc \"Plausible.DataMigration.PopulateEventSessionColumns.report_progress\"\n\nSuggested to run in a screen/tmux session to be able to easily monitor\n\nSQL files available at: priv/data_migrations/PopulateEventSessionColumns/sql","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.confirm/3","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#confirm/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.do_run/3","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#do_run/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.kill/1","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#kill/1"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.report_progress/1","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#report_progress/1"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.run/1","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#run/1"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.run_sql/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.unwrap/2","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#unwrap/2"},{"type":"function","title":"Plausible.DataMigration.PopulateEventSessionColumns.wait_until_mutations_complete/1","doc":"","ref":"Plausible.DataMigration.PopulateEventSessionColumns.html#wait_until_mutations_complete/1"},{"type":"module","title":"Plausible.DataMigration.PostgresRepo","doc":"Ecto.Repo for Posrtgres data migrations, to be started manually,\noutside of the main application supervision tree.","ref":"Plausible.DataMigration.PostgresRepo.html"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.aggregate/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#aggregate/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.aggregate/4","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#aggregate/4"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.all/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#all/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.checked_out?/0","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#checked_out?/0"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.checkout/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#checkout/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.child_spec/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#child_spec/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.config/0","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#config/0"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.default_options/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#default_options/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.delete/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#delete/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.delete!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#delete!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.delete_all/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#delete_all/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.PostgresRepo.html#disconnect_all/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.exists?/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#exists?/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.DataMigration.PostgresRepo.html#explain/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get!/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get!/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get_by/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get_by/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get_by!/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get_by!/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.get_dynamic_repo/0","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#get_dynamic_repo/0"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.in_transaction?/0","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#in_transaction?/0"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert_all/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert_all/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert_or_update/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert_or_update/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.insert_or_update!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#insert_or_update!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.load/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#load/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.one/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#one/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.one!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#one!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.preload/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#preload/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.prepare_query/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#prepare_query/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.put_dynamic_repo/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#put_dynamic_repo/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.PostgresRepo.html#query/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.PostgresRepo.html#query!/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.DataMigration.PostgresRepo.html#query_many/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.DataMigration.PostgresRepo.html#query_many!/3"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.reload/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#reload/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.reload!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#reload!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.rollback/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#rollback/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.start/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#start/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.start_link/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#start_link/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.stop/1","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#stop/1"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.stream/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#stream/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.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.PostgresRepo.html#to_sql/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.transaction/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#transaction/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.update/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#update/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.update!/2","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#update!/2"},{"type":"function","title":"Plausible.DataMigration.PostgresRepo.update_all/3","doc":"","ref":"Plausible.DataMigration.PostgresRepo.html#update_all/3"},{"type":"module","title":"Plausible.DataMigration.SiteImports","doc":"!!!WARNING!!!: This script is used in migrations. Please take special care\nwhen altering it.\n\nSite imports migration backfilling SiteImport entries for old imports\nand alters import end dates to match actual end date of respective import stats.","ref":"Plausible.DataMigration.SiteImports.html"},{"type":"function","title":"Plausible.DataMigration.SiteImports.run/1","doc":"","ref":"Plausible.DataMigration.SiteImports.html#run/1"},{"type":"module","title":"Plausible.DataMigration.TeamsConsitencyCheck","doc":"Verify consistency of teams.","ref":"Plausible.DataMigration.TeamsConsitencyCheck.html"},{"type":"function","title":"Plausible.DataMigration.TeamsConsitencyCheck.run/0","doc":"","ref":"Plausible.DataMigration.TeamsConsitencyCheck.html#run/0"},{"type":"module","title":"Plausible.DataMigration.VersionedSessions","doc":"!!!WARNING!!!: This script is used in migrations. Please take special care\nwhen altering it.\n\nSessions CollapsingMergeTree -> VersionedCollapsingMergeTree migration,\nSQL files available at:\n\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.do_run/3","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#do_run/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/3","doc":"Runs a single SQL query in a file.\n\nValid options:\n- `quiet` - reduces output from running the SQL\n- `params` - List of query parameters.\n- `query_options` - passed to Repo.query","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql/3"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run_sql_confirm/3","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql_confirm/3"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.run_sql_multi/3","doc":"Runs multiple SQL queries from a single file.\n\nNote that each query must be separated by semicolons.","ref":"Plausible.DataMigration.VersionedSessions.html#run_sql_multi/3"},{"type":"function","title":"Plausible.DataMigration.VersionedSessions.unwrap/2","doc":"","ref":"Plausible.DataMigration.VersionedSessions.html#unwrap/2"},{"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.Ecto.Types.CompiledRegex","doc":"Ensures that the regex is compiled on load","ref":"Plausible.Ecto.Types.CompiledRegex.html"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.cast/1","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#cast/1"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.dump/1","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#dump/1"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.embed_as/1","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#embed_as/1"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.equal?/2","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#equal?/2"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.load/1","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#load/1"},{"type":"function","title":"Plausible.Ecto.Types.CompiledRegex.type/0","doc":"","ref":"Plausible.Ecto.Types.CompiledRegex.html#type/0"},{"type":"module","title":"Plausible.Exports","doc":"Contains functions to export data for events and sessions as Zip archives.","ref":"Plausible.Exports.html"},{"type":"function","title":"Plausible.Exports.archive_filename/2","doc":"Renders export archive filename.\n\nExamples:\n\n iex> archive_filename(\"plausible.io\", _created_on = ~D[2024-12-31])\n \"plausible_io_20241231.zip\"","ref":"Plausible.Exports.html#archive_filename/2"},{"type":"function","title":"Plausible.Exports.content_disposition/1","doc":"Safely renders content disposition for an arbitrary export filename.\n\nExamples:\n\n iex> content_disposition(\"plausible_io_20241231.zip\")\n \"attachment; filename=\\\"plausible_io_20241231.zip\\\"\"\n\n iex> content_disposition(\"📊.zip\")\n \"attachment; filename=\\\"plausible-export.zip\\\"; filename*=utf-8''%F0%9F%93%8A.zip\"","ref":"Plausible.Exports.html#content_disposition/1"},{"type":"function","title":"Plausible.Exports.date_range/2","doc":"Returns the date range for the site's events data in site's timezone or `nil` if there is no data","ref":"Plausible.Exports.html#date_range/2"},{"type":"function","title":"Plausible.Exports.delete_local_export/1","doc":"Deletes local export for a site","ref":"Plausible.Exports.html#delete_local_export/1"},{"type":"function","title":"Plausible.Exports.delete_s3_export!/1","doc":"Deletes S3 export for a site. Raises if object storage is unavailable.","ref":"Plausible.Exports.html#delete_s3_export!/1"},{"type":"function","title":"Plausible.Exports.export_queries/2","doc":"Builds Ecto queries to export data from `events_v2` and `sessions_v2`\ntables into the format of `imported_*` tables for a website.","ref":"Plausible.Exports.html#export_queries/2"},{"type":"function","title":"Plausible.Exports.get_last_export_job/1","doc":"Gets last CSV export job for a site","ref":"Plausible.Exports.html#get_last_export_job/1"},{"type":"function","title":"Plausible.Exports.get_local_export/3","doc":"Gets local export for a site","ref":"Plausible.Exports.html#get_local_export/3"},{"type":"function","title":"Plausible.Exports.get_s3_export!/2","doc":"Gets S3 export for a site. Raises if object storage is unavailable.","ref":"Plausible.Exports.html#get_s3_export!/2"},{"type":"function","title":"Plausible.Exports.oban_listen/0","doc":"Subscribes to CSV export job notifications","ref":"Plausible.Exports.html#oban_listen/0"},{"type":"function","title":"Plausible.Exports.schedule_local_export/2","doc":"Schedules CSV export job to local storage","ref":"Plausible.Exports.html#schedule_local_export/2"},{"type":"function","title":"Plausible.Exports.schedule_s3_export/2","doc":"Schedules CSV export job to S3 storage","ref":"Plausible.Exports.html#schedule_s3_export/2"},{"type":"function","title":"Plausible.Exports.stream_archive/3","doc":"Creates a streamable Zip archive from the provided (named) Ecto queries.\n\nExample usage:\n\n {:ok, pool} = Ch.start_link(pool_size: 1)\n\n DBConnection.run(pool, fn conn ->\n conn\n |> stream_archive(export_queries(_site_id = 1), format: \"CSVWithNames\")\n |> Stream.into(File.stream!(\"export.zip\"))\n |> Stream.run()\n end)","ref":"Plausible.Exports.html#stream_archive/3"},{"type":"type","title":"Plausible.Exports.export/0","doc":"","ref":"Plausible.Exports.html#t:export/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.drop_notification_factory/0","doc":"","ref":"Plausible.Factory.html#drop_notification_factory/0"},{"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/1","doc":"","ref":"Plausible.Factory.html#event_factory/1"},{"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/1","doc":"","ref":"Plausible.Factory.html#goal_factory/1"},{"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.guest_invitation_factory/0","doc":"","ref":"Plausible.Factory.html#guest_invitation_factory/0"},{"type":"function","title":"Plausible.Factory.guest_membership_factory/0","doc":"","ref":"Plausible.Factory.html#guest_membership_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_custom_events_factory/0","doc":"","ref":"Plausible.Factory.html#imported_custom_events_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.pageleave_factory/1","doc":"","ref":"Plausible.Factory.html#pageleave_factory/1"},{"type":"function","title":"Plausible.Factory.pageview_factory/1","doc":"","ref":"Plausible.Factory.html#pageview_factory/1"},{"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.site_transfer_factory/0","doc":"","ref":"Plausible.Factory.html#site_transfer_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.team_factory/0","doc":"","ref":"Plausible.Factory.html#team_factory/0"},{"type":"function","title":"Plausible.Factory.team_invitation_factory/0","doc":"","ref":"Plausible.Factory.html#team_invitation_factory/0"},{"type":"function","title":"Plausible.Factory.team_membership_factory/0","doc":"","ref":"Plausible.Factory.html#team_membership_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.File","doc":"File helpers for Plausible.","ref":"Plausible.File.html"},{"type":"function","title":"Plausible.File.mv!/2","doc":"Moves a file from one location to another.\n\nTries renaming first, and falls back to copying and deleting the original.","ref":"Plausible.File.html#mv!/2"},{"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_steps/2","doc":"","ref":"Plausible.Funnel.html#put_steps/2"},{"type":"type","title":"Plausible.Funnel.t/0","doc":"","ref":"Plausible.Funnel.html#t:t/0"},{"type":"module","title":"Plausible.Funnel.Const","doc":"Compile-time convenience 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.edit_changeset/3","doc":"","ref":"Plausible.Funnels.html#edit_changeset/3"},{"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":"function","title":"Plausible.Funnels.update/3","doc":"","ref":"Plausible.Funnels.html#update/3"},{"type":"function","title":"Plausible.Funnels.with_goals_query/1","doc":"","ref":"Plausible.Funnels.html#with_goals_query/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 * `:cache_dir` - if set, the downloaded .mmdb files are cached there across\n restarts.\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":"function","title":"Plausible.Goal.display_name/1","doc":"","ref":"Plausible.Goal.html#display_name/1"},{"type":"function","title":"Plausible.Goal.max_event_name_length/0","doc":"","ref":"Plausible.Goal.html#max_event_name_length/0"},{"type":"function","title":"Plausible.Goal.type/1","doc":"","ref":"Plausible.Goal.html#type/1"},{"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_option/1","doc":"","ref":"Plausible.Goal.Revenue.html#currency_option/1"},{"type":"function","title":"Plausible.Goal.Revenue.currency_options/0","doc":"","ref":"Plausible.Goal.Revenue.html#currency_options/0"},{"type":"function","title":"Plausible.Goal.Revenue.display/1","doc":"","ref":"Plausible.Goal.Revenue.html#display/1"},{"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.batch_create_event_goals/2","doc":"","ref":"Plausible.Goals.html#batch_create_event_goals/2"},{"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.create_404/1","doc":"","ref":"Plausible.Goals.html#create_404/1"},{"type":"function","title":"Plausible.Goals.create_file_downloads/1","doc":"","ref":"Plausible.Goals.html#create_file_downloads/1"},{"type":"function","title":"Plausible.Goals.create_outbound_links/1","doc":"","ref":"Plausible.Goals.html#create_outbound_links/1"},{"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.delete_404/1","doc":"","ref":"Plausible.Goals.html#delete_404/1"},{"type":"function","title":"Plausible.Goals.delete_file_downloads/1","doc":"","ref":"Plausible.Goals.html#delete_file_downloads/1"},{"type":"function","title":"Plausible.Goals.delete_outbound_links/1","doc":"","ref":"Plausible.Goals.html#delete_outbound_links/1"},{"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":"function","title":"Plausible.Goals.get/2","doc":"","ref":"Plausible.Goals.html#get/2"},{"type":"function","title":"Plausible.Goals.list_revenue_goals/1","doc":"","ref":"Plausible.Goals.html#list_revenue_goals/1"},{"type":"function","title":"Plausible.Goals.update/2","doc":"","ref":"Plausible.Goals.html#update/2"},{"type":"module","title":"Plausible.Google.API","doc":"API to Google services.","ref":"Plausible.Google.API.html"},{"type":"function","title":"Plausible.Google.API.fetch_access_token!/1","doc":"","ref":"Plausible.Google.API.html#fetch_access_token!/1"},{"type":"function","title":"Plausible.Google.API.fetch_stats/4","doc":"","ref":"Plausible.Google.API.html#fetch_stats/4"},{"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_analytics_end_date/2","doc":"","ref":"Plausible.Google.API.html#get_analytics_end_date/2"},{"type":"function","title":"Plausible.Google.API.get_analytics_start_date/2","doc":"","ref":"Plausible.Google.API.html#get_analytics_start_date/2"},{"type":"function","title":"Plausible.Google.API.get_property/2","doc":"","ref":"Plausible.Google.API.html#get_property/2"},{"type":"function","title":"Plausible.Google.API.import_authorize_url/1","doc":"","ref":"Plausible.Google.API.html#import_authorize_url/1"},{"type":"function","title":"Plausible.Google.API.list_properties/1","doc":"","ref":"Plausible.Google.API.html#list_properties/1"},{"type":"function","title":"Plausible.Google.API.maybe_refresh_token/1","doc":"","ref":"Plausible.Google.API.html#maybe_refresh_token/1"},{"type":"function","title":"Plausible.Google.API.property?/1","doc":"","ref":"Plausible.Google.API.html#property?/1"},{"type":"function","title":"Plausible.Google.API.search_console_authorize_url/1","doc":"","ref":"Plausible.Google.API.html#search_console_authorize_url/1"},{"type":"module","title":"Plausible.Google.API.Mock","doc":"Mock of API to Google services.","ref":"Plausible.Google.API.Mock.html"},{"type":"function","title":"Plausible.Google.API.Mock.fetch_stats/4","doc":"","ref":"Plausible.Google.API.Mock.html#fetch_stats/4"},{"type":"module","title":"Plausible.Google.GA4.API","doc":"API for Google Analytics 4.","ref":"Plausible.Google.GA4.API.html"},{"type":"function","title":"Plausible.Google.GA4.API.fetch_and_persist/2","doc":"","ref":"Plausible.Google.GA4.API.html#fetch_and_persist/2"},{"type":"function","title":"Plausible.Google.GA4.API.get_analytics_end_date/2","doc":"","ref":"Plausible.Google.GA4.API.html#get_analytics_end_date/2"},{"type":"function","title":"Plausible.Google.GA4.API.get_analytics_start_date/2","doc":"","ref":"Plausible.Google.GA4.API.html#get_analytics_start_date/2"},{"type":"function","title":"Plausible.Google.GA4.API.get_property/2","doc":"","ref":"Plausible.Google.GA4.API.html#get_property/2"},{"type":"function","title":"Plausible.Google.GA4.API.import_analytics/4","doc":"","ref":"Plausible.Google.GA4.API.html#import_analytics/4"},{"type":"function","title":"Plausible.Google.GA4.API.list_properties/1","doc":"","ref":"Plausible.Google.GA4.API.html#list_properties/1"},{"type":"type","title":"Plausible.Google.GA4.API.import_auth/0","doc":"","ref":"Plausible.Google.GA4.API.html#t:import_auth/0"},{"type":"module","title":"Plausible.Google.GA4.HTTP","doc":"HTTP client implementation for Google Analytics 4 API.","ref":"Plausible.Google.GA4.HTTP.html"},{"type":"function","title":"Plausible.Google.GA4.HTTP.get_analytics_end_date/2","doc":"","ref":"Plausible.Google.GA4.HTTP.html#get_analytics_end_date/2"},{"type":"function","title":"Plausible.Google.GA4.HTTP.get_analytics_start_date/2","doc":"","ref":"Plausible.Google.GA4.HTTP.html#get_analytics_start_date/2"},{"type":"function","title":"Plausible.Google.GA4.HTTP.get_property/2","doc":"","ref":"Plausible.Google.GA4.HTTP.html#get_property/2"},{"type":"function","title":"Plausible.Google.GA4.HTTP.get_report/1","doc":"","ref":"Plausible.Google.GA4.HTTP.html#get_report/1"},{"type":"function","title":"Plausible.Google.GA4.HTTP.list_accounts_for_user/1","doc":"","ref":"Plausible.Google.GA4.HTTP.html#list_accounts_for_user/1"},{"type":"module","title":"Plausible.Google.GA4.ReportRequest","doc":"Report request struct for Google Analytics 4 API","ref":"Plausible.Google.GA4.ReportRequest.html"},{"type":"function","title":"Plausible.Google.GA4.ReportRequest.full_report/0","doc":"","ref":"Plausible.Google.GA4.ReportRequest.html#full_report/0"},{"type":"type","title":"Plausible.Google.GA4.ReportRequest.t/0","doc":"","ref":"Plausible.Google.GA4.ReportRequest.html#t:t/0"},{"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.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.refresh_auth_token/1","doc":"","ref":"Plausible.Google.HTTP.html#refresh_auth_token/1"},{"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.HelpScout","doc":"HelpScout callback API logic.","ref":"Plausible.HelpScout.html"},{"type":"function","title":"Plausible.HelpScout.get_details_for_customer/1","doc":"","ref":"Plausible.HelpScout.html#get_details_for_customer/1"},{"type":"function","title":"Plausible.HelpScout.get_details_for_emails/2","doc":"","ref":"Plausible.HelpScout.html#get_details_for_emails/2"},{"type":"function","title":"Plausible.HelpScout.search_users/2","doc":"","ref":"Plausible.HelpScout.html#search_users/2"},{"type":"function","title":"Plausible.HelpScout.signature_errors/0","doc":"","ref":"Plausible.HelpScout.html#signature_errors/0"},{"type":"function","title":"Plausible.HelpScout.validate_signature/1","doc":"Validates signature against secret key configured for the\nHelpScout application.\n\nNOTE: HelpScout signature generation procedure at\nhttps://developer.helpscout.com/apps/guides/signature-validation/\nfails to mention that it's implicitly dependent on request params\norder getting preserved. PHP arrays are ordered maps, so they provide\nthis guarantee. Here, on the other hand, we have to determine the original\norder of the keys directly from the query string and serialize\nparams to JSON using wrapper struct, informing Jason to put the values\nin the serialized object in this particular order matching query string.","ref":"Plausible.HelpScout.html#validate_signature/1"},{"type":"type","title":"Plausible.HelpScout.signature_error/0","doc":"","ref":"Plausible.HelpScout.html#t:signature_error/0"},{"type":"module","title":"Plausible.HelpScout.Vault","doc":"Provides a vault that will be used to encrypt/decrypt the stored HelpScout API access tokens.","ref":"Plausible.HelpScout.Vault.html"},{"type":"function","title":"Plausible.HelpScout.Vault.child_spec/1","doc":"Returns a specification to start this module under a supervisor.\n\nSee `Supervisor`.","ref":"Plausible.HelpScout.Vault.html#child_spec/1"},{"type":"function","title":"Plausible.HelpScout.Vault.start_link/1","doc":"","ref":"Plausible.HelpScout.Vault.html#start_link/1"},{"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.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.ImportDeletionRepo.html#alter_update_all/3"},{"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_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.ImportDeletionRepo.html#to_inline_sql/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\nFor list of currently supported import sources see `Plausible.Imported.ImportSources`.\n\nFor more information on implementing importers, see `Plausible.Imported.Importer`.","ref":"Plausible.Imported.html"},{"type":"function","title":"Plausible.Imported.clamp_dates/3","doc":"","ref":"Plausible.Imported.html#clamp_dates/3"},{"type":"function","title":"Plausible.Imported.clamp_dates/4","doc":"","ref":"Plausible.Imported.html#clamp_dates/4"},{"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_cutoff_date/1","doc":"","ref":"Plausible.Imported.html#get_cutoff_date/1"},{"type":"function","title":"Plausible.Imported.get_import/2","doc":"","ref":"Plausible.Imported.html#get_import/2"},{"type":"function","title":"Plausible.Imported.get_imports_date_range/1","doc":"","ref":"Plausible.Imported.html#get_imports_date_range/1"},{"type":"function","title":"Plausible.Imported.get_legacy_import/1","doc":"","ref":"Plausible.Imported.html#get_legacy_import/1"},{"type":"function","title":"Plausible.Imported.get_occupied_date_ranges/1","doc":"","ref":"Plausible.Imported.html#get_occupied_date_ranges/1"},{"type":"function","title":"Plausible.Imported.goals_with_path/0","doc":"","ref":"Plausible.Imported.html#goals_with_path/0"},{"type":"function","title":"Plausible.Imported.goals_with_url/0","doc":"","ref":"Plausible.Imported.html#goals_with_url/0"},{"type":"function","title":"Plausible.Imported.imported_custom_props/0","doc":"","ref":"Plausible.Imported.html#imported_custom_props/0"},{"type":"function","title":"Plausible.Imported.list_all_imports/2","doc":"","ref":"Plausible.Imported.html#list_all_imports/2"},{"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.other_imports_in_progress?/1","doc":"","ref":"Plausible.Imported.html#other_imports_in_progress?/1"},{"type":"function","title":"Plausible.Imported.schemas/0","doc":"","ref":"Plausible.Imported.html#schemas/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/1","doc":"","ref":"Plausible.Imported.Buffer.html#start_link/1"},{"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 either S3 for which it uses ClickHouse [s3 table function](https://clickhouse.com/docs/en/sql-reference/table-functions/s3)\nor from local storage for which it uses [input function.](https://clickhouse.com/docs/en/sql-reference/table-functions/input)","ref":"Plausible.Imported.CSVImporter.html"},{"type":"function","title":"Plausible.Imported.CSVImporter.date_range/1","doc":"Extracts min/max date range from a list of uploads.\n\nExamples:\n\n iex> date_range([\n ...> %{\"filename\" => \"imported_devices_20190101_20210101.csv\"},\n ...> \"pages_20200101_20220101.csv\"\n ...> ])\n Date.range(~D[2019-01-01], ~D[2022-01-01])\n\n iex> date_range([])\n nil","ref":"Plausible.Imported.CSVImporter.html#date_range/1"},{"type":"function","title":"Plausible.Imported.CSVImporter.extract_table/1","doc":"Extracts the table name from the provided filename.\n\nRaises if the filename doesn't conform to the expected format.\n\nExamples:\n\n iex> extract_table(\"my_data.csv\")\n ** (ArgumentError) invalid filename\n\n iex> extract_table(\"imported_devices_00010101_20250101.csv\")\n \"imported_devices\"\n\n iex> extract_table(\"devices_00010101_20250101.csv\")\n \"imported_devices\"","ref":"Plausible.Imported.CSVImporter.html#extract_table/1"},{"type":"function","title":"Plausible.Imported.CSVImporter.local_dir/1","doc":"Returns local directory for CSV imports storage.\n\nBuilds upon `$DATA_DIR`, `$PERSISTENT_CACHE_DIR` or `$DEFAULT_DATA_DIR` (if set) and falls back to /tmp.\n\n`$DEFAULT_DATA_DIR` is set to `/var/lib/plausible` in container images.\n\nExamples:\n\n iex> local_dir = local_dir(_site_id = 37)\n iex> String.ends_with?(local_dir, \"/plausible-imports/37\")\n true","ref":"Plausible.Imported.CSVImporter.html#local_dir/1"},{"type":"function","title":"Plausible.Imported.CSVImporter.new_import/3","doc":"","ref":"Plausible.Imported.CSVImporter.html#new_import/3"},{"type":"function","title":"Plausible.Imported.CSVImporter.parse_filename!/1","doc":"Extracts table name and min/max dates from the filename.\n\nExamples:\n\n iex> parse_filename!(\"my_data.csv\")\n ** (ArgumentError) invalid filename\n\n iex> parse_filename!(\"imported_devices_00010101_20250101.csv\")\n {\"imported_devices\", ~D[0001-01-01], ~D[2025-01-01]}\n\n iex> parse_filename!(\"devices_00010101_20250101.csv\")\n {\"imported_devices\", ~D[0001-01-01], ~D[2025-01-01]}","ref":"Plausible.Imported.CSVImporter.html#parse_filename!/1"},{"type":"function","title":"Plausible.Imported.CSVImporter.valid_filename?/1","doc":"Checks if the provided filename conforms to the expected format.\n\nExamples:\n\n iex> valid_filename?(\"my_data.csv\")\n false\n\n iex> valid_filename?(\"imported_devices_00010101_20250101.csv\")\n true\n\n iex> valid_filename?(\"devices_00010101_20250101.csv\")\n true","ref":"Plausible.Imported.CSVImporter.html#valid_filename?/1"},{"type":"module","title":"Plausible.Imported.GoogleAnalytics4","doc":"Import implementation for Google Analytics 4.","ref":"Plausible.Imported.GoogleAnalytics4.html"},{"type":"function","title":"Plausible.Imported.GoogleAnalytics4.from_report/4","doc":"","ref":"Plausible.Imported.GoogleAnalytics4.html#from_report/4"},{"type":"function","title":"Plausible.Imported.GoogleAnalytics4.import_data/2","doc":"Imports stats from a Google Analytics 4 property to a Plausible site.\n\nThis function fetches Google Analytics 4 reports which are then passed in batches\nto Clickhouse by the `Plausible.Imported.Buffer` process.","ref":"Plausible.Imported.GoogleAnalytics4.html#import_data/2"},{"type":"function","title":"Plausible.Imported.GoogleAnalytics4.new_import/3","doc":"","ref":"Plausible.Imported.GoogleAnalytics4.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. The error tuple has an alternative `{error, reason, opts}` form,\n where `opts` allow to skip purging imported data so far via `skip_purge?` flag\n and skip marking the import as failed and notifying the user via `skip_mark_failed?`\n flag. Both flags are booleans.\n* `before_start/2` - Optional callback run right before scheduling import job. It's\n expected to either return `{:ok, site_import}` for the import to proceed\n or `{:error, ...}` tuple, which will be returned from `new_import/3` call.\n The `site_import` can be altered or replaced at this stage. The second argument\n are opts passed to `new_import/3`.\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, %{\"event\" => \"complete\", \"import_id\" => ^import_id}} ->\n IO.puts(\"Job completed\")\n\n {:notification, :analytics_imports_jobs, %{\"event\" => \"transient_fail\", \"import_id\" => ^import_id}} ->\n IO.puts(\"Job failed transiently\")\n\n {:notification, :analytics_imports_jobs, %{\"event\" => \"fail\", \"import_id\" => ^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/2","doc":"","ref":"Plausible.Imported.Importer.html#c:before_start/2"},{"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":"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.\n\nNOTE: As importing from UA is no longer supported, this module\nis only used to support rendering existing imports.","ref":"Plausible.Imported.UniversalAnalytics.html"},{"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.alter_update_all/3","doc":"Similar to `Ecto.Repo.update_all/3` but uses [`ALTER TABLE ... UPDATE`](https://clickhouse.com/docs/en/sql-reference/statements/alter/update) instead.\n\nFor more information and performance implications please see:\n\n - https://clickhouse.com/blog/handling-updates-and-deletes-in-clickhouse\n - https://clickhouse.com/docs/en/guides/developer/mutations","ref":"Plausible.IngestRepo.html#alter_update_all/3"},{"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.clustered_table?/1","doc":"","ref":"Plausible.IngestRepo.html#clustered_table?/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.replica_count/1","doc":"","ref":"Plausible.IngestRepo.html#replica_count/1"},{"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_inline_sql/2","doc":"Similar to `to_sql/2` but inlines the parameters into the SQL query.\n\nSee `Ecto.Adapters.ClickHouse.to_inline_sql/2` for more information.","ref":"Plausible.IngestRepo.html#to_inline_sql/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.Acquisition","doc":"This module is responsible for figuring out acquisition channel from event referrer_source.\n\nAcquisition channel is the marketing channel where people come from and convert and help\nusers to understand and improve their marketing flow.\n\nNote it uses priv/ga4-source-categories.csv as a source, which comes from https://support.google.com/analytics/answer/9756891?hl=en.\n\nNotable differences from GA4 that have been implemented just for Plausible:\n1. The @custom_source_categories module attribute contains a list of custom source categories that we have manually\nadded based on our own judgement and user feedback. For example we treat AI tools (ChatGPT, Perplexity) as search engines.\n2. Google is in a privileged position to analyze paid traffic from within their own network. The biggest use-case is auto-tagged adwords campaigns.\nWe do our best by categorizing as paid search when source is Google and the url has `gclid` parameter. Same for source Bing and `msclkid` url parameter.\n3. The @paid_sources module attribute in Plausible.Ingestion.Source contains a list of utm_sources that we will automatically categorize as paid traffic\nregardless of the medium. Examples are `yt-ads`, `facebook_ad`, `adwords`, etc. See also: Plausible.Ingestion.Source.paid_source?/1","ref":"Plausible.Ingestion.Acquisition.html"},{"type":"function","title":"Plausible.Ingestion.Acquisition.get_channel/5","doc":"","ref":"Plausible.Ingestion.Acquisition.html#get_channel/5"},{"type":"function","title":"Plausible.Ingestion.Acquisition.source_categories/0","doc":"","ref":"Plausible.Ingestion.Acquisition.html#source_categories/0"},{"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/2","doc":"","ref":"Plausible.Ingestion.Event.html#build_and_buffer/2"},{"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":"function","title":"Plausible.Ingestion.Event.telemetry_pipeline_step_duration/0","doc":"","ref":"Plausible.Ingestion.Event.html#telemetry_pipeline_step_duration/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.Ingestion.Source","doc":"Resolves the `source` dimension from a combination of `referer` header and either `utm_source`, `source`, or `ref` query parameter.","ref":"Plausible.Ingestion.Source.html"},{"type":"function","title":"Plausible.Ingestion.Source.find_mapping/1","doc":"","ref":"Plausible.Ingestion.Source.html#find_mapping/1"},{"type":"function","title":"Plausible.Ingestion.Source.format_referrer/1","doc":"","ref":"Plausible.Ingestion.Source.html#format_referrer/1"},{"type":"function","title":"Plausible.Ingestion.Source.init/0","doc":"","ref":"Plausible.Ingestion.Source.html#init/0"},{"type":"function","title":"Plausible.Ingestion.Source.paid_source?/1","doc":"","ref":"Plausible.Ingestion.Source.html#paid_source?/1"},{"type":"function","title":"Plausible.Ingestion.Source.paid_sources/0","doc":"","ref":"Plausible.Ingestion.Source.html#paid_sources/0"},{"type":"function","title":"Plausible.Ingestion.Source.parse/1","doc":"","ref":"Plausible.Ingestion.Source.html#parse/1"},{"type":"function","title":"Plausible.Ingestion.Source.resolve/1","doc":"Resolves the source of a session based on query params and the `Referer` header.\n\nWhen a query parameter like `utm_source` is present, it will be prioritized over the `Referer` header. When the URL does not contain a source tag, we fall\nback to using `Referer` to determine the source. This module also takes care of certain transformations to make the data more useful for the user:\n1. The RefInspector library is used to categorize referrers into \"known\" sources. For example, when the referrer is google.com or google.co.uk,\nit will always be stored as \"Google\" which is more useful for marketers.\n2. On top of the standard RefInspector behaviour, we also keep a list of `custom_sources.json` which extends it with referrers that we have seen in the wild.\nFor example, Wikipedia has many domains that need to be combined into a single known source. These could all in theory be [upstreamed](https://github.com/snowplow-referer-parser/referer-parser).\n3. When a known source is supplied in utm_source (or source, ref) query parameter, we merge it with our known sources in a case-insensitive manner.\n4. Our list of `custom_sources.json` also contains some commonly used utm_source shorthands for certain sources. URL tagging is a mess, and we can never do it\nperfectly, but at least we're making an effort for the most commonly used ones. For example, `ig -> Instagram` and `adwords -> Google`.\n\n#","ref":"Plausible.Ingestion.Source.html#resolve/1"},{"type":"function","title":"Examples: - Plausible.Ingestion.Source.resolve/1","doc":"iex> alias Plausible.Ingestion.{Source, Request}\n iex> base_request = %Request{uri: URI.parse(\"https://plausible.io\")}\n iex> Source.resolve(%{base_request | referrer: \"https://google.com\"}) # Known referrer from RefInspector\n \"Google\"\n iex> Source.resolve(%{base_request | query_params: %{\"utm_source\" => \"google\"}}) # Known source from RefInspector supplied as downcased utm_source by user\n \"Google\"\n iex> Source.resolve(%{base_request | query_params: %{\"utm_source\" => \"GOOGLE\"}}) # Known source from RefInspector supplied as uppercased utm_source by user\n \"Google\"\n iex> Source.resolve(%{base_request | referrer: \"https://en.m.wikipedia.org\"}) # Known referrer from custom_sources.json\n \"Wikipedia\"\n iex> Source.resolve(%{base_request | query_params: %{\"utm_source\" => \"wikipedia\"}}) # Known source from custom_sources.json supplied as downcased utm_source by user\n \"Wikipedia\"\n iex> Source.resolve(%{base_request | query_params: %{\"utm_source\" => \"ig\"}}) # Known utm_source from custom_sources.json\n \"Instagram\"\n iex> Source.resolve(%{base_request | referrer: \"https://www.markosaric.com\"}) # Unknown source, it is just stored as the domain name\n \"markosaric.com\"","ref":"Plausible.Ingestion.Source.html#resolve/1-examples"},{"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.LiveViewTest","doc":"Temporary fix for `Phoenix.LiveViewTest.render_component/2` failing CI with warnings.\n\nThis module can be removed once Plausible switches to `phoenix_live_view ~> 1.0.0`","ref":"Plausible.LiveViewTest.html"},{"type":"macro","title":"Plausible.LiveViewTest.render_component/3","doc":"Same as `Phoenix.LiveViewTest.render_component/2` but with backported fixes from\nhttps://github.com/phoenixframework/phoenix_live_view/commit/489e8de024e03976e9ae38138eec517fbd456d27","ref":"Plausible.LiveViewTest.html#render_component/3"},{"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.dictionary_connection_params/0","doc":"","ref":"Plausible.MigrationUtils.html#dictionary_connection_params/0"},{"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/2","doc":"","ref":"Plausible.PaddleApi.Mock.html#fetch_prices/2"},{"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.Funnels","doc":"Plugins API context module for Funnels.\nAll high level Funnel operations should be implemented here.","ref":"Plausible.Plugins.API.Funnels.html"},{"type":"function","title":"Plausible.Plugins.API.Funnels.create/2","doc":"","ref":"Plausible.Plugins.API.Funnels.html#create/2"},{"type":"function","title":"Plausible.Plugins.API.Funnels.get/2","doc":"","ref":"Plausible.Plugins.API.Funnels.html#get/2"},{"type":"function","title":"Plausible.Plugins.API.Funnels.get_funnels/2","doc":"","ref":"Plausible.Plugins.API.Funnels.html#get_funnels/2"},{"type":"type","title":"Plausible.Plugins.API.Funnels.create_request/0","doc":"","ref":"Plausible.Plugins.API.Funnels.html#t:create_request/0"},{"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":"Fire telemetry events for various caches","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":"function","title":"Plausible.PromEx.Plugins.PlausibleMetrics.measure_duration/3","doc":"","ref":"Plausible.PromEx.Plugins.PlausibleMetrics.html#measure_duration/3"},{"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\", \"search_query\"]`) 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/1","doc":"","ref":"Plausible.Release.html#createdb/1"},{"type":"function","title":"Plausible.Release.dump_plans/0","doc":"","ref":"Plausible.Release.html#dump_plans/0"},{"type":"function","title":"Plausible.Release.interweave_migrate/1","doc":"`interweave_migrate/0` is a migration function that:\n\n- Lists all pending migrations across multiple repositories.\n- Sorts these migrations into a single list.\n- Groups consecutive migrations by repository into \"streaks\".\n- Executes the migrations in the correct order by processing each streak sequentially.\n\n#","ref":"Plausible.Release.html#interweave_migrate/1"},{"type":"function","title":"Why Use This Approach? - Plausible.Release.interweave_migrate/1","doc":"This function resolves dependencies between migrations that span across different repositories.\nThe default `migrate/0` function migrates each repository independently, which may result in\nmigrations running in the wrong order when there are cross-repository dependencies.\n\nConsider the following example (adapted from reality, not 100% accurate):\n\n- **Migration 1**: The PostgreSQL (PG) repository creates a table named `site_imports`.\n- **Migration 2**: The ClickHouse (CH) repository creates `import_id` columns in `imported_*` tables.\n- **Migration 3**: The PG repository runs a data migration that utilizes both PG and CH databases,\n reading from the `import_id` column in `imported_*` tables.\n\nThe default `migrate/0` would execute these migrations by repository, resulting in the following order:\n\n1. Migration 1 (PG)\n2. Migration 3 (PG)\n3. Migration 2 (CH)\n\nThis sequence would fail at Migration 3, as the `import_id` columns in the CH repository have not been created yet.\n\n`interweave_migrate/0` addresses this issue by consolidating all pending migrations into a single, ordered queue:\n\n1. Migration 1 (PG)\n2. Migration 2 (CH)\n3. Migration 3 (PG)\n\nThis ensures all dependencies are resolved in the correct order.","ref":"Plausible.Release.html#interweave_migrate/1-why-use-this-approach"},{"type":"function","title":"Plausible.Release.pending_streaks/1","doc":"","ref":"Plausible.Release.html#pending_streaks/1"},{"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.RequestLogger","doc":"Custom request logger which:\n- Includes query parameters on the same line\n- Includes request duration on the same line","ref":"Plausible.RequestLogger.html"},{"type":"function","title":"Plausible.RequestLogger.log_request/4","doc":"","ref":"Plausible.RequestLogger.html#log_request/4"},{"type":"module","title":"Plausible.S3","doc":"Helper functions for S3 exports/imports.","ref":"Plausible.S3.html"},{"type":"function","title":"Plausible.S3.download_url/2","doc":"Returns a presigned URL to download the exported Zip archive from S3.\nThe URL expires in 300 seconds, which should be enough for a redirect.\n\nIn the current implementation the bucket always goes into the path component.","ref":"Plausible.S3.html#download_url/2"},{"type":"function","title":"Plausible.S3.export_upload_multipart/4","doc":"Chunks and uploads Zip archive to the provided S3 destination.\n\nIn the current implementation the bucket always goes into the path component.","ref":"Plausible.S3.html#export_upload_multipart/4"},{"type":"function","title":"Plausible.S3.exports_bucket/0","doc":"Returns the pre-configured S3 bucket for CSV exports.\n\n config :plausible, Plausible.S3,\n exports_bucket: System.fetch_env!(\"S3_EXPORTS_BUCKET\")\n\nExample:\n\n iex> exports_bucket()\n \"test-exports\"","ref":"Plausible.S3.html#exports_bucket/0"},{"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.\n\nExample:\n\n iex> import_clickhouse_credentials()\n %{access_key_id: \"minioadmin\", secret_access_key: \"minioadmin\"}","ref":"Plausible.S3.html#import_clickhouse_credentials/0"},{"type":"function","title":"Plausible.S3.import_presign_upload/2","doc":"Presigns an upload for an imported file.\n\nIn the current implementation the bucket always goes into the path component.\n\nExample:\n\n iex> upload = import_presign_upload(_site_id = 123, _filename = \"imported_browsers.csv\")\n iex> true = String.ends_with?(upload.s3_url, \"/test-imports/123/imported_browsers.csv\")\n iex> true = String.contains?(upload.presigned_url, \"/test-imports/123/imported_browsers.csv?X-Amz-Algorithm=AWS4-HMAC-SHA256&\")","ref":"Plausible.S3.html#import_presign_upload/2"},{"type":"function","title":"Plausible.S3.imports_bucket/0","doc":"Returns the pre-configured S3 bucket for CSV imports.\n\n config :plausible, Plausible.S3,\n imports_bucket: System.fetch_env!(\"S3_IMPORTS_BUCKET\")\n\nExample:\n\n iex> imports_bucket()\n \"test-imports\"","ref":"Plausible.S3.html#imports_bucket/0"},{"type":"module","title":"Plausible.Sentry.Client","doc":"","ref":"Plausible.Sentry.Client.html"},{"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":"module","title":"Plausible.Session.CacheStore","doc":"","ref":"Plausible.Session.CacheStore.html"},{"type":"function","title":"Plausible.Session.CacheStore.lock_telemetry_event/0","doc":"","ref":"Plausible.Session.CacheStore.html#lock_telemetry_event/0"},{"type":"function","title":"Plausible.Session.CacheStore.on_event/4","doc":"","ref":"Plausible.Session.CacheStore.html#on_event/4"},{"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.get_or_store/3","doc":"","ref":"Plausible.Shield.CountryRuleCache.html#get_or_store/3"},{"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.HostnameRule","doc":"Schema for Hostnames allow list","ref":"Plausible.Shield.HostnameRule.html"},{"type":"function","title":"Plausible.Shield.HostnameRule.changeset/2","doc":"","ref":"Plausible.Shield.HostnameRule.html#changeset/2"},{"type":"type","title":"Plausible.Shield.HostnameRule.t/0","doc":"","ref":"Plausible.Shield.HostnameRule.html#t:t/0"},{"type":"module","title":"Plausible.Shield.HostnameRuleCache","doc":"Allows retrieving Hostname Rules by domain","ref":"Plausible.Shield.HostnameRuleCache.html"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.child_spec/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#child_spec/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.get/2","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#get/2"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.get_or_store/3","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#get_or_store/3"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.hit_rate/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#hit_rate/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.merge_items/2","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#merge_items/2"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.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.HostnameRuleCache.html#ready?/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.refresh_all/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#refresh_all/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.refresh_updated_recently/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.size/1","doc":"","ref":"Plausible.Shield.HostnameRuleCache.html#size/1"},{"type":"function","title":"Plausible.Shield.HostnameRuleCache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Shield.HostnameRuleCache.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.get_or_store/3","doc":"","ref":"Plausible.Shield.IPRuleCache.html#get_or_store/3"},{"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.Shield.PageRule","doc":"Schema for Pages block list","ref":"Plausible.Shield.PageRule.html"},{"type":"function","title":"Plausible.Shield.PageRule.changeset/2","doc":"","ref":"Plausible.Shield.PageRule.html#changeset/2"},{"type":"type","title":"Plausible.Shield.PageRule.t/0","doc":"","ref":"Plausible.Shield.PageRule.html#t:t/0"},{"type":"module","title":"Plausible.Shield.PageRuleCache","doc":"Allows retrieving Page Rules by domain","ref":"Plausible.Shield.PageRuleCache.html"},{"type":"function","title":"Plausible.Shield.PageRuleCache.child_spec/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#child_spec/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.get/2","doc":"","ref":"Plausible.Shield.PageRuleCache.html#get/2"},{"type":"function","title":"Plausible.Shield.PageRuleCache.get_or_store/3","doc":"","ref":"Plausible.Shield.PageRuleCache.html#get_or_store/3"},{"type":"function","title":"Plausible.Shield.PageRuleCache.hit_rate/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#hit_rate/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.merge_items/2","doc":"","ref":"Plausible.Shield.PageRuleCache.html#merge_items/2"},{"type":"function","title":"Plausible.Shield.PageRuleCache.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.PageRuleCache.html#ready?/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.refresh_all/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#refresh_all/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.refresh_updated_recently/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#refresh_updated_recently/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.size/1","doc":"","ref":"Plausible.Shield.PageRuleCache.html#size/1"},{"type":"function","title":"Plausible.Shield.PageRuleCache.telemetry_event_refresh/2","doc":"","ref":"Plausible.Shield.PageRuleCache.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_hostname_rule/3","doc":"","ref":"Plausible.Shields.html#add_hostname_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.add_page_rule/3","doc":"","ref":"Plausible.Shields.html#add_page_rule/3"},{"type":"function","title":"Plausible.Shields.allowed_hostname_patterns/1","doc":"","ref":"Plausible.Shields.html#allowed_hostname_patterns/1"},{"type":"function","title":"Plausible.Shields.count_country_rules/1","doc":"","ref":"Plausible.Shields.html#count_country_rules/1"},{"type":"function","title":"Plausible.Shields.count_hostname_rules/1","doc":"","ref":"Plausible.Shields.html#count_hostname_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.count_page_rules/1","doc":"","ref":"Plausible.Shields.html#count_page_rules/1"},{"type":"function","title":"Plausible.Shields.country_blocked?/2","doc":"","ref":"Plausible.Shields.html#country_blocked?/2"},{"type":"function","title":"Plausible.Shields.hostname_allowed?/2","doc":"","ref":"Plausible.Shields.html#hostname_allowed?/2"},{"type":"function","title":"Plausible.Shields.ip_blocked?/2","doc":"","ref":"Plausible.Shields.html#ip_blocked?/2"},{"type":"function","title":"Plausible.Shields.list_country_rules/1","doc":"","ref":"Plausible.Shields.html#list_country_rules/1"},{"type":"function","title":"Plausible.Shields.list_hostname_rules/1","doc":"","ref":"Plausible.Shields.html#list_hostname_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.list_page_rules/1","doc":"","ref":"Plausible.Shields.html#list_page_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_hostname_rules/0","doc":"","ref":"Plausible.Shields.html#maximum_hostname_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.maximum_page_rules/0","doc":"","ref":"Plausible.Shields.html#maximum_page_rules/0"},{"type":"function","title":"Plausible.Shields.page_blocked?/2","doc":"","ref":"Plausible.Shields.html#page_blocked?/2"},{"type":"function","title":"Plausible.Shields.remove_country_rule/2","doc":"","ref":"Plausible.Shields.html#remove_country_rule/2"},{"type":"function","title":"Plausible.Shields.remove_hostname_rule/2","doc":"","ref":"Plausible.Shields.html#remove_hostname_rule/2"},{"type":"function","title":"Plausible.Shields.remove_ip_rule/2","doc":"","ref":"Plausible.Shields.html#remove_ip_rule/2"},{"type":"function","title":"Plausible.Shields.remove_page_rule/2","doc":"","ref":"Plausible.Shields.html#remove_page_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.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.new_for_team/2","doc":"","ref":"Plausible.Site.html#new_for_team/2"},{"type":"function","title":"Plausible.Site.set_native_stats_start_at/2","doc":"","ref":"Plausible.Site.html#set_native_stats_start_at/2"},{"type":"function","title":"Plausible.Site.set_stats_start_date/2","doc":"","ref":"Plausible.Site.html#set_stats_start_date/2"},{"type":"function","title":"Plausible.Site.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_or_store/3","doc":"","ref":"Plausible.Site.Cache.html#get_or_store/3"},{"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\n\nNOTE: needed by `SiteImports` data migration script","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.InstallationMeta","doc":"Embedded schema for installation meta-data","ref":"Plausible.Site.InstallationMeta.html"},{"type":"type","title":"Plausible.Site.InstallationMeta.t/0","doc":"","ref":"Plausible.Site.InstallationMeta.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.all_pending_ownerships/1","doc":"","ref":"Plausible.Site.Memberships.html#all_pending_ownerships/1"},{"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.TrafficChangeNotification","doc":"Configuration schema for site-specific traffic change notifications.","ref":"Plausible.Site.TrafficChangeNotification.html"},{"type":"function","title":"Plausible.Site.TrafficChangeNotification.add_recipient/2","doc":"","ref":"Plausible.Site.TrafficChangeNotification.html#add_recipient/2"},{"type":"function","title":"Plausible.Site.TrafficChangeNotification.changeset/2","doc":"","ref":"Plausible.Site.TrafficChangeNotification.html#changeset/2"},{"type":"function","title":"Plausible.Site.TrafficChangeNotification.remove_recipient/2","doc":"","ref":"Plausible.Site.TrafficChangeNotification.html#remove_recipient/2"},{"type":"function","title":"Plausible.Site.TrafficChangeNotification.was_sent/1","doc":"","ref":"Plausible.Site.TrafficChangeNotification.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.before_update/2","doc":"","ref":"Plausible.SiteAdmin.html#before_update/2"},{"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.for_user_query/1","doc":"","ref":"Plausible.Sites.html#for_user_query/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_by_domain!/1","doc":"","ref":"Plausible.Sites.html#get_by_domain!/1"},{"type":"function","title":"Plausible.Sites.has_admin_access?/2","doc":"","ref":"Plausible.Sites.html#has_admin_access?/2"},{"type":"function","title":"Plausible.Sites.has_goals?/1","doc":"","ref":"Plausible.Sites.html#has_goals?/1"},{"type":"function","title":"Plausible.Sites.has_stats?/1","doc":"","ref":"Plausible.Sites.html#has_stats?/1"},{"type":"function","title":"Plausible.Sites.is_member?/2","doc":"","ref":"Plausible.Sites.html#is_member?/2"},{"type":"function","title":"Plausible.Sites.list/3","doc":"","ref":"Plausible.Sites.html#list/3"},{"type":"function","title":"Plausible.Sites.list_with_invitations/3","doc":"","ref":"Plausible.Sites.html#list_with_invitations/3"},{"type":"function","title":"Plausible.Sites.locked?/1","doc":"","ref":"Plausible.Sites.html#locked?/1"},{"type":"function","title":"Plausible.Sites.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.owned_sites_locked?/1","doc":"","ref":"Plausible.Sites.html#owned_sites_locked?/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":"function","title":"Plausible.Sites.update_installation_meta!/2","doc":"","ref":"Plausible.Sites.html#update_installation_meta!/2"},{"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/4","doc":"","ref":"Plausible.Stats.html#breakdown/4"},{"type":"function","title":"Plausible.Stats.current_visitors/2","doc":"","ref":"Plausible.Stats.html#current_visitors/2"},{"type":"function","title":"Plausible.Stats.custom_prop_value_filter_suggestions/4","doc":"","ref":"Plausible.Stats.html#custom_prop_value_filter_suggestions/4"},{"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.query/2","doc":"","ref":"Plausible.Stats.html#query/2"},{"type":"function","title":"Plausible.Stats.timeseries/3","doc":"","ref":"Plausible.Stats.html#timeseries/3"},{"type":"module","title":"Plausible.Stats.Aggregate","doc":"Builds aggregate results for v1 of our stats API and dashboards.\n\nAvoid adding new logic here - update QueryBuilder etc instead.","ref":"Plausible.Stats.Aggregate.html"},{"type":"function","title":"Plausible.Stats.Aggregate.aggregate/3","doc":"","ref":"Plausible.Stats.Aggregate.html#aggregate/3"},{"type":"function","title":"Plausible.Stats.Aggregate.get_value/3","doc":"","ref":"Plausible.Stats.Aggregate.html#get_value/3"},{"type":"function","title":"Plausible.Stats.Aggregate.metric_map/3","doc":"","ref":"Plausible.Stats.Aggregate.html#metric_map/3"},{"type":"module","title":"Plausible.Stats.Base","doc":"","ref":"Plausible.Stats.Base.html"},{"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.query_sessions/2","doc":"","ref":"Plausible.Stats.Base.html#query_sessions/2"},{"type":"module","title":"Plausible.Stats.Breakdown","doc":"Builds breakdown results for v1 of our stats API and dashboards.\n\nAvoid adding new logic here - update QueryBuilder etc instead.","ref":"Plausible.Stats.Breakdown.html"},{"type":"function","title":"Plausible.Stats.Breakdown.breakdown/5","doc":"","ref":"Plausible.Stats.Breakdown.html#breakdown/5"},{"type":"function","title":"Plausible.Stats.Breakdown.formatted_date_ranges/1","doc":"","ref":"Plausible.Stats.Breakdown.html#formatted_date_ranges/1"},{"type":"function","title":"Plausible.Stats.Breakdown.transform_dimensions/1","doc":"","ref":"Plausible.Stats.Breakdown.html#transform_dimensions/1"},{"type":"module","title":"Plausible.Stats.Clickhouse","doc":"","ref":"Plausible.Stats.Clickhouse.html"},{"type":"function","title":"Plausible.Stats.Clickhouse.current_visitors/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#current_visitors/1"},{"type":"function","title":"Plausible.Stats.Clickhouse.current_visitors_12h/1","doc":"","ref":"Plausible.Stats.Clickhouse.html#current_visitors_12h/1"},{"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.add_comparison_filters/2","doc":"Builds comparison query that specifically filters for values appearing in the main query results.\n\nWhen querying for comparisons with dimensions and pagination, extra\nfilters are added to ensure comparison query returns same set of results\nas main query.","ref":"Plausible.Stats.Comparisons.html#add_comparison_filters/2"},{"type":"function","title":"Plausible.Stats.Comparisons.get_comparison_query/2","doc":"Generates a comparison query based on the source query and comparison mode.\n\nCurrently only historical periods are supported for comparisons (not `realtime`\nand `30m` periods).","ref":"Plausible.Stats.Comparisons.html#get_comparison_query/2"},{"type":"function","title":"Options - Plausible.Stats.Comparisons.get_comparison_query/2","doc":"* `mode` (required) - 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 `date_range` for\n more details.\n\n * `:date_range` - a ISO-8601 date string pair used when mode is `\"custom\"`.\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#get_comparison_query/2-options"},{"type":"module","title":"Plausible.Stats.CurrentVisitors","doc":"","ref":"Plausible.Stats.CurrentVisitors.html"},{"type":"function","title":"Plausible.Stats.CurrentVisitors.current_visitors/2","doc":"","ref":"Plausible.Stats.CurrentVisitors.html#current_visitors/2"},{"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.DateTimeRange","doc":"Defines a struct similar `Date.Range`, but with `DateTime` instead of `Date`.\n\nThe structs should be created with the `new!/2` function.","ref":"Plausible.Stats.DateTimeRange.html"},{"type":"function","title":"Plausible.Stats.DateTimeRange.new!/2","doc":"","ref":"Plausible.Stats.DateTimeRange.html#new!/2"},{"type":"function","title":"Plausible.Stats.DateTimeRange.new!/3","doc":"Creates a `DateTimeRange` struct from the given `%Date{}` structs.\n\nThe first datetime will become the first date at 00:00:00, and the last datetime\nwill become the last date at 23:59:59. Both dates will be turned into `%DateTime{}`\nstructs in the given timezone.","ref":"Plausible.Stats.DateTimeRange.html#new!/3"},{"type":"function","title":"Plausible.Stats.DateTimeRange.to_date_range/2","doc":"","ref":"Plausible.Stats.DateTimeRange.html#to_date_range/2"},{"type":"function","title":"Plausible.Stats.DateTimeRange.to_timezone/2","doc":"","ref":"Plausible.Stats.DateTimeRange.html#to_timezone/2"},{"type":"type","title":"Plausible.Stats.DateTimeRange.t/0","doc":"","ref":"Plausible.Stats.DateTimeRange.html#t:t/0"},{"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.custom_prop_value_filter_suggestions/4","doc":"","ref":"Plausible.Stats.FilterSuggestions.html#custom_prop_value_filter_suggestions/4"},{"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.dimensions_used_in_filters/2","doc":"","ref":"Plausible.Stats.Filters.html#dimensions_used_in_filters/2"},{"type":"function","title":"Plausible.Stats.Filters.event_props/0","doc":"","ref":"Plausible.Stats.Filters.html#event_props/0"},{"type":"function","title":"Plausible.Stats.Filters.event_table_visit_props/0","doc":"","ref":"Plausible.Stats.Filters.html#event_table_visit_props/0"},{"type":"function","title":"Plausible.Stats.Filters.filtering_on_dimension?/2","doc":"","ref":"Plausible.Stats.Filters.html#filtering_on_dimension?/2"},{"type":"function","title":"Plausible.Stats.Filters.get_toplevel_filter/2","doc":"Gets the first top level filter with matching dimension (or nil).\n\nOnly use in cases where it's known that filters are only set on the top level as it\ndoes not handle AND/OR/NOT!","ref":"Plausible.Stats.Filters.html#get_toplevel_filter/2"},{"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 list, when `filters` is encoded JSON\n * a parsed filter list, when `filters` is a filter expression string\n * the same list, when `filters` is a map\n\nReturns an empty list 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 [[:matches_wildcard, \"event:page\", [\"/blog/**\"]]]\n\n iex> Filters.parse(\"visit:browser!=Chrome\")\n [[:is_not, \"visit:browser\", [\"Chrome\"]]]\n\n iex> Filters.parse(nil)\n []","ref":"Plausible.Stats.Filters.html#parse/1-examples"},{"type":"function","title":"Plausible.Stats.Filters.rename_dimensions_used_in_filter/2","doc":"","ref":"Plausible.Stats.Filters.html#rename_dimensions_used_in_filter/2"},{"type":"function","title":"Plausible.Stats.Filters.transform_filters/2","doc":"Updates filters via `transformer`.\n\nTransformer will receive each node (filter, and/or/not subtree) of\nquery and must return a list of nodes to replace it with or nil\nto ignore and look deeper.","ref":"Plausible.Stats.Filters.html#transform_filters/2"},{"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 `LegacyDashboardFilterParser`\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.page_regex/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#page_regex/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.split_goals/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#split_goals/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.split_goals_query_expressions/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#split_goals_query_expressions/1"},{"type":"function","title":"Plausible.Stats.Filters.Utils.wildcard_expression?/1","doc":"","ref":"Plausible.Stats.Filters.Utils.html#wildcard_expression?/1"},{"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.available?/1","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#available?/1"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.format_revenue_metric/3","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#format_revenue_metric/3"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.preload_revenue_currencies/4","doc":"Preloads revenue currencies for a query.\n\nAssumptions and business logic:\n1. Goals are already filtered according to query filters and dimensions\n2. If there's a single currency involved, return map containing the default\n3. If there's a breakdown by event:goal we return all the relevant currencies as a map\n4. If filtering by multiple different currencies without event:goal breakdown empty map is returned\n5. If user has no access or preloading is not needed, empty map is returned\n\nThe resulting data structure is attached to a `Query` and used below in `format_revenue_metric/3`.","ref":"Plausible.Stats.Goal.Revenue.html#preload_revenue_currencies/4"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.requested?/1","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#requested?/1"},{"type":"function","title":"Plausible.Stats.Goal.Revenue.revenue_metrics/0","doc":"","ref":"Plausible.Stats.Goal.Revenue.html#revenue_metrics/0"},{"type":"module","title":"Plausible.Stats.Imported","doc":"","ref":"Plausible.Stats.Imported.html"},{"type":"function","title":"Plausible.Stats.Imported.goals_with_path/0","doc":"","ref":"Plausible.Stats.Imported.html#goals_with_path/0"},{"type":"function","title":"Plausible.Stats.Imported.goals_with_url/0","doc":"","ref":"Plausible.Stats.Imported.html#goals_with_url/0"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported/4","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported/4"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_city_suggestions/3","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_city_suggestions/3"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_country_suggestions/3","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_country_suggestions/3"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_filter_suggestions/5","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_filter_suggestions/5"},{"type":"function","title":"Plausible.Stats.Imported.merge_imported_region_suggestions/3","doc":"","ref":"Plausible.Stats.Imported.html#merge_imported_region_suggestions/3"},{"type":"function","title":"Plausible.Stats.Imported.schema_supports_query?/1","doc":"Returns a boolean indicating whether the combination of filters and\nbreakdown property is possible to query from the imported tables.\n\nUsually, when no filters are used, the imported schema supports the\nquery. There is one exception though - breakdown by a custom property.\nWe are currently importing only two custom properties - `url` and `path.\nBoth these properties can only be used with their special goal filter\n(see `@goals_with_url` and `@goals_with_path`).","ref":"Plausible.Stats.Imported.html#schema_supports_query?/1"},{"type":"function","title":"Plausible.Stats.Imported.total_imported_visitors/2","doc":"","ref":"Plausible.Stats.Imported.html#total_imported_visitors/2"},{"type":"module","title":"Plausible.Stats.Imported.Base","doc":"A module for building the base of an imported stats query","ref":"Plausible.Stats.Imported.Base.html"},{"type":"function","title":"Plausible.Stats.Imported.Base.decide_tables/1","doc":"","ref":"Plausible.Stats.Imported.Base.html#decide_tables/1"},{"type":"function","title":"Plausible.Stats.Imported.Base.property_to_table_mappings/0","doc":"","ref":"Plausible.Stats.Imported.Base.html#property_to_table_mappings/0"},{"type":"function","title":"Plausible.Stats.Imported.Base.query_imported/2","doc":"","ref":"Plausible.Stats.Imported.Base.html#query_imported/2"},{"type":"function","title":"Plausible.Stats.Imported.Base.query_imported/3","doc":"","ref":"Plausible.Stats.Imported.Base.html#query_imported/3"},{"type":"function","title":"Plausible.Stats.Imported.Base.special_goals_for/1","doc":"","ref":"Plausible.Stats.Imported.Base.html#special_goals_for/1"},{"type":"module","title":"Plausible.Stats.Imported.SQL.Expression","doc":"This module is responsible for generating SQL/Ecto expressions\nfor dimensions, filters and metrics used in import table queries","ref":"Plausible.Stats.Imported.SQL.Expression.html"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.group_imported_by/2","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#group_imported_by/2"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.naive_dimension_join/3","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#naive_dimension_join/3"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.select_imported_metrics/2","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#select_imported_metrics/2"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.select_joined_dimensions/2","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#select_joined_dimensions/2"},{"type":"function","title":"Plausible.Stats.Imported.SQL.Expression.select_joined_metrics/2","doc":"","ref":"Plausible.Stats.Imported.SQL.Expression.html#select_joined_metrics/2"},{"type":"module","title":"Plausible.Stats.Imported.SQL.WhereBuilder","doc":"A module for building an ecto where clause of a query out of a query for Imported tables.","ref":"Plausible.Stats.Imported.SQL.WhereBuilder.html"},{"type":"function","title":"Plausible.Stats.Imported.SQL.WhereBuilder.build/1","doc":"","ref":"Plausible.Stats.Imported.SQL.WhereBuilder.html#build/1"},{"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`, `day`,\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 `DateTimeRange` 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.JSONSchema","doc":"Module for validating query parameters against JSON schema.\n\nNote that `internal` queries expose some metrics, filter types and other features not\navailable on the public API.","ref":"Plausible.Stats.JSONSchema.html"},{"type":"function","title":"Plausible.Stats.JSONSchema.raw_public_schema/0","doc":"","ref":"Plausible.Stats.JSONSchema.html#raw_public_schema/0"},{"type":"function","title":"Plausible.Stats.JSONSchema.validate/2","doc":"","ref":"Plausible.Stats.JSONSchema.html#validate/2"},{"type":"module","title":"Plausible.Stats.JSONSchema.Utils","doc":"Module for traversing and modifying JSON schemas.","ref":"Plausible.Stats.JSONSchema.Utils.html"},{"type":"function","title":"Plausible.Stats.JSONSchema.Utils.traverse/2","doc":"","ref":"Plausible.Stats.JSONSchema.Utils.html#traverse/2"},{"type":"type","title":"Plausible.Stats.JSONSchema.Utils.json/0","doc":"","ref":"Plausible.Stats.JSONSchema.Utils.html#t:json/0"},{"type":"type","title":"Plausible.Stats.JSONSchema.Utils.transform_fun/0","doc":"","ref":"Plausible.Stats.JSONSchema.Utils.html#t:transform_fun/0"},{"type":"module","title":"Plausible.Stats.Legacy.Dimensions","doc":"Deprecated module. See QueryParser for list of valid dimensions","ref":"Plausible.Stats.Legacy.Dimensions.html"},{"type":"function","title":"Plausible.Stats.Legacy.Dimensions.valid?/1","doc":"","ref":"Plausible.Stats.Legacy.Dimensions.html#valid?/1"},{"type":"module","title":"Plausible.Stats.Legacy.QueryBuilder","doc":"Module used to parse URL search params to a valid Query, used to power the API for the dashboard.\n@deprecated","ref":"Plausible.Stats.Legacy.QueryBuilder.html"},{"type":"function","title":"Plausible.Stats.Legacy.QueryBuilder.from/4","doc":"","ref":"Plausible.Stats.Legacy.QueryBuilder.html#from/4"},{"type":"function","title":"Plausible.Stats.Legacy.QueryBuilder.parse_comparison_params/2","doc":"","ref":"Plausible.Stats.Legacy.QueryBuilder.html#parse_comparison_params/2"},{"type":"function","title":"Plausible.Stats.Legacy.QueryBuilder.parse_order_by/1","doc":"#","ref":"Plausible.Stats.Legacy.QueryBuilder.html#parse_order_by/1"},{"type":"function","title":"Examples: - Plausible.Stats.Legacy.QueryBuilder.parse_order_by/1","doc":"iex> QueryBuilder.parse_order_by(nil)\n []\n\n iex> QueryBuilder.parse_order_by(\"\")\n []\n\n iex> QueryBuilder.parse_order_by(\"0\")\n []\n\n iex> QueryBuilder.parse_order_by(\"[}\")\n []\n\n iex> QueryBuilder.parse_order_by(~s({\"any\":\"object\"}))\n []\n\n iex> QueryBuilder.parse_order_by(~s([[\"visitors\",\"invalid\"]]))\n []\n\n iex> QueryBuilder.parse_order_by(~s([[\"visitors\",\"desc\"]]))\n [{:visitors, :desc}]\n\n iex> QueryBuilder.parse_order_by(~s([[\"visitors\",\"asc\"],[\"visit:source\",\"desc\"]]))\n [{:visitors, :asc}, {\"visit:source\", :desc}]","ref":"Plausible.Stats.Legacy.QueryBuilder.html#parse_order_by/1-examples"},{"type":"module","title":"Plausible.Stats.Legacy.TimeOnPage","doc":"Calculation methods for legacy time_on_page metric. Note the metric\nhas its own limitations and quirks.\n\nClosely coupled with Plausible.Stats.QueryRunner.","ref":"Plausible.Stats.Legacy.TimeOnPage.html"},{"type":"function","title":"Plausible.Stats.Legacy.TimeOnPage.calculate/3","doc":"","ref":"Plausible.Stats.Legacy.TimeOnPage.html#calculate/3"},{"type":"module","title":"Plausible.Stats.Metrics","doc":"A module listing all available metrics in Plausible.\n\nUseful for an explicit string to atom conversion.","ref":"Plausible.Stats.Metrics.html"},{"type":"function","title":"Plausible.Stats.Metrics.from_string/1","doc":"","ref":"Plausible.Stats.Metrics.html#from_string/1"},{"type":"function","title":"Plausible.Stats.Metrics.from_string!/1","doc":"","ref":"Plausible.Stats.Metrics.html#from_string!/1"},{"type":"function","title":"Plausible.Stats.Metrics.metric?/1","doc":"","ref":"Plausible.Stats.Metrics.html#metric?/1"},{"type":"module","title":"Plausible.Stats.Query","doc":"","ref":"Plausible.Stats.Query.html"},{"type":"function","title":"Plausible.Stats.Query.add_filter/2","doc":"","ref":"Plausible.Stats.Query.html#add_filter/2"},{"type":"function","title":"Plausible.Stats.Query.build/4","doc":"","ref":"Plausible.Stats.Query.html#build/4"},{"type":"function","title":"Plausible.Stats.Query.date_range/2","doc":"","ref":"Plausible.Stats.Query.html#date_range/2"},{"type":"function","title":"Plausible.Stats.Query.ensure_include_imported/2","doc":"","ref":"Plausible.Stats.Query.html#ensure_include_imported/2"},{"type":"function","title":"Plausible.Stats.Query.from/4","doc":"Builds query from old-style params. New code should prefer Query.build","ref":"Plausible.Stats.Query.html#from/4"},{"type":"function","title":"Plausible.Stats.Query.put_imported_opts/3","doc":"","ref":"Plausible.Stats.Query.html#put_imported_opts/3"},{"type":"function","title":"Plausible.Stats.Query.remove_top_level_filters/2","doc":"Removes top level filters matching any of passed prefix from the query.\n\nNote that this doesn't handle cases with AND/OR/NOT and as such is discouraged\nfrom use.","ref":"Plausible.Stats.Query.html#remove_top_level_filters/2"},{"type":"function","title":"Plausible.Stats.Query.set/2","doc":"","ref":"Plausible.Stats.Query.html#set/2"},{"type":"function","title":"Plausible.Stats.Query.set_include/3","doc":"","ref":"Plausible.Stats.Query.html#set_include/3"},{"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.QueryOptimizer","doc":"Methods to manipulate Query for business logic reasons before building an ecto query.","ref":"Plausible.Stats.QueryOptimizer.html"},{"type":"function","title":"Plausible.Stats.QueryOptimizer.optimize/1","doc":"This module manipulates an existing query, updating it according to business logic.\n\n For example, it:\n 1. Figures out what the right granularity to group by time is\n 2. Adds a missing order_by clause to a query\n 3. Updating \"time\" dimension in order_by to the right granularity\n 4. Updates event:hostname filters to also apply on visit level for sane results.\n 5. Removes revenue metrics from dashboard queries if not requested, present or unavailable for the site.","ref":"Plausible.Stats.QueryOptimizer.html#optimize/1"},{"type":"function","title":"Plausible.Stats.QueryOptimizer.split/1","doc":"Splits a query into event and sessions subcomponents as not all metrics can be\nqueried from a single table.\n\nevent:page dimension is treated in a special way, doing a breakdown of visit:entry_page\nfor sessions.","ref":"Plausible.Stats.QueryOptimizer.html#split/1"},{"type":"module","title":"Plausible.Stats.QueryResult","doc":"This struct contains the (JSON-encodable) response for a query and\nis responsible for building it from database query results.\n\nFor the convenience of API docs and consumers, the JSON result\nproduced by Jason.encode(query_result) is ordered.","ref":"Plausible.Stats.QueryResult.html"},{"type":"function","title":"Plausible.Stats.QueryResult.from/4","doc":"Builds full JSON-serializable query response.\n\n`results` should already-built by Plausible.Stats.QueryRunner","ref":"Plausible.Stats.QueryResult.html#from/4"},{"type":"module","title":"Plausible.Stats.QueryRunner","doc":"This module is responsible for executing a Plausible.Stats.Query\nand gathering results.\n\nSome secondary responsibilities are:\n1. Dealing with comparison queries and combining results with main\n2. Dealing with time-on-page\n3. Passing total_rows from clickhouse to QueryResult meta","ref":"Plausible.Stats.QueryRunner.html"},{"type":"function","title":"Plausible.Stats.QueryRunner.run/2","doc":"","ref":"Plausible.Stats.QueryRunner.html#run/2"},{"type":"module","title":"Plausible.Stats.SQL.Expression","doc":"This module is responsible for generating SQL/Ecto expressions\nfor dimensions and metrics used in query SELECT statement.\n\nEach dimension and metric is tagged with with selected_as for easier\nusage down the line.","ref":"Plausible.Stats.SQL.Expression.html"},{"type":"macro","title":"Plausible.Stats.SQL.Expression.event_goal_join/2","doc":"","ref":"Plausible.Stats.SQL.Expression.html#event_goal_join/2"},{"type":"function","title":"Plausible.Stats.SQL.Expression.event_metric/1","doc":"","ref":"Plausible.Stats.SQL.Expression.html#event_metric/1"},{"type":"function","title":"Plausible.Stats.SQL.Expression.select_dimension/5","doc":"","ref":"Plausible.Stats.SQL.Expression.html#select_dimension/5"},{"type":"function","title":"Plausible.Stats.SQL.Expression.session_metric/2","doc":"","ref":"Plausible.Stats.SQL.Expression.html#session_metric/2"},{"type":"module","title":"Plausible.Stats.SQL.Fragments","doc":"Various macros and common SQL fragments used in Stats code.","ref":"Plausible.Stats.SQL.Fragments.html"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.bounce_rate/0","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#bounce_rate/0"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.coalesce_string/2","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#coalesce_string/2"},{"type":"macro","title":"Plausible.Stats.SQL.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.SQL.Fragments.html#get_by_key/3"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.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.SQL.Fragments.html#get_by_key/3-examples"},{"type":"macro","title":"Plausible.Stats.SQL.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.SQL.Fragments.html#has_key/3"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.Fragments.has_key/3","doc":"`has_key(e, :meta, \"some_property_name\")` expands to SQL `has(meta.key, \"some_property_name\")`","ref":"Plausible.Stats.SQL.Fragments.html#has_key/3-examples"},{"type":"function","title":"Plausible.Stats.SQL.Fragments.meta_key_column/1","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#meta_key_column/1"},{"type":"function","title":"Plausible.Stats.SQL.Fragments.meta_value_column/1","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#meta_value_column/1"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.sample_percent/0","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#sample_percent/0"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.select_join_fields/4","doc":"Macro that helps join two Ecto queries by selecting fields from either one","ref":"Plausible.Stats.SQL.Fragments.html#select_join_fields/4"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.select_merge_as/3","doc":"Convenience Ecto macro for wrapping select_merge where each value gets in turn passed to selected_as.\n\n#","ref":"Plausible.Stats.SQL.Fragments.html#select_merge_as/3"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.Fragments.select_merge_as/3","doc":"iex> select_merge_as(q, [t], %{ foo: t.column }) |> expand_macro_once\n \"select_merge(q, [], ^wrap_alias([t], %{foo: t.column}))\"","ref":"Plausible.Stats.SQL.Fragments.html#select_merge_as/3-examples"},{"type":"macro","title":"Plausible.Stats.SQL.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.SQL.Fragments.html#to_timezone/2"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.total/0","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#total/0"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.uniq/1","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#uniq/1"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.visit_duration/0","doc":"","ref":"Plausible.Stats.SQL.Fragments.html#visit_duration/0"},{"type":"macro","title":"Plausible.Stats.SQL.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.SQL.Fragments.html#weekstart_not_before/2"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.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 ```\n > 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 ```\n > 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]\n ```","ref":"Plausible.Stats.SQL.Fragments.html#weekstart_not_before/2-examples"},{"type":"macro","title":"Plausible.Stats.SQL.Fragments.wrap_alias/2","doc":"Convenience Ecto macro for wrapping a map passed to select_merge_as such that each\nexpression gets wrapped in dynamic and set as selected_as.\n\n#","ref":"Plausible.Stats.SQL.Fragments.html#wrap_alias/2"},{"type":"macro","title":"Examples - Plausible.Stats.SQL.Fragments.wrap_alias/2","doc":"iex> wrap_alias([t], %{ foo: t.column }) |> expand_macro_once\n \"%{foo: dynamic([t], selected_as(t.column, :foo))}\"","ref":"Plausible.Stats.SQL.Fragments.html#wrap_alias/2-examples"},{"type":"module","title":"Plausible.Stats.SQL.SpecialMetrics","doc":"This module defines how special metrics like `conversion_rate` and\n`percentage` are calculated.","ref":"Plausible.Stats.SQL.SpecialMetrics.html"},{"type":"function","title":"Plausible.Stats.SQL.SpecialMetrics.add/3","doc":"","ref":"Plausible.Stats.SQL.SpecialMetrics.html#add/3"},{"type":"function","title":"Plausible.Stats.SQL.SpecialMetrics.maybe_add_global_conversion_rate/3","doc":"","ref":"Plausible.Stats.SQL.SpecialMetrics.html#maybe_add_global_conversion_rate/3"},{"type":"function","title":"Plausible.Stats.SQL.SpecialMetrics.maybe_add_group_conversion_rate/3","doc":"","ref":"Plausible.Stats.SQL.SpecialMetrics.html#maybe_add_group_conversion_rate/3"},{"type":"function","title":"Plausible.Stats.SQL.SpecialMetrics.maybe_add_scroll_depth/3","doc":"","ref":"Plausible.Stats.SQL.SpecialMetrics.html#maybe_add_scroll_depth/3"},{"type":"module","title":"Plausible.Stats.SQL.WhereBuilder","doc":"A module for building am ecto where clause of a query out of a query.","ref":"Plausible.Stats.SQL.WhereBuilder.html"},{"type":"function","title":"Plausible.Stats.SQL.WhereBuilder.build/3","doc":"Builds WHERE clause for a given Query against sessions or events table","ref":"Plausible.Stats.SQL.WhereBuilder.html#build/3"},{"type":"function","title":"Plausible.Stats.SQL.WhereBuilder.build_condition/2","doc":"Builds WHERE clause condition based off of a filter and a custom column name\nUsed for special business logic cases\n\nAccepts nil as the `filter` parameter, in which case the condition is a no-op (WHERE TRUE).","ref":"Plausible.Stats.SQL.WhereBuilder.html#build_condition/2"},{"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/3","doc":"","ref":"Plausible.Stats.Sampling.html#put_threshold/3"},{"type":"module","title":"Plausible.Stats.TableDecider","doc":"This module contains logic for deciding which tables need to be queried given a query\nand metrics, with the purpose of reducing the number of queries and JOINs needed to perform.","ref":"Plausible.Stats.TableDecider.html"},{"type":"function","title":"Plausible.Stats.TableDecider.events_join_sessions?/1","doc":"","ref":"Plausible.Stats.TableDecider.html#events_join_sessions?/1"},{"type":"function","title":"Plausible.Stats.TableDecider.partition_metrics/2","doc":"","ref":"Plausible.Stats.TableDecider.html#partition_metrics/2"},{"type":"function","title":"Plausible.Stats.TableDecider.sessions_join_events?/1","doc":"","ref":"Plausible.Stats.TableDecider.html#sessions_join_events?/1"},{"type":"module","title":"Plausible.Stats.Time","doc":"Collection of functions to work with time in queries.","ref":"Plausible.Stats.Time.html"},{"type":"function","title":"Plausible.Stats.Time.date_or_weekstart/2","doc":"","ref":"Plausible.Stats.Time.html#date_or_weekstart/2"},{"type":"function","title":"Plausible.Stats.Time.format_datetime/1","doc":"","ref":"Plausible.Stats.Time.html#format_datetime/1"},{"type":"function","title":"Plausible.Stats.Time.time_dimension/1","doc":"","ref":"Plausible.Stats.Time.html#time_dimension/1"},{"type":"function","title":"Plausible.Stats.Time.time_dimension?/1","doc":"","ref":"Plausible.Stats.Time.html#time_dimension?/1"},{"type":"function","title":"Plausible.Stats.Time.time_labels/1","doc":"Returns list of time bucket labels for the given query.","ref":"Plausible.Stats.Time.html#time_labels/1"},{"type":"function","title":"Plausible.Stats.Time.utc_boundaries/2","doc":"","ref":"Plausible.Stats.Time.html#utc_boundaries/2"},{"type":"module","title":"Plausible.Stats.Timeseries","doc":"Builds timeseries results for v1 of our stats API and dashboards.\n\nAvoid adding new logic here - update QueryBuilder etc instead.","ref":"Plausible.Stats.Timeseries.html"},{"type":"function","title":"Plausible.Stats.Timeseries.timeseries/3","doc":"","ref":"Plausible.Stats.Timeseries.html#timeseries/3"},{"type":"module","title":"Plausible.Stats.Util","doc":"Utilities for modifying stat results","ref":"Plausible.Stats.Util.html"},{"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 it is needed\nfor any of the other metrics to be calculated.","ref":"Plausible.Stats.Util.html#maybe_add_visitors_metric/1"},{"type":"function","title":"Plausible.Stats.Util.shortname/2","doc":"","ref":"Plausible.Stats.Util.html#shortname/2"},{"type":"module","title":"Plausible.Teams","doc":"Core context of teams.","ref":"Plausible.Teams.html"},{"type":"function","title":"Plausible.Teams.get_by_owner/1","doc":"","ref":"Plausible.Teams.html#get_by_owner/1"},{"type":"function","title":"Plausible.Teams.get_or_create/1","doc":"Get or create user's team.\n\nIf the user has no non-guest membership yet, an implicit \"My Team\" team is\ncreated with them as an owner.\n\nIf the user already has an owner membership in an existing team,\nthat team is returned.\n\nIf the user has a non-guest membership other than owner, `:no_team` error\nis returned.","ref":"Plausible.Teams.html#get_or_create/1"},{"type":"function","title":"Plausible.Teams.last_subscription_join_query/0","doc":"","ref":"Plausible.Teams.html#last_subscription_join_query/0"},{"type":"function","title":"Plausible.Teams.last_subscription_query/0","doc":"","ref":"Plausible.Teams.html#last_subscription_query/0"},{"type":"function","title":"Plausible.Teams.load_for_site/1","doc":"Create (when necessary) and load team relation for provided site.\n\nUsed for sync logic to work smoothly during transitional period.","ref":"Plausible.Teams.html#load_for_site/1"},{"type":"function","title":"Plausible.Teams.on_trial?/1","doc":"","ref":"Plausible.Teams.html#on_trial?/1"},{"type":"function","title":"Plausible.Teams.owned_sites/1","doc":"","ref":"Plausible.Teams.html#owned_sites/1"},{"type":"function","title":"Plausible.Teams.owned_sites_ids/1","doc":"","ref":"Plausible.Teams.html#owned_sites_ids/1"},{"type":"function","title":"Plausible.Teams.read_team_schemas?/1","doc":"","ref":"Plausible.Teams.html#read_team_schemas?/1"},{"type":"function","title":"Plausible.Teams.sync_team/1","doc":"","ref":"Plausible.Teams.html#sync_team/1"},{"type":"function","title":"Plausible.Teams.trial_days_left/1","doc":"","ref":"Plausible.Teams.html#trial_days_left/1"},{"type":"function","title":"Plausible.Teams.with_subscription/1","doc":"","ref":"Plausible.Teams.html#with_subscription/1"},{"type":"module","title":"Plausible.Teams.Adapter","doc":"Commonly used teams-transition functions","ref":"Plausible.Teams.Adapter.html"},{"type":"function","title":"Plausible.Teams.Adapter.switch/2","doc":"","ref":"Plausible.Teams.Adapter.html#switch/2"},{"type":"function","title":"Plausible.Teams.Adapter.user_or_team/1","doc":"","ref":"Plausible.Teams.Adapter.html#user_or_team/1"},{"type":"module","title":"Plausible.Teams.Adapter.Read.Billing","doc":"Transition adapter for new schema reads","ref":"Plausible.Teams.Adapter.Read.Billing.html"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.active_subscription_for/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#active_subscription_for/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.allow_next_upgrade_override?/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#allow_next_upgrade_override?/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.change_plan/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#change_plan/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.check_feature_availability/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#check_feature_availability/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.check_feature_availability_for_stats_api/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#check_feature_availability_for_stats_api/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.check_needs_to_upgrade/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#check_needs_to_upgrade/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.ensure_can_add_new_site/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#ensure_can_add_new_site/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.enterprise_configured?/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#enterprise_configured?/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.get_subscription/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#get_subscription/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.has_active_subscription?/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#has_active_subscription?/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.latest_enterprise_plan_with_prices/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#latest_enterprise_plan_with_prices/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.monthly_pageview_limit/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#monthly_pageview_limit/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.monthly_pageview_usage/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#monthly_pageview_usage/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.quota_usage/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#quota_usage/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.site_limit/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#site_limit/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.site_usage/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#site_usage/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.suggest_by_usage/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#suggest_by_usage/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.team_member_limit/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#team_member_limit/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Billing.team_member_usage/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Billing.html#team_member_usage/2"},{"type":"module","title":"Plausible.Teams.Adapter.Read.Invitations","doc":"Transition adapter for new schema reads","ref":"Plausible.Teams.Adapter.Read.Invitations.html"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Invitations.check_invitation_permissions/4","doc":"","ref":"Plausible.Teams.Adapter.Read.Invitations.html#check_invitation_permissions/4"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Invitations.check_team_member_limit/4","doc":"","ref":"Plausible.Teams.Adapter.Read.Invitations.html#check_team_member_limit/4"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Invitations.ensure_new_membership/4","doc":"","ref":"Plausible.Teams.Adapter.Read.Invitations.html#ensure_new_membership/4"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Invitations.ensure_transfer_valid/4","doc":"","ref":"Plausible.Teams.Adapter.Read.Invitations.html#ensure_transfer_valid/4"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Invitations.send_invitation_email/3","doc":"","ref":"Plausible.Teams.Adapter.Read.Invitations.html#send_invitation_email/3"},{"type":"module","title":"Plausible.Teams.Adapter.Read.Ownership","doc":"Transition adapter for new schema reads","ref":"Plausible.Teams.Adapter.Read.Ownership.html"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.all_pending_site_transfers/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#all_pending_site_transfers/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.check_feature_access/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#check_feature_access/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.ensure_can_take_ownership/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#ensure_can_take_ownership/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.get_owner/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#get_owner/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.has_sites?/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#has_sites?/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Ownership.owns_sites?/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Ownership.html#owns_sites?/2"},{"type":"module","title":"Plausible.Teams.Adapter.Read.Sites","doc":"Transition adapter for new schema reads","ref":"Plausible.Teams.Adapter.Read.Sites.html"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.get_for_user/3","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#get_for_user/3"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.get_for_user!/3","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#get_for_user!/3"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.list/3","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#list/3"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.list_people/2","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#list_people/2"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Sites.list_with_invitations/3","doc":"","ref":"Plausible.Teams.Adapter.Read.Sites.html#list_with_invitations/3"},{"type":"module","title":"Plausible.Teams.Adapter.Read.Teams","doc":"Transition adapter for new schema reads","ref":"Plausible.Teams.Adapter.Read.Teams.html"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Teams.on_trial?/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Teams.html#on_trial?/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Teams.trial_days_left/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Teams.html#trial_days_left/1"},{"type":"function","title":"Plausible.Teams.Adapter.Read.Teams.trial_expiry_date/1","doc":"","ref":"Plausible.Teams.Adapter.Read.Teams.html#trial_expiry_date/1"},{"type":"module","title":"Plausible.Teams.GuestInvitation","doc":"Guest invitation schema","ref":"Plausible.Teams.GuestInvitation.html"},{"type":"function","title":"Plausible.Teams.GuestInvitation.changeset/3","doc":"","ref":"Plausible.Teams.GuestInvitation.html#changeset/3"},{"type":"module","title":"Plausible.Teams.GuestMembership","doc":"Guest membership schema","ref":"Plausible.Teams.GuestMembership.html"},{"type":"function","title":"Plausible.Teams.GuestMembership.changeset/3","doc":"","ref":"Plausible.Teams.GuestMembership.html#changeset/3"},{"type":"module","title":"Plausible.Teams.Invitation","doc":"Team invitation schema","ref":"Plausible.Teams.Invitation.html"},{"type":"function","title":"Plausible.Teams.Invitation.changeset/2","doc":"","ref":"Plausible.Teams.Invitation.html#changeset/2"},{"type":"module","title":"Plausible.Teams.Membership","doc":"Team membership schema","ref":"Plausible.Teams.Membership.html"},{"type":"function","title":"Plausible.Teams.Membership.changeset/3","doc":"","ref":"Plausible.Teams.Membership.html#changeset/3"},{"type":"module","title":"Plausible.Teams.SiteTransfer","doc":"Site transfer schema","ref":"Plausible.Teams.SiteTransfer.html"},{"type":"function","title":"Plausible.Teams.SiteTransfer.changeset/2","doc":"","ref":"Plausible.Teams.SiteTransfer.html#changeset/2"},{"type":"module","title":"Plausible.Teams.Team","doc":"Team schema","ref":"Plausible.Teams.Team.html"},{"type":"function","title":"Plausible.Teams.Team.changeset/2","doc":"","ref":"Plausible.Teams.Team.html#changeset/2"},{"type":"function","title":"Plausible.Teams.Team.start_trial/2","doc":"","ref":"Plausible.Teams.Team.html#start_trial/2"},{"type":"function","title":"Plausible.Teams.Team.sync_changeset/2","doc":"","ref":"Plausible.Teams.Team.html#sync_changeset/2"},{"type":"type","title":"Plausible.Teams.Team.t/0","doc":"","ref":"Plausible.Teams.Team.html#t:t/0"},{"type":"module","title":"Plausible.Teams.Test","doc":"Convenience assertions for teams schema transition","ref":"Plausible.Teams.Test.html"},{"type":"function","title":"Plausible.Teams.Test.add_guest/2","doc":"","ref":"Plausible.Teams.Test.html#add_guest/2"},{"type":"function","title":"Plausible.Teams.Test.assert_guest_invitation/4","doc":"","ref":"Plausible.Teams.Test.html#assert_guest_invitation/4"},{"type":"function","title":"Plausible.Teams.Test.assert_guest_membership/4","doc":"","ref":"Plausible.Teams.Test.html#assert_guest_membership/4"},{"type":"function","title":"Plausible.Teams.Test.assert_team_attached/2","doc":"","ref":"Plausible.Teams.Test.html#assert_team_attached/2"},{"type":"function","title":"Plausible.Teams.Test.assert_team_exists/2","doc":"","ref":"Plausible.Teams.Test.html#assert_team_exists/2"},{"type":"function","title":"Plausible.Teams.Test.assert_team_membership/3","doc":"","ref":"Plausible.Teams.Test.html#assert_team_membership/3"},{"type":"function","title":"Plausible.Teams.Test.invite_guest/3","doc":"","ref":"Plausible.Teams.Test.html#invite_guest/3"},{"type":"function","title":"Plausible.Teams.Test.invite_transfer/3","doc":"","ref":"Plausible.Teams.Test.html#invite_transfer/3"},{"type":"function","title":"Plausible.Teams.Test.new_site/1","doc":"","ref":"Plausible.Teams.Test.html#new_site/1"},{"type":"function","title":"Plausible.Teams.Test.new_team/0","doc":"","ref":"Plausible.Teams.Test.html#new_team/0"},{"type":"function","title":"Plausible.Teams.Test.new_user/1","doc":"","ref":"Plausible.Teams.Test.html#new_user/1"},{"type":"function","title":"Plausible.Teams.Test.revoke_membership/2","doc":"","ref":"Plausible.Teams.Test.html#revoke_membership/2"},{"type":"function","title":"Plausible.Teams.Test.subscribe_to_business_plan/1","doc":"","ref":"Plausible.Teams.Test.html#subscribe_to_business_plan/1"},{"type":"function","title":"Plausible.Teams.Test.subscribe_to_enterprise_plan/2","doc":"","ref":"Plausible.Teams.Test.html#subscribe_to_enterprise_plan/2"},{"type":"function","title":"Plausible.Teams.Test.subscribe_to_growth_plan/1","doc":"","ref":"Plausible.Teams.Test.html#subscribe_to_growth_plan/1"},{"type":"function","title":"Plausible.Teams.Test.subscribe_to_plan/3","doc":"","ref":"Plausible.Teams.Test.html#subscribe_to_plan/3"},{"type":"module","title":"Plausible.Teams.Users","doc":"Users API accounting for teams.","ref":"Plausible.Teams.Users.html"},{"type":"function","title":"Plausible.Teams.Users.has_sites?/2","doc":"","ref":"Plausible.Teams.Users.html#has_sites?/2"},{"type":"function","title":"Plausible.Teams.Users.owns_sites?/2","doc":"","ref":"Plausible.Teams.Users.html#owns_sites?/2"},{"type":"module","title":"Plausible.Test.Support.HTML","doc":"Floki wrappers to help make assertions about HTML/DOM structures","ref":"Plausible.Test.Support.HTML.html"},{"type":"function","title":"Plausible.Test.Support.HTML.class_of_element/2","doc":"","ref":"Plausible.Test.Support.HTML.html#class_of_element/2"},{"type":"function","title":"Plausible.Test.Support.HTML.element_exists?/2","doc":"","ref":"Plausible.Test.Support.HTML.html#element_exists?/2"},{"type":"function","title":"Plausible.Test.Support.HTML.find/2","doc":"","ref":"Plausible.Test.Support.HTML.html#find/2"},{"type":"function","title":"Plausible.Test.Support.HTML.form_exists?/2","doc":"","ref":"Plausible.Test.Support.HTML.html#form_exists?/2"},{"type":"function","title":"Plausible.Test.Support.HTML.name_of/1","doc":"","ref":"Plausible.Test.Support.HTML.html#name_of/1"},{"type":"function","title":"Plausible.Test.Support.HTML.submit_button/2","doc":"","ref":"Plausible.Test.Support.HTML.html#submit_button/2"},{"type":"function","title":"Plausible.Test.Support.HTML.text/1","doc":"","ref":"Plausible.Test.Support.HTML.html#text/1"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_attr/2","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/2"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_attr/3","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_attr/3"},{"type":"function","title":"Plausible.Test.Support.HTML.text_of_element/2","doc":"","ref":"Plausible.Test.Support.HTML.html#text_of_element/2"},{"type":"module","title":"Plausible.Test.Support.HTTPMocker","doc":"Currently only supports post request, it's a drop-in replacement\nfor our exvcr usage that wasn't ever needed (e.g. we had no way to\nre-record the cassettes anyway).","ref":"Plausible.Test.Support.HTTPMocker.html"},{"type":"module","title":"Plausible.TestUtils","doc":"","ref":"Plausible.TestUtils.html"},{"type":"function","title":"Plausible.TestUtils.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_legacy_site_import/1","doc":"","ref":"Plausible.TestUtils.html#create_legacy_site_import/1"},{"type":"function","title":"Plausible.TestUtils.create_pageviews/1","doc":"","ref":"Plausible.TestUtils.html#create_pageviews/1"},{"type":"function","title":"Plausible.TestUtils.create_site/1","doc":"","ref":"Plausible.TestUtils.html#create_site/1"},{"type":"function","title":"Plausible.TestUtils.create_site_import/1","doc":"","ref":"Plausible.TestUtils.html#create_site_import/1"},{"type":"function","title":"Plausible.TestUtils.create_user/1","doc":"","ref":"Plausible.TestUtils.html#create_user/1"},{"type":"function","title":"Plausible.TestUtils.ensure_minio/0","doc":"","ref":"Plausible.TestUtils.html#ensure_minio/0"},{"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":"function","title":"Plausible.TestUtils.maybe_fake_minio/1","doc":"","ref":"Plausible.TestUtils.html#maybe_fake_minio/1"},{"type":"function","title":"Plausible.TestUtils.minio_running?/0","doc":"","ref":"Plausible.TestUtils.html#minio_running?/0"},{"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":"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.bump_last_seen/2","doc":"","ref":"Plausible.Users.html#bump_last_seen/2"},{"type":"function","title":"Plausible.Users.end_grace_period/1","doc":"","ref":"Plausible.Users.html#end_grace_period/1"},{"type":"function","title":"Plausible.Users.has_email_code?/1","doc":"","ref":"Plausible.Users.html#has_email_code?/1"},{"type":"function","title":"Plausible.Users.last_subscription_join_query/0","doc":"","ref":"Plausible.Users.html#last_subscription_join_query/0"},{"type":"function","title":"Plausible.Users.last_subscription_query/0","doc":"","ref":"Plausible.Users.html#last_subscription_query/0"},{"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.remove_grace_period/1","doc":"","ref":"Plausible.Users.html#remove_grace_period/1"},{"type":"function","title":"Plausible.Users.start_grace_period/1","doc":"","ref":"Plausible.Users.html#start_grace_period/1"},{"type":"function","title":"Plausible.Users.start_manual_lock_grace_period/1","doc":"","ref":"Plausible.Users.html#start_manual_lock_grace_period/1"},{"type":"function","title":"Plausible.Users.start_trial/1","doc":"","ref":"Plausible.Users.html#start_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.Verification","doc":"Module defining the user-agent used for site verification.","ref":"Plausible.Verification.html"},{"type":"function","title":"Plausible.Verification.user_agent/0","doc":"","ref":"Plausible.Verification.html#user_agent/0"},{"type":"behaviour","title":"Plausible.Verification.Check","doc":"Behaviour to be implemented by specific site verification checks.\n`report_progress_as()` doesn't necessarily reflect the actual check description,\nit serves as a user-facing message grouping mechanism, to prevent frequent message flashing when checks rotate often.\nEach check operates on `state()` and is expected to return it, optionally modified, by all means.\n`perform_safe/1` is used to guarantee no exceptions are thrown by faulty implementations, not to interrupt LiveView.","ref":"Plausible.Verification.Check.html"},{"type":"callback","title":"Plausible.Verification.Check.perform/1","doc":"","ref":"Plausible.Verification.Check.html#c:perform/1"},{"type":"callback","title":"Plausible.Verification.Check.report_progress_as/0","doc":"","ref":"Plausible.Verification.Check.html#c:report_progress_as/0"},{"type":"type","title":"Plausible.Verification.Check.state/0","doc":"","ref":"Plausible.Verification.Check.html#t:state/0"},{"type":"module","title":"Plausible.Verification.Checks","doc":"Checks that are performed during site verification.\nEach module defined in `@checks` implements the `Plausible.Verification.Check` behaviour.\nChecks are normally run asynchronously, except when synchronous execution is optionally required\nfor tests. Slowdowns can be optionally added, the user doesn't benefit from running the checks too quickly.\n\nIn async execution, each check notifies the caller by sending a message to it.","ref":"Plausible.Verification.Checks.html"},{"type":"function","title":"Plausible.Verification.Checks.interpret_diagnostics/1","doc":"","ref":"Plausible.Verification.Checks.html#interpret_diagnostics/1"},{"type":"function","title":"Plausible.Verification.Checks.run/3","doc":"","ref":"Plausible.Verification.Checks.html#run/3"},{"type":"module","title":"Plausible.Verification.Checks.CSP","doc":"Scans the Content Security Policy header to ensure that the Plausible domain is allowed.\nSee `Plausible.Verification.Checks` for the execution sequence.","ref":"Plausible.Verification.Checks.CSP.html"},{"type":"function","title":"Plausible.Verification.Checks.CSP.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.CSP.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.FetchBody","doc":"Fetches the body of the site and extracts the HTML document, if available, for\nfurther processing.\nSee `Plausible.Verification.Checks` for the execution sequence.","ref":"Plausible.Verification.Checks.FetchBody.html"},{"type":"function","title":"Plausible.Verification.Checks.FetchBody.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.FetchBody.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.Installation","doc":"Calls the browserless.io service (local instance can be spawned with `make browserless`)\nand runs verification/verify_plausible_installed.js via the [function API](https://docs.browserless.io/HTTP-APIs/function).\n\nThe successful execution assumes the following JSON payload:\n - `data.plausibleInstalled` - boolean indicating whether the `plausible()` window function was found\n - `data.callbackStatus` - integer. 202 indicates that the server acknowledged the test event.\n\nThe test event ingestion is discarded based on user-agent, see: `Plausible.Verification.user_agent/0`","ref":"Plausible.Verification.Checks.Installation.html"},{"type":"function","title":"Plausible.Verification.Checks.Installation.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.Installation.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.ScanBody","doc":"Naive way of detecting GTM and WordPress powered sites.","ref":"Plausible.Verification.Checks.ScanBody.html"},{"type":"function","title":"Plausible.Verification.Checks.ScanBody.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.ScanBody.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.Snippet","doc":"The check looks for Plausible snippets and tries to address the common\nintegration issues, such as bad placement, data-domain typos, unknown \nattributes frequently added by performance optimization plugins, etc.","ref":"Plausible.Verification.Checks.Snippet.html"},{"type":"function","title":"Plausible.Verification.Checks.Snippet.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.Snippet.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Checks.SnippetCacheBust","doc":"A naive way of trying to figure out whether the latest site contents \nis wrapped with some CDN/caching layer.\nIn case no snippets were found, we'll try to bust the cache by appending a random query parameter\nand re-run `Plausible.Verification.Checks.FetchBody` and `Plausible.Verification.Checks.Snippet` checks.\nIf the result is different this time, we'll assume cache likely.","ref":"Plausible.Verification.Checks.SnippetCacheBust.html"},{"type":"function","title":"Plausible.Verification.Checks.SnippetCacheBust.perform_safe/1","doc":"","ref":"Plausible.Verification.Checks.SnippetCacheBust.html#perform_safe/1"},{"type":"module","title":"Plausible.Verification.Diagnostics","doc":"Module responsible for translating diagnostics to user-friendly errors and recommendations.","ref":"Plausible.Verification.Diagnostics.html"},{"type":"function","title":"Plausible.Verification.Diagnostics.interpret/2","doc":"","ref":"Plausible.Verification.Diagnostics.html#interpret/2"},{"type":"type","title":"Plausible.Verification.Diagnostics.t/0","doc":"","ref":"Plausible.Verification.Diagnostics.html#t:t/0"},{"type":"module","title":"Plausible.Verification.Diagnostics.Result","doc":"Diagnostics interpretation result.","ref":"Plausible.Verification.Diagnostics.Result.html"},{"type":"type","title":"Plausible.Verification.Diagnostics.Result.t/0","doc":"","ref":"Plausible.Verification.Diagnostics.Result.html#t:t/0"},{"type":"module","title":"Plausible.Verification.Errors","doc":"A go-to definition of all verification errors","ref":"Plausible.Verification.Errors.html"},{"type":"function","title":"Plausible.Verification.Errors.all/0","doc":"","ref":"Plausible.Verification.Errors.html#all/0"},{"type":"module","title":"Plausible.Verification.State","doc":"The struct and interface describing the state of the site verification process.\nAssigns are meant to be used to communicate between checks, while diagnostics\nare later on interpreted (translated into user-friendly messages and recommendations)\nvia `Plausible.Verification.Diagnostics` module.","ref":"Plausible.Verification.State.html"},{"type":"function","title":"Plausible.Verification.State.assign/2","doc":"","ref":"Plausible.Verification.State.html#assign/2"},{"type":"function","title":"Plausible.Verification.State.put_diagnostics/2","doc":"","ref":"Plausible.Verification.State.html#put_diagnostics/2"},{"type":"type","title":"Plausible.Verification.State.t/0","doc":"","ref":"Plausible.Verification.State.html#t:t/0"},{"type":"module","title":"Plausible.Verification.URL","doc":"Busting some caches by appending ?plausible_verification=12345 to it.","ref":"Plausible.Verification.URL.html"},{"type":"function","title":"Plausible.Verification.URL.bust_url/1","doc":"","ref":"Plausible.Verification.URL.html#bust_url/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":"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":"function","title":"Plausible.Workers.CheckUsage.maybe_remove_grace_period/2","doc":"","ref":"Plausible.Workers.CheckUsage.html#maybe_remove_grace_period/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.CleanUserSessions","doc":"Job removing expired user sessions. A grace period is applied.","ref":"Plausible.Workers.CleanUserSessions.html"},{"type":"function","title":"Plausible.Workers.CleanUserSessions.grace_period_duration/0","doc":"","ref":"Plausible.Workers.CleanUserSessions.html#grace_period_duration/0"},{"type":"module","title":"Plausible.Workers.ClickhouseCleanSites","doc":"Cleans deleted site data from ClickHouse asynchronously.\n\nWe batch up data deletions from ClickHouse as deleting a single site is\njust as expensive as deleting many.","ref":"Plausible.Workers.ClickhouseCleanSites.html"},{"type":"function","title":"Plausible.Workers.ClickhouseCleanSites.get_deleted_sites_with_clickhouse_data/0","doc":"","ref":"Plausible.Workers.ClickhouseCleanSites.html#get_deleted_sites_with_clickhouse_data/0"},{"type":"function","title":"Plausible.Workers.ClickhouseCleanSites.perform/1","doc":"","ref":"Plausible.Workers.ClickhouseCleanSites.html#perform/1"},{"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.ExportAnalytics","doc":"Worker for running CSV export jobs. Supports S3 and local storage.\nTo avoid blocking the queue, a timeout of 15 minutes is enforced.","ref":"Plausible.Workers.ExportAnalytics.html"},{"type":"function","title":"Plausible.Workers.ExportAnalytics.base_query/1","doc":"This base query filters export jobs for a site","ref":"Plausible.Workers.ExportAnalytics.html#base_query/1"},{"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/2","doc":"","ref":"Plausible.Workers.ImportAnalytics.html#import_fail/2"},{"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.LocalImportAnalyticsCleaner","doc":"Worker for cleaning local files left after analytics import jobs.","ref":"Plausible.Workers.LocalImportAnalyticsCleaner.html"},{"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.NotifyExportedAnalytics","doc":"This worker delivers emails for successful and failed exports","ref":"Plausible.Workers.NotifyExportedAnalytics.html"},{"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.TrafficChangeNotifier","doc":"Oban service sending out traffic drop/spike notifications","ref":"Plausible.Workers.TrafficChangeNotifier.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.component/0","doc":"","ref":"PlausibleWeb.html#component/0"},{"type":"function","title":"PlausibleWeb.controller/0","doc":"","ref":"PlausibleWeb.html#controller/0"},{"type":"function","title":"PlausibleWeb.live_component/0","doc":"","ref":"PlausibleWeb.html#live_component/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.current_plan/2","doc":"","ref":"PlausibleWeb.AdminController.html#current_plan/2"},{"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.goals_index/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#goals_index/2"},{"type":"function","title":"PlausibleWeb.Api.ExternalSitesController.index/2","doc":"","ref":"PlausibleWeb.Api.ExternalSitesController.html#index/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.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.currency/2","doc":"","ref":"PlausibleWeb.Api.PaddleController.html#currency/2"},{"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.build_intervals/4","doc":"","ref":"PlausibleWeb.Api.StatsController.html#build_intervals/4"},{"type":"function","title":"PlausibleWeb.Api.StatsController.channels/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#channels/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.cities/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#cities/2"},{"type":"function","title":"PlausibleWeb.Api.StatsController.comparison_query/1","doc":"","ref":"PlausibleWeb.Api.StatsController.html#comparison_query/1"},{"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_value_filter_suggestions/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#custom_prop_value_filter_suggestions/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.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 * `includes_imported` - boolean indicating whether imported data\n was queried or not.\n\n * `imports_exist` - boolean indicating whether there are any completed\n imports for a given site or not.\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 \"imports_exist\" => false,\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 \"includes_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.put_combined_name_with_version/2","doc":"","ref":"PlausibleWeb.Api.StatsController.html#put_combined_name_with_version/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.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.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.request_activation_code/2","doc":"","ref":"PlausibleWeb.AuthController.html#request_activation_code/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":"Plug for populating conn assigns with user data\non the basis of authenticated session token.\n\nMust be kept in sync with `PlausibleWeb.Live.AuthContext`.","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.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.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.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.AuthView.html#render/2"},{"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.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.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.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.FirstDashboardLaunchBanner","doc":"A banner that appears on the first dashboard launch","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html"},{"type":"function","title":"PlausibleWeb.Components.FirstDashboardLaunchBanner.render/1","doc":"","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.FirstDashboardLaunchBanner.render/1","doc":"* `site` (`Plausible.Site`) (required)","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html#render/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.FirstDashboardLaunchBanner.set/1","doc":"","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html#set/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.FirstDashboardLaunchBanner.set/1","doc":"* `site` (`Plausible.Site`) (required)","ref":"PlausibleWeb.Components.FirstDashboardLaunchBanner.html#set/1-attributes"},{"type":"module","title":"PlausibleWeb.Components.FlowProgress","doc":"Component for provisioning/registration flows displaying\nprogress status. See `PlausibleWeb.Flows` for the list of\nflow definitions.","ref":"PlausibleWeb.Components.FlowProgress.html"},{"type":"function","title":"PlausibleWeb.Components.FlowProgress.render/1","doc":"","ref":"PlausibleWeb.Components.FlowProgress.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.FlowProgress.render/1","doc":"* `flow` (`:string`) (required) - Must be one of `\"register\"`, `\"invitation\"`, `\"domain_change\"`, `\"review\"`, or `\"provisioning\"`.\n* `current_step` (`:string`) (required) - Must be one of `\"Register\"`, `\"Activate account\"`, `\"Add site info\"`, `\"Install Plausible\"`, `\"Verify installation\"`, or `\"Set up new domain\"`.","ref":"PlausibleWeb.Components.FlowProgress.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* `mt?` (`:boolean`) - Defaults to `true`.\n* Global attributes are accepted. Supports all globals plus: `[\"name\"]`.","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* `method` (`:string`) - Defaults to `\"get\"`.\n* `mt?` (`:boolean`) - Defaults to `true`.\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.delete_button/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#delete_button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.delete_button/1","doc":"* `href` (`:string`) - Defaults to `nil`.\n* Global attributes are accepted. Supports all globals plus: `[\"method\", \"disabled\"]`.","ref":"PlausibleWeb.Components.Generic.html#delete_button/1-attributes"},{"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.edit_button/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#edit_button/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.edit_button/1","doc":"* `href` (`:string`) - Defaults to `nil`.\n* Global attributes are accepted. Supports all globals plus: `[\"method\", \"disabled\"]`.","ref":"PlausibleWeb.Components.Generic.html#edit_button/1-attributes"},{"type":"function","title":"PlausibleWeb.Components.Generic.filter_bar/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#filter_bar/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.filter_bar/1","doc":"* `filter_text` (`:string`) - Defaults to `\"\"`.\n* `placeholder` (`:string`) - Defaults to `\"\"`.\n* `filtering_enabled?` (`:boolean`) - Defaults to `true`.","ref":"PlausibleWeb.Components.Generic.html#filter_bar/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.filter_bar/1","doc":"* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#filter_bar/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.focus_box/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#focus_box/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.focus_box/1","doc":"* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#focus_box/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.focus_box/1","doc":"* `title`\n* `subtitle`\n* `inner_block` (required)\n* `footer`","ref":"PlausibleWeb.Components.Generic.html#focus_box/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.focus_list/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#focus_list/1"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.focus_list/1","doc":"* `item` (required)","ref":"PlausibleWeb.Components.Generic.html#focus_list/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.h2/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#h2/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.h2/1","doc":"* `class` (`:any`) - Defaults to `nil`.","ref":"PlausibleWeb.Components.Generic.html#h2/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.h2/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#h2/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.notice/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#notice/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.notice/1","doc":"* `title` (`:any`) - Defaults to `nil`.\n* `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.settings_tiles/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#settings_tiles/1"},{"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":"* `href` (`:string`) - Defaults to `\"#\"`.\n* `new_tab` (`:boolean`) - Defaults to `false`.\n* `class` (`:string`) - Defaults to `\"\"`.\n* `method` (`:string`) - Defaults to `\"get\"`.\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.table/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#table/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.table/1","doc":"* `width` (`:string`) - Defaults to `\"min-w-full\"`.\n* `rows` (`:list`) - Defaults to `[]`.\n* `row_attrs` (`:any`) - Defaults to `nil`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#table/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.table/1","doc":"* `thead`\n* `tbody` (required)\n* `inner_block`","ref":"PlausibleWeb.Components.Generic.html#table/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.td/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#td/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.td/1","doc":"* `truncate` (`:boolean`) - Defaults to `false`.\n* `max_width` (`:string`) - Defaults to `\"\"`.\n* `height` (`:string`) - Defaults to `\"\"`.\n* `actions` (`:boolean`) - Defaults to `nil`.\n* `hide_on_mobile` (`:boolean`) - Defaults to `nil`.\n* Global attributes are accepted.","ref":"PlausibleWeb.Components.Generic.html#td/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.td/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#td/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.th/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#th/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.th/1","doc":"* `invisible` (`:boolean`) - Defaults to `false`.\n* `hide_on_mobile` (`:boolean`) - Defaults to `nil`.","ref":"PlausibleWeb.Components.Generic.html#th/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.th/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#th/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.tile/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#tile/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.tile/1","doc":"* `docs` (`:string`) - Defaults to `nil`.\n* `feature_mod` (`:atom`) - Defaults to `nil`.\n* `site` (`:any`)\n* `conn` (`:any`)","ref":"PlausibleWeb.Components.Generic.html#tile/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.tile/1","doc":"* `inner_block` (required)\n* `title` (required)\n* `subtitle` (required)","ref":"PlausibleWeb.Components.Generic.html#tile/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.title/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#title/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.title/1","doc":"* `class` (`:any`) - Defaults to `nil`.","ref":"PlausibleWeb.Components.Generic.html#title/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.title/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#title/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.toggle_submit/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#toggle_submit/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.toggle_submit/1","doc":"* `set_to` (`:boolean`) - Defaults to `false`.\n* `disabled?` (`:boolean`) - Defaults to `false`.","ref":"PlausibleWeb.Components.Generic.html#toggle_submit/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.toggle_submit/1","doc":"* `inner_block` (required)","ref":"PlausibleWeb.Components.Generic.html#toggle_submit/1-slots"},{"type":"function","title":"PlausibleWeb.Components.Generic.tooltip/1","doc":"","ref":"PlausibleWeb.Components.Generic.html#tooltip/1"},{"type":"function","title":"Attributes - PlausibleWeb.Components.Generic.tooltip/1","doc":"* `sticky?` (`:boolean`) - Defaults to `true`.","ref":"PlausibleWeb.Components.Generic.html#tooltip/1-attributes"},{"type":"function","title":"Slots - PlausibleWeb.Components.Generic.tooltip/1","doc":"* `inner_block` (required)\n* `tooltip_content` (required)","ref":"PlausibleWeb.Components.Generic.html#tooltip/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 `nil`.\n* `method` (`:string`) - Defaults to `\"get\"`.\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_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)\n* `class` (`:any`) - Defaults to `nil`.","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 `\"\"`.\n* `show_button?` (`:boolean`) - Defaults to `true`.","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.debug_metadata/1","doc":"","ref":"PlausibleWeb.ControllerHelpers.html#debug_metadata/1"},{"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.DebugController","doc":"","ref":"PlausibleWeb.DebugController.html"},{"type":"function","title":"PlausibleWeb.DebugController.clickhouse/2","doc":"","ref":"PlausibleWeb.DebugController.html#clickhouse/2"},{"type":"module","title":"PlausibleWeb.DebugView","doc":"","ref":"PlausibleWeb.DebugView.html"},{"type":"function","title":"PlausibleWeb.DebugView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.DebugView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.DebugView.clickhouse.html/1","doc":"","ref":"PlausibleWeb.DebugView.html#clickhouse.html/1"},{"type":"function","title":"PlausibleWeb.DebugView.controller_name/1","doc":"","ref":"PlausibleWeb.DebugView.html#controller_name/1"},{"type":"function","title":"PlausibleWeb.DebugView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.DebugView.html#render/2"},{"type":"function","title":"PlausibleWeb.DebugView.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.DebugView.html#template_not_found/2"},{"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.drop_notification/5","doc":"","ref":"PlausibleWeb.Email.html#drop_notification/5"},{"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/3","doc":"","ref":"PlausibleWeb.Email.html#existing_user_invitation/3"},{"type":"function","title":"PlausibleWeb.Email.export_failure/2","doc":"","ref":"PlausibleWeb.Email.html#export_failure/2"},{"type":"function","title":"PlausibleWeb.Email.export_success/3","doc":"","ref":"PlausibleWeb.Email.html#export_success/3"},{"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/3","doc":"","ref":"PlausibleWeb.Email.html#invitation_accepted/3"},{"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/4","doc":"","ref":"PlausibleWeb.Email.html#new_user_invitation/4"},{"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/3","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_accepted/3"},{"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/5","doc":"","ref":"PlausibleWeb.Email.html#ownership_transfer_request/5"},{"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.csv_import.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#csv_import.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.drop_notification.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#drop_notification.html/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.export_failure.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#export_failure.html/1"},{"type":"function","title":"PlausibleWeb.EmailView.export_success.html/1","doc":"","ref":"PlausibleWeb.EmailView.html#export_success.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/3","doc":"","ref":"PlausibleWeb.ErrorHelpers.html#error_tag/3"},{"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* `help_text` (`:string`) - Defaults to `nil`.\n* `value` (`:any`)\n* `width` (`:string`) - Defaults to `\"w-full\"`.\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* `class` (`:any`) - Defaults to `\"text-sm dark:bg-gray-900 block pl-3.5 py-2.5 border-gray-300 dark:border-gray-500 focus:outline-none focus:ring-indigo-500 focus:border-indigo-500 rounded-md\"`.\n* `mt?` (`:boolean`) - Defaults to `true`.\n* `max_one_error` (`:boolean`) - 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\", \"x-model\"]`.","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* `name` (`:string`) (required)\n* `label` (`:string`) - Defaults to `nil`.\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`.\n* `class` (`:string`) - Defaults to `\"\"`.","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\" :let={modal_unique_id}>\n <.live_component\n module={SomeForm}\n id={\"some-form-#{modal_unique_id}\"}\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. The modal component provides `modal_unique_id`\nas an argument to its inner block. Appending this ID to every\nlive components' ID nested inside the modal is important for\nconsistent state reset on every reopening. This also applies\nto live components nested inside live components embedded directly\nin the modal's inner block - then the unique ID should be also\npassed down as an attribute and appended accordingly. Appending can\nbe skipped if embedded component handles state reset explicitly\n(via, for instance, `phx-click-away` callback).\n\n`Modal` exposes a number of functions for managing window state:\n\n * `Modal.JS.preopen/1` - to preopen the modal on the frontend.\n Useful when the actual opening is done server-side with\n `Modal.open/2` - helps avoid lack of feedback to the end user\n when server-side state change before opening the modal is\n still in progress.\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.open/2` - to open the modal from the backend; usually\n called from `handle_event/2` of component wrapping the modal\n and providing the state. Should be used together with\n `Modal.JS.preopen/1` for optimal user experience.\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.open/2","doc":"","ref":"PlausibleWeb.Live.Components.Modal.html#open/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 `\"\"`.\n* `preload?` (`:boolean`) - Defaults to `true`.","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.Verification","doc":"This component is responsible for rendering the verification progress\nand diagnostics.","ref":"PlausibleWeb.Live.Components.Verification.html"},{"type":"function","title":"PlausibleWeb.Live.Components.Verification.render/1","doc":"","ref":"PlausibleWeb.Live.Components.Verification.html#render/1"},{"type":"function","title":"Attributes - PlausibleWeb.Live.Components.Verification.render/1","doc":"* `domain` (`:string`) (required)\n* `message` (`:string`) - Defaults to `\"We're visiting your site to ensure that everything is working\"`.\n* `super_admin?` (`:boolean`) - Defaults to `false`.\n* `finished?` (`:boolean`) - Defaults to `false`.\n* `success?` (`:boolean`) - Defaults to `false`.\n* `verification_state` (`Plausible.Verification.State`) - Defaults to `nil`.\n* `interpretation` (`Plausible.Verification.Diagnostics.Result`) - Defaults to `nil`.\n* `attempts` (`:integer`) - Defaults to `0`.\n* `flow` (`:string`) - Defaults to `\"\"`.\n* `installation_type` (`:string`) - Defaults to `nil`.\n* `awaiting_first_pageview?` (`:boolean`) - Defaults to `false`.","ref":"PlausibleWeb.Live.Components.Verification.html#render/1-attributes"},{"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.create_form/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#create_form/1"},{"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* `suffix` (`:string`)\n* `existing_goals` (`:list`)\n* `goal_options` (`:list`)\n* `goal` (`Plausible.Goal`) - Defaults to `nil`.\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.edit_form/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#edit_form/1"},{"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* `suffix` (`:string`)\n* `goal` (`Plausible.Goal`) - Defaults to `nil`.\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.revenue_goal_settings/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#revenue_goal_settings/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.suggest_event_names/3","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#suggest_event_names/3"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.Form.suggest_page_paths/2","doc":"","ref":"PlausibleWeb.Live.GoalSettings.Form.html#suggest_page_paths/2"},{"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.custom_event_description/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.List.html#custom_event_description/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.List.goal_description/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.List.html#goal_description/1"},{"type":"function","title":"PlausibleWeb.Live.GoalSettings.List.pageview_description/1","doc":"","ref":"PlausibleWeb.Live.GoalSettings.List.html#pageview_description/1"},{"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.Installation","doc":"User assistance module around Plausible installation instructions/onboarding","ref":"PlausibleWeb.Live.Installation.html"},{"type":"function","title":"PlausibleWeb.Live.Installation.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Installation.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Installation.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Installation.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Installation.handle_params/3","doc":"","ref":"PlausibleWeb.Live.Installation.html#handle_params/3"},{"type":"function","title":"PlausibleWeb.Live.Installation.mount/3","doc":"","ref":"PlausibleWeb.Live.Installation.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Installation.render/1","doc":"","ref":"PlausibleWeb.Live.Installation.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Installation.render_snippet_404/0","doc":"","ref":"PlausibleWeb.Live.Installation.html#render_snippet_404/0"},{"type":"function","title":"PlausibleWeb.Live.Installation.render_snippet_404/1","doc":"","ref":"PlausibleWeb.Live.Installation.html#render_snippet_404/1"},{"type":"function","title":"PlausibleWeb.Live.Installation.script_extension_params/0","doc":"","ref":"PlausibleWeb.Live.Installation.html#script_extension_params/0"},{"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.HostnameRules","doc":"LiveView allowing hostname Rules management","ref":"PlausibleWeb.Live.Shields.HostnameRules.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.send_flash/2","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#send_flash/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.suggest_hostnames/3","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#suggest_hostnames/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.HostnameRules.update/2","doc":"","ref":"PlausibleWeb.Live.Shields.HostnameRules.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.Shields.Hostnames","doc":"LiveView for Hostnames Shield","ref":"PlausibleWeb.Live.Shields.Hostnames.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.Hostnames.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Shields.Hostnames.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.Hostnames.mount/3","doc":"","ref":"PlausibleWeb.Live.Shields.Hostnames.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.Hostnames.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.Hostnames.html#render/1"},{"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.Shields.PageRules","doc":"LiveView allowing page Rules management","ref":"PlausibleWeb.Live.Shields.PageRules.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#render/1"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.send_flash/2","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#send_flash/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.suggest_page_paths/3","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#suggest_page_paths/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.PageRules.update/2","doc":"","ref":"PlausibleWeb.Live.Shields.PageRules.html#update/2"},{"type":"module","title":"PlausibleWeb.Live.Shields.Pages","doc":"LiveView for IP Addresses Shield","ref":"PlausibleWeb.Live.Shields.Pages.html"},{"type":"function","title":"PlausibleWeb.Live.Shields.Pages.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Shields.Pages.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Shields.Pages.mount/3","doc":"","ref":"PlausibleWeb.Live.Shields.Pages.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Shields.Pages.render/1","doc":"","ref":"PlausibleWeb.Live.Shields.Pages.html#render/1"},{"type":"module","title":"PlausibleWeb.Live.Sites","doc":"LiveView for sites index.","ref":"PlausibleWeb.Live.Sites.html"},{"type":"function","title":"PlausibleWeb.Live.Sites.check_feature_access/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#check_feature_access/2"},{"type":"function","title":"PlausibleWeb.Live.Sites.check_features/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#check_features/2"},{"type":"function","title":"PlausibleWeb.Live.Sites.check_needs_to_upgrade/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#check_needs_to_upgrade/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.ellipsis_menu/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#ellipsis_menu/1"},{"type":"function","title":"PlausibleWeb.Live.Sites.ensure_can_take_ownership/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#ensure_can_take_ownership/2"},{"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.has_sites?/1","doc":"","ref":"PlausibleWeb.Live.Sites.html#has_sites?/1"},{"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":"PlausibleWeb.Live.Sites.mount/3","doc":"","ref":"PlausibleWeb.Live.Sites.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Sites.owns_sites?/2","doc":"","ref":"PlausibleWeb.Live.Sites.html#owns_sites?/2"},{"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.Live.Verification","doc":"LiveView coordinating the site verification process.\nOnboarding new sites, renders a standalone component.\nEmbedded modal variant is available for general site settings.","ref":"PlausibleWeb.Live.Verification.html"},{"type":"function","title":"PlausibleWeb.Live.Verification.handle_event/3","doc":"","ref":"PlausibleWeb.Live.Verification.html#handle_event/3"},{"type":"function","title":"PlausibleWeb.Live.Verification.handle_info/2","doc":"","ref":"PlausibleWeb.Live.Verification.html#handle_info/2"},{"type":"function","title":"PlausibleWeb.Live.Verification.mount/3","doc":"","ref":"PlausibleWeb.Live.Verification.html#mount/3"},{"type":"function","title":"PlausibleWeb.Live.Verification.render/1","doc":"","ref":"PlausibleWeb.Live.Verification.html#render/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.Funnels","doc":"Controller for the Funnel resource under Plugins API","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.create/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#create/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.get/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#get/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.index/2","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#index/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.open_api_operation/1","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#open_api_operation/1"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.shared_security/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.html#shared_security/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Controllers.Funnels.shared_tags/0","doc":"","ref":"PlausibleWeb.Plugins.API.Controllers.Funnels.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.Funnel","doc":"OpenAPI schema for Funnel","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest","doc":"OpenAPI schema for Funnel creation request - get or creates goals along the way","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.CreateRequest.html#t:t/0"},{"type":"module","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse","doc":"OpenAPI schema for Funnel list response","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.schema/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.html#schema/0"},{"type":"type","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.t/0","doc":"","ref":"PlausibleWeb.Plugins.API.Schemas.Funnel.ListResponse.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.Funnel","doc":"View for rendering Funnels in the Plugins API","ref":"PlausibleWeb.Plugins.API.Views.Funnel.html"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Funnel.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.Plugins.API.Views.Funnel.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Funnel.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.Plugins.API.Views.Funnel.html#render/2"},{"type":"function","title":"PlausibleWeb.Plugins.API.Views.Funnel.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.Funnel.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.AuthorizePublicAPI","doc":"Plug for authorizing access to Stats and Sites APIs.\n\nThe plug expects `:api_scope` to be provided in the assigns. The scope\nwill then be used to check for API key validity. The assign can be\nprovided in the router configuration in a following way:\n\n scope \"/api/v1/stats\", PlausibleWeb.Api, assigns: %{api_scope: \"some:scope:*\"} do\n pipe_through [:public_api, PlausibleWeb.Plugs.AuthorizePublicAPI]\n\n # route definitions follow\n # ...\n end\n\nThe scope from `:api_scope` is checked for match against all scopes from API key's\n`scopes` field. If the scope is among `@implicit_scopes`, it's considered to be\npresent for any valid API key. Scopes are checked for match by prefix, so if we have\n`some:scope:*` in matching route `:api_scope` and the API key has `some:*` in its\n`scopes` field, they will match.\n\nAfter a match is found, additional verification can be conducted, like in case of\n`stats:read:*`, where valid site ID is expected among parameters too.\n\nAll API requests are rate limited per API key, enforcing a given hourly request limit.","ref":"PlausibleWeb.Plugs.AuthorizePublicAPI.html"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizePublicAPI.call/2","doc":"","ref":"PlausibleWeb.Plugs.AuthorizePublicAPI.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizePublicAPI.init/1","doc":"","ref":"PlausibleWeb.Plugs.AuthorizePublicAPI.html#init/1"},{"type":"module","title":"PlausibleWeb.Plugs.AuthorizeSiteAccess","doc":"Plug restricting access to site and shared link, when present.\n\nIn order to permit access to site regardless of role:\n\n```elixir\nplug AuthorizeSiteAccess\n```\n\nor\n\n```elixir\nplug AuthorizeSiteAccess, :all_roles\n```\n\nPermit access for a subset of roles only:\n\n```elixir\nplug AuthorizeSiteAccess, [:admin, :owner, :super_admin]\n```\n\nPermit access using a custom site param:\n\n```elixir\nplug AuthorizeSiteAccess, {[:admin, :owner, :super_admin], \"site_id\"}\n```\n\nor in case where any role is allowed:\n\n```elixir\nplug AuthorizeSiteAccess, {:all_roles, \"site_id\"}\n```","ref":"PlausibleWeb.Plugs.AuthorizeSiteAccess.html"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizeSiteAccess.call/2","doc":"","ref":"PlausibleWeb.Plugs.AuthorizeSiteAccess.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.AuthorizeSiteAccess.init/1","doc":"","ref":"PlausibleWeb.Plugs.AuthorizeSiteAccess.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.Plugs.UserSessionTouch","doc":"Plug for bumping timeout on user session on every dashboard request.","ref":"PlausibleWeb.Plugs.UserSessionTouch.html"},{"type":"function","title":"PlausibleWeb.Plugs.UserSessionTouch.call/2","doc":"","ref":"PlausibleWeb.Plugs.UserSessionTouch.html#call/2"},{"type":"function","title":"PlausibleWeb.Plugs.UserSessionTouch.init/1","doc":"","ref":"PlausibleWeb.Plugs.UserSessionTouch.html#init/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.docs_stats_api/2","doc":"","ref":"PlausibleWeb.Router.html#docs_stats_api/2"},{"type":"function","title":"PlausibleWeb.Router.external_api/2","doc":"","ref":"PlausibleWeb.Router.html#external_api/2"},{"type":"function","title":"PlausibleWeb.Router.flags/2","doc":"","ref":"PlausibleWeb.Router.html#flags/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.SettingsController","doc":"","ref":"PlausibleWeb.SettingsController.html"},{"type":"function","title":"PlausibleWeb.SettingsController.api_keys/2","doc":"","ref":"PlausibleWeb.SettingsController.html#api_keys/2"},{"type":"function","title":"PlausibleWeb.SettingsController.cancel_update_email/2","doc":"","ref":"PlausibleWeb.SettingsController.html#cancel_update_email/2"},{"type":"function","title":"PlausibleWeb.SettingsController.create_api_key/2","doc":"","ref":"PlausibleWeb.SettingsController.html#create_api_key/2"},{"type":"function","title":"PlausibleWeb.SettingsController.danger_zone/2","doc":"","ref":"PlausibleWeb.SettingsController.html#danger_zone/2"},{"type":"function","title":"PlausibleWeb.SettingsController.delete_api_key/2","doc":"","ref":"PlausibleWeb.SettingsController.html#delete_api_key/2"},{"type":"function","title":"PlausibleWeb.SettingsController.delete_session/2","doc":"","ref":"PlausibleWeb.SettingsController.html#delete_session/2"},{"type":"function","title":"PlausibleWeb.SettingsController.index/2","doc":"","ref":"PlausibleWeb.SettingsController.html#index/2"},{"type":"function","title":"PlausibleWeb.SettingsController.invoices/2","doc":"","ref":"PlausibleWeb.SettingsController.html#invoices/2"},{"type":"function","title":"PlausibleWeb.SettingsController.new_api_key/2","doc":"","ref":"PlausibleWeb.SettingsController.html#new_api_key/2"},{"type":"function","title":"PlausibleWeb.SettingsController.preferences/2","doc":"","ref":"PlausibleWeb.SettingsController.html#preferences/2"},{"type":"function","title":"PlausibleWeb.SettingsController.security/2","doc":"","ref":"PlausibleWeb.SettingsController.html#security/2"},{"type":"function","title":"PlausibleWeb.SettingsController.subscription/2","doc":"","ref":"PlausibleWeb.SettingsController.html#subscription/2"},{"type":"function","title":"PlausibleWeb.SettingsController.update_email/2","doc":"","ref":"PlausibleWeb.SettingsController.html#update_email/2"},{"type":"function","title":"PlausibleWeb.SettingsController.update_name/2","doc":"","ref":"PlausibleWeb.SettingsController.html#update_name/2"},{"type":"function","title":"PlausibleWeb.SettingsController.update_password/2","doc":"","ref":"PlausibleWeb.SettingsController.html#update_password/2"},{"type":"function","title":"PlausibleWeb.SettingsController.update_theme/2","doc":"","ref":"PlausibleWeb.SettingsController.html#update_theme/2"},{"type":"module","title":"PlausibleWeb.SettingsView","doc":"","ref":"PlausibleWeb.SettingsView.html"},{"type":"function","title":"PlausibleWeb.SettingsView.__resource__/0","doc":"The resource name, as an atom, for this view","ref":"PlausibleWeb.SettingsView.html#__resource__/0"},{"type":"function","title":"PlausibleWeb.SettingsView.api_keys.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#api_keys.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.danger_zone.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#danger_zone.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.format_invoices/1","doc":"","ref":"PlausibleWeb.SettingsView.html#format_invoices/1"},{"type":"function","title":"PlausibleWeb.SettingsView.invoices.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#invoices.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.new_api_key.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#new_api_key.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.preferences.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#preferences.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.present_subscription_status/1","doc":"","ref":"PlausibleWeb.SettingsView.html#present_subscription_status/1"},{"type":"function","title":"PlausibleWeb.SettingsView.render/2","doc":"Renders the given template locally.","ref":"PlausibleWeb.SettingsView.html#render/2"},{"type":"function","title":"PlausibleWeb.SettingsView.security.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#security.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.subscription.html/1","doc":"","ref":"PlausibleWeb.SettingsView.html#subscription.html/1"},{"type":"function","title":"PlausibleWeb.SettingsView.subscription_colors/1","doc":"","ref":"PlausibleWeb.SettingsView.html#subscription_colors/1"},{"type":"function","title":"PlausibleWeb.SettingsView.subscription_interval/1","doc":"","ref":"PlausibleWeb.SettingsView.html#subscription_interval/1"},{"type":"function","title":"PlausibleWeb.SettingsView.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.SettingsView.html#template_not_found/2"},{"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_by_user/2","doc":"","ref":"PlausibleWeb.Site.MembershipController.html#remove_member_by_user/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_by_user/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_by_user/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_traffic_change_notification_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#add_traffic_change_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.csv_import/2","doc":"","ref":"PlausibleWeb.SiteController.html#csv_import/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_traffic_change_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#disable_traffic_change_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.download_export/2","doc":"","ref":"PlausibleWeb.SiteController.html#download_export/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_traffic_change_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#enable_traffic_change_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.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_traffic_change_notification_recipient/2","doc":"","ref":"PlausibleWeb.SiteController.html#remove_traffic_change_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_traffic_change_notification/2","doc":"","ref":"PlausibleWeb.SiteController.html#update_traffic_change_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.csv_import.html/1","doc":"","ref":"PlausibleWeb.SiteView.html#csv_import.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.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_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.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":"module","title":"PlausibleWeb.TestController","doc":"","ref":"PlausibleWeb.TestController.html"},{"type":"function","title":"PlausibleWeb.TestController.api_basic/2","doc":"","ref":"PlausibleWeb.TestController.html#api_basic/2"},{"type":"function","title":"PlausibleWeb.TestController.browser_basic/2","doc":"","ref":"PlausibleWeb.TestController.html#browser_basic/2"},{"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":"module","title":"PlausibleWeb.UserAuth","doc":"Functions for user session management.","ref":"PlausibleWeb.UserAuth.html"},{"type":"function","title":"PlausibleWeb.UserAuth.get_user_session/1","doc":"","ref":"PlausibleWeb.UserAuth.html#get_user_session/1"},{"type":"function","title":"PlausibleWeb.UserAuth.log_in_user/3","doc":"","ref":"PlausibleWeb.UserAuth.html#log_in_user/3"},{"type":"function","title":"PlausibleWeb.UserAuth.log_out_user/1","doc":"","ref":"PlausibleWeb.UserAuth.html#log_out_user/1"},{"type":"function","title":"PlausibleWeb.UserAuth.revoke_all_user_sessions/2","doc":"","ref":"PlausibleWeb.UserAuth.html#revoke_all_user_sessions/2"},{"type":"function","title":"PlausibleWeb.UserAuth.revoke_user_session/2","doc":"","ref":"PlausibleWeb.UserAuth.html#revoke_user_session/2"},{"type":"function","title":"PlausibleWeb.UserAuth.set_logged_in_cookie/1","doc":"Sets the `logged_in` cookie share with the static site for determining\nwhether client is authenticated.\n\nAs it's a separate cookie, there's a chance it might fall out of sync\nwith session cookie state due to manual deletion or premature expiration.","ref":"PlausibleWeb.UserAuth.html#set_logged_in_cookie/1"},{"type":"function","title":"PlausibleWeb.UserAuth.touch_user_session/2","doc":"","ref":"PlausibleWeb.UserAuth.html#touch_user_session/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, 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 thousands of 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 [small](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. Track ecommerce revenue, outbound link clicks, file downloads and 404 error pages. Increase conversions using funnel analysis.\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-4BEA778F.js b/dist/sidebar_items-DD84C8DF.js similarity index 60% rename from dist/sidebar_items-4BEA778F.js rename to dist/sidebar_items-DD84C8DF.js index 923486cde2..aedff1b3db 100644 --- a/dist/sidebar_items-4BEA778F.js +++ b/dist/sidebar_items-DD84C8DF.js @@ -1 +1 @@ -sidebarNodes={"modules":[{"id":"ObanErrorReporter","deprecated":false,"group":"","title":"ObanErrorReporter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/4","deprecated":false,"title":"handle_event(name, measurements, metadata, _)","anchor":"handle_event/4"}],"key":"functions"}]},{"id":"Plausible","deprecated":false,"group":"","title":"Plausible","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"ce?/0","deprecated":false,"title":"ce?()","anchor":"ce?/0"},{"id":"ee?/0","deprecated":false,"title":"ee?()","anchor":"ee?/0"},{"id":"on_ce/1","deprecated":false,"title":"on_ce(clauses)","anchor":"on_ce/1"},{"id":"on_ee/1","deprecated":false,"title":"on_ee(clauses)","anchor":"on_ee/1"},{"id":"product_name/0","deprecated":false,"title":"product_name()","anchor":"product_name/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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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":"Types","nodes":[{"id":"rate_limit_type/0","deprecated":false,"title":"rate_limit_type()","anchor":"t:rate_limit_type/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"check_password/2","deprecated":false,"title":"check_password(user, password)","anchor":"check_password/2"},{"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":"get_user_by/1","deprecated":false,"title":"get_user_by(opts)","anchor":"get_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":"rate_limit/2","deprecated":false,"title":"rate_limit(limit_type, key)","anchor":"rate_limit/2"},{"id":"rate_limits/0","deprecated":false,"title":"rate_limits()","anchor":"rate_limits/0"},{"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_or_team)","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_or_team)","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":"force_disable/1","deprecated":false,"title":"force_disable(user)","anchor":"force_disable/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":"name_changeset/2","deprecated":false,"title":"name_changeset(user, attrs \\\\ %{})","anchor":"name_changeset/2"},{"id":"new/1","deprecated":false,"title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"password_changeset/2","deprecated":false,"title":"password_changeset(user, params \\\\ %{})","anchor":"password_changeset/2"},{"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":"theme_changeset/2","deprecated":false,"title":"theme_changeset(user, attrs \\\\ %{})","anchor":"theme_changeset/2"},{"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":"after_update/2","deprecated":false,"title":"after_update(conn, user)","anchor":"after_update/2"},{"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":"disable_2fa/1","deprecated":false,"title":"disable_2fa(user)","anchor":"disable_2fa/1"},{"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.Auth.UserSession","deprecated":false,"group":"","title":"Plausible.Auth.UserSession","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new_session/3","deprecated":false,"title":"new_session(user, device, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"new_session/3"},{"id":"timeout_duration/0","deprecated":false,"title":"timeout_duration()","anchor":"timeout_duration/0"},{"id":"touch_session/2","deprecated":false,"title":"touch_session(session, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"touch_session/2"}],"key":"functions"}]},{"id":"Plausible.Auth.UserSessions","deprecated":false,"group":"","title":"Plausible.Auth.UserSessions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"last_used_humanize/2","deprecated":false,"title":"last_used_humanize(user_session, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"last_used_humanize/2"},{"id":"list_for_user/2","deprecated":false,"title":"list_for_user(user, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"list_for_user/2"}],"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)","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)","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":"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(model, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Billing.EnterprisePlanAdmin","deprecated":false,"group":"","title":"Plausible.Billing.EnterprisePlanAdmin","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(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(arg1)","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/3","deprecated":false,"title":"toggle(t, t, t)","anchor":"c:toggle/3"},{"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/2","deprecated":false,"title":"fetch_prices(product_ids, customer_ip)","anchor":"fetch_prices/2"},{"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(subscription, opts \\\\ [])","anchor":"available_plans_for/2"},{"id":"business_plans_for/1","deprecated":false,"title":"business_plans_for(subscription)","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/2","deprecated":false,"title":"get_price_for(enterprise_plan, customer_ip)","anchor":"get_price_for/2"},{"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(subscription)","anchor":"growth_plans_for/1"},{"id":"latest_enterprise_plan_with_price/2","deprecated":false,"title":"latest_enterprise_plan_with_price(user, customer_ip)","anchor":"latest_enterprise_plan_with_price/2"},{"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_by_usage/2","deprecated":false,"title":"suggest_by_usage(subscription, usage_during_cycle)","anchor":"suggest_by_usage/2"},{"id":"with_prices/2","deprecated":false,"title":"with_prices(plans, customer_ip \\\\ \"127.0.0.1\")","anchor":"with_prices/2"},{"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":"Functions","nodes":[{"id":"below_limit?/2","deprecated":false,"title":"below_limit?(usage, limit)","anchor":"below_limit?/2"},{"id":"eligible_for_upgrade?/1","deprecated":false,"title":"eligible_for_upgrade?(usage)","anchor":"eligible_for_upgrade?/1"},{"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_feature_access/2","deprecated":false,"title":"ensure_feature_access(usage, plan)","anchor":"ensure_feature_access/2"},{"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":"exceeded_cycles/2","deprecated":false,"title":"exceeded_cycles(cycles_usage, allowed_volume)","anchor":"exceeded_cycles/2"},{"id":"exceeds_last_two_usage_cycles?/2","deprecated":false,"title":"exceeds_last_two_usage_cycles?(cycles_usage, allowed_volume)","anchor":"exceeds_last_two_usage_cycles?/2"},{"id":"suggest_tier/3","deprecated":false,"title":"suggest_tier(usage, highest_growth_plan, highest_business_plan)","anchor":"suggest_tier/3"},{"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.Adapter","deprecated":false,"group":"","title":"Plausible.Cache.Adapter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/3","deprecated":false,"title":"child_spec(name, child_id, opts \\\\ [])","anchor":"child_spec/3"},{"id":"delete/2","deprecated":false,"title":"delete(cache_name, key)","anchor":"delete/2"},{"id":"fetch/3","deprecated":false,"title":"fetch(cache_name, key, fallback_fn)","anchor":"fetch/3"},{"id":"get/2","deprecated":false,"title":"get(cache_name, key)","anchor":"get/2"},{"id":"get/3","deprecated":false,"title":"get(cache_name, key, fallback_fn)","anchor":"get/3"},{"id":"keys/1","deprecated":false,"title":"keys(cache_name)","anchor":"keys/1"},{"id":"put/4","deprecated":false,"title":"put(cache_name, key, value, opts \\\\ [])","anchor":"put/4"},{"id":"put_many/2","deprecated":false,"title":"put_many(cache_name, items)","anchor":"put_many/2"},{"id":"size/1","deprecated":false,"title":"size(cache_name)","anchor":"size/1"},{"id":"with_lock/4","deprecated":false,"title":"with_lock(cache_name, key, timeout, fun)","anchor":"with_lock/4"}],"key":"functions"}]},{"id":"Plausible.Cache.Stats","deprecated":false,"group":"","title":"Plausible.Cache.Stats","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bump/2","deprecated":false,"title":"bump(cache_name, type)","anchor":"bump/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"gather/1","deprecated":false,"title":"gather(cache_name)","anchor":"gather/1"},{"id":"handle_telemetry_event/4","deprecated":false,"title":"handle_telemetry_event(list, measurments, map, _)","anchor":"handle_telemetry_event/4"},{"id":"hit_rate/1","deprecated":false,"title":"hit_rate(cache_name)","anchor":"hit_rate/1"},{"id":"init/1","deprecated":false,"title":"init(atom)","anchor":"init/1"},{"id":"size/1","deprecated":false,"title":"size(cache_name)","anchor":"size/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts)","anchor":"start_link/1"}],"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":"merge_session/2","deprecated":false,"title":"merge_session(event, session)","anchor":"merge_session/2"},{"id":"new/1","deprecated":false,"title":"new(attrs)","anchor":"new/1"}],"key":"functions"}]},{"id":"Plausible.ClickhouseLocationData","deprecated":false,"group":"","title":"Plausible.ClickhouseLocationData","sections":[]},{"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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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/2","deprecated":false,"title":"parallel_tasks(queries, opts \\\\ [])","anchor":"parallel_tasks/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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_bool_from_path_or_env/3","deprecated":false,"title":"get_bool_from_path_or_env(config_dir, var_name, default \\\\ nil)","anchor":"get_bool_from_path_or_env/3"},{"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.CrmExtensions","deprecated":false,"group":"","title":"Plausible.CrmExtensions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"javascripts/1","deprecated":false,"title":"javascripts(arg1)","anchor":"javascripts/1"}],"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.AcquisitionChannel","deprecated":false,"group":"","title":"Plausible.DataMigration.AcquisitionChannel","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/3","deprecated":false,"title":"confirm(message, func, default_choice \\\\ :yes)","anchor":"confirm/3"},{"id":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"}],"key":"functions"}]},{"id":"Plausible.DataMigration.BackfillTeams","deprecated":false,"group":"","title":"Plausible.DataMigration.BackfillTeams","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_orphaned_teams/1","deprecated":false,"title":"delete_orphaned_teams(teams)","anchor":"delete_orphaned_teams/1"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"}],"key":"functions"}]},{"id":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource","deprecated":false,"group":"","title":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(timeout \\\\ 60000)","anchor":"run/1"}],"key":"functions"}]},{"id":"Plausible.DataMigration.ClickhouseRepo","deprecated":false,"group":"","title":"Plausible.DataMigration.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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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.LocationsSync","deprecated":false,"group":"","title":"Plausible.DataMigration.LocationsSync","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/3","deprecated":false,"title":"confirm(message, func, default_choice \\\\ :yes)","anchor":"confirm/3"},{"id":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"out_of_date?/0","deprecated":false,"title":"out_of_date?()","anchor":"out_of_date?/0"},{"id":"run/0","deprecated":false,"title":"run()","anchor":"run/0"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"}],"key":"functions"}]},{"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":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"}],"key":"functions"}]},{"id":"Plausible.DataMigration.PopulateEventSessionColumns","deprecated":false,"group":"","title":"Plausible.DataMigration.PopulateEventSessionColumns","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/3","deprecated":false,"title":"confirm(message, func, default_choice \\\\ :yes)","anchor":"confirm/3"},{"id":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"kill/1","deprecated":false,"title":"kill(opts \\\\ [])","anchor":"kill/1"},{"id":"report_progress/1","deprecated":false,"title":"report_progress(opts \\\\ [])","anchor":"report_progress/1"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"},{"id":"wait_until_mutations_complete/1","deprecated":false,"title":"wait_until_mutations_complete(opts \\\\ [])","anchor":"wait_until_mutations_complete/1"}],"key":"functions"}]},{"id":"Plausible.DataMigration.PostgresRepo","deprecated":false,"group":"","title":"Plausible.DataMigration.PostgresRepo","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":"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":"start/2","deprecated":false,"title":"start(url, opts \\\\ [])","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":"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.DataMigration.SiteImports","deprecated":false,"group":"","title":"Plausible.DataMigration.SiteImports","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"}],"key":"functions"}]},{"id":"Plausible.DataMigration.TeamsConsitencyCheck","deprecated":false,"group":"","title":"Plausible.DataMigration.TeamsConsitencyCheck","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/0","deprecated":false,"title":"run()","anchor":"run/0"}],"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":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"}],"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.Ecto.Types.CompiledRegex","deprecated":false,"group":"","title":"Plausible.Ecto.Types.CompiledRegex","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.Exports","deprecated":false,"group":"","title":"Plausible.Exports","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"export/0","deprecated":false,"title":"export()","anchor":"t:export/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"archive_filename/2","deprecated":false,"title":"archive_filename(domain, created_on)","anchor":"archive_filename/2"},{"id":"content_disposition/1","deprecated":false,"title":"content_disposition(filename)","anchor":"content_disposition/1"},{"id":"date_range/2","deprecated":false,"title":"date_range(site_id, timezone)","anchor":"date_range/2"},{"id":"delete_local_export/1","deprecated":false,"title":"delete_local_export(site_id)","anchor":"delete_local_export/1"},{"id":"delete_s3_export!/1","deprecated":false,"title":"delete_s3_export!(site_id)","anchor":"delete_s3_export!/1"},{"id":"export_queries/2","deprecated":false,"title":"export_queries(site_id, opts \\\\ [])","anchor":"export_queries/2"},{"id":"get_last_export_job/1","deprecated":false,"title":"get_last_export_job(site_id)","anchor":"get_last_export_job/1"},{"id":"get_local_export/3","deprecated":false,"title":"get_local_export(site_id, domain, timezone)","anchor":"get_local_export/3"},{"id":"get_s3_export!/2","deprecated":false,"title":"get_s3_export!(site_id, retries \\\\ 0)","anchor":"get_s3_export!/2"},{"id":"oban_listen/0","deprecated":false,"title":"oban_listen()","anchor":"oban_listen/0"},{"id":"schedule_local_export/2","deprecated":false,"title":"schedule_local_export(site_id, email_to)","anchor":"schedule_local_export/2"},{"id":"schedule_s3_export/2","deprecated":false,"title":"schedule_s3_export(site_id, email_to)","anchor":"schedule_s3_export/2"},{"id":"stream_archive/3","deprecated":false,"title":"stream_archive(conn, named_queries, opts \\\\ [])","anchor":"stream_archive/3"}],"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":"drop_notification_factory/0","deprecated":false,"title":"drop_notification_factory()","anchor":"drop_notification_factory/0"},{"id":"enterprise_plan_factory/0","deprecated":false,"title":"enterprise_plan_factory()","anchor":"enterprise_plan_factory/0"},{"id":"event_factory/1","deprecated":false,"title":"event_factory(attrs)","anchor":"event_factory/1"},{"id":"factory/1","deprecated":false,"title":"factory(factory_name)","anchor":"factory/1"},{"id":"goal_factory/1","deprecated":false,"title":"goal_factory(attrs)","anchor":"goal_factory/1"},{"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":"guest_invitation_factory/0","deprecated":false,"title":"guest_invitation_factory()","anchor":"guest_invitation_factory/0"},{"id":"guest_membership_factory/0","deprecated":false,"title":"guest_membership_factory()","anchor":"guest_membership_factory/0"},{"id":"imported_browsers_factory/0","deprecated":false,"title":"imported_browsers_factory()","anchor":"imported_browsers_factory/0"},{"id":"imported_custom_events_factory/0","deprecated":false,"title":"imported_custom_events_factory()","anchor":"imported_custom_events_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":"pageleave_factory/1","deprecated":false,"title":"pageleave_factory(attrs)","anchor":"pageleave_factory/1"},{"id":"pageview_factory/1","deprecated":false,"title":"pageview_factory(attrs)","anchor":"pageview_factory/1"},{"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":"site_transfer_factory/0","deprecated":false,"title":"site_transfer_factory()","anchor":"site_transfer_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":"team_factory/0","deprecated":false,"title":"team_factory()","anchor":"team_factory/0"},{"id":"team_invitation_factory/0","deprecated":false,"title":"team_invitation_factory()","anchor":"team_invitation_factory/0"},{"id":"team_membership_factory/0","deprecated":false,"title":"team_membership_factory()","anchor":"team_membership_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.File","deprecated":false,"group":"","title":"Plausible.File","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"mv!/2","deprecated":false,"title":"mv!(source, destination)","anchor":"mv!/2"}],"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_steps/2","deprecated":false,"title":"put_steps(changeset, steps)","anchor":"put_steps/2"}],"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, goal_or_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":"edit_changeset/3","deprecated":false,"title":"edit_changeset(funnel, name, steps)","anchor":"edit_changeset/3"},{"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"},{"id":"update/3","deprecated":false,"title":"update(funnel, name, steps)","anchor":"update/3"},{"id":"with_goals_query/1","deprecated":false,"title":"with_goals_query(site)","anchor":"with_goals_query/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"},{"id":"display_name/1","deprecated":false,"title":"display_name(goal)","anchor":"display_name/1"},{"id":"max_event_name_length/0","deprecated":false,"title":"max_event_name_length()","anchor":"max_event_name_length/0"},{"id":"type/1","deprecated":false,"title":"type(map)","anchor":"type/1"}],"key":"functions"}]},{"id":"Plausible.Goal.Revenue","deprecated":false,"group":"","title":"Plausible.Goal.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"currency_option/1","deprecated":false,"title":"currency_option(code)","anchor":"currency_option/1"},{"id":"currency_options/0","deprecated":false,"title":"currency_options()","anchor":"currency_options/0"},{"id":"display/1","deprecated":false,"title":"display(code)","anchor":"display/1"},{"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":"batch_create_event_goals/2","deprecated":false,"title":"batch_create_event_goals(names, site)","anchor":"batch_create_event_goals/2"},{"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":"create_404/1","deprecated":false,"title":"create_404(site)","anchor":"create_404/1"},{"id":"create_file_downloads/1","deprecated":false,"title":"create_file_downloads(site)","anchor":"create_file_downloads/1"},{"id":"create_outbound_links/1","deprecated":false,"title":"create_outbound_links(site)","anchor":"create_outbound_links/1"},{"id":"delete/2","deprecated":false,"title":"delete(id, site_id)","anchor":"delete/2"},{"id":"delete_404/1","deprecated":false,"title":"delete_404(site)","anchor":"delete_404/1"},{"id":"delete_file_downloads/1","deprecated":false,"title":"delete_file_downloads(site)","anchor":"delete_file_downloads/1"},{"id":"delete_outbound_links/1","deprecated":false,"title":"delete_outbound_links(site)","anchor":"delete_outbound_links/1"},{"id":"find_or_create/2","deprecated":false,"title":"find_or_create(site, params)","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"},{"id":"get/2","deprecated":false,"title":"get(site, id)","anchor":"get/2"},{"id":"list_revenue_goals/1","deprecated":false,"title":"list_revenue_goals(site)","anchor":"list_revenue_goals/1"},{"id":"update/2","deprecated":false,"title":"update(goal, params)","anchor":"update/2"}],"key":"functions"}]},{"id":"Plausible.Google.API","deprecated":false,"group":"","title":"Plausible.Google.API","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_access_token!/1","deprecated":false,"title":"fetch_access_token!(code)","anchor":"fetch_access_token!/1"},{"id":"fetch_stats/4","deprecated":false,"title":"fetch_stats(site, query, pagination, search)","anchor":"fetch_stats/4"},{"id":"fetch_verified_properties/1","deprecated":false,"title":"fetch_verified_properties(auth)","anchor":"fetch_verified_properties/1"},{"id":"get_analytics_end_date/2","deprecated":false,"title":"get_analytics_end_date(access_token, property)","anchor":"get_analytics_end_date/2"},{"id":"get_analytics_start_date/2","deprecated":false,"title":"get_analytics_start_date(access_token, property)","anchor":"get_analytics_start_date/2"},{"id":"get_property/2","deprecated":false,"title":"get_property(access_token, property)","anchor":"get_property/2"},{"id":"import_authorize_url/1","deprecated":false,"title":"import_authorize_url(site_id)","anchor":"import_authorize_url/1"},{"id":"list_properties/1","deprecated":false,"title":"list_properties(access_token)","anchor":"list_properties/1"},{"id":"maybe_refresh_token/1","deprecated":false,"title":"maybe_refresh_token(auth)","anchor":"maybe_refresh_token/1"},{"id":"property?/1","deprecated":false,"title":"property?(value)","anchor":"property?/1"},{"id":"search_console_authorize_url/1","deprecated":false,"title":"search_console_authorize_url(site_id)","anchor":"search_console_authorize_url/1"}],"key":"functions"}]},{"id":"Plausible.Google.API.Mock","deprecated":false,"group":"","title":"Plausible.Google.API.Mock","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_stats/4","deprecated":false,"title":"fetch_stats(auth, query, pagination, search)","anchor":"fetch_stats/4"}],"key":"functions"}]},{"id":"Plausible.Google.GA4.API","deprecated":false,"group":"","title":"Plausible.Google.GA4.API","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"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":"get_analytics_end_date/2","deprecated":false,"title":"get_analytics_end_date(access_token, property)","anchor":"get_analytics_end_date/2"},{"id":"get_analytics_start_date/2","deprecated":false,"title":"get_analytics_start_date(access_token, property)","anchor":"get_analytics_start_date/2"},{"id":"get_property/2","deprecated":false,"title":"get_property(access_token, lookup_property)","anchor":"get_property/2"},{"id":"import_analytics/4","deprecated":false,"title":"import_analytics(date_range, property, auth, opts)","anchor":"import_analytics/4"},{"id":"list_properties/1","deprecated":false,"title":"list_properties(access_token)","anchor":"list_properties/1"}],"key":"functions"}]},{"id":"Plausible.Google.GA4.HTTP","deprecated":false,"group":"","title":"Plausible.Google.GA4.HTTP","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_analytics_end_date/2","deprecated":false,"title":"get_analytics_end_date(access_token, property)","anchor":"get_analytics_end_date/2"},{"id":"get_analytics_start_date/2","deprecated":false,"title":"get_analytics_start_date(access_token, property)","anchor":"get_analytics_start_date/2"},{"id":"get_property/2","deprecated":false,"title":"get_property(access_token, property)","anchor":"get_property/2"},{"id":"get_report/1","deprecated":false,"title":"get_report(report_request)","anchor":"get_report/1"},{"id":"list_accounts_for_user/1","deprecated":false,"title":"list_accounts_for_user(access_token)","anchor":"list_accounts_for_user/1"}],"key":"functions"}]},{"id":"Plausible.Google.GA4.ReportRequest","deprecated":false,"group":"","title":"Plausible.Google.GA4.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.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":"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, pagination, search_console_filters)","anchor":"list_stats/5"},{"id":"refresh_auth_token/1","deprecated":false,"title":"refresh_auth_token(refresh_token)","anchor":"refresh_auth_token/1"}],"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.HelpScout","deprecated":false,"group":"","title":"Plausible.HelpScout","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"signature_error/0","deprecated":false,"title":"signature_error()","anchor":"t:signature_error/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_details_for_customer/1","deprecated":false,"title":"get_details_for_customer(customer_id)","anchor":"get_details_for_customer/1"},{"id":"get_details_for_emails/2","deprecated":false,"title":"get_details_for_emails(emails, customer_id)","anchor":"get_details_for_emails/2"},{"id":"search_users/2","deprecated":false,"title":"search_users(term, customer_id)","anchor":"search_users/2"},{"id":"signature_errors/0","deprecated":false,"title":"signature_errors()","anchor":"signature_errors/0"},{"id":"validate_signature/1","deprecated":false,"title":"validate_signature(conn)","anchor":"validate_signature/1"}],"key":"functions"}]},{"id":"Plausible.HelpScout.Vault","deprecated":false,"group":"","title":"Plausible.HelpScout.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.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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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":"clamp_dates/3","deprecated":false,"title":"clamp_dates(site, start_date, end_date)","anchor":"clamp_dates/3"},{"id":"clamp_dates/4","deprecated":false,"title":"clamp_dates(occupied_ranges, cutoff_date, start_date, end_date)","anchor":"clamp_dates/4"},{"id":"delete_imports_for_site/1","deprecated":false,"title":"delete_imports_for_site(site)","anchor":"delete_imports_for_site/1"},{"id":"get_cutoff_date/1","deprecated":false,"title":"get_cutoff_date(site)","anchor":"get_cutoff_date/1"},{"id":"get_import/2","deprecated":false,"title":"get_import(site, import_id)","anchor":"get_import/2"},{"id":"get_imports_date_range/1","deprecated":false,"title":"get_imports_date_range(site)","anchor":"get_imports_date_range/1"},{"id":"get_legacy_import/1","deprecated":false,"title":"get_legacy_import(site)","anchor":"get_legacy_import/1"},{"id":"get_occupied_date_ranges/1","deprecated":false,"title":"get_occupied_date_ranges(site)","anchor":"get_occupied_date_ranges/1"},{"id":"goals_with_path/0","deprecated":false,"title":"goals_with_path()","anchor":"goals_with_path/0"},{"id":"goals_with_url/0","deprecated":false,"title":"goals_with_url()","anchor":"goals_with_url/0"},{"id":"imported_custom_props/0","deprecated":false,"title":"imported_custom_props()","anchor":"imported_custom_props/0"},{"id":"list_all_imports/2","deprecated":false,"title":"list_all_imports(site, status \\\\ nil)","anchor":"list_all_imports/2"},{"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":"other_imports_in_progress?/1","deprecated":false,"title":"other_imports_in_progress?(site_import)","anchor":"other_imports_in_progress?/1"},{"id":"schemas/0","deprecated":false,"title":"schemas()","anchor":"schemas/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/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"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":"date_range/1","deprecated":false,"title":"date_range(uploads)","anchor":"date_range/1"},{"id":"extract_table/1","deprecated":false,"title":"extract_table(filename)","anchor":"extract_table/1"},{"id":"local_dir/1","deprecated":false,"title":"local_dir(site_id)","anchor":"local_dir/1"},{"id":"new_import/3","deprecated":false,"title":"new_import(site, user, opts)","anchor":"new_import/3"},{"id":"parse_filename!/1","deprecated":false,"title":"parse_filename!(filename)","anchor":"parse_filename!/1"},{"id":"valid_filename?/1","deprecated":false,"title":"valid_filename?(filename)","anchor":"valid_filename?/1"}],"key":"functions"}]},{"id":"Plausible.Imported.GoogleAnalytics4","deprecated":false,"group":"","title":"Plausible.Imported.GoogleAnalytics4","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.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/2","deprecated":false,"title":"before_start(t, t)","anchor":"c:before_start/2"},{"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":"importing/0","deprecated":false,"title":"importing()","anchor":"importing/0"},{"id":"label/1","deprecated":false,"title":"label(map)","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":"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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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":"clustered_table?/1","deprecated":false,"title":"clustered_table?(table)","anchor":"clustered_table?/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":"replica_count/1","deprecated":false,"title":"replica_count(table)","anchor":"replica_count/1"},{"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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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.Acquisition","deprecated":false,"group":"","title":"Plausible.Ingestion.Acquisition","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_channel/5","deprecated":false,"title":"get_channel(source, utm_medium, utm_campaign, utm_source, click_id_param)","anchor":"get_channel/5"},{"id":"source_categories/0","deprecated":false,"title":"source_categories()","anchor":"source_categories/0"}],"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/2","deprecated":false,"title":"build_and_buffer(request, context \\\\ [])","anchor":"build_and_buffer/2"},{"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"},{"id":"telemetry_pipeline_step_duration/0","deprecated":false,"title":"telemetry_pipeline_step_duration()","anchor":"telemetry_pipeline_step_duration/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.Ingestion.Source","deprecated":false,"group":"","title":"Plausible.Ingestion.Source","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"find_mapping/1","deprecated":false,"title":"find_mapping(source)","anchor":"find_mapping/1"},{"id":"format_referrer/1","deprecated":false,"title":"format_referrer(referrer)","anchor":"format_referrer/1"},{"id":"init/0","deprecated":false,"title":"init()","anchor":"init/0"},{"id":"paid_source?/1","deprecated":false,"title":"paid_source?(source)","anchor":"paid_source?/1"},{"id":"paid_sources/0","deprecated":false,"title":"paid_sources()","anchor":"paid_sources/0"},{"id":"parse/1","deprecated":false,"title":"parse(ref)","anchor":"parse/1"},{"id":"resolve/1","deprecated":false,"title":"resolve(request)","anchor":"resolve/1"}],"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.LiveViewTest","deprecated":false,"group":"","title":"Plausible.LiveViewTest","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render_component/3","deprecated":false,"title":"render_component(component, assigns \\\\ Macro.escape(%{}), opts \\\\ [])","anchor":"render_component/3"}],"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":"dictionary_connection_params/0","deprecated":false,"title":"dictionary_connection_params()","anchor":"dictionary_connection_params/0"},{"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/2","deprecated":false,"title":"fetch_prices(product_ids, customer_ip)","anchor":"fetch_prices/2"},{"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.Funnels","deprecated":false,"group":"","title":"Plausible.Plugins.API.Funnels","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, create_request)","anchor":"create/2"},{"id":"get/2","deprecated":false,"title":"get(site, by)","anchor":"get/2"},{"id":"get_funnels/2","deprecated":false,"title":"get_funnels(site, params)","anchor":"get_funnels/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"},{"id":"measure_duration/3","deprecated":false,"title":"measure_duration(event, fun, meta \\\\ %{})","anchor":"measure_duration/3"}],"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/1","deprecated":false,"title":"createdb(repos \\\\ repos())","anchor":"createdb/1"},{"id":"dump_plans/0","deprecated":false,"title":"dump_plans()","anchor":"dump_plans/0"},{"id":"interweave_migrate/1","deprecated":false,"title":"interweave_migrate(repos \\\\ repos())","anchor":"interweave_migrate/1"},{"id":"pending_streaks/1","deprecated":false,"title":"pending_streaks(repos \\\\ repos())","anchor":"pending_streaks/1"},{"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.RequestLogger","deprecated":false,"group":"","title":"Plausible.RequestLogger","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"log_request/4","deprecated":false,"title":"log_request(_, map1, map2, _)","anchor":"log_request/4"}],"key":"functions"}]},{"id":"Plausible.S3","deprecated":false,"group":"","title":"Plausible.S3","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"download_url/2","deprecated":false,"title":"download_url(s3_bucket, s3_path)","anchor":"download_url/2"},{"id":"export_upload_multipart/4","deprecated":false,"title":"export_upload_multipart(stream, s3_bucket, s3_path, filename)","anchor":"export_upload_multipart/4"},{"id":"exports_bucket/0","deprecated":false,"title":"exports_bucket()","anchor":"exports_bucket/0"},{"id":"import_clickhouse_credentials/0","deprecated":false,"title":"import_clickhouse_credentials()","anchor":"import_clickhouse_credentials/0"},{"id":"import_presign_upload/2","deprecated":false,"title":"import_presign_upload(site_id, filename)","anchor":"import_presign_upload/2"},{"id":"imports_bucket/0","deprecated":false,"title":"imports_bucket()","anchor":"imports_bucket/0"}],"key":"functions"}]},{"id":"Plausible.Sentry.Client","deprecated":false,"group":"","title":"Plausible.Sentry.Client","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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"}],"key":"functions"}]},{"id":"Plausible.Session.CacheStore","deprecated":false,"group":"","title":"Plausible.Session.CacheStore","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"lock_telemetry_event/0","deprecated":false,"title":"lock_telemetry_event()","anchor":"lock_telemetry_event/0"},{"id":"on_event/4","deprecated":false,"title":"on_event(event, session_attributes, prev_user_id, buffer_insert \\\\ &WriteBuffer.insert/1)","anchor":"on_event/4"}],"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":"get_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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.HostnameRule","deprecated":false,"group":"","title":"Plausible.Shield.HostnameRule","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 \\\\ %__MODULE__{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Shield.HostnameRuleCache","deprecated":false,"group":"","title":"Plausible.Shield.HostnameRuleCache","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_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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":"get_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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.PageRule","deprecated":false,"group":"","title":"Plausible.Shield.PageRule","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 \\\\ %__MODULE__{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Shield.PageRuleCache","deprecated":false,"group":"","title":"Plausible.Shield.PageRuleCache","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_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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_hostname_rule/3","deprecated":false,"title":"add_hostname_rule(site_or_id, params, opts \\\\ [])","anchor":"add_hostname_rule/3"},{"id":"add_ip_rule/3","deprecated":false,"title":"add_ip_rule(site_or_id, params, opts \\\\ [])","anchor":"add_ip_rule/3"},{"id":"add_page_rule/3","deprecated":false,"title":"add_page_rule(site_or_id, params, opts \\\\ [])","anchor":"add_page_rule/3"},{"id":"allowed_hostname_patterns/1","deprecated":false,"title":"allowed_hostname_patterns(domain)","anchor":"allowed_hostname_patterns/1"},{"id":"count_country_rules/1","deprecated":false,"title":"count_country_rules(site_or_id)","anchor":"count_country_rules/1"},{"id":"count_hostname_rules/1","deprecated":false,"title":"count_hostname_rules(site_or_id)","anchor":"count_hostname_rules/1"},{"id":"count_ip_rules/1","deprecated":false,"title":"count_ip_rules(site_or_id)","anchor":"count_ip_rules/1"},{"id":"count_page_rules/1","deprecated":false,"title":"count_page_rules(site_or_id)","anchor":"count_page_rules/1"},{"id":"country_blocked?/2","deprecated":false,"title":"country_blocked?(domain, country_code)","anchor":"country_blocked?/2"},{"id":"hostname_allowed?/2","deprecated":false,"title":"hostname_allowed?(domain, hostname)","anchor":"hostname_allowed?/2"},{"id":"ip_blocked?/2","deprecated":false,"title":"ip_blocked?(domain, address)","anchor":"ip_blocked?/2"},{"id":"list_country_rules/1","deprecated":false,"title":"list_country_rules(site_or_id)","anchor":"list_country_rules/1"},{"id":"list_hostname_rules/1","deprecated":false,"title":"list_hostname_rules(site_or_id)","anchor":"list_hostname_rules/1"},{"id":"list_ip_rules/1","deprecated":false,"title":"list_ip_rules(site_or_id)","anchor":"list_ip_rules/1"},{"id":"list_page_rules/1","deprecated":false,"title":"list_page_rules(site_or_id)","anchor":"list_page_rules/1"},{"id":"maximum_country_rules/0","deprecated":false,"title":"maximum_country_rules()","anchor":"maximum_country_rules/0"},{"id":"maximum_hostname_rules/0","deprecated":false,"title":"maximum_hostname_rules()","anchor":"maximum_hostname_rules/0"},{"id":"maximum_ip_rules/0","deprecated":false,"title":"maximum_ip_rules()","anchor":"maximum_ip_rules/0"},{"id":"maximum_page_rules/0","deprecated":false,"title":"maximum_page_rules()","anchor":"maximum_page_rules/0"},{"id":"page_blocked?/2","deprecated":false,"title":"page_blocked?(domain, address)","anchor":"page_blocked?/2"},{"id":"remove_country_rule/2","deprecated":false,"title":"remove_country_rule(site_or_id, rule_id)","anchor":"remove_country_rule/2"},{"id":"remove_hostname_rule/2","deprecated":false,"title":"remove_hostname_rule(site_or_id, rule_id)","anchor":"remove_hostname_rule/2"},{"id":"remove_ip_rule/2","deprecated":false,"title":"remove_ip_rule(site_or_id, rule_id)","anchor":"remove_ip_rule/2"},{"id":"remove_page_rule/2","deprecated":false,"title":"remove_page_rule(site_or_id, rule_id)","anchor":"remove_page_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":"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":"new_for_team/2","deprecated":false,"title":"new_for_team(team, params)","anchor":"new_for_team/2"},{"id":"set_native_stats_start_at/2","deprecated":false,"title":"set_native_stats_start_at(site, val)","anchor":"set_native_stats_start_at/2"},{"id":"set_stats_start_date/2","deprecated":false,"title":"set_stats_start_date(site, val)","anchor":"set_stats_start_date/2"},{"id":"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_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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.InstallationMeta","deprecated":false,"group":"","title":"Plausible.Site.InstallationMeta","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":"all_pending_ownerships/1","deprecated":false,"title":"all_pending_ownerships(email)","anchor":"all_pending_ownerships/1"},{"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(site)","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.TrafficChangeNotification","deprecated":false,"group":"","title":"Plausible.Site.TrafficChangeNotification","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":"before_update/2","deprecated":false,"title":"before_update(conn, changeset)","anchor":"before_update/2"},{"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":"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":"for_user_query/1","deprecated":false,"title":"for_user_query(user)","anchor":"for_user_query/1"},{"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":"has_admin_access?/2","deprecated":false,"title":"has_admin_access?(user_id, site)","anchor":"has_admin_access?/2"},{"id":"has_goals?/1","deprecated":false,"title":"has_goals?(site)","anchor":"has_goals?/1"},{"id":"has_stats?/1","deprecated":false,"title":"has_stats?(site)","anchor":"has_stats?/1"},{"id":"is_member?/2","deprecated":false,"title":"is_member?(user_id, site)","anchor":"is_member?/2"},{"id":"list/3","deprecated":false,"title":"list(user, pagination_params, opts \\\\ [])","anchor":"list/3"},{"id":"list_with_invitations/3","deprecated":false,"title":"list_with_invitations(user, pagination_params, opts \\\\ [])","anchor":"list_with_invitations/3"},{"id":"locked?/1","deprecated":false,"title":"locked?(site)","anchor":"locked?/1"},{"id":"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":"owned_sites_locked?/1","deprecated":false,"title":"owned_sites_locked?(user)","anchor":"owned_sites_locked?/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"},{"id":"update_installation_meta!/2","deprecated":false,"title":"update_installation_meta!(site, meta)","anchor":"update_installation_meta!/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/4","deprecated":false,"title":"breakdown(site, query, metrics, pagination)","anchor":"breakdown/4"},{"id":"current_visitors/2","deprecated":false,"title":"current_visitors(site, duration \\\\ Duration.new!(minute: -5))","anchor":"current_visitors/2"},{"id":"custom_prop_value_filter_suggestions/4","deprecated":false,"title":"custom_prop_value_filter_suggestions(site, query, prop_key, filter_search)","anchor":"custom_prop_value_filter_suggestions/4"},{"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":"query/2","deprecated":false,"title":"query(site, query)","anchor":"query/2"},{"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"},{"id":"get_value/3","deprecated":false,"title":"get_value(metric_list, index, metric)","anchor":"get_value/3"},{"id":"metric_map/3","deprecated":false,"title":"metric_map(map, index, metric)","anchor":"metric_map/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Base","deprecated":false,"group":"","title":"Plausible.Stats.Base","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"base_event_query/2","deprecated":false,"title":"base_event_query(site, query)","anchor":"base_event_query/2"},{"id":"query_sessions/2","deprecated":false,"title":"query_sessions(site, query)","anchor":"query_sessions/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Breakdown","deprecated":false,"group":"","title":"Plausible.Stats.Breakdown","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"breakdown/5","deprecated":false,"title":"breakdown(site, query, metrics, arg, opts \\\\ [])","anchor":"breakdown/5"},{"id":"formatted_date_ranges/1","deprecated":false,"title":"formatted_date_ranges(query)","anchor":"formatted_date_ranges/1"},{"id":"transform_dimensions/1","deprecated":false,"title":"transform_dimensions(dimension)","anchor":"transform_dimensions/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Clickhouse","deprecated":false,"group":"","title":"Plausible.Stats.Clickhouse","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"current_visitors/1","deprecated":false,"title":"current_visitors(site)","anchor":"current_visitors/1"},{"id":"current_visitors_12h/1","deprecated":false,"title":"current_visitors_12h(site)","anchor":"current_visitors_12h/1"},{"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(site_ids, 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":"Functions","nodes":[{"id":"add_comparison_filters/2","deprecated":false,"title":"add_comparison_filters(comparison_query, main_results_list)","anchor":"add_comparison_filters/2"},{"id":"get_comparison_query/2","deprecated":false,"title":"get_comparison_query(source_query, options)","anchor":"get_comparison_query/2"}],"key":"functions"}]},{"id":"Plausible.Stats.CurrentVisitors","deprecated":false,"group":"","title":"Plausible.Stats.CurrentVisitors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"current_visitors/2","deprecated":false,"title":"current_visitors(site, duration \\\\ Duration.new!(minute: -5))","anchor":"current_visitors/2"}],"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.DateTimeRange","deprecated":false,"group":"","title":"Plausible.Stats.DateTimeRange","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new!/2","deprecated":false,"title":"new!(first, last)","anchor":"new!/2"},{"id":"new!/3","deprecated":false,"title":"new!(first, last, timezone)","anchor":"new!/3"},{"id":"to_date_range/2","deprecated":false,"title":"to_date_range(datetime_range, timezone)","anchor":"to_date_range/2"},{"id":"to_timezone/2","deprecated":false,"title":"to_timezone(date_time_range, timezone)","anchor":"to_timezone/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":"custom_prop_value_filter_suggestions/4","deprecated":false,"title":"custom_prop_value_filter_suggestions(site, query, prop_key, filter_search)","anchor":"custom_prop_value_filter_suggestions/4"},{"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":"dimensions_used_in_filters/2","deprecated":false,"title":"dimensions_used_in_filters(filters, opts \\\\ [])","anchor":"dimensions_used_in_filters/2"},{"id":"event_props/0","deprecated":false,"title":"event_props()","anchor":"event_props/0"},{"id":"event_table_visit_props/0","deprecated":false,"title":"event_table_visit_props()","anchor":"event_table_visit_props/0"},{"id":"filtering_on_dimension?/2","deprecated":false,"title":"filtering_on_dimension?(query, dimension)","anchor":"filtering_on_dimension?/2"},{"id":"get_toplevel_filter/2","deprecated":false,"title":"get_toplevel_filter(query, prefix)","anchor":"get_toplevel_filter/2"},{"id":"parse/1","deprecated":false,"title":"parse(filters)","anchor":"parse/1"},{"id":"rename_dimensions_used_in_filter/2","deprecated":false,"title":"rename_dimensions_used_in_filter(filters, renames)","anchor":"rename_dimensions_used_in_filter/2"},{"id":"transform_filters/2","deprecated":false,"title":"transform_filters(filters, transformer)","anchor":"transform_filters/2"},{"id":"visit_props/0","deprecated":false,"title":"visit_props()","anchor":"visit_props/0"},{"id":"without_prefix/1","deprecated":false,"title":"without_prefix(dimension)","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":"page_regex/1","deprecated":false,"title":"page_regex(expr)","anchor":"page_regex/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":"split_goals/1","deprecated":false,"title":"split_goals(goals)","anchor":"split_goals/1"},{"id":"split_goals_query_expressions/1","deprecated":false,"title":"split_goals_query_expressions(goals)","anchor":"split_goals_query_expressions/1"},{"id":"wildcard_expression?/1","deprecated":false,"title":"wildcard_expression?(expression)","anchor":"wildcard_expression?/1"}],"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":"available?/1","deprecated":false,"title":"available?(site)","anchor":"available?/1"},{"id":"format_revenue_metric/3","deprecated":false,"title":"format_revenue_metric(value, query, dimension_values)","anchor":"format_revenue_metric/3"},{"id":"preload_revenue_currencies/4","deprecated":false,"title":"preload_revenue_currencies(site, goals, metrics, dimensions)","anchor":"preload_revenue_currencies/4"},{"id":"requested?/1","deprecated":false,"title":"requested?(metrics)","anchor":"requested?/1"},{"id":"revenue_metrics/0","deprecated":false,"title":"revenue_metrics()","anchor":"revenue_metrics/0"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported","deprecated":false,"group":"","title":"Plausible.Stats.Imported","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"goals_with_path/0","deprecated":false,"title":"goals_with_path()","anchor":"goals_with_path/0"},{"id":"goals_with_url/0","deprecated":false,"title":"goals_with_url()","anchor":"goals_with_url/0"},{"id":"merge_imported/4","deprecated":false,"title":"merge_imported(q, site, query, metrics)","anchor":"merge_imported/4"},{"id":"merge_imported_city_suggestions/3","deprecated":false,"title":"merge_imported_city_suggestions(native_q, site, query)","anchor":"merge_imported_city_suggestions/3"},{"id":"merge_imported_country_suggestions/3","deprecated":false,"title":"merge_imported_country_suggestions(native_q, site, query)","anchor":"merge_imported_country_suggestions/3"},{"id":"merge_imported_filter_suggestions/5","deprecated":false,"title":"merge_imported_filter_suggestions(native_q, site, query, filter_name, filter_query)","anchor":"merge_imported_filter_suggestions/5"},{"id":"merge_imported_region_suggestions/3","deprecated":false,"title":"merge_imported_region_suggestions(native_q, site, query)","anchor":"merge_imported_region_suggestions/3"},{"id":"schema_supports_query?/1","deprecated":false,"title":"schema_supports_query?(query)","anchor":"schema_supports_query?/1"},{"id":"total_imported_visitors/2","deprecated":false,"title":"total_imported_visitors(site, query)","anchor":"total_imported_visitors/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported.Base","deprecated":false,"group":"","title":"Plausible.Stats.Imported.Base","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"decide_tables/1","deprecated":false,"title":"decide_tables(query)","anchor":"decide_tables/1"},{"id":"property_to_table_mappings/0","deprecated":false,"title":"property_to_table_mappings()","anchor":"property_to_table_mappings/0"},{"id":"query_imported/2","deprecated":false,"title":"query_imported(site, query)","anchor":"query_imported/2"},{"id":"query_imported/3","deprecated":false,"title":"query_imported(table, site, query)","anchor":"query_imported/3"},{"id":"special_goals_for/1","deprecated":false,"title":"special_goals_for(binary)","anchor":"special_goals_for/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported.SQL.Expression","deprecated":false,"group":"","title":"Plausible.Stats.Imported.SQL.Expression","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"group_imported_by/2","deprecated":false,"title":"group_imported_by(q, query)","anchor":"group_imported_by/2"},{"id":"naive_dimension_join/3","deprecated":false,"title":"naive_dimension_join(q1, q2, metrics)","anchor":"naive_dimension_join/3"},{"id":"select_imported_metrics/2","deprecated":false,"title":"select_imported_metrics(q, list)","anchor":"select_imported_metrics/2"},{"id":"select_joined_dimensions/2","deprecated":false,"title":"select_joined_dimensions(q, query)","anchor":"select_joined_dimensions/2"},{"id":"select_joined_metrics/2","deprecated":false,"title":"select_joined_metrics(q, list)","anchor":"select_joined_metrics/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported.SQL.WhereBuilder","deprecated":false,"group":"","title":"Plausible.Stats.Imported.SQL.WhereBuilder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build/1","deprecated":false,"title":"build(query)","anchor":"build/1"}],"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(date_time_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.JSONSchema","deprecated":false,"group":"","title":"Plausible.Stats.JSONSchema","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"raw_public_schema/0","deprecated":false,"title":"raw_public_schema()","anchor":"raw_public_schema/0"},{"id":"validate/2","deprecated":false,"title":"validate(schema_type, params)","anchor":"validate/2"}],"key":"functions"}]},{"id":"Plausible.Stats.JSONSchema.Utils","deprecated":false,"group":"","title":"Plausible.Stats.JSONSchema.Utils","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"json/0","deprecated":false,"title":"json()","anchor":"t:json/0"},{"id":"transform_fun/0","deprecated":false,"title":"transform_fun()","anchor":"t:transform_fun/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"traverse/2","deprecated":false,"title":"traverse(json, fun)","anchor":"traverse/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Legacy.Dimensions","deprecated":false,"group":"","title":"Plausible.Stats.Legacy.Dimensions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"valid?/1","deprecated":false,"title":"valid?(prop)","anchor":"valid?/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Legacy.QueryBuilder","deprecated":false,"group":"","title":"Plausible.Stats.Legacy.QueryBuilder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"from/4","deprecated":false,"title":"from(site, params, debug_metadata, now \\\\ nil)","anchor":"from/4"},{"id":"parse_comparison_params/2","deprecated":false,"title":"parse_comparison_params(site, params)","anchor":"parse_comparison_params/2"},{"id":"parse_order_by/1","deprecated":false,"title":"parse_order_by(order_by)","anchor":"parse_order_by/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Legacy.TimeOnPage","deprecated":false,"group":"","title":"Plausible.Stats.Legacy.TimeOnPage","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"calculate/3","deprecated":false,"title":"calculate(site, query, ch_results)","anchor":"calculate/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Metrics","deprecated":false,"group":"","title":"Plausible.Stats.Metrics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"from_string/1","deprecated":false,"title":"from_string(str)","anchor":"from_string/1"},{"id":"from_string!/1","deprecated":false,"title":"from_string!(str)","anchor":"from_string!/1"},{"id":"metric?/1","deprecated":false,"title":"metric?(value)","anchor":"metric?/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":"add_filter/2","deprecated":false,"title":"add_filter(query, filter)","anchor":"add_filter/2"},{"id":"build/4","deprecated":false,"title":"build(site, schema_type, params, debug_metadata)","anchor":"build/4"},{"id":"date_range/2","deprecated":false,"title":"date_range(query, options \\\\ [])","anchor":"date_range/2"},{"id":"ensure_include_imported/2","deprecated":false,"title":"ensure_include_imported(query, requested?)","anchor":"ensure_include_imported/2"},{"id":"from/4","deprecated":false,"title":"from(site, params, debug_metadata \\\\ %{}, now \\\\ nil)","anchor":"from/4"},{"id":"put_imported_opts/3","deprecated":false,"title":"put_imported_opts(query, site, params)","anchor":"put_imported_opts/3"},{"id":"remove_top_level_filters/2","deprecated":false,"title":"remove_top_level_filters(query, prefixes)","anchor":"remove_top_level_filters/2"},{"id":"set/2","deprecated":false,"title":"set(query, keywords)","anchor":"set/2"},{"id":"set_include/3","deprecated":false,"title":"set_include(query, key, value)","anchor":"set_include/3"},{"id":"trace/2","deprecated":false,"title":"trace(query, metrics)","anchor":"trace/2"}],"key":"functions"}]},{"id":"Plausible.Stats.QueryOptimizer","deprecated":false,"group":"","title":"Plausible.Stats.QueryOptimizer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"optimize/1","deprecated":false,"title":"optimize(query)","anchor":"optimize/1"},{"id":"split/1","deprecated":false,"title":"split(query)","anchor":"split/1"}],"key":"functions"}]},{"id":"Plausible.Stats.QueryResult","deprecated":false,"group":"","title":"Plausible.Stats.QueryResult","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"from/4","deprecated":false,"title":"from(results, site, query, meta_extra)","anchor":"from/4"}],"key":"functions"}]},{"id":"Plausible.Stats.QueryRunner","deprecated":false,"group":"","title":"Plausible.Stats.QueryRunner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(site, query)","anchor":"run/2"}],"key":"functions"}]},{"id":"Plausible.Stats.SQL.Expression","deprecated":false,"group":"","title":"Plausible.Stats.SQL.Expression","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event_goal_join/2","deprecated":false,"title":"event_goal_join(events, page_regexes)","anchor":"event_goal_join/2"},{"id":"event_metric/1","deprecated":false,"title":"event_metric(unknown)","anchor":"event_metric/1"},{"id":"select_dimension/5","deprecated":false,"title":"select_dimension(q, key, arg3, arg4, query)","anchor":"select_dimension/5"},{"id":"session_metric/2","deprecated":false,"title":"session_metric(atom, query)","anchor":"session_metric/2"}],"key":"functions"}]},{"id":"Plausible.Stats.SQL.Fragments","deprecated":false,"group":"","title":"Plausible.Stats.SQL.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":"meta_key_column/1","deprecated":false,"title":"meta_key_column(atom)","anchor":"meta_key_column/1"},{"id":"meta_value_column/1","deprecated":false,"title":"meta_value_column(atom)","anchor":"meta_value_column/1"},{"id":"sample_percent/0","deprecated":false,"title":"sample_percent()","anchor":"sample_percent/0"},{"id":"select_join_fields/4","deprecated":false,"title":"select_join_fields(q, query, list, table_name)","anchor":"select_join_fields/4"},{"id":"select_merge_as/3","deprecated":false,"title":"select_merge_as(q, binding, map_literal)","anchor":"select_merge_as/3"},{"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":"wrap_alias/2","deprecated":false,"title":"wrap_alias(binding, map_literal)","anchor":"wrap_alias/2"}],"key":"functions"}]},{"id":"Plausible.Stats.SQL.SpecialMetrics","deprecated":false,"group":"","title":"Plausible.Stats.SQL.SpecialMetrics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add/3","deprecated":false,"title":"add(q, site, query)","anchor":"add/3"},{"id":"maybe_add_global_conversion_rate/3","deprecated":false,"title":"maybe_add_global_conversion_rate(q, site, query)","anchor":"maybe_add_global_conversion_rate/3"},{"id":"maybe_add_group_conversion_rate/3","deprecated":false,"title":"maybe_add_group_conversion_rate(q, site, query)","anchor":"maybe_add_group_conversion_rate/3"},{"id":"maybe_add_scroll_depth/3","deprecated":false,"title":"maybe_add_scroll_depth(q, site, query)","anchor":"maybe_add_scroll_depth/3"}],"key":"functions"}]},{"id":"Plausible.Stats.SQL.WhereBuilder","deprecated":false,"group":"","title":"Plausible.Stats.SQL.WhereBuilder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build/3","deprecated":false,"title":"build(table, site, query)","anchor":"build/3"},{"id":"build_condition/2","deprecated":false,"title":"build_condition(db_field, filter)","anchor":"build_condition/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/3","deprecated":false,"title":"put_threshold(query, site, params)","anchor":"put_threshold/3"}],"key":"functions"}]},{"id":"Plausible.Stats.TableDecider","deprecated":false,"group":"","title":"Plausible.Stats.TableDecider","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"events_join_sessions?/1","deprecated":false,"title":"events_join_sessions?(query)","anchor":"events_join_sessions?/1"},{"id":"partition_metrics/2","deprecated":false,"title":"partition_metrics(metrics, query)","anchor":"partition_metrics/2"},{"id":"sessions_join_events?/1","deprecated":false,"title":"sessions_join_events?(query)","anchor":"sessions_join_events?/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Time","deprecated":false,"group":"","title":"Plausible.Stats.Time","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"date_or_weekstart/2","deprecated":false,"title":"date_or_weekstart(date, date_range)","anchor":"date_or_weekstart/2"},{"id":"format_datetime/1","deprecated":false,"title":"format_datetime(date)","anchor":"format_datetime/1"},{"id":"time_dimension/1","deprecated":false,"title":"time_dimension(query)","anchor":"time_dimension/1"},{"id":"time_dimension?/1","deprecated":false,"title":"time_dimension?(arg1)","anchor":"time_dimension?/1"},{"id":"time_labels/1","deprecated":false,"title":"time_labels(query)","anchor":"time_labels/1"},{"id":"utc_boundaries/2","deprecated":false,"title":"utc_boundaries(query, site)","anchor":"utc_boundaries/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Timeseries","deprecated":false,"group":"","title":"Plausible.Stats.Timeseries","sections":[],"nodeGroups":[{"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":"maybe_add_visitors_metric/1","deprecated":false,"title":"maybe_add_visitors_metric(metrics)","anchor":"maybe_add_visitors_metric/1"},{"id":"shortname/2","deprecated":false,"title":"shortname(query, metric)","anchor":"shortname/2"}],"key":"functions"}]},{"id":"Plausible.Teams","deprecated":false,"group":"","title":"Plausible.Teams","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_by_owner/1","deprecated":false,"title":"get_by_owner(user)","anchor":"get_by_owner/1"},{"id":"get_or_create/1","deprecated":false,"title":"get_or_create(user)","anchor":"get_or_create/1"},{"id":"last_subscription_join_query/0","deprecated":false,"title":"last_subscription_join_query()","anchor":"last_subscription_join_query/0"},{"id":"last_subscription_query/0","deprecated":false,"title":"last_subscription_query()","anchor":"last_subscription_query/0"},{"id":"load_for_site/1","deprecated":false,"title":"load_for_site(site)","anchor":"load_for_site/1"},{"id":"on_trial?/1","deprecated":false,"title":"on_trial?(team)","anchor":"on_trial?/1"},{"id":"owned_sites/1","deprecated":false,"title":"owned_sites(team)","anchor":"owned_sites/1"},{"id":"owned_sites_ids/1","deprecated":false,"title":"owned_sites_ids(team)","anchor":"owned_sites_ids/1"},{"id":"read_team_schemas?/1","deprecated":false,"title":"read_team_schemas?(user)","anchor":"read_team_schemas?/1"},{"id":"sync_team/1","deprecated":false,"title":"sync_team(user)","anchor":"sync_team/1"},{"id":"trial_days_left/1","deprecated":false,"title":"trial_days_left(team)","anchor":"trial_days_left/1"},{"id":"with_subscription/1","deprecated":false,"title":"with_subscription(team)","anchor":"with_subscription/1"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter","deprecated":false,"group":"","title":"Plausible.Teams.Adapter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"switch/2","deprecated":false,"title":"switch(user, opts \\\\ [])","anchor":"switch/2"},{"id":"user_or_team/1","deprecated":false,"title":"user_or_team(user)","anchor":"user_or_team/1"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter.Read.Billing","deprecated":false,"group":"","title":"Plausible.Teams.Adapter.Read.Billing","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"active_subscription_for/1","deprecated":false,"title":"active_subscription_for(user)","anchor":"active_subscription_for/1"},{"id":"change_plan/2","deprecated":false,"title":"change_plan(user, new_plan_id)","anchor":"change_plan/2"},{"id":"check_feature_availability/2","deprecated":false,"title":"check_feature_availability(feature, user)","anchor":"check_feature_availability/2"},{"id":"check_feature_availability_for_stats_api/1","deprecated":false,"title":"check_feature_availability_for_stats_api(user)","anchor":"check_feature_availability_for_stats_api/1"},{"id":"check_needs_to_upgrade/1","deprecated":false,"title":"check_needs_to_upgrade(user)","anchor":"check_needs_to_upgrade/1"},{"id":"ensure_can_add_new_site/1","deprecated":false,"title":"ensure_can_add_new_site(user)","anchor":"ensure_can_add_new_site/1"},{"id":"enterprise_configured?/1","deprecated":false,"title":"enterprise_configured?(user)","anchor":"enterprise_configured?/1"},{"id":"get_subscription/1","deprecated":false,"title":"get_subscription(user)","anchor":"get_subscription/1"},{"id":"has_active_subscription?/1","deprecated":false,"title":"has_active_subscription?(user)","anchor":"has_active_subscription?/1"},{"id":"latest_enterprise_plan_with_prices/2","deprecated":false,"title":"latest_enterprise_plan_with_prices(user, customer_ip)","anchor":"latest_enterprise_plan_with_prices/2"},{"id":"monthly_pageview_limit/1","deprecated":false,"title":"monthly_pageview_limit(user)","anchor":"monthly_pageview_limit/1"},{"id":"monthly_pageview_usage/2","deprecated":false,"title":"monthly_pageview_usage(user, site_ids \\\\ nil)","anchor":"monthly_pageview_usage/2"},{"id":"site_limit/1","deprecated":false,"title":"site_limit(user)","anchor":"site_limit/1"},{"id":"site_usage/1","deprecated":false,"title":"site_usage(user)","anchor":"site_usage/1"},{"id":"suggest_by_usage/2","deprecated":false,"title":"suggest_by_usage(user, usage_during_cycle)","anchor":"suggest_by_usage/2"},{"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"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter.Read.Ownership","deprecated":false,"group":"","title":"Plausible.Teams.Adapter.Read.Ownership","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_pending_site_transfers/2","deprecated":false,"title":"all_pending_site_transfers(email, user)","anchor":"all_pending_site_transfers/2"},{"id":"check_feature_access/2","deprecated":false,"title":"check_feature_access(site, new_owner)","anchor":"check_feature_access/2"},{"id":"ensure_can_take_ownership/2","deprecated":false,"title":"ensure_can_take_ownership(site, user)","anchor":"ensure_can_take_ownership/2"},{"id":"get_owner/2","deprecated":false,"title":"get_owner(site, user)","anchor":"get_owner/2"},{"id":"has_sites?/1","deprecated":false,"title":"has_sites?(user)","anchor":"has_sites?/1"},{"id":"owns_sites?/2","deprecated":false,"title":"owns_sites?(user, sites)","anchor":"owns_sites?/2"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter.Read.Sites","deprecated":false,"group":"","title":"Plausible.Teams.Adapter.Read.Sites","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_for_user/3","deprecated":false,"title":"get_for_user(user, domain, roles \\\\ [:owner, :admin, :viewer])","anchor":"get_for_user/3"},{"id":"get_for_user!/3","deprecated":false,"title":"get_for_user!(user, domain, roles \\\\ [:owner, :admin, :viewer])","anchor":"get_for_user!/3"},{"id":"list/3","deprecated":false,"title":"list(user, pagination_params, opts \\\\ [])","anchor":"list/3"},{"id":"list_people/2","deprecated":false,"title":"list_people(site, user)","anchor":"list_people/2"},{"id":"list_with_invitations/3","deprecated":false,"title":"list_with_invitations(user, pagination_params, opts \\\\ [])","anchor":"list_with_invitations/3"}],"key":"functions"}]},{"id":"Plausible.Teams.GuestInvitation","deprecated":false,"group":"","title":"Plausible.Teams.GuestInvitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(team_invitation, site, role)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Plausible.Teams.GuestMembership","deprecated":false,"group":"","title":"Plausible.Teams.GuestMembership","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(team_membership, site, role)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Plausible.Teams.Invitation","deprecated":false,"group":"","title":"Plausible.Teams.Invitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(team, opts)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Teams.Membership","deprecated":false,"group":"","title":"Plausible.Teams.Membership","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(team, user, role)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Plausible.Teams.SiteTransfer","deprecated":false,"group":"","title":"Plausible.Teams.SiteTransfer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(site, opts)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Teams.Team","deprecated":false,"group":"","title":"Plausible.Teams.Team","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(name, today \\\\ Date.utc_today())","anchor":"changeset/2"},{"id":"start_trial/2","deprecated":false,"title":"start_trial(team, today \\\\ Date.utc_today())","anchor":"start_trial/2"},{"id":"sync_changeset/2","deprecated":false,"title":"sync_changeset(team, user)","anchor":"sync_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Teams.Test","deprecated":false,"group":"","title":"Plausible.Teams.Test","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_guest/2","deprecated":false,"title":"add_guest(site, args \\\\ [])","anchor":"add_guest/2"},{"id":"assert_guest_invitation/4","deprecated":false,"title":"assert_guest_invitation(team, site, email, role)","anchor":"assert_guest_invitation/4"},{"id":"assert_guest_membership/4","deprecated":false,"title":"assert_guest_membership(team, site, user, role)","anchor":"assert_guest_membership/4"},{"id":"assert_team_attached/2","deprecated":false,"title":"assert_team_attached(site, team_id \\\\ nil)","anchor":"assert_team_attached/2"},{"id":"assert_team_exists/2","deprecated":false,"title":"assert_team_exists(user, team_id \\\\ nil)","anchor":"assert_team_exists/2"},{"id":"assert_team_membership/3","deprecated":false,"title":"assert_team_membership(user, team, role \\\\ :owner)","anchor":"assert_team_membership/3"},{"id":"invite_guest/3","deprecated":false,"title":"invite_guest(site, invitee_or_email, args \\\\ [])","anchor":"invite_guest/3"},{"id":"invite_transfer/3","deprecated":false,"title":"invite_transfer(site, invitee, args \\\\ [])","anchor":"invite_transfer/3"},{"id":"new_site/1","deprecated":false,"title":"new_site(args \\\\ [])","anchor":"new_site/1"},{"id":"new_team/0","deprecated":false,"title":"new_team()","anchor":"new_team/0"},{"id":"new_user/1","deprecated":false,"title":"new_user(args \\\\ [])","anchor":"new_user/1"},{"id":"revoke_membership/2","deprecated":false,"title":"revoke_membership(site, user)","anchor":"revoke_membership/2"},{"id":"subscribe_to_business_plan/1","deprecated":false,"title":"subscribe_to_business_plan(user)","anchor":"subscribe_to_business_plan/1"},{"id":"subscribe_to_enterprise_plan/2","deprecated":false,"title":"subscribe_to_enterprise_plan(user, attrs \\\\ [])","anchor":"subscribe_to_enterprise_plan/2"},{"id":"subscribe_to_growth_plan/1","deprecated":false,"title":"subscribe_to_growth_plan(user)","anchor":"subscribe_to_growth_plan/1"},{"id":"subscribe_to_plan/3","deprecated":false,"title":"subscribe_to_plan(user, paddle_plan_id, attrs \\\\ [])","anchor":"subscribe_to_plan/3"}],"key":"functions"}]},{"id":"Plausible.Teams.Users","deprecated":false,"group":"","title":"Plausible.Teams.Users","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"has_sites?/2","deprecated":false,"title":"has_sites?(user, opts \\\\ [])","anchor":"has_sites?/2"},{"id":"owns_sites?/2","deprecated":false,"title":"owns_sites?(user, opts \\\\ [])","anchor":"owns_sites?/2"}],"key":"functions"}]},{"id":"Plausible.Test.Support.HTML","deprecated":false,"group":"","title":"Plausible.Test.Support.HTML","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"class_of_element/2","deprecated":false,"title":"class_of_element(html, element)","anchor":"class_of_element/2"},{"id":"element_exists?/2","deprecated":false,"title":"element_exists?(html, selector)","anchor":"element_exists?/2"},{"id":"find/2","deprecated":false,"title":"find(html, value)","anchor":"find/2"},{"id":"form_exists?/2","deprecated":false,"title":"form_exists?(html, action_path)","anchor":"form_exists?/2"},{"id":"name_of/1","deprecated":false,"title":"name_of(element)","anchor":"name_of/1"},{"id":"submit_button/2","deprecated":false,"title":"submit_button(html, form)","anchor":"submit_button/2"},{"id":"text/1","deprecated":false,"title":"text(element)","anchor":"text/1"},{"id":"text_of_attr/2","deprecated":false,"title":"text_of_attr(element, attr)","anchor":"text_of_attr/2"},{"id":"text_of_attr/3","deprecated":false,"title":"text_of_attr(html, element, attr)","anchor":"text_of_attr/3"},{"id":"text_of_element/2","deprecated":false,"title":"text_of_element(html, element)","anchor":"text_of_element/2"}],"key":"functions"}]},{"id":"Plausible.Test.Support.HTTPMocker","deprecated":false,"group":"","title":"Plausible.Test.Support.HTTPMocker","sections":[]},{"id":"Plausible.TestUtils","deprecated":false,"group":"","title":"Plausible.TestUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"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_legacy_site_import/1","deprecated":false,"title":"create_legacy_site_import(map)","anchor":"create_legacy_site_import/1"},{"id":"create_pageviews/1","deprecated":false,"title":"create_pageviews(pageviews)","anchor":"create_pageviews/1"},{"id":"create_site/1","deprecated":false,"title":"create_site(map)","anchor":"create_site/1"},{"id":"create_site_import/1","deprecated":false,"title":"create_site_import(opts)","anchor":"create_site_import/1"},{"id":"create_user/1","deprecated":false,"title":"create_user(_)","anchor":"create_user/1"},{"id":"ensure_minio/0","deprecated":false,"title":"ensure_minio()","anchor":"ensure_minio/0"},{"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":"maybe_fake_minio/1","deprecated":false,"title":"maybe_fake_minio(context)","anchor":"maybe_fake_minio/1"},{"id":"minio_running?/0","deprecated":false,"title":"minio_running?()","anchor":"minio_running?/0"},{"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"}],"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":"bump_last_seen/2","deprecated":false,"title":"bump_last_seen(user_id, now)","anchor":"bump_last_seen/2"},{"id":"end_grace_period/1","deprecated":false,"title":"end_grace_period(user)","anchor":"end_grace_period/1"},{"id":"has_email_code?/1","deprecated":false,"title":"has_email_code?(user)","anchor":"has_email_code?/1"},{"id":"last_subscription_join_query/0","deprecated":false,"title":"last_subscription_join_query()","anchor":"last_subscription_join_query/0"},{"id":"last_subscription_query/0","deprecated":false,"title":"last_subscription_query()","anchor":"last_subscription_query/0"},{"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":"remove_grace_period/1","deprecated":false,"title":"remove_grace_period(user)","anchor":"remove_grace_period/1"},{"id":"start_grace_period/1","deprecated":false,"title":"start_grace_period(user)","anchor":"start_grace_period/1"},{"id":"start_manual_lock_grace_period/1","deprecated":false,"title":"start_manual_lock_grace_period(user)","anchor":"start_manual_lock_grace_period/1"},{"id":"start_trial/1","deprecated":false,"title":"start_trial(user)","anchor":"start_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.Verification","deprecated":false,"group":"","title":"Plausible.Verification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"user_agent/0","deprecated":false,"title":"user_agent()","anchor":"user_agent/0"}],"key":"functions"}]},{"id":"Plausible.Verification.Check","deprecated":false,"group":"","title":"Plausible.Verification.Check","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"state/0","deprecated":false,"title":"state()","anchor":"t:state/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"perform/1","deprecated":false,"title":"perform(state)","anchor":"c:perform/1"},{"id":"report_progress_as/0","deprecated":false,"title":"report_progress_as()","anchor":"c:report_progress_as/0"}],"key":"callbacks"}]},{"id":"Plausible.Verification.Checks","deprecated":false,"group":"","title":"Plausible.Verification.Checks","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"interpret_diagnostics/1","deprecated":false,"title":"interpret_diagnostics(state)","anchor":"interpret_diagnostics/1"},{"id":"run/3","deprecated":false,"title":"run(url, data_domain, opts \\\\ [])","anchor":"run/3"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.CSP","deprecated":false,"group":"","title":"Plausible.Verification.Checks.CSP","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.FetchBody","deprecated":false,"group":"","title":"Plausible.Verification.Checks.FetchBody","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.Installation","deprecated":false,"group":"","title":"Plausible.Verification.Checks.Installation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.ScanBody","deprecated":false,"group":"","title":"Plausible.Verification.Checks.ScanBody","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.Snippet","deprecated":false,"group":"","title":"Plausible.Verification.Checks.Snippet","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.SnippetCacheBust","deprecated":false,"group":"","title":"Plausible.Verification.Checks.SnippetCacheBust","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Diagnostics","deprecated":false,"group":"","title":"Plausible.Verification.Diagnostics","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"interpret/2","deprecated":false,"title":"interpret(diagnostics, url)","anchor":"interpret/2"}],"key":"functions"}]},{"id":"Plausible.Verification.Diagnostics.Result","deprecated":false,"group":"","title":"Plausible.Verification.Diagnostics.Result","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Plausible.Verification.Errors","deprecated":false,"group":"","title":"Plausible.Verification.Errors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all/0","deprecated":false,"title":"all()","anchor":"all/0"}],"key":"functions"}]},{"id":"Plausible.Verification.State","deprecated":false,"group":"","title":"Plausible.Verification.State","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"assign/2","deprecated":false,"title":"assign(state, assigns)","anchor":"assign/2"},{"id":"put_diagnostics/2","deprecated":false,"title":"put_diagnostics(state, diagnostics)","anchor":"put_diagnostics/2"}],"key":"functions"}]},{"id":"Plausible.Verification.URL","deprecated":false,"group":"","title":"Plausible.Verification.URL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bust_url/1","deprecated":false,"title":"bust_url(url)","anchor":"bust_url/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, usage_mod)","anchor":"check_enterprise_subscriber/2"},{"id":"day_of_month/1","deprecated":false,"title":"day_of_month(date)","anchor":"day_of_month/1"},{"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":"maybe_remove_grace_period/2","deprecated":false,"title":"maybe_remove_grace_period(subscriber, usage_mod)","anchor":"maybe_remove_grace_period/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.CleanUserSessions","deprecated":false,"group":"","title":"Plausible.Workers.CleanUserSessions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"grace_period_duration/0","deprecated":false,"title":"grace_period_duration()","anchor":"grace_period_duration/0"}],"key":"functions"}]},{"id":"Plausible.Workers.ClickhouseCleanSites","deprecated":false,"group":"","title":"Plausible.Workers.ClickhouseCleanSites","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_deleted_sites_with_clickhouse_data/0","deprecated":false,"title":"get_deleted_sites_with_clickhouse_data()","anchor":"get_deleted_sites_with_clickhouse_data/0"},{"id":"perform/1","deprecated":false,"title":"perform(job)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Plausible.Workers.ExpireDomainChangeTransitions","deprecated":false,"group":"","title":"Plausible.Workers.ExpireDomainChangeTransitions","sections":[]},{"id":"Plausible.Workers.ExportAnalytics","deprecated":false,"group":"","title":"Plausible.Workers.ExportAnalytics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"base_query/1","deprecated":false,"title":"base_query(site_id)","anchor":"base_query/1"}],"key":"functions"}]},{"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/2","deprecated":false,"title":"import_fail(site_import, opts)","anchor":"import_fail/2"},{"id":"import_fail_transient/1","deprecated":false,"title":"import_fail_transient(site_import)","anchor":"import_fail_transient/1"}],"key":"functions"}]},{"id":"Plausible.Workers.LocalImportAnalyticsCleaner","deprecated":false,"group":"","title":"Plausible.Workers.LocalImportAnalyticsCleaner","sections":[]},{"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.NotifyExportedAnalytics","deprecated":false,"group":"","title":"Plausible.Workers.NotifyExportedAnalytics","sections":[]},{"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.TrafficChangeNotifier","deprecated":false,"group":"","title":"Plausible.Workers.TrafficChangeNotifier","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":"component/0","deprecated":false,"title":"component()","anchor":"component/0"},{"id":"controller/0","deprecated":false,"title":"controller()","anchor":"controller/0"},{"id":"live_component/0","deprecated":false,"title":"live_component()","anchor":"live_component/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":"current_plan/2","deprecated":false,"title":"current_plan(conn, params)","anchor":"current_plan/2"},{"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":"goals_index/2","deprecated":false,"title":"goals_index(conn, params)","anchor":"goals_index/2"},{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/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":"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":"currency/2","deprecated":false,"title":"currency(conn, params)","anchor":"currency/2"},{"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":"build_intervals/4","deprecated":false,"title":"build_intervals(labels, date_range, start_fn, end_fn)","anchor":"build_intervals/4"},{"id":"channels/2","deprecated":false,"title":"channels(conn, params)","anchor":"channels/2"},{"id":"cities/2","deprecated":false,"title":"cities(conn, params)","anchor":"cities/2"},{"id":"comparison_query/1","deprecated":false,"title":"comparison_query(query)","anchor":"comparison_query/1"},{"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_value_filter_suggestions/2","deprecated":false,"title":"custom_prop_value_filter_suggestions(conn, params)","anchor":"custom_prop_value_filter_suggestions/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":"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":"put_combined_name_with_version/2","deprecated":false,"title":"put_combined_name_with_version(row, name_key)","anchor":"put_combined_name_with_version/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":"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, params)","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":"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":"request_activation_code/2","deprecated":false,"title":"request_activation_code(conn, params)","anchor":"request_activation_code/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":"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":"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":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"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":"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.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.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.FirstDashboardLaunchBanner","deprecated":false,"group":"","title":"PlausibleWeb.Components.FirstDashboardLaunchBanner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"set/1","deprecated":false,"title":"set(assigns)","anchor":"set/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.FlowProgress","deprecated":false,"group":"","title":"PlausibleWeb.Components.FlowProgress","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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":"delete_button/1","deprecated":false,"title":"delete_button(assigns)","anchor":"delete_button/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":"edit_button/1","deprecated":false,"title":"edit_button(assigns)","anchor":"edit_button/1"},{"id":"filter_bar/1","deprecated":false,"title":"filter_bar(assigns)","anchor":"filter_bar/1"},{"id":"focus_box/1","deprecated":false,"title":"focus_box(assigns)","anchor":"focus_box/1"},{"id":"focus_list/1","deprecated":false,"title":"focus_list(assigns)","anchor":"focus_list/1"},{"id":"h2/1","deprecated":false,"title":"h2(assigns)","anchor":"h2/1"},{"id":"notice/1","deprecated":false,"title":"notice(assigns)","anchor":"notice/1"},{"id":"settings_tiles/1","deprecated":false,"title":"settings_tiles(assigns)","anchor":"settings_tiles/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":"table/1","deprecated":false,"title":"table(assigns)","anchor":"table/1"},{"id":"td/1","deprecated":false,"title":"td(assigns)","anchor":"td/1"},{"id":"th/1","deprecated":false,"title":"th(assigns)","anchor":"th/1"},{"id":"tile/1","deprecated":false,"title":"tile(assigns)","anchor":"tile/1"},{"id":"title/1","deprecated":false,"title":"title(assigns)","anchor":"title/1"},{"id":"toggle_submit/1","deprecated":false,"title":"toggle_submit(assigns)","anchor":"toggle_submit/1"},{"id":"tooltip/1","deprecated":false,"title":"tooltip(assigns)","anchor":"tooltip/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_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":"debug_metadata/1","deprecated":false,"title":"debug_metadata(conn)","anchor":"debug_metadata/1"},{"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.DebugController","deprecated":false,"group":"","title":"PlausibleWeb.DebugController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clickhouse/2","deprecated":false,"title":"clickhouse(conn, params)","anchor":"clickhouse/2"}],"key":"functions"}]},{"id":"PlausibleWeb.DebugView","deprecated":false,"group":"","title":"PlausibleWeb.DebugView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"clickhouse.html/1","deprecated":false,"title":"clickhouse.html(assigns)","anchor":"clickhouse.html/1"},{"id":"controller_name/1","deprecated":false,"title":"controller_name(phoenix_controller_name)","anchor":"controller_name/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.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":"drop_notification/5","deprecated":false,"title":"drop_notification(email, site, current_visitors, dashboard_link, installation_link)","anchor":"drop_notification/5"},{"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/3","deprecated":false,"title":"existing_user_invitation(email, site, inviter)","anchor":"existing_user_invitation/3"},{"id":"export_failure/2","deprecated":false,"title":"export_failure(user, site)","anchor":"export_failure/2"},{"id":"export_success/3","deprecated":false,"title":"export_success(user, site, expires_at)","anchor":"export_success/3"},{"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/3","deprecated":false,"title":"invitation_accepted(inviter_email, invitee_email, site)","anchor":"invitation_accepted/3"},{"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/4","deprecated":false,"title":"new_user_invitation(email, invitation_id, site, inviter)","anchor":"new_user_invitation/4"},{"id":"over_limit_email/3","deprecated":false,"title":"over_limit_email(user, usage, suggested_plan)","anchor":"over_limit_email/3"},{"id":"ownership_transfer_accepted/3","deprecated":false,"title":"ownership_transfer_accepted(new_owner_email, inviter_email, site)","anchor":"ownership_transfer_accepted/3"},{"id":"ownership_transfer_rejected/1","deprecated":false,"title":"ownership_transfer_rejected(invitation)","anchor":"ownership_transfer_rejected/1"},{"id":"ownership_transfer_request/5","deprecated":false,"title":"ownership_transfer_request(email, invitation_id, site, inviter, new_owner_account)","anchor":"ownership_transfer_request/5"},{"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":"csv_import.html/1","deprecated":false,"title":"csv_import.html(assigns)","anchor":"csv_import.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":"drop_notification.html/1","deprecated":false,"title":"drop_notification.html(assigns)","anchor":"drop_notification.html/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":"export_failure.html/1","deprecated":false,"title":"export_failure.html(assigns)","anchor":"export_failure.html/1"},{"id":"export_success.html/1","deprecated":false,"title":"export_success.html(assigns)","anchor":"export_success.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/3","deprecated":false,"title":"error_tag(map_or_form, field, opts \\\\ [])","anchor":"error_tag/3"},{"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.Flows","deprecated":false,"group":"","title":"PlausibleWeb.Flows","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"domain_change/0","deprecated":false,"title":"domain_change()","anchor":"domain_change/0"},{"id":"invitation/0","deprecated":false,"title":"invitation()","anchor":"invitation/0"},{"id":"provisioning/0","deprecated":false,"title":"provisioning()","anchor":"provisioning/0"},{"id":"register/0","deprecated":false,"title":"register()","anchor":"register/0"},{"id":"review/0","deprecated":false,"title":"review()","anchor":"review/0"},{"id":"steps/1","deprecated":false,"title":"steps(flow)","anchor":"steps/1"},{"id":"valid_keys/0","deprecated":false,"title":"valid_keys()","anchor":"valid_keys/0"},{"id":"valid_values/0","deprecated":false,"title":"valid_values()","anchor":"valid_values/0"}],"key":"functions"}]},{"id":"PlausibleWeb.GoogleAnalyticsController","deprecated":false,"group":"","title":"PlausibleWeb.GoogleAnalyticsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/2","deprecated":false,"title":"confirm(conn, map)","anchor":"confirm/2"},{"id":"import/2","deprecated":false,"title":"import(conn, map)","anchor":"import/2"},{"id":"property/2","deprecated":false,"title":"property(conn, params)","anchor":"property/2"},{"id":"property_form/2","deprecated":false,"title":"property_form(conn, params)","anchor":"property_form/2"}],"key":"functions"}]},{"id":"PlausibleWeb.GoogleAnalyticsView","deprecated":false,"group":"","title":"PlausibleWeb.GoogleAnalyticsView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"confirm.html/1","deprecated":false,"title":"confirm.html(assigns)","anchor":"confirm.html/1"},{"id":"property_form.html/1","deprecated":false,"title":"property_form.html(assigns)","anchor":"property_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"}],"key":"functions"}]},{"id":"PlausibleWeb.HelpScoutController","deprecated":false,"group":"","title":"PlausibleWeb.HelpScoutController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"callback/2","deprecated":false,"title":"callback(conn, arg2)","anchor":"callback/2"},{"id":"search/2","deprecated":false,"title":"search(conn, map)","anchor":"search/2"},{"id":"show/2","deprecated":false,"title":"show(conn, params)","anchor":"show/2"}],"key":"functions"}]},{"id":"PlausibleWeb.HelpScoutView","deprecated":false,"group":"","title":"PlausibleWeb.HelpScoutView","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.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.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":"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.html/1","deprecated":false,"title":"settings.html(assigns)","anchor":"settings.html/1"},{"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.AuthContext","deprecated":false,"group":"","title":"PlausibleWeb.Live.AuthContext","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.CSVExport","deprecated":false,"group":"","title":"PlausibleWeb.Live.CSVExport","sections":[]},{"id":"PlausibleWeb.Live.CSVImport","deprecated":false,"group":"","title":"PlausibleWeb.Live.CSVImport","sections":[]},{"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":"combo_dropdown/1","deprecated":false,"title":"combo_dropdown(assigns)","anchor":"combo_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":"open/2","deprecated":false,"title":"open(socket, id)","anchor":"open/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.Verification","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Verification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/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, session, 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, params, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.GoalSettings.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.GoalSettings.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_form/1","deprecated":false,"title":"create_form(assigns)","anchor":"create_form/1"},{"id":"custom_event_fields/1","deprecated":false,"title":"custom_event_fields(assigns)","anchor":"custom_event_fields/1"},{"id":"edit_form/1","deprecated":false,"title":"edit_form(assigns)","anchor":"edit_form/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, 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":"revenue_goal_settings/1","deprecated":false,"title":"revenue_goal_settings(assigns)","anchor":"revenue_goal_settings/1"},{"id":"suggest_event_names/3","deprecated":false,"title":"suggest_event_names(input, site, existing_goals)","anchor":"suggest_event_names/3"},{"id":"suggest_page_paths/2","deprecated":false,"title":"suggest_page_paths(input, site)","anchor":"suggest_page_paths/2"},{"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":"custom_event_description/1","deprecated":false,"title":"custom_event_description(goal)","anchor":"custom_event_description/1"},{"id":"goal_description/1","deprecated":false,"title":"goal_description(assigns)","anchor":"goal_description/1"},{"id":"pageview_description/1","deprecated":false,"title":"pageview_description(goal)","anchor":"pageview_description/1"},{"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.Installation","deprecated":false,"group":"","title":"PlausibleWeb.Live.Installation","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(arg1, socket)","anchor":"handle_info/2"},{"id":"handle_params/3","deprecated":false,"title":"handle_params(params, uri, socket)","anchor":"handle_params/3"},{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"render_snippet_404/0","deprecated":false,"title":"render_snippet_404()","anchor":"render_snippet_404/0"},{"id":"render_snippet_404/1","deprecated":false,"title":"render_snippet_404(arg)","anchor":"render_snippet_404/1"},{"id":"script_extension_params/0","deprecated":false,"title":"script_extension_params()","anchor":"script_extension_params/0"}],"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.HostnameRules","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.HostnameRules","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":"suggest_hostnames/3","deprecated":false,"title":"suggest_hostnames(input, options, site)","anchor":"suggest_hostnames/3"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Shields.Hostnames","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.Hostnames","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.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.Shields.PageRules","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.PageRules","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":"suggest_page_paths/3","deprecated":false,"title":"suggest_page_paths(input, options, site)","anchor":"suggest_page_paths/3"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Shields.Pages","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.Pages","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.Sites","deprecated":false,"group":"","title":"PlausibleWeb.Live.Sites","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check_feature_access/2","deprecated":false,"title":"check_feature_access(site, user)","anchor":"check_feature_access/2"},{"id":"check_features/2","deprecated":false,"title":"check_features(invitation, user)","anchor":"check_features/2"},{"id":"check_needs_to_upgrade/1","deprecated":false,"title":"check_needs_to_upgrade(user)","anchor":"check_needs_to_upgrade/1"},{"id":"ellipsis_menu/1","deprecated":false,"title":"ellipsis_menu(assigns)","anchor":"ellipsis_menu/1"},{"id":"ensure_can_take_ownership/2","deprecated":false,"title":"ensure_can_take_ownership(site, user)","anchor":"ensure_can_take_ownership/2"},{"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":"has_sites?/1","deprecated":false,"title":"has_sites?(user)","anchor":"has_sites?/1"},{"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, session, socket)","anchor":"mount/3"},{"id":"owns_sites?/2","deprecated":false,"title":"owns_sites?(user, sites)","anchor":"owns_sites?/2"},{"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.Live.Verification","deprecated":false,"group":"","title":"PlausibleWeb.Live.Verification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, _, 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.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.Funnels","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.Funnels","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.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.Funnel","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Funnel","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.Funnel.CreateRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.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.Funnel.ListResponse","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.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","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.Funnel","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Funnel","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.AuthorizePublicAPI","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.AuthorizePublicAPI","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.AuthorizeSiteAccess","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.AuthorizeSiteAccess","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, arg)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(allowed_roles)","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.Plugs.UserSessionTouch","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.UserSessionTouch","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.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(opts \\\\ [])","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":"docs_stats_api/2","deprecated":false,"title":"docs_stats_api(conn, _)","anchor":"docs_stats_api/2"},{"id":"external_api/2","deprecated":false,"title":"external_api(conn, _)","anchor":"external_api/2"},{"id":"flags/2","deprecated":false,"title":"flags(conn, _)","anchor":"flags/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.SettingsController","deprecated":false,"group":"","title":"PlausibleWeb.SettingsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api_keys/2","deprecated":false,"title":"api_keys(conn, params)","anchor":"api_keys/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":"danger_zone/2","deprecated":false,"title":"danger_zone(conn, params)","anchor":"danger_zone/2"},{"id":"delete_api_key/2","deprecated":false,"title":"delete_api_key(conn, map)","anchor":"delete_api_key/2"},{"id":"delete_session/2","deprecated":false,"title":"delete_session(conn, map)","anchor":"delete_session/2"},{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/2"},{"id":"invoices/2","deprecated":false,"title":"invoices(conn, params)","anchor":"invoices/2"},{"id":"new_api_key/2","deprecated":false,"title":"new_api_key(conn, params)","anchor":"new_api_key/2"},{"id":"preferences/2","deprecated":false,"title":"preferences(conn, params)","anchor":"preferences/2"},{"id":"security/2","deprecated":false,"title":"security(conn, params)","anchor":"security/2"},{"id":"subscription/2","deprecated":false,"title":"subscription(conn, params)","anchor":"subscription/2"},{"id":"update_email/2","deprecated":false,"title":"update_email(conn, map)","anchor":"update_email/2"},{"id":"update_name/2","deprecated":false,"title":"update_name(conn, map)","anchor":"update_name/2"},{"id":"update_password/2","deprecated":false,"title":"update_password(conn, map)","anchor":"update_password/2"},{"id":"update_theme/2","deprecated":false,"title":"update_theme(conn, map)","anchor":"update_theme/2"}],"key":"functions"}]},{"id":"PlausibleWeb.SettingsView","deprecated":false,"group":"","title":"PlausibleWeb.SettingsView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"api_keys.html/1","deprecated":false,"title":"api_keys.html(assigns)","anchor":"api_keys.html/1"},{"id":"danger_zone.html/1","deprecated":false,"title":"danger_zone.html(assigns)","anchor":"danger_zone.html/1"},{"id":"format_invoices/1","deprecated":false,"title":"format_invoices(invoice_list)","anchor":"format_invoices/1"},{"id":"invoices.html/1","deprecated":false,"title":"invoices.html(assigns)","anchor":"invoices.html/1"},{"id":"new_api_key.html/1","deprecated":false,"title":"new_api_key.html(assigns)","anchor":"new_api_key.html/1"},{"id":"preferences.html/1","deprecated":false,"title":"preferences.html(assigns)","anchor":"preferences.html/1"},{"id":"present_subscription_status/1","deprecated":false,"title":"present_subscription_status(status)","anchor":"present_subscription_status/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"security.html/1","deprecated":false,"title":"security.html(assigns)","anchor":"security.html/1"},{"id":"subscription.html/1","deprecated":false,"title":"subscription.html(assigns)","anchor":"subscription.html/1"},{"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":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"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_by_user/2","deprecated":false,"title":"remove_member_by_user(conn, params)","anchor":"remove_member_by_user/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_by_user/2","deprecated":false,"title":"update_role_by_user(conn, map)","anchor":"update_role_by_user/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_traffic_change_notification_recipient/2","deprecated":false,"title":"add_traffic_change_notification_recipient(conn, map)","anchor":"add_traffic_change_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":"csv_import/2","deprecated":false,"title":"csv_import(conn, params)","anchor":"csv_import/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_traffic_change_notification/2","deprecated":false,"title":"disable_traffic_change_notification(conn, map)","anchor":"disable_traffic_change_notification/2"},{"id":"disable_weekly_report/2","deprecated":false,"title":"disable_weekly_report(conn, params)","anchor":"disable_weekly_report/2"},{"id":"download_export/2","deprecated":false,"title":"download_export(conn, params)","anchor":"download_export/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_traffic_change_notification/2","deprecated":false,"title":"enable_traffic_change_notification(conn, map)","anchor":"enable_traffic_change_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":"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_traffic_change_notification_recipient/2","deprecated":false,"title":"remove_traffic_change_notification_recipient(conn, map)","anchor":"remove_traffic_change_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_traffic_change_notification/2","deprecated":false,"title":"update_traffic_change_notification(conn, map)","anchor":"update_traffic_change_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":"csv_import.html/1","deprecated":false,"title":"csv_import.html(assigns)","anchor":"csv_import.html/1"},{"id":"edit_shared_link.html/1","deprecated":false,"title":"edit_shared_link.html(assigns)","anchor":"edit_shared_link.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_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":"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"}],"key":"functions"}]},{"id":"PlausibleWeb.TestController","deprecated":false,"group":"","title":"PlausibleWeb.TestController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api_basic/2","deprecated":false,"title":"api_basic(conn, params)","anchor":"api_basic/2"},{"id":"browser_basic/2","deprecated":false,"title":"browser_basic(conn, params)","anchor":"browser_basic/2"}],"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, arg2)","anchor":"monthly_report/2"},{"id":"weekly_report/2","deprecated":false,"title":"weekly_report(conn, arg2)","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"}]},{"id":"PlausibleWeb.UserAuth","deprecated":false,"group":"","title":"PlausibleWeb.UserAuth","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_user_session/1","deprecated":false,"title":"get_user_session(conn_or_session)","anchor":"get_user_session/1"},{"id":"log_in_user/3","deprecated":false,"title":"log_in_user(conn, user, redirect_path \\\\ nil)","anchor":"log_in_user/3"},{"id":"log_out_user/1","deprecated":false,"title":"log_out_user(conn)","anchor":"log_out_user/1"},{"id":"revoke_all_user_sessions/2","deprecated":false,"title":"revoke_all_user_sessions(user, opts \\\\ [])","anchor":"revoke_all_user_sessions/2"},{"id":"revoke_user_session/2","deprecated":false,"title":"revoke_user_session(user, session_id)","anchor":"revoke_user_session/2"},{"id":"set_logged_in_cookie/1","deprecated":false,"title":"set_logged_in_cookie(conn)","anchor":"set_logged_in_cookie/1"},{"id":"touch_user_session/2","deprecated":false,"title":"touch_user_session(user_session, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"touch_user_session/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 +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":"ce?/0","deprecated":false,"title":"ce?()","anchor":"ce?/0"},{"id":"ee?/0","deprecated":false,"title":"ee?()","anchor":"ee?/0"},{"id":"on_ce/1","deprecated":false,"title":"on_ce(clauses)","anchor":"on_ce/1"},{"id":"on_ee/1","deprecated":false,"title":"on_ee(clauses)","anchor":"on_ee/1"},{"id":"product_name/0","deprecated":false,"title":"product_name()","anchor":"product_name/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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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":"Types","nodes":[{"id":"rate_limit_type/0","deprecated":false,"title":"rate_limit_type()","anchor":"t:rate_limit_type/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"check_password/2","deprecated":false,"title":"check_password(user, password)","anchor":"check_password/2"},{"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":"get_user_by/1","deprecated":false,"title":"get_user_by(opts)","anchor":"get_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":"rate_limit/2","deprecated":false,"title":"rate_limit(limit_type, key)","anchor":"rate_limit/2"},{"id":"rate_limits/0","deprecated":false,"title":"rate_limits()","anchor":"rate_limits/0"},{"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_or_team)","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_or_team)","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":"force_disable/1","deprecated":false,"title":"force_disable(user)","anchor":"force_disable/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":"name_changeset/2","deprecated":false,"title":"name_changeset(user, attrs \\\\ %{})","anchor":"name_changeset/2"},{"id":"new/1","deprecated":false,"title":"new(attrs \\\\ %{})","anchor":"new/1"},{"id":"password_changeset/2","deprecated":false,"title":"password_changeset(user, params \\\\ %{})","anchor":"password_changeset/2"},{"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":"theme_changeset/2","deprecated":false,"title":"theme_changeset(user, attrs \\\\ %{})","anchor":"theme_changeset/2"},{"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":"after_update/2","deprecated":false,"title":"after_update(conn, user)","anchor":"after_update/2"},{"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":"disable_2fa/1","deprecated":false,"title":"disable_2fa(user)","anchor":"disable_2fa/1"},{"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.Auth.UserSession","deprecated":false,"group":"","title":"Plausible.Auth.UserSession","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new_session/3","deprecated":false,"title":"new_session(user, device, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"new_session/3"},{"id":"timeout_duration/0","deprecated":false,"title":"timeout_duration()","anchor":"timeout_duration/0"},{"id":"touch_session/2","deprecated":false,"title":"touch_session(session, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"touch_session/2"}],"key":"functions"}]},{"id":"Plausible.Auth.UserSessions","deprecated":false,"group":"","title":"Plausible.Auth.UserSessions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"last_used_humanize/2","deprecated":false,"title":"last_used_humanize(user_session, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"last_used_humanize/2"},{"id":"list_for_user/2","deprecated":false,"title":"list_for_user(user, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"list_for_user/2"}],"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)","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)","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":"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(model, attrs \\\\ %{})","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Billing.EnterprisePlanAdmin","deprecated":false,"group":"","title":"Plausible.Billing.EnterprisePlanAdmin","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(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(arg1)","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/3","deprecated":false,"title":"toggle(t, t, t)","anchor":"c:toggle/3"},{"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/2","deprecated":false,"title":"fetch_prices(product_ids, customer_ip)","anchor":"fetch_prices/2"},{"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(subscription, opts \\\\ [])","anchor":"available_plans_for/2"},{"id":"business_plans_for/1","deprecated":false,"title":"business_plans_for(subscription)","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/2","deprecated":false,"title":"get_price_for(enterprise_plan, customer_ip)","anchor":"get_price_for/2"},{"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(subscription)","anchor":"growth_plans_for/1"},{"id":"latest_enterprise_plan_with_price/2","deprecated":false,"title":"latest_enterprise_plan_with_price(user, customer_ip)","anchor":"latest_enterprise_plan_with_price/2"},{"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_by_usage/2","deprecated":false,"title":"suggest_by_usage(subscription, usage_during_cycle)","anchor":"suggest_by_usage/2"},{"id":"with_prices/2","deprecated":false,"title":"with_prices(plans, customer_ip \\\\ \"127.0.0.1\")","anchor":"with_prices/2"},{"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":"Functions","nodes":[{"id":"below_limit?/2","deprecated":false,"title":"below_limit?(usage, limit)","anchor":"below_limit?/2"},{"id":"eligible_for_upgrade?/1","deprecated":false,"title":"eligible_for_upgrade?(usage)","anchor":"eligible_for_upgrade?/1"},{"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_feature_access/2","deprecated":false,"title":"ensure_feature_access(usage, plan)","anchor":"ensure_feature_access/2"},{"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":"exceeded_cycles/2","deprecated":false,"title":"exceeded_cycles(cycles_usage, allowed_volume)","anchor":"exceeded_cycles/2"},{"id":"exceeds_last_two_usage_cycles?/2","deprecated":false,"title":"exceeds_last_two_usage_cycles?(cycles_usage, allowed_volume)","anchor":"exceeds_last_two_usage_cycles?/2"},{"id":"suggest_tier/3","deprecated":false,"title":"suggest_tier(usage, highest_growth_plan, highest_business_plan)","anchor":"suggest_tier/3"},{"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.Adapter","deprecated":false,"group":"","title":"Plausible.Cache.Adapter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"child_spec/3","deprecated":false,"title":"child_spec(name, child_id, opts \\\\ [])","anchor":"child_spec/3"},{"id":"delete/2","deprecated":false,"title":"delete(cache_name, key)","anchor":"delete/2"},{"id":"fetch/3","deprecated":false,"title":"fetch(cache_name, key, fallback_fn)","anchor":"fetch/3"},{"id":"get/2","deprecated":false,"title":"get(cache_name, key)","anchor":"get/2"},{"id":"get/3","deprecated":false,"title":"get(cache_name, key, fallback_fn)","anchor":"get/3"},{"id":"keys/1","deprecated":false,"title":"keys(cache_name)","anchor":"keys/1"},{"id":"put/4","deprecated":false,"title":"put(cache_name, key, value, opts \\\\ [])","anchor":"put/4"},{"id":"put_many/2","deprecated":false,"title":"put_many(cache_name, items)","anchor":"put_many/2"},{"id":"size/1","deprecated":false,"title":"size(cache_name)","anchor":"size/1"},{"id":"with_lock/4","deprecated":false,"title":"with_lock(cache_name, key, timeout, fun)","anchor":"with_lock/4"}],"key":"functions"}]},{"id":"Plausible.Cache.Stats","deprecated":false,"group":"","title":"Plausible.Cache.Stats","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bump/2","deprecated":false,"title":"bump(cache_name, type)","anchor":"bump/2"},{"id":"child_spec/1","deprecated":false,"title":"child_spec(init_arg)","anchor":"child_spec/1"},{"id":"gather/1","deprecated":false,"title":"gather(cache_name)","anchor":"gather/1"},{"id":"handle_telemetry_event/4","deprecated":false,"title":"handle_telemetry_event(list, measurments, map, _)","anchor":"handle_telemetry_event/4"},{"id":"hit_rate/1","deprecated":false,"title":"hit_rate(cache_name)","anchor":"hit_rate/1"},{"id":"init/1","deprecated":false,"title":"init(atom)","anchor":"init/1"},{"id":"size/1","deprecated":false,"title":"size(cache_name)","anchor":"size/1"},{"id":"start_link/1","deprecated":false,"title":"start_link(opts)","anchor":"start_link/1"}],"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":"merge_session/2","deprecated":false,"title":"merge_session(event, session)","anchor":"merge_session/2"},{"id":"new/1","deprecated":false,"title":"new(attrs)","anchor":"new/1"}],"key":"functions"}]},{"id":"Plausible.ClickhouseLocationData","deprecated":false,"group":"","title":"Plausible.ClickhouseLocationData","sections":[]},{"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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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/2","deprecated":false,"title":"parallel_tasks(queries, opts \\\\ [])","anchor":"parallel_tasks/2"},{"id":"preload/3","deprecated":false,"title":"preload(struct_or_structs_or_nil, preloads, opts \\\\ [])","anchor":"preload/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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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_bool_from_path_or_env/3","deprecated":false,"title":"get_bool_from_path_or_env(config_dir, var_name, default \\\\ nil)","anchor":"get_bool_from_path_or_env/3"},{"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.CrmExtensions","deprecated":false,"group":"","title":"Plausible.CrmExtensions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"javascripts/1","deprecated":false,"title":"javascripts(arg1)","anchor":"javascripts/1"}],"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.AcquisitionChannel","deprecated":false,"group":"","title":"Plausible.DataMigration.AcquisitionChannel","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/3","deprecated":false,"title":"confirm(message, func, default_choice \\\\ :yes)","anchor":"confirm/3"},{"id":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"}],"key":"functions"}]},{"id":"Plausible.DataMigration.BackfillTeams","deprecated":false,"group":"","title":"Plausible.DataMigration.BackfillTeams","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"delete_orphaned_teams/1","deprecated":false,"title":"delete_orphaned_teams(teams)","anchor":"delete_orphaned_teams/1"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"}],"key":"functions"}]},{"id":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource","deprecated":false,"group":"","title":"Plausible.DataMigration.CleanUpDemoSiteReferrerSource","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(timeout \\\\ 60000)","anchor":"run/1"}],"key":"functions"}]},{"id":"Plausible.DataMigration.ClickhouseRepo","deprecated":false,"group":"","title":"Plausible.DataMigration.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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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.LocationsSync","deprecated":false,"group":"","title":"Plausible.DataMigration.LocationsSync","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/3","deprecated":false,"title":"confirm(message, func, default_choice \\\\ :yes)","anchor":"confirm/3"},{"id":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"out_of_date?/0","deprecated":false,"title":"out_of_date?()","anchor":"out_of_date?/0"},{"id":"run/0","deprecated":false,"title":"run()","anchor":"run/0"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"}],"key":"functions"}]},{"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":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"}],"key":"functions"}]},{"id":"Plausible.DataMigration.PopulateEventSessionColumns","deprecated":false,"group":"","title":"Plausible.DataMigration.PopulateEventSessionColumns","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/3","deprecated":false,"title":"confirm(message, func, default_choice \\\\ :yes)","anchor":"confirm/3"},{"id":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"kill/1","deprecated":false,"title":"kill(opts \\\\ [])","anchor":"kill/1"},{"id":"report_progress/1","deprecated":false,"title":"report_progress(opts \\\\ [])","anchor":"report_progress/1"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"},{"id":"wait_until_mutations_complete/1","deprecated":false,"title":"wait_until_mutations_complete(opts \\\\ [])","anchor":"wait_until_mutations_complete/1"}],"key":"functions"}]},{"id":"Plausible.DataMigration.PostgresRepo","deprecated":false,"group":"","title":"Plausible.DataMigration.PostgresRepo","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":"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":"start/2","deprecated":false,"title":"start(url, opts \\\\ [])","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":"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.DataMigration.SiteImports","deprecated":false,"group":"","title":"Plausible.DataMigration.SiteImports","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"}],"key":"functions"}]},{"id":"Plausible.DataMigration.TeamsConsitencyCheck","deprecated":false,"group":"","title":"Plausible.DataMigration.TeamsConsitencyCheck","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/0","deprecated":false,"title":"run()","anchor":"run/0"}],"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":"do_run/3","deprecated":false,"title":"do_run(name, query, options \\\\ [])","anchor":"do_run/3"},{"id":"run/1","deprecated":false,"title":"run(opts \\\\ [])","anchor":"run/1"},{"id":"run_sql/3","deprecated":false,"title":"run_sql(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql/3"},{"id":"run_sql_confirm/3","deprecated":false,"title":"run_sql_confirm(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_confirm/3"},{"id":"run_sql_multi/3","deprecated":false,"title":"run_sql_multi(name, assigns \\\\ [], options \\\\ [])","anchor":"run_sql_multi/3"},{"id":"unwrap/2","deprecated":false,"title":"unwrap(name, assigns \\\\ [])","anchor":"unwrap/2"}],"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.Ecto.Types.CompiledRegex","deprecated":false,"group":"","title":"Plausible.Ecto.Types.CompiledRegex","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.Exports","deprecated":false,"group":"","title":"Plausible.Exports","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"export/0","deprecated":false,"title":"export()","anchor":"t:export/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"archive_filename/2","deprecated":false,"title":"archive_filename(domain, created_on)","anchor":"archive_filename/2"},{"id":"content_disposition/1","deprecated":false,"title":"content_disposition(filename)","anchor":"content_disposition/1"},{"id":"date_range/2","deprecated":false,"title":"date_range(site_id, timezone)","anchor":"date_range/2"},{"id":"delete_local_export/1","deprecated":false,"title":"delete_local_export(site_id)","anchor":"delete_local_export/1"},{"id":"delete_s3_export!/1","deprecated":false,"title":"delete_s3_export!(site_id)","anchor":"delete_s3_export!/1"},{"id":"export_queries/2","deprecated":false,"title":"export_queries(site_id, opts \\\\ [])","anchor":"export_queries/2"},{"id":"get_last_export_job/1","deprecated":false,"title":"get_last_export_job(site_id)","anchor":"get_last_export_job/1"},{"id":"get_local_export/3","deprecated":false,"title":"get_local_export(site_id, domain, timezone)","anchor":"get_local_export/3"},{"id":"get_s3_export!/2","deprecated":false,"title":"get_s3_export!(site_id, retries \\\\ 0)","anchor":"get_s3_export!/2"},{"id":"oban_listen/0","deprecated":false,"title":"oban_listen()","anchor":"oban_listen/0"},{"id":"schedule_local_export/2","deprecated":false,"title":"schedule_local_export(site_id, email_to)","anchor":"schedule_local_export/2"},{"id":"schedule_s3_export/2","deprecated":false,"title":"schedule_s3_export(site_id, email_to)","anchor":"schedule_s3_export/2"},{"id":"stream_archive/3","deprecated":false,"title":"stream_archive(conn, named_queries, opts \\\\ [])","anchor":"stream_archive/3"}],"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":"drop_notification_factory/0","deprecated":false,"title":"drop_notification_factory()","anchor":"drop_notification_factory/0"},{"id":"enterprise_plan_factory/0","deprecated":false,"title":"enterprise_plan_factory()","anchor":"enterprise_plan_factory/0"},{"id":"event_factory/1","deprecated":false,"title":"event_factory(attrs)","anchor":"event_factory/1"},{"id":"factory/1","deprecated":false,"title":"factory(factory_name)","anchor":"factory/1"},{"id":"goal_factory/1","deprecated":false,"title":"goal_factory(attrs)","anchor":"goal_factory/1"},{"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":"guest_invitation_factory/0","deprecated":false,"title":"guest_invitation_factory()","anchor":"guest_invitation_factory/0"},{"id":"guest_membership_factory/0","deprecated":false,"title":"guest_membership_factory()","anchor":"guest_membership_factory/0"},{"id":"imported_browsers_factory/0","deprecated":false,"title":"imported_browsers_factory()","anchor":"imported_browsers_factory/0"},{"id":"imported_custom_events_factory/0","deprecated":false,"title":"imported_custom_events_factory()","anchor":"imported_custom_events_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":"pageleave_factory/1","deprecated":false,"title":"pageleave_factory(attrs)","anchor":"pageleave_factory/1"},{"id":"pageview_factory/1","deprecated":false,"title":"pageview_factory(attrs)","anchor":"pageview_factory/1"},{"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":"site_transfer_factory/0","deprecated":false,"title":"site_transfer_factory()","anchor":"site_transfer_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":"team_factory/0","deprecated":false,"title":"team_factory()","anchor":"team_factory/0"},{"id":"team_invitation_factory/0","deprecated":false,"title":"team_invitation_factory()","anchor":"team_invitation_factory/0"},{"id":"team_membership_factory/0","deprecated":false,"title":"team_membership_factory()","anchor":"team_membership_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.File","deprecated":false,"group":"","title":"Plausible.File","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"mv!/2","deprecated":false,"title":"mv!(source, destination)","anchor":"mv!/2"}],"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_steps/2","deprecated":false,"title":"put_steps(changeset, steps)","anchor":"put_steps/2"}],"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, goal_or_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":"edit_changeset/3","deprecated":false,"title":"edit_changeset(funnel, name, steps)","anchor":"edit_changeset/3"},{"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"},{"id":"update/3","deprecated":false,"title":"update(funnel, name, steps)","anchor":"update/3"},{"id":"with_goals_query/1","deprecated":false,"title":"with_goals_query(site)","anchor":"with_goals_query/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"},{"id":"display_name/1","deprecated":false,"title":"display_name(goal)","anchor":"display_name/1"},{"id":"max_event_name_length/0","deprecated":false,"title":"max_event_name_length()","anchor":"max_event_name_length/0"},{"id":"type/1","deprecated":false,"title":"type(map)","anchor":"type/1"}],"key":"functions"}]},{"id":"Plausible.Goal.Revenue","deprecated":false,"group":"","title":"Plausible.Goal.Revenue","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"currency_option/1","deprecated":false,"title":"currency_option(code)","anchor":"currency_option/1"},{"id":"currency_options/0","deprecated":false,"title":"currency_options()","anchor":"currency_options/0"},{"id":"display/1","deprecated":false,"title":"display(code)","anchor":"display/1"},{"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":"batch_create_event_goals/2","deprecated":false,"title":"batch_create_event_goals(names, site)","anchor":"batch_create_event_goals/2"},{"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":"create_404/1","deprecated":false,"title":"create_404(site)","anchor":"create_404/1"},{"id":"create_file_downloads/1","deprecated":false,"title":"create_file_downloads(site)","anchor":"create_file_downloads/1"},{"id":"create_outbound_links/1","deprecated":false,"title":"create_outbound_links(site)","anchor":"create_outbound_links/1"},{"id":"delete/2","deprecated":false,"title":"delete(id, site_id)","anchor":"delete/2"},{"id":"delete_404/1","deprecated":false,"title":"delete_404(site)","anchor":"delete_404/1"},{"id":"delete_file_downloads/1","deprecated":false,"title":"delete_file_downloads(site)","anchor":"delete_file_downloads/1"},{"id":"delete_outbound_links/1","deprecated":false,"title":"delete_outbound_links(site)","anchor":"delete_outbound_links/1"},{"id":"find_or_create/2","deprecated":false,"title":"find_or_create(site, params)","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"},{"id":"get/2","deprecated":false,"title":"get(site, id)","anchor":"get/2"},{"id":"list_revenue_goals/1","deprecated":false,"title":"list_revenue_goals(site)","anchor":"list_revenue_goals/1"},{"id":"update/2","deprecated":false,"title":"update(goal, params)","anchor":"update/2"}],"key":"functions"}]},{"id":"Plausible.Google.API","deprecated":false,"group":"","title":"Plausible.Google.API","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_access_token!/1","deprecated":false,"title":"fetch_access_token!(code)","anchor":"fetch_access_token!/1"},{"id":"fetch_stats/4","deprecated":false,"title":"fetch_stats(site, query, pagination, search)","anchor":"fetch_stats/4"},{"id":"fetch_verified_properties/1","deprecated":false,"title":"fetch_verified_properties(auth)","anchor":"fetch_verified_properties/1"},{"id":"get_analytics_end_date/2","deprecated":false,"title":"get_analytics_end_date(access_token, property)","anchor":"get_analytics_end_date/2"},{"id":"get_analytics_start_date/2","deprecated":false,"title":"get_analytics_start_date(access_token, property)","anchor":"get_analytics_start_date/2"},{"id":"get_property/2","deprecated":false,"title":"get_property(access_token, property)","anchor":"get_property/2"},{"id":"import_authorize_url/1","deprecated":false,"title":"import_authorize_url(site_id)","anchor":"import_authorize_url/1"},{"id":"list_properties/1","deprecated":false,"title":"list_properties(access_token)","anchor":"list_properties/1"},{"id":"maybe_refresh_token/1","deprecated":false,"title":"maybe_refresh_token(auth)","anchor":"maybe_refresh_token/1"},{"id":"property?/1","deprecated":false,"title":"property?(value)","anchor":"property?/1"},{"id":"search_console_authorize_url/1","deprecated":false,"title":"search_console_authorize_url(site_id)","anchor":"search_console_authorize_url/1"}],"key":"functions"}]},{"id":"Plausible.Google.API.Mock","deprecated":false,"group":"","title":"Plausible.Google.API.Mock","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"fetch_stats/4","deprecated":false,"title":"fetch_stats(auth, query, pagination, search)","anchor":"fetch_stats/4"}],"key":"functions"}]},{"id":"Plausible.Google.GA4.API","deprecated":false,"group":"","title":"Plausible.Google.GA4.API","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"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":"get_analytics_end_date/2","deprecated":false,"title":"get_analytics_end_date(access_token, property)","anchor":"get_analytics_end_date/2"},{"id":"get_analytics_start_date/2","deprecated":false,"title":"get_analytics_start_date(access_token, property)","anchor":"get_analytics_start_date/2"},{"id":"get_property/2","deprecated":false,"title":"get_property(access_token, lookup_property)","anchor":"get_property/2"},{"id":"import_analytics/4","deprecated":false,"title":"import_analytics(date_range, property, auth, opts)","anchor":"import_analytics/4"},{"id":"list_properties/1","deprecated":false,"title":"list_properties(access_token)","anchor":"list_properties/1"}],"key":"functions"}]},{"id":"Plausible.Google.GA4.HTTP","deprecated":false,"group":"","title":"Plausible.Google.GA4.HTTP","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_analytics_end_date/2","deprecated":false,"title":"get_analytics_end_date(access_token, property)","anchor":"get_analytics_end_date/2"},{"id":"get_analytics_start_date/2","deprecated":false,"title":"get_analytics_start_date(access_token, property)","anchor":"get_analytics_start_date/2"},{"id":"get_property/2","deprecated":false,"title":"get_property(access_token, property)","anchor":"get_property/2"},{"id":"get_report/1","deprecated":false,"title":"get_report(report_request)","anchor":"get_report/1"},{"id":"list_accounts_for_user/1","deprecated":false,"title":"list_accounts_for_user(access_token)","anchor":"list_accounts_for_user/1"}],"key":"functions"}]},{"id":"Plausible.Google.GA4.ReportRequest","deprecated":false,"group":"","title":"Plausible.Google.GA4.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.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":"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, pagination, search_console_filters)","anchor":"list_stats/5"},{"id":"refresh_auth_token/1","deprecated":false,"title":"refresh_auth_token(refresh_token)","anchor":"refresh_auth_token/1"}],"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.HelpScout","deprecated":false,"group":"","title":"Plausible.HelpScout","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"signature_error/0","deprecated":false,"title":"signature_error()","anchor":"t:signature_error/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"get_details_for_customer/1","deprecated":false,"title":"get_details_for_customer(customer_id)","anchor":"get_details_for_customer/1"},{"id":"get_details_for_emails/2","deprecated":false,"title":"get_details_for_emails(emails, customer_id)","anchor":"get_details_for_emails/2"},{"id":"search_users/2","deprecated":false,"title":"search_users(term, customer_id)","anchor":"search_users/2"},{"id":"signature_errors/0","deprecated":false,"title":"signature_errors()","anchor":"signature_errors/0"},{"id":"validate_signature/1","deprecated":false,"title":"validate_signature(conn)","anchor":"validate_signature/1"}],"key":"functions"}]},{"id":"Plausible.HelpScout.Vault","deprecated":false,"group":"","title":"Plausible.HelpScout.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.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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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":"clamp_dates/3","deprecated":false,"title":"clamp_dates(site, start_date, end_date)","anchor":"clamp_dates/3"},{"id":"clamp_dates/4","deprecated":false,"title":"clamp_dates(occupied_ranges, cutoff_date, start_date, end_date)","anchor":"clamp_dates/4"},{"id":"delete_imports_for_site/1","deprecated":false,"title":"delete_imports_for_site(site)","anchor":"delete_imports_for_site/1"},{"id":"get_cutoff_date/1","deprecated":false,"title":"get_cutoff_date(site)","anchor":"get_cutoff_date/1"},{"id":"get_import/2","deprecated":false,"title":"get_import(site, import_id)","anchor":"get_import/2"},{"id":"get_imports_date_range/1","deprecated":false,"title":"get_imports_date_range(site)","anchor":"get_imports_date_range/1"},{"id":"get_legacy_import/1","deprecated":false,"title":"get_legacy_import(site)","anchor":"get_legacy_import/1"},{"id":"get_occupied_date_ranges/1","deprecated":false,"title":"get_occupied_date_ranges(site)","anchor":"get_occupied_date_ranges/1"},{"id":"goals_with_path/0","deprecated":false,"title":"goals_with_path()","anchor":"goals_with_path/0"},{"id":"goals_with_url/0","deprecated":false,"title":"goals_with_url()","anchor":"goals_with_url/0"},{"id":"imported_custom_props/0","deprecated":false,"title":"imported_custom_props()","anchor":"imported_custom_props/0"},{"id":"list_all_imports/2","deprecated":false,"title":"list_all_imports(site, status \\\\ nil)","anchor":"list_all_imports/2"},{"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":"other_imports_in_progress?/1","deprecated":false,"title":"other_imports_in_progress?(site_import)","anchor":"other_imports_in_progress?/1"},{"id":"schemas/0","deprecated":false,"title":"schemas()","anchor":"schemas/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/1","deprecated":false,"title":"start_link(opts \\\\ [])","anchor":"start_link/1"},{"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":"date_range/1","deprecated":false,"title":"date_range(uploads)","anchor":"date_range/1"},{"id":"extract_table/1","deprecated":false,"title":"extract_table(filename)","anchor":"extract_table/1"},{"id":"local_dir/1","deprecated":false,"title":"local_dir(site_id)","anchor":"local_dir/1"},{"id":"new_import/3","deprecated":false,"title":"new_import(site, user, opts)","anchor":"new_import/3"},{"id":"parse_filename!/1","deprecated":false,"title":"parse_filename!(filename)","anchor":"parse_filename!/1"},{"id":"valid_filename?/1","deprecated":false,"title":"valid_filename?(filename)","anchor":"valid_filename?/1"}],"key":"functions"}]},{"id":"Plausible.Imported.GoogleAnalytics4","deprecated":false,"group":"","title":"Plausible.Imported.GoogleAnalytics4","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.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/2","deprecated":false,"title":"before_start(t, t)","anchor":"c:before_start/2"},{"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":"importing/0","deprecated":false,"title":"importing()","anchor":"importing/0"},{"id":"label/1","deprecated":false,"title":"label(map)","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":"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":"alter_update_all/3","deprecated":false,"title":"alter_update_all(queryable, updates, opts \\\\ [])","anchor":"alter_update_all/3"},{"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":"clustered_table?/1","deprecated":false,"title":"clustered_table?(table)","anchor":"clustered_table?/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":"replica_count/1","deprecated":false,"title":"replica_count(table)","anchor":"replica_count/1"},{"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_inline_sql/2","deprecated":false,"title":"to_inline_sql(operation, queryable)","anchor":"to_inline_sql/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.Acquisition","deprecated":false,"group":"","title":"Plausible.Ingestion.Acquisition","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_channel/5","deprecated":false,"title":"get_channel(source, utm_medium, utm_campaign, utm_source, click_id_param)","anchor":"get_channel/5"},{"id":"source_categories/0","deprecated":false,"title":"source_categories()","anchor":"source_categories/0"}],"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/2","deprecated":false,"title":"build_and_buffer(request, context \\\\ [])","anchor":"build_and_buffer/2"},{"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"},{"id":"telemetry_pipeline_step_duration/0","deprecated":false,"title":"telemetry_pipeline_step_duration()","anchor":"telemetry_pipeline_step_duration/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.Ingestion.Source","deprecated":false,"group":"","title":"Plausible.Ingestion.Source","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"find_mapping/1","deprecated":false,"title":"find_mapping(source)","anchor":"find_mapping/1"},{"id":"format_referrer/1","deprecated":false,"title":"format_referrer(referrer)","anchor":"format_referrer/1"},{"id":"init/0","deprecated":false,"title":"init()","anchor":"init/0"},{"id":"paid_source?/1","deprecated":false,"title":"paid_source?(source)","anchor":"paid_source?/1"},{"id":"paid_sources/0","deprecated":false,"title":"paid_sources()","anchor":"paid_sources/0"},{"id":"parse/1","deprecated":false,"title":"parse(ref)","anchor":"parse/1"},{"id":"resolve/1","deprecated":false,"title":"resolve(request)","anchor":"resolve/1"}],"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.LiveViewTest","deprecated":false,"group":"","title":"Plausible.LiveViewTest","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render_component/3","deprecated":false,"title":"render_component(component, assigns \\\\ Macro.escape(%{}), opts \\\\ [])","anchor":"render_component/3"}],"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":"dictionary_connection_params/0","deprecated":false,"title":"dictionary_connection_params()","anchor":"dictionary_connection_params/0"},{"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/2","deprecated":false,"title":"fetch_prices(product_ids, customer_ip)","anchor":"fetch_prices/2"},{"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.Funnels","deprecated":false,"group":"","title":"Plausible.Plugins.API.Funnels","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, create_request)","anchor":"create/2"},{"id":"get/2","deprecated":false,"title":"get(site, by)","anchor":"get/2"},{"id":"get_funnels/2","deprecated":false,"title":"get_funnels(site, params)","anchor":"get_funnels/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"},{"id":"measure_duration/3","deprecated":false,"title":"measure_duration(event, fun, meta \\\\ %{})","anchor":"measure_duration/3"}],"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/1","deprecated":false,"title":"createdb(repos \\\\ repos())","anchor":"createdb/1"},{"id":"dump_plans/0","deprecated":false,"title":"dump_plans()","anchor":"dump_plans/0"},{"id":"interweave_migrate/1","deprecated":false,"title":"interweave_migrate(repos \\\\ repos())","anchor":"interweave_migrate/1"},{"id":"pending_streaks/1","deprecated":false,"title":"pending_streaks(repos \\\\ repos())","anchor":"pending_streaks/1"},{"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.RequestLogger","deprecated":false,"group":"","title":"Plausible.RequestLogger","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"log_request/4","deprecated":false,"title":"log_request(_, map1, map2, _)","anchor":"log_request/4"}],"key":"functions"}]},{"id":"Plausible.S3","deprecated":false,"group":"","title":"Plausible.S3","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"download_url/2","deprecated":false,"title":"download_url(s3_bucket, s3_path)","anchor":"download_url/2"},{"id":"export_upload_multipart/4","deprecated":false,"title":"export_upload_multipart(stream, s3_bucket, s3_path, filename)","anchor":"export_upload_multipart/4"},{"id":"exports_bucket/0","deprecated":false,"title":"exports_bucket()","anchor":"exports_bucket/0"},{"id":"import_clickhouse_credentials/0","deprecated":false,"title":"import_clickhouse_credentials()","anchor":"import_clickhouse_credentials/0"},{"id":"import_presign_upload/2","deprecated":false,"title":"import_presign_upload(site_id, filename)","anchor":"import_presign_upload/2"},{"id":"imports_bucket/0","deprecated":false,"title":"imports_bucket()","anchor":"imports_bucket/0"}],"key":"functions"}]},{"id":"Plausible.Sentry.Client","deprecated":false,"group":"","title":"Plausible.Sentry.Client","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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"}],"key":"functions"}]},{"id":"Plausible.Session.CacheStore","deprecated":false,"group":"","title":"Plausible.Session.CacheStore","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"lock_telemetry_event/0","deprecated":false,"title":"lock_telemetry_event()","anchor":"lock_telemetry_event/0"},{"id":"on_event/4","deprecated":false,"title":"on_event(event, session_attributes, prev_user_id, buffer_insert \\\\ &WriteBuffer.insert/1)","anchor":"on_event/4"}],"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":"get_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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.HostnameRule","deprecated":false,"group":"","title":"Plausible.Shield.HostnameRule","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 \\\\ %__MODULE__{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Shield.HostnameRuleCache","deprecated":false,"group":"","title":"Plausible.Shield.HostnameRuleCache","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_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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":"get_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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.PageRule","deprecated":false,"group":"","title":"Plausible.Shield.PageRule","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 \\\\ %__MODULE__{}, attrs)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Shield.PageRuleCache","deprecated":false,"group":"","title":"Plausible.Shield.PageRuleCache","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_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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_hostname_rule/3","deprecated":false,"title":"add_hostname_rule(site_or_id, params, opts \\\\ [])","anchor":"add_hostname_rule/3"},{"id":"add_ip_rule/3","deprecated":false,"title":"add_ip_rule(site_or_id, params, opts \\\\ [])","anchor":"add_ip_rule/3"},{"id":"add_page_rule/3","deprecated":false,"title":"add_page_rule(site_or_id, params, opts \\\\ [])","anchor":"add_page_rule/3"},{"id":"allowed_hostname_patterns/1","deprecated":false,"title":"allowed_hostname_patterns(domain)","anchor":"allowed_hostname_patterns/1"},{"id":"count_country_rules/1","deprecated":false,"title":"count_country_rules(site_or_id)","anchor":"count_country_rules/1"},{"id":"count_hostname_rules/1","deprecated":false,"title":"count_hostname_rules(site_or_id)","anchor":"count_hostname_rules/1"},{"id":"count_ip_rules/1","deprecated":false,"title":"count_ip_rules(site_or_id)","anchor":"count_ip_rules/1"},{"id":"count_page_rules/1","deprecated":false,"title":"count_page_rules(site_or_id)","anchor":"count_page_rules/1"},{"id":"country_blocked?/2","deprecated":false,"title":"country_blocked?(domain, country_code)","anchor":"country_blocked?/2"},{"id":"hostname_allowed?/2","deprecated":false,"title":"hostname_allowed?(domain, hostname)","anchor":"hostname_allowed?/2"},{"id":"ip_blocked?/2","deprecated":false,"title":"ip_blocked?(domain, address)","anchor":"ip_blocked?/2"},{"id":"list_country_rules/1","deprecated":false,"title":"list_country_rules(site_or_id)","anchor":"list_country_rules/1"},{"id":"list_hostname_rules/1","deprecated":false,"title":"list_hostname_rules(site_or_id)","anchor":"list_hostname_rules/1"},{"id":"list_ip_rules/1","deprecated":false,"title":"list_ip_rules(site_or_id)","anchor":"list_ip_rules/1"},{"id":"list_page_rules/1","deprecated":false,"title":"list_page_rules(site_or_id)","anchor":"list_page_rules/1"},{"id":"maximum_country_rules/0","deprecated":false,"title":"maximum_country_rules()","anchor":"maximum_country_rules/0"},{"id":"maximum_hostname_rules/0","deprecated":false,"title":"maximum_hostname_rules()","anchor":"maximum_hostname_rules/0"},{"id":"maximum_ip_rules/0","deprecated":false,"title":"maximum_ip_rules()","anchor":"maximum_ip_rules/0"},{"id":"maximum_page_rules/0","deprecated":false,"title":"maximum_page_rules()","anchor":"maximum_page_rules/0"},{"id":"page_blocked?/2","deprecated":false,"title":"page_blocked?(domain, address)","anchor":"page_blocked?/2"},{"id":"remove_country_rule/2","deprecated":false,"title":"remove_country_rule(site_or_id, rule_id)","anchor":"remove_country_rule/2"},{"id":"remove_hostname_rule/2","deprecated":false,"title":"remove_hostname_rule(site_or_id, rule_id)","anchor":"remove_hostname_rule/2"},{"id":"remove_ip_rule/2","deprecated":false,"title":"remove_ip_rule(site_or_id, rule_id)","anchor":"remove_ip_rule/2"},{"id":"remove_page_rule/2","deprecated":false,"title":"remove_page_rule(site_or_id, rule_id)","anchor":"remove_page_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":"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":"new_for_team/2","deprecated":false,"title":"new_for_team(team, params)","anchor":"new_for_team/2"},{"id":"set_native_stats_start_at/2","deprecated":false,"title":"set_native_stats_start_at(site, val)","anchor":"set_native_stats_start_at/2"},{"id":"set_stats_start_date/2","deprecated":false,"title":"set_stats_start_date(site, val)","anchor":"set_stats_start_date/2"},{"id":"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_or_store/3","deprecated":false,"title":"get_or_store(key, fallback_fn, opts \\\\ [])","anchor":"get_or_store/3"},{"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.InstallationMeta","deprecated":false,"group":"","title":"Plausible.Site.InstallationMeta","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":"all_pending_ownerships/1","deprecated":false,"title":"all_pending_ownerships(email)","anchor":"all_pending_ownerships/1"},{"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(site)","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.TrafficChangeNotification","deprecated":false,"group":"","title":"Plausible.Site.TrafficChangeNotification","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":"before_update/2","deprecated":false,"title":"before_update(conn, changeset)","anchor":"before_update/2"},{"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":"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":"for_user_query/1","deprecated":false,"title":"for_user_query(user)","anchor":"for_user_query/1"},{"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":"has_admin_access?/2","deprecated":false,"title":"has_admin_access?(user_id, site)","anchor":"has_admin_access?/2"},{"id":"has_goals?/1","deprecated":false,"title":"has_goals?(site)","anchor":"has_goals?/1"},{"id":"has_stats?/1","deprecated":false,"title":"has_stats?(site)","anchor":"has_stats?/1"},{"id":"is_member?/2","deprecated":false,"title":"is_member?(user_id, site)","anchor":"is_member?/2"},{"id":"list/3","deprecated":false,"title":"list(user, pagination_params, opts \\\\ [])","anchor":"list/3"},{"id":"list_with_invitations/3","deprecated":false,"title":"list_with_invitations(user, pagination_params, opts \\\\ [])","anchor":"list_with_invitations/3"},{"id":"locked?/1","deprecated":false,"title":"locked?(site)","anchor":"locked?/1"},{"id":"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":"owned_sites_locked?/1","deprecated":false,"title":"owned_sites_locked?(user)","anchor":"owned_sites_locked?/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"},{"id":"update_installation_meta!/2","deprecated":false,"title":"update_installation_meta!(site, meta)","anchor":"update_installation_meta!/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/4","deprecated":false,"title":"breakdown(site, query, metrics, pagination)","anchor":"breakdown/4"},{"id":"current_visitors/2","deprecated":false,"title":"current_visitors(site, duration \\\\ Duration.new!(minute: -5))","anchor":"current_visitors/2"},{"id":"custom_prop_value_filter_suggestions/4","deprecated":false,"title":"custom_prop_value_filter_suggestions(site, query, prop_key, filter_search)","anchor":"custom_prop_value_filter_suggestions/4"},{"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":"query/2","deprecated":false,"title":"query(site, query)","anchor":"query/2"},{"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"},{"id":"get_value/3","deprecated":false,"title":"get_value(metric_list, index, metric)","anchor":"get_value/3"},{"id":"metric_map/3","deprecated":false,"title":"metric_map(map, index, metric)","anchor":"metric_map/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Base","deprecated":false,"group":"","title":"Plausible.Stats.Base","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"base_event_query/2","deprecated":false,"title":"base_event_query(site, query)","anchor":"base_event_query/2"},{"id":"query_sessions/2","deprecated":false,"title":"query_sessions(site, query)","anchor":"query_sessions/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Breakdown","deprecated":false,"group":"","title":"Plausible.Stats.Breakdown","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"breakdown/5","deprecated":false,"title":"breakdown(site, query, metrics, arg, opts \\\\ [])","anchor":"breakdown/5"},{"id":"formatted_date_ranges/1","deprecated":false,"title":"formatted_date_ranges(query)","anchor":"formatted_date_ranges/1"},{"id":"transform_dimensions/1","deprecated":false,"title":"transform_dimensions(dimension)","anchor":"transform_dimensions/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Clickhouse","deprecated":false,"group":"","title":"Plausible.Stats.Clickhouse","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"current_visitors/1","deprecated":false,"title":"current_visitors(site)","anchor":"current_visitors/1"},{"id":"current_visitors_12h/1","deprecated":false,"title":"current_visitors_12h(site)","anchor":"current_visitors_12h/1"},{"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(site_ids, 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":"Functions","nodes":[{"id":"add_comparison_filters/2","deprecated":false,"title":"add_comparison_filters(comparison_query, main_results_list)","anchor":"add_comparison_filters/2"},{"id":"get_comparison_query/2","deprecated":false,"title":"get_comparison_query(source_query, options)","anchor":"get_comparison_query/2"}],"key":"functions"}]},{"id":"Plausible.Stats.CurrentVisitors","deprecated":false,"group":"","title":"Plausible.Stats.CurrentVisitors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"current_visitors/2","deprecated":false,"title":"current_visitors(site, duration \\\\ Duration.new!(minute: -5))","anchor":"current_visitors/2"}],"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.DateTimeRange","deprecated":false,"group":"","title":"Plausible.Stats.DateTimeRange","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"new!/2","deprecated":false,"title":"new!(first, last)","anchor":"new!/2"},{"id":"new!/3","deprecated":false,"title":"new!(first, last, timezone)","anchor":"new!/3"},{"id":"to_date_range/2","deprecated":false,"title":"to_date_range(datetime_range, timezone)","anchor":"to_date_range/2"},{"id":"to_timezone/2","deprecated":false,"title":"to_timezone(date_time_range, timezone)","anchor":"to_timezone/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":"custom_prop_value_filter_suggestions/4","deprecated":false,"title":"custom_prop_value_filter_suggestions(site, query, prop_key, filter_search)","anchor":"custom_prop_value_filter_suggestions/4"},{"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":"dimensions_used_in_filters/2","deprecated":false,"title":"dimensions_used_in_filters(filters, opts \\\\ [])","anchor":"dimensions_used_in_filters/2"},{"id":"event_props/0","deprecated":false,"title":"event_props()","anchor":"event_props/0"},{"id":"event_table_visit_props/0","deprecated":false,"title":"event_table_visit_props()","anchor":"event_table_visit_props/0"},{"id":"filtering_on_dimension?/2","deprecated":false,"title":"filtering_on_dimension?(query, dimension)","anchor":"filtering_on_dimension?/2"},{"id":"get_toplevel_filter/2","deprecated":false,"title":"get_toplevel_filter(query, prefix)","anchor":"get_toplevel_filter/2"},{"id":"parse/1","deprecated":false,"title":"parse(filters)","anchor":"parse/1"},{"id":"rename_dimensions_used_in_filter/2","deprecated":false,"title":"rename_dimensions_used_in_filter(filters, renames)","anchor":"rename_dimensions_used_in_filter/2"},{"id":"transform_filters/2","deprecated":false,"title":"transform_filters(filters, transformer)","anchor":"transform_filters/2"},{"id":"visit_props/0","deprecated":false,"title":"visit_props()","anchor":"visit_props/0"},{"id":"without_prefix/1","deprecated":false,"title":"without_prefix(dimension)","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":"page_regex/1","deprecated":false,"title":"page_regex(expr)","anchor":"page_regex/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":"split_goals/1","deprecated":false,"title":"split_goals(goals)","anchor":"split_goals/1"},{"id":"split_goals_query_expressions/1","deprecated":false,"title":"split_goals_query_expressions(goals)","anchor":"split_goals_query_expressions/1"},{"id":"wildcard_expression?/1","deprecated":false,"title":"wildcard_expression?(expression)","anchor":"wildcard_expression?/1"}],"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":"available?/1","deprecated":false,"title":"available?(site)","anchor":"available?/1"},{"id":"format_revenue_metric/3","deprecated":false,"title":"format_revenue_metric(value, query, dimension_values)","anchor":"format_revenue_metric/3"},{"id":"preload_revenue_currencies/4","deprecated":false,"title":"preload_revenue_currencies(site, goals, metrics, dimensions)","anchor":"preload_revenue_currencies/4"},{"id":"requested?/1","deprecated":false,"title":"requested?(metrics)","anchor":"requested?/1"},{"id":"revenue_metrics/0","deprecated":false,"title":"revenue_metrics()","anchor":"revenue_metrics/0"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported","deprecated":false,"group":"","title":"Plausible.Stats.Imported","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"goals_with_path/0","deprecated":false,"title":"goals_with_path()","anchor":"goals_with_path/0"},{"id":"goals_with_url/0","deprecated":false,"title":"goals_with_url()","anchor":"goals_with_url/0"},{"id":"merge_imported/4","deprecated":false,"title":"merge_imported(q, site, query, metrics)","anchor":"merge_imported/4"},{"id":"merge_imported_city_suggestions/3","deprecated":false,"title":"merge_imported_city_suggestions(native_q, site, query)","anchor":"merge_imported_city_suggestions/3"},{"id":"merge_imported_country_suggestions/3","deprecated":false,"title":"merge_imported_country_suggestions(native_q, site, query)","anchor":"merge_imported_country_suggestions/3"},{"id":"merge_imported_filter_suggestions/5","deprecated":false,"title":"merge_imported_filter_suggestions(native_q, site, query, filter_name, filter_query)","anchor":"merge_imported_filter_suggestions/5"},{"id":"merge_imported_region_suggestions/3","deprecated":false,"title":"merge_imported_region_suggestions(native_q, site, query)","anchor":"merge_imported_region_suggestions/3"},{"id":"schema_supports_query?/1","deprecated":false,"title":"schema_supports_query?(query)","anchor":"schema_supports_query?/1"},{"id":"total_imported_visitors/2","deprecated":false,"title":"total_imported_visitors(site, query)","anchor":"total_imported_visitors/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported.Base","deprecated":false,"group":"","title":"Plausible.Stats.Imported.Base","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"decide_tables/1","deprecated":false,"title":"decide_tables(query)","anchor":"decide_tables/1"},{"id":"property_to_table_mappings/0","deprecated":false,"title":"property_to_table_mappings()","anchor":"property_to_table_mappings/0"},{"id":"query_imported/2","deprecated":false,"title":"query_imported(site, query)","anchor":"query_imported/2"},{"id":"query_imported/3","deprecated":false,"title":"query_imported(table, site, query)","anchor":"query_imported/3"},{"id":"special_goals_for/1","deprecated":false,"title":"special_goals_for(binary)","anchor":"special_goals_for/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported.SQL.Expression","deprecated":false,"group":"","title":"Plausible.Stats.Imported.SQL.Expression","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"group_imported_by/2","deprecated":false,"title":"group_imported_by(q, query)","anchor":"group_imported_by/2"},{"id":"naive_dimension_join/3","deprecated":false,"title":"naive_dimension_join(q1, q2, metrics)","anchor":"naive_dimension_join/3"},{"id":"select_imported_metrics/2","deprecated":false,"title":"select_imported_metrics(q, list)","anchor":"select_imported_metrics/2"},{"id":"select_joined_dimensions/2","deprecated":false,"title":"select_joined_dimensions(q, query)","anchor":"select_joined_dimensions/2"},{"id":"select_joined_metrics/2","deprecated":false,"title":"select_joined_metrics(q, list)","anchor":"select_joined_metrics/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Imported.SQL.WhereBuilder","deprecated":false,"group":"","title":"Plausible.Stats.Imported.SQL.WhereBuilder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build/1","deprecated":false,"title":"build(query)","anchor":"build/1"}],"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(date_time_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.JSONSchema","deprecated":false,"group":"","title":"Plausible.Stats.JSONSchema","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"raw_public_schema/0","deprecated":false,"title":"raw_public_schema()","anchor":"raw_public_schema/0"},{"id":"validate/2","deprecated":false,"title":"validate(schema_type, params)","anchor":"validate/2"}],"key":"functions"}]},{"id":"Plausible.Stats.JSONSchema.Utils","deprecated":false,"group":"","title":"Plausible.Stats.JSONSchema.Utils","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"json/0","deprecated":false,"title":"json()","anchor":"t:json/0"},{"id":"transform_fun/0","deprecated":false,"title":"transform_fun()","anchor":"t:transform_fun/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"traverse/2","deprecated":false,"title":"traverse(json, fun)","anchor":"traverse/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Legacy.Dimensions","deprecated":false,"group":"","title":"Plausible.Stats.Legacy.Dimensions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"valid?/1","deprecated":false,"title":"valid?(prop)","anchor":"valid?/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Legacy.QueryBuilder","deprecated":false,"group":"","title":"Plausible.Stats.Legacy.QueryBuilder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"from/4","deprecated":false,"title":"from(site, params, debug_metadata, now \\\\ nil)","anchor":"from/4"},{"id":"parse_comparison_params/2","deprecated":false,"title":"parse_comparison_params(site, params)","anchor":"parse_comparison_params/2"},{"id":"parse_order_by/1","deprecated":false,"title":"parse_order_by(order_by)","anchor":"parse_order_by/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Legacy.TimeOnPage","deprecated":false,"group":"","title":"Plausible.Stats.Legacy.TimeOnPage","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"calculate/3","deprecated":false,"title":"calculate(site, query, ch_results)","anchor":"calculate/3"}],"key":"functions"}]},{"id":"Plausible.Stats.Metrics","deprecated":false,"group":"","title":"Plausible.Stats.Metrics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"from_string/1","deprecated":false,"title":"from_string(str)","anchor":"from_string/1"},{"id":"from_string!/1","deprecated":false,"title":"from_string!(str)","anchor":"from_string!/1"},{"id":"metric?/1","deprecated":false,"title":"metric?(value)","anchor":"metric?/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":"add_filter/2","deprecated":false,"title":"add_filter(query, filter)","anchor":"add_filter/2"},{"id":"build/4","deprecated":false,"title":"build(site, schema_type, params, debug_metadata)","anchor":"build/4"},{"id":"date_range/2","deprecated":false,"title":"date_range(query, options \\\\ [])","anchor":"date_range/2"},{"id":"ensure_include_imported/2","deprecated":false,"title":"ensure_include_imported(query, requested?)","anchor":"ensure_include_imported/2"},{"id":"from/4","deprecated":false,"title":"from(site, params, debug_metadata \\\\ %{}, now \\\\ nil)","anchor":"from/4"},{"id":"put_imported_opts/3","deprecated":false,"title":"put_imported_opts(query, site, params)","anchor":"put_imported_opts/3"},{"id":"remove_top_level_filters/2","deprecated":false,"title":"remove_top_level_filters(query, prefixes)","anchor":"remove_top_level_filters/2"},{"id":"set/2","deprecated":false,"title":"set(query, keywords)","anchor":"set/2"},{"id":"set_include/3","deprecated":false,"title":"set_include(query, key, value)","anchor":"set_include/3"},{"id":"trace/2","deprecated":false,"title":"trace(query, metrics)","anchor":"trace/2"}],"key":"functions"}]},{"id":"Plausible.Stats.QueryOptimizer","deprecated":false,"group":"","title":"Plausible.Stats.QueryOptimizer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"optimize/1","deprecated":false,"title":"optimize(query)","anchor":"optimize/1"},{"id":"split/1","deprecated":false,"title":"split(query)","anchor":"split/1"}],"key":"functions"}]},{"id":"Plausible.Stats.QueryResult","deprecated":false,"group":"","title":"Plausible.Stats.QueryResult","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"from/4","deprecated":false,"title":"from(results, site, query, meta_extra)","anchor":"from/4"}],"key":"functions"}]},{"id":"Plausible.Stats.QueryRunner","deprecated":false,"group":"","title":"Plausible.Stats.QueryRunner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"run/2","deprecated":false,"title":"run(site, query)","anchor":"run/2"}],"key":"functions"}]},{"id":"Plausible.Stats.SQL.Expression","deprecated":false,"group":"","title":"Plausible.Stats.SQL.Expression","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"event_goal_join/2","deprecated":false,"title":"event_goal_join(events, page_regexes)","anchor":"event_goal_join/2"},{"id":"event_metric/1","deprecated":false,"title":"event_metric(unknown)","anchor":"event_metric/1"},{"id":"select_dimension/5","deprecated":false,"title":"select_dimension(q, key, arg3, arg4, query)","anchor":"select_dimension/5"},{"id":"session_metric/2","deprecated":false,"title":"session_metric(atom, query)","anchor":"session_metric/2"}],"key":"functions"}]},{"id":"Plausible.Stats.SQL.Fragments","deprecated":false,"group":"","title":"Plausible.Stats.SQL.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":"meta_key_column/1","deprecated":false,"title":"meta_key_column(atom)","anchor":"meta_key_column/1"},{"id":"meta_value_column/1","deprecated":false,"title":"meta_value_column(atom)","anchor":"meta_value_column/1"},{"id":"sample_percent/0","deprecated":false,"title":"sample_percent()","anchor":"sample_percent/0"},{"id":"select_join_fields/4","deprecated":false,"title":"select_join_fields(q, query, list, table_name)","anchor":"select_join_fields/4"},{"id":"select_merge_as/3","deprecated":false,"title":"select_merge_as(q, binding, map_literal)","anchor":"select_merge_as/3"},{"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":"wrap_alias/2","deprecated":false,"title":"wrap_alias(binding, map_literal)","anchor":"wrap_alias/2"}],"key":"functions"}]},{"id":"Plausible.Stats.SQL.SpecialMetrics","deprecated":false,"group":"","title":"Plausible.Stats.SQL.SpecialMetrics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add/3","deprecated":false,"title":"add(q, site, query)","anchor":"add/3"},{"id":"maybe_add_global_conversion_rate/3","deprecated":false,"title":"maybe_add_global_conversion_rate(q, site, query)","anchor":"maybe_add_global_conversion_rate/3"},{"id":"maybe_add_group_conversion_rate/3","deprecated":false,"title":"maybe_add_group_conversion_rate(q, site, query)","anchor":"maybe_add_group_conversion_rate/3"},{"id":"maybe_add_scroll_depth/3","deprecated":false,"title":"maybe_add_scroll_depth(q, site, query)","anchor":"maybe_add_scroll_depth/3"}],"key":"functions"}]},{"id":"Plausible.Stats.SQL.WhereBuilder","deprecated":false,"group":"","title":"Plausible.Stats.SQL.WhereBuilder","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"build/3","deprecated":false,"title":"build(table, site, query)","anchor":"build/3"},{"id":"build_condition/2","deprecated":false,"title":"build_condition(db_field, filter)","anchor":"build_condition/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/3","deprecated":false,"title":"put_threshold(query, site, params)","anchor":"put_threshold/3"}],"key":"functions"}]},{"id":"Plausible.Stats.TableDecider","deprecated":false,"group":"","title":"Plausible.Stats.TableDecider","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"events_join_sessions?/1","deprecated":false,"title":"events_join_sessions?(query)","anchor":"events_join_sessions?/1"},{"id":"partition_metrics/2","deprecated":false,"title":"partition_metrics(metrics, query)","anchor":"partition_metrics/2"},{"id":"sessions_join_events?/1","deprecated":false,"title":"sessions_join_events?(query)","anchor":"sessions_join_events?/1"}],"key":"functions"}]},{"id":"Plausible.Stats.Time","deprecated":false,"group":"","title":"Plausible.Stats.Time","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"date_or_weekstart/2","deprecated":false,"title":"date_or_weekstart(date, date_range)","anchor":"date_or_weekstart/2"},{"id":"format_datetime/1","deprecated":false,"title":"format_datetime(date)","anchor":"format_datetime/1"},{"id":"time_dimension/1","deprecated":false,"title":"time_dimension(query)","anchor":"time_dimension/1"},{"id":"time_dimension?/1","deprecated":false,"title":"time_dimension?(arg1)","anchor":"time_dimension?/1"},{"id":"time_labels/1","deprecated":false,"title":"time_labels(query)","anchor":"time_labels/1"},{"id":"utc_boundaries/2","deprecated":false,"title":"utc_boundaries(query, site)","anchor":"utc_boundaries/2"}],"key":"functions"}]},{"id":"Plausible.Stats.Timeseries","deprecated":false,"group":"","title":"Plausible.Stats.Timeseries","sections":[],"nodeGroups":[{"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":"maybe_add_visitors_metric/1","deprecated":false,"title":"maybe_add_visitors_metric(metrics)","anchor":"maybe_add_visitors_metric/1"},{"id":"shortname/2","deprecated":false,"title":"shortname(query, metric)","anchor":"shortname/2"}],"key":"functions"}]},{"id":"Plausible.Teams","deprecated":false,"group":"","title":"Plausible.Teams","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_by_owner/1","deprecated":false,"title":"get_by_owner(user)","anchor":"get_by_owner/1"},{"id":"get_or_create/1","deprecated":false,"title":"get_or_create(user)","anchor":"get_or_create/1"},{"id":"last_subscription_join_query/0","deprecated":false,"title":"last_subscription_join_query()","anchor":"last_subscription_join_query/0"},{"id":"last_subscription_query/0","deprecated":false,"title":"last_subscription_query()","anchor":"last_subscription_query/0"},{"id":"load_for_site/1","deprecated":false,"title":"load_for_site(site)","anchor":"load_for_site/1"},{"id":"on_trial?/1","deprecated":false,"title":"on_trial?(team)","anchor":"on_trial?/1"},{"id":"owned_sites/1","deprecated":false,"title":"owned_sites(team)","anchor":"owned_sites/1"},{"id":"owned_sites_ids/1","deprecated":false,"title":"owned_sites_ids(team)","anchor":"owned_sites_ids/1"},{"id":"read_team_schemas?/1","deprecated":false,"title":"read_team_schemas?(user)","anchor":"read_team_schemas?/1"},{"id":"sync_team/1","deprecated":false,"title":"sync_team(user)","anchor":"sync_team/1"},{"id":"trial_days_left/1","deprecated":false,"title":"trial_days_left(team)","anchor":"trial_days_left/1"},{"id":"with_subscription/1","deprecated":false,"title":"with_subscription(team)","anchor":"with_subscription/1"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter","deprecated":false,"group":"","title":"Plausible.Teams.Adapter","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"switch/2","deprecated":false,"title":"switch(user, opts \\\\ [])","anchor":"switch/2"},{"id":"user_or_team/1","deprecated":false,"title":"user_or_team(user)","anchor":"user_or_team/1"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter.Read.Billing","deprecated":false,"group":"","title":"Plausible.Teams.Adapter.Read.Billing","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"active_subscription_for/1","deprecated":false,"title":"active_subscription_for(user)","anchor":"active_subscription_for/1"},{"id":"allow_next_upgrade_override?/1","deprecated":false,"title":"allow_next_upgrade_override?(user)","anchor":"allow_next_upgrade_override?/1"},{"id":"change_plan/2","deprecated":false,"title":"change_plan(user, new_plan_id)","anchor":"change_plan/2"},{"id":"check_feature_availability/2","deprecated":false,"title":"check_feature_availability(feature, user)","anchor":"check_feature_availability/2"},{"id":"check_feature_availability_for_stats_api/1","deprecated":false,"title":"check_feature_availability_for_stats_api(user)","anchor":"check_feature_availability_for_stats_api/1"},{"id":"check_needs_to_upgrade/1","deprecated":false,"title":"check_needs_to_upgrade(user)","anchor":"check_needs_to_upgrade/1"},{"id":"ensure_can_add_new_site/1","deprecated":false,"title":"ensure_can_add_new_site(user)","anchor":"ensure_can_add_new_site/1"},{"id":"enterprise_configured?/1","deprecated":false,"title":"enterprise_configured?(user)","anchor":"enterprise_configured?/1"},{"id":"get_subscription/1","deprecated":false,"title":"get_subscription(user)","anchor":"get_subscription/1"},{"id":"has_active_subscription?/1","deprecated":false,"title":"has_active_subscription?(user)","anchor":"has_active_subscription?/1"},{"id":"latest_enterprise_plan_with_prices/2","deprecated":false,"title":"latest_enterprise_plan_with_prices(user, customer_ip)","anchor":"latest_enterprise_plan_with_prices/2"},{"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":"quota_usage/2","deprecated":false,"title":"quota_usage(user, opts \\\\ [])","anchor":"quota_usage/2"},{"id":"site_limit/1","deprecated":false,"title":"site_limit(user)","anchor":"site_limit/1"},{"id":"site_usage/1","deprecated":false,"title":"site_usage(user)","anchor":"site_usage/1"},{"id":"suggest_by_usage/2","deprecated":false,"title":"suggest_by_usage(user, usage_during_cycle)","anchor":"suggest_by_usage/2"},{"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"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter.Read.Invitations","deprecated":false,"group":"","title":"Plausible.Teams.Adapter.Read.Invitations","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check_invitation_permissions/4","deprecated":false,"title":"check_invitation_permissions(site, inviter, role, opts)","anchor":"check_invitation_permissions/4"},{"id":"check_team_member_limit/4","deprecated":false,"title":"check_team_member_limit(inviter, site, role, invitee_email)","anchor":"check_team_member_limit/4"},{"id":"ensure_new_membership/4","deprecated":false,"title":"ensure_new_membership(inviter, site, invitee, role)","anchor":"ensure_new_membership/4"},{"id":"ensure_transfer_valid/4","deprecated":false,"title":"ensure_transfer_valid(inviter, site, invitee, role)","anchor":"ensure_transfer_valid/4"},{"id":"send_invitation_email/3","deprecated":false,"title":"send_invitation_email(inviter, invitation, invitee)","anchor":"send_invitation_email/3"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter.Read.Ownership","deprecated":false,"group":"","title":"Plausible.Teams.Adapter.Read.Ownership","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all_pending_site_transfers/2","deprecated":false,"title":"all_pending_site_transfers(email, user)","anchor":"all_pending_site_transfers/2"},{"id":"check_feature_access/2","deprecated":false,"title":"check_feature_access(site, new_owner)","anchor":"check_feature_access/2"},{"id":"ensure_can_take_ownership/2","deprecated":false,"title":"ensure_can_take_ownership(site, user)","anchor":"ensure_can_take_ownership/2"},{"id":"get_owner/2","deprecated":false,"title":"get_owner(site, user)","anchor":"get_owner/2"},{"id":"has_sites?/1","deprecated":false,"title":"has_sites?(user)","anchor":"has_sites?/1"},{"id":"owns_sites?/2","deprecated":false,"title":"owns_sites?(user, sites)","anchor":"owns_sites?/2"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter.Read.Sites","deprecated":false,"group":"","title":"Plausible.Teams.Adapter.Read.Sites","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_for_user/3","deprecated":false,"title":"get_for_user(user, domain, roles \\\\ [:owner, :admin, :viewer])","anchor":"get_for_user/3"},{"id":"get_for_user!/3","deprecated":false,"title":"get_for_user!(user, domain, roles \\\\ [:owner, :admin, :viewer])","anchor":"get_for_user!/3"},{"id":"list/3","deprecated":false,"title":"list(user, pagination_params, opts \\\\ [])","anchor":"list/3"},{"id":"list_people/2","deprecated":false,"title":"list_people(site, user)","anchor":"list_people/2"},{"id":"list_with_invitations/3","deprecated":false,"title":"list_with_invitations(user, pagination_params, opts \\\\ [])","anchor":"list_with_invitations/3"}],"key":"functions"}]},{"id":"Plausible.Teams.Adapter.Read.Teams","deprecated":false,"group":"","title":"Plausible.Teams.Adapter.Read.Teams","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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":"trial_expiry_date/1","deprecated":false,"title":"trial_expiry_date(user)","anchor":"trial_expiry_date/1"}],"key":"functions"}]},{"id":"Plausible.Teams.GuestInvitation","deprecated":false,"group":"","title":"Plausible.Teams.GuestInvitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(team_invitation, site, role)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Plausible.Teams.GuestMembership","deprecated":false,"group":"","title":"Plausible.Teams.GuestMembership","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(team_membership, site, role)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Plausible.Teams.Invitation","deprecated":false,"group":"","title":"Plausible.Teams.Invitation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(team, opts)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Teams.Membership","deprecated":false,"group":"","title":"Plausible.Teams.Membership","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/3","deprecated":false,"title":"changeset(team, user, role)","anchor":"changeset/3"}],"key":"functions"}]},{"id":"Plausible.Teams.SiteTransfer","deprecated":false,"group":"","title":"Plausible.Teams.SiteTransfer","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"changeset/2","deprecated":false,"title":"changeset(site, opts)","anchor":"changeset/2"}],"key":"functions"}]},{"id":"Plausible.Teams.Team","deprecated":false,"group":"","title":"Plausible.Teams.Team","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(name, today \\\\ Date.utc_today())","anchor":"changeset/2"},{"id":"start_trial/2","deprecated":false,"title":"start_trial(team, today \\\\ Date.utc_today())","anchor":"start_trial/2"},{"id":"sync_changeset/2","deprecated":false,"title":"sync_changeset(team, user)","anchor":"sync_changeset/2"}],"key":"functions"}]},{"id":"Plausible.Teams.Test","deprecated":false,"group":"","title":"Plausible.Teams.Test","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"add_guest/2","deprecated":false,"title":"add_guest(site, args \\\\ [])","anchor":"add_guest/2"},{"id":"assert_guest_invitation/4","deprecated":false,"title":"assert_guest_invitation(team, site, email, role)","anchor":"assert_guest_invitation/4"},{"id":"assert_guest_membership/4","deprecated":false,"title":"assert_guest_membership(team, site, user, role)","anchor":"assert_guest_membership/4"},{"id":"assert_team_attached/2","deprecated":false,"title":"assert_team_attached(site, team_id \\\\ nil)","anchor":"assert_team_attached/2"},{"id":"assert_team_exists/2","deprecated":false,"title":"assert_team_exists(user, team_id \\\\ nil)","anchor":"assert_team_exists/2"},{"id":"assert_team_membership/3","deprecated":false,"title":"assert_team_membership(user, team, role \\\\ :owner)","anchor":"assert_team_membership/3"},{"id":"invite_guest/3","deprecated":false,"title":"invite_guest(site, invitee_or_email, args \\\\ [])","anchor":"invite_guest/3"},{"id":"invite_transfer/3","deprecated":false,"title":"invite_transfer(site, invitee, args \\\\ [])","anchor":"invite_transfer/3"},{"id":"new_site/1","deprecated":false,"title":"new_site(args \\\\ [])","anchor":"new_site/1"},{"id":"new_team/0","deprecated":false,"title":"new_team()","anchor":"new_team/0"},{"id":"new_user/1","deprecated":false,"title":"new_user(args \\\\ [])","anchor":"new_user/1"},{"id":"revoke_membership/2","deprecated":false,"title":"revoke_membership(site, user)","anchor":"revoke_membership/2"},{"id":"subscribe_to_business_plan/1","deprecated":false,"title":"subscribe_to_business_plan(user)","anchor":"subscribe_to_business_plan/1"},{"id":"subscribe_to_enterprise_plan/2","deprecated":false,"title":"subscribe_to_enterprise_plan(user, attrs \\\\ [])","anchor":"subscribe_to_enterprise_plan/2"},{"id":"subscribe_to_growth_plan/1","deprecated":false,"title":"subscribe_to_growth_plan(user)","anchor":"subscribe_to_growth_plan/1"},{"id":"subscribe_to_plan/3","deprecated":false,"title":"subscribe_to_plan(user, paddle_plan_id, attrs \\\\ [])","anchor":"subscribe_to_plan/3"}],"key":"functions"}]},{"id":"Plausible.Teams.Users","deprecated":false,"group":"","title":"Plausible.Teams.Users","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"has_sites?/2","deprecated":false,"title":"has_sites?(user, opts \\\\ [])","anchor":"has_sites?/2"},{"id":"owns_sites?/2","deprecated":false,"title":"owns_sites?(user, opts \\\\ [])","anchor":"owns_sites?/2"}],"key":"functions"}]},{"id":"Plausible.Test.Support.HTML","deprecated":false,"group":"","title":"Plausible.Test.Support.HTML","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"class_of_element/2","deprecated":false,"title":"class_of_element(html, element)","anchor":"class_of_element/2"},{"id":"element_exists?/2","deprecated":false,"title":"element_exists?(html, selector)","anchor":"element_exists?/2"},{"id":"find/2","deprecated":false,"title":"find(html, value)","anchor":"find/2"},{"id":"form_exists?/2","deprecated":false,"title":"form_exists?(html, action_path)","anchor":"form_exists?/2"},{"id":"name_of/1","deprecated":false,"title":"name_of(element)","anchor":"name_of/1"},{"id":"submit_button/2","deprecated":false,"title":"submit_button(html, form)","anchor":"submit_button/2"},{"id":"text/1","deprecated":false,"title":"text(element)","anchor":"text/1"},{"id":"text_of_attr/2","deprecated":false,"title":"text_of_attr(element, attr)","anchor":"text_of_attr/2"},{"id":"text_of_attr/3","deprecated":false,"title":"text_of_attr(html, element, attr)","anchor":"text_of_attr/3"},{"id":"text_of_element/2","deprecated":false,"title":"text_of_element(html, element)","anchor":"text_of_element/2"}],"key":"functions"}]},{"id":"Plausible.Test.Support.HTTPMocker","deprecated":false,"group":"","title":"Plausible.Test.Support.HTTPMocker","sections":[]},{"id":"Plausible.TestUtils","deprecated":false,"group":"","title":"Plausible.TestUtils","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"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_legacy_site_import/1","deprecated":false,"title":"create_legacy_site_import(map)","anchor":"create_legacy_site_import/1"},{"id":"create_pageviews/1","deprecated":false,"title":"create_pageviews(pageviews)","anchor":"create_pageviews/1"},{"id":"create_site/1","deprecated":false,"title":"create_site(map)","anchor":"create_site/1"},{"id":"create_site_import/1","deprecated":false,"title":"create_site_import(opts)","anchor":"create_site_import/1"},{"id":"create_user/1","deprecated":false,"title":"create_user(_)","anchor":"create_user/1"},{"id":"ensure_minio/0","deprecated":false,"title":"ensure_minio()","anchor":"ensure_minio/0"},{"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":"maybe_fake_minio/1","deprecated":false,"title":"maybe_fake_minio(context)","anchor":"maybe_fake_minio/1"},{"id":"minio_running?/0","deprecated":false,"title":"minio_running?()","anchor":"minio_running?/0"},{"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"}],"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":"bump_last_seen/2","deprecated":false,"title":"bump_last_seen(user_id, now)","anchor":"bump_last_seen/2"},{"id":"end_grace_period/1","deprecated":false,"title":"end_grace_period(user)","anchor":"end_grace_period/1"},{"id":"has_email_code?/1","deprecated":false,"title":"has_email_code?(user)","anchor":"has_email_code?/1"},{"id":"last_subscription_join_query/0","deprecated":false,"title":"last_subscription_join_query()","anchor":"last_subscription_join_query/0"},{"id":"last_subscription_query/0","deprecated":false,"title":"last_subscription_query()","anchor":"last_subscription_query/0"},{"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":"remove_grace_period/1","deprecated":false,"title":"remove_grace_period(user)","anchor":"remove_grace_period/1"},{"id":"start_grace_period/1","deprecated":false,"title":"start_grace_period(user)","anchor":"start_grace_period/1"},{"id":"start_manual_lock_grace_period/1","deprecated":false,"title":"start_manual_lock_grace_period(user)","anchor":"start_manual_lock_grace_period/1"},{"id":"start_trial/1","deprecated":false,"title":"start_trial(user)","anchor":"start_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.Verification","deprecated":false,"group":"","title":"Plausible.Verification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"user_agent/0","deprecated":false,"title":"user_agent()","anchor":"user_agent/0"}],"key":"functions"}]},{"id":"Plausible.Verification.Check","deprecated":false,"group":"","title":"Plausible.Verification.Check","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"state/0","deprecated":false,"title":"state()","anchor":"t:state/0"}],"key":"types"},{"name":"Callbacks","nodes":[{"id":"perform/1","deprecated":false,"title":"perform(state)","anchor":"c:perform/1"},{"id":"report_progress_as/0","deprecated":false,"title":"report_progress_as()","anchor":"c:report_progress_as/0"}],"key":"callbacks"}]},{"id":"Plausible.Verification.Checks","deprecated":false,"group":"","title":"Plausible.Verification.Checks","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"interpret_diagnostics/1","deprecated":false,"title":"interpret_diagnostics(state)","anchor":"interpret_diagnostics/1"},{"id":"run/3","deprecated":false,"title":"run(url, data_domain, opts \\\\ [])","anchor":"run/3"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.CSP","deprecated":false,"group":"","title":"Plausible.Verification.Checks.CSP","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.FetchBody","deprecated":false,"group":"","title":"Plausible.Verification.Checks.FetchBody","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.Installation","deprecated":false,"group":"","title":"Plausible.Verification.Checks.Installation","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.ScanBody","deprecated":false,"group":"","title":"Plausible.Verification.Checks.ScanBody","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.Snippet","deprecated":false,"group":"","title":"Plausible.Verification.Checks.Snippet","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Checks.SnippetCacheBust","deprecated":false,"group":"","title":"Plausible.Verification.Checks.SnippetCacheBust","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"perform_safe/1","deprecated":false,"title":"perform_safe(state)","anchor":"perform_safe/1"}],"key":"functions"}]},{"id":"Plausible.Verification.Diagnostics","deprecated":false,"group":"","title":"Plausible.Verification.Diagnostics","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"interpret/2","deprecated":false,"title":"interpret(diagnostics, url)","anchor":"interpret/2"}],"key":"functions"}]},{"id":"Plausible.Verification.Diagnostics.Result","deprecated":false,"group":"","title":"Plausible.Verification.Diagnostics.Result","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"}]},{"id":"Plausible.Verification.Errors","deprecated":false,"group":"","title":"Plausible.Verification.Errors","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"all/0","deprecated":false,"title":"all()","anchor":"all/0"}],"key":"functions"}]},{"id":"Plausible.Verification.State","deprecated":false,"group":"","title":"Plausible.Verification.State","sections":[],"nodeGroups":[{"name":"Types","nodes":[{"id":"t/0","deprecated":false,"title":"t()","anchor":"t:t/0"}],"key":"types"},{"name":"Functions","nodes":[{"id":"assign/2","deprecated":false,"title":"assign(state, assigns)","anchor":"assign/2"},{"id":"put_diagnostics/2","deprecated":false,"title":"put_diagnostics(state, diagnostics)","anchor":"put_diagnostics/2"}],"key":"functions"}]},{"id":"Plausible.Verification.URL","deprecated":false,"group":"","title":"Plausible.Verification.URL","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"bust_url/1","deprecated":false,"title":"bust_url(url)","anchor":"bust_url/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, usage_mod)","anchor":"check_enterprise_subscriber/2"},{"id":"day_of_month/1","deprecated":false,"title":"day_of_month(date)","anchor":"day_of_month/1"},{"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":"maybe_remove_grace_period/2","deprecated":false,"title":"maybe_remove_grace_period(subscriber, usage_mod)","anchor":"maybe_remove_grace_period/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.CleanUserSessions","deprecated":false,"group":"","title":"Plausible.Workers.CleanUserSessions","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"grace_period_duration/0","deprecated":false,"title":"grace_period_duration()","anchor":"grace_period_duration/0"}],"key":"functions"}]},{"id":"Plausible.Workers.ClickhouseCleanSites","deprecated":false,"group":"","title":"Plausible.Workers.ClickhouseCleanSites","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_deleted_sites_with_clickhouse_data/0","deprecated":false,"title":"get_deleted_sites_with_clickhouse_data()","anchor":"get_deleted_sites_with_clickhouse_data/0"},{"id":"perform/1","deprecated":false,"title":"perform(job)","anchor":"perform/1"}],"key":"functions"}]},{"id":"Plausible.Workers.ExpireDomainChangeTransitions","deprecated":false,"group":"","title":"Plausible.Workers.ExpireDomainChangeTransitions","sections":[]},{"id":"Plausible.Workers.ExportAnalytics","deprecated":false,"group":"","title":"Plausible.Workers.ExportAnalytics","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"base_query/1","deprecated":false,"title":"base_query(site_id)","anchor":"base_query/1"}],"key":"functions"}]},{"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/2","deprecated":false,"title":"import_fail(site_import, opts)","anchor":"import_fail/2"},{"id":"import_fail_transient/1","deprecated":false,"title":"import_fail_transient(site_import)","anchor":"import_fail_transient/1"}],"key":"functions"}]},{"id":"Plausible.Workers.LocalImportAnalyticsCleaner","deprecated":false,"group":"","title":"Plausible.Workers.LocalImportAnalyticsCleaner","sections":[]},{"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.NotifyExportedAnalytics","deprecated":false,"group":"","title":"Plausible.Workers.NotifyExportedAnalytics","sections":[]},{"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.TrafficChangeNotifier","deprecated":false,"group":"","title":"Plausible.Workers.TrafficChangeNotifier","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":"component/0","deprecated":false,"title":"component()","anchor":"component/0"},{"id":"controller/0","deprecated":false,"title":"controller()","anchor":"controller/0"},{"id":"live_component/0","deprecated":false,"title":"live_component()","anchor":"live_component/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":"current_plan/2","deprecated":false,"title":"current_plan(conn, params)","anchor":"current_plan/2"},{"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":"goals_index/2","deprecated":false,"title":"goals_index(conn, params)","anchor":"goals_index/2"},{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/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":"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":"currency/2","deprecated":false,"title":"currency(conn, params)","anchor":"currency/2"},{"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":"build_intervals/4","deprecated":false,"title":"build_intervals(labels, date_range, start_fn, end_fn)","anchor":"build_intervals/4"},{"id":"channels/2","deprecated":false,"title":"channels(conn, params)","anchor":"channels/2"},{"id":"cities/2","deprecated":false,"title":"cities(conn, params)","anchor":"cities/2"},{"id":"comparison_query/1","deprecated":false,"title":"comparison_query(query)","anchor":"comparison_query/1"},{"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_value_filter_suggestions/2","deprecated":false,"title":"custom_prop_value_filter_suggestions(conn, params)","anchor":"custom_prop_value_filter_suggestions/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":"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":"put_combined_name_with_version/2","deprecated":false,"title":"put_combined_name_with_version(row, name_key)","anchor":"put_combined_name_with_version/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":"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, params)","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":"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":"request_activation_code/2","deprecated":false,"title":"request_activation_code(conn, params)","anchor":"request_activation_code/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":"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":"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":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"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":"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.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.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.FirstDashboardLaunchBanner","deprecated":false,"group":"","title":"PlausibleWeb.Components.FirstDashboardLaunchBanner","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"set/1","deprecated":false,"title":"set(assigns)","anchor":"set/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Components.FlowProgress","deprecated":false,"group":"","title":"PlausibleWeb.Components.FlowProgress","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"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":"delete_button/1","deprecated":false,"title":"delete_button(assigns)","anchor":"delete_button/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":"edit_button/1","deprecated":false,"title":"edit_button(assigns)","anchor":"edit_button/1"},{"id":"filter_bar/1","deprecated":false,"title":"filter_bar(assigns)","anchor":"filter_bar/1"},{"id":"focus_box/1","deprecated":false,"title":"focus_box(assigns)","anchor":"focus_box/1"},{"id":"focus_list/1","deprecated":false,"title":"focus_list(assigns)","anchor":"focus_list/1"},{"id":"h2/1","deprecated":false,"title":"h2(assigns)","anchor":"h2/1"},{"id":"notice/1","deprecated":false,"title":"notice(assigns)","anchor":"notice/1"},{"id":"settings_tiles/1","deprecated":false,"title":"settings_tiles(assigns)","anchor":"settings_tiles/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":"table/1","deprecated":false,"title":"table(assigns)","anchor":"table/1"},{"id":"td/1","deprecated":false,"title":"td(assigns)","anchor":"td/1"},{"id":"th/1","deprecated":false,"title":"th(assigns)","anchor":"th/1"},{"id":"tile/1","deprecated":false,"title":"tile(assigns)","anchor":"tile/1"},{"id":"title/1","deprecated":false,"title":"title(assigns)","anchor":"title/1"},{"id":"toggle_submit/1","deprecated":false,"title":"toggle_submit(assigns)","anchor":"toggle_submit/1"},{"id":"tooltip/1","deprecated":false,"title":"tooltip(assigns)","anchor":"tooltip/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_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":"debug_metadata/1","deprecated":false,"title":"debug_metadata(conn)","anchor":"debug_metadata/1"},{"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.DebugController","deprecated":false,"group":"","title":"PlausibleWeb.DebugController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"clickhouse/2","deprecated":false,"title":"clickhouse(conn, params)","anchor":"clickhouse/2"}],"key":"functions"}]},{"id":"PlausibleWeb.DebugView","deprecated":false,"group":"","title":"PlausibleWeb.DebugView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"clickhouse.html/1","deprecated":false,"title":"clickhouse.html(assigns)","anchor":"clickhouse.html/1"},{"id":"controller_name/1","deprecated":false,"title":"controller_name(phoenix_controller_name)","anchor":"controller_name/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.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":"drop_notification/5","deprecated":false,"title":"drop_notification(email, site, current_visitors, dashboard_link, installation_link)","anchor":"drop_notification/5"},{"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/3","deprecated":false,"title":"existing_user_invitation(email, site, inviter)","anchor":"existing_user_invitation/3"},{"id":"export_failure/2","deprecated":false,"title":"export_failure(user, site)","anchor":"export_failure/2"},{"id":"export_success/3","deprecated":false,"title":"export_success(user, site, expires_at)","anchor":"export_success/3"},{"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/3","deprecated":false,"title":"invitation_accepted(inviter_email, invitee_email, site)","anchor":"invitation_accepted/3"},{"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/4","deprecated":false,"title":"new_user_invitation(email, invitation_id, site, inviter)","anchor":"new_user_invitation/4"},{"id":"over_limit_email/3","deprecated":false,"title":"over_limit_email(user, usage, suggested_plan)","anchor":"over_limit_email/3"},{"id":"ownership_transfer_accepted/3","deprecated":false,"title":"ownership_transfer_accepted(new_owner_email, inviter_email, site)","anchor":"ownership_transfer_accepted/3"},{"id":"ownership_transfer_rejected/1","deprecated":false,"title":"ownership_transfer_rejected(invitation)","anchor":"ownership_transfer_rejected/1"},{"id":"ownership_transfer_request/5","deprecated":false,"title":"ownership_transfer_request(email, invitation_id, site, inviter, new_owner_account)","anchor":"ownership_transfer_request/5"},{"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":"csv_import.html/1","deprecated":false,"title":"csv_import.html(assigns)","anchor":"csv_import.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":"drop_notification.html/1","deprecated":false,"title":"drop_notification.html(assigns)","anchor":"drop_notification.html/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":"export_failure.html/1","deprecated":false,"title":"export_failure.html(assigns)","anchor":"export_failure.html/1"},{"id":"export_success.html/1","deprecated":false,"title":"export_success.html(assigns)","anchor":"export_success.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/3","deprecated":false,"title":"error_tag(map_or_form, field, opts \\\\ [])","anchor":"error_tag/3"},{"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.Flows","deprecated":false,"group":"","title":"PlausibleWeb.Flows","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"domain_change/0","deprecated":false,"title":"domain_change()","anchor":"domain_change/0"},{"id":"invitation/0","deprecated":false,"title":"invitation()","anchor":"invitation/0"},{"id":"provisioning/0","deprecated":false,"title":"provisioning()","anchor":"provisioning/0"},{"id":"register/0","deprecated":false,"title":"register()","anchor":"register/0"},{"id":"review/0","deprecated":false,"title":"review()","anchor":"review/0"},{"id":"steps/1","deprecated":false,"title":"steps(flow)","anchor":"steps/1"},{"id":"valid_keys/0","deprecated":false,"title":"valid_keys()","anchor":"valid_keys/0"},{"id":"valid_values/0","deprecated":false,"title":"valid_values()","anchor":"valid_values/0"}],"key":"functions"}]},{"id":"PlausibleWeb.GoogleAnalyticsController","deprecated":false,"group":"","title":"PlausibleWeb.GoogleAnalyticsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"confirm/2","deprecated":false,"title":"confirm(conn, map)","anchor":"confirm/2"},{"id":"import/2","deprecated":false,"title":"import(conn, map)","anchor":"import/2"},{"id":"property/2","deprecated":false,"title":"property(conn, params)","anchor":"property/2"},{"id":"property_form/2","deprecated":false,"title":"property_form(conn, params)","anchor":"property_form/2"}],"key":"functions"}]},{"id":"PlausibleWeb.GoogleAnalyticsView","deprecated":false,"group":"","title":"PlausibleWeb.GoogleAnalyticsView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"confirm.html/1","deprecated":false,"title":"confirm.html(assigns)","anchor":"confirm.html/1"},{"id":"property_form.html/1","deprecated":false,"title":"property_form.html(assigns)","anchor":"property_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"}],"key":"functions"}]},{"id":"PlausibleWeb.HelpScoutController","deprecated":false,"group":"","title":"PlausibleWeb.HelpScoutController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"callback/2","deprecated":false,"title":"callback(conn, arg2)","anchor":"callback/2"},{"id":"search/2","deprecated":false,"title":"search(conn, map)","anchor":"search/2"},{"id":"show/2","deprecated":false,"title":"show(conn, params)","anchor":"show/2"}],"key":"functions"}]},{"id":"PlausibleWeb.HelpScoutView","deprecated":false,"group":"","title":"PlausibleWeb.HelpScoutView","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.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.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":"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.html/1","deprecated":false,"title":"settings.html(assigns)","anchor":"settings.html/1"},{"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.AuthContext","deprecated":false,"group":"","title":"PlausibleWeb.Live.AuthContext","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.CSVExport","deprecated":false,"group":"","title":"PlausibleWeb.Live.CSVExport","sections":[]},{"id":"PlausibleWeb.Live.CSVImport","deprecated":false,"group":"","title":"PlausibleWeb.Live.CSVImport","sections":[]},{"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":"combo_dropdown/1","deprecated":false,"title":"combo_dropdown(assigns)","anchor":"combo_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":"open/2","deprecated":false,"title":"open(socket, id)","anchor":"open/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.Verification","deprecated":false,"group":"","title":"PlausibleWeb.Live.Components.Verification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/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, session, 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, params, socket)","anchor":"handle_event/3"},{"id":"handle_info/2","deprecated":false,"title":"handle_info(arg1, socket)","anchor":"handle_info/2"},{"id":"mount/3","deprecated":false,"title":"mount(params, map, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.GoalSettings.Form","deprecated":false,"group":"","title":"PlausibleWeb.Live.GoalSettings.Form","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"create_form/1","deprecated":false,"title":"create_form(assigns)","anchor":"create_form/1"},{"id":"custom_event_fields/1","deprecated":false,"title":"custom_event_fields(assigns)","anchor":"custom_event_fields/1"},{"id":"edit_form/1","deprecated":false,"title":"edit_form(assigns)","anchor":"edit_form/1"},{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, arg2, 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":"revenue_goal_settings/1","deprecated":false,"title":"revenue_goal_settings(assigns)","anchor":"revenue_goal_settings/1"},{"id":"suggest_event_names/3","deprecated":false,"title":"suggest_event_names(input, site, existing_goals)","anchor":"suggest_event_names/3"},{"id":"suggest_page_paths/2","deprecated":false,"title":"suggest_page_paths(input, site)","anchor":"suggest_page_paths/2"},{"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":"custom_event_description/1","deprecated":false,"title":"custom_event_description(goal)","anchor":"custom_event_description/1"},{"id":"goal_description/1","deprecated":false,"title":"goal_description(assigns)","anchor":"goal_description/1"},{"id":"pageview_description/1","deprecated":false,"title":"pageview_description(goal)","anchor":"pageview_description/1"},{"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.Installation","deprecated":false,"group":"","title":"PlausibleWeb.Live.Installation","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(arg1, socket)","anchor":"handle_info/2"},{"id":"handle_params/3","deprecated":false,"title":"handle_params(params, uri, socket)","anchor":"handle_params/3"},{"id":"mount/3","deprecated":false,"title":"mount(params, session, socket)","anchor":"mount/3"},{"id":"render/1","deprecated":false,"title":"render(assigns)","anchor":"render/1"},{"id":"render_snippet_404/0","deprecated":false,"title":"render_snippet_404()","anchor":"render_snippet_404/0"},{"id":"render_snippet_404/1","deprecated":false,"title":"render_snippet_404(arg)","anchor":"render_snippet_404/1"},{"id":"script_extension_params/0","deprecated":false,"title":"script_extension_params()","anchor":"script_extension_params/0"}],"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.HostnameRules","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.HostnameRules","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":"suggest_hostnames/3","deprecated":false,"title":"suggest_hostnames(input, options, site)","anchor":"suggest_hostnames/3"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Shields.Hostnames","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.Hostnames","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.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.Shields.PageRules","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.PageRules","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":"suggest_page_paths/3","deprecated":false,"title":"suggest_page_paths(input, options, site)","anchor":"suggest_page_paths/3"},{"id":"update/2","deprecated":false,"title":"update(assigns, socket)","anchor":"update/2"}],"key":"functions"}]},{"id":"PlausibleWeb.Live.Shields.Pages","deprecated":false,"group":"","title":"PlausibleWeb.Live.Shields.Pages","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.Sites","deprecated":false,"group":"","title":"PlausibleWeb.Live.Sites","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"check_feature_access/2","deprecated":false,"title":"check_feature_access(site, user)","anchor":"check_feature_access/2"},{"id":"check_features/2","deprecated":false,"title":"check_features(invitation, user)","anchor":"check_features/2"},{"id":"check_needs_to_upgrade/1","deprecated":false,"title":"check_needs_to_upgrade(user)","anchor":"check_needs_to_upgrade/1"},{"id":"ellipsis_menu/1","deprecated":false,"title":"ellipsis_menu(assigns)","anchor":"ellipsis_menu/1"},{"id":"ensure_can_take_ownership/2","deprecated":false,"title":"ensure_can_take_ownership(site, user)","anchor":"ensure_can_take_ownership/2"},{"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":"has_sites?/1","deprecated":false,"title":"has_sites?(user)","anchor":"has_sites?/1"},{"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, session, socket)","anchor":"mount/3"},{"id":"owns_sites?/2","deprecated":false,"title":"owns_sites?(user, sites)","anchor":"owns_sites?/2"},{"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.Live.Verification","deprecated":false,"group":"","title":"PlausibleWeb.Live.Verification","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"handle_event/3","deprecated":false,"title":"handle_event(binary, _, 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.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.Funnels","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Controllers.Funnels","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.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.Funnel","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Funnel","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.Funnel.CreateRequest","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.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.Funnel.ListResponse","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Schemas.Funnel.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","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.Funnel","deprecated":false,"group":"","title":"PlausibleWeb.Plugins.API.Views.Funnel","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.AuthorizePublicAPI","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.AuthorizePublicAPI","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.AuthorizeSiteAccess","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.AuthorizeSiteAccess","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"call/2","deprecated":false,"title":"call(conn, arg)","anchor":"call/2"},{"id":"init/1","deprecated":false,"title":"init(allowed_roles)","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.Plugs.UserSessionTouch","deprecated":false,"group":"","title":"PlausibleWeb.Plugs.UserSessionTouch","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.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(opts \\\\ [])","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":"docs_stats_api/2","deprecated":false,"title":"docs_stats_api(conn, _)","anchor":"docs_stats_api/2"},{"id":"external_api/2","deprecated":false,"title":"external_api(conn, _)","anchor":"external_api/2"},{"id":"flags/2","deprecated":false,"title":"flags(conn, _)","anchor":"flags/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.SettingsController","deprecated":false,"group":"","title":"PlausibleWeb.SettingsController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api_keys/2","deprecated":false,"title":"api_keys(conn, params)","anchor":"api_keys/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":"danger_zone/2","deprecated":false,"title":"danger_zone(conn, params)","anchor":"danger_zone/2"},{"id":"delete_api_key/2","deprecated":false,"title":"delete_api_key(conn, map)","anchor":"delete_api_key/2"},{"id":"delete_session/2","deprecated":false,"title":"delete_session(conn, map)","anchor":"delete_session/2"},{"id":"index/2","deprecated":false,"title":"index(conn, params)","anchor":"index/2"},{"id":"invoices/2","deprecated":false,"title":"invoices(conn, params)","anchor":"invoices/2"},{"id":"new_api_key/2","deprecated":false,"title":"new_api_key(conn, params)","anchor":"new_api_key/2"},{"id":"preferences/2","deprecated":false,"title":"preferences(conn, params)","anchor":"preferences/2"},{"id":"security/2","deprecated":false,"title":"security(conn, params)","anchor":"security/2"},{"id":"subscription/2","deprecated":false,"title":"subscription(conn, params)","anchor":"subscription/2"},{"id":"update_email/2","deprecated":false,"title":"update_email(conn, map)","anchor":"update_email/2"},{"id":"update_name/2","deprecated":false,"title":"update_name(conn, map)","anchor":"update_name/2"},{"id":"update_password/2","deprecated":false,"title":"update_password(conn, map)","anchor":"update_password/2"},{"id":"update_theme/2","deprecated":false,"title":"update_theme(conn, map)","anchor":"update_theme/2"}],"key":"functions"}]},{"id":"PlausibleWeb.SettingsView","deprecated":false,"group":"","title":"PlausibleWeb.SettingsView","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"__resource__/0","deprecated":false,"title":"__resource__()","anchor":"__resource__/0"},{"id":"api_keys.html/1","deprecated":false,"title":"api_keys.html(assigns)","anchor":"api_keys.html/1"},{"id":"danger_zone.html/1","deprecated":false,"title":"danger_zone.html(assigns)","anchor":"danger_zone.html/1"},{"id":"format_invoices/1","deprecated":false,"title":"format_invoices(invoice_list)","anchor":"format_invoices/1"},{"id":"invoices.html/1","deprecated":false,"title":"invoices.html(assigns)","anchor":"invoices.html/1"},{"id":"new_api_key.html/1","deprecated":false,"title":"new_api_key.html(assigns)","anchor":"new_api_key.html/1"},{"id":"preferences.html/1","deprecated":false,"title":"preferences.html(assigns)","anchor":"preferences.html/1"},{"id":"present_subscription_status/1","deprecated":false,"title":"present_subscription_status(status)","anchor":"present_subscription_status/1"},{"id":"render/2","deprecated":false,"title":"render(template, assigns \\\\ %{})","anchor":"render/2"},{"id":"security.html/1","deprecated":false,"title":"security.html(assigns)","anchor":"security.html/1"},{"id":"subscription.html/1","deprecated":false,"title":"subscription.html(assigns)","anchor":"subscription.html/1"},{"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":"template_not_found/2","deprecated":false,"title":"template_not_found(template, assigns)","anchor":"template_not_found/2"}],"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_by_user/2","deprecated":false,"title":"remove_member_by_user(conn, params)","anchor":"remove_member_by_user/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_by_user/2","deprecated":false,"title":"update_role_by_user(conn, map)","anchor":"update_role_by_user/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_traffic_change_notification_recipient/2","deprecated":false,"title":"add_traffic_change_notification_recipient(conn, map)","anchor":"add_traffic_change_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":"csv_import/2","deprecated":false,"title":"csv_import(conn, params)","anchor":"csv_import/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_traffic_change_notification/2","deprecated":false,"title":"disable_traffic_change_notification(conn, map)","anchor":"disable_traffic_change_notification/2"},{"id":"disable_weekly_report/2","deprecated":false,"title":"disable_weekly_report(conn, params)","anchor":"disable_weekly_report/2"},{"id":"download_export/2","deprecated":false,"title":"download_export(conn, params)","anchor":"download_export/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_traffic_change_notification/2","deprecated":false,"title":"enable_traffic_change_notification(conn, map)","anchor":"enable_traffic_change_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":"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_traffic_change_notification_recipient/2","deprecated":false,"title":"remove_traffic_change_notification_recipient(conn, map)","anchor":"remove_traffic_change_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_traffic_change_notification/2","deprecated":false,"title":"update_traffic_change_notification(conn, map)","anchor":"update_traffic_change_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":"csv_import.html/1","deprecated":false,"title":"csv_import.html(assigns)","anchor":"csv_import.html/1"},{"id":"edit_shared_link.html/1","deprecated":false,"title":"edit_shared_link.html(assigns)","anchor":"edit_shared_link.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_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":"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"}],"key":"functions"}]},{"id":"PlausibleWeb.TestController","deprecated":false,"group":"","title":"PlausibleWeb.TestController","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"api_basic/2","deprecated":false,"title":"api_basic(conn, params)","anchor":"api_basic/2"},{"id":"browser_basic/2","deprecated":false,"title":"browser_basic(conn, params)","anchor":"browser_basic/2"}],"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, arg2)","anchor":"monthly_report/2"},{"id":"weekly_report/2","deprecated":false,"title":"weekly_report(conn, arg2)","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"}]},{"id":"PlausibleWeb.UserAuth","deprecated":false,"group":"","title":"PlausibleWeb.UserAuth","sections":[],"nodeGroups":[{"name":"Functions","nodes":[{"id":"get_user_session/1","deprecated":false,"title":"get_user_session(conn_or_session)","anchor":"get_user_session/1"},{"id":"log_in_user/3","deprecated":false,"title":"log_in_user(conn, user, redirect_path \\\\ nil)","anchor":"log_in_user/3"},{"id":"log_out_user/1","deprecated":false,"title":"log_out_user(conn)","anchor":"log_out_user/1"},{"id":"revoke_all_user_sessions/2","deprecated":false,"title":"revoke_all_user_sessions(user, opts \\\\ [])","anchor":"revoke_all_user_sessions/2"},{"id":"revoke_user_session/2","deprecated":false,"title":"revoke_user_session(user, session_id)","anchor":"revoke_user_session/2"},{"id":"set_logged_in_cookie/1","deprecated":false,"title":"set_logged_in_cookie(conn)","anchor":"set_logged_in_cookie/1"},{"id":"touch_user_session/2","deprecated":false,"title":"touch_user_session(user_session, now \\\\ NaiveDateTime.utc_now(:second))","anchor":"touch_user_session/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 83152b2c02..793aaeeea0 100644 --- a/readme.html +++ b/readme.html @@ -14,7 +14,7 @@ - + diff --git a/search.html b/search.html index 4110cdf0c0..d02da3c558 100644 --- a/search.html +++ b/search.html @@ -16,7 +16,7 @@ - + @@ -138,7 +138,7 @@ Pages
    - +